
    siic                        d Z ddlZddlmZmZ ddlmZ ddlmZm	Z	m
Z
mZmZmZ ddlZddlZddlZddlmZ ddlmZ ddlmZ dd	lmZ d
dlmZ d
dlmZ edej         de
e!         fd            Z"edej#        de
e!         fd            Z"ede	e$ef         de
e!         fd            Z"deej         ej#        e	f         de
e!         fdZ"de$deddfdZ%de$de&deddfdZ'de(de(de(de$de$ddfdZ)de(de(de(de(de$de&de&ddfdZ*d e(d!ej+        d"ej+        d#eddf
d$Z,de$d%e&ddfd&Z-de$de$ddfd'Z. ej/        ej0                  j1        Z2d
Z3d(e(de(d)e(de$d*e!de$d+e&d,e&d-e&dej4        fd.Z5d/e(d0e(d1e(d2e(de$de$d,e&ddfd3Z6d/e(d0e(d2e(de$de$d,e&ddfd4Z7de$deddfd5Z8de$deddfd6Z9de$de&deddfd7Z:d8e	e$ef         d9ej4        d:e(de	e$ef         fd;Z; G d< d=ej<        j=                  Z>dS )>zTests for updaters.    N)partialupdate_wrapper)ascii_lowercase)AnyDictListOptionalUnionoverload)_parse_versionis_pd_cat_dtype   )DataIter   )CatIter)Devicemodelreturnc                     d S N r   s    ]/var/www/html/bet.cuttalo.com/ml/venv/lib/python3.11/site-packages/xgboost/testing/updater.pyget_basescorer      s    7:s    c                     d S r   r   r   s    r   r   r      s    69cr   c                     d S r   r   r   s    r   r   r      s    9<r   c                 J   t          | t          j                  r|                                 } t          | t                    r| d         d         d         }n8t          j        |                                           d         d         d         }t          j        |          S )z1Get base score from an XGBoost sklearn estimator.learnerlearner_model_param
base_score)
isinstancexgbXGBModelget_boosterdictjsonloadssave_config)r   
jintercepts     r   r   r   !   s     %&& $!!##% 
9%&;<\J

Z 1 1 3 344Y?@UV

 :j!!!r   tree_methoddevicec                 x    ddl m}m}m} dt          j        dt          j        ddf fd} |dd	
          \  }} |||            |ddd	          \  }} |||           	 ddt          j        dt          j        dt          t          j                 dt          t                   f fd} |dd	
          \  }} |||            |dddd	          \  }} |||            |dd	ddd          \  }} |||          }	t          j	        
                    t	          j        |	          d           t	          j        t	          j        |	          dk              sJ t	          j        |t	          j        t	          j        |          t	          j        t	          j        t          j                  j        g          g                    d         |j        d         z  }
t          j	        
                    |	|
           t          j                            d          }|                    dd|j        d         f          } ||||          }	t          j	        
                    t	          j        |	          d           t	          j        t	          j        |	          dk              sJ dS )zTest for init estimation.r   )make_classificationmake_multilabel_classificationmake_regressionXyr   Nc                    t          j        
dd	          }|                    | || |fg           t          |          }|                                d         d         d         }|j        dk    rdn|j        d         }t          j        |fdt          j	                  }t          j        
	dd|	          }|                    | || |fg           t          |          }|                                d         d         d         }t          j
        ||                                          rJ ||k     sJ d S )
Nr   r,   	max_depthn_estimatorsr-   eval_setvalidation_0rmser         ?shape
fill_valuedtype)r,   r-   r6   r7   r"   )r$   XGBRegressorfitr   evals_resultndimr>   npfullfloat32iscloseany)r2   r3   regbase_score_0score_0	n_targets	interceptbase_score_1score_1r-   r,   s            r   run_regz&check_init_estimation.<locals>.run_reg:   sQ   #qq
 
 
 	1Ax((($S))""$$^4V<Q?1AA!'!*	G9,3bjQQQ	# 
 
 
 	1Ax((($S))""$$^4V<Q?:lL99==?????      r         )	n_samplesrandom_state   )rT   rM   rU   wc                    t          j        dd
          }||                    | ||| |fg|g           n|                    | || |fg           t          |          }|j        dk    r'|                                d         d         d         }n&|                                d         d	         d         }|j        dk    rdn|j        d         }t          j	        |fd
t          j
                  }t          j        dd
|          }||                    | ||| |fg|g           n|                    | || |fg           t          |          }|j        dk    r'|                                d         d         d         }	n&|                                d         d	         d         }	t          j        ||                                          rJ ||	dz   k     sJ |S )Nr   r5   )sample_weightr9   sample_weight_eval_setr8   r   r:   loglossr   mloglossr<   r=   )r,   r6   r7   r-   r"   g-C6?)r$   XGBClassifierrB   r   
n_classes_rC   rD   r>   rE   rF   rG   rH   rI   )r2   r3   rW   clfrK   rL   rM   rN   rO   rP   r-   r,   s             r   run_clfz&check_init_estimation.<locals>.run_clfY   s-    #qq
 
 
 =GG1A!QRSQT      GGAqQF8G,,,$S))>Q&&((8CAFGG&&((8DQGG1AA!'!*	G9,3bjQQQ	# 
 
 
 =GG1A!QRSQT      GGAqQF8G,,,$S))>Q&&((8CAFGG&&((8DQGG:lL99==?????4''''r      )rT   n_labels	n_classesrU      )rT   rU   rc   n_informativen_redundant      ?)bins  r   lowhighsizer   )sklearn.datasetsr/   r0   r1   rE   ndarrayr	   r   floattestingassert_allclosesumallarray	histogramconcatenateuniquefinforG   maxr>   randomdefault_rnguniform)r,   r-   r/   r0   r1   rQ   r2   r3   r`   rN   np_intrngrW   s   ``           r   check_init_estimationr   2   s            !2: !"* ! ! ! ! ! ! ! !0 ?T;;;DAqGAqMMM?TQRHHHDAqGAqMMM AE) ):)*))1"*)=)	e) ) ) ) ) ) )X B???DAqGAqMMM))ab  DAq GAqMMMR1BTU  DAq 1IJrvi00#6666"(9%%)*****
BNBIaLL"(BHRZ<P<P<T;U2V2V#WXX	
 	
 	

	 '!*	  Jy&111
)


%
%C66A1a  IJrvi00#6666"(9%%)*******r   weightedc           	         ddl m} ddlm ddlm d}d}d}t          j                            d          } ||||          \  }}	|r|                    |	          nd
t          j
        ||	          }
t          j        ddg          t          j        j        t          j                  }i }t          j        d| ||d|
||
dfg|          }|                    |
d          }t#          j        |d         d                   sJ |d         d         d         dk     sJ fdt'          j                  D             }t          j        |j                  }t'          j        d                   D ]}|         }t          j        d| ||||         d|
||
dfg||         |          }t#          j        |d         d                   sJ |d         d         d         dk     sJ t          j                            t          j        |d         d                   t          j        |d         d                   dd           |                    |
          |d
d
|f<   t'          j        d                   D ]6}t          j                            |d
d
|f         |d
d
|f                    7d
S )zTest for quantile loss.r   r1   )mean_pinball_loss)_metric_decoratorrR      ri   )rT   
n_featuresrU   rm   Nweightg?r<   )r>   r@   reg:quantileerror)	objectiver,   r-   quantile_alphar"   Trainnum_boost_roundevalsrC   T)strict_shapequantile      4@c                 n    g | ]1} t          t          |                                        2S ))rY   alpha)r   r   ).0ir   r   r   r   s     r   
<listcomp>z'check_quantile_loss.<locals>.<listcomp>   s_         	)uQxPPP! 	
 	
  r   )r   r   custom_metricrC   g      >@r   gư>)atolrtol)rn   r1   sklearn.metricsr   xgboost.sklearnr   rE   r{   RandomStater$   QuantileDMatrixru   zerosr>   rG   trainpredicttmnon_increasingrangerm   emptyrq   rr   )r,   r   r-   r1   rT   r   r7   r   r2   r3   Xyr"   rC   booster_multipredt_multimetricspredtsr   a	booster_ir   r   r   r   s                       @@@@r   check_quantile_lossr      sr   000000111111111111IJL
)


%
%C?  DAq
  ++		Q&	1	1	1BHc3Z  E 2:>>>J$&LI,&#$	
 	
 	$G}o!  M  '''>>K\'2:>????? ,R047777       uz""  G Xk'((F5;q>"" - -!HI0* "#(m  (=/!!*%
 
 
	  g!6z!BCCCCCG$Z04t;;;;

""H\'*:677H\'*+>?@@	 	# 	
 	
 	
 !((,,qqq!t5;q>"" D D

""6!!!Q$<QQQT1BCCCCD Dr   n_samples_per_batchr   	n_batchesc           	         t          j        t          j        | |||dk              ddd}t          j        |          }|d|ddgd}t          j        ||          }|                                \  }	}
}t          j        |	|
|	          }t          j        ||          }|                    |          }|                    |          }t          j	        
                    ||           d
S )z2Check external memory with the quantile objective.cpucacheFr   on_hostr   g?皙?)r,   r   r-   r   r   N)r   IteratorForTestmake_batchesr$   DMatrixr   	as_arraysr   rE   rq   rr   )r   r   r   r,   r-   itXy_itparams
booster_itr2   r3   rW   r   boosterpredt_itpredts                   r   check_quantile_loss_extmemr      s     
		,j)Vu_	U	U
 
 
B
 KOOE"(*	 F 65))JllnnGAq!	Q!	$	$	$Bi##G!!%((HOOBEJuh/////r   n_binsr   is_catc                   |rt          | ||dddd|d	  	        }n,t          j        t          j        | |||dk              d|d	}t	          j        |||
          }t          j        t          d          5  t	          j	        |d|d|d          }	ddd           n# 1 swxY w Y   t	          j	        ||d|d          }	|rt          | ||dddd|d	  	        }n+t          j        t          j        | |||dk              ddi}t	          j
        |||
          }
t	          j	        ||d|
d          }|                                }|
                                }t          j                            |d         |d                    t          j                            |d         |d                    |	                    |          }|                    |
          }t          j                            ||           dS )z+Basic test for the `ExtMemQuantileDMatrix`.ra           r<   Fr   )	r   r   r   n_catssparsity	cat_ratioonehotr-   r   r   use_cupyr   max_binenable_categoricalzOnly the `hist`)matchapprox)r-   r,   r   r   r   N)r-   r   r   r   )r   r   r   r   r$   ExtMemQuantileDMatrixpytestraises
ValueErrorr   r   get_quantile_cutrE   rq   rr   r   )r   r   r   r   r-   r   r   r   r   r   r   r   cut_itcutr   r   s                   r   check_extmem_qdmr     s     
 3!

 

 

 _#ZVu_   
 
 
 %b&VTTTE	z):	;	;	; 
 
Yh6JJ
 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 f--ua  J  
 3!

 

 

 _#ZVu_  
 	
 
 
	RF	K	K	KBi6f==rSTUUUG##%%F




CJvay#a&111Jvay#a&111!!%((HOOBEJx/////s   :B""B&)B&	n_entriesindptrdatadtypesc                    |j         d         |d         k    sJ |j         d         | k    sJ |j        t          j        k    sJ t	          d|j                  D ]}t          ||dz
                     }t          ||                   }t	          |dz   |          D ]P}||         ||dz
           k    sJ t          |j        |dz
                     r||         ||dz
           dz   k    sJ QdS )zCheck the cut values.r   r   r   N)	r>   r@   rE   uint64r   rm   intr   iloc)r   r   r   r   r   begendjs           r   	check_cutr   g  s    :a=F2J&&&&:a=I%%%%<29$$$$1fk"" 2 2&Q-  &)nnsQw$$ 	2 	2A7T!a%[((((v{1q5122 2Aw$q1u+/1111	22 2r   r   c                    ddl }d}d}d}|                    t          j        g|z            }t	          j        |||          \  }}}	t          j        |||	|          }
|
                                \  }}t          |dz   |z  |||           t          j
        |||		          }
t          j        | |d
|
           |
                                \  }}t          |dz   |z  |||           d}d}t	          j        t	          j        ||||          ddd}t          j
        |          }t          j        | |d
|
           |
                                \  }}t          |dz   |z  |||           d}t	          j        |||dd          \  }}|r2ddl}ddl}|                    |          }|                    |          }t          j        |||d          }|                                \  }}t          ||z  |||j                   t          j
        ||d          }t          j        | |d
|           |                                \  }}t          ||z  |||j                   t	          j        |||ddd          \  }}t)          d |j        D                       }||z
  }||z  |dz   |z  z   }t          j        |||d          }|                                \  }}t          ||||j                   t          j
        ||d          }t          j        | |d
|           |                                \  }}t          ||||j                   dS )zCheck with optional cupy.r   Ni         r   )r   r   r   r   )r,   r   rV      r   Fr       r   )r   r   Tr   r   r<   )r   r   r   c                 0    g | ]}t          |          d S )r   r   )r   r@   s     r   r   z1check_get_quantile_cut_device.<locals>.<listcomp>  s%    LLL_U5K5KL!LLLr   )pandasSeriesrE   rG   r   r1   r$   r   r   r   r   r   r   r   make_categoricalcudfcupyfrom_pandasru   r   len)r,   r   pdrT   r   r   r   r2   r3   rW   Xywr   r   r   r   r   r   n_categoriesr   cpn_cat_featuresn_num_featuresr   s                          r   check_get_quantile_cut_devicer   x  s   IJGYY
|j011F  JJJJGAq!*1a7KKKC''))LFDw{j(&$???
+a1
%
%
%CIkg>>DDD''))LFDw{j(&$???I			,j)X	N	N
 
 
B
 k"ooBIkg>>DDD''))LFDw{j(&$??? L:|EC  DAq  QHHQKK		Q7t	L	L	LB&&((LFDlZ'qx@@@	Qd	3	3	3BIkg>>CCC&&((LFDlZ'qx@@@ :|ECSV  DAq LLLLLMMN.0N~-10NNI		Q7t	L	L	LB&&((LFDiqx000	Qd	3	3	3BIkg>>CCC&&((LFDiqx00000r   c                 x    |                     d          }t          | d           |rt          | d           dS dS )zCheck the quantile cut getter.cudaFTN)
startswithr   )r,   r-   r   s      r   check_get_quantile_cutr    sO       ((H!+u555 9%k4888889 9r   rT   r   r   r   extmemr   c                z   t          t          d|           d          }	t          | |	z  ||	|d||||rdnd 	  	        }
|rM|dk    rt          j        |
|          }n^|dk    rt          j        |
|          }nAt          d	| d
          |
                                \  }}t          j        |||          }|S )Nr   r   rg   r   )r   r   r   r   r   r-   r   histr   r   ztree_method z not supported.)rz   minr   r$   r   r   r   xy)rT   r   r   r-   r   r,   r   r  r   r   r   r   catlabels                 r   _create_dmatrixr	    s     C9%%q))I	Y)ggT

 

 

B  L&  !7'9  BB H$$R4FGGGBBHKHHHIIIUUWW
U[e8JKKKIr   rowscolsroundscatsc                 \   i }i }|t           |d}	t          | |||dd||d	  	        }
t          j        |	|
||
dfg|           t          | |||d|d|d	  	        }t          j        |	|||dfg|           t          j                            t	          j        |d         d	                   t	          j        |d         d	                   d
           t          j	        |d         d	                   sJ i }t          |	d<   d|	d<   t          j        |	|||dfg|           |d         d	         }|d         d	         }t          ||          D ]\  }}||k    sJ d|	d<   i }t          j        |	|d|dfg|           t          j	        |d         d	                   s
J |            dS )z0Test for one-hot encoding with categorical data.)r,   max_cat_to_onehotr-   r   TF)r   r-   r   r   r,   r  r   r   r   )r   r-   r   r,   r   r  r   r;   gMbP?r   r  r   
reg_lambdarg   r   N)
USE_ONEHOTr	  r$   r   rE   rq   rr   ru   r   r   USE_PARTzip)r
  r  r  r  r-   r,   r  by_etl_resultsby_builtin_results
parameters	Xy_onehotXy_catby_groupingrmse_oh
rmse_groupr   bs                    r   check_categorical_oher    si    9;N<> #'	" "J   
 
 
I I7#$#    
 
 
F I !'    J
(011
#G,V455    
 /8@AAAAA57K&.J"# J|I !     !)&1GW%f-JGZ((  1Avvvvv"J|KI !     [1&9::GGKGGGGGr   c                   	 ||d	t          | ||d||d|d	  	                                        dt          ddf	fd	} |t                      |t                     dS )
z+Check categorical data with missing values.r,   r-   r<   FT)r   r   r-   r,   r   r  r   r  r   Nc                 N   | d<   i }t          j        ddfg|          }t          j        |d         d                   sJ |                              }t          j        |          }t          j                            ||d         d         d         d           d S )	Nr  r   r   r   r;   r   gh㈵>r  )	r$   r   r   r   r   root_mean_squarerE   rq   rr   )r  rC   r   y_predtr;   r   r  r  s        r   runz&check_categorical_missing.<locals>.runq  s    *;
&'(*)=/%
 
 
  g!6v!>?????//"%%"5'22

""4g)>v)Fr)JQU"VVVVVr   )r	  	get_labelr   r  r  )
r
  r  r  r-   r,   r  r$  r   r  r  s
          @@@r   check_categorical_missingr&  Y  s     2=!O!OJ	

 

 

B LLNNEWs Wt W W W W W W W W& C
OOO CMMMMMr   c                    ddl }t          j                            d          d}d}|                    fdt          |          D             d          d|                                         }t          j        d| |d	
          }|                    t          |                    }|	                    ||||fg           t          j        |                                d         d                   sJ dS )z6Test data with size smaller than number of categories.r   Nd   ra   c           	          g | ]>}d                                          t          t                    d                    ?S ) rV   r   )joinchoicelistr   )r   r   r   s     r   r   zrun_max_cat.<locals>.<listcomp>  s=    RRRD11::	;	;RRRr   category)r@   T
   )r   r,   r-   r7   )r2   r3   r9   r:   r;   )r   rE   r{   r|   r   r   to_framer$   rA   rB   r   r   rC   )	r,   r-   r   n_catnr2   rJ   r3   r   s	           @r   run_max_catr3    s   
)


"
"CE	A
		RRRRU5\\RRR 	 	 	 	qb	
 (** 
 
	  C 			%((AGGa1AxG(((S--//?GHHHHHHHr   c                    t           j                                        }|                    ddd                              dd          }|                    ddd          }t          j        t           j                  j        dz   |d	<   t          j
        ||d
gdz            }t          j        t                    5  t          j        | |d|           ddd           n# 1 swxY w Y   d|d	<   t          j
        ||d
gdz            }t          j        t                    5  t          j        | |d|           ddd           n# 1 swxY w Y   |                    ddd                              dd          }|                    ddd          }t          j
        ||d
gdz            }t          j        t                    5  t          j        | |d|           ddd           n# 1 swxY w Y   |dk    r}ddl}|                    |          |                    |          }}t          j        t                    5  t          j        ||d
gdz            }ddd           dS # 1 swxY w Y   dS dS )z%Test with invalid categorical inputs.r      i  rj   r(  r/  r   )locscalerm   )      c)feature_typesr   Ni   r   )rE   r{   r|   integersreshapenormaliinfoint32rz   r$   r   r   r   r   r   r   ru   r   )r,   r-   r   r2   r3   r   r   s          r   run_invalid_categoryrA    s   
)


!
!C..66sB??A

q
,,Ax!!%)AeH 
Q#	4	4	4B	z	"	" F F	+@@"EEEF F F F F F F F F F F F F F F AeH	Q#	4	4	4B	z	"	" F F	+@@"EEEF F F F F F F F F F F F F F F 	

q
--55c2>>A

q
,,A	Q#	4	4	4B	z	"	" F F	+@@"EEEF F F F F F F F F F F F F F F xx{{BHHQKK1]:&& 	E 	E$Q#DDDB	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E	 sH    C%%C),C))EEEG66G:=G:I77I;>I;c                    t           j                            d          }ddlm} ddlm} ddlm} d} ||d|          \  }}	|r|	                    |	          }
|
|

                                z  }
t          j        ||	|

          }t          |          \  \  }}}}|dk    s|dk    rddi}nddi} |j        |	|
fi |}n)t          j        ||	          }t          j        |	          }t          j        | |d|d|d          }t          j        | d|d|d          }t#          j        |                                          }t#          j        |                                          }t)          |          t)          |          k    sJ |                    d          }t          j        |          }t#          j        |                                          }t)          |          t)          |          k    sJ t          j        | |dz   d|d|d          }t#          j        |                                          }t           j                            t)          |          t          j        t)          |                    dz              i }t          j        | |dddd|d|dfg|           |d         d         }|d         dk     sJ t5          j        |          sJ d S )!zTest for adaptive trees.ri   r   )__version__r   )statsr   r   )rU   r   r   r   r9  percentile_rank2   
percentilezreg:absoluteerror)r,   r"   r   r-   r   )r,   r   r-   ubj)
raw_format)
model_filerg   r   )r,   r-   r   	subsampleetar/  r   r   maer   r   N)rE   r{   r   sklearnrC  rn   r1   sklearn.utilsrD  r>  r  r$   r   r   _weighted_percentilemedianr   r(   r)   r*   r   save_rawBoosterrq   rr   asarrayr   r   )r,   r   r-   r   sklearn_versionr1   rD  rT   r2   r3   rW   r   sk_majorsk_minor_kwargsr"   	booster_0	booster_1config_0config_1raw_booster	booster_2config_2rC   rM  s                             r   run_adaptivera    s   
)


%
%C666666000000######I?2C  DAq  "JJIJ&&	QUUWW[Aa(((%3O%D%D"8Qa<<8q==',FF"B'F/U/q
 

 


 [AYq\\
	&$,		
 	
 		 	 	I 	&,	
 	

 	  I z)//1122Hz)//1122H""mH&=&=====$$$66K{333Iz)//1122H""mH&=&=====	&$s*,		
 	
 		 	 	I z)//1122HJhM(,C,C!D!Dq!H   02LI&,	
 	
 	G}o!    w

&Cr7T>>>>S!!!!!!!r   paramdmat
num_roundsc                    i }t          j        | |||dfgd|          }|                                |                                k    sJ |                                |k    sJ |j        |j        k    sJ |j        |j        k    sJ |S )z-Get training result from parameters and data.r   F)r   verbose_evalrC   )r$   r   num_featuresnum_colnum_boosted_roundsfeature_namesr;  )rb  rc  rd  resultr   s        r   train_resultrl    s      Fig  G !!T\\^^3333%%'':5555 D$66666 D$66666Mr   c                   4    e Zd ZdZdej        dededefdZ	dS )ResetStrategyz"Callback for testing multi-output.r   epoch	evals_logr   c                 v    |dz  dk    r|                     ddi           n|                     ddi           dS )Nr   r   multi_strategymulti_output_treeone_output_per_treeF)	set_param)selfr   ro  rp  s       r   after_iterationzResetStrategy.after_iteration7  sI    19>>OO-/BCDDDDOO-/DEFFFur   N)
__name__
__module____qualname____doc__r$   rS  r   r'   boolrw  r   r   r   rn  rn  4  sM        ,,S[   RV      r   rn  )?r{  r(   	functoolsr   r   stringr   typingr   r   r   r	   r
   r   numpyrE   r   xgboostr$   xgboost.testingrq   r   xgboost.corer   xgboost.datar   corer   	data_iterr   utilsr   r%   rp   r   rS  strr   r|  r   r   r   r   ro   r   r   r  r?  r@  rz   r  r  r   r	  r  r&  r3  rA  ra  rl  callbackTrainingCallbackrn  r   r   r   <module>r     s      - - - - - - - - " " " " " " = = = = = = = = = = = = = = = =                ' ' ' ' ' ' ( ( ( ( ( (                   
 : :$u+ : : : 
 : 
 9 9e 9 9 9 
 9 
 <c3h <DK < < < 
 <"s{D01"	%[" " " ""l+s l+F l+t l+ l+ l+ l+`WDS WDD WD& WDT WD WD WD WDt000 0 	0
 0 
0 0 0 0>I0I0I0 	I0
 I0 I0 I0 I0 
I0 I0 I0 I0X22J2.0j2BE2	2 2 2 2"E1s E1d E1t E1 E1 E1 E1P9 9S 9T 9 9 9 9 RXbh#
$$$ 	$
 $ $ $ $ $ $ 	[$ $ $ $NbH
bH bH 	bH
 bH bH bH bH 
bH bH bH bHJ.
.
. .
 . . . 
. . . .bIS I& IT I I I I0Ec E6 Ed E E E EDX"c X"T X"6 X"d X" X" X" X"vS>!$:=	#s(^   *    CL1     r   