
    hc                        S SK r S SKrS SKJr  S SKJr  S SKJr  S SKJ	r	J
r
Jr  S SKrSSKJrJr  \" \5      R"                  r\S-  R'                  S	S
9r/ SQr\(       a  \R,                  " \S\S9OSr " S S5      rS r\" S5      r\" S5      r\" S5      r\" S5      r\" S5      r\" S5      r\" S5      r \" S5      r!\" S\S9r"\" S5      r#\" S5      r$\" S5      r%\" S5      r&\" S5      r'\" S 5      r(\" S!5      r)\" S"5      r*\" S#5      r+\" S$5      r,\" S%5      r-\" S&5      r.\" S'5      r/\" S(5      r0\" S)5      r1\" S*5      r2\" S+5      r3\" S,5      r4\" S-5      r5\" S.5      r6\" S/5      r7\" S05      r8\" S15      r9\" S25      r:\" S35      r;\" S45      r<\" S55      r=\" S65      r>\" S75      r?\" S85      r@\" S95      rA\" S:5      rB\" S;5      rC\" S<5      rD\" S=5      rE\" S>5      rF\" S?5      rG\" S@5      rH\" SA5      rI\" SB5      rJSCSD.SE\K4SF jjrLSSE\K4SG jjrMSSHSHSI.SJ jjrNSKSLSMSMSLSHSHSN.SO jrOSHSHSI.SP jrPSKSHSHSQ.SR jrQSKSSSHSHST.SU jrRSV rSSSHSHSW.SX jrTSHSHSI.SY jrUSKSZSHSHST.S[ jrVSHSHSI.S\ jrWSHSHSI.S] jrXSHSHSI.S^ jrYSKS_SHSHST.S` jrZSSHSHSW.Sa jr[SLSMSMSLSKSHSHSb.Sc\\Sd\\Se\\Sf\\Sg\K4
Sh jjr]SKSHSHSQ.Sg\K4Si jjr^SKSHSHSQ.Sg\K4Sj jjr_SKSHSHSQ.Sg\K4Sk jjr`SKSSSHSHST.Sg\K4Sl jjraSHSHSI.Sm jrbSKSZSHSHST.Sg\K4Sn jjrcSHSHSI.So jrdSHSHSI.Sp jreSHSHSI.Sq jrfSKS_SHSHST.Sr jrgSHSHSI.Ss jrhSSt.Su\
\   4Sv jjriSSt.Su\
\   4Sw jjrjS Sx.Sy\k4Sz jjrlS{\k4S| jrmS}\kS~\kS\k4S jrn\(       a  \R                  " SSSSSSS5      OSrpSu\4S jrqg)    N)defaultdict)reduce)Path)CallableOptionalTuple   )cupyhas_cupy_gpuz_custom_kernels.cuutf8encoding)0backprop_clipped_linear<double>backprop_clipped_linear<float>backprop_dish<double>backprop_dish<float>backprop_gelu<double>backprop_gelu<float>backprop_hard_swish<double>backprop_hard_swish<float>%backprop_hard_swish_mobilenet<double>$backprop_hard_swish_mobilenet<float>backprop_maxout<double>backprop_maxout<float>backprop_mish<double>backprop_mish<float>backprop_reduce_max<double>backprop_reduce_max<float>backprop_reduce_mean<double>backprop_reduce_mean<float>backprop_reduce_sum<double>backprop_reduce_sum<float>backprop_seq2col<double>backprop_seq2col<float>backprop_swish<double>backprop_swish<float>clipped_linear<double>clipped_linear<float>dish<double>dish<float>gather_add<double>gather_add<float>gelu<double>gelu<float>maxout<double>maxout<float>mish<double>mish<float>pad<double>
pad<float>pad<int>pad<long long>reduce_max<double>reduce_max<float>reduce_sum<double>reduce_sum<float>seq2col<double>seq2col<float>swish<double>swish<float>)z--std=c++11)codeoptionsname_expressionsc                       \ rS rSr% Sr\\S'   \S   \S'   \\/ S4      \S'   / SQr	SS	.S\S
\\/ S4      SS4S jjr
S rS rSrg)
LazyKernelI   zWraps around `cupy.RawModule` and `cupy.RawKernel` to verify CuPy availability
and lazily compile the latter on first invocation.

The default CuPy behaviour triggers the compilation as soon as the `cupy.RawKernel` object
is accessed.namezcupy.RawKernel_kernel_compile_callbackrE   rF   rG   Ncompile_callbackrJ   returnc                *    Xl         S U l        X l        g NrH   )selfrE   rJ   s      X/home/james-whalen/.local/lib/python3.13/site-packages/thinc/backends/_custom_kernels.py__init__LazyKernel.__init__V   s     	!1    c                 H    U R                  5         U R                  " U0 UD6  g rM   )_compile_kernelrF   )rN   argskwargss      rO   __call__LazyKernel.__call__`   s    d%f%rR   c                    U R                   b  g U R                  b  U R                  5       U l         O+[        b$  [        R                  U R                  5      U l         U R                   c  [        SU R                   S35      eg )Nzcouldn't compile Cupy kernel '')rF   rG   KERNELSget_functionrE   
ValueError)rN   s    rO   rT   LazyKernel._compile_kerneld   so    <<#!!-113DL "//		:DL<<=dii[JKK  rR   )rG   rF   rE   )__name__
__module____qualname____firstlineno____doc__str__annotations__r   r   	__slots__rP   rW   rT   __static_attributes__ rR   rO   rC   rC   I   sx     I&''-=)= >??8I FJ	22 #8B0@,@#AB	2
 
2&
LrR   rC   c                  p    [         (       d  g [        R                  " [        S-  R	                  SS9S5      $ )Nz_murmur3.cur   r   	hash_data)r   r
   	RawKernelPWD	read_textrh   rR   rO   compile_mmhrn   q   s.    <>>3.9969JKXXrR   r(   r'   r*   r)   r,   r+   r.   r-   rj   rI   r0   r/   r2   r1   r4   r3   r5   r6   r8   r7   r:   r9   r<   r;   r>   r=   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   Tzerosrp   c                h    U(       a  [         R                  " X5      $ [         R                  " X5      $ rM   )r
   rp   empty)shapedtyperp   s      rO   _allocru      s#    zz%''zz%''rR   c                 h    U(       a  [         R                  " U 5      $ [         R                  " U 5      $ rM   )r
   
zeros_like
empty_like)arrayrp   s     rO   _alloc_likerz      s#    u%%u%%rR      )threads_per_block
num_blocksc                   US:  a  [        SU 35      eU  H  n[        U5        M     U  Vs/ s H  n[        U5      PM     nn[        U5      nXf* U-  -  n[        R
                  " USS9n[        U 5      U4U S   R                  SS  -   n[        R                  " XpS   R                  S9n[        R                  " [        U 5      S5      n	[        U 5       H  u  pUR                  R                  X'   M     [        R
                  " U	5      n	[        [        R                  U S   R                  SS  S5      nUR                  S:X  a  [!        U4U4XX[[        U 5      U45        U$ UR                  S:X  a  [#        U4U4XX[[        U 5      U45        U$ UR                  S:X  a  [%        U4U4XX[[        U 5      U45        U$ UR                  S:X  a  ['        U4U4XX[[        U 5      U45        U$ s  snf )	N   z.Rounding for padding must at least be 1, was: int32rt   r   int64float32float64)r]   _is_float_or_int_arraylenmaxr
   ry   rs   rr   rt   numpy	enumeratedataptrr   operatormulpad_kernel_floatpad_kernel_doublepad_kernel_int32pad_kernel_int64)seqsround_tor|   r}   seqseq_lensmax_seq_lenfinal_shapeoutptrsidxstrides               rO   padr      s   !|I(TUUs#  %))DSCDH)h-K <(**Kzz('2Ht9k*T!W]]12->>K
**[Q
6C ;; 	D dOHHLL	 $::dDHLL$q'--"3Q7F
yyIM #d)[A	
0 J' 
i	M #d)[A	
$ J 
g	M #d)[A	
 J 
g	M #d)[A	
 Je *s   G2Fg      ?g        )inplaceslopeoffsetmin_valmax_valr|   r}   c                    [        U 5        U nU(       d
  [        U SS9nU R                  S:X  a  [        U4U4XX#XEU R                  45        U$ [        U4U4XX#XEU R                  45        U$ NFro   r   )_is_float_arrayrz   rt   clipped_linear_kernel_floatsizeclipped_linear_kernel_double)	Xr   r   r   r   r   r|   r}   r   s	            rO   clipped_linearr      s     A
C!5)ww)#M UGaff=	
 J 	%M UGaff=	

 JrR   c                "   U R                   S:w  a  [        SU R                    35      eUR                   S:w  a  [        SUR                    35      e[        U 5        UR                  S5      n[	        XR
                  S   5        UR
                  S   nUR
                  S   nU R
                  S   nU R
                  S   n[        XG4U R                  SS9nU R                  S	:X  a  [        U4U4XXXtU45        U$ [        U4U4XXXtU45        U$ )
Nr	   z5gather_add expects table with dimensionality 2, was: z7gather_add expects indices with dimensionality 2, was: r   r   r   Trt   rp   r   )
ndimr]   r   astype_check_indicesrs   ru   rt   gather_add_kernel_floatgather_add_kernel_double)	tableindicesr|   r}   BKTOr   s	            rO   
gather_addr     s   zzQCEJJ<P
 	
 ||qEgll^T
 	
 EnnW%G7KKN+aAaAAAAA
!u{{$
7C{{iM-/#g!PQ1R	
 J 	!M-/#g!PQ1R	
 JrR   )r   r|   r}   c                    [        U 5        U nU(       d
  [        U SS9nU R                  S:X  a  [        U4U4X@U R                  45        U$ [        U4U4X@U R                  45        U$ r   )r   rz   rt   dish_kernel_floatr   dish_kernel_double)r   r   r|   r}   r   s        rO   dishr   5  sn    A
C!5)ww):-*;)=?OP J 	J=+<*>@PQJrR   g      @)r   	thresholdr|   r}   c                    [        U 5        U nU(       d
  [        U SS9nU R                  S:X  a  [        U4U4XPX R                  45        U$ [        U4U4XPX R                  45        U$ r   )r   rz   rt   gelu_kernel_floatr   gelu_kernel_doubler   r   r   r|   r}   r   s         rO   gelur   B  sv    A
C!5)ww)M-/#)VV1L	
 J 	M-/#)VV1L	
 JrR   c                 R    U c  [         R                  " U/SS9n U $ [        X5        U $ )Nr   r   )r
   ry   _check_lengths)lengthsr   s     rO   check_seq2col_lengthsr   S  s/    **aS0 N 	w"NrR   )r   r|   r}   c                ~   [        U 5        U R                  S   nUS-  S-   nU R                  S   n[        X%5      nUR                  S   n[        XWU-  4U R                  SS9n	U R
                  S:w  aH  UR
                  S:w  a8  U R                  S:X  a  [        U4U4XX!XWU45        U	$ [        U4U4XX!XWU45        U	$ Nr   r	   r   Tr   r   )r   rs   r   ru   rt   r   seq2col_kernel_floatseq2col_kernel_double)
r   nWr   r|   r}   r   nFInLr   s
             rO   seq2colr   [  s    C		!A	a!B		!A#G/G	q	B
!VCIIT
:C
xx1}*99	!  13cQSU5V J	 " 13cQSU5V JrR   c          
          [        U 5        U R                  u  p4nX44n[        X`R                  SS9n[        USSS9nU R                  S:X  a  [	        U4U4XxXXE45        Xx4$ [        U4U4XxXXE45        Xx4$ )NFr   ir   )r   rs   ru   rt   maxout_kernel_floatmaxout_kernel_double)	r   r|   r}   r   r   P	out_shapebestwhichs	            rO   maxoutr   t  s    AggGA!I)77%8D9Cu5Eww)M-/$qQ1J	
 ;	 	M-/$qQ1J	
 ;rR      c                    [        U 5        U nU(       d
  [        U SS9nU R                  S:X  a  [        U4U4XPX R                  45        U$ [        U4U4XPX R                  45        U$ r   )r   rz   rt   mish_kernel_floatr   mish_kernel_doubler   s         rO   mishr     sv    A
C!5)ww)M-/#)VV1L	
 J	 	M-/#)VV1L	
 JrR   c          
         [        U 5        [        U5      nU R                  S   nU R                  S   n[        X5        [	        XF4U R
                  SS9nU R
                  S:X  a  [        U4U4XpXXV45        U$ [        U4U4XpXXV45        U$ Nr   r   Tr   r   )r   r   rs   r   ru   rt   reduce_sum_kernel_floatreduce_sum_kernel_doubler   r   r|   r}   r   r   r   r   s           rO   
reduce_sumr     s    AGA	
A	
A7
!qwwd
3Cww)M-/#'a1K	
 J	 	!M-/#'a1K	
 JrR   c          
      F   [        U 5        [        U5      nU R                  S   nU R                  S   n[        X5        [	        XF4U R
                  SS9nU R
                  S:X  a  [        U4U4XpXXV45        O[        U4U4XpXXV45        XqR                  S5      S-   -  nU$ )Nr   r   Tr   r   )r   g|=)	r   r   rs   r   ru   rt   r   r   reshaper   s           rO   reduce_meanr     s    AGA	
A	
A7
!qwwd
3Cww)M-/#'a1K	
 	!M-/#'a1K	

 ??7#e++CJrR   c                :   [        U 5        [        U5      nU R                  S   nU R                  S   n[        XSS9  XF4n[	        XpR
                  SS9n[	        USSS9n	U R
                  S:X  a  [        U4U4XXXEU45        X4$ [        U4U4XXXEU45        X4$ )Nr   r   
min_lengthFr   r   r   )r   r   rs   r   ru   rt   reduce_max_kernel_floatreduce_max_kernel_double)
r   r   r|   r}   r   r   r   r   maxesr   s
             rO   
reduce_maxr     s    AGA	
A	
A7!,I9GG59E9Cu5Eww)M-/%ARS1T	
 <	 	!M-/%ARS1T	
 <rR   g      1@c                    [        U 5        U nU(       d
  [        U SS9nU R                  S:X  a  [        U4U4XPX R                  45        U$ [        U4U4XPX R                  45        U$ r   )r   rz   rt   swish_kernel_floatr   swish_kernel_doubler   s         rO   swishr     sv    A
C!5)ww)M-/#)VV1L	
 J 	M-/#)VV1L	
 JrR   c                ~   [        U 5        U R                  S   nUS-  S-   nU R                  S   U-  n[        X%5      nUR                  S   n[        XW4U R                  SS9n	U R
                  S:w  aH  UR
                  S:w  a8  U R                  S:X  a  [        U4U4XX!XWU45        U	$ [        U4U4XX!XWU45        U	$ r   )r   rs   r   ru   rt   r   backprop_seq2col_kernel_floatbackprop_seq2col_kernel_double)
dYr   r   r|   r}   r   r   r   r   r   s
             rO   backprop_seq2colr     s    B
A	a!B
rA#G/G	q	B
!rxxt
4C	ww!|)88y ) 13cwART5U J	 + 13cwART5U JrR   )r   r   r   r   r   r|   r}   r   r   r   r   r   c                    [        U 5        [        XR                  S9  U n	U(       d
  [        U SS9n	U R                  S:X  a  [	        U4U4XXX4XYR
                  45        U	$ [        U4U4XXX4XYR
                  45        U	$ Nrs   Fro   r   )r   rs   rz   rt   $backprop_clipped_linear_kernel_floatr   %backprop_clipped_linear_kernel_double)
r   r   r   r   r   r   r   r|   r}   r   s
             rO   backprop_clipped_linearr     s     BAXX&
C"E*	xx9,M a((C	
 J 	.M a((C	
 JrR   c                    [        U 5        [        XR                  S9  U nU(       d
  [        U SS9nU R                  S:X  a  [	        U4U4XPXR
                  45        U$ [        U4U4XPXR
                  45        U$ r   )r   rs   rz   rt    backprop_hard_swish_kernel_floatr   !backprop_hard_swish_kernel_doubler   r   r   r|   r}   r   s         rO   backprop_hard_swishr  2  s     BAXX&
C"E*	xx9(M-/#1hh1G	
 J	 	*M-/#1hh1G	
 JrR   c                    [        U 5        [        XR                  S9  U nU(       d
  [        U SS9nU R                  S:X  a  [	        U4U4XPXR
                  45        U$ [        U4U4XPXR
                  45        U$ r   )r   rs   rz   rt   *backprop_hard_swish_mobilenet_kernel_floatr   +backprop_hard_swish_mobilenet_kernel_doubler   s         rO   backprop_hard_swish_mobilenetr  H  s     BAXX&
C"E*	xx92M-/#1hh1G	
 J	 	4M-/#1hh1G	
 JrR   c                    [        U 5        [        XR                  S9  U nU(       d
  [        U SS9nU R                  S:X  a  [	        U4U4XPXR
                  45        U$ [        U4U4XPXR
                  45        U$ r   )r   rs   rz   rt   backprop_dish_kernel_floatr   backprop_dish_kernel_doubler   s         rO   backprop_dishr	  ^  s     BAXX&
C"E*	xx9"M-/#1hh1G	
 J	 	$M-/#1hh1G	
 JrR   c          	          [        U 5        [        XR                  S9  U nU(       d
  [        U SS9nU R                  S:X  a  [	        U4U4X`XUR
                  45        U$ [        U4U4X`XUR
                  45        U$ r   )r   rs   rz   rt   backprop_gelu_kernel_floatr   backprop_gelu_kernel_doubler   r   r   r   r|   r}   r   s          rO   backprop_gelur  y  s     BAXX&
C"E*	xx9"M-/#11R	
 J	 	$M-/#11R	
 JrR   c          
      
   [        U 5        U R                  S   nU R                  S   n[        XVU4U R                  SS9n[	        XXb5        U R                  S:X  a  [        U4U4XpXXb45        U$ [        U4U4XpXXb45        U$ r   )r   rs   ru   rt   _check_which_maxoutbackprop_maxout_kernel_floatbackprop_maxout_kernel_double)r   r   r   r|   r}   r   r   r   s           rO   backprop_maxoutr    s    B
A
A
!"(($
7C!'	xx9$M-/#5Q1J	
 J	 	&M-/#5Q1J	
 JrR   c          	          [        U 5        [        XR                  S9  U nU(       d
  [        U SS9nU R                  S:X  a  [	        U4U4X`XU R
                  45        U$ [        U4U4X`XU R
                  45        U$ r   )r   rs   rz   rt   backprop_mish_kernel_floatr   backprop_mish_kernel_doubler  s          rO   backprop_mishr    s     BAXX&
C"E*	xx9"M-/#11Q	
 J	 	$M-/#11Q	
 JrR   c          
      0   [        U 5        [        U5      n[        UR                  5       5      nU R                  S   n[        X5        [        XV4U R                  SS9nU R                  S:X  a  [        U4U4XpXXV45        U$ [        U4U4XpXXV45        U$ Nr   Fr   r   )
r   r   intsumrs   r   ru   rt    backprop_reduce_sum_kernel_float!backprop_reduce_sum_kernel_double)d_sumsr   r|   r}   r   r   r   r   s           rO   backprop_reduce_sumr    s    FGAGKKMAQA7
!v||5
9C||y (M-/#w11P	
 J	 	*M-/#w11P	
 JrR   c          
      0   [        U 5        [        U5      n[        UR                  5       5      nU R                  S   n[        X5        [        XV4U R                  SS9nU R                  S:X  a  [        U4U4XpXXV45        U$ [        U4U4XpXXV45        U$ r  )
r   r   r  r  rs   r   ru   rt   !backprop_reduce_mean_kernel_float"backprop_reduce_mean_kernel_double)d_meansr   r|   r}   r   r   r   r   s           rO   backprop_reduce_meanr$    s    GGAGKKMAaA7
!w}}E
:C}}	!)M-/#A1Q	
 J	 	+M-/#A1Q	
 JrR   c                N   [        U 5        [        U5      n[        UR                  5       5      nU R                  S   n[        X&SS9  [        Xg4U R                  SS9n[        XU4U5        U R                  S:X  a  [        U4U4XXXVU45        U$ [        U4U4XXXVU45        U$ )Nr   r   Tr   r   )r   r   r  r  rs   r   ru   rt   _check_which_reduce_max backprop_reduce_max_kernel_float!backprop_reduce_max_kernel_double)	d_maxesr   r   r|   r}   r   r   r   r   s	            rO   backprop_reduce_maxr*    s     GGAGKKMAaA7!,
!w}}D
9CEq673}}	!(M-/#PQVW1X	
 J	 	*M-/#PQVW1X	
 JrR   c          
      "   [        U 5        [        XR                  S9  [        X R                  S9  U nU(       d
  [        U SS9nU R                  S:X  a  [	        U4U4XpXXGR
                  45        U$ [        U4U4XpXXGR
                  45        U$ r   )r   rs   rz   rt   backprop_swish_kernel_floatr   backprop_swish_kernel_double)r   r   Yr   r   r|   r}   r   s           rO   backprop_swishr/    s     BAXX&AXX&
C"E*	xx9#M-/#1HH1U	
 J	 	%M-/#1HH1U	
 JrR   c          
          [        U R                  S   S4SSS9nSnSn[        U4U4X@XVU R                  S   U45        U$ )Nr      uint32Tr         )ru   rs   hash_data_kernel)idsseedr|   r}   r   out_sizein_sizes          rO   hashr:    sW    
#))A,"($
?C HG			8ciilD9
 JrR   r   rs   c                    U R                   S;   d   S5       eUb.  U R                  U:w  a  SU SU R                   3n[        U5      eg g )N)r   r   z/CUDA kernel can only handle float32 and float64%array has incorrect shape, expected: , was: rt   rs   r]   r   rs   msgs      rO   r   r   -  sb    99   9 99  SYY%/5eWGCII;Oo 0rR   c                    U R                   S;   d   S5       eUb.  U R                  U:w  a  SU SU R                   3n[        U5      eg g )N)r   r   r   r   z=CUDA kernel can only handle float32, float64, int32 and int64r<  r=  r>  r?  s      rO   r   r   7  se    99   G
 GG  SYY%/5eWGCII;Oo 0rR   r   n_elemsc                    U R                   S:X  d   S5       e[        R                  " X:  5      (       d  [        SU 35      e[        R                  " U 5      U:w  a  [        S5      eg )Nr   z,lengths should be encoded as 32-bit integersz all sequence lengths must be >= z%lengths must sum up to the batch size)rt   r
   allr]   r  
IndexError)r   rB  r   s      rO   r   r   C  sa    ==G#S%SS#88G)**;J<HIIxxG#@AA $rR   nc                 r    U R                   S:X  d   S5       e[        U SU5      (       d  [        SU 35      eg )Nr   z,indices should be encoded as 32-bit integersr   z'index out of bounds, must be >= 0 && < )rt   _values_within_rangerE  )r   rF  s     rO   r   r   K  sA    ==G#S%SS#A..B1#FGG /rR   r   r   r   c                     X4nSnU R                   S:X  d   U5       eU R                  U:w  a  SU SU R                   3n[        U5      e[        U SU5      (       d  [	        S5      eg )N:maximum index (which) should be encoded as 32-bit integersr   5maximum index (which) has incorrect shape, expected: r=  r   )maximum index (which) value out of bounds)rt   rs   r]   rH  rE  )r   r   r   r   rs   r@  s         rO   r  r  R  su    FE
FC;;'!&3&!{{eEeWGTYT_T_S`aoq!,,DEE -rR   zT x, T lower, T upperzbool rzx >= lower && x < upperza & bzr = atruewithin_rangec                    SnU R                   S:X  d   U5       eU R                  U:w  a  SU SU R                   3n[        U5      e[        R                  " U S:  U [        R
                  " US5      :  -  5      (       d  [        S5      eg )NrJ  r   rK  r=  r   r   rL  )rt   rs   r]   r
   rD  expand_dimsrE  )r   rs   r   r@  s       rO   r&  r&  l  s    
FC;;'!&3&!{{eEeWGTYT_T_S`ao88UaZED,<,<Wb,I$IJKKDEE LrR   )T)r   )rr   recollectionsr   	functoolsr   pathlibr   typingr   r   r   r   compatr
   r   __file__parentrl   rm   KERNELS_SRCKERNELS_LIST	RawModuler[   rC   rn   r   r   r   r   r   r   r   r   r5  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r   r   r  r  r  r  r  r  r(  r'  r"  r!  r  r  r   r   r-  r,  boolru   rz   r   r   r   r   r   r   r   r   r   r   r   r   r   r   floatr   r  r  r	  r  r  r  r  r$  r*  r/  r:  r   r   r  r   r   r  ReductionKernelrH  r&  rh   rR   rO   <module>r_     s    	 #   , ,  '
8n))44f4E1l  	NN"2\ 
 %L %LPY ))@A )*BC }- / $%89 %&:; }- / kKH  1 !"23 }- / l+ }- j) ./ $%89 %&:; $%89 %&:; !"23 "#45 /  1 (23T(U %'12R'S $()@A '(>? ()@A '(>? $./L$M !#-.J#K  .8+/ + .8*. * !++D E )*BC ()@A '(>? $./L$M !#-.J#K  %/0N%O "$./L$M !$./L$M !#-.J#K  !+,F!G  *+D E )*BC ()@A  +/ (4 (&d &8ss 8| 
> 58C <  
 ss " !% 2 $'3 * SS & 14 . 25 2 14 2 QT " )-PS :   	 
        H $ss. $ss4  	>  	8 8;s . $qCTW, ?Bc , ADPS . 36#6 $#RU. *-  6: 8E?  =A 	(5/ 	 9: BS BHs HF# F# F# F*  	! 
 F% FrR   