
    n&phg                    ~   % S r SSKJr  SSKrSSKrSSKrSSKJr  SSKJ	r	J
r
  SSKJrJr  SSKJrJrJrJrJrJrJr  SSKJr  SS	KJrJr  SS
KJrJr  SSKJr  SSK J!r!  SSK"J#r#J$r$  SSK%J&r&  SSKJ'r'  \(       a  SSK(J)r)  SSK*J+r+  SSK,J-r-  \.\/\0\/\4   4   r1S\2S'    \.\/\14   r3S\2S'    \" SSS5      r4 S,       S-S jjr5S.S jr6  S/         S0S jjr7S1S jr8    S2S jr9 S3       S4S  jjr:S5S! jr; " S" S#\\4   5      r< " S$ S%\<S   5      r= " S& S'\<S   5      r> " S( S)\&5      r? " S* S+\&5      r@g)6a<  
Load setuptools configuration from ``setup.cfg`` files.

**API will be made private in the future**

To read project metadata, consider using
``build.util.project_wheel_metadata`` (https://pypi.org/project/build/).
For simple scenarios, you can also try parsing the file directly
with the help of ``configparser``.
    )annotationsN)defaultdict)IterableIterator)partialwraps)TYPE_CHECKINGAnyCallableClassVarGenericTypeVarcast)default_environment)InvalidRequirementRequirement)InvalidVersionVersion   )_static)StrPath)	FileErrorOptionError)SetuptoolsDeprecationWarning   )expand)	TypeAliasDistribution)DistributionMetadatar   SingleCommandOptionsAllCommandOptionsTargetr   r    c                |    SSK Jn  U" 5       nU(       a  UR                  5       O/ n[        X@XR5      n[	        U5      $ )a  Read given configuration file and returns options from it as a dict.

:param str|unicode filepath: Path to configuration file
    to get options from.

:param bool find_others: Whether to search for other configuration files
    which could be on in various places.

:param bool ignore_option_errors: Whether to silently ignore
    options, values of which could not be resolved (e.g. due to exceptions
    in directives such as file:, attr:, etc.).
    If False exceptions are propagated as expected.

:rtype: dict
r   r   )setuptools.distr   find_config_files_applyconfiguration_to_dict)filepathfind_othersignore_option_errorsr   dist	filenameshandlerss          M/var/www/html/venv/lib/python3.13/site-packages/setuptools/config/setupcfg.pyread_configurationr0   2   s7    $ ->D,7&&(RIdiFH **    c                <    [        X5        U R                  5         U $ )zXApply the configuration from a ``setup.cfg`` file into an existing
distribution object.
)r'   _finalize_requires)r,   r)   s     r/   apply_configurationr4   L   s     4Kr1   c                H   SSK Jn  [        R                  R	                  U5      n[        R                  R                  U5      (       d  [        SU S35      e[        R                  " 5       n[        R                  " [        R                  R                  U5      5        / UQUPn UR                  U [        [        [           U5      S9  [        X R                  US9nU R!                  5         [        R                  " U5        U$ ! [        R                  " U5        f = f)zHRead configuration from ``filepath`` and applies to the ``dist`` object.r   )_DistributionzConfiguration file z does not exist.)r-   )r+   )r%   r6   ospathabspathisfiler   getcwdchdirdirnameparse_config_filesr   liststrparse_configurationcommand_options_finalize_license_files)r,   r)   other_filesr+   r6   current_directoryr-   r.   s           r/   r'   r'   U   s     .wwx(H77>>(##-hZ7GHII		HHRWW__X&'(+(x(I$((d3i9S(T&&&=Q
 	$$&
"#O 	"#s   (A	D	 	D!c                h    SU 3n[         R                  " [        X5      n[        XU5      nU" 5       $ )z
Given a target object and option key, get that option from
the target object, either through a get_{key} method or
from an attribute directly.
get_)	functoolsr   getattr)
target_objkeygetter_nameby_attributegetters        r/   _get_optionrO   t   s4     ,K$$Wj>LZl;F8Or1   c                    [        [        5      nU  H=  nUR                   H*  n[        UR                  U5      nXAUR
                     U'   M,     M?     U$ )zReturns configuration data gathered by given handlers as a dict.

:param Iterable[ConfigHandler] handlers: Handlers list,
    usually from parse_configuration()

:rtype: dict
)r   dictset_optionsrO   rJ   section_prefix)r.   config_dicthandleroptionvalues        r/   r(   r(      sU     $D)K))F 2 2F;E:?../7 * 
 r1   c           	        [         R                  " U 5       n[        U UUU5      nUR                  5         U R                  (       d  UR                  U l        [        U R                  UUUU R                  U R                  5      nUR                  5         U R                  R                  UR                  UR                  5        SSS5        XT4$ ! , (       d  f       WW4$ = f)a  Performs additional parsing of configuration options
for a distribution.

Returns a list of used option handlers.

:param Distribution distribution:
:param dict command_options:
:param bool ignore_option_errors: Whether to silently ignore
    options, values of which could not be resolved (e.g. due to exceptions
    in directives such as file:, attr:, etc.).
    If False exceptions are propagated as expected.
:rtype: list
N)
r   EnsurePackagesDiscoveredConfigOptionsHandlerparsepackage_dirConfigMetadataHandlermetadatasrc_root_referenced_filesupdate)distributionrB   r+   ensure_discoveredoptionsmetas         r/   rA   rA      s    $ 
	(	(	6:K& 	
 	'''.':':L$$!! $$!!
 	

&&--%%t'='=	
+ 
72 =3 
7	62 =s   B/C
C"c                x  ^ SU;   d  [        T5      S:w  a  g[        5       R                  5       n [        TS   5      nUR                  U;   a  [
        R                  U TS   S9  gg! [         aG  n[        U4S jU 5       5      (       a#  [
        R                  U TS   S9n[        U5      Ue SnAgSnAff = f)a=  Because users sometimes misinterpret this configuration:

[options.extras_require]
foo = bar;python_version<"4"

It looks like one requirement with an environment marker
but because there is no newline, it's parsed as two requirements
with a semicolon as separator.

Therefore, if:
    * input string does not contain a newline AND
    * parsed result contains two requirements AND
    * parsing of the two parts from the result ("<first>;<second>")
    leads in a valid Requirement with a valid marker
a UserWarning is shown to inform the user about the possible problem.

r   Nr   )fieldreqc              3  L   >#    U  H  nTS    R                  U5      v   M     g7f)r   N
startswith).0markerparseds     r/   	<genexpr>8_warn_accidental_env_marker_misconfig.<locals>.<genexpr>   s#     B'vay##F++'s   !$)
len
marker_envkeysr   name_AmbiguousMarkeremitr   anymessage)label
orig_valuero   markersri   exmsgs     `    r/   %_warn_accidental_env_marker_misconfigr      s    " zS[A-l!G2&)$88w!!6!9!=  2B'BBB"**F1I*FC$S)r1 C2s   5A( (
B92=B44B9c                  ,   \ rS rSr% SrS\S'    0 rS\S'            SS jr\    SS j5       r	\
S	 5       rSS
 jr\SS j5       r\S 5       r\S 5       r\S 5       rSS jrSS jr\S 5       r\S 5       r\SS j5       rSS jrSS jrS rSrg) ConfigHandler   z1Handles metadata supplied in configuration files.r@   rS   zClassVar[dict[str, str]]aliasesc                    X0l         Xl        [        U R                  U5      5      U l        / U l        X@l        [        [           " 5       U l	        g N)
r+   rJ   rQ   _section_optionssectionsrR   rc   setr@   r`   )selfrJ   rd   r+   rc   s        r/   __init__ConfigHandler.__init__   sG     %9!",T227;<&(!2!$S	r1   c              #     #    UR                  5        HA  u  p#UR                  U R                  5      u  pEnU(       a  M,  UR                  S5      U4v   MC     g 7f)N.)items	partitionrS   lstrip)clsrd   	full_namerW   pre_sepru   s          r/   r   ConfigHandler._section_options  sN      !(I'11#2D2DEOCt++c"E))	 !0s   AAc                F    [        U R                  R                   S35      e).Metadata item name to parser function mapping.z must provide .parsers property)NotImplementedError	__class____name__)r   s    r/   parsersConfigHandler.parsers  s'     "~~&&''FG
 	
r1   c                   U R                   nU R                  R                  X5      n [        X15      nU(       a  g  U R                  R                  US 5      " U5      n[        R                  " UR                  U5      n[        USU 3U5      nU" U5        U R                  R                  U5        g ! [         a  n[        U5      UeS nAff = f! [        4U R                  -   a     g f = f)Nc                    U $ r    )xs    r/   <lambda>+ConfigHandler.__setitem__.<locals>.<lambda>&  s    Qr1   set_)rJ   r   getrI   AttributeErrorKeyErrorr   	Exceptionr+   rH   r   __setattr__rR   append)	r   option_namerW   rJ   current_valueero   simple_settersetters	            r/   __setitem__ConfigHandler.__setitem__  s    __
 ll&&{@	/#J<M 	\\%%k;?FF "))**@*@+NtK=%9=Iv,!  	/;'Q.	/ |d777 		s(   B5 #C 5
C?CCC.-C.c                    [        U[        5      (       a  U$ SU;   a  UR                  5       nOUR                  U5      nU Vs/ s H)  o3R	                  5       (       d  M  UR	                  5       PM+     sn$ s  snf )zRepresents value as a list.

Value is split either by separator (defaults to comma) or by lines.

:param value:
:param separator: List items separator character.
:rtype: list
rg   )
isinstancer?   
splitlinessplitstrip)r   rW   	separatorchunks       r/   _parse_listConfigHandler._parse_list0  s_     eT""L5=$$&EKK	*E+0B5%KKM5BBBs   A7 A7c                    Sn0 nU R                  U5       HJ  nUR                  U5      u  pVnXb:w  a  [        SU 35      eUR                  5       X5R                  5       '   ML     U$ )z8Represents value as a dict.

:param value:
:rtype: dict
=z&Unable to parse option value to dict: )r   r   r   r   )r   rW   r   resultlinerK   sepvals           r/   _parse_dictConfigHandler._parse_dictD  sg     	OOE*D NN95MCc!$J5'"RSS"%))+F99;	 + r1   c                ,    UR                  5       nUS;   $ )z9Represents value as boolean.

:param value:
:rtype: bool
)1trueyes)lowerr   rW   s     r/   _parse_boolConfigHandler._parse_boolU  s     ,,,r1   c                   ^ U4S jnU$ )zReturns a parser function to make sure field inputs
are not files.

Parses a value after getting the key so error messages are
more informative.

:param key:
:rtype: callable
c                ~   > SnU R                  U5      (       a  [        ST S35      e[        R                  " U 5      $ )Nfile:z"Only strings are accepted for the z field, files are not accepted)rl   
ValueErrorr   Str)rW   exclude_directiverK   s     r/   parser3ConfigHandler._exclude_files_parser.<locals>.parserk  sJ     ' 122 8 >- -  ;;u%%r1   r   )r   rK   r   s    ` r/   _exclude_files_parser#ConfigHandler._exclude_files_parser_  s    	& r1   c                   Sn[        U[        5      (       d  U$ UR                  U5      (       d  [        R                  " U5      $ U[        U5      S nUR                  S5       Vs/ s H  oUR                  5       PM     nnU R                  R                  U5        [        R                  " [        R                  " Xb5      5      $ s  snf )a  Represents value as a string, allowing including text
from nearest files using `file:` directive.

Directive is sandboxed and won't reach anything outside
directory with setup.py.

Examples:
    file: README.rst, CHANGELOG.md, src/file.txt

:param str value:
:rtype: str
r   N,)r   r@   rl   r   r   rr   r   r   r`   ra   r   
read_files)r   rW   root_dirinclude_directivespecr8   	filepathss          r/   _parse_fileConfigHandler._parse_filev  s     $%%%L 122;;u%%S*+-..2jjo>odZZ\o	>%%i0{{6,,YABB ?s   'Cc                    SnUR                  U5      (       d  [        R                  " U5      $ UR                  US5      nUR	                  U R
                  R                  5        [        R                  " XRU5      $ )zRepresents value as a module attribute.

Examples:
    attr: package.attr
    attr: package.module.attr

:param str value:
:rtype: str
zattr: )	rl   r   r   replacera   rc   r\   r   	read_attr)r   rW   r\   r   attr_directive	attr_descs         r/   _parse_attrConfigHandler._parse_attr  sh     !//;;u%%MM."5	 	411==>	AAr1   c                   ^ U4S jnU$ )zReturns parser function to represents value as a list.

Parses a value applying given methods one after another.

:param parse_methods:
:rtype: callable
c                .   > U nT H  nU" U5      nM     U$ r   r   )rW   ro   methodparse_methodss      r/   r[   1ConfigHandler._get_parser_compound.<locals>.parse  s"    F' ( Mr1   r   )r   r   r[   s    ` r/   _get_parser_compound"ConfigHandler._get_parser_compound  s    	 r1   c                V    0 nUR                  5        H  u  nu  pVU" XF5      X4'   M     U$ )zParses section options into a dictionary.

Applies a given parser to each option in a section.

:param dict section_options:
:param callable values_parser: function with 2 args corresponding to key, value
:rtype: dict
)r   )r   section_optionsvalues_parserrW   rK   _r   s          r/   _parse_section_to_dict_with_key-ConfigHandler._parse_section_to_dict_with_key  s3     ,224MC!&s0EJ 5r1   Nc                F   ^ T(       a  U4S jOS nU R                  X5      $ )zParses section options into a dictionary.

Optionally applies a given parser to each value.

:param dict section_options:
:param callable values_parser: function with 1 arg corresponding to option value
:rtype: dict
c                   > T" U5      $ r   r   )r   vr   s     r/   r   6ConfigHandler._parse_section_to_dict.<locals>.<lambda>  s
    }Q/r1   c                    U$ r   r   )r   r   s     r/   r   r     s    UVr1   )r   )r   r   r   r   s     ` r/   _parse_section_to_dict$ConfigHandler._parse_section_to_dict  s!     5B/22?KKr1   c                    UR                  5        H/  u  nu  p4[        R                  " [        5         X@U'   SSS5        M1     g! , (       d  f       MC  = f)zAParses configuration file section.

:param dict section_options:
N)r   
contextlibsuppressr   )r   r   ru   r   rW   s        r/   parse_sectionConfigHandler.parse_section  sB    
 !0 5 5 7D*1$$X."T
 /. !8..s   A
A	c                    U R                   R                  5        HZ  u  pSnU(       a  SU 3n[        U SU 3R                  SS5      S5      nUc  [	        SU R
                   SU S35      eU" U5        M\     g)	zDParses configuration file items from one
or more related sections.

r   r   r   r   __Nz*Unsupported distribution option section: [])r   r   rI   r   r   rS   )r   section_namer   method_postfixsection_parser_methods        r/   r[   ConfigHandler.parse  s    
 .2]]-@-@-B)LN#$\N!35</088dC	6! %,!++,Al^1> 
 "/2% .Cr1   c                8   ^^^ [        T5      UUU4S j5       nU$ )zthis function will wrap around parameters that are deprecated

:param msg: deprecation message
:param func: function to be wrapped around
c                 h   > TR                  SS5        [        R                  " ST40 TD6  T" U 0 UD6$ )N
stacklevelr   z Deprecated config in `setup.cfg`)
setdefault_DeprecatedConfigrw   )argskwargsfunckwr~   s     r/   config_handler@ConfigHandler._deprecated_config_handler.<locals>.config_handler  s7    MM,*""#EsQbQ(((r1   )r   )r   r  r~   r  r  s    ``` r/   _deprecated_config_handler(ConfigHandler._deprecated_config_handler  s#     
t	) 
	)
 r1   )r`   rc   r+   r   rR   rJ   )rJ   r#   rd   r"   rc   expand.EnsurePackagesDiscoveredreturnNone)rd   r"   r  z*Iterator[tuple[str, SingleCommandOptions]]r  r  )r   )r   StrPath | None)r   r   r   )r   
__module____qualname____firstlineno____doc____annotations__r   r   classmethodr   propertyr   r   r   r   r   r   r   r   r   r   r   r   r[   r  __static_attributes__r   r1   r/   r   r      s5   ;
 )+G%* #
 ; 
" *'*	3* * 
 
-4 C C&    - -  ,C6B(  &   
L 
L#32r1   r   c                     ^  \ rS rSrSrSSSSS.rSr S	\R                  4             SU 4S
 jjjr	\
S 5       rS rSrU =r$ )r]   i  r^   urldescriptionclassifiers	platforms)	home_pagesummary
classifierplatformFNc                >   > [         TU ]  XX45        XPl        X`l        g r   )superr   r\   r   )r   rJ   rd   r+   rc   r\   r   r   s          r/   r   ConfigMetadataHandler.__init__  s      	.BV& r1   c                N   U R                  U R                  [        R                  5      nU R                  U R                  [        R
                  5      n[        U R                  U R                  S9nU R                  n0 S[        R                  _S[        R                  _S[        R                  _S[        R                  _SU_SU_SU_S	U_S
U R                  X15      _SU" S5      _SU_SU_SU_S[        R                  _SU R                  _S[        R                  _SU_$ )r   r   authorauthor_email
maintainermaintainer_emailr#  keywordsprovides	obsoletesr"  licenselicense_filesr!  long_descriptionlong_description_content_typeversionr   project_urls)r   r   r   Listr   Dictr   r   r   r   r   _parse_version)r   parse_list_staticparse_dict_static
parse_fileexclude_files_parsers        r/   r   ConfigMetadataHandler.parsers%  sg    !55d6F6FU 55d6F6FUT--F
#99
gkk
GKK
 '++
 	

 *
 )
 )
 *
 444ZS
 +I6
 .
 :
 

 ,W[[
 t**
  7;;!
" -#
 	
r1   c                :   U R                  XR                  5      nX!:w  a  UR                  5       n [        U5        U$ [        R                  " U R                  XR                  U R                  5      5      $ ! [         a  n[        SU SU 35      UeSnAff = f)z;Parses `version` option value.

:param value:
:rtype: str

zVersion loaded from z does not comply with PEP 440: N)
r   r   r   r   r   r   r   r8  r   r\   )r   rW   r8  r   s       r/   r<  $ConfigMetadataHandler._parse_versionA  s     ""5--8mmoG  N~~d..u6F6FVWW " !*5' 2,,396 s   A9 9
BBBr\   r   )rJ   r    rd   r"   r+   boolrc   r  r\   zdict | Noner   r  r  r  )r   r  r  r  rS   r   strict_moder7   curdirr   r  r   r<  r  __classcell__r   s   @r/   r]   r]     s    N  #	G K $(#%99!(! #! #	!
 ;! !! !! 
! ! 
 
6X Xr1   r]   c                     ^  \ rS rSrSr          SU 4S jjr\S 5       rS rSS jr	\
S 5       rS rS	 rS
 rSS jrS rSS jrSS jrSS jrSS jrSrU =r$ )rZ   i[  rd   c                V   > [         TU ]  XX45        UR                  U l        0 U l        g r   )r)  r   r_   r   r\   )r   rJ   rd   r+   rc   r   s        r/   r   ConfigOptionsHandler.__init__^  s*     	.BV"+++-r1   c                "    U R                  USS9$ )N;)r   )r   r   s     r/   _parse_list_semicolon*ConfigOptionsHandler._parse_list_semicoloni  s    u44r1   c                4    U R                  XR                  S9$ )Nr,  )r   r   )r   rW   s     r/   _parse_file_in_root(ConfigOptionsHandler._parse_file_in_rootm  s    >>r1   c                    U R                  U R                  U5      5      n[        XU5        [        R                  " S U 5       5      $ )Nc              3  T   #    U  H  oR                  S 5      (       a  M  Uv   M      g7f)#Nrk   )rm   r   s     r/   rp   @ConfigOptionsHandler._parse_requirements_list.<locals>.<genexpr>v  s     PVT??3;ODDVs   (	()rO  rR  r   r   r:  )r   rz   rW   ro   s       r/   _parse_requirements_list-ConfigOptionsHandler._parse_requirements_listp  s>    ++D,D,DU,KL-eFC ||PVPPPr1   c                    U R                   nU R                  nU R                  nUUU R                  UUUU R	                  US5      [        U R                  S5      U R                  U R                  U R                  U[        R                  US.$ )r   zeThe namespace_packages parameter is deprecated, consider using implicit namespaces instead (PEP 420).install_requires)zip_safeinclude_package_datar\   scriptseager_resourcesdependency_linksnamespace_packagesr[  setup_requirespackagesentry_points
py_modulespython_requirescmdclass)r   r   _parse_cmdclassr   r  r   rX  rO  _parse_packagesrR  r   SpecifierSet)r   
parse_list
parse_boolparse_cmdclasss       r/   r   ConfigOptionsHandler.parsersy  s     %%
%%
-- #$.++!) *"&"A"AH# !(--/A! #88,, 44$&33&+
 	
r1   c                    U R                   R                  n[        R                  " U R	                  U5      X R
                  5      $ r   )rc   r\   r   rg  r   r   )r   rW   r\   s      r/   rh  $ConfigOptionsHandler._parse_cmdclass  s3    ,,88t//6]]SSr1   c                ,   SS/nUR                  5       nX2;  a  U R                  U5      $ U R                  U R                  R	                  S0 5      5      nUR                  X2S   :H  U R                  U R                  S9  [        R                  " S0 UD6$ )z<Parses `packages` option value.

:param value:
:rtype: list
zfind:zfind_namespace:zpackages.findr   )
namespacesr   fill_package_dirr   )
r   r   parse_section_packages__findr   r   ra   r   r\   r   find_packages)r   rW   find_directivestrimmed_valuefind_kwargss        r/   ri  $ConfigOptionsHandler._parse_packages  s     #$56/##E** 77MMor2
 	%);;]]!-- 	 	
 ##2k22r1   c                    U R                  XR                  5      n/ SQnUR                  5        VVs0 s H  u  pEXC;   d  M  U(       d  M  XE_M     nnnUR                  S5      nUb  US   US'   U$ s  snnf )zParses `packages.find` configuration file section.

To be used in conjunction with _parse_packages().

:param dict section_options:
)whereincludeexcluder{  r   )r   r   r   r   )r   r   section_data
valid_keyskr   rx  r{  s           r/   rt  1ConfigOptionsHandler.parse_section_packages__find  s{     22?DTDTU4
(4(:(:(<V(<tTUtqt(<V(#(8K  Ws   A2A2A2c                B    U R                  XR                  5      nX S'   g)zPParses `entry_points` configuration file section.

:param dict section_options:
rd  N)r   r   r   r   ro   s      r/   parse_section_entry_points/ConfigOptionsHandler.parse_section_entry_points  s"    
 ,,_>N>NO%^r1   c                d    U R                  XR                  5      n[        R                  " U5      $ r   )r   r   r   canonic_package_data)r   r   package_datas      r/   _parse_package_data(ConfigOptionsHandler._parse_package_data  s)    22?DTDTU**<88r1   c                ,    U R                  U5      U S'   g)zPParses `package_data` configuration file section.

:param dict section_options:
r  Nr  r   r   s     r/   parse_section_package_data/ConfigOptionsHandler.parse_section_package_data  s    
  $77H^r1   c                ,    U R                  U5      U S'   g)zXParses `exclude_package_data` configuration file section.

:param dict section_options:
exclude_package_dataNr  r  s     r/   "parse_section_exclude_package_data7ConfigOptionsHandler.parse_section_exclude_package_data  s    
 (,'?'?'P#$r1   c                d   ^  T R                  UU 4S j5      n[        R                  " U5      T S'   g)zRParses `extras_require` configuration file section.

:param dict section_options:
c                0   > TR                  SU  S3U5      $ )Nzextras_require[r   )rX  )r  r   r   s     r/   r   CConfigOptionsHandler.parse_section_extras_require.<locals>.<lambda>  s    6617MqQr1   extras_requireN)r   r   r;  r  s   `  r/   parse_section_extras_require1ConfigOptionsHandler.parse_section_extras_require  s1    
 55Q

 ")f!5r1   c                    U R                  XR                  5      n[        R                  " X R                  5      U S'   g)zNParses `data_files` configuration file section.

:param dict section_options:

data_filesN)r   r   r   canonic_data_filesr   r  s      r/   parse_section_data_files-ConfigOptionsHandler.parse_section_data_files  s3    
 ,,_>N>NO#66v}}M\r1   rD  )
rJ   r   rd   r"   r+   rE  rc   r  r  r  )rz   r@   rW   r@   r  )r   r  r  r  rS   r   r  rO  rR  rX  r  r   rh  ri  rt  r  r  r  r  r  r  r  rH  rI  s   @r/   rZ   rZ   [  s    N	. 	. #	. #		.
 ;	. 
	. 5 5?Q 
 
<T32$&9IQ
6N Nr1   rZ   c                  0    \ rS rSrSrSrSr\S 5       rSr	g)rv   i  zAmbiguous requirement marker.z
    One of the parsed requirements in `{field}` looks like a valid environment marker:

        {req!r}

    Please make sure that the configuration file is correct.
    You can use dangling lines to avoid this problem.
    z'userguide/declarative_config.html#opt-2c                j    SU R                    3nU R                  U R                  U R                  X!S9$ )Nz%https://setuptools.pypa.io/en/latest/)see_urlformat_args)	_SEE_DOCS_format_SUMMARY_DETAILS)r   r  docss      r/   ry   _AmbiguousMarker.message  s/    6s}}oF{{3<<t{TTr1   r   N)
r   r  r  r  r  r  r  r  ry   r  r   r1   r/   rv   rv     s+    .HH :I U Ur1   rv   c                      \ rS rSrSrSrg)r	  i  z!userguide/declarative_config.htmlr   N)r   r  r  r  r  r  r   r1   r/   r	  r	    s    3Ir1   r	  )FF)r)   r   r*   rE  r+   rE  r  rQ   )r,   r   r)   r   r  r   )r   F)
r,   r   r)   r   rD   zIterable[StrPath]r+   rE  r  2tuple[ConfigMetadataHandler, ConfigOptionsHandler])rJ   z#Distribution | DistributionMetadatarK   r@   )r.   zKIterable[ConfigHandler[Distribution] | ConfigHandler[DistributionMetadata]]r  rQ   )F)rb   r   rB   r"   r+   rE  r  r  )rz   r@   r{   r@   ro   r?   )Ar  
__future__r   r   rH   r7   collectionsr   collections.abcr   r   r   r   typingr	   r
   r   r   r   r   r   packaging.markersr   rs   packaging.requirementsr   r   packaging.versionr   r   r   r   _pathr   errorsr   r   warningsr   r   typing_extensionsr   r%   r   distutils.distr    rQ   r@   tupler!   r  r"   r#   r0   r4   r'   rO   r(   rA   r   r   r]   rZ   rv   r	  r   r1   r/   <module>r     s  	 #   	 # . $ Q Q Q ? B 5   + 3 +,3"&sE#s(O';"< i <
  $C)=$=> 9 > 	>+A	B PU++$(+HL+	+4 &(!&	
 # 	
 8>	 
	2 "'++&+ + 8	+\2@aGFO aH	PXM*@A PXfYN=8 YNxU3 U(44 4r1   