§
    ÈtºfA  ã                   ó˜   — d Z ddlmZ ddlmZmZ  G d„ de¦  «        Z G d„ d¦  «        Z G d„ d	¦  «        Z	 G d
„ d¦  «        Z
d	dgZdS )zg
An asynchronous mapping to U{DB-API
2.0<http://www.python.org/topics/database/DatabaseAPI-2.0.html>}.
é    )Úthreads)ÚlogÚreflectc                   ó   — e Zd ZdZdS )ÚConnectionLostzb
    This exception means that a db connection has been lost.  Client code may
    try again.
    N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© ó    úX/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/twisted/enterprise/adbapi.pyr   r      s   € € € € € ðð ð ð r   r   c                   ó0   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ ZdS )Ú
Connectiona  
    A wrapper for a DB-API connection instance.

    The wrapper passes almost everything to the wrapped connection and so has
    the same API. However, the L{Connection} knows about its pool and also
    handle reconnecting should when the real connection dies.
    c                 óJ   — || _         d | _        |                      ¦   «          d S ©N)Ú_poolÚ_connectionÚ	reconnect)ÚselfÚpools     r   Ú__init__zConnection.__init__   s'   € ØˆŒ
ØˆÔØ�ŠÑÔÐÐÐr   c                 ó   — d S r   r   ©r   s    r   ÚclosezConnection.close$   s	   € ð 	ˆr   c                 ó6  — | j         j        s| j                             ¦   «          d S 	 | j                             ¦   «          | j                             ¦   «         }|                     | j         j        ¦  «         |                     ¦   «          | j                             ¦   «          d S # t          $ r t          j        d d¦  «         Y nw xY w| j                              | j        ¦  «         | j         j        rt          j        d¦  «         t          ¦   «         ‚)NúRollback failedzConnection lost.)r   r   r   ÚrollbackÚcursorÚexecuteÚgood_sqlr   ÚcommitÚBaseExceptionr   ÚerrÚ
disconnectÚnoisyÚmsgr   )r   Úcurss     r   r   zConnection.rollback.   s  € ØŒzÔ#ð 	ØÔ×%Ò%Ñ'Ô'Ð'ØˆFð	-ØÔ×%Ò%Ñ'Ô'Ð'ØÔ#×*Ò*Ñ,Ô,ˆDØ�LŠL˜œÔ,Ñ-Ô-Ð-Ø�JŠJ‰LŒLˆLØÔ×#Ò#Ñ%Ô%Ð%ØˆFøÝð 	-ð 	-ð 	-ÝŒG�DÐ+Ñ,Ô,Ð,Ð,Ð,ð	-øøøð 	Œ
×Ò˜dÔ.Ñ/Ô/Ð/àŒ:Ôð 	(ÝŒGÐ&Ñ'Ô'Ð'åÑÔÐs   ©A>B) Â)CÃ
Cc                 óŽ   — | j         �| j                             | j         ¦  «         | j                             ¦   «         | _         d S r   )r   r   r%   Úconnectr   s    r   r   zConnection.reconnectD   s@   € ØÔÐ'ØŒJ×!Ò! $Ô"2Ñ3Ô3Ð3Øœ:×-Ò-Ñ/Ô/ˆÔÐÐr   c                 ó,   — t          | j        |¦  «        S r   )Úgetattrr   ©r   Únames     r   Ú__getattr__zConnection.__getattr__I   s   € Ý�tÔ'¨Ñ.Ô.Ð.r   N)	r   r	   r
   r   r   r   r   r   r/   r   r   r   r   r      si   € € € € € ðð ðð ð ð
ð ð ðð ð ð,0ð 0ð 0ð
/ð /ð /ð /ð /r   r   c                   ó4   — e Zd ZdZdZd„ Zd„ Zd„ Zd„ Zd„ Z	dS )ÚTransactiona  
    A lightweight wrapper for a DB-API 'cursor' object.

    Relays attribute access to the DB cursor. That is, you can call
    C{execute()}, C{fetchall()}, etc., and they will be called on the
    underlying DB-API cursor object. Attributes will also be retrieved from
    there.
    Nc                 óJ   — || _         || _        |                      ¦   «          d S r   )r   r   Úreopen)r   r   Ú
connections      r   r   zTransaction.__init__Y   s"   € ØˆŒ
Ø%ˆÔØ�Š‰Œˆˆˆr   c                 óJ   — | j         }d | _         |                     ¦   «          d S r   )Ú_cursorr   )r   r6   s     r   r   zTransaction.close^   s!   € Ø”,ˆØˆŒØ�Š‰Œˆˆˆr   c                 ó†  — | j         �|                      ¦   «          	 | j                             ¦   «         | _         d S # t          $ r% | j        j        s‚ t          j        d d¦  «         Y nw xY w| j        j	        rt          j
        d¦  «         |                      ¦   «          | j                             ¦   «         | _         d S )NzCursor creation failedzConnection lost, reconnecting)r6   r   r   r   r#   r   r   r   r$   r&   r'   r   s    r   r3   zTransaction.reopenc   sÅ   € ØŒ<Ð#Ø�JŠJ‰LŒLˆLð	8ØÔ+×2Ò2Ñ4Ô4ˆDŒLØˆFøÝð 	8ð 	8ð 	8Ø”:Ô'ð 8Øå”˜Ð6Ñ7Ô7Ð7Ð7Ð7ð		8øøøð Œ:Ôð 	5ÝŒGÐ3Ñ4Ô4Ð4à�ŠÑÔÐØÔ'×.Ò.Ñ0Ô0ˆŒˆˆs   �= ½,A,Á+A,c                 óF   — | j                              ¦   «          d | _        d S r   )r   r   r6   r   s    r   r   zTransaction.reconnectv   s"   € ØÔ×"Ò"Ñ$Ô$Ð$ØˆŒˆˆr   c                 ó,   — t          | j        |¦  «        S r   )r,   r6   r-   s     r   r/   zTransaction.__getattr__z   s   € Ý�t”| TÑ*Ô*Ð*r   )
r   r	   r
   r   r6   r   r   r3   r   r/   r   r   r   r1   r1   M   sp   € € € € € ðð ð €Gðð ð ð
ð ð ð
1ð 1ð 1ð&ð ð ð+ð +ð +ð +ð +r   r1   c                   óÒ   — e Zd ZdZd                     ¦   «         ZdZdZdZdZ	dZ
dZdZdZeZeZdZd„ Zd	„ Zd
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z d„ Z!d„ Z"d„ Z#d„ Z$dS )ÚConnectionPoolaŠ  
    Represent a pool of connections to a DB-API 2.0 compliant database.

    @ivar connectionFactory: factory for connections, default to L{Connection}.
    @type connectionFactory: any callable.

    @ivar transactionFactory: factory for transactions, default to
        L{Transaction}.
    @type transactionFactory: any callable

    @ivar shutdownID: L{None} or a handle on the shutdown event trigger which
        will be used to stop the connection pool workers when the reactor
        stops.

    @ivar _reactor: The reactor which will be used to schedule startup and
        shutdown events.
    @type _reactor: L{IReactorCore} provider
    z-min max name noisy openfun reconnect good_sqlFé   é   Nzselect 1c                 ó  — || _         t          j        |¦  «        | _        t	          | j        dd¦  «        dk    rt          j        d¦  «         t	          | j        dd¦  «        dk     rt          j        d¦  «         |                     d	d¦  «        }|€dd
lm	} || _
        || _        || _        | j        D ]%}d|› �}||v rt          | |||         ¦  «         ||= Œ&t          | j        | j        ¦  «        | _        t!          | j        | j        ¦  «        | _        i | _        ddlm}m} |j        | _        |                     | j        | j        ¦  «        | _        | j
                             | j        ¦  «        | _        dS )aÈ  
        Create a new L{ConnectionPool}.

        Any positional or keyword arguments other than those documented here
        are passed to the DB-API object when connecting. Use these arguments to
        pass database names, usernames, passwords, etc.

        @param dbapiName: an import string to use to obtain a DB-API compatible
            module (e.g. C{'pyPgSQL.PgSQL'})

        @keyword cp_min: the minimum number of connections in pool (default 3)

        @keyword cp_max: the maximum number of connections in pool (default 5)

        @keyword cp_noisy: generate informational log messages during operation
            (default C{False})

        @keyword cp_openfun: a callback invoked after every C{connect()} on the
            underlying DB-API object. The callback is passed a new DB-API
            connection object. This callback can setup per-connection state
            such as charset, timezone, etc.

        @keyword cp_reconnect: detect connections which have failed and reconnect
            (default C{False}). Failed connections may result in
            L{ConnectionLost} exceptions, which indicate the query may need to
            be re-sent.

        @keyword cp_good_sql: an sql query which should always succeed and change
            no state (default C{'select 1'})

        @keyword cp_reactor: use this reactor instead of the global reactor
            (added in Twisted 10.2).
        @type cp_reactor: L{IReactorCore} provider
        ÚapilevelNz2.0z'DB API module not DB API 2.0 compliant.Úthreadsafetyr   é   z+DB API module not sufficiently thread-safe.Ú
cp_reactor)ÚreactorÚcp_)Ú
threadableÚ
threadpool)Ú	dbapiNamer   ÚnamedModuleÚdbapir,   r   r'   ÚpopÚtwisted.internetrC   Ú_reactorÚconnargsÚconnkwÚCP_ARGSÚsetattrÚminÚmaxÚconnectionsÚtwisted.pythonrE   rF   ÚgetThreadIDÚthreadIDÚ
ThreadPoolÚcallWhenRunningÚ_startÚstartID)	r   rG   rM   rN   rC   ÚargÚcpArgrE   rF   s	            r   r   zConnectionPool.__init__¤   s„  € ðF #ˆŒÝÔ(¨Ñ3Ô3ˆŒ
å�4”:˜z¨4Ñ0Ô0°EÒ9Ð9ÝŒGÐ=Ñ>Ô>Ð>å�4”:˜~¨qÑ1Ô1°AÒ5Ð5ÝŒGÐAÑBÔBÐBà—*’*˜\¨4Ñ0Ô0ˆØˆ?Ø0Ð0Ð0Ð0Ð0Ð0ØˆŒà ˆŒØˆŒà”<ð 	"ð 	"ˆCØ˜#�K�KˆEØ˜ˆˆÝ˜˜c 6¨%¤=Ñ1Ô1Ð1Ø˜5�Møå�t”x ¤Ñ*Ô*ˆŒÝ�t”x ¤Ñ*Ô*ˆŒð ˆÔð 	:Ð9Ð9Ð9Ð9Ð9Ð9Ð9à"Ô.ˆŒØ$×/Ò/°´¸$¼(ÑCÔCˆŒØ”}×4Ò4°T´[ÑAÔAˆŒˆˆr   c                 ó8   — d | _         |                      ¦   «         S r   )rZ   Ústartr   s    r   rY   zConnectionPool._startë   s   € ØˆŒØ�zŠz‰|Œ|Ðr   c                 ó¤   — | j         sH| j                             ¦   «          | j                             dd| j        ¦  «        | _        d| _         dS dS )z�
        Start the connection pool.

        If you are using the reactor normally, this function does *not*
        need to be called.
        ÚduringÚshutdownTN)ÚrunningrF   r^   rL   ÚaddSystemEventTriggerÚ
finalCloseÚ
shutdownIDr   s    r   r^   zConnectionPool.startï   s[   € ð Œ|ð 	 ØŒO×!Ò!Ñ#Ô#Ð#Ø"œm×AÒAØ˜* d¤oñô ˆDŒOð  ˆDŒLˆLˆLð	 ð 	 r   c                 óP   — t          j        | j        | j        | j        |g|¢R i |¤ŽS )aý  
        Execute a function with a database connection and return the result.

        @param func: A callable object of one argument which will be executed
            in a thread with a connection from the pool. It will be passed as
            its first argument a L{Connection} instance (whose interface is
            mostly identical to that of a connection object for your DB-API
            module of choice), and its results will be returned as a
            L{Deferred}. If the method raises an exception the transaction will
            be rolled back. Otherwise, the transaction will be committed.
            B{Note} that this function is B{not} run in the main thread: it
            must be threadsafe.

        @param args: positional arguments to be passed to func

        @param kw: keyword arguments to be passed to func

        @return: a L{Deferred} which will fire the return value of
            C{func(Transaction(...), *args, **kw)}, or a
            L{twisted.python.failure.Failure}.
        )r   ÚdeferToThreadPoolrL   rF   Ú_runWithConnection)r   ÚfuncÚargsÚkws       r   ÚrunWithConnectionz ConnectionPool.runWithConnectioný   sC   € õ, Ô(ØŒM˜4œ?¨DÔ,CÀTð
ØLPð
ð 
ð 
ØTVð
ð 
ð 	
r   c                 ó  — |                       | ¦  «        }	  ||g|¢R i |¤Ž}|                     ¦   «          |S # t          $ r= 	 |                     ¦   «          n%# t          $ r t	          j        d d¦  «         Y nw xY w‚ w xY w©Nr   )ÚconnectionFactoryr"   r#   r   r   r$   )r   ri   rj   rk   ÚconnÚresults         r   rh   z!ConnectionPool._runWithConnection  s±   € Ø×%Ò% dÑ+Ô+ˆð		Ø�T˜$Ð, Ð,Ð,Ð,¨Ð,Ð,ˆFØ�KŠK‰MŒMˆMØˆMøÝð 	ð 	ð 	ð1Ø—’‘”��øÝ ð 1ð 1ð 1Ý”˜Ð/Ñ0Ô0Ð0Ð0Ð0ð1øøøàð	øøøs-   —!9 ¹
B ÁAÁB ÁA;Á8B Á:A;Á;B c                 óP   — t          j        | j        | j        | j        |g|¢R i |¤ŽS )aÈ  
        Interact with the database and return the result.

        The 'interaction' is a callable object which will be executed in a
        thread using a pooled connection. It will be passed an L{Transaction}
        object as an argument (whose interface is identical to that of the
        database cursor for your DB-API module of choice), and its results will
        be returned as a L{Deferred}. If running the method raises an
        exception, the transaction will be rolled back. If the method returns a
        value, the transaction will be committed.

        NOTE that the function you pass is *not* run in the main thread: you
        may have to worry about thread-safety in the function you pass to this
        if it tries to use non-local objects.

        @param interaction: a callable object whose first argument is an
            L{adbapi.Transaction}.

        @param args: additional positional arguments to be passed to
            interaction

        @param kw: keyword arguments to be passed to interaction

        @return: a Deferred which will fire the return value of
            C{interaction(Transaction(...), *args, **kw)}, or a
            L{twisted.python.failure.Failure}.
        )r   rg   rL   rF   Ú_runInteraction)r   Úinteractionrj   rk   s       r   ÚrunInteractionzConnectionPool.runInteraction$  sJ   € õ8 Ô(ØŒMØŒOØÔ Øð	
ð
 ð
ð 
ð 
ð ð
ð 
ð 	
r   c                 ó.   —  | j         | j        g|¢R i |¤ŽS )aY  
        Execute an SQL query and return the result.

        A DB-API cursor which will be invoked with C{cursor.execute(*args,
        **kw)}. The exact nature of the arguments will depend on the specific
        flavor of DB-API being used, but the first argument in C{*args} be an
        SQL statement. The result of a subsequent C{cursor.fetchall()} will be
        fired to the L{Deferred} which is returned. If either the 'execute' or
        'fetchall' methods raise an exception, the transaction will be rolled
        back and a L{twisted.python.failure.Failure} returned.

        The C{*args} and C{**kw} arguments will be passed to the DB-API
        cursor's 'execute' method.

        @return: a L{Deferred} which will fire the return value of a DB-API
            cursor's 'fetchall' method, or a L{twisted.python.failure.Failure}.
        )ru   Ú	_runQuery©r   rj   rk   s      r   ÚrunQueryzConnectionPool.runQueryI  s)   € ð$ #ˆtÔ" 4¤>Ð?°DÐ?Ð?Ð?¸BÐ?Ð?Ð?r   c                 ó.   —  | j         | j        g|¢R i |¤ŽS )aK  
        Execute an SQL query and return L{None}.

        A DB-API cursor which will be invoked with C{cursor.execute(*args,
        **kw)}. The exact nature of the arguments will depend on the specific
        flavor of DB-API being used, but the first argument in C{*args} will be
        an SQL statement. This method will not attempt to fetch any results
        from the query and is thus suitable for C{INSERT}, C{DELETE}, and other
        SQL statements which do not return values. If the 'execute' method
        raises an exception, the transaction will be rolled back and a
        L{Failure} returned.

        The C{*args} and C{*kw} arguments will be passed to the DB-API cursor's
        'execute' method.

        @return: a L{Deferred} which will fire with L{None} or a
            L{twisted.python.failure.Failure}.
        )ru   Ú_runOperationrx   s      r   ÚrunOperationzConnectionPool.runOperation]  s*   € ð& #ˆtÔ" 4Ô#5ÐC¸ÐCÐCÐCÀÐCÐCÐCr   c                 óâ   — | j         r&| j                             | j         ¦  «         d| _         | j        r&| j                             | j        ¦  «         d| _        |                      ¦   «          dS )zC
        Close all pool connections and shutdown the pool.
        N)re   rL   ÚremoveSystemEventTriggerrZ   rd   r   s    r   r   zConnectionPool.closer  sl   € ð Œ?ð 	#ØŒM×2Ò2°4´?ÑCÔCÐCØ"ˆDŒOØŒ<ð 	 ØŒM×2Ò2°4´<Ñ@Ô@Ð@ØˆDŒLØ�ŠÑÔÐÐÐr   c                 óè   — d| _         | j                             ¦   «          d| _        | j                             ¦   «         D ]}|                      |¦  «         Œ| j                             ¦   «          dS )zE
        This should only be called by the shutdown trigger.
        NF)re   rF   Ústoprb   rS   ÚvaluesÚ_closeÚclear©r   rp   s     r   rd   zConnectionPool.finalClose~  st   € ð ˆŒØŒ×ÒÑÔÐØˆŒØÔ$×+Ò+Ñ-Ô-ð 	ð 	ˆDØ�KŠK˜ÑÔÐÐØÔ×ÒÑ Ô Ð Ð Ð r   c                 ó0  — |                       ¦   «         }| j                             |¦  «        }|€e| j        rt	          j        d| j        › �¦  «          | j        j        | j	        i | j
        ¤Ž}| j        �|                      |¦  «         || j        |<   |S )a•  
        Return a database connection when one becomes available.

        This method blocks and should be run in a thread from the internal
        threadpool. Don't call this method directly from non-threaded code.
        Using this method outside the external threadpool may exceed the
        maximum number of connections in the pool.

        @return: a database connection from the pool.
        Nzadbapi connecting: )rV   rS   Úgetr&   r   r'   rG   rI   r*   rM   rN   Úopenfun)r   Útidrp   s      r   r*   zConnectionPool.connect‰  s›   € ð �mŠm‰oŒoˆØÔ×#Ò# CÑ(Ô(ˆØˆ<ØŒzð @Ý”Ð>¨d¬nÐ>Ð>Ñ?Ô?Ð?Ø%�4”:Ô% t¤}ÐD¸¼ÐDÐDˆDØŒ|Ð'Ø—’˜TÑ"Ô"Ð"Ø$(ˆDÔ˜SÑ!Øˆr   c                 óÆ   — |                       ¦   «         }|| j                             |¦  «        urt          d¦  «        ‚|�|                      |¦  «         | j        |= dS dS )a  
        Disconnect a database connection associated with this pool.

        Note: This function should only be used by the same thread which called
        L{ConnectionPool.connect}. As with C{connect}, this function is not
        used in normal non-threaded Twisted code.
        zwrong connection for threadN)rV   rS   r†   Ú	Exceptionr‚   )r   rp   rˆ   s      r   r%   zConnectionPool.disconnect   sm   € ð �mŠm‰oŒoˆØ�tÔ'×+Ò+¨CÑ0Ô0Ð0Ð0ÝÐ9Ñ:Ô:Ð:ØÐØ�KŠK˜ÑÔÐØÔ  Ð%Ð%Ð%ð Ðr   c                 óÂ   — | j         rt          j        d| j        › �¦  «         	 |                     ¦   «          d S # t
          $ r t          j        d d¦  «         Y d S w xY w)Nzadbapi closing: zConnection close failed)r&   r   r'   rG   r   r#   r$   r„   s     r   r‚   zConnectionPool._close¯  st   € ØŒ:ð 	9ÝŒGÐ7 t¤~Ð7Ð7Ñ8Ô8Ð8ð	5Ø�JŠJ‰LŒLˆLˆLˆLøÝð 	5ð 	5ð 	5ÝŒG�DÐ3Ñ4Ô4Ð4Ð4Ð4Ð4ð	5øøøs   ¥; »AÁAc                 óZ  — |                       | ¦  «        }|                      | |¦  «        }	  ||g|¢R i |¤Ž}|                     ¦   «          |                     ¦   «          |S # t          $ r= 	 |                     ¦   «          n%# t          $ r t          j        d d¦  «         Y nw xY w‚ w xY wrn   )ro   ÚtransactionFactoryr   r"   r#   r   r   r$   )r   rt   rj   rk   rp   Útransrq   s          r   rs   zConnectionPool._runInteraction·  sÓ   € Ø×%Ò% dÑ+Ô+ˆØ×'Ò'¨¨dÑ3Ô3ˆð
	Ø �[ Ð4¨Ð4Ð4Ð4°Ð4Ð4ˆFØ�KŠK‰MŒMˆMØ�KŠK‰MŒMˆMØˆMøÝð 	ð 	ð 	ð1Ø—’‘”��øÝ ð 1ð 1ð 1Ý”˜Ð/Ñ0Ô0Ð0Ð0Ð0ð1øøøàð	øøøs/   ­5A# Á#
B*Á.BÂB*ÂB%Â"B*Â$B%Â%B*c                 óD   —  |j         |i |¤Ž |                     ¦   «         S r   )r    Úfetchall©r   rŽ   rj   rk   s       r   rw   zConnectionPool._runQueryÆ  s)   € ØˆŒ�tÐ"˜rÐ"Ð"Ð"Ø�~Š~ÑÔÐr   c                 ó    —  |j         |i |¤Ž d S r   )r    r‘   s       r   r{   zConnectionPool._runOperationÊ  s   € ØˆŒ�tÐ"˜rÐ"Ð"Ð"Ð"Ð"r   c           	      óh   — | j         | j        | j        | j        | j        | j        | j        | j        dœS )N©rG   rQ   rR   r&   r   r!   rM   rN   r”   r   s    r   Ú__getstate__zConnectionPool.__getstate__Í  s9   € àœØ”8Ø”8Ø”ZØœØœØœØ”kð	
ð 	
ð 		
r   c                 óT   — || _          | j        | j        g| j        ¢R i | j        ¤Ž d S r   )Ú__dict__r   rG   rM   rN   )r   Ústates     r   Ú__setstate__zConnectionPool.__setstate__Ù  s7   € ØˆŒØˆŒ�d”nÐD t¤}ÐDÐDÐD¸¼ÐDÐDÐDÐDÐDr   )%r   r	   r
   r   ÚsplitrO   r&   rQ   rR   r.   r‡   r   r!   rb   r   ro   r1   r�   re   r   rY   r^   rl   rh   ru   ry   r|   r   rd   r*   r%   r‚   rs   rw   r{   r•   r™   r   r   r   r;   r;   ~   s�  € € € € € ðð ð& >×CÒCÑEÔE€Gà€EØ
€CØ
€CØ€DØ€GØ€IØ€Hà€GØ"ÐØ$Ðð €JðEBð EBð EBðNð ð ð ð  ð  ð
ð 
ð 
ð4ð ð ð#
ð #
ð #
ðJ@ð @ð @ð(Dð Dð Dð*
ð 
ð 
ð	!ð 	!ð 	!ðð ð ð.&ð &ð &ð5ð 5ð 5ðð ð ð ð  ð  ð#ð #ð #ð

ð 

ð 

ðEð Eð Eð Eð Er   r;   N)r   rK   r   rT   r   r   rŠ   r   r   r1   r;   Ú__all__r   r   r   ú<module>rœ      s  ðð
ð ð %Ð $Ð $Ð $Ð $Ð $Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'ðð ð ð ð �Yñ ô ð ð4/ð 4/ð 4/ð 4/ð 4/ñ 4/ô 4/ð 4/ðn.+ð .+ð .+ð .+ð .+ñ .+ô .+ð .+ðb]Eð ]Eð ]Eð ]Eð ]Eñ ]Eô ]Eð ]Eð@ Ð*Ð
+€€€r   