
    hZ'f_N                       U d 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 ddlmZ ej@                  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- e.       Z/d)e0d*<    e.dg      Z1d)e0d+<   dWd,Z2dXd-Z3 e"       Z4d.e0d/<    G d0 d1e%e+e,f         Z5 ed2e#      Z6 ed3e#      Z7 G d4 d5ee*         Z8 G d6 d7e8e*         Z9 G d8 d9e$e8e*         Z:dYd:Z;e<Z=e;Z> G d; d<ee*         Z? G d= d>e#      Z@ G d? d@e
e+e,f         ZA G dA dBe
e+e,f         ZBeCZDe<ZEe&ZF G dC dDee*         ZGdZdEZHdYd[dFZIdG ZJdH ZKd\dIZLdYdJZMd]dKZN G dL dMej                  e+e,f         ZP G dN dOee-         ZQ G dP dQe      ZR G dR dSee*         ZS G dT dUeSe*         ZTdV ZUy)^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)is_non_string_iterable)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          k/var/www/html/tulostaulu.pesapallolive.fi/venv/lib/python3.12/site-packages/sqlalchemy/util/_collections.pymerge_lists_w_orderingr9   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    r8   coerce_to_immutabledictr@      s%    	A}	%Qr:   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      r8   rD   zFacadeDict.__new__   s    '',
r:   c                    t        d      )Nz\an immutabledict shouldn't need to be copied.  use dict(d) if you need a mutable dictionary.)NotImplementedErrorselfs    r8   copyzFacadeDict.copy   s    !0
 	
r:   c                &    t         t        |       ffS r<   )rB   dictrJ   s    r8   
__reduce__zFacadeDict.__reduce__   s    DJ=((r:   c                2    t         j                  | ||       y)z,insert an item into the dictionary directly.N)rN   __setitem__rK   keyvalues      r8   _insert_itemzFacadeDict._insert_item   s    sE*r:   c                2    dt         j                  |       z  S )NzFacadeDict(%s))rN   __repr__rJ   s    r8   rW   zFacadeDict.__repr__   s    $--"555r:   N)rF   r   returnzFacadeDict[Any, Any])rX   r   rX   r   rS   r$   rT   r%   rX   None)rX   str)	__name__
__module____qualname____doc__rD   rL   rO   rU   rW    r:   r8   rB   rB      s    4
)+6r:   rB   _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]rg   c                2    t         j                  | d|       y Nrg   object__setattr__)rK   datas     r8   __init__zProperties.__init__   s    4$/r:   c                ,    t        | j                        S r<   lenrg   rJ   s    r8   __len__zProperties.__len__       4::r:   c                Z    t        t        | j                  j                                     S r<   )r-   listrg   valuesrJ   s    r8   __iter__zProperties.__iter__   s    D**,-..r:   c                    t        t                     | j                  j                         D cg c]  }t	        |       c}z   S c c}w r<   )dirsuperrg   keysr\   )rK   k	__class__s     r8   __dir__zProperties.__dir__   s1    57|tzz/@A!s1vAAAAs   Ac                0    t        |       t        |      z   S r<   )rv   )rK   r6   s     r8   __add__zProperties.__add__   s    DzDK''r:   c                "    || j                   |<   y r<   rf   rK   rS   objs      r8   rQ   zProperties.__setitem__       

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

% r:   c                     y r<   ra   r   s     r8   getzProperties.get   s    -0r:   c                     y r<   ra   rK   rS   defaults      r8   r   zProperties.get       HKr:   c                    || v r| |   S |S r<   ra   r   s      r8   r   zProperties.get   s     $;9Nr:   c                ,    t        | j                        S r<   )rv   rg   rJ   s    r8   r|   zProperties.keys       DJJr:   c                H    t        | j                  j                               S r<   )rv   rg   rw   rJ   s    r8   rw   zProperties.values   s    DJJ%%'((r:   c                H    t        | j                  j                               S r<   )rv   rg   itemsrJ   s    r8   r   zProperties.items   s    DJJ$$&''r:   c                    || j                   v S r<   rf   r   s     r8   has_keyzProperties.has_key   r   r:   c                8    | j                   j                          y r<   )rg   clearrJ   s    r8   r   zProperties.clear   s    

r:   )rn   rh   rX   intrX   Iterator[_T])rX   z	List[str])r6   zProperties[_F]rX   zList[Union[_T, _F]])rS   r\   r   r"   rX   r[   )rS   r\   rX   r"   )rS   r\   rX   r[   )rX   Dict[str, Any])r   r   rX   r[   )rS   r\   rX   bool)rX   zReadOnlyProperties[_T])rT   rh   rX   r[   )rS   r\   rX   zOptional[_T])rS   r\   r   Union[_DT, _T]rX   r   r<   )rS   r\   r   zOptional[Union[_DT, _T]]rX   zOptional[Union[_T, _DT]])rX   List[_T])rX   zList[Tuple[str, _T]]rX   r[   )r]   r^   r_   r`   	__slots____annotations__ro   rs   rx   r   r   rQ   r   r   rm   r   r   r   r   r   r   r   r   r|   rw   r   r   r   __classcell__)r~   s   @r8   re   re      s    BI0/B(%:&!.
! 0 0K K =A!9	! )(!r:   re   c                      e Zd ZdZdZd Zy)OrderedPropertieszUProvide a __getattr__/__setattr__ interface with an OrderedDict
    as backing store.ra   c                @    t         j                  | t                      y r<   )re   ro   OrderedDictrJ   s    r8   ro   zOrderedProperties.__init__	  s    D+-0r:   N)r]   r^   r_   r`   r   ro   ra   r:   r8   r   r     s     I1r:   r   c                      e Zd ZdZdZy)r   zDProvide immutable dict/object attribute to an underlying dictionary.ra   N)r]   r^   r_   r`   r   ra   r:   r8   r   r     s
    NIr:   r   c                    t        | |      D cg c]	  }|| |   f }}| j                          | j                  |       yc c}w )zSort an OrderedDict in-place.)rS   N)sortedr   r   )r?   rS   r}   r   s       r8   _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selfrefrK   s      r8   _removez&WeakSequence.__init__.<locals>._remove%  s&    9D$$T*  r:   )weakrefrefr   r   )rK   _WeakSequence__elementsr   r7   s       r8   ro   zWeakSequence.__init__"  sE     #*++d"3 	+
 9C
.5GKK)
 
s   A
c                v    | j                   j                  t        j                  || j                               y r<   )r   r/   r   r   r   )rK   r   s     r8   r/   zWeakSequence.append/  s#    W[[t||<=r:   c                ,    t        | j                        S r<   )rr   r   rJ   s    r8   rs   zWeakSequence.__len__2  s    4==!!r:   c                6    d d | j                   D        D        S )Nc              3  &   K   | ]	  }||  y wr<   ra   ).0r   s     r8   	<genexpr>z(WeakSequence.__iter__.<locals>.<genexpr>6  s      
sC
s   c              3  *   K   | ]  } |         y wr<   ra   )r   r   s     r8   r   z(WeakSequence.__iter__.<locals>.<genexpr>7  s     ;cCE;s   )r   rJ   s    r8   rx   zWeakSequence.__iter__5  s    
;T]];
 	
r:   c                f    	 | j                   |   } |       S # t        $ r t        d|z        w xY w)NzIndex %s out of range)r   r   
IndexError)rK   indexr   s      r8   r   zWeakSequence.__getitem__:  s@    	--&C 5L  	>4u<==	>s    0N)ra   )r   zSequence[_T])r]   r^   r_   ro   r/   rs   rx   r   ra   r:   r8   r   r   !  s    
>"

r:   r   c                      e Zd ZdddZy)OrderedIdentitySetNc                    t        j                  |        t               | _        |r|D ]  }| j	                  |        y y r<   )r   ro   r   _membersadd)rK   iterableos      r8   ro   zOrderedIdentitySet.__init__D  s;    T"#  r:   r<   )r   zOptional[Iterable[Any]])r]   r^   r_   ro   ra   r:   r8   r   r   C  s    r:   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)rK   r   s     r8   ro   zPopulateDict.__init__T  s	    r:   c                2    | j                  |      x| |<   }|S r<   r   rK   rS   vals      r8   __missing__zPopulateDict.__missing__W  s    ,,s++S	C
r:   N)r   zCallable[[_KT], _VT]rS   r   rX   r   r]   r^   r_   r`   ro   r   ra   r:   r8   r   r   L  s    r:   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)rK   creator_methodr   s      r8   ro   zWeakPopulateDict.__init__b  s*    %..!**H-r:   c                P    | j                  | j                         |      x| |<   }|S r<   )r   r   r   s      r8   r   zWeakPopulateDict.__missing__g  s&    ,,t}}<<S	C
r:   N)r   ztypes.MethodTyper   r   ra   r:   r8   r   r   \  s    
.
r:   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 (``==``).
    )rn   _data_appender_unique&Union[Iterable[_T], Set[_T], List[_T]]rn   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])rn   r   getattrr   hasattrr   r/   r   )rK   rn   vias      r8   ro   zUniqueAppender.__init__  sg    
 	")$"4DT8$"&z4"8"?"?DT5!"&y$"7";";D "r:   c                x    t        |      }|| j                  vr!| j                  |       d| j                  |<   y y )NT)idr   r   )rK   r   id_s      r8   r/   zUniqueAppender.append  s8    hdll"% $DLL #r:   c                ,    t        | j                        S r<   )r-   rn   rJ   s    r8   rx   zUniqueAppender.__iter__  s    DIIr:   r<   )rn   r   r   zOptional[str])r   r"   rX   r[   r   )	r]   r^   r_   r`   r   r   ro   r/   rx   ra   r:   r8   r   r   u  sF     4I
00((%%
 "<4< <%r:   r   c                    t        |       dk(  r+t        | d   t        j                        rt	        | d         S t        d|       S )Nr   r   	List[Any])rr   r>   typesGeneratorTyperv   r   )args    r8   coerce_generator_argr    s;    
3x1}CFE,?,?@CF|K%%r:   c                `    | |S t        |       s| gS t        | t              r| S t        |       S r<   )r   r>   rv   )xr   s     r8   to_listr    s3    y!!$s
	At	Awr:   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      r8   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    r8   to_setr    s+    yua71:r:   c                f    | 
t               S t        | t               st        t        |             S | S r<   )
column_setr>   r  r  s    r8   to_column_setr    s-    y|a$'!*%%r:   c                p    | j                         } |r| j                  |        | j                  di | | S )z5Copy the given dict and update with the given values.ra   )rL   r   )r?   _newkws      r8   update_copyr    s1     	
A	AHHNrNHr:   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.

    rx   N)r>   r\   r   flatten_iterator)r  elems     r8   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_alertrg   _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   rg   )rK   r  r  r  s       r8   ro   zLRUCache.__init__  s5     !"$nn&<>
r:   c                D    | xj                   dz  c_         | j                   S Nr   )r  rJ   s    r8   _inc_counterzLRUCache._inc_counter  s    }}r:   c                     y r<   ra   r   s     r8   r   zLRUCache.get  s    .1r:   c                     y r<   ra   r   s      r8   r   zLRUCache.get  r   r:   c                v    | j                   j                  |      }|| j                         |d   d<   |d   S |S N   r   r   )rg   r   r'  )rK   rS   r   r   s       r8   r   zLRUCache.get  s@     zz~~c"**,DGAJ7NNr:   c                V    | j                   |   }| j                         |d   d<   |d   S r+  )rg   r'  )rK   rS   r   s      r8   r   zLRUCache.__getitem__  s.    zz#&&(Q
Awr:   c                ,    t        | j                        S r<   )r-   rg   rJ   s    r8   rx   zLRUCache.__iter__  r   r:   c                ,    t        | j                        S r<   rq   rJ   s    r8   rs   zLRUCache.__len__   rt   r:   c           	         t        j                  | j                  j                         D ci c]  \  }}||d    c}}      S c c}}w r&  )typingr   rg   r   )rK   r}   r  s      r8   rw   zLRUCache.values#  s:      djj6F6F6H!Ida!QqT'!IJJ!Is   A
c                f    ||| j                         gf| j                  |<   | j                          y r<   )r'  rg   _manage_sizerR   s      r8   rQ   zLRUCache.__setitem__&  s.    (9(9(;'<=

3r:   c                    | j                   |= y r<   rf   )rK   _LRUCache__vs     r8   r   zLRUCache.__delitem__*  r   r:   c                N    | j                   | j                   | j                  z  z   S r<   )r  r  rJ   s    r8   size_thresholdzLRUCache.size_threshold-  s    }}t}}t~~===r:   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)rS   reverser   )r   acquirer   r  rr   r  r  r   rg   rw   operator
itemgetterr   release)rK   r  
by_counterr   s       r8   r3  zLRUCache._manage_size1  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]])rS   r$   rX   zOptional[_VT])rS   r$   r   Union[_VT, _T]rX   r@  r<   )rS   r$   r   Optional[Union[_VT, _T]]rX   rA  )rS   r$   rX   r%   )rX   zIterator[_KT]r   )rX   zValuesView[_VT]rZ   )r5  r$   rX   r[   )rX   r!  r   )r]   r^   r_   r`   r   r   ro   r'  r   r   r   rx   rs   rw   rQ   r   propertyr7  r3  ra   r:   r8   r  r    s    I M>> 48	?? ? 2	? 1 1K K =A!9	!
 K > >"r:   r  c                      e Zd ZddZy)_CreateFuncTypec                     y r<   ra   rJ   s    r8   __call__z_CreateFuncType.__call__J      r:   N)rX   r&   r]   r^   r_   rF  ra   r:   r8   rD  rD  I  s    $r:   rD  c                      e Zd ZddZy)_ScopeFuncTypec                     y r<   ra   rJ   s    r8   rF  z_ScopeFuncType.__call__N  rG  r:   NrY   rH  ra   r:   r8   rJ  rJ  M  s    "r:   rJ  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]rO  rJ  rP  r   rQ  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).

        NrN  )rK   rO  rP  s      r8   ro   zScopedRegistry.__init__f  s     %"r:   c                    | j                         }	 | j                  |   S # t        $ r- | j                  j                  || j	                               cY S w xY wr<   )rP  rQ  r   
setdefaultrO  r   s     r8   rF  zScopedRegistry.__call__w  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.)rP  rQ  rJ   s    r8   haszScopedRegistry.has~  s     ~~4==00r:   c                >    || j                   | j                         <   y)z$Set the value for the current scope.N)rQ  rP  rK   r   s     r8   r+   zScopedRegistry.set  s     +.dnn&'r:   c                Z    	 | j                   | j                         = y# t        $ r Y yw xY w)z Clear the current scope, if any.N)rQ  rP  r   rJ   s    r8   r   zScopedRegistry.clear  s,    	dnn./ 		s    	**N)rO  Callable[[], _T]rP  zCallable[[], Any]rX   r"   rX   r   r   r"   rX   r[   r   )r]   r^   r_   r`   r   r   ro   rF  rV  r+   r   ra   r:   r8   rM  rM  Q  sI     6I##M*7H"D1
.
r:   rM  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<   )rO  r#  localrQ  )rK   rO  s     r8   ro   zThreadLocalRegistry.__init__  s    $!)r:   c                    	 | j                   j                  S # t        $ r& | j                         x}| j                   _        |cY S w xY wr<   )rQ  rT   r   rO  )rK   r   s     r8   rF  zThreadLocalRegistry.__call__  sC    	==&&& 	(,(99C$--%J	s    ,AAc                .    t        | j                  d      S )NrT   )r   rQ  rJ   s    r8   rV  zThreadLocalRegistry.has  s    t}}g..r:   c                &    || j                   _        y r<   )rQ  rT   rX  s     r8   r+   zThreadLocalRegistry.set  s    !r:   c                <    	 | j                   `y # t        $ r Y y w xY wr<   )rQ  rT   r   rJ   s    r8   r   zThreadLocalRegistry.clear  s#    	# 		s    	N)rO  rZ  r[  r\  r]  r   )	r]   r^   r_   r`   ro   rF  rV  r+   r   ra   r:   r8   r_  r_    s     
*/"r:   r_  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   TFra   )sequencetargetcr   s       r8   	has_dupesrj    s7     	
A 6>FA1u	
 r:   )r1   r   r2   r   rX   r   )r?   zMapping[_KT, _VT]rX   zimmutabledict[_KT, _VT]r<   )r  r   rX   r   )r  r   r   zOptional[List[Any]]rX   r   )r  r   rX   zSet[Any])r  zIterable[_T]rX   r   )Vr`   
__future__r   r;  r#  r  r1  r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   _has_cyr   r   r   r   TYPE_CHECKING_py_collectionsr   r   r   r   r    r!   $sqlalchemy.cyextension.immutabledict"sqlalchemy.cyextension.collectionsr"   r$   r%   r&   	frozensetr(   r   r)   r9   r@   r=   rB   rb   rc   re   r   r   r   rN   r   sort_dictionaryr   r   r   r   r+   r  column_dictordered_column_setr   r  r  r  r  r  r  r  MutableMappingr  rD  rJ  rM  r_  rj  ra   r:   r8   <module>rv     sh   & "                         $ *  	?;GG9; NK
 Te3e34(%K	> '$dV,. ,5p  '4o
# 56"38, 60 e3TT Tn1
2 1*JrN  *8B< D 4S>  tCH~ ( 
 "WR[ "J&H
f"v$$S#X. f"R%huo %#X #=WR[ =@., <r:   