
    hh[                       U d dl mZ d dlmZmZmZmZ d dlmZm	Z	 d dl
mZmZmZmZmZmZ d dlZd dlmZ d dlmZ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%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z- d dl.m/Z/ d dl0m1Z1m2Z2 erd dl3m4Z4 d dl5m6Z6 d dl7m8Z8 d dl9Z:d dl;Z<d dl=m>Z>m?Z?m@Z@ d dlAmBZBmCZC d dlDmEZE d dlFmGZG d dlHmIZI d dlJmKZK d dlLmMZM d dlNmOZOmPZP d dl$mQZQmRZR d dlSmTZT d dlUmVZVmWZWmXZXmYZYmZZZm[Z[m\Z\m]Z]m^Z^m_Z_m`Z`maZa ede:jb        f         Zcdedd<    ee ejf        d           ejf        d           ejf        d            ejf        d!           ejf        d"           ejf        d#           ejf        d$           ejf        d%           ejf        d&           ejf        d'           ejf        d(           ejf        d)           ejf        d*           ejf        d+           ejf        d,           ejf        d-           ejf        d.           ejf        d/           ejf        d0           ejf        d1          g          Zgd2edd3<    G d4 d5ed6                   ZhdS )7    )annotations)IterableIteratorMappingSequence)chainproduct)TYPE_CHECKINGAnyCallableLiteralcastoverloadN)EagerDataFrame)PANDAS_TO_NUMPY_DTYPE_MISSINGPandasLikeSeries)	align_and_extract_nativeget_dtype_backendimport_array_moduleiter_dtype_backendsnative_to_narwhals_dtypeobject_native_to_narwhals_dtyperenameselect_columns_by_name	set_index)assert_never)	Implementation_into_arrow_table_remap_full_join_keyscheck_column_names_are_uniqueexclude_column_namesgenerate_temporary_column_nameparse_columns_to_dropscale_bytes
zip_strictis_pandas_like_dataframe)InvalidOperationError
ShapeError)BytesIO)Path)
ModuleType)Self	TypeAliasTypeIs)CompliantDataFrameAnyCompliantLazyFrameAny)PandasLikeExprPandasLikeGroupByPandasLikeNamespace)SparkSession)IntoArrowTable)_EagerAllowedImpl_LazyAllowedImpl)Version_LimitedContext)DType)AsofJoinStrategyDTypeBackend
IntoSchemaJoinStrategyPivotAggSizedMultiIndexSelectorSizedMultiNameSelectorSizeUnitUniqueKeepStrategy_2DArray_SliceIndex
_SliceName.r.   Constructorfloat64float32int64int32int16int8uint64uint32uint16uint8boolzdatetime64[s]zdatetime64[ms]zdatetime64[us]zdatetime64[ns]ztimedelta64[s]ztimedelta64[ms]ztimedelta64[us]ztimedelta64[ns]objectzfrozenset[np.dtype[Any]]CLASSICAL_NUMPY_DTYPESc                  j   e Zd ZddddZedd            Zedd            Zedd            Zedd            Z	edd            Z
edd!            Zdd"Zdd#Zdd%Zdd'Zdd)Zdd*Zd+d,dd.Zdd2Zed3             Zdd6Zdd7d8dd<Zdd?ZddAZddDZddEZddFZddHZed dJ            ZeddN            Z eddQ            Z eddS            Z ddTZ ddVZ!e!Z"ddYZ#edd[            Z$dd\Z%dd^Z&ddaZ'd	ddZ(d
dhZ)ddjZ*ddmZ+ddoZ,ddpZ-ddsZ.ddvZ/dd{Z0ddZ1ddZ2ddZ3ddZ4ddZ5ddZ6ddZ7ddZ8ddZ9ddZ:ddZ;ddZ<ddZ=ddZ>d7dddZ?	 dd7dddZ@edd            ZAddZBdd7d8ddZCddZDd dZEd!dZFed"d            ZGed!d            ZGd#dZGd$dZHd%dĄZIddńZJd&dǄZKd'd˄ZLed(d΄            ZMed)dф            ZNd*dՄZOd+dׄZPd,dڄZQd-d܄ZRd.dބZSd/d߄ZTd0dZUd1dZVd2dZWd7S (3  PandasLikeDataFrameFvalidate_backend_versionnative_dataframer   implementationr   versionr;   validate_column_namesrU   r[   returnNonec                   || _         || _        || _        |rt          |j                   |r|                                  d S d S N)_native_frame_implementation_versionr    columns_validate_backend_version)selfr\   r]   r^   r_   r[   s         V/var/www/histauto/venv/lib/python3.11/site-packages/narwhals/_pandas_like/dataframe.py__init__zPandasLikeDataFrame.__init__f   s`     .-  	D)*:*BCCC# 	-**,,,,,	- 	-    datar8   contextr<   r-   c                 |j         }t          ||          }|                                r|                                }n|                                r1|                                dk    rddlm} nddlm}  ||          }nR|	                                r-|
                                j                            |          }nd}t          |          |                     ||          S )N)r      r   r   )
from_arrowzCcongratulations, you entered unreachable code - please report a bugrn   )re   r   	is_pandas	to_pandasis_modin_backend_versionmodin.pandas.iorq   modin.pandas.utilsis_cudfto_native_namespace	DataFrameAssertionErrorfrom_native)clsrm   rn   r]   tblnativempd_from_arrowmsgs           rj   rq   zPandasLikeDataFrame.from_arroww   s    0g..##%% 	&]]__FF$$&& 	& ..00J>>HHHHHHH      $^C((FF##%% 	&#7799CNNsSSFFWC %%%vw777rl   Mapping[str, Any]schemaIntoSchema | Nonec                 ddl m} |j        }|                                }t	          d|j                  }t	          d|j                  }i }	d }
|                                D ]T\  }}t          ||          r:t          j
        ||          }|
|}
||	|<   5t          |
|          d         |	|<   O||	|<   U|	s|s|                    |	          }n|                    d |D                       }|rJd }|	rt          |j        |          }|                     ||                              |                    }| 
                    ||          S )Nr   Schemaztype[pd.Series[Any]]type[pd.DataFrame]rr      c                    i | ]}|g S  r   .0cols     rj   
<dictcomp>z1PandasLikeDataFrame.from_dict.<locals>.<dictcomp>       )D)D)Dc#r)D)D)Drl   )narwhals.schemar   re   rz   r   Seriesr{   items
isinstancer   r}   r   	from_dictr   dtypesastypert   )r~   rm   rn   r   r   r]   nsr   r{   aligned_data	left_mostnameseries	compliantr   backends                   rj   r   zPandasLikeDataFrame.from_dict   s    	+***** 0//11,bi88-r|<<	8:-1	 JJLL 		, 		,LD&&&)) ,,8QQQ	$ )I)/L&&)A)Y)W)WXY)ZL&&%+T"" 	Fv 	F((66FF(()D)DV)D)D)DEEF 	F59G M-fm^LL]]66&>>#;#;G#D#DEEFvw777rl   Sequence[Mapping[str, Any]]c                 ddl m} |j        }|                                }t	          d|j                  }|s|s|                    |          }n|                    d |D                       }|rJd }	|rt          |j	        |          }	|
                     ||                              |	                    }|                     ||          S )Nr   r   r   c                    i | ]}|g S r   r   r   s     rj   r   z2PandasLikeDataFrame.from_dicts.<locals>.<dictcomp>   r   rl   rr   )r   r   re   rz   r   r{   from_recordsr   r   r   r   rt   r}   )
r~   rm   rn   r   r   r]   r   r{   r   r   s
             rj   
from_dictszPandasLikeDataFrame.from_dicts   s     	+***** 0//11-r|<<	 	Fv 	F++D11FF(()D)DV)D)D)DEEF 	F59G M-fm^LL]]66&>>#;#;G#D#DEEFvw777rl   objTypeIs[Any]c                     t          |           S rc   r&   )r   s    rj   
_is_nativezPandasLikeDataFrame._is_native   s    ',,,rl   c              4     | ||j         |j        d          S )NTr]   r^   r_   )re   rf   )r~   rm   rn   s      rj   r}   zPandasLikeDataFrame.from_native   s-    s"2$"&	
 
 
 	
rl   rG   !IntoSchema | Sequence[str] | Nonec                 ddl m} |j                                        j        }t          |t          |f          rofd|                                D             } |||                                          	                     ||          
                    |                    }n! |||                     ||                    }|                     ||          S )Nr   r   c              3  8   K   | ]}t          |          V  d S rc   )r   )r   native_typer]   s     rj   	<genexpr>z1PandasLikeDataFrame.from_numpy.<locals>.<genexpr>   sA       * * "+~>>* * * * * *rl   rg   rr   )r   r   re   rz   r{   r   r   valueskeysr   rt   _numpy_column_namesr}   )	r~   rm   rn   r   r   r{   itr   r]   s	           @rj   
from_numpyzPandasLikeDataFrame.from_numpy   s     	+***** 0!/!C!C!E!E!O	fw/00 		T* * * *#)==??* * *B YtV[[]];;;BBv((,, FF YtS-D-DT6-R-RSSSFvw777rl   c                    | S rc   r   ri   s    rj   __narwhals_dataframe__z*PandasLikeDataFrame.__narwhals_dataframe__       rl   c                    | S rc   r   r   s    rj   __narwhals_lazyframe__z*PandasLikeDataFrame.__narwhals_lazyframe__   r   rl   r6   c                <    ddl m}  || j        | j                  S )Nr   r5   )r^   )narwhals._pandas_like.namespacer6   re   rf   )ri   r6   s     rj   __narwhals_namespace__z*PandasLikeDataFrame.__narwhals_namespace__   s/    GGGGGG""4#7OOOOrl   r,   c                    | j         t          j        t          j        t          j        hv r| j                                         S dt          | j                    }t          |          )Nz!Expected pandas/modin/cudf, got: )re   r   PANDASMODINCUDFrz   typer|   ri   r   s     rj   __native_namespace__z(PandasLikeDataFrame.__native_namespace__   sf    ! $
 
 

 ';;===N$t7K2L2LNNS!!!rl   intc                *    t          | j                  S rc   )lenr   r   s    rj   __len__zPandasLikeDataFrame.__len__
  s    4;rl   c                H    |                      | j        | j        |d          S )NFr   )	__class__r   re   )ri   r^   s     rj   _with_versionz!PandasLikeDataFrame._with_version  s.    ~~K/"'	  
 
 	
rl   Tr_   dfc               H    |                      || j        | j        |          S )Nr   )r   re   rf   )ri   r   r_   s      rj   _with_nativez PandasLikeDataFrame._with_native  s.    ~~/M"7	  
 
 	
rl   otherr   pd.Series[Any]c                r   | j         j        }|j        r8|j         } t          |          |j        d         ||j        |j                  S t          |          x}t          |          x}k    rd| d| d}t          |          |j         j        |urt          |j         ||j
                  S |j         S )Nr   )indexdtyper   zExpected object of length z, got: .)r]   )r   r   
_broadcastr   ilocr   r   r   r)   r   re   )ri   r   r   s	len_otherlen_idxr   s          rj   _extract_comparandz&PandasLikeDataFrame._extract_comparand  s    ! 	OA47716!9EqvNNNNU#ICJJ)>??KwKKyKKKCS//!<U**U\5AVWWWW|rl   c                D    t           rdd l}|S t          | j                  S Nr   )r
   numpyr   re   )ri   nps     rj   _array_funcsz PandasLikeDataFrame._array_funcs)  s,     	I"4#7888rl   r   strc                D    t          j        | j        |         |           S Nrr   r   r}   r   )ri   r   s     rj   
get_columnzPandasLikeDataFrame.get_column1  s    +DK,=tLLLLrl   Ncopyr   r   bool | Nonec               0    |                      ||          S )Nr   r   )to_numpy)ri   r   r   s      rj   	__array__zPandasLikeDataFrame.__array__4  s    }}5t}444rl   rows'SizedMultiIndexSelector[pd.Series[Any]]c                    t          |t                    rt          |          n|}|                     | j        j        |d d f                   S rc   r   tuplelistr   r   r   )ri   r   r   s      rj   _gatherzPandasLikeDataFrame._gather7  sF    (u55?T


4  !1%(!;<<<rl   _SliceIndex | rangec                    |                      | j        j        t          |j        |j        |j                  d d f         d          S NFr   )r   r   r   slicestartstopstep)ri   r   s     rj   _gather_slicez!PandasLikeDataFrame._gather_slice;  sJ      KU4:ty$)DDaaaGH"' ! 
 
 	
rl   rg   rI   c                >   |j         $| j        j                            |j                   nd }|j        '| j        j                            |j                  dz   nd }t          |||j                  }|                     | j        j        d d |f         d          S )Nr   Fr   )	r   r   rg   get_locr   r   r   r   r   )ri   rg   r   r   selectors        rj   _select_slice_namez&PandasLikeDataFrame._select_slice_nameA  s     }( K''666 	 |' K''5599 	
 gl33  KQQQ[) ! 
 
 	
rl   c                X    |                      | j        j        d d |f         d          S r   r   r   r   ri   rg   s     rj   _select_slice_indexz'PandasLikeDataFrame._select_slice_indexQ  s6      KQQQZ( ! 
 
 	
rl   c                    t          |t                    rt          |          n|}|                     | j        j        d d |f         d          S r   r   r  s     rj   _select_multi_indexz'PandasLikeDataFrame._select_multi_indexV  sV     $.gu#=#=J$w---7  KQQQZ( ! 
 
 	
rl   &SizedMultiNameSelector[pd.Series[Any]]c                T    |                      | j        j        d d |f                   S rc   )r   r   locr  s     rj   _select_multi_namez&PandasLikeDataFrame._select_multi_name^  s'      G!<===rl   	list[str]c                >    | j         j                                        S rc   )r   rg   tolistr   s    rj   rg   zPandasLikeDataFrame.columnsb  s    {"))+++rl   namedLiteral[True]list[dict[str, Any]]c                   d S rc   r   ri   r  s     rj   r   zPandasLikeDataFrame.rowsf  s    EHSrl   Literal[False]list[tuple[Any, ...]]c                   d S rc   r   r  s     rj   r   zPandasLikeDataFrame.rowsi  s    GJsrl   ,list[tuple[Any, ...]] | list[dict[str, Any]]c                   d S rc   r   r  s     rj   r   zPandasLikeDataFrame.rowsl  s    TWTWrl   c                   |s\| j         t          j        u r d |                     d          D             S t	          | j                            dd                     S | j                            d          S )Nc                P    g | ]#}t          |                                          $S r   )r   r   )r   rows     rj   
<listcomp>z,PandasLikeDataFrame.rows.<locals>.<listcomp>t  s(    MMMcjjll++MMMrl   T)r  Fr   r   recordsorient)re   r   r   r   r   r   
itertuplesto_dictr  s     rj   r   zPandasLikeDataFrame.rowso  sz     	H#~':::MMtyyty7L7LMMMM..U.FFGGG{"")"444rl   Iterator[PandasLikeSeries]c              #  x   K   | j                                         D ]\  }}t          j        ||           V  d S r   )r   r   r   r}   )ri   _namer   s      rj   iter_columnsz PandasLikeDataFrame.iter_columnsz  sT      ![..00 	E 	EME6".vtDDDDDDD	E 	Erl   buffer_size4Iterator[tuple[Any, ...]] | Iterator[dict[str, Any]]c             #     K   |s$| j                             dd           E d {V  d S | j         j        }| j                             d          D ]!}t          t	          ||                    V  "d S )NFr  r   )r   r   rg   dictzip)ri   r  r&  	col_namesr  s        rj   	iter_rowszPandasLikeDataFrame.iter_rows  s      
  	0{--E-EEEEEEEEEEE+I{--E-:: 0 03y#..//////0 0rl   dict[str, DType]c                P      j         j         fd j         j        D             S )Nc                    i | ]V}||         d k    r!t          |         j        j                  n%t          j        |         j        j                  WS )rV   )r   rf   re   r   r   )r   r   native_dtypesri   s     rj   r   z.PandasLikeDataFrame.schema.<locals>.<dictcomp>  s     	
 	
 	
   S!X-- *c"DM43G   1C $-1E 	
 	
 	
rl   )r   r   rg   )ri   r1  s   `@rj   r   zPandasLikeDataFrame.schema  sE    *	
 	
 	
 	
 	
 {*	
 	
 	
 		
rl   c                    | j         S rc   )r   r   s    rj   collect_schemaz"PandasLikeDataFrame.collect_schema  s
    {rl   column_namesc                |    |                      t          | j        t          |          | j                  d          S r   )r   r   r   r   re   )ri   r4  s     rj   simple_selectz!PandasLikeDataFrame.simple_select  s>      "4;\0B0BDDXYY"' ! 
 
 	
rl   exprsr2   c                f    | j         | }|s1|                      t          | j                              d          S  |d         j        | }|                                 }|                    d |D                       }| j        j        j        |j        _        |                     |d          S )NFr   r   c                    g | ]	}|j         
S r   )r   r   r   s     rj   r  z.PandasLikeDataFrame.select.<locals>.<listcomp>  s    *H*H*H18*H*H*Hrl   T)	_evaluate_into_exprsr   r   r   _align_full_broadcastr   _concat_horizontalrg   r   )ri   r7  
new_series	namespacer   s        rj   selectzPandasLikeDataFrame.select  s    .T.6
 	W$$%6T$+%6%6%8%8PU$VVV8Z]8*E
//11	))*H*HZ*H*H*HII+-2
  4 @@@rl   subsetSequence[str] | Nonec                   |0|                      | j                            d          d          S |                                 }|                     |j        |                                 d           }|                     |          S )Nr   axisFr   T)ignore_nulls)r   r   dropnar   any_horizontalr   is_nullfilter)ri   rA  plxmasks       rj   
drop_nullszPandasLikeDataFrame.drop_nulls  s    >$$"""**% %    ))++""737F#3#;#;#=#=D"QQQ{{4   rl   unitrE   int | floatc                ~    | j                             d                                          }t          ||          S )NT)deep)rN  )r   memory_usagesumr$   )ri   rN  szs      rj   estimated_sizez"PandasLikeDataFrame.estimated_size  s9    [%%4%0044662D))))rl   order_byc                   |                                  }|jt          |           }| j                            |          }|j                            |j                            || | j        j	        |                    }n]|
                    |d                                       dd          }|                    g |          dz
                      |          }|                     ||                                          S )N)rn   r   r   r   ordinalF)method
descending)partition_byrV  r   )r   r   r   arange_expr_from_series_seriesfrom_iterabler   r   r   rankoveraliasr@  all)ri   r   rV  rK  sizerm   	row_indexra  s           rj   with_row_indexz"PandasLikeDataFrame.with_row_index  s    ))++t99D$++D11D	..))$dk.?d *   II 778A;'',,I%,PPDXFFJQQRVWWI{{9cggii000rl   r   tuple[Any, ...]c                T    t          d | j        j        |         D                       S )Nc              3     K   | ]}|V  d S rc   r   )r   xs     rj   r   z*PandasLikeDataFrame.row.<locals>.<genexpr>  s"      881Q888888rl   )r   r   r   )ri   r   s     rj   r  zPandasLikeDataFrame.row  s)    88 0 7888888rl   	predicatec                    |                      |          d         }|                     |          }|                     | j        j        |         d          S )Nr   Fr   )r;  r   r   r   r	  )ri   rl  rL  mask_natives       rj   rJ  zPandasLikeDataFrame.filter  sX    ((33A6--d33  KOK( ! 
 
 	
rl   c                :      j         | }|st                     dk    r S d |D             }g } j        j        D ]Q}||v r)                     |                    |                    }n j        |         }|                    |           R|                     fd|                                D                         	                                }|
                    |          } j        j        j        |j        _                             |d          S )Nr   c                    i | ]
}|j         |S r   )r   r:  s     rj   r   z4PandasLikeDataFrame.with_columns.<locals>.<dictcomp>  s    4P4P4P1QVQ4P4P4Prl   c              3  B   K   | ]}                     |          V  d S rc   )r   )r   r   ri   s     rj   r   z3PandasLikeDataFrame.with_columns.<locals>.<genexpr>  s1      SS0033SSSSSSrl   Fr   )r;  r   r   rg   r   popappendextendr   r   r=  r   r   )	ri   r7  rg   name_columns	to_concatr   r   r?  r   s	   `        rj   with_columnsz PandasLikeDataFrame.with_columns  s-   +$+U3 	3t99>>K4P4P4P4P4P	K' 	% 	%D|##001A1A$1G1GHHT*V$$$$SSSS\=P=P=R=RSSSSSS//11	)))44+-2
  5 AAArl   mappingMapping[str, str]c                `    |                      t          | j        || j                            S )Nrg   r]   )r   r   r   re   )ri   rx  s     rj   r   zPandasLikeDataFrame.rename  s1      4;@TUUU
 
 	
rl   Sequence[str]strictc                   t          | ||          }|                     | j                            |          d          S )N)r}  r   Fr   )r#   r   r   drop)ri   rg   r}  to_drops       rj   r  zPandasLikeDataFrame.drop  sK    'gfEEE  KW--U ! 
 
 	
rl   byrZ  bool | Sequence[bool]
nulls_lastc                   | j         }t          |t                    r| }nd |D             }|rdnd}|                     |                    t          |          ||          d          S )Nc                    g | ]}| S r   r   )r   ds     rj   r  z,PandasLikeDataFrame.sort.<locals>.<listcomp>  s    3331Q333rl   lastfirst)	ascendingna_positionFr   )r   r   rU   r   sort_valuesr   )ri   rZ  r  r  r   r  r  s          rj   sortzPandasLikeDataFrame.sort  s    [j$'' 	4/9>II33
333I *7ff  NN488ykNRR"' ! 
 
 	
rl   kIterable[str]reversec                  | j         }| j        t          |t                    rot	          fd|D                       rT|r)|                     |                    ||                    S |                     |                    ||                    S |                     |                    t          |          |          
                    |          d          S )Nc              3  L   K   | ]}|                                          V  d S rc   )
is_numeric)r   rk  r   s     rj   r   z,PandasLikeDataFrame.top_k.<locals>.<genexpr>  s3      ,P,PVAY-A-A-C-C,P,P,P,P,P,Prl   )r  Fr   )r   r   r   rU   rd  r   	nsmallestnlargestr  r   head)ri   r  r  r  r   r   s        @rj   top_kzPandasLikeDataFrame.top_k  s    [gt$$ 	9,P,P,P,PR,P,P,P)P)P 	9 >((a)<)<===$$R[[B%7%7888  NN488wN77<<Q??"' ! 
 
 	
rl   r   _EagerAllowedImpl | Nonekwargsr0   c                   |"t          | j        | j        | j        d          S |t          j        u rSt          j        | j        dd}|| j        ur|                    d           t          |                                 fi |S |t          j        u r,ddl	m
}  ||                                 d| j        d          S |t          j        u r+ddlm}  ||                                 d| j        	          S d
| }t!          |          )NFr   TrZ   r   )ArrowDataFrame)r\   r[   r^   r_   )PolarsDataFramer   r[   r^   zUnsupported `backend` value: )rY   r   re   rf   r   r   updatert   PYARROWnarwhals._arrow.dataframer  to_arrowPOLARSnarwhals._polars.dataframer  	to_polars
ValueError)ri   r   r  kwdsr  r  r   s          rj   collectzPandasLikeDataFrame.collect  sY    ?&#3&+	    n+++"0"7=).$ $D
 d222T:::&t~~'7'7@@4@@@n,,,@@@@@@!>!%)-&+	    n+++BBBBBB"?>>##dDM    8g77oorl   r   (Sequence[str] | Sequence[PandasLikeExpr]drop_null_keysr4   c               *    ddl m}  || ||          S )Nr   r3   )r  )narwhals._pandas_like.group_byr4   )ri   r   r  r4   s       rj   group_byzPandasLikeDataFrame.group_by;  s/     	EDDDDD  tNKKKKrl   left_onright_onsuffixpd.DataFramec               N    | j                             |j         ||dd|f          S )Ninner r  r  howsuffixes)r   merge)ri   r   r  r  r  s        rj   _join_innerzPandasLikeDataFrame._join_innerB  s8     {  L&\ ! 
 
 	
rl   c                     j                             |j         d||df          } fdt          ||          D             }|                    |d           |S )Nleftr  r  r  r  r  c                D    g | ]\  }}||k    |j         vr|n|  S r   r   )r   left_key	right_keyri   r  s      rj   r  z2PandasLikeDataFrame._join_left.<locals>.<listcomp>W  sM     
 
 
#)H$$ #$,66IIy<R&<R<R$$$rl   Trg   inplace)r   r  r%   r  )ri   r   r  r  r  result_nativeextras   `   `  rj   
_join_leftzPandasLikeDataFrame._join_leftM  s     ))L&\ * 
 

 
 
 
 
'1'8'D'D
 
 
 	5$777rl   c                  t          |||          }|j                            |          }t          |j                   t          |                                          }| j                            |||dd|f          S )Nr   outerr  r  )r   r   r   r    rg   r   r   r  )ri   r   r  r  r  right_on_mapperother_nativeright_suffixeds           rj   
_join_fullzPandasLikeDataFrame._join_fulla  s     06JJ|**?*CC%l&:;;;o446677{  #&\ ! 
 
 	
rl   c                  | j         }| j        }|                                s.|                                s|                                r|dk     ryt          dg | j        |j        R           } | j        j        di |di	                     |j        j        di |did||d|f          }|
                    |d	           |S | j        	                    |j        d
d|f          S )N)r         n_bytesrg   r   r  r  r  Tr  cross)r  r  r   )re   rv   ru   ry   rs   r"   rg   r   assignr  r  )ri   r   r  r]   backend_version	key_tokenr  s          rj   _join_crosszPandasLikeDataFrame._join_crossq  s)   -/##%% 	!)?)?)A)A 	!$$&&	!+:V+C+C6#BT\#BEM#B#B  I /DK.@@)Q@@FF##55y!n55!"f G  M y$???  {  7b&\ RRRrl   c          
         |                      |t          |          t          t          ||                              }| j                            |d||          S )Nr   columns_to_selectcolumns_mappingr  r  r  r  )_join_filter_renamer   r*  r+  r   r  )ri   r   r  r  r  s        rj   
_join_semizPandasLikeDataFrame._join_semi  si     //"8nn Xw!7!788 0 
 

 {  gw ! 
 
 	
rl   c          
        | j         }|                                r#| j                            |j        d||          S t	          dg | j        |j        R           |                     |t          |          t          t          ||                              }| j                            ||
                                rdnd||          j        fd	         }|                    d
           |S )Nleftantir  r  r  r  r  r  )r  	indicatorr  r  c                    |          dk    S )N	left_onlyr   )tindicator_tokens    rj   <lambda>z0PandasLikeDataFrame._join_anti.<locals>.<lambda>  s    /*k9 rl   Tr  )re   ry   r   r  r"   rg   r  r   r*  r+  rs   r	  r  )ri   r   r  r  r]   r  r  r  s          @rj   
_join_antizPandasLikeDataFrame._join_anti  s.    -!!## 	;$$*g %    9>>>>
 
 
 //"8nn Xw!7!788 0 
 

 ))(2244A'% * 
 
 9999; 	?DAAArl   r  r  dict[str, str]c                    | j         }t          t          |j        ||          ||                                          S )zHelper function to avoid creating extra columns and row duplication.

        Used in `"anti"` and `"semi`" join's.

        Notice that a native object is returned.
        )r4  r]   r{  )re   r   r   r   drop_duplicates)ri   r   r  r  r]   s        rj   r  z'PandasLikeDataFrame._join_filter_rename  sU     -".-  
 $)
 
 
 /

	rl   r  rA   c                  |dk    r|                      ||          }n||t          ||          |dk    r|                     ||||          }n|dk    r|                     |||          }nn|dk    r|                     |||          }nO|dk    r|                     ||||          }n/|d	k    r|                     ||||          }nt          |           |                     |          S )
Nr  )r   r  r  )r   r  r  r  anti)r   r  r  semir  full)	r  r  r  r  r  r  r  r   r   )ri   r   r  r  r  r  results          rj   joinzPandasLikeDataFrame.join  s3    '>>%%E&%AAFF_ 0Wh///G^^%%Wx &  FF F]]__5'H_UUFFF]]__5'H_UUFFF]]__Wx %  FF F]]__Wx %  FF   (((rl   by_leftby_rightstrategyr>   c                   |                                  }|                     |                    | j        |j        |||||d|f                    S )Nr  )r  r  left_byright_by	directionr  )r   r   
merge_asofr   )	ri   r   r  r  r  r  r  r  rK  s	            rj   	join_asofzPandasLikeDataFrame.join_asof  sc     ''))  NN!!"f  	 	
 
 	
rl   nc                `    |                      | j                            |          d          S r   )r   r   r  ri   r  s     rj   r  zPandasLikeDataFrame.head  +      !1!1!!4!4E RRRrl   c                `    |                      | j                            |          d          S r   )r   r   tailr  s     rj   r  zPandasLikeDataFrame.tail	  r  rl   )maintain_orderkeeprF   r  c               R   ddd                     ||          }|r|                     |          x}r||r|rt          d| j                  } |                     |d           j        |dddj                            |p| j        |                              |          }|	                    |d	           nU|r0 | j        |dddj                            |p| j        |          }n#| j                            |p| j        |          }| 
                    |d
          S )NFr  )noneanyr  )rV  )r  rZ  r  Tr  r   )get_check_columns_existr"   rg   rg  r  r   r  r  r  r   )	ri   rA  r  r  rV  mapped_keeperrortokenress	            rj   uniquezPandasLikeDataFrame.unique  si     %W5599$EE 	 9 9& A AAu 	K 	X 	X21dlCCE##ED#99xEeE E E(>$,[QQU##	  HHUDH1111 	X$)e  __V%;t|+_NN C +--f.D;-WWC  E BBBrl   )session_LazyAllowedImpl | Noner  SparkSession | Noner1   c                  |                                  }|| S |t          j        u r0dd l}ddlm}  ||                    d          d| j                  S |t          j        u r=dd l	}ddl
m}  | |j        |                                          d| j                  S |t          j        u r2dd lm} ddlm}	  |	|                    |          d| j                  S |t          j        u r7dd l}
dd	lm}  ||
                    || j        
          d| j                  S |                                r@ddlm} |d}t9          |           ||                    |          | j        |d          S t<          )Nr   )DuckDBLazyFrame	pandas_dfTr  )PolarsLazyFrame)DaskLazyFrame)r\   r[   r^   )IbisLazyFramer   )r[   r^   )SparkLikeLazyFramez5Spark like backends require `session` to be not None.)r^   r]   r[   )rt   r   DUCKDBduckdbnarwhals._duckdb.dataframer  tablerf   r  polarsr  r  from_pandaslazyDASKdask.dataframe	dataframenarwhals._dask.dataframer  IBISibisnarwhals._ibis.dataframer  memtablerg   is_spark_likenarwhals._spark_like.dataframer  r  createDataFramer|   )ri   r   r  r  r  r  plr  ddr  r  r  r  r   s                 rj   r  zPandasLikeDataFrame.lazy+  s!    NN$$	?Kn+++MMMBBBBBB"?<<,,)-   
 n+++BBBBBB"?!2>),,1133)-   
 n)))''''''>>>>>> =!#	!:!:)-   
 n)))KKK>>>>>> =i>>)-      "" 	IIIIIIM oo%%%''	22&)-	    rl   tuple[int, int]c                    | j         j        S rc   )r   shaper   s    rj   r(  zPandasLikeDataFrame.shapem  s    {  rl   	as_seriesdict[str, Any]c               d     |r fd j         D             S  j                            d          S )Nc                T    i | ]$}|t          j        j        |                    %S )rr   r   r   r   ri   s     rj   r   z/PandasLikeDataFrame.to_dict.<locals>.<dictcomp>s  sC        %1$+c2BDQQQ  rl   r   r  )rg   r   r!  )ri   r)  s   ` rj   r!  zPandasLikeDataFrame.to_dictq  sS     	   <    {""&"111rl   c               D     j         j        } j        t          j        u |                    t                                                    r9| j                             |          S  j                                       S  j	        j        j
        fd j                                        D             }|re                                                       j        | j                            d          j                            d                     j         }n j         }||                    |          S |D ]B}t'          |          t(          v r*t+          j         fd j        D                       }|c S C|                              S )Nr   r   c                H    g | ]\  }}t          |          r	|j        |S rc   )r   	time_zone)r   keyvaldtype_datetimes      rj   r  z0PandasLikeDataFrame.to_numpy.<locals>.<listcomp>  sC     
 
 
S#~..
 47=3L 3L3L3Lrl   UTCc                x    g | ]6}                     |                              d           d d d f         7S )N)r   r   )r   r   )r   r   r   ri   s     rj   r  z0PandasLikeDataFrame.to_numpy.<locals>.<listcomp>  sV        ,,554t5LLQQQPTWU  rl   )r   r   re   r   r   isinrW   rd  r   rf   Datetimer   r   rw  r   r   dtconvert_time_zonereplace_time_zoner   r   r   hstackrg   )	ri   r   r   r1  
to_convertr   	col_dtypearrr3  s	   ` `     @rj   r   zPandasLikeDataFrame.to_numpyy  s   *<'>+>>D45599;; 	3 {++%d+CCC;''T'222-6
 
 
 
 K--//
 
 


  	""++--j"%%e,,%%d++	 
  B B;;U;666 ' 	 	I9~~!>>>9    #'<    


 ? {{{%%%rl   c                   | j         t          j        u r| j        S | j         t          j        u r| j                                        S | j         t          j        u r| j                                        S d| j          }t          |          )NzUnknown implementation: )	re   r   r   r   r   rt   r   
_to_pandasr|   r   s     rj   rt   zPandasLikeDataFrame.to_pandas  s    >#888;>#666;((***>#777;))+++?)=??S!!!rl   pl.DataFramec                N    dd l } |j        |                                           S r   )r  r  rt   )ri   r$  s     rj   r  zPandasLikeDataFrame.to_polars  s*    r~dnn..///rl   filestr | Path | BytesIOc                :    | j                             |           d S rc   )r   
to_parquetri   rC  s     rj   write_parquetz!PandasLikeDataFrame.write_parquet  s    t$$$$$rl   c                    d S rc   r   rG  s     rj   	write_csvzPandasLikeDataFrame.write_csv  s    ,/Crl   c                    d S rc   r   rG  s     rj   rJ  zPandasLikeDataFrame.write_csv  s    =@Srl   str | Path | BytesIO | None
str | Nonec                :    | j                             |d          S )NFr)  )r   to_csvrG  s     rj   rJ  zPandasLikeDataFrame.write_csv  s    {!!$e!444rl   c                b    t          j        | j                            d           |           S )NFr   rr   )r   r}   r   
duplicatedr   s    rj   	is_uniquezPandasLikeDataFrame.is_unique  s7    +[###///
 
 
 	
rl   r  
int | Nonecolumnint | str | Nonec                *   |8|6| j         dk    rd| j         }t          |          | j        j        d         S ||d}t          |          t	          |t
                    r| j                            |          n|}| j        j        ||f         S )N)r   r   zycan only call `.item()` if the dataframe is of shape (1, 1), or if explicit row/col values are provided; frame has shape )r   r   z8cannot call `.item()` with only one of `row` or `column`)r(  r  r   r   r   r   rg   r   )ri   r  rT  r   _cols        rj   itemzPandasLikeDataFrame.item  s    ;6>zV##7(,
7 7 
 !oo%;#D));&.LCS//!-7-D-DPt|!!&)))&{T	**rl   c                ^    |                      | j                                        d          S r   )r   r   r   r   s    rj   clonezPandasLikeDataFrame.clone  s)      !1!1!3!35 QQQrl   offsetc                V    |                      | j        j        |d |         d          S r   r  )ri   r  r[  s      rj   gather_everyz PandasLikeDataFrame.gather_every  s,      !1&)!)!<TY ZZZrl   onr   #tuple[Sequence[str], Sequence[str]]c                   |p%|rt          | h ||          nt          | |          }|pt          | h ||          }||fS rc   )r!   )ri   r^  r   r   s       rj   _pivot_into_index_valuesz,PandasLikeDataFrame._pivot_into_index_values  sg      
0 ~~f~666%dB// 	
 D/mmUmDDf}rl   unique_valuestuple[str, ...]c               P    d\  }}}d                     |           }| | | | | S )N){}"z",")r  )rb  LBRBQbodys        rj   _pivot_multi_on_namez(PandasLikeDataFrame._pivot_multi_on_name  s>    !	Bzz-((&a&&q&"&&&rl   n_values	separatorc               D    |dk    rfd| D             S d | D             S )Nr   c                ^    g | ])}                     |                                          *S r   )r  strip)r   r   rn  s     rj   r  z>PandasLikeDataFrame._pivot_single_on_names.<locals>.<listcomp>  s1    HHHCINN3''--//HHHrl   c                    g | ]
}|d          S )r   r   s     rj   r  z>PandasLikeDataFrame._pivot_single_on_names.<locals>.<listcomp>  s    000CB000rl   r   )r4  rm  rn  s     `rj   _pivot_single_on_namesz*PandasLikeDataFrame._pivot_single_on_names  s<     a<<HHHH<HHHH00<0000rl   Iterable[tuple[str, ...]]n_onIterator[str]c             #     K   |dk    rF|D ]A}|| d          }|d         }|                     ||                     |          f          V  Bd S |D ]"}|                     || d                    V  #d S )Nr   r   )r  rl  )ri   r4  rv  rm  rn  r   namesprefixs           rj   _pivot_multi_on_namesz)PandasLikeDataFrame._pivot_multi_on_names  s       a<<# Q QTEFFQnnfd.G.G.N.N%OPPPPPPQ Q
 $ = =//TEFF<<<<<<= =rl   Iterable[Any]c                   |dk    r|                      |||          S t          |                     ||||                    S )zReformat output column names from a native pivot operation, to match `polars`.

        Note:
            `column_names` is a `pd.MultiIndex`, but not in the stubs.
        r   )rt  r   r{  )ri   r4  rv  rm  rn  s        rj   _pivot_remap_column_namesz-PandasLikeDataFrame._pivot_remap_column_names  sG     199..|XyQQQD..|T8YWWXXXrl   aggregate_function?Literal['min', 'max', 'first', 'last', 'sum', 'mean', 'median']c          	     d    | j         t          j        u ri nddi} | j        j        d||||dd|S )NobservedTF)r   r   rg   aggfuncmarginsr   )re   r   r   r   pivot_table)ri   r^  r   r   r  r  s         rj   _pivot_tablez PandasLikeDataFrame._pivot_table  sd     &.*===BBJPTCU 	 't{& 
&
 
 
 
 	
rl   PivotAgg | Nonec               @   || j                             |||          S |dk    rb| j                             g ||d                              t                              |d                                        |||          S |                     ||||          S )N)rg   r   r   r   F)as_indexre  )r   pivotgroupbyaggr*  fromkeysr  )ri   r^  r   r   r  s        rj   _pivotzPandasLikeDataFrame._pivot1  s     %;$$RuV$LLL&&##MbM5ME#BBT]]662233rv>>
   UF4FGGGrl   sort_columnsc               V     j         }|                                rd}t          |                               |||          \  }}                     ||||          }	|r fd|D             n fd|D             }
t          t          |gt          |
          R            }|	j        d d |f         }	|	j	        } 
                    |t          |          t          |          |          }||	_	        dg|	j	        _                             |	                                          S )Nzcpivot is not supported for Modin backend due to https://github.com/modin-project/modin/issues/7409.c              3     K   | ]R}                     |                                                              d d                                           V  SdS )F)rZ  r  N)r   r  r  to_listr-  s     rj   r   z,PandasLikeDataFrame.pivot.<locals>.<genexpr>W  sh        
 	 $$599	     rl   c              3     K   | ]=}                     |                                                                          V  >d S rc   )r   r  r  r-  s     rj   r   z,PandasLikeDataFrame.pivot.<locals>.<genexpr>_  sG      HHc$//#&&--//7799HHHHHHrl   )rv  rm  rn  r  )re   ru   NotImplementedErrorra  r  r   r	   r   r	  rg   r~  r   ry  r   reset_index)ri   r^  r   r   r  r  rn  r]   r   r  uniquesordered_colsrg   remappeds   `             rj   r  zPandasLikeDataFrame.pivotC  sb    -""$$ 	+wC%c***55b%HHvR0BCC I    
     IHHHRHHH 	 GF<U7^^<<<==AAA|O,.11#b''CKK9 2 
 
 " "t  !3!3!5!5666rl   c                    | j         t          j        u r| j                            d          S dd l}|j                            | j                  S )NF)preserve_indexr   )re   r   r   r   r  pyarrowTabler  )ri   pas     rj   r  zPandasLikeDataFrame.to_arrowk  sP    >#666;''u'===x##DK000rl   fractionfloat | Nonewith_replacementseedc               h    |                      | j                            ||||          d          S )N)r  fracreplacerandom_stateFr   )r   r   sample)ri   r  r  r  r  s        rj   r  zPandasLikeDataFrame.samples  sJ       K(,<4    #(	 ! 
 
 	
rl   variable_name
value_namec                d    |                      | j                            ||||                    S )N)id_vars
value_varsvar_namer  )r   r   melt)ri   r^  r   r  r  s        rj   unpivotzPandasLikeDataFrame.unpivot  sB       K&%	   
 
 	
rl   c                2   | j         j        }|                                 }D ]*}||         }||j        k    rd| d}t	          |          +t                    dk    r5|                     | j                            d                   d          S | j        d                  j	                                        t          fddd          D                       sd}t          |          | j        }fd	|D             }g |d                                      d                   }	fd
dd          D             }
|                                 }|                     |                    |	g|
d          |         d          S )Nz-`explode` operation not supported for dtype `z`, expected List typer   r   Fr   c              3     K   | ]9}|         j                                         k                                    V  :d S rc   )r   r   rd  )r   col_nameanchor_seriesnative_frames     rj   r   z.PandasLikeDataFrame.explode.<locals>.<genexpr>  s\       
 
 (#(,,..-?DDFF
 
 
 
 
 
rl   z2exploded columns must have matching element countsc                    g | ]}|v|	S r   r   )r   crg   s     rj   r  z/PandasLikeDataFrame.explode.<locals>.<listcomp>  s#    IIIq8H8H8H8H8Hrl   c                h    g | ].}|                                                                          /S r   )explodeto_frame)r   r  r  s     rj   r  z/PandasLikeDataFrame.explode.<locals>.<listcomp>  sC     
 
 
<DL"**,,5577
 
 
rl   rD  )rf   r   r3  Listr(   r   r   r   r  r   rd  r)   rg   r   concat)ri   rg   r   r   col_to_exploder   r   original_columnsother_columnsexploded_frameexploded_seriesrK  r  r  s    `          @@rj   r  zPandasLikeDataFrame.explode  s   %$$&&% 	1 	1N>*E##)E ) ) )  ,C000 $ w<<1$$##GAJ//u %    {$WQZ0599;; 
 
 
 
 
#ABBK
 
 
 
 
 	" GCS//!<IIII$4III%&B&Bwqz&BCKKGTUJWW
 
 
 
HOPQPRPR
 
 
 ''))  JJ99JBBCST"' ! 
 
 	
rl   )r\   r   r]   r   r^   r;   r_   rU   r[   rU   r`   ra   )rm   r8   rn   r<   r`   r-   )rm   r   rn   r<   r   r   r`   r-   )rm   r   rn   r<   r   r   r`   r-   )r   r   r`   r   )rm   r   rn   r<   r`   r-   )rm   rG   rn   r<   r   r   r`   r-   )r`   r-   )r`   r6   )r`   r,   )r`   r   )r^   r;   r`   r-   )r   r   r_   rU   r`   r-   )r   r   r`   r   )r   r   r`   r   rc   )r   r   r   r   r`   rG   )r   r   r`   r-   )r   r   r`   r-   )rg   rI   r`   r-   )rg   r   r`   r-   )rg   r   r`   r-   )rg   r  r`   r-   )r`   r  )r  r  r`   r  )r  r  r`   r  )r  rU   r`   r  )r`   r"  )r  rU   r&  r   r`   r'  )r`   r.  )r4  r   r`   r-   )r7  r2   r`   r-   )rA  rB  r`   r-   )rN  rE   r`   rO  )r   r   rV  rB  r`   r-   )r   r   r`   rh  )rl  r2   r`   r-   )rx  ry  r`   r-   )rg   r|  r}  rU   r`   r-   )r  r   rZ  r  r  rU   r`   r-   )r  r   r  r  r  r  r`   r-   )r   r  r  r   r`   r0   )r   r  r  rU   r`   r4   )
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   r-   r  r  r  r  r`   r  )r   r-   r  rA   r  rB  r  rB  r  r   r`   r-   )r   r-   r  r   r  r   r  rB  r  rB  r  r>   r  r   r`   r-   )r  r   r`   r-   )
rA  rB  r  rF   r  r   rV  rB  r`   r-   )r   r	  r  r
  r`   r1   )r`   r&  )r)  rU   r`   r*  )r`   r  )r`   rA  )rC  rD  r`   ra   )rC  ra   r`   r   )rC  rL  r`   rM  )r`   r   )r  rS  rT  rU  r`   r   )r  r   r[  r   r`   r-   )r^  r|  r   rB  r   rB  r`   r_  )rb  rc  r`   r   )r4  r  rm  r   rn  r   r`   r  )
r4  ru  rv  r   rm  r   rn  r   r`   rw  )
r4  r|  rv  r   rm  r   rn  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|  r   rB  r   rB  r  r  r  rU   rn  r   r`   r-   )r`   r   )
r  rS  r  r  r  rU   r  rS  r`   r-   )
r^  rB  r   rB  r  r   r  r   r`   r-   )rg   r|  r`   r-   )X__name__
__module____qualname__rk   classmethodrq   r   r   staticmethodr   r}   r   r   r   r   r   r   r   r   r   propertyr   r   r   r   r   r   r  r  r
  rg   r   r   r%  _iter_columnsr-  r   r3  r6  r@  rM  rU  rg  r  rJ  rw  r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r(  r!  r   rt   r  rH  rJ  rR  rX  rZ  r]  ra  rl  rt  r{  r~  r  r  r  r  r  r  r  r   rl   rj   rY   rY   c   s        */- - - - - -" 8 8 8 [8. #8 #8 #8 [#8J 8 8 8 [80 - - - \- 
 
 
 [
 8 8 8 [80      P P P P
	" 	" 	" 	"       
 
 
 
 FJ 
 
 
 
 
 

 
 
 
 9 9 X9M M M M5$ 5 5 5 5 5 5= = = =
 
 
 

 
 
 
 
 
 
 


 
 
 
> > > > , , , X, HHH XHJJJ XJWWW XW	5 	5 	5 	5E E E E !M
0 
0 
0 
0 
 
 
 X
   
 
 
 

A 
A 
A 
A! ! ! !* * * *1 1 1 1 9 9 9 9
 
 
 
B B B B(
 
 
 


 
 
 


 

 

 



 

 

 

' ' ' 'TL L L L	
 	
 	
 	
   (
 
 
 
 S S S S,

 

 

 

   @   (") ") ") ")H
 
 
 
6S S S SS S S S '+C C C C C CB ,0@ (,	@ @ @ @ @ @D ! ! ! X!2 2 2 2-& -& -& -& -& -& -&^" " " "0 0 0 0
% % % % /// X/@@@ X@5 5 5 5
 
 
 

+ + + +$R R R R[ [ [ [    ' ' ' \'
 1 1 1 \1= = = ="
Y 
Y 
Y 
Y
 
 
 
,H H H H$&7 &7 &7 &7P1 1 1 1
 
 
 

 
 
 
 (
 (
 (
 (
 (
 (
rl   rY   )r   r2   r   r   )i
__future__r   collections.abcr   r   r   r   	itertoolsr   r	   typingr
   r   r   r   r   r   r   r   narwhals._compliantr   narwhals._pandas_like.seriesr   r   narwhals._pandas_like.utilsr   r   r   r   r   r   r   r   r   narwhals._typing_compatr   narwhals._utilsr   r   r   r    r!   r"   r#   r$   r%   narwhals.dependenciesr'   narwhals.exceptionsr(   r)   ior*   pathlibr+   typesr,   pandaspdr  r$  typing_extensionsr-   r.   r/   narwhals._compliant.typingr0   r1   narwhals._pandas_like.exprr2   r  r4   r   r6   narwhals._spark_like.utilsr7   narwhals._translater8   narwhals._typingr9   r:   r;   r<   narwhals.dtypesr=   narwhals.typingr>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   r{   rJ   __annotations__	frozensetr   rW   rY   r   rl   rj   <module>r     sP   " " " " " " " A A A A A A A A A A A A $ $ $ $ $ $ $ $ H H H H H H H H H H H H H H H H     . . . . . . X X X X X X X X
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 1 0 0 0 0 0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 ; : : : : : A A A A A A A A !9      9999999999WWWWWWWW999999@@@@@@CCCCCC777777222222DDDDDDDD88888888%%%%%%                            &c2<&78K8888 4=9!!!""!""!""!"""##"##"##)4 4     4W
 W
 W
 W
 W
PQW
 W
 W
 W
 W
rl   