Ë
    ÚŠ±j¼(  ã                   ó`   — d Z ddlZddlm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 G d„ d«      Zy)a  
TLV (Type-Length-Value) Binary Encoder/Decoder

Provides efficient binary serialization for dirty worker protocol messages.
Inspired by OpenBSD msgctl/msgsnd message format.

Type Codes:
    0x00: None (no value bytes)
    0x01: bool (1 byte: 0x00 or 0x01)
    0x05: int64 (8 bytes big-endian signed)
    0x06: float64 (8 bytes IEEE 754)
    0x10: bytes (4-byte length + raw bytes)
    0x11: string (4-byte length + UTF-8 encoded)
    0x20: list (4-byte count + encoded elements)
    0x21: dict (4-byte count + encoded key-value pairs)
é    Né   )ÚDirtyProtocolErroré   é   é   é   é    é!   i   i   c                   ó\   — e Zd ZdZedefd„«       Zed	dededefd„«       Z	edefd„«       Z
y)
Ú
TLVEncoderz¥
    TLV binary encoder/decoder.

    Encodes Python values to binary TLV format and decodes back.
    Supports: None, bool, int, float, bytes, str, list, dict.
    Úreturnc                 óæ  — | €t        t        g«      S t        | t        «      rt        t        | rdg«      S dg«      S t        | t
        «      r't        t        g«      t        j                  d| «      z   S t        | t        «      r't        t        g«      t        j                  d| «      z   S t        | t         «      rdt        | «      t        kD  rt        dt        | «      › dt        › d�«      ‚t        t        g«      t        j                  dt        | «      «      z   | z   S t        | t        «      ru| j!                  d	«      }t        |«      t"        kD  rt        d
t        |«      › dt"        › d�«      ‚t        t$        g«      t        j                  dt        |«      «      z   |z   S t        | t&        t(        f«      rœt        | «      t*        kD  rt        dt        | «      › dt*        › d�«      ‚t        t,        g«      t        j                  dt        | «      «      g}| D ]&  }|j/                  t0        j!                  |«      «       Œ( dj3                  |«      S t        | t4        «      rìt        | «      t6        kD  rt        dt        | «      › dt6        › d�«      ‚t        t8        g«      t        j                  dt        | «      «      g}| j;                  «       D ]h  \  }}t        |t        «      st        |«      }|j/                  t0        j!                  |«      «       |j/                  t0        j!                  |«      «       Œj dj3                  |«      S t        dt=        | «      j>                  › �«      ‚)aJ  
        Encode a Python value to TLV binary format.

        Args:
            value: Python value to encode (None, bool, int, float,
                   bytes, str, list, or dict)

        Returns:
            bytes: TLV-encoded binary data

        Raises:
            DirtyProtocolError: If value type is not supported
        r   r   ú>qú>dúBytes too large: ú bytes (max: ú)ú>Iúutf-8úString too large: úList too large: ú items (max: ó    úDict too large: z#Unsupported type for TLV encoding: ) ÚbytesÚ	TYPE_NONEÚ
isinstanceÚboolÚ	TYPE_BOOLÚintÚ
TYPE_INT64ÚstructÚpackÚfloatÚTYPE_FLOAT64ÚlenÚMAX_BYTES_SIZEr   Ú
TYPE_BYTESÚstrÚencodeÚMAX_STRING_SIZEÚTYPE_STRINGÚlistÚtupleÚMAX_LIST_SIZEÚ	TYPE_LISTÚappendr   ÚjoinÚdictÚMAX_DICT_SIZEÚ	TYPE_DICTÚitemsÚtypeÚ__name__)ÚvalueÚencodedÚpartsÚitemÚkÚvs         úW/var/www/io.vulcan-creative.com/venv/lib/python3.12/site-packages/gunicorn/dirty/tlv.pyr*   zTLVEncoder.encode4   sï  € ð ˆ=Üœ)˜Ó%Ð%ä�eœTÔ"äœ)©U TÐ=Ó>Ð>¸Ð=Ó>Ð>ä�eœSÔ!Üœ*˜Ó&¬¯©°T¸5Ó)AÑAÐAä�eœUÔ#Üœ,˜Ó(¬6¯;©;°t¸UÓ+CÑCÐCä�eœUÔ#Ü�5‹zœNÒ*Ü(Ø'¬¨E«
 |ð 4Ü+Ð,¨Að/óð ô œ*˜Ó&¬¯©°T¼3¸u»:Ó)FÑFÈÑNÐNä�eœSÔ!Ø—l‘l 7Ó+ˆGÜ�7‹|œoÒ-Ü(Ø(¬¨W«¨ð 7Ü,Ð-¨Qð0óð ô œ+˜Ó'¬&¯+©+°d¼CÀ»LÓ*IÑIÈGÑSÐSä�eœd¤E˜]Ô+Ü�5‹zœMÒ)Ü(Ø&¤s¨5£z lð 3Ü*˜O¨1ð.óð ô œI˜;Ó'¬¯©°T¼3¸u»:Ó)FÐGˆEØò 6�Ø—‘œZ×.Ñ.¨tÓ4Õ5ð6à—8‘8˜E“?Ð"ä�eœTÔ"Ü�5‹zœMÒ)Ü(Ø&¤s¨5£z lð 3Ü*˜O¨1ð.óð ô œI˜;Ó'¬¯©°T¼3¸u»:Ó)FÐGˆEØŸ™›ò 3‘��1ä! !¤SÔ)Ü˜A›�AØ—‘œZ×.Ñ.¨qÓ1Ô2Ø—‘œZ×.Ñ.¨qÓ1Õ2ð3ð —8‘8˜E“?Ð"ä Ø1´$°u³+×2FÑ2FÐ1GÐHó
ð 	
r   ÚdataÚoffsetc                 ó,	  — |t        | «      k\  rt        d| ||dz    ¬«      ‚| |   }|dz  }|t        k(  rd|fS |t        k(  r3|t        | «      k\  rt        d| |dz
  |dz    ¬«      ‚| |   dk7  }||dz   fS |t        k(  rM|dz   t        | «      kD  rt        d	| |dz
  |dz    ¬«      ‚t        j                  d
| ||dz    «      d   }||dz   fS |t        k(  rM|dz   t        | «      kD  rt        d| |dz
  |dz    ¬«      ‚t        j                  d| ||dz    «      d   }||dz   fS |t        k(  r²|dz   t        | «      kD  rt        d| |dz
  |dz    ¬«      ‚t        j                  d| ||dz    «      d   }|dz  }|t        kD  rt        d|› dt        › d�«      ‚||z   t        | «      kD  r(t        d|› dt        | «      |z
  › �| |dz
  |dz    ¬«      ‚| |||z    }|||z   fS |t        k(  rÂ|dz   t        | «      kD  rt        d| |dz
  |dz    ¬«      ‚t        j                  d| ||dz    «      d   }|dz  }|t        kD  rt        d|› dt        › d�«      ‚||z   t        | «      kD  r(t        d|› dt        | «      |z
  › �| |dz
  |dz    ¬«      ‚	 | |||z    j                  d«      }|||z   fS |t        k(  rª|dz   t        | «      kD  rt        d| |dz
  |dz    ¬«      ‚t        j                  d| ||dz    «      d   }|dz  }|t         kD  rt        d|› dt         › d�«      ‚g }t#        |«      D ],  }t$        j                  | |«      \  }	}|j'                  |	«       Œ. ||fS |t(        k(  rè|dz   t        | «      kD  rt        d| |dz
  |dz    ¬«      ‚t        j                  d| ||dz    «      d   }|dz  }|t*        kD  rt        d|› dt*        › d�«      ‚i }
t#        |«      D ]j  }t$        j                  | |«      \  }}t-        |t.        «      s!t        d t1        |«      j2                  › �«      ‚t$        j                  | |«      \  }}||
|<   Œl |
|fS t        d!|d"›�| |dz
  |dz    ¬«      ‚# t        $ r%}t        d|› �| ||t        |d«      z    ¬«      ‚d}~ww xY w)#a9  
        Decode a TLV-encoded value from binary data.

        Args:
            data: Binary data to decode
            offset: Starting offset in the data

        Returns:
            tuple: (decoded_value, new_offset)

        Raises:
            DirtyProtocolError: If data is malformed or truncated
        z Truncated TLV data: no type byteé   ©Úraw_datar   Nz&Truncated TLV data: missing bool valuer   é   z$Truncated TLV data: incomplete int64r   z&Truncated TLV data: incomplete float64r   é   z+Truncated TLV data: incomplete bytes lengthr   r   r   r   zTruncated TLV data: expected z bytes, got r   z,Truncated TLV data: incomplete string lengthr   z bytes for string, got r   zInvalid UTF-8 in string: z)Truncated TLV data: incomplete list countr   r   z)Truncated TLV data: incomplete dict countr   zDict key must be string, got zUnknown TLV type code: 0xÚ02x)r&   r   r   r   r!   r"   Úunpackr%   r(   r'   r,   r+   ÚdecodeÚUnicodeDecodeErrorÚminr0   r/   Úranger   r1   r5   r4   r   r)   r7   r8   )r@   rA   Ú	type_coder9   ÚlengthÚeÚcountr6   Ú_r<   ÚresultÚkeys               r?   rJ   zTLVEncoder.decode   sà  € ð ”S˜“YÒÜ$Ø2Ø˜f V¨b¡[Ð1ôð ð
 ˜‘Lˆ	Ø�!‰ˆàœ	Ò!Ø˜�<Ðàœ	Ò!Øœ˜T›Ò"Ü(Ø<Ø! &¨1¡*¨V°b©[Ð9ôð ð ˜‘L DÑ(ˆEØ˜& 1™*Ð$Ð$àœ
Ò"Ø˜‰zœC ›IÒ%Ü(Ø:Ø! &¨1¡*¨V°b©[Ð9ôð ô —M‘M $¨¨V°F¸Q±JÐ(?Ó@ÀÑCˆEØ˜& 1™*Ð$Ð$àœÒ$Ø˜‰zœC ›IÒ%Ü(Ø<Ø! &¨1¡*¨V°b©[Ð9ôð ô —M‘M $¨¨V°F¸Q±JÐ(?Ó@ÀÑCˆEØ˜& 1™*Ð$Ð$àœ
Ò"Ø˜‰zœC ›IÒ%Ü(ØAØ! &¨1¡*¨V°b©[Ð9ôð ô —]‘] 4¨¨f°V¸a±ZÐ)@ÓAÀ!ÑDˆFØ�a‰KˆFàœÒ&Ü(Ø'¨ x¨}¼^Ð<LÈAÐNóð ð ˜‰¤ T£Ò*Ü(Ø3°F°8ð <Ü˜t›9 vÑ-Ð.ð0à! &¨1¡*¨V°b©[Ð9ôð ð
 ˜ ¨¡Ð0ˆEØ˜& 6™/Ð)Ð)àœÒ#Ø˜‰zœC ›IÒ%Ü(ØBØ! &¨1¡*¨V°b©[Ð9ôð ô —]‘] 4¨¨f°V¸a±ZÐ)@ÓAÀ!ÑDˆFØ�a‰KˆFàœÒ'Ü(Ø(¨¨°¼oÐ=NÈaÐPóð ð ˜‰¤ T£Ò*Ü(Ø3°F°8ð <Ü˜t›9 vÑ-Ð.ð0à! &¨1¡*¨V°b©[Ð9ôð ð
Ø˜V F¨V¡OÐ4×;Ñ;¸GÓD�ð ˜& 6™/Ð)Ð)àœ	Ò!Ø˜‰zœC ›IÒ%Ü(Ø?Ø! &¨1¡*¨V°b©[Ð9ôð ô —M‘M $¨¨V°F¸Q±JÐ(?Ó@ÀÑCˆEØ�a‰KˆFà”}Ò$Ü(Ø& u g¨]¼=¸/ÈÐKóð ð ˆEÜ˜5“\ò #�Ü)×0Ñ0°°vÓ>‘��fØ—‘˜TÕ"ð#ð ˜&�=Ð àœ	Ò!Ø˜‰zœC ›IÒ%Ü(Ø?Ø! &¨1¡*¨V°b©[Ð9ôð ô —M‘M $¨¨V°F¸Q±JÐ(?Ó@ÀÑCˆEØ�a‰KˆFà”}Ò$Ü(Ø& u g¨]¼=¸/ÈÐKóð ð ˆFÜ˜5“\ò $�Ü(×/Ñ/°°fÓ=‘��VÜ! #¤sÔ+Ü,Ø7¼¸S»	×8JÑ8JÐ7KÐLóð ô !+× 1Ñ 1°$¸Ó ?‘��vØ#��s’ð$ð ˜6�>Ð!ä Ø'¨	°# Ð7Ø˜& 1™* V¨b¡[Ð1ô
ð 	
øôi &ò Ü(Ø/°¨sÐ3Ø! &¨´#°f¸b³/Ñ)AÐBôð ûðús   Ê	Q% Ñ%	RÑ. RÒRc                 óš   — t         j                  | d«      \  }}|t        | «      k7  r#t        dt        | «      |z
  › d�| ||dz    ¬«      ‚|S )a  
        Decode a complete TLV-encoded value, ensuring all data is consumed.

        Args:
            data: Binary data to decode

        Returns:
            Decoded Python value

        Raises:
            DirtyProtocolError: If data is malformed or has trailing bytes
        r   zTrailing data after TLV: z bytesrC   rD   )r   rJ   r&   r   )r@   r9   rA   s      r?   Údecode_fullzTLVEncoder.decode_full  s^   € ô #×)Ñ)¨$°Ó2‰ˆˆvØ”S˜“YÒÜ$Ø+¬C°«I¸Ñ,>Ð+?¸vÐFØ˜f V¨b¡[Ð1ôð ð ˆr   N)r   )r8   Ú
__module__Ú__qualname__Ú__doc__Ústaticmethodr   r*   r    r.   rJ   rV   © r   r?   r   r   ,   sp   „ ñð ðH
˜ò H
ó ðH
ðT ñY
�Uð Y
 Cð Y
°ò Y
ó ðY
ðv ð˜%ò ó ñr   r   )rY   r"   Úerrorsr   r   r   r!   r%   r(   r,   r0   r5   r+   r'   r/   r4   r   r[   r   r?   ú<module>r]      s^   ðñ
ó" å &ð €	Ø€	Ø€
Ø€Ø€
Ø€Ø€	Ø€	ð #€Ø!€Ø€Ø€÷Cò Cr   