
    0PhU              	          d Z ddlZddlZddlZddlmZ ddlmZm	Z	 ddl
mZmZ ddlmZmZ ddlmZ ddlmZ dd	lmZmZ dd
lmZmZ ddlmZmZ ddlmZ ddlm Z  ddl!m"Z"m#Z#m$Z$ ddl%m&Z&m'Z'm(Z(m)Z)m*Z* ej+        ,                    d          Z-ddgddgddgddgddgddggZ.g dZ/g dZ0ddgddgddggZ1g dZ2g dZ3 ej4                    Z5e-6                    e5j7        j8                  Z9 ee5j:        e5j7        e-          \  e5_:        e5_7         ej;                    Z< ee<j:        e<j7        e-          \  e<_:        e<_7        d Z=d Z>d Z?d Z@d ZAejB        C                    dg d           d!             ZDd" ZEd# ZFd$ ZGd% ZHd& ZId' ZJd( ZKejB        C                    d) eLg e'e(e*e&e)e'd*e(z  z                       d+             ZMejB        C                    d) eLg e'e(e*e&e)e'd*e(z  z                       d,             ZNd- ZOd. ZPd/ ZQd0 ZRd1 ZSejB        C                    d2 e            e5j:        e5j7        f e            e<j:        e<j7        fg          d3             ZTd4 ZUd5 ZVd6 ZWdS )7z6Testing for the boost module (sklearn.ensemble.boost).    N)datasets)BaseEstimatorclone)DummyClassifierDummyRegressor)AdaBoostClassifierAdaBoostRegressor)_samme_proba)LinearRegression)GridSearchCVtrain_test_split)SVCSVR)DecisionTreeClassifierDecisionTreeRegressor)shuffle)NoSampleWeightWrapper)assert_allcloseassert_array_almost_equalassert_array_equal)COO_CONTAINERSCSC_CONTAINERSCSR_CONTAINERSDOK_CONTAINERSLIL_CONTAINERS      )foor    r    r   r   r   )r   r   r   r   r   r      )r    r   r   )r   r   r   random_statec                  Z   t          j        g dg dg dg dg          t          j                            d                    d d t           j        f         z   G fdd          }  |             }t          |d	t          j                            }t          |j        j                   t          j	        |          
                                sJ t          t          j        |d          g d
           t          t          j        |d          g d           d S )N)r   ư>r   )gRQ?g333333?皙?)igRQ?g      ?)r%   r   g&.>r   axisc                       e Zd Z fdZdS )'test_samme_proba.<locals>.MockEstimatorc                 <    t          |j        j                   S N)r   shape)selfXprobss     k/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/sklearn/ensemble/tests/test_weight_boosting.pypredict_probaz5test_samme_proba.<locals>.MockEstimator.predict_probaC   s    qw444L    N)__name__
__module____qualname__r2   )r0   s   r1   MockEstimatorr*   B   s.        	 	 	 	 	 	 	r3   r7   r!   )r   r   r   r   )r   r   r   r   )nparrayabssumnewaxisr
   	ones_liker   r-   isfiniteallargminargmax)r7   mocksamme_probar0   s      @r1   test_samme_probarD   7   sJ    H	'''):):):OOOL E 
RVEII1I%%&&qqq"*}55E         
 =??DtQU(;(;<<K{(%+666;{##''))))) ry1555|||DDDry1555|||DDDDDr3   c                  <   t          j        t          t                              } t	                                          t          |           }t          |                    t                    t          j        t          t                    df                     d S )Nr   )r8   oneslenr/   r   fitr   r2   )y_tclfs     r1   test_oneclass_adaboost_probarK   T   sj     '#a&&//C



"
"1c
*
*Cc//22BGSVVQK4H4HIIIIIr3   c                     t          d          } |                     t          t                     t	          |                     t                    t                     t	          t          j	        t          j
        t                              | j                   |                     t                    j        t          t                    dfk    sJ |                     t                    j        t          t                    fk    sJ d S )Nr   r"   r   )r   rH   r/   y_classr   predictT	y_t_classr8   uniqueasarrayclasses_r2   r-   rG   decision_functionrJ   s    r1   test_classification_toyrV   ]   s    
!
,
,
,CGGAws{{1~~y111ryI!6!677FFFQ%#a&&!4444  ##)c!ffY666666r3   c                      t          d          } |                     t          t                     t	          |                     t                    t                     d S Nr   r"   )r	   rH   r/   y_regrr   rN   rO   y_t_regrrU   s    r1   test_regression_toyr[   g   sF    

+
+
+CGGAvs{{1~~x00000r3   c                     t          j        t          j                  } t	                      }|                    t          j        t          j                   t          | |j                   |	                    t          j                  }|j
        d         t          |           k    sJ |                    t          j                  j
        d         t          |           k    sJ |                    t          j        t          j                  }|dk    sJ d|            t          |j                  dk    sJ t          t          d |j        D                                 t          |j                  k    sJ d S )Nr   g?zFailed with score = c              3   $   K   | ]}|j         V  d S r,   r"   .0ests     r1   	<genexpr>ztest_iris.<locals>.<genexpr>   %      ??3#??????r3   )r8   rQ   iristargetr   rH   datar   rS   r2   r-   rG   rT   scoreestimators_set)classesrJ   probarf   s       r1   	test_irisrk   n   s;   i$$G


CGGDIt{###w---di((E;q>S\\))))  ++1!4GDDDDIIdi--E3;;;1u11;;; s!####s??s?????@@CDXDXXXXXXXr3   loss)linearsquareexponentialc                    t          | d          }|                    t          j        t          j                   |                    t          j        t          j                  }|dk    sJ t          |j                  dk    sJ t          t          d |j        D                                 t          |j                  k    sJ d S )Nr   )rl   r#   g?r   c              3   $   K   | ]}|j         V  d S r,   r"   r^   s     r1   ra   z test_diabetes.<locals>.<genexpr>   rb   r3   )	r	   rH   diabetesre   rd   rf   rG   rg   rh   )rl   regrf   s      r1   test_diabetesrt      s     A
6
6
6CGGHM8?+++IIhmX_55E4<<<< s!####s??s?????@@CDXDXXXXXXXr3   c                     t           j                            d          } |                     dt          j        j                  }|                     dt          j        j                  }t          d          }|	                    t          j
        t          j        |           |                    t          j
                  }d |                    t          j
                  D             }|                    t          j
                  }d |                    t          j
                  D             }|                    t          j
        t          j        |          }d |                    t          j
        t          j        |          D             }	t#          |          dk    sJ t%          ||d	                    t#          |          dk    sJ t%          ||d	                    t#          |	          dk    sJ t%          ||	d	                    t'          dd
          }|	                    t          j
        t          j        |           |                    t          j
                  }d |                    t          j
                  D             }|                    t          j
        t          j        |          }d |                    t          j
        t          j        |          D             }	t#          |          dk    sJ t%          ||d	                    t#          |	          dk    sJ t%          ||	d	                    d S )Nr   
   sizen_estimatorssample_weightc                     g | ]}|S  r~   r_   ps     r1   
<listcomp>z'test_staged_predict.<locals>.<listcomp>   s    CCC!CCCr3   c                     g | ]}|S r~   r~   r   s     r1   r   z'test_staged_predict.<locals>.<listcomp>   s    DDD1QDDDr3   c                     g | ]}|S r~   r~   r_   ss     r1   r   z'test_staged_predict.<locals>.<listcomp>   s%         r3   r   rz   r#   c                     g | ]}|S r~   r~   r   s     r1   r   z'test_staged_predict.<locals>.<listcomp>   s    GGG!GGGr3   c                     g | ]}|S r~   r~   r   s     r1   r   z'test_staged_predict.<locals>.<listcomp>   s(        	
  r3   )r8   randomRandomStaterandintrc   rd   r-   rr   r   rH   re   rN   staged_predictr2   staged_predict_probarf   staged_scorerG   r   r	   )
rngiris_weightsdiabetes_weightsrJ   predictionsstaged_predictionsrj   staged_probasrf   staged_scoress
             r1   test_staged_predictr      s   
)


"
"C;;r(9;::L{{2HO,A{BB
"
-
-
-CGGDIt{,G???++di((KCCS%7%7	%B%BCCCdi((EDD 8 8 C CDDDMIIdiLIIIE ##DIt{,#WW  M !""b((((k+=b+ABBB}####e]2%6777}####e]2%6777 !
<
<
<CGGHM8?:JGKKK++hm,,KGGS%7%7%F%FGGGIIhmX_DTIUUE !!M8?:J " 
 
  M !""b((((k+=b+ABBB}####e]2%677777r3   c                  t   t          t                                } ddd}t          | |          }|                    t          j        t          j                   t          t                      d          } ddd}t          | |          }|                    t          j        t          j                   d S )N	estimator)r   r   )rz   estimator__max_depthr   r   r#   )
r   r   r   rH   rc   re   rd   r	   r   rr   )boost
parametersrJ   s      r1   test_gridsearchr      s     )?)A)ABBBE & J uj
)
)CGGDIt{### (=(?(?aPPPE"(&IIJ
uj
)
)CGGHM8?+++++r3   c                  r   dd l } t                      }|                    t          j        t          j                   |                    t          j        t          j                  }|                     |          }|                     |          }t          |          |j
        k    sJ |                    t          j        t          j                  }||k    sJ t          d          }|                    t          j        t          j                   |                    t          j        t          j                  }|                     |          }|                     |          }t          |          |j
        k    sJ |                    t          j        t          j                  }||k    sJ d S rX   )pickler   rH   rc   re   rd   rf   dumpsloadstype	__class__r	   rr   )r   objrf   r   obj2score2s         r1   test_pickler      sF   MMM 

CGGDIt{###IIdi--ESA<<??D::&&&&ZZ	4;//FF???? 
+
+
+CGGHM8?+++IIhmX_55ESA<<??D::&&&&ZZx77FF??????r3   c            	      *   t          j        ddddddd          \  } }t                      }|                    | |           |j        }|j        d         dk    sJ |d dt          j        f         |dd          k                                    sJ d S )Ni  rv   r!   r   Fr   )	n_samples
n_featuresn_informativen_redundant
n_repeatedr   r#   )	r   make_classificationr   rH   feature_importances_r-   r8   r<   r?   )r/   yrJ   importancess       r1   test_importancesr      s    '  DAq 

CGGAqMMM*KQ2%%%%BJ';qrr?:??AAAAAAAr3   c                     t                      } t          j        d          }t          j        t
          |          5  |                     t          t          t          j
        dg                     d d d            d S # 1 swxY w Y   d S )Nz*sample_weight.shape == (1,), expected (6,)matchr   r{   )r   reescapepytestraises
ValueErrorrH   r/   rM   r8   rR   )rJ   msgs     r1   ,test_adaboost_classifier_sample_weight_errorr     s    


C
)@
A
AC	z	-	-	- < <7"*bT*:*:;;;< < < < < < < < < < < < < < < < < <s   6BBBc                     ddl m}  t           |                       }|                    t          t
                     t          t                                }|                    t          t                     ddl m} t           |            d          }|                    t          t
                     t          t                      d          }|                    t          t
                     ddgddgddgddgg}g d}t          t                                }t          j        t          d          5  |                    ||           d d d            d S # 1 swxY w Y   d S )	Nr   )RandomForestClassifier)RandomForestRegressorr"   r   )r    barr   r   zworse than randomr   )sklearn.ensembler   r   rH   r/   rY   r   rM   r   r	   r   r   r   r   )r   rJ   r   X_faily_fails        r1   test_estimatorr   	  s   777777 3355
6
6CGGAv
SUU
#
#CGGAw666666
1133!
D
D
DCGGAv
CEE
2
2
2CGGAv !fq!fq!fq!f-F!!!F
SUU
#
#C	z)<	=	=	=                                       s   =E!!E%(E%c                      d} t          dd          }t          j        t          |           5  |                    t
          j        t
          j                   d d d            d S # 1 swxY w Y   d S )Nz+Sample weights have reached infinite values   g      7@)rz   learning_rater   )r   r   warnsUserWarningrH   rc   re   rd   )r   rJ   s     r1   test_sample_weights_infiniter   %  s    
7C
"D
A
A
AC	k	-	-	- ( (	4;'''( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (s   +A''A+.A+z(sparse_container, expected_internal_type   c                     G d dt                     }t          j        dddd          \  }}t          j        |          }t          ||d	          \  }}}} | |          }	 | |          }
t           |d
          d                              |	|          }t           |d
          d                              ||          }|                    |
          }|                    |          }t          ||           |
                    |
          }|
                    |          }t          ||           |                    |
          }|                    |          }t          ||           |                    |
          }|                    |          }t          ||           |                    |
|          }|                    ||          }t          ||           |                    |
          }|                    |          }t!          ||          D ]\  }}t          ||           |                    |
          }|                    |          }t!          ||          D ]\  }}t          ||           |                    |
          }|                    |          }t!          ||          D ]\  }}t          ||           |                    |
|          }|                    ||          }t!          ||          D ]\  }}t          ||           d |j        D             }t+          fd|D                       sJ d S )Nc                   $     e Zd ZdZd fd	Z xZS )-test_sparse_classification.<locals>.CustomSVCz8SVC variant that records the nature of the training set.Nc                 x    t                                          |||           t          |          | _        | S z<Modification on fit caries data type for later verification.r{   superrH   r   
data_type_r.   r/   r   r|   r   s       r1   rH   z1test_sparse_classification.<locals>.CustomSVC.fit?  1    GGKK1MK:::"1ggDOKr3   r,   r4   r5   r6   __doc__rH   __classcell__r   s   @r1   	CustomSVCr   <  C        FF	 	 	 	 	 	 	 	 	 	r3   r   r         *   )	n_classesr   r   r#   r   r"   T)probabilityr   c                     g | ]	}|j         
S r~   r   r_   is     r1   r   z.test_sparse_classification.<locals>.<listcomp>  s    AAAaQ\AAAr3   c                     g | ]}|k    	S r~   r~   r_   texpected_internal_types     r1   r   z.test_sparse_classification.<locals>.<listcomp>      ;;;++;;;r3   )r   r   make_multilabel_classificationr8   ravelr   r   rH   rN   r   rT   r   predict_log_probar2   rf   staged_decision_functionzipr   r   r   rg   r?   )sparse_containerr   r   r/   r   X_trainX_testy_trainy_testX_train_sparseX_test_sparsesparse_classifierdense_classifiersparse_clf_resultsdense_clf_resultssparse_clf_resdense_clf_restypess    `                r1   test_sparse_classificationr   ,  s        C    2rab  DAq 	A'711'M'M'M$GVWf%%g..N$$V,,M +)---   
c.'""  *)---   
c'7  +22=AA(0088)+<=== +<<]KK(::6BB02CDDD +<<]KK(::6BB02CDDD +88GG(66v>>02CDDD +00GG(..vv>>02CDDD +CCMRR(AA&II),-?AR)S)S A A%!.-@@@@ +99-HH(77??),-?AR)S)S : :%>=9999 +??NN(==fEE),-?AR)S)S A A%!.-@@@@ +77vNN(55ffEE),-?AR)S)S : :%>=9999 BA#4#@AAAE;;;;U;;;<<<<<<<r3   c                     G d dt                     }t          j        dddd          \  }}t          ||d	          \  }}}} | |          }	 | |          }
t	           |            d
                              |	|          }t	           |            d
                              ||          }|                    |
          }|                    |          }t          ||           |                    |
          }|                    |          }t          ||          D ]\  }}t          ||           d |j
        D             }t          fd|D                       sJ d S )Nc                   $     e Zd ZdZd fd	Z xZS ))test_sparse_regression.<locals>.CustomSVRz8SVR variant that records the nature of the training set.Nc                 x    t                                          |||           t          |          | _        | S r   r   r   s       r1   rH   z-test_sparse_regression.<locals>.CustomSVR.fit  r   r3   r,   r   r   s   @r1   	CustomSVRr    r   r3   r  r   2   r   r   )r   r   	n_targetsr#   r   r"   r   c                     g | ]	}|j         
S r~   r   r   s     r1   r   z*test_sparse_regression.<locals>.<listcomp>  s    @@@aQ\@@@r3   c                     g | ]}|k    	S r~   r~   r   s     r1   r   z*test_sparse_regression.<locals>.<listcomp>  r   r3   )r   r   make_regressionr   r	   rH   rN   r   r   r   rg   r?   )r   r   r  r/   r   r   r   r   r   r   r   sparse_regressordense_regressorsparse_regr_resultsdense_regr_resultssparse_regr_resdense_regr_resr   s    `                r1   test_sparse_regressionr    s        C    #qr  DAq (811'M'M'M$GVWf%%g..N$$V,,M )99;;QOOOSS 
 ())++ANNNRR O
 +22=AA(008813EFFF +99-HH(77??+./BDV+W+W C C'!/>BBBB@@#3#?@@@E;;;;U;;;<<<<<<<r3   c                       G d dt                     } t           |             d          }|                    t          t                     t          |j                  t          |j                  k    sJ dS )z
    AdaBoostRegressor should work without sample_weights in the base estimator
    The random weighted sampling is done internally in the _boost method in
    AdaBoostRegressor.
    c                       e Zd Zd Zd ZdS )=test_sample_weight_adaboost_regressor.<locals>.DummyEstimatorc                     d S r,   r~   )r.   r/   r   s      r1   rH   zAtest_sample_weight_adaboost_regressor.<locals>.DummyEstimator.fit  s    Dr3   c                 @    t          j        |j        d                   S )Nr   )r8   zerosr-   )r.   r/   s     r1   rN   zEtest_sample_weight_adaboost_regressor.<locals>.DummyEstimator.predict  s    8AGAJ'''r3   N)r4   r5   r6   rH   rN   r~   r3   r1   DummyEstimatorr    s2        	 	 		( 	( 	( 	( 	(r3   r  r!   ry   N)r   r	   rH   r/   rY   rG   estimator_weights_estimator_errors_)r  r   s     r1   %test_sample_weight_adaboost_regressorr    s    ( ( ( ( ( ( ( ( nn..Q???E	IIau'((C0G,H,HHHHHHHr3   c                     t           j                            d          } |                     ddd          }|                     ddgd          }|                     d          }t          t          d                    }|                    ||           |                    |           |	                    |           t          t                                }|                    ||           |                    |           dS )zX
    Check that the AdaBoost estimators can work with n-dimensional
    data matrix
    r   3   r!   r   most_frequent)strategyN)r8   r   r   randnchoicer   r   rH   rN   r2   r	   r   )r   r/   ycyrr   s        r1   test_multidimensional_Xr"    s    
 )


"
"C		"aA	QFB		B	2BHHHIIE	IIa	MM!	n..//E	IIa	MM!r3   c                  ^   t           j        t           j        }} t          t	                                }t          |          }d                    |j        j                  }t          j
        t          |          5  |                    | |           d d d            d S # 1 swxY w Y   d S )Nr   z {} doesn't support sample_weightr   )rc   re   rd   r   r   r   formatr   r4   r   r   r   rH   )r/   r   r   rJ   err_msgs        r1   -test_adaboostclassifier_without_sample_weightr&    s    9dkqA%o&7&788I
y
1
1
1C077	8K8TUUG	z	1	1	1  1                 s   >B""B&)B&c                     t           j                            d          } t          j        ddd          }d|z  dz   |                     |j        d                   dz  z   }|                    d	d
          }|d	xx         dz  cc<   d|d	<   t          t                      d
d          }t          |          }t          |          }|
                    ||           |
                    |d d	         |d d	                    t          j        |          }d|d	<   |
                    |||           |                    |d d	         |d d	                   }|                    |d d	         |d d	                   }|                    |d d	         |d d	                   }	||k     sJ ||	k     sJ |t          j        |	          k    sJ d S )Nr   r   d     )numg?r&   g-C6?r   r   rv   i'  r   rz   r#   r{   )r8   r   r   linspacerandr-   reshaper	   r   r   rH   r=   rf   r   approx)
r   r/   r   regr_no_outlierregr_with_weightregr_with_outlierr|   score_with_outlierscore_no_outlierscore_with_weights
             r1   $test_adaboostregressor_sample_weightr6     s    )


#
#C
As%%%A	q3388AGAJ//&89A			"aA bEEERKEEEAbE ("$$11  O _--o.. !Q#2##2#'''LOOMM"A];;;*003B33B3@@&,,QssVQssV<<(..q"vq"v>> 00000 11111v}->????????r3   c                  .   t          t          j        d          ddi\  } }}}t          d          }|                    | |           t          t          j        |                    |          d          |	                    |                     d S )NT)
return_X_yr#   r   r"   r   r'   )
r   r   load_digitsr   rH   r   r8   rA   r2   rN   )r   r   r   r   models        r1    test_adaboost_consistent_predictr;  &  s     (8			.	.	.(=?( ($GVWf B///E	IIgw
	%%%f--A666f8M8M    r3   zmodel, X, yc                     t          j        |          }d|d<   d}t          j        t          |          5  |                     |||           d d d            d S # 1 swxY w Y   d S )Nir   z1Negative values in data passed to `sample_weight`r   r{   )r8   r=   r   r   r   rH   )r:  r/   r   r|   r%  s        r1   #test_adaboost_negative_weight_errorr=  5  s     LOOMM"AG	z	1	1	1 5 5		!Qm	4445 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5s   AA!$A!c                     t           j                            d          } |                     d          }|                     ddgd          }t          j        |          dz  }t          dd	
          }t          |dd	          }|                    |||           t          j	        |j
                                                  dk    sJ dS )zCheck that we don't create NaN feature importance with numerically
    instable inputs.

    Non-regression test for:
    https://github.com/scikit-learn/scikit-learn/issues/20320
    r   )r)  rv   rw   r   r   r)  gtDS 'T	rv      )	max_depthr#      r+  r{   N)r8   r   r   normalr  r=   r   r   rH   isnanr   r;   )r   r/   r   r|   tree	ada_models         r1   Ftest_adaboost_numerically_stable_feature_importance_with_small_weightsrF  E  s     )


#
#C



##A

Aq6
%%ALOOf,M!BR@@@D"TQSTTTIMM!QmM4448I2337799Q>>>>>>r3   c                 |   d}t          j        |d|           \  }}t          d|                               ||          }|                    |          }t          |                    d          dd           t          t          j	        |                    dd	|dz
  z  hk    sJ |
                    |          D ]W}t          |                    d          dd           t          t          j	        |                    dd	|dz
  z  hk    sJ X|                    d
                              ||           |                    |          }t          |                    d          dd           |
                    |          D ](}t          |                    d          dd           )dS )zCheck that the decision function respects the symmetric constraint for weak
    learners.

    Non-regression test for:
    https://github.com/scikit-learn/scikit-learn/issues/26520
    r!   r   )r   n_clusters_per_classr#   r   r'   r   g:0yE>)atolr   r   ry   N)r   r   r   rH   rT   r   r;   rh   r8   rQ   r   
set_params)global_random_seedr   r/   r   rJ   y_scores         r1   test_adaboost_decision_functionrM  V  s    I'!BT  DAq !:L
M
M
M
Q
QRSUV
W
WC##A&&GGKKQK''6666 ry!!""q"	A*>&????? //22 D D++QT:::: 29W%%&&1bIM.B*CCCCCCNNN""&&q!,,,##A&&GGKKQK''6666//22 ; ;++QT:::::; ;r3   c                      t          dd          } t          j        t          d          5  |                     t
          t                     d d d            d S # 1 swxY w Y   d S )Nr   SAMME)rz   	algorithmz'The parameter 'algorithm' is deprecatedr   )r   r   r   FutureWarningrH   r/   rM   )adaboost_clfs    r1   test_deprecated_algorithmrS  |  s    %1HHHL	m+T	U	U	U % %G$$$% % % % % % % % % % % % % % % % % %s   !AA"A)Xr   r   numpyr8   r   sklearnr   sklearn.baser   r   sklearn.dummyr   r   r   r   r	   !sklearn.ensemble._weight_boostingr
   sklearn.linear_modelr   sklearn.model_selectionr   r   sklearn.svmr   r   sklearn.treer   r   sklearn.utilsr   sklearn.utils._mockingr   sklearn.utils._testingr   r   r   sklearn.utils.fixesr   r   r   r   r   r   r   r   r/   rM   rY   rO   rP   rZ   	load_irisrc   permutationrd   rx   permre   load_diabetesrr   rD   rK   rV   r[   rk   markparametrizert   r   r   r   r   r   r   r   r   r   r  r  r"  r&  r6  r;  r=  rF  rM  rS  r~   r3   r1   <module>rg     s   < < 				            - - - - - - - - 9 9 9 9 9 9 9 9 B B B B B B B B : : : : : : 1 1 1 1 1 1 B B B B B B B B                 F F F F F F F F ! ! ! ! ! ! 8 8 8 8 8 8         
              	iA 	"XBx"bAq6Aq6Aq6:
(
(
(			"X1v1vMM	:: x
t{'(( DKcJJJ 	4; "8!##!(M8?" " " x
E E E:J J J7 7 71 1 1Y Y Y, !D!D!DEE
Y 
Y FE
Y*8 *8 *8Z, , ,$  6B B B*< < <     8( ( ( .C	
	
	
 	
 		

 	
 	^++	 	 W= W= W=t .C	
	
	
 	
 		

 	
 	^++	 	 ,= ,= ,=^I I I&  *  #@ #@ #@L   				ty$+6				hmX_= 5 5 5? ? ?""; "; ";L% % % % %r3   