grthtrhthjhtyjytjytkergtrhtrjytjerhrfh4:24 29/09/2026o ®û|jÅdã@sJ ddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlZddlZz ddlZejZWneyTdZejZYnwzddlZWn eyfdZYnwzddlZWn eyxdZYnwgd¢ZGdd„deƒZGdd„deƒZeZZdZdZdZdZd Zd Z d Z!d Z"d Z#dZ$dZ%dZ&dZ'dZ(e  )e'¡Z*dZ+dZ,dZ-dZ.dZ/dZ0dZ1dZ2d Z3dZ4dZ5dZ6e  )e5¡Z7dZ8dZ9dZ:dZ;dZdZ?d Z@dZAdZBdZCd ZDdZEd ZFdZGd ZHd!ZId"ZJd#ZKd$ZLe  )eK¡ZMdZNdZOdZPdZQdZRdZSdZTdZUd ZVdZWdZXdZYd%ZZd&Z[e  )eZ¡Z\d'Z]d(Z^e  )e]¡Z_dZ`dZadZbdZcdZddZedZfdZgd ZhdZid)Zje  kd*¡Zld+d,„Zmd-d.„Znd/d0„Zod1d2„Zpd3d4„ZqGd5d6„d6erƒZsdatd7d8„Zud9d:„ZvGd;d<„d<ƒZwGd=d>„d>ƒZxidd?“dd@“ddA“ddA“ddA“ddA“ddB“ddC“d dD“ddE“ddB“d dF“d dG“d"dH“dIdJ“dKdL“dMdN“ZydOdP„ZzdrdQdR„Z{dSdT„Z|GdUdV„dVƒZ}GdWdX„dXƒZ~GdYdZ„dZejƒZ€Gd[d\„d\ejƒZ�Gd]d^„d^ƒZ‚Gd_d`„d`e‚ƒZƒdadb„Z„dcdd„Z…e†j‡Zˆ dedf„Z‰Gdgdh„dhe‚ƒZŠGdidj„djeŠƒZ‹drdkdl„ZŒGdmdn„dnƒZ�drdodp„ZŽe�dqk�r#eŽƒdSdS)séN) Ú BadZipFileÚ BadZipfileÚerrorÚ ZIP_STOREDÚ ZIP_DEFLATEDÚ ZIP_BZIP2ÚZIP_LZMAÚ is_zipfileÚZipInfoÚZipFileÚ PyZipFileÚ LargeZipFileÚPathc@ó eZdZdS)rN©Ú__name__Ú __module__Ú __qualname__©rrú./opt/alt/python310/lib64/python3.10/zipfile.pyr,órc@r)r Nrrrrrr 0rr iÿÿÿéÿÿéé ééé-é.é?s<4s4H2LHsPKéééééééé z<4s4B4HL2L5H2LsPKé é é ééééz <4s2B4HL2L2HsPKz<4sLQLsPKz <4sQ2H2L4QsPKiPKúrrrr És    ü  ÿüþþr c Csš |t8}|dkr |S| |¡| t¡}t|ƒtkrtdƒ‚t t|¡\}}}}|tkr/|S|dks7|dkr;t dƒ‚|t 8}||krGt dƒ‚| |¡||}| t ¡}t|ƒt kr_tdƒ‚|  t ¡s~||kr~| |¡d}| t ¡}t|ƒt kr~tdƒ‚|  t ¡s‡t dƒ‚t t |¡\ }} } } } } }}}}|||ks¥| dt |kr©t dƒ‚||t<| |t<| |t<||t<||t<||t<||t<|||t<|S) NrzUnknown I/O errorrz3zipfiles that span multiple disks are not supportedz.Corrupt zip64 end of central directory locatorz/Zip64 end of central directory record not foundrz-Corrupt zip64 end of central directory record)ÚsizeEndCentDir64LocatorÚseekr@r2r<Ústructr1ÚstructEndArchive64LocatorÚstringEndArchive64LocatorrÚsizeEndCentDir64Ú startswithÚstringEndArchive64ÚstructEndArchive64Ú_ECD_SIGNATUREÚ_ECD_DISK_NUMBERÚ_ECD_DISK_STARTÚ_ECD_ENTRIES_THIS_DISKÚ_ECD_ENTRIES_TOTALÚ _ECD_SIZEÚ _ECD_OFFSETÚ _ECD_LOCATION)ÚfpinÚoffsetÚendrecÚdataZsigZdisknoZreloffZdisksZextraszZszÚcreate_versionZ read_versionZdisk_numZdisk_dirZdircountZ dircount2ZdirsizeZ diroffsetrrrÚ _EndRecData64ÙsX           þ  r\c Csb | dd¡| ¡}z | t d¡Wn tyYdSw| ¡}t|ƒtkrW|dd…tkrW|dd…dkrWt t |¡}t |ƒ}|  d¡|  |t¡t ||t|ƒSt |dtdƒ}| |d¡| ¡}| t¡}|dkr¯|||t…}t|ƒtkrƒdSt t t |¡ƒ}|t}||t|t|…}|  |¡|  ||¡t ||||ƒSdS)Nrr r"éþÿÿÿsr/i)rGÚtellÚsizeEndCentDirr<r@r2ÚstringEndArchiverHr1ÚstructEndArchiveÚlistr3r\ÚmaxÚrfindÚ_ECD_COMMENT_SIZE) rWZfilesizerZrYZmaxCommentStartr7ZrecDataZ commentSizeÚcommentrrrr;s@  ÿ       r;c@sZeZdZ dZddd„Zdd„Zdd d „Zd d „Zd d„Ze dddœdd„ƒZ dd„Z dS)r )Ú orig_filenamerDÚ date_timeÚ compress_typeÚ_compresslevelrfr5Ú create_systemr[Úextract_versionÚreservedÚ flag_bitsÚvolumeÚ internal_attrÚ external_attrÚ header_offsetÚCRCÚ compress_sizeÚ file_sizeÚ _raw_timeÚ _end_offsetÚNoName©é¼rrrrrcCsÚ||_| tdƒ¡}|dkr|d|…}tjdkr%tj|vr%| tjd¡}||_||_|ddkr5tdƒ‚t |_ d|_ d|_ d|_ tjdkrJd|_nd|_t|_t|_d|_d|_d|_d|_d|_d|_d|_d|_dS)Nrú/rzz+ZIP does not support timestamps before 1980r/Zwin32r!)rgÚfindÚchrÚosÚsepÚreplacerDrhÚ ValueErrorrrirjrfr5ÚsysÚplatformrkÚDEFAULT_VERSIONr[rlrmrnrorprqrtrurw)ÚselfrDrhZ null_byterrrÚ__init__ls6    zZipInfo.__init__cCsÜd|jj|jfg}|jtkr| dt |j|j¡¡|jd?}|jd@}|r2| dt   |¡¡|r;| d|¡|  ¡}|rD|j rL| d|j ¡|rQ|j rd|jtks\|j |j krd| d|j ¡| d ¡d  |¡S) Nz<%s filename=%rú compress_type=%sr+rz filemode=%rz external_attr=%#xz file_size=%rz compress_size=%rú>Ú)Ú __class__rrDrirr3Úcompressor_namesÚgetrqÚstatÚfilemodeÚis_dirrurtr4)r…rEÚhiÚloÚisdirrrrÚ__repr__˜s, ÿÿ        zZipInfo.__repr__NcCsz |j}|ddd>|dd>B|dB}|dd>|d d>B|ddB}|jd @r4d}}}n |j}|j}|j}|j}d} |durN|tkpM|tk}|rbd } |t | dt  | ¡d ||¡}|tksj|tkrv|spt d ƒ‚d }d }t } |j t kr�tt| ƒ} n |j tkr‹tt| ƒ} t| |jƒ|_t| |jƒ|_| ¡\} } t tt|j|j| |j |||||t| ƒt|ƒ¡ } | | |S)Nrrzr&rr#r r!r(r"rzz |j d¡|jfWSty|j d¡|jdBfYSw)NÚasciiúutf-8é)rDÚencodernÚUnicodeEncodeError©r…rrrr›Üs  ÿzZipInfo._encodeFilenameFlagscCs6|j}tj}t|ƒdkr™|d|dd…ƒ\}}|dt|ƒkr'td||fƒ‚|dkr‰|d|d…}zD|jdvrLd}|d|dd…ƒ\|_|dd…}|jd krdd }|d|dd…ƒ\|_|dd…}|jd krvd }|d|dd…ƒ\|_Wntjyˆtd |›d �ƒd‚w||dd…}t|ƒdks dSdS)Nr"r.z"Corrupt extra field %04x (size=%d)r)lÿÿÿÿr”z File sizez|}tj   tj   |¡d¡}|dtj tjfvrd|dd…}|dtj tjfvsT|rj|d7}|||ƒ}|jd @d >|_|r…d|_|jd O_|S|j|_|S) Nrr$rzryé;)r°rééé;r³rr{rr+)Ú isinstancer~ÚPathLikeÚfspathr�ÚS_ISDIRÚst_modeÚtimeÚ localtimeÚst_mtimeÚpathÚnormpathÚ splitdriverÚaltseprqruÚst_size) ÚclsrDÚarcnamer¯Ústr’ÚmtimerhÚzinforrrÚ from_fileÿs6       ÿ þzZipInfo.from_filecCs |jddkS)Néÿÿÿÿr{©rDr«rrrr�%szZipInfo.is_dir)rxry©N) rrrÚ __slots__r†r“r¥r›r­Ú classmethodrÆr�rrrrr Qs , . %r cCs0tdƒD]}|d@r|d?dA}q|dL}q|S)Nrrl q[)Úrange)Úcrcr9rrrÚ_gen_crc/s  rÎcsld‰d‰d‰tdurttttdƒƒƒat‰‡fdd„‰‡‡‡‡fdd„‰|D]}ˆ|ƒq&‡‡fd d „}|S) NixV4i‰gE#i�xV4écs |d?ˆ||Ad@AS)Nréÿr)ZchrÍ)ÚcrctablerrÚcrc32Isz_ZipDecrypter..crc32cs<ˆ|ˆƒ‰ˆˆd@d@‰ˆddd@‰ˆˆd?ˆƒ‰dS)NrÐr”i„rér)Úc)rÒÚkey0Úkey1Úkey2rrÚ update_keysMs z"_ZipDecrypter..update_keyscsP tƒ}|j}|D]}ˆdB}|||dAd?d@N}ˆ|ƒ||ƒq t|ƒS)Nr rrrÐ)Ú bytearrayr3Úbytes)rZrEr3rÔÚk)r×rØrrÚ decrypterWs z _ZipDecrypter..decrypter)Ú _crctablerbÚmaprÎrÌ)ÚpwdÚprÜr)rÒrÑrÕrÖr×rØrÚ _ZipDecrypter?s   rác@s,eZdZdd„Zdd„Zdd„Zdd„Zd S) ÚLZMACompressorcCs d|_dSrÉ)Ú_compr«rrrr†gs zLZMACompressor.__init__cCsFt dtji¡}tjtjt tj|¡gd�|_t dddt |ƒ¡|S)NÚid©ÚfilterszrX©r…r>rrrr† s z_Tellable.__init__cCs|j |¡}|j|7_|SrÉ)r>ÚwriterX)r…rZrrrrrs z_Tellable.writecCr rÉ)rXr«rrrr^rz_Tellable.tellcCó|j ¡dSrÉ)r>rír«rrrríóz_Tellable.flushcCrrÉ)r>r r«rrrr rz_Tellable.closeN)rrrr†rr^rír rrrrr s  rcs¨eZdZ dZdZdZ  d'dd„Zdd „Zd d „Zd(d d„Z d)dd„Z dd„Z d(dd„Z dd„Z dd„Zdd„Zdd„Z‡fdd„Zd d!„Zd*d#d$„Zd%d&„Z‡ZS)+Ú ZipExtFilei@iiNFcCs&||_||_||_|j|_|j|_|j|_t |jƒ|_ d|_ d|_ d|_ d|_||_|j|_t|dƒr=|j|_tdƒ|_nd|_d|_z| ¡r\| ¡|_|j|_|j|_|j|_d|_Wn tyfYnwd|_|r�|j d@ry|j!d?d@}n|jd?d@}| "¡}||kr‘t#d |j$ƒ‚dSdS) NFr/rrsTrrÐrÓzBad password for file %r)%Ú_fileobjÚ_pwdÚ_close_fileobjriÚ_compress_typertÚ_compress_leftruÚ_leftrÚ _decompressorÚ_eofÚ _readbufferÚ_offsetÚnewlinesÚmoderDÚnamerBrsÚ _expected_crcrÒÚ _running_crcÚ _seekablerr^Ú_orig_compress_startÚ_orig_compress_sizeÚ_orig_file_sizeÚ_orig_start_crcÚAttributeErrorÚ _decrypterrnrvÚ_init_decrypterrùrg)r…rr(ÚzipinforßZ close_fileobjZ check_byteÚhrrrr†+sN    € ÿ ÷zZipExtFile.__init__cCs4t|jƒ|_|j d¡}|jd8_| |¡dS)Nrr()rárr2rr@r!)r…r¤rrrr3^s  zZipExtFile._init_decryptercCsvd|jj|jjfg}|js,| d|j|jf¡|jtkr+| dt   |j|j¡¡n| d¡| d¡d  |¡S)Nú<%s.%sz name=%r mode=%rr‡ú [closed]rˆr‰) rŠrrÚclosedr3r)r(r rr‹rŒr4©r…rErrrr“isÿ ÿÿ€   zZipExtFile.__repr__rÇcCsN |dkr |j d|j¡d}|dkr |j|j|…}||_|Stj ||¡S)Nró r)r%r|r&ÚioÚBufferedIOBaseÚreadline)r…Úlimitr8Úlinerrrr=wszZipExtFile.readlinercCst |t|jƒ|jkr/| |¡}t|ƒ|jkr&||j|jd…|_d|_n |jt|ƒ8_|j|j|jd…S)Nri)r2r%r&r@)r…rÚchunkrrrÚpeek‡s zZipExtFile.peekcCs|jrtdƒ‚dS)NúI/O operation on closed file.T)r8r�r«rrrÚreadable”szZipExtFile.readablecCs$ |jrtdƒ‚|dus|dkr.|j|jd…}d|_d|_|js,|| |j¡7}|jr!|S||j}|t|jƒkrG|j|j|…}||_|S|t|jƒ}|j|jd…}d|_d|_|dkr�|js�| |¡}|t|ƒkr||_||_||d|…7} |S||7}|t|ƒ8}|dkr�|jrc|S)Nzread from closed file.rr/)r8r�r%r&r$Ú_read1ÚMAX_Nr2)r…rÚbufÚendrZrrrr@™s@ÿ   þ ø zZipExtFile.readcCsD|jdurdSt||jƒ|_|jr|j|jkr td|jƒ‚dSdS)NzBad CRC-32 for file %r)r*rÒr+r$rr))r…ÚnewdatarrrÚ _update_crc¼s ÿzZipExtFile._update_crccCs |dus |dkr.|j|jd…}d|_d|_|js,| |j¡}|r)||7} |S|jr|S||j}|t|jƒkrG|j|j|…}||_|S|t|jƒ}|j|jd…}d|_d|_|dkr‹|js‹| |¡}|t|ƒkr||_||_||d|…7} |S|rˆ||7} |S|jrc|S©Nrr/)r%r&r$rDrEr2)r…rrFrZrGrrrÚread1ÆsJ û   ýö zZipExtFile.read1cCs |js|dkr dS|jtkr$|jj}|t|ƒkr#|| |t|ƒ¡7}n| |¡}|jtkr5|jdk|_n<|jtkrat ||j ƒ}|j  ||¡}|jj pT|jdkoT|jj |_|jr`||j  ¡7}n|j  |¡}|jj po|jdk|_|d|j…}|jt|ƒ8_|jdkr‰d|_| |¡|S)Nrr/T)r$r rr#Zunconsumed_tailr2Ú_read2rr!rcÚ MIN_READ_SIZEròrñrír"rIrrrrrDës8  €     þ€   zZipExtFile._read1cCsd|jdkrdSt||jƒ}t||jƒ}|j |¡}|jt|ƒ8_|s&t‚|jdur0| |¡}|SrJ) r!rcrMÚminrr@r2ÚEOFErrorr2rrrrrLs      zZipExtFile._read2cs>z|jr|j ¡Wtƒ ¡dSWtƒ ¡dStƒ ¡wrÉ)rrr Úsuperr«©rŠrrr s  ýzZipExtFile.closecCs|jrtdƒ‚|jS©NrB)r8r�r,r«rrrr&szZipExtFile.seekablercCsJ|jrtdƒ‚|jst d¡‚| ¡}|dkr|}n|dkr#||}n|dkr-|j|}ntdƒ‚||jkr9|j}|dkr?d}||}||j}|dkrY|t|j ƒkrY||_d}n1|dkrŠ|j   |j ¡|j |_|j|_|j|_d|_ d|_t|jƒ|_d|_|}|jdurŠ| ¡|dkr¡t|j|ƒ}| |¡||8}|dksŽ| ¡S) Nzseek on closed file.ú!underlying stream is not seekablerrr zCwhence must be os.SEEK_SET (0), os.SEEK_CUR (1), or os.SEEK_END (2)r/F)r8r�r,r;ÚUnsupportedOperationr^r/r&r2r%rrGr-r0r+r.r!r"rr r#r$r2r3rNÚ MAX_SEEK_READr@)r…rXrZcurr_posZnew_posZ read_offsetZ buff_offsetZread_lenrrrrG+sN         ýzZipExtFile.seekcCs>|jrtdƒ‚|jst d¡‚|j|jt|jƒ|j }|S)Nztell on closed file.rS) r8r�r,r;rTr/r"r2r%r&)r…Zfileposrrrr^]s  zZipExtFile.tell)NFr©rr)rrrrErMrUr†r3r“r=rArCr@rIrKrDrLr rrGr^Ú __classcell__rrrQrrs, ÿ3   # %$  2rcs@eZdZdd„Zedd„ƒZdd„Zdd„Z‡fd d „Z‡Z S) Ú _ZipWriteFilecCs8||_||_||_t|j|jƒ|_d|_d|_d|_ dSr) Ú_zinfoÚ_zip64Ú_zipfilerrirjÚ _compressorÚ _file_sizeÚ_compress_sizeÚ_crc)r…ÚzfrÅržrrrr†gsÿ z_ZipWriteFile.__init__cCs|jjSrÉ)r[r>r«rrrrqsz_ZipWriteFile._fileobjcCsdS)NTrr«rrrÚwritableuóz_ZipWriteFile.writablecCs„|jrtdƒ‚t|ttfƒrt|ƒ}nt|ƒ}|j}|j|7_t ||j ƒ|_ |j r:|j   |¡}|j t|ƒ7_ |j |¡|SrR)r8r�r´rÚrÙr2Ú memoryviewÚnbytesr]rÒr_r\rìr^rr)r…rZrdrrrrxs   z_ZipWriteFile.writec sf|jrdSz¨tƒ ¡|jr(|j ¡}|jt|ƒ7_|j |¡|j|j _ n|j |j _ |j |j _ |j |j _|j jd@r_|jrBdnd}|j t |t|j j |j j |j j¡¡|j ¡|j_n7|jst|j tkrktdƒ‚|jtkrttdƒ‚|j ¡|j_|j |j j¡|j |j  |j¡¡|j |jj¡|jj |j ¡|j |jj|j j<Wd|j_ dSd|j_ w)Nrzd$d%„Zd?d&d'„Zd@d(d)„Zed*d+„ƒZd,d-„Zd.d/„Z  d@d0d1„Z d?d2d3„Zd4d5„Z d6d7„Z!d8d9„Z"d:d;„Z#dS)Ar NFÚrTr®c CsB |dvr tdƒ‚t|ƒ||_d|_d|_i|_g|_||_||_||_ d|_ d|_ ||_ t |tjƒr9t |¡}t |tƒrqd|_||_dddd dd d d œ}||} z t ||¡|_Wntyn||vrm||}YqR‚w n d|_||_t|ddƒ|_d|_t ¡|_d |_d|_z…|dkr˜| ¡WdS|dvrÝd |_z|j  ¡|_!Wnt"tfyÀt#|jƒ|_d|_!d|_YWdSwz |j $|j!¡WWdSt"tfyÜd|_YWdSw|dk�rz| ¡|j $|j!¡WWdSt%�y |j $dd¡d |_|j  ¡|_!YWdSwtdƒ‚|j} d|_| &| ¡‚)N)rjÚwÚxÚaz+ZipFile requires mode 'r', 'w', 'x', or 'a'Frr/rAúw+búx+búr+bÚwbZxb)rjrkrlrmrprnroTrr)rj)rkrlrmr z"Mode must be 'r', 'w', 'x', or 'a')'r�rýÚ _allowZip64Ú _didModifyÚdebugrhrgrürÿr(rßÚ_commentÚ_strict_timestampsr´r~rµr¶ÚstrÚ _filePassedrDr;rCr>r<ÚgetattrÚ _fileRefCntÚ threadingÚRLockrr,rÚ_RealGetContentsr^rfr1rrGrÚ_fpclose) r…r r(rüÚ allowZip64rÿr¯ZmodeDictrŽr>rrrr†Ös’   ÿ ü  ýÿ ù  zZipFile.__init__cCs|SrÉrr«rrrÚ __enter__0rbzZipFile.__enter__cCs | ¡dSrÉ©r )r…ÚtypeÚvalueÚ tracebackrrrÚ__exit__3ó zZipFile.__exit__cCs‚d|jj|jjfg}|jdur2|jr| d|j¡n |jdur)| d|j¡| d|j¡n| d¡| d¡d |¡S)Nr6z file=%rz filename=%rz mode=%rr7rˆr‰) rŠrrr>rxr3rDr(r4r9rrrr“6sÿ     zZipFile.__repr__c CsÚ |j}zt|ƒ}Wn tytdƒ‚w|stdƒ‚|jdkr%t|ƒ|t}|t}|t|_ |t ||}|jdkrJ||}td|||ƒ|||_ |j dkrXtdƒ‚|  |j d¡|  |¡}t |¡}d}||k�rT|  t¡} t| ƒtkrtdƒ‚t t| ¡} | ttkr�tdƒ‚|jdkr˜t| ƒ|  | t¡} | d } | d @r­|  d ¡} n|  d ¡} t| ƒ} |  | t¡| _|  | t¡| _| t| _| dd …\ | _ | _!| _"| _#| _$| _%} }| _&| _'| _(| j"t)krót*d| j"dƒ‚| dd…\| _+| _,| _-| | _.|d?d|d ?d@|d@| d?| d ?d@| d@df| _/|  0¡| j|| _|j1 2| ¡| |j3| j4<|t| t| t| t}|jdk�rPtd|ƒ||ksp|j }t5|j1dd„dd�D] }||_6|j}�qadS)NzFile is not a zip filerr zgiven, inferred, offsetrz Bad offset for central directoryzTruncated central directoryz&Bad magic number for central directoryr#r¨r§Úcp437rzzip file version %.1fr'r*r-r&rzr±r(rÚtotalcSr rÉ)rr)rÅrrrÚ’óz*ZipFile._RealGetContents..T)ÚkeyÚreverse)7r>r;r<rrtÚprintrTrUÚ _ECD_COMMENTrurVrfrGr@r;ÚBytesIOÚsizeCentralDirr2rHr1ÚstructCentralDirÚ _CD_SIGNATUREÚstringCentralDirÚ_CD_FILENAME_LENGTHÚdecoder Ú_CD_EXTRA_FIELD_LENGTHr5Ú_CD_COMMENT_LENGTHrfÚ_CD_LOCAL_HEADER_OFFSETrrr[rkrlrmrnrirsrtruÚMAX_EXTRACT_VERSIONrûrorprqrvrhr­rgr3rhrDÚsortedrw)r…r>rYZsize_cdZ offset_cdÚconcatZinferredrZrˆÚcentdirrDÚflagsrlÚtÚdÚ end_offsetrÅrrrr}Ds˜  ÿ                 þ   ÿÿ   ÿþ  Ó/ þ üzZipFile._RealGetContentscCs dd„|jDƒS)NcSsg|]}|j‘qSrrÈ)Ú.0rZrrrÚ ™sz$ZipFile.namelist..©rgr«rrrÚnamelist—szZipFile.namelistcCó |jSrÉr£r«rrrÚinfolist›szZipFile.infolistcCsN tdd|d�|jD]}d|jdd…}td|j||jf|d�q dS)Nz%-46s %19s %12s)z File Namez Modified ZSize)r z%d-%02d-%02d %02d:%02d:%02dr$z %-46s %s %12d)r�rgrhrDru)r…r rÅÚdaterrrÚprintdir sÿ ÿþzZipFile.printdirc Csz d}|jD]4}z$| |jd¡�}| |¡r | |¡sWdƒn1s&wYWqty:|jYSwdS)Nirj)rgrCrDr@r)r…Z chunk_sizerÅÚfrrrÚtestzip©s   ÿ€ÿ€ ÿùzZipFile.testzipcCs& |j |¡}|durtd|ƒ‚|S)Nz(There is no item named %r in the archive)rhrŒÚKeyError)r…r)ÚinforrrÚgetinfo¶s ÿzZipFile.getinfocCs: |rt|tƒstdt|ƒjƒ‚|r||_dSd|_dS)Núpwd: expected bytes, got %s)r´rÚÚ TypeErrorr‚rrß)r…rßrrrÚ setpassword¿s   zZipFile.setpasswordcCr¥rÉ)rur«rrrrfÈszZipFile.commentcCs^t|tƒstdt|ƒjƒ‚t|ƒtkr'ddl}|jdtdd�|dt…}||_ d|_ dS)Nzcomment: expected bytes, got %srz3Archive comment is too long; truncating to %d bytesr ©Ú stacklevelT) r´rÚr¯r‚rr2ÚZIP_MAX_COMMENTÚwarningsÚwarnrurs)r…rfr´rrrrfÍs  ÿÿ  cCs< | |d|¡� }| ¡WdƒS1swYdS©Nrj©rCr@)r…r)rßr>rrrr@Ús$ÿz ZipFile.read©Ú force_zip64c s, |dvr tdƒ‚|rt|tƒstdt|ƒjƒ‚|r#|dkr#tdƒ‚ˆjs*tdƒ‚t|tƒr2|}n|dkrCt|ƒ}ˆj|_ ˆj |_ nˆ  |¡}|dkrSˆj ||d�SˆjrZtdƒ‚ˆjd 7_tˆj|jˆjˆj‡fd d „ƒ}zœ| t¡}t|ƒtkr�td ƒ‚t t|¡}|ttkr‘td ƒ‚| |t¡}|tr£| |t¡|jd@r¬t dƒ‚|jd@rµt dƒ‚|t!d@rÁ| "d¡} n| "d¡} | |j#krÔtd|j#|fƒ‚|j$durì| %¡|j&|j$krìtd|j#›d�ƒ‚|jd @} | �r|sùˆj'}|�st(d|ƒ‚nd}t)||||dƒWS| *¡‚)N>rjrkzopen() requires mode "r" or "w"r®rkz'pwd is only supported for reading filesz2Attempt to use ZIP archive that was already closedr¸rrcsˆjSrÉ)rrr«rrr‰rŠzZipFile.open..zTruncated file headerz Bad magic number for file headeré z$compressed patched data (flag bit 5)é@zstrong encryption (flag bit 6)r¨r§r‡z/File name in directory %r and header %r differ.zOverlapped entries: z (possible zip bomb)z6File %r is encrypted, password required for extractionT)+r�r´rÚr¯r‚rr>r rürirÿrjr­Ú_open_to_writerrzrrrr~rr@ÚsizeFileHeaderr2rrHr1rœÚ _FH_SIGNATUREr�Ú_FH_FILENAME_LENGTHÚ_FH_EXTRA_FIELD_LENGTHrnrûÚ_FH_GENERAL_PURPOSE_FLAG_BITSr•rgrwr^rtrßrùrr ) r…r)r(rßr¹rÅZzef_fileZfheaderÚfnameZ fname_strZ is_encryptedrr«rrCßs„ ÿ    ÿ          ÿÿ  ÿÿz ZipFile.opencCsÖ|r |js tdƒ‚|jrtdƒ‚d|_d|_d|_|jtkr%|jdO_|js/|jdO_|j s5d|_ |jo@|p@|j dt k}|jrK|j   |j¡|j  ¡|_| |¡d|_|j  | |¡¡d|_t|||ƒS) NzHforce_zip64 is True, but allowZip64 was False when opening the ZIP file.zzCan't write to the ZIP file while there is another write handle open on it. Close the first handle before opening another.rr ré€gÍÌÌÌÌÌð?T)rrr�rrtrsrnrirr,rqrur•r>rGrfr^rrÚ _writecheckrsrr¥rX)r…rÅr¹ržrrrr¼Es4 ÿ ÿ   zZipFile._open_to_writecCs, |dur t ¡}nt |¡}| |||¡SrÉ)r~Úgetcwdr¶Ú_extract_member)r…Úmemberr¼rßrrrÚextractns   zZipFile.extractcCsJ |dur | ¡}|durt ¡}nt |¡}|D] }| |||¡qdSrÉ)r¤r~rÅr¶rÆ)r…r¼Úmembersrßr4rrrÚ extractall{s  ÿzZipFile.extractallcCs` |j}|sd}t |dt|ƒ¡}||_| |¡}dd„| |¡Dƒ}| dd„|Dƒ¡}|S)Nz:<>|"?*Ú_css�|]}| d¡VqdS)Ú.N)Úrstrip©r¡rlrrrÚ –ó€z1ZipFile._sanitize_windows_name..css�|]}|r|VqdSrÉrrÎrrrrϘs€)Ú!_windows_illegal_name_trans_tablerwÚ maketransr2Ú translateÚsplitr4)rÁrÂÚpathsepÚtableZillegalrrrÚ_sanitize_windows_nameŒs zZipFile._sanitize_windows_namec sò t|tƒs | |¡}|j}tjjdkr| dtjj¡}tjjr0tjjdkr0| tjjtjj¡}tj  |¡\}}|j rF|sD|  tjj¡rFdS|j rVtjj |  tjj¡vrVdSdtjjtjj f‰tjj ‡fdd„|  tjj¡Dƒ¡}tjjdkr‹| |tjj¡}|j r‰||kr‰dS|}tj ||¡}tj |¡}tj |¡}|r«tj |¡s«t |¡| ¡r¼tj |¡sºt |¡|S|j||d��,}t|dƒ�} t || ¡Wdƒn1sÚwYWdƒ|SWdƒ|S1sòwY|S)Nr{r‰c3s�|] }|ˆvr|VqdSrÉrrΩZinvalid_path_partsrrrϱs €ÿÿz*ZipFile._extract_member..ú\©rßrq)r´r r­rDr~r¼rr€r¿r¾Ú_ignore_invalid_namesrLÚpardirrÔÚcurdirr4r×r½ÚdirnameÚexistsÚmakedirsr�r’ÚmkdirrCÚshutilÚ copyfileobj) r…rÇZ targetpathrßrÂZdriveZarcname2Z upperdirsÚsourceÚtargetrrØrrÆ›sP   &      ÿ(þ üüzZipFile._extract_membercCs¨ |j|jvrddl}|jd|jdd�|jdvrtdƒ‚|js%tdƒ‚t|jƒ|j sPd}t |j ƒt kr9d}n|j tkrAd }n|jtkrHd }|rRt|d ƒ‚dSdS) NrzDuplicate name: %rr!r±©rkrlrmz&write() requires mode 'w', 'x', or 'a'z4Attempt to write ZIP archive that was already closedú Files countZFilesizez Zipfile sizeú would require ZIP64 extensions)rDrhr´rµr(r�r>rýrirrr2rgÚZIP_FILECOUNT_LIMITrur•rrr )r…rÅr´Úrequires_zip64rrrrÄÍs2  ÿ   ÿ÷zZipFile._writecheckc Cs¢ |jstdƒ‚|jrtdƒ‚tj|||jd�}| ¡r#d|_d|_n|dur+||_ n|j |_ |dur7||_ n|j |_ | ¡r”|j �H|jrM|j |j¡|j ¡|_|j tkr_|jdO_| |¡d|_|j |¡||j|j<|j | d¡¡|j ¡|_WdƒdS1s�wYdSt|dƒ�.}| |d ¡�}t ||d ¡Wdƒn1s²wYWdƒdSWdƒdS1sÊwYdS) Nú7Attempt to write to ZIP archive that was already closedz>Can't write to ZIP archive while an open writing handle existsr®rr TFrArki ) r>r�rr rÆrvr�rtrsrirürjrÿrr,rGrfr^rrrrnrÄrsrgr3rhrDrr¥rCrârã)r…rDrÂrirÿrÅÚsrcÚdestrrrräsLÿÿÿ     "òPÿz ZipFile.writec Cs4 t|tƒr | d¡}t|tƒs=t|t t ¡¡dd…d�}|j|_|j|_ |j ddkr9d|_ |j dO_ nd|_ n|}|j sFt d ƒ‚|jrMt d ƒ‚|durT||_|dur[||_ t|ƒ|_|j�-|j|d d �� }| |¡Wdƒn1s{wYWdƒdSWdƒdS1s“wYdS) Nr§r$)rDrhrÇr{iýAr+rÃrëz?Can't write to ZIP archive while an open writing handle exists.rk)r()r´rwr©r r¹rºrürirÿrjrDrqr>r�rr2rurrCr)r…Zzinfo_or_arcnamerZrirÿrÅrírrrÚwritestrsD   ÿÿÿ  ÿÿ"ÿzZipFile.writestrcCs | ¡dSrÉr�r«rrrÚ__del__>s zZipFile.__del__c Csú |jdurdS|jrtdƒ‚za|jdvrG|jrU|j�|jr&|j |j¡|  ¡Wdƒn21s4wYW|j}d|_|  |¡dSW|j}d|_|  |¡dSW|j}d|_|  |¡dSW|j}d|_|  |¡dS|j}d|_|  |¡w)NzvCan't close the ZIP file while there is an open writing handle on it. Close the writing handle before closing the zip.ræ) r>rr�r(rsrr,rGrfÚ_write_end_recordr~rrrrr Bs<  ýøøùþ z ZipFile.closecCs|jD]ç}|j}|ddd>|dd>B|dB}|dd>|d d>B|ddB}g}|jtks8|jtkrI| |j¡| |j¡d }d }n|j}|j}|jtkr]| |j¡d }n|j}|j} d} |r…t| d ƒ} t j d d t |ƒddt |ƒg|¢RŽ| } t } |j tkr�tt| ƒ} n |j tkrštt| ƒ} t| |jƒ} t| |jƒ} | ¡\} }t   tt| |j| |j||j |||j||t | ƒt | ƒt |jƒd|j|j|¡}|j |¡|j | ¡|j | ¡|j |j¡q|j  ¡}t |jƒ}||j!}|j!}d}|t"k�rd}n|tk�rd}n|tk�rd}|�rX|j#�s#t$|dƒ‚t   t%t&t'ddddd||||¡ }|j |¡t   t(t)d|d¡}|j |¡t*|dƒ}t*|d ƒ}t*|d ƒ}t   t+t,dd||||t |j-ƒ¡ }|j |¡|j |j-¡|j.dk�r€|j /¡|j 0¡dS)Nrrzr&rr#r r!r(r"r”rVr.ÚQrrçzCentral directory offsetzCentral directory sizerèrrrrm)1rgrhrur•rtr3rrr5r:rHr–r2r˜rirrcr™rršrlr[r›r‘r“rkrmrsrfrprqr>rr^rfrérrr rNrMrKrIrJrNrar`rur(Útruncaterí)r…rÅrŸr r¡r5rurtrrZ extra_datar¢rlr[rDrnrœZpos2Z centDirCountZ centDirSizeZ centDirOffsetrêZ zip64endrecZ zip64locrecrYrrrrðXs² $$        þþþ          ù         ÿý þ     þ   zZipFile._write_end_recordcCs.|jd8_|js|js| ¡dSdSdS©Nr)rzrxr rrrrr~¶s  ÿzZipFile._fpcloserÉ)rjN)F)NN)NNN)$rrrr>rÑrÛrr†r€r…r“r}r¤r¦r¨rªr­r°rirfÚsetterr@rCr¼rÈrÊrËr×rÆrÄrrîrïr rðr~rrrrr »sTÿ ÿZS        f )  2 ÿ2 ÿ) ^r c@s2eZdZ deddfdd„Zd dd „Zd d „ZdS) r rjTrÇcCstj|||||d�||_dS)N)r(rür)r r†Ú _optimize)r…r r(rürÚoptimizerrrr†Às ÿ zPyZipFile.__init__r‰NcCs° t |¡}|r#||ƒs#|jr!tj |¡rdnd}td||fƒdStj |¡\}}tj |¡�r.tj |d¡}tj |¡rØ|rHd||f}n|}|jrTtd|d|ƒ|  |dd …|¡\}} |jrhtd | ƒ|  || ¡t t  |¡ƒ} |   d¡| D]Y} tj || ¡} tj | ¡\} }tj | ¡r§tj tj | d¡¡r¦|j| ||d �q||d krÕ|r»|| ƒs»|jrºtd | ƒq||  | dd …|¡\}} |jrÏtd | ƒ|  || ¡q|dS|jràtd|ƒt t  |¡ƒD]D} tj || ¡} tj | ¡\} }|d k�r+|�r|| ƒ�s|j�rtd | ƒqç|  | dd …|¡\}} |j�r%td | ƒ|  || ¡qçdS|d d…d k�r;tdƒ‚|  |dd …|¡\}} |j�rPtd| ƒ|  || ¡dS)Nr¼r z%s %r skipped by filterfuncz __init__.pyú%s/%szAdding package inÚasréýÿÿÿZAdding)Ú filterfuncú.pyzfile %r skipped by filterfunczAdding files from directoryz.Files added with writepy() must end with ".py"z Adding file)r~r¶rtr¼r’r�rÔr4ÚisfileÚ _get_codenamerršÚlistdirÚremoveÚsplitextÚwritepyrù)r…ÚpathnameÚbasenamerúZlabelÚdirr)ZinitnamerÂrÂZdirlistrDr¼ÚrootZextrrrrÆsŒ      ÿ€  ÿ  €ï   ÿ  €ôÿ zPyZipFile.writepyc s d‡fdd„ }|d}|d}tjj|dd�}tjj|dd�}tjj|d d�}ˆjdkr©tj |¡rDt |¡jt |¡jkrD|} } n¨tj |¡r[t |¡jt |¡jkr[|} |} n‘tj |¡rrt |¡jt |¡jkrr|} |} nztj |¡r‰t |¡jt |¡jkr‰|} |} nc||ƒr¤t j j d kr–|} n t j j dkrŸ|} n|} |} nH|} } nCˆjd kr³|} |} n|} ˆjdkr½|} nˆjd krÅ|} n d   ˆj¡} t | ƒ‚tj | ¡rát | ¡jt |¡jksì||ˆjd �sì|} } tj | ¡d} |rüd || f} | | fS)NrÇc sbddl}ˆjr td|ƒz |j|d|d�WdS|jy0}z t|jƒWYd}~dSd}~ww)NrZ CompilingT)ÚdoraiseröF)Ú py_compilertr�ÚcompileÚPyCompileErrorÚmsg)r rörÚerrr«rrÚ_compiles ý €þz)PyZipFile._get_codename.._compilerûz.pycr‰)Ú optimizationrr rz"invalid value for 'optimize': {!r})rör÷r)Ú importlibÚutilÚcache_from_sourcerõr~r¼rür�r»r‚r�röÚformatr�rÔ) r…rrr Zfile_pyZfile_pycZ pycache_opt0Z pycache_opt1Z pycache_opt2rÂrÂr Z archivenamerr«rrýsb                zPyZipFile._get_codename)r‰N)rrrrr†rrýrrrrr ½s ÿ  Rr cCs t t|ƒdd¡Sró)Ú itertoolsÚisliceÚ _ancestry)r¼rrrÚ_parentsksrccsD� | tj¡}| tj¡r |Vt |¡\}}| tj¡sdSdSrÉ)rÍÚ posixpathrrÔ)r¼Útailrrrr~s€  þrcCs t t|ƒj|¡SrÉ)rÚ filterfalseÚsetÚ __contains__)ZminuendZ subtrahendrrrÚ _difference�srcsReZdZ edd„ƒZ‡fdd„Zdd„Zdd„Z‡fd d „Ze d d „ƒZ ‡Z S) Ú CompleteDirscCs.tj tt|ƒ¡}dd„|Dƒ}tt||ƒƒS)Ncss�|]}|tjVqdSrÉ)rr)r¡ràrrrrÏ®rÐz-CompleteDirs._implied_dirs..)rÚchainÚ from_iterablerÞrÚ_deduper)ÚnamesÚparentsZas_dirsrrrÚ _implied_dirs«szCompleteDirs._implied_dirscs tt|ƒ ¡}|t| |¡ƒSrÉ)rPrr¤rbr")r…r rQrrr¤±szCompleteDirs.namelistcCs t| ¡ƒSrÉ)rr¤r«rrrÚ _name_setµr†zCompleteDirs._name_setcCs. | ¡}|d}||vo||v}|r|S|S©Nr{)r#)r…r)r rÞZ dir_matchrrrÚ resolve_dir¸s  zCompleteDirs.resolve_dircsF ztƒ |¡WSty"| d¡r|| ¡vr‚t|d�YSw)Nr{rÈ)rPr­r«Úendswithr#r )r…r)rQrrr­Âs ýzCompleteDirs.getinfocCs: t|tƒr|St|tƒs||ƒSd|jvrt}||_|Sr¶)r´rr r(rŠ)rÁrärrrÚmakeÍs   zCompleteDirs.make) rrrÚ staticmethodr"r¤r#r%r­rËr'rWrrrQrr¥s    rcs*eZdZ ‡fdd„Z‡fdd„Z‡ZS)Ú FastLookupcóFt t¡� |jWdƒS1swYtt|ƒ ¡|_|jSrÉ)Ú contextlibÚsuppressr1Z_FastLookup__namesrPr)r¤r«rQrrr¤çó  ÿzFastLookup.namelistcr*rÉ)r+r,r1Z_FastLookup__lookuprPr)r#r«rQrrr#ír-zFastLookup._name_set)rrrr¤r#rWrrrQrr)ás r)cOst |d¡||fS)Nr!)r;Ú text_encoding)ÚencodingÚargsÚkwargsrrrÚ_extract_text_encodingôsr2c@s¬eZdZ dZd&dd„Zd'ddœdd „Zed d „ƒZed d „ƒZdd„Z dd„Z dd„Z dd„Z dd„Z dd„Zdd„Zdd„Zdd„Zd d!„Zd"d#„ZeZed$d%„ƒZdS)(rz>{self.__class__.__name__}({self.root.filename!r}, {self.at!r})r‰cCs t |¡|_||_dSrÉ)r)r'rÚat)r…rr3rrrr†I s z Path.__init__rjNrÚcOs� | ¡r t|ƒ‚|d}| ¡s|dkrt|ƒ‚|jj|j||d�}d|vr1|s+|r/tdƒ‚|St|i|¤Ž\}}}t j ||g|¢Ri|¤ŽS)NrrjrÚÚbz*encoding args invalid for binary operation) r�ÚIsADirectoryErrorrßÚFileNotFoundErrorrrCr3r�r2r;Ú TextIOWrapper)r…r(rßr0r1Zzip_modeÚstreamr/rrrrCV sz Path.opencCst |j¡jp |jjSrÉ)ÚpathlibZ PurePosixPathr3r)rDr«rrrr)j óz Path.namecCst |jj¡ |j¡SrÉ)r9rrrDÚjoinpathr3r«rrrrDn r:z Path.filenamecOsZt|i|¤Ž\}}}|jd|g|¢Ri|¤Ž� }| ¡WdƒS1s&wYdSr¶)r2rCr@)r…r0r1r/ÚstrmrrrÚ read_textr s$ÿzPath.read_textcCs6| d¡� }| ¡WdƒS1swYdS)NrAr·)r…r<rrrÚ read_bytesw s $ÿzPath.read_bytescCst |j d¡¡|j d¡kSr$)rrÞr3rÍ)r…r¼rrrÚ _is_child{ szPath._is_childcCs| |j|¡SrÉ)rŠr)r…r3rrrÚ_next~ rz Path._nextcCs|j p |j d¡Sr$)r3r&r«rrrr�� sz Path.is_dircCs| ¡o| ¡ SrÉ)rßr�r«rrrÚis_file„ óz Path.is_filecCs|j|j ¡vSrÉ)r3rr#r«rrrr߇ sz Path.existscCs.| ¡stdƒ‚t|j|j ¡ƒ}t|j|ƒS)NzCan't listdir a file)r�r�rÞr@rr¤Úfilterr?)r…ZsubsrrrÚiterdirŠ s z Path.iterdircCst |jj|j¡SrÉ)rr4rrDr3r«rrrÚ__str__� rBz Path.__str__cCs|jj|d�S)Nr«)Ú _Path__reprrr«rrrr““ rz Path.__repr__cGs&tj|jg|¢RŽ}| |j |¡¡SrÉ)rr4r3r@rr%)r…ÚotherÚnextrrrr;– sz Path.joinpathcCs6|js|jjSt |j d¡¡}|r|d7}| |¡Sr$)r3rDÚparentrrÞrÍr@)r…Z parent_atrrrrIœ s  z Path.parent)r‰)rj)rrrrFr†rCrir)rDr=r>r?r@r�rArßrDrEr“r;Ú __truediv__rIrrrrrùs.M    rc s ddl}d}|j|d�}|jdd�}|jdddd d �|jd d d ddd�|jdddddd�|jddddd �| |¡}|jdurm|j}t|dƒ� }| ¡}Wdƒn1sYwY|rgtd  |¡ƒtdƒdS|j dur‘|j }t|dƒ� }|  ¡WdƒdS1sŠwYdS|j dur¸|j \}}t|dƒ�}|  |¡WdƒdS1s±wYdS|jdu�r|j d¡} |j} ‡fdd„‰t| dƒ�1}| D]%} tj | ¡} | sétj tj | ¡¡} | dtjtjfvrôd} ˆ|| | ƒqÕWdƒdS1�swYdSdS) Nrz3A simple command-line interface for zipfile module.)Ú descriptionT)Zrequiredz-lz--listú zShow listing of a zipfile)ÚmetavarÚhelpz-ez --extractr )rLz zExtract zipfile into target dir)ÚnargsrMrNz-cz--createú+)zzzCreate zipfile from sourcesz-tz--testzTest if a zipfile is validrjz.The following enclosed file is corrupted: {!r}z Done testingcsvtj |¡r| ||t¡dStj |¡r7|r| ||¡tt |¡ƒD]}ˆ|tj ||¡tj ||¡ƒq$dSdSrÉ) r~r¼rürrr’ršrþr4)r`r¼ÚzippathZnm©ÚaddToZiprrrSÎ s   ÿüzmain..addToZiprkr‰)ÚargparseÚArgumentParserZadd_mutually_exclusive_groupÚ add_argumentÚ parse_argsÚtestr rªr�rrbr¨rÈrÊZcreateÚpopr~r¼rrÞrÝrÜ) r0rTrKÚparserÚgrouprìr`ZbadfilerÝZzip_nameÚfilesr¼rQrrRrÚmain¦ sh   ÿ þ þ ÿ    ÿ    "ÿ    "ÿ     ú$ÿñr]Ú__main__rÉ)�ZbinasciiÚimportlib.utilrr;rr~rÚrerâr�rHr‚r{r¹r+r9rørÒÚ ImportErrorrúrçÚ__all__Ú Exceptionrr rrr•rér³rrrrr„r˜r™ršr™rar`r—r_rOrPrQrRrSrTrUrerŽrVr‘r“r�r’Z_CD_CREATE_VERSIONZ_CD_CREATE_SYSTEMZ_CD_EXTRACT_VERSIONZ_CD_EXTRACT_SYSTEMZ _CD_FLAG_BITSZ_CD_COMPRESS_TYPEZ_CD_TIMEZ_CD_DATEZ_CD_CRCZ_CD_COMPRESSED_SIZEZ_CD_UNCOMPRESSED_SIZEr”r–r—Z_CD_DISK_NUMBER_STARTZ_CD_INTERNAL_FILE_ATTRIBUTESZ_CD_EXTERNAL_FILE_ATTRIBUTESr˜rœr�r½r¾Z_FH_EXTRACT_VERSIONZ_FH_EXTRACT_SYSTEMrÁZ_FH_COMPRESSION_METHODZ_FH_LAST_MOD_TIMEZ_FH_LAST_MOD_DATEZ_FH_CRCZ_FH_COMPRESSED_SIZEZ_FH_UNCOMPRESSED_SIZEr¿rÀrIrJrFrNrMrKZ_CD64_SIGNATUREZ_CD64_DIRECTORY_RECSIZEZ_CD64_CREATE_VERSIONZ_CD64_EXTRACT_VERSIONZ_CD64_DISK_NUMBERZ_CD64_DISK_NUMBER_STARTZ_CD64_NUMBER_ENTRIES_THIS_DISKZ_CD64_NUMBER_ENTRIES_TOTALZ_CD64_DIRECTORY_SIZEZ_CD64_OFFSET_START_CENTDIRreZStructr0r:r?r r\r;Úobjectr rÝrÎrárârîr‹rýrrrrr<rrXr r rrÚdictÚfromkeysrrrr)r2rr]rrrrrÚsˆ   þ  ÿ  ÿ       <<^&ÿþýüûúùø ÷ ö õ ô óòñðï (KU/<  . = ÿ