ó
    F\h´.  ã                   ó  • S r SSKrSSKrSSKrSSKrSSKrSSKrSSKrSSKrSSK	r	SSK
Jr  S/rS rS r\R                   r S r " S	 S
5      r " S S\\	R(                  5      r " S S\5      rSS jr " S S5      rg)zÒ
A Path-like interface for zipfiles.

This codebase is shared between zipfile.Path in the stdlib
and zipp in PyPI. See
https://github.com/python/importlib_metadata/wiki/Development-Methodology
for more detail.
é    Né   )Ú
TranslatorÚPathc                 óD   • [         R                  " [        U 5      SS5      $ )zþ
Given a path with elements separated by
posixpath.sep, generate all parents of that path.

>>> list(_parents('b/d'))
['b']
>>> list(_parents('/b/d/'))
['/b']
>>> list(_parents('b/d/f/'))
['b/d', 'b']
>>> list(_parents('b'))
[]
>>> list(_parents(''))
[]
r   N)Ú	itertoolsÚisliceÚ	_ancestry)Úpaths    Ú-/usr/lib/python3.13/zipfile/_path/__init__.pyÚ_parentsr      s   € ô  ×ÒœI d›O¨Q°Ó5Ð5ó    c              #   ó  #   • U R                  [        R                  5      n U R                  [        R                  5      (       aC  U v •  [        R                  " U 5      u  pU R                  [        R                  5      (       a  MB  gg7f)a”  
Given a path with elements separated by
posixpath.sep, generate all elements of that path.

>>> list(_ancestry('b/d'))
['b/d', 'b']
>>> list(_ancestry('/b/d/'))
['/b/d', '/b']
>>> list(_ancestry('b/d/f/'))
['b/d/f', 'b/d', 'b']
>>> list(_ancestry('b'))
['b']
>>> list(_ancestry(''))
[]

Multiple separators are treated like a single.

>>> list(_ancestry('//b//d///f//'))
['//b//d///f', '//b//d', '//b']
N)ÚrstripÚ	posixpathÚsepÚsplit)r
   Útails     r   r	   r	   ,   sV   é € ð* �;‰;”y—}‘}Ó%€DØ
�+‰+”i—m‘m×
$Ñ
$ØŠ
Ü—_’_ TÓ*‰
ˆð �+‰+”i—m‘m×
$Õ
$ùs   ‚BB
ÂB
c                 óV   • [         R                  " [        U5      R                  U 5      $ )zN
Return items in minuend not in subtrahend, retaining order
with O(1) lookup.
)r   ÚfilterfalseÚsetÚ__contains__)ÚminuendÚ
subtrahends     r   Ú_differencer   K   s!   € ô
 × Ò ¤ Z£×!=Ñ!=¸wÓGÐGr   c                   ó>   ^ • \ rS rSrSrU 4S jrS rU 4S jrSrU =r	$ )ÚInitializedStateéS   z7
Mix-in to save the initialization state for pickling.
c                 ó>   >• Xl         X l        [        TU ]  " U0 UD6  g ©N)Ú_InitializedState__argsÚ_InitializedState__kwargsÚsuperÚ__init__)ÚselfÚargsÚkwargsÚ	__class__s      €r   r#   ÚInitializedState.__init__X   s   ø€ ØŒØŒÜ‰Ò˜$Ð) &Ó)r   c                 ó2   • U R                   U R                  4$ r   )r    r!   ©r$   s    r   Ú__getstate__ÚInitializedState.__getstate__]   s   € Ø�{‰{˜DŸM™MÐ)Ð)r   c                 ó.   >• Uu  p#[         TU ]  " U0 UD6  g r   )r"   r#   )r$   Ústater%   r&   r'   s       €r   Ú__setstate__ÚInitializedState.__setstate__`   s   ø€ Ø‰ˆÜ‰Ò˜$Ð) &Ó)r   )Ú__argsÚ__kwargs)
Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r#   r+   r/   Ú__static_attributes__Ú__classcell__©r'   s   @r   r   r   S   s   ø† ñõ*ò
*÷*ó *r   r   c                   ó¨   ^ • \ rS rSrSr\S 5       rU 4S jrS rS r	U 4S jr
\S 5       r\S	\R                  S
\R                  4S j5       rSrU =r$ )ÚCompleteDirsée   a  
A ZipFile subclass that ensures that implied directories
are always included in the namelist.

>>> list(CompleteDirs._implied_dirs(['foo/bar.txt', 'foo/bar/baz.txt']))
['foo/', 'foo/bar/']
>>> list(CompleteDirs._implied_dirs(['foo/bar.txt', 'foo/bar/baz.txt', 'foo/bar/']))
['foo/']
c                 ó–   • [         R                  R                  [        [        U 5      5      nS U 5       n[        [        X 5      5      $ )Nc              3   óF   #   • U  H  o[         R                  -   v •  M     g 7fr   )r   r   )Ú.0Úps     r   Ú	<genexpr>Ú-CompleteDirs._implied_dirs.<locals>.<genexpr>s   s   é € Ð6ªg¨”y—}‘}Ö$ªgùs   ‚!)r   ÚchainÚfrom_iterableÚmapr   Ú_deduper   )ÚnamesÚparentsÚas_dirss      r   Ú_implied_dirsÚCompleteDirs._implied_dirsp   s7   € ä—/‘/×/Ñ/´´H¸eÓ0DÓEˆÙ6©gÓ6ˆÜ”{ 7Ó2Ó3Ð3r   c                 óZ   >• [         TU ]  5       nU[        U R                  U5      5      -   $ r   )r"   ÚnamelistÚlistrK   )r$   rH   r'   s     €r   rN   ÚCompleteDirs.namelistv   s+   ø€ Ü‘Ñ Ó"ˆØ”t˜D×.Ñ.¨uÓ5Ó6Ñ6Ð6r   c                 ó4   • [        U R                  5       5      $ r   )r   rN   r*   s    r   Ú	_name_setÚCompleteDirs._name_setz   s   € Ü�4—=‘=“?Ó#Ð#r   c                 ó`   • U R                  5       nUS-   nX;  =(       a    X2;   nU(       a  U$ U$ )z`
If the name represents a directory, return that name
as a directory (with the trailing slash).
Ú/)rR   )r$   ÚnamerH   ÚdirnameÚ	dir_matchs        r   Úresolve_dirÚCompleteDirs.resolve_dir}   s6   € ð
 —‘Ó ˆØ˜‘*ˆØÑ%×:¨'Ñ*:ˆ	Þ#ˆwÐ-¨Ð-r   c                 óÀ   >•  [         TU ]  U5      $ ! [         aA    UR                  S5      (       a  XR	                  5       ;  a  e [
        R                  " US9s $ f = f)z&
Supplement getinfo for implied dirs.
rU   )Úfilename)r"   ÚgetinfoÚKeyErrorÚendswithrR   ÚzipfileÚZipInfo)r$   rV   r'   s     €r   r]   ÚCompleteDirs.getinfo‡   sS   ø€ ð	2Ü‘7‘? 4Ó(Ð(øÜó 	2Ø—=‘= ×%Ñ%¨·^±^Ó5EÓ)EØÜ—?’?¨DÑ1Ò1ð	2ús   ƒ ’AAÁAc                 óº   • [        U[        5      (       a  U$ [        U[        R                  5      (       d  U " U5      $ SUR                  ;  a  [        n Xl        U$ )zT
Given a source (filename or zipfile), return an
appropriate CompleteDirs subclass.
Úr)Ú
isinstancer<   r`   ÚZipFileÚmoder'   )ÚclsÚsources     r   ÚmakeÚCompleteDirs.make’   sO   € ô �fœl×+Ñ+ØˆMä˜&¤'§/¡/×2Ñ2Ù�v“;Ðð �f—k‘kÓ!ÜˆCàÔØˆr   ÚzfÚreturnc                 óv   • U R                  UR                  5       5       H  nUR                  US5        M     U$ )zq
Given a writable zip file zf, inject directory entries for
any directories implied by the presence of children.
r   )rK   rN   Úwritestr)rh   rl   rV   s      r   ÚinjectÚCompleteDirs.inject¥   s2   € ð ×%Ñ% b§k¡k£mÖ4ˆDØ�K‰K˜˜cÖ"ñ 5àˆ	r   © )r3   r4   r5   r6   r7   ÚstaticmethodrK   rN   rR   rY   r]   Úclassmethodrj   r`   rf   rp   r8   r9   r:   s   @r   r<   r<   e   sn   ø† ñð ñ4ó ð4õ
7ò$ò.õ	2ð ñó ðð$ ð˜Ÿ™ð ¨G¯O©Oó ó ör   r<   c                   ó8   ^ • \ rS rSrSrU 4S jrU 4S jrSrU =r$ )Ú
FastLookupé°   zJ
ZipFile subclass to ensure implicit
dirs exist and are resolved rapidly.
c                 óÄ   >• [         R                  " [        5         U R                  sS S S 5        $ ! , (       d  f       O= f[        TU ]  5       U l        U R                  $ r   )Ú
contextlibÚsuppressÚAttributeErrorÚ_FastLookup__namesr"   rN   ©r$   r'   s    €r   rN   ÚFastLookup.namelist¶   s=   ø€ Ü× Ò ¤Õ0Ø—<‘<÷ 1×0×0úä‘wÑ'Ó)ˆŒØ�|‰|Ðó	   œ2²
A c                 óÄ   >• [         R                  " [        5         U R                  sS S S 5        $ ! , (       d  f       O= f[        TU ]  5       U l        U R                  $ r   )ry   rz   r{   Ú_FastLookup__lookupr"   rR   r}   s    €r   rR   ÚFastLookup._name_set¼   s=   ø€ Ü× Ò ¤Õ0Ø—=‘=÷ 1×0×0úä™Ñ)Ó+ˆŒØ�}‰}Ðr   )Ú__lookupÚ__names)	r3   r4   r5   r6   r7   rN   rR   r8   r9   r:   s   @r   rv   rv   °   s   ø† ñõ
÷ó r   rv   c                 ó®   • [         R                  R                  S:H  nU=(       a    [         R                  S:  nSU-   n[        R
                  " X5      X4$ )NÚpypy)é   é   é   rˆ   )ÚsysÚimplementationrV   Úpypy_version_infoÚioÚtext_encoding)Úencodingr%   r&   Úis_pypyÚis_old_pypiÚstack_levels         r   Ú_extract_text_encodingr“   Â   sN   € ä× Ñ ×%Ñ%¨Ñ/€Gð ×@œc×3Ñ3°jÑ@€KØ�k‘/€KÜ×Ò˜HÓ2°DÐ@Ð@r   c                   ó  • \ rS rSrSrSrS"S jrS rS rS#SS.S	 jjr	S
 r
\S 5       r\S 5       r\S 5       r\S 5       r\S 5       rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS r \ r!\S  5       r"S!r#g)$r   éÌ   u÷  
A :class:`importlib.resources.abc.Traversable` interface for zip files.

Implements many of the features users enjoy from
:class:`pathlib.Path`.

Consider a zip file with this structure::

    .
    â”œâ”€â”€ a.txt
    â””â”€â”€ b
        â”œâ”€â”€ c.txt
        â””â”€â”€ d
            â””â”€â”€ e.txt

>>> data = io.BytesIO()
>>> zf = ZipFile(data, 'w')
>>> zf.writestr('a.txt', 'content of a')
>>> zf.writestr('b/c.txt', 'content of c')
>>> zf.writestr('b/d/e.txt', 'content of e')
>>> zf.filename = 'mem/abcde.zip'

Path accepts the zipfile object itself or a filename

>>> path = Path(zf)

From there, several path operations are available.

Directory iteration (including the zip file itself):

>>> a, b = path.iterdir()
>>> a
Path('mem/abcde.zip', 'a.txt')
>>> b
Path('mem/abcde.zip', 'b/')

name property:

>>> b.name
'b'

join with divide operator:

>>> c = b / 'c.txt'
>>> c
Path('mem/abcde.zip', 'b/c.txt')
>>> c.name
'c.txt'

Read text:

>>> c.read_text(encoding='utf-8')
'content of c'

existence:

>>> c.exists()
True
>>> (b / 'missing.txt').exists()
False

Coercion to string:

>>> import os
>>> str(c).replace(os.sep, posixpath.sep)
'mem/abcde.zip/b/c.txt'

At the root, ``name``, ``filename``, and ``parent``
resolve to the zipfile.

>>> str(path)
'mem/abcde.zip/'
>>> path.name
'abcde.zip'
>>> path.filename == pathlib.Path('mem/abcde.zip')
True
>>> str(path.parent)
'mem'

If the zipfile has no filename, such ï»¿attributes are not
valid and accessing them will raise an Exception.

>>> zf.filename = None
>>> path.name
Traceback (most recent call last):
...
TypeError: ...

>>> path.filename
Traceback (most recent call last):
...
TypeError: ...

>>> path.parent
Traceback (most recent call last):
...
TypeError: ...

# workaround python/cpython#106763
>>> pass
z>{self.__class__.__name__}({self.root.filename!r}, {self.at!r})c                 óD   • [         R                  U5      U l        X l        g)a   
Construct a Path from a ZipFile or filename.

Note: When the source is an existing ZipFile object,
its type (__class__) will be mutated to a
specialized type. If the caller wishes to retain the
original type, the caller should either create a
separate ZipFile object or pass a filename.
N)rv   rj   ÚrootÚat)r$   r—   r˜   s      r   r#   ÚPath.__init__5  s   € ô —O‘O DÓ)ˆŒ	Ø�r   c                 ó¢   • U R                   UR                   La  [        $ U R                  U R                  4UR                  UR                  4:H  $ )z=
>>> Path(zipfile.ZipFile(io.BytesIO(), 'w')) == 'foo'
False
)r'   ÚNotImplementedr—   r˜   )r$   Úothers     r   Ú__eq__ÚPath.__eq__B  s?   € ð
 �>‰> §¡Ò0Ü!Ð!Ø—	‘	˜4Ÿ7™7Ð#¨¯
©
°E·H±HÐ'=Ñ=Ð=r   c                 óD   • [        U R                  U R                  45      $ r   )Úhashr—   r˜   r*   s    r   Ú__hash__ÚPath.__hash__K  s   € Ü�T—Y‘Y §¡Ð(Ó)Ð)r   N©Úpwdc                ór  • U R                  5       (       a  [        U 5      eUS   nUS:X  a   U R                  5       (       d  [        U 5      eU R                  R                  U R                  XRS9nSU;   a  U(       d  U(       a  [        S5      eU$ [        U0 UD6u  psn[        R                  " Xg/UQ70 UD6$ )zŠ
Open this entry as text or binary following the semantics
of ``pathlib.Path.open()`` by passing arguments through
to io.TextIOWrapper().
r   rd   r£   Úbz*encoding args invalid for binary operation)Úis_dirÚIsADirectoryErrorÚexistsÚFileNotFoundErrorr—   Úopenr˜   Ú
ValueErrorr“   r�   ÚTextIOWrapper)r$   rg   r¤   r%   r&   Úzip_modeÚstreamr�   s           r   r«   Ú	Path.openN  s¥   € ð �;‰;�=‰=Ü# DÓ)Ð)Ø˜‘7ˆØ�s‹? 4§;¡;§=¡=Ü# DÓ)Ð)Ø—‘—‘ §¡¨�Ð;ˆØ�$‹;Þ–vÜ Ð!MÓNÐNØˆMä!7¸Ð!HÀÑ!HÑˆ˜Ü×Ò ÐB°4ÒB¸6ÑBÐBr   c                 ó|   • U R                   (       a   [        R                  " U R                   5      $ U R                  $ r   )r˜   ÚpathlibÚPurePosixPathr\   r*   s    r   Ú_baseÚ
Path._baseb  s&   € Ø15··Œw×$Ò$ T§W¡WÓ-ÐK¸d¿m¹mÐKr   c                 ó6   • U R                  5       R                  $ r   )r´   rV   r*   s    r   rV   Ú	Path.namee  ó   € à�z‰z‹|× Ñ Ð r   c                 ó6   • U R                  5       R                  $ r   )r´   Úsuffixr*   s    r   rº   ÚPath.suffixi  s   € à�z‰z‹|×"Ñ"Ð"r   c                 ó6   • U R                  5       R                  $ r   )r´   Úsuffixesr*   s    r   r½   ÚPath.suffixesm  s   € à�z‰z‹|×$Ñ$Ð$r   c                 ó6   • U R                  5       R                  $ r   )r´   Ústemr*   s    r   rÀ   Ú	Path.stemq  r¸   r   c                 óˆ   • [         R                  " U R                  R                  5      R	                  U R
                  5      $ r   )r²   r   r—   r\   Újoinpathr˜   r*   s    r   r\   ÚPath.filenameu  s*   € ä�|Š|˜DŸI™I×.Ñ.Ó/×8Ñ8¸¿¹ÓAÐAr   c                 ó¢   • [        U0 UD6u  p1nU R                  " SU/UQ70 UD6 nUR                  5       sS S S 5        $ ! , (       d  f       g = f)Nrd   )r“   r«   Úread)r$   r%   r&   r�   Ústrms        r   Ú	read_textÚPath.read_texty  sE   € Ü!7¸Ð!HÀÑ!HÑˆ˜Ø�YŠY�s˜HÐ6 tÒ6¨vÒ6¸$Ø—9‘9“;÷ 7×6×6ús   ¦A Á 
Ac                 óz   • U R                  S5       nUR                  5       sS S S 5        $ ! , (       d  f       g = f)NÚrb)r«   rÆ   )r$   rÇ   s     r   Ú
read_bytesÚPath.read_bytes~  s"   € Ø�Y‰Y�tŒ_ Ø—9‘9“;÷ �_�_ús   ’,¬
:c                 ó˜   • [         R                  " UR                  R                  S5      5      U R                  R                  S5      :H  $ ©NrU   )r   rW   r˜   r   )r$   r
   s     r   Ú	_is_childÚPath._is_child‚  s2   € Ü× Ò  §¡§¡°Ó!4Ó5¸¿¹¿¹ÈÓ9LÑLÐLr   c                 ó:   • U R                  U R                  U5      $ r   )r'   r—   )r$   r˜   s     r   Ú_nextÚ
Path._next…  s   € Ø�~‰~˜dŸi™i¨Ó,Ð,r   c                 óh   • U R                   (       + =(       d    U R                   R                  S5      $ rÏ   )r˜   r_   r*   s    r   r§   ÚPath.is_dirˆ  s"   € Ø—7‘7Œ{×3˜dŸg™g×.Ñ.¨sÓ3Ð3r   c                 óZ   • U R                  5       =(       a    U R                  5       (       + $ r   )r©   r§   r*   s    r   Úis_fileÚPath.is_file‹  s   € Ø�{‰{‹}×2 T§[¡[£]Ô!2Ð2r   c                 óP   • U R                   U R                  R                  5       ;   $ r   )r˜   r—   rR   r*   s    r   r©   ÚPath.existsŽ  s   € Ø�w‰w˜$Ÿ)™)×-Ñ-Ó/Ñ/Ð/r   c                 óÊ   • U R                  5       (       d  [        S5      e[        U R                  U R                  R                  5       5      n[        U R                  U5      $ )NzCan't listdir a file)r§   r¬   rF   rÓ   r—   rN   ÚfilterrÐ   )r$   Úsubss     r   ÚiterdirÚPath.iterdir‘  sG   € Ø�{‰{�}‰}ÜÐ3Ó4Ð4Ü�4—:‘:˜tŸy™y×1Ñ1Ó3Ó4ˆÜ�d—n‘n dÓ+Ð+r   c                 ó`   • [         R                  " U R                  5      R                  U5      $ r   )r²   r³   r˜   Úmatch)r$   Úpath_patterns     r   râ   Ú
Path.match—  s"   € Ü×$Ò$ T§W¡WÓ-×3Ñ3°LÓAÐAr   c                 ó–   • U R                   R                  U R                  5      nUR                  S-	  n[        R
                  " U5      $ )z(
Return whether this path is a symlink.
é   )r—   r]   r˜   Úexternal_attrÚstatÚS_ISLNK)r$   Úinforg   s      r   Ú
is_symlinkÚPath.is_symlinkš  s;   € ð �y‰y× Ñ  §¡Ó)ˆØ×!Ñ! RÑ'ˆÜ�|Š|˜DÓ!Ð!r   c                 óP  • U(       d  [        SU< 35      e[        R                  " U R                  5      n[	        SS9n[        R
                  " X#R                  U5      -   5      R                  n[        U R                  [        X@R                  R                  5       5      5      $ )NzUnacceptable pattern: rU   )Úseps)r¬   ÚreÚescaper˜   r   ÚcompileÚ	translateÚ	fullmatchrF   rÓ   rÝ   r—   rN   )r$   ÚpatternÚprefixÚtrÚmatchess        r   ÚglobÚ	Path.glob¢  sw   € ÞÜÐ5°g±[ÐAÓBÐBä—’˜4Ÿ7™7Ó#ˆÜ˜SÑ!ˆÜ—*’*˜V§l¡l°7Ó&;Ñ;Ó<×FÑFˆÜ�4—:‘:œv g¯y©y×/AÑ/AÓ/CÓDÓEÐEr   c                 ó*   • U R                  SU 35      $ )Nz**/)rø   )r$   rô   s     r   ÚrglobÚ
Path.rglob«  s   € Ø�y‰y˜3˜w˜i˜Ó)Ð)r   c                 ón   • [         R                  " [        U 5      [        UR                  " U6 5      5      $ r   )r   ÚrelpathÚstrrÃ   )r$   rœ   Úextras      r   Úrelative_toÚPath.relative_to®  s'   € Ü× Ò ¤ T£¬C°·²ÀÐ0FÓ,GÓHÐHr   c                 ól   • [         R                  " U R                  R                  U R                  5      $ r   )r   Újoinr—   r\   r˜   r*   s    r   Ú__str__ÚPath.__str__±  s!   € Ü�~Š~˜dŸi™i×0Ñ0°$·'±'Ó:Ð:r   c                 ó4   • U R                   R                  U S9$ )Nr*   )Ú_Path__reprÚformatr*   s    r   Ú__repr__ÚPath.__repr__´  s   € Ø�{‰{×!Ñ! tÐ!Ð,Ð,r   c                 ó˜   • [         R                  " U R                  /UQ76 nU R                  U R                  R                  U5      5      $ r   )r   r  r˜   rÓ   r—   rY   )r$   rœ   Únexts      r   rÃ   ÚPath.joinpath·  s7   € Ü�~Š~˜dŸg™gÐ.¨Ò.ˆØ�z‰z˜$Ÿ)™)×/Ñ/°Ó5Ó6Ð6r   c                 óè   • U R                   (       d  U R                  R                  $ [        R                  " U R                   R                  S5      5      nU(       a  US-  nU R                  U5      $ rÏ   )r˜   r\   Úparentr   rW   r   rÓ   )r$   Ú	parent_ats     r   r  ÚPath.parent½  sR   € à�w�wØ—=‘=×'Ñ'Ð'Ü×%Ò% d§g¡g§n¡n°SÓ&9Ó:ˆ	ÞØ˜ÑˆIØ�z‰z˜)Ó$Ð$r   )r˜   r—   )Ú )rd   )$r3   r4   r5   r6   r7   r  r#   r�   r¡   r«   r´   ÚpropertyrV   rº   r½   rÀ   r\   rÈ   rÌ   rÐ   rÓ   r§   rØ   r©   rß   râ   rë   rø   rû   r  r  r
  rÃ   Ú__truediv__r  r8   rr   r   r   r   r   Ì   s  † ñdðL N€Fôò>ò*ðC¨ö Cò(Lð ñ!ó ð!ð ñ#ó ð#ð ñ%ó ð%ð ñ!ó ð!ð ñBó ðBòò
òMò-ò4ò3ò0ò,òBò"òFò*òIò;ò-ò7ð €Kàñ%ó ó%r   r   )r7   ry   r�   r   r²   r   rï   rè   rŠ   r`   rø   r   Ú__all__r   r	   ÚdictÚfromkeysrG   r   r   rf   r<   rv   r“   r   rr   r   r   Ú<module>r     s�   ðñó Û 	Û Û Û Û 	Û Û 
Û å àˆ(€ò6ò&+ð6 �-‰-€Ø /òH÷*ñ *ô$HÐ# W§_¡_ô HôV�ô ô$A÷x%ò x%r   