a
    c	gO                     @  s2  U d Z ddlmZ ddlmZ ddlZddlZddlZddl	Z	ddl	m
Z
 ddl	mZ ddl	mZ ddl	mZ ddl	mZ dd	l	mZ dd
l	mZ ddl	mZ ddl	mZ ddl	mZ ddl	mZ ddl	mZ ddl	mZ ddl	mZ ddl	mZ ddl	mZ ddl	mZ ddl	mZ ddl	mZ ddlZddlmZ ddl	m Z  ddl	m!Z! e	j"s\esddl#m$Z$ ddl#m%Z% ddl#m&Z& ddl#m'Z' ddl#m(Z( dd l#m)Z) nHddl*m&Z& ddl*m'Z' ddl*m$Z$ ddl+m%Z% ddl+m(Z( dd l+m)Z) ed!e
d"Z,ed#e
d"Z-ed$e
d"Z.ed%d&d'Z/e0 Z1d(e2d)< e0dgZ3d(e2d*< d+d+d+d,d-d.Z4d/d0d1d2d3Z5e$ Z6d4e2d5< G d6d7 d7e'e-e.f Z7ed8e
d"Z8ed9e
d"Z9G d:d; d;ee, Z:G d<d= d=e:e, Z;G d>d? d?e&e:e, Z<dnd@dAZ=e>Z?e=Z@G dBdC dCee, ZAG dDdE dEe%ZBG dFdG dGee-e.f ZCG dHdI dIee-e.f ZDeEZFe>ZGe(ZHG dJdK dKee, ZIdLd+dMdNdOZJdodLdPd+dQdRdSZKdTdU ZLdVdW ZMdLdXdYdZd[ZNdpd\d]ZOd^d_dYd`daZPG dbdc dce	jQe-e.f ZRG ddde dee!e/ ZSG dfdg dge!ZTG dhdi diee, ZUG djdk dkeUe, ZVdldm ZWdS )qzCollection classes and helpers.    )annotationsN)Any)Callable)cast)Dict)	FrozenSet)Generic)Iterable)Iterator)List)Mapping)NoReturn)Optional)overload)Sequence)Set)Tuple)TypeVar)Union)
ValuesView   )HAS_CYEXTENSION)Literal)Protocol)immutabledict)IdentitySet)ReadOnlyContainer)ImmutableDictBase)
OrderedSet)unique_list_T)bound_KT_VT_T_coT)	covariantzFrozenSet[Any]	EMPTY_SETNONE_SET	List[Any])abreturnc                 C  sj   t | |}g }t| t| }}|D ].}||v rL|| || }} q$|| q(|| qfq$|S )af  merge two lists, maintaining ordering as much as possible.

    this is to reconcile vars(cls) with cls.__annotations__.

    Example::

        >>> a = ['__tablename__', 'id', 'x', 'created_at']
        >>> b = ['id', 'name', 'data', 'y', 'created_at']
        >>> merge_lists_w_ordering(a, b)
        ['__tablename__', 'id', 'name', 'data', 'y', 'x', 'created_at']

    This is not necessarily the ordering that things had on the class,
    in this case the class is::

        class User(Base):
            __tablename__ = "users"

            id: Mapped[int] = mapped_column(primary_key=True)
            name: Mapped[str]
            data: Mapped[Optional[str]]
            x = Column(Integer)
            y: Mapped[int]
            created_at: Mapped[datetime.datetime] = mapped_column()

    But things are *mostly* ordered.

    The algorithm could also be done by creating a partial ordering for
    all items in both lists and then using topological_sort(), but that
    is too much overhead.

    Background on how I came up with this is at:
    https://gist.github.com/zzzeek/89de958cf0803d148e74861bd682ebae

    )setintersectioniterdiscardappendextend)r)   r*   overlapresultcurrentotherelement r7   _/var/www/html/llm_bihealth/app/venv/lib/python3.9/site-packages/sqlalchemy/util/_collections.pymerge_lists_w_orderingK   s    #


r9   zMapping[_KT, _VT]zimmutabledict[_KT, _VT])dr+   c                 C  s"   | st S t| tr| S t| S d S N)
EMPTY_DICT
isinstancer   r:   r7   r7   r8   coerce_to_immutabledict   s
    
r?   zimmutabledict[Any, Any]r<   c                   @  s\   e Zd ZdZdddddZddd	d
ZddddZddddddZddddZdS )
FacadeDictz*A dictionary that is not publicly mutable.r   zFacadeDict[Any, Any])argsr+   c                 G  s   t | }|S r;   )r   __new__)clsrA   newr7   r7   r8   rB      s    
zFacadeDict.__new__r   r+   c                 C  s   t dd S )Nz\an immutabledict shouldn't need to be copied.  use dict(d) if you need a mutable dictionary.)NotImplementedErrorselfr7   r7   r8   copy   s    zFacadeDict.copyc                 C  s   t t| ffS r;   )r@   dictrG   r7   r7   r8   
__reduce__   s    zFacadeDict.__reduce__r"   r#   Nonekeyvaluer+   c                 C  s   t | || dS )z,insert an item into the dictionary directly.N)rJ   __setitem__rH   rN   rO   r7   r7   r8   _insert_item   s    zFacadeDict._insert_itemstrc                 C  s   dt |  S )NzFacadeDict(%s))rJ   __repr__rG   r7   r7   r8   rT      s    zFacadeDict.__repr__N)	__name__
__module____qualname____doc__rB   rI   rK   rR   rT   r7   r7   r7   r8   r@      s   r@   _DT_Fc                      s  e Zd ZU dZdZded< ddddZdd	d
dZdd	ddZdd	 fddZ	dddddZ
ddddddZdddddZdddd d!Zddddd"d#Zd$d	d%d&Zd$dd'd(d)Zdddd*d+Zdd,dd-d.Zd/d	d0d1Zddd2d3d4Zedd5dd6d7Zedd8d8d9d:d7ZdKdd<d=d9d>d7Zdd	d?d@ZdAd	dBdCZdDd	dEdFZdd,ddGdHZdd	dIdJZ  ZS )L
Propertiesz8Provide a __getattr__/__setattr__ interface over a dict._datazDict[str, _T]r]   )datac                 C  s   t | d| d S Nr]   object__setattr__)rH   r^   r7   r7   r8   __init__   s    zProperties.__init__intrE   c                 C  s
   t | jS r;   lenr]   rG   r7   r7   r8   __len__   s    zProperties.__len__Iterator[_T]c                 C  s   t t| j S r;   )r.   listr]   valuesrG   r7   r7   r8   __iter__   s    zProperties.__iter__z	List[str]c                   s   t t dd | j D  S )Nc                 S  s   g | ]}t |qS r7   )rS   .0kr7   r7   r8   
<listcomp>       z&Properties.__dir__.<locals>.<listcomp>)dirsuperr]   keysrG   	__class__r7   r8   __dir__   s    zProperties.__dir__zProperties[_F]zList[Union[_T, _F]])r5   r+   c                 C  s   t | t | S r;   )ri   )rH   r5   r7   r7   r8   __add__   s    zProperties.__add__rS   r    rL   )rN   objr+   c                 C  s   || j |< d S r;   r\   rH   rN   rx   r7   r7   r8   rP      s    zProperties.__setitem__rN   r+   c                 C  s
   | j | S r;   r\   rH   rN   r7   r7   r8   __getitem__   s    zProperties.__getitem__c                 C  s   | j |= d S r;   r\   r{   r7   r7   r8   __delitem__   s    zProperties.__delitem__c                 C  s   || j |< d S r;   r\   ry   r7   r7   r8   rb      s    zProperties.__setattr__zDict[str, Any]c                 C  s
   d| j iS r_   r\   rG   r7   r7   r8   __getstate__   s    zProperties.__getstate__)stater+   c                 C  s   t | d|d  d S r_   r`   )rH   r   r7   r7   r8   __setstate__   s    zProperties.__setstate__c                 C  s,   z| j | W S  ty&   t|Y n0 d S r;   )r]   KeyErrorAttributeErrorr{   r7   r7   r8   __getattr__   s    zProperties.__getattr__boolc                 C  s
   || j v S r;   r\   r{   r7   r7   r8   __contains__   s    zProperties.__contains__zReadOnlyProperties[_T]c                 C  s
   t | jS )z8Return an immutable proxy for this :class:`.Properties`.)ReadOnlyPropertiesr]   rG   r7   r7   r8   as_readonly   s    zProperties.as_readonly)rO   r+   c                 C  s   | j | d S r;   )r]   update)rH   rO   r7   r7   r8   r      s    zProperties.updatezOptional[_T]c                 C  s   d S r;   r7   r{   r7   r7   r8   get   s    zProperties.getzUnion[_DT, _T]rN   defaultr+   c                 C  s   d S r;   r7   rH   rN   r   r7   r7   r8   r      s    NzOptional[Union[_DT, _T]]zOptional[Union[_T, _DT]]c                 C  s   || v r| | S |S d S r;   r7   r   r7   r7   r8   r      s    c                 C  s
   t | jS r;   )ri   r]   rG   r7   r7   r8   rs      s    zProperties.keysList[_T]c                 C  s   t | j S r;   )ri   r]   rj   rG   r7   r7   r8   rj      s    zProperties.valueszList[Tuple[str, _T]]c                 C  s   t | j S r;   )ri   r]   itemsrG   r7   r7   r8   r      s    zProperties.itemsc                 C  s
   || j v S r;   r\   r{   r7   r7   r8   has_key   s    zProperties.has_keyc                 C  s   | j   d S r;   )r]   clearrG   r7   r7   r8   r     s    zProperties.clear)N)rU   rV   rW   rX   	__slots____annotations__rc   rg   rk   rv   rw   rP   r|   r}   rb   r~   r   r   r   r   r   r   r   rs   rj   r   r   r   __classcell__r7   r7   rt   r8   r[      s:   
 r[   c                   @  s   e Zd ZdZdZdd ZdS )OrderedPropertieszUProvide a __getattr__/__setattr__ interface with an OrderedDict
    as backing store.r7   c                 C  s   t | t  d S r;   )r[   rc   OrderedDictrG   r7   r7   r8   rc     s    zOrderedProperties.__init__N)rU   rV   rW   rX   r   rc   r7   r7   r7   r8   r     s   r   c                   @  s   e Zd ZdZdZdS )r   zDProvide immutable dict/object attribute to an underlying dictionary.r7   N)rU   rV   rW   rX   r   r7   r7   r7   r8   r     s   r   c                   s0    fddt  |dD }    | dS )zSort an OrderedDict in-place.c                   s   g | ]}| | fqS r7   r7   rl   r>   r7   r8   ro     rp   z,_ordered_dictionary_sort.<locals>.<listcomp>)rN   N)sortedr   r   )r:   rN   r   r7   r>   r8   _ordered_dictionary_sort  s    r   c                   @  s<   e Zd ZdddddZdd Zdd	 Zd
d Zdd ZdS )WeakSequencer7   zSequence[_T])_WeakSequence__elementsc                   s0   t | fdd  | _ fdd|D | _d S )Nc                 S  s   | }|d ur|j |  d S r;   )_storageremove)itemselfrefrH   r7   r7   r8   _remove'  s    z&WeakSequence.__init__.<locals>._removec                   s   g | ]}t | qS r7   )weakrefref)rm   r6   r   r7   r8   ro   -  s   z)WeakSequence.__init__.<locals>.<listcomp>)r   r   r   r   )rH   r   r7   r   r8   rc   $  s
    
zWeakSequence.__init__c                 C  s   | j t|| j d S r;   )r   r0   r   r   r   )rH   r   r7   r7   r8   r0   1  s    zWeakSequence.appendc                 C  s
   t | jS r;   )rf   r   rG   r7   r7   r8   rg   4  s    zWeakSequence.__len__c                 C  s   dd dd | j D D S )Nc                 s  s   | ]}|d ur|V  qd S r;   r7   )rm   rx   r7   r7   r8   	<genexpr>8  s   z(WeakSequence.__iter__.<locals>.<genexpr>c                 s  s   | ]}| V  qd S r;   r7   )rm   r   r7   r7   r8   r   9  rp   )r   rG   r7   r7   r8   rk   7  s    zWeakSequence.__iter__c                 C  s8   z| j | }W n ty,   td| Y n0 | S d S )NzIndex %s out of range)r   r   
IndexError)rH   indexrx   r7   r7   r8   r|   <  s
    zWeakSequence.__getitem__N)r7   )rU   rV   rW   rc   r0   rg   rk   r|   r7   r7   r7   r8   r   #  s
   r   c                   @  s   e Zd ZdddddZdS )OrderedIdentitySetNzOptional[Iterable[Any]])iterablec                 C  s.   t |  t | _|r*|D ]}| | qd S r;   )r   rc   r   Z_membersadd)rH   r   or7   r7   r8   rc   F  s
    
zOrderedIdentitySet.__init__)N)rU   rV   rW   rc   r7   r7   r7   r8   r   E  s   r   c                   @  s.   e Zd ZdZddddZddddd	Zd
S )PopulateDictzA dict which populates missing values via a creation function.

    Note the creation function takes a key, unlike
    collections.defaultdict.

    zCallable[[_KT], _VT]creatorc                 C  s
   || _ d S r;   r   )rH   r   r7   r7   r8   rc   V  s    zPopulateDict.__init__r   rz   c                 C  s   |  | | |< }|S r;   r   rH   rN   valr7   r7   r8   __missing__Y  s    zPopulateDict.__missing__NrU   rV   rW   rX   rc   r   r7   r7   r7   r8   r   N  s   r   c                   @  s.   e Zd ZdZddddZddddd	Zd
S )WeakPopulateDictzaLike PopulateDict, but assumes a self + a method and does not create
    a reference cycle.

    ztypes.MethodType)creator_methodc                 C  s   |j | _|j}t|| _d S r;   )__func__r   __self__r   r   weakself)rH   r   r   r7   r7   r8   rc   d  s    zWeakPopulateDict.__init__r   rz   c                 C  s   |  |  | | |< }|S r;   )r   r   r   r7   r7   r8   r   i  s    zWeakPopulateDict.__missing__Nr   r7   r7   r7   r8   r   ^  s   r   c                   @  s^   e Zd ZU dZdZded< ded< ded< ddd
dddZdddddZddddZd	S )UniqueAppenderzAppends items to a collection ensuring uniqueness.

    Additional appends() of the same object are ignored.  Membership is
    determined by identity (``is a``) not equality (``==``).
    )r^   _data_appender_uniquez&Union[Iterable[_T], Set[_T], List[_T]]r^   zCallable[[_T], None]r   zDict[int, Literal[True]]r   NzOptional[str])r^   viac                 C  sT   || _ i | _|rt||| _n2t|dr8td|j| _nt|drPtd|j| _d S )Nr0   r   r   zSet[_T])r^   r   getattrr   hasattrr   r0   r   )rH   r^   r   r7   r7   r8   rc     s    

zUniqueAppender.__init__r    rL   )r   r+   c                 C  s*   t |}|| jvr&| | d| j|< d S )NT)idr   r   )rH   r   Zid_r7   r7   r8   r0     s    

zUniqueAppender.appendrh   rE   c                 C  s
   t | jS r;   )r.   r^   rG   r7   r7   r8   rk     s    zUniqueAppender.__iter__)N)	rU   rV   rW   rX   r   r   rc   r0   rk   r7   r7   r7   r8   r   w  s   
 r   r   )argr+   c                 C  s6   t | dkr(t| d tjr(t| d S td| S d S )Nr   r   r(   )rf   r=   typesGeneratorTyperi   r   )r   r7   r7   r8   coerce_generator_arg  s    r   zOptional[List[Any]])xr   r+   c                 C  sF   | d u r|S t | tjr&t | ttfr,| gS t | tr:| S t| S d S r;   )r=   collections_abcr	   rS   bytesri   )r   r   r7   r7   r8   to_list  s    
r   c                 C  s   t | dd |D S )zreturn True if any items of set\_ are present in iterable.

    Goes through special effort to ensure __hash__ is not called
    on items in iterable that don't support it.

    c                 S  s   g | ]}|j r|qS r7   )__hash__)rm   ir7   r7   r8   ro     rp   z$has_intersection.<locals>.<listcomp>)r   r-   )set_r   r7   r7   r8   has_intersection  s    r   c                 C  s,   | d u rt  S t| t s$t t| S | S d S r;   )r,   r=   r   r   r7   r7   r8   to_set  s
    
r   zSet[Any])r   r+   c                 C  s,   | d u rt  S t| t s$t t| S | S d S r;   )
column_setr=   r   r   r7   r7   r8   to_column_set  s
    
r   c                 K  s*   |   } |r| | | jf i | | S )z5Copy the given dict and update with the given values.)rI   r   )r:   _newkwr7   r7   r8   update_copy  s
    
r   zIterable[_T]rh   c                 c  s8   | D ].}t |ts,t|dr,t|E dH  q|V  qdS )zGiven an iterator of which further sub-elements may also be
    iterators, flatten the sub-elements into a single iterator.

    rk   N)r=   rS   r   flatten_iterator)r   elemr7   r7   r8   r     s    r   c                   @  s  e Zd ZU dZdZded< ded< ded< d3ddddddZdd ZedddddZ	eddddddZ	d4ddddddZ	dddddZ
dd d!d"Zdd d#d$Zd%d d&d'Zddd(d)d*d+Zdd(d,d-d.Zedd d/d0Zd(d d1d2ZdS )5LRUCachezDictionary with 'squishy' removal of least
    recently used items.

    Note that either get() or [] should be used here, but
    generally its not safe to do an "in" check first as the dictionary
    can change subsequent to that call.

    )capacity	threshold
size_alertr]   _counter_mutexrd   r   floatr   z.Optional[Callable[[LRUCache[_KT, _VT]], None]]r   d         ?NzOptional[Callable[..., None]])r   r   r   c                 C  s,   || _ || _|| _d| _t | _i | _d S )Nr   )r   r   r   r   	threadingLockr   r]   )rH   r   r   r   r7   r7   r8   rc     s    
zLRUCache.__init__c                 C  s   |  j d7  _ | j S )Nr   )r   rG   r7   r7   r8   _inc_counter  s    zLRUCache._inc_counterr"   zOptional[_VT]rz   c                 C  s   d S r;   r7   r{   r7   r7   r8   r     s    zLRUCache.getzUnion[_VT, _T]r   c                 C  s   d S r;   r7   r   r7   r7   r8   r     s    zOptional[Union[_VT, _T]]c                 C  s>   | j ||}||ur6|d ur6|  |d d< |d S |S d S N   r   r   )r]   r   r   )rH   rN   r   r   r7   r7   r8   r     s
    r#   c                 C  s"   | j | }|  |d d< |d S r   )r]   r   )rH   rN   r   r7   r7   r8   r|     s    
zLRUCache.__getitem__zIterator[_KT]rE   c                 C  s
   t | jS r;   )r.   r]   rG   r7   r7   r8   rk   #  s    zLRUCache.__iter__c                 C  s
   t | jS r;   re   rG   r7   r7   r8   rg   &  s    zLRUCache.__len__zValuesView[_VT]c                 C  s   t dd | j D S )Nc                 S  s   i | ]\}}||d  qS )r   r7   )rm   rn   r   r7   r7   r8   
<dictcomp>*  rp   z#LRUCache.values.<locals>.<dictcomp>)typingr   r]   r   rG   r7   r7   r8   rj   )  s    zLRUCache.valuesrL   rM   c                 C  s"   |||   gf| j|< |   d S r;   )r   r]   _manage_sizerQ   r7   r7   r8   rP   ,  s    zLRUCache.__setitem__)_LRUCache__vr+   c                 C  s   | j |= d S r;   r\   )rH   r   r7   r7   r8   r}   0  s    zLRUCache.__delitem__c                 C  s   | j | j | j  S r;   )r   r   rG   r7   r7   r8   size_threshold3  s    zLRUCache.size_thresholdc              	   C  s   | j dsd S zt| j}t| | j| j| j  kr|rHd}| |  t| j	 t
ddd}|| jd  D ],}z| j|d = W qp ty   Y qpY qp0 qpqW | j   n| j   0 d S )NFr   T)rN   reverser   )r   acquirer   r   rf   r   r   r   r]   rj   operator
itemgetterr   release)rH   r   Z
by_counterr   r7   r7   r8   r   7  s&    

zLRUCache._manage_size)r   r   N)N)rU   rV   rW   rX   r   r   rc   r   r   r   r|   rk   rg   rj   rP   r}   propertyr   r   r7   r7   r7   r8   r     s2   
		    
r   c                   @  s   e Zd ZddddZdS )_CreateFuncTyper$   rE   c                 C  s   d S r;   r7   rG   r7   r7   r8   __call__P  s    z_CreateFuncType.__call__NrU   rV   rW   r   r7   r7   r7   r8   r   O  s   r   c                   @  s   e Zd ZddddZdS )_ScopeFuncTyper   rE   c                 C  s   d S r;   r7   rG   r7   r7   r8   r   U  s    z_ScopeFuncType.__call__Nr   r7   r7   r7   r8   r   T  s   r   c                   @  sx   e Zd ZU dZdZded< ded< ded< d	d
dddZddddZddddZdddddZ	ddddZ
dS )ScopedRegistrya  A Registry that can store one or multiple instances of a single
    class on the basis of a "scope" function.

    The object implements ``__call__`` as the "getter", so by
    calling ``myregistry()`` the contained object is returned
    for the current scope.

    :param createfunc:
      a callable that returns a new object to be placed in the registry

    :param scopefunc:
      a callable that will return a key to store/retrieve an object.
    
createfunc	scopefuncregistryz_CreateFuncType[_T]r   r   r   r   r   Callable[[], _T]zCallable[[], Any])r   r   c                 C  s   || _ || _i | _dS )aV  Construct a new :class:`.ScopedRegistry`.

        :param createfunc:  A creation function that will generate
          a new value for the current scope, if none is present.

        :param scopefunc:  A function that returns a hashable
          token representing the current scope (such as, current
          thread identifier).

        Nr   )rH   r   r   r7   r7   r8   rc   n  s    zScopedRegistry.__init__r    rE   c                 C  s>   |   }z| j| W S  ty8   | j||   Y S 0 d S r;   )r   r   r   
setdefaultr   r{   r7   r7   r8   r     s
    zScopedRegistry.__call__r   c                 C  s   |   | jv S )z9Return True if an object is present in the current scope.)r   r   rG   r7   r7   r8   has  s    zScopedRegistry.hasrL   rx   r+   c                 C  s   || j |  < dS )z$Set the value for the current scope.N)r   r   rH   rx   r7   r7   r8   r,     s    zScopedRegistry.setc                 C  s(   z| j |  = W n ty"   Y n0 dS )z Clear the current scope, if any.N)r   r   r   rG   r7   r7   r8   r     s    zScopedRegistry.clearN)rU   rV   rW   rX   r   r   rc   r   r   r,   r   r7   r7   r7   r8   r   Y  s   
r   c                   @  sX   e Zd ZdZddddZdddd	Zd
dddZdddddZddddZdS )ThreadLocalRegistryz\A :class:`.ScopedRegistry` that uses a ``threading.local()``
    variable for storage.

    r   )r   c                 C  s   || _ t | _d S r;   )r   r   localr   )rH   r   r7   r7   r8   rc     s    zThreadLocalRegistry.__init__r    rE   c                 C  s6   z
| j jW S  ty0   |   }| j _| Y S 0 d S r;   )r   rO   r   r   )rH   r   r7   r7   r8   r     s
    
zThreadLocalRegistry.__call__r   c                 C  s   t | jdS )NrO   )r   r   rG   r7   r7   r8   r     s    zThreadLocalRegistry.hasrL   r   c                 C  s   || j _d S r;   )r   rO   r   r7   r7   r8   r,     s    zThreadLocalRegistry.setc                 C  s"   z
| j `W n ty   Y n0 d S r;   )r   rO   r   rG   r7   r7   r8   r     s    
zThreadLocalRegistry.clearN)	rU   rV   rW   rX   rc   r   r   r,   r   r7   r7   r7   r8   r     s   r   c                 C  s0   d}| D ]"}||u r|d7 }|dkr dS qdS )zrGiven a sequence and search object, return True if there's more
    than one, False if zero or one of them.


    r   r   TFr7   )sequencetargetcr   r7   r7   r8   	has_dupes  s    
r   )N)N)N)XrX   
__future__r   collections.abcabcr   r   r   r   r   r   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   Z_has_cyr   r   r   TYPE_CHECKINGZ_py_collectionsr   r   r   r   r   r   Z$sqlalchemy.cyextension.immutabledictZ"sqlalchemy.cyextension.collectionsr    r"   r#   r$   	frozensetr&   r   r'   r9   r?   r<   r@   rY   rZ   r[   r   r   r   rJ   r   Zsort_dictionaryr   r   r   r   r,   r   Zcolumn_dictZordered_column_setr   r   r   r   r   r   r   r   MutableMappingr   r   r   r   r   r   r7   r7   r7   r8   <module>	   s   8	Y


"	%		

k@