o
    …9j©k  ã                   @   s  d Z dZdZdZdZdZdZdZdZdd	l	Z	dd	l
Z
dd	lZdd	lZdd
lT g d¢Zdd„ ZzddlmZmZmZ dd„ ZW n eyK   dd„ ZY nw dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zejj e_ dd„ Zdd„ Zd d!„ Z d"d#„ Z!zdd$l"m#Z# W n eyˆ   d	Z#Y nw d%d&„ Z$d'd(„ Z%d)Z&d	a'd	a(d*d+„ Z)d,d-„ Z*d.d/„ Z+zdd0l"m,Z, W n ey¶   e+Z-Y nw d1d2„ Z-z
dd3l"m.Z.m/Z0 W n eyÐ   e-Z1Y nw d4d5„ Z2d6d7„ Z3d8d9œd:d;„Z1e4e
d<ƒoìe
 5¡ d= d>kZ6dDd?d@„Z7dAdB„ Z8z	ddCl"m9Z: W d	S  e�y
   Y d	S w )Ez�Common pathname manipulations, WindowsNT/95 version.

Instead of importing this module directly, import os and refer to this
module as os.path.
Ú.ú..ú\ú;ú/z.;C:\binÚnulé    N)Ú*)&ÚnormcaseÚisabsÚjoinÚ
splitdriveÚsplitÚsplitextÚbasenameÚdirnameÚcommonprefixÚgetsizeÚgetmtimeÚgetatimeÚgetctimeÚislinkÚexistsÚlexistsÚisdirÚisfileÚismountÚ
expanduserÚ
expandvarsÚnormpathÚabspathÚcurdirÚpardirÚsepÚpathsepÚdefpathÚaltsepÚextsepÚdevnullÚrealpathÚsupports_unicode_filenamesÚrelpathÚsamefileÚsameopenfileÚsamestatÚ
commonpathc                 C   s   t | tƒrdS dS )Nó   \/ú\/)Ú
isinstanceÚbytes©Úpath© r5   ú/usr/lib/python3.10/ntpath.pyÚ_get_bothseps#   s   
r7   )ÚLCMapStringExÚLOCALE_NAME_INVARIANTÚLCMAP_LOWERCASEc                 C   sd   t  | ¡} | s	| S t| tƒr(t ¡ }|  |d¡ dd¡} tt	t
| ƒ} |  |d¡S tt	t
|  dd¡ƒS )únNormalize case of pathname.

        Makes all characters lowercase and all slashes into backslashes.
        Úsurrogateescaper   r   )ÚosÚfspathr1   r2   ÚsysÚgetfilesystemencodingÚdecodeÚreplaceÚ_LCMapStringExÚ_LOCALE_NAME_INVARIANTÚ_LCMAP_LOWERCASEÚencode)ÚsÚencodingr5   r5   r6   r	   3   s   

ÿ
þr	   c                 C   s@   t  | ¡} t| tƒrt  t  | ¡ dd¡ ¡ ¡S |  dd¡ ¡ S )r;   r   r   )r=   r>   r1   r2   ÚfsencodeÚfsdecoderB   Úlower©rG   r5   r5   r6   r	   F   s   

c                 C   sj   t  | ¡} t| tƒr|  dd¡ d¡rdS n|  dd¡ d¡r!dS t| ƒd } t| ƒd	ko4| d	 t| ƒv S )
zTest whether a path is absoluteó   /ó   \ó   \\?\Tr   r   ú\\?\é   r   )	r=   r>   r1   r2   rB   Ú
startswithr   Úlenr7   rL   r5   r5   r6   r
   W   s   

ÿr
   c           
   
   G   s@  t  | ¡} t| tƒrd}d}d}nd}d}d}zs|s"| d d… |  t| ƒ\}}tt j|ƒD ]>}t|ƒ\}}	|	rG|	d |v rG|sB|sD|}|	}q.|r\||kr\| ¡ | ¡ krZ|}|	}q.|}|rh|d |vrh|| }||	 }q.|r†|d |vr†|r†|dd … |kr†|| | W S || W S  ttt	fyŸ   t
jd	| g|¢R Ž  ‚ w )
NrN   r/   ó   :r   r0   ú:r   éÿÿÿÿr   )r=   r>   r1   r2   r   ÚmaprK   Ú	TypeErrorÚAttributeErrorÚBytesWarningÚgenericpathÚ_check_arg_types)
r4   Úpathsr"   ÚsepsÚcolonÚresult_driveÚresult_pathÚpÚp_driveÚp_pathr5   r5   r6   r   g   sL   


ÿ
þr   c                 C   s  t  | ¡} t| ƒdkr…t| tƒrd}d}d}nd}d}d}|  ||¡}|dd… |d krq|dd	… |krq| |d¡}|d
krG| dd… | fS | ||d ¡}||d kr]| dd… | fS |d
kret| ƒ}| d|… | |d… fS |dd… |kr…| dd… | dd… fS | dd… | fS )aÚ  Split a pathname into drive/UNC sharepoint and relative path specifiers.
    Returns a 2-tuple (drive_or_unc, path); either part may be empty.

    If you assign
        result = splitdrive(p)
    It is always true that:
        result[0] + result[1] == p

    If the path contained a drive letter, drive_or_unc will contain everything
    up to and including the colon.  e.g. splitdrive("c:/dir") returns ("c:", "/dir")

    If the path contained a UNC path, the drive_or_unc will contain the host name
    and share up to but not including the fourth directory separator character.
    e.g. splitdrive("//host/computer/dir") returns ("//host/computer", "/dir")

    Paths cannot contain both a drive letter and a UNC path.

    é   rN   rM   rT   r   r   rU   r   é   rV   NrQ   )r=   r>   rS   r1   r2   rB   Úfind)rb   r"   r%   r_   ÚnormpÚindexÚindex2r5   r5   r6   r   –   s.   

$r   c                 C   sŠ   t  | ¡} t| ƒ}t| ƒ\}} t| ƒ}|r+| |d  |vr+|d8 }|r+| |d  |vs| d|… | |d… }}| |¡p>|}|| |fS )z~Split a pathname.

    Return tuple (head, tail) where tail is everything after the final slash.
    Either part may be empty.rQ   N)r=   r>   r7   r   rS   Úrstrip)rb   r^   ÚdÚiÚheadÚtailr5   r5   r6   r   Î   s   
ÿr   c                 C   s4   t  | ¡} t| tƒrt | ddd¡S t | ddd¡S )NrN   rM   ó   .r   r   r   )r=   r>   r1   r2   r[   Ú	_splitext©rb   r5   r5   r6   r   å   s   

r   c                 C   ó   t | ƒd S )z)Returns the final component of a pathnamerQ   ©r   rr   r5   r5   r6   r   ð   ó   r   c                 C   rs   )z-Returns the directory component of a pathnamer   rt   rr   r5   r5   r6   r   ÷   ru   r   c              
   C   s6   zt  | ¡}W n tttfy   Y dS w t |j¡S )zhTest whether a path is a symbolic link.
    This will always return false for Windows prior to 6.0.
    F)r=   ÚlstatÚOSErrorÚ
ValueErrorrY   ÚstatÚS_ISLNKÚst_mode©r4   Ústr5   r5   r6   r   þ   s   ÿr   c              	   C   s*   zt  | ¡}W dS  ttfy   Y dS w )zCTest whether a path exists.  Returns True for broken symbolic linksFT)r=   rv   rw   rx   r|   r5   r5   r6   r   
  s   þÿr   )Ú_getvolumepathnamec                 C   sp   t  | ¡} t| ƒ}t| ƒ} t| ƒ\}}|r"|d |v r"| p!||v S ||v r(dS tr6|  |¡t| ƒ |¡kS dS )zaTest whether a path is a mount point (a drive root, the root of a
    share, or a mounted volume)r   TF)r=   r>   r7   r   r   r~   rk   )r4   r^   ÚrootÚrestr5   r5   r6   r      s   
r   c                 C   sJ  t  | ¡} t| tƒrd}nd}|  |¡s| S dt| ƒ}}||k r9| | t| ƒvr9|d7 }||k r9| | t| ƒvs)dt jv rDt jd }n"dt jvrK| S zt jd }W n ty]   d}Y nw t	|t jd ƒ}|dkr“| d|… }t|tƒrzt  
|¡}t j d¡}||kr“|t|ƒkrŒ| S t	t|ƒ|ƒ}t| tƒr�t  |¡}|| |d	…  S )
zLExpand ~ and ~user constructs.

    If user or $HOME is unknown, do nothing.ó   ~ú~rQ   ÚUSERPROFILEÚHOMEPATHÚ	HOMEDRIVEÚ ÚUSERNAMEN)r=   r>   r1   r2   rR   rS   r7   ÚenvironÚKeyErrorr   rJ   Úgetr   r   rI   )r4   Útilderm   ÚnÚuserhomeÚdriveÚtarget_userÚcurrent_userr5   r5   r6   r   ;  s@   


ÿ

ÿ



r   z.'[^']*'?|%(%|[^%]*%?)|\$(\$|[-\w]+|\{[^}]*\}?)c                    sÒ   t  | ¡} t| tƒr5d| vrd| vr| S ts$ddl}| t ¡ |j	¡j
at}d‰d‰ d‰d‰tt ddƒ‰n%d| vr?d	| vr?| S tsMddl}| t|j	¡j
at}d	‰d
‰ d‰d‰t j‰‡ ‡‡‡‡fdd„}||| ƒS )zfExpand shell variables of the forms $var, ${var} and %var%.

    Unknown variables are left unchanged.ó   $ó   %r   Nó   {ó   }Úenvironbú$ú%ú{ú}c                    sÌ   | j }|d u r| d S | | }|dkr)|ˆkr|S | ˆ¡s"| d S |d d… }n|ˆkr/|S | ˆ ¡rC| ˆ¡s=| d S |dd… }zˆd u rTt tjt |¡ ¡W S ˆ| W S  tye   | d  Y S w )Nr   rQ   rV   )Ú	lastindexÚendswithrR   r=   rI   rˆ   rJ   r‰   )Úmrš   Úname©ÚbraceÚdollarrˆ   ÚpercentÚrbracer5   r6   Úrepl›  s.   



ÿzexpandvars.<locals>.repl)r=   r>   r1   r2   Ú_varsubbÚreÚcompileÚ_varpatternrF   ÚASCIIÚsubÚgetattrÚ_varsubrˆ   )r4   r¥   r©   r£   r5   rž   r6   r   |  s4   


r   c           	      C   sN  t  | ¡} t| tƒrd}d}d}d}d}n
d}d}d}d	}d
}|  |¡r&| S |  ||¡} t| ƒ\}} |  |¡r@||7 }|  |¡} |  |¡}d}|t	|ƒk r—|| rW|| |kr[||= n6|| |kr�|dkr{||d  |kr{||d |d …= |d8 }n|dkrˆ| 
|¡rˆ||= n	|d7 }n|d7 }|t	|ƒk sM|s |s | |¡ || |¡ S )z0Normalize path, eliminating double slashes, etc.rN   rM   rp   ó   ..)s   \\.\rO   r   r   r   r   )z\\.\rP   r   rQ   )r=   r>   r1   r2   rR   rB   r   Úlstripr   rS   r›   Úappendr   )	r4   r"   r%   r    r!   Úspecial_prefixesÚprefixÚcompsrm   r5   r5   r6   r   ½  sH   







ô
r   c                 C   s@   t  | ¡} t| ƒst| tƒrt  ¡ }nt  ¡ }t|| ƒ} t| ƒS )z¤Return the absolute version of a path as a fallback function in case
    `nt._getfullpathname` is not available or raises OSError. See bpo-31047 for
    more.

    )	r=   r>   r
   r1   r2   ÚgetcwdbÚgetcwdr   r   )r4   Úcwdr5   r5   r6   Ú_abspath_fallbackï  s   



rµ   )Ú_getfullpathnamec              	   C   s.   zt t| ƒƒW S  ttfy   t| ƒ Y S w )z&Return the absolute version of a path.)r   r¶   rw   rx   rµ   r3   r5   r5   r6   r     s
   ÿr   )Ú_getfinalpathnameÚreadlinkc              
   C   s¶   d}t ƒ }t| ƒ|vrY| t| ƒ¡ z| }t| ƒ} t| ƒs/t|ƒs&|} W | S ttt|ƒ| ƒƒ} W n" t	yI } z|j
|v rDW Y d }~| S ‚ d }~w tyR   Y | S w t| ƒ|vs| S )N)rQ   re   rf   é   é   é    é2   éC   éW   i&  i(  i)  )Úsetr	   ÚaddÚ_nt_readlinkr
   r   r   r   r   rw   Úwinerrorrx   )r4   Úallowed_winerrorÚseenÚold_pathÚexr5   r5   r6   Ú_readlink_deep  s4   	ø€

ü€ýírÇ   c                 C   sæ   d}d}| rqzt | ƒ} |rt| |ƒW S | W S  tyn } zM|j|vr#‚ zt| ƒ}|| kr<|r3t||ƒn|W W  Y d }~S W n	 tyF   Y nw t| ƒ\} }| r[|s[| | W  Y d }~S |rbt||ƒn|}W Y d }~nd }~ww | s|S )N)rQ   re   rf   r¹   rº   r»   r¼   é5   éA   r½   r¾   é{   é¡   i€  i�  r†   )r·   r   rw   rÂ   rÇ   r   )r4   rÃ   ro   rÆ   Únew_pathr�   r5   r5   r6   Ú_getfinalpathname_nonstrict>  s2   
 ÿþ€íürÍ   F)Ústrictc          
   
   C   sv  t | ƒ} t| tƒr!d}d}d}t ¡ }t| ƒtt t¡ƒkr dS nd}d}d}t ¡ }t| ƒttƒkr5dS |  	|¡}|sEt
| ƒsEt|| ƒ} zt| ƒ} d	}W n tyi } z|rX‚ |j}t| ƒ} W Y d }~nd }~ww |s¹|  	|¡r¹|  	|¡r�|| t|ƒd …  }	n| t|ƒd … }	zt|	ƒ| kr•|	} W | S W | S  ty¸ } z|j|kr­|	} W Y d }~| S W Y d }~| S d }~ww | S )
NrO   s   \\?\UNC\s   \\s   \\.\NULrP   z\\?\UNC\z\\z\\.\NULr   )r   r1   r2   r=   r²   r	   rI   r'   r³   rR   r
   r   r·   rw   rÂ   rÍ   rS   )
r4   rÎ   r°   Ú
unc_prefixÚnew_unc_prefixr´   Ú
had_prefixÚinitial_winerrorrÆ   Úspathr5   r5   r6   r(   o  s^   
ÿ

€ü
ùû

þ€ûr(   Úgetwindowsversionrf   re   c                 C   sX  t  | ¡} t| tƒrd}d}d}nd}d}d}|du r|}| s#tdƒ‚t  |¡}zott|ƒƒ}tt| ƒƒ}t|ƒ\}}t|ƒ\}	}
t|ƒt|	ƒkrQtd	|	|f ƒ‚d
d„ | 	|¡D ƒ}dd„ |
 	|¡D ƒ}d}t
||ƒD ]\}}t|ƒt|ƒkrz n|d7 }ql|gt|ƒ|  ||d…  }|s“|W S t|Ž W S  tttttfy«   t d| |¡ ‚ w )z#Return a relative version of a pathrN   rp   r¬   r   r   r   Nzno path specifiedz&path is on mount %r, start on mount %rc                 S   ó   g | ]}|r|‘qS r5   r5   ©Ú.0Úxr5   r5   r6   Ú
<listcomp>Â  ó    zrelpath.<locals>.<listcomp>c                 S   rÕ   r5   r5   rÖ   r5   r5   r6   rÙ   Ã  rÚ   r   rQ   r*   )r=   r>   r1   r2   rx   r   r   r   r	   r   ÚziprS   r   rX   rY   rZ   ÚDeprecationWarningr[   r\   )r4   Ústartr"   r    r!   Ú	start_absÚpath_absÚstart_driveÚ
start_restÚ
path_driveÚ	path_restÚ
start_listÚ	path_listrm   Úe1Úe2Úrel_listr5   r5   r6   r*   ¦  sJ   


ÿ

þr*   c              	      sž  | st dƒ‚tttj| ƒƒ} t| d tƒrd‰d‰ d‰nd‰d‰ d‰z™‡ ‡fd	d
„| D ƒ}‡fdd
„|D ƒ}zt‡fdd„|D ƒƒ\}W n t yP   t dƒd‚w ttdd„ |D ƒƒƒdkrbt dƒ‚t	| d  
ˆ ˆ¡ƒ\}}| ˆ¡}‡fdd
„|D ƒ}‡fdd
„|D ƒ}t|ƒ}t|ƒ}t|ƒD ]\}	}
|
||	 kr£|d|	… } n	q‘|dt|ƒ… }|r²|ˆ n|}|ˆ |¡ W S  ttfyÎ   tjdg| ¢R Ž  ‚ w )zDGiven a sequence of path names, returns the longest common sub-path.z%commonpath() arg is an empty sequencer   rN   rM   rp   r   r   r   c                    s    g | ]}t | ˆ ˆ¡ ¡ ƒ‘qS r5   )r   rB   rK   )r×   rb   )r%   r"   r5   r6   rÙ   ï  s     zcommonpath.<locals>.<listcomp>c                    s   g | ]	\}}|  ˆ ¡‘qS r5   rt   ©r×   rl   rb   ©r"   r5   r6   rÙ   ð  s    c                 3   s$   � | ]\}}|d d… ˆ kV  qd S )NrQ   r5   ré   rê   r5   r6   Ú	<genexpr>ó  s   €" zcommonpath.<locals>.<genexpr>z%Can't mix absolute and relative pathsNc                 s   s   � | ]\}}|V  qd S ©Nr5   ré   r5   r5   r6   rë   ú  s   € rQ   zPaths don't have the same drivec                    ó   g | ]
}|r|ˆ kr|‘qS r5   r5   ©r×   Úc©r    r5   r6   rÙ   ÿ  ó    c                    s   g | ]}‡ fd d„|D ƒ‘qS )c                    rí   r5   r5   rî   rð   r5   r6   rÙ     rñ   z)commonpath.<locals>.<listcomp>.<listcomp>r5   )r×   rG   rð   r5   r6   rÙ     s    r.   )rx   ÚtuplerW   r=   r>   r1   r2   r¿   rS   r   rB   r   ÚminÚmaxÚ	enumerater   rX   rY   r[   r\   )r]   ÚdrivesplitsÚsplit_pathsr
   rŽ   r4   ÚcommonÚs1Ús2rm   rï   r°   r5   )r%   r    r"   r6   r.   Þ  sL   
ÿ
þþr.   )Ú_isdirrì   );Ú__doc__r    r!   r&   r"   r#   r%   r$   r'   r=   r?   ry   r[   Ú__all__r7   Ú_winapir8   rC   r9   rD   r:   rE   r	   ÚImportErrorr
   r   r   r   r   rq   r   r   r   r   Úntr~   r   r   r§   r«   r¤   r   r   rµ   r¶   r   r·   r¸   rÁ   r(   rÇ   rÍ   ÚhasattrrÔ   r)   r*   r.   rû   r   r5   r5   r5   r6   Ú<module>   sŠ   	
ÿ/8
ÿ=A2ÿþ*1
4ÿ
84þ