o ik@sdZdZdZdZdZdZdZdZdZdd l Z dd l Z dd l Z dd l Z dd l Tgd Z d d ZzddlmZmZmZddZWn eyKddZYnwddZddZddZddZddZe jje_ddZddZd d!Z d"d#Z!zdd$l"m#Z#Wn eyd Z#Ynwd%d&Z$d'd(Z%d)Z&d a'd a(d*d+Z)d,d-Z*d.d/Z+zdd0l"m,Z,Wn eye+Z-Ynwd1d2Z-z dd3l"m.Z.m/Z0Wn eye-Z1Ynwd4d5Z2d6d7Z3d8d9d:d;Z1e4e d<oe 5d=d>kZ6dDd?d@Z7dAdBZ8z ddCl"m9Z:Wd Sey Yd Sw)EzCommon pathname manipulations, WindowsNT/95 version. Instead of importing this module directly, import os and refer to this module as os.path. ...\;/z.;C:\binnulN)*)&normcaseisabsjoin splitdrivesplitsplitextbasenamedirname commonprefixgetsizegetmtimegetatimegetctimeislinkexistslexistsisdirisfileismount expanduser expandvarsnormpathabspathcurdirpardirseppathsepdefpathaltsepextsepdevnullrealpathsupports_unicode_filenamesrelpathsamefile sameopenfilesamestat commonpathcCst|trdSdS)N\/\/) isinstancebytespathr5/usr/lib/python3.10/ntpath.py _get_bothseps#s r7) LCMapStringExLOCALE_NAME_INVARIANTLCMAP_LOWERCASEcCsdt|}|s |St|tr(t}||ddd}tt t |}| |dStt t |ddS)nNormalize case of pathname. Makes all characters lowercase and all slashes into backslashes. surrogateescaperr) osfspathr1r2sysgetfilesystemencodingdecodereplace_LCMapStringEx_LOCALE_NAME_INVARIANT_LCMAP_LOWERCASEencode)sencodingr5r5r6r 3s    r cCs@t|}t|trtt|ddS|ddS)r;rr)r=r>r1r2fsencodefsdecoderBlowerrGr5r5r6r Fs  cCsjt|}t|tr|dddrdSn |dddr!dSt|d}t|d ko4|d t|vS) zTest whether a path is absolute/\\\?\Trr\\?\r) r=r>r1r2rB startswithr lenr7rLr5r5r6r Ws   r c Gs@t|}t|trd}d}d}nd}d}d}zs|s"|dd|t|\}}ttj|D]>}t|\}} | rG| d|vrG|sB|sD|}| }q.|r\||kr\||krZ|}| }q.|}|rh|d|vrh||}|| }q.|r|d|vr|r|dd|kr|||WS||WSttt fyt j d |g|Rw) NrNr/:rr0:rr ) r=r>r1r2r maprK TypeErrorAttributeError BytesWarning genericpath_check_arg_types) r4pathsr"sepscolon result_drive result_pathpp_drivep_pathr5r5r6r gsL       r cCst|}t|dkrt|trd}d}d}nd}d}d}|||}|dd|dkrq|dd |krq||d}|d krG|d d|fS|||d }||d kr]|d d|fS|d kret|}|d |||d fS|d d|kr|d d|dd fS|d d|fS) aSplit 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. rNrMrTrrrUrrVNrQ)r=r>rSr1r2rBfind)rbr"r%r_normpindexindex2r5r5r6r s.    $  r cCst|}t|}t|\}}t|}|r+||d|vr+|d8}|r+||d|vs|d|||d}}||p>|}|||fS)z~Split a pathname. Return tuple (head, tail) where tail is everything after the final slash. Either part may be empty.rQN)r=r>r7r rSrstrip)rbr^diheadtailr5r5r6r s   r cCs4t|}t|trt|dddSt|dddS)NrNrM.rrr)r=r>r1r2r[ _splitextrbr5r5r6rs  rcC t|dS)z)Returns the final component of a pathnamerQr rrr5r5r6r rcCrs)z-Returns the directory component of a pathnamerrtrrr5r5r6rrurc Cs6zt|}Wn tttfyYdSwt|jS)zhTest whether a path is a symbolic link. This will always return false for Windows prior to 6.0. F)r=lstatOSError ValueErrorrYstatS_ISLNKst_moder4str5r5r6rs  rc Cs*zt|}WdSttfyYdSw)zCTest whether a path exists. Returns True for broken symbolic linksFT)r=rvrwrxr|r5r5r6r s  r)_getvolumepathnamecCspt|}t|}t|}t|\}}|r"|d|vr"| p!||vS||vr(dStr6||t||kSdS)zaTest whether a path is a mount point (a drive root, the root of a share, or a mounted volume)rTF)r=r>r7rr r~rk)r4r^rootrestr5r5r6r s  rcCsJt|}t|tr d}nd}||s|Sdt|}}||kr9||t|vr9|d7}||kr9||t|vs)dtjvrDtjd}n"dtjvrK|Sztjd}Wn ty]d}Ynwt |tjd}|dkr|d|}t|trzt |}tj d}||kr|t |kr|St t ||}t|trt|}|||d S) zLExpand ~ and ~user constructs. If user or $HOME is unknown, do nothing.~~rQ USERPROFILEHOMEPATH HOMEDRIVEUSERNAMEN)r=r>r1r2rRrSr7environKeyErrorr rJgetrrrI)r4tildermnuserhomedrive target_user current_userr5r5r6r;s@              rz.'[^']*'?|%(%|[^%]*%?)|\$(\$|[-\w]+|\{[^}]*\}?)cst|}t|tr5d|vrd|vr|Sts$ddl}|t|j j at}ddddt tddn%d|vr?d |vr?|St sMddl}|t|j j a t }d d d dtj fd d }|||S)zfExpand shell variables of the forms $var, ${var} and %var%. Unknown variables are left unchanged.$%rN{}environb$%{}cs|j}|dur |dS||}|dkr)|kr|S|s"|dS|dd}n|kr/|S|rC|s=|dS|dd}zdurTttjt|WS|WStye|dYSw)NrrQrV) lastindexendswithrRr=rIrrJr)mrnamebracedollarrpercentrbracer5r6repls.       zexpandvars..repl)r=r>r1r2_varsubbrecompile _varpatternrFASCIIsubgetattr_varsubr)r4rrrr5rr6r|s4   rc CsNt|}t|trd}d}d}d}d}n d}d}d}d }d }||r&|S|||}t|\}}||r@||7}||}||}d }|t |kr||rW|||kr[||=n6|||kr|d kr{||d |kr{||d |d =|d 8}n|d kr| |r||=n |d 7}n|d 7}|t |ksM|s|s| ||| |S) z0Normalize path, eliminating double slashes, etc.rNrMrp..)s\\.\rOrrrr)z\\.\rPrrQ) r=r>r1r2rRrBr lstripr rSrappendr ) r4r"r%r r!special_prefixesprefixcompsrmr5r5r6rsH              rcCs@t|}t|st|trt}nt}t||}t|S)zReturn 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 r1r2getcwdbgetcwdr r)r4cwdr5r5r6_abspath_fallbacks    r)_getfullpathnamec Cs.ztt|WSttfyt|YSw)z&Return the absolute version of a path.)rrrwrxrr3r5r5r6rs  r)_getfinalpathnamereadlinkc Csd}t}t||vrY|t|z|}t|}t|s/t|s&|}W|Sttt||}Wn"t yI}z |j |vrDWYd}~|Sd}~wt yRY|Swt||vs |S)N) rQrerf 2CWi&i(i)) setr add _nt_readlinkr rrr rrwwinerrorrx)r4allowed_winerrorseenold_pathexr5r5r6_readlink_deeps4      rc Csd}d}|rqzt|}|rt||WS|WStyn}zM|j|vr#zt|}||kr<|r3t||n|WWYd}~SWn tyFYnwt|\}}|r[|s[||WYd}~S|rbt||n|}WYd}~nd}~ww|s|S)N)rQrerfrrrr5Arr{iir)rr rwrrr )r4rrornew_pathrr5r5r6_getfinalpathname_nonstrict>s2    rF)strictc Csvt|}t|tr!d}d}d}t}t|tttkr dSnd}d}d}t}t|ttkr5dS| |}|sEt |sEt ||}zt |}d }Wnt yi}z|rX|j}t|}WYd}~nd}~ww|s| |r| |r||t|d} n|t|d} zt | |kr| }W|SW|St y}z|j|kr| }WYd}~|SWYd}~|Sd}~ww|S) NrOs\\?\UNC\s\\s\\.\NULrPz\\?\UNC\z\\z\\.\NULr)rr1r2r=rr rIr'rrRr r rrwrrrS) r4rr unc_prefixnew_unc_prefixr had_prefixinitial_winerrorrspathr5r5r6r(os^        r(getwindowsversionrfrec CsXt|}t|trd}d}d}nd}d}d}|dur|}|s#tdt|}zott|}tt|}t|\}}t|\} } t|t| krQtd | |fd d | |D} d d | |D} d } t | | D]\}}t|t|krzn| d7} ql|gt | | | | d}|s|WSt |WSt ttttfytd||w)z#Return a relative version of a pathrNrprrrrNzno path specifiedz&path is on mount %r, start on mount %rcSg|]}|r|qSr5r5.0xr5r5r6 zrelpath..cSrr5r5rr5r5r6rrrrQr*)r=r>r1r2rxrrr r r ziprSr rXrYrZDeprecationWarningr[r\)r4startr"r r! start_abspath_abs start_drive start_rest path_drive path_rest start_list path_listrme1e2rel_listr5r5r6r*sJ         r*c s|stdtttj|}t|dtrdddndddzfd d |D}fd d |D}ztfd d |D\}Wn tyPtddwttdd |Ddkrbtdt |d \}}| }fdd |D}fdd |D}t |}t |}t|D]\} } | || kr|d| }n q|dt|}|r|n|} | |WSttfytjdg|Rw)zDGiven a sequence of path names, returns the longest common sub-path.z%commonpath() arg is an empty sequencerrNrMrprrrcs g|] }t|qSr5)r rBrK)rrb)r%r"r5r6rs zcommonpath..csg|] \}}|qSr5rtrrlrbr"r5r6rsc3s$|] \}}|ddkVqdS)NrQr5rrr5r6 s"zcommonpath..z%Can't mix absolute and relative pathsNcss|]\}}|VqdSNr5rr5r5r6rsrQzPaths don't have the same drivecg|] }|r|kr|qSr5r5rcr r5r6rcsg|] }fdd|DqS)crr5r5rrr5r6rrz)commonpath...r5)rrGrr5r6rsr.)rxtuplerWr=r>r1r2rrSr rBr minmax enumerater rXrYr[r\) r] drivesplits split_pathsr rr4commons1s2rmrrr5)r%r r"r6r.sL     r.)_isdirr);__doc__r r!r&r"r#r%r$r'r=r?ryr[__all__r7_winapir8rCr9rDr:rEr ImportErrorr r r r rrqrrrrntr~rrrrrrrrrrrrrr(rrhasattrrr)r*r.rrr5r5r5r6s     /8   =A2  *1 4 84