U
    €Acj˜y ã                   @  sš  d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlZd dlmZmZ d dlmZ d dlmZmZmZ ddlmZ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# e$j%Z&d
Z'dZ(dZ)e
 *i ¡Z+e$ƒ Z,e -ej.ej/¡Z0G dd„ dej1ƒZ2e2j3Z3G dd„ de4ƒZ5e3ddddddddddddddfdd„Z6d›ddddddœdd„Z7dœddddddœdd „Z8dd!d"d#œd$d%„Z9G d&d'„ d'eƒZ:d(d)„ Z;d*d+„ Z<d,d-œd.d/„Z=d0d1„ Z>d'd-œd2d3„Z?d4d5„ Z@d6d7„ ZAd8d9„ ZBd:d;„ ZCG d<d=„ d=ƒZDd>d?„ ZEd@dA„ ZFd�dBdC„ZGdždDdE„ZHeHZIdFdG„ ZJd"dddHœdIdJ„ZKd"dKdLdLdMdNœdOdP„ZLd"dKdQœdRdS„ZMdTdU„ ZNdVdMdWœdXdY„ZOdZd[„ ZPdŸd\d]„ZQdMd-œd^d_„ZRd d`da„ZSdbdc„ ZTddde„ ZUdfdg„ Z/dhdi„ ZVdjd-œdkdl„ZWdddLddmœdndo„ZXdddLdpddqœdrds„ZYdddLddtœdudv„ZZdddLdpddqœdwdx„Z[dLdLdydzœd{d|„Z\dKdLdLdLdLdLdLdydLdLdLddjd}œd~d„Z]ddd€œd�d‚„Z^G dƒd„„ d„ƒZ_d…d†„ e_j`D ƒZaeMeQeSe_ead‡�dˆd†„ eaD ƒd‡�d‰d†„ eaD ƒd‡�Z_G dŠd‹„ d‹ƒZbeQeSebƒƒZbG dŒd�„ d�ƒZcdŽd†„ ecj`D ƒZdeMeQeSecedd‡�edd‡�edd‡�ZcG d�dp„ dpƒZed�d†„ d‘D ƒZdeMeQeSeeedd‡�edd‡�edd‡�Zee$fdfd’d“„ZfeHddd”�G d•d–„ d–ƒƒZgd—d˜„ Zhd™dš„ Z-dS )¡é    )ÚannotationsN)ÚCallableÚMapping)Úcached_property)ÚAnyÚ
NamedTupleÚTypeVaré   )Ú_compatÚ_configÚsetters)ÚPY_3_10_PLUSÚPY_3_11_PLUSÚPY_3_13_PLUSÚ_AnnotationExtractorÚ_get_annotationsÚget_generic_base)ÚDefaultAlreadySetErrorÚFrozenInstanceErrorÚNotAnAttrsClassErrorÚUnannotatedAttributeErrorz__attr_factory_%s)ztyping.ClassVarz
t.ClassVarÚClassVarztyping_extensions.ClassVarZ_attrs_cached_hashc                   @  s(   e Zd ZdZe ¡ Zdd„ Zdd„ ZdS )Ú_NothingaF  
    Sentinel to indicate the lack of a value when `None` is ambiguous.

    If extending attrs, you can use ``typing.Literal[NOTHING]`` to show
    that a value may be ``NOTHING``.

    .. versionchanged:: 21.1.0 ``bool(NOTHING)`` is now False.
    .. versionchanged:: 22.2.0 ``NOTHING`` is now an ``enum.Enum`` variant.
    c                 C  s   dS )NÚNOTHING© ©Úselfr   r   ú./tmp/pip-unpacked-wheel-6bu72_9y/attr/_make.pyÚ__repr__J   s    z_Nothing.__repr__c                 C  s   dS )NFr   r   r   r   r   Ú__bool__M   s    z_Nothing.__bool__N)	Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚenumÚautor   r   r   r   r   r   r   r   =   s   
r   c                   @  s"   e Zd ZdZedƒdfdd„ZdS )Ú_CacheHashWrappera  
    An integer subclass that pickles / copies as None

    This is used for non-slots classes with ``cache_hash=True``, to avoid
    serializing a potentially (even likely) invalid hash value. Since `None`
    is the default value for uncalculated hashes, whenever this is copied,
    the copy's value for the hash should automatically reset.

    See GH #613 for more details.
    Nr   c                 C  s   ||fS ©Nr   )r   Z_none_constructorÚ_argsr   r   r   Ú
__reduce__e   s    z_CacheHashWrapper.__reduce__)r    r!   r"   r#   Útyper)   r   r   r   r   r&   Y   s   r&   TFc                 C  sò   t |||dƒ\}}}}|dk	r:|dk	r:|dk	r:d}t|ƒ‚|	dk	rr| tk	rVd}t|ƒ‚t|	ƒsjd}t|ƒ‚t|	ƒ} |dkr~i }t|ttfƒr–t	j
|Ž }|r°t|ttfƒr°t|Ž }|rÊt|ttfƒrÊt
|Ž }t| ||d||||||
||||||d�S )a¿  
    Create a new field / attribute on a class.

    Identical to `attrs.field`, except it's not keyword-only.

    Consider using `attrs.field` in new code (``attr.ib`` will *never* go away,
    though).

    ..  warning::

        Does **nothing** unless the class is also decorated with
        `attr.s` (or similar)!


    .. versionadded:: 15.2.0 *convert*
    .. versionadded:: 16.3.0 *metadata*
    .. versionchanged:: 17.1.0 *validator* can be a ``list`` now.
    .. versionchanged:: 17.1.0
       *hash* is `None` and therefore mirrors *eq* by default.
    .. versionadded:: 17.3.0 *type*
    .. deprecated:: 17.4.0 *convert*
    .. versionadded:: 17.4.0
       *converter* as a replacement for the deprecated *convert* to achieve
       consistency with other noun-based arguments.
    .. versionadded:: 18.1.0
       ``factory=f`` is syntactic sugar for ``default=attr.Factory(f)``.
    .. versionadded:: 18.2.0 *kw_only*
    .. versionchanged:: 19.2.0 *convert* keyword argument removed.
    .. versionchanged:: 19.2.0 *repr* also accepts a custom callable.
    .. deprecated:: 19.2.0 *cmp* Removal on or after 2021-06-01.
    .. versionadded:: 19.2.0 *eq* and *order*
    .. versionadded:: 20.1.0 *on_setattr*
    .. versionchanged:: 20.3.0 *kw_only* backported to Python 2
    .. versionchanged:: 21.1.0
       *eq*, *order*, and *cmp* also accept a custom callable
    .. versionchanged:: 21.1.0 *cmp* undeprecated
    .. versionadded:: 22.2.0 *alias*
    TNFú6Invalid value for hash.  Must be True, False, or None.z=The `default` and `factory` arguments are mutually exclusive.z*The `factory` argument must be a callable.)ÚdefaultÚ	validatorÚreprÚcmpÚhashÚinitÚ	converterÚmetadatar*   Úkw_onlyÚeqÚeq_keyÚorderÚ	order_keyÚ
on_setattrÚalias)Ú_determine_attrib_eq_orderÚ	TypeErrorr   Ú
ValueErrorÚcallableÚFactoryÚ
isinstanceÚlistÚtupler   ÚpipeÚand_Ú_CountingAttr)r,   r-   r.   r/   r0   r1   r3   r*   r2   Úfactoryr4   r5   r7   r9   r:   r6   r8   Úmsgr   r   r   Úattribi   sX    7   ÿÿ
ðrH   Ú Ústrzdict[str, Any] | NonezMapping[str, object] | NoneÚNone)ÚscriptÚglobsÚlocsÚfilenameÚreturnc                 C  s   t | |dƒ}t|||ƒ dS )z[
    Evaluate the script with the given global (globs) and local (locs)
    variables.
    ÚexecN)ÚcompileÚeval)rL   rM   rN   rO   Úbytecoder   r   r   Ú_compile_and_evalÔ   s    
rU   zdict[str, Any])rL   rO   rM   ÚlocalsrP   c           	      C  sz   |dkri n|}d}|}t | ƒd|  d¡|f}tj ||¡}||krFqh|dd… › d|› d�}|d7 }qt| |||ƒ |S )zP
    Cache the script with _linecache_, compile it and return the _locals_.
    Nr	   Téÿÿÿÿú-ú>)ÚlenÚ
splitlinesÚ	linecacheÚcacheÚ
setdefaultrU   )	rL   rO   rM   rV   rN   ÚcountÚbase_filenameZlinecache_tupleZold_valr   r   r   Ú_linecache_and_compileâ   s    
ü
ra   z	list[str]r*   )Úcls_nameÚ
attr_namesrP   c                 C  sF   | › d�}i }t |ƒD ] \}}|fdd„}t|ƒ||< qt|tf|ƒS )zé
    Create a tuple subclass to hold `Attribute`s for an `attrs` class.

    The subclass is a bare tuple with properties for names.

    class MyClassAttributes(tuple):
        __slots__ = ()
        x = property(itemgetter(0))
    Z
Attributesc                 S  s   | | S r'   r   )r   Úir   r   r   Úgetter  s    z&_make_attr_tuple_class.<locals>.getter)Ú	enumerateÚpropertyr*   rB   )rb   rc   Zattr_class_nameÚbodyrd   Ú	attr_namere   r   r   r   Ú_make_attr_tuple_class  s    

rj   c                   @  s&   e Zd ZU ded< ded< ded< dS )Ú_Attributesr*   Úattrsúlist[Attribute]Ú
base_attrsúdict[str, type]Zbase_attrs_mapN)r    r!   r"   Ú__annotations__r   r   r   r   rk     s   
rk   c                 C  s2   t | ƒ} |  d¡r(|  d¡r(| dd… } |  t¡S )zñ
    Check whether *annot* is a typing.ClassVar.

    The string comparison hack is used to avoid evaluating all string
    annotations which would put attrs-based classes at a performance
    disadvantage compared to plain old classes.
    )ú'ú"r	   rW   )rJ   Ú
startswithÚendswithÚ_CLASSVAR_PREFIXES)Zannotr   r   r   Ú_is_class_var"  s    rv   c                 C  s
   || j kS )zR
    Check whether *cls* defines *attrib_name* (and doesn't just inherit it).
    )Ú__dict__)ÚclsZattrib_namer   r   r   Ú_has_own_attribute3  s    ry   z'tuple[list[Attribute], dict[str, type]]©rP   c                 C  s¨   g }i }t | jdd… ƒD ]H}t|dg ƒD ]6}|js*|j|kr@q*|jdd�}| |¡ |||j< q*qg }tƒ }t |ƒD ](}|j|kr†qv| d|¡ | 	|j¡ qv||fS )zQ
    Collect attr.ibs from base classes of *cls*, except *taken_attr_names*.
    r	   rW   Ú__attrs_attrs__T©Ú	inheritedr   )
ÚreversedÚ__mro__Úgetattrr}   ÚnameÚevolveÚappendÚsetÚinsertÚadd)rx   Útaken_attr_namesrn   Úbase_attr_mapÚbase_clsÚaÚfilteredÚseenr   r   r   Ú_collect_base_attrs:  s"    

r�   c                 C  sn   g }i }| j dd… D ]N}t|dg ƒD ]<}|j|kr6q&|jdd�}| |j¡ | |¡ |||j< q&q||fS )a-  
    Collect attr.ibs from base classes of *cls*, except *taken_attr_names*.

    N.B. *taken_attr_names* will be mutated.

    Adhere to the old incorrect behavior.

    Notably it collects from the front and considers inherited attributes which
    leads to the buggy behavior reported in #428.
    r	   rW   r{   Tr|   )r   r€   r�   r‚   r†   rƒ   )rx   r‡   rn   rˆ   r‰   rŠ   r   r   r   Ú_collect_base_attrs_broken[  s    

rŽ   c              	     s0  | j ‰t| ƒ‰ |dk	r$t| ¡ ƒ}nÈ|dkrÎdd„ ˆ ¡ D ƒ}g }tƒ }ˆ  ¡ D ]H\}	}
t|
ƒrbqP| |	¡ ˆ |	t¡}|j	t
k	rŠt|ƒ}| |	|f¡ qP|| }|rìtdd t|‡fdd„d	�¡ d
 ƒ‚ntdd„ ˆ ¡ D ƒdd„ d	�}tj‰‡ ‡fdd„|D ƒ}|�r&t| dd„ |D ƒƒ\}}nt| dd„ |D ƒƒ\}}|�r`dd„ |D ƒ}dd„ |D ƒ}|| }|dk	�r€t|| |ƒƒ}d}dd„ |D ƒD ]H}|dk�r¾|jtk�r¾d|›�}t|ƒ‚|dk�r’|jtk	�r’d}�q’|D ]$}|j�sàt |¡dt|jƒƒ �qàdd„ |D ƒ}t| j|ƒ}t||ƒ||ƒS )a3  
    Transform all `_CountingAttr`s on a class into `Attribute`s.

    If *these* is passed, use that and don't look for them on the class.

    If *collect_by_mro* is True, collect them in the correct MRO order,
    otherwise use the old -- incorrect -- order.  See #428.

    Return an `_Attributes`.
    NTc                 S  s   h | ]\}}|j tkr|’qS r   ©Ú	__class__rE   ©Ú.0r�   Úattrr   r   r   Ú	<setcomp>Š  s   
þz#_transform_attrs.<locals>.<setcomp>z1The following `attr.ib`s lack a type annotation: ú, c                   s   ˆ   | ¡jS r'   )ÚgetÚcounter)Ún)Úcdr   r   Ú<lambda>   ó    z"_transform_attrs.<locals>.<lambda>)ÚkeyÚ.c                 s  s$   | ]\}}|j tkr||fV  qd S r'   r�   r‘   r   r   r   Ú	<genexpr>¦  s   
þz#_transform_attrs.<locals>.<genexpr>c                 S  s
   | d j S ©Nr	   )r—   )Úer   r   r   rš   «  r›   c                   s"   g | ]\}}ˆ||ˆ   |¡ƒ‘qS r   )r–   )r’   ri   Úca)ÚannsÚfcar   r   Ú
<listcomp>¯  s    z$_transform_attrs.<locals>.<listcomp>c                 S  s   h | ]
}|j ’qS r   ©r�   ©r’   rŠ   r   r   r   r”   µ  s     c                 S  s   h | ]
}|j ’qS r   r¥   r¦   r   r   r   r”   ¹  s     c                 S  s   g | ]}|j d d�‘qS ©T)r4   ©r‚   r¦   r   r   r   r¤   ½  s     c                 S  s   g | ]}|j d d�‘qS r§   r¨   r¦   r   r   r   r¤   ¾  s     Fc                 s  s&   | ]}|j d k	r|jd kr|V  qdS )FN)r1   r4   r¦   r   r   r   rž   Ë  s     
 
 zlNo mandatory attributes allowed after an attribute with a default value or factory.  Attribute in question: r:   c                 S  s   g | ]
}|j ‘qS r   r¥   r¦   r   r   r   r¤   Ý  s     )rw   r   rA   Úitemsr„   rv   r†   r–   r   r�   rE   rH   rƒ   r   ÚjoinÚsortedÚ	AttributeÚfrom_counting_attrr�   rŽ   rB   r,   r=   r:   Ú_OBJ_SETATTRÚ__get__Ú_default_init_alias_forr�   rj   r    rk   )rx   ÚtheseÚauto_attribsr4   Úcollect_by_mroÚfield_transformerZca_listZca_namesZannot_namesri   r*   rŠ   ZunannotatedZ	own_attrsrn   rˆ   rl   Zhad_defaultrG   rc   Z
AttrsClassr   )r¢   r™   r£   r   Ú_transform_attrsw  s†    þ

ÿÿüÿþú	ÿ ÿ
 ÿ

rµ   c              
   C  sˆ   ddddddddd	g	}|d k	r*|  d
¡ n| ddddddddg¡ | ddg¡ t|dƒ}| tj|dœ}td |¡||d|id�d S )Nzdef wrapper(_cls):z    __class__ = _clsz‘    def __getattr__(self, item, cached_properties=cached_properties, original_getattr=original_getattr, _cached_setattr_get=_cached_setattr_get):z+         func = cached_properties.get(item)z         if func is not None:z!              result = func(self)z1              _setter = _cached_setattr_get(self)z#              _setter(item, result)z              return resultz,         return original_getattr(self, item)z         try:z2             return super().__getattribute__(item)z         except AttributeError:z4             if not hasattr(super(), '__getattr__'):z                 raisez-             return super().__getattr__(item)zY         original_error = f"'{self.__class__.__name__}' object has no attribute '{item}'"z-         raise AttributeError(original_error)z    return __getattr__z__getattr__ = wrapper(_cls)r€   )Úcached_propertiesÚ_cached_setattr_getÚoriginal_getattrÚ
Ú_cls)rV   Ú__getattr__)rƒ   ÚextendÚ_generate_unique_filenamer®   r¯   ra   rª   )r¶   r¸   rx   ÚlinesZunique_filenameÚglobr   r   r   Ú_make_cached_property_getattrã  sV    õÿøÿþÿ
ý   ÿþrÀ   c                 C  s,   t | tƒr$|dkr$t | ||¡ dS t‚dS )z4
    Attached to frozen classes as __setattr__.
    )Ú	__cause__Ú__context__Ú__traceback__Ú__suppress_context__Ú	__notes__N)r@   ÚBaseExceptionÚ__setattr__r   ©r   r�   Úvaluer   r   r   Ú_frozen_setattrs  s    rÊ   c                 C  s*   t | tƒr"|dkr"t | |¡ dS t‚dS )z4
    Attached to frozen classes as __delattr__.
    )rÅ   N)r@   rÆ   Ú__delattr__r   )r   r�   r   r   r   Ú_frozen_delattrs(  s    rÌ   c            	      O  s†   z
| \}W n. t k
r8   dt| ƒ› d�}t|ƒd‚Y nX |j}t|ƒ}|D ].}|jsXqL|j}|j}||krLt||ƒ||< qL|f |ŽS )a  
    Create a new instance, based on the first positional argument with
    *changes* applied.

    .. tip::

       On Python 3.13 and later, you can also use `copy.replace` instead.

    Args:

        inst:
            Instance of a class with *attrs* attributes. *inst* must be passed
            as a positional argument.

        changes:
            Keyword changes in the new copy.

    Returns:
        A copy of inst with *changes* incorporated.

    Raises:
        TypeError:
            If *attr_name* couldn't be found in the class ``__init__``.

        attrs.exceptions.NotAnAttrsClassError:
            If *cls* is not an *attrs* class.

    .. versionadded:: 17.1.0
    .. deprecated:: 23.1.0
       It is now deprecated to pass the instance using the keyword argument
       *inst*. It will raise a warning until at least April 2024, after which
       it will become an error. Always pass the instance as a positional
       argument.
    .. versionchanged:: 24.1.0
       *inst* can't be passed as a keyword argument anymore.
    z*evolve() takes 1 positional argument, but z were givenN)	r=   rZ   r<   r�   Úfieldsr1   r�   r:   r€   )	ÚargsÚchangesÚinstrG   rx   rl   rŠ   ri   Z	init_namer   r   r   r‚   3  s     %
ÿr‚   c                   @  sÐ   e Zd ZdZdZddœdd„Zdd„ Zd	d
œdd„Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d+d,œd-d.„Zd+d+d,œd/d0„Zd1S )2Ú_ClassBuilderz(
    Iteratively build *one* class.
    )Ú_add_method_dundersÚ_attr_namesÚ_attrsÚ_base_attr_mapÚ_base_namesÚ_cache_hashrº   Ú	_cls_dictÚ_delete_attribsÚ_frozenÚ_has_custom_setattrÚ_has_post_initÚ_has_pre_initÚ_is_excÚ_on_setattrÚ_pre_init_has_argsÚ_repr_addedÚ_script_snippetsÚ_slotsÚ_weakref_slotÚ_wrote_own_setattrr*   ©rx   c                 C  s  t ||||||ƒ\}}}|| _|r,t|jƒni | _|| _dd„ |D ƒ| _|| _tdd„ |D ƒƒ| _	|| _
|| _|| _|	| _tt|ddƒƒ| _d| _| jr¸|j}t |¡}t|jƒdk| _tt|ddƒƒ| _t|ƒ | _|
| _|| _|| _d| _| j| jd	< |�rt| jd
< t| jd< d| _nš|tt j!t j"fk�r¶d }}|D ]8}|j#d k	�rPd}|j$d k	�r`d}|�r<|�r< �qv�q<|tk�rŒ|�sŒ|�r°|t j!k�rž|�r°|t j"k�r¶|�s¶d | _|�rÔ|  %¡ \| jd< | jd< g | _&d| _'t(| jdƒ�rüt(| jdƒ�s| j)| _*n| j+| _*d S )Nc                 S  s   h | ]
}|j ’qS r   r¥   r¦   r   r   r   r”   §  s     z)_ClassBuilder.__init__.<locals>.<setcomp>c                 s  s   | ]}|j V  qd S r'   r¥   r¦   r   r   r   rž   ©  s     z)_ClassBuilder.__init__.<locals>.<genexpr>Ú__attrs_pre_init__Fr	   Ú__attrs_post_init__r{   rÇ   rË   TÚ__getstate__Ú__setstate__r!   r"   ),rµ   rº   Údictrw   rØ   rÔ   rÖ   rÕ   rB   rÓ   rã   rÚ   rä   r×   Úboolr€   rÝ   rà   rç   ÚinspectÚ	signaturerZ   Ú
parametersrÜ   rÙ   rÞ   rß   rÛ   rå   rÊ   rÌ   Ú_DEFAULT_ON_SETATTRr   ÚvalidateÚconvertr-   r2   Ú_make_getstate_setstaterâ   rá   ÚhasattrÚ_add_method_dunders_saferÒ   Ú_add_method_dunders_unsafe)r   rx   r±   ÚslotsÚfrozenÚweakref_slotÚgetstate_setstater²   r4   Ú
cache_hashÚis_excr³   r9   Zhas_custom_setattrr´   rl   rn   Zbase_mapZpre_init_funcZpre_init_signatureZhas_validatorZhas_converterrŠ   r   r   r   Ú__init__Š  sš    ú
	


ý
þýýûûúúýþ ÿ
z_ClassBuilder.__init__c                 C  s   d| j j› d�S )Nz<_ClassBuilder(cls=z)>)rº   r    r   r   r   r   r   õ  s    z_ClassBuilder.__repr__rK   rz   c                 C  sl   d  dd„ | jD ƒ¡}i }| jD ]\}}}| |¡ q t|t| jdƒ|ƒ}| jD ]\}}}|| j|ƒ qPdS )z=
        Evaluate any registered snippets in one go.
        r¹   c                 S  s   g | ]}|d  ‘qS )r   r   )r’   Zsnippetr   r   r   r¤   ü  s     z0_ClassBuilder._eval_snippets.<locals>.<listcomp>ÚmethodsN)rª   râ   Úupdatera   r½   rº   rØ   )r   rL   rM   Ú_Zsnippet_globsrN   Úhookr   r   r   Ú_eval_snippetsø  s    
ýz_ClassBuilder._eval_snippetsc                 C  sT   |   ¡  | jdkr|  ¡ }n|  ¡ }tr2t |¡}t|ddƒrPd|jkrP| 	¡  |S )zƒ
        Finalize class based on the accumulated configuration.

        Builder cannot be used after calling this method.
        TÚ__attrs_init_subclass__N)
r  rã   Ú_create_slots_classÚ_patch_original_classr   ÚabcZupdate_abstractmethodsr€   rw   r  )r   rx   r   r   r   Úbuild_class
  s    



ÿþz_ClassBuilder.build_classc              
   C  sž   | j }| j}| jrV| jD ]<}||krt||tƒtk	rt t¡� t	||ƒ W 5 Q R X q| j
 ¡ D ]\}}t|||ƒ q`| jsšt|ddƒršd|_| jsšt|_|S )zA
        Apply accumulated methods and return the class.
        Ú__attrs_own_setattr__F)rº   rÖ   rÙ   rÓ   r€   Ú	_SENTINELÚ
contextlibÚsuppressÚAttributeErrorÚdelattrrØ   r©   Úsetattrrå   r  rÛ   r®   rÇ   )r   rx   Ú
base_namesr�   rÉ   r   r   r   r  "  s*    
ÿþ  ÿz#_ClassBuilder._patch_original_classc              
     sÂ  ‡fdd„ˆj  ¡ D ƒ}ˆjsTd|d< ˆjsTˆjjD ]‰ ˆ j dd¡r4t|d<  qTq4i }d}ˆjj	dd… D ]:‰ ˆ j dd	¡d	k	r†d
}| 
‡ fdd„tˆ dg ƒD ƒ¡ qltˆjƒ‰ˆj}ˆjrädtˆjddƒkräd|krä|sä|d7 }dd„ | ¡ D ƒ}g }|�rŠtˆjƒ}| ¡ D ]F\}}	||f7 }||= | |	¡ t |	¡j}
|
tjjk	�r|
||< �q| d¡}|d	k	�rx| |¡ t||ˆjƒ|d< ‡fdd„|D ƒ‰‡fdd„| ¡ D ƒ‰‡fdd„ˆD ƒ‰| 
ˆ¡ ˆj�ràˆ t¡ tˆƒ|d< ˆjj|d< tˆjƒˆjjˆjj|ƒ}t |j  ¡ |¡D ]˜}t!|t"t#fƒ�rHt|j$dd	ƒ}n(t!|t%ƒ�rdt|j&dd	ƒ}nt|dd	ƒ}|�sz�q$|D ]:}z|j'ˆjk}W n t(k
�r¨   Y nX |�r~||_'�q~�q$|S )zL
        Build and return a new class with a `__slots__` attribute.
        c                   s(   i | ] \}}|t ˆ jƒd˜kr||“qS )rw   Ú__weakref__)rw   r  )rB   rÓ   ©r’   ÚkÚvr   r   r   Ú
<dictcomp>J  s   þ z5_ClassBuilder._create_slots_class.<locals>.<dictcomp>Fr  rÇ   r	   rW   r  NTc                   s   i | ]}|t ˆ |ƒ“qS r   ©r€   ©r’   r�   )r‰   r   r   r  i  s   ÿ Ú	__slots__r   )r  c                 S  s"   i | ]\}}t |tƒr||j“qS r   )r@   r   Úfunc)r’   r�   Zcached_propr   r   r   r  z  s   
þ r»   c                   s   g | ]}|ˆ kr|‘qS r   r   r  )r  r   r   r¤   ™  s      z5_ClassBuilder._create_slots_class.<locals>.<listcomp>c                   s   i | ]\}}|ˆ kr||“qS r   r   )r’   ZslotZslot_descriptor)Ú
slot_namesr   r   r  Ÿ  s   þ c                   s   g | ]}|ˆ kr|‘qS r   r   r  )Úreused_slotsr   r   r¤   ¤  s      r"   Ú__closure__))rØ   r©   rå   rÛ   rº   Ú	__bases__rw   r–   r®   r   rÿ   r€   r„   rÖ   rÓ   rä   r   rƒ   rí   rî   Úreturn_annotationÚ	ParameterÚemptyrÀ   r×   Ú_HASH_CACHE_FIELDrB   r"   r*   r    Ú	itertoolsÚchainÚvaluesr@   ÚclassmethodÚstaticmethodÚ__func__rg   ÚfgetÚcell_contentsr=   )r   r™   Zexisting_slotsZweakref_inheritedÚnamesr¶   Z&additional_closure_functions_to_updateZclass_annotationsr�   r  Ú
annotationr¸   rx   ÚitemZclosure_cellsÚcellÚmatchr   )r‰   r  r  r   r  r   r  F  s¤    
þ

þÿ
ÿþýüþ





  ÿ
þ

 ÿz!_ClassBuilder._create_slots_classc                   s8   t ˆ j|ƒ\}}‡ fdd„}ˆ j |||f¡ dˆ _ˆ S )Nc                   s   ˆ   |d ¡| d< d S )Nr   ©rÒ   ©Úcls_dictrM   r   r   r   Ú_attach_reprÔ  s    z,_ClassBuilder.add_repr.<locals>._attach_reprT)Ú_make_repr_scriptrÔ   râ   rƒ   rá   )r   ÚnsrL   rM   r1  r   r   r   Úadd_reprÑ  s
    z_ClassBuilder.add_reprc                 C  s.   | j sd}t|ƒ‚dd„ }|  |¡| jd< | S )Nz3__str__ can only be generated if a __repr__ exists.c                 S  s   |   ¡ S r'   ©r   r   r   r   r   Ú__str__à  s    z&_ClassBuilder.add_str.<locals>.__str__r6  )rá   r=   rÒ   rØ   )r   rG   r6  r   r   r   Úadd_strÛ  s    z_ClassBuilder.add_strc                   s<   t dd„ | jD ƒƒ‰‡fdd„}| j‰ ‡ ‡fdd„}||fS )zF
        Create custom __setstate__ and __getstate__ methods.
        c                 s  s   | ]}|d kr|V  qdS )r  Nr   )r’   Zanr   r   r   rž   ë  s     z8_ClassBuilder._make_getstate_setstate.<locals>.<genexpr>c                   s   ‡ fdd„ˆD ƒS )ú9
            Automatically created by attrs.
            c                   s   i | ]}|t ˆ |ƒ“qS r   r  r  r   r   r   r  ó  s      zQ_ClassBuilder._make_getstate_setstate.<locals>.slots_getstate.<locals>.<dictcomp>r   r   )Ústate_attr_namesr   r   Úslots_getstateï  s    z=_ClassBuilder._make_getstate_setstate.<locals>.slots_getstatec                   sf   t  | ¡}t|tƒr4tˆ|ƒD ]\}}|||ƒ qn ˆD ]}||kr8|||| ƒ q8ˆ rb|tdƒ dS )r8  N)r®   r¯   r@   rB   Úzipr   )r   ÚstateZ_ClassBuilder__bound_setattrr�   rÉ   ©Zhash_caching_enabledr9  r   r   Úslots_setstate÷  s    

z=_ClassBuilder._make_getstate_setstate.<locals>.slots_setstate)rB   rÓ   r×   )r   r:  r>  r   r=  r   ró   æ  s    ÿz%_ClassBuilder._make_getstate_setstatec                 C  s   d | j d< | S ©NÚ__hash__)rØ   r   r   r   r   Úmake_unhashable  s    
z_ClassBuilder.make_unhashablec                   sH   t ˆ jˆ jˆ jˆ jd�\}}ddddœ‡ fdd„}ˆ j |||f¡ ˆ S )N©rø   rû   rë   rK   )r0  rN   rP   c                   s   ˆ   |d ¡| d< d S r?  r.  )r0  rN   r   r   r   Úattach_hash  s    z+_ClassBuilder.add_hash.<locals>.attach_hash)Ú_make_hash_scriptrº   rÔ   rÚ   r×   râ   rƒ   )r   rL   rM   rC  r   r   r   Úadd_hash  s    ü
z_ClassBuilder.add_hashc                   s`   t ˆjˆjˆjˆjˆjˆjˆjˆjˆj	ˆj
ˆjdd�\}}‰ ‡ ‡fdd„}ˆj |||f¡ ˆS )NF©Ú
attrs_initc                   s    |d }ˆ |_ ˆ |¡| d< d S )Nrý   ©rp   rÒ   ©r0  rM   r1   ©r   r   r   r   Ú_attach_init2  s    z,_ClassBuilder.add_init.<locals>._attach_init©Ú_make_init_scriptrº   rÔ   rÝ   rà   rÜ   rÚ   rã   r×   rÕ   rÞ   rß   râ   rƒ   )r   rL   rM   rK  r   rJ  r   Úadd_init"  s"    ôz_ClassBuilder.add_initc                 C  s   |   dd„ ¡| jd< | S )Nc                 [  s   t | f|ŽS r'   r¨   )r   rÏ   r   r   r   rš   =  r›   z+_ClassBuilder.add_replace.<locals>.<lambda>Ú__replace__)rÒ   rØ   r   r   r   r   Úadd_replace;  s    ÿ
z_ClassBuilder.add_replacec                 C  s   t dd„ | jD ƒƒ| jd< d S )Nc                 s  s    | ]}|j r|js|jV  qd S r'   )r1   r4   r�   )r’   Úfieldr   r   r   rž   B  s    þz/_ClassBuilder.add_match_args.<locals>.<genexpr>Ú__match_args__)rB   rÔ   rØ   r   r   r   r   Úadd_match_argsA  s    þz_ClassBuilder.add_match_argsc                   s`   t ˆjˆjˆjˆjˆjˆjˆjˆjˆj	ˆj
ˆjdd�\}}‰ ‡ ‡fdd„}ˆj |||f¡ ˆS )NTrF  c                   s    |d }ˆ |_ ˆ |¡| d< d S )NÚ__attrs_init__rH  rI  rJ  r   r   Ú_attach_attrs_initX  s    z8_ClassBuilder.add_attrs_init.<locals>._attach_attrs_initrL  )r   rL   rM   rU  r   rJ  r   Úadd_attrs_initH  s"    ôz_ClassBuilder.add_attrs_initc                   s>   ˆ j }tˆ jƒ\}}‡ fdd„}ˆ j |||f¡ t|d< ˆ S )Nc                   s   ˆ   |d ¡| d< d S )NÚ__eq__r.  r/  r   r   r   Ú
_attach_eqf  s    z(_ClassBuilder.add_eq.<locals>._attach_eqÚ__ne__)rØ   Ú_make_eq_scriptrÔ   râ   rƒ   rY  )r   r™   rL   rM   rX  r   r   r   Úadd_eqa  s    z_ClassBuilder.add_eqc                   s>   ˆ j }‡ fdd„tˆ jˆ jƒD ƒ\|d< |d< |d< |d< ˆ S )Nc                 3  s   | ]}ˆ   |¡V  qd S r'   r.  )r’   Úmethr   r   r   rž   r  s   ÿz*_ClassBuilder.add_order.<locals>.<genexpr>Ú__lt__Ú__le__Ú__gt__Ú__ge__)rØ   Ú_make_orderrº   rÔ   )r   r™   r   r   r   Ú	add_ordero  s
    
þz_ClassBuilder.add_orderc                   s‚   i ‰ | j D ],}|jp| j}|r
|tjk	r
||fˆ |j< q
ˆ s@| S | jrRd}t|ƒ‚‡ fdd„}d| jd< |  	|¡| jd< d| _
| S )Nz7Can't combine custom __setattr__ with on_setattr hooks.c                   sF   zˆ | \}}W n t k
r(   |}Y nX || ||ƒ}t| ||ƒ d S r'   )ÚKeyErrorr®   )r   r�   ÚvalrŠ   r  Únval©Zsa_attrsr   r   rÇ   ‰  s    
z._ClassBuilder.add_setattr.<locals>.__setattr__Tr  rÇ   )rÔ   r9   rß   r   ÚNO_OPr�   rÛ   r=   rØ   rÒ   rå   )r   rŠ   r9   rG   rÇ   r   rf  r   Úadd_setattry  s    


z_ClassBuilder.add_setattrr   )ÚmethodrP   c                 C  s6   | j j|_| j j› d|j› �|_d| j j› d�|_|S )z@
        Add __module__ and __qualname__ to a *method*.
        r�   ú$Method generated by attrs for class )rº   r!   r"   r    r#   ©r   ri  r   r   r   rö   ™  s
    
ÿz(_ClassBuilder._add_method_dunders_unsafec              	   C  sx   t  t¡� | jj|_W 5 Q R X t  t¡� | jj› d|j› �|_W 5 Q R X t  t¡� d| jj› d�|_W 5 Q R X |S )zL
        Add __module__ and __qualname__ to a *method* if possible.
        r�   rj  )r
  r  r  rº   r!   r"   r    r#   rk  r   r   r   rõ   §  s     z&_ClassBuilder._add_method_dunders_safeN)r    r!   r"   r#   r  rý   r   r  r  r  r  r4  r7  ró   rA  rE  rN  rP  rS  rV  r[  rb  rh  rö   rõ   r   r   r   r   rÑ   m  s.   k$ 
)
 rÑ   c                 C  st   | dk	r(t |dk	|dk	fƒr(d}t|ƒ‚| dk	r8| | fS |dkrD|}|dkrP|}|dkrl|dkrld}t|ƒ‚||fS )úš
    Validate the combination of *cmp*, *eq*, and *order*. Derive the effective
    values of eq and order.  If *eq* is None, set it to *default_eq*.
    Nú&Don't mix `cmp` with `eq' and `order`.FTú-`order` can only be True if `eq` is True too.©Úanyr=   )r/   r5   r7   Ú
default_eqrG   r   r   r   Ú_determine_attrs_eq_order·  s    rr  c           	      C  s¸   | dk	r(t |dk	|dk	fƒr(d}t|ƒ‚dd„ }| dk	rP|| ƒ\} }| || |fS |dkrd|d }}n||ƒ\}}|dkr„|| }}n||ƒ\}}|dkr¬|dkr¬d}t|ƒ‚||||fS )rl  Nrm  c                 S  s    t | ƒrd|  } }nd}| |fS )z8
        Decide whether a key function is used.
        TN)r>   )rÉ   rœ   r   r   r   Údecide_callable_or_booleanÜ  s    z>_determine_attrib_eq_order.<locals>.decide_callable_or_booleanFTrn  ro  )	r/   r5   r7   rq  rG   rs  Zcmp_keyr6   r8   r   r   r   r;   Ó  s"    r;   c                 C  sF   |dks|dkr|S |dkr(|dkr(|S |D ]}t | |ƒr, dS q,|S )ap  
    Check whether we should implement a set of methods for *cls*.

    *flag* is the argument passed into @attr.s like 'init', *auto_detect* the
    same as passed into @attr.s and *dunders* is a tuple of attribute names
    whose presence signal that the user has implemented it themselves.

    Return *default* if no reason for either for or against is found.
    TFN)ry   )rx   ÚflagÚauto_detectZdundersr,   Zdunderr   r   r   Ú_determine_whether_to_implementþ  s    
rv  c                   s    ˆdk	r"ddl }|jtdƒdd� t|||dƒ\‰‰|dk	r@|‰	tˆttfƒrXtjˆŽ ‰‡ ‡‡‡‡‡‡‡‡‡	‡
‡‡‡‡‡‡‡‡‡‡fdd„}| dkr˜|S || ƒS )aö  
    A class decorator that adds :term:`dunder methods` according to the
    specified attributes using `attr.ib` or the *these* argument.

    Consider using `attrs.define` / `attrs.frozen` in new code (``attr.s`` will
    *never* go away, though).

    Args:
        repr_ns (str):
            When using nested classes, there was no way in Python 2 to
            automatically detect that.  This argument allows to set a custom
            name for a more meaningful ``repr`` output.  This argument is
            pointless in Python 3 and is therefore deprecated.

    .. caution::
        Refer to `attrs.define` for the rest of the parameters, but note that they
        can have different defaults.

        Notably, leaving *on_setattr* as `None` will **not** add any hooks.

    .. versionadded:: 16.0.0 *slots*
    .. versionadded:: 16.1.0 *frozen*
    .. versionadded:: 16.3.0 *str*
    .. versionadded:: 16.3.0 Support for ``__attrs_post_init__``.
    .. versionchanged:: 17.1.0
       *hash* supports `None` as value which is also the default now.
    .. versionadded:: 17.3.0 *auto_attribs*
    .. versionchanged:: 18.1.0
       If *these* is passed, no attributes are deleted from the class body.
    .. versionchanged:: 18.1.0 If *these* is ordered, the order is retained.
    .. versionadded:: 18.2.0 *weakref_slot*
    .. deprecated:: 18.2.0
       ``__lt__``, ``__le__``, ``__gt__``, and ``__ge__`` now raise a
       `DeprecationWarning` if the classes compared are subclasses of
       each other. ``__eq`` and ``__ne__`` never tried to compared subclasses
       to each other.
    .. versionchanged:: 19.2.0
       ``__lt__``, ``__le__``, ``__gt__``, and ``__ge__`` now do not consider
       subclasses comparable anymore.
    .. versionadded:: 18.2.0 *kw_only*
    .. versionadded:: 18.2.0 *cache_hash*
    .. versionadded:: 19.1.0 *auto_exc*
    .. deprecated:: 19.2.0 *cmp* Removal on or after 2021-06-01.
    .. versionadded:: 19.2.0 *eq* and *order*
    .. versionadded:: 20.1.0 *auto_detect*
    .. versionadded:: 20.1.0 *collect_by_mro*
    .. versionadded:: 20.1.0 *getstate_setstate*
    .. versionadded:: 20.1.0 *on_setattr*
    .. versionadded:: 20.3.0 *field_transformer*
    .. versionchanged:: 21.1.0
       ``init=False`` injects ``__attrs_init__``
    .. versionchanged:: 21.1.0 Support for ``__attrs_pre_init__``
    .. versionchanged:: 21.1.0 *cmp* undeprecated
    .. versionadded:: 21.3.0 *match_args*
    .. versionadded:: 22.2.0
       *unsafe_hash* as an alias for *hash* (for :pep:`681` compliance).
    .. deprecated:: 24.1.0 *repr_ns*
    .. versionchanged:: 24.1.0
       Instances are not compared as tuples of attributes anymore, but using a
       big ``and`` condition. This is faster and has more correct behavior for
       uncomparable values like `math.nan`.
    .. versionadded:: 24.1.0
       If a class has an *inherited* classmethod called
       ``__attrs_init_subclass__``, it is executed after the class is created.
    .. deprecated:: 24.1.0 *hash* is deprecated in favor of *unsafe_hash*.
    Nr   zQThe `repr_ns` argument is deprecated and will be removed in or after August 2025.é   )Ú
stacklevelc                   s"  ˆp
t | ƒ}ˆdkot| tƒ}ˆo*t| dƒ}|r@|r@d}t|ƒ‚t| ˆˆ|ˆt| ˆˆdˆd�ˆ ˆˆ|ˆˆ|ˆƒ}t| ˆˆdƒrˆ| ˆ¡ ˆdkr˜| ¡  t| ˆˆdƒ}|sº|dkrº| 	¡  |sÔt| ˆˆdƒrÔ| 
¡  ˆsà| ¡  ˆ	d krþˆdkrþt| d	ƒrþd
‰	ˆ	dk	�r(ˆ	d
k	�r(ˆ	d k	�r(d}t|ƒ‚ˆ	d
k�sLˆ	d k�rF|d
k�sL|�r`ˆ�r¬d}t|ƒ‚nLˆ	dk�sˆˆ	d k�r’|dk�r’|dk�r’| ¡  nˆ�r¤d}t|ƒ‚| ¡  t| ˆ
ˆdƒ�rÆ| ¡  n| ¡  ˆ�ràd}t|ƒ‚t�rút| dƒ�sú| ¡  t�rˆ�rt| dƒ�s| ¡  | ¡ S )NTrÇ   z/Can't freeze a class with a custom __setattr__.)ré   rê   )r,   r5  )rW  rY  )r]  r^  r_  r`  r@  Fr+   zlInvalid value for cache_hash.  To use hash caching, hashing must be either explicitly or implicitly enabled.©rý   zFInvalid value for cache_hash.  To use hash caching, init must be True.rO  rR  )Ú_has_frozen_base_classÚ
issubclassrÆ   ry   r=   rÑ   rv  r4  r7  r[  rb  rh  r<   rE  rA  rN  rV  r   rP  r   rS  r  )rx   Ú	is_frozenrü   Zhas_own_setattrrG   Zbuilderr5   ©r²   ru  Úauto_excrû   r³   Zeq_r´   rø   rú   r0   r1   r4   Ú
match_argsr9   Zorder_r.   Úrepr_nsr÷   rJ   r±   rù   r   r   Úwrap‡  sÐ     ÿûì   ÿ
   ÿ   ÿÿþý$

ÿÿÿ
   ÿ
ÿþýzattrs.<locals>.wrap)	ÚwarningsÚwarnÚDeprecationWarningrr  r@   rA   rB   r   rC   )Z	maybe_clsr±   r€  r.   r/   r0   r1   r÷   rø   rù   rJ   r²   r4   rû   r~  r5   r7   ru  r³   rú   r9   r´   r  Úunsafe_hashr‚  r�  r   r}  r   rl     s"    \ÿü
4nrl   c                 C  s
   | j tkS )zV
    Check whether *cls* has a frozen ancestor by looking at its
    __setattr__.
    )rÇ   rÊ   ræ   r   r   r   rz    s    rz  )rx   Ú	func_namerP   c              	   C  s$   d|› d| j › dt| d| jƒ› d�S )zF
    Create a "filename" suitable for a function being generated.
    z<attrs generated ú r�   r"   rY   )r!   r€   r    )rx   r†  r   r   r   r½   
  s    "ÿr½   rm   rì   ztuple[str, dict])rx   rl   rø   rû   rP   c                   s  t dd„ ˆ D ƒƒ‰ d}tt| dƒƒ‰i ‰d}d‰d‰|sB|d7 }n |d	7 }|d
7 }dˆ ‰ˆd7 ‰|g‰‡ ‡‡‡‡‡fdd„}|ròˆ |dt› d� ¡ |rÆ|dt› d�|d ƒ ˆ |d d ¡ n|dt› d�|d ƒ ˆ |dt› � ¡ n
|d|ƒ d ˆ¡}|ˆfS )Nc                 s  s0   | ](}|j d ks$|j dkr|jd kr|V  qdS )TN)r0   r5   r¦   r   r   r   rž     s
    
 
 
 z$_make_hash_script.<locals>.<genexpr>ú        r0   zdef __hash__(selfzhash((z))z):z, *zC, _cache_wrapper=__import__('attr._make')._make._CacheHashWrapper):z_cache_wrapper(ú)c              	     s˜   ˆ  ||  ˆ |dˆ› d� g¡ ˆ D ]Z}|jrhd|j› d�}|jˆ|< ˆ |d|› d|j› d� ¡ q&ˆ |d|j› d� ¡ q&ˆ |d ˆ ¡ d	S )
zÛ
        Generate the code for actually computing the hash code.
        Below this will either be returned directly or used to compute
        a value which is then cached, depending on the value of cache_hash
        rˆ  ú,r   Ú_keyú(self.z),ú        self.ú    N)r¼   r6   r�   rƒ   )ÚprefixÚindentrŠ   Úcmp_name©rl   Zclosing_bracesrM   Z	hash_funcZmethod_linesZ	type_hashr   r   Úappend_hash_computation_lines/  s    
þÿ
ÿz8_make_hash_script.<locals>.append_hash_computation_lineszif self.z	 is None:zobject.__setattr__(self, 'ú', rw  úself.ú = zreturn self.zreturn r¹   )rB   r0   r½   rƒ   r   rª   )rx   rl   rø   rû   ÚtabZhash_defr“  rL   r   r’  r   rD    sB    ÿ

 ÿ
 ÿ

rD  )rx   rl   c                 C  s6   t | |ddd�\}}t||t| dƒd� |d | _| S )z%
    Add a hash method to *cls*.
    FrB  r@  ©rO   )rD  rU   r½   r@  ©rx   rl   rL   rM   r   r   r   Ú	_add_hash\  s       ÿ
  ÿ
rš  c                 C  s   |   |¡}|tkrtS | S )z^
    Check equality and either forward a NotImplemented or
    return the result negated.
    )rW  ÚNotImplemented)r   ÚotherÚresultr   r   r   rY  j  s    
rY  rA   )rl   rP   c                 C  sÜ   dd„ | D ƒ} dddg}i }| rÀ|  d¡ | D ]„}|jrzd|j› d�}|j||< |  d	|› d
|j› d|› d|j› d�	¡ n|  d|j› d|j› �¡ || d k	r.|d › d�|d< q.|  d¡ n
|  d¡ d |¡}||fS )z6
    Create __eq__ method for *cls* with *attrs*.
    c                 S  s   g | ]}|j r|‘qS r   )r5   r¦   r   r   r   r¤   z  s      z#_make_eq_script.<locals>.<listcomp>zdef __eq__(self, other):z-    if other.__class__ is not self.__class__:z        return NotImplementedz    return  (r   r‹  rˆ  rŒ  z) == z(other.r‰  r�  z
 == other.rW   z andz    )z    return Truer¹   )rƒ   r6   r�   rª   )rl   r¾   rM   rŠ   r‘  rL   r   r   r   rZ  v  s,    ý

 ÿ

rZ  c                   sV   dd„ ˆ D ƒ‰ ‡ fdd„‰‡fdd„}‡fdd„}‡fd	d
„}‡fdd„}||||fS )z9
    Create ordering methods for *cls* with *attrs*.
    c                 S  s   g | ]}|j r|‘qS r   )r7   r¦   r   r   r   r¤   Ÿ  s      z_make_order.<locals>.<listcomp>c                   s    t dd„ ‡ fdd„ˆD ƒD ƒƒS )z&
        Save us some typing.
        c                 s  s"   | ]\}}|r||ƒn|V  qd S r'   r   )r’   rÉ   rœ   r   r   r   rž   ¥  s   ÿz6_make_order.<locals>.attrs_to_tuple.<locals>.<genexpr>c                 3  s    | ]}t ˆ |jƒ|jfV  qd S r'   )r€   r�   r8   r¦   ©Úobjr   r   rž   §  s    )rB   rž  ©rl   rž  r   Úattrs_to_tuple¡  s
    
ÿþz#_make_order.<locals>.attrs_to_tuplec                   s    |j | j krˆ | ƒˆ |ƒk S tS ©z1
        Automatically created by attrs.
        ©r�   r›  ©r   rœ  ©r¡  r   r   r]  ¬  s    z_make_order.<locals>.__lt__c                   s    |j | j krˆ | ƒˆ |ƒkS tS r¢  r£  r¤  r¥  r   r   r^  µ  s    z_make_order.<locals>.__le__c                   s    |j | j krˆ | ƒˆ |ƒkS tS r¢  r£  r¤  r¥  r   r   r_  ¾  s    z_make_order.<locals>.__gt__c                   s    |j | j krˆ | ƒˆ |ƒkS tS r¢  r£  r¤  r¥  r   r   r`  Ç  s    z_make_order.<locals>.__ge__r   )rx   rl   r]  r^  r_  r`  r   )rl   r¡  r   ra  ›  s    				ra  c                 C  sB   |dkr| j }t|ƒ\}}t||t| dƒd� |d | _t| _| S )z5
    Add equality methods to *cls* with *attrs*.
    NrW  r˜  )r{   rZ  rU   r½   rW  rY  r™  r   r   r   Ú_add_eqÓ  s      ÿ
r¦  c                 C  sî   t dd„ | D ƒƒ}dd„ |D ƒ}t|d< t|d< t|d< g }|D ]N\}}}|rVd| n
d	| d
 }|tkrvd||f nd|||f }	| |	¡ q@d |¡}
|dkr¨d}n|d }ddddddddddddd|› d|
› d�dd g}d! |¡|fS )"zC
    Create the source and globs for a __repr__ and return it.
    c                 s  s6   | ].}|j d k	r|j|j dkr"t n|j |jfV  qdS )FTN)r.   r�   r1   r¦   r   r   r   rž   ë  s   
þz$_make_repr_script.<locals>.<genexpr>c                 S  s$   i | ]\}}}|t kr|d  |“qS )Ú_repr)r.   )r’   r�   Úrr   r   r   r   r  ð  s      z%_make_repr_script.<locals>.<dictcomp>r
   r  r   r•  zgetattr(self, "z", NOTHING)z	%s={%s!r}z%s={%s_repr(%s)}r•   Nz1{self.__class__.__qualname__.rsplit(">.", 1)[-1]}z.{self.__class__.__name__}zdef __repr__(self):z  try:z:    already_repring = _compat.repr_context.already_repringz  except AttributeError:z!    already_repring = {id(self),}z:    _compat.repr_context.already_repring = already_repringz  else:z#    if id(self) in already_repring:z      return '...'z	    else:z#      already_repring.add(id(self))z    return f'ú(z)'z
  finally:z$    already_repring.remove(id(self))r¹   )rB   r
   r  r   r.   rƒ   rª   )rl   r3  Zattr_names_with_reprsrM   Zattribute_fragmentsr�   r¨  rd   ÚaccessorÚfragmentZrepr_fragmentZcls_name_fragmentr¾   r   r   r   r2  ä  sN    þÿÿÿý
ñr2  c                 C  s>   |dkr| j }t||ƒ\}}t||t| dƒd� |d | _| S )z%
    Add a repr method to *cls*.
    Nr   r˜  )r{   r2  rU   r½   r   )rx   r3  rl   rL   rM   r   r   r   Ú	_add_repr  s      ÿ
r¬  c                 C  sv   t | ƒ}|dkr&t| tƒs&d}t|ƒ‚t| ddƒ}|dkrr|dk	r`t|ddƒ}|dk	r`|| _|S | ›d�}t|ƒ‚|S )aG  
    Return the tuple of *attrs* attributes for a class.

    The tuple also allows accessing the fields by their names (see below for
    examples).

    Args:
        cls (type): Class to introspect.

    Raises:
        TypeError: If *cls* is not a class.

        attrs.exceptions.NotAnAttrsClassError:
            If *cls* is not an *attrs* class.

    Returns:
        tuple (with name accessors) of `attrs.Attribute`

    .. versionchanged:: 16.2.0 Returned tuple allows accessing the fields
       by name.
    .. versionchanged:: 23.1.0 Add support for generic classes.
    NúPassed object must be a class.r{   ú! is not an attrs-decorated class.)r   r@   r*   r<   r€   r{   r   )rx   Zgeneric_baserG   rl   r   r   r   rÍ   ,  s    
rÍ   c                 C  sJ   t | tƒsd}t|ƒ‚t| ddƒ}|dkr<| ›d�}t|ƒ‚dd„ |D ƒS )a±  
    Return an ordered dictionary of *attrs* attributes for a class, whose keys
    are the attribute names.

    Args:
        cls (type): Class to introspect.

    Raises:
        TypeError: If *cls* is not a class.

        attrs.exceptions.NotAnAttrsClassError:
            If *cls* is not an *attrs* class.

    Returns:
        dict[str, attrs.Attribute]: Dict of attribute name to definition

    .. versionadded:: 18.1.0
    r­  r{   Nr®  c                 S  s   i | ]}|j |“qS r   r¥   r¦   r   r   r   r  t  s      zfields_dict.<locals>.<dictcomp>)r@   r*   r<   r€   r   )rx   rG   rl   r   r   r   Úfields_dictZ  s    

r¯  c                 C  sD   t jdkrdS t| jƒD ]&}|j}|dk	r|| |t| |jƒƒ qdS )z¬
    Validate all attributes on *inst* that have a validator.

    Leaves all exceptions through.

    Args:
        inst: Instance of a class with *attrs* attributes.
    FN)r   Z_run_validatorsrÍ   r�   r-   r€   r�   )rÐ   rŠ   r  r   r   r   rñ   w  s    	
rñ   c                 C  s   |  | ¡}|od|jkS )z>
    Check if the attribute name comes from a slot class.
    r  )r–   rw   )Za_namerˆ   rx   r   r   r   Ú_is_slot_attr‰  s    
r°  ztuple[str, dict, dict]c                 C  s  |
d k	o|
t jk	}|r&|r&d}t|ƒ‚|p,|}g }i }|D ]b}|jsP|jtkrPq:| |¡ |||j< |jd k	rˆ|dkr‚d}t|ƒ‚d}q:|r:|jt jk	r:d}q:t	|||||||||	|||r¾dndƒ\}}}| j
tjkrê| tj| j
 j¡ | t|dœ¡ |�r
tj|d< |||fS )Nz$Frozen classes can't use on_setattr.TrT  rý   )r   Ú	attr_dictr·   )r   rg  r=   r1   r,   r   rƒ   r�   r9   Ú_attrs_to_init_scriptr!   ÚsysÚmodulesrÿ   rw   r®   r¯   )rx   rl   Úpre_initÚpre_init_has_argsÚ	post_initrø   r÷   rû   rˆ   rü   Zcls_on_setattrrG  Úhas_cls_on_setattrrG   Úneeds_cached_setattrZfiltered_attrsr±  rŠ   rL   rM   r   r   r   r   rM  ‘  sP    ÿ



ô

rM  ©ri   Ú	value_varÚhas_on_setattrrP   c                 C  s   d| › d|› d�S )zJ
    Use the cached object.setattr to set *attr_name* to *value_var*.
    ú
_setattr('r”  r‰  r   ©ri   r»  r¼  r   r   r   Ú_setattrÖ  s    r¿  Ú	Converter©ri   r»  r¼  r2   rP   c                 C  s   d| › d|  | |¡› d�S )zk
    Use the cached object.setattr to set *attr_name* to *value_var*, but run
    its converter first.
    r½  r”  r‰  )Ú_fmt_converter_call©ri   r»  r¼  r2   r   r   r   Ú_setattr_with_converterÝ  s    rÄ  )ri   rÉ   r¼  rP   c                 C  s    |rt | |dƒS d| › d|› �S )zo
    Unless *attr_name* has an on_setattr hook, use normal assignment. Otherwise
    relegate to _setattr.
    Tr•  r–  )r¿  )ri   rÉ   r¼  r   r   r   Ú_assignç  s    rÅ  c                 C  s*   |rt | |d|ƒS d| › d| | |¡› �S )z�
    Unless *attr_name* has an on_setattr hook, use normal assignment after
    conversion. Otherwise relegate to _setattr_with_converter.
    Tr•  r–  )rÄ  rÂ  rÃ  r   r   r   Ú_assign_with_converterò  s    rÆ  ro   )rø   r÷   rˆ   c                   s`   | dkrV|dkrdt tfS dddddœ‡ fdd„}dddddd	œ‡ fd
d„}d||fS dttfS )zg
    Determine the correct setter functions based on whether a class is frozen
    and/or slotted.
    Tr   rJ   rì   rº  c                   s&   t | ˆ ƒrt| ||ƒS d| › d|› �S ©Nú_inst_dict['z'] = )r°  r¿  r¾  ©rˆ   r   r   Ú
fmt_setter  s    
z&_determine_setters.<locals>.fmt_setterrÀ  rÁ  c                   s4   |st | ˆ ƒrt| |||ƒS d| › d| | |¡› �S rÇ  )r°  rÄ  rÂ  rÃ  rÉ  r   r   Úfmt_setter_with_converter  s       ÿz5_determine_setters.<locals>.fmt_setter_with_converter)z_inst_dict = self.__dict__)r¿  rÄ  rÅ  rÆ  )rø   r÷   rˆ   rÊ  rË  r   rÉ  r   Ú_determine_settersÿ  s    
ýrÌ  )rl   r|  Ú
is_slottedÚcall_pre_initr¶  Úcall_post_initÚdoes_cache_hashrˆ   rü   r¹  r¸  Úmethod_namerP   c           $   
   C  sŽ  |r
dgng }|	r|  d¡ t|||ƒ\}}}| |¡ g }g }g }i }ddi}| D �]�}|jrj|  |¡ |j}|jdk	pˆ|jtjk	oˆ|
}|j}t	|j
tƒ}|r¬|j
jr¬dnd}|jdk	rÒt	|jtƒsÒt|jƒ}n|j}|jdk�r¸|�r`t|jf }|dk	�r4|  |||d|› d	� ||ƒ¡ |j|| |j¡< n|  |||d|› d	� |ƒ¡ |j
j||< nT|dk	�rš|  ||d
|› d�||ƒ¡ |j|| |j¡< n|  ||d
|› d�|ƒ¡ �nê|j
tk	�r@|�s@|› d|› d�}|j�rî|  |¡ n
|  |¡ |dk	�r*|  |||||ƒ¡ |j|| |j¡< n|  ||||ƒ¡ �nb|�r@|› d�}|j�rd|  |¡ n
|  |¡ |  d|› d�¡ t|jf }|dk	�rð|  d|||||ƒ ¡ |  d¡ |  d|||d | d	 ||ƒ ¡ |j|| |j¡< nB|  d||||ƒ ¡ |  d¡ |  d|||d | d	 |ƒ ¡ |j
j||< nb|j�rT|  |¡ n
|  |¡ |dk	�r�|  |||||ƒ¡ |j|| |j¡< n|  ||||ƒ¡ |jdkrT|jdk	�rÎ|dk�rÎ|j||< qT|dk	rT|jrT|j||< qT|�rRt|d< |  d¡ |D ]L}d|j }d|j }|  d|› d|› d|j› d	�¡ |j||< |||< �q|�rb|  d¡ |�r¦|�r�|�r‚dt› d�}ndt› d�}ndt› d�}|  |¡ |�rÒd  d!d"„ | D ƒ¡} |  d#| › d	�¡ d$ |¡}|}!|�r@||�ròd$nd› d%d$ |¡› �7 }d$ d&d'„ d(d"„ |D ƒD ƒ¡}"|!|!�r2d$nd7 }!|!|"7 }!|�r\|�r\d)|!› d	�|d*< d+}#d,|› d|› d-|�r~|# |¡nd.› d/�||fS )0z«
    Return a script of an initializer for *attrs*, a dict of globals, and
    annotations for the initializer.

    The globals are required by the generated script.
    zself.__attrs_pre_init__()z$_setattr = _cached_setattr_get(self)rP   Nr   rI   Fr©  r‰  zattr_dict['z
'].defaultz=attr_dict['z=NOTHINGzif z is not NOTHING:rŽ  zelse:Tr   z#if _config._run_validators is True:Z__attr_validator_Z__attr_z(self, z, self.zself.__attrs_post_init__()r½  z', None)rÈ  z	'] = Noner•  z = NonerŠ  c                 s  s    | ]}|j rd |j› �V  qdS )r•  N)r1   r�   r¦   r   r   r   rž   	  s      z(_attrs_to_init_script.<locals>.<genexpr>zBaseException.__init__(self, r•   z*, c                 S  s   g | ]}|› d |› �‘qS )ú=r   )r’   Zkw_arg_namer   r   r   r¤   	  s   þz)_attrs_to_init_script.<locals>.<listcomp>c                 s  s   | ]}|  d ¡d V  qdS )rÒ  r   N)Úsplit)r’   Zkwar   r   r   rž   	  s     zself.__attrs_pre_init__(r   z
    zdef z):
    Úpassr¹   )rƒ   rÌ  r¼   r-   r�   r9   r   rg  r:   r@   r,   r?   Ú
takes_selfr2   rÀ  r1   Ú_INIT_FACTORY_PATÚ_get_global_namerF   r   r4   r*   Ú_first_param_typer   r   rª   )$rl   r|  rÍ  rÎ  r¶  rÏ  rÐ  rˆ   rü   r¹  r¸  rÑ  r¾   Zextra_linesrÊ  rË  rÎ   Zkw_only_argsZattrs_to_validateZnames_for_globalsr   rŠ   ri   r¼  Zarg_nameZhas_factoryZ
maybe_selfr2   Zinit_factory_nameÚargZval_nameZinit_hash_cacheÚvalsZpre_init_argsZpre_init_kw_only_argsÚNLr   r   r   r²  .  s€   ü  ÿ




ÿ
üÿ	ÿýÿ

üÿ	ÿ
ýÿ

   ÿÿÿ


   ÿÿÿ
üÿÿ
ÿÿ
ýÿÿ

   ÿÿÿ



 



"ýÿÿûr²  )r�   rP   c                 C  s
   |   d¡S )zÅ
    The default __init__ parameter name for a field.

    This performs private-name adjustment via leading-unscore stripping,
    and is the default value of Attribute.alias if not provided.
    r   )Úlstripr¥   r   r   r   r°   2	  s    r°   c                
   @  s\   e Zd ZdZdZddd„Zdd„ Zedd	d
dœdd„ƒZdd„ Z	dd„ Z
dd„ Zdd„ ZdS )r¬   a²  
    *Read-only* representation of an attribute.

    .. warning::

       You should never instantiate this class yourself.

    The class has *all* arguments of `attr.ib` (except for ``factory`` which is
    only syntactic sugar for ``default=Factory(...)`` plus the following:

    - ``name`` (`str`): The name of the attribute.
    - ``alias`` (`str`): The __init__ parameter name of the attribute, after
      any explicit overrides and default private-attribute-name handling.
    - ``inherited`` (`bool`): Whether or not that attribute has been inherited
      from a base class.
    - ``eq_key`` and ``order_key`` (`typing.Callable` or `None`): The
      callables that are used for comparing and ordering objects by this
      attribute, respectively. These are set by passing a callable to
      `attr.ib`'s ``eq``, ``order``, or ``cmp`` arguments. See also
      :ref:`comparison customization <custom-comparison>`.

    Instances of this class are frequently used for introspection purposes
    like:

    - `fields` returns a tuple of them.
    - Validators get them passed as the first argument.
    - The :ref:`field transformer <transform-fields>` hook receives a list of
      them.
    - The ``alias`` property exposes the __init__ parameter name of the field,
      with any overrides and default private-attribute handling applied.


    .. versionadded:: 20.1.0 *inherited*
    .. versionadded:: 20.1.0 *on_setattr*
    .. versionchanged:: 20.2.0 *inherited* is not taken into account for
        equality checks and hashing anymore.
    .. versionadded:: 21.1.0 *eq_key* and *order_key*
    .. versionadded:: 22.2.0 *alias*

    For the full version history of the fields, see `attr.ib`.
    )r�   r,   r-   r.   r5   r6   r7   r8   r0   r1   r3   r*   r2   r4   r}   r9   r:   NFc                 C  sè   t ||p
||p|dƒ\}}}}t | ¡}|d|ƒ |d|ƒ |d|ƒ |d|ƒ |d|ƒ |d|ƒ |d|ƒ |d	|ƒ |d
|ƒ |d|ƒ |d|ƒ |d|	r¬t t|	ƒ¡ntƒ |d|
ƒ |d|ƒ |d|ƒ |d|ƒ |d|ƒ d S )NTr�   r,   r-   r.   r5   r6   r7   r8   r0   r1   r2   r3   r*   r4   r}   r9   r:   )r;   r®   r¯   ÚtypesÚMappingProxyTyperë   Ú_EMPTY_METADATA_SINGLETON)r   r�   r,   r-   r.   r/   r0   r1   r}   r3   r*   r2   r4   r5   r6   r7   r8   r9   r:   Úbound_setattrr   r   r   rý   ~	  s:       ÿ











ÿû



zAttribute.__init__c                 C  s   t ‚d S r'   )r   rÈ   r   r   r   rÇ   µ	  s    zAttribute.__setattr__rJ   rE   )r�   r¡   c                 C  st   |d kr|j }n|j d k	r.d|› d�}t|ƒ‚| ||j|j|jd |j|jd|j||j|j	|j
|j|j|j|j|jƒS )Nz>Type annotation and type argument cannot both be present for 'z'.F)r*   r=   Ú_defaultÚ
_validatorr.   r0   r1   r3   r2   r4   r5   r6   r7   r8   r9   r:   )rx   r�   r¡   r*   rG   r   r   r   r­   ¸	  s2    
îzAttribute.from_counting_attrc                 K  s   t   | ¡}| | ¡ ¡ |S )a
  
        Copy *self* and apply *changes*.

        This works similarly to `attrs.evolve` but that function does not work
        with :class:`attrs.Attribute`.

        It is mainly meant to be used for `transform-fields`.

        .. versionadded:: 20.3.0
        )ÚcopyÚ	_setattrsr©   )r   rÏ   Únewr   r   r   r‚   Ö	  s    
zAttribute.evolvec                   s   t ‡ fdd„ˆ jD ƒƒS )ú(
        Play nice with pickle.
        c                 3  s*   | ]"}|d krt ˆ |ƒntˆ jƒV  qdS )r3   N)r€   rë   r3   r  r   r   r   rž   ì	  s   ÿz)Attribute.__getstate__.<locals>.<genexpr>©rB   r  r   r   r   r   ré   è	  s    þzAttribute.__getstate__c                 C  s   |   t| j|ƒ¡ dS ©ræ  N)rä  r;  r  ©r   r<  r   r   r   rê   ñ	  s    zAttribute.__setstate__c                 C  sL   t  | ¡}|D ]8\}}|dkr*|||ƒ q|||r@t t|ƒ¡ntƒ qd S )Nr3   )r®   r¯   rÝ  rÞ  rë   rß  )r   Zname_values_pairsrà  r�   rÉ   r   r   r   rä  ÷	  s    
ÿûzAttribute._setattrs)
NNNFNNNNNN)N)r    r!   r"   r#   r  rý   rÇ   r$  r­   r‚   ré   rê   rä  r   r   r   r   r¬   =	  s(   ,          í
7	r¬   c                 C  s2   g | ]*}t |td dd dd|dkddt|ƒd�‘qS )NTFr3   )r�   r,   r-   r.   r/   r5   r7   r0   r1   r}   r:   )r¬   r   r°   r  r   r   r   r¤   
  s   óõr¤   r   c                 C  s   g | ]}|j d kr|‘qS r|   r¥   r¦   r   r   r   r¤   
  s     
 c                 C  s    g | ]}|j r|jd kr|‘qS r|   )r0   r�   r¦   r   r   r   r¤   
  s      
 c                   @  sj   e Zd ZdZdZedd„ dD ƒƒeddddddd	dd	ddd	dd	dd
�f˜ZdZdd„ Z	dd„ Z
dd„ ZdS )rE   a  
    Intermediate representation of attributes that uses a counter to preserve
    the order in which the attributes have been defined.

    *Internal* data structure of the attrs library.  Running into is most
    likely the result of a bug like a forgotten `@attr.s` decorator.
    )rá  râ  r:   r2   r—   r5   r6   r0   r1   r4   r3   r9   r7   r8   r.   r*   c                 c  s8   | ]0}t |t|ƒtd dd ddddd dd dd d�V  qd S )NTF©r�   r:   r,   r-   r.   r/   r0   r1   r4   r5   r6   r7   r8   r}   r9   )r¬   r°   r   r  r   r   r   rž   =
  s$   ïñz_CountingAttr.<genexpr>)	r—   rá  r.   r5   r7   r0   r1   r9   r:   r3   NTFrê  r   c                 C  st   t  jd7  _t j| _|| _|| _|| _|| _|| _|| _|| _	|| _
|| _|| _|| _|	| _|
| _|| _|| _d S rŸ   )rE   Úcls_counterr—   rá  râ  r2   r.   r5   r6   r7   r8   r0   r1   r3   r*   r4   r9   r:   )r   r,   r-   r.   r/   r0   r1   r2   r3   r*   r4   r5   r6   r7   r8   r9   r:   r   r   r   rý   o
  s"    z_CountingAttr.__init__c                 C  s$   | j dkr|| _ nt| j |ƒ| _ |S )zŒ
        Decorator that adds *meth* to the list of validators.

        Returns *meth* unchanged.

        .. versionadded:: 17.1.0
        N)râ  rD   ©r   r\  r   r   r   r-   ”
  s    
z_CountingAttr.validatorc                 C  s    | j tk	rt‚t|dd�| _ |S )zæ
        Decorator that allows to set the default for an attribute.

        Returns *meth* unchanged.

        Raises:
            DefaultAlreadySetError: If default has been set before.

        .. versionadded:: 17.1.0
        T)rÕ  )rá  r   r   r?   rì  r   r   r   r,   ¢
  s    
z_CountingAttr.default)r    r!   r"   r#   r  rB   r¬   r{   rë  rý   r-   r,   r   r   r   r   rE   !
  s6   îñá1%rE   c                   @  s.   e Zd ZdZdZddd„Zdd„ Zdd	„ Zd
S )r?   a÷  
    Stores a factory callable.

    If passed as the default value to `attrs.field`, the factory is used to
    generate a new value.

    Args:
        factory (typing.Callable):
            A callable that takes either none or exactly one mandatory
            positional argument depending on *takes_self*.

        takes_self (bool):
            Pass the partially initialized instance that is being initialized
            as a positional argument.

    .. versionadded:: 17.1.0  *takes_self*
    ©rF   rÕ  Fc                 C  s   || _ || _d S r'   rí  )r   rF   rÕ  r   r   r   rý   Í
  s    zFactory.__init__c                   s   t ‡ fdd„ˆ jD ƒƒS )ræ  c                 3  s   | ]}t ˆ |ƒV  qd S r'   r  r  r   r   r   rž   Õ
  s     z'Factory.__getstate__.<locals>.<genexpr>rç  r   r   r   r   ré   Ñ
  s    zFactory.__getstate__c                 C  s&   t | j|ƒD ]\}}t| ||ƒ qdS rè  )r;  r  r  )r   r<  r�   rÉ   r   r   r   rê   ×
  s    zFactory.__setstate__N)F)r    r!   r"   r#   r  rý   ré   rê   r   r   r   r   r?   ¸
  s
   
r?   c                 C  s(   g | ] }t |td dd dddddd�
‘qS ©NTF)
r�   r,   r-   r.   r/   r5   r7   r0   r1   r}   ©r¬   r   r  r   r   r   r¤   ß
  s   ôöc                   @  sZ   e Zd ZdZdZdddœdd„Zedddœd	d
„ƒZddddœdd„Zdd„ Z	dd„ Z
dS )rÀ  ae  
    Stores a converter callable.

    Allows for the wrapped converter to take additional arguments. The
    arguments are passed in the order they are documented.

    Args:
        converter (Callable): A callable that converts the passed value.

        takes_self (bool):
            Pass the partially initialized instance that is being initialized
            as a positional argument. (default: `False`)

        takes_field (bool):
            Pass the field definition (an :class:`Attribute`) into the
            converter as a positional argument. (default: `False`)

    .. versionadded:: 24.1.0
    )Ú__call__rØ  Z_global_namer2   Útakes_fieldrÕ  F©rÕ  rñ  c                  s¦   |ˆ _ |ˆ _|ˆ _t|ƒ}| ¡ ˆ _ˆ js@ˆ js@‡ fdd„ˆ _nFˆ jr\ˆ js\‡ fdd„ˆ _n*ˆ jsxˆ jrx‡ fdd„ˆ _n‡ fdd„ˆ _| ¡ }|d k	r¢|ˆ jjd< d S )Nc                   s
   ˆ   | ¡S r'   ©r2   )rÉ   r   Ú__r   r   r   rš     r›   z$Converter.__init__.<locals>.<lambda>c                   s   ˆ   | |¡S r'   ró  )rÉ   Úinstancerô  r   r   r   rš     s    ÿc                   s   ˆ   | |¡S r'   ró  )rÉ   rô  rQ  r   r   r   rš     s    ÿc                   s   ˆ   | ||¡S r'   ró  )rÉ   rõ  rQ  r   r   r   rš   #  s     ÿrP   )	r2   rÕ  rñ  r   Úget_first_param_typerØ  rð  Úget_return_typerp   )r   r2   rÕ  rñ  ÚexÚrtr   r   r   rý     s    
zConverter.__init__rJ   )ri   rP   c                 C  s
   d| › �S )zh
        Return the name that a converter for an attribute name *attr_name*
        would have.
        Z__attr_converter_r   )ri   r   r   r   r×  +  s    zConverter._get_global_name)ri   r»  rP   c                 C  s‚   | j s"| js"|  |¡› d|› d�S | j rJ| jrJ|  |¡› d|› d|› d�S | j rf|  |¡› d|› d�S |  |¡› d|› d|› d�S )zÏ
        Return a string that calls the converter for an attribute name
        *attr_name* and the value in variable named *value_var* according to
        `self.takes_self` and `self.takes_field`.
        r©  r‰  z, self, attr_dict['z'])z, self)z, attr_dict[')rÕ  rñ  r×  )r   ri   r»  r   r   r   rÂ  3  s    zConverter._fmt_converter_callc                 C  s   | j | j| jdœS )zx
        Return a dict containing only converter and takes_self -- the rest gets
        computed when loading.
        ©r2   rÕ  rñ  rú  r   r   r   r   ré   D  s    ýzConverter.__getstate__c                 C  s   | j f |Ž dS )z+
        Load instance from state.
        Nry  ré  r   r   r   rê   O  s    zConverter.__setstate__N)r    r!   r"   r#   r  rý   r%  r×  rÂ  ré   rê   r   r   r   r   rÀ  ò
  s   	c                 C  s(   g | ] }t |td dd dddddd�
‘qS rî  rï  r  r   r   r   r¤   V  s   ôörú  c              	     sV  t  d| ¡} t|tƒr|}n*t|ttfƒr:dd„ |D ƒ}nd}t|ƒ‚| dd¡}| dd¡}| dd¡}	i ‰ |dk	r€ˆ  |¡ |dk	r�|ˆ d< |dk	r |ˆ d< |	dk	r°|	ˆ d< t	 
| |i ‡ fd	d
„¡}
t tt¡� t d¡j dd¡|
_W 5 Q R X | dd¡}t|| d¡| d¡dƒ\|d< |d< tf d|i|—Ž|
ƒ}dd„ | ¡ D ƒ|_|S )a  
    A quick way to create a new class called *name* with *attrs*.

    .. note::

        ``make_class()`` is a thin wrapper around `attr.s`, not `attrs.define`
        which means that it doesn't come with some of the improved defaults.

        For example, if you want the same ``on_setattr`` behavior as in
        `attrs.define`, you have to pass the hooks yourself: ``make_class(...,
        on_setattr=setters.pipe(setters.convert, setters.validate)``

    .. warning::

        It is *your* duty to ensure that the class name and the attribute names
        are valid identifiers. ``make_class()`` will *not* validate them for
        you.

    Args:
        name (str): The name for the new class.

        attrs (list | dict):
            A list of names or a dictionary of mappings of names to `attr.ib`\
            s / `attrs.field`\ s.

            The order is deduced from the order of the names or attributes
            inside *attrs*.  Otherwise the order of the definition of the
            attributes is used.

        bases (tuple[type, ...]): Classes that the new class will subclass.

        class_body (dict):
            An optional dictionary of class attributes for the new class.

        attributes_arguments: Passed unmodified to `attr.s`.

    Returns:
        type: A new class with *attrs*.

    .. versionadded:: 17.1.0 *bases*
    .. versionchanged:: 18.1.0 If *attrs* is ordered, the order is retained.
    .. versionchanged:: 23.2.0 *class_body*
    .. versionchanged:: 25.2.0 Class names can now be unicode.
    ÚNFKCc                 S  s   i | ]}|t ƒ “qS r   )rH   r¦   r   r   r   r     s      zmake_class.<locals>.<dictcomp>z(attrs argument must be a dict or a list.rç   Nrè   rý   c                   s
   |   ˆ ¡S r'   )rÿ   )r3  ©rh   r   r   rš   ³  r›   zmake_class.<locals>.<lambda>r	   r    Ú__main__r/   r5   r7   Tr±   c                 S  s"   i | ]\}}|j d k	r||j “qS r'   )r*   r  r   r   r   r  Ì  s    
  )ÚunicodedataÚ	normalizer@   rë   rA   rB   r<   Úpoprÿ   rÝ  Ú	new_classr
  r  r  r=   r³  Ú	_getframeÚ	f_globalsr–   r!   rr  rÔ   r©   rp   )r�   rl   ÚbasesZ
class_bodyZattributes_argumentsr0  rG   rµ  r·  Z	user_initÚtype_r/   rx   r   rü  r   Ú
make_classk  sP    0

 ÿüýÿr  )r÷   r…  c                   @  s   e Zd ZdZeƒ Zdd„ ZdS )Ú_AndValidatorz2
    Compose many validators to a single one.
    c                 C  s   | j D ]}||||ƒ qd S r'   )Ú_validators)r   rÐ   r“   rÉ   r  r   r   r   rð  Þ  s    
z_AndValidator.__call__N)r    r!   r"   r#   rH   r  rð  r   r   r   r   r  Ö  s   r  c                  G  s6   g }| D ] }|  t|tƒr |jn|g¡ qtt|ƒƒS )a  
    A validator that composes multiple validators into one.

    When called on a value, it runs all wrapped validators.

    Args:
        validators (~collections.abc.Iterable[typing.Callable]):
            Arbitrary number of validators.

    .. versionadded:: 17.1.0
    )r¼   r@   r  r  rB   )Z
validatorsrÚ  r-   r   r   r   rD   ã  s    ÿýrD   c                    sº   t dd„ ˆ D ƒƒ}|r$‡ fdd„}n‡ fdd„}ˆ sPtdƒ}|j ||dœ¡ nTtˆ d ƒ ¡ }|rn||jd	< ˆ d
 }tsŠt|tƒrŠ|j	}t|ƒ 
¡ }|r¤||jd< |r¶t|ddd�S |S )a…  
    A converter that composes multiple converters into one.

    When called on a value, it runs all wrapped converters, returning the
    *last* value.

    Type annotations will be inferred from the wrapped converters', if they
    have any.

        converters (~collections.abc.Iterable[typing.Callable]):
            Arbitrary number of converters.

    .. versionadded:: 20.1.0
    c                 s  s   | ]}t |tƒV  qd S r'   ©r@   rÀ  )r’   Úcr   r   r   rž   
  s     zpipe.<locals>.<genexpr>c                   s,   ˆ D ]"}t |tƒr|| ||ƒn|| ƒ} q| S r'   r	  )rd  rÐ   rQ  r
  ©Ú
convertersr   r   Úpipe_converter  s    ÿzpipe.<locals>.pipe_converterc                   s   ˆ D ]}|| ƒ} q| S r'   r   )rd  r
  r  r   r   r    s    
ÚA)rd  rP   r   rd  rW   rP   Trò  )rp  r   rp   rÿ   r   rö  r   r@   rÀ  rð  r÷  )r  Zreturn_instancer  r  ÚtÚlastrù  r   r  r   rC   ú  s&    


rC   )NrI   )N)T)NNNNNNNFFTFFFFFNNFFNNNTN)N)NN)iÚ
__future__r   r  r
  rã  r$   rí   r!  r\   r³  rÝ  rþ  Úcollections.abcr   r   Ú	functoolsr   Útypingr   r   r   rI   r
   r   r   r   r   r   r   r   r   Ú
exceptionsr   r   r   r   ÚobjectrÇ   r®   rÖ  ru   r   rÞ  rß  r	  rC   rò   rñ   rð   ÚEnumr   r   Úintr&   rH   rU   ra   rj   rk   rv   ry   r�   rŽ   rµ   rÀ   rÊ   rÌ   r‚   rÑ   rr  r;   rv  rl   rÔ   rz  r½   rD  rš  rY  rZ  ra  r¦  r2  r¬  rÍ   r¯  r°  rM  r¿  rÄ  rÅ  rÆ  rÌ  r²  r°   r¬   r  Z_arE   r?   Ú_frÀ  r  r  rD   r   r   r   r   Ú<module>   s2   		
ñ
n  ü ü#!l4:    N, ÿ
                        è
 d
H%8
9
.E
/&   Kò
þû	 'ódó ÿ ÿ
k
