ó
    Ö›‘h//  ã                   óÞ   • S r SSKrSSKrSSKrSSKJr  SSKJrJr  SSK	J
r
   " S S5      r " S S	\\
R                  5      r " S
 S\\
R                  5      r " S S\
R                  5      rg)z'
Tests for L{twisted.python.zipstream}
é    N)Úmd5)ÚfilepathÚ	zipstream)Úunittestc                   óT   • \ 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g)ÚFileEntryMixiné   z7
File entry classes should behave as file-like objects
c                 ó  • U R                  5       n[        R                  " USU R                  5       nUR	                  SU5        SSS5        [
        R                  " US5      nUR                  S5      $ ! , (       d  f       N6= f)z&
Return an appropriate zip file entry
ÚwÚcontentNÚr)ÚmktempÚzipfileÚZipFileÚcompressionÚwritestrr   ÚChunkingZipFileÚreadfile)ÚselfÚcontentsÚfilenameÚzs       ÚfC:\Users\psant\Downloads\Noiseback\school\venv\Lib\site-packages\twisted/python/test/test_zipstream.pyÚgetFileEntryÚFileEntryMixin.getFileEntry   sd   € ð —;‘;“=ˆÜ�_Š_˜X s¨D×,<Ñ,<Ô=ÀØ�J‰J�y (Ô+÷ >ä×%Ò% h°Ó4ˆØ�z‰z˜)Ó$Ð$÷ >Õ=ús   ³A6Á6
Bc                 ó˜   • U R                  S5       nU R                  UR                  5       5        SSS5        g! , (       d  f       g= f)z;
zip files should not be ttys, so isatty() should be false
Ú N)r   ÚassertFalseÚisatty©r   Ú	fileEntrys     r   Útest_isattyÚFileEntryMixin.test_isatty    s7   € ð ×Ñ˜rÔ" iØ×Ñ˜Y×-Ñ-Ó/Ô0÷ #×"Ö"ús	   ’ ;»
A	c                 óÆ   • U R                  S5       nU R                  UR                  5        SSS5        U R                  WR                  5        g! , (       d  f       N*= f)zL
The C{closed} attribute should reflect whether C{close()} has been
called.
r   N)r   r   ÚclosedÚ
assertTruer    s     r   Útest_closedÚFileEntryMixin.test_closed'   sH   € ð
 ×Ñ˜rÔ" iØ×Ñ˜Y×-Ñ-Ô.÷ #à�‰˜	×(Ñ(Õ)÷ #Õ"ús   ’AÁ
A c                 ó  • U R                  S5       nU R                  UR                  5       S5        U R                  UR                  5       S5        U R                  UR                  5       S5        SSS5        g! , (       d  f       g= f)zS
C{readline()} should mirror L{file.readline} and return up to a single
delimiter.
s   hoho
hos   hoho
ó   hoó    N)r   ÚassertEqualÚreadliner    s     r   Útest_readlineÚFileEntryMixin.test_readline0   sk   € ð
 ×Ñ˜{Ô+¨yØ×Ñ˜Y×/Ñ/Ó1°9Ô=Ø×Ñ˜Y×/Ñ/Ó1°5Ô9Ø×Ñ˜Y×/Ñ/Ó1°3Ô7÷ ,×+Ö+úó   ’A!A<Á<
B
c                 ó  • U R                  S5       nU R                  UR                  5       S5        U R                  UR                  5       S5        U R                  [        UR                  5        SSS5        g! , (       d  f       g= f)zF
Zip file entries should implement the iterator protocol as files do.
s   ho
hohoó   ho
s   hohoN)r   r,   ÚnextÚassertRaisesÚStopIterationr    s     r   Ú	test_nextÚFileEntryMixin.test_next:   sb   € ð ×Ñ˜{Ô+¨yØ×Ñ˜YŸ^™^Ó-¨wÔ7Ø×Ñ˜YŸ^™^Ó-¨wÔ7Ø×Ñœm¨Y¯^©^Ô<÷ ,×+Ö+úr0   c                 óž   • U R                  S5       nU R                  UR                  5       / SQ5        SSS5        g! , (       d  f       g= f)z7
C{readlines()} should return a list of all the lines.
s   ho
ho
ho)r2   r2   r*   N)r   r,   Ú	readlinesr    s     r   Útest_readlinesÚFileEntryMixin.test_readlinesC   s:   € ð ×Ñ˜}Ô-°Ø×Ñ˜Y×0Ñ0Ó2Ò4MÔN÷ .×-Ö-ús	   ’#>¾
Ac                 óÐ   • U R                  S5       nU R                  [        U5      U5        U R                  UR                  5       U5        SSS5        g! , (       d  f       g= f)z:
C{__iter__()} and C{xreadlines()} should return C{self}.
r   N)r   ÚassertIsÚiterÚ
xreadlinesr    s     r   Útest_iterationÚFileEntryMixin.test_iterationJ   sI   € ð ×Ñ˜rÔ" iØ�M‰Mœ$˜y›/¨9Ô5Ø�M‰M˜)×.Ñ.Ó0°)Ô<÷ #×"Ö"ús   ’<AÁ
A%c                 óž   • SnU R                  U5       nU R                  UR                  5       U5        SSS5        g! , (       d  f       g= f)z)
C{.read()} should read the entire file.
s   Hello, world!N)r   r,   Úread©r   r   Úentrys      r   Útest_readWholeÚFileEntryMixin.test_readWholeR   s;   € ð $ˆØ×Ñ˜xÔ(¨EØ×Ñ˜UŸZ™Z›\¨8Ô4÷ )×(Ö(ús	   ”!>¾
Ac                 óê   • SnU R                  U5       nUR                  S5      nUR                  S5      nSSS5        U R                  WS5        U R                  WS5        g! , (       d  f       N3= f)z4
C{.read(num)} should read num bytes from the file.
Ú
0123456789é   éÈ   Ns   0123s   456789)r   rC   r,   )r   r   rE   ÚoneÚtwos        r   Útest_readPartialÚFileEntryMixin.test_readPartialZ   sc   € ð  ˆØ×Ñ˜xÔ(¨EØ—*‘*˜Q“-ˆCØ—*‘*˜S“/ˆC÷ )ð 	×Ñ˜˜gÔ&Ø×Ñ˜˜iÕ(÷	 )Õ(ús   ”#A$Á$
A2c                 ó"  • SnU R                  U5       nUR                  S5        U R                  UR                  5       S5        UR                  S5        U R                  UR                  5       S5        SSS5        g! , (       d  f       g= f)zJ
C{.tell()} should return the number of bytes that have been read so
far.
Údxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxé   rJ   é   N)r   rC   r,   ÚtellrD   s      r   Ú	test_tellÚFileEntryMixin.test_telle   sg   € ð
 ˆØ×Ñ˜xÔ(¨EØ�J‰J�qŒMØ×Ñ˜UŸZ™Z›\¨1Ô-Ø�J‰J�qŒMØ×Ñ˜UŸZ™Z›\¨1Ô-÷	 )×(Ö(ús   ”A#B Â 
B© N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   r"   r'   r.   r6   r:   r@   rF   rN   rU   Ú__static_attributes__rW   r+   r   r   r      s:   † ñò%ò1ò*ò8ò=òOò=ò5ò	)õ
.r+   r   c                   ó0   • \ rS rSrSr\R                  rSrg)ÚDeflatedZipFileEntryTestsér   z*
DeflatedZipFileEntry should be file-like
rW   N)	rX   rY   rZ   r[   r\   r   ÚZIP_DEFLATEDr   r]   rW   r+   r   r_   r_   r   s   † ñð ×&Ñ&ƒKr+   r_   c                   ó0   • \ rS rSrSr\R                  rSrg)ÚZipFileEntryTestséz   z"
ZipFileEntry should be file-like
rW   N)	rX   rY   rZ   r[   r\   r   Ú
ZIP_STOREDr   r]   rW   r+   r   rc   rc   z   s   † ñð ×$Ñ$ƒKr+   rc   c                   óp   • \ rS rSrSrS rSS j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g)ÚZipstreamTestsé‚   z$
Tests for twisted.python.zipstream
c                 óþ   • [         R                  " U R                  5       5      U l        U R                  R	                  5         U R                  R                  S5      U l        U R                  R	                  5         g)zb
Creates junk data that can be compressed and a test directory for any
files that will be created
ÚunzippedN)r   ÚFilePathr   ÚtestdirÚmakedirsÚchildÚunzipdir©r   s    r   ÚsetUpÚZipstreamTests.setUp‡   sR   € ô
  ×(Ò(¨¯©«Ó7ˆŒØ�‰×ÑÔØŸ™×*Ñ*¨:Ó6ˆŒØ�‰×ÑÕ r+   c                 ó2  • U R                   R                  S5      R                  n[        R                  " US5       n[        U5       H0  u  pV[        U5      nU(       a  US-   U-   nUR                  Xv5        M2     SSS5        U$ ! , (       d  f       U$ = f)zŒ
Makes a zip file archive containing len(contents) files.  Contents
should be a list of strings, each string being the content of one file.
zzipfile.zipr   Ú/N)rl   rn   Úpathr   r   Ú	enumerateÚstrr   )r   r   Ú	directoryÚ
zpfilenameÚzpfileÚir   r   s           r   ÚmakeZipFileÚZipstreamTests.makeZipFile‘   sƒ   € ð
 —\‘\×'Ñ'¨Ó6×;Ñ;ˆ
Ü�_Š_˜Z¨Ô-°Ü'¨Ö1‘
�Ü˜q›6�ÞØ(¨3™°Ñ9�HØ—‘ Ö2ñ	 2÷ .ð Ð÷ .Ô-ð Ðús   ½A BÂ
Bc                 óÄ   • [         R                  " U R                  5       S5       nU R                  [        UR
                  S5        SSS5        g! , (       d  f       g= f)zh
A ChunkingZipFile opened in write-mode should not allow .readfile(),
and raise a RuntimeError instead.
r   Ú	somethingN)r   r   r   r4   ÚRuntimeErrorr   ©r   Úczfs     r   Útest_invalidModeÚZipstreamTests.test_invalidModeŸ   s>   € ô
 ×&Ò& t§{¡{£}°cÔ:¸cØ×Ñœl¨C¯L©L¸+ÔF÷ ;×:Ö:ús   ¦"AÁ
Ac                 ó´   • [         R                  " U R                  S/5      S5      nUR                  5         U R	                  [
        UR                  S5        g)zV
A closed ChunkingZipFile should raise a L{RuntimeError} when
.readfile() is invoked.
r   r   N)r   r   r|   Úcloser4   r€   r   r�   s     r   Útest_closedArchiveÚ!ZipstreamTests.test_closedArchive§   sB   € ô
 ×'Ò'¨×(8Ñ(8¸+¸Ó(GÈÓMˆØ�	‰	ŒØ×Ñœ,¨¯©°kÕBr+   c                 ó   • U R                  SS/5      n[        R                  " US5       nUR                  S5      R                  nSSS5        [        US5       nUR                  WS5        UR                  S5        SSS5        [        R                  " U5       nU R                  [        R                  UR                  S5        UR                  S	5       nU R                  UR                  5       S
5        SSS5        SSS5        g! , (       d  f       NË= f! , (       d  f       N¤= f! , (       d  f       N9= f! , (       d  f       g= f)zŒ
A zipfile entry with the wrong magic number should raise BadZipFile for
readfile(), but that should not affect other files in the archive.
ztest contentszmore contentsr   Ú0Núr+br   s   0000Ú1ó   more contents)r|   r   r   ÚgetinfoÚheader_offsetÚopenÚseekÚwriter   r   r4   Ú
BadZipFiler   r,   rC   )r   ÚfnÚzfÚ
zeroOffsetÚscribbler‚   Úzfes          r   Útest_invalidHeaderÚ!ZipstreamTests.test_invalidHeader°   sð   € ð
 ×Ñ˜°Ð@ÓAˆÜ�_Š_˜R Ô%¨ØŸ™ C›×6Ñ6ˆJ÷ &ô �"�eŒ_ Ø�M‰M˜* aÔ(Ø�N‰N˜8Ô$÷ ô ×&Ò& rÔ*¨cØ×Ñœg×0Ñ0°#·,±,ÀÔDØ—‘˜cÔ" cØ× Ñ  §¡£Ð-=Ô>÷ #÷ +Ð*÷ &Õ%ú÷ �_ú÷
 #Õ"ú÷ +Õ*ús;   «DÁ$DÂ=D?Ã!D.Ã;D?Ä
DÄ
D+Ä.
D<	Ä8D?Ä?
Ec                 óÊ  • U R                  SS/5      n[        R                  " US5       nUR                  S5      nSUl        SSS5        [        US5       nUR                  WR                  S5        UR                  UR                  5       5        SSS5        [        R                  " U5       nU R                  [        R                  UR                  S5        UR                  S	5       nU R                  UR!                  5       S5        SSS5        SSS5        g! , (       d  f       Nã= f! , (       d  f       N¤= f! , (       d  f       N9= f! , (       d  f       g= f)
zk
A zipfile entry with a different filename than is found in the central
directory should raise BadZipFile.
s   test contentsr�   r   rŠ   znot zeroNr‹   r   rŒ   )r|   r   r   rŽ   r   r�   r‘   r�   r’   Ú
FileHeaderr   r   r4   r“   r   r,   rC   )r   r”   r•   Úinfor—   r‚   r˜   s          r   Útest_filenameMismatchÚ$ZipstreamTests.test_filenameMismatchÁ   s   € ð
 ×ÑÐ/Ð1AÐBÓCˆÜ�_Š_˜R Ô%¨Ø—:‘:˜c“?ˆDØ&ˆDŒM÷ &ô �"�eŒ_ Ø�M‰M˜$×,Ñ,¨aÔ0Ø�N‰N˜4Ÿ?™?Ó,Ô-÷ ô ×&Ò& rÔ*¨cØ×Ñœg×0Ñ0°#·,±,ÀÔDØ—‘˜cÔ" cØ× Ñ  §¡£Ð-=Ô>÷ #÷ +Ð*÷ &Õ%ú÷ �_ú÷ #Õ"ú÷ +Õ*ús;   «D!Á<D2Â2=EÃ/!EÄEÄ!
D/Ä2
E Å
E	ÅEÅ
E"c                 óš  • U R                  5       n[        R                  " US5       n[        R                  " S5      nUR	                  US5        SUl        SSS5        [        R                  " U5       nU R                  [        R                  UR                  S5        SSS5        g! , (       d  f       NY= f! , (       d  f       g= f)zY
A zipfile which describes an unsupported compression mechanism should
raise BadZipFile.
r   rŠ   z	some dataiÒ  N)r   r   r   ÚZipInfor   Úcompress_typer   r   r4   r“   r   )r   r”   r•   Úzir‚   s        r   Útest_unsupportedCompressionÚ*ZipstreamTests.test_unsupportedCompressionÓ   s’   € ð
 �[‰[‹]ˆÜ�_Š_˜R Ô%¨Ü—’ Ó%ˆBØ�K‰K˜˜KÔ(ð  $ˆBÔ÷ &ô ×&Ò& rÔ*¨cØ×Ñœg×0Ñ0°#·,±,ÀÔD÷ +Ð*÷ &Õ%ú÷ +Õ*ús   ¨0B+Á6,B<Â+
B9Â<
C
c                 ó   • U R                  5       n[        R                  " US5       n[        R                  " S5      nSn[        R
                  " SS[        U5      5      U-   Ul        UR                  US5        SSS5        [        R                  " U5       oUR                  S5       nU R                  UR                  5       S5        SSS5        SSS5        g! , (       d  f       Ng= f! , (       d  f       N(= f! , (       d  f       g= f)zG
readfile() should skip over 'extra' data present in the zip metadata.
r   rŠ   s   hello, extraz<hhé*   s   the real dataN)r   r   r   r¡   ÚstructÚpackÚlenÚextrar   r   r   r   r,   rC   )r   r”   r•   r£   Ú
extra_datar‚   r˜   s          r   Útest_extraDataÚZipstreamTests.test_extraDataä   s½   € ð �[‰[‹]ˆÜ�_Š_˜R Ô%¨Ü—’ Ó%ˆBØ(ˆJÜ—{’{ 5¨"¬c°*«oÓ>ÀÑKˆBŒHØ�K‰K˜Ð,Ô-÷	 &ô
 ×&Ò& rÔ*¨c·<±<ÀÔ3DÈØ×Ñ˜SŸX™X›ZÐ)9Ô:÷ 4E×*Ð*÷ &Õ%ú÷
 4EÕ3Dú×*Õ*ús0   ¨ACÂC?Â+!C.ÃC?Ã
C+Ã.
C<	Ã8C?Ã?
Dc                 ó~  • Sn[        U5       Vs/ s H  nSU-  PM
     nnU Vs/ s H  o"R                  S5      PM     nnU R                  U5      n[        [        R
                  " X@R                  R                  5      5        U R                  [        U R                  R                  5       5      [        [        [        [        U5      5      5      5        U R                  R                  5        H>  n[        UR                  5       5      nU R                  UR!                  5       X6   5        M@     gs  snf s  snf )z€
L{twisted.python.zipstream.unzipIterChunky} returns an iterator which
must be exhausted to completely unzip the input archive.
é
   úThis is test file %d!ÚasciiN)ÚrangeÚencoder|   Úlistr   ÚunzipIterChunkyro   ru   r,   ÚsetÚlistdirÚmaprw   ÚchildrenÚintÚbasenameÚ
getContent)r   Únumfilesr{   r   ry   rn   Únums          r   Útest_unzipIterChunkyÚ#ZipstreamTests.test_unzipIterChunkyñ   sí   € ð
 ˆÜ9>¸x¼ÓIº°AÐ+¨aÔ/¹ˆÐIÙ/7Ó8ªx¨!—H‘H˜WÖ%©xˆÐ8Ø×%Ñ% hÓ/ˆ
ÜŒY×&Ò& z·=±=×3EÑ3EÓFÔGØ×Ñœ˜TŸ]™]×2Ñ2Ó4Ó5´s¼3¼sÄEÈ(ÃOÓ;TÓ7UÔVà—]‘]×+Ñ+Ö-ˆEÜ�e—n‘nÓ&Ó'ˆCØ×Ñ˜U×-Ñ-Ó/°±Ö?ò .ùò JùÚ8s
   �D5¥D:c                 óì  • Sn[        U5       Vs/ s H  nSU-  PM
     nnU Vs/ s H  o"R                  S5      PM     nnU R                  US5      n[        [        R
                  " X@R                  R                  5      5        [        U5       Vs1 s H  n[        U5      R                  S5      iM     nnU R                  [        U R                  R                  S5      R                  5       5      U5        U R                  R                  S5      R                  5        H>  n[        UR                  5       5      nU R                  UR!                  5       X5   5        M@     gs  snf s  snf s  snf )zÄ
The path to which a file is extracted by L{zipstream.unzipIterChunky}
is determined by joining the C{directory} argument to C{unzip} with the
path within the archive of the file being extracted.
r°   r±   r²   Úfoos   fooN)r³   r´   r|   rµ   r   r¶   ro   ru   rw   r,   r·   rn   r¸   rº   r»   r¼   r½   )r   r¾   r{   r   ry   r¿   ÚfileContentsrn   s           r   Útest_unzipIterChunkyDirectoryÚ,ZipstreamTests.test_unzipIterChunkyDirectory  s   € ð ˆÜ9>¸x¼ÓIº°AÐ+¨aÔ/¹ˆÐIÙ/7Ó8ªx¨!—H‘H˜WÖ%©xˆÐ8Ø×%Ñ% h°Ó6ˆ
ÜŒY×&Ò& z·=±=×3EÑ3EÓFÔGÜ<AÀ(¼OÓLºO°Sœ˜C›Ÿ™¨Ö0¹OˆÐLØ×Ñœ˜TŸ]™]×0Ñ0°Ó8×@Ñ@ÓBÓCÀ\ÔRà—]‘]×(Ñ(¨Ó0×9Ñ9Ö;ˆEÜ�e—n‘nÓ&Ó'ˆCØ×Ñ˜U×-Ñ-Ó/°±Ö?ò <ùò JùÚ8ùò Ms   �E'¥E,Â$E1c                 óZ  • Sn[        S5       HD  n[        [        R                  " 5       S5      n[        U5      R	                  S5      nUSU-   -  nMF     [        U5      R                  5       n	[        R                  " U R                  5       5      n
U
R                  5         U
R                  S5      R                  nU R                  X±U5        [        R                  " XºR                  US9n[!        U5      nX=s=:  =(       a    U:  Os  nU R#                  U5        U H  nM     U R%                  US5        U
R                  S	5      R'                  5        n[        UR)                  5       5      R                  5       nU R%                  UU	5        S
S
S
5        g
! , (       d  f       g
= f)zG
unzipIterChunky should unzip the given number of bytes per iteration.
r+   iè  é   r²   ó    zbigfile.zip)Ú	chunksizer   ÚzipstreamjunkN)r³   ÚroundÚrandomrw   r´   r   Ú	hexdigestr   rk   r   rm   rn   ru   Ú_makebigfiler   r¶   r3   r&   r,   r�   rC   )r   r   rÊ   ÚlowerÚupperÚjunkÚnr¿   Ú
numEncodedÚjunkmd5ÚtempdirÚzfpathÚuziterr   ÚapproxÚfÚnewmd5s                    r   Ú_unzipIterChunkyTestÚ#ZipstreamTests._unzipIterChunkyTest  sI  € ð ˆÜ�t–ˆAÜœŸš›¨Ó,ˆCÜ˜S›Ÿ™¨Ó1ˆJØ�D˜:Ñ%Ñ%ŠDñ ô
 �d“)×%Ñ%Ó'ˆä×#Ò# D§K¡K£MÓ2ˆØ×ÑÔØ—‘˜}Ó-×2Ñ2ˆØ×Ñ˜&¨tÔ4Ü×*Ò*¨6·<±<È9ÑUˆÜ�‹Lˆð ×"Ó"˜UÔ"ˆØ�‰˜ÔÛˆAÙñ à×Ñ˜˜AÔØ�]‰]˜?Ó+×0Ñ0Ô2°aÜ˜Ÿ™›“]×,Ñ,Ó.ˆFØ×Ñ˜V WÔ-÷ 3×2Ö2ús   Å:FÆ
F*c                 óH   • U R                  [        R                  SSS5        g)z[
unzipIterChunky should unzip the given number of bytes per iteration on
a stored archive.
iô  é#   é-   N)rÜ   r   re   rp   s    r   Útest_unzipIterChunkyStoredÚ)ZipstreamTests.test_unzipIterChunkyStored5  s   € ð
 	×!Ñ!¤'×"4Ñ"4°c¸2¸rÕBr+   c                 óH   • U R                  [        R                  SSS5        g)z]
unzipIterChunky should unzip the given number of bytes per iteration on
a deflated archive.
iÌ  é   é   N)rÜ   r   ra   rp   s    r   Útest_chunkyDeflatedÚ"ZipstreamTests.test_chunkyDeflated<  s   € ð
 	×!Ñ!¤'×"6Ñ"6¸¸RÀÕDr+   c                 óÞ   • [         R                  " USU5       n[        S5       H  nSU-  nUR                  US5        M     UR                  SU5        SSS5        g! , (       d  f       g= f)zD
Create a zip file with the given file name and compression scheme.
r   r°   zzipstream%dr   rË   N)r   r   r³   r   )r   r   r   rÒ   r•   r{   r”   s          r   rÏ   ÚZipstreamTests._makebigfileC  sX   € ô �_Š_˜X s¨KÔ8¸BÜ˜2–Y�Ø" QÑ&�Ø—‘˜B Ö#ñ ð �K‰K˜¨Ô.÷	 9×8Ö8ús   ™<AÁ
A,)rl   ro   N)r   )rX   rY   rZ   r[   r\   rq   r|   rƒ   r‡   r™   rž   r¤   r­   rÀ   rÅ   rÜ   rá   ræ   rÏ   r]   rW   r+   r   rg   rg   ‚   sT   † ñò!ôòGòCò?ò"?ò$Eò";ò@ò @ò,.ò<CòEõ/r+   rg   )r\   rÍ   r¨   r   Úhashlibr   Útwisted.pythonr   r   Útwisted.trialr   r   ÚTestCaser_   rc   rg   rW   r+   r   Ú<module>rî      sg   ðñó Û Û Ý ç .Ý "÷^.ñ ^.ôB' °×0AÑ0Aô 'ô%˜¨×(9Ñ(9ô %ôI/�X×&Ñ&õ I/r+   