
    }iR                       U d dl mZ d dlmZ d dlmZmZmZ d dlZ	d dl
mZ d dlmZ d dlmZmZmZ erpd dlmZmZmZ d dlmZ d d	lmZmZ d d
lmZ d dlmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z& d dl'm(Z( d dl)m*Z* d dl+m,Z,m-Z- e"Z.de/d<   ddZ0ddZ1ddZ2ddZ3ddZ4ddZ5ddd dd'Z6nd d(l
m6Z6 d d)l7m5Z5m1Z1m4Z4m3Z3m2Z2m0Z0 ej8        9                                Z:	 d*d+d,d-d.d/d0d1d2d3d4
Z;d5e/d6<   e	j<        Z=	 dd8Z>dd;Z?	 ddd@Z@ddFZA	 dddHZBddJZCddOZD edPQ          ddR            ZEejF        jG        ZGi eGjH         e	jI                    eGjJ         e	jK                    eGjL         e	jM                    eGjN         e	jO                    eGjP         e	jQ                    eGjR         e	jS         e	jT                     e	jO                              eGjU         e	jV                    eGjW         e	jX        dS          eGjY         e	jZ                    eGj[         e	j\                    eGj]         e	j^                    eGj_         e	j`                    eGja         e	jb                    eGjc         e	jd                    eGje         e	jT                    eGjf         e	jg                    ZhdTe/dU<   eGji        fZjddWZkdd\Zldd`ZmddfZndgZodhZpdiZqdjZrdkZsdlZtdmZueo ep dneq dneu doZvdpZwdqZxdrZydsZzezdtfewdufexdvfeydwffZ{erdxfesdyfetdzffZ|ddd dd|Z}dd}Z~ddZddZddZddZe:dk    rddiddiddidZde/d<   nddiddiddidZ	 dddZ G d ded                   ZddZddZddZdS )    )annotations)	lru_cache)TYPE_CHECKINGAnycastN)EagerSeriesNamespace)ImplementationVersionisinstance_or_issubclass)IterableIteratorMapping)Literal)	TypeAliasTypeIsArrowSeries)	ArrayAnyArrayOrScalarArrayOrScalarT1ArrayOrScalarT2ChunkedArrayAny
IncompleteNativeIntervalUnitPromoteOptions	ScalarAny)IntervalUnit)DType)	IntoDTypePythonLiteralr   ChunkedArrayStructArraytr   return"TypeIs[pa.TimestampType[Any, Any]]c                    d S N r"   s    I/home/jrussi/.local/lib/python3.11/site-packages/narwhals/_arrow/utils.pyis_timestampr*   &             TypeIs[pa.DurationType[Any]]c                    d S r&   r'   r(   s    r)   is_durationr/   '   r+   r,   TypeIs[pa.ListType[Any]]c                    d S r&   r'   r(   s    r)   is_listr2   (   r+   r,   TypeIs[pa.LargeListType[Any]]c                    d S r&   r'   r(   s    r)   is_large_listr5   )   r+   r,   &TypeIs[pa.FixedSizeListType[Any, Any]]c                    d S r&   r'   r(   s    r)   is_fixed_size_listr8   *   r+   r,   (TypeIs[pa.DictionaryType[Any, Any, Any]]c                    d S r&   r'   r(   s    r)   is_dictionaryr;   +   r+   r,   optionsmemory_poolpatternstrstringsr   r=   r>   c                  d S r&   r'   )rA   r?   r=   r>   s       r)   extract_regexrC   ,   s	     #&#r,   )rC   )r;   r/   r8   r5   r2   r*   yearquartermonthdayhourminutesecondmillisecondmicrosecond
nanosecond)
yqmodhmsmsusnsz)Mapping[IntervalUnit, NativeIntervalUnit]
UNITS_DICTvaluec               (    ddl m}  || d          S )Nr   )maybe_extract_py_scalarT)return_py_scalar)narwhals._arrow.seriesr[   )rY   r[   s     r)   extract_py_scalarr^   S   s*    >>>>>>""54@@@@r,   objTypeIs[ArrayOrScalar]c                d    t          | t          j        t          j        t          j        f          S )z-Return True for any base `pyarrow` container.)
isinstancepaChunkedArrayArrayScalar)r_   s    r)   is_array_or_scalarrg   Y   s    cBORXryABBBr,   arr#ArrayOrScalar | list[Iterable[Any]]dtypepa.DataType | Nonec                   t          | t          j                  r| S t          | t                    rt          j        | |          S t          j        | g|          S r&   )rb   rc   rd   listchunked_array)rh   rj   s     r)   rn   rn   ^   sW     #r'' 
#t ,U+++SE5)))r,   nintseriesr   r   c                @    t          j        | |j        j                  S )z|Create a strongly-typed Array instance with all elements null.

    Uses the type of `series`, without upseting `mypy`.
    )rc   nullsnativetype)ro   rq   s     r)   
nulls_likerv   h   s    
 8Av})***r,   PythonLiteral | ScalarAnyc               P    t           }t          j         || |          |          S )zCreate an Array instance whose slots are the given scalar.

    *Optionally*, casting to `dtype` **before** repeating `n` times.
    ru   )litrc   repeat)rY   ro   rj   lit_s       r)   r{   r{   p   s*     D9TT%e,,,a000r,   pa.Int64Arrayc               ,    t          j        d|           S )Nr   )rc   r{   )ro   s    r)   zerosr   {   s    9Q??r,   pa.DataTypeversionr
   r   c                    t          | t          j                  r|j                                        S t          | |          S r&   )rb   rc   ExtensionTypedtypesUnknown&native_non_extension_to_narwhals_dtype)rj   r   s     r)   native_to_narwhals_dtyper      s;    %)** (~%%'''1%AAAr,      )maxsizec                F
    j         t          j                                       r                                S t          j                                       r                                S t          j                                       r                                S t          j        	                               r
                                S t          j                                       r                                S t          j                                       r                                S t          j                                       r                                S t          j                                       r                                S t          j                                       r                                S t          j                                       r                                S t          j                                       r                                S t          j                                       sDt          j                                       s% t7          t          j        dd                      r                                S t          j                                       r                                S t?                     r!                      j!         j"                  S tG                     r$                     j!                  S t          j        %                               r&                                S t          j        '                               r5(                     fdtS           j*                  D                       S tW                     stY                     r(-                    t]           j/                            S ta                     r.1                    t]           j/                   j2                  S t          j        3                               r!4                     j5         j6                  S t          j        7                               st          j        8                               r9                                S t          j        :                               r;                                S <                                S )Nis_string_viewc                    dS )NFr'   )_s    r)   <lambda>z8native_non_extension_to_narwhals_dtype.<locals>.<lambda>   s     r,   )	time_unit	time_zone)r   c           
         g | ]V}                                         |          j        t                              |          j                            WS r'   )Fieldfieldnamer   ru   ).0irj   r   r   s     r)   
<listcomp>z:native_non_extension_to_narwhals_dtype.<locals>.<listcomp>   sc       
 	 KKNN',U[[^^-@'JJ   r,   	precisionscale)=r   rc   typesis_int64Int64is_int32Int32is_int16Int16is_int8Int8	is_uint64UInt64	is_uint32UInt32	is_uint16UInt16is_uint8UInt8
is_booleanBoolean
is_float64Float64
is_float32Float32	is_stringis_large_stringgetattrString	is_date32Dater*   Datetimeunittzr/   Durationr;   Categorical	is_structStructrange
num_fieldsr2   r5   Listr   
value_typer8   re   	list_sizeis_decimal128Decimalr   r   	is_time32	is_time64Time	is_binaryBinaryr   )rj   r   r   s   ``@r)   r   r      sK   ^F	x ||~~	x ||~~	x ||~~	x {{}}	x%   }}	x%   }}	x%   }}	x ||~~	x5!!  ~~	x5!!  ~~	x5!!  ~~ 	5!!8##E** @728-??FF
 }}	x%   {{}}E IuxHHH5 5444	xe$$ $!!###	x%   	
}}     
 u/00  
 
 	
 u~~ Pu-- P{{3E4DgNNOOO%   
||$U%5w??
 
 	
 
xe$$ L~~u{~KKK	x%   BH$6$6u$=$= {{}}	x%   }}>>r,   rW   z!Mapping[type[DType], pa.DataType]NW_TO_PA_DTYPESr   c                   j         }|                                 }t                              |          x}r|S t	          | |j                  r9| j        }| j        x}rt          j	        ||          nt          j	        |          S t	          | |j
                  rt          j        | j                  S t	          | |j                  r)t          j        t          | j                            S t	          | |j                  r%t          j        fd| j        D                       S t	          | |j                  r3t          | j                  }| j        }t          j        ||          S t	          | |j                  r t          j        | j        | j                  S t3          |t4                    rd|j         d}	t9          |	          d|  }	t;          |	          )	Nr   )r   c                J    g | ]}|j         t          |j                   f S )r   )r   narwhals_to_native_dtyperj   )r   r   r   s     r)   r   z,narwhals_to_native_dtype.<locals>.<listcomp>   s@        5ek7SSST  r,   )r   r   zConverting to z$ dtype is not supported for PyArrow.zUnknown dtype: )r   	base_typer   getr   r   r   r   rc   	timestampr   durationr   list_r   innerr   structfieldsre   sizer   
decimal128r   r   
issubclassUNSUPPORTED_DTYPES__name__NotImplementedErrorAssertionError)
rj   r   r   r   pa_typer   r   r   r   msgs
    `        r)   r   r      s   ^F!!I!%%i000w v77 Y05*?"Xr|D"%%%blSWFXFXXv77 ,{5?+++v{33 [x#;EKQX#Y#Y#YZZZZv}55 
y   "\  
 
 	
  v|44 4(gFFFJ	x3333v~66 K}uekJJJJ)/00 'Wy1WWW!#&&&
#E
#
#C


r,   lhsrhs'ArrowSeries | PythonLiteral | ScalarAny3tuple[ChunkedArrayAny, ChunkedArrayAny | ScalarAny]c                   ddl m} || j        t          d| j                  fS t          ||          rK| j        r|j        s| j        d         |j        fS |j        r| j        |j        d         fS | j        |j        fS t          |t                    rd}t          |          | j        t          |t          j
                  r|nt          |          fS )aJ  Extract native objects in binary  operation.

    If the comparison isn't supported, return `NotImplemented` so that the
    "right-hand-side" operation (e.g. `__radd__`) can be tried.

    If one of the two sides has a `_broadcast` flag, then extract the scalar
    underneath it so that PyArrow can do its own broadcasting.
    r   r   Nry   z$Expected Series or scalar, got list.)r]   r   rt   rz   _typerb   
_broadcastrm   	TypeErrorrc   rf   )r   r   r   r   s       r)   extract_nativer      s     322222
{z3t#)44444#{## &> 	-#. 	-:a=#*,,> 	-:sz!},,z3:%%#t 4nn:jbi88Fssc#hhFFr,   leftr   rightc          
     6   t          j        |t          d|j                            }t          j        ||t          d|j                            }t          d | j                  }t
          j                            | j                  rMt
          j                            |j                  r(t          j        |t          j        | |          |          }t
          j        	                    |j                  rt          d|j                  }t          j        t          j        ||          |           }t          j        t          j        | |          t          d|                    }t          j        t          j        ||          t          j        |t          d|                    |          }	n|}	|	
                    | j                  }	n=t          j        |t          j        | |          |          }t          j        |          }	|	S )Nr   ry      zpa._lib.Int64Type)pc	not_equalrz   ru   if_elserc   r   
is_integerdivide_checkedis_signed_integerr   multiplylessbit_wise_xorand_subtractdividefloor)
r   r   	safe_mask
safe_rightnon_safe_resultdivideddiv_typehas_remainderhas_one_negative_operandresults
             r)   floordiv_compatr    s    UC
$;$;$;<<IIuc!%*.E.E.EFFJ$TY///O	x49%% #"(*=*=ej*I*I #*r(z::O
 
 8%%gl33 	/>>HLWe)D)DdKKM')we,,c!X.>.>( ($ Z'?@@GSH%5%566 FF FTY''*Y	$
(C(C_UU'""Mr,   arrow_arrayr   	pa_objectr   'tuple[ArrayOrScalarT1, ArrayOrScalarT2]c                :   t           j                            | j                  rtt           j                            |j                  rP|                     t          j                    d          |                    t          j                    d          fS | |fS )NF)safe)rc   r   r   ru   r   float64)r  r  s     r)   cast_for_truedivr
  >  s     
x;+,, 
1D1DY^1T1T 
 
5999>>JLLu <J <
 <
 
 	
 	!!r,   z/(?P<date>\d{1,4}[-/.]\d{1,2}[-/.]\d{1,4}|\d{8})z(?P<sep>\s|T)z'(?P<time>\d{2}:\d{2}(?::\d{2})?|\d{6}?)z^(?P<hms>\d{2}:\d{2}:\d{2})$z^(?P<hm>\d{2}:\d{2})$z^(?P<hms_no_sep>\d{6})$z(?P<tz>Z|[+-]\d{2}:?\d{2})?z?$zw^(?P<year>(?:[12][0-9])?[0-9]{2})(?P<sep1>[-/.])(?P<month>0[1-9]|1[0-2])(?P<sep2>[-/.])(?P<day>0[1-9]|[12][0-9]|3[01])$zw^(?P<day>0[1-9]|[12][0-9]|3[01])(?P<sep1>[-/.])(?P<month>0[1-9]|1[0-2])(?P<sep2>[-/.])(?P<year>(?:[12][0-9])?[0-9]{2})$zw^(?P<month>0[1-9]|1[0-2])(?P<sep1>[-/.])(?P<day>0[1-9]|[12][0-9]|3[01])(?P<sep2>[-/.])(?P<year>(?:[12][0-9])?[0-9]{2})$zY^(?P<year>(?:[12][0-9])?[0-9]{2})(?P<month>0[1-9]|1[0-2])(?P<day>0[1-9]|[12][0-9]|3[01])$%Y%m%dz%Y-%m-%dz%d-%m-%Yz%m-%d-%Yz%H:%M:%Sz%H:%Mz%H%M%Spa.StructArrayc              v    t          j        t          | |||          j                  }t	          d|          S )Nr<   r  )rc   concat_arraysrC   chunksr   )rA   r?   r=   r>   rs        r)   _extract_regex_concat_arraysr  h  s@     	gw[QQQX	 	A  !$$$r,   c                   t          |                                                     dd          t                    }t	          j        |                                                                          sd}t          |          |	                    d          }|	                    d          }t	          j
        t	          j        |                                                    dk    rd}t          |          t	          j
        t	          j        |                                                    dk    rd	}t          |          t          t          d
|	                    d                              }t          t          d
|	                    d                              }|d                                         }|d                                         rdnd}| | | | S )z.Try to infer datetime format from StringArray.r   
   r?   zUnable to infer datetime format, provided format is not supported. Please report a bug to https://github.com/narwhals-dev/narwhals/issuessepr   r   z@Found multiple separator values while inferring datetime format.z?Found multiple timezone values while inferring datetime format.pc.StringArraydatetimez%z )r  	drop_nullsliceFULL_REr   allis_validas_pyr   r   countunique
ValueError_parse_date_formatr   _parse_time_format)	rh   matchesr   
separatorsr   
date_value
time_value	sep_valuetz_values	            r)   parse_datetime_formatr,  v  s   *3==??+@+@B+G+GQXYYYG6'""$$%%++-- 'U 	 "#&&&u%%J	t		B 
x	*%%&&,,..22Poo	x	"$$&&**Ooo#D)97==;P;P$Q$QRRJ#D)97==;P;P$Q$QRRJ1##%%I!u{{}},tt"H;);Z;;;;r,   r  c                F   t           D ]\  }}t          j        | |          }|dk    r<t          j        |                                                                          r|c S t          j        |                                                                          rt          j        t          j        |                    d          x}                                                    dk    rt          j        t          j        |                    d          x}                                                    dk    rP|d                                         x}|d                                         k    r|	                    d|          c S d}t          |          )	Nr  r  sep1r   sep2r   -zgUnable to infer datetime format. Please report a bug to https://github.com/narwhals-dev/narwhals/issues)DATE_FORMATSr   rC   r  r  r   r!  r"  r   replacer#  )rh   date_rgxdate_fmtr&  r.  r/  date_sep_valuer   s           r)   r$  r$    sf   * 
9 
9("3999xBF7+;+;+=+=$>$>$D$D$F$FOOOF7##%%&&,,..	97==+@+@#@4AABBHHJJaOO7==+@+@#@4AABBHHJJaOO#'7==??2tAw}}FF##C88888	Q  S//r,   c                    t           D ]W\  }}t          j        | |          }t          j        |                                                                          r|c S XdS )Nr  r  )TIME_FORMATSr   rC   r  r  r   )rh   time_rgxtime_fmtr&  s       r)   r%  r%    sh    *  ("39996'""$$%%++-- 	OOO	2r,   window_sizecenterbooltuple[ArrowSeries, int]c                   |s| dfS |dz  }||dz  dk    z
  }| j         j        }t          ||           g|t          ||           R }|                     t	          j        |                    ||z   fS )au  Pad series with None values on the left and/or right side, depending on the specified parameters.

    Arguments:
        series: The input ArrowSeries to be padded.
        window_size: The desired size of the window.
        center: Specifies whether to center the padding or not.

    Returns:
        A tuple containing the padded ArrowSeries and the offset value.
    r      )rt   r  rv   _with_nativerc   r  )rq   r:  r;  offset_leftoffset_rightr  arrayss          r)   
pad_seriesrD    s      qy"K+/Q"67L]!FV,,WvWz,PV7W7WWWFr/7788+:TTTr,   chunked_arraysChunkedArrayAny | ScalarAny	separator7tuple[Iterator[ChunkedArrayAny | ScalarAny], ScalarAny]c                    t          d |D                       st          j                    nt          j                    fd|D             t	          |           fS )Nc              3  ^   K   | ](}t           j                            |j                  V  )d S r&   )rc   r   r   ru   )r   cas     r)   	<genexpr>z2cast_to_comparable_string_types.<locals>.<genexpr>  s4      NN28++BG44NNNNNNr,   c              3  B   K   | ]}|                               V  d S r&   )r   )r   rK  rj   s     r)   rL  z2cast_to_comparable_string_types.<locals>.<genexpr>  s-      44rBGGENN444444r,   )anyrc   stringlarge_stringrz   )rG  rE  rj   s     @r)   cast_to_comparable_string_typesrQ    si     NN~NNNNN		_ 

 5444^444c)U6K6KKKr,   )   promote_optionsdefault
permissivenone)rT  rU  rV  z*Mapping[PromoteOptions, Mapping[str, Any]]_PROMOTEpromoteTFtablesIterable[pa.Table]r   pa.Tablec                <    t          j        | fi t          |         S r&   )rc   concat_tablesrW  )rY  rS  s     r)   r]  r]    s"     F@@h&?@@@r,   c                      e Zd ZdS )ArrowSeriesNamespaceN)r   
__module____qualname__r'   r,   r)   r_  r_    s          r,   r_  )r   r   startendstepc                    t           dk     r-dd l}t          j        |                    | ||                    S t          j        | ||          S )N)   r   )BACKEND_VERSIONnumpyrc   arrayarange)rb  rc  rd  nps       r)   rj  rj    sM    x		%d334449UC&&&r,   ri  func:Literal['min', 'max', 'mean', 'approximate_median', 'sum']c                p   t           }|dk    rd|t          j        d          fnd|f}t          j        t          j                            t          j        |           t          j        |           gddg          	                    d          
                    |g                              d                              d|                     }t          j        t          j        t          j        |           t          d                              }|dk    r)t          j        |                                d d          }n2t          j         |d |j                  t'          |                     }t          j        t          j        ||                    d	          |          g          S )
Nsumvaluesr   )	min_countoffsetsnamesvalues_ry   F)rz   r   ScalarAggregateOptionsrc   ri  Tablefrom_arrayslist_flattenlist_parent_indicesgroup_by	aggregatesort_bycolumnr   list_value_lengthr   is_nullr{   ru   lenrn   replace_with_mask	fill_null)ri  rl  r|   aggregationaggnon_empty_mask
base_arrays          r)   list_aggr    s    D 5== 
42Q???@@ 
 (
_U##R%;E%B%BCY' 	 	
 	
 
)			K=	!	!				 $  	!	!	 	C Xbl2+?+F+FAOOPPNu}}Z 6 6 8 8$BB

YttDsx888#e**EE
 ((// 	
  r,   
descending
nulls_lastc                  |rdnd}|rdnd}d\  }}t          j        t          j        |           t          d                    }t          j                            t          dt          |           d          | g||g	          }|	                    |          }	|	                    t          j
        t          j        |          t          d
                              }
t          j                            t          j        |           t          j        |           g||g	          }t          j        ||df||fg|          }|	                    |                                          j        }t          j                            |t	          j        |                    |                              |                              }t          j                            |	                    |          |g||g	          }t	          j        ||
g                              |                              |          S )Nr  	ascendingat_endat_start)idxrp  r   r   )rb  rc  rd  rs  T)	sort_keysnull_placement)r   greaterr  rz   rc   rw  rx  rj  r  filterr  invertry  rz  sort_indicesr~  combine_chunksrr  	ListArrayri  taker]  r}  )ri  r  r  sort_directionnulls_positionr  vis_not_sortedindexednot_sorted_partpass_throughexplodedsorted_indicesrr  sorted_implodedimploded_by_idxs                   r)   	list_sortr    s    #3  AK4ZHHPZNFCJr3E::CFFCCMh""	aSZZa	0	0	0%8a #  G nn]33O>>",ry/G/GT"S"STTLx##			!7!>!>?3x $  H _%>':;%  N
 $$Q''6688@Gl..(--77>>qAABB O h**				$	$o6sAh +  O _l;<<DDSIIPPQRSSSr,   )r"   r   r#   r$   )r"   r   r#   r-   )r"   r   r#   r0   )r"   r   r#   r3   )r"   r   r#   r6   )r"   r   r#   r9   )
r?   r@   rA   r   r=   r   r>   r   r#   r!   )rY   r   r#   r   )r_   r   r#   r`   r&   )rh   ri   rj   rk   r#   r   )ro   rp   rq   r   r#   r   )rj   rk   rY   rw   ro   rp   r#   r   )ro   rp   r#   r}   )rj   r   r   r
   r#   r   )rj   r   r   r
   r#   r   )r   r   r   r   r#   r   )r   r   r   r   r#   r   )r  r   r  r   r#   r  )
r?   r@   rA   r   r=   r   r>   r   r#   r  )rh   r   r#   r@   )rh   r  r#   r@   )rq   r   r:  rp   r;  r<  r#   r=  )rE  rF  rG  r@   r#   rH  )rV  )rY  rZ  rS  r   r#   r[  )rb  rp   rc  rp   rd  rp   r#   r   )ri  r   rl  rm  r#   r   )ri  r   r  r<  r  r<  r#   r   )
__future__r   	functoolsr   typingr   r   r   pyarrowrc   pyarrow.computecomputer   narwhals._compliantr   narwhals._utilsr	   r
   r   collections.abcr   r   r   r   typing_extensionsr   r   r]   r   narwhals._arrow.typingr   r   r   r   r   r   r   r   r   narwhals._durationr   narwhals.dtypesr   narwhals.typingr   r    r!   __annotations__r*   r/   r2   r5   r8   r;   rC   pyarrow.typesPYARROW_backend_versionrg  rX   scalarrz   r^   rg   rn   rv   r{   r   r   r   MAINr   r   r	  r   float32r   binaryr   rO  r   bool_r   
dictionaryuint32r   date32r   time64r   int8r   int16r   int32r   int64r   uint8r   uint16r   r   uint64r   Objectr   r   r   r  r
  DATE_RESEP_RETIME_REHMS_REHM_REHMS_RE_NO_SEPTZ_REr  YMD_REDMY_REMDY_REYMD_RE_NO_SEPr1  r7  r  r,  r$  r%  rD  rQ  rW  r]  r_  rj  r  r  r'   r,   r)   <module>r     s   " " " " " " "       + + + + + + + + + +           4 4 4 4 4 4 M M M M M M M M M M 1;;;;;;;;;;33333333222222
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 0/////%%%%%%88888888 *98888GGGG@@@@8888CCCCQQQQNNNN & & & & & & & .-----                !(99;; + 
	
				


9 9
     	i !A A A AC C C C KO* * * * *+ + + + NR1 1 1 1 1   B B B B 2> > > >B 
	6
NJBJLL6
NJBJLL6 M929;;6 M929;;	6
 NHBHJJ6 ibikk929;;??6 K6 K46 K6 L("(**6 L("(**6 L("(**6 L("(**6 M929;;6 M929;;6  M929;;!6    $ m%    @G G G G<       F" " " "$ =	
4	( *%
3v
3
3
3
3%
3
3
3 
D 
D 
Dl HZZZ	 $ug&68QR % % % % % %< < < <>   (   U U U U.	L 	L 	L 	L e &y1(,7"F+< <H      t$ $'E" H CIA A A A A X W W W W/0PQ W W W' ' ' '" " " "JT T T T T Tr,   