o
    _#ûa© ã                   @   s6  d dl Z d dlZd dlZd dlZd dlZd dlZd dlmZ d dlm	Z	 d dl
mZmZ ddlmZmZmZmZmZ ddlmZ ddlmZ e e¡Zd	Zd	Zd
ZdZdZdZdZdZ dZ!dZ"dZ#dZ$dZ%dZ&dZ'dZ(dZ)dZ*dZ+dZ,dZ-dZ.dZ/dZ0d Z1d!Z2d"Z3d#Z4d$Z5d%Z6d&Z7d'Z8d(Z9d)Z:d*Z;d+Z<d,Z=d-Z>d.Z?d/Z@d0ZAd1ZBd2ZCd3ZDd4ZEd5ZFi dd6“d7d8“d9d:“d;d<“d=d>“d?d@“dAdB“dCdD“dEdF“dGdH“dIdJ“dKdL“dMdN“dOdP“dQdR“dSdT“dUdV“ZGdWdX„ eG H¡ D ƒZIi ed dYddYdZfd[“ed dYddYdZfd[“ed dYd7dYdZfd\“ed dYd7dYdZfd\“eddYddYdZfd]“eddYddYdZfd]“eddYd7dYdZfd^“eddYd7dYdZfd^“ed dYdd_dZfd`“ed dYdd_dZfd`“ed dYd7d_dZfda“ed dYd7d_dZfda“eddYdd_dZfdb“eddYdd_dZfdb“eddYd7d_dZfdc“eddYd7d_dZfdc“ed dYddddZfde“i ed dYddddZfde“ed dYd7dddZfdf“ed dYd7dddZfdf“eddYddddZfdg“eddYddddZfdg“eddYd7dddZfdh“eddYd7dddZfdh“ed dYddidZfdj“ed dYddidZfdj“ed dYd7didZfdk“ed dYd7didZfdk“eddYddidZfdl“eddYddidZfdl“eddYd7didZfdm“eddYd7didZfdm“eddYddndZfdo“eddYddpdZfdq“¥i eddYddpdZfdr“edd_ddpdZfds“edd_ddpdZfdt“ed duddvdZfdw“ed duddvdZfdx“eddYddvdZfdy“edd_ddvdZfdz“edd_ddvdZfd{“edduddvdZfdw“edduddvdZfdx“eddYdd|d_fd}“eddYdd|d_fd}“ed7dYdd~dZfd“ed7dYdd~dZfd“ed7dYd7d~dZfd€“ed7dYd7d~dZfd€“ed7dYdd�dZfd‚“¥i ed7dYdd�dZfd‚“ed7dYdd�dƒfd„“ed7dYdd�dƒfd„“ed7dYdd…d†fd‡“ed7dYdd…d†fd‡“ed7dYddˆd‰fdŠ“ed7dYddˆd‰fdŠ“ed7dYdd�dYfd‹“ed7dYdd�dYfd‹“ed7dYdd…dŒfd�“ed7dYdd…dŒfd�“ed7dYddˆdŽfd�“ed7dYddˆdŽfd�“ed7dYdd�d_fd‚“ed7dYdd�d_fd‚“ed7dYdd…d�fd‘“ed7dYdd…d�fd‘“¥i ed7dYddˆd’fd““ed7dYddˆd’fd““ed7dYdd�d”fd‚“ed7dYdd�d”fd‚“ed7dYdd•dZfd–“ed7dYdd•dZfd—“ed7dYdd˜dZfd™“ed7dYdd˜dZfdš“ed7dYdd˜dƒfd›“ed7dYdd˜dƒfdœ“ed7dYdd˜dYfd�“ed7dYdd˜dYfdž“ed7dYdd˜d_fd™“ed7dYdd˜d_fdš“ed9dYddYdZfdŸ“ed9dYddYdZfdŸ“ed9dYd7dYdZfd “¥i ed9dYd7dYdZfd “ed9dYdd_dZfd¡“ed9dYdd_dZfd¡“ed9dYd7d_dZfd¢“ed9dYd7d_dZfd¢“ed9dYddddZfd£“ed9dYddddZfd£“ed9dYd7dddZfd¤“ed9dYd7dddZfd¤“ed9dYddidZfd¥“ed9dYddidZfd¥“ed9dYdd|d_fd¦“ed9dYdd|d_fd¦“ed9dYd7didZfd§“ed9dYd7didZfd§“ed=dYdd�dZfd¨“ed=dYdd�dZfd¨“¥ed=dYdd…dƒfd©ed=dYdd…dƒfd©ed=dYddˆd†fdªed=dYddˆd†fdªed=dYdd˜dZfd«ed?dYdd~dZfd¬ed?dYdd~dZfd¬edCdYdd~dZfd­edCdYdd~dZfd­i	¥ZJg d®¢ZKd¯d°„ ZLd±d²„ ZMd³d´„ ZNi ZOi ZPG dµd¶„ d¶eƒZQG d·d¸„ d¸eƒZReOeR_OePeR_Pe H¡ D ]!\ZSZTeT Ud¹dº¡ZTeVeRd»eT eOeS d ƒ eVeRd¼eT ePeS ƒ �qÿ[O[P[S[TG d½d¾„ d¾eRƒZWeWZXG d¿dÀ„ dÀejƒZYi dÁdÁedddYdf“dÂdÂedddidf“dÃdÃeddd|d7f“dÄdÄed9ddidf“dÅdÅed9dd|d7f“dÆdÇedd7dvdf“dÈdÈedddpdf“dÉdÉedd7dpdf“dÊdËedd9dvdf“dÌdÌed7dd~df“dÍdÍed7dd�d f“dÎdÎed7dd�d7f“dÏdÏed=dd�df“dÐdÐed?dd~df“dÑdÑedCdd~df“dÒdÒedd7dvdf“dÓdÓedddpdf“dÔedd7dpdfdÕedd9dvdfdÖœ¥ZZd×dØ„ Z[G dÙdÚ„ dÚƒZ\dÛdÜ„ Z]e ^eYj_eYeL¡ e `eYj_e[¡ e aeYj_e]¡ e beYj_dÝdÞg¡ e ceYj_dß¡ dS )àé    N)ÚMutableMapping)ÚFraction)ÚNumberÚRationalé   )ÚImageÚ	ImageFileÚImageOpsÚImagePaletteÚTiffTags©Úo8©ÚTYPESFTé   s   IIs   MMé   i  i  i  i  i
  i  é  i  i  i  i  i  i  i(  i-  i1  i2  i;  i=  i@  éB  éC  éD  iE  iJ  iR  iS  i[  é  i  i˜‚  i»ƒ  iI†  is‡  ii‡  é¼  i  i–Æ  i—Æ  Úrawé   Ú
tiff_ccitté   Úgroup3é   Úgroup4é   Útiff_lzwé   Ú	tiff_jpegé   Újpegé   Útiff_adobe_deflatei€  Útiff_raw_16i€  Úpackbitsi)€  Útiff_thunderscani²€  Útiff_deflateit‡  Útiff_sgilogiu‡  Útiff_sgilog24imˆ  ÚlzmaiPÃ  ÚzstdiQÃ  Úwebpc                 C   s   i | ]\}}||“qS © r0   )Ú.0ÚkÚvr0   r0   ú5/usr/lib/python3/dist-packages/PIL/TiffImagePlugin.pyÚ
<dictcomp>‡   s    r5   ©r   r0   )Ú1z1;I)r7   z1;IR)r7   r7   )r7   z1;R)r   )ÚLzL;2I)r8   zL;2IR)r8   zL;2)r8   zL;2R)r   )r8   zL;4I)r8   zL;4IR)r8   zL;4)r8   zL;4R)r%   )r8   zL;I)r8   zL;IR)r8   r8   )r8   zL;R)é   )úI;16zI;12)é   )r:   r:   )úI;16Br<   )ÚIúI;16S)r=   úI;16BS)r   )é    )ÚFúF;32F)rA   úF;32BF)r=   zI;32N)r=   úI;32S)r=   úI;32BS)r%   r%   )ÚLArF   )r%   r%   r%   )ÚRGBrG   )rG   zRGB;R)r%   r%   r%   r%   )ÚRGBArH   ©r   )ÚRGBXrJ   )r%   r%   r%   r%   r%   ©r   r   )rJ   ÚRGBXX)r%   r%   r%   r%   r%   r%   )r   r   r   )rJ   ÚRGBXXX)rH   ÚRGBa)r   r   )rH   ÚRGBaX)r   r   r   )rH   ÚRGBaXX)r   r   )rH   ÚRGBAX)r   r   r   )rH   ÚRGBAXX)iç  )r;   r;   r;   )rG   zRGB;16L)rG   zRGB;16B)r;   r;   r;   r;   )rH   zRGBA;16L)rH   zRGBA;16B)rJ   zRGBX;16L)rJ   zRGBX;16B)rH   zRGBa;16L)rH   zRGBa;16B)ÚPzP;1)rS   zP;1R)rS   zP;2)rS   zP;2R)rS   zP;4)rS   zP;4R)rS   rS   )ÚPArT   )rS   zP;R)ÚCMYKrU   )rU   ÚCMYKX)rU   ÚCMYKXX)rU   zCMYK;16L)rG   rJ   )ÚLABrX   )ó   MM *ó   II* s   MM* s   II *c                 C   s   | d d… t v S ©Nr   )ÚPREFIXES©Úprefixr0   r0   r4   Ú_accept  ó   r_   c                 C   s<   t | ƒdk}t|rd|  n| ƒ |¡}|r|d d d… S |S )Nr   éÿÿÿÿ)ÚabsÚIFDRationalÚlimit_rational)ÚvalÚmax_valÚinvÚn_dr0   r0   r4   Ú_limit_rational  s   ri   c                 C   sP   t | ƒ}|j|jf}t|ƒ|k rt| t|ƒƒ}t|ƒ|kr&t |Ž } t| |ƒ}|S ©N)r   Ú	numeratorÚdenominatorÚminri   rb   Úmax)re   rf   Úmin_valÚfracrh   r0   r0   r4   Ú_limit_signed_rational  s   
rq   c                   @   sB  e Zd ZdZ	 dZd3dd„Zedd„ ƒZedd	„ ƒZd
d„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Z	 edƒZedƒZedƒZedƒZedƒZedƒZedƒZedƒZed ƒZed!ƒZed"ƒZed#ƒZed$ƒZed%ƒZed&ƒZed'ƒZed(ƒZ ed)ƒZ!ed*ƒZ"ed+ƒZ#ed,ƒZ$ed-ƒZ%ed.ƒZ&ed/ƒZ'ed0ƒZ(ed1ƒZ)d2S )4rc   zÀImplements a rational class where 0/0 is a legal value to match
    the in the wild use of exif rationals.

    e.g., DigitalZoomRatio - 0.00/0.00  indicates that no digital zoom was used
    )Ú
_numeratorÚ_denominatorÚ_valr   c                 C   sŠ   t |tƒr|j| _|j| _|j| _dS t |tƒr!|j| _|j| _n|| _|| _|dkr2tdƒ| _dS |dkr=t|ƒ| _dS t||ƒ| _dS )z®
        :param value: either an integer numerator, a
        float/rational/other number, or an IFDRational
        :param denominator: Optional integer denominator
        Nr   Únanr   )	Ú
isinstancerc   rk   rr   rl   rs   rt   r   Úfloat)ÚselfÚvaluerl   r0   r0   r4   Ú__init__4  s   


zIFDRational.__init__c                 C   ó   | j S rj   )rr   ©Úar0   r0   r4   rk   N  ó   zIFDRational.numeratorc                 C   r{   rj   )rs   r|   r0   r0   r4   rl   R  r~   zIFDRational.denominatorc                 C   s.   | j dkr| j| j fS | j |¡}|j|j fS )z…

        :param max_denominator: Integer, the maximum denominator value
        :returns: Tuple of (numerator, denominator)
        r   )rl   rk   rt   Úlimit_denominator)rx   Úmax_denominatorÚfr0   r0   r4   rd   V  s   
zIFDRational.limit_rationalc                 C   s   t t| jƒƒS rj   )Ústrrw   rt   ©rx   r0   r0   r4   Ú__repr__c  s   zIFDRational.__repr__c                 C   s
   | j  ¡ S rj   )rt   Ú__hash__rƒ   r0   r0   r4   r…   f  s   
zIFDRational.__hash__c                 C   s0   | j }t|tƒr|j }t|tƒrt|ƒ}||kS rj   )rt   rv   rc   rw   )rx   Úotherre   r0   r0   r4   Ú__eq__i  s   

zIFDRational.__eq__c                 C   s   | j | j| jgS rj   )rt   rr   rs   rƒ   r0   r0   r4   Ú__getstate__q  r`   zIFDRational.__getstate__c                 C   s,   t  | d¡ |\}}}|| _|| _|| _d S )Nr   )rc   rz   rt   rr   rs   )rx   Ústatert   rr   rs   r0   r0   r4   Ú__setstate__t  s
   

zIFDRational.__setstate__c                    ó   ‡ fdd„}|S )Nc                    s   t | jˆ ƒ|Ž S rj   )Úgetattrrt   )rx   Úargs©Úopr0   r4   Údelegate|  r`   z'IFDRational._delegate.<locals>.delegater0   )r�   r�   r0   rŽ   r4   Ú	_delegate{  s   zIFDRational._delegateÚ__add__Ú__radd__Ú__sub__Ú__rsub__Ú__mul__Ú__rmul__Ú__truediv__Ú__rtruediv__Ú__floordiv__Ú__rfloordiv__Ú__mod__Ú__rmod__Ú__pow__Ú__rpow__Ú__pos__Ú__neg__Ú__abs__Ú	__trunc__Ú__lt__Ú__gt__Ú__le__Ú__ge__Ú__bool__Ú__ceil__Ú	__floor__Ú	__round__Nr6   )*Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú	__slots__rz   Úpropertyrk   rl   rd   r„   r…   r‡   rˆ   rŠ   r‘   r’   r“   r”   r•   r–   r—   r˜   r™   rš   r›   rœ   r�   rž   rŸ   r    r¡   r¢   r£   r¤   r¥   r¦   r§   r¨   r©   rª   r«   r0   r0   r0   r4   rc   &  sV    


rc   c                   @   sø  e Zd ZdZd\dd„Zedd„ ƒZedd„ ƒZed	d„ ƒZej	d
d„ ƒZdd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zeeeejd*d+fejd,d-fejd.d/fejd0d1fej d2d3fej!d4d5fej"d6d7fej#d,d-fgƒƒ ed8d8ƒd]d:d;„ƒZ$ed8ƒd<d=„ ƒZ%ed>d8ƒd]d?d@„ƒZ&ed>ƒdAdB„ ƒZ'edCdDƒd]dEdF„ƒZ(edCƒdGdH„ ƒZ)edId8ƒd]dJdK„ƒZ*edIƒdLdM„ ƒZ+edNdDƒd]dOdP„ƒZ,edNƒdQdR„ ƒZ-dSdT„ Z.dUdV„ Z/d^dXdY„Z0dZd[„ Z1dS )_ÚImageFileDirectory_v2a  This class represents a TIFF tag directory.  To speed things up, we
    don't decode tags unless they're asked for.

    Exposes a dictionary interface of the tags in the directory::

        ifd = ImageFileDirectory_v2()
        ifd[key] = 'Some Data'
        ifd.tagtype[key] = TiffTags.ASCII
        print(ifd[key])
        'Some Data'

    Individual values are returned as the strings or numbers, sequences are
    returned as tuples of the values.

    The tiff metadata type of each item is stored in a dictionary of
    tag types in
    :attr:`~PIL.TiffImagePlugin.ImageFileDirectory_v2.tagtype`. The types
    are read from a tiff file, guessed from the type added, or added
    manually.

    Data Structures:

        * ``self.tagtype = {}``

          * Key: numerical TIFF tag number
          * Value: integer corresponding to the data type from
            :py:data:`.TiffTags.TYPES`

          .. versionadded:: 3.0.0

    'Internal' data structures:

        * ``self._tags_v2 = {}``

          * Key: numerical TIFF tag number
          * Value: decoded data, as tuple for multiple values

        * ``self._tagdata = {}``

          * Key: numerical TIFF tag number
          * Value: undecoded byte string from file

        * ``self._tags_v1 = {}``

          * Key: numerical TIFF tag number
          * Value: decoded data in the v1 format

    Tags will be found in the private attributes ``self._tagdata``, and in
    ``self._tags_v2`` once decoded.

    ``self.legacy_api`` is a value for internal use, and shouldn't be changed
    from outside code. In cooperation with
    :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1`, if ``legacy_api``
    is true, then decoded tags will be populated into both ``_tags_v1`` and
    ``_tags_v2``. ``_tags_v2`` will be used if this IFD is used in the TIFF
    save routine. Tags should be read from ``_tags_v1`` if
    ``legacy_api == true``.

    ó   II*     Nc                 C   s¢   |dd… t vrtdt|ƒ› d�ƒ‚|dur|n|dd… | _| jtkr(d| _n| jtkr1d| _ntdƒ‚|| _i | _	 |  	¡  |  
d	|dd… ¡\| _d
| _dS )a—  Initialize an ImageFileDirectory.

        To construct an ImageFileDirectory from a real file, pass the 8-byte
        magic header to the constructor.  To only set the endianness, pass it
        as the 'prefix' keyword argument.

        :param ifh: One of the accepted magic headers (cf. PREFIXES); also sets
              endianness.
        :param prefix: Override the endianness of the file.
        Nr   znot a TIFF file (header z not valid)r   ú>ú<znot a TIFF IFDr8   F)r\   ÚSyntaxErrorÚreprÚ_prefixÚMMÚ_endianÚIIÚgroupÚtagtypeÚresetÚ_unpackÚnextÚ_legacy_api)rx   Úifhr^   r¼   r0   r0   r4   rz   â  s   


zImageFileDirectory_v2.__init__c                 C   r{   rj   )r¸   rƒ   r0   r0   r4   Ú<lambda>ý  ó    zImageFileDirectory_v2.<lambda>c                 C   r{   rj   )Ú_offsetrƒ   r0   r0   r4   rÃ   þ  rÄ   c                 C   r{   rj   )rÁ   rƒ   r0   r0   r4   rÃ   ÿ  rÄ   c                 C   s   t dƒ‚)Nz"Not allowing setting of legacy api)Ú	Exception©rx   ry   r0   r0   r4   Ú
legacy_api  s   z ImageFileDirectory_v2.legacy_apic                 C   s(   i | _ i | _i | _i | _d | _d | _d S rj   )Ú_tags_v1Ú_tags_v2Ú_tagdatar½   Ú_nextrÅ   rƒ   r0   r0   r4   r¾     s   
zImageFileDirectory_v2.resetc                 C   s   t t| ƒƒS rj   )r‚   Údictrƒ   r0   r0   r4   Ú__str__  ó   zImageFileDirectory_v2.__str__c                    s   ‡ fdd„ˆ   ¡ D ƒS )z�
        :returns: dict of name|key: value

        Returns the complete tag dictionary, with named tags where possible.
        c                    s"   i | ]\}}t  |ˆ j¡j|“qS r0   )r   Úlookupr¼   Úname)r1   Úcodery   rƒ   r0   r4   r5     s    ÿÿz/ImageFileDirectory_v2.named.<locals>.<dictcomp>)Úitemsrƒ   r0   rƒ   r4   Únamed  s   
þzImageFileDirectory_v2.namedc                 C   ó   t t| jƒt| jƒB ƒS rj   )ÚlenÚsetrË   rÊ   rƒ   r0   r0   r4   Ú__len__  ó   zImageFileDirectory_v2.__len__c                 C   sf   || j vr| j| }| j| }| j| \}}|| || jƒ| |< | j | }| jr1t|ttfƒs1|f}|S rj   )rÊ   rË   r½   Ú_load_dispatchrÈ   rv   ÚtupleÚbytes)rx   ÚtagÚdataÚtypÚsizeÚhandlerre   r0   r0   r4   Ú__getitem__  s   



z!ImageFileDirectory_v2.__getitem__c                 C   ó   || j v p	|| jv S rj   )rÊ   rË   ©rx   rÝ   r0   r0   r4   Ú__contains__)  ó   z"ImageFileDirectory_v2.__contains__c                 C   s   |   ||| j¡ d S rj   )Ú_setitemrÈ   )rx   rÝ   ry   r0   r0   r4   Ú__setitem__,  ræ   z!ImageFileDirectory_v2.__setitem__c              
      sª  t ttf}t || j¡‰ t||ƒr|gn|}|| jvr²ˆ jr%ˆ j| j|< n�tj	| j|< t
dd„ |D ƒƒrGt
dd„ |D ƒƒr@tjntj| j|< nkt
dd„ |D ƒƒrƒt
dd„ |D ƒƒr`tj| j|< nRt
dd„ |D ƒƒrptj| j|< nBt
dd„ |D ƒƒr|tjntj| j|< n/t
dd„ |D ƒƒr“tj| j|< nt
d	d„ |D ƒƒr£tj| j|< nt
d
d„ |D ƒƒr²tj| j|< | j| tj	krÂdd„ |D ƒ}n| j| tjkrÑdd„ |D ƒ}| j| tjkoÝt|tƒ}|sët‡ fdd„|D ƒƒ}|rð| jn| j}|�sOˆ jdk�s| j| tjk�sˆ jd u �rOt|ƒdk�rO|�sO|�r'| j| tjtjfv �r'|f}z|\||< W d S  t�yN   t d|› dt|ƒ› d�¡ |d ||< Y d S w |||< d S )Nc                 s   ó   � | ]}t |tƒV  qd S rj   )rv   rc   ©r1   r3   r0   r0   r4   Ú	<genexpr>:  ó   € z1ImageFileDirectory_v2._setitem.<locals>.<genexpr>c                 s   ó   � | ]}|d kV  qdS ©r   Nr0   rê   r0   r0   r4   rë   =  ó   € c                 s   ré   rj   )rv   Úintrê   r0   r0   r4   rë   @  rì   c                 s   s(   � | ]}d |  kodk n  V  qdS )r   r   Nr0   rê   r0   r0   r4   rë   A  ó   €& c                 s   s(   � | ]}d |  k odk n  V  qdS )i €ÿÿi €  Nr0   rê   r0   r0   r4   rë   C  rñ   c                 s   rí   rî   r0   rê   r0   r0   r4   rë   H  rï   c                 s   ré   rj   )rv   rw   rê   r0   r0   r4   rë   K  rì   c                 s   ré   rj   )rv   r‚   rê   r0   r0   r4   rë   M  rì   c                 s   ré   rj   )rv   rÜ   rê   r0   r0   r4   rë   O  rì   c                 S   s&   g | ]}t |tƒr| d d¡n|‘qS )ÚasciiÚreplace)rv   r‚   Úencoderê   r0   r0   r4   Ú
<listcomp>S  s    ÿÿz2ImageFileDirectory_v2._setitem.<locals>.<listcomp>c                 S   s"   g | ]}t |tƒrt|ƒn|‘qS r0   )rv   rð   rw   rê   r0   r0   r4   rõ   X  s   " c                 3   s   � | ]}ˆ   |¡V  qd S rj   )Úcvt_enum©r1   ry   ©Úinfor0   r4   rë   \  rì   r   zMetadata Warning, tag z had too many entries: z, expected 1r   )r   rÜ   r‚   r   rÐ   r¼   rv   r½   ÚtypeÚ	UNDEFINEDÚallÚRATIONALÚSIGNED_RATIONALÚSHORTÚSIGNED_SHORTÚLONGÚSIGNED_LONGÚDOUBLEÚASCIIÚBYTErÍ   rÛ   rÉ   rÊ   ÚlengthrÖ   Ú
ValueErrorÚwarningsÚwarn)rx   rÝ   ry   rÈ   Ú	basetypesÚvaluesÚis_ifdÚdestr0   rø   r4   rç   /  sr   

ÿ
ýÿ
ýþ þÿÿúzImageFileDirectory_v2._setitemc                 C   s.   | j  |d ¡ | j |d ¡ | j |d ¡ d S rj   )rÊ   ÚpoprÉ   rË   rä   r0   r0   r4   Ú__delitem__  s   z!ImageFileDirectory_v2.__delitem__c                 C   rÕ   rj   )Úiterr×   rË   rÊ   rƒ   r0   r0   r4   Ú__iter__„  rÙ   zImageFileDirectory_v2.__iter__c                 C   s   t  | j| |¡S rj   )ÚstructÚunpackrº   )rx   ÚfmtrÞ   r0   r0   r4   r¿   ‡  s   zImageFileDirectory_v2._unpackc                 G   s   t j| j| g|¢R Ž S rj   )r  Úpackrº   )rx   r  r  r0   r0   r4   Ú_packŠ  rÙ   zImageFileDirectory_v2._packc                    s   ‡ ‡fdd„}|S )Nc                    sB   ddl m} | j d¡r| jdd …  dd¡|ˆ < ˆ| ftˆ < | S )Nr   r   Úload_r   Ú_ú )r   r   r¬   Ú
startswithró   rÚ   )Úfuncr   ©Úidxrà   r0   r4   Ú	decoratorŽ  s
   z9ImageFileDirectory_v2._register_loader.<locals>.decoratorr0   )r  rà   r  r0   r  r4   Ú_register_loader�  s   z&ImageFileDirectory_v2._register_loaderc                    r‹   )Nc                    s   | t ˆ < | S rj   )Ú_write_dispatch)r  ©r  r0   r4   r  ™  s   z9ImageFileDirectory_v2._register_writer.<locals>.decoratorr0   )r  r  r0   r!  r4   Ú_register_writer˜  s   z&ImageFileDirectory_v2._register_writerc                    sX   ddl m} | \}‰ }|||< t dˆ  ¡‰ˆd‡ ‡fdd„	ft|< ‡ fdd„t|< d S )	Nr   r   ú=Tc                    s   |   t|ƒˆ › ˆ › �|¡S rj   )r¿   rÖ   ©rx   rÞ   rÈ   ©r  rà   r0   r4   rÃ   §  s   z7ImageFileDirectory_v2._register_basic.<locals>.<lambda>c                    s   d  ‡‡ fdd„|D ƒ¡S )Nó    c                 3   s   � | ]	}ˆ  ˆ |¡V  qd S rj   )r  r÷   )r  rx   r0   r4   rë   ¬  s   € zJImageFileDirectory_v2._register_basic.<locals>.<lambda>.<locals>.<genexpr>©Újoin©rx   r  )r  rƒ   r4   rÃ   «  s   ©T)r   r   r  ÚcalcsizerÚ   r   )Úidx_fmt_namer   r  rÑ   r0   r%  r4   Ú_register_basicŸ  s   
þz%ImageFileDirectory_v2._register_basicÚHÚshortr8   ÚlongÚbzsigned byteÚhzsigned shortÚlzsigned longr�   rw   ÚdÚdoubler   Tc                 C   ó   |S rj   r0   r$  r0   r0   r4   Ú	load_byte¿  ó   zImageFileDirectory_v2.load_bytec                 C   r6  rj   r0   ©rx   rÞ   r0   r0   r4   Ú
write_byteÃ  r8  z ImageFileDirectory_v2.write_byter   c                 C   s"   |  d¡r|d d… }| dd¡S )Nó    ra   zlatin-1ró   )ÚendswithÚdecoder$  r0   r0   r4   Úload_stringÇ  s   
z!ImageFileDirectory_v2.load_stringc                 C   s   d|  dd¡ d S )Nr&  rò   ró   r;  )rô   rÇ   r0   r0   r4   Úwrite_stringÍ  s   z"ImageFileDirectory_v2.write_stringr   r%   c                    óV   |   t|ƒd › d�|¡}‡fdd„‰ t‡ fdd„t|d d d… |dd d… ƒD ƒƒS )	Nr   r8   c                    ó   ˆ r| |fS t | |ƒS rj   ©rc   ©r}   r1  ©rÈ   r0   r4   ÚcombineÖ  ó   z4ImageFileDirectory_v2.load_rational.<locals>.combinec                 3   ó   � | ]
\}}ˆ ||ƒV  qd S rj   r0   ©r1   ÚnumÚdenom©rE  r0   r4   rë   Ù  ó   € z6ImageFileDirectory_v2.load_rational.<locals>.<genexpr>r   r   ©r¿   rÖ   rÛ   Úzip©rx   rÞ   rÈ   Úvalsr0   ©rE  rÈ   r4   Úload_rationalÒ  ó   0z#ImageFileDirectory_v2.load_rationalc                    ó   d  ‡ fdd„|D ƒ¡S )Nr&  c                 3   s(   � | ]}ˆ j d gt|dƒ¢R Ž V  qdS )Ú2Ll   ÿÿ N)r  ri   ©r1   rp   rƒ   r0   r4   rë   Ý  s   € 
ÿz7ImageFileDirectory_v2.write_rational.<locals>.<genexpr>r'  r)  r0   rƒ   r4   Úwrite_rationalÛ  s   ÿz$ImageFileDirectory_v2.write_rationalr#   c                 C   r6  rj   r0   r$  r0   r0   r4   Úload_undefinedá  r8  z$ImageFileDirectory_v2.load_undefinedc                 C   r6  rj   r0   rÇ   r0   r0   r4   Úwrite_undefinedå  r8  z%ImageFileDirectory_v2.write_undefinedé
   c                    r@  )	Nr   r3  c                    rA  rj   rB  rC  rD  r0   r4   rE  í  rF  z;ImageFileDirectory_v2.load_signed_rational.<locals>.combinec                 3   rG  rj   r0   rH  rK  r0   r4   rë   ð  rL  z=ImageFileDirectory_v2.load_signed_rational.<locals>.<genexpr>r   r   rM  rO  r0   rQ  r4   Úload_signed_rationalé  rS  z*ImageFileDirectory_v2.load_signed_rationalc                    rT  )Nr&  c                 3   s*   � | ]}ˆ j d gt|ddƒ¢R Ž V  qdS )Ú2liÿÿÿi   €N)r  rq   rV  rƒ   r0   r4   rë   ô  s
   € ÿ
ÿz>ImageFileDirectory_v2.write_signed_rational.<locals>.<genexpr>r'  r)  r0   rƒ   r4   Úwrite_signed_rationalò  s   þz+ImageFileDirectory_v2.write_signed_rationalc                 C   s4   |  |¡}t|ƒ|krtd|› dt|ƒ› d�ƒ‚|S )Nz&Corrupt EXIF data.  Expecting to read ú bytes but only got z. )ÚreadrÖ   ÚOSError)rx   Úfprà   Úretr0   r0   r4   Ú_ensure_readù  s   
ÿÿÿz"ImageFileDirectory_v2._ensure_readc              
   C   s  |   ¡  | ¡ | _zßt|  d|  |d¡¡d ƒD ]Á}|  d|  |d¡¡\}}}}t || j¡j	}t
 |d¡}d|› d|› d	|› d|› d
�	}	z	| j| \}
}W n tya   t |	d|› � ¡ Y qw ||
 }|dkr�| ¡ }|  d|¡\}|	d|› d|› �7 }	| |¡ t ||¡}| |¡ n|d |… }t|ƒ|kr²t d|› dt|ƒ› d|› �¡ t |	¡ q|sºt |	¡ q|| j|< || j|< |	d|dkrÎd| nt|ƒ 7 }	t |	¡ q|  d|  |d¡¡\| _W d S  t�y }	 zt t|	ƒ¡ W Y d }	~	d S d }	~	ww )Nr.  r   r   ÚHHL4sr9   Úunknownztag: ú (ú
) - type: ú)z - unsupported type r   r8   z Tag Location: z - Data Location: z/Possibly corrupt EXIF data.  Expecting to read r^  z. Skipping tag ú
 - value: r@   ú<table: %d bytes>)r¾   ÚtellrÅ   Úranger¿   rc  r   rÐ   r¼   rÑ   r   ÚgetrÚ   ÚKeyErrorÚloggerÚdebugÚseekr   Ú
_safe_readrÖ   r  r	  rË   r½   r·   rÀ   r`  r‚   )rx   ra  ÚirÝ   rß   ÚcountrÞ   ÚtagnameÚtypnameÚmsgÚ	unit_sizerá   rà   ÚhereÚoffsetr0   r0   r4   Úload  sd   
 þ
ÿÿþÿ



ÿ€þzImageFileDirectory_v2.loadr   c                 C   s  |   dt| jƒ¡}g }|t|ƒ t| jƒd  d }d }t| j ¡ ƒD ]ì\}}|tkr/t|ƒ}| j |¡}t 	d|› d|› dt
|ƒ› �¡ |tjkoNt|tƒ}|ry| jdkrYd}	nd	}	t|	|d
�}
| j| }| ¡ D ]\}}||
|< qj|
 |¡}nt|tƒr€|n|f}| j| | g|¢R Ž }t || j¡j}|ršdnt |d¡}d|› d|› d|› d|› d�	}|dt|ƒdkr½dt|ƒ nt|ƒ 7 }t 	|¡ |rÍd}n|tjtjtjfv rÜt|ƒ}nt|ƒ}t|ƒdkrõ| |||| dd¡df¡ q#| ||||   d|¡|f¡ |t|ƒd d d 7 }q#|d u�r<|| \}}}}}|�r%tdƒ‚|   d|  d|¡d | ¡}|||||f||< |D ]*\}}}}}t 	|› d|› d|› dt
|ƒ› dt
|ƒ› �	¡ ||   d||||¡7 }�q>|d7 }|D ]\}}}}}||7 }t|ƒd@ �r…|d7 }�qo|S )Nr.  r9   r   zTag z, Type: z	, Value: rµ   s   II*    s   MM *   )r¼   Úifdre  zsave: rf  rg  rh  ri  r;   rj  r   r;  r&  r8   r   z&multistrip support not yet implementedr   r  rd  s       ) r  rÖ   rÊ   ÚsortedrÓ   ÚSTRIPOFFSETSr½   rm  ro  rp  r·   r   r  rv   rÍ   rº   r²   ÚtobytesrÛ   r   rÐ   r¼   rÑ   r   r‚   r  r  rû   ÚappendÚljustÚNotImplementedErrorr¿   )rx   rz  ÚresultÚentriesÚstripoffsetsrÝ   ry   rß   r  rÂ   r|  r  Úifd_tagÚ	ifd_valuerÞ   ru  rv  rw  rt  r0   r0   r4   r  9  sj    


ÿ


.€zImageFileDirectory_v2.tobytesc                 C   sN   |  ¡ dkr| | j|  ddd¡ ¡ |  ¡ }|  |¡}| |¡ |t|ƒ S )Nr   ÚHLé*   r%   )rk  Úwriter¸   r  r  rÖ   )rx   ra  rz  rƒ  r0   r0   r4   Úsave…  s   

zImageFileDirectory_v2.save)r³   NNr*  rI   )2r¬   r­   r®   r¯   rz   r±   r^   rz  rÈ   Úsetterr¾   rÎ   rÔ   rØ   râ   rå   rè   rç   r  r  r¿   r  r  r"  r-  ÚlistÚmapr   rÿ   r  ÚSIGNED_BYTEr   r  ÚFLOATr  ÚIFDr7  r:  r>  r?  rR  rW  rX  rY  r[  r]  rc  r{  r  r‹  r0   r0   r0   r4   r²   ¥  sz    
<
P







øþÿ




	
7Lr²   r  r  r  Úwrite_c                       s€   e Zd ZU dZ‡ fdd„Zedd„ ƒZedd„ ƒZee	d< 	 e
dd	„ ƒZd
d„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Z‡  ZS )ÚImageFileDirectory_v1aþ  This class represents the **legacy** interface to a TIFF tag directory.

    Exposes a dictionary interface of the tags in the directory::

        ifd = ImageFileDirectory_v1()
        ifd[key] = 'Some Data'
        ifd.tagtype[key] = TiffTags.ASCII
        print(ifd[key])
        ('Some Data',)

    Also contains a dictionary of tag types as read from the tiff image file,
    :attr:`~PIL.TiffImagePlugin.ImageFileDirectory_v1.tagtype`.

    Values are returned as a tuple.

    ..  deprecated:: 3.0.0
    c                    s   t ƒ j|i |¤Ž d| _d S )NT)Úsuperrz   rÁ   )rx   r�   Úkwargs©Ú	__class__r0   r4   rz   ®  s   
zImageFileDirectory_v1.__init__c                 C   r{   rj   )rÉ   rƒ   r0   r0   r4   rÃ   ²  rÄ   zImageFileDirectory_v1.<lambda>c                 C   r{   rj   )rË   rƒ   r0   r0   r4   rÃ   ³  rÄ   r½   c                 C   s(   | |j d�}|j|_|j|_|j|_|S )a2  Returns an
        :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1`
        instance with the same data as is contained in the original
        :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v2`
        instance.

        :returns: :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1`

        r]   )r^   rË   r½   rÀ   )ÚclsÚoriginalr|  r0   r0   r4   Úfrom_v2¹  s
   zImageFileDirectory_v1.from_v2c                 C   s4   t | jd�}t| jƒ|_t| jƒ|_t| jƒ|_|S )a2  Returns an
        :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v2`
        instance with the same data as is contained in the original
        :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1`
        instance.

        :returns: :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v2`

        r]   )r²   r^   rÍ   rË   r½   rÊ   )rx   r|  r0   r0   r4   Úto_v2Ë  s
   zImageFileDirectory_v1.to_v2c                 C   rã   rj   )rÉ   rË   rä   r0   r0   r4   rå   Ü  ræ   z"ImageFileDirectory_v1.__contains__c                 C   rÕ   rj   )rÖ   r×   rË   rÉ   rƒ   r0   r0   r4   rØ   ß  rÙ   zImageFileDirectory_v1.__len__c                 C   rÕ   rj   )r  r×   rË   rÉ   rƒ   r0   r0   r4   r  â  rÙ   zImageFileDirectory_v1.__iter__c                 C   s   dD ]	}|   |||¡ qd S ©N)FT)rç   )rx   rÝ   ry   rÈ   r0   r0   r4   rè   å  s   ÿz!ImageFileDirectory_v1.__setitem__c                 C   sn   || j vr&| j| }| j| }| j| \}}dD ]}|  ||| ||ƒ|¡ q| j | }t|ttfƒs5|f}|S rœ  )rÉ   rË   r½   rÚ   rç   rv   rÛ   rÜ   )rx   rÝ   rÞ   rß   rà   rá   Úlegacyre   r0   r0   r4   râ   é  s   



z!ImageFileDirectory_v1.__getitem__)r¬   r­   r®   r¯   rz   r±   ÚtagsÚtagdatarÍ   Ú__annotations__Úclassmethodrš  r›  rå   rØ   r  rè   râ   Ú__classcell__r0   r0   r–  r4   r“  ›  s   
 
r“  c                       sŠ   e Zd ZdZdZdZd‡ fdd„	Zdd„ Zed	d
„ ƒZ	dd„ Z
dd„ Zdd„ Zdd„ Z‡ fdd„Zdd„ Zdd„ Zdd„ Zdd„ Z‡  ZS )ÚTiffImageFileÚTIFFz
Adobe TIFFFNc                    s"   d | _ 	 d | _	 tƒ  ||¡ d S rj   )Útag_v2rÝ   r”  rz   )rx   ra  Úfilenamer–  r0   r4   rz     s
   zTiffImageFile.__init__c                 C   s„   | j  d¡}t|ƒ| _d| _| jj | _| _d| _| j | _	g | _
d| _t d¡ t d| j› �¡ t dt|ƒ› �¡ |  d¡ dS )z#Open the first image in a TIFF filer%   Nra   z*** TiffImageFile._open ***z- __first: z- ifh: r   )ra  r_  r²   r¥  r|  rÀ   Ú_TiffImageFile__firstÚ_TiffImageFile__nextÚ_TiffImageFile__frameÚ_TiffImageFile__fpÚ
_frame_posÚ	_n_framesro  rp  r·   Ú_seek)rx   rÂ   r0   r0   r4   Ú_open  s   

zTiffImageFile._openc                 C   sX   | j d u r)|  ¡ }|  t| jƒ¡ | j d u r$|  |  ¡ d ¡ | j d u s|  |¡ | j S )Nr   )r¬  rk  r­  rÖ   r«  rq  )rx   Úcurrentr0   r0   r4   Ún_frames&  s   


ÿ
zTiffImageFile.n_framesc                 C   s<   |   |¡sdS |  |¡ t | j¡ tj | j| j¡| _dS )z%Select a given frame as current imageN)	Ú_seek_checkr­  r   Ú_decompression_bomb_checkrà   ÚcoreÚnewÚmodeÚim©rx   Úframer0   r0   r4   rq  0  s
   

zTiffImageFile.seekc                 C   sH  | j | _| j ¡  t| jƒ|kr�| jstdƒ‚t d|› d| j	› d| j› d| j ¡ › �¡ | j 
| j¡ | j | j¡ t d| j ¡  ¡ | j | j¡ | jj| jv rWd| _n| jj| _| jdkrf|d | _t| jƒdkrs| jdk| _|  j	d7  _	t| jƒ|ks| j 
| j| ¡ | j | j¡ t | j¡ | _| _|| _	|  ¡  d S )	Nzno more images in TIFF filezSeeking to frame z, on frame z	, __next z, location: zLoading tags, location: %sr   r   )rª  ra  rk  rÖ   r«  r¨  ÚEOFErrorro  rp  r©  rq  r€  r¥  r{  rÀ   r¬  Úis_animatedr“  rš  rÝ   r|  Ú_setupr·  r0   r0   r4   r­  ;  s<   
ÿÿÿ


ëzTiffImageFile._seekc                 C   r{   )zReturn the current frame number)r©  rƒ   r0   r0   r4   rk  _  r~   zTiffImageFile.tellc                 C   s   d| j v r|  | j d ¡S i S )z˜
        Returns a dictionary containing the XMP tags.
        Requires defusedxml to be installed.
        :returns: XMP tags in a dictionary.
        r   )r¥  Ú_getxmprƒ   r0   r0   r4   Úgetxmpc  s   zTiffImageFile.getxmpc                    s   | j r
| jr
|  ¡ S tƒ  ¡ S rj   )ÚtileÚuse_load_libtiffÚ_load_libtiffr”  r{  rƒ   r–  r0   r4   r{  k  s   
zTiffImageFile.loadc                 C   sš   | j r(tjtjtjtjtjtjtjdœ 	| j ¡}|d ur(| j
 |¡| _
| j
j| _| jsId| _| j ¡  |  ¡ }tj ¡ D ]}||vrCq<| |¡ q<d S d S )N)r   r   r   r   r!   r#   r%   T)Ú_tile_orientationr   ÚFLIP_LEFT_RIGHTÚ
ROTATE_180ÚFLIP_TOP_BOTTOMÚ	TRANSPOSEÚ
ROTATE_270Ú
TRANSVERSEÚ	ROTATE_90rm  r¶  Ú	transposerà   Ú_sizerº  Ú!_close_exclusive_fp_after_loadingra  rk  Úgetexifr   ÚTAGS_V2_GROUPSÚkeysÚget_ifd)rx   ÚmethodÚexifÚkeyr0   r0   r4   Úload_endp  s0   ùø	

ô	zTiffImageFile.load_endc           	   
   C   sÈ  t j  | ¡ |  ¡  t| jƒdkstdƒ‚| jd d }t| jd d ƒ}zt| jdƒo3t	 
| j ¡ ¡}t| jdƒr?| j ¡  W n tyK   d}Y nw |rR||d< t  | jd	t|ƒ| j¡}z	| | j|¡ W n tyx } ztd
ƒ|‚d}~ww | jo| j }t| jdƒr–t d¡ | | j ¡ ¡\}}n,|r­t d¡ |s¥| j d¡ | d¡\}}nt d¡ | j d¡ | | j ¡ ¡\}}g | _d| _|  ¡  |rÖ| j ¡  d| _|dk rÞt|ƒ‚t j  | ¡S )zWOverload method triggered when we detect a compressed tiff
        Calls out to libtiffr   zNot exactly one tiler   r   ÚfilenoÚflushFr   ÚlibtiffzCouldn't set the imageNÚgetvaluez5have getvalue. just sending in a string from getvaluez3have fileno, calling fileno version of the decoder.s   fpfpz+don't have fileno or getvalue. just reading)r   r{  Úload_preparerÖ   r¾  r`  r�  Úhasattrra  ÚosÚduprÔ  rÕ  Ú_getdecoderrµ  rÛ   ÚdecoderconfigÚsetimager¶  r  Ú_exclusive_fprº  ro  rp  r=  r×  rq  r_  ÚreadonlyrÓ  Úclose)	rx   Úextentsr�   ra  ÚdecoderÚeÚclose_self_fpÚnÚerrr0   r0   r4   rÀ  �  s\   
€ýÿ
€ÿ




zTiffImageFile._load_libtiffc              
   C   sÐ  d| j v r	tdƒ‚t| j  td¡ | _| j  td¡| _| j  td¡}| jdkr)d}| j  t	d¡}t
 d¡ t
 d| j› �¡ t
 d	|› �¡ t
 d
| j› �¡ t
 d|› �¡ t
 d| j d¡› �¡ t| j  t¡ƒ}t| j  t¡ƒ}||f| _t
 d| j› �¡ | j  td¡}t|ƒdkr t|ƒt|ƒ  krœdkr n nd}| j  td¡}| j  td¡}|dv rµd}n	|dkr¼d}nd}|t|ƒ7 }|t|ƒkrÔt|ƒdkrÔ|| }| j  t| jdkrã|dv rãdnd¡}	t|ƒ|	krðtdƒ‚| j j|||||f}
t
 d|
› �¡ z	t|
 \| _}W n t�y" } z
t
 d¡ tdƒ|‚d}~ww t
 d|› �¡ t
 d| j› �¡ | j| jd< | j  td¡}| j  t d¡}|�r�|�r�| j  t!¡}|dk�ra||f| jd< n,|dk�rr|d  |d  f| jd< n|du �r†||f| jd< ||f| jd!< n||f| jd!< d } }}g | _"t#�p�| jd"k| _$| j$�r|dk�rÅ|
dd… d |
dd…  }
t
 d|
› �¡ t|
 \| _}|d#k�rÌd$}d%|v �r×| %d%d&¡}d'|v �râ| %d'd&¡}|dk�rõ| jd(k�rõ| jdk�rõd)}|| jd*| j j&f}| j" 'd+dd||fd|f¡ nªt(| j v �st)| j v �r®t(| j v �r1| j t( }| j  t*|¡}| jd }n| j t) }| j  d,¡}| j  d-¡}|D ]h}|| |k�rV|t+|ƒ d. }nd}|}| jdk�rh|| }|| }|t|ƒdf}| j" '| j||t|| |ƒt|| |ƒf||f¡ || }|| jd k�r«d|| }}|| jd k�r«d }}|d7 }�qDn	t
 d/¡ tdƒ‚t,| j v �rÅ| j t, | jd0< | jd1v �rßd2d3„ | j t- D ƒ}t. /d4d5 0|¡¡| _1| j  d6¡| _2dS )7z-Setup this image object based on current tagsi¼  z+Windows Media Photo files not yet supportedr   r   r"   r!   z*** Summary ***z- compression: z- photometric_interpretation: z- planar_configuration: z- fill_order: z- YCbCr subsampling: r   z- size: r6   r0   )r   r!   r%   r   r   r   )r   r!   zunknown data organizationzformat key: z- unsupported formatzunknown pixel modeNz- raw mode: z- pil mode: Úcompressionr   ÚdpigR¸…ëQ@Ú
resolutionr   r:   úI;16Nz;16Bz;16Nz;16Lr$   rG   FrÖ  r   r   r%   z- unsupported data organizationÚicc_profile©rS   rT   c                 S   s   g | ]}t |d  ƒ‘qS )r   r   )r1   r1  r0   r0   r4   rõ   ¯  s    z(TiffImageFile._setup.<locals>.<listcomp>úRGB;Lr&  i  )3r¥  r`  ÚCOMPRESSION_INFOrm  ÚCOMPRESSIONÚ_compressionÚPLANAR_CONFIGURATIONÚ_planar_configurationÚPHOTOMETRIC_INTERPRETATIONÚ	FILLORDERro  rp  rÝ   rð   Ú
IMAGEWIDTHÚIMAGELENGTHrÊ  rà   ÚSAMPLEFORMATrÖ   rn   rm   ÚBITSPERSAMPLEÚEXTRASAMPLESÚSAMPLESPERPIXELr¶   r^   Ú	OPEN_INFOrµ  rn  rù   ÚX_RESOLUTIONÚY_RESOLUTIONÚRESOLUTION_UNITr¾  ÚREAD_LIBTIFFr¿  ró   rz  r€  r~  ÚTILEOFFSETSÚROWSPERSTRIPÚsumÚ
ICCPROFILEÚCOLORMAPr
   r   r(  ÚpaletterÁ  )rx   ÚphotoÚ	fillorderÚxsizeÚysizeÚsampleFormatÚ	bps_tupleÚextra_tupleÚ	bps_countÚsamplesPerPixelrÒ  Úrawmoderä  ÚxresÚyresÚresunitÚxÚyÚlayerr}   Úoffsetsr2  Úwrz  ÚstrideÚtile_rawmoder  r0   r0   r4   r»  ä  sþ   



,þú

€þ









üÿ€å
zTiffImageFile._setupc                 C   sP   z#z| j | jkr| j  ¡  W n	 ty   Y nw W d | _ d S W d | _ d S d | _ w rj   )rª  ra  rá  ÚAttributeErrorrƒ   r0   r0   r4   Ú
_close__fp´  s   
€ÿ€
þzTiffImageFile._close__fp)NN)r¬   r­   r®   ÚformatÚformat_descriptionrË  rz   r®  r±   r°  rq  r­  rk  r½  r{  rÓ  rÀ  r»  r  r¢  r0   r0   r–  r4   r£  þ  s$    	
	$U Qr£  r7   r8   rF   rS   rT   r=   rD   r:   r>   rA   rB   rG   rJ   rH   rU   ÚYCbCrrX   rE   r<   r?   rC   )r?   rC   c           .      C   sr  zt | j \}}}}}}W n ty# }	 z
td| j› d�ƒ|	‚d }	~	ww t|d�}
| j}| j}| d| j d¡¡}|d u r@d}n|dkrGd}n|dkrMd	}t	pR|dk}t
| d
dƒ|
t< | jd |
t< | jd |
t< d|v rr|d }nd|v r‹|d }t|tƒrŠt ¡ }| |¡ |}ni }t dt|ƒ ¡ t|tƒrŸ| ¡ }|D ]1}t|tjƒr¸|tj ¡ v r¸| |¡|
|< n| |¡|
|< z
|j| |
j|< W q¡ tyÒ   Y q¡w t| dƒrøt t!t"t#t$t%fD ]}|| j&v r÷| j&| |
|< | j&j| |
j|< qà| d| j d¡¡}|�r	||
t'< t(dft!dft"dft!dft"dft dft)dft*dft+dft,dff
D ]\}}||v �r8|| |
|< �q)| d¡}|�rRd|
t < |d |
t!< |d |
t"< |dk�rh||
t-< t.|ƒdk�rht.|ƒ|
t/< |d u�rq||
t0< |dk�rz||
t1< t2|
v�r„||
t2< nF| jdv �rÊ|
t2 dk�rÊ| jdk�rÅ|  3¡ }| ¡ }t4|j5ƒD ]}t4|j6ƒD ]}|||f d k�r¸dnd |||f< �q«�q¤|} nt7 8| ¡} | jd!v �râ| j9 :d"d#¡}t;d$d%„ |D ƒƒ|
t<< t.|ƒ| jd |d  d& d'  }|�r|dk�rýdn	t=t>| | jd ƒ}|dk�rt=|d& d' d' | jd ƒ}n| jd }|dk�r'd}|dk�r.dn|| }| jd | d | }||
t?< |d(k�rLtj@|
jtA< |f|d  || jd  ||d   f |
tA< t;t4d|| |ƒƒ|
tB< tC |d¡|
tD< | jd)k�r‘tEd*tFd+i G¡ D ]\}}|
 H||¡ �q…tItJtKtLg} |�rd,|v �rÄ|d, }!t|!tMƒ�r³|!dk �s³|!d-k�r·tNd.ƒ‚|dk�rÀtNd/ƒ‚|!|
tO< t d0¡ t d1tP|
 G¡ ƒ ¡ d}"t|d2ƒ�röz| Qd¡ tR S| T¡ ¡}"W n tUjV�yõ   Y nw i }#| tFtAtBtWtXg7 } i }$|d |$t-< i }%t| d3ƒ�r| jY ¡ }%i t
| di ƒ¥|%¥}&t1|&v �r(|&t1= tZ [|
 G¡ |& G¡ ¡D ]g\}}|tj\v�rjtj]j^�sC�q2||
jv �rQ|
j| |#|< nt|tMt_t`tfƒ�s]�q2t a|¡jb}'|'�rj|'|#|< ||$v�r˜|| v�r˜t|t`ƒ�r†| cd4d5¡d6 |$|< �q2t|tdƒ�r”t_|ƒ|$|< �q2||$|< �q2t1|$v �r°t.|$t1 ƒdk�r°|$t1 d |$t1< t d7tP|$ G¡ ƒ ¡ | jd8v �rÃd9}t|$ G¡ ƒ}(|( e¡  |||"||(|#f})t f| jd:|)|¡}	|	 g| j9d;| j ¡ 	 |	 cd=¡\}*}+},|"�sù| h|,¡ |+�rýn�qé|+dk �rtd>|+› d?�ƒ‚n | D ]}|
|= �q|
 i|¡}-tj k| |dd;| j |-||dffg¡ d@|v �r7|
| _ld S d S )ANzcannot write mode z as TIFFr]   rè  r   r"   r$   r*   r&   ró  r   r   ÚtiffinforÑ  zTiffinfo Keys: %sr¥  rì  Údescriptionrê  Úx_resolutionÚy_resolutionÚresolution_unitÚsoftwareÚ	date_timeÚartistÚ	copyrightré  r   r6   )r7   r8   r7   éÿ   rí  rG   rî  c                 s   s   � | ]}|d  V  qdS )r   Nr0   rê   r0   r0   r4   rë   U  rï   z_save.<locals>.<genexpr>r#   r%   r   r  )r   r   )r   r)  é€   r)  r*  r)  Úqualityéd   zInvalid quality settingz5quality setting only supported for 'jpeg' compressionzSaving using libtiff encoderz	Items: %srÔ  rÝ   rò   ró   r;  zConverted items: %s)r<   r:   rë  rÖ  rK   Ti @  zencoder error z when writing image fileÚ_debug_multipage)mÚ	SAVE_INFOrµ  rn  r`  r²   ÚencoderinfoÚencoderconfigrm  rù   ÚWRITE_LIBTIFFrŒ   rò  rà   rö  r÷  rv   rÜ   r   ÚExifr{  ro  rp  r�  r“  r›  r   rÍ  rÎ  rÏ  r½   rÆ   rÙ  rÿ  rý  rþ  ÚIPTC_NAA_CHUNKÚPHOTOSHOP_CHUNKÚXMPr¥  r  ÚIMAGEDESCRIPTIONÚSOFTWAREÚ	DATE_TIMEÚARTISTÚ	COPYRIGHTrù  rÖ   rû  rú  rø  rô  Úcopyrl  ÚheightÚwidthr	   Úinvertr¶  Ú
getpaletterÛ   r  rm   Ú
STRIP_SIZEr  r  ÚSTRIPBYTECOUNTSr~  ÚCOMPRESSION_INFO_REVrð  ÚYCBCRSUBSAMPLINGÚREFERENCEBLACKWHITErÓ   Ú
setdefaultÚ	TILEWIDTHÚ
TILELENGTHr  ÚTILEBYTECOUNTSrð   r  ÚJPEGQUALITYr}  rq  rÚ  rÛ  rÔ  ÚioÚUnsupportedOperationÚTRANSFERFUNCTIONÚSUBIFDrÝ   Ú	itertoolsÚchainÚLIBTIFF_COREr³  Úlibtiff_support_custom_tagsrw   r‚   rÐ   rú   rô   rc   ÚsortÚ_getencoderrÞ  rŠ  r‹  r   Ú_saver-  ).r¶  ra  r¦  r  r^   r  r  ÚbitsÚextrarä  r|  r/  r0  rè  rÖ  rù   rÑ  rÒ  ÚiccrÑ   ré  Úinverted_imÚpxr  r  Úlutr  Úrows_per_stripÚstrip_byte_countsÚstrips_per_imagerÝ   ry   Ú	blocklistr+  Ú_fpÚtypesÚattsÚ
legacy_ifdÚsupplied_tagsrú   rž  r}   r3  Úsr4  rz  r0   r0   r4   rT  Þ  s¦  €ÿ



€
ÿ
ú
€ö
€





&ÿ
""
€



ÿÿþ
ý
 
ÿ

ÿû


€
ú
ÿ

ÿ

þrT  c                   @   sÖ   e Zd Zg d¢Zh d£Zd1dd„Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zejfdd„Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zd2d.d/„Zd0S )3ÚAppendingTiffWriter)r   r   r   r   r   r%   r   r   r   r   r%   r   r%   >   é  é  é	  é   r   r   Fc                 C   st   t |dƒr|| _d| _n"|| _d| _zt||rdndƒ| _W n ty-   t|dƒ| _Y nw | j ¡ | _|  ¡  d S )Nr_  FTzw+bzr+b)	rÙ  r�   Úclose_fprÑ   Úopenr`  rk  Ú	beginningÚsetup)rx   Úfnr´  r0   r0   r4   rz     s   
ÿzAppendingTiffWriter.__init__c                 C   sˆ   | j  | jtj¡ d | _d| _| j  d¡ | _}|sd| _	d S d| _	|dkr,|  
d¡ n|dkr6|  
d¡ ntd	ƒ‚|  ¡  |  ¡  d S )
Nr   r   TFrZ   rµ   rY   r´   zInvalid TIFF file header)r�   rq  rl  rÚ  ÚSEEK_SETÚwhereToWriteNewIFDOffsetÚoffsetOfNewPager_  ÚIIMMÚisFirstÚ	setEndianÚRuntimeErrorÚskipIFDsÚgoToEnd)rx   rr  r0   r0   r4   rm    s   zAppendingTiffWriter.setupc                 C   s€   | j rd S | j | j¡ | j d¡}|sd S || jkrtdƒ‚|  ¡ }|| j7 }| j | j¡ |  	|¡ | j |¡ |  
¡  d S )Nr   z1IIMM of new page doesn't match IIMM of first page)rs  r�   rq  rq  r_  rr  ru  ÚreadLongrp  Ú	writeLongÚfixIFD)rx   rr  Ú	IFDoffsetr0   r0   r4   Úfinalize2  s   


zAppendingTiffWriter.finalizec                 C   s   |   ¡  |  ¡  d S rj   )r|  rm  rƒ   r0   r0   r4   ÚnewFrameI  s   zAppendingTiffWriter.newFramec                 C   s   | S rj   r0   rƒ   r0   r0   r4   Ú	__enter__N  s   zAppendingTiffWriter.__enter__c                 C   s   | j r|  ¡  dS )NF)rj  rá  )rx   Úexc_typeÚ	exc_valueÚ	tracebackr0   r0   r4   Ú__exit__Q  s   zAppendingTiffWriter.__exit__c                 C   s   | j  ¡ | j S rj   )r�   rk  rq  rƒ   r0   r0   r4   rk  V  r`   zAppendingTiffWriter.tellc                 C   s*   |t jkr
|| j7 }| j ||¡ |  ¡ S rj   )rÚ  ro  rq  r�   rq  rk  )rx   rz  Úwhencer0   r0   r4   rq  Y  s   

zAppendingTiffWriter.seekc                 C   s^   | j  dtj¡ | j  ¡ }d|d  }d|  k rdk r'n n| j  t|ƒ¡ | j  ¡ | _d S )Nr   r;   )r�   rq  rÚ  ÚSEEK_ENDrk  rŠ  rÜ   rq  )rx   ÚposÚpadBytesr0   r0   r4   rw  `  s   
zAppendingTiffWriter.goToEndc                 C   s.   || _ | j d | _| j d | _| j d | _d S )Nr8   r.  ÚHHL)ÚendianÚlongFmtÚshortFmtÚ	tagFormat)rx   rˆ  r0   r0   r4   rt  j  s   zAppendingTiffWriter.setEndianc                 C   sP   	 |   ¡ }|dkr| j ¡ d | _d S | j |¡ |  ¡ }| j |d tj¡ q)NTr   r   r9   )rx  r�   rk  rp  rq  Ú	readShortrÚ  ÚSEEK_CUR)rx   r{  ÚnumTagsr0   r0   r4   rv  p  s   øzAppendingTiffWriter.skipIFDsc                 C   s   | j  |¡S rj   )r�   rŠ  r9  r0   r0   r4   rŠ  {  rÏ   zAppendingTiffWriter.writec                 C   ó   t  | j| j d¡¡\}|S )Nr   )r  r  rŠ  r�   r_  rÇ   r0   r0   r4   rŒ  ~  ó   zAppendingTiffWriter.readShortc                 C   r�  r[   )r  r  r‰  r�   r_  rÇ   r0   r0   r4   rx  ‚  r�  zAppendingTiffWriter.readLongc                 C   óN   | j  dtj¡ | j  t | j|¡¡}|d ur#|dkr%td|› d�ƒ‚d S d S )Néþÿÿÿr   úwrote only ú bytes but wanted 4©	r�   rq  rÚ  r�  rŠ  r  r  r‰  ru  ©rx   ry   ÚbytesWrittenr0   r0   r4   ÚrewriteLastShortToLong†  ó
   ÿz*AppendingTiffWriter.rewriteLastShortToLongc                 C   r‘  )Nr’  r   r“  ú bytes but wanted 2)	r�   rq  rÚ  r�  rŠ  r  r  rŠ  ru  r–  r0   r0   r4   ÚrewriteLastShortŒ  r™  z$AppendingTiffWriter.rewriteLastShortc                 C   r‘  )Néüÿÿÿr   r“  r”  r•  r–  r0   r0   r4   ÚrewriteLastLong’  r™  z#AppendingTiffWriter.rewriteLastLongc                 C   ó>   | j  t | j|¡¡}|d ur|dkrtd|› d�ƒ‚d S d S )Nr   r“  rš  )r�   rŠ  r  r  rŠ  ru  r–  r0   r0   r4   Ú
writeShort˜  ó   ÿzAppendingTiffWriter.writeShortc                 C   rž  )Nr   r“  r”  )r�   rŠ  r  r  r‰  ru  r–  r0   r0   r4   ry  �  r   zAppendingTiffWriter.writeLongc                 C   s   |   ¡  | j ¡  d S rj   )r|  r�   rá  rƒ   r0   r0   r4   rá  ¢  s   zAppendingTiffWriter.closec                 C   s   |   ¡ }t|ƒD ]u}t | j| j d¡¡\}}}| j| }|| }|dk}|s5|  ¡ }	|	| j	7 }	|  
|	¡ || jv rs| j ¡ }
|rV| j||dk|dkd� | j |
d ¡ n| j |	¡ | j||dk|dkd� | j |
¡ d  }	}
q|r}| j dtj¡ qd S )Nr%   r   r   )ÚisShortÚisLong)rŒ  rl  r  r  r‹  r�   r_  Ú
fieldSizesrx  rq  r�  ÚTagsrk  Ú
fixOffsetsrq  rÚ  r�  )rx   rŽ  rs  rÝ   Ú	fieldTypert  Ú	fieldSizeÚ	totalSizeÚisLocalrz  ÚcurPosr0   r0   r4   rz  ¦  s6   




ÿÿ
€âzAppendingTiffWriter.fixIFDc                 C   s®   |s|st dƒ‚t|ƒD ]H}|r|  ¡ n|  ¡ }|| j7 }|rG|dkrG|dkr+t dƒ‚|  |¡ | j dtj	¡ |  
tj¡ | j dtj	¡ q|rO|  |¡ q|  |¡ qd S )Nz offset is neither short nor longr   r   znot implementediöÿÿÿr%   )ru  rl  rŒ  rx  rq  r˜  r�   rq  rÚ  r�  rŸ  r   r  r›  r�  )rx   rt  r¡  r¢  rs  rz  r0   r0   r4   r¥  É  s    

ïzAppendingTiffWriter.fixOffsetsN)F)FF)r¬   r­   r®   r£  r¤  rz   rm  r|  r}  r~  r‚  rk  rJ  ro  rq  rw  rt  rv  rŠ  rŒ  rx  r˜  r›  r�  rŸ  ry  rá  rz  r¥  r0   r0   r0   r4   re  ó  s2    

#re  c              	   C   sþ   | j  ¡ }| j}t| dg ¡ƒ}t| dƒs|st| ||ƒS |  ¡ }zWt|ƒ�;}| g| D ]-}||_ ||_t|dƒs<d}	n|j	}	t
|	ƒD ]}
| |
¡ | ¡  t|||ƒ | ¡  qCq,W d   ƒ n1 sdw   Y  W |  |¡ d S W |  |¡ d S |  |¡ w )NÚappend_imagesr°  r   )r/  r;  r0  r�  rm  rÙ  rT  rk  re  r°  rl  rq  r{  r}  )r¶  ra  r¦  r/  r0  r«  Úcur_idxÚtfÚimsÚnfrr  r0   r0   r4   Ú	_save_allá  s2   




üøÿñr°  z.tifz.tiffz
image/tiff)drJ  rN  ÚloggingrÚ  r  r  Úcollections.abcr   Ú	fractionsr   Únumbersr   r   Ú r   r   r	   r
   r   Ú_binaryr   r   Ú	getLoggerr¬   ro  r   r1  ÚIFD_LEGACY_APIr@  r»   r¹   rö  r÷  rù  rð  rô  rõ  r6  r~  rû  r  rA  rý  rþ  rò  rÿ  rL  r7  r8  r9  Ú	PREDICTORr  rF  rG  r  rH  rM  rú  rø  Ú
JPEGTABLESrC  rD  r:  r3  r4  r  ÚEXIFIFDr5  rI  ÚIMAGEJ_META_DATA_BYTE_COUNTSÚIMAGEJ_META_DATArï  rÓ   rB  rü  r\   r_   ri   rq   rÚ   r   rc   r²   r  rÑ   ró   Úsetattrr“  ÚImageFileDirectoryr£  r.  rT  re  r°  Úregister_openr  Úregister_saveÚregister_save_allÚregister_extensionsÚregister_mimer0   r0   r0   r4   Ú<module>   sþ  (
þýüûúùø	÷
öõôóòñðïîýüûúùø	÷
öõôóòñðïîíìëêéèçæåäãâá à!ß"Þ#Ý$Ü%Û&Ú'Ù(Ø)×*Ö+Õ,Ô-Ó.Ò/Ñ0Ð1Ï2Î3Í4Ì5Ë6Ê7É8È9Ç:Æ;Å<Ä=Ã>Â?Á@ÀA¿B¾C½D¼E»FºG¹H¸I·J¶KµL´M³N²O±P°Q¯R®S­T¬U«VªW©X¨Y§Z¦[¥\¤]£^¢_¡` aŸbžc�dœe›fšg™h˜i�v   o\   Jýüûúùø	÷
öõôóòñðïîíë   o