+
    :1jx;                       R t ^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RIHt ^ RI	H
t
 ^ RIHt ^ RIHtHt ^ RIHtHt ^ RIHtHtHtHt ^ R	IHt ^ R
IHt ^RIHt ^RIHtHt ]'       d   ^ RI H!t! ^ RIH"t" ^ RIH#t#H$t$ ^ RIH%t% ]
R R l4       t&Rt' ]
R R l4       t(RDt) ! R R]! R])4      4      t*]
R R l4       tR R lt+R R lt,R R lt-R  R! lt.R" R# lt/R$ R% lt0]0t1R& R' lt2R( R) lt3R* R+ lt4R, R- lt5R. R/ lt6]
R0 R1 l4       t7R2 R3 lt8R4 R5 lt9 ! R6 R7]4      t:R8 R9 lt;]
R: R; l4       t<R< R= lt=RER> R? llt>R@ RA lt?RB RC lt@R# )Fz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                    V ^8  d   QhRRRR/#    pathstrreturn )formats   "0lib/python3.14/site-packages/conda/common/url.py__annotate__r!   $   s     * * * *    c                t   R V 9  d   V # . p\         P                  ! RV \         P                  R7       F2  pVP                  VP	                  4       VP                  4       34       K4  	  \        V4      '       g   V # Rp^ p\        V 4       F  w  rVV^ 8  d   V^,          pK  VP                  R4      pTpVR8X  dL   V FE  pWX^ ,          8X  g   K  \        P                  ! R\        W^,           V^,            ^4      4      p^p M	  V'       g   K  W7,          pK  	  \        P                  ! V4      ^ ,          # )%z(%[0-9A-F]{2}))flagsr"   ascii   %B)refinditer
IGNORECASEappendstartendlen	enumerateencodestructpackintcodecsutf_8_decode)	r   rangesmresultskipsicemitrs	   &        r    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                    V ^8  d   QhRRRR/# r   r   )r   s   "r    r!   r!   R   s     * *c *c *r"   c                  a V '       g   \        R V : 24      hV P                  \        4      '       d    V P                  R4       V # \        \        V 4      4      P                  RR4      p RoV3R lp\        ;QJ d    R V  4       F  '       g   K   RM	  R	M! R V  4       4      '       dE   T! \        V R
4      '       d   V P                  R4      M\        V R4      P                  R4      4      p \        V 4      ^8  d%   V ^,          R8X  d   \        R,           V ,           p V # \        V ,           p V #   \         d    \        RT : 24      hi ; i)zNot allowed: r&   z6Non-ascii not allowed for things claiming to be URLs: \/z!'()*-._/\:c                :   < R P                  V3R lV  4       4      # ) c              3     <"   T FE  pR \        V4      R 2V.VR8  ;'       d    VP                  4       ;'       g    VS9   ,          x  KG  	  R# 5i)r$   02X{N)ordisalnum).0r<   percent_encode_charss   & r    	<genexpr>0path_to_url.<locals>.<lambda>.<locals>.<genexpr>l   sR      'A SVCL	1a#g55!))+RR>R9RSSs    AAA)join)srL   s   &r    <lambda>path_to_url.<locals>.<lambda>l   s    rww ''  r"   c              3  >   "   T F  p\        V4      ^8  x  K  	  R# 5i)   N)rI   )rK   chars   & r    rM   path_to_url.<locals>.<genexpr>p   s     
-3t9s   TFdecodezunicode-escapezutf-8:)
ValueError
startswithfile_schemerW   UnicodeDecodeErrorr   r   replaceanyhasattrbytesr/   )r   percent_encoderL   s   & @r    path_to_urlrb   Q   s0   =122{##	KK 
 :d#$,,T37D *N s
-
-sss
-
---tX&& KK()tW%,,-=>
 4y1}aCS 4' K T!KI " 	HQ 	s   D5 5Ec                     a  ] tR t^tRtRR V 3R lllt]R R l4       t]R R l4       tR R	 lt	R
 R lt
R R lt]R R l4       tRtV ;t# )Urla  
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               8    V ^8  d   QhRRRRRRRRRRRRRRR	R/# )
r   scheme
str | Noner   queryfragmentusernamepasswordhostnameportr   )r   s   "r    r!   Url.__annotate__   sZ     
 

 
 	

 
 
 
 
 
r"   c	                	   < V'       d!   VP                  R 4      '       g
   R V,           pV'       d   VP                  4       pV'       d   VP                  4       p\        S	V `  WW#WEWgV4	      # )rC   )rZ   lowersuper__new__)
clsrf   r   rh   ri   rj   rk   rl   rm   	__class__s
   &&&&&&&&&r    rr   Url.__new__   sX     ,,:D\\^F~~'Hwh(d
 	
r"   c                   V ^8  d   QhRR/# r   r   rg   r   )r   s   "r    r!   rn      s     ! !j !r"   c                	    V P                   '       d.   V P                  '       d   V P                    R V P                   2# V P                   '       d   V P                   # R# )rX   Nrj   rk   selfs   &r    authUrl.auth   sD    ===T]]]mm_Admm_55]]]==  r"   c                   V ^8  d   QhRR/# rw   r   )r   s   "r    r!   rn      s      
 r"   c                	t    V P                   '       d   V P                   R V P                    2# V P                  # )rX   )rm   rl   rz   s   &r    netloc
Url.netloc   s.    999mm_Adii[11}}r"   c                   V ^8  d   QhRR/# )r   r   r   r   )r   s   "r    r!   rn      s       r"   c                	2   V w  rr4rVrxR p	V'       d   W R2,          p	V'       d   V'       d   W RV R2,          p	V'       d	   W,          p	V'       d   V	RV 2,          p	V'       d	   W,          p	V'       d   V	RV 2,          p	V'       d   V	RV 2,          p	V	# )rE   ://rX   @?#r   )
r{   rf   r   rh   ri   rj   rk   rl   rm   urls
   &         r    __str__Url.__str__   s    LPIex8XS>!CZq
!,,COCQtf:CKCQug;CQxj>!C
r"   c                   V ^8  d   QhRR/# )r   r   zdict[str, str | None]r   )r   s   "r    r!   rn      s      . r"   c                "    V P                  4       # )z3Provide a public interface for namedtuple's _asdict)_asdictrz   s   &r    as_dictUrl.as_dict   s    ||~r"   c                   V ^8  d   QhRR/# )r   r   r   r   )r   s   "r    r!   rn      s     ' '4 'r"   c                &    V P                   ! R/ VB # )z4Provide a public interface for namedtuple's _replacer   )_replace)r{   kwargss   &,r    r]   Url.replace   s    }}&v&&r"   c                    V ^8  d   QhRRRR/# )r   parse_resultr   r   r   r   )r   s   "r    r!   rn      s      [ T r"   c           	     	Z    \          Uu/ uF  q"\        WR 4      bK  	  ppV ! R/ VB # u upi )rE   r   )	url_attrsgetattr)rs   r   fldvaluess   &&  r    from_parse_resultUrl.from_parse_result   s2    AJK#w|"55K}V} Ls   (r   )NNNNNNNN)__name__
__module____qualname____firstlineno____doc__rr   propertyr|   r   r   r   r]   classmethodr   __static_attributes____classcell__)rt   s   @r    rd   rd      s]    
 
* ! !  
*'  r"   rd   c                    V ^8  d   QhRRRR/# )r   r   r   r   rd   r   )r   s   "r    r!   r!      s     1 1# 1# 1r"   c                    \         '       d*   V P                  R 4      '       d   V P                  RR4       \        V 4      '       g
   RV ,           p \        P                  \        V 4      4      # )zfile:rB   rC   z//)r   rZ   r]   
has_schemerd   r   	_urlparser   s   &r    r   r      sJ    v#..))D#c??Sj  300r"   c                    V ^8  d   QhRRRR/# )r   r   r   r   tuple[str, str]r   )r   s   "r    r!   r!      s        r"   c                    \        V 4      pVP                  R8w  d   \        RV : R24      hVP                  VP                  r2W#3# )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   rf   rY   rl   r   )r   
parsed_urlbucketkeys   &   r    url_to_s3_infor      sI     #JD :3'CDD%%zC;r"   c                    V ^8  d   QhRRRR/# )r   r   r   r   boolr   )r   s   "r    r!   r!      s        r"   c                l    V '       g   R#  \        V 4      P                  R8g  #   \         d     R# i ; i)zV
Examples:
    >>> is_url(None)
    False
    >>> is_url("s3://some/bucket")
    True
FrE   )r   rf   rY   r   s   &r    is_urlr      s6     }##r)) s   $ 33c                    V ^8  d   QhRRRR/# r   	string_ipr   r   r   r   )r   s   "r    r!   r!     s     % %s %t %r"   c                |     \         P                  ! V 4       T P                  R4      ^8H  #   \         d     R# i ; i)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.)socket	inet_atonOSErrorcountr   s   &r    is_ipv4_addressr     s?    # ??31$$  s   , ;;c                    V ^8  d   QhRRRR/# r   r   )r   s   "r    r!   r!     s      s t r"   c                v     \         P                  ! \         P                  V 4       R#   \         d     R# i ; i)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   %) 88c                    V ^8  d   QhRRRR/# r   r   )r   s   "r    r!   r!      s     
D 
DS 
DT 
Dr"   c                >    \        V 4      ;'       g    \        V 4      # )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)CCr"   c                   V ^8  d   QhRR/# )r   argsr   r   )r   s   "r    r!   r!   -  s     O O Or"   c                     V ^ ,          '       d   V ^ ,          P                  R4      '       d   RMRpVRP                  R R V  4        4       4      ,           # )    rC   rE   c              3  8   "   T F  q'       g   K  Vx  K  	  R # 5iNr   )rK   ys   & r    rM   join.<locals>.<genexpr>/  s     N'H!AAA'Hs   	
c              3  V   "   T F  q'       g   K  VP                  R 4      x  K!  	  R# 5irC   N)strip)rK   xs   & r    rM   r   /  s     'Hdads   	)))rZ   rO   )r   r-   s   * r    rO   rO   -  sE    Aww$q'"4"4S"9"9CrE388N'Hd'HNNNNr"   c                    V ^8  d   QhRRRR/# )r   valuer   r   r   r   )r   s   "r    r!   r!   5  s     6 6c 6d 6r"   c                0    \         P                  ! R V 4      # )z[a-z][a-z0-9]{0,11}://)r)   match)r   s   &r    r   r   5  s    88-u55r"   c                    V ^8  d   QhRRRR/# r   r   r   r   r   )r   s   "r    r!   r!   9  s     # #c #c #r"   c                4    V P                  R^4      R,          # )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   )splitr   s   &r    strip_schemer   9  s     99UAr""r"   c                    V ^8  d   QhRRRR/# r   r   )r   s   "r    r!   r!   D  s     > >S >S >r"   c                V    \        V 4      w  rV'       d   V P                  VR ^4      # T # )z<TOKEN>)split_anaconda_tokenr]   )r   _tokens   &  r    mask_anaconda_tokenr   D  s(    #C(HA/43;;ui+=#=r"   c                   V ^8  d   QhRR/# )r   r   r   r   )r   s   "r    r!   r!   I  s     * *c *r"   c                    \         P                  ! RV 4      pV'       d   VP                  4       ^ ,          MRpVe   V P                  RV,           R^4      MT pVP	                  R4      V3# )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-]*)Nz/t/rE   rC   )r)   searchgroupsr]   rstrip)r   _token_matchr   cleaned_urls   &   r    r   r   I  s_      992C8L(4L!!$$E7<7H#++eemR3cKc"E))r"   c               $    V ^8  d   QhRRRRRR/# )r   known_subdirsIterable[str]r   r   r   r   r   )r   s   "r    r!   r!   _  s!     - -- -c -o -r"   c                    \        V 4      P                  V4      pV'       d   VP                  4       ^ ,          MRpVe   VP                  RV,           R^4      MTpVP	                  R4      V3# )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')

NrC   rE   )_split_platform_rer   r   r]   r   )r   r   _platform_matchplatformr   s   &&   r    split_platformr   _  sd     )7>>sCO.=%%'*4H8@8L#++cHnb!4RUKc"H,,r"   c                    V ^8  d   QhRRRR/# )r   r   r   r   zPattern[str]r   )r   s   "r    r!   r!   o  s     < <m < <r"   c                    R P                  RP                  R V  4       4      4      p\        P                  ! V\        P                  4      # )z/({})(?:/|$)|c              3  &   "   T F  q x  K	  	  R # 5ir   r   )rK   ds   & r    rM   %_split_platform_re.<locals>.<genexpr>q  s     1=aS'=s   )r   rO   r)   compiler+   )r   _platform_match_regexs   & r    r   r   n  s=    +22		1=11 ::+R]];;r"   c               $    V ^8  d   QhRRRRRR/# )r   r   r   r   r   r   zbool | Noner   )r   s   "r    r!   r!   v  s&     J Jc J- JK Jr"   c                    \        V 4      w  r#V'       g   R # VP                  R^4      R,          pWA9   ;'       d    T;'       g    R # )NrC   r   )r   rsplit)r   r   url_no_package_namer   maybe_a_platforms   &&   r    has_platformr  v  sH    +C0*11#q9"=,AA1AIITIr"   c                    V ^8  d   QhRRRR/# )r   r   r   r   z5tuple[str | None, str | None, str | None, str | None]r   )r   s   "r    r!   r!   ~  s      G G	G:Gr"   c                    V '       g   R# \        V 4      w  r\        V4      p\        VP                  VP                  VP
                  VP                  R7      p\        V4      VP                  VP                  V3# )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)
)rl   rm   r   rh   )NNNN)
r   r   rd   rl   rm   r   rh   r   rf   r|   )r   r   r   	url_partsremainder_urls   &    r    split_scheme_auth_tokenr	  ~  sl     %%-c2K%I##^^^^oo	M }y//FFr"   c                  r    ] tR tRt$ R]R&   R]R&   R]R&   R]R&   R]R&   R]R&   R]R	&   R]R
&   R]R&   RtR# )_SplitUrlPartsi  rg   rf   r|   r   r   package_filenamerl   rm   r   rh   r   N)r   r   r   r   __annotations__r   r   r"   r    r  r    s8    
  

r"   r  c               $    V ^8  d   QhRRRRRR/# )r   r   r   r   r   r   r  r   )r   s   "r    r!   r!     s$       '*r"   c                R   \        V4      w  r#\        W4      w  r$\        V4      w  rVV'       d   R V9   d   VP                  R ^4      MVR3w  r'\	        V4      p\        VP                  VP                  VVVVP                  VP                  VP                  VP                  4	      # r   )r   r   r   r  r   r  rf   r|   rl   rm   r   rh   )	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                    V ^8  d   QhRRRR/# )r   rf   r   r   r   r   )r   s   "r    r!   r!     s        r"   c                <    \        R V  R24      p\        R4      pW3# )
z proxy username: z
Password: )inputr   )rf   rj   passwds   &  r    get_proxy_username_and_passr    s)    r&!234H\"Fr"   c               (    V ^8  d   QhRRRRRRRR/# )r   r   r   rj   rk   r   r   )r   s   "r    r!   r!     s(     	 	3 	# 	 	 	r"   c                j    \        V 4      p V P                  V\        VRR7      R7      p\        V4      # )z
Inserts `username` and `password` into provided `url`

>>> add_username_and_password('https://anaconda.org', 'TestUser', 'Password')
'https://TestUser:Password@anaconda.org'
rE   )safery   )r   r]   r
   r   )r   rj   rk   url_with_auths   &&& r    add_username_and_passwordr    s2     3-CKKE(QS<TKUM}r"   c               (    V ^8  d   QhRRRRRRRR/# )r   r   r   r|   forcer   r   r   )r   s   "r    r!   r!     s(       3 t  r"   c                "   V'       g   V # \        V 4      pVP                  '       d   VP                  '       d   V'       g   V # VP                  R4      p\	        V4      ^8  d"   VP                  V^ ,          V^,          R7      p\        V4      # )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'
rX   ry   )r   rj   rk   r   r/   r]   r   )r   r|   r  r  
auth_partss   &&&  r    maybe_add_authr!    st     
Ii000
CJ
:%%z!}zRS}%U	y>r"   c                    V ^8  d   QhRRRR/# r   r   )r   s   "r    r!   r!     s     : :s :s :r"   c                >    V '       d   \        \        V 4      4      # T # r   )r   remove_authr   s   &r    maybe_unquoter%    s    -0<C()9c9r"   c                    V ^8  d   QhRRRR/# r   r   )r   s   "r    r!   r!     s      S S r"   c                T    \        V 4      p V P                  RRR7      p\        V4      # )zRemove embedded authentication from URL.

.. code-block:: pycon

   >>> remove_auth("https://user:password@anaconda.com")
   'https://anaconda.com'
rE   ry   )r   r]   r   )r   url_no_auths   & r    r$  r$    s*     3-C++rB+7K{r"   )rf   r   rh   ri   rj   rk   rl   rm   )F)Ar   
__future__r   r5   r)   r   r2   collectionsr   	functoolsr   r   os.pathr   r   typingr   r	   urllib.parser
   r   r   r   r   r   r   _urlunparsecompatr   r   r   r   collections.abcr   r   r   r   r   r?   r[   rb   r   rd   r   r   r   r   r   rO   join_urlr   r   r   r   r   r   r  r	  r  r  r  r  r!  r%  r$  r   r"   r    <module>r3     sN    "  	   "   ' ,  / 2  5( ( * *>  * *Z		L*UI
& L^ 1 1 %
DO
 6#>
*,- < <JG0	Z 	:  	4:r"   