
    !g@p              
          d Z ddlmZ ddlZd Zd Zd Zd3dZd3dZ	d4d	Z
d5d
Zd6dZd Zd6dZ G d d      Zd Z G d d      Z G d d      Zedk(  r0 e       Zej+                          ej-                          ej/                          ddlmZ g dd   Zg dZddgZ e
ee      Z ee        ej@                  d      Z! ej@                  d      dz  Z" ej@                  d      dz  dz  Z#dev r ee"      \  Z$Z% ee#      \  Z&Z'd ev r* ejP                  e"d!d"      Z" ejP                  e#d!d"      Z#e"jR                  d   Z* ee"      \  Z$Z% ee#      \  Z&Z' ee$e&d#      Z+ ee$e&d$#      Z, ee$e&d%#      Z- e ej\                  e+j^                  e+       ej`                  e+jc                  d            k(  je                                d&d'gd   Z3d(d)gd   Z4e4ejj                  jm                  e*      z  Z7e3 ej@                  dd*      z  Z8e+e8z  jc                  d      e7z   Z9e,e8z  jc                  d      e7z   Z:e-e8z  jc                  d      e7z   Z; ejx                  e9e+      j{                         Z> ejx                  e9e-      j{                         Z?e>j                  ZAe?j                  ZB ejx                  e;e+      j{                         ZC ejx                  e;e-      j{                         ZDeCj                  ZEeDj                  ZFej                  j                  e-e+d+,      d   ZIej                  j                  e+e-d+,      d   ZJ e ej\                  eJeF      eEz
          e ej\                  eIeA      eBz
          ee+e-      ZK e ej                   ej                  e+eKj                  e-      z
                      e ej                   ej                  e-eKj                  e+      z
                      e ej                   ej                  eFeKj                  eE      z
                      ej                   ej                  eBeKj                  eA      z
                e
ee      \  ZQZRZSZTZUZV ed-        ed.        eeS        eeCj                  eR      j                          ed/        ed0        eeU        eeCj                  eT      j                         eCj                  eT        ej                   ej                  d1       ej                  d      f      Z]e?j                  d2d Z_e>j                  eKj                  e]            j                  Z` e ej                   ej                  e_e`z
                      ee;e"e#      Za eeaj                         j                          eeaj                         j                          eeaj                         j                          eeaj                         j                          eeaj                  d      d   j                          eeaj                  d      d   j                          eeaj                                	 y)7a  functions to work with contrasts for multiple tests

contrast matrices for comparing all pairs, all levels to reference level, ...
extension to 2-way groups in progress

TwoWay: class for bringing two-way analysis together and try out
various helper functions


Idea for second part
- get all transformation matrices to move in between different full rank
  parameterizations
- standardize to one parameterization to get all interesting effects.

- multivariate normal distribution
  - exploit or expand what we have in LikelihoodResults, cov_params, f_test,
    t_test, example: resols_dropf_full.cov_params(C2)
  - connect to new multiple comparison for contrast matrices, based on
    multivariate normal or t distribution (Hothorn, Bretz, Westfall)

    )assert_equalNc                     g }t        |       D ]F  }t        |dz   |       D ]2  }t        j                  |       }d||<   d||<   |j                  |       4 H t        j                  |      S )zcontrast or restriction matrix for all pairs of nm variables

    Parameters
    ----------
    nm : int

    Returns
    -------
    contr : ndarray, 2d, (nm*(nm-1)/2, nm)
       contrast matrix for all pairwise comparisons

       )rangenpzerosappendarray)nmcontrij	contr_rows        e/var/www/dash_apps/app1/venv/lib/python3.12/site-packages/statsmodels/sandbox/stats/contrast_tools.pycontrast_allpairsr      sp     E2Y $qsB 	$AIIaLIaLLL#		$$ 88E?    c                     t        j                  t        j                  | dz
        t        j                  | dz
         f      }|S )zcontrast or restriction matrix for all against first comparison

    Parameters
    ----------
    nm : int

    Returns
    -------
    contr : ndarray, 2d, (nm-1, nm)
       contrast matrix for all against first comparisons

    r   )r   column_stackoneseye)r   r   s     r   contrast_all_oner   5   s6     OORWWRT]RVVBqD\M:;ELr   c                 b    t        j                  |       t        j                  | | f      | z  z
  S )zcontrast or restriction matrix for all against mean comparison

    Parameters
    ----------
    nm : int

    Returns
    -------
    contr : ndarray, 2d, (nm-1, nm)
       contrast matrix for all against mean comparisons

    )r   r   r   )r   s    r   contrast_diff_meanr   E   s)     66":B(+++r   c                     | dv r:|st        j                  |       dk\  rdS dS t        j                  |       dk\  rdS dS t        |       S )N)r   r   r   r   +- )r   signstr)xnopluss     r   signstrr#   T   sG    H}''!*a-30S0Q2/C/1vr   c                    |rt        d d d      }nt        d       }| D cg c]G  }dj                  t        ||      |   D cg c]  \  }}|dk7  rt        |d       |  c}}      I }}}}|S c c}}w c c}}}w )Nr   r   r   Tr"   )slicejoinzipr#   )	contrastsnamesreverseslrowcvlabelss           r   contrast_labelsr1   ^   s    4r"4[ )23 3!$ gg%(e_R%8D!aAF "!D121#6 D E 3F 3 MD 3s   "A: A4$
A:4A:c                    t        |       }t        |      }| D cg c]  }|D ]	  }| d|   }	}}t        j                  d|f      }
d|
d<   |s t        j                  |
t	        |       f   }nt        j                  |
t        |       f   }t        j                  |dd t        j                  |            }t        ||	d      }|D cg c]J  }dj                  t        ||	      ddd   D cg c]  \  }}|d	k7  rt        |d
       |  c}}      L }}}}t        j                  d|f      }d|d<   |s t        j                  |t	        |       f   }nt        j                  |t        |       f   }t        j                  t        j                  |      |dd       }|D cg c]J  }dj                  t        ||	      ddd   D cg c]  \  }}|d	k7  rt        |d
       |  c}}      L }}}}|+|)t        |      \  }}t        |      \  }}t        ||      }nd}|	|||||fS c c}}w c c}}w c c}}}w c c}}w c c}}}w )a  build contrast matrices for products of two categorical variables

    this is an experimental script and should be converted to a class

    Parameters
    ----------
    names1, names2 : lists of strings
        contains the list of level labels for each categorical variable
    intgroup1, intgroup2 : ndarrays     TODO: this part not tested, finished yet
        categorical variable


    Notes
    -----
    This creates a full rank matrix. It does not do all pairwise comparisons,
    parameterization is using contrast_all_one to get differences with first
    level.

    ? does contrast_all_pairs work as a plugin to get all pairs ?

    _r   )r   r   NT)r+   r   r   r   r%   )lenr   r	   r_r   r   kronr   r1   r'   r(   r#   dummy_1ddummy_product)names1names2	intgroup1	intgroup2pairsn1n2r   r   
names_prodee1ddcontrast_prodnames_contrast_prod0r-   r.   r/   names_contrast_prodee2dd2contrast_prod2names_contrast_prod2d1r3   d2dummys                             r   contrast_productrM   h   s   . 
VB	VB&,=f=QCq*=*=J=
((Ab6
CCHUU3)"---.UU3*2.../GGBqrFBFF2J/M*=*dS -:; ;%( 77),S*)=dd)C$O"%!AqAv (/q'>&?s$C $O P ; ; ((Ab6
CCHeeC*2.../eeC+B///0WWRVVBZQR1N -;< <%( GG),S*)=dd)C%O"%!AqAv )0$(?'@%D %O P < < 	I$9#A#Ab"%':&(<eE EE >$O ;%O <s5   H=%I	6 I
I	3%I I8
II	Ic                    |qt        | j                         dz         D cg c]  }d|z  	 }}| dddf   t        j                  | j                         dz         k(  j	                  t
              |fS t        j                  |       }|D cg c]  }|dt        |      z  z    }}| dddf   |k(  j	                  t
              |fS c c}w c c}w )a  dummy variable for id integer groups

    Parameters
    ----------
    x : ndarray, 1d
        categorical variable, requires integers if varname is None
    varname : str
        name of the variable used in labels for category levels

    Returns
    -------
    dummy : ndarray, 2d
        array of dummy variables, one column for each level of the
        category (full set)
    labels : list[str]
        labels for the columns, i.e. levels of each category


    Notes
    -----
    use tools.categorical instead for more more options

    See Also
    --------
    statsmodels.tools.categorical

    Examples
    --------
    >>> x = np.array(['F', 'F', 'M', 'M', 'F', 'F', 'M', 'M', 'F', 'F', 'M', 'M'],
          dtype='|S1')
    >>> dummy_1d(x, varname='gender')
    (array([[1, 0],
           [1, 0],
           [0, 1],
           [0, 1],
           [1, 0],
           [1, 0],
           [0, 1],
           [0, 1],
           [1, 0],
           [1, 0],
           [0, 1],
           [0, 1]]), ['gender_F', 'gender_M'])

    Nr   zlevel_%dz_%s)r   maxr   arangeastypeintuniquer    )r!   varnamer   r0   grouplabelss        r   r7   r7      s    \ */!*<=Q*q.==!D&	299QUUWQY//77<fDDiil4?@q'ECFN*@@!D&	;&..s3V;; > As   CCfullc                 f   |dk(  r8| dddddf   |dddddf   z  j                  | j                  d   d      }|S |dk(  rpt        | ddddf   |ddddf         }t        j                  t        j
                  | j                  d   t              | ddddf   |ddddf   |f      }|S |dk(  rpt        | ddddf   |ddddf         }t        j                  t        j
                  | j                  d   t              | ddddf   |ddddf   |f      }|S t        d      )	a  dummy variable from product of two dummy variables

    Parameters
    ----------
    d1, d2 : ndarray
        two dummy variables, assumes full set for methods 'drop-last'
        and 'drop-first'
    method : {'full', 'drop-last', 'drop-first'}
        'full' returns the full product, encoding of intersection of
        categories.
        The drop methods provide a difference dummy encoding:
        (constant, main effects, interaction effects). The first or last columns
        of the dummy variable (i.e. levels) are dropped to get full rank
        dummy matrix.

    Returns
    -------
    dummy : ndarray
        dummy variable for product, see method

    rV   Nr   r   	drop-last
drop-firstr   method not recognized)reshapeshaper8   r   r   r   rR   
ValueError)rJ   rK   methodrB   d12rld12rs         r   r8   r8      s:   . 1Tl2aQh<'00!R@ I 
;	b3B3iAcrcE3__bggbhhqk37AcrcEBq"uIeTU I 
<	R!"Xr!AB$x0__bggbhhqk37AabD2ad8DQR I 011r   c                 .   | j                   \  }}t        j                  t        j                  | d      dk(        \  }}t        j                  t        j                  | d      dk(        \  }}t        j                  |      }t        j
                  dg|f   |k(  j                         r*t        j
                  ||dz
  gf   |k(  j                         st        d      t        j
                  dg|dz   f   }t        j
                  |dz   |gf   }	||	fS )a  start and endpoints of groups in a sorted dummy variable array

    helper function for nested categories

    Examples
    --------
    >>> d1 = np.array([[1, 0, 0],
                       [1, 0, 0],
                       [1, 0, 0],
                       [1, 0, 0],
                       [0, 1, 0],
                       [0, 1, 0],
                       [0, 1, 0],
                       [0, 1, 0],
                       [0, 0, 1],
                       [0, 0, 1],
                       [0, 0, 1],
                       [0, 0, 1]])
    >>> dummy_limits(d1)
    (array([0, 4, 8]), array([ 4,  8, 12]))

    get group slices from an array

    >>> [np.arange(d1.shape[0])[b:e] for b,e in zip(*dummy_limits(d1))]
    [array([0, 1, 2, 3]), array([4, 5, 6, 7]), array([ 8,  9, 10, 11])]
    >>> [np.arange(d1.shape[0])[b:e] for b,e in zip(*dummy_limits(d1))]
    [array([0, 1, 2, 3]), array([4, 5, 6, 7]), array([ 8,  9, 10, 11])]
    r   axisr   r   zdummy variable is not sorted)r\   r   nonzerodiffrP   r5   allr]   )
dnobsnvarsstart1col1end1col1_ccstartends
             r   dummy_limitsrq     s    : ''KD%::bggaQ/23LFD**RWWQA.23KD%	5	BeeQCI"$))+UU557)+,2779788EE1#vax- E
%%Q
C#:r   c                    |dk(  r|S t        |       \  }}t        |      \  }}t        j                  ||      }t        j                  ||      }||k(  }	| |	 z  }
| |	 z  }|dk(  rlt        | ddddf   |ddddf         }t        j                  t        j
                  | j                  d   t              | ddddf   |dd|f   f      }n||dk(  rlt        | ddddf   |ddddf         }t        j                  t        j
                  | j                  d   t              | ddddf   |dd|
f   f      }nt        d      ||
|fS )	a  unfinished and incomplete mainly copy past dummy_product
    dummy variable from product of two dummy variables

    Parameters
    ----------
    d1, d2 : ndarray
        two dummy variables, d2 is assumed to be nested in d1
        Assumes full set for methods 'drop-last' and 'drop-first'.
    method : {'full', 'drop-last', 'drop-first'}
        'full' returns the full product, which in this case is d2.
        The drop methods provide an effects encoding:
        (constant, main effects, subgroup effects). The first or last columns
        of the dummy variable (i.e. levels) are dropped to get full rank
        encoding.

    Returns
    -------
    dummy : ndarray
        dummy variable for product, see method

    rV   rX   Nr   r   rY   r   rZ   )	rq   r   in1dr8   r   r   r\   rR   r]   )rJ   rK   r^   rj   rl   start2end2firstlastequal	col_dropf	col_droplr_   rB   r`   s                  r   dummy_nestedr{   2  sU   , 	#LFD#LFDGGFF#E774Dd]EvIufI b3B3iAcrcE3__bggbhhqk37AcrcEBq{OTU	<	R!"Xr!AB$x0__bggbhhqk37AabD2a	k?ST011y)##r   c                   .    e Zd ZdZd Zd Zd Zd Zd Zy)DummyTransforma  Conversion between full rank dummy encodings


    y = X b + u
    b = C a
    a = C^{-1} b

    y = X C a + u

    define Z = X C, then

    y = Z a + u

    contrasts:

    R_b b = r

    R_a a = R_b C a = r

    where R_a = R_b C

    Here C is the transform matrix, with dot_left and dot_right as the main
    methods, and the same for the inverse transform matrix, C^{-1}

    Note:
     - The class was mainly written to keep left and right straight.
     - No checking is done.
     - not sure yet if method names make sense


    c                     t         j                  j                  ||d      d   | _        t         j                  j                  ||d      d   | _        y)z\C such that d1 C = d2, with d1 = X, d2 = Z

        should be (x, z) in arguments ?
        r   rcondr   N)r   linalglstsqtransf_matrixinvtransf_matrix)selfrJ   rK   s      r   __init__zDummyTransform.__init__  sD    
  YY__R2_>qA "		Bb A! Dr   c                 B    t        j                  | j                  |      S )z b = C a
        r   dotr   )r   as     r   dot_leftzDummyTransform.dot_left  s     vvd((!,,r   c                 B    t        j                  || j                        S )z z = x C
        r   )r   r!   s     r   	dot_rightzDummyTransform.dot_right  s     vva++,,r   c                 B    t        j                  | j                  |      S )z a = C^{-1} b
        r   r   r   )r   bs     r   inv_dot_leftzDummyTransform.inv_dot_left  s     vvd++Q//r   c                 B    t        j                  || j                        S )z x = z C^{-1}
        r   )r   zs     r   inv_dot_rightzDummyTransform.inv_dot_right  s     vva..//r   N)	__name__
__module____qualname____doc__r   r   r   r   r    r   r   r}   r}   a  s"    @E-
-
0
0r   r}   c                     t        j                  |       } | j                  dz   }t        d      gdg|dz
  z  z   t        d      gz   }| d   ||   z  j	                  d      dz  |j	                  d      z  S )an  groupmeans using dummy variables

    Parameters
    ----------
    x : array_like, ndim
        data array, tested for 1,2 and 3 dimensions
    d : ndarray, 1d
        dummy variable, needs to have the same length
        as x in axis 0.

    Returns
    -------
    groupmeans : ndarray, ndim-1
        means for each group along axis 0, the levels
        of the groups are the last axis

    Notes
    -----
    This will be memory intensive if there are many levels
    in the categorical variable, i.e. many columns in the
    dummy variable. In this case it is recommended to use
    a more efficient version.

    r   N   ).Nr         ?)r   asarrayndimr&   sum)r!   rg   ri   slis       r   groupmean_dr     sv    2 	

1A FFQJE;-4&%'*
*eDk]
:ChK!C& %%a(+AEE!H44r   c                   6    e Zd ZdZd	dZd Zd Zd Zd Zd Z	y)
TwoWaya  a wrapper class for two way anova type of analysis with OLS


    currently mainly to bring things together

    Notes
    -----
    unclear: adding multiple test might assume block design or orthogonality

    This estimates the full dummy version with OLS.
    The drop first dummy representation can be recovered through the
    transform method.

    TODO: add more methods, tests, pairwise, multiple, marginal effects
    try out what can be added for userfriendly access.

    missing: ANOVA table

    Nc                 P   |j                   d   | _        |d}d}n|\  }}t        ||      x\  | _        | _        \  }}t        |      x\  | _        | _        \  }	}
|j                   d   x| _        }|	j                   d   x| _        }t        ||
      }|\  }}}}}}|\  | _
        | _        | _        | _        | _        }t        ||	d      }t        ||	d      }t!        ||      | _        |j                   d   | _        || _        t)        j*                  ||      j-                         | _        | j.                  j0                  | _        | j"                  j3                  | j0                        | _        d|dz
  z   |dz
  z   | _        | j$                  | j6                  z
  | _        y )Nr   r   r   r   rV   r^   rY   )r\   rh   r7   rJ   	d1_labelsrK   	d2_labelsnlevel1nlevel2rM   
prod_labelC1C1_labelC2C2_labelr8   r}   	transformri   exogsmOLSfitresolsparamsr   params_dropfstart_interactionn_interaction)r   endogfactor1factor2varnamesvname1vname2rJ   r   rK   r   r   r   resprodlabr   C1labr   C2labr3   dp_fulldp_dropfs                         r   r   zTwoWay.__init__  s   MM!$	FF%NFF2:7F2KK-"i2:7F2KK-"i!#!,w!#!,w y)4+.(UBqMPJ$-$-Bv6 R=': ]]1%
	ffUG,002kk(( !NN77D!"gk!2gk!B!ZZ$*@*@@r   c                     | j                   }t        j                  t        j                  || j                  |z
  f      t        j
                  |      f      }| j                  j                  |      }|| _        |S )z7contrast/restriction matrix for no interaction
        )	r   r   hstackr	   ri   r   r   r   R_nointer_transf)r   nia	R_nointerr   s       r   	r_nointerzTwoWay.r_nointer  sc       IIrxxdjjn(=>sLM	>>77	B 0r   c                 0   | j                   }t        j                  t        j                  || j                  |z
  f      t        j
                  |      f      }| j                  j                  |      }|| _        | j                  j                  |      }|S z1ttests for no-interaction terms are zero
        )r   r   r   r	   ri   r   r   r   r   r   t_test)r   r   r   r   t_ress        r   ttest_interactionzTwoWay.ttest_interaction  sw       IIrxxdjjn(=>sLM	>>77	B 0""#34r   c                 X    | j                         }| j                  j                  |      S r   )r   r   f_test)r   r   s     r   ftest_interactionzTwoWay.ftest_interaction  s'      >>+{{!!"233r   c                     |dk(  r1| j                   j                  | j                        | j                  fS | j                   j                  | j                        | j
                  fS )Nr   )r   r   r   r   r   r   )r   	factorinds     r   ttest_conditional_effectzTwoWay.ttest_conditional_effect  sM    >;;%%dgg.==;;%%dgg.==r   c                     ddl m} | j                  j                  | j                  | j
                        }| j                  }| j                  }d}t        dg| j
                  z        } ||||||      S )Nr   )SimpleTablez!Estimated Coefficients by factorsz%#10.4g)	data_fmts)titletxt_fmt)	statsmodels.iolibr   r   r[   r   r   r   r   dict)r   r   
params_arrstubsheadersr   	table_fmts          r   summary_coeffzTwoWay.summary_coeff  sj    1[[((t||D
..3"DLL02	:wU#,. 	.r   N)
r   r   r   r   r   r   r   r   r   r   r   r   r   r   r     s'    &AD 
4>	.r   r   c                   $    e Zd Zd Zd Zd Zd Zy)TestContrastToolsc                     g d| _         ddg| _        t        j                  g dg dg dg dg dg dg dg dg dg dg dg dg      | _        y )Na0a1a2b0b1)r   r   r   )r   r   r   )r   r   r   )v1namev2namer   r   rJ   )r   s    r   r   zTestContrastTools.__init__.  sL    (Tl((I%%%%%%%%%%%' (r   c                     t        j                  g dd      }t        j                  ddgddgddgddgddgddgddgddgddgddgddgddgg      ddg}}t        |d	      \  }}t        ||       t        ||       y )
N)Fr   Mr   r   r   r   r   r   r   r   r   z|S1)dtyper   r   gender_Fgender_Mgender)rT   )r   r   r7   r   )r   r!   rg   r0   res_d
res_labelss         r   test_dummy_1dzTestContrastTools.test_dummy_1d>  s    HHQXX1v !1v !1v !1v !1v !1v !1v !1v !1v !1v !1v !1v' ( +5j)A  %Q9zUAZ(r   c                    t        | j                  | j                        }dgdz  }g d|d<   t        j                  g dg dg dg dg      |d<   g d	|d
<   t        j                  g dg dg dg      |d<   g d|d<   t        d      D ]3  }t        j                  j                  ||   ||   t        |             5 y )Nr      )a0_b0a0_b1a1_b0a1_b1a2_b0a2_b1)              r   r  r  r  )r  r   r  r   r  r  )r   r  r  r  r   r  )r  r   r  r  r  r   r   )za1_b0-a0_b0za1_b1-a0_b1za2_b0-a0_b0za2_b1-a0_b1r   )r   r   r  r  r  r  )r  r  r   r   r  r  )r  r  r  r  r   r      )za0_b1-a0_b0za1_b1-a1_b0za2_b1-a2_b0      )err_msg)	rM   r   r   r   r   r   testingr   r    )r   res_cpres_tiis       r   test_contrast_productz'TestContrastTools.test_contrast_productQ  s    !$++t{{;AIa88;999; <a PaHH<99; <a Aa( 	LBJJ##F2Jb	3r7#K	Lr   c                     t        | j                        \  }}t        |t        j                  g d             t        |t        j                  g d             y )N)r   r     )r  r     )rq   rJ   r   r   r   )r   r   es      r   test_dummy_limitsz#TestContrastTools.test_dummy_limitsa  s:    477#!Q+,Q./r   N)r   r   r   r   r   r
  r  r   r   r   r   r   ,  s    ( )&L 0r   r   __main__)smalllargeNr   r   r   r   r  r  r   r  r  r  rb   r   rX   rY   r   g{Gz?gMbP?g?   r   r   z"
tvalues for no effect of factor 1z/each test is conditional on a level of factor 2z"
tvalues for no effect of factor 2z/each test is conditional on a level of factor 1)r   r  )F)NNFr   )rV   )hr   numpy.testingr   numpyr   r   r   r   r#   r1   rM   r7   r8   rq   r{   r}   r   r   r   r   ttr
  r   r  statsmodels.apiapir   examplesr   r   r  printrP   yx1x2rJ   r   rK   r   repeatr\   rh   dd_fulldd_dropldd_dropfr   Tdiagr   rf   effect_sizenoise_scalerandomrandnnoisebeta
ydata_fullydata_droplydata_dropfr   r   resols_full_fullresols_full_dropfr   
params_f_fparams_f_dfresols_dropf_fullresols_dropf_dropfparams_df_fparams_df_dfr   r   tr_oftr_fotransf_f_dfrO   absr   r   r   r   r   r   r   r   r3   r   tvalue
cov_paramsr   r	   r   R_nointtvaluesinter_directinter_transftwr   pvaluer   fvaluer   r   r   r   r   <module>rC     sB  0 ' , ,<ED4<n#J(X,$^;0 ;0B5Fa. a.N80 80z z		B '*HFD\Fff-F	&M		"A	2	B	2	A	B( I I (RYYr11%RYYr11%88A;DRLMB	RLMB	B62GRK8HRL9H 
6266'))W%Q)@@
E
E
GH
 t*Q-K#,q/K"))//$//E1Q'DD.%%a(50Jd?''*U2Kd?''*U2Krvvj'2668z8488:!((J#**K{G488:X6::<#**K%,,L IIOOHgRO8;EIIOOGXRO8;E	&"&&
%
34	&"&&

#k
12 (3K	&"&&+";";H"EEF
GH	&"&&;#8#8#AAB
CD	&"&&&33K@A B C D
BFF6266+&33J?@ A B '7vv&F#GRE!	
/0	
;<	%L	

"
"2
&
-
-.	
/0	
;<	%L	

"
"2
&
-
-.   $ bii%&"&&)45G$,,RS1L#**;+D+DW+MNUUL	&"&&|34
56 
R	$B	"


 
'
'(	"


 
'
'(	"


 
'
'(	"


 
'
'(	"
%
%a
(
+
2
23	"
%
%a
(
+
2
23	"


$GdJr   