
    pj\                    (   U d Z ddlmZ ddlZddlZddlmZmZ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 ddlmZ ddlmZ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(m)Z)m*Z* ddl+m,Z, ddl-m.Z. ddl/m0Z0 ddl1m2Z2 ddl3m4Z4 e	rddl5m6Z6m7Z7 ddl8m9Z9  e*d          Z:ej;        j<        Z<ej;        j=        Z=ej>        j?        Z?ej>        j@        Z@ejA        jB        ZBejA        jC        ZCejA        jD        ZDejE        jF        ZFejE        jG        ZG e2jH                    ZI ejJ        d          ZK G d de          ZLdeL_M        eejN        gdf         ZOdePd <   eeLgdf         ZQdePd!<    G d" d#ee!                   ZRdS )$z
psycopg connection objects
    )annotationsN)CallableGeneric
NamedTupleTYPE_CHECKING)refReferenceType)warn)partial   )pq)errors)postgres)
generators)PQGen	PQGenConnQuery)
ComposableSQL)Xid)Row)AdaptersMap)IsolationLevel)LiteralStringSelf	TypeAliasTypeVar)connection_summary)BasePipeline)PrepareManager)capabilities)ConnectionInfo)PGconnPGresult)BasePool	CursorRowpsycopgc                  6    e Zd ZU dZded<   	 ded<   	 ded<   dS )Notifyz8An asynchronous notification received from the database.strchannelpayloadintpidN)__name__
__module____qualname____doc____annotations__     h/lsinfo/ai/hellotax_ai/data_center/backend/venv/lib/python3.11/site-packages/psycopg/_connection_base.pyr)   r)   ;   s9         BBLLLILLL3HHHEEr5   r)   r   NoticeHandlerNotifyHandlerc                     e Zd ZdZej        Zej        Zej        Zej        Zej	        Z	ej
        Z
ej        Zej        Zej        Zej        ZdidZdjdZdkd	Zedld            Zedld            Zedld            Zej        dmd            ZdmdZdndZedod            Zej        dpd            ZdpdZdqdZedrd            Zej        dsd            ZdsdZdtdZedrd            Zej        dsd            ZdsdZ dtd Z!dud"Z"edvd$            Z#edwd&            Z$edxd(            Z%dyd*Z&djd+Z'dld,Z(dzd0Z)d{d3Z*d{d4Z+e,d|d9            Z-d}d;Z.d}d<Z/e,d~d?            Z0eddA            Z1e1j        ddB            Z1eddC            Z2e2j        ddD            Z2e3	 ddFdGddJ            Z4e5fddPZ6ddSZ7djdTZ8ddUZ9ddWZ:ddXZ;ddYZ<dd^Z=ddaZ>ddbZ?ddfZ@djdgZAdhS )BaseConnectionz
    Base class for different types of connections.

    Share common functionalities such as access to the wrapped PGconn, but
    allow different interfaces (sync/async).
    pgconnr#   c                   || _         d| _        d | _        g | _        g | _        d| _        d| _        t                      | _        d | _	        t          |           }t          t          j        |          |_        t          t          j        |          |_        |  d | _        |  d | _        d | _        d | _        d| _        d S )NFr   r5   )r;   _autocommit	_adapters_notice_handlers_notify_handlers_num_transactions_closedr    	_prepared_tpcr   r   r:   _notice_handlernotice_handler_notify_handlernotify_handler	_pipeline_isolation_level
_read_only_deferrable_begin_statement)selfr;   wselfs      r6   __init__zBaseConnection.__init__b   s      .25757 "#)7)9)9-1	D		 '(F N N '(F N N 	#.2 	7;'+(, #r5   returnNonec                    t          | d          sd S | j        rd S t          | d          rd S t          d|  dt                     d S )Nr;   _poolzconnection zV was deleted while still open. Please use 'with' or '.close()' to close the connection)hasattrclosedr
   ResourceWarningrN   s    r6   __del__zBaseConnection.__del__   s|    tX&& 	F ; 	F 4!! 	FG$ G G G	
 	
 	
 	
 	
r5   r*   c                    | j         j         d| j         j         }t          | j                  }d| d| dt          |           ddS )N.< z at 0xx>)	__class__r0   r1   r   r;   id)rN   clsinfos      r6   __repr__zBaseConnection.__repr__   sX    *JJT^-HJJ!$+..232222RXX22222r5   boolc                ,    | j         j        t          k    S )z$`!True` if the connection is closed.)r;   statusBADrX   s    r6   rV   zBaseConnection.closed   s     {!S((r5   c                <    | j         j        t          k    o| j         S )z
        `!True` if the connection was interrupted.

        A broken connection is always `closed`, but wasn't closed in a clean
        way, such as using `close()` or a `!with` block.
        )r;   rg   rh   rB   rX   s    r6   brokenzBaseConnection.broken   s     {!S(=-==r5   c                    | j         S )z'The autocommit state of the connection.)r=   rX   s    r6   
autocommitzBaseConnection.autocommit   s     r5   valuec                0    |                      |           d S N)_set_autocommitrN   rm   s     r6   rl   zBaseConnection.autocommit       U#####r5   c                    t           ro   NotImplementedErrorrq   s     r6   rp   zBaseConnection._set_autocommit       !!r5   PQGen[None]c              #  h   K   |                      d          E d {V  t          |          | _        d S )Nrl   )_check_intrans_genre   r=   rq   s     r6   _set_autocommit_genz"BaseConnection._set_autocommit_gen   s@      **<888888888;;r5   IsolationLevel | Nonec                    | j         S )zX
        The isolation level of the new transactions started on the connection.
        )rJ   rX   s    r6   isolation_levelzBaseConnection.isolation_level   s    
 $$r5   c                0    |                      |           d S ro   )_set_isolation_levelrq   s     r6   r}   zBaseConnection.isolation_level   s    !!%(((((r5   c                    t           ro   rt   rq   s     r6   r   z#BaseConnection._set_isolation_level   rv   r5   c              #  ~   K   |                      d          E d {V  |t          |          nd | _        d| _        d S )Nr}   r5   )ry   r   rJ   rM   rq   s     r6   _set_isolation_level_genz'BaseConnection._set_isolation_level_gen   sV      **+<=========9>9Ju 5 5 5PT #r5   bool | Nonec                    | j         S )zX
        The read-only state of the new transactions started on the connection.
        )rK   rX   s    r6   	read_onlyzBaseConnection.read_only   s    
 r5   c                0    |                      |           d S ro   )_set_read_onlyrq   s     r6   r   zBaseConnection.read_only   s    E"""""r5   c                    t           ro   rt   rq   s     r6   r   zBaseConnection._set_read_only   rv   r5   c              #  ~   K   |                      d          E d {V  |t          |          nd | _        d| _        d S )Nr   r5   )ry   re   rK   rM   rq   s     r6   _set_read_only_genz!BaseConnection._set_read_only_gen   sP      **;777777777).):$u+++ #r5   c                    | j         S )zY
        The deferrable state of the new transactions started on the connection.
        )rL   rX   s    r6   
deferrablezBaseConnection.deferrable   s    
 r5   c                0    |                      |           d S ro   )_set_deferrablerq   s     r6   r   zBaseConnection.deferrable   rr   r5   c                    t           ro   rt   rq   s     r6   r   zBaseConnection._set_deferrable   rv   r5   c              #  ~   K   |                      d          E d {V  |t          |          nd | _        d| _        d S )Nr   r5   )ry   re   rL   rM   rq   s     r6   _set_deferrable_genz"BaseConnection._set_deferrable_gen   sQ      **<888888888*/*;4;;; #r5   	attributec              #  R  K   | j         j        }|t          k    r2| j        r+| j                                        E d {V  | j         j        }|t          k    rP| j        rt          j        d|d          t          j        d|dt          j	        |          j
                   d S )Nzcan't change z2 now: connection.transaction() context in progressz' now: connection in transaction status )r;   transaction_statusIDLErI   	_sync_genrA   eProgrammingErrorr   TransactionStatusname)rN   r   rg   s      r6   ry   z!BaseConnection._check_intrans_gen   s      /T>>dn>~//111111111[3FT>>% 
(CI C C C  
 (;I ; ;+F338; ;   >r5   r"   c                *    t          | j                  S )z>A `ConnectionInfo` attribute to inspect connection properties.)r"   r;   rX   s    r6   rc   zBaseConnection.info  s     dk***r5   r   c                Z    | j         st          t          j                  | _         | j         S ro   )r>   r   r   adaptersrX   s    r6   r   zBaseConnection.adapters  s&    ~ 	<():;;DN~r5   BaseConnection[Row]c                    | S ro   r4   rX   s    r6   
connectionzBaseConnection.connection  s	     r5   r-   c                    | j         j        S )zReturn the file descriptor of the connection.

        This function allows to use the connection as file-like object in
        functions waiting for readiness, such as the ones defined in the
        `selectors` module.
        )r;   socketrX   s    r6   filenozBaseConnection.fileno  s     {!!r5   c                    |                                  r/| j                                        }|                                 dS dS )z/Cancel the current operation on the connection.N)_should_cancelr;   
get_cancelcancel)rN   cs     r6   r   zBaseConnection.cancel"  sD       	&&((AHHJJJJJ	 	r5   c                h    | j         rdS | j        r!| j        d         rt          j        d          dS )zhCheck whether the current command should actually be cancelled when
        invoking cancel*().
        Fr   z=cancel() cannot be used with a prepared two-phase transactionT)rV   rD   r   r   rX   s    r6   r   zBaseConnection._should_cancel(  sI     ; 	59 	1 	$O   tr5   timeoutfloatPQGenConn[None]c             #     K   | j                                         }|                                 t          j        ||          E d {V  d S )Nr   )r;   cancel_connstartr   r   )rN   r   r   s      r6   _cancel_genzBaseConnection._cancel_gen7  sY      k--//$['BBBBBBBBBBBBr5   callbackr7   c                :    | j                             |           dS )z
        Register a callable to be invoked when a notice message is received.

        :param callback: the callback to call upon message received.
        :type callback: Callable[[~psycopg.errors.Diagnostic], None]
        N)r?   appendrN   r   s     r6   add_notice_handlerz!BaseConnection.add_notice_handler<  !     	$$X.....r5   c                :    | j                             |           dS )z
        Unregister a notice message callable previously registered.

        :param callback: the callback to remove.
        :type callback: Callable[[~psycopg.errors.Diagnostic], None]
        N)r?   remover   s     r6   remove_notice_handlerz$BaseConnection.remove_notice_handlerE  r   r5   rO   "ReferenceType[BaseConnection[Row]]resr$   c                     |             }|r|j         sd S t          j        ||j        j                  }|j         D ]A}	  ||           # t
          $ r&}t                              d||           Y d }~:d }~ww xY wd S )Nz)error processing notice callback '%s': %s)r?   r   
Diagnosticr;   	_encoding	Exceptionlogger	exception)rO   r   rN   diagcbexs         r6   rE   zBaseConnection._notice_handlerN  s     uww 	. 	F|C!677' 	V 	VBV4 V V V  !LbRTUUUUUUUUV	V 	Vs   A
A;A66A;r8   c                :    | j                             |           dS )z
        Register a callable to be invoked whenever a notification is received.

        :param callback: the callback to call upon notification received.
        :type callback: Callable[[~psycopg.Notify], None]
        N)r@   r   r   s     r6   add_notify_handlerz!BaseConnection.add_notify_handler]  r   r5   c                :    | j                             |           dS )z
        Unregister a notification callable previously registered.

        :param callback: the callback to remove.
        :type callback: Callable[[~psycopg.Notify], None]
        N)r@   r   r   s     r6   remove_notify_handlerz$BaseConnection.remove_notify_handlerf  r   r5   pgnpq.PGnotifyc                     |             }|r|j         sd S |j        j        }t          |j                            |          |j                            |          |j                  }|j         D ]} ||           d S ro   )r@   r;   r   r)   relnamedecodeextrabe_pid)rO   r   rN   encnr   s         r6   rG   zBaseConnection._notify_handlero  s     uww 	. 	Fk#3;%%c**CI,<,<S,A,A3:NN' 	 	BBqEEEE	 	r5   
int | Nonec                    | j         j        S )a&  
        Number of times a query is executed before it is prepared.

        - If it is set to 0, every query is prepared the first time it is
          executed.
        - If it is set to `!None`, prepared statements are disabled on the
          connection.

        Default value: 5
        rC   prepare_thresholdrX   s    r6   r   z BaseConnection.prepare_threshold|  s     ~//r5   c                    || j         _        d S ro   r   rq   s     r6   r   z BaseConnection.prepare_threshold  s    +0(((r5   c                B    | j         j        }|t          j        k    r|ndS )z
        Maximum number of prepared statements on the connection.

        `!None` means no max number of prepared statements. The default value
        is 100.
        N)rC   prepared_maxsysmaxsize)rN   rvs     r6   r   zBaseConnection.prepared_max  s$     ^(3;&&rrD0r5   c                :    |t           j        }|| j        _        d S ro   )r   r   rC   r   rq   s     r6   r   zBaseConnection.prepared_max  s    =KE&+###r5    g        r   conninfoPQGenConn[Self]c             #  X   K   t          j        ||          E d{V } | |          }|S )z?Generator to connect to the database and create a new instance.r   N)r   connect)rb   r   r   r;   conns        r6   _connect_genzBaseConnection._connect_gen  sA      
 '.xIIIIIIIIIs6{{r5   commandr   result_format	pq.FormatPQGen[PGresult | None]c              #    K   |                                   t          |t                    r |                    | j        j                  }n*t          |t                    r|                    |           }| j        r]t          | j        j
        |d|          }| j        j                            |           | j        j                            d           dS |t          k    r| j                            |           n| j        
                    |d|           t!          j        | j                  E d{V d         }|j        t&          k    r|j        t(          k    rx|j        t*          k    r t-          j        || j        j                  t-          j        dt3          j        |j                  j         d|                                          |S )z
        Generator to send a command and receive the result to the backend.

        Only used to implement internal commands such as "commit", with eventual
        arguments bound client-side. The cursor can do more complex stuff.
        N)r   encodingunexpected result z from command )_check_connection_ok
isinstancer*   encoder;   r   r   as_bytesrI   r   send_query_paramscommand_queuer   result_queueTEXT
send_queryr   executerg   
COMMAND_OK	TUPLES_OKFATAL_ERRORr   error_from_resultInterfaceErrorr   
ExecStatusr   r   )rN   r   r   cmdresults        r6   _exec_commandzBaseConnection._exec_command  s      	!!###gs## 	-nnT[%:;;GG,, 	-&&t,,G> 		-+	  C N(//444N'..t4444
 D  K""7++++K))'4})UUU'/<<<<<<<<bA=J&&6=I+E+E}++)&4;;PQQQQ&:v})E)E)J : :%,^^%5%5: :   r5   r   bytes | Nonec              #    K   |t           s&|d|z   nd}|                     |          E d{V  dS |                                  | j        rZt	          | j        j        |          }| j        j                            |           | j        j	                            d           dS | j                            |           t          j        | j                  E d{V d         }|j        t          k    rd|j        t          k    r t          j        || j        j                  t          j        dt'          j        |j                  j         d          dS )ae  
        Deallocate one, or all, prepared statement in the session.

        ``name == None`` stands for DEALLOCATE ALL.

        If possible, use protocol-level commands; otherwise use SQL statements.

        Note that PgBouncer doesn't support DEALLOCATE name, but it supports
        protocol-level Close from 1.21 and DEALLOCATE ALL from 1.22.
        Ns   DEALLOCATE s   DEALLOCATE ALLr   r   r   z0 from sending closing prepared statement message)_HAS_SEND_CLOSEr   r   rI   r   r;   send_close_preparedr   r   r   r   r   rg   r   r   r   r   r   r   r   r   r   )rN   r   stmtr   r   s        r6   _deallocatezBaseConnection._deallocate  sz      <<,0,<>D((BSD))$/////////F!!###> 	/ C N(//444N'..t444F''---'/<<<<<<<<bA=J&&}++)&4;;PQQQQ&Gv})E)E)J G G G  	 '&r5   c                    | j         j        t          k    rd S | j         j        t          k    rt	          j        d          t	          j        d| j         j                   )Nzthe connection is closedz7cannot execute operations: the connection is in status )r;   rg   OKrh   r   OperationalErrorr   rX   s    r6   r   z#BaseConnection._check_connection_ok  se    ;##F;$$$%?@@@/+,/ /
 
 	
r5   c              #     K   | j         rdS | j        j        t          k    rdS |                     |                                           E d{V  | j        r!| j                                        E d{V  dS dS )z.Generator to start a transaction if necessary.N)r=   r;   r   r   r   _get_tx_start_commandrI   r   rX   s    r6   _start_queryzBaseConnection._start_query  s       	F;)T11F%%d&@&@&B&BCCCCCCCCC> 	2~//11111111111	2 	2r5   bytesc                   | j         r| j         S dg}| j        it          | j                  }|                    d           |                    |j                            dd                                                     | j        |                    | j        rdnd           | j        |                    | j        rdnd           d		                    |          | _         | j         S )
Ns   BEGINs   ISOLATION LEVEL_r]   s	   READ ONLYs
   READ WRITEs
   DEFERRABLEs   NOT DEFERRABLE    )
rM   r}   r   r   r   replacer   r   r   join)rN   partsvals      r6   r  z$BaseConnection._get_tx_start_command  s      	)((
+ !566CLL+,,,LL))#s33::<<===>%LLJ]KKK?&LL$/P?PQQQ $		% 0 0$$r5   c              #  *  K   | j         rt          j        d          | j        rt          j        d          | j        j        t          k    rdS |                     d          E d{V  | j        r!| j        	                                E d{V  dS dS )z-Generator implementing `Connection.commit()`.zExplicit commit() forbidden within a Transaction context. (Transaction will be automatically committed on successful exit from context.)z6commit() cannot be used during a two-phase transactionNs   COMMIT)
rA   r   r   rD   r;   r   r   r   rI   r   rX   s    r6   _commit_genzBaseConnection._commit_gen2  s      ! 	$4  
 9 	$H   ;)T11F%%i000000000> 	2~//11111111111	2 	2r5   c              #    K   | j         rt          j        d          | j        rt          j        d          | j        r| j                                        E d{V  | j        j        t          k    rdS | 	                    d          E d{V  | j
                                         | j
                            |           E d{V  | j        r!| j                                        E d{V  dS dS )z/Generator implementing `Connection.rollback()`.zExplicit rollback() forbidden within a Transaction context. (Either raise Rollback() or allow an exception to propagate out of the context.)z8rollback() cannot be used during a two-phase transactionNs   ROLLBACK)rA   r   r   rD   rI   r   r;   r   r   r   rC   clearmaintain_genrX   s    r6   _rollback_genzBaseConnection._rollback_genF  s9     ! 	$A  
 9 	$J  
 > 	2~//111111111;)T11F%%k222222222>..t444444444> 	2~//11111111111	2 	2r5   	format_idgtridbqualr   c                V    |                                   t          j        |||          S )aL  
        Returns a `Xid` to pass to the `!tpc_*()` methods of this connection.

        The argument types and constraints are explained in
        :ref:`two-phase-commit`.

        The values passed to the method will be available on the returned
        object as the members `~Xid.format_id`, `~Xid.gtrid`, `~Xid.bqual`.
        )
_check_tpcr   
from_parts)rN   r  r  r  s       r6   xidzBaseConnection.xida  s(     	~i666r5   r!  	Xid | strc              #    K   |                                   t          |t                    st          j        |          }| j        j        t          k    r8t          j        dt          j
        | j        j                  j                   | j        rt          j        d          |df| _        |                     |                                           E d {V  d S )Nz8can't start two-phase transaction: connection in status z3can't use two-phase transactions in autocommit modeF)r  r   r   from_stringr;   r   r   r   r   r   r   r   r=   rD   r   r  rN   r!  s     r6   _tpc_begin_genzBaseConnection._tpc_begin_genn  s      #s## 	'/#&&C;)T11$P()GHHMP P  
  	$E   %L	%%d&@&@&B&BCCCCCCCCCCCr5   c              #    K   | j         st          j        d          | j         d         rt          j        d          | j         d         }|df| _         |                     t	          d                              t          |                              E d {V  | j        r!| j                                        E d {V  d S d S )Nz='tpc_prepare()' must be called inside a two-phase transactionr   zF'tpc_prepare()' cannot be used during a prepared two-phase transactionr   TzPREPARE TRANSACTION {})	rD   r   r   r   r   formatr*   rI   r   r%  s     r6   _tpc_prepare_genzBaseConnection._tpc_prepare_gen  s      y 	$O   9Q< 	$X   il$K	%%c*B&C&C&J&J3s88&T&TUUUUUUUUU> 	2~//11111111111	2 	2r5   actionr   Xid | str | Nonec              #    K   d|                                  d}|,| j        st          j        | d          | j        d         }nG| j        rt          j        | d          t	          |t
                    st          j        |          }| j        rL| j        d         s?t          | d|                                  d          }d | _         |            E d {V  d S |                     t          d	          
                    t          |          t          |                              E d {V  d | _        d S )
Ntpc_z()z? without xid must must be called inside a two-phase transactionr   z= with xid must must be called outside a two-phase transactionr   r  _genz{} PREPARED {})lowerrD   r   r   r   r   r$  getattrr   r   r(  r*   )rN   r*  r!  fnamemeths        r6   _tpc_finish_genzBaseConnection._tpc_finish_gen  s      *v||~~)));9 ( = = =   )A,CCy ( 7 7 7   c3'' +oc**9 		TYq\ 		4!9V\\^^!9!9!9::DDItvv))$%%,,S[[#c((CC         DIIIr5   c                    dS )z0Raise NotSupportedError if TPC is not supported.Nr4   rX   s    r6   r  zBaseConnection._check_tpc  s	     	r5   N)r;   r#   )rQ   rR   )rQ   r*   )rQ   re   )rm   re   rQ   rR   )rm   re   rQ   rw   )rQ   r{   )rm   r{   rQ   rR   )rm   r{   rQ   rw   )rQ   r   )rm   r   rQ   rR   )rm   r   rQ   rw   )r   r*   rQ   rw   )rQ   r"   )rQ   r   )rQ   r   )rQ   r-   )r   r   rQ   r   )r   r7   rQ   rR   )rO   r   r   r$   rQ   rR   )r   r8   rQ   rR   )rO   r   r   r   rQ   rR   )rQ   r   )rm   r   rQ   rR   )r   )r   r*   r   r   rQ   r   )r   r   r   r   rQ   r   )r   r  rQ   rw   )rQ   rw   )rQ   r  )r  r-   r  r*   r  r*   rQ   r   )r!  r"  rQ   rw   )r*  r   r!  r+  rQ   rw   )Br/   r0   r1   r2   r   WarningErrorr   DatabaseError	DataErrorr	  IntegrityErrorInternalErrorr   NotSupportedErrorrP   rY   rd   propertyrV   rj   rl   setterrp   rz   r}   r   r   r   r   r   r   r   r   ry   rc   r   r   r   r   r   r   r   r   staticmethodrE   r   r   rG   r   r   classmethodr   r   r   r  r   r  r  r  r  r!  r&  r)  r3  r  r4   r5   r6   r:   r:   N   s         iGGE%NOMI)%NOM)+!$ !$ !$ !$F
 
 
 
&3 3 3 3
 ) ) ) X) > > > X>       X  $ $ $ $" " " "' ' ' ' % % % X% ) ) ) )" " " "$ $ $ $
    X # # # #" " " "$ $ $ $
       X  $ $ $ $" " " "$ $ $ $
   & + + + X+    X    X" " " "      C C C C
/ / / // / / / V V V \V/ / / // / / / 
 
 
 \
 0 0 0 X0 1 1 1 1 1 1 1 X1 , , , , 58     [ :>, , , , ,\% % % %N	
 	
 	
 	

2 
2 
2 
2% % % %(2 2 2 2(2 2 2 267 7 7 7D D D D(2 2 2 2   >     r5   r:   )Sr2   
__future__r   r   loggingtypingr   r   r   r   weakrefr   r	   warningsr
   	functoolsr   r   r   r   r   r   r   abcr   r   r   sqlr   r   rD   r   rowsr   adaptr   _enumsr   _compatr   r   r   r   pq.miscr   rI   r   
_preparingr    _capabilitiesr!   _connection_infor"   pq.abcr#   r$   psycopg_pool.baser%   r&   Formatr   BINARY
ConnStatusr  rh   r   r   r   r   r   r   INTRANShas_send_close_preparedr  	getLoggerr   r)   r0   r   r7   r3   r8   r:   r4   r5   r6   <module>rX     sW     # " " " " " 



  ? ? ? ? ? ? ? ? ? ? ? ? & & & & & & & &                                     ( ( ( ( ( ( ( ( ( (                                   " " " " " " < < < < < < < < < < < < ' ' ' ' ' ' # # # # # # & & & & & & ' ' ' ' ' ' , , , , , , +((((((((****** GK  		y~		]m]%
M#	m'	 


&6,688		9	%	%
F 
F 
F 
F 
FZ 
F 
F 
F  #Q\ND$89 9 9 9 9#VHdN3 3 3 3 3e	 e	 e	 e	 e	WS\ e	 e	 e	 e	 e	r5   