7dZdZdZdZdZdZdZdZdZdd 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) dd l%m*Z+ dd"l%m,Z,d#Z- dd%l%m.Z.m/Z0e1fd&Z2e1fd'Z3d(d)d*Z4d,Z5d6d-Z6d.Z7 dd/l%m8Z9dd0l%m:Z;dd1l%mZ? dd3l%m@Z@d4ZAy #e$rdZYwxYw#e$rd Z&YwwxYw#e$rd!Z+YuwxYw#e$rd$Z-YywxYw#e$r d(d)d+Z4YqwxYw#e$rYZwxYw#e$rd5ZAYy wxYw)7zCommon 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 -/opt/alt/python312/lib64/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 ls_ 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 FFctj|}t|trPd|vrd|vr|Sddl}t|j |j zdzd}d}d}d}d }d}ttd d}nDd |vrd |vr|Sddl}|j |j zdz}d }d }d}d}d }tj}|dd} d} t|} | | kr|| | dz} | |k(r5|| dzd}t|} |j| } | | |d| dzzz } n| |k(r|| dz| dz|k(r | | z } | dz } n|| dzd}t|} |j|} |d| } |:tjtjtj| }n|| }| |z } n%| |k(r|| dz| dz|k(r | | z } | dz } n|| dz| dz|k(rr|| dzd}t|} |j|} |d| } |:tjtjtj| }n|| }| |z } n|dd} | dz } || | dz} | r| |vr| | z } | dz } || | dz} | r| |vr |:tjtjtj| }n|| }| |z } | r | dz} n| | z } | dz } | | kr| S#t$r| | |zz } | dz } Y&wxYw#t$r || z|z}YjwxYw#t$r| ||zz } | dz } YZwxYw#t$r||z| z|z}YwxYw#t$r| ||z|zz } | dz } YwxYw#t$r|| z}YwxYw)zfExpand shell variables of the forms $var, ${var} and %var%. Unknown variables are left unchanged.$%rNz_-ascii'{}environb$%'{}rWrv)rCrDr6r7string ascii_lettersdigitsgetattrrrr~rrPrQr)r9rvarcharsquotepercentbracerbracedollarrresr~pathlencvarvalues r:rrsH 99T?D$ t D 0K-- =DgN"j$/ d?s$K''&--7$>** r(C E$iG '/ uQw  : #D$iG $ 1 q4 +++'\EAIeai(G3q E!GH~d)! JJw/E v,C8"?$&KK 2;;s;K0L$ME$+CLE5LC &[EAIeai(F2q eai *e3E!GH~d)! JJv.E v,C>"?$&KK 2;;s;K0L$ME$+CLE5LC2Ah uqy)AM1HCQJEU519-AAM) " BJJr{{37G,H I ' u QJE 1HC  W '/X JI $q4x!  $,$8 '#  78"(7T>)C#aKE(@$> & 4v =>"(6E>D00C#aKE(4 )"SLE)so3KL AK5(M?AL)8AM"K21K25L  L  L&%L&)M?MMM"M32M3)_path_normpathc 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) z0Normalize path, eliminating double slashes, etc.rTrUr..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<)_getfullpathnamec tt|S#ttf$rYnwxYwt j |}t |st|trd}tj}nd}tj}t|\}}}|s|rK tt||z|}t|S#ttf$r||z|z}Yt|SwxYwt||}t|S)&Return the absolute version of a path.rTr) rr rrrCrDr r6r7getcwdbgetcwdrr )r9r$rrorps r:r!r!Fs #HTN3 3$   yyT{$& )$ E4. 0 >ED ~  ,. 3;-D~ .FHd+~s((B77CCctj|}t|sEt|trtj }ntj }t||}t|S)r) rCrDr r6r7rrr r )r9cwds r:r!r!:sKyyT{$&jjliikT?D~r<)_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_deeprhsLutnD( 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_pathnames r:_getfinalpathname_nonstrictrs$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*es 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_pathsrorpr9commonrrMs1s2rs r:r0r0Fs- @AA #bii' (E%(E"JOP%Qy63!7!=!=!?@% P3>?;1aqwws|; ? -gaA- .! 3DE E -gaA- .! 3>? ?%eAh&6&6vs&CDtTC#9VqQ&[!V9DOPKq1:1aa6k1:K P    bMDAqBqEz" 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)rr!rr8s r: isdevdriver!s( #GDM2 2  s  ""cyr rr8s r:r!r!sr<r)B__doc__r"r#r(r$r%r'r&r)rCrErrb__all__r;_winapir=rIr>rJr?rKr ImportErrorr r r rrrrrrhasattr stat_resultr1rntrrrrrr rr!rrrrrrr*r+r,r0rrrrrrrrrr!rr<r:r*s          !,-- 8H(+b.1r +*8 ((00  2>>+,J$%:-zj`&(-R)#6g> ,3(T9@0d"'DP"+p.b  ())) #M ,, ,t^#("(#(T   T!&x  s} C4DD%D/D+D<*E4C?>C?D  D DDD('D(+ D98D9<EEEE