
    hl;                     ~   d Z ddlZddlZddlZddlT 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  ej                     n# e$ r Y nw xY w	 ddlmZ n# e$ r d ZY nw xY w	 ddlmZ n	#  dZY nxY w ej        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$ 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) G d# d$e*          Z+ G d% d&e+e,          Z- G d' d(e          Z. G d) d*e/          Z0 G d+ d,e+e,          Z1 G d- d.e,          Z2d/ Z3 G d0 d1e+e2          Z4 G d2 d3e+e5          Z6d@d4Z7 G d5 d6e,          Z8 G d7 d8e*          Z9 G d9 d:e          Z:dAd;Z; G d< d=e*          Z< G d> d?e=          Z>dS )Bzr
Collection of postgres-specific extensions, currently including:

* Support for hstore, a key/value type storage
    N)*)
ColumnBase)
Expression)Node)NodeList)__deprecated__)__exception_wrapper__)compat)register_hstorec                     d S N )cgloballys     T/var/www/html/marketdash/venv/lib/python3.11/site-packages/playhouse/postgres_ext.pyr   r      s        )Jsonpeeweez@>z?&?z?|->z||z<@z&&z@@-c                   *     e Zd Z fdZd Zd Z xZS )_LookupNodec                 r    || _         || _        t          t          |                                            d S r   )nodepartssuperr   __init__)selfr   r   	__class__s      r   r   z_LookupNode.__init__:   s3    	
k4  ))+++++r   c                 b     t          |           | j        t          | j                            S r   )typer   listr   r   s    r   clonez_LookupNode.clone?   s&    tDzz$)T$*%5%5666r   c                 R    t          | j        j        t          |           f          S r   )hashr    __name__idr$   s    r   __hash__z_LookupNode.__hash__B   s     T^,bhh7888r   )r(   
__module____qualname__r   r%   r*   __classcell__r    s   @r   r   r   9   sV        , , , , ,
7 7 79 9 9 9 9 9 9r   r   c                   l     e Zd Zd fd	Zd Zej        dd            Zd Zd Z	d Z
d	 Zd
 Zd Z xZS )_JsonLookupBaseFc                 h    t          t          |                               ||           || _        d S r   )r   r0   r   _as_json)r   r   r   as_jsonr    s       r   r   z_JsonLookupBase.__init__G   s.    ot$$--dE:::r   c                 n     t          |           | j        t          | j                  | j                  S r   )r"   r   r#   r   r2   r$   s    r   r%   z_JsonLookupBase.cloneK   s*    tDzz$)T$*%5%5t}EEEr   Tc                     || _         d S r   )r2   )r   r3   s     r   r3   z_JsonLookupBase.as_jsonN   s    r   c                     t          |t                    st          |          }t          |                     d          t
          j        |          S NT)
isinstancer   r   r   r3   OPCONCAT)r   rhss     r   concatz_JsonLookupBase.concatR   s?    #t$$ 	s))C$,,t,,bi===r   c                 n    t          |                     d          t          t          |                    S r7   )r   r3   JSONB_CONTAINSr   r   others     r   containsz_JsonLookupBase.containsW   s&    $,,t,,nd5kkJJJr   c                 n    t          |                     d          t          t          |                    S r7   )r   r3   JSONB_CONTAINED_BYr   r?   s     r   contained_byz_JsonLookupBase.contained_byZ   s'    $,,t,,.@$u++NNNr   c           	          t          |                     d          t          t          t	          |          d                    S NTFunpack)r   r3   JSONB_CONTAINS_ANY_KEYValuer#   r   keyss     r   contains_anyz_JsonLookupBase.contains_any]   s<    LL"$t**U+++- - 	-r   c           	          t          |                     d          t          t          t	          |          d                    S rF   )r   r3   JSONB_CONTAINS_ALL_KEYSrJ   r#   rK   s     r   contains_allz_JsonLookupBase.contains_allc   s<    LL#$t**U+++- - 	-r   c                 T    t          |                     d          t          |          S r7   )r   r3   JSONB_CONTAINS_KEYr   keys     r   has_keyz_JsonLookupBase.has_keyi   s!    $,,t,,.@#FFFr   )FT)r(   r+   r,   r   r%   r   copyr3   r<   rA   rD   rM   rP   rU   r-   r.   s   @r   r0   r0   F   s                   F F F 
Y      Y > > >
K K KO O O- - -- - -G G G G G G Gr   r0   c                       e Zd Zd Zd ZdS )
JsonLookupc                 J    t          | j        | j        |gz   | j                  S r   )rY   r   r   r2   r   values     r   __getitem__zJsonLookup.__getitem__n   s!    $)TZ5'%94=IIIr   c                 4   |                     | j                   | j        d d         D ]*}|                    d                               |           +| j        r<|                    | j        rdnd                               | j        d                    |S )Nr   z->>)sqlr   r   literalr2   )r   ctxparts      r   __sql__zJsonLookup.__sql__q   s    	JssO 	( 	(DKK!!$'''': 	#gdm6dd77c$*R.!!!
r   N)r(   r+   r,   r]   rd   r   r   r   rY   rY   m   s5        J J J	 	 	 	 	r   rY   c                       e Zd Zd ZdS )JsonPathc                 
   |                     | j                                      | j        rdnd                               t	          dd                    t          t          | j                            z                      S )Nz#>z#>>z{%s},)	r`   r   ra   r2   rJ   joinmapstrr   r   rb   s     r   rd   zJsonPath.__sql__~   sb    TY9E::U6CHHSdj-A-A$B$BBCCDD	Fr   N)r(   r+   r,   rd   r   r   r   rf   rf   }   s(        F F F F Fr   rf   c                   0    e Zd Zed             Zd Zd ZdS )ObjectSlicec                 
   t          |t                    r|j        pd|j        pdg}nPt          |t                    r|g}n7t          |t
                    r|}nd |                    d          D             } | ||          S )Nr   c                 ,    g | ]}t          |          S r   )int).0is     r   
<listcomp>z&ObjectSlice.create.<locals>.<listcomp>   s    666SVV666r   :)r8   slicestartstoprq   r   split)clsr   r\   r   s       r   createzObjectSlice.create   s    eU## 	7[%AuzQ7EEs## 	7GEEt$$ 	7EE 76U[[%5%5666Es4r   c                 d   |                     | j                   t          | j        t                    rA|                    d                               | j                                      d           n:|                    dd                    d | j        D                       z             |S )N[]z[%s]ru   c              3   :   K   | ]}t          |d z             V  dS )   N)rk   )rr   ps     r   	<genexpr>z&ObjectSlice.__sql__.<locals>.<genexpr>   s,      )I)I#a!e**)I)I)I)I)I)Ir   )r`   r   r8   r   r   ra   ri   rl   s     r   rd   zObjectSlice.__sql__   s    	dj$'' 	KKK  ,,44S9999KK)I)Idj)I)I)I!I!IIJJJ
r   c                 8    t                               | |          S r   rn   r{   r[   s     r   r]   zObjectSlice.__getitem__       !!$...r   N)r(   r+   r,   classmethodr{   rd   r]   r   r   r   rn   rn      sK        
  
  [
   / / / / /r   rn   c                   "     e Zd ZdZ fdZ xZS )IndexedFieldMixinGINc                 t    |                     dd            t          t          |           j        |i | d S )NindexT)
setdefaultr   r   r   r   argskwargsr    s      r   r   zIndexedFieldMixin.__init__   sB    '4(((/&&/@@@@@@r   )r(   r+   r,   default_index_typer   r-   r.   s   @r   r   r      sG        A A A A A A A A Ar   r   c                   <    e Zd ZdZedddf fd	Zd fd	Zd Zd Zd	 Z	d
 Z
d Zd Z eej                  Z eej                  Z eej                  Z eej                  Z eej                  Z eej                  Zej        Zd Zd Zd Z xZS )
ArrayFieldTNr   Fc                      |di |pi | _         || _        || _        | j         j        | _         t	          t
          |           j        |i | d S )Nr   )_ArrayField__field
dimensionsconvert_values
field_typer   r   r   )r   field_classfield_kwargsr   r   r   r   r    s          r   r   zArrayField.__init__   sb    "{::l&8b::$,,1(j$($9&99999r   c                     t          t          |                               |||          }| j                            |d|z  d           |S )Nz
__array_%sF)r   r   bindr   )r   modelnameset_attributeretr    s        r   r   zArrayField.bind   sH    J%%**5$FF%!4e<<<
r   c                     | j                             |          }t          |t          d| j        z            fd          S )Nz[] glue)r   ddl_datatyper   SQLr   )r   rb   	data_types      r   r   zArrayField.ddl_datatype   s>    L--c22	Ct(>$?$?@rJJJJr   c                     |t          |t                    r|S | j        r&|                     | j        j        || j                  S t          |t                    r|nt          |          S r   )r8   r   r   _processr   db_valuer   r#   r[   s     r   r   zArrayField.db_value   sb    =Jud33=L  	E==!6tOOO&ud33D55eDr   c                     | j         rJ|H| j        j        }t          |t                    r|                     ||| j                  S  ||          S |S r   )r   r   python_valuer8   r#   r   r   )r   r\   convs      r   r   zArrayField.python_value   sY     	5#4<,D%&& #}}T5$/BBBtE{{"Lr   c                 Z     dz  dk    rfd|D             S  fd|D             S )Nr   r   c                 &    g | ]} |          S r   r   )rr   vr   s     r   rt   z'ArrayField._process.<locals>.<listcomp>   s!    +++DDGG+++r   c                 >    g | ]}                     |          S r   )r   )rr   r   r   r   r   s     r   rt   z'ArrayField._process.<locals>.<listcomp>   s)    FFF1DMM$:66FFFr   r   )r   r   r\   r   s   `` `r   r   zArrayField._process   sQ    a
??++++U++++FFFFFFFFFFr   c                 8    t                               | |          S r   r   r[   s     r   r]   zArrayField.__getitem__   r   r   c                       fd}|S )Nc                 B    t          | t          | |                    S r   )r   
ArrayValue)r   r;   ops     r   innerzArrayField._e.<locals>.inner   s    dB
4(=(=>>>r   r   )r   r   s   ` r   _ezArrayField._e   s!    	? 	? 	? 	? 	?r   c                 J    t          | t          t          | |                    S r   )r   	ACONTAINSr   r   itemss     r   rA   zArrayField.contains   s    $	:dE+B+BCCCr   c                 J    t          | t          t          | |                    S r   )r   ACONTAINS_ANYr   r   s     r   rM   zArrayField.contains_any       $z$/F/FGGGr   c                 J    t          | t          t          | |                    S r   )r   ACONTAINED_BYr   r   s     r   rD   zArrayField.contained_by   r   r   rV   ) r(   r+   r,   passthroughIntegerFieldr   r   r   r   r   r   r]   r   r9   EQ__eq__NE__ne__GT__gt__GTE__ge__LT__lt__LTE__le__Fieldr*   rA   rM   rD   r-   r.   s   @r   r   r      sj       K#/de: : : : : :     
K K KE E E  G G G/ / /   RYYFRYYFRYYFRZZFRYYFRZZF~HD D DH H HH H H H H H Hr   r   c                       e Zd Zd Zd ZdS )r   c                 "    || _         || _        d S r   )fieldr\   )r   r   r\   s      r   r   zArrayValue.__init__   s    



r   c                     |                     t          | j        d                                        d                               | j                            |                    S )NFrG   z::)r`   rJ   r\   ra   r   r   rl   s     r   rd   zArrayValue.__sql__   sN    U4:e44455TZ,,S1122	4r   N)r(   r+   r,   r   rd   r   r   r   r   r      s2          4 4 4 4 4r   r   c                       e Zd ZdZdS )DateTimeTZFieldTIMESTAMPTZNr(   r+   r,   r   r   r   r   r   r      s        JJJr   r   c                   b    e Zd ZdZej        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 )HStoreFieldHSTOREc                 H    t          | t          t          |                    S r   )r   HKEYrJ   rS   s     r   r]   zHStoreField.__getitem__  s    $eCjj111r   c                 6    t                               |           S r   )fnakeysr$   s    r   rL   zHStoreField.keys      xx~~r   c                 6    t                               |           S r   )r   avalsr$   s    r   valueszHStoreField.values  r   r   c                 6    t                               |           S r   )r   hstore_to_matrixr$   s    r   r   zHStoreField.items
  s    ""4(((r   c                 p    t                               | t          t          |          d                    S NFrG   )r   rv   rJ   r#   )r   r   s     r   rv   zHStoreField.slice  s)    xxeDJJu===>>>r   c                 8    t                               | |          S r   )r   existrS   s     r   existszHStoreField.exists  s    xxc"""r   c                 8    t                               | |          S r   )r   definedrS   s     r   r   zHStoreField.defined  s    zz$$$$r   c                 .    t          | t          |          S r   )r   HUPDATE)r   datas     r   updatezHStoreField.update  s    $...r   c                 p    t                               | t          t          |          d                    S r   )r   deleterJ   r#   rK   s     r   r   zHStoreField.delete  s)    yyuT$ZZ>>>???r   c                 ,   t          |t                    r't          |d          }t          | t          |          S t          |t
          t          f          r't          |d          }t          | t          |          S t          | t          |          S r   )	r8   dictrJ   r   HCONTAINS_DICTr#   tupleHCONTAINS_KEYSHCONTAINS_KEY)r   r\   r;   s      r   rA   zHStoreField.contains  s    eT"" 	9e,,,CdNC888e}-- 	9e,,,CdNC888$u555r   c           	      f    t          | t          t          t          |          d                    S r   )r   HCONTAINS_ANY_KEYrJ   r#   rK   s     r   rM   zHStoreField.contains_any%  s;    $ 15d@E4G 4G 4G H H 	Hr   N)r(   r+   r,   r   r   r*   r]   rL   r   r   rv   r   r   r   r   rA   rM   r   r   r   r   r      s        J~H2 2 2    ) ) )? ? ?# # #% % %/ / /@ @ @6 6 6H H H H Hr   r   c                   D     e Zd ZdZdZd	 fd	Zd Zd Zd Z fdZ	 xZ
S )
	JSONFieldJSONjsonNc                 n    |pt           j        | _         t          t          |           j        |i | d S r   )r   dumpsr   r   r   )r   r   r   r   r    s       r   r   zJSONField.__init__.  s9    (dj
'i'888888r   c                     ||S t          |t                    s(t          |                     |          | j                  S |S r   )r8   r   Castr   _json_datatyper[   s     r   r   zJSONField.db_value2  sC    =L%&& 	@

5))4+>???r   c                 $    t          | |g          S r   )rY   r[   s     r   r]   zJSONField.__getitem__9  s    $(((r   c                 "    t          | |          S r   )rf   rK   s     r   pathzJSONField.path<  s    d###r   c                     t          |t                    st          |          }t          t          |                               |          S r   )r8   r   r   r   r   r<   )r   r\   r    s     r   r<   zJSONField.concat?  s>    %&& 	 KKEY%%,,U333r   r   )r(   r+   r,   r   r  r   r   r]   r  r<   r-   r.   s   @r   r   r   *  s        JN9 9 9 9 9 9  ) ) )$ $ $4 4 4 4 4 4 4 4 4r   r   c                 B    t          | t          d          fd          S )Nz::jsonbr   r   )r   r   )r   s    r   
cast_jsonbr	  E  s     T3y>>*4444r   c                   H    e Zd ZdZdZej        Zd Zd Zd Z	d Z
d Zd Zd	S )
BinaryJSONFieldJSONBjsonbc                     t          |t                    rt          | t          |          S t          | t          t	          |                    S r   )r8   r   r   r>   r   r?   s     r   rA   zBinaryJSONField.containsN  s>    eY'' 	;dNE:::$U<<<r   c                 b    t          t          |           t          t          |                    S r   )r   r	  rC   r   r?   s     r   rD   zBinaryJSONField.contained_byS  s#    *T**,>ULLLr   c           	          t          t          |           t          t          t	          |          d                    S r   )r   r	  rI   rJ   r#   r   s     r   rM   zBinaryJSONField.contains_anyV  s8    t"$u++e,,,. . 	.r   c           	          t          t          |           t          t          t	          |          d                    S r   )r   r	  rO   rJ   r#   r   s     r   rP   zBinaryJSONField.contains_all\  s8    t#$u++e,,,. . 	.r   c                 H    t          t          |           t          |          S r   )r   r	  rR   rS   s     r   rU   zBinaryJSONField.has_keyb  s    *T**,>DDDr   c           	          t          t          |           t          t          t	          |          d                    S r   )r   r	  JSONB_REMOVErJ   r#   r   s     r   removezBinaryJSONField.removee  s8    t$u++e,,,. . 	.r   N)r(   r+   r,   r   r  r   r*   rA   rD   rM   rP   rU   r  r   r   r   r  r  I  s        JN~H= = =
M M M. . .. . .E E E. . . . .r   r  c                   (    e Zd ZdZej        ZddZdS )TSVectorFieldTSVECTORNFc                 z    |||fn|f}|rt           j        nt           j        }t          | t           ||           S r   )r   plainto_tsquery
to_tsqueryr   TS_MATCH)r   querylanguageplainparamsfuncs         r   matchzTSVectorField.matchp  sD    &.&:(E""%*=r!!$$$-888r   NF)r(   r+   r,   r   r   r*   r"  r   r   r   r  r  l  s4        J~H9 9 9 9 9 9r   r  c                     |||fn|f}||| fn| f}t          t          j        | t          t          j        |           S r   )r   r   to_tsvectorr  r  )r   r  r  r   field_paramss        r   Matchr'  v  sW    "*"6hUHF(0(<He$$5(L
%
v     r   c                       e Zd ZdZdS )IntervalFieldINTERVALNr   r   r   r   r)  r)    s        JJJr   r)  c                   H    e Zd ZdZd	dZd Zed             Zd Zd Z	d Z
dS )
FetchManyCursor)cursor
array_size	exhaustediterableNc                 p    || _         |p|j        | _        d| _        |                                 | _        d S r#  )r-  itersizer.  r/  row_genr0  )r   r-  r.  s      r   r   zFetchManyCursor.__init__  s1    $7r   c                     | j         r9| j         j        s/	 | j                                          d S # t          $ r Y d S w xY wd S d S r   )r-  closedclose	Exceptionr$   s    r   __del__zFetchManyCursor.__del__  sm    ; 	t{1 	!!#####   	 	 	 	s   0 
>>c                     | j         j        S r   )r-  descriptionr$   s    r   r:  zFetchManyCursor.description  s    {&&r   c                 8    | j                                          d S r   )r-  r6  r$   s    r   r6  zFetchManyCursor.close  s    r   c              #      K   	 	 | j                             | j                  }|s	 |                                  d S |D ]}|V  B# |                                  w xY wr   )r-  	fetchmanyr.  r6  )r   rowsrows      r   r3  zFetchManyCursor.row_gen  s{      	{,,T_==  JJLLLLL    CIIII JJLLLLs   "A 
A Ac                 n    | j         rd S 	 t          | j                  S # t          $ r d| _         Y d S w xY wr7   )r/  nextr0  StopIterationr$   s    r   fetchonezFetchManyCursor.fetchone  sN    > 	F	"&&& 	" 	" 	"!DNNNN	"s    44r   )r(   r+   r,   	__slots__r   r8  propertyr:  r6  r3  rC  r   r   r   r,  r,    s        AI' ' ' '   ' ' X'  	 	 	" " " " "r   r,  c                   (    e Zd ZddZd Zd Zd ZdS )ServerSideQueryNc                 0    || _         || _        d | _        d S r   )r  r.  _cursor_wrapper)r   r  r.  s      r   r   zServerSideQuery.__init__  s    
$#r   c                 6    | j                             |          S r   )r  rd   rl   s     r   rd   zServerSideQuery.__sql__  s    z!!#&&&r   c                     | j         |                     | j        j                   t	          | j                                                   S r   )rI  _executer  	_databaseiteriteratorr$   s    r   __iter__zServerSideQuery.__iter__  s?    'MM$*.///D(1133444r   c                     | j         A|                    | j        d| j                  }| j                            |          | _         | j         S )NT)named_cursorr.  )rI  executer  r.  _get_cursor_wrapper)r   databaser-  s      r   rL  zServerSideQuery._execute  sS    '%%djt15 & B BF#':#A#A&#I#ID ##r   r   )r(   r+   r,   r   rd   rP  rL  r   r   r   rG  rG    sU        $ $ $ $
' ' '5 5 5
$ $ $ $ $r   rG  c              #   P   K   || j         }t          | |          }|D ]}|V  d S )N)r.  )rM  rG  )r  rU  r.  server_side_queryr?  s        r   
ServerSiderX    sJ      ?'*EEE   				 r   c                       e Zd ZdZd ZeZdS )_empty_objectr   c                     dS r#  r   r$   s    r   __nonzero__z_empty_object.__nonzero__  s    ur   N)r(   r+   r,   rD  r\  __bool__r   r   r   rZ  rZ    s'        I  HHHr   rZ  c                   @     e Zd Z fdZ fdZddZd	dZd
dZ xZS )PostgresqlExtDatabasec                     |                     dd          | _        |                     dd          | _         t          t          |           j        |i | d S )Nr   Fserver_side_cursors)pop_register_hstore_server_side_cursorsr   r_  r   r   s      r   r   zPostgresqlExtDatabase.__init__  sZ     &

+<e D D$*JJ/De$L$L!3#T**3TDVDDDDDr   c                     t          t          |                                           }| j        rt	          |d           |S )NT)r   )r   r_  _connectrc  r   )r   connr    s     r   rf  zPostgresqlExtDatabase._connect  sB    *D11::<<  	1D40000r   Nc                 d   |t          d           |                                 r+| j        r|                                  nt	          d          |rA| j        j                            t          t          j
                              d          }|S | j        j                                        S )N,"commit" has been deprecated and is a no-op.z&Error, database connection not opened.T)r   withhold)r   	is_closedautoconnectconnectInterfaceError_staterg  r-  rk   uuiduuid1)r   commitrR  curss       r   r-  zPostgresqlExtDatabase.cursor  s    IJJJ>> 	O O$%MNNN 	;#**DJLL0A0A48 + : :DK{&&(((r   Fc                 <   |t          d            | j        di |}|                    |                                          \  }}|p&| j        o|d d                                         dk    }|                     |||          }	|rt          |	|          }	|	S )Nri     selectrR  r   )r   get_sql_contextr`   r  rd  lowerexecute_sqlr,  )
r   r  rr  rR  r.  context_optionsrb   r`   r   r-  s
             r   rS  zPostgresqlExtDatabase.execute  s    IJJJ"d"55_55ggenn**,,V# E(A )D(+BQB8(C 	!!#vL!II 	9$VZ88Fr   c                     |t          d           t                              ||f           t          5  |                     |          }|                    ||pd           d d d            n# 1 swxY w Y   |S )Nri  rw  r   )r   loggerdebugr	   r-  rS  )r   r`   r   rr  rR  r-  s         r   rz  z!PostgresqlExtDatabase.execute_sql  s    IJJJc6]###" 	. 	.[[l[;;FNN3"---	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. s   /A00A47A4NN)NFN)NNN)	r(   r+   r,   r   rf  r-  rS  rz  r-   r.   s   @r   r_  r_    s        E E E E E
    ) ) ) )          r   r_  r   r  )?__doc__r   loggingrp  r   r   r   r   r   r   r	   psycopg2cffir
   registerImportErrorpsycopg2.extrasr   r   	getLoggerr}  r   r   r   r   r   r   r   r   r   r  r>   rC   rR   rI   rO   JSONB_EXISTSr  r   r0   rY   rf   rn   objectr   r   r   r   DateTimeFieldr   r   r   r	  r  	TextFieldr  r'  r)  r,  rG  rX  rZ  PostgresqlDatabaser_  r   r   r   <module>r     sO   
                                ! ! ! ! ! ! ( ( ( ( ( (	######FO 	 	 	D	///////       $$$$$$$DDD 
	8	$	$  
	    
9 
9 
9 
9 
9* 
9 
9 
9$G $G $G $G $Gk $G $G $GN        F F F F F F F F/ / / / /+ / / /4A A A A A A A ACH CH CH CH CH"E CH CH CHL	4 	4 	4 	4 	4 	4 	4 	4    m   *H *H *H *H *H#U *H *H *HZ4 4 4 4 4 4 4 465 5 5 .  .  .  .  .'  .  .  .F9 9 9 9 9%y 9 9 9           E   (" (" (" (" ("f (" (" ("V$ $ $ $ $d $ $ $,       F   . . . . .. . . . . .s/   A AAA! !A,+A,0A7 7A=