0 iKudZdZdZdZdZdZdZdZdZdd l Z dd l Z dd l Z dd l Z dd l gd Z d Z dd lmZmZmZdZdZdZdZdZdZdZe j<je_dZdZ e!e jDdrdZ#ndZ#dZ$ ddl%m&Z&dZ'dZ(dZ)d a*d a+d Z, dd!l%m-Z-d"Z.d$Z/ dd%l%m0Z0d&Z1 dd'l%m2Z2m3Z4e5fd(Z6e5fd)Z7d*d+d,Z8d.Z9d8d/Z:d0Z; dd1l%mZ?dd3l%m@ZAdd4l%mBZC dd5l%mDZDd6ZEy #e$rdZYwxYw#e$rd Z&YwxYw#e$rd#Z.YxwxYw#e$re/Z1YxwxYw#e$r d*d+d-Z8YpwxYw#e$rYYwxYw#e$rd7ZEYy wxYw)9zCommon 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 splitdrive splitrootsplitsplitextbasenamedirname commonprefixgetsizegetmtimegetatimegetctimeislinkexistslexistsisdirisfileismount expanduser expandvarsnormpathabspathcurdirpardirseppathsepdefpathaltsepextsepdevnullrealpathsupports_unicode_filenamesrelpathsamefile sameopenfilesamestat commonpath isjunction ALLOW_MISSINGc&t|tryy)N\/\/) isinstancebytespaths /usr/lib/python3.12/ntpath.py _get_bothsepsr;$s$) LCMapStringExLOCALE_NAME_INVARIANTLCMAP_LOWERCASEcXtj|}|s|St|tr]t j }|j |djdd}ttt|}|j|dSttt|jddS)nNormalize case of pathname. Makes all characters lowercase and all slashes into backslashes. surrogateescaperr) osfspathr6r7sysgetfilesystemencodingdecodereplace_LCMapStringEx_LOCALE_NAME_INVARIANT_LCMAP_LOWERCASEencode)sencodings r:r r 4s IIaLH a 002H#45==c4HA5/4A88H&78 8!"8"2"#))C"68 8r<ctj|}t|trFtjtj |j ddjS|j ddjS)rArr)rCrDr6r7fsencodefsdecoderHlower)rMs r:r r Gsb IIaL a ;;r{{1~55c4@FFHI Iyyd#))++r<ctj|}t|trd}d}d}nd}d}d}|ddj ||}|j |s|j |d ry y ) zTest whether a path is absolute\/s:\rrz:\NTF)rCrDr6r7rH startswith)rMr$r' colon_seps r:r r Xsn ! A!U   "1 fc"A ||CALLA6 r<c8tj|}t|trd}d}d}nd}d}d} |s|dd|zt |\}}}t tj|D]b}t |\} } } | r | s|s| }| }| }| r/| |k7r*| j |j k7r| }| }| }N| }|r |d|vr||z}|| z}d|r|s|r|dd||zvr||z|zS||z|zS#tttf$rtjd |g|wxYw) NrTr4:rr5:rr ) rCrDr6r7rmaprR TypeErrorAttributeError BytesWarning genericpath_check_arg_types) r9pathsr$sepscolon result_drive result_root result_pathpp_drivep_rootp_paths r:r r lsd 99T?D$! !HsN1:4. k;RYY& /A&/l #GVV,#*L$ $ W 4==?l&8&8&::#*L"(K"(K& {2d:)C/ %.K+ /.  \"#.edlB#% 3 3k)K77 ~| 4$$VT:E: sB/C,$C,,-Dc.t|\}}}|||zfS)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. )r)rjdriveroottails r:r r s#&"! E4 $+ r<ctj|}t|tr d}d}d}d}d}n d}d}d}d }d }|j ||}|d d |k(r||d d |k(ri|d dj |k(rdnd }|j ||}|dk(r|||fS|j ||d z} | dk(r|||fS|d | || | d z|| d zd fS||d d |d d fS|d d |k(r!|d d|k(r|d d |d d|dd fS|d d ||d d fS|||fS)aSplit a pathname into drive, root and tail. The drive is defined exactly as in splitdrive(). On Windows, the root may be a single path separator or an empty string. The tail contains anything after the root. For example: splitroot('//server/share/') == ('//server/share', '/', '') splitroot('C:/Users/Barney') == ('C:', '/', 'Users/Barney') splitroot('C:///spam///ham') == ('C:', '/', '//spam///ham') splitroot('Windows/notepad') == ('', '', 'Windows/notepad') rTrUr[\\?\UNC\r<rrr\\\?\UNC\NrWr]rV)rCrDr6r7rHupperfind) rjr$r'rf unc_prefixemptynormpstartindexindex2s r:rrs ! A!U$ #  IIfc "E RayC 1: r*j8AaEJJsE*E{%&ZZUQY/F|%&Wf:q 3Qvz{^C C!BQ%12& & qu  1: Ra5!Aa&!AB%' 'Ra5%12& &eQr<ctj|}t|}t|\}}}t |}|r||dz |vr|dz}|r ||dz |vr|d|||d}}||z|j |z|fS)z~Split a pathname. Return tuple (head, tail) where tail is everything after the final slash. Either part may be empty.rWN)rCrDr;rlenrstrip)rjredriheadrqs r:rrs ! A  DlGAq! AA !A#d" Q !A#d"2A!"$D q54;;t$ $d **r<ctj|}t|trt j |dddSt j |dddS)NrTrU.rrr)rCrDr6r7rb _splitextrjs r:rrsG ! A!U$$QtT::$$Qc377r<ct|dS)z)Returns the final component of a pathnamerWrrs r:rr  8A;r<ct|dS)z-Returns the directory component of a pathnamerrrs r:rrrr<st_reparse_tagc tj|}t |j tjk(S#tttf$rYywxYwz!Test whether a path is a junctionF) rClstatOSError ValueErrorr`boolrstatIO_REPARSE_TAG_MOUNT_POINTr9sts r:r1r1sM $BB%%)H)HHII^4  s=AAc.tj|yr)rCrDr8s r:r1r1$s $r<cZ tj|}y#ttf$rYywxYw)zCTest whether a path exists. Returns True for broken symbolic linksFT)rCrrrrs r:rr,s2 XXd^  Z s **)_getvolumepathnamec>tj|}t|}t|}t |\}}}|r |d|vr| S|r|syt rL|j |}t |j |}|j|jk(Sy)zaTest whether a path is a mount point (a drive root, the root of a share, or a mounted volume)rTF)rCrDr;r!rrrcasefold)r9rerorprestxys r:rrBs 99T?D  D 4=D!$E4 qT!x D KK  d # * *4 0zz|qzz|++r<c8tj|}t|trd}nd}|j |s|Sdt |}}||kr+||t |vr|dz }||kr||t |vrdtjvrtjd}nEdtjvr|S tjd}t|tjd}|dk7rs|d|}t|trtj|}tjjd}||k7r%|t|k7r|Stt||}t|trtj|}|||d zS#t$rd}YwxYw) zLExpand ~ and ~user constructs. If user or $HOME is unknown, do nothing.~~rW USERPROFILEHOMEPATH HOMEDRIVEruUSERNAMEN)rCrDr6r7rXrr;environKeyErrorr rQgetrrrP)r9tildernuserhomero target_user current_users r:rr_s{ 99T?D$ ??5 ! c$iqA a%DG=#66 Q a%DG=#66 "::m, 2:: %  JJ{+Erzz*56Av1Qi k5 )++k2Kzz~~j1 , & x11 GH-{;H$;;x( d12h / E s6F FFz.'[^']*'?|%(%|[^%]*%?)|\$(\$|[-\w]+|\{[^}]*\}?)c tj|}t|trld|vrd|vr|Sts.replsKK  Q4K| >w ==)t 9Dv~ u%}}V,Q4KAbz {{2::bkk$.?#@AAt}$ Q4K s6:B61B66CC)rCrDr6r7_varsubbrecompile _varpatternrLASCIIsubgetattr_varsubr) r9rrrrrrrrs @@@@@r:rrs 99T?D$ t D 0K zz+"4"4"6AEEH"j$/ d?s$K jjbhh7;;G**6 tT?r<)_path_normpathctj|}t|tr5tjt tj |xsdSt |xsdS)0Normalize path, eliminating double slashes, etc.rr)rCrDr6r7rPrrQr8s r:r r sKyy dE ";;~bkk$.?@AIT Id#*s*r<c tj|}t|tr d}d}d}d}nd}d}d}d}|j ||}t |\}}}||z}|j |}d } | t|kr_|| r|| |k(r|| =n?|| |k(r2| d kDr|| d z |k7r|| d z | d z=| d z} n| d k(r|r|| =n | d z } n| d z } | t|kr_|s|s|j|||j|zS) rrTrUr..rrrrrrW) rCrDr6r7rHrrrappendr ) r9r$r'r"r#rorpprefixcompsrs r:r r s3yy dE "CFFFCFFF||FC(%dOtT 3 #e*n8uQx61!HqV#q5U1Q3Z61ac!A#gFA!VaFAQ#e*ne LL ''r<ctj|}t|sEt|trtj }ntj }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. ) rCrDr r6r7getcwdbgetcwdr r )r9cwds r:_abspath_fallbackrsM 99T?D ; dE "**,C))+CC D>r<)_getfullpathnamecl tt|S#ttf$rt |cYSwxYw)z&Return the absolute version of a path.)rr rrrr8s r:r!r!)s5 +#HTN3 3$ +$T* * +s 33)_getfinalpathnamereadlinkcpd}t}t||vro|jt| |}t|}t |s.t |s|} |St tt||}t||vro|S#|$r}|j|vrYd}~|Sd}~wt$rY|SwxYw)N) rWrvrV 2CWi&i(i)) setr add _nt_readlinkr rr r rwinerrorr)r9 ignored_errorallowed_winerrorseenold_pathexs r:_readlink_deepr7sLutnD( HHXd^ $ #D)T{"(+' $D):D$ABDtnD(, ! ;;"22     s)%B B B5B%$B%% B54B5cZd}|dd}|r t|}|r t||S|S|S#|$ry}|j|vr t||}||k7r|r t||n|cYd}~Sn #|$rYnwxYwt |\}}|r |s ||zcYd}~S|r t||n|}Yd}~nd}~wwxYw|r)N)rWrvrVrrrr5Arr{iirr)rr rrr)r9rrrqrnew_pathrs r:_getfinalpathname_nonstrictras$XBQx :(.+/tD$'9T9, +! :;;&66  .d!??$F'J#N))+C~'!22#__V, ] "-MF M#M%+T?D L$T*D  doof5z*&c*o.>)??S[\* !$U+t3 D t G " c"g&D0D>D L!{{ .t=JLD L$    !;;"22 D  !sB" E4F& F#"E88F#FF#& G5 GGGct|SN)r!)r9rs r:r*r*4s t}r<TcLtj|}t|trd}d}d}nd}d}d}||}|s t dtj|} t t |}t t |}t|\}}} t|\} }} t|t| k7rt d | d || j|D cgc]} | s|  } } | j|D cgc]} | s|  }} d }t| |D]#\}}t|t|k7rn|d z }%|gt| |z z||dz}|s|St|Scc} wcc} w#ttttt f$rt#j$d ||wxYw)z#Return a relative version of a pathrTrrrrrNzno path specifiedzpath is on mount z, start on mount rrWr,)rCrDr6r7rr!r rr rziprr r_r`raDeprecationWarningrbrc)r9r}r$r"r# start_abspath_abs start_drive_ start_rest path_drive path_restr start_list path_listre1e2rel_lists r:r,r,s 99T?D$ } ,-- IIe EHUO, 8D>*%.y%9" Q #,X#6 Ay K HZ$8 8K)* *",!1!1#!6BE,E"#E"'E,<E'E'AE,E," E,,7F#c `|s tdtttj|}t |dt rd}d}d}nd}d}d} |Dcgc]+}t|j||j-}}|Dcgc]\}}}|j|}}}}t|Dchc]\}}}| c}}}d k7r td t|Dchc]\}}}| c}}}d k7r td t|dj||\} } } | j|} | D cgc] } | s| |k7s | } } |D cgc]}|D cgc] } | s| |k7s | c} }}} t|}t|}t|D]\}} | ||k7s| d |} n| d t|} | | z|j| zScc}wcc}}}wcc}}}wcc}}}wcc} wcc} wcc} }w#t t"f$rt%j&d g|wxYw)zDGiven a sequence of path names, returns the longest common sub-path.z%commonpath() arg is an empty sequencerrTrUrrrrrWz%Can't mix absolute and relative pathszPaths don't have the same driveNr0)rtupler^rCrDr6r7rrHrRrrminmax enumerater r_r`rbrc)rdr$r'r"rj drivesplitsrr split_pathsrorpr9commoncrMs1s2rs r:r0r0s+ @AA #bii' (E%(E"JOPQy63!7!=!=!?@P P3>??1aqwws|? ? --gaA- .! 3DE E --gaA- .! 3>? ?%eAh&6&6vs&CDtTC#9qQ&[!99DOPq1:aa6k:P P    bM &DAqBqEz & HSW%Ft|chhv...5Q?- . ::P ~ &$$\:E: sH0GHG!*H9 G( "H( G/ 5AHG6 G6G6H H%G; -G; 3G; 7H<2H/,HH;HH'H-) _path_isdir) _path_isfile) _path_islink) _path_exists)_path_isdevdrivecJ tt|S#t$rYywxYwz@Determines whether the specified path is on a Windows Dev Drive.F)r r!rr8s r: isdevdriver#[s( #GDM2 2  s  ""cyr"rr8s r:r#r#Vsr<r)F__doc__r"r#r(r$r%r'r&r)rCrErrb__all__r;_winapir=rIr>rJr?rKr ImportErrorr r r rrrrrrhasattr stat_resultr1rntrrrrrrrrr rrr!rrrrrrr*r+r,r0rrrrrrrrr r#rr<r:r,s           !,-- 8H(+b.1r +*8 ((00  2>>+,J$%:-z@  :@.+!P+" +# +g> ,3(T9@0d"'DP"+p.b  ())) #k ,, ,tF#("(#(D G !&x  s} DD$D1D);D6E6ED  D DDD&%D&)D32D36 EEEEEE