o
    Ñ­j”1 ã                   @  s�  d dl mZ 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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mZmZmZmZmZ dd	lmZ dd
lm Z! ddl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Z0dZ1dZ2dZ3dZ4dZ5dZ6dZ7dZ8dZ9dZ:dZ;d Z<d!Z=d"Z>d#Z?d$Z@d%ZAd&ZBd'ZCd(ZDd)ZEd*ZFd+ZGd,ZHd-ZId.ZJd/ZKd0ZLd1ZMd2ZNd3ZOd4ZPd5ZQd6ZRd7ZSd8ZTd9ZUd:ZVd;ZWi dd<“d=d>“d?d@“dAdB“dCdD“dEdF“dGdH“dIdJ“dKdL“dMdN“dOdP“dQdR“dSdT“dUdV“dWdX“dYdZ“d[d\“ZXd]d^„ eX Y¡ D ƒZZi e-d d_dd_d`fda“e.d d_dd_d`fda“e-d d_d=d_d`fdb“e.d d_d=d_d`fdb“e-dd_dd_d`fdc“e.dd_dd_d`fdc“e-dd_d=d_d`fdd“e.dd_d=d_d`fdd“e-d d_dded`fdf“e.d d_dded`fdf“e-d d_d=ded`fdg“e.d d_d=ded`fdg“e-dd_dded`fdh“e.dd_dded`fdh“e-dd_d=ded`fdi“e.dd_d=ded`fdi“e-d d_ddjd`fdk“i e.d d_ddjd`fdk“e-d d_d=djd`fdl“e.d d_d=djd`fdl“e-dd_ddjd`fdm“e.dd_ddjd`fdm“e-dd_d=djd`fdn“e.dd_d=djd`fdn“e-d d_ddod`fdp“e.d d_ddod`fdp“e-d d_d=dod`fdq“e.d d_d=dod`fdq“e-dd_ddod`fdr“e.dd_ddod`fdr“e-ddeddod`fdr“e.ddeddod`fdr“e-dd_d=dod`fds“e.dd_d=dod`fds“¥i e-dd_ddtd`fdu“e-d d_ddvd`fdw“e-dd_ddvd`fdw“e.dd_ddvd`fdx“e-dd_d=dvd`fdy“e-ddeddvd`fdz“e.ddeddvd`fd{“e-d d|dd}d`fd~“e.d d|dd}d`fd“e-dd_dd}d`fd€“e-ddedd}d`fd�“e.ddedd}d`fd‚“e-dd|dd}d`fd~“e.dd|dd}d`fd“e-dd_ddƒdefd„“e.dd_ddƒdefd„“e-d=d_dd…d`fd†“¥i e.d=d_dd…d`fd†“e-d=d_d=d…d`fd‡“e.d=d_d=d…d`fd‡“e-d=d_ddˆd`fd‰“e.d=d_ddˆd`fd‰“e-d=d_ddˆdŠfd‹“e.d=d_ddˆdŠfd‹“e-d=d_ddŒd�fdŽ“e.d=d_ddŒd�fdŽ“e-d=d_dd�d�fd‘“e.d=d_dd�d�fd‘“e-d=d_ddˆd_fd’“e.d=d_ddˆd_fd’“e-d=d_ddŒd“fd”“e.d=d_ddŒd“fd”“e-d=d_dd�d•fd–“e.d=d_dd�d•fd–“¥i e-d=d_ddˆdefd‰“e.d=d_ddˆdefd‰“e-d=d_ddŒd—fd˜“e.d=d_ddŒd—fd˜“e-d=d_dd�d™fdš“e.d=d_dd�d™fdš“e-d=d_ddˆd›fd‰“e.d=d_ddˆd›fd‰“e-d=d_ddœd`fd�“e.d=d_ddœd`fdž“e-d=d_ddŸd`fd “e.d=d_ddŸd`fd¡“e-d=d_ddŸdŠfd¢“e.d=d_ddŸdŠfd£“e-d=d_ddŸd_fd¤“e.d=d_ddŸd_fd¥“e-d=d_ddŸdefd “¥i e.d=d_ddŸdefd¡“e-d?d_dd_d`fd¦“e.d?d_dd_d`fd¦“e-d?d_d=d_d`fd§“e.d?d_d=d_d`fd§“e-d?d_dded`fd¨“e.d?d_dded`fd¨“e-d?d_d=ded`fd©“e.d?d_d=ded`fd©“e-d?d_ddjd`fdª“e.d?d_ddjd`fdª“e-d?d_d=djd`fd«“e.d?d_d=djd`fd«“e-d?d_ddod`fd¬“e.d?d_ddod`fd¬“e-d?d_ddƒdŠfd­“e-d?d_ddƒdefd®“¥i e.d?d_ddƒdefd®“e-d?d_d=dod`fd¯“e.d?d_d=dod`fd¯“e-dCd_ddˆd`fd°“e.dCd_ddˆd`fd°“e-dCd_ddŒdŠfd±“e.dCd_ddŒdŠfd±“e-dCd_dd�d�fd²“e.dCd_dd�d�fd²“e-dCd_ddŸd`fd³“e-dEd_ddod`fdr“e.dEd_ddod`fdr“e-dEd_dd…d`fd‹“e.dEd_dd…d`fd‹“e-dId_dd…d`fd´“e.dId_dd…d`fd´“¥Z[e\dµd¶„ e[D ƒƒZ]g d·¢Z^e_ej`d¸dƒ�sae$d¹dºƒ dÿd¿dÀ„ZadÁdÂ„ ZbdÃdÄ„ Zci Zdi ZedÅdÆ„ ZfG dÇdÈ„ dÈeƒZgdÉdÊ„ ZhdËdÌ„ ZidÍdÎ„ Zje�r”e
ekef Zlne
ZlG dÏdÐ„ dÐelƒZmedem_deeem_ee% Y¡ D ]#\ZnZoeo pdÑdÒ¡ZoeqemdÓeo› �eden d ƒ eqemdÔeo› �eeen ƒ �q¨[d[e[n[oG dÕdÖ„ dÖemƒZrerZsG d×dØ„ dØejƒZti dÙdÙe-ddd_df“dÚdÚe-dddodf“dÛdÛe-dddƒd=f“dÜdÜe-d?ddodf“dÝdÝe-d?ddƒd=f“dÞdße-dd=d}df“dàdàe-dddvdf“dádáe-dd=dvdf“dâdãe-dd?d}df“dädäe-d=dd…df“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-dEdd…df“dédée-dIdd…df“dêdêe.dd=d}df“dëdëe.dddvdf“dìe.dd=dvdfdíe.dd?d}dfdîœ¥Zudïdð„ ZvG dñdò„ dòƒZw�d dúdû„Zxe yetjzetea¡ e {etjzev¡ e |etjzex¡ e }etjzdüdýg¡ e ~etjzdþ¡ dS (  é    )ÚannotationsN)ÚMutableMapping)ÚFraction)ÚNumberÚRational)ÚIOÚTYPE_CHECKINGÚAnyÚCallableÚNoReturné   )ÚExifTagsÚImageÚ	ImageFileÚImageOpsÚImagePaletteÚTiffTags)Úi16be)Úi32be©Úo8)Ú	deprecate©ÚTYPESFTé   s   IIs   MMéÿ   é   i  i  i  i  i
  i  é  i  i  i  i  i  i  i(  i-  i1  i2  i;  i=  i@  iB  iC  éD  iE  iJ  iR  iS  i[  i  i  i˜‚  i»ƒ  iI†  is‡  ii‡  i¼  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 © r7   )Ú.0ÚkÚvr7   r7   úP/var/www/html/CropPilot/venv/lib/python3.10/site-packages/PIL/TiffImagePlugin.pyÚ
<dictcomp>�   s    r<   ©r   r7   )Ú1z1;I)r>   z1;IR)r>   r>   )r>   z1;R)r    )ÚLzL;2I)r?   zL;2IR)r?   zL;2)r?   zL;2R)r$   )r?   zL;4I)r?   zL;4IR)r?   zL;4)r?   zL;4R)r,   )r?   zL;I)r?   zL;IR)r?   r?   )r?   zL;R)é   )úI;16zI;12)é   )rA   rA   )úI;16BrC   )rA   zI;16R)ÚIúI;16S)rD   úI;16BS)r"   )é    )ÚFúF;32F)rH   úF;32BF)rD   zI;32N)rD   úI;32S)rD   úI;32BS)r,   r,   )ÚLArM   )r,   r,   r,   )ÚRGBrN   )rN   zRGB;R)r,   r,   r,   r,   )ÚRGBArO   ©r   )rN   ÚRGBX)r,   r,   r,   r,   r,   ©r   r   )rN   ÚRGBXX)r,   r,   r,   r,   r,   r,   )r   r   r   )rN   ÚRGBXXX)rO   ÚRGBa)r   r   )rO   ÚRGBaX)r   r   r   )rO   ÚRGBaXX)r    r   )rO   ÚRGBAX)r    r   r   )rO   ÚRGBAXX)iç  )rB   rB   rB   )rN   zRGB;16L)rN   zRGB;16B)rB   rB   rB   rB   )rO   zRGBA;16L)rO   zRGBA;16B)rN   zRGBX;16L)rN   zRGBX;16B)rO   zRGBa;16L)rO   zRGBa;16B)ÚPzP;1)rZ   zP;1R)rZ   zP;2)rZ   zP;2R)rZ   zP;4)rZ   zP;4R)rZ   rZ   )rZ   ÚPX)ÚPAr\   )rZ   zP;R)ÚCMYKr]   )r]   ÚCMYKX)r]   ÚCMYKXX)r]   zCMYK;16L)ÚLABr`   c                 c  s   � | ]	}t |d  ƒV  qdS )r$   N)Úlen)r8   Úkey_tpr7   r7   r;   Ú	<genexpr>  ó   € rc   )ó   MM *ó   II* s   MM* s   II *s   MM +s   II+ Úlibtiff_support_custom_tagsz*Support for LibTIFF earlier than version 4r@   ÚprefixÚbytesÚreturnÚboolc                 C  s   | d d… t v S ©Nr$   )ÚPREFIXES©rh   r7   r7   r;   Ú_accept  ó   ro   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_dr7   r7   r;   Ú_limit_rational!  s   ry   c                 C  sP   t | ƒ}|j|jf}t|ƒ|k rt| t|ƒƒ}t|ƒ|kr&t |Ž } t| |ƒ}|S ©N)r   Ú	numeratorÚdenominatorÚminry   rr   Úmax)ru   rv   Úmin_valÚfracrx   r7   r7   r;   Ú_limit_signed_rational'  s   
r�   c                   ó   ‡ fdd„}|S )Nc                   s   t | jˆ ƒ|Ž S rz   )ÚgetattrÚ_val©ÚselfÚargs©Úopr7   r;   Údelegate=  rp   z_delegate.<locals>.delegater7   )r‰   rŠ   r7   rˆ   r;   Ú	_delegate<  s   r‹   c                   @  sV  e Zd ZdZ	 dZd8dd„Zedd„ ƒZedd	„ ƒZd
d„ Z	d9dd„Z
d:dd„Zd;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d0ƒZ$ed1ƒZ%ed2ƒZ&ed3ƒZ'ed4ƒZ(ed5ƒZ)e*e+d6ƒr©ed6ƒZ,d7S d7S )<rs   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Ú_denominatorr„   r   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   )	Ú
isinstancers   r{   rŒ   r|   r�   r„   r   Úfloat)r†   Úvaluer|   r7   r7   r;   Ú__init__Q  s   


zIFDRational.__init__c                 C  ó   | j S rz   )rŒ   ©r†   r7   r7   r;   r{   k  ó   zIFDRational.numeratorc                 C  r“   rz   )r�   r”   r7   r7   r;   r|   o  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   )r|   r{   r„   Úlimit_denominator)r†   Úmax_denominatorÚfr7   r7   r;   rt   s  s   
zIFDRational.limit_rationalrj   Ústrc                 C  s   t t| jƒƒS rz   )r™   r�   r„   r”   r7   r7   r;   Ú__repr__€  s   zIFDRational.__repr__Úintc                 C  s
   | j  ¡ S rz   )r„   Ú__hash__r”   r7   r7   r;   rœ   ƒ  s   
zIFDRational.__hash__ÚotherÚobjectrk   c                 C  s0   | j }t|tƒr|j }t|tƒrt|ƒ}||kS rz   )r„   r�   rs   r�   )r†   r�   ru   r7   r7   r;   Ú__eq__†  s   

zIFDRational.__eq__c                 C  s   | j | j| jgS rz   )r„   rŒ   r�   r”   r7   r7   r;   Ú__getstate__Ž  rp   zIFDRational.__getstate__c                 C  s,   t  | d¡ |\}}}|| _|| _|| _d S )Nr   )rs   r’   r„   rŒ   r�   )r†   Ústater„   rŒ   r�   r7   r7   r;   Ú__setstate__‘  s
   

zIFDRational.__setstate__Ú__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__Ú__int__Nr=   ©rj   r™   ©rj   r›   )r�   rž   rj   rk   )-Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú	__slots__r’   Úpropertyr{   r|   rt   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¼   Úhasattrr   r½   r7   r7   r7   r;   rs   C  sZ    






ÿrs   c                   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À   Ú
startswithÚreplaceÚ_load_dispatch)Úfuncr   ©ÚidxÚsizer7   r;   Ú	decoratorÀ  s
   z#_register_loader.<locals>.decoratorr7   )rÏ   rÐ   rÑ   r7   rÎ   r;   Ú_register_loader¿  s   rÒ   c                   r‚   )Nc                   s   | t ˆ < | S rz   )Ú_write_dispatch)rÍ   ©rÏ   r7   r;   rÑ   Ì  s   z#_register_writer.<locals>.decoratorr7   )rÏ   rÑ   r7   rÔ   r;   Ú_register_writerË  s   rÕ   c                   sZ   ddl m} | \}‰ }|||< t dˆ › �¡‰ˆd‡ ‡fdd„	ft|< ‡ fdd„t|< d S )	Nr   r   ú=Tc                   s   |   t|ƒˆ › ˆ › �|¡S rz   )Ú_unpackra   ©r†   ÚdataÚ
legacy_api©ÚfmtrÐ   r7   r;   Ú<lambda>Û  s   z!_register_basic.<locals>.<lambda>c                   s   d  ‡‡ fdd„|D ƒ¡S )Nó    c                 3  s   � | ]	}ˆ  ˆ |¡V  qd S rz   )Ú_pack©r8   r‘   )rÜ   r†   r7   r;   rc   à  rd   z4_register_basic.<locals>.<lambda>.<locals>.<genexpr>©Újoin©r†   Úvalues)rÜ   r”   r;   rÝ   ß  s   ©T)r   r   ÚstructÚcalcsizerÌ   rÓ   )Úidx_fmt_namer   rÏ   Únamer7   rÛ   r;   Ú_register_basicÓ  s   
þrê   c                   @  s  e Zd ZU dZi Zded< i Zded< 			djdkdd„Zedd„ ƒZ	edd„ ƒZ
edldd„ƒZejdmdd„ƒZdndd„Zdodd„Zd d!„ Zdpd#d$„Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zdqd.d/„Zd0d1„ Zd2d3„ Zd4d5„ Zeeeejd6d7fejd8d9fejd:d;fej d<d=fej!d>d?fej"d@dAfej#dBdCfej$d8d9fej%dDdEfg	ƒƒ e&dFdFƒdrdHdI„ƒZ'e(dFƒdJdK„ ƒZ)e&dLdFƒdrdMdN„ƒZ*e(dLƒdOdP„ ƒZ+e&dQdRƒdrdSdT„ƒZ,e(dQƒdUdV„ ƒZ-e&dWdFƒdrdXdY„ƒZ.e(dWƒdZd[„ ƒZ/e&d\dRƒdrd]d^„ƒZ0e(d\ƒd_d`„ ƒZ1dadb„ Z2dcdd„ Z3dsdfdg„Z4dhdi„ Z5dS )tÚ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``.

    z>dict[int, Callable[[ImageFileDirectory_v2, bytes, bool], Any]]rÌ   zdict[int, Callable[..., Any]]rÓ   ó   II*     NÚifhri   rh   úbytes | NoneÚgroupú
int | Nonerj   ÚNonec                 C  sÊ   t |ƒsdt|ƒ› d�}t|ƒ‚|dur|n|dd… | _| jtkr&d| _n| jtkr/d| _nd}t|ƒ‚|d dk| _|| _i | _		 |  
¡  | jrT|  d	|d
d… ¡n	|  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.
        znot a TIFF file (header z not valid)Nr    ú>ú<znot a TIFF IFDé+   ÚQr,   r?   r$   F)ro   ÚreprÚSyntaxErrorÚ_prefixÚMMÚ_endianÚIIÚ_bigtiffrï   ÚtagtypeÚresetr×   ÚnextÚ_legacy_api)r†   rí   rh   rï   Úmsgr7   r7   r;   r’   *  s$   

,ÿ
zImageFileDirectory_v2.__init__c                 C  r“   rz   )rø   r”   r7   r7   r;   rÝ   O  ó    zImageFileDirectory_v2.<lambda>c                 C  r“   rz   )Ú_offsetr”   r7   r7   r;   rÝ   P  r  rk   c                 C  r“   rz   )r   r”   r7   r7   r;   rÚ   R  r•   z ImageFileDirectory_v2.legacy_apir‘   r   c                 C  s   d}t |ƒ‚)Nz"Not allowing setting of legacy api)Ú	Exception)r†   r‘   r  r7   r7   r;   rÚ   V  s   c                 C  s(   i | _ i | _i | _i | _d | _d | _d S rz   )Ú_tags_v1Ú_tags_v2Ú_tagdatarý   Ú_nextr  r”   r7   r7   r;   rþ   [  s   
zImageFileDirectory_v2.resetr™   c                 C  s   t t| ƒƒS rz   )r™   Údictr”   r7   r7   r;   Ú__str__c  ó   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 r7   )r   Úlookuprï   ré   )r8   Úcoder‘   r”   r7   r;   r<   l  s    ÿÿz/ImageFileDirectory_v2.named.<locals>.<dictcomp>)Úitemsr”   r7   r”   r;   Únamedf  s   
þzImageFileDirectory_v2.namedr›   c                 C  ó   t t| jƒt| jƒB ƒS rz   )ra   Úsetr  r  r”   r7   r7   r;   Ú__len__q  ó   zImageFileDirectory_v2.__len__c                 C  sf   || j vr| j| }| j| }| j| \}}|| || jƒ| |< | j | }| jr1t|ttfƒs1|f}|S rz   )r  r  rý   rÌ   rÚ   r�   Útupleri   )r†   ÚtagrÙ   ÚtyprÐ   Úhandlerru   r7   r7   r;   Ú__getitem__t  s   



z!ImageFileDirectory_v2.__getitem__c                 C  ó   || j v p	|| jv S rz   )r  r  ©r†   r  r7   r7   r;   Ú__contains__  ó   z"ImageFileDirectory_v2.__contains__c                 C  s   |   ||| j¡ d S rz   )Ú_setitemrÚ   )r†   r  r‘   r7   r7   r;   Ú__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 rz   )r�   rs   ©r8   r:   r7   r7   r;   rc   �  ó   € z1ImageFileDirectory_v2._setitem.<locals>.<genexpr>c                 s  ó   � | ]}|d kV  qdS ©r   Nr7   r   r7   r7   r;   rc   “  ó   € c                 s  r  rz   )r�   r›   r   r7   r7   r;   rc   –  r!  c                 s  s(   � | ]}d |  kodk n  V  qdS )r   r   Nr7   r   r7   r7   r;   rc   —  ó   €& c                 s  s(   � | ]}d |  k odk n  V  qdS )i €ÿÿi €  Nr7   r   r7   r7   r;   rc   ™  r%  c                 s  r"  r#  r7   r   r7   r7   r;   rc   ž  r$  c                 s  r  rz   )r�   r�   r   r7   r7   r;   rc   ¡  r!  c                 s  r  rz   )r�   r™   r   r7   r7   r;   rc   £  r!  c                 s  r  rz   )r�   ri   r   r7   r7   r;   rc   ¥  r!  c                 S  s&   g | ]}t |tƒr| d d¡n|‘qS )ÚasciirË   )r�   r™   Úencoder   r7   r7   r;   Ú
<listcomp>©  s    ÿÿz2ImageFileDirectory_v2._setitem.<locals>.<listcomp>c                 S  s"   g | ]}t |tƒrt|ƒn|‘qS r7   )r�   r›   r�   r   r7   r7   r;   r(  ®  s   " c                 3  s   � | ]}ˆ   |¡V  qd S rz   )Úcvt_enumrà   ©Úinfor7   r;   rc   ²  r!  r   zMetadata Warning, tag z had too many entries: z, expected 1r   )r   ri   r™   r   r  rï   r�   rý   ÚtypeÚ	UNDEFINEDÚallÚRATIONALÚSIGNED_RATIONALÚSHORTÚSIGNED_SHORTÚLONGÚSIGNED_LONGÚDOUBLEÚASCIIÚBYTEr	  r  r  r  Úlengthra   Ú
ValueErrorÚwarningsÚwarn)r†   r  r‘   rÚ   Ú	basetypesrä   Úis_ifdÚdestr7   r*  r;   r  …  sr   

ÿ
ýÿ
ýþ þÿÿúzImageFileDirectory_v2._setitemr  c                 C  s.   | j  |d ¡ | j |d ¡ | j |d ¡ d S rz   )r  Úpopr  r  r  r7   r7   r;   Ú__delitem__Õ  s   z!ImageFileDirectory_v2.__delitem__c                 C  r  rz   )Úiterr  r  r  r”   r7   r7   r;   Ú__iter__Ú  r  zImageFileDirectory_v2.__iter__c                 C  s   t  | j| |¡S rz   )ræ   Úunpackrú   )r†   rÜ   rÙ   r7   r7   r;   r×   Ý  s   zImageFileDirectory_v2._unpackc                 G  s   t j| j| g|¢R Ž S rz   )ræ   Úpackrú   )r†   rÜ   rä   r7   r7   r;   rß   à  r  zImageFileDirectory_v2._packÚHÚshortr?   ÚlongÚbzsigned byteÚhzsigned shortÚlzsigned longr˜   r�   ÚdÚdoublerõ   Úlong8r   Tc                 C  ó   |S rz   r7   rØ   r7   r7   r;   Ú	load_byteô  ó   zImageFileDirectory_v2.load_bytec                 C  s*   t |tƒr	t|ƒ}t |tƒrt|fƒ}|S rz   )r�   rs   r›   ri   ©r†   rÙ   r7   r7   r;   Ú
write_byteø  s
   


z ImageFileDirectory_v2.write_byter    c                 C  s"   |  d¡r|d d… }| dd¡S )Nó    rq   zlatin-1rË   )ÚendswithÚdecoderØ   r7   r7   r;   Úload_string   s   
z!ImageFileDirectory_v2.load_stringc                 C  s0   t |tƒr	t|ƒ}t |tƒs| dd¡}|d S )Nr&  rË   rS  )r�   r›   r™   ri   r'  ©r†   r‘   r7   r7   r;   Ú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$   r?   c                   ó   ˆ r| |fS t | |ƒS rz   ©rs   ©ÚarH  ©rÚ   r7   r;   Úcombine  ó   z4ImageFileDirectory_v2.load_rational.<locals>.combinec                 3  ó   � | ]
\}}ˆ ||ƒV  qd S rz   r7   ©r8   ÚnumÚdenom©r_  r7   r;   rc     ó   € z6ImageFileDirectory_v2.load_rational.<locals>.<genexpr>r    r   ©r×   ra   r  Úzip©r†   rÙ   rÚ   Úvalsr7   ©r_  rÚ   r;   Ú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ß   ry   ©r8   r€   r”   r7   r;   rc     s   € 
ÿz7ImageFileDirectory_v2.write_rational.<locals>.<genexpr>rá   rã   r7   r”   r;   Úwrite_rational  s   ÿz$ImageFileDirectory_v2.write_rationalr*   c                 C  rN  rz   r7   rØ   r7   r7   r;   Úload_undefined  rP  z$ImageFileDirectory_v2.load_undefinedc                 C  s0   t |tƒr	t|ƒ}t |tƒrt|ƒ dd¡}|S )Nr&  rË   )r�   rs   r›   r™   r'  rW  r7   r7   r;   Úwrite_undefined"  s
   

z%ImageFileDirectory_v2.write_undefinedé
   c                   rY  )	Nr$   rJ  c                   rZ  rz   r[  r\  r^  r7   r;   r_  .  r`  z;ImageFileDirectory_v2.load_signed_rational.<locals>.combinec                 3  ra  rz   r7   rb  re  r7   r;   rc   1  rf  z=ImageFileDirectory_v2.load_signed_rational.<locals>.<genexpr>r    r   rg  ri  r7   rk  r;   Úload_signed_rational*  rm  z*ImageFileDirectory_v2.load_signed_rationalc                   rn  )NrÞ   c                 3  s*   � | ]}ˆ j d gt|ddƒ¢R Ž V  qdS )Ú2liÿÿÿi   €N)rß   r�   rp  r”   r7   r;   rc   5  s
   € ÿ
ÿz>ImageFileDirectory_v2.write_signed_rational.<locals>.<genexpr>rá   rã   r7   r”   r;   Úwrite_signed_rational3  s   þz+ImageFileDirectory_v2.write_signed_rationalc                 C  s8   |  |¡}t|ƒ|krd|› dt|ƒ› d�}t|ƒ‚|S )Nz&Corrupt EXIF data.  Expecting to read ú bytes but only got z. )Úreadra   ÚOSError)r†   ÚfprÐ   Úretr  r7   r7   r;   Ú_ensure_read:  s   
ÿÿÿz"ImageFileDirectory_v2._ensure_readc              
   C  sl  |   ¡  | ¡ | _�z| jr|  d|  |d¡¡n	|  d|  |d¡¡d }t|ƒD ]Õ}| jr7|  d|  |d¡¡n	|  d|  |d	¡¡\}}}}t || j	¡j
}t |d
¡}	d|› d|› d|	› d|› d�	}
z	| j| \}}W n ty{   t d|
|¡ Y q(w || }|| jr†dndkr´| ¡ }|  | jr”dn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(| j�r|  d|  |d¡¡n	|  d|  |d¡¡\| _W d S  t�y5 }
 zt t|
ƒ¡ W Y d }
~
d S d }
~
ww )Nrõ   r,   rE  r    r   ÚHHQ8sé   ÚHHL4sr@   Úunknownztag: ú (ú
) - type: ú)z%s - unsupported type %sr$   r?   z Tag Location: z - Data Location: z/Possibly corrupt EXIF data.  Expecting to read rx  z. Skipping tag ú
 - value: rG   ú<table: %d bytes>)rþ   Útellr  rü   r×   r}  Úranger   r  rï   ré   r   ÚgetrÌ   ÚKeyErrorÚloggerÚdebugÚseekr   Ú
_safe_readra   r:  r;  r  rý   rö   rÿ   rz  r™   )r†   r{  Ú	tag_countÚir  r  ÚcountrÙ   ÚtagnameÚtypnamer  Ú	unit_sizer  rÐ   ÚhereÚoffsetr7   r7   r;   ÚloadD  sz   
ÿüÿ
ýþ
ÿÿþÿ



ÿÿý€þ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||t
|ƒ¡ |tjkoHt|tƒ}|rs| jdkrSd}	nd}	t|	|d�}
| j| }| ¡ D ]\}}||
|< qd|
 |¡}nt|tƒrz|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�r8|| \}}}}}|�r!d}t|ƒ‚|   d|  d|¡d | ¡}|||||f||< |D ]!\}}}}}t 	d|||t
|ƒt
|ƒ¡ ||   d||||¡7 }�q:|d7 }|D ]\}}}}}||7 }t|ƒd@ �rx|d7 }�qb|S )NrE  r@   r$   zTag %s, Type: %s, Value: %sró   s   II*    s   MM *   )rï   Úifdr�  zsave: r‚  rƒ  r„  r…  rB   r†  r   rS  rÞ   r?   r    z&multistrip support not yet implementedr   z%s %s %s %s %sr€  s       ) rß   ra   r  Úsortedr  ÚSTRIPOFFSETSrý   r‰  r‹  rŒ  rö   r   r3  r�   r	  rú   rë   Útobytesr  rÓ   r  rï   ré   r   r™   r7  r6  r-  ÚappendÚljustÚNotImplementedErrorr×   )r†   r–  ÚresultÚentriesÚstripoffsetsr  r‘   r  r=  rí   r˜  rä   Úifd_tagÚ	ifd_valuerÙ   r’  r“  r  r‘  r7   r7   r;   r›  ‡  sl   


ÿ


€zImageFileDirectory_v2.tobytesc                 C  sN   |  ¡ dkr| | j|  ddd¡ ¡ |  ¡ }|  |¡}| |¡ |t|ƒ S )Nr   ÚHLé*   r,   )r‡  Úwriterø   rß   r›  ra   )r†   r{  r–  rŸ  r7   r7   r;   ÚsaveÔ  s   

zImageFileDirectory_v2.save)rì   NN)rí   ri   rh   rî   rï   rð   rj   rñ   )rj   rk   )r‘   rk   rj   r   ©rj   rñ   r¾   r¿   )r  r›   rj   rñ   rå   rP   )6rÀ   rÁ   rÂ   rÃ   rÌ   Ú__annotations__rÓ   r’   rÅ   rh   r–  rÚ   Úsetterrþ   r
  r  r  r  r  r  r  r@  rB  r×   rß   ÚlistÚmaprê   r   r1  r3  ÚSIGNED_BYTEr2  r4  ÚFLOATr5  ÚIFDÚLONG8rÒ   rO  rÕ   rR  rV  rX  rl  rq  rr  rs  ru  rw  r}  r—  r›  r§  r7   r7   r7   r;   rë   ê  s‚   
 <ü%



P








÷þÿ






CMrë   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ded< 	 e	d	d
„ ƒZ
ddd„Zdd„ Zd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)Úsuperr’   r   )r†   r‡   Úkwargs©Ú	__class__r7   r;   r’   ü  s   
zImageFileDirectory_v1.__init__c                 C  r“   rz   )r  r”   r7   r7   r;   rÝ      r  zImageFileDirectory_v1.<lambda>c                 C  r“   rz   )r  r”   r7   r7   r;   rÝ     r  zdict[int, int]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`

        rn   )rh   r  rý   rÿ   )ÚclsÚoriginalr˜  r7   r7   r;   Úfrom_v2  s
   zImageFileDirectory_v1.from_v2rj   rë   c                 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`

        rn   )rë   rh   r	  r  rý   r  )r†   r˜  r7   r7   r;   Úto_v2  s
   zImageFileDirectory_v1.to_v2c                 C  r  rz   )r  r  r  r7   r7   r;   r  *  r  z"ImageFileDirectory_v1.__contains__r›   c                 C  r  rz   )ra   r  r  r  r”   r7   r7   r;   r  -  r  zImageFileDirectory_v1.__len__c                 C  r  rz   )rA  r  r  r  r”   r7   r7   r;   rB  0  r  zImageFileDirectory_v1.__iter__c                 C  s   dD ]	}|   |||¡ qd S ©N)FT)r  )r†   r  r‘   rÚ   r7   r7   r;   r  3  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  r�   r  ri   )r†   r  rÙ   r  rÐ   r  Úlegacyru   r7   r7   r;   r  7  s   



z!ImageFileDirectory_v1.__getitem__)rj   rë   r¿   )rÀ   rÁ   rÂ   rÃ   r’   rÅ   ÚtagsÚtagdatar©  Úclassmethodr¹  rº  r  r  rB  r  r  Ú__classcell__r7   r7   rµ  r;   r²  é  s   
 


r²  c                      sŒ   e Zd ZdZdZdZd‡ fdd„	Zd d	d
„Zedd„ ƒZ	d!dd„Z
d!dd„Zd"dd„Zdd„ Z‡ fdd„Zd dd„Zdd„ Zdd„ Z‡  ZS )#ÚTiffImageFileÚTIFFz
Adobe TIFFFNc                   s"   d | _ 	 d | _	 tƒ  ||¡ d S rz   )Útag_v2r  r³  r’   )r†   r{  Úfilenamerµ  r7   r;   r’   Q  s
   zTiffImageFile.__init__rj   rñ   c                 C  s˜   | j  d¡}|d dkr|| j  d¡7 }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,   r    rô   Nrq   z*** TiffImageFile._open ***z- __first: %sz	- ifh: %sr   )r{  ry  rë   rÃ  r˜  rÿ   Ú_TiffImageFile__firstÚ_TiffImageFile__nextÚ_TiffImageFile__frameÚ_fpÚ
_frame_posÚ	_n_framesr‹  rŒ  rö   Ú_seek)r†   rí   r7   r7   r;   Ú_openZ  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Ê  r‡  rË  ra   rÉ  r�  )r†   Úcurrentr7   r7   r;   Ún_framesu  s   


ÿ
zTiffImageFile.n_framesÚframer›   c                 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)r†   rÏ  r7   r7   r;   r�    s
   

zTiffImageFile.seekc                 C  s†  | j | _| j ¡  t| jƒ|kr…| jsd}t|ƒ‚t d|| j	| j| j ¡ ¡ | jdkr2d}t
|ƒ‚| j | j¡ | j | j¡ t d| j ¡ ¡ | j | j¡ | jj| jv r[d| _n| jj| _| jdkrj|d | _t| jƒdkrw| jdk| _|  j	d7  _	t| jƒ|ks| j | j| ¡ | j | j¡ t| jv r£| jt | jd< n	d| jv r¬| jd= |  ¡  t | j¡ | _| _|| _	|  ¡  d S )	Nzno more images in TIFF filez9Seeking to frame %s, on frame %s, __next %s, location: %sl            zUnable to seek to framezLoading tags, location: %sr   r   Úxmp)rÈ  r{  r‡  ra   rÉ  rÆ  ÚEOFErrorr‹  rŒ  rÇ  r9  r�  rœ  rÃ  r—  rÿ   rÊ  Úis_animatedÚXMPr+  Ú_reload_exifr²  r¹  r  r˜  Ú_setup)r†   rÏ  r  r7   r7   r;   rË  Š  sN   
û



ä

zTiffImageFile._seekc                 C  r“   )zReturn the current frame number)rÇ  r”   r7   r7   r;   r‡  º  r•   zTiffImageFile.tellc                 C  sÄ   i }| j  tjj¡}|r`|dd… dkr`t|dd… ƒ}t |d d d ¡d }t|d| d| … ƒ}|d| d| | … }d|i||< |t d| | d ¡d d… }|dd… dks|S )	a5  
        Returns a dictionary of Photoshop "Image Resource Blocks".
        The keys are the image resource ID. For more information, see
        https://www.adobe.com/devnet-apps/photoshop/fileformatashtml/#50577409_pgfId-1037727

        :returns: Photoshop "Image Resource Blocks" in a dictionary.
        Nr$   s   8BIMr(   r   r    rt  rÙ   )	rÃ  r‰  r   ÚBaseÚImageResourcesÚi16ÚmathÚceilÚi32)r†   Úblocksru   ÚidÚnrÐ   rÙ   r7   r7   r;   Úget_photoshop_blocks¾  s   "ùz"TiffImageFile.get_photoshop_blocksc                   s   | j r
| jr
|  ¡ S tƒ  ¡ S rz   )ÚtileÚuse_load_libtiffÚ_load_libtiffr³  r—  r”   rµ  r7   r;   r—  Ó  s   
zTiffImageFile.loadc                 C  sn   | j sd| _| j ¡  |  ¡ }tjD ]}||vrq| |¡ qtj	| dd� t
jj| jv r5| jt
jj= d S d S )NT)Úin_place)rØ  Ú!_close_exclusive_fp_after_loadingr{  r‡  Úgetexifr   ÚTAGS_V2_GROUPSÚget_ifdr   Úexif_transposer   rÜ  ÚOrientationrÃ  )r†   ÚexifÚkeyr7   r7   r;   Úload_endØ  s   

ÿzTiffImageFile.load_endc           
   
   C  sÊ  t j  | ¡ |  ¡  t| jƒdksd}t|ƒ‚| jd d }t| jd d ƒ}zt| jdƒo2| j 	¡ }t| jdƒr>| j 
¡  W n tyJ   d}Y nw |rQ||d< t  | jd	t|ƒ| j¡}z	| | j|¡ W n tyy } zd
}t|ƒ|‚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_preparera   ræ  rz  r«  rÆ   r{  ró  rô  Ú_getdecoderrÔ  r  ÚdecoderconfigÚsetimagerÕ  r9  Ú_exclusive_fprØ  r‹  rŒ  rU  rö  r�  ry  Úreadonlyrò  Úclose)
r†   r  Úextentsr‡   r{  ÚdecoderÚeÚclose_self_fprä  Úerrr7   r7   r;   rè  í  s`   
€ýÿ
€þ




zTiffImageFile._load_libtiffc              
   C  sæ  d| j v rd}t|ƒ‚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 t¡¡ 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|ƒ}
| j  t| jdkrÍ|dv rÍdnd¡}|tkràt
 d|¡ d}t|ƒ‚||
k rë|d|… }n||
kr÷|
dkr÷|| }t|ƒ|k�rd}t|ƒ‚| j j|||||f}t
 d|¡ z	t| \| _}W n t �y6 } zt
 d¡ d}t|ƒ|‚d}~ww t
 d|¡ t
 d| j!¡ | j| j"d< | j  t#d¡}| j  t$d¡}|�r�|�r�| j  t%¡}|dk�rq||f| j"d < n,|dk�r‚|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 �r?| j t, }| j  t.|¡}| jd }n| j t- }| j  t/¡}| j  t0¡}|D ]h}|| |k�rd|t1|ƒ d- }nd}|}| jdk�rv|| }||	 }|t|ƒdf}| j& +| j||t|| |ƒt|| |ƒf||f¡ || }|| jd k�r¹d|| }}|| jd k�r¹d }}|d7 }�qRnt
 d.¡ d}t|ƒ‚t2| j v �rÕ| j t2 | j"d/< | j!d0v �rñd1d2„ | j t3 D ƒ}t4 5d3d4 6|¡¡| _7dS dS )5z-Setup this image object based on current tagsi¼  z+Windows Media Photo files not yet supportedr   r   r)   r(   z*** Summary ***z- compression: %sz - photometric_interpretation: %sz- planar_configuration: %sz- fill_order: %sz- YCbCr subsampling: %sz
- size: %sr=   r7   )r    r(   r,   r"   r&   r$   )r    r(   z.More samples per pixel than can be decoded: %sz#Invalid value for samples per pixelNzunknown data organizationzformat key: %sz- unsupported formatzunknown pixel modez- raw mode: %sz- pil mode: %sÚcompressionr    ÚdpigR¸…ëQ@Ú
resolutionr   rA   úI;16Nz;16Bz;16Nz;16Lr+   rN   Frõ  r,   z- unsupported data organizationÚicc_profile©rZ   r\   c                 S  s   g | ]}t |d  ƒ‘qS ©r   r   )r8   rH  r7   r7   r;   r(    s    z(TiffImageFile._setup.<locals>.<listcomp>úRGB;LrÞ   )8rÃ  rz  ÚCOMPRESSION_INFOr‰  ÚCOMPRESSIONÚ_compressionÚPLANAR_CONFIGURATIONÚ_planar_configurationÚPHOTOMETRIC_INTERPRETATIONÚ	FILLORDERr‹  rŒ  r  ÚYCBCRSUBSAMPLINGr›   Ú
IMAGEWIDTHÚIMAGELENGTHÚ_sizerÐ   ÚSAMPLEFORMATra   r~   r}   ÚBITSPERSAMPLEÚEXTRASAMPLESÚSAMPLESPERPIXELÚMAX_SAMPLESPERPIXELÚerrorr÷   rh   Ú	OPEN_INFOÚ_moderŠ  rÔ  r+  ÚX_RESOLUTIONÚY_RESOLUTIONÚRESOLUTION_UNITræ  ÚREAD_LIBTIFFrç  rË   r–  rœ  rš  ÚTILEOFFSETSÚROWSPERSTRIPÚ	TILEWIDTHÚ
TILELENGTHÚsumÚ
ICCPROFILEÚCOLORMAPr   r   râ   Úpalette)r†   r  ÚphotoÚ	fillorderÚxsizeÚysizeÚsample_formatÚ	bps_tupleÚextra_tupleÚ	bps_countÚbps_actual_countÚsamples_per_pixelrñ  Úrawmoder   ÚxresÚyresÚresunitÚxÚyÚlayerr]  ÚoffsetsrI  Úwr–  ÚstrideÚtile_rawmoder)  r7   r7   r;   rÛ  B  s  



,þÿú

€ý









üÿ€å
þzTiffImageFile._setup)NNr¨  )rÏ  r›   rj   rñ   r¿   )rÀ   rÁ   rÂ   ÚformatÚformat_descriptionrê  r’   rÌ  rÅ   rÎ  r�  rË  r‡  rå  r—  rò  rè  rÛ  rÀ  r7   r7   rµ  r;   rÁ  L  s     
	

	

0
UrÁ  r>   r?   rM   rZ   r\   rD   rK   rA   rE   rH   rI   rN   rQ   rO   r]   ÚYCbCrr`   rL   rC   rF   rJ   )rF   rJ   c           5      C  sd	  zt | j \}}}}}}W n ty% }	 zd| j› d�}
t|
ƒ|	‚d }	~	ww t|d�}| j}| j}z|d }W n tyM   | j d¡}t	|t
ƒrKd }Y nw |d u rUd}n|dkr\d}n|dkrbd	}tpg|dk}d
|t< | jd |t< | jd
 |t< d|v rƒ|d }nd|v rœ|d }t	|tƒr›t ¡ }| |¡ |}ni }t dt|ƒ¡ t	|tƒr¯| ¡ }|D ]/}t	|tjƒrÆ|tjv rÆ| |¡||< n| |¡||< z
|j| |j|< W q± tyà   Y q±w i }t| dƒrí| j ¡ }i |¥t | di ƒ¥}t!t"fD ]
}||v �r||= qût| dƒ�rEt#t$t%t&t't(fD ]0}|| j)v �rC|t&k�r3| j)j| tj*tj+fv�r3||= �q| j)| ||< | j)j| |j|< �q| d| j d¡¡}|�rV||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t0dft1dff
D ]\}}||v �r…|| ||< �qv| d¡}|�rŸd|t#< |d |t$< |d
 |t%< |dk�rµ||t2< t3|ƒd
k�rµt3|ƒ|t4< |d u�r¾||t5< |d
k�rÇ||t"< t6|v�rÑ||t6< nF| jdv �r|t6 dk�r| jdk�r|  7¡ }| ¡ }t8|j9ƒD ]}t8|j:ƒD ]}|||f d k�rdnd |||f< �qø�qñ|} nt; <| ¡} | jd!v �rT| j= >d"d#¡}g }t3|ƒd$ }t8d$ƒD ]} |d%d&„ |||  || d
  … D ƒ7 }|dgd'|  7 }�q0||t?< |t |t }!}"t3|ƒ|!|d  d( d)  }#t@|v�r¥|�r˜| d*tA¡}$|#dk�r€d
ntB|$|# |"ƒ}%|dk�r—tB|%d( d) d) |"ƒ}%n|"}%|%dk�r¡d
}%|%|t@< |#dk�r¬d
n|#|t@  }&|"|t@  d
 |t@  }'|&d+k�rÉtjC|jtD< |&f|'d
  |#|" |&|'d
   f |tD< tEt8d|&|' |&ƒƒ|tF< tG |d
¡|tH< | jd,k�rtId-tJd.i K¡ D ]\}}(| L||(¡ �qÿtMtNtOtPg})|�r†d/|v �rB|d/ }*t	|*t
ƒ�r-|*dk �s-|*d0k�r3d1}
tQ|
ƒ‚|dk�r>d2}
tQ|
ƒ‚|*|tR< t d3¡ t d4tS| K¡ ƒ¡ d}+t|d5ƒ�rsz| Td¡ tU V| W¡ ¡}+W n tXjY�yr   Y nw i },|)tZtJtDtFt[t\g7 })t2|d i}-t] ^| K¡ | K¡ ¡D ]j\}}(|tj_v�rÊt tj`d6d7ƒ�s£�q�||jv �r±|j| |,|< nt	|(t
tatbtfƒ�s½�q�t c|¡jd}.|.�rÊ|.|,|< ||-v�rø||)v�røt	|(tbƒ�ræ|( ed8d9¡d: |-|< �q�t	|(tfƒ�rôta|(ƒ|-|< �q�|(|-|< �q�t"|-v �rt3|-t" ƒd
k�r|-t" d |-t"< t d;tS|- K¡ ƒ¡ | jd<v �r"d=}t|- K¡ ƒ}/|/ g¡  |||+||/|,f}0t h| jd>|0|¡}1|1 i| j=d?| j ¡ 	 |1 edA¡d
d … \}2}3|+�s[| j|3¡ |2�r_n�qH|+�rvztU k|+¡ W n
 t�yu   Y nw |2dk �r…dB|2› dC�}
t|
ƒ‚n |)D ]}||= �qˆ| l|¡}4tm n| |dd?| j |4||#d
ffg¡ dD|v �r°|| _od S d S )ENzcannot write mode z as TIFFrn   r  r   r)   r+   r1   r-   r   r   Útiffinforð  zTiffinfo Keys: %sr  rÃ  r  Údescriptionr  Úx_resolutionÚy_resolutionÚresolution_unitÚsoftwareÚ	date_timeÚartistÚ	copyrightr  r    r=   )r>   r?   r>   r   r  rN   r
  r"   c                 S  s   g | ]}|d  ‘qS r	  r7   r   r7   r7   r;   r(  ×  s    z_save.<locals>.<listcomp>r   r*   r,   Ú
strip_sizer   rA  )r   r   )r   r   é€   r   rL  r   Úqualityéd   zInvalid quality settingz5quality setting only supported for 'jpeg' compressionzSaving using libtiff encoderz	Items: %sró  rg   Fr&  rË   rS  zConverted items: %s)rC   rA   r  rõ  rR   Ti @  zencoder error z when writing image fileÚ_debug_multipage)pÚ	SAVE_INFOrÔ  rŠ  rz  rë   ÚencoderinfoÚencoderconfigr+  r‰  r�   r›   ÚWRITE_LIBTIFFr  rÐ   r  r  ri   r   ÚExifr—  r‹  rŒ  r«  r²  rº  r   rì  rí  rý   r  rÆ   r  rƒ   ÚEXIFIFDr  r   r  r  ÚIPTC_NAA_CHUNKÚPHOTOSHOP_CHUNKrÙ  rÃ  r7  r-  r'  ÚIMAGEDESCRIPTIONÚSOFTWAREÚ	DATE_TIMEÚARTISTÚ	COPYRIGHTr  ra   r  r  r  Úcopyrˆ  ÚheightÚwidthr   ÚinvertrÕ  Ú
getpaletter(  r#  Ú
STRIP_SIZEr}   r3  ÚSTRIPBYTECOUNTSr  rš  ÚCOMPRESSION_INFO_REVr  r  ÚREFERENCEBLACKWHITEr  Ú
setdefaultr$  r%  r"  ÚTILEBYTECOUNTSr9  ÚJPEGQUALITYr™  r�  ÚosÚdupró  ÚioÚUnsupportedOperationÚOSUBFILETYPEÚTRANSFERFUNCTIONÚSUBIFDÚ	itertoolsÚchainÚLIBTIFF_CORErÒ  r�   r™   r  r,  r'  rs   ÚsortÚ_getencoderrú  r¦  rý  r§  r   Ú_saverO  )5rÕ  r{  rÄ  r4  rh   r*  r?  ÚbitsÚextrar   r  r˜  rQ  rR  r  rõ  r+  rð  rñ  Ú
legacy_ifdÚsupplied_tagsr  Úiccré   r  Úinverted_imÚpxr9  r8  ÚlutÚcolormapÚcolorsr�  r<  rI  r=  Úim_strip_sizeÚrows_per_stripÚstrip_byte_countsÚstrips_per_imager‘   Ú	blocklistrM  rÈ  ÚtypesÚattsr,  r½  r]  ÚencoderÚerrcoderÙ   r–  r7   r7   r;   ru  C  sæ  
€þ

€ü


€
ÿ

ü
€úþ
€ö
€





&ÿ
&

€


ÿÿþ
ý
 


ÿú
€
úÿ
þ

ÿ

þru  c                   @  s   e Zd Zg d¢Zh d£Zd@dd„ZdAdd	„ZdAd
d„ZdAdd„ZdBdd„Z	dCdd„Z
dDdd„Zejfdd„ZdAdd„ZdEdd„ZdAdd „ZdFd$d%„ZdDd&d'„ZdDd(d)„ZdGd+d,„ZdGd-d.„ZdGd/d0„ZdGd1d2„ZdGd3d4„ZdAd5d6„ZdAd7d8„Z	dHdId=d>„Zd?S )JÚAppendingTiffWriter)r   r   r   r    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 )Nry  FTzw+bzr+b)	rÆ   r˜   Úclose_fpré   Úopenrz  r‡  Ú	beginningÚsetup)r†   ÚfnrÓ  r7   r7   r;   r’   •  s   
ÿzAppendingTiffWriter.__init__rj   rñ   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d	}t|ƒ‚|  ¡  |  ¡  d S )
Nr   r$   TFrf   ró   re   rò   zInvalid TIFF file header)r˜   r�  r�  ri  ÚSEEK_SETÚwhereToWriteNewIFDOffsetÚoffsetOfNewPagery  ÚIIMMÚisFirstÚ	setEndianÚRuntimeErrorÚskipIFDsÚgoToEnd)r†   Úiimmr  r7   r7   r;   r‘  £  s    zAppendingTiffWriter.setupc                 C  s„   | j rd S | j | j¡ | j d¡}|sd S || jkr!d}t|ƒ‚|  ¡ }|| j7 }| j | j¡ |  	|¡ | j |¡ |  
¡  d S )Nr$   z1IIMM of new page doesn't match IIMM of first page)r—  r˜   r�  r•  ry  r–  r™  ÚreadLongr”  Ú	writeLongÚfixIFD)r†   rœ  r  Ú
ifd_offsetr7   r7   r;   Úfinalize¼  s   


zAppendingTiffWriter.finalizec                 C  s   |   ¡  |  ¡  d S rz   )r¡  r‘  r”   r7   r7   r;   ÚnewFrameÓ  s   zAppendingTiffWriter.newFramec                 C  s   | S rz   r7   r”   r7   r7   r;   Ú	__enter__Ø  s   zAppendingTiffWriter.__enter__r‡   rž   c                 G  s   | j r	|  ¡  d S d S rz   )rŽ  rý  r…   r7   r7   r;   Ú__exit__Û  s   ÿzAppendingTiffWriter.__exit__r›   c                 C  s   | j  ¡ | j S rz   )r˜   r‡  r•  r”   r7   r7   r;   r‡  ß  rp   zAppendingTiffWriter.tellc                 C  s*   |t jkr
|| j7 }| j ||¡ |  ¡ S rz   )ri  r“  r•  r˜   r�  r‡  )r†   r–  Úwhencer7   r7   r;   r�  â  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   rB   )r˜   r�  ri  ÚSEEK_ENDr‡  r¦  ri   r•  )r†   ÚposÚ	pad_bytesr7   r7   r;   r›  é  s   
zAppendingTiffWriter.goToEndÚendianr™   c                 C  s4   || _ | j › d�| _| j › d�| _| j › d�| _d S )Nr?   rE  ÚHHL)r©  ÚlongFmtÚshortFmtÚ	tagFormat)r†   r©  r7   r7   r;   r˜  ó  s   zAppendingTiffWriter.setEndianc                 C  sP   	 |   ¡ }|dkr| j ¡ d | _d S | j |¡ |  ¡ }| j |d tj¡ q)NTr   r$   r@   )r�  r˜   r‡  r”  r�  Ú	readShortri  ÚSEEK_CUR)r†   r   Únum_tagsr7   r7   r;   rš  ù  s   øzAppendingTiffWriter.skipIFDsrÙ   ri   rð   c                 C  s   | j  |¡S rz   )r˜   r¦  rQ  r7   r7   r;   r¦    r  zAppendingTiffWriter.writec                 C  ó   t  | j| j d¡¡\}|S )Nr    )ræ   rC  r¬  r˜   ry  rW  r7   r7   r;   r®    ó   zAppendingTiffWriter.readShortc                 C  r±  rl   )ræ   rC  r«  r˜   ry  rW  r7   r7   r;   r�    r²  zAppendingTiffWriter.readLongr‘   c                 C  óR   | j  dtj¡ | j  t | j|¡¡}|d ur%|dkr'd|› d�}t|ƒ‚d S d S )Néþÿÿÿr$   úwrote only ú bytes but wanted 4©	r˜   r�  ri  r¯  r¦  ræ   rD  r«  r™  ©r†   r‘   Úbytes_writtenr  r7   r7   r;   ÚrewriteLastShortToLong  ó   þz*AppendingTiffWriter.rewriteLastShortToLongc                 C  r³  )Nr´  r    rµ  ú bytes but wanted 2)	r˜   r�  ri  r¯  r¦  ræ   rD  r¬  r™  r¸  r7   r7   r;   ÚrewriteLastShort  r»  z$AppendingTiffWriter.rewriteLastShortc                 C  r³  )Néüÿÿÿr$   rµ  r¶  r·  r¸  r7   r7   r;   ÚrewriteLastLong  r»  z#AppendingTiffWriter.rewriteLastLongc                 C  óB   | j  t | j|¡¡}|d ur|dkrd|› d�}t|ƒ‚d S d S )Nr    rµ  r¼  )r˜   r¦  ræ   rD  r¬  r™  r¸  r7   r7   r;   Ú
writeShort$  ó
   þzAppendingTiffWriter.writeShortc                 C  rÀ  )Nr$   rµ  r¶  )r˜   r¦  ræ   rD  r«  r™  r¸  r7   r7   r;   rž  *  rÂ  zAppendingTiffWriter.writeLongc                 C  s   |   ¡  | j ¡  d S rz   )r¡  r˜   rý  r”   r7   r7   r;   rý  0  s   zAppendingTiffWriter.closec                 C  sü   |   ¡ }t|ƒD ]s}t | j| j d¡¡\}}}| j| }|| }|dk}|s3|  ¡ | j	 }	|  
|	¡ || jv rq| j ¡ }
|rT| 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®  rˆ  ræ   rC  r­  r˜   ry  Ú
fieldSizesr�  r•  r¿  ÚTagsr‡  Ú
fixOffsetsr�  ri  r¯  )r†   r°  r�  r  Ú
field_typer‘  Ú
field_sizeÚ
total_sizeÚis_localr–  Úcur_posr7   r7   r;   rŸ  4  s4   



ÿÿ
€âzAppendingTiffWriter.fixIFDr‘  rÃ  rk   rÄ  c                 C  s¶   |s
|s
d}t |ƒ‚t|ƒD ]J}|r|  ¡ n|  ¡ }|| j7 }|rK|dkrK|dkr/d}t |ƒ‚|  |¡ | j dtj	¡ |  
tj¡ | j dtj	¡ q|rS|  |¡ q|  |¡ qd S )Nz offset is neither short nor longr   r   znot implementediöÿÿÿr,   )r™  rˆ  r®  r�  r•  rº  r˜   r�  ri  r¯  rÁ  r   r3  r½  r¿  )r†   r‘  rÃ  rÄ  r  r�  r–  r7   r7   r;   rÇ  W  s$   

îzAppendingTiffWriter.fixOffsetsN)Fr¨  )rj   r‰  )r‡   rž   rj   rñ   r¿   )r©  r™   rj   rñ   )rÙ   ri   rj   rð   )r‘   r›   rj   rñ   )FF)r‘  r›   rÃ  rk   rÄ  rk   rj   rñ   )rÀ   rÁ   rÂ   rÅ  rÆ  r’   r‘  r¡  r¢  r£  r¤  r‡  rk  r“  r�  r›  r˜  rš  r¦  r®  r�  rº  r½  r¿  rÁ  rž  rý  rŸ  rÇ  r7   r7   r7   r;   r‰  w  s4    
	



















$ÿr‰  rÕ  úImage.Imager{  ú	IO[bytes]rÄ  ústr | bytesrñ   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   )rQ  r]  rR  r«  r‰  rÆ   ru  r‡  r‰  rÎ  rˆ  r�  r—  r¢  )rÕ  r{  rÄ  rQ  rR  rÐ  Úcur_idxÚtfÚimsÚnfrrÏ   r7   r7   r;   Ú	_save_alls  s2   




üøÿñrÕ  z.tifz.tiffz
image/tiff)rh   ri   rj   rk   )rÕ  rÍ  r{  rÎ  rÄ  rÏ  rj   rñ   )Ú
__future__r   rk  rp  Úloggingrß  ri  ræ   r:  Úcollections.abcr   Ú	fractionsr   Únumbersr   r   Útypingr   r   r	   r
   r   Ú r   r   r   r   r   r   Ú_binaryr   rÞ  r   rá  r   Ú
_deprecater   r   Ú	getLoggerrÀ   r‹  r!  rS  ÚIFD_LEGACY_APIrb  rû   rù   rm  r  r  r  r  r  r  rX  rš  r  r#  rc  r  r  r  r   rn  rY  rZ  r[  Ú	PREDICTORr(  r$  r%  r"  rg  ro  r  r  Ú
JPEGTABLESr  re  r\  rV  rW  r'  rU  rÙ  rh  ÚIMAGEJ_META_DATA_BYTE_COUNTSÚIMAGEJ_META_DATAr  r  rd  r  r~   r  rm   rƒ   rÒ  ro   ry   r�   rÌ   rÓ   r‹   rs   rÒ   rÕ   rê   r›   Ú
_IFDv2Baserë   rÏ   ré   rË   Úsetattrr²  ÚImageFileDirectoryrÁ  rP  ru  r‰  rÕ  Úregister_openr?  Úregister_saveÚregister_save_allÚregister_extensionsÚregister_mimer7   r7   r7   r;   Ú<module>   sL  ( 
þýüûúùø	÷
öõôóòñðïîýüûúùø	÷
öõôóòñðïîíìëêéèçæåäãâá à!ß"Þ#Ý$Ü%Û&Ú'Ù(Ø)×*Ö+Õ,Ô-Ó.Ò/Ñ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—j–k•l”m“n’o‘p�q�rŽs�tŒw‰xˆy‡z†}	

|   x\   aýüûúùø	÷
öõôóòñðïîíë  6 }