Ë
    ýÇ:jÁD  ã                  óÀ   — d dl mZ d dlZd dlmZ d dlmZmZmZm	Z	m
Z
mZ d dlmZ erd dlZd dlZd dlmZ  G d„ d«      Z ej(                  d¬	«      dd
„«       Zdd„Zy)é    )ÚannotationsN)ÚThreadPoolExecutor)ÚTYPE_CHECKINGÚAbstractSetÚ
CollectionÚLiteralÚNoReturnÚSequence)Ú	_tiktokenc                  óÚ  — e Zd Zddœ	 	 	 	 	 	 	 	 	 d$d„Zd%d„Zd&d„Z e«       ddœ	 	 	 	 	 	 	 d'd„Z e«       ddœ	 	 	 	 	 	 	 d(d	„Zd
dœd)d„Z	d
 e«       ddœ	 	 	 	 	 	 	 	 	 d*d„Z
 e«       ddœ	 	 	 	 	 	 	 d+d„Zd,d„Zd-d„Zd.d/d„Zd0d„Zd1d„Zd2d„Zdd
dœ	 	 	 	 	 	 	 d3d„Zd
dœ	 	 	 	 	 d4d„Zd5d„Zed6d„«       Zej0                  d7d„«       Zd8d„Zed6d„«       Zd9d„Zd&d „Zd:d!„Zd;d"„Zd<d#„Z y)=ÚEncodingN)Úexplicit_n_vocabc               óª  — || _         || _        || _        || _        t	        t	        |j                  «       «      t	        |j                  «       d¬«      «      | _        |r0t        |«      t        |«      z   |k(  sJ ‚| j                  |dz
  k(  sJ ‚t        | j                  j                  «       «      | _	        t        j                  |||«      | _        y)aw  Creates an Encoding object.

        See openai_public.py for examples of how to construct an Encoding object.

        Args:
            name: The name of the encoding. It should be clear from the name of the encoding
                what behaviour to expect, in particular, encodings with different special tokens
                should have different names.
            pat_str: A regex pattern string that is used to split the input text.
            mergeable_ranks: A dictionary mapping mergeable token bytes to their ranks. The ranks
                must correspond to merge priority.
            special_tokens: A dictionary mapping special token strings to their token values.
            explicit_n_vocab: The number of tokens in the vocabulary. If provided, it is checked
                that the number of mergeable tokens and special tokens is equal to this number.
        r   )Údefaulté   N)ÚnameÚ_pat_strÚ_mergeable_ranksÚ_special_tokensÚmaxÚvaluesÚmax_token_valueÚlenÚsetÚ_special_token_valuesr   ÚCoreBPEÚ	_core_bpe)Úselfr   Úpat_strÚmergeable_ranksÚspecial_tokensr   s         úb/home/mcse/projects/srt_converter/srt-converter-venv/lib/python3.12/site-packages/tiktoken/core.pyÚ__init__zEncoding.__init__   sÄ   € ð0 ˆŒ	àˆŒØ /ˆÔØ-ˆÔä"Ü�×&Ñ&Ó(Ó)¬3¨~×/DÑ/DÓ/FÐPQÔ+Ró 
ˆÔñ Ü�Ó'¬#¨nÓ*=Ñ=ÐAQÒQÐQÐQØ×'Ñ'Ð+;¸aÑ+?Ò?Ð?Ð?ô &)¨×)=Ñ)=×)DÑ)DÓ)FÓ%GˆÔ"ä"×*Ñ*¨?¸NÈGÓTˆ�ó    c                ó"   — d| j                   ›d�S )Nz
<Encoding ú>)r   ©r   s    r"   Ú__repr__zEncoding.__repr__;   s   € Ø˜DŸI™I˜=¨Ð*Ð*r$   c                óÒ   — 	 | j                   j                  |«      S # t        $ r@ |j                  dd«      j	                  dd«      }| j                   j                  |«      cY S w xY w)zìEncodes a string into tokens, ignoring special tokens.

        This is equivalent to `encode(text, disallowed_special=())` (but slightly faster).

        ```
        >>> enc.encode_ordinary("hello world")
        [31373, 995]
        úutf-16ÚsurrogatepassÚreplace)r   Úencode_ordinaryÚUnicodeEncodeErrorÚencodeÚdecode©r   Útexts     r"   r-   zEncoding.encode_ordinaryB   s]   € ð	8Ø—>‘>×1Ñ1°$Ó7Ð7øÜ!ò 	8à—;‘;˜x¨Ó9×@Ñ@ÀÈ9ÓUˆDØ—>‘>×1Ñ1°$Ó7Ò7ð	8ús   ‚ �AA&Á%A&Úall©Úallowed_specialÚdisallowed_specialc               óÄ  — |dk(  r| j                   }|dk(  r| j                   |z
  }|rPt        |t        «      st        |«      }t        |«      j	                  |«      x}rt        |j                  «       «       	 | j                  j                  ||«      S # t        $ rA |j                  dd«      j                  dd«      }| j                  j                  ||«      cY S w xY w)aH  Encodes a string into tokens.

        Special tokens are artificial tokens used to unlock capabilities from a model,
        such as fill-in-the-middle. So we want to be careful about accidentally encoding special
        tokens, since they can be used to trick a model into doing something we don't want it to do.

        Hence, by default, encode will raise an error if it encounters text that corresponds
        to a special token. This can be controlled on a per-token level using the `allowed_special`
        and `disallowed_special` parameters. In particular:
        - Setting `disallowed_special` to () will prevent this function from raising errors and
          cause all text corresponding to special tokens to be encoded as natural text.
        - Setting `allowed_special` to "all" will cause this function to treat all text
          corresponding to special tokens to be encoded as special tokens.

        ```
        >>> enc.encode("hello world")
        [31373, 995]
        >>> enc.encode("<|endoftext|>", allowed_special={"<|endoftext|>"})
        [50256]
        >>> enc.encode("<|endoftext|>", allowed_special="all")
        [50256]
        >>> enc.encode("<|endoftext|>")
        # Raises ValueError
        >>> enc.encode("<|endoftext|>", disallowed_special=())
        [27, 91, 437, 1659, 5239, 91, 29]
        ```
        r3   r*   r+   r,   )Úspecial_tokens_setÚ
isinstanceÚ	frozensetÚ_special_token_regexÚsearchÚraise_disallowed_special_tokenÚgroupr   r/   r.   r0   ©r   r2   r5   r6   Úmatchs        r"   r/   zEncoding.encodeR   sÙ   € ðD ˜eÒ#Ø"×5Ñ5ˆOØ Ò&Ø!%×!8Ñ!8¸?Ñ!JÐÙÜÐ0´)Ô<Ü%.Ð/AÓ%BÐ"Ü,Ð-?Ó@×GÑGÈÓMÐMˆuÐMÜ.¨u¯{©{«}Ô=ð
	@Ø—>‘>×(Ñ(¨¨Ó?Ð?øÜ!ò 	@ð —;‘;˜x¨Ó9×@Ñ@ÀÈ9ÓUˆDØ—>‘>×(Ñ(¨¨Ó?Ò?ð	@ús   Á9B ÂACÃCc               ól  — |dk(  r| j                   }|dk(  r| j                   |z
  }|rPt        |t        «      st        |«      }t        |«      j	                  |«      x}rt        |j                  «       «       ddl}| j                  j                  ||«      } |j                  ||j                  ¬«      S )zŒEncodes a string into tokens, returning a numpy array.

        Avoids the overhead of copying the token buffer into a Python list.
        r3   r   N)Údtype)r8   r9   r:   r;   r<   r=   r>   Únumpyr   Úencode_to_tiktoken_bufferÚ
frombufferÚuint32)r   r2   r5   r6   r@   ÚnpÚbuffers          r"   Úencode_to_numpyzEncoding.encode_to_numpyŠ   s¤   € ð ˜eÒ#Ø"×5Ñ5ˆOØ Ò&Ø!%×!8Ñ!8¸?Ñ!JÐÙÜÐ0´)Ô<Ü%.Ð/AÓ%BÐ"Ü,Ð-?Ó@×GÑGÈÓMÐMˆuÐMÜ.¨u¯{©{«}Ô=ãà—‘×9Ñ9¸$ÀÓPˆØˆr�}‰}˜V¨2¯9©9Ô5Ð5r$   é   )Únum_threadsc               ó¸   — t        j                  | j                  «      }t        |«      5 }t	        |j                  ||«      «      cddd«       S # 1 sw Y   yxY w)aD  Encodes a list of strings into tokens, in parallel, ignoring special tokens.

        This is equivalent to `encode_batch(text, disallowed_special=())` (but slightly faster).

        ```
        >>> enc.encode_ordinary_batch(["hello world", "goodbye world"])
        [[31373, 995], [11274, 16390, 995]]
        ```
        N)Ú	functoolsÚpartialr-   r   ÚlistÚmap)r   r2   rK   ÚencoderÚes        r"   Úencode_ordinary_batchzEncoding.encode_ordinary_batch¤   sL   € ô ×#Ñ# D×$8Ñ$8Ó9ˆÜ Ó,ð 	.°Ü˜Ÿ™˜g tÓ,Ó-÷	.÷ 	.ò 	.ús   «AÁA)rK   r5   r6   c               ó>  — |dk(  r| j                   }|dk(  r| j                   |z
  }t        |t        «      st        |«      }t        j                  | j
                  ||¬«      }t        |«      5 }t        |j                  ||«      «      cddd«       S # 1 sw Y   yxY w)a  Encodes a list of strings into tokens, in parallel.

        See `encode` for more details on `allowed_special` and `disallowed_special`.

        ```
        >>> enc.encode_batch(["hello world", "goodbye world"])
        [[31373, 995], [11274, 16390, 995]]
        ```
        r3   r4   N)	r8   r9   r:   rM   rN   r/   r   rO   rP   )r   r2   rK   r5   r6   rQ   rR   s          r"   Úencode_batchzEncoding.encode_batch²   s—   € ð" ˜eÒ#Ø"×5Ñ5ˆOØ Ò&Ø!%×!8Ñ!8¸?Ñ!JÐÜÐ,¬iÔ8Ü!*Ð+=Ó!>Ðä×#Ñ#Ø�K‰K¨ÐM_ô
ˆô   Ó,ð 	.°Ü˜Ÿ™˜g tÓ,Ó-÷	.÷ 	.ò 	.ús   Á.BÂBc               ó(  — |dk(  r| j                   }|dk(  r| j                   |z
  }|rPt        |t        «      st        |«      }t        |«      j	                  |«      x}rt        |j                  «       «       | j                  j                  ||«      S )aÔ  Encodes a string into stable tokens and possible completion sequences.

        Note that the stable tokens will only represent a substring of `text`.

        See `encode` for more details on `allowed_special` and `disallowed_special`.

        This API should itself be considered unstable.

        ```
        >>> enc.encode_with_unstable("hello fanta")
        ([31373], [(277, 4910), (5113, 265), ..., (8842,)])

        >>> text = "..."
        >>> stable_tokens, completions = enc.encode_with_unstable(text)
        >>> assert text.encode().startswith(enc.decode_bytes(stable_tokens))
        >>> assert all(enc.decode_bytes(stable_tokens + seq).startswith(text.encode()) for seq in completions)
        ```
        r3   )	r8   r9   r:   r;   r<   r=   r>   r   Úencode_with_unstabler?   s        r"   rW   zEncoding.encode_with_unstableÐ   s‹   € ð2 ˜eÒ#Ø"×5Ñ5ˆOØ Ò&Ø!%×!8Ñ!8¸?Ñ!JÐÙÜÐ0´)Ô<Ü%.Ð/AÓ%BÐ"Ü,Ð-?Ó@×GÑGÈÓMÐMˆuÐMÜ.¨u¯{©{«}Ô=à�~‰~×2Ñ2°4¸ÓIÐIr$   c                óz   — t        |t        «      r|j                  d«      }| j                  j	                  |«      S )a  Encodes text corresponding to a single token to its token value.

        NOTE: this will encode all special tokens.

        Raises `KeyError` if the token is not in the vocabulary.

        ```
        >>> enc.encode_single_token("hello")
        31373
        ```
        úutf-8)r9   Ústrr/   r   Úencode_single_token©r   Útext_or_bytess     r"   r[   zEncoding.encode_single_tokenõ   s3   € ô �m¤SÔ)Ø)×0Ñ0°Ó9ˆMØ�~‰~×1Ñ1°-Ó@Ð@r$   c                ó8   — | j                   j                  |«      S )zˆDecodes a list of tokens into bytes.

        ```
        >>> enc.decode_bytes([31373, 995])
        b'hello world'
        ```
        )r   Údecode_bytes)r   Útokenss     r"   r_   zEncoding.decode_bytes	  s   € ð �~‰~×*Ñ*¨6Ó2Ð2r$   r,   c                óZ   — | j                   j                  |«      j                  d|¬«      S )au  Decodes a list of tokens into a string.

        WARNING: the default behaviour of this function is lossy, since decoded bytes are not
        guaranteed to be valid UTF-8. You can control this behaviour using the `errors` parameter,
        for instance, setting `errors=strict`.

        ```
        >>> enc.decode([31373, 995])
        'hello world'
        ```
        rY   ©Úerrors)r   r_   r0   )r   r`   rc   s      r"   r0   zEncoding.decode  s)   € ð �~‰~×*Ñ*¨6Ó2×9Ñ9¸'È&Ð9ÓQÐQr$   c                ó8   — | j                   j                  |«      S )zõDecodes a token into bytes.

        NOTE: this will decode all special tokens.

        Raises `KeyError` if the token is not in the vocabulary.

        ```
        >>> enc.decode_single_token_bytes(31373)
        b'hello'
        ```
        )r   Údecode_single_token_bytes©r   Útokens     r"   re   z"Encoding.decode_single_token_bytes!  s   € ð �~‰~×7Ñ7¸Ó>Ð>r$   c                óJ   — |D �cg c]  }| j                  |«      ‘Œ c}S c c}w )zµDecodes a list of tokens into a list of bytes.

        Useful for visualising tokenisation.
        >>> enc.decode_tokens_bytes([31373, 995])
        [b'hello', b' world']
        )re   )r   r`   rg   s      r"   Údecode_tokens_byteszEncoding.decode_tokens_bytes/  s%   € ð DJÖJ¸%�×.Ñ.¨uÕ5ÒJÐJùÒJs   … c           
     ó  — | j                  |«      }d}g }|D ]F  }|j                  t        d|d|d   cxk  xr dk  nc z
  «      «       |t        d„ |D «       «      z  }ŒH dj	                  |«      j                  dd¬«      }||fS )	a.  Decodes a list of tokens into a string and a list of offsets.

        Each offset is the index into text corresponding to the start of each token.
        If UTF-8 character boundaries do not line up with token boundaries, the offset is the index
        of the first character that contains bytes from the token.

        This will currently raise if given tokens that decode to invalid UTF-8; this behaviour may
        change in the future to be more permissive.

        >>> enc.decode_with_offsets([31373, 995])
        ('hello world', [0, 5])
        r   é€   éÀ   c              3  ó<   K  — | ]  }d |cxk  rdk  rŒn d–— Œ y­w)rk   rl   r   N© )Ú.0Úcs     r"   ú	<genexpr>z/Encoding.decode_with_offsets.<locals>.<genexpr>K  s   è ø€ ÒE !°D¸AÔ4DÀÕ4DœAÑEùs   ‚“	r$   rY   Ústrictrb   )ri   Úappendr   ÚsumÚjoinr0   )r   r`   Útoken_bytesÚtext_lenÚoffsetsrg   r2   s          r"   Údecode_with_offsetszEncoding.decode_with_offsets8  s”   € ð ×.Ñ.¨vÓ6ˆàˆØˆØ ò 	FˆEØ�N‰Nœ3˜q (¨d°e¸A±hÖ.EÀÔ.EÑ"FÓGÔHØœÑE uÔEÓEÑE‰Hð	Fð
 �x‰x˜Ó$×+Ñ+¨G¸HÐ+ÓEˆØ�Wˆ}Ðr$   )rc   rK   c               ó¼   — t        j                  | j                  |¬«      }t        |«      5 }t	        |j                  ||«      «      cddd«       S # 1 sw Y   yxY w)zADecodes a batch (list of lists of tokens) into a list of strings.rb   N)rM   rN   r0   r   rO   rP   )r   Úbatchrc   rK   ÚdecoderrR   s         r"   Údecode_batchzEncoding.decode_batchQ  sL   € ô ×#Ñ# D§K¡K¸Ô?ˆÜ Ó,ð 	/°Ü˜Ÿ™˜g uÓ-Ó.÷	/÷ 	/ò 	/ús   ­AÁAc               óŽ   — t        |«      5 }t        |j                  | j                  |«      «      cddd«       S # 1 sw Y   yxY w)z?Decodes a batch (list of lists of tokens) into a list of bytes.N)r   rO   rP   r_   )r   r{   rK   rR   s       r"   Údecode_bytes_batchzEncoding.decode_bytes_batchY  s<   € ô   Ó,ð 	9°Ü˜Ÿ™˜d×/Ñ/°Ó7Ó8÷	9÷ 	9ò 	9ús	   Œ%;»Ac                ó6   — | j                   j                  «       S )z*Returns the list of all token byte values.)r   Útoken_byte_valuesr'   s    r"   r�   zEncoding.token_byte_valuesd  s   € à�~‰~×/Ñ/Ó1Ð1r$   c                ó    — | j                   d   S )Nz<|endoftext|>)r   r'   s    r"   Ú	eot_tokenzEncoding.eot_tokenh  s   € à×#Ñ# OÑ4Ð4r$   c                óH   — t        | j                  j                  «       «      S ©N)r   r   Úkeysr'   s    r"   r8   zEncoding.special_tokens_setl  s   € ä�4×'Ñ'×,Ñ,Ó.Ó/Ð/r$   c                óB   — t        |t        «      sJ ‚|| j                  v S r…   )r9   Úintr   rf   s     r"   Úis_special_tokenzEncoding.is_special_tokenp  s#   € Ü˜%¤Ô%Ð%Ð%Ø˜×2Ñ2Ð2Ð2r$   c                ó    — | j                   dz   S )zEFor backwards compatibility. Prefer to use `enc.max_token_value + 1`.r   )r   r'   s    r"   Ún_vocabzEncoding.n_vocabt  s   € ð ×#Ñ# aÑ'Ð'r$   c                óz   — t        |t        «      r|j                  d«      }| j                  j	                  |«      S )zãEncodes text corresponding to bytes without a regex split.

        NOTE: this will not encode any special tokens.

        ```
        >>> enc.encode_single_piece("helloqqqq")
        [31373, 38227, 38227]
        ```
        rY   )r9   rZ   r/   r   Úencode_single_piecer\   s     r"   Ú_encode_single_piecezEncoding._encode_single_piece}  s3   € ô �m¤SÔ)Ø)×0Ñ0°Ó9ˆMØ�~‰~×1Ñ1°-Ó@Ð@r$   c                óè   — ddl }|j                  | j                  «      }g }|j                  ||«      D ];  }|j	                  | j
                  j                  |j                  d«      «      «       Œ= |S )z?Encodes a string into tokens, but do regex splitting in Python.r   NrY   )ÚregexÚcompiler   ÚfindallÚextendr   r�   r/   )r   r2   r�   Ú_unused_patÚretÚpieces         r"   Ú_encode_only_native_bpez Encoding._encode_only_native_bpe‹  sc   € ó 	à—m‘m D§M¡MÓ2ˆØˆØ—]‘] ;°Ó5ò 	RˆEØ�J‰J�t—~‘~×9Ñ9¸%¿,¹,ÀwÓ:OÓPÕQð	Ràˆ
r$   c                ó8   — | j                   j                  |«      S r…   )r   Ú_encode_bytesr1   s     r"   r™   zEncoding._encode_bytes–  s   € Ø�~‰~×+Ñ+¨DÓ1Ð1r$   c                óâ   — dd l }| |j                  j                  j                  | j                  «      u r| j                  S | j                  | j
                  | j                  | j                  dœS )Nr   )r   r   r    r!   )Útiktoken.registryÚregistryÚ	ENCODINGSÚgetr   r   r   r   )r   Útiktokens     r"   Ú__getstate__zEncoding.__getstate__™  s^   € Û ð �8×$Ñ$×.Ñ.×2Ñ2°4·9±9Ó=Ñ=Ø—9‘9Ðà—I‘IØ—}‘}Ø#×4Ñ4Ø"×2Ñ2ñ	
ð 	
r$   c                ó¦   — dd l }t        |t        «      r+|j                  j	                  |«      j
                  | _        y  | j                  di |¤Ž y )Nr   rn   )r›   r9   rZ   rœ   Úget_encodingÚ__dict__r#   )r   ÚvaluerŸ   s      r"   Ú__setstate__zEncoding.__setstate__¦  sA   € Û ä�eœSÔ!Ø$×-Ñ-×:Ñ:¸5ÓA×JÑJˆDŒMØØˆ�‰Ñ˜Ór$   )
r   rZ   r   rZ   r    zdict[bytes, int]r!   zdict[str, int]r   z
int | None)ÚreturnrZ   )r2   rZ   r¦   ú	list[int])r2   rZ   r5   ú!Literal['all'] | AbstractSet[str]r6   ú Literal['all'] | Collection[str]r¦   r§   )r2   rZ   r5   r¨   r6   r©   r¦   znpt.NDArray[np.uint32])r2   ú	list[str]rK   rˆ   r¦   úlist[list[int]])
r2   rª   rK   rˆ   r5   r¨   r6   r©   r¦   r«   )r2   rZ   r5   r¨   r6   r©   r¦   z!tuple[list[int], list[list[int]]])r]   ústr | bytesr¦   rˆ   )r`   úSequence[int]r¦   Úbytes)r,   )r`   r­   rc   rZ   r¦   rZ   )rg   rˆ   r¦   r®   )r`   r­   r¦   úlist[bytes])r`   r­   r¦   ztuple[str, list[int]])r{   úSequence[Sequence[int]]rc   rZ   rK   rˆ   r¦   rª   )r{   r°   rK   rˆ   r¦   r¯   )r¦   r¯   )r¦   rˆ   )r¦   zset[str])rg   rˆ   r¦   Úbool)r]   r¬   r¦   r§   )r2   r®   r¦   r§   )r¦   Úobject)r¤   r²   r¦   ÚNone)!Ú__name__Ú
__module__Ú__qualname__r#   r(   r-   r   r/   rI   rS   rU   rW   r[   r_   r0   re   ri   ry   r}   r   r�   Úpropertyrƒ   rM   Úcached_propertyr8   r‰   r‹   rŽ   r—   r™   r    r¥   rn   r$   r"   r   r      s$  „ ð (,ñ(Uàð(Uð ð	(Uð
 *ð(Uð 'ð(Uð %ó(UóT+ó8ñ( >A»UØ?Dñ6@àð6@ð ;ð	6@ð
 =ð6@ð 
ó6@ñx >A»UØ?Dñ6àð6ð ;ð	6ð
 =ð6ð 
 ó6ð4 LMõ .ð$ Ù=@»UØ?Dñ.àð.ð ð	.ð
 ;ð.ð =ð.ð 
ó.ñD >A»UØ?Dñ#Jàð#Jð ;ð	#Jð
 =ð#Jð 
+ó#JóJAó(3ôRó?óKóð4 @IÐ]^ñ/Ø,ð/Ø9<ð/ØWZð/à	ó/ð EFñ9Ø,ð9Ø>Að9à	ó9ó2ð ò5ó ð5ð ×Ñò0ó ð0ó3ð ò(ó ð(óAó	ó2ó
ôr$   r   rk   )Úmaxsizec                ó”   ‡— 	 dd l Šdj                  ˆfd„| D «       «      } ‰j                  d|› d�«      S # t        $ r dd lŠY Œ?w xY w)Nr   ú|c              3  óB   •K  — | ]  } ‰j                   |«      –— Œ y ­wr…   )Úescape)ro   rg   Úres     €r"   rq   z'_special_token_regex.<locals>.<genexpr>µ  s   øè ø€ Ò:¨%�Y�R—Y‘Y˜u×%Ñ:ùs   ƒú(ú))r�   ÚImportErrorr¾   ru   r‘   )r`   Úinnerr¾   s     @r"   r;   r;   ¯  sN   ø€ ðÛð �H‰HÓ:°6Ô:Ó:€EØˆ2�:‰:˜˜%˜ �lÓ#Ð#øô ò Ýðús   ƒ7 ·AÁAc           	     ó,   — t        d| ›d| ›d| ›d�«      ‚)Nz;Encountered text corresponding to disallowed special token zo.
If you want this text to be encoded as a special token, pass it to `allowed_special`, e.g. `allowed_special={z˜, ...}`.
If you want this text to be encoded as normal text, disable the check for this token by passing `disallowed_special=(enc.special_tokens_set - {zQ})`.
To disable this check for all special tokens, pass `disallowed_special=()`.
)Ú
ValueError)rg   s    r"   r=   r=   ¹  s;   € Ü
Ø
EÀeÀYð OAàAFÀ	ð JFàFKÀYð OXð		Xóð r$   )r`   zfrozenset[str]r¦   zre.Pattern[str])rg   rZ   r¦   r	   )Ú
__future__r   rM   Úconcurrent.futuresr   Útypingr   r   r   r   r	   r
   rŸ   r   r¾   rC   rG   Únumpy.typingÚnptr   Ú	lru_cacher;   r=   rn   r$   r"   ú<module>rË      sV   ðÝ "ã Ý 1ß V× Vå áÛãÝ÷\ñ \ð~ €×Ñ˜SÔ!ò$ó "ð$ôr$   