o
    7ήci                     @   s  U d dl Z d dlZd dlZd dlmZmZ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mZ d dlmZmZmZmZmZmZmZmZmZmZmZmZm Z 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+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2 ddl3m4Z4 erd dl5m6Z6 d dl7m8Z8 ddl9m:Z: ddl;m<Z< ddl=m>Z> ddl?m@Z@ ddlmAZAmBZBmCZCmDZDmEZE ee&ee#e e#eFef e#eFeef f  ZGdZHdZIeJeKeLeFeMeNeOe+eeeejPeeeQjReSjRhZTe"e$e  eUd< eVeWeXeYeZeeehZ[e"e$e  eUd< deFdefddZ\ddde&eF deJdeFfdd Z]dedeMfd!d"Z^d#ee$d$  d%eFddfd&d'Z_d(ed)e&e$e e#e$e d*f df deMfd+d,Z`d-ed)e&e$e e#e$e d*f df deMfd.d/ZadeMfd0d1Zbd2eFdeMfd3d4Zce%d5Zdd6eedef d7eedef deedef fd8d9Zed6eeef d:eddfd;d<Zfd=d>d?eKd@eKdAeKdeMfdBdCZgdDedE dFeeFdGf dHe$dI ddJfdKdLZhdMe&e$d$ e$dN f de$d$ fdOdPZidQeFdeFfdRdSZjdQeFdeFfdTdUZke%dVZleFdWdXe&eel e#eld*f f dYeelgeFf deel fdZd[ZmG d\d] d]eFZnG d^d_ d_ZoG d`da daeoZpG dbdc dceoZqG ddde deZrdfdgdhdidjdkdldmdnZsdodpdeFfdqdrZte%dsZudMeudeufdtduZvdveFdeMfdwdxZwh dyZxdveFdeMfdzd{Zyez Z{d|ee d}ee deMfd~dZ|dMe deFde fddZ}deeF deFdeFfddZ~dedeFde#eFe#eFd*f f fddZde$e deFde#eFe#e#eFd*f d*f f fddZe%dZe%dZerG dd deZeeef ZdS G dd deZZdS )    N)OrderedDictdefaultdictdeque)deepcopy)islicezip_longest)BuiltinFunctionTypeCodeTypeFunctionTypeGeneratorType
LambdaType
ModuleType)TYPE_CHECKINGAbstractSetAnyCallable
CollectionDict	GeneratorIterableIteratorListMappingMutableMappingNoReturnOptionalSetTupleTypeTypeVarUnion)	Annotated   )ConfigError)NoneTypeWithArgsTypesall_literal_valuesdisplay_as_typeget_args
get_originis_literal_typeis_union)version_info)	Signature)Path)
BaseConfig)	Dataclass)
ModelField	BaseModel)AbstractSetIntStrDictIntStrAnyIntStrMappingIntStrAnyReprArgs)import_stringsequence_likevalidate_field_namelenient_isinstancelenient_issubclass
in_ipythonis_valid_identifierdeep_updateupdate_not_nonealmost_equal_floats	get_modelto_camelis_valid_fieldsmart_deepcopyPyObjectStrRepresentation
GetterDict
ValueItemsr,   ClassAttribute	path_typeROOT_KEYget_unique_discriminator_alias"get_discriminator_alias_and_valuesDUNDER_ATTRIBUTESLimitedDict__root__IMMUTABLE_NON_COLLECTIONS_TYPESBUILTIN_COLLECTIONSdotted_pathreturnc              
   C   s   ddl m} z| ddd\}}W n ty( } z	td|  d|d}~ww ||}zt||W S  tyK } ztd	| d
| d|d}~ww )z
    Stolen approximately from django. Import a dotted module path and return the attribute/class designated by the
    last name in the path. Raise ImportError if the import fails.
    r   )import_module .r"   "z!" doesn't look like a module pathNzModule "z" does not define a "z" attribute)	importlibrW   striprsplit
ValueErrorImportErrorgetattrAttributeError)rU   rW   module_path
class_nameemodule rf   5/tmp/pip-target-vg8gfxp4/lib/python/pydantic/utils.pyr9   {   s   r9   P   )max_lenvri   c                C   s   t dt t| trt| |d kr| d|d  d  S z|  } W n ty4   | j| } Y nw t| |krE| d|d  d } | S )z`
    Truncate a value and add a unicode ellipsis (three dots) to the end if it was too long
    z:`truncate` is no-longer used by pydantic and is deprecated   N   u   …r"   )	warningswarnDeprecationWarning
isinstancestrlen__repr__	TypeError	__class__)rj   ri   rf   rf   rg   truncate   s   rv   c                 C   s   t | ttttttfS N)rp   listtupleset	frozensetr   r   rj   rf   rf   rg   r:      s   r:   basesr3   
field_namec                 C   s0   | D ]}t ||drtd| d| dqdS )zZ
    Ensure that the field's name does not shadow an existing attribute of the model.
    NzField name "zI" shadows a BaseModel attribute; use a different field name with "alias='z'".)r`   	NameError)r}   r~   baserf   rf   rg   r;      s   r;   oclass_or_tuple.c                 C   s"   zt | |W S  ty   Y dS w NF)rp   rt   )r   r   rf   rf   rg   r<      s
   r<   clsc                 C   s8   zt | to
t| |W S  ty   t | trY dS  w r   )rp   type
issubclassrt   r%   )r   r   rf   rf   rg   r=      s   
r=   c                   C   s$   zt d W dS  ty   Y dS w )zU
    Check whether we're in an ipython environment, including jupyter notebooks.
    __IPYTHON__FT)evalr   rf   rf   rf   rg   r>      s   
r>   
identifierc                 C   s   |   o	t|  S )z
    Checks that a string is a valid identifier and not a Python keyword.
    :param identifier: The identifier to test.
    :return: True if the identifier is valid.
    )isidentifierkeyword	iskeyword)r   rf   rf   rg   r?      s   r?   KeyTypemappingupdating_mappingsc                 G   sd   |   }|D ])}| D ]"\}}||v r*t|| tr*t|tr*t|| |||< q|||< qq|S rw   )copyitemsrp   dictr@   )r   r   updated_mappingupdating_mappingkrj   rf   rf   rg   r@      s    
r@   updatec                 K   s   |  dd | D  d S )Nc                 S   s   i | ]\}}|d ur||qS rw   rf   ).0r   rj   rf   rf   rg   
<dictcomp>   s    z#update_not_none.<locals>.<dictcomp>)r   r   )r   r   rf   rf   rg   rA      s   rA   g:0yE>)deltavalue_1value_2r   c                C   s   t | | |kS )z4
    Return True if two floats are almost equal
    )abs)r   r   r   rf   rf   rg   rB      s   rB   init).Nfieldsr1   configr/   r-   c                 C   st  ddl m}m}m} ddlm} || j }i }d}	d}
t|ddD ]}|j	|j
u r.|}	q#|||j< q#|	rw|j}| D ]9\}}|j}||v sL||v rMq=t|s]|rZt|rZ|}nd}
q=|jsed|jini }|||jfd	|ji|||< q=|j|ju rd}
|	r|
rd
|jfd|j
fg}dd |D |krd}n|	j}||v r|d7 }||v s|	j|d||< |t| ddS )z:
    Generate signature for model based on its fields
    r   )	Parameterr-   	signaturer"   )ExtraNFTdefault
annotation__pydantic_self__datac                 S   s   g | ]}|j |jfqS rf   )namekind)r   prf   rf   rg   
<listcomp>      z,generate_model_signature.<locals>.<listcomp>
extra_data_r   )
parametersreturn_annotation)inspectr   r-   r   r   r   r   valuesr   r   VAR_KEYWORDr   allow_population_by_field_namer   aliasr?   requiredr   KEYWORD_ONLYr   extraallowPOSITIONAL_OR_KEYWORDreplacerx   )r   r   r   r   r-   r   r   present_paramsmerged_paramsvar_kw
use_var_kwparamallow_namesr~   field
param_namekwargsdefault_model_signaturevar_kw_namerf   rf   rg   generate_model_signature   sX   r   objr0   c                 C   sD   ddl m} z| j}W n ty   | }Y nw t||s td|S )Nr"   r2   z7Unsupported type, must be either BaseModel or dataclass)mainr3   __pydantic_model__ra   r   rt   )r   r3   	model_clsrf   rf   rg   rC   .  s   

rC   stringc                 C   s   d dd | dD S )N c                 s   s    | ]}|  V  qd S rw   )
capitalize)r   wordrf   rf   rg   	<genexpr><  s    zto_camel.<locals>.<genexpr>r   )joinsplit)r   rf   rf   rg   rD   ;     rD   c                 C   s4   t | dkrt| }|d  |dd   S |  S )Nr"   r   )rr   rD   lower)r   pascal_stringrf   rf   rg   to_lower_camel?  s   r   T)name_factory
input_listr   c                C   sJ   g }g }| D ]}||}||vr| | | | q||||< q|S )z
    Make a list unique while maintaining order.
    We update the list if another one with the same name is set
    (e.g. root validator overridden in subclass)
    )appendindex)r   r   resultresult_namesrj   v_namerf   rf   rg   unique_listI  s   

r   c                   @   s   e Zd ZdZdefddZdS )rG   z
    String class where repr doesn't include quotes. Useful with Representation when you want to return a string
    representation of something that valid (or pseudo-valid) python.
    rV   c                 C      t | S rw   )rq   selfrf   rf   rg   rs   f  s   zPyObjectStr.__repr__N)__name__
__module____qualname____doc__rq   rs   rf   rf   rf   rg   rG   `  s    rG   c                	   @   s   e Zd ZU dZe Zeedf ed< dddZ	defdd	Z
d
edefddZdeegef dedeeddf fddZdefddZdefddZdddZdS )rH   z
    Mixin to provide __str__, __repr__, and __pretty__ methods. See #884 for more details.

    __pretty__ is used by [devtools](https://python-devtools.helpmanual.io/) to provide human readable representations
    of objects.
    .	__slots__rV   r8   c                    s"    fdd j D }dd |D S )a6  
        Returns the attributes to show in __str__, __repr__, and __pretty__ this is generally overridden.

        Can either return:
        * name - value pairs, e.g.: `[('foo_name', 'foo'), ('bar_name', ['b', 'a', 'r'])]`
        * or, just values, e.g.: `[(None, 'foo'), (None, ['b', 'a', 'r'])]`
        c                 3   s    | ]
}|t  |fV  qd S rw   )r`   )r   sr   rf   rg   r   |      z/Representation.__repr_args__.<locals>.<genexpr>c                 S   s    g | ]\}}|d ur||fqS rw   rf   r   arj   rf   rf   rg   r   }  s     z0Representation.__repr_args__.<locals>.<listcomp>)r   )r   attrsrf   r   rg   __repr_args__t  s   zRepresentation.__repr_args__c                 C   s   | j jS )zA
        Name of the instance's class, used in __repr__.
        )ru   r   r   rf   rf   rg   __repr_name__  s   zRepresentation.__repr_name__join_strc                 C   s   | dd |  D S )Nc                 s   s2    | ]\}}|d u rt |n| d|V  qd S )N=)reprr   rf   rf   rg   r     s   0 z.Representation.__repr_str__.<locals>.<genexpr>)r   r   )r   r   rf   rf   rg   __repr_str__  s   zRepresentation.__repr_str__fmtr   Nc                 k   s`    |   d V  dV  |  D ]\}}|dur|d V  ||V  dV  dV  qdV  dV  dS )	z
        Used by devtools (https://python-devtools.helpmanual.io/) to provide a human readable representations of objects
        (r"   Nr   ,r   ))r   r   )r   r   r   r   valuerf   rf   rg   
__pretty__  s   


zRepresentation.__pretty__c                 C   s
   |  dS )NrX   )r   r   rf   rf   rg   __str__     
zRepresentation.__str__c                 C   s   |    d| d dS )Nr   , r   )r   r   r   rf   rf   rg   rs     r   zRepresentation.__repr__RichReprResultc                 c   s2    |   D ]\}}|du r|V  q||fV  qdS )zGet fields for Rich libraryN)r   )r   r   
field_reprrf   rf   rg   __rich_repr__  s   zRepresentation.__rich_repr__rV   r8   )rV   r   )r   r   r   r   ry   r   r   rq   __annotations__r   r   r   r   r   r   r   r   rs   r   rf   rf   rf   rg   rH   j  s   
 
*rH   c                   @   s   e Zd ZdZdZdefddZdedefdd	Zd%dededefddZ	de
e fddZdee fddZdee fddZdeeeef  fddZdee fddZdefddZdedefddZdedefddZd&d!d"Zdefd#d$Zd
S )'rI   z
    Hack to make object's smell just enough like dicts for validate_model.

    We can't inherit from Mapping[str, Any] because it upsets cython so we have to implement all methods ourselves.
    _objr   c                 C   s
   || _ d S rw   r  )r   r   rf   rf   rg   __init__  r   zGetterDict.__init__keyrV   c              
   C   s2   zt | j|W S  ty } zt||d }~ww rw   )r`   r  ra   KeyError)r   r  rd   rf   rf   rg   __getitem__  s   
zGetterDict.__getitem__Nr   c                 C   s   t | j||S rw   )r`   r  )r   r  r   rf   rf   rg   get     zGetterDict.getc                 C   s   t  S )zn
        We don't want to get any other attributes of obj if the model didn't explicitly ask for them
        )rz   r   rf   rf   rg   
extra_keys  s   zGetterDict.extra_keysc                 C   r   )z
        Keys of the pseudo dictionary, uses a list not set so order information can be maintained like python
        dictionaries.
        )rx   r   rf   rf   rg   keys  s   zGetterDict.keysc                    s    fdd D S )Nc                    s   g | ]} | qS rf   rf   r   r   r   rf   rg   r     s    z%GetterDict.values.<locals>.<listcomp>rf   r   rf   r   rg   r        zGetterDict.valuesc                 c   s     | D ]
}||  |fV  qd S rw   )r  )r   r   rf   rf   rg   r     s   zGetterDict.itemsc                 c   s&    t | jD ]
}|ds|V  qd S )Nr   )dirr  
startswith)r   r   rf   rf   rg   __iter__  s   
zGetterDict.__iter__c                 C   s   t dd | D S )Nc                 s   s    | ]}d V  qdS )r"   Nrf   )r   r   rf   rf   rg   r     s    z%GetterDict.__len__.<locals>.<genexpr>)sumr   rf   rf   rg   __len__  r  zGetterDict.__len__itemc                 C   s   ||   v S rw   )r  r   r  rf   rf   rg   __contains__     zGetterDict.__contains__otherc                 C   s   t | t | kS rw   )r   r   )r   r  rf   rf   rg   __eq__  s   zGetterDict.__eq__r8   c                 C   s   d t | fgS rw   )r   r   rf   rf   rg   r     r	  zGetterDict.__repr_args__c                 C   s   dt | j dS )NzGetterDict[])r'   r  r   rf   rf   rg   r     r  zGetterDict.__repr_name__rw   r   )r   r   r   r   r   r   r  rq   r  r  r   r
  r   r  r   r   r   r   r  intr  boolr  r  r   r   rf   rf   rf   rg   rI     s     
rI   c                
   @   s   e Zd ZdZdZdeded ddfdd	Zd
edefddZ	d
edefddZ
dddeed  fddZdddeddfddZed(dedededefddZeded ddfddZededefd d!Zed"edefd#d$Zd)d&d'ZdS )*rJ   zY
    Class for more convenient calculation of excluded or included fields on values.
    )_items_typer   r   )r4   r7   rV   Nc                 C   s2   |  |}t|ttfr| |t|}|| _d S rw   )_coerce_itemsrp   rx   ry   _normalize_indexesrr   r  )r   r   r   rf   rf   rg   r    s   

zValueItems.__init__r  c                 C   s   |  | j|S )z`
        Check if item is fully excluded.

        :param item: key or index of a value
        )is_truer  r  r  rf   rf   rg   is_excluded  s   zValueItems.is_excludedc                 C   s
   || j v S )zh
        Check if value is contained in self._items

        :param item: key or index of value
        r  r  rf   rf   rg   is_included  s   
zValueItems.is_includedrd   r6   c                 C   s   | j |}| |s|S dS )z
        :param e: key or index of element on value
        :return: raw values for element if self._items is dict and contain needed element
        N)r  r  r   )r   rd   r  rf   rf   rg   for_element  s   zValueItems.for_elementr7   v_lengthr5   c           	      C   s  i }d}|  D ]F\}}t|ts&t|ts&| |s&td| d|j |dkr0| |}qt|ts9td|dk rA|| n|}| 	||
|||< q|sS|S | |rgt|D ]}||d q\|S t|D ]}||i }| |s| 	||||< qk|S )af  
        :param items: dict or set of indexes which will be normalized
        :param v_length: length of sequence indexes of which will be

        >>> self._normalize_indexes({0: True, -2: True, -1: True}, 4)
        {0: True, 2: True, 3: True}
        >>> self._normalize_indexes({'__all__': True}, 4)
        {0: True, 1: True, 2: True, 3: True}
        Nz,Unexpected type of exclude value for index "z" __all__zExcluding fields from a sequence of sub-models or dicts must be performed index-wise: expected integer keys or keyword "__all__"r   .)r   rp   r   r   r   rt   ru   _coerce_valuer  merger  range
setdefault)	r   r   r%  normalized_items	all_itemsirj   normalized_inormalized_itemrf   rf   rg   r    s4   



zValueItems._normalize_indexesFr   override	intersectc                    s   |  |    du r S |  s du rS | r&|r$ S S |r;fdd D  fddD  }nt  fddD  }i }|D ]}| j |||d}|durd|||< qL|S )ae  
        Merge a ``base`` item with an ``override`` item.

        Both ``base`` and ``override`` are converted to dictionaries if possible.
        Sets are converted to dictionaries with the sets entries as keys and
        Ellipsis as values.

        Each key-value pair existing in ``base`` is merged with ``override``,
        while the rest of the key-value pairs are updated recursively with this function.

        Merging takes place based on the "union" of keys if ``intersect`` is
        set to ``False`` (default) and on the intersection of keys if
        ``intersect`` is set to ``True``.
        Nc                       g | ]}| v r|qS rf   rf   r  )r0  rf   rg   r   N  r   z$ValueItems.merge.<locals>.<listcomp>c                    r2  rf   rf   r  r   rf   rg   r   N  r   c                    s   g | ]}| vr|qS rf   rf   r  r3  rf   rg   r   P  r   )r1  )r'  r   rx   r(  r  )r   r   r0  r1  
merge_keysmergedr   merged_itemrf   )r   r0  rg   r(  3  s$   


&zValueItems.mergec                 C   sJ   t | tr	 | S t | trt| d} | S t| dd}t| d|  | S )N.ru   z???z!Unexpected type of exclude value )rp   r   r   r   fromkeysr`   assert_never)r   rc   rf   rf   rg   r  Z  s   
	
zValueItems._coerce_itemsc                 C   s    |d u s	|  |r|S | |S rw   )r   r  )r   r   rf   rf   rg   r'  h  s   
zValueItems._coerce_valuerj   c                 C   s   | du p| du S )NT.rf   r|   rf   rf   rg   r   n  s   zValueItems.is_truer8   c                 C   s   d | j fgS rw   r"  r   rf   rf   rg   r   r  r  zValueItems.__repr_args__)Fr   )r   r   r   r   r   r   r    r  r  r!  r#  r   r$  r  r  classmethodr(  staticmethodr  r'  r   r   rf   rf   rf   rg   rJ     s"    	'&rJ   c                   @   sD   e Zd ZdZdZdededdfddZd	ed
ee ddfddZ	dS )rK   z1
    Hide class attribute from its instances
    r   r   r   r   rV   Nc                 C   s   || _ || _d S rw   r;  )r   r   r   rf   rf   rg   r    s   
zClassAttribute.__init__instanceownerc                 C   s&   |d u r| j S t| jd|jd)Nz attribute of z is class-only)r   ra   r   r   )r   r<  r=  rf   rf   rg   __get__  s   zClassAttribute.__get__)
r   r   r   r   r   rq   r   r  r   r>  rf   rf   rf   rg   rK   v  s
    rK   	directoryfilezmount pointsymlinkzblock devicezchar deviceFIFOsocket)is_diris_fileis_mount
is_symlinkis_block_deviceis_char_deviceis_fifo	is_socketr   r.   c                 C   s:   |   sJ dt D ]\}}t| | r|  S qdS )z0
    Find out what sort of thing a path is.
    zpath does not existunknown)exists
path_typesr   r`   )r   methodr   rf   rf   rg   rL     s   rL   Objc              
   C   sj   | j }|tv r	| S z| s|tv r!|tu r| W S |  W S W t| S W t| S  tttfy4   Y t| S w )z
    Return type as is for immutable built-in types
    Use obj.copy() for built-in empty collections
    Use copy.deepcopy() for non-empty collections and unknown objects
    )	ru   rS   rT   ry   r   rt   r^   RuntimeErrorr   )r   obj_typerf   rf   rg   rF     s   rF   r   c                 C   s   |  dsdS t| kS )Nr   T)r  rM   r   rf   rf   rg   rE     s   
rE   >   r   r   r   __classcell____orig_bases____orig_class__r  c                 C   s   t |  o| tvS rw   )rE   rP   r   rf   rf   rg   is_valid_private_name  r  rV  leftrightc                 C   s*   t | |tdD ]\}}||ur dS qdS )a  
    Check that the items of `left` are the same objects as those in `right`.

    >>> a, b = object(), object()
    >>> all_identical([a, b, a], [a, b, a])
    True
    >>> all_identical([a, b, [a]], [a, b, [a]])  # new list object, while "equal" is not "identical"
    False
    )	fillvalueFT)r   _EMPTY)rW  rX  	left_item
right_itemrf   rf   rg   all_identical  s
   
r]  msgc                 C   s   t |)z
    Helper to make sure that we have covered all possible types.

    This is mostly useful for ``mypy``, docs:
    https://mypy.readthedocs.io/en/latest/literal_types.html#exhaustive-checks
    )rt   )r   r^  rf   rf   rg   r8    s   r8  all_aliasesdiscriminator_keyc                 C   s<   t | }t|dkrtd|ddt|  d| S )zNValidate that all aliases are the same and if that's the case return the aliasr"   zAliases for discriminator z must be the same (got r   r   )rz   rr   r#   r   sortedpop)r_  r`  unique_aliasesrf   rf   rg   rN     s   rN   tpc              
   C   sV  t | dd}t| tu rt| d } t| dr| j} tt| r2t| |\}}|tdd |D fS |r[| j	t
 j}t||\}}tt|dkrUtd|d	t| ||d fS z| j	| j}W n- tyy } z
td
| jd|d}~w ty } ztd| jd||d}~ww t|std|d| jd| j	| jt|fS )z
    Get alias and all valid values in the `Literal` type of the discriminator field
    `tp` can be a `BaseModel` class or directly an `Annotated` `Union` of many.
    __custom_root_type__Fr   r   c                 s   s    | ]
}|D ]}|V  qqd S rw   rf   )r   r   rj   rf   rf   rg   r     r   z5get_discriminator_alias_and_values.<locals>.<genexpr>r"   zField z& is not the same for all submodels of zType z* is not a valid `BaseModel` or `dataclass`NzModel z% needs a discriminator field for key z
 of model z needs to be a `Literal`)r`   r)   r!   r(   hasattrr   r+   _get_union_alias_and_all_valuesry   
__fields__rM   type_rr   rz   r#   r'   ra   rt   r   r  r*   r   r&   )rd  r`  is_root_modelr   
all_values
union_typet_discriminator_typerd   rf   rf   rg   rO     s8   
rO   rl  c                    s0    fddt | D }t| \}}t| |fS )Nc                    s   g | ]}t | qS rf   )rO   )r   tr`  rf   rg   r   "  s    z3_get_union_alias_and_all_values.<locals>.<listcomp>)r(   ziprN   )rl  r`  zipped_aliases_valuesr_  rk  rf   ro  rg   rg    s   rg  KTVTc                   @   s   e Zd ZddefddZdS )rQ     
size_limitc                 C      d S rw   rf   r   ru  rf   rf   rg   r  -  s   LimitedDict.__init__Nrt  )r   r   r   r  r  rf   rf   rf   rg   rQ   ,  s    rQ   c                       sT   e Zd ZdZddef fddZdededd	f fd
dZdedefddZ  Z	S )rQ   a)  
        Limit the size/length of a dict used for caching to avoid unlimited increase in memory usage.

        Since the dict is ordered, and we always remove elements from the beginning, this is effectively a FIFO cache.

        Annoying inheriting from `MutableMapping` breaks cython.
        rt  ru  c                    s   || _ t   d S rw   )ru  superr  rw  ru   rf   rg   r  ;  s   rx  _LimitedDict__key_LimitedDict__valuerV   Nc                    s`   t  || t| | jkr,t| | j | jd  }t|  d | }|D ]}| |= q&d S d S )N
   )rz  __setitem__rr   ru  rx   r  )r   r|  r}  excess	to_remover  r{  rf   rg   r  ?  s   zLimitedDict.__setitem__argsc                 G   rv  rw   rf   )r   r  rf   rf   rg   __class_getitem__G  s   zLimitedDict.__class_getitem__ry  )
r   r   r   r   r  r  r   r  r  rS  rf   rf   r{  rg   rQ   2  s
    )r   rm   weakrefcollectionsr   r   r   r   r   	itertoolsr   r   typesr   r	   r
   r   r   r   typingr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    typing_extensionsr!   errorsr#   r$   r%   r&   r'   r(   r)   r*   r+   versionr,   r   r-   pathlibr.   r   r/   dataclassesr0   r   r1   r   r3   r4   r5   r6   r7   r8   rq   r   r&  rM   r  floatcomplexr  bytesr   refNotImplementedru   EllipsisrS   r  rx   rz   ry   r{   r   rT   r9   rv   r:   r;   r<   r=   r>   r?   r   r@   rA   rB   r   rC   rD   r   r   r   rG   rH   rI   rJ   rK   rN  rL   rP  rF   rE   rP   rV  objectrZ  r]  r8  rN   rO   rg  rr  rs  rQ   rf   rf   rf   rg   <module>   s   
  T(
* 00		. 

&A

<> 
&
)
	