
    \Zix;                    ~   S r SSKJr  SSKrSSKrSSKrSSKrSSKJr  SSK	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JrJrJr  SS
KJr  SSKJr  SSKJr  SSKJrJr  \(       a  SSK J!r!  SSKJ"r"  SSKJ#r#J$r$  SSKJ%r%  \
S0S j5       r&Sr' \
S0S j5       r(Sr) " S S\" S\)5      5      r*\
S1S j5       rS2S jr+S3S jr,S4S jr-S4S jr.S4S jr/S5S jr0\0r1S6S  jr2S7S! jr3S7S" jr4S8S# jr5S9S$ jr6\
S:S% j5       r7S;S& jr8    S<S' jr9 " S( S)\5      r:      S=S* jr;\
S>S+ j5       r<S?S, jr=S@SAS- jjr>S7S. jr?S7S/ jr@g)BzCommon URL utilities.    )annotationsN)
namedtuple)cache)getpass)abspath
expanduser)TYPE_CHECKING
NamedTuple)quote
quote_plusunquoteunquote_plus)urlparse)
urlunparse   )on_win)split_filenamestrip_pkg_extension)Iterable)Pattern)AnySelf)ParseResultc                2   SU ;  a  U $ / n[         R                  " SU [         R                  S9 H2  nUR                  UR	                  5       UR                  5       45        M4     [        U5      (       d  U $ SnSn[        U 5       Hv  u  pVUS:  a  US-  nM  UR                  S5      nUnUS:X  a>  U H8  nXXS   :X  d  M  [        R                  " S	[        XS-   US
-    S5      5      nSn  O   U(       d  Mr  X7-  nMx     [        R                  " U5      S   $ )N%z(%[0-9A-F]{2}))flags    r   r   ascii   %B         )refinditer
IGNORECASEappendstartendlen	enumerateencodestructpackintcodecsutf_8_decode)	pathrangesmresultskipsicemitrs	            0lib/python3.13/site-packages/conda/common/url.pypercent_decoder<   #   s    $$&F[[*DFqwwy!%%'*+ Gv;; FE$19QJEHHW9!9!;;sCUQU0CR,HIDE	 
 4NF   v&q))r   zfile://c                4  ^ U (       d  [        SU < 35      eU R                  [        5      (       a   U R                  S5        U $ [        [        U 5      5      R                  SS5      n SmU4S jn[        S U  5       5      (       aC  U" [        U S	5      (       a  U R                  S
5      O[        U S5      R                  S
5      5      n [        U 5      S:  a  U S   S:X  a  [        S-   U -   n U $ [        U -   n U $ ! [         a    [        SU < 35      ef = f)NzNot allowed: r   z6Non-ascii not allowed for things claiming to be URLs: \/z!'()*-._/\:c                :   > SR                  U4S jU  5       5      $ )N c              3     >#    U  H?  nS [        U5      S 3U/US:  =(       a    UR                  5       =(       d    UT;      v   MA     g7f)r   02X{N)ordisalnum).0r8   percent_encode_charss     r;   	<genexpr>0path_to_url.<locals>.<lambda>.<locals>.<genexpr>l   sI      'A SVCL	1a#g5!))+R>R9RSs   AA
)join)srH   s    r;   <lambda>path_to_url.<locals>.<lambda>l   s    rww ''  r   c              3  >   #    U  H  n[        U5      S :  v   M     g7f)   N)rE   )rG   chars     r;   rI   path_to_url.<locals>.<genexpr>p   s     
-3t9s   decodezunicode-escapezutf-8r   :)
ValueError
startswithfile_schemerS   UnicodeDecodeErrorr   r   replaceanyhasattrbytesr*   )r2   percent_encoderH   s     @r;   path_to_urlr^   Q   s    =122{##	KK 
 :d#$,,T37D *N 
-
---tX&& KK()tW%,,-=>
 4y1}aCS 4' K T!KI " 	HQ 	s   C= =D)schemer2   queryfragmentusernamepasswordhostnameportc                     ^  \ rS rSrSr        S               SU 4S jjjr\SS j5       r\SS j5       rSS jr	SS jr
SS jr\SS	 j5       rS
rU =r$ )Url   a  
Object used to represent a Url. The string representation of this object is a url string.

This object was inspired by the urllib3 implementation as it gives you a way to construct
URLs from various parts. The motivation behind this object was making something that is
interoperable with built the `urllib.parse.urlparse` function and has more features than
the built-in `ParseResult` object.
c	                   > U(       a  UR                  S5      (       d  SU-   nU(       a  UR                  5       nU(       a  UR                  5       n[        T	U ]  XX#XEXgU5	      $ )Nr?   )rV   lowersuper__new__)
clsr_   r2   r`   ra   rb   rc   rd   re   	__class__s
            r;   rl   Url.__new__   sX     ,,:D\\^F~~'Hwh(d
 	
r   c                    U R                   (       a,  U R                  (       a  U R                    SU R                   3$ U R                   (       a  U R                   $ g NrT   rb   rc   selfs    r;   authUrl.auth   s>    ==T]]mm_Admm_55]]==  r   c                r    U R                   (       a  U R                   SU R                    3$ U R                  $ rq   )re   rd   rs   s    r;   netloc
Url.netloc   s,    99mm_Adii[11}}r   c                    U u  pp4pVpxSn	U(       a  X S3-  n	U(       a  U(       a
  X SU S3-  n	U(       a  X-  n	U(       a  U	SU 3-  n	U(       a  X-  n	U(       a  U	SU 3-  n	U(       a  U	SU 3-  n	U	$ )NrA   ://rT   @?# )
rt   r_   r2   r`   ra   rb   rc   rd   re   urls
             r;   __str__Url.__str__   s    LPIex8XS>!CZq
!,,COCQtf:CKCQug;CQxj>!C
r   c                "    U R                  5       $ )z3Provide a public interface for namedtuple's _asdict)_asdictrs   s    r;   as_dictUrl.as_dict   s    ||~r   c                &    U R                   " S0 UD6$ )z4Provide a public interface for namedtuple's _replacer   )_replace)rt   kwargss     r;   rY   Url.replace   s    }}&v&&r   c           	     \    [          Vs0 s H  o"[        XS5      _M     nnU " S0 UD6$ s  snf )NrA   r   )	url_attrsgetattr)rm   parse_resultfldvaluess       r;   from_parse_resultUrl.from_parse_result   s2    AJK#w|"55K}V} Ls   )r   )NNNNNNNN)r_   
str | Noner2   r   r`   r   ra   r   rb   r   rc   r   rd   r   re   r   )returnr   )r   str)r   zdict[str, str | None])r   r   )r   r   r   r   )__name__
__module____qualname____firstlineno____doc__rl   propertyru   rx   r   r   rY   classmethodr   __static_attributes____classcell__)rn   s   @r;   rg   rg      s     " ####

 
 	

 
 
 
 
 
 
* ! !  
*'  r   rg   c                    [         (       a(  U R                  S5      (       a  U R                  SS5        [        U 5      (       d  SU -   n [        R                  [        U 5      5      $ )Nzfile:r>   r?   z//)r   rV   rY   
has_schemerg   r   	_urlparser   s    r;   r   r      sJ    v#..))D#c??Sj  300r   c                    [        U 5      nUR                  S:w  a  [        SU < S35      eUR                  UR                  p2X#4$ )zConvert an s3 url to a tuple of bucket and key.

Examples:
    >>> url_to_s3_info("s3://bucket-name.bucket/here/is/the/key")
    ('bucket-name.bucket', '/here/is/the/key')
s3zYou can only use s3: urls (not ))r   r_   rU   rd   r2   )r   
parsed_urlbucketkeys       r;   url_to_s3_infor      sI     #JD :3'CDD%%zC;r   c                d    U (       d  g [        U 5      R                  S:g  $ ! [         a     gf = f)zV
Examples:
    >>> is_url(None)
    False
    >>> is_url("s3://some/bucket")
    True
FrA   )r   r_   rU   r   s    r;   is_urlr      s6     }##r)) s   " 
//c                x     [         R                  " U 5        U R                  S5      S:H  $ ! [         a     gf = f)z
Examples:
    >>> [is_ipv4_address(ip) for ip in ('8.8.8.8', '192.168.10.10', '255.255.255.255')]
    [True, True, True]
    >>> [is_ipv4_address(ip) for ip in ('8.8.8', '192.168.10.10.20', '256.255.255.255', '::1')]
    [False, False, False, False]
F.r!   )socket	inet_atonOSErrorcount	string_ips    r;   is_ipv4_addressr     s?    # ??31$$  s   , 
99c                p     [         R                  " [         R                  U 5        g! [         a     gf = f)z
Examples:
    >> [is_ipv6_address(ip) for ip in ('::1', '2001:db8:85a3::370:7334', '1234:'*7+'1234')]
    [True, True, True]
    >> [is_ipv6_address(ip) for ip in ('192.168.10.10', '1234:'*8+'1234')]
    [False, False]
FT)r   	inet_ptonAF_INET6r   r   s    r;   is_ipv6_addressr     s4    )4   s   %( 
55c                <    [        U 5      =(       d    [        U 5      $ )z
Examples:
    >> is_ip_address('192.168.10.10')
    True
    >> is_ip_address('::1')
    True
    >> is_ip_address('www.google.com')
    False
)r   r   r   s    r;   is_ip_addressr      s     9%C)CCr   c                     U S   (       a  U S   R                  S5      (       a  SOSnUSR                  S S U  5        5       5      -   $ )Nr   r?   rA   c              3  6   #    U  H  o(       d  M  Uv   M     g 7fNr   )rG   ys     r;   rI   join.<locals>.<genexpr>/  s     N'H!AAA'Hs   
	c              3  T   #    U  H  o(       d  M  UR                  S 5      v   M      g7f)r?   N)strip)rG   xs     r;   rI   r   /  s     'Hdads   
(()rV   rK   )argsr(   s     r;   rK   rK   -  sC    Aw$q'"4"4S"9"9CrE388N'Hd'HNNNNr   c                0    [         R                  " SU 5      $ )Nz[a-z][a-z0-9]{0,11}://)r$   match)values    r;   r   r   5  s    88-u55r   c                ,    U R                  SS5      S   $ )z
Examples:
    >>> strip_scheme("https://www.conda.io")
    'www.conda.io'
    >>> strip_scheme("s3://some.bucket/plus/a/path.ext")
    'some.bucket/plus/a/path.ext'
r{   r   )splitr   s    r;   strip_schemer   9  s     99UAr""r   c                T    [        U 5      u  pU(       a  U R                  USS5      $ U $ )Nz<TOKEN>r   )split_anaconda_tokenrY   )r   _tokens      r;   mask_anaconda_tokenr   D  s(    #C(HA/43;;ui+=#=r   c                    [         R                  " SU 5      nU(       a  UR                  5       S   OSnUb  U R                  SU-   SS5      OU nUR	                  S5      U4$ )a  
Examples:
    >>> split_anaconda_token("https://1.2.3.4/t/tk-123-456/path")
    (u'https://1.2.3.4/path', u'tk-123-456')
    >>> split_anaconda_token("https://1.2.3.4/t//path")
    (u'https://1.2.3.4/path', u'')
    >>> split_anaconda_token("https://some.domain/api/t/tk-123-456/path")
    (u'https://some.domain/api/path', u'tk-123-456')
    >>> split_anaconda_token("https://1.2.3.4/conda/t/tk-123-456/path")
    (u'https://1.2.3.4/conda/path', u'tk-123-456')
    >>> split_anaconda_token("https://1.2.3.4/path")
    (u'https://1.2.3.4/path', None)
    >>> split_anaconda_token("https://10.2.3.4:8080/conda/t/tk-123-45")
    (u'https://10.2.3.4:8080/conda', u'tk-123-45')
z/t/([a-zA-Z0-9-]*)r   Nz/t/rA   r   r?   )r$   searchgroupsrY   rstrip)r   _token_matchr   cleaned_urls       r;   r   r   I  s_      992C8L(4L!!$$E7<7H#++eemR3cKc"E))r   c                    [        U 5      R                  U5      nU(       a  UR                  5       S   OSnUb  UR                  SU-   SS5      OUnUR	                  S5      U4$ )z

Examples:
    >>> from conda.base.constants import KNOWN_SUBDIRS
    >>> split_platform(KNOWN_SUBDIRS, "https://1.2.3.4/t/tk-123/linux-ppc64le/path")
    (u'https://1.2.3.4/t/tk-123/path', u'linux-ppc64le')

r   Nr?   rA   r   )_split_platform_rer   r   rY   r   )known_subdirsr   _platform_matchplatformr   s        r;   split_platformr   _  sd     )7>>sCO.=%%'*4H8@8L#++cHnb!4RUKc"H,,r   c                    SR                  SR                  S U  5       5      5      n[        R                  " U[        R                  5      $ )Nz/({})(?:/|$)|c              3  &   #    U  H  o v   M	     g 7fr   r   )rG   ds     r;   rI   %_split_platform_re.<locals>.<genexpr>q  s     1=aS'=s   )formatrK   r$   compiler&   )r   _platform_match_regexs     r;   r   r   n  s=    +22		1=11 ::+R]];;r   c                    [        U 5      u  p#U(       d  g UR                  SS5      S   nXA;   =(       a    U=(       d    S $ )Nr?   r   r   )r   rsplit)r   r   url_no_package_namer   maybe_a_platforms        r;   has_platformr   v  sB    +C0*11#q9"=,A1AITIr   c                    U (       d  g[        U 5      u  p[        U5      n[        UR                  UR                  UR
                  UR                  S9n[        U5      UR                  UR                  U4$ )z
Examples:
    >>> split_scheme_auth_token("https://u:p@conda.io/t/x1029384756/more/path")
    ('conda.io/more/path', 'https', 'u:p', 'x1029384756')
    >>> split_scheme_auth_token(None)
    (None, None, None, None)
)NNNN)rd   re   r2   r`   )
r   r   rg   rd   re   r2   r`   r   r_   ru   )r   r   r   	url_partsremainder_urls        r;   split_scheme_auth_tokenr   ~  si     %-c2K%I##^^^^oo	M }y//FFr   c                  p    \ rS rSr% S\S'   S\S'   S\S'   S\S'   S\S'   S\S'   S\S	'   S\S
'   S\S'   Srg)_SplitUrlPartsi  r   r_   ru   r   r   package_filenamerd   re   r2   r`   r   N)r   r   r   r   __annotations__r   r   r   r;   r   r     s8    
  

r   r   c                N   [        U5      u  p#[        X5      u  p$[        U5      u  pVU(       a  SU;   a  UR                  SS5      OUS 4u  p'[	        U5      n[        UR                  UR                  UUUUR                  UR                  UR                  UR                  5	      $ )Nr?   r   )r   r   r   r   r   r   r_   ru   rd   re   r2   r`   )	r   r   r   r   r   r   extr   r   s	            r;   split_conda_url_easy_partsr     s     .c2K*=FK -FA 3+% 	3"4  "K %I
 
r   c                <    [        SU  S35      n[        S5      nX4$ )N
z proxy username: z
Password: )inputr   )r_   rb   passwds      r;   get_proxy_username_and_passr     s)    r&!234H\"Fr   c                ^    [        U 5      n U R                  U[        USS9S9n[        U5      $ )z
Inserts `username` and `password` into provided `url`

>>> add_username_and_password('https://anaconda.org', 'TestUser', 'Password')
'https://TestUser:Password@anaconda.org'
rA   )saferr   )r   rY   r   r   )r   rb   rc   url_with_auths       r;   add_username_and_passwordr     s2     3-CKKE(QS<TKUM}r   c                   U(       d  U $ [        U 5      nUR                  (       a  UR                  (       a	  U(       d  U $ UR                  S5      n[	        U5      S:  a  UR                  US   US   S9n[        U5      $ )a^  Add auth if the url doesn't currently have it.

By default, does not replace auth if it already exists.  Setting ``force`` to ``True``
overrides this behavior.

Examples:
    >>> maybe_add_auth("https://www.conda.io", "user:passwd")
    'https://user:passwd@www.conda.io'
    >>> maybe_add_auth("https://www.conda.io", "")
    'https://www.conda.io'
rT   r   r   rr   )r   rb   rc   r   r*   rY   r   )r   ru   forcer   
auth_partss        r;   maybe_add_authr     sn     
Ii00
CJ
:%%z!}zRS}%U	y>r   c                <    U (       a  [        [        U 5      5      $ U $ r   )r   remove_authr   s    r;   maybe_unquoter    s    -0<C()9c9r   c                N    [        U 5      n U R                  SSS9n[        U5      $ )zRemove embedded authentication from URL.

.. code-block:: pycon

   >>> remove_auth("https://user:password@anaconda.com")
   'https://anaconda.com'
rA   rr   )r   rY   r   )r   url_no_auths     r;   r  r    s*     3-C++rB+7K{r   )r2   r   r   r   )r   r   r   rg   )r   r   r   tuple[str, str])r   r   r   bool)r   r   r   r  )r   r   )r   r   r   r  )r   r   r   r   )r   r   )r   Iterable[str]r   r   r   r  )r   r  r   zPattern[str])r   r   r   r  r   zbool | None)r   r   r   z5tuple[str | None, str | None, str | None, str | None])r   r  r   r   r   r   )r_   r   r   r  )r   r   rb   r   rc   r   r   r   )F)r   r   ru   r   r   r  r   r   )Ar   
__future__r   r0   r$   r   r-   collectionsr   	functoolsr   r   os.pathr   r   typingr	   r
   urllib.parser   r   r   r   r   r   r   _urlunparsecompatr   r2   r   r   collections.abcr   r   r   r   r   r<   rW   r^   r   rg   r   r   r   r   r   rK   join_urlr   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r   r   r;   <module>r     sx    "  	   "   ' ,  / 2  5( ( * *>  * *Z		L*UI
& L^ 1 1 %
DO
 6#>
*,- < <JG	G:G0	Z 	 '*:  	4:r   