Ë
    é#0h>H  ã                   óh  — d Z ddlZddlmZmZ ddlmZmZmZ ddlm	Z	m
Z
mZ  G d„ d«      Zd-d„Z G d	„ d
«      Z G d„ d«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Z eee«        eeeddd¬«      Zej-                  «         eeeddd¬«      Zej-                  «         eeeddd ¬«      Zej-                  «         ed!ed"d#d$¬«      Zej-                  «         ed%ed&d'd(¬«      Zej-                  «         ed)ed*d+d,¬«      Zej-                  «        y).z1Implementation of the Range type and adaptation

é    N)ÚProgrammingErrorÚInterfaceError)Ú	ISQLQuoteÚadaptÚregister_adapter)Únew_typeÚnew_array_typeÚregister_typec                   óÚ   — e Zd ZdZdZdd„Zd„ Zd„ Zed„ «       Z	ed„ «       Z
ed	„ «       Zed
„ «       Zed„ «       Zed„ «       Zed„ «       Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zy)ÚRangea…  Python representation for a PostgreSQL |range|_ type.

    :param lower: lower bound for the range. `!None` means unbound
    :param upper: upper bound for the range. `!None` means unbound
    :param bounds: one of the literal strings ``()``, ``[)``, ``(]``, ``[]``,
        representing whether the lower or upper bounds are included
    :param empty: if `!True`, the range is empty

    ©Ú_lowerÚ_upperÚ_boundsNc                 ó‚   — |s(|dvrt        d|›�«      ‚|| _        || _        || _        y d x| _        x| _        | _        y )N)ú[)z(]z()z[]zbound flags not valid: )Ú
ValueErrorr   r   r   )ÚselfÚlowerÚupperÚboundsÚemptys        úM/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/psycopg2/_range.pyÚ__init__zRange.__init__/   sK   € ÙØÐ5Ñ5Ü Ð#:¸6¸*Ð!EÓFÐFàˆDŒKØˆDŒKØ!ˆD�Là7;Ð;ˆDŒKÐ;˜$œ+¨­ó    c                 óØ   — | j                   €| j                  j                  › d�S dj                  | j                  j                  | j                  | j
                  | j                   «      S )Nz(empty=True)z{}({!r}, {!r}, {!r}))r   Ú	__class__Ú__name__Úformatr   r   ©r   s    r   Ú__repr__zRange.__repr__:   sV   € Ø�<‰<ÐØ—n‘n×-Ñ-Ð.¨lÐ;Ð;à)×0Ñ0°·±×1HÑ1HØ—‘˜TŸ[™[¨$¯,©,ó8ð 8r   c                 óÌ   — | j                   €y| j                   d   t        | j                  «      dt        | j                  «      | j                   d   g}dj	                  |«      S )Nr   r   z, é   Ú )r   Ústrr   r   Újoin)r   Úitemss     r   Ú__str__zRange.__str__A   sY   € Ø�<‰<ÐØð �L‰L˜‰OÜ�—‘ÓØÜ�—‘ÓØ�L‰L˜‰Oð
ˆð �w‰w�u‹~Ðr   c                 ó   — | j                   S )z:The lower bound of the range. `!None` if empty or unbound.)r   r    s    r   r   zRange.lowerN   ó   € ð �{‰{Ðr   c                 ó   — | j                   S )z:The upper bound of the range. `!None` if empty or unbound.)r   r    s    r   r   zRange.upperS   r*   r   c                 ó   — | j                   du S )z`!True` if the range is empty.N©r   r    s    r   ÚisemptyzRange.isemptyX   s   € ð �|‰|˜tÐ#Ð#r   c                 ó8   — | j                   €y| j                  du S )z0`!True` if the range doesn't have a lower bound.NF©r   r   r    s    r   Ú	lower_infzRange.lower_inf]   ó    € ð �<‰<ÐØØ�{‰{˜dÐ"Ð"r   c                 ó8   — | j                   €y| j                  du S )z1`!True` if the range doesn't have an upper bound.NF©r   r   r    s    r   Ú	upper_infzRange.upper_infd   r2   r   c                 óX   — | j                   �| j                  €y| j                   d   dk(  S )z4`!True` if the lower bound is included in the range.Fr   ú[r0   r    s    r   Ú	lower_inczRange.lower_inck   ó-   € ð �<‰<Ð 4§;¡;Ð#6ØØ�|‰|˜A‰ #Ñ%Ð%r   c                 óX   — | j                   �| j                  €y| j                   d   dk(  S )z4`!True` if the upper bound is included in the range.Fr#   ú]r4   r    s    r   Ú	upper_inczRange.upper_incr   r9   r   c                 ó  — | j                   €y| j                  �2| j                   d   dk(  r|| j                  k  ry|| j                  k  ry| j                  �3| j                   d   dk(  r|| j                  kD  ryy|| j                  k\  ryy)NFr   r7   r#   r;   T)r   r   r   )r   Úxs     r   Ú__contains__zRange.__contains__y   s‡   € Ø�<‰<ÐØà�;‰;Ð"Ø�|‰|˜A‰ #Ò%Ø�t—{‘{’?Ø à˜Ÿ™Ò#Ø à�;‰;Ð"Ø�|‰|˜A‰ #Ò%Ø�t—{‘{’?Ø ð
 ð ˜Ÿ™Ò#Ø àr   c                 ó   — | j                   d uS ©Nr-   r    s    r   Ú__bool__zRange.__bool__�   s   € Ø�|‰| 4Ð'Ð'r   c                 óÂ   — t        |t        «      sy| j                  |j                  k(  xr4 | j                  |j                  k(  xr | j                  |j                  k(  S )NF)Ú
isinstancer   r   r   r   ©r   Úothers     r   Ú__eq__zRange.__eq__’   sN   € Ü˜%¤Ô'ØØ—‘˜uŸ|™|Ñ+ò .Ø—‘˜uŸ|™|Ñ+ò.à—‘ §¡Ñ-ð	/r   c                 ó&   — | j                  |«       S rA   )rG   rE   s     r   Ú__ne__zRange.__ne__™   s   € Ø—;‘;˜uÓ%Ð%Ð%r   c                 óZ   — t        | j                  | j                  | j                  f«      S rA   )Úhashr   r   r   r    s    r   Ú__hash__zRange.__hash__œ   s    € Ü�T—[‘[ $§+¡+¨t¯|©|Ð<Ó=Ð=r   c                 ó–   — t        |t        «      st        S dD ].  }t        | |«      }t        ||«      }||k(  rŒ!|€ y|€ y||k  c S  y)Nr   TF)rD   r   ÚNotImplementedÚgetattr)r   rF   ÚattrÚ
self_valueÚother_values        r   Ú__lt__zRange.__lt__£   sf   € Ü˜%¤Ô'Ü!Ð!Ø3ò 
	0ˆDÜ   tÓ,ˆJÜ! %¨Ó.ˆKØ˜[Ò(ØØÐ#ÙØÐ$Ùà! KÑ/Ò/ð
	0ð r   c                 ó0   — | |k(  ry| j                  |«      S ©NT)rS   rE   s     r   Ú__le__zRange.__le__³   ó   € Ø�5Š=Øà—;‘;˜uÓ%Ð%r   c                 óP   — t        |t        «      r|j                  | «      S t        S rA   )rD   r   rS   rN   rE   s     r   Ú__gt__zRange.__gt__¹   s!   € Ü�eœUÔ#Ø—<‘< Ó%Ð%ä!Ð!r   c                 ó0   — | |k(  ry| j                  |«      S rU   )rY   rE   s     r   Ú__ge__zRange.__ge__¿   rW   r   c                 ón   — | j                   D �ci c]  }t        | |«      r|t        | |«      “Œ c}S c c}w rA   )Ú	__slots__ÚhasattrrO   )r   Úslots     r   Ú__getstate__zRange.__getstate__Å   s;   € àŸ™ö?Ø¬'°$¸Ô*=ð ”g˜d DÓ)Ñ)ò ?ð 	?ùò ?s   � 2c                 óN   — |j                  «       D ]  \  }}t        | ||«       Œ y rA   )r'   Úsetattr)r   Ústater_   Úvalues       r   Ú__setstate__zRange.__setstate__É   s'   € Ø Ÿ;™;›=ò 	'‰KˆD�%Ü�D˜$ Õ&ñ	'r   )NNr   F)r   Ú
__module__Ú__qualname__Ú__doc__r]   r   r!   r(   Úpropertyr   r   r.   r1   r5   r8   r<   r?   rB   rG   rI   rL   rS   rV   rY   r[   r`   re   © r   r   r   r   #   sà   „ ñð 0€Ió	<ò8òð ñó ðð ñó ðð ñ$ó ð$ð ñ#ó ð#ð ñ#ó ð#ð ñ&ó ð&ð ñ&ó ð&òò,(ò/ò&ò>òò &ò"ò&ò?ó'r   r   c                 óh   — t         j                  | ||«      }|j                  | xr |xs d«       |S )aé  Create and register an adapter and the typecasters to convert between
    a PostgreSQL |range|_ type and a PostgreSQL `Range` subclass.

    :param pgrange: the name of the PostgreSQL |range| type. Can be
        schema-qualified
    :param pyrange: a `Range` strict subclass, or just a name to give to a new
        class
    :param conn_or_curs: a connection or cursor used to find the oid of the
        range and its subtype; the typecaster is registered in a scope limited
        to this object, unless *globally* is set to `!True`
    :param globally: if `!False` (default) register the typecaster only on
        *conn_or_curs*, otherwise register it globally
    :return: `RangeCaster` instance responsible for the conversion

    If a string is passed to *pyrange*, a new `Range` subclass is created
    with such name and will be available as the `~RangeCaster.range` attribute
    of the returned `RangeCaster` object.

    The function queries the database on *conn_or_curs* to inspect the
    *pgrange* type and raises `~psycopg2.ProgrammingError` if the type is not
    found.  If querying the database is not advisable, use directly the
    `RangeCaster` class and register the adapter and typecasters using the
    provided functions.

    N)ÚRangeCasterÚ_from_dbÚ	_register)ÚpgrangeÚpyrangeÚconn_or_cursÚgloballyÚcasters        r   Úregister_rangert   Î   s7   € ô4 ×!Ñ! '¨7°LÓA€FØ
×Ñ˜�\Ò2 lÒ:°dÔ;Ø€Mr   c                   ó,   — e Zd ZdZdZd„ Zd„ Zd„ Zd„ Zy)ÚRangeAdapterz¢`ISQLQuote` adapter for `Range` subclasses.

    This is an abstract class: concrete classes must set a `name` class
    attribute or override `getquoted()`.
    Nc                 ó   — || _         y rA   )Úadapted)r   rx   s     r   r   zRangeAdapter.__init__õ   s	   € Øˆ�r   c                 ó,   — | j                   t        u r| S y rA   )Ú_protor   )r   Úprotos     r   Ú__conform__zRangeAdapter.__conform__ø   s   € Ø�;‰;œ)Ñ#ØˆKð $r   c                 ó   — || _         y rA   )Ú_conn)r   Úconns     r   ÚpreparezRangeAdapter.prepareü   s	   € Øˆ�
r   c                 óš  — | j                   €t        d«      ‚| j                  }|j                  rd| j                   j	                  d«      z   S |j
                  �Mt        |j
                  «      }t        |d«      r|j                  | j                  «       |j                  «       }nd}|j                  �Mt        |j                  «      }t        |d«      r|j                  | j                  «       |j                  «       }nd}| j                   j	                  d«      dz   |z   dz   |z   dz   |j                  j	                  d«      z   d	z   S )
NzMRangeAdapter must be subclassed overriding its name or the getquoted() methods	   'empty'::Úutf8r€   s   NULLó   (s   , s   , 's   '))ÚnameÚNotImplementedErrorrx   r.   Úencoder   r   r^   r€   r~   Ú	getquotedr   r   )r   ÚrÚar   r   s        r   r‡   zRangeAdapter.getquotedÿ   s  € Ø�9‰9ÐÜ%ð,ó-ð -ð �L‰LˆØ�9Š9Ø $§)¡)×"2Ñ"2°6Ó":Ñ:Ð:à�7‰7ÐÜ�a—g‘g“ˆAÜ�q˜)Ô$Ø—	‘	˜$Ÿ*™*Ô%Ø—K‘K“M‰EàˆEà�7‰7ÐÜ�a—g‘g“ˆAÜ�q˜)Ô$Ø—	‘	˜$Ÿ*™*Ô%Ø—K‘K“M‰EàˆEà�y‰y×Ñ Ó'¨$Ñ.°Ñ6¸Ñ>ÀÑFØñØ—y‘y×'Ñ'¨Ó/ñ0Ø27ñ8ð 	8r   )	r   rf   rg   rh   r„   r   r|   r€   r‡   rj   r   r   rv   rv   í   s"   „ ñð
 €Dòòòó8r   rv   c                   óœ   — e Zd ZdZd
d„Zd„ Zed„ «       Z ej                  dej                  «      Z ej                  d«      Zd
d„Zd
d	„Zy)rl   a	  Helper class to convert between `Range` and PostgreSQL range types.

    Objects of this class are usually created by `register_range()`. Manual
    creation could be useful if querying the database is not advisable: in
    this case the oids must be provided.
    Nc                 ó4  — || _         | j                  ||«       | j                  j                  xs  | j                  j                  j
                  }t        |f|| j                  «      | _        |�!t        |f|dz   | j                  «      | _
        y d | _
        y )NÚARRAY)Úsubtype_oidÚ_create_rangesÚadapterr„   r   r   r   ÚparseÚ
typecasterr	   Úarray_typecaster)r   ro   rp   Úoidr�   Ú	array_oidr„   s          r   r   zRangeCaster.__init__$  s‚   € Ø&ˆÔØ×Ñ˜G WÔ-à�|‰|× Ñ ÒC D§L¡L×$:Ñ$:×$CÑ$Cˆä" C 6¨4°·±Ó<ˆŒàÐ Ü$2Ø�˜d W™n¨d¯o©oó%?ˆDÕ!ð %)ˆDÕ!r   c                 óø  — d| _         t        |t        «      r)t        |t        fi «      | _         || j                   _        n 	 t        |t        «      r|t        ur|| _         | j                   €t        d«      ‚d| _        	 t        |t        «      rt        |t        fi «      | _        t        |t        «      r|t        ur|| _        | j                  €t        d«      ‚y# t        $ r Y Œˆw xY w# t        $ r Y Œ2w xY w)z0Create Range and RangeAdapter classes if needed.Nz:pgrange must be a string or a RangeAdapter strict subclassz1pyrange must be a type or a Range strict subclass)
r�   rD   r%   Útyperv   r„   Ú
issubclassÚ	TypeErrorÚranger   )r   ro   rp   s      r   rŽ   zRangeCaster._create_ranges2  sû   € ð ˆŒÜ�gœsÔ#Ü ¬,¨¸"Ó=ˆDŒLØ 'ˆD�L‰LÕðÜ˜g¤|Ô4Ø#¬<Ñ7Ø#*�D”Lð �<‰<ÐÜØLóNð Nð ˆŒ
ð	Ü˜'¤3Ô'Ü! '¬E¨8°RÓ8�”
Ü˜'¤5Ô)¨g¼UÑ.BØ$�”
ð �:‰:ÐÜØCóEð Eð øô! ò Ùðûô ò 	Ùð	ús%   ÁC Â AC- Ã	C*Ã)C*Ã-	C9Ã8C9c                 óú  — ddl m} ddlm}  ||«      \  }}|j                  j
                  dk  r"t        d|j                  j
                  z  «      ‚|j                  }d|v r|j                  dd«      \  }	}
n|}
d}	|j                  d	|
|	f«       |j                  «       }|sg	 d
}|j                  |k(  r|j                  d«       d}|j                  d|f«       |j                  «       }|r	|dd \  }
}		 r|j                  d«       	 ||k7  r|j                  s|j                  «        |st        d|› d�«      ‚|dd \  }}}t        |||||¬«      S # t        $ r Y Œjw xY w# r|j                  d«       w w xY w)z|Return a `RangeCaster` instance for the type *pgrange*.

        Raise `ProgrammingError` if the type is not found.
        r   )ÚSTATUS_IN_TRANSACTION)Ú_solve_conn_cursiX` z'range types not available in version %sú.r#   Úpublicz¯select rngtypid, rngsubtype, typarray
from pg_range r
join pg_type t on t.oid = rngtypid
join pg_namespace ns on ns.oid = typnamespace
where typname = %s and ns.nspname = %s;
FzSAVEPOINT register_typeTz³SELECT rngtypid, rngsubtype, typarray, typname, nspname
from pg_range r
join pg_type t on t.oid = rngtypid
join pg_namespace ns on ns.oid = typnamespace
WHERE t.oid = %s::regtype
é   Nz#ROLLBACK TO SAVEPOINT register_typezPostgreSQL range 'z' not found©r“   r�   r”   )Úpsycopg2.extensionsr›   Úpsycopg2.extrasrœ   ÚinfoÚserver_versionr   ÚstatusÚsplitÚexecuteÚfetchoneÚ
autocommitÚrollbackrl   )r   r„   rp   rq   r›   rœ   r   ÚcursÚconn_statusÚschemaÚtnameÚrecÚ	savepointr–   ÚsubtypeÚarrays                   r   rm   zRangeCaster._from_dbU  s«  € õ 	>Ý4Ù% lÓ3‰
ˆˆdà�9‰9×#Ñ# eÒ+Ü"Ð#LØ—)‘)×*Ñ*ñ$+ó ,ð ,ð —k‘kˆð �$‰;Ø ŸJ™J s¨AÓ.‰MˆF‘EàˆEØˆFð 	�‰ð ð ˆV€_ô	ð �m‰m‹oˆáðHØ!�	ð —;‘;Ð"7Ò7Ø—L‘LÐ!:Ô;Ø $�Ià—‘ð ð €Xôð —m‘m“o�ÙØ$'¨¨ G‘M�E™6áØ—L‘LÐ!FÕGð Ð/Ò/¸¿ºØ�M‰MŒOáÜ"Ø$ T F¨+Ð6ó8ð 8ð  # 2 A˜wÑˆˆg�uä˜4 Ø '°Uô<ð 	<øô) $ò Ùðûñ Ø—L‘LÐ!FÕGð ús*   Â$7E ÃE$ Å	E!ÅE$ Å E!Å!E$ Å$E:a]  
        ( \(|\[ )                   # lower bound flag
        (?:                         # lower bound:
          " ( (?: [^"] | "")* ) "   #   - a quoted string
          | ( [^",]+ )              #   - or an unquoted string
        )?                          #   - or empty (not catched)
        ,
        (?:                         # upper bound:
          " ( (?: [^"] | "")* ) "   #   - a quoted string
          | ( [^"\)\]]+ )           #   - or an unquoted string
        )?                          #   - or empty (not catched)
        ( \)|\] )                   # upper bound flag
        z	(["\\])\1c                 óv  — |€y |dk(  r| j                  d¬«      S | j                  j                  |«      }|€t        d|› d�«      ‚|j	                  d«      }|€/|j	                  d«      }|�| j
                  j                  d|«      }|j	                  d	«      }|€/|j	                  d
«      }|�| j
                  j                  d|«      }|�8|j                  | j                  |«      }|j                  | j                  |«      }|j	                  d«      |j	                  d«      z   }| j                  |||«      S )Nr   T)r   zfailed to parse range: 'ú'rŸ   é   z\1é   é   r#   é   )	r™   Ú	_re_rangeÚmatchr   ÚgroupÚ_re_undoubleÚsubÚcastr�   )r   ÚsÚcurÚmr   r   r   s          r   r�   zRangeCaster.parse²  s(  € Øˆ9Øà�Š<Ø—:‘: D�:Ó)Ð)à�N‰N× Ñ  Ó#ˆØˆ9Ü Ð#;¸A¸3¸aÐ!@ÓAÐAà—‘˜“
ˆØˆ=Ø—G‘G˜A“JˆEØÐ Ø×)Ñ)×-Ñ-¨e°UÓ;�à—‘˜“
ˆØˆ=Ø—G‘G˜A“JˆEØÐ Ø×)Ñ)×-Ñ-¨e°UÓ;�àˆ?Ø—H‘H˜T×-Ñ-¨uÓ5ˆEØ—H‘H˜T×-Ñ-¨uÓ5ˆEà—‘˜“˜aŸg™g a›jÑ(ˆà�z‰z˜% ¨Ó/Ð/r   c                 ó´   — t        | j                  |«       | j                  �t        | j                  |«       t        | j                  | j
                  «       y rA   )r
   r‘   r’   r   r™   r�   )r   Úscopes     r   rn   zRangeCaster._registerÑ  s>   € Ü�d—o‘o uÔ-Ø× Ñ Ð,Ü˜$×/Ñ/°Ô7ä˜Ÿ™ T§\¡\Õ2r   rA   )r   rf   rg   rh   r   rŽ   Úclassmethodrm   ÚreÚcompileÚVERBOSEr¹   r¼   r�   rn   rj   r   r   rl   rl     sf   „ ñó)ò!EðF ñJ<ó ðJ<ðX �—
‘
ð ð �Z‰Zó€Ið �2—:‘:˜lÓ+€Ló0ô>3r   rl   c                   ó   — e Zd ZdZy)ÚNumericRangezÄA `Range` suitable to pass Python numeric types to a PostgreSQL range.

    PostgreSQL types :sql:`int4range`, :sql:`int8range`, :sql:`numrange` are
    casted into `!NumericRange` instances.
    N©r   rf   rg   rh   rj   r   r   rÉ   rÉ   Ù  s   „ ñð
 	r   rÉ   c                   ó   — e Zd ZdZy)Ú	DateRangez#Represents :sql:`daterange` values.NrÊ   rj   r   r   rÌ   rÌ   â  ó   „ Ù-Ør   rÌ   c                   ó   — e Zd ZdZy)ÚDateTimeRangez!Represents :sql:`tsrange` values.NrÊ   rj   r   r   rÏ   rÏ   ç  s   „ Ù+Ør   rÏ   c                   ó   — e Zd ZdZy)ÚDateTimeTZRangez#Represents :sql:`tstzrange` values.NrÊ   rj   r   r   rÑ   rÑ   ì  rÍ   r   rÑ   c                   ó   — e Zd ZdZd„ Zy)ÚNumberRangeAdapterz1Adapt a range if the subtype doesn't need quotes.c                 ó¤  — | j                   }|j                  ry|j                  s3t        |j                  «      j                  «       j                  d«      }nd}|j                  s3t        |j                  «      j                  «       j                  d«      }nd}d|j                  d   › |› d|› |j                  d   › d�j                  d«      S )Ns   'empty'Úasciir$   r´   r   ú,r#   )rx   r.   r1   r   r   r‡   Údecoder5   r   r   r†   )r   rˆ   r   r   s       r   r‡   zNumberRangeAdapter.getquotedø  s©   € Ø�L‰LˆØ�9Š9Øà�{Š{ô
 ˜!Ÿ'™'“N×,Ñ,Ó.×5Ñ5°gÓ>‰EàˆEà�{Š{Ü˜!Ÿ'™'“N×,Ñ,Ó.×5Ñ5°gÓ>‰EàˆEà�A—I‘I˜a‘L�> % ¨¨%¨°·±¸1±°¸aÐ@×HÑHÈÓQÐQr   N)r   rf   rg   rh   r‡   rj   r   r   rÓ   rÓ   ö  s   „ Ù;óRr   rÓ   i@  é   iA  r    iV  é   iW  iB  i¤  iC  Ú	daterangeiH  i:  iI  ÚtsrangeiD  iZ  iE  Ú	tstzrangeiF  i   iG  )F)rh   rÅ   Úpsycopg2._psycopgr   r   r¡   r   r   r   r   r	   r
   r   rt   rv   rl   rÉ   rÌ   rÏ   rÑ   rÓ   Úint4range_casterrn   Úint8range_casterÚnumrange_casterÚdaterange_casterÚtsrange_casterÚtstzrange_casterrj   r   r   ú<module>rä      sb  ðñó6 
ç >ß BÑ Bß GÑ G÷h'ñ h'óV÷>-8ñ -8÷`y3ñ y3ôx	�5ô 	ô	�ô 	ô
	�Eô 	ô
	�eô 	ôR˜ô Rñ2 �Ð1Ô 2ñ
 Ð1°<Ø˜"¨ô.Ð à × Ñ Ô áÐ1°<Ø˜"¨ô.Ð à × Ñ Ô áÐ0°,Ø˜$¨$ô0€à × Ñ Ô á˜{¨IØ˜$¨$ô0Ð à × Ñ Ô á˜Y¨Ø˜$¨$ô0€à × Ñ Ô á˜{¨OØ˜$¨$ô0Ð à × Ñ Õ r   