Ë
    Dü´jþ4  ã                   óF  — U d Z ddlmZ ddlmZmZ dedefd„ZdZ	ee
d<    ee	«      Zee   e
d	<    ed
«      Zee   e
d<    ee	«      D � �ci c]  \  } }|| “Œ
 c}} Zeeef   e
d<   dedefd„Zdededefd„Zdedefd„Zdedefd„Zdedefd„Zdededz  fd„Zyc c}} w )a  Early detection of escape-sequence-based encodings (ISO-2022, HZ-GB-2312, UTF-7).

These encodings use ESC (0x1B), tilde (~), or plus (+) sequences to switch
character sets.  They must be detected before binary detection (ESC is a control
byte) and before ASCII detection (HZ-GB-2312 and UTF-7 use only printable ASCII
bytes plus their respective shift markers).

Note: ``from __future__ import annotations`` is intentionally omitted because
this module is compiled with mypyc, which does not support PEP 563 string
annotations.
é    )Údecodes_without_error)ÚDETERMINISTIC_CONFIDENCEÚDetectionResultÚdataÚreturnc                 óî   — d}	 | j                  d|«      }|dk(  ry| j                  d|dz   «      }|dk(  ry| |dz   | }t        |«      dk\  r$t        |«      dz  dk(  rt        d„ |D «       «      ry|dz   }Œs)	a  Check that at least one ~{...~} region contains valid GB2312 byte pairs.

    In HZ-GB-2312 GB mode, characters are encoded as pairs of bytes in the
    0x21-0x7E range.  We require at least one region with a non-empty, even-
    length run of such bytes.
    r   Tó   ~{éÿÿÿÿFó   ~}é   c              3   ó<   K  — | ]  }d |cxk  xr dk  nc –— Œ y­w)é!   é~   N© ©Ú.0Úbs     úU/root/workspace/ytshorts/venv/lib/python3.12/site-packages/chardet/pipeline/escape.pyú	<genexpr>z(_has_valid_hz_regions.<locals>.<genexpr>%   s   è ø€ Ò6¨!�D˜AÖ% ×%Ð%Ñ6ùs   ‚)ÚfindÚlenÚall)r   ÚstartÚbeginÚendÚregions        r   Ú_has_valid_hz_regionsr      s‘   € ð €EØ
Ø—	‘	˜% Ó'ˆØ�BŠ;ØØ�i‰i˜˜u q™yÓ)ˆØ�"Š9ØØ�e˜a‘i #Ð&ˆô �‹K˜1ÒÜ�F“˜a‘ 1Ò$ÜÑ6¨vÔ6Ô6àØ�a‘ˆð ó    s@   ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/Ú
_B64_CHARSÚ_UTF7_BASE64s   ABCDEFGHIJKLMNOPQRSTUVWXYZÚ_B64_UPPERCASEÚ_B64_DECODEÚ	b64_bytesc                 ó¸  — t        | «      }|dz  }|dz  }|dkD  rt        | d      }d|z  dz
  }||z  ry|dz  }t        |«      }d}d}	d}
| D ]1  }|dz  t        |   z  }|	dz  }	|	dk\  sŒ|	dz  }	||	z	  dz  ||
<   |
dz  }
Œ3 d}t        d|dz
  d	«      D ]C  }||   dz  ||dz      z  }d
|cxk  rdk  r
n n|r yd}Œ)d|cxk  rdk  r
n n|s yd}Œ>|r yd}ŒE | S )uØ  Check if base64 bytes decode to valid UTF-16BE with correct padding.

    A valid UTF-7 shifted sequence must:
    1. Contain at least 3 Base64 characters (18 bits, enough for one 16-bit
       UTF-16 code unit).
    2. Have zero-valued trailing padding bits (the unused low bits of the last
       Base64 sextet after the last complete 16-bit code unit).
    3. Decode to valid UTF-16BE â€” no lone surrogates.

    This rejects accidental ``+<alphanum>-`` patterns found in URLs, MIME
    boundaries, hex-encoded hashes (e.g. SHA-1 git refs), and other ASCII data.

    The caller (``_has_valid_utf7_sequences``) already checks ``b64_len >= 3``
    before calling this function, so *b64_bytes* is always at least 3 bytes.
    é   é   r   r
   é   Fé   éÿ   r   i Ø  iÿÛ  Ti Ü  iÿß  )r   r"   Ú	bytearrayÚrange)r#   ÚnÚ
total_bitsÚpadding_bitsÚlast_valÚmaskÚ	num_bytesÚrawÚbit_bufÚ	bit_countÚout_idxÚcÚ	prev_highÚiÚ	code_units                  r   Ú_is_valid_utf7_b64r:   6   sL  € ô  	ˆI‹€AØ�Q‘€Jð  ‘?€LØ�aÒÜ˜y¨™}Ñ-ˆà�\Ñ! QÑ&ˆØ�dŠ?Øð
 ˜a‘€IÜ
�IÓ
€CØ€GØ€IØ€GØò ˆØ˜a‘<¤;¨q¡>Ñ1ˆØ�Q‰ˆ	Ø˜‹>Ø˜‰NˆIØ# yÑ0°DÑ8ˆC�‰LØ�q‰L‰Gðð €IÜ�1�i !‘m QÓ'ò ˆØ˜‘V˜q‘[ C¨¨A©¡JÑ.ˆ	Ø�YÔ( &Õ(ÙÙØ‰IØ�yÔ* FÕ*ÙÙØ‰IáÙØ‰Iðð ˆ=Ðr   Úposc                 óœ   — t         t        d«      z  }d}|dz
  }|dk\  r*| |   }|dv r|dz  }Œ||v r|dz  }|dz  }n	 |dk\  S |dk\  rŒ*|dk\  S )ae  Return True if the ``+`` at *pos* is embedded in a base64 stream.

    Walks backward from *pos*, skipping CR/LF, and counts consecutive base64
    characters (including ``=`` for padding).  If 4 or more are found, the
    ``+`` is likely part of a PEM certificate, email attachment, or similar
    base64 blob rather than a real UTF-7 shift character.
    ó   =r   r'   >   é
   é   é   )r    Ú	frozenset)r   r;   Úb64_with_padÚcountr8   r   s         r   Ú_is_embedded_in_base64rD   s   s€   € ô $0´)¸D³/Ñ#A€LØ€EØˆa‰€AØ
ˆqŠ&Ø�‰GˆØ�ÑØ�‰FˆAØØ�ÑØ�Q‰JˆEØ�‰F‰AàØ�A‰:Ðð ˆq‹&ð �A‰:Ðr   Úb64_datac                 ó`   — t         | d      dz  t         | d      dz  z  t         | d      z  dz	  S )z@Decode the first (only) UTF-16 code unit of a single-unit block.r   é   r'   r%   r   )r"   )rE   s    r   Ú_single_unitrH   ‹   sK   € ô 
�X˜a‘[Ñ	! RÑ	'Ü�x ‘{Ñ# qÑ(ñ	*ä
�h˜q‘kÑ
"ñ	#ð 
ñ	ð r   Úunitc                 óú   — d| cxk  xr dk  nc xsj d| cxk  xr dk  nc xsX d| cxk  xr dk  nc xsF d| cxk  xr dk  nc xs4 d	| cxk  xr d
k  nc xs" d| cxk  xr dk  nc xs d| cxk  xr dk  S c S )z>Script ranges where a lone shifted character plausibly occurs.é€   iÿ  i   iÿ  i    iÿ+  i 0  iÿ0  i N  iÿŸ  i ¬  i£×  i ÿ  iïÿ  r   )rI   s    r   Ú_plausible_lone_unitrL   ”   s”   € ð 	�$Ö ˜&Ô ò 	$Ø�TÖ#˜VÔ#ò	$à�TÖ#˜VÔ#ò	$ð �TÖ#˜VÔ#ò	$ð �TÖ#˜VÔ#ò		$ð
 �TÖ#˜VÔ#ò	$ð �TÖ#˜VÑ#ðñ $ðr   c                 óÎ  — d}	 | j                  t        d«      |«      }|dk(  ry|dz   }|t        | «      k  r| |   t        d«      k(  r|dz   }ŒL|t        | «      k  rX| |   t        d«      k(  rG|t        | «      k  r6| |   t        d«      k(  r%|dz  }|t        | «      k  r| |   t        d«      k(  rŒ%|}Œ²t        | |«      r|}ŒÁ|}|t        | «      k  r*| |   t        v r|dz  }|t        | «      k  r| |   t        v rŒ||z
  }| || }|dk\  rt        d	„ |D «       «      s|}�Œ |dk\  r1t        |«      r&|d
z  dz  dk(  rt        |«      }t        |«      s|}�ŒUyt        ||«      }�Œc)as  Check that *data* contains at least one valid UTF-7 shifted sequence.

    A valid shifted sequence is ``+<base64 chars>`` terminated by either an
    explicit ``-`` or any non-Base64 character (per RFC 2152).  The base64
    portion must decode to valid UTF-16BE with correct zero-padding bits.
    The sequence ``+-`` is a literal plus sign and is **not** counted.
    r   Tú+r
   Fr'   ú-é   c              3   ó,   K  — | ]  }|t         v –— Œ y ­w)N)r!   r   s     r   r   z,_has_valid_utf7_sequences.<locals>.<genexpr>Õ   s   è ø€ Ò#J¸A A¬Ô$7Ñ#Jùs   ‚r%   r&   )
r   Úordr   rD   r    Úanyr:   rH   rL   Úmax)r   r   Ú	shift_posr;   r8   Úb64_lenrE   rI   s           r   Ú_has_valid_utf7_sequencesrW   ¡   s�  € ð €EØ
Ø—I‘Iœc #›h¨Ó.ˆ	Ø˜Š?ØØ˜!‰mˆà”�T“Š?˜t C™y¬C°«HÒ4Ø˜!‘GˆEØð ”�T“Š?˜t C™y¬C°«HÒ4Øœ˜D›	’/ d¨3¡i´3°s³8Ò&;Ø�q‘�ð œ˜D›	’/ d¨3¡i´3°s³8Ó&;àˆEØô " $¨	Ô2ØˆEØàˆØ”#�d“)Šm  Q¡¬<Ñ 7Ø�‰FˆAð ”#�d“)Šm  Q¡¬<Ò 7à�c‘'ˆØ˜˜A�;ˆð �aŠ<¤Ñ#JÀÔ#JÔ JØˆEÙð �aŠ<Ô.¨xÔ8ð ˜!‘ Ñ" aÒ'Ü# HÓ-�Ü+¨DÔ1Ø�EÙØÜ�C˜“ˆñG r   Nc                 óú  — d| v }d| v }d| v }|s|s|sy|r†d| v sd| v sd| v rt        dt        d	¬
«      S d| v rt        dt        d	¬
«      S d| v sd| v sd| v sd| v r,d| v rd| v rt        dt        d	¬
«      S t        dt        d	¬
«      S d| v rt        dt        d¬
«      S |r%d| v r!d| v rt        | «      rt        dt        d¬
«      S |r7t        | «      dk  r)t	        | d«      rt        | «      rt        dt        d¬
«      S y)zÓDetect ISO-2022, HZ-GB-2312, and UTF-7 from escape/tilde/plus sequences.

    :param data: The raw byte data to examine.
    :returns: A :class:`DetectionResult` if an escape encoding is found, or ``None``.
    ó   ó   ~ó   +Ns   $(Os   $(Ps   $(QÚiso2022_jp_2004Úja)ÚencodingÚ
confidenceÚlanguages   (IÚiso2022_jp_exts   $Bs   $@s   (Js   $(Dó   ó   Úiso2022_jp_2s   $)CÚ
iso2022_krÚkor	   r   ÚhzÚzhrK   zutf-7)r   r   r   rT   r   rW   )r   Úhas_escÚ	has_tildeÚhas_pluss       r   Údetect_escape_encodingrl   ð   sd  € ð ˜ˆo€GØ˜�€IØ�tˆ|€Há™9©XØáà˜Ñ ¨tÑ!3°zÀTÑ7IÜ"Ø*Ü3Øôð ð ˜ÑÜ"Ø)Ü3Øôð ð ˜ÑØ˜DÑ Ø˜DÑ Ø˜TÑ!ð ˜$‰ 7¨d¡?Ü&Ø-Ü7Ø!ôð ô #Ø'Ü3Øôð ð ˜ÑÜ"Ø%Ü3Øôð ñ �U˜d‘] u°¡}Ô9NÈtÔ9TÜØÜ/Øô
ð 	
ñ 	Ü�‹I˜ÒÜ! $¨Ô0Ü% dÔ+äØÜ/Øô
ð 	
ð r   )Ú__doc__Úchardet._utilsr   Úchardet.pipeliner   r   ÚbytesÚboolr   r   Ú__annotations__rA   r    Úintr!   Ú	enumerater"   Údictr:   rD   rH   rL   rW   rl   )r8   r6   s   00r   ú<module>rv      s  ðò
õ 1ß Fð ð ¨$ó ð6 X€
ˆEÓ WÙ(¨Ó4€ˆi˜‰nÓ 4ñ "+Ð+HÓ!I€�	˜#‘Ó Iñ 1:¸*Ó0E×F©¨¨1˜q !™tÓF€ˆT�#�s�(‰^Ó Fð: %ð :¨Dó :ðz ð ¨Sð °Tó ð0˜5ð  Só ð
˜sð 
 tó 
ðL Eð L¨dó Lð^Y ð Y¨?¸TÑ+Aô Yùó{ Gs   ÁB