
    {Kgs                        d Z ddlmZ ddlZddlZddlmZ ddlm	Z	 ddl
mZmZmZmZ ddlmZmZ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 dd
lmZm Z  ddl!m"Z"m#Z#m$Z$m%Z% ddl&m'Z'm(Z(m)Z) ddl*m+Z+ ddl,m-Z- ddl.m/Z/ ddl0m1Z1m2Z2m3Z3 ddl4m5Z5 ddl6m7Z7m8Z8m9Z9 ddl:m;Z;m<Z<m=Z=  e       Z>e>j~                  e>j                  cZAZB e       ZCeCj~                  eCj                  cZDZE edd      \  ZFZG edd      \  ZHZIej                  j                  dd e(ddd      g      ej                  j                  dd ed      g      ej                  j                  dddg      d                      ZLd  ZMd! ZNd" ZOej                  j                  dd e'ddd      g      ej                  j                  d#di f ed      i f e       d$difg      ej                  j                  dddg      d%                      ZPej                  j                  d&e;e<z   e=z         d'        ZQej                  j                  d&e;e<z   e=z         d(        ZRd) ZS G d* d+ee      ZT G d, d-ee      ZUej                  j                  d.eEd/g ieVd0feEd1 e#       fd2 e1d34      fgd5d6eVd7feEd/d1 e#       fd8 eU       fgieWd9feEd1 e#       fd8 e2d34      fg eU       d:eWd9fg      d;        ZXej                  j                  d.eBd/g ieVd0feBd/d1 e"       fd8 eT       fgieWd9feBd1 e"       fd8 e3       fg eT       d:eWd9fg      d<        ZYej                  j                  d= ed1 e#d      fd2 e2d      fg>      eDdd? eEdd? f ed1 e"       fd2 e3d      fg>      eAeBfgd@dAgB      dC        ZZdD Z[ej                  j                  dE ed1 e#       fd2 e2d      fg e#        e'ddF      G      g edH       ed1 e"       fd2 e3d      fg e"        e'ddF      G      eAeBfgd@dAgB      dI        Z\dJ Z]ej                  j                  dK      ej                  j                  dE ed1 e#       fd2 e2d      fg e#       :      g edH       ed1 e"       fd2 e3d      fg e"       :      eAeBfgd@dAgB      dL               Z_ej                  j                  dMeed5 e#d      eDeEfeedN e"       eAeBfg      dO        Z`ej                  j                  dE ed1 e#       fd2 e1       fgdPQ      eDeEf ed1 e"       fd2 e3       fgdPQ      eAeBfg      dR        Zaej                  j                  dSeee#feee"fg      dT        Zbej                  j                  dU e-d       ed      gdVdWgB      dX        ZcdY Zdej                  j                  dZd[dNg      ej                  j                  dddg      d\               Zeej                  j                  d] ed1 e#d      fd2 e2d      fg>      eCj                  eDeEg d^f ed1 e#d      fd_d2 e2d      fg>      eCj                  eDdd? eEdd? d`dagf ed1 e"       fd2 e3d      fg>      e>j                  eAeBdbdcgfgg ddB      ej                  j                  dddg      de               Zgdf Zhdg Ziy)hz+Test the stacking classifier and regressor.    )MockN)assert_array_equal)sparse)BaseEstimatorClassifierMixinRegressorMixinclone)load_breast_cancerload_diabetes	load_irismake_classificationmake_multilabel_classificationmake_regression)DummyClassifierDummyRegressor)RandomForestClassifierRandomForestRegressorStackingClassifierStackingRegressor)ConvergenceWarningNotFittedError)LinearRegressionLogisticRegressionRidgeRidgeClassifier)KFoldStratifiedKFoldtrain_test_split)KNeighborsClassifier)MLPClassifier)scale)SVC	LinearSVC	LinearSVR)CheckingClassifier)assert_allcloseassert_allclose_dense_sparseignore_warnings)COO_CONTAINERSCSC_CONTAINERSCSR_CONTAINERS   *   )	n_classesrandom_state   cvT)n_splitsshuffler/   final_estimatorr/   passthroughFc                    t        t        t              t        t        d      \  }}}}dt	               fdt               fg}t        ||| |      }|j                  ||       |j                  |       |j                  |       |j                  ||      dkD  sJ |j                  |      }	|rdnd}
|	j                  d	   |
k(  sJ |rt        ||	d d d
d f          |j                  d       |j                  ||       |j                  |       |j                  |       ||j                  |       |j                  |      }	|rdnd}|	j                  d	   |k(  sJ |rt        ||	d d d
d f          y y )Nr-   stratifyr/   lrsvc
estimatorsr4   r1   r6   皙?
         dropr:      r,   )r   r!   X_irisy_irisr   r#   r   fitpredictpredict_probascore	transformshaper&   
set_paramsdecision_function)r1   r4   r6   X_trainX_testy_trainy_testr=   clfX_transexpected_column_countexpected_column_count_drops               h/home/alanp/www/video.onchill/myenv/lib/python3.12/site-packages/sklearn/ensemble/tests/test_stacking.pytest_stacking_classifier_irisrY   ;   sv    (8fvR($GVWf +-.	0DEJ
'	C GGGWKKf99VV$s***mmF#G"-B1==4444230NNfNGGGWKKff%mmF#G&1q==9999230     c                     t        d      \  } }t        t        |       ||d      \  }}}}dt               fdt	        d      fg}t        |d	      }|j                  ||       |j                  |      }|j                  d
   dk(  sJ dt               fdt               fg}|j                  |       |j                  ||       |j                  |      }|j                  d
   dk(  sJ y )NT
return_X_yr-   r8   r:   rfr5   r,   r=   r1   rA   r0   r;   r=   )r
   r   r!   r   r   r   rH   rL   rM   r#   rN   )	XyrP   rQ   rR   _r=   rT   rU   s	            rX   :test_stacking_classifier_drop_column_binary_classificationrd   i   s    .DAq"2a!ab#GVWa 
!#$	%267J 
q
9CGGGWmmF#G==q    +-.	0DEJNNjN)GGGWmmF#G==q   rZ   c                  &   t        t        t              t        t        d      \  } }}}ddt	        d      fg}t        dd      }t        dt	        d      fg|d	
      }t        ||d	
      }|j                  | |       |j                  | |       t        |j                  |      |j                  |             t        |j                  |      |j                  |             t        |j                  |      |j                  |             y )Nr-   r8   r:   rC   r;   r   r5   r?   n_estimatorsr/      r=   r4   r1   )r   r!   rF   rG   r#   r   r   rH   r&   rI   rJ   rL   )rP   rQ   rR   rc   r=   r^   rT   clf_drops           rX   'test_stacking_classifier_drop_estimatorrl      s     #3fvR#GVWa !5)*C"DEJ	Rb	AB
I1567C
 "ZPQRHGGGWLL'"CKK')9)9&)ABC%%f-x/E/Ef/MNCMM&)8+=+=f+EFrZ   c                     t        t        t              t        d      \  } }}}ddt	        d      fg}t        dd      }t        dt	        d      fg|d	      }t        ||d	      }|j                  | |       |j                  | |       t        |j                  |      |j                  |             t        |j                  |      |j                  |             y )
Nr-   r5   rf   svrr   r?   rg   ri   rj   )r   r!   
X_diabetes
y_diabetesr$   r   r   rH   r&   rI   rL   )rP   rQ   rR   rc   r=   r^   regreg_drops           rX   &test_stacking_regressor_drop_estimatorrs      s     #3j:B#GVWa !5)*C"DEJ	BR	@B
I1567C
 !JqQHGGGWLL'"CKK')9)9&)ABCMM&)8+=+=f+EFrZ   zfinal_estimator, predict_params
return_stdc                    t        t        t              t        d      \  }}}}dt	               fdt               fg}t        ||| |      }	|	j                  ||        |	j                  |fi |}
|rdnd}|rt        |
      |k(  sJ |	j                  |      }|rdnd}|j                  d   |k(  sJ |rt        ||d d d	d f          |	j                  d
       |	j                  ||       |	j                  |       |	j                  |      }|rdnd}|j                  d   |k(  sJ |rt        ||d d d	d f          y y )Nr-   r5   r:   rn   r<   r0   rA      rC   rD      )r   r!   ro   rp   r   r$   r   rH   rI   lenrL   rM   r&   rN   )r1   r4   predict_paramsr6   rP   rQ   rR   rc   r=   rq   resultexpected_result_lengthrU   rV   rW   s                  rX    test_stacking_regressor_diabetesr}      sW    #3j:B#GVWa )+,uik.BCJ
'	C GGGWS[[2>2F"0Qa6{4444mmF#G"-B1==444434 01NNfNGGGWKKmmF#G'2==999934 01 rZ   sparse_containerc                    t         | t        t                    t        d      \  }}}}dt	               fdt               fg}t        dd      }t        ||dd	      }|j                  ||       |j                  |      }t        ||d d d
d f          t        j                  |      sJ |j                  |j                  k(  sJ y )Nr-   r5   r:   rn   r?   rg   ri   Tr<   rw   )r   r!   ro   rp   r   r$   r   r   rH   rL   r'   r   issparseformat	r~   rP   rQ   rR   rc   r=   r^   rT   rU   s	            rX   *test_stacking_regressor_sparse_passthroughr      s    
 #3z*+Zb#GVWa )+,uik.BCJ	BR	@B
raTC GGGWmmF#G CD)9:??7###==GNN***rZ   c                    t         | t        t                    t        d      \  }}}}dt	               fdt               fg}t        dd      }t        ||dd	      }|j                  ||       |j                  |      }t        ||d d d
d f          t        j                  |      sJ |j                  |j                  k(  sJ y )Nr-   r5   r:   r;   r?   rg   ri   Tr<   rB   )r   r!   rF   rG   r   r#   r   r   rH   rL   r'   r   r   r   r   s	            rX   +test_stacking_classifier_sparse_passthroughr      s    
 #3v'b#GVWa +-.	0DEJ	Rb	AB
raTC GGGWmmF#G BC9??7###==GNN***rZ   c                      t        t        d d       t        d d }} dt               fdt	               fg}t        |      }|j                  | |       |j                  |       }|j                  d   dk(  sJ y )Nd   r:   r^   r`   rA   r0   )	r!   rF   rG   r   r   r   rH   rL   rM   )X_y_r=   rT   X_metas        rX   )test_stacking_classifier_drop_binary_probr     su    
 6$3< &#,B+-.7M7O0PQJ


3CGGBO]]2F<<?arZ   c                       e Zd Zd Zd Zy)NoWeightRegressorc                 X    t               | _        | j                  j                  ||      S N)r   rq   rH   selfra   rb   s      rX   rH   zNoWeightRegressor.fit  s!    !#xx||Aq!!rZ   c                 F    t        j                  |j                  d         S )Nr   )nponesrM   )r   ra   s     rX   rI   zNoWeightRegressor.predict  s    wwqwwqz""rZ   N)__name__
__module____qualname__rH   rI    rZ   rX   r   r     s    "#rZ   r   c                       e Zd Zd Zy)NoWeightClassifierc                 \    t        d      | _        | j                  j                  ||      S )N
stratified)strategy)r   rT   rH   r   s      rX   rH   zNoWeightClassifier.fit  s#    "L9xx||Aq!!rZ   N)r   r   r   rH   r   rZ   rX   r   r     s    "rZ   r   zy, params, type_err, msg_errr=   zInvalid 'estimators' attribute,r:   svmiP  max_iterrJ   )r=   stack_methodz+does not implement the method predict_probacorzdoes not support sample weightr=   r4   c           	         t        j                  ||      5  t        di |ddi}|j                  t	        t
              | t        j                  t
        j                  d                d d d        y # 1 sw Y   y xY wNmatchr1   r,   r   sample_weightr   )	pytestraisesr   rH   r!   rF   r   r   rM   )rb   paramstype_errmsg_errrT   s        rX   test_stacking_classifier_errorr   "  sX    T 
xw	/ 060a0fqQ0HI 
0	/	/   AA66A?c           	         t        j                  ||      5  t        di |ddi}|j                  t	        t
              | t        j                  t
        j                  d                d d d        y # 1 sw Y   y xY wr   )	r   r   r   rH   r!   ro   r   r   rM   )rb   r   r   r   rq   s        rX   test_stacking_regressor_errorr   Q  s[    2 
xw	//&/Q/j!1BGGJ<L<LQ<O4PQ 
0	/	/r   zestimator, X, yr`   r   r   r   )idsc                    t        |       }|j                  t        dt        j                  j                  d                   t        |       }|j                  d       |j                  t        dt        j                  j                  d                   t        |j                  ||      j                  |      d d dd f   |j                  ||      j                  |             y )NTr   r3   r/   r1   rC   rD   rA   )	r	   rN   r   r   randomRandomStater&   rH   rL   )	estimatorra   rb   estimator_fullestimator_drops        rX   test_stacking_randomnessr   o  s    : 9%NBII,A,A!,DE   9%N(BII,A,A!,DE   1a **1-ae41a **1-rZ   c                      t        dt        d      fdt        d      fg      } | j                  t        t
               y )Nr:   i'  r   r   r`   )r   r   r#   rH   rF   rG   )rT   s    rX   )test_stacking_classifier_stratify_defaultr     s<    
%v67Iv./
C GGFFrZ   zstacker, X, yr   rj   r\   c                    t        |      dz  }t        j                  dg|z  dgt        |      |z
  z  z         }t        |||d      \  }}}}}	}t	        t
              5  | j                  ||       d d d        | j                  |      }
t	        t
              5  | j                  ||t        j                  |j                               d d d        | j                  |      }t        |
|       t	        t
              5  | j                  |||	       d d d        | j                  |      }t        j                  |
|z
        j                         dkD  sJ y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   ^xY w)	Nr0   g?g?r-   r5   )categoryr   r   )ry   r   arrayr   r(   r   rH   rI   r   rM   r&   abssum)stackerra   rb   n_half_samplestotal_sample_weightrP   rQ   rR   rc   sample_weight_trainy_pred_no_weighty_pred_unit_weighty_pred_biaseds                rX    test_stacking_with_sample_weightr     sJ   B Vq[N((	##a&>*A!BB ;K	1!;7GVWa!4a 
"4	5GW% 
6v.	"4	5GWBGGGMM4JK 
6 0$&89	"4	5GW4GH 
6OOF+M66"]23779A=== 
6	5 
6	5 
6	5s$   !E2E*E6E'*E36E?c                      t        dt        d      fgt        d            } | j                  t        t        t        j                  t        j                  d                y )Nr:   T)expected_sample_weightr   r   r   )r   r%   rH   rF   rG   r   r   rM   )r   s    rX   0test_stacking_classifier_sample_weight_fit_paramr     sJ     -TJKL*$GG KKbggfll1o.FKGrZ   z-ignore::sklearn.exceptions.ConvergenceWarningc                    t        |       }t        |       }|j                  d       |j                  d       |j                  ||       |j                  ||       t        |j                  |j                        D ]%  \  }}t        |j                  |j                         ' t        j                  t        d      5  t        |j                  j                  |j                  j                         d d d        y # 1 sw Y   y xY w)Nr,   r   ri   z	Not equalr   )r	   rN   rH   zipestimators_r&   coef_r   r   AssertionErrorfinal_estimator_)r   ra   rb   stacker_cv_3stacker_cv_5est_cv_3est_cv_5s          rX   test_stacking_cv_influencer     s    B >L>Lq!q!QQ ",":":L<T<TU(7 V 
~[	9))//1N1N1T1T	
 
:	9	9s   5D  D	z7Stacker, Estimator, stack_method, final_estimator, X, yrI   c                 D   t        ||dd      \  }}}}	d |       j                  ||      fd |       j                  ||      fg}
|
D ]B  \  }}t        d      |_        t        ||      }t        |      }||_        t        |||       D  | |
d	|
      }|j                  ||	       |j                  |
D cg c]  \  }}|	 c}}k(  sJ t        d |j                  D              sJ |j                  D ]  }t        ||      }|j                  |       ! yc c}}w )z2Check the behaviour of stacking when `cv='prefit'`r-   g      ?)r/   	test_sized0d1rH   )name)side_effectprefit)r=   r1   r4   c              3   N   K   | ]  }|j                   j                  d k(    yw)r   N)rH   
call_count).0r   s     rX   	<genexpr>z'test_stacking_prefit.<locals>.<genexpr>R  s"     R>Qy}}''1,>Qs   #%N)	r   rH   r   getattrr   setattrr   allassert_called_with)Stacker	Estimatorr   r4   ra   rb   X_train1X_train2y_train1y_train2r=   rc   r   
stack_funcpredict_method_mockedr   stack_func_mocks                    rX   test_stacking_prefitr   "  s4   . .>	12.*Hh( 
y{x23	y{x23J #9%(	Y5
 $ < *6&	<)>? # (OG KK(#"LI9"LLLLRg>Q>QRRRR ((	!)\:**84 ) #Ms   ;Dr   r_   c                     t        j                  t              5  | j                  ||       d d d        y # 1 sw Y   y xY wr   )r   r   r   rH   )r   ra   rb   s      rX   test_stacking_prefit_errorr   Z  s*    6 
~	&Aq 
'	&	&s   6?z!make_dataset, Stacking, Estimatorc                     G d d|      } | dd      \  }} |d |       fg      }|j                    d}t        j                  t        |	      5  |j                   d d d        |j                  ||       d
}t        j                  t        |	      5  |j                   d d d        y # 1 sw Y   NxY w# 1 sw Y   y xY w)Nc                   "     e Zd ZdZ fdZ xZS )8test_stacking_without_n_features_in.<locals>.MyEstimatorz Estimator without n_features_in_c                 *    t         |   ||       | `y r   )superrH   n_features_in_)r   ra   rb   	__class__s      rX   rH   z<test_stacking_without_n_features_in.<locals>.MyEstimator.fit  s    GK1#rZ   )r   r   r   __doc__rH   __classcell__)r   s   @rX   MyEstimatorr     s    .	$ 	$rZ   r   r   r   )r/   	n_samplesr:   r`   z' object has no attribute n_features_in_r   z6'MyEstimator' object has no attribute 'n_features_in_')r   r   r   AttributeErrorr   rH   )make_datasetStackingr   r   ra   rb   r   msgs           rX   #test_stacking_without_n_features_inr  y  s    $i $ Q#6DAqD+-#8"9:GF
GC	~S	1 
2 KK1
BC	~S	1 
2	1 
2	1 
2	1s   B.B:.B7:Cr   r    r   c                    t        t        t        t        d      \  }}}}d}d| fg}t        |t	               d      j                  ||      }|j                  |      }|j                  |j                  d   |fk(  sJ t        t        j                  |j                  d	      d
            rJ |j                  |      }	|	j                  |j                  k(  sJ y)zCheck the behaviour for the multilabel classification case and the
    `predict_proba` stacking method.

    Estimators are not consistent with the output arrays and we need to ensure that
    we handle all cases.
    r-   r8   r,   estrJ   r=   r4   r   r   rA   )axisg      ?N)r   X_multilabely_multilabelr   r   rH   rL   rM   anyr   iscloser   rI   )
r   rP   rQ   rR   rS   	n_outputsr=   r   rU   y_preds
             rX   1test_stacking_classifier_multilabel_predict_probar    s    $ (8l\($GVWf I)$%J ,.$ 
c'7	  'G==V\\!_i88882::gkkqk137888__V$F<<6<<'''rZ   c                  h   t        t        t        t        d      \  } }}}d}dt               fg}t	        |t               d      j                  | |      }|j                  |      }|j                  |j                  d   |fk(  sJ |j                  |      }|j                  |j                  k(  sJ y)	zCheck the behaviour for the multilabel classification case and the
    `decision_function` stacking method. Only `RidgeClassifier` supports this
    case.
    r-   r8   r,   r  rO   r  r   N)
r   r	  r
  r   r   r   rH   rL   rM   rI   )	rP   rQ   rR   rS   r  r=   r   rU   r  s	            rX   5test_stacking_classifier_multilabel_decision_functionr    s    
 (8l\($GVWf I/+,-J ,.( 
c'7	  'G==V\\!_i8888__V$F<<6<<'''rZ   r   autoc                    t        t        t        t        d      \  }}}}|j                         }d}dt	        d      fdt        d      fdt               fg}t               }	t        ||	||       j                  ||      }
t        ||       |
j                  |      }|j                  |j                  k(  sJ | d	k(  rg d
}ndgt        |      z  }|
j                  |k(  sJ |t        |      z  }|r||j                  d   z  }|
j                  |      }|j                  |j                  d   |fk(  sJ t        |
j                   t#        j$                  ddg      g|z         y)zCheck the behaviour for the multilabel classification case for stack methods
    supported for all estimators or automatically picked up.
    r-   r8   r,   mlpr5   r^   ridge)r=   r4   r6   r   r  )rJ   rJ   rO   rI   rA   r   N)r   r	  r
  copyr    r   r   r   r   rH   r   rI   rM   ry   stack_method_rL   classes_r   r   )r   r6   rP   rQ   rR   rS   y_train_before_fitr  r=   r4   rT   r  expected_stack_methodsn_features_X_transrU   s                  rX   0test_stacking_classifier_multilabel_auto_predictr    so    (8l\($GVWf !I 
2./	%267	/#$J
 +,O
'!	
 
c'7  )73[[ F<<6<<'''v!X"+s:!> 6666"S_4gmmA..mmF#G==V\\!_.@AAAAs||bhh1v&6%7)%CDrZ   z,stacker, feature_names, X, y, expected_names)stackingclassifier_lr0stackingclassifier_lr1stackingclassifier_lr2stackingclassifier_svm0stackingclassifier_svm1stackingclassifier_svm2)otherrC   stackingclassifier_lrstackingclassifier_svmstackingregressor_lrstackingregressor_svm)StackingClassifier_multiclassStackingClassifier_binaryr   c                     | j                  |       | j                  t        |      |       |rt        j                  ||f      }| j                  |      }t        ||       y)z/Check get_feature_names_out works for stacking.)r6   N)rN   rH   r!   r   concatenateget_feature_names_outr   )r   feature_namesra   rb   expected_namesr6   	names_outs          rX   test_get_feature_names_outr0    sX    D ;/KKa!(GH--m<Iy.1rZ   c                     t        t        t              t        t        d      \  } }}}t	        dt               fg      }|j                  | |       |j                  |       |j                  |       |j                  ||      dkD  sJ y)zNCheck that a regressor can be used as the first layer in `StackingClassifier`.r-   r8   r  r`   r>   N)
r   r!   rF   rG   r   r   rH   rI   rJ   rK   )rP   rQ   rR   rS   rT   s        rX   'test_stacking_classifier_base_regressorr2  T  sy    '7fvR($GVWf '57);(<
=CGGGWKKf99VV$s***rZ   c                     t        d      \  } }dt               fdt        dd      fg}t        dd      }t        ||d      }d	}d
}t	        j
                  t        |      5 }|j                  | |      j                  |        ddd       t        j                  j                  t              sJ |t        |j                  j                        v sJ y# 1 sw Y   SxY w)a
  Check that we raise the proper AttributeError when the final estimator
    does not implement the `decision_function` method, which is decorated with
    `available_if`.

    Non-regression test for:
    https://github.com/scikit-learn/scikit-learn/issues/28108
    r-   r5   r:   r^   r0   rg   r,   rj   z>This 'StackingClassifier' has no attribute 'decision_function'zD'RandomForestClassifier' object has no attribute 'decision_function'r   N)r   r   r   r   r   r   r   rH   rO   
isinstancevalue	__cause__str)ra   rb   r=   r4   rT   	outer_msg	inner_msg	exec_infos           rX   -test_stacking_final_estimator_attribute_errorr;  `  s     B/DAq 
!#$	%12FGJ -!"MO
1C QIVI	~Y	791''* 
8ioo//@@@IOO556666 
8	7s   %"CC")jr   unittest.mockr   numpyr   r   numpy.testingr   scipyr   sklearn.baser   r   r   r	   sklearn.datasetsr
   r   r   r   r   r   sklearn.dummyr   r   sklearn.ensembler   r   r   r   sklearn.exceptionsr   r   sklearn.linear_modelr   r   r   r   sklearn.model_selectionr   r   r   sklearn.neighborsr   sklearn.neural_networkr    sklearn.preprocessingr!   sklearn.svmr"   r#   r$   sklearn.utils._mockingr%   sklearn.utils._testingr&   r'   r(   sklearn.utils.fixesr)   r*   r+   diabetesdatatargetro   rp   irisrF   rG   r	  r
  X_binaryy_binarymarkparametrizerY   rd   rl   rs   r}   r   r   r   r   r   
ValueError	TypeErrorr   r   r   r   r   r   filterwarningsr   r   r   r  r  r  r  r-  r0  r2  r;  r   rZ   rX   <module>rY     s	   1
    ,  N N  :  B  M L 2 0 ' 1 1 5 
 O N?! 
J{DKK;b l )12F ( 1oq$RH
I 4"EF 6$1 7$1N!6G,G* 5!TPR#STU%	r
	B	/4		L$/0 6!2 7 V!2H 7.H++" 7.H++" # #"- " "	,#Z1RS -/0C01 !0 9	
 -/0.01 ,
	
  -/0Iv67 $6#7 ,	
3%(RJS(RJ "	lB'5VWT#3#56@Q@S8TUV,		
  +-.IK( $5#6 ,	
0R10R  -1=>I156 4CL4CL		
 +-.I156 		
, 
231  454(
  -/0I267 !3 4B7
	
  40
	
 +-.I267 !1 2B7 	
2 
237  :>;:>:H KL -/0I267 !3 4		
  40		
 +-.I267 !1 2 
	
. 
233  6
7 M8
2 = B/	
 	
* 5+* 5F  !#5#785#%.I 	
 +-.IK(  
	
010 '	02DE	+-=>4  	2& 	B/ 
23  
(
(8(0 &))<=6*E 7 >*EZ 2 -1=>I156 	
( -1=>%I156 4CL4CL'(	
" +-.I156 ""&'	
I3h	m  ;x u62 7y;z2	+7rZ   