
    Ki	X                     &   U d Z ddlmZmZ ddlmZ ddlmZ ddlm	Z	m
Z
 ddlmZ ddlmZ ddlmZmZ dd	lmZ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mZ ddlm Z m!Z! ddl"m#Z# ddl$m%Z%m&Z& ddl'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z- e	e.e	e.e	e.ef   f   f   Z/ee.ee.ee.ef   f   f   Z0 ei       Z1e0e2d<   de/de0fdZ3 G d de-e      Z4 G d de4e,e      Z5 G d de4e      Z6 G d de4e+e      Z7 G d d e4e*e      Z8 G d! d"e4e)e      Z9 G d# d$e4e(e      Z:y%)&zB
Base abstract class for managed key-value store implementations.
    )ABCabstractmethod)Lock)defaultdict)MappingSequence)AsyncExitStack)datetime)MappingProxyTypeTracebackType)AnySupportsFloat)DEFAULT_COLLECTION_NAME)StoreSetupError)bear_enforce)ManagedEntry)PassthroughStrategySanitizationStrategy)BasicSerializationAdapterSerializationAdapter)prepare_entry_timestamps)Selfoverride)AsyncCullProtocolAsyncDestroyCollectionProtocolAsyncDestroyStoreProtocol!AsyncEnumerateCollectionsProtocolAsyncEnumerateKeysProtocolAsyncKeyValueProtocolDEFAULT_SEED_DATAseedreturnc                     t        | j                         D ci c]<  \  }}|t        |j                         D ci c]  \  }}|t        |       c}}      > c}}}}      S c c}}w c c}}}}w )a  Convert mutable seed data to an immutable frozen structure.

    This function converts the nested mapping structure of seed data into immutable MappingProxyType
    objects at all levels. Using immutable structures prevents accidental modification of seed data
    after store initialization and ensures thread-safety.

    Args:
        seed: The mutable seed data mapping: {collection: {key: {field: value}}}.

    Returns:
        An immutable frozen version of the seed data using MappingProxyType.
    )r   items)r!   
collectionr$   keyvalues        e/home/jay/workspace/scripts/.codegraph-venv/lib/python3.12/site-packages/key_value/aio/stores/base.py_seed_to_frozen_seed_datar)   %   s      @D  @J  @J  @L  	M  	Mj{jtv{%V[VaVaVc&d
Us,<U,C'C&de	e  	M &d  	Ms   !A,A&
A,&A,c                       e Zd ZU dZeed<   eed<   eeef   ed<   eeef   ed<   e	ed<   e
ed<   e
ed<   eed	<   eed
<   dddddddde	dz  de
dz  de
dz  d
edz  dedz  deddf fdZd8dZdeddfdZdededeeef   fdZdedefdZdedefdZd8dZd8dZdeddfdZededededz  fd       Zded ee   deedz     fd!Zeedd"dededz  deee f   dz  fd#              Z!eedd"d ee   dedz  deeee f   dz     fd$              Z"eedd"dededz  deeee f   dz  e#dz  f   fd%              Z$eedd"d ee   dedz  deeeee f   dz  e#dz  f      fd&              Z%ededed'eddfd(       Z&ded ee   d)ee   d*e#dz  d+e'd,e'dz  ddfd-Z(eeddd.ded/e)ee f   dedz  d*e*dz  ddf
d0              Z+eddd.d ee   d1ee)ee f      dedz  d*e*dz  ddf
d2       Z,edededefd3       Z-d ee   dede.fd4Z/eedd"dededz  defd5              Z0eedd"d ee   dedz  de.fd6              Z1d8d7Z2 xZ3S )9	BaseStorea  An opinionated Abstract base class for managed key-value stores using ManagedEntry objects.

    This class implements all of the methods required for compliance with the KVStore protocol but
    requires subclasses to implement the _get_managed_entry, _put_managed_entry, and _delete_managed_entry methods.

    Subclasses can also override the _get_managed_entries, _put_managed_entries, and _delete_managed_entries methods if desired.

    Subclasses can implement the _setup, which will be called once before the first use of the store, and _setup_collection, which will
    be called once per collection before the first use of a collection.
    _setup_complete_setup_lock_setup_collection_locks_setup_collection_complete_serialization_adapter_key_sanitization_strategy!_collection_sanitization_strategy_seeddefault_collectionNF)serialization_adapterkey_sanitization_strategy collection_sanitization_strategyr4   r!   
stable_apir5   r6   r7   r!   r8   r"   c                   d| _         t               | _        t        t              | _        t        t
              | _        t        |xs i       | _        |xs t        | _
        |xs
 t               | _        |xs
 t               | _        |xs
 t               | _        || _        | j                   s| j#                          t$        | M          y)a  Initialize the managed key-value store.

        Args:
            serialization_adapter: The serialization adapter to use for the store.
            key_sanitization_strategy: The sanitization strategy to use for keys.
            collection_sanitization_strategy: The sanitization strategy to use for collections.
            default_collection: The default collection to use if no collection is provided.
                Defaults to "default_collection".
            seed: Optional seed data to pre-populate the store. Format: {collection: {key: {field: value, ...}}}.
                Seeding occurs once during store initialization (when the store is first entered or when the
                first operation is performed on the store).
            stable_api: Whether this store implementation has a stable API. If False, a warning will be issued.
                Defaults to False.
        F)r!   N)r,   r   r-   r   r.   boolr/   r)   r3   r   r4   r   r0   r   r1   r2   _stable_api_warn_about_stabilitysuper__init__)selfr5   r6   r7   r4   r!   r8   	__class__s          r(   r>   zBaseStore.__init__Q   s    2  %6'24'8$*5d*;'.DJB?
"4"O8O&;&Z?X?Z#*C*\GZG\'1Q1jUhUj.%&&(    c                    K   yw)z4Initialize the store (called once before first use).N r?   s    r(   _setupzBaseStore._setup           r%   c                   K   yw)zKInitialize the collection (called once before first use of the collection).NrC   r?   r%   s     r(   _setup_collectionzBaseStore._setup_collection   rF   rG   r&   c                 J    | j                  |      | j                  |      fS )Nr%   )r&   )_sanitize_collection_sanitize_keyr?   r%   r&   s      r(   _sanitize_collection_and_keyz&BaseStore._sanitize_collection_and_key   s*    ((J(?ASASX[ASA\\\rA   c                 r    | j                   j                  |       | j                   j                  |      S N)r'   )r2   validatesanitizerI   s     r(   rM   zBaseStore._sanitize_collection   s3    ..77j7I55>>Z>PPrA   c                 r    | j                   j                  |       | j                   j                  |      S rR   )r1   rS   rT   )r?   r&   s     r(   rN   zBaseStore._sanitize_key   s3    ''00s0;..77c7BBrA   c                   K   | j                   j                         D ]\  \  }}| j                  |       d{    |j                         D ]*  \  }}| j                  |t	        |      |       d{    , ^ y7 D7 w)z+Seed the store with the data from the seed.rL   N)r&   r'   r%   )r3   r$   setup_collectionputdict)r?   r%   r$   r&   r'   s        r(   _seed_storezBaseStore._seed_store   s~     !%!1!1!3 	RJ'':'>>>#kkm R
Uhh3d5kjhQQQR	R>Qs!   6BA=:B3A?4
B?Bc                   K   | j                   sj| j                  4 d{    | j                   s8	 | j                          d{    d| _         | j                          d{    ddd      d{    yy7 Z7 7# t        $ r,}t	        d| d| j
                  j                  i      |d}~ww xY w7 R7 D# 1 d{  7  sw Y   yxY ww)a	  Initialize the store if not already initialized.

        This method is called automatically before any store operations and uses a lock to ensure
        thread-safe lazy initialization. It can also be called manually to ensure the store is ready
        before performing operations. The setup process includes calling the `_setup()` hook and
        seeding the store with initial data if provided.

        This method is idempotent - calling it multiple times has no additional effect after the first call.
        Nz!Failed to setup key value store: storemessage
extra_infoT)r,   r-   rE   	Exceptionr   r@   __name__rZ   )r?   es     r(   setupzBaseStore.setup   s      ##'' - -++!"kkm++ ,0D(**,,,- - - $- ,$ !-&Gs$KY`bfbpbpbybyXz !! -- - - -s   CA:CB:A>A<A>	B:#B6$B:(C3B84C<A>>	B3'B..B33B:8C:C CCCc                  K   | j                          d{    | j                  |   sb| j                  |   4 d{    | j                  |   s*	 | j                  |       d{    d| j                  |<   ddd      d{    yy7 v7 Q7 )# t        $ r}t        d| d|i      |d}~ww xY w7 0# 1 d{  7  sw Y   yxY ww)a  Initialize a specific collection if not already initialized.

        This method is called automatically before any collection-specific operations and uses a per-collection
        lock to ensure thread-safe lazy initialization. It can also be called manually to ensure a collection
        is ready before performing operations on it. The setup process includes calling the `_setup_collection()`
        hook for store-specific collection initialization.

        This method is idempotent - calling it multiple times for the same collection has no additional effect
        after the first call.

        Args:
            collection: The name of the collection to initialize.
        NrL   zFailed to setup collection: r%   r]   T)rc   r/   r.   rJ   r`   r   )r?   r%   rb   s      r(   rW   zBaseStore.setup_collection   s      jjl..z:33J? G G66zBH"44
4KKK CGD33J?G G G ; 	G L$ H-8TUVTW6Xfrt~e  A  GH  HH	G G G Gs   CB&CBCB9B'B(B,B9;CB7CCB	B4B//B44B97C9C?C CCc                   K   yw)z<Retrieve a cache entry by key from the specified collection.NrC   rO   s      r(   _get_managed_entryzBaseStore._get_managed_entry   rF   rG   keysc                j   K   |D cg c]  }| j                  ||       d{    c}S 7 	c c}w w)zGRetrieve multiple managed entries by key from the specified collection.r%   r&   N)rf   )r?   r%   rg   r&   s       r(   _get_managed_entrieszBaseStore._get_managed_entries   s8      Z^^RUd---MMM^^M^s   3.,
.3.3rL   c                   K   |xs | j                   }| j                  |       d{    | j                  ||       d{   }|sy|j                  ryt	        |j
                        S 7 D7 +w)aj  Retrieve a value by key from the specified collection.

        Args:
            collection: The collection to retrieve the value from. If no collection is provided, it will use the default collection.
            key: The key to retrieve the value from.

        Returns:
            The value associated with the key, or None if not found or expired.
        rL   Nri   )r4   rW   rf   
is_expiredrY   r'   r?   r&   r%   managed_entrys       r(   getzBaseStore.get   su     "  :4#:#:
##z#:::373J3JV`fi3J3j-j##M''(( 	;-js!   &A1A-A1A/*A1/A1c                  K   |xs | j                   }| j                  |       d {    | j                  ||       d {   }|D cg c]'  }|r!|j                  st	        |j
                        nd ) c}S 7 R7 9c c}w w)NrL   rg   r%   )r4   rW   rj   rl   rY   r'   r?   rg   r%   entriesentrys        r(   get_manyzBaseStore.get_many   s}       :4#:#:
##z#:::11t
1SS[bcRWU53C3CU[[!Mcc 	;Scs3   &BA;BA=B,A?8B=B?Bc                   K   |xs | j                   }| j                  |       d {    | j                  ||       d {   }|r|j                  ryt	        |j
                        |j                  fS 7 O7 6w)NrL   ri   NN)r4   rW   rf   rl   rY   r'   ttlrm   s       r(   rx   zBaseStore.ttl   s|       :4#:#:
##z#:::373J3JV`fi3J3j-j 8 8](()=+<+<== 	;-js!   &A<A8A<A:5A<:A<c                $  K   |xs | j                   }| j                  |       d{    | j                  ||       d{   }|D cg c]3  }|r-|j                  s!t	        |j
                        |j                  fnd5 c}S 7 ^7 Ec c}w w)zRetrieve multiple values and TTLs by key from the specified collection.

        Returns a list of tuples of the form (value, ttl_seconds). Missing or expired
        entries are represented as (None, None).
        rL   Nrq   rw   )r4   rW   rj   rl   rY   r'   rx   rr   s        r(   ttl_manyzBaseStore.ttl_many  s       :4#:#:
##z#:::11t
1SSpwxgl%@P@Pekk"EII.Vbbxx 	;Sxs3   &BBBB	B8BB	BBrn   c                   K   yw)z9Store a managed entry by key in the specified collection.NrC   )r?   r%   r&   rn   s       r(   _put_managed_entryzBaseStore._put_managed_entry  s      	rG   managed_entriesrx   
created_at
expires_atc                t   K   t        ||d      D ]!  \  }}| j                  |||       d{    # y7 w)a  Store multiple managed entries by key in the specified collection.

        Args:
            collection: The collection to store entries in
            keys: The keys for the entries
            managed_entries: The managed entries to store
            ttl: The TTL in seconds (None for no expiration)
            created_at: The creation timestamp for all entries
            expires_at: The expiration timestamp for all entries (None if no TTL)
        T)strictr%   r&   rn   N)zipr|   )	r?   r%   rg   r}   rx   r~   r   r&   rn   s	            r(   _put_managed_entrieszBaseStore._put_managed_entries#  sP     ( #&dOD"I 	C))%+ *   	s   ,868)r%   rx   r'   c                   K   |xs | j                   }| j                  |       d{    t        |      \  }}}t        |||      }| j	                  |||       d{    y7 ?7 w)zEStore a key-value pair in the specified collection with optional TTL.rL   Nrx   r'   r~   r   r   )r4   rW   r   r   r|   )	r?   r&   r'   r%   rx   r~   _r   rn   s	            r(   rX   zBaseStore.put>  s       :4#:#:
##z#:::$<$E!
Az&2:bl&m%%!' & 
 	
 	
 	;	
s!   &A,A(9A,"A*#A,*A,valuesc                P  K   |xs | j                   }| j                  |       d{    t        |      t        |      k7  rd}t        |      dt	        |      \  }}}|D 	cg c]  }	t        |	||       }
}	| j                  |||
|||       d{    y7 tc c}	w 7 w)z;Store multiple key-value pairs in the specified collection.rL   NzGput_many called but a different number of keys and values were providedr   r   )r%   rg   r}   rx   r~   r   )r4   rW   len
ValueErrorr   r   r   )r?   rg   r   r%   rx   msgr~   ttl_secondsr   r'   r}   s              r(   put_manyzBaseStore.put_manyO  s       :4#:#:
##z#:::t9F#[CS/t+.F3.O+
K EK  /L  |A|%T^ku/v  /L  /L''!+!! ( 
 	
 	
 	; /L	
s-   &B&B=B&&B;B&B$B&B&c                   K   yw)z<Delete a managed entry by key from the specified collection.NrC   r?   r&   r%   s      r(   _delete_managed_entryzBaseStore._delete_managed_entryn        	rG   c                f   K   d}|D ]#  }| j                  ||       d{   s|dz  }% |S 7 w)EDelete multiple managed entries by key from the specified collection.r   r&   r%   N   )r   )r?   rg   r%   deleted_countr&   s        r(   _delete_managed_entriesz!BaseStore._delete_managed_entriess  sM       	#C//CJ/OOO"	#  Ps   1/1
1c                   K   |xs | j                   }| j                  |       d {    | j                  ||       d {   S 7 7 w)NrL   r   )r4   rW   r   r   s      r(   deletezBaseStore.delete~  sQ       :4#:#:
##z#::://CJ/OOO 	;O!   &AAAA
A
Ac                   K   |xs | j                   }| j                  |       d{    | j                  ||       d{   S 7 7 w)r   rL   Nrq   )r4   rW   r   )r?   rg   r%   s      r(   delete_manyzBaseStore.delete_many  sQ       :4#:#:
##z#:::11t
1SSS 	;Sr   c                 .    ddl m}  |dt        d       y)z&Warn about the stability of the store.r   )warnzdA configured store is unstable and may change in a backwards incompatible way. Use at your own risk.   )r^   category
stacklevelN)warningsr   UserWarning)r?   r   s     r(   r<   zBaseStore._warn_about_stability  s    !z 	
rA   r"   N)4ra   
__module____qualname____doc__r:   __annotations__r   r   strr   r   FROZEN_SEED_DATA_TYPESEED_DATA_TYPEr>   rE   rJ   tuplerP   rM   rN   rZ   rc   rW   r   r   rf   r   listrj   r   r   rY   r   ro   ru   floatrx   rz   r|   r
   r   r   r   rX   r   r   intr   r   r   r<   __classcell__r@   s   @r(   r+   r+   7   sU   	 (d33 +CI 6600 44';;  
 >BAEHL)-&* ,  4d:, $8$#>	,
 +?*E,  $J, t#, , 
,\CZS ZT Z]s ] ]sTWx ]Qs Qs QC C CR-0GC GD G2 Kc K KW[H[ K K_ _8C= _UYZfimZmUn _
 
 "&	)) $J	)
 
c3h$	)  )8 NR d8C= dt dW[\`adfiai\jmq\qWr d  d >B 	>S 	>t 	>uTRUWZRZ^^bMbdilpdpMpGq 	>  	> 
 "&	ysmy $J	y
 
eDcNT)54<78	9y  y"   	
 $ 
   sm	
 ",/ T\  tO 
6 X\z~ 
S 
c): 
3QU: 
cpswcw 
  DH 
  
  "&$(
sm
 c*+

 $J
 T!
 

 
< # 3 4  	Xc] 	PS 	X[ 	 AE P PC$J P$ P  P QU Thsm TC$J TZ] T  T
rA   r+   c            
       x    e Zd ZdZed	dddedz  dedz  dee   fd       Ze	dddededz  dee   fd       Z
y)
BaseEnumerateKeysStorez{An abstract base class for enumerate key-value stores.

    Subclasses must implement the _get_collection_keys method.
    Nlimitr%   r   r"   c                   K   |xs | j                   }| j                  |       d{    | j                  ||       d{   S 7 7 w)*List all keys in the specified collection.rL   N)r%   r   )r4   rW   _get_collection_keysr?   r%   r   s      r(   rg   zBaseEnumerateKeysStore.keys  sQ       :4#:#:
##z#:::..*E.RRR 	;Rr   c                   K   yw)r   NrC   r   s      r(   r   z+BaseEnumerateKeysStore._get_collection_keys  rF   rG   N)ra   r   r   r   r   r   r   r   rg   r   r   rC   rA   r(   r   r     s    
 St SS4Z S#* SX\]`Xa S S QU 9 9C$J 9Z^_bZc 9 9rA   r   c            	            e Zd ZU dZeed<   eed<   eed<   dddeded	d
f fdZddZ	d	e
fdZdee   d
z  ded
z  ded
z  d	ed
z  fdZddZd fdZ xZS )BaseContextManagerStorea  An abstract base class for context manager stores.

    Stores that accept a client parameter should pass `client_provided_by_user=True` to
    the constructor. This ensures the store does not manage the lifecycle of user-provided
    clients (i.e., does not close them).

    The base class provides an AsyncExitStack that stores can use to register cleanup
    callbacks. Stores should add their cleanup operations to the exit stack as needed.
    The base class handles entering and exiting the exit stack.
    _client_provided_by_user_exit_stack_exit_stack_enteredF)client_provided_by_userr   kwargsr"   Nc                ^    || _         t               | _        d| _        t	        |   di | y)a  Initialize the context manager store with client ownership configuration.

        Args:
            client_provided_by_user: Whether the client was provided by the user. If True,
                the store will not manage the client's lifecycle (will not close it).
                Defaults to False.
            **kwargs: Additional arguments to pass to the base store constructor.
        FNrC   )r   r	   r   r   r=   r>   )r?   r   r   r@   s      r(   r>   z BaseContextManagerStore.__init__  s1     )@%)+#( "6"rA   c                 |   K   | j                   s*| j                  j                          d{    d| _         yy7 w)z'Ensure the exit stack has been entered.NT)r   r   
__aenter__rD   s    r(   _ensure_exit_stack_enteredz2BaseContextManagerStore._ensure_exit_stack_entered  s7     ''""--///'+D$ (/   *<:<c                 v   K   | j                          d {    | j                          d {    | S 7 7 wr   )r   rc   rD   s    r(   r   z"BaseContextManagerStore.__aenter__  s5     --///jjl 	0s   959799exc_type	exc_value	tracebackc                    K   | j                   r.| j                  j                  |||       d {   }d| _         |S y 7 wNF)r   r   	__aexit__)r?   r   r   r   results        r(   r   z!BaseContextManagerStore.__aexit__  sD      ##++55h	9UUF',D$M	 Vs   -A >A c                 |   K   | j                   r*| j                  j                          d {    d| _         y y 7 wr   )r   r   acloserD   s    r(   closezBaseContextManagerStore.close  s7     ##""))+++',D$ $+r   c                 r   K   | j                          d{    t        | 	          d{    y7 7 w)zInitialize the store if not already initialized.

        This override ensures the exit stack is entered before the store's _setup()
        method is called, allowing stores to register cleanup callbacks during setup.
        N)r   r=   rc   )r?   r@   s    r(   rc   zBaseContextManagerStore.setup  s3      --///gmo 	0s   737577r   )ra   r   r   r   r:   r   r	   r   r>   r   r   r   typeBaseExceptionr   r   r   rc   r   r   s   @r(   r   r     s    	 #":? #4 #3 #SW #,$ 	]+d2	?Lt?S	`mpt`t			-	 	rA   r   c                   h    e Zd ZdZedddedz  dee   fd       Ze	dddedz  dee   fd       Z
y)BaseEnumerateCollectionsStorez~An abstract base class for enumerate collections stores.

    Subclasses must implement the _get_collection_names method.
    Nr   r   r"   c                v   K   | j                          d{    | j                  |       d{   S 7 7 w)DList all available collection names (may include empty collections).Nr   )rc   _get_collection_namesr?   r   s     r(   collectionsz)BaseEnumerateCollectionsStore.collections  s7      jjl//e/<<< 	<   959799c                   K   yw)r   NrC   r   s     r(   r   z3BaseEnumerateCollectionsStore._get_collection_names  rF   rG   )ra   r   r   r   r   r   r   r   r   r   r   rC   rA   r(   r   r     se    
 7; =#* =S	 = = AE SC$J S$s) S SrA   r   c                   <    e Zd ZdZedefd       Zedefd       Zy)BaseDestroyStorezlAn abstract base class for destroyable stores.

    Subclasses must implement the _delete_store method.
    r"   c                 r   K   | j                          d{    | j                          d{   S 7 7 w)zDestroy the store.N)rc   _delete_storerD   s    r(   destroyzBaseDestroyStore.destroy  s2      jjl''))) 	)   737577c                    K   yw)zDelete the store.NrC   rD   s    r(   r   zBaseDestroyStore._delete_store  r   rG   N)	ra   r   r   r   r   r:   r   r   r   rC   rA   r(   r   r     s=    
 *t * * T  rA   r   c                   D    e Zd ZdZededefd       Zededefd       Z	y)BaseDestroyCollectionStorezvAn abstract base class for destroyable collections.

    Subclasses must implement the _delete_collection method.
    r%   r"   c                 v   K   | j                          d{    | j                  |       d{   S 7 7 w)zDestroy the collection.NrL   )rc   _delete_collectionrI   s     r(   destroy_collectionz-BaseDestroyCollectionStore.destroy_collection   s7      jjl,,
,CCC 	Cr   c                   K   yw)zDelete the collection.NrC   rI   s     r(   r   z-BaseDestroyCollectionStore._delete_collection'  r   rG   N)
ra   r   r   r   r   r   r:   r   r   r   rC   rA   r(   r   r     sO    
 D3 D4 D D c d  rA   r   c                   4    e Zd ZdZedd       Zedd       Zy)BaseCullStorezaAn abstract base class for cullable stores.

    Subclasses must implement the _cull method.
    Nc                 r   K   | j                          d{    | j                          d{   S 7 7 wzCull the store.N)rc   _cullrD   s    r(   cullzBaseCullStore.cull3  s/      jjlZZ\!! 	!r   c                    K   ywr   rC   rD   s    r(   r   zBaseCullStore._cull:  r   rG   r   )ra   r   r   r   r   r   r   r   rC   rA   r(   r   r   -  s/    
 " "  rA   r   N);r   abcr   r   asyncio.locksr   r   r   collections.abcr   r   
contextlibr	   r
   typesr   r   typingr   r   key_value.shared.constantsr   key_value.shared.errorsr   )key_value.shared.type_checking.bear_sprayr   $key_value.shared.utils.managed_entryr   #key_value.shared.utils.sanitizationr   r   $key_value.shared.utils.serializationr   r   #key_value.shared.utils.time_to_liver   typing_extensionsr   r   !key_value.aio.protocols.key_valuer   r   r   r   r   r   r   r   r   r    r   r)   r+   r   r   r   r   r   r   rC   rA   r(   <module>r     s2   $  # - %  1 % > 3 B = Y ` H ,  gc738+<&<==>(.>sDTUXZ]U]D^?^._)_` +;B+? ( ?N 7L $`
%s `
F9Y(BC 9(Di DNSI/PRU S$y";S &,JC &I0# rA   