
    e?1iN                       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	jD                  ses%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) n$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)  ed!e
"      Z, ed#e
"      Z- ed$e
"      Z. ed%d&'      Z/ e0       Z1d(e2d)<    e0dg      Z3d(e2d*<   dVd+Z4dWd,Z5 e$       Z6d-e2d.<    G d/ d0e'e-e.f         Z7 ed1e
"      Z8 ed2e
"      Z9 G d3 d4ee,         Z: G d5 d6e:e,         Z; G d7 d8e&e:e,         Z<dXd9Z=e>Z?e=Z@ G d: d;ee,         ZA G d< d=e%      ZB G d> d?ee-e.f         ZC G d@ dAee-e.f         ZDeEZFe>ZGe(ZH G dB dCee,         ZIdYdDZJdXdZdEZKdF ZLdG ZMd[dHZNdXdIZOd\dJZP G dK dLe	j                  e-e.f         ZR G dM dNe!e/         ZS G dO dPe!      ZT G dQ dRee,         ZU G dS dTeUe,         ZVdU ZWy)]z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_SETc                    t        |       j                  |      }g }t        |       t        |      }}	 |D ].  }||v r|j                  |       ||}} n'|j	                  |       0 |j                  |       	 |S H)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)aboverlapresultcurrentotherelements          f/home/www/therecruiter.miabetepe.com/venv/lib/python3.12/site-packages/sqlalchemy/util/_collections.pymerge_lists_w_orderingr8   K   s    F !f!!!$GF!Wd1gUG
 		G'!(!(%wMM'"		 MM% M     c                L    | st         S t        | t              r| S t        |       S N)
EMPTY_DICT
isinstancer   )ds    r7   coerce_to_immutabledictr?      s%    	A}	%Qr9   zimmutabledict[Any, Any]r<   c                  8    e Zd ZdZddZd	dZd
dZddZddZy)
FacadeDictz*A dictionary that is not publicly mutable.c                0    t        j                  |       }|S r;   )r   __new__)clsargsnews      r7   rC   zFacadeDict.__new__   s    '',
r9   c                    t        d      )Nz\an immutabledict shouldn't need to be copied.  use dict(d) if you need a mutable dictionary.)NotImplementedErrorselfs    r7   copyzFacadeDict.copy   s    !0
 	
r9   c                &    t         t        |       ffS r;   )rA   dictrI   s    r7   
__reduce__zFacadeDict.__reduce__   s    DJ=((r9   c                2    t         j                  | ||       y)z,insert an item into the dictionary directly.N)rM   __setitem__rJ   keyvalues      r7   _insert_itemzFacadeDict._insert_item   s    sE*r9   c                2    dt         j                  |       z  S )NzFacadeDict(%s))rM   __repr__rI   s    r7   rV   zFacadeDict.__repr__   s    $--"555r9   N)rE   r   returnzFacadeDict[Any, Any])rW   r   rW   r   rR   r#   rS   r$   rW   None)rW   str)	__name__
__module____qualname____doc__rC   rK   rN   rT   rV    r9   r7   rA   rA      s    4
)+6r9   rA   _DT_Fc                      e Zd ZU dZdZded<   ddZddZddZd f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ed)d       Zed*d       Z	 d+	 	 	 	 	 d,dZddZd-dZd.dZd&dZd/dZ xZS )0
Propertiesz8Provide a __getattr__/__setattr__ interface over a dict._dataDict[str, _T]rf   c                2    t         j                  | d|       y Nrf   object__setattr__)rJ   datas     r7   __init__zProperties.__init__   s    4$/r9   c                ,    t        | j                        S r;   lenrf   rI   s    r7   __len__zProperties.__len__       4::r9   c                Z    t        t        | j                  j                                     S r;   )r,   listrf   valuesrI   s    r7   __iter__zProperties.__iter__   s    D**,-..r9   c                    t        t                     | j                  j                         D cg c]  }t	        |       c}z   S c c}w r;   )dirsuperrf   keysr[   )rJ   k	__class__s     r7   __dir__zProperties.__dir__   s1    57|tzz/@A!s1vAAAAs   Ac                0    t        |       t        |      z   S r;   )ru   )rJ   r5   s     r7   __add__zProperties.__add__   s    DzDK''r9   c                "    || j                   |<   y r;   re   rJ   rR   objs      r7   rP   zProperties.__setitem__       

3r9   c                     | j                   |   S r;   re   rJ   rR   s     r7   __getitem__zProperties.__getitem__   s    zz#r9   c                    | j                   |= y r;   re   r   s     r7   __delitem__zProperties.__delitem__       JJsOr9   c                "    || j                   |<   y r;   re   r   s      r7   rl   zProperties.__setattr__   r   r9   c                    d| j                   iS ri   re   rI   s    r7   __getstate__zProperties.__getstate__   s    $$r9   c                8    t         j                  | d|d          y ri   rj   )rJ   states     r7   __setstate__zProperties.__setstate__   s    4%.9r9   c                R    	 | j                   |   S # t        $ r t        |      w xY wr;   )rf   KeyErrorAttributeErrorr   s     r7   __getattr__zProperties.__getattr__   s/    	&::c?" 	& %%	&s    &c                    || j                   v S r;   re   r   s     r7   __contains__zProperties.__contains__       djj  r9   c                ,    t        | j                        S )z8Return an immutable proxy for this :class:`.Properties`.)ReadOnlyPropertiesrf   rI   s    r7   as_readonlyzProperties.as_readonly   s     "$**--r9   c                :    | j                   j                  |       y r;   )rf   update)rJ   rS   s     r7   r   zProperties.update   s    

% r9   c                     y r;   r`   r   s     r7   getzProperties.get       r9   c                     y r;   r`   rJ   rR   defaults      r7   r   zProperties.get   r   r9   c                    || v r| |   S |S r;   r`   r   s      r7   r   zProperties.get   s     $;9Nr9   c                ,    t        | j                        S r;   )ru   rf   rI   s    r7   r{   zProperties.keys       DJJr9   c                H    t        | j                  j                               S r;   )ru   rf   rv   rI   s    r7   rv   zProperties.values   s    DJJ%%'((r9   c                H    t        | j                  j                               S r;   )ru   rf   itemsrI   s    r7   r   zProperties.items   s    DJJ$$&''r9   c                    || j                   v S r;   re   r   s     r7   has_keyzProperties.has_key   r   r9   c                8    | j                   j                          y r;   )rf   clearrI   s    r7   r   zProperties.clear  s    

r9   )rm   rg   rW   intrW   Iterator[_T])rW   z	List[str])r5   zProperties[_F]rW   zList[Union[_T, _F]])rR   r[   r   r!   rW   rZ   )rR   r[   rW   r!   )rR   r[   rW   rZ   )rW   Dict[str, Any])r   r   rW   rZ   )rR   r[   rW   bool)rW   zReadOnlyProperties[_T])rS   rg   rW   rZ   )rR   r[   rW   zOptional[_T])rR   r[   r   Union[_DT, _T]rW   r   r;   )rR   r[   r   zOptional[Union[_DT, _T]]rW   zOptional[Union[_T, _DT]])rW   List[_T])rW   zList[Tuple[str, _T]]rW   rZ   )r\   r]   r^   r_   	__slots____annotations__rn   rr   rw   r~   r   rP   r   r   rl   r   r   r   r   r   r   r   r   r{   rv   r   r   r   __classcell__)r}   s   @r7   rd   rd      s    BI0/B(%:&!.
!     =A!9	! )(!r9   rd   c                      e Zd ZdZdZd Zy)OrderedPropertieszUProvide a __getattr__/__setattr__ interface with an OrderedDict
    as backing store.r`   c                @    t         j                  | t                      y r;   )rd   rn   OrderedDictrI   s    r7   rn   zOrderedProperties.__init__  s    D+-0r9   N)r\   r]   r^   r_   r   rn   r`   r9   r7   r   r     s     I1r9   r   c                      e Zd ZdZdZy)r   zDProvide immutable dict/object attribute to an underlying dictionary.r`   N)r\   r]   r^   r_   r   r`   r9   r7   r   r     s
    NIr9   r   c                    t        | |      D cg c]	  }|| |   f }}| j                          | j                  |       yc c}w )zSort an OrderedDict in-place.)rR   N)sortedr   r   )r>   rR   r|   r   s       r7   _ordered_dictionary_sortr     s?     !'qc 231a1Y3E3GGIHHUO	 4s   Ac                  .    e Zd ZdddZd Zd Zd Zd Zy)	WeakSequencec                    t        j                  |       fd}|| _        |D cg c]  }t        j                  ||       c}| _        y c c}w )Nc                N     |       }||j                   j                  |        y y r;   )_storageremove)itemselfrefrJ   s      r7   _removez&WeakSequence.__init__.<locals>._remove'  s&    9D$$T*  r9   )weakrefrefr   r   )rJ   _WeakSequence__elementsr   r6   s       r7   rn   zWeakSequence.__init__$  sE     #*++d"3 	+
 9C
.5GKK)
 
s   A
c                v    | j                   j                  t        j                  || j                               y r;   )r   r.   r   r   r   )rJ   r   s     r7   r.   zWeakSequence.append1  s#    W[[t||<=r9   c                ,    t        | j                        S r;   )rq   r   rI   s    r7   rr   zWeakSequence.__len__4  s    4==!!r9   c                6    d d | j                   D        D        S )Nc              3  &   K   | ]	  }||  y wr;   r`   ).0r   s     r7   	<genexpr>z(WeakSequence.__iter__.<locals>.<genexpr>8  s      
sC
s   c              3  *   K   | ]  } |         y wr;   r`   )r   r   s     r7   r   z(WeakSequence.__iter__.<locals>.<genexpr>9  s     ;cCE;s   )r   rI   s    r7   rw   zWeakSequence.__iter__7  s    
;T]];
 	
r9   c                f    	 | j                   |   } |       S # t        $ r t        d|z        w xY w)NzIndex %s out of range)r   r   
IndexError)rJ   indexr   s      r7   r   zWeakSequence.__getitem__<  s@    	--&C 5L  	>4u<==	>s    0N)r`   )r   zSequence[_T])r\   r]   r^   rn   r.   rr   rw   r   r`   r9   r7   r   r   #  s    
>"

r9   r   c                      e Zd ZdddZy)OrderedIdentitySetNc                    t        j                  |        t               | _        |r|D ]  }| j	                  |        y y r;   )r   rn   r   _membersadd)rJ   iterableos      r7   rn   zOrderedIdentitySet.__init__F  s;    T"#  r9   r;   )r   zOptional[Iterable[Any]])r\   r]   r^   rn   r`   r9   r7   r   r   E  s    r9   r   c                       e Zd ZdZddZddZy)PopulateDictzA dict which populates missing values via a creation function.

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

    c                    || _         y r;   creator)rJ   r   s     r7   rn   zPopulateDict.__init__V  s	    r9   c                2    | j                  |      x| |<   }|S r;   r   rJ   rR   vals      r7   __missing__zPopulateDict.__missing__Y  s    ,,s++S	C
r9   N)r   zCallable[[_KT], _VT]rR   r   rW   r   r\   r]   r^   r_   rn   r   r`   r9   r7   r   r   N  s    r9   r   c                       e Zd ZdZddZddZy)WeakPopulateDictzaLike PopulateDict, but assumes a self + a method and does not create
    a reference cycle.

    c                r    |j                   | _        |j                  }t        j                  |      | _        y r;   )__func__r   __self__r   r   weakself)rJ   creator_methodr   s      r7   rn   zWeakPopulateDict.__init__d  s*    %..!**H-r9   c                P    | j                  | j                         |      x| |<   }|S r;   )r   r   r   s      r7   r   zWeakPopulateDict.__missing__i  s&    ,,t}}<<S	C
r9   N)r   ztypes.MethodTyper   r   r`   r9   r7   r   r   ^  s    
.
r9   r   c                  V    e Zd ZU dZdZded<   ded<   ded<   	 d	 	 	 dd
ZddZddZy	)UniqueAppenderzAppends items to a collection ensuring uniqueness.

    Additional appends() of the same object are ignored.  Membership is
    determined by identity (``is a``) not equality (``==``).
    )rm   _data_appender_unique&Union[Iterable[_T], Set[_T], List[_T]]rm   zCallable[[_T], None]r   zDict[int, Literal[True]]r   Nc                    || _         i | _        |rt        ||      | _        y t	        |d      rt        d|      j                  | _        y t	        |d      rt        d|      j                  | _        y y )Nr.   r   r   zSet[_T])rm   r   getattrr   hasattrr   r.   r   )rJ   rm   vias      r7   rn   zUniqueAppender.__init__  sg    
 	")$"4DT8$"&z4"8"?"?DT5!"&y$"7";";D "r9   c                x    t        |      }|| j                  vr!| j                  |       d| j                  |<   y y )NT)idr   r   )rJ   r   id_s      r7   r.   zUniqueAppender.append  s8    hdll"% $DLL #r9   c                ,    t        | j                        S r;   )r,   rm   rI   s    r7   rw   zUniqueAppender.__iter__  s    DIIr9   r;   )rm   r   r   zOptional[str])r   r!   rW   rZ   r   )	r\   r]   r^   r_   r   r   rn   r.   rw   r`   r9   r7   r   r   w  sF     4I
00((%%
 "<4< <%r9   r   c                    t        |       dk(  r+t        | d   t        j                        rt	        | d         S t        d|       S )Nr   r   	List[Any])rq   r=   typesGeneratorTyperu   r   )args    r7   coerce_generator_argr    s;    
3x1}CFE,?,?@CF|K%%r9   c                    | |S t        | t        j                        rt        | t        t        f      r| gS t        | t
              r| S t        |       S r;   )r=   collections_abcr
   r[   bytesru   )xr   s     r7   to_listr    sM    ya112j	C<7 s
	At	Awr9   c                v    t        | j                  |D cg c]  }|j                  s| c}            S c c}w )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.

    )r   r+   __hash__)set_r   is      r7   has_intersectionr    s.     !!h"E!**1"EFGG"Es   66c                f    | 
t               S t        | t               st        t        |             S | S r;   )r*   r=   r  r  s    r7   to_setr    s+    yua71:r9   c                f    | 
t               S t        | t               st        t        |             S | S r;   )
column_setr=   r  r  s    r7   to_column_setr    s-    y|a$'!*%%r9   c                p    | j                         } |r| j                  |        | j                  di | | S )z5Copy the given dict and update with the given values.r`   )rK   r   )r>   _newkws      r7   update_copyr    s1     	
A	AHHNrNHr9   c              #     K   | D ]6  }t        |t              s t        |d      rt        |      E d{    3| 8 y7 w)zGiven an iterator of which further sub-elements may also be
    iterators, flatten the sub-elements into a single iterator.

    rw   N)r=   r[   r   flatten_iterator)r  elems     r7   r  r    s@       $$z)B'---J	-s   0A?Ac                      e Zd ZU dZdZded<   ded<   ded<   	 	 	 d	 	 	 	 	 dd
Zd Zedd       Z	edd       Z		 d	 	 	 	 	 ddZ	ddZ
ddZddZd dZd!dZd"dZed#d       Zd$dZy	)%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_alertrf   _counter_mutexr   r  floatr  z.Optional[Callable[[LRUCache[_KT, _VT]], None]]r  Nc                |    || _         || _        || _        d| _        t	        j
                         | _        i | _        y )Nr   )r  r  r  r   	threadingLockr!  rf   )rJ   r  r  r  s       r7   rn   zLRUCache.__init__  s5     !"$nn&<>
r9   c                D    | xj                   dz  c_         | j                   S Nr   )r   rI   s    r7   _inc_counterzLRUCache._inc_counter  s    }}r9   c                     y r;   r`   r   s     r7   r   zLRUCache.get  r   r9   c                     y r;   r`   r   s      r7   r   zLRUCache.get  r   r9   c                v    | j                   j                  |      }|| j                         |d   d<   |d   S |S N   r   r   )rf   r   r(  )rJ   rR   r   r   s       r7   r   zLRUCache.get  s@     zz~~c"**,DGAJ7NNr9   c                V    | j                   |   }| j                         |d   d<   |d   S r,  )rf   r(  )rJ   rR   r   s      r7   r   zLRUCache.__getitem__  s.    zz#&&(Q
Awr9   c                ,    t        | j                        S r;   )r,   rf   rI   s    r7   rw   zLRUCache.__iter__#  r   r9   c                ,    t        | j                        S r;   rp   rI   s    r7   rr   zLRUCache.__len__&  rs   r9   c           	         t        j                  | j                  j                         D ci c]  \  }}||d    c}}      S c c}}w r'  )typingr   rf   r   )rJ   r|   r  s      r7   rv   zLRUCache.values)  s:      djj6F6F6H!Ida!QqT'!IJJ!Is   A
c                f    ||| j                         gf| j                  |<   | j                          y r;   )r(  rf   _manage_sizerQ   s      r7   rP   zLRUCache.__setitem__,  s.    (9(9(;'<=

3r9   c                    | j                   |= y r;   re   )rJ   _LRUCache__vs     r7   r   zLRUCache.__delitem__0  r   r9   c                N    | j                   | j                   | j                  z  z   S r;   )r  r  rI   s    r7   size_thresholdzLRUCache.size_threshold3  s    }}t}}t~~===r9   c                   | j                   j                  d      sy 	 t        | j                        }t	        |       | j
                  | j
                  | j                  z  z   kD  r|rd}| j                  |        t        | j                  j                         t        j                  d      d      }|| j
                  d  D ]  }	 | j                  |d   =  t	        |       | j
                  | j
                  | j                  z  z   kD  r| j                   j                          y # t        $ r Y ow xY w# | j                   j                          w xY w)NFr-  T)rR   reverser   )r!  acquirer   r  rq   r  r  r   rf   rv   operator
itemgetterr   release)rJ   r  
by_counterr   s       r7   r4  zLRUCache._manage_size7  s   {{""5)	"doo.Jd)dmmdmmdnn.LLL!&JOOD)#JJ%%' ++A. 

 't}}7 !D! JJtAw/! d)dmmdmmdnn.LLL  KK!	 $ ! ! KK!s0   B'D5 D&4D5 &	D2/D5 1D22D5 5E)d   g      ?N)r  r   r  r"  r  zOptional[Callable[..., None]])rR   r#   rW   zOptional[_VT])rR   r#   r   Union[_VT, _T]rW   rA  r;   )rR   r#   r   Optional[Union[_VT, _T]]rW   rB  )rR   r#   rW   r$   )rW   zIterator[_KT]r   )rW   zValuesView[_VT]rY   )r6  r#   rW   rZ   )rW   r"  r   )r\   r]   r^   r_   r   r   rn   r(  r   r   r   rw   rr   rv   rP   r   propertyr8  r4  r`   r9   r7   r  r    s    I M>> 48	?? ? 2	?     =A!9	!
 K > >"r9   r  c                      e Zd ZddZy)_CreateFuncTypec                     y r;   r`   rI   s    r7   __call__z_CreateFuncType.__call__P      r9   N)rW   r%   r\   r]   r^   rG  r`   r9   r7   rE  rE  O      r9   rE  c                      e Zd ZddZy)_ScopeFuncTypec                     y r;   r`   rI   s    r7   rG  z_ScopeFuncType.__call__U  rH  r9   NrX   rI  r`   r9   r7   rL  rL  T  rJ  r9   rL  c                  d    e Zd ZU dZdZded<   ded<   ded<   	 	 	 	 dd	Zdd
ZddZddZ	ddZ
y)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]rQ  rL  rR  r   rS  c                .    || _         || _        i | _        y)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).

        NrP  )rJ   rQ  rR  s      r7   rn   zScopedRegistry.__init__n  s     %"r9   c                    | j                         }	 | j                  |   S # t        $ r- | j                  j                  || j	                               cY S w xY wr;   )rR  rS  r   
setdefaultrQ  r   s     r7   rG  zScopedRegistry.__call__  sR    nn	D==%% 	D==++C1BCC	Ds   ! 3AAc                :    | j                         | j                  v S )z9Return True if an object is present in the current scope.)rR  rS  rI   s    r7   haszScopedRegistry.has  s     ~~4==00r9   c                >    || j                   | j                         <   y)z$Set the value for the current scope.N)rS  rR  rJ   r   s     r7   r*   zScopedRegistry.set  s     +.dnn&'r9   c                Z    	 | j                   | j                         = y# t        $ r Y yw xY w)z Clear the current scope, if any.N)rS  rR  r   rI   s    r7   r   zScopedRegistry.clear  s,    	dnn./ 		s    	**N)rQ  Callable[[], _T]rR  zCallable[[], Any]rW   r!   rW   r   r   r!   rW   rZ   r   )r\   r]   r^   r_   r   r   rn   rG  rX  r*   r   r`   r9   r7   rO  rO  Y  sI     6I##M*7H"D1
.
r9   rO  c                  8    e Zd ZdZddZd	dZd
dZddZddZy)ThreadLocalRegistryz\A :class:`.ScopedRegistry` that uses a ``threading.local()``
    variable for storage.

    c                D    || _         t        j                         | _        y r;   )rQ  r$  localrS  )rJ   rQ  s     r7   rn   zThreadLocalRegistry.__init__  s    $!)r9   c                    	 | j                   j                  S # t        $ r& | j                         x}| j                   _        |cY S w xY wr;   )rS  rS   r   rQ  )rJ   r   s     r7   rG  zThreadLocalRegistry.__call__  sC    	==&&& 	(,(99C$--%J	s    ,AAc                .    t        | j                  d      S )NrS   )r   rS  rI   s    r7   rX  zThreadLocalRegistry.has  s    t}}g..r9   c                &    || j                   _        y r;   )rS  rS   rZ  s     r7   r*   zThreadLocalRegistry.set  s    !r9   c                <    	 | j                   `y # t        $ r Y y w xY wr;   )rS  rS   r   rI   s    r7   r   zThreadLocalRegistry.clear  s#    	# 		s    	N)rQ  r\  r]  r^  r_  r   )	r\   r]   r^   r_   rn   rG  rX  r*   r   r`   r9   r7   ra  ra    s     
*/"r9   ra  c                8    d}| D ]  }||u s|dz  }|dkD  s y y)zrGiven a sequence and search object, return True if there's more
    than one, False if zero or one of them.


    r   r   TFr`   )sequencetargetcr   s       r7   	has_dupesrl    s7     	
A 6>FA1u	
 r9   )r0   r   r1   r   rW   r   )r>   zMapping[_KT, _VT]rW   zimmutabledict[_KT, _VT]r;   )r  r   rW   r   )r  r   r   zOptional[List[Any]]rW   r   )r  r   rW   zSet[Any])r  zIterable[_T]rW   r   )Xr_   
__future__r   collections.abcabcr  r<  r$  r   r2  r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   _has_cyr   r   r   TYPE_CHECKING_py_collectionsr   r   r   r   r   r    $sqlalchemy.cyextension.immutabledict"sqlalchemy.cyextension.collectionsr!   r#   r$   r%   	frozensetr'   r   r(   r8   r?   r<   rA   ra   rb   rd   r   r   r   rM   r   sort_dictionaryr   r   r   r   r*   r  column_dictordered_column_setr   r  r  r  r  r  r  r  MutableMappingr  rE  rL  rO  ra  rl  r`   r9   r7   <module>rz     sh   & " )                         $  	?;GG9; NK
 Te3e34(%K	> '$dV,. ,5p  '4o
# 56"38, 60 e3TV Vr1
2 1*JrN  *8B< D 4S>  tCH~ ( 
 "WR[ "J&
H
h"v$$S#X. h"Vhuo 
X 
=WR[ =@., <r9   