403Webshell
Server IP : 127.0.0.1  /  Your IP : 216.73.216.109
Web Server : Apache/2.4.54 (Win64) OpenSSL/1.1.1q PHP/8.1.10
System : Windows NT DESKTOP-E5T4RUN 10.0 build 19045 (Windows 10) AMD64
User : SERVERWEB ( 0)
PHP Version : 8.1.10
Disable Function : NONE
MySQL : OFF |  cURL : ON |  WGET : OFF |  Perl : OFF |  Python : OFF |  Sudo : OFF |  Pkexec : OFF
Directory :  C:/cygwin64/lib/python3.9/site-packages/PIL/__pycache__/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : C:/cygwin64/lib/python3.9/site-packages/PIL/__pycache__/TiffImagePlugin.cpython-39.opt-1.pyc
a

h�aJ��@s�
ddlZddlZddlZddlZddlZddlZddlmZddlm	Z	ddl
mZmZddl
mZmZmZmZmZddlmZddlmZe�e�Zd	Zd	Zd
ZdZdZd
ZdZdZ dZ!dZ"dZ#dZ$dZ%dZ&dZ'dZ(dZ)dZ*dZ+dZ,dZ-dZ.dZ/dZ0d Z1d!Z2d"Z3d#Z4d$Z5d%Z6d&Z7d'Z8d(Z9d)Z:d*Z;d+Z<d,Z=d-Z>d.Z?d/Z@d0ZAd1ZBd2ZCd3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdD�ZDdEdF�eD�E�D�ZFeddGddGdHfdIeddGddGdHfdIeddGdJdGdHfdKeddGdJdGdHfdKeddGddGdHfdLeddGddGdHfdLeddGdJdGdHfdMeddGdJdGdHfdMeddGddNdHfdOeddGddNdHfdOeddGdJdNdHfdPeddGdJdNdHfdPeddGddNdHfdQeddGddNdHfdQeddGdJdNdHfdReddGdJdNdHfdReddGddSdHfdTeddGddSdHfdTeddGdJdSdHfdUeddGdJdSdHfdUeddGddSdHfdVeddGddSdHfdVeddGdJdSdHfdWeddGdJdSdHfdWeddGddXdHfdYeddGddXdHfdYeddGdJdXdHfdZeddGdJdXdHfdZeddGddXdHfd[eddGddXdHfd[eddGdJdXdHfd\eddGdJdXdHfd\eddGdd]dHfd^eddGdd_dHfd`eddGdd_dHfdaeddNdd_dHfdbeddNdd_dHfdcedddddedHfdfedddddedHfdgeddGddedHfdheddNddedHfdieddNddedHfdjedddddedHfdfedddddedHfdgeddGddkdNfdleddGddkdNfdledJdGddmdHfdnedJdGddmdHfdnedJdGdJdmdHfdoedJdGdJdmdHfdoedJdGddpdHfdqedJdGddpdHfdqedJdGddpdrfdsedJdGddpdrfdsedJdGddtdufdvedJdGddtdufdvedJdGddwdxfdyedJdGddwdxfdyedJdGddpdGfdzedJdGddpdGfdzedJdGddtd{fd|edJdGddtd{fd|edJdGddwd}fd~edJdGddwd}fd~edJdGddpdNfdqedJdGddpdNfdqedJdGddtdfd�edJdGddtdfd�edJdGddwd�fd�edJdGddwd�fd�edJdGddpd�fdqedJdGddpd�fdqedJdGdd�dHfd�edJdGdd�dHfd�edJdGdd�dHfd�edJdGdd�dHfd�edJdGdd�drfd�edJdGdd�drfd�edJdGdd�dGfd�edJdGdd�dGfd�edJdGdd�dNfd�edJdGdd�dNfd�ed�dGddGdHfd�ed�dGddGdHfd�ed�dGdJdGdHfd�ed�dGdJdGdHfd�ed�dGddNdHfd�ed�dGddNdHfd�ed�dGdJdNdHfd�ed�dGdJdNdHfd�ed�dGddSdHfd�ed�dGddSdHfd�ed�dGdJdSdHfd�ed�dGdJdSdHfd�ed�dGddXdHfd�ed�dGddXdHfd�ed�dGddkdNfd�ed�dGddkdNfd�ed�dGdJdXdHfd�ed�dGdJdXdHfd�ed�dGddpdHfd�ed�dGddpdHfd�ed�dGddtdrfd�ed�dGddtdrfd�ed�dGddwdufd�ed�dGddwdufd�ed�dGdd�dHfd�ed�dGddmdHfd�ed�dGddmdHfd�ed�dGddmdHfd�ed�dGddmdHfd�ioZGgd��ZHd�d��ZId�d��ZJd�d��ZKiZLiZMGd�d��d�e�ZNGd�d��d�e�ZOeLeO_LeMeO_Me�E�D]B\ZPZQeQ�Rd�d��ZQeSeOd�eQeLePd�eSeOd�eQeMeP��q�[L[M[P[QGd�d��d�eO�ZTeTZUGd�d��d�ej�ZVd�edddGdfd�edddXdfd�edddkdJfd�ed�ddXdfd�ed�ddkdJfd�eddJdedfd�eddd_dfd�eddJd_dfd�edd�dedfd�edJddmdfd�edJddpdfd�edJddpdJfd�ed�ddpdfd�ed�ddmdfd�ed�ddmdfd�eddJdedfd�eddd_dfd�eddJd_dfd�edd�dedfdǜZWd�dɄZXGd�d˄d˃ZYd�d̈́ZZe�[eVj\eVeI�e�]eVj\eX�e�^eVj\eZ�e�_eVj\d�d�g�e�`eVj\dСdS)��N)�MutableMapping)�Fraction)�Number�Rational�)�Image�	ImageFile�ImageOps�ImagePalette�TiffTags��o8��TYPESFT�sIIsMM�iiiii
i�iiiiiii(i-i1i2i;i=i@�DiJiRiSi[�ii��i��iI�is�ii��ii��i���rawZ
tiff_ccittZgroup3Zgroup4Ztiff_lzw�	tiff_jpeg�jpeg�tiff_adobe_deflateZtiff_raw_16ZpackbitsZtiff_thunderscan�tiff_deflateZtiff_sgilogZ
tiff_sgilog24�lzmaZzstdZwebp)r�������i�i�i)�i��it�iu�im�iP�iQ�cCsi|]\}}||�qS�r#)�.0�k�vr#r#�7/usr/lib/python3.9/site-packages/PIL/TiffImagePlugin.py�
<dictcomp>��r(�rr#)�1z1;Ir)r+z1;IR)r+r+)r+z1;R)r)�LzL;2I)r,zL;2IR)r,zL;2)r,zL;2R)r)r,zL;4I)r,zL;4IR)r,zL;4)r,zL;4R)r")r,zL;I)r,zL;IR)r,r,)r,zL;R)�)�I;16zI;12)�)r.r.)�I;16Br0)�I�I;16S)r1�I;16BS)r)� )�F�F;32F)r5�F;32BF)r1zI;32N)r1�I;32S)r1�I;32BS)r"r")�LAr:)r"r"r")�RGBr;)r;zRGB;R)r"r"r"r")�RGBAr<)r)�RGBXr=)r"r"r"r"r"�rr)r=ZRGBXX)r"r"r"r"r"r")rrr)r=ZRGBXXX)r<ZRGBa)rr)r<ZRGBaX)rrr)r<ZRGBaXX)rr)r<ZRGBAX)rrr)r<ZRGBAXX)i�)r/r/r/)r;zRGB;16L)r;zRGB;16B)r/r/r/r/)r<zRGBA;16L)r<zRGBA;16B)r=zRGBX;16L)r=zRGBX;16B)r<zRGBa;16L)r<zRGBa;16Br)�PzP;1)r?zP;1R)r?zP;2)r?zP;2R)r?zP;4)r?zP;4R)r?r?)�PAr@)r?zP;Rr)�CMYKrA)rAZCMYKX)rAZCMYKXX)rAzCMYK;16Lr )r;r=r")�LABrB)�MM*�II*sMM*sII*cCs|dd�tvS�Nr)�PREFIXES��prefixr#r#r'�_acceptsrIcCs<t|�dk}t|rd|n|��|�}|r8|ddd�S|S)Nr���)�abs�IFDRational�limit_rational)�val�max_val�inv�n_dr#r#r'�_limit_rationalsrRcCsPt|�}|j|jf}t|�|kr.t|t|��}t|�|krLt|�}t||�}|S�N)r�	numerator�denominator�minrRrK�max)rNrOZmin_val�fracrQr#r#r'�_limit_signed_rationals
rYc@s>eZdZdZdZd3dd�Zedd��Zedd	��Zd
d�Z	dd
�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zed�Zed�Zed�Zed�Zed�Zed�Zed�Zed�Zed �Zed!�Zed"�Zed#�Zed$�Zed%�Zed&�Zed'�Zed(�Z ed)�Z!ed*�Z"ed+�Z#ed,�Z$ed-�Z%ed.�Z&ed/�Z'ed0�Z(ed1�Z)d2S)4rLz�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�_valrcCs�t|t�r&|j|_|j|_|j|_dSt|t�rB|j|_|j|_n||_||_|dkrbtd�|_n |dkrvt|�|_nt||�|_dS)z�
        :param value: either an integer numerator, a
        float/rational/other number, or an IFDRational
        :param denominator: Optional integer denominator
        Nr�nanr)	�
isinstancerLrTrZrUr[r\r�float)�self�valuerUr#r#r'�__init__1s


zIFDRational.__init__cCs|jSrS)rZ��ar#r#r'rTKszIFDRational.numeratorcCs|jSrS)r[rcr#r#r'rUOszIFDRational.denominatorcCs.|jdkr|j|jfS|j�|�}|j|jfS)z�

        :param max_denominator: Integer, the maximum denominator value
        :returns: Tuple of (numerator, denominator)
        r)rUrTr\Zlimit_denominator)r`Zmax_denominator�fr#r#r'rMSs
zIFDRational.limit_rationalcCstt|j��SrS)�strr_r\�r`r#r#r'�__repr__`szIFDRational.__repr__cCs
|j��SrS)r\�__hash__rgr#r#r'ricszIFDRational.__hash__cCs0|j}t|t�r|j}t|t�r(t|�}||kSrS)r\r^rLr_)r`�otherrNr#r#r'�__eq__fs

zIFDRational.__eq__cCs|j|j|jgSrS)r\rZr[rgr#r#r'�__getstate__nszIFDRational.__getstate__cCs,t�|d�|\}}}||_||_||_dS)Nr)rLrbr\rZr[)r`�stater\rZr[r#r#r'�__setstate__qs

zIFDRational.__setstate__cs�fdd�}|S)Ncst|j��|�SrS)�getattrr\)r`�args��opr#r'�delegateysz'IFDRational._delegate.<locals>.delegater#)rrrsr#rqr'�	_delegatexszIFDRational._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__N)r)*�__name__�
__module__�__qualname__�__doc__�	__slots__rb�propertyrTrUrMrhrirkrlrnrtrurvrwrxryrzr{r|r}r~rr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r#r#r#r'rL#sP



rLc
@s�eZdZdZd\dd�Zedd��Zedd��Zed	d��Zej	d
d��Zdd
�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zdd�Zdd�Zd d!�Zd"d#�Zd$d%�Zd&d'�Zd(d)�Zeeeejd*d+fejd,d-fejd.d/fejd0d1fej d2d3fej!d4d5fej"d6d7fej#d,d-fg��ed8d8�d]d:d;��Z$ed8�d<d=��Z%ed>d8�d^d?d@��Z&ed>�dAdB��Z'edCdD�d_dEdF��Z(edC�dGdH��Z)edId8�d`dJdK��Z*edI�dLdM��Z+edNdD�dadOdP��Z,edN�dQdR��Z-dSdT�Z.dUdV�Z/dbdXdY�Z0dZd[�Z1dS)c�ImageFileDirectory_v2aThis 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*NcCs�|dd�tvr$tdt|��d���|dur0|n
|dd�|_|jtkrPd|_n|jtkrbd|_ntd��||_i|_|�	�|�
d	|dd��\|_d
|_dS)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.
        Nrznot a TIFF file (header z not valid)r�>�<znot a TIFF IFDr,F)
rF�SyntaxError�repr�_prefix�MM�_endian�II�group�tagtype�reset�_unpack�next�_legacy_api)r`�ifhrHr�r#r#r'rb�s

zImageFileDirectory_v2.__init__cCs|jSrS)r�rgr#r#r'�<lambda>�r)zImageFileDirectory_v2.<lambda>cCs|jSrS)�_offsetrgr#r#r'r��r)cCs|jSrS)r�rgr#r#r'r��r)cCstd��dS)Nz"Not allowing setting of legacy api)�	Exception�r`rar#r#r'�
legacy_api�sz ImageFileDirectory_v2.legacy_apicCs(i|_i|_i|_i|_d|_d|_dSrS)�_tags_v1�_tags_v2�_tagdatar�Z_nextr�rgr#r#r'r�szImageFileDirectory_v2.resetcCstt|��SrS)rf�dictrgr#r#r'�__str__
szImageFileDirectory_v2.__str__cs�fdd����D�S)z�
        :returns: dict of name|key: value

        Returns the complete tag dictionary, with named tags where possible.
        cs"i|]\}}t�|�j�j|�qSr#)r�lookupr��name)r$�coderargr#r'r(s�z/ImageFileDirectory_v2.named.<locals>.<dictcomp>)�itemsrgr#rgr'�named
s
�zImageFileDirectory_v2.namedcCstt|j�t|j�B�SrS)�len�setr�r�rgr#r#r'�__len__szImageFileDirectory_v2.__len__cCsf||jvr>|j|}|j|}|j|\}}||||j�||<|j|}|jrbt|ttf�sb|f}|SrS)r�r�r��_load_dispatchr�r^�tuple�bytes)r`�tag�data�typ�size�handlerrNr#r#r'�__getitem__s



z!ImageFileDirectory_v2.__getitem__cCs||jvp||jvSrS)r�r��r`r�r#r#r'�__contains__&sz"ImageFileDirectory_v2.__contains__cCs|�|||j�dSrS)�_setitemr�)r`r�rar#r#r'�__setitem__)sz!ImageFileDirectory_v2.__setitem__c
s�tttf}t�||j��t||�r(|gn|}||jv�rp�jrN�j|j|<�n"tj	|j|<t
dd�|D��r�t
dd�|D��r�tjntj|j|<n�t
dd�|D���rt
dd�|D��r�tj
|j|<nDt
dd�|D��r�tj|j|<n$t
dd�|D��r�tjntj|j|<ndt
dd�|D���r.tj|j|<nBt
d	d�|D���rPtj|j|<n t
d
d�|D���rptj|j|<|j|tj	k�r�dd�|D�}n |j|tjk�r�d
d�|D�}|j|tjk�o�t|t�}|�s�t�fdd�|D��}|�r�|jn|j}|�s��jdk�s@|j|tjk�s@�jdu�r�t|�dk�r�|�s�|�rd|j|tjtjfv�rd|f}z|\||<Wn<t�y�t�d|�dt|��d��|d||<Yn0n|||<dS)Ncss|]}t|t�VqdSrS)r^rL�r$r&r#r#r'�	<genexpr>7r)z1ImageFileDirectory_v2._setitem.<locals>.<genexpr>css|]}|dkVqdS�rNr#r�r#r#r'r�:r)css|]}t|t�VqdSrS)r^�intr�r#r#r'r�=r)css&|]}d|kodknVqdS)rrNr#r�r#r#r'r�>r)css&|]}d|kodknVqdS)i���i�Nr#r�r#r#r'r�@r)css|]}|dkVqdSr�r#r�r#r#r'r�Er)css|]}t|t�VqdSrS)r^r_r�r#r#r'r�Hr)css|]}t|t�VqdSrS)r^rfr�r#r#r'r�Jr)css|]}t|t�VqdSrS)r^r�r�r#r#r'r�Lr)cSs&g|]}t|t�r|�dd�n|�qS)�ascii�replace)r^rf�encoder�r#r#r'�
<listcomp>Ps�z2ImageFileDirectory_v2._setitem.<locals>.<listcomp>cSs"g|]}t|t�rt|�n|�qSr#)r^r�r_r�r#r#r'r�Ur)c3s|]}��|�VqdSrS)Zcvt_enum�r$ra��infor#r'r�Yr)rzMetadata Warning, tag z had too many entries: z, expected 1r)rr�rfrr�r�r^r��type�	UNDEFINED�allZRATIONALZSIGNED_RATIONAL�SHORT�SIGNED_SHORT�LONG�SIGNED_LONG�DOUBLE�ASCII�BYTEr�r�r�r��lengthr��
ValueError�warnings�warn)r`r�rar�Z	basetypes�values�is_ifd�destr#r�r'r�,s~
��
��
����
�����zImageFileDirectory_v2._setitemcCs.|j�|d�|j�|d�|j�|d�dSrS)r��popr�r�r�r#r#r'�__delitem__|sz!ImageFileDirectory_v2.__delitem__cCstt|j�t|j�B�SrS)�iterr�r�r�rgr#r#r'�__iter__�szImageFileDirectory_v2.__iter__cCst�|j||�SrS)�struct�unpackr�)r`�fmtr�r#r#r'r��szImageFileDirectory_v2._unpackcGstj|j|g|�R�SrS)r��packr�)r`r�r�r#r#r'�_pack�szImageFileDirectory_v2._packcs��fdd�}|S)NcsBddlm}|j�d�r2|jdd��dd�|�<�|ft�<|S)Nrr�load_r�_� )rrr��
startswithr�r�)�funcr��idxr�r#r'�	decorator�s
z9ImageFileDirectory_v2._register_loader.<locals>.decoratorr#)r�r�r�r#r�r'�_register_loader�sz&ImageFileDirectory_v2._register_loadercs�fdd�}|S)Ncs|t�<|SrS)�_write_dispatch)r��r�r#r'r��sz9ImageFileDirectory_v2._register_writer.<locals>.decoratorr#)r�r�r#r�r'�_register_writer�sz&ImageFileDirectory_v2._register_writercsXddlm}|\}�}|||<t�d����d��fdd�	ft|<�fdd�t|<dS)	Nrr�=Tcs|�d�t|����|�S)Nz{}{})r��formatr��r`r�r��r�r�r#r'r��sz7ImageFileDirectory_v2._register_basic.<locals>.<lambda>csd���fdd�|D��S)Nr)c3s|]}���|�VqdSrS)r�r�)r�r`r#r'r��r)zJImageFileDirectory_v2._register_basic.<locals>.<lambda>.<locals>.<genexpr>��join�r`r�)r�rgr'r��s)T)rrr��calcsizer�r�)Zidx_fmt_namerr�r�r#r�r'�_register_basic�s
�z%ImageFileDirectory_v2._register_basic�HZshortr,Zlong�bzsigned byte�hzsigned short�lzsigned longrer_�dZdoublerTcCs|SrSr#r�r#r#r'�	load_byte�szImageFileDirectory_v2.load_bytecCs|SrSr#�r`r�r#r#r'�
write_byte�sz ImageFileDirectory_v2.write_bytercCs"|�d�r|dd�}|�dd�S)N�rJzlatin-1r�)�endswith�decoder�r#r#r'�load_string�s
z!ImageFileDirectory_v2.load_stringcCsd|�dd�dS)Nr)r�r�r)r�r�r#r#r'�write_string�sz"ImageFileDirectory_v2.write_stringrr"csV|�d�t|�d�|�}�fdd��t�fdd�t|ddd�|ddd��D��S)	Nz{}Lrcs�r||fSt||�SrS�rL�rdr�r�r#r'�combine�sz4ImageFileDirectory_v2.load_rational.<locals>.combinec3s|]\}}�||�VqdSrSr#�r$ZnumZdenom�rr#r'r��r)z6ImageFileDirectory_v2.load_rational.<locals>.<genexpr>rr�r�r�r�r��zip�r`r�r�Zvalsr#�rr�r'�
load_rational�sz#ImageFileDirectory_v2.load_rationalcsd��fdd�|D��S)Nr)c3s&|]}�jdgt|d��R�VqdS)Z2Ll��N)r�rR�r$rXrgr#r'r��sz7ImageFileDirectory_v2.write_rational.<locals>.<genexpr>r�r�r#rgr'�write_rational�s�z$ImageFileDirectory_v2.write_rationalr!cCs|SrSr#r�r#r#r'�load_undefined�sz$ImageFileDirectory_v2.load_undefinedcCs|SrSr#r�r#r#r'�write_undefined�sz%ImageFileDirectory_v2.write_undefined�
csV|�d�t|�d�|�}�fdd��t�fdd�t|ddd�|ddd��D��S)	Nz{}lrcs�r||fSt||�SrSrr
rr#r'r�sz;ImageFileDirectory_v2.load_signed_rational.<locals>.combinec3s|]\}}�||�VqdSrSr#rrr#r'r��r)z=ImageFileDirectory_v2.load_signed_rational.<locals>.<genexpr>rrrrr#rr'�load_signed_rational�sz*ImageFileDirectory_v2.load_signed_rationalcsd��fdd�|D��S)Nr)c3s(|] }�jdgt|dd��R�VqdS)Z2li���i�N)r�rYrrgr#r'r��s�z>ImageFileDirectory_v2.write_signed_rational.<locals>.<genexpr>r�r�r#rgr'�write_signed_rational�s�z+ImageFileDirectory_v2.write_signed_rationalcCs4|�|�}t|�|kr0td|�dt|��d���|S)Nz&Corrupt EXIF data.  Expecting to read � bytes but only got z. )�readr��OSError)r`�fpr��retr#r#r'�_ensure_read�s
���z"ImageFileDirectory_v2._ensure_readc
Cs|��|��|_�z�t|�d|�|d��d�D�]�}|�d|�|d��\}}}}t�||j�j	}t
�|d�}d|�d|�d	|�d|�d
�	}	z|j|\}
}Wn*t
y�t�|	d|���Yq2Yn0||
}|dk�r*|��}
|�d
|�\}|	d|
�d|��7}	|�|�t�||�}|�|
�n|d|�}t|�|k�rpt�d|�dt|��d|���t�|	�q2|�s�t�|	�q2||j|<||j|<|	d|dk�r�d|nt|�7}	t�|	�q2|�d
|�|d��\|_Wn6t�y}	zt�t|	��WYd}	~	dSd}	~	00dS)Nr�rr�HHL4sr-�unknownztag: � (�
) - type: �)z - unsupported type rr,z Tag Location: z - Data Location: z/Possibly corrupt EXIF data.  Expecting to read rz. Skipping tag �
 - value: r4�<table: %d bytes>)r��tellr��ranger�r#rr�r�r�r�getr��KeyError�logger�debug�seekrZ
_safe_readr�r�r�r�r�r�r�r rf)r`r!�ir�r��countr��tagname�typname�msgZ	unit_sizer�r��here�offsetr#r#r'�load�s^
"


����



�zImageFileDirectory_v2.loadrc
Cs |�dt|j��}g}|t|�t|j�dd}d}t|j���D�]�\}}|tkr`t|�}|j�|�}t�	d|�d|�dt
|����|tjko�t
|t�}|r�|jdkr�d}	nd	}	t|	|d
�}
|j|}|��D]\}}
|
|
|<q�|
�|�}n,t
|t��r|n|f}|j||g|�R�}t�||j�j}|�r:dn
t�|d�}d
|�d|�d|�d|�d�	}|dt|�dk�r�dt|�nt|�7}t�	|�|�r�d}n(|tjtjtjfv�r�t|�}nt|�}t|�dk�r�|�||||�dd�df�qF|�||||�d|�|f�|t|�ddd7}qF|du�r�||\}}}}}|�rXtd��|�d|�d|�d|�}|||||f||<|D]T\}}}}}t�	|�d|�d|�dt
|��dt
|���	�||�d||||�7}�q�|d7}|D].\}}}}}||7}t|�d@�r�|d7}�q�|S)Nr�r-rzTag z, Type: z	, Value: r�sII*sMM*)r��ifdr%zsave: r&r'r(r)r/r*rrr)r,rz&multistrip support not yet implementedrr�r$s) r�r�r��sortedr��STRIPOFFSETSr�r-r/r0r�rr�r^r�r�r��tobytesr�r�r�r�r�rrfr�r�r��append�ljust�NotImplementedErrorr�)r`r8�result�entriesZstripoffsetsr�rar�r�r�r:r�Zifd_tagZ	ifd_valuer�r4r5r6r3r#r#r'r=6sh 


 �


.zImageFileDirectory_v2.tobytescCsN|��dkr&|�|j|�ddd��|��}|�|�}|�|�|t|�S)NrZHL�*r")r+�writer�r�r=r�)r`r!r8rAr#r#r'�save�s

zImageFileDirectory_v2.save)r�NN)T)T)T)T)T)r)2r�r�r�r�rbr�rHr8r��setterr�r�r�r�r�r�r�r�r�r�r�r�r�r�r��list�maprr�r�ZSIGNED_BYTEr�r�ZFLOATr�ZIFDrrr
rrrrrrrr#r9r=rEr#r#r#r'r��sx<

P







���




	7
Lr�r�r�r�Zwrite_cs~eZdZUdZ�fdd�Zedd��Zedd��Zee	d<e
dd	��Zd
d�Zdd
�Z
dd�Zdd�Zdd�Zdd�Z�ZS)�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
    cst�j|i|��d|_dS)NT)�superrbr�)r`rp�kwargs��	__class__r#r'rb�szImageFileDirectory_v1.__init__cCs|jSrS)r�rgr#r#r'r��r)zImageFileDirectory_v1.<lambda>cCs|jSrS)r�rgr#r#r'r��r)r�cCs(||jd�}|j|_|j|_|j|_|S)a2Returns 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`

        rG)rHr�r�r�)�clsZoriginalr:r#r#r'�from_v2�s
zImageFileDirectory_v1.from_v2cCs4t|jd�}t|j�|_t|j�|_t|j�|_|S)a2Returns 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`

        rG)r�rHr�r�r�r�)r`r:r#r#r'�to_v2�s
zImageFileDirectory_v1.to_v2cCs||jvp||jvSrS)r�r�r�r#r#r'r��sz"ImageFileDirectory_v1.__contains__cCstt|j�t|j�B�SrS)r�r�r�r�rgr#r#r'r��szImageFileDirectory_v1.__len__cCstt|j�t|j�B�SrS)r�r�r�r�rgr#r#r'r��szImageFileDirectory_v1.__iter__cCsdD]}|�|||�qdS�N)FT)r�)r`r�rar�r#r#r'r��sz!ImageFileDirectory_v1.__setitem__cCsn||jvrL|j|}|j|}|j|\}}dD]}|�|||||�|�q0|j|}t|ttf�sj|f}|SrQ)r�r�r�r�r�r^r�r�)r`r�r�r�r�r��legacyrNr#r#r'r��s



z!ImageFileDirectory_v1.__getitem__)r�r�r�r�rbr��tagsZtagdatar��__annotations__�classmethodrOrPr�r�r�r�r��
__classcell__r#r#rLr'rI�s

rIcs�eZdZdZdZdZd�fdd�	Zdd�Zed	d
��Z	dd�Z
d
d�Zdd�Zdd�Z
�fdd�Zdd�Zdd�Zdd�Zdd�Z�ZS)�
TiffImageFileZTIFFz
Adobe TIFFFNcsd|_d|_t��||�dSrS)�tag_v2r�rJrb)r`r!�filenamerLr#r'rbszTiffImageFile.__init__cCs�|j�d�}t|�|_d|_|jj|_|_d|_|j|_	g|_
d|_t�
d�t�
d|j���t�
dt|����|�d�dS)z#Open the first image in a TIFF filer"NrJz*** TiffImageFile._open ***z- __first: z- ifh: r)r!rr�rXr:r�Z_TiffImageFile__first�_TiffImageFile__next�_TiffImageFile__frame�_TiffImageFile__fp�
_frame_pos�	_n_framesr/r0r��_seek)r`r�r#r#r'�_open
s

zTiffImageFile._opencCsP|jdurJ|��}|�t|j��|jdur@|�|��d�q"|�|�|jS)Nr)r^r+r_r�r]r1)r`�currentr#r#r'�n_frames#s


zTiffImageFile.n_framescCs<|�|�sdS|�|�t�|j�tj�|j|j�|_dS)z%Select a given frame as current imageN)	Z_seek_checkr_rZ_decompression_bomb_checkr��core�new�mode�im�r`�framer#r#r'r1-s


zTiffImageFile.seekcCs<|j|_|j��t|j�|kr�|js.td��t�d|�d|j	�d|j�d|j�����|j�
|j�|j�|j�t�d|j���|j�
|j�|jj|jvr�d|_n
|jj|_|jdkr�|d|_t|j�dkr�|jdk|_|j	d7_	q|j�
|j|�|j�
|j�t�|j�|_|_||_	|��dS)	Nzno more images in TIFF filezSeeking to frame z, on frame z	, __next z, location: zLoading tags, location: %srr)r\r!r+r�r]rZ�EOFErrorr/r0r[r1r>rXr9r�r^�is_animatedrIrOr�r:�_setuprgr#r#r'r_8s:
���


zTiffImageFile._seekcCs|jS)zReturn the current frame number)r[rgr#r#r'r+\szTiffImageFile.tellcCsd|jvr|�|jd�SiS)z�
        Returns a dictionary containing the XMP tags.
        Requires defusedxml to be installed.
        :returns: XMP tags in a dictionary.
        r)rXZ_getxmprgr#r#r'�getxmp`szTiffImageFile.getxmpcs|jr|jr|��St���SrS)�tile�use_load_libtiff�
_load_libtiffrJr9rgrLr#r'r9hszTiffImageFile.loadcCs�|jrPtjtjtjtjtjtjtjd��	|j�}|durP|j
�|�|_
|j
j|_
|js�d|_|j��|��}tj��D]}||vr�qx|�|�qxdS)N)rrrrr r!r"T)�_tile_orientationrZFLIP_LEFT_RIGHTZ
ROTATE_180ZFLIP_TOP_BOTTOMZ	TRANSPOSEZ
ROTATE_270Z
TRANSVERSEZ	ROTATE_90r-rfZ	transposer��_sizerj�!_close_exclusive_fp_after_loadingr!r+Zgetexifr�TAGS_V2_GROUPS�keys�get_ifd)r`�method�exif�keyr#r#r'�load_endms,��	

zTiffImageFile.load_endc	
Cs�tj�|�|��t|j�dks*td��|jdd}t|jdd�}z6t|jd�oft	�
|j���}t|jd�r~|j��Wnty�d}Yn0|r�||d<t�
|jd	t|�|j�}z|�|j|�Wn.ty�}ztd
�|�WYd}~n
d}~00|j�o|j}t|jd��r<t�d
�|�|j���\}}n\|�rnt�d�|�s^|j�d�|�d�\}}n*t�d�|j�d�|�|j���\}}g|_d|_|��|�r�|j��d|_|dk�r�t|��tj�|�S)zWOverload method triggered when we detect a compressed tiff
        Calls out to libtiffrzNot exactly one tilerr�fileno�flushFr�libtiffzCouldn't set the imageN�getvaluez5have getvalue. just sending in a string from getvaluez3have fileno, calling fileno version of the decoder.sfpfpz+don't have fileno or getvalue. just reading)rr9Zload_preparer�rmr rG�hasattrr!�os�duprzr{Z_getdecoderrer�Z
decoderconfig�setimagerfr�Z
_exclusive_fprjr/r0r	r}r1r�readonlyry�close)	r`Zextentsrpr!�decoder�eZ
close_self_fp�n�errr#r#r'ro�sT
� 





zTiffImageFile._load_libtiffc
Cs�d|jvrtd��t|j�td�|_|j�td�|_|j�td�}|jdkrRd}|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�td�}t|�dk�rFt|�t|�k�r>dk�rFnnd}|j�td�}|j�td�}|dv�rrd}n|dk�r�d}nd}|t|�7}|t|�k�r�t|�dk�r�||}|j�t|jdk�r�|dv�r�dnd�}	t|�|	k�r�td��|jj|||||f}
t
�d|
���zt|
\|_}Wn:t�yd}z t
�d�td�|�WYd}~n
d}~00t
�d|���t
�d|j���|j|jd<|j�td�}
|j�t d�}|
�r:|�r:|j�t!�}|dk�r�|
|f|jd<nX|dk�r|
d |d f|jd<n6|du�r,|
|f|jd<|
|f|jd!<n|
|f|jd!<d}}}g|_"t#�pZ|jd"k|_$|j$�r<|dk�r�|
dd�d|
dd�}
t
�d|
���t|
\|_}|d#k�r�d$}d%|v�r�|�%d%d&�}d'|v�r�|�%d'd&�}|dk�r
|jd(k�r
|jdk�r
d)}||jd*|jj&f}|j"�'d+dd||fd|f��nTt(|jv�sTt)|jv�r~t(|jv�r�|jt(}|j�t*|�}|jd}n"|jt)}|j�d,�}|j�d-�}|D]�}|||k�r�|t+|�d.}nd}|}|jdk�r�||}||}|t
|�df}|j"�'|j||t|||�t|||�f||f�||}||jdk�r�d||}}||jdk�r�d}}|d7}�q�nt
�d/�td��t,|jv�r�|jt,|jd0<|jd1v�r�d2d3�|jt-D�}t.�/d4d5�0|��|_1|j�d6�|_2dS)7z-Setup this image object based on current tagsi�z+Windows Media Photo files not yet supportedrrrr z*** Summary ***z- compression: z- photometric_interpretation: z- planar_configuration: z- fill_order: z- YCbCr subsampling: rz- size: r*r#)rr r"rrr)rr zunknown data organizationzformat key: z- unsupported formatzunknown pixel modeNz- raw mode: z- pil mode: �compressionr�dpigR���Q@�
resolutionrr.�I;16Nz;16Bz;16Nz;16Lrr;Fr|iBiCr"z- unsupported data organization�icc_profile�r?r@cSsg|]}t|d��qS)rr)r$rr#r#r'r��r)z(TiffImageFile._setup.<locals>.<listcomp>�RGB;Lr)i)3rXr �COMPRESSION_INFOr-�COMPRESSION�_compression�PLANAR_CONFIGURATION�_planar_configuration�PHOTOMETRIC_INTERPRETATION�	FILLORDERr/r0r�r��
IMAGEWIDTH�IMAGELENGTHrqr��SAMPLEFORMATr�rWrV�
BITSPERSAMPLE�EXTRASAMPLES�SAMPLESPERPIXELr�rH�	OPEN_INFOrer.r��X_RESOLUTION�Y_RESOLUTION�RESOLUTION_UNITrm�READ_LIBTIFFrnr�r8r>r<�TILEOFFSETS�ROWSPERSTRIP�sum�
ICCPROFILE�COLORMAPr
rr��paletterp)r`�photoZ	fillorderZxsizeZysizeZsampleFormatZ	bps_tupleZextra_tupleZ	bps_countZsamplesPerPixelrx�rawmoder�ZxresZyresZresunit�x�yZlayerrdZoffsetsr�wr8�strideZtile_rawmoder�r#r#r'rk�s�



2

��
 






��� 

��
zTiffImageFile._setupcCsFz8z|j|jkr|j��Wnty.Yn0Wd|_nd|_0dSrS)r\r!r��AttributeErrorrgr#r#r'�
_close__fp�szTiffImageFile._close__fp)NN)r�r�r�r�Zformat_descriptionrrrbr`r�rbr1r_r+rlr9ryrorkr�rVr#r#rLr'rW�s"	
	$UQrWr+r,r:r?r@r8r.r2r6r;r=r<rA�YCbCrrBr9r0r3r7)r+r,r:r?r@r1r.r2r5r;r=r<rAr�rBr9r0r3r7c-Cs,zt|j\}}}}}}Wn8tyR}	z td|j�d��|	�WYd}	~	n
d}	~	00t|d�}
|j}|j}|�d|j�d��}
|
dur�d}
n|
dkr�d}
n|
dkr�d	}
t	p�|
dk}t
|d
d�|
t<|jd|
t
<|jd|
t<d
|vr�|d
}n:d|v�r&|d}t|t��r*t��}|�|�|}ni}t�dt|��t|t��rP|��}|D]l}t|tj��r�|tj��v�r�|�|�|
|<n|�|�|
|<z|j||
j|<Wnt�y�Yn0�qTt|d��rt t!t"t#t$t%fD]2}||j&v�r�|j&||
|<|j&j||
j|<�q�|�d|j�d��}|�r4||
t'<t(dft!dft"dft!dft"dft dft)dft*dft+dft,dff
D] \}}||v�rt|||
|<�qt|�d�}|�r�d|
t <|d|
t!<|d|
t"<|dk�r�||
t-<t.|�dk�r�t.|�|
t/<|du�r||
t0<|dk�r||
t1<t2|
v�r*||
t2<n�|jdv�r�|
t2dk�r�|jdk�r�|�3�}|��}t4|j5�D]:}t4|j6�D](}|||fd k�r�dnd |||f<�qx�qj|}n
t7�8|�}|jd!v�r�|j9�:d"d#�}t;d$d%�|D��|
t<<t.|�|jd|dd&d'}|�rX|dk�rdnt=t>||jd�}|
dk�rbt=|d&d'd'|jd�}n
|jd}|dk�rpd}|dk�r~dn||}|jd|d|}||
t?<|d(k�r�tj@|
jtA<|f|d||jd||df|
tA<t;t4d|||��|
tB<tC�|
d�|
tD<|jd)k�rDtEd*tFd+i�G�D]\}}|
�H||��q,|�r�d,|v�r�|d,} t| tI��r|| dk�s|| d-k�r�tJd.��|
dk�r�tJd/��| |
tK<t�d0�t�d1tL|
�G���d}!t|d2��rz|�Md�tN�O|�P��}!WntQjR�yYn0i}"tFt1tAtBtStTg}#i}$|d|$t-<i}%t|d3��r@|jU��}%tV�W|
�G�t
|di��G�|%�G��D]�\}}|tjXv�r�tjYjZ�s��qb||
jv�r�|
j||"|<n4t|tIt[t\tf��s��qbnt�]|�j^}&|&�r�|&|"|<||$v�rb||#v�rbt|t\��r
|�_d4d5�d6|$|<n"t|t`��r$t[|�|$|<n||$|<�qbt�d7tL|$�G���|jd8v�rVd9}t|$�G��}'|'�a�||
|!||'|"f}(t�b|jd:|(|�}	|	�c|j9d;|j�|	�_d<�\})}*}+|!�s�|�d|+�|*�r��qΐq�|*dk�rtd=|*�d>���n.|
�e|�},tf�g||dd;|j|,||dffg�d?|v�r(|
|_hdS)@Nzcannot write mode z as TIFFrGr�rrrrrr�rrZtiffinforwzTiffinfo Keys: %srXr��descriptionr�Zx_resolutionZy_resolutionZresolution_unitZsoftwareZ	date_timeZartist�	copyrightr�rr*)r+r,r+�r�r;r�css|]}|dVqdS)rNr#r�r#r#r'r�Rr)z_save.<locals>.<genexpr>r!r"rr�)rr)rr��r�r�r��quality�dzInvalid quality settingz5quality setting only supported for 'jpeg' compressionzSaving using libtiff encoderz	Items: %srzr�r�r�rzConverted items: %s)r0r.r�r|r>i@zencoder error z when writing image file�_debug_multipage)i�	SAVE_INFOrer.r r��encoderinfo�
encoderconfigr-r��
WRITE_LIBTIFFror�r�r�r�r^r�rZExifr9r/r0rGrIrPrrsrtrur�r�r~r�r�r��IPTC_NAA_CHUNK�PHOTOSHOP_CHUNK�XMPrXr��IMAGEDESCRIPTION�SOFTWARE�	DATE_TIME�ARTIST�	COPYRIGHTr�r�r�r�r�r��copyr,Zheight�widthr	�invertrfZ
getpaletter�r�rV�
STRIP_SIZEr�r��STRIPBYTECOUNTSr<�COMPRESSION_INFO_REVr��YCBCRSUBSAMPLING�REFERENCEBLACKWHITEr��
setdefaultr�r��JPEGQUALITYr;r1rr�rz�io�UnsupportedOperation�TRANSFERFUNCTION�SUBIFDr��	itertools�chainZLIBTIFF_CORErcZlibtiff_support_custom_tagsr_rfr�r�r�rL�sortZ_getencoderr�rDrEr�_saver�)-rfr!rYr�rHr�r��bitsZextrar�r:r�r�r�r|r�rwrxZiccr�r�Zinverted_imZpxr�r�Zlutr�Zrows_per_stripZstrip_byte_countsZstrips_per_imager�rar��_fp�typesZ	blocklistZattsZ
legacy_ifdr�rSrdr�srr8r#r#r'r��sz*




��






*
""



�
��
 
�


�	
�



�
r�c@s�eZdZgd�Zhd�Zd1dd�Zdd�Zdd	�Zd
d�Zdd
�Z	dd�Z
dd�Zej
fdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zd d!�Zd"d#�Zd$d%�Zd&d'�Zd(d)�Zd*d+�Zd,d-�Zd2d.d/�Zd0S)3�AppendingTiffWriter)
rrrrrr"rrrrr"rr">i riii	rFcCstt|d�r||_d|_nD||_d|_zt||r2dnd�|_WntyZt|d�|_Yn0|j��|_|��dS)NrFTzw+bzr+b)	r~re�close_fpr��openr r+�	beginning�setup)r`�fnrdr#r#r'rbs
zAppendingTiffWriter.__init__cCs�|j�|jtj�d|_d|_|j�d�|_}|s>d|_	dSd|_	|dkrX|�
d�n|dkrl|�
d�ntd	��|��|�
�dS)
NrrTFrDr�rCr�zInvalid TIFF file header)rer1r�r�SEEK_SET�whereToWriteNewIFDOffset�offsetOfNewPager�IIMM�isFirst�	setEndian�RuntimeError�skipIFDs�goToEnd)r`r�r#r#r'r�szAppendingTiffWriter.setupcCs�|jr
dS|j�|j�|j�d�}|s,dS||jkr>td��|��}||j7}|j�|j�|�	|�|j�|�|�
�dS)Nrz1IIMM of new page doesn't match IIMM of first page)r�rer1r�rr�r��readLongr��	writeLong�fixIFD)r`r��	IFDoffsetr#r#r'�finalize's


zAppendingTiffWriter.finalizecCs|��|��dSrS)r�r�rgr#r#r'�newFrame>szAppendingTiffWriter.newFramecCs|SrSr#rgr#r#r'�	__enter__CszAppendingTiffWriter.__enter__cCs|jr|��dS)NF)r�r�)r`�exc_type�	exc_value�	tracebackr#r#r'�__exit__FszAppendingTiffWriter.__exit__cCs|j��|jSrS)rer+r�rgr#r#r'r+KszAppendingTiffWriter.tellcCs*|tjkr||j7}|j�||�|��SrS)rr�r�rer1r+)r`r8�whencer#r#r'r1Ns

zAppendingTiffWriter.seekcCs^|j�dtj�|j��}d|d}d|kr:dkrNnn|j�t|��|j��|_dS)Nrr/)rer1r�SEEK_ENDr+rDr�r�)r`�posZpadBytesr#r#r'r�Us
zAppendingTiffWriter.goToEndcCs.||_|jd|_|jd|_|jd|_dS)Nr,r�ZHHL)�endian�longFmt�shortFmt�	tagFormat)r`r�r#r#r'r�_szAppendingTiffWriter.setEndiancCsP|��}|dkr"|j��d|_qL|j�|�|��}|j�|dtj�qdS)Nrrr-)r�rer+r�r1�	readShortr�SEEK_CUR)r`r��numTagsr#r#r'r�eszAppendingTiffWriter.skipIFDscCs|j�|�SrS)rerDrr#r#r'rDpszAppendingTiffWriter.writecCst�|j|j�d��\}|S)Nr)r�r�r�rerr�r#r#r'r�sszAppendingTiffWriter.readShortcCst�|j|j�d��\}|SrE)r�r�r�rerr�r#r#r'r�wszAppendingTiffWriter.readLongcCsJ|j�dtj�|j�t�|j|��}|durF|dkrFtd|�d���dS)N���r�wrote only � bytes but wanted 4�	rer1rr�rDr�r�r�r��r`raZbytesWrittenr#r#r'�rewriteLastShortToLong{sz*AppendingTiffWriter.rewriteLastShortToLongcCsJ|j�dtj�|j�t�|j|��}|durF|dkrFtd|�d���dS)Nr�rr�� bytes but wanted 2)	rer1rr�rDr�r�r�r�rr#r#r'�rewriteLastShort�sz$AppendingTiffWriter.rewriteLastShortcCsJ|j�dtj�|j�t�|j|��}|durF|dkrFtd|�d���dS)N���rr�r�rrr#r#r'�rewriteLastLong�sz#AppendingTiffWriter.rewriteLastLongcCs:|j�t�|j|��}|dur6|dkr6td|�d���dS)Nrr�r)rerDr�r�r�r�rr#r#r'�
writeShort�szAppendingTiffWriter.writeShortcCs:|j�t�|j|��}|dur6|dkr6td|�d���dS)Nrr�r�)rerDr�r�r�r�rr#r#r'r��szAppendingTiffWriter.writeLongcCs|��|j��dSrS)r�rer�rgr#r#r'r��szAppendingTiffWriter.closecCs|��}t|�D]�}t�|j|j�d��\}}}|j|}||}|dk}|sj|��}	|	|j	7}	|�
|	�||jvr�|j��}
|r�|j
||dk|dkd�|j�|
d�n0|j�|	�|j
||dk|dkd�|j�|
�d}	}
q|r|j�dtj�qdS)Nr"rr)�isShort�isLong)r�r,r�r�r�rer�
fieldSizesr�r�r�Tagsr+�
fixOffsetsr1rr�)r`r�r2r�Z	fieldTyper3Z	fieldSizeZ	totalSizeZisLocalr8ZcurPosr#r#r'r��s2




��
zAppendingTiffWriter.fixIFDcCs�|s|std��t|�D]�}|r(|��n|��}||j7}|r�|dkr�|dkrVtd��|�|�|j�dtj	�|�
tj�|j�dtj	�q|r�|�
|�q|�|�qdS)Nz offset is neither short nor longrrznot implementedi����r")r�r,r�r�r�rrer1rr�rrr�rr)r`r3rr	r2r8r#r#r'r�s

zAppendingTiffWriter.fixOffsetsN)F)FF)r�r�r�r
rrbr�r�r�r�r�r+r�r�r1r�r�r�rDr�r�rrrrr�r�r�rr#r#r#r'r��s0

#r�c	Cs�|j��}|j}t|�dg��}t|d�s:|s:t|||�S|��}z�t|��v}|g|D]Z}||_||_t|d�sxd}	n|j	}	t
|	�D]*}
|�|
�|��t|||�|�
�q�qXWd�n1s�0YW|�|�n|�|�0dS)N�
append_imagesrbr)r�r�r�rGr-r~r�r+r�rbr,r1r9r�)rfr!rYr�r�r
Zcur_idxZtfZimsZnfrr�r#r#r'�	_save_all�s(



,rz.tifz.tiffz
image/tiff)ar�r�Zloggingrr�r��collections.abcrZ	fractionsrZnumbersrr�rrr	r
rZ_binaryr
rZ	getLoggerr�r/r�r�ZIFD_LEGACY_APIr�r�r�r�r�r�r�r�r�r�r<r�r�r�r�r�r�r�r�r�r�r�Z	PREDICTORr�r�r�r�r�Z
JPEGTABLESr�r�r�r�r�r�ZEXIFIFDr�r�ZIMAGEJ_META_DATA_BYTE_COUNTSZIMAGEJ_META_DATAr�r�r�r�rFrIrRrYr�r�rLr�r�r�r��setattrrIZImageFileDirectoryrWr�r�r�rZ
register_openr�Z
register_saveZregister_save_allZregister_extensionsZ
register_mimer#r#r#r'�<module>)s�
��vo\M�o

Youez - 2016 - github.com/yon3zu
LinuXploit