
    ic                        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	m
Z
mZ d dlZddlmZmZ  ee      j"                  Zedz  j'                  d	
      Zg dZer ej,                  ede      ndZ G d d      Zd Z ed      Z ed      Z ed      Z ed      Z ed      Z ed      Z ed      Z  ed      Z! ede      Z" ed      Z# ed      Z$ ed      Z% ed      Z& ed      Z' ed       Z( ed!      Z) ed"      Z* ed#      Z+ ed$      Z, ed%      Z- ed&      Z. ed'      Z/ ed(      Z0 ed)      Z1 ed*      Z2 ed+      Z3 ed,      Z4 ed-      Z5 ed.      Z6 ed/      Z7 ed0      Z8 ed1      Z9 ed2      Z: ed3      Z; ed4      Z< ed5      Z= ed6      Z> ed7      Z? ed8      Z@ ed9      ZA ed:      ZB ed;      ZC ed<      ZD ed=      ZE ed>      ZF ed?      ZG ed@      ZH edA      ZI edB      ZJdCdDdEeKfdFZLddEeKfdGZMddHdHdIdJZNdKdLdMdMdLdHdHdNdOZOdHdHdIdPZPdKdHdHdQdRZQdKdSdHdHdTdUZRdV ZSddHdHdWdXZTdHdHdIdYZUdKdZdHdHdTd[ZVdHdHdId\ZWdHdHdId]ZXdHdHdId^ZYdKd_dHdHdTd`ZZddHdHdWdaZ[dLdMdMdLdKdHdHdbdce\dde\dee\dfe\dgeKf
dhZ]dKdHdHdQdgeKfdiZ^dKdHdHdQdgeKfdjZ_dKdHdHdQdgeKfdkZ`dKdSdHdHdTdgeKfdlZadHdHdIdmZbdKdZdHdHdTdgeKfdnZcdHdHdIdoZddHdHdIdpZedHdHdIdqZfdKd_dHdHdTdrZgdHdHdIdsZhddtdue
e   fdvZiddtdue
e   fdwZjd dxdyekfdzZld{ekfd|Zmd}ekd~ekdekfdZner ej                  ddddddd      ndZpduefdZqy)    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                       e Zd ZU dZeed<   ed   ed<   eeg df      ed<   g dZddded	eeg df      d
dfdZ	d Z
d Zy)
LazyKernelzWraps 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rD   rE   rF   Ncompile_callbackrI   returnc                .    || _         d | _        || _        y NrG   )selfrD   rI   s      o/var/www/vps2.regionflexible.com/Desarrollo/venv/lib/python3.12/site-packages/thinc/backends/_custom_kernels.py__init__zLazyKernel.__init__V   s     	!1    c                 H    | j                           | j                  |i | y rL   )_compile_kernelrE   )rM   argskwargss      rN   __call__zLazyKernel.__call__`   s!    d%f%rP   c                     | j                   y | j                  | j                         | _         n*t        $t        j                  | j                        | _         | j                   t        d| j                   d      y )Nzcouldn't compile Cupy kernel '')rE   rF   KERNELSget_functionrD   
ValueError)rM   s    rN   rR   zLazyKernel._compile_kerneld   so    <<#!!-113DL "//		:DL<<=dii[JKK  rP   )__name__
__module____qualname____doc__str__annotations__r   r   	__slots__rO   rU   rR    rP   rN   rC   rC   I   sx     I&''-=)= >??8I FJ	22 #8B0@,@#AB	2
 
2&
LrP   rC   c                  j    t         sy t        j                  t        dz  j	                  d      d      S )Nz_murmur3.cur   r   	hash_data)r   r
   	RawKernelPWD	read_textrb   rP   rN   compile_mmhrh   q   s,    >>3.9969JKXXrP   r(   r'   r*   r)   r,   r+   r.   r-   rd   rH   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zerosrj   c                ^    |rt        j                  | |      S t        j                  | |      S rL   )r
   rj   empty)shapedtyperj   s      rN   _allocro      s'    zz%''zz%''rP   c                 Z    |rt        j                  |       S t        j                  |       S rL   )r
   
zeros_like
empty_like)arrayrj   s     rN   _alloc_likert      s#    u%%u%%rP      )threads_per_block
num_blocksc                   |dk  rt        d|       | D ]  }t        |        | D cg c]  }t        |       }}t        |      }|| |z  z  }t	        j
                  |d      }t        |       |f| d   j                  dd  z   }t	        j                  || d   j                        }t        j                  t        |       d      }	t        |       D ]  \  }
}|j                  j                  |	|
<     t	        j
                  |	      }	t        t        j                  | d   j                  dd  d      }|j                  dk(  r t!        |f|f||	||t        |       |f       |S |j                  dk(  r t#        |f|f||	||t        |       |f       |S |j                  dk(  r t%        |f|f||	||t        |       |f       |S |j                  dk(  rt'        |f|f||	||t        |       |f       |S c c}w )	N   z.Rounding for padding must at least be 1, was: int32rn   r   int64float32float64)rZ   _is_float_or_int_arraylenmaxr
   rs   rm   rl   rn   numpy	enumeratedataptrr   operatormulpad_kernel_floatpad_kernel_doublepad_kernel_int32pad_kernel_int64)seqsround_torv   rw   seqseq_lensmax_seq_lenfinal_shapeoutptrsidxstrides               rN   padr      s   !|I(TUU $s#$ %))SC)H)h-K K<(**Kzz('2Ht9k*T!W]]12->>K
**[Q
6C ;; 	D dO !SHHLLS	!::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   G4Fg      ?g        )inplaceslopeoffsetmin_valmax_valrv   rw   c                    t        |        | }|st        | d      }| j                  dk(  r"t        |f|f|| ||||| j                  f       |S t        |f|f|| ||||| j                  f       |S NFri   r}   )_is_float_arrayrt   rn   clipped_linear_kernel_floatsizeclipped_linear_kernel_double)	Xr   r   r   r   r   rv   rw   r   s	            rN   clipped_linearr      s     A
C!5)ww)#M !UFGWaff=	
 J 	%M !UFGWaff=	

 JrP   c                2   | j                   dk7  rt        d| j                          |j                   dk7  rt        d|j                          t        |        |j                  d      }t	        || j
                  d          |j
                  d   }|j
                  d   }| j
                  d   }| j
                  d   }t        ||f| j                  d      }| j                  d	k(  rt        |f|f|| |||||f       |S t        |f|f|| |||||f       |S )
Nr	   z5gather_add expects table with dimensionality 2, was: z7gather_add expects indices with dimensionality 2, was: rz   r   ry   Trn   rj   r}   )
ndimrZ   r   astype_check_indicesrm   ro   rn   gather_add_kernel_floatgather_add_kernel_double)	tableindicesrv   rw   BKTOr   s	            rN   
gather_addr     s-   zzQCEJJ<P
 	
 ||qEgll^T
 	
 EnnW%G7EKKN+aAaAAAAA
!Qu{{$
7C{{iM-/#ugq!QPQ1R	
 J 	!M-/#ugq!QPQ1R	
 JrP   )r   rv   rw   c                    t        |        | }|st        | d      }| j                  dk(  rt        |f|f|| | j                  f       |S t        |f|f|| | j                  f       |S r   )r   rt   rn   dish_kernel_floatr   dish_kernel_double)r   r   rv   rw   r   s        rN   dishr   5  sr    A
C!5)ww):-*;)=Q?OP J 	J=+<*>a@PQJrP   g      @)r   	thresholdrv   rw   c                    t        |        | }|st        | d      }| j                  dk(  rt        |f|f|| || j                  f       |S t        |f|f|| || j                  f       |S r   )r   rt   rn   gelu_kernel_floatr   gelu_kernel_doubler   r   r   rv   rw   r   s         rN   gelur   B  s~    A
C!5)ww)M-/#q)QVV1L	
 J 	M-/#q)QVV1L	
 JrP   c                 V    | t        j                  |gd      } | S t        | |       | S )Nrz   r{   )r
   rs   _check_lengths)lengthsr   s     rN   check_seq2col_lengthsr   S  s1    **aS0 N 	w"NrP   )r   rv   rw   c                   t        |        | j                  d   }|dz  dz   }| j                  d   }t        ||      }|j                  d   }t        |||z  f| j                  d      }	| j
                  dk7  rL|j
                  dk7  r=| j                  dk(  rt        |f|f|	| |||||f       |	S t        |f|f|	| |||||f       |	S Nr   r	   ry   Tr   r}   )r   rm   r   ro   rn   r   seq2col_kernel_floatseq2col_kernel_double)
r   nWr   rv   rw   r   nFInLr   s
             rN   seq2colr   [  s    C		!A	a!B		!A#GQ/G	q	B
!QVCIIT
:C
xx1}*99	!  13c3QPQSU5V J	 " 13c3QPQSU5V JrP   c          
         t        |        | j                  \  }}}||f}t        || j                  d      }t        |dd      }| j                  dk(  rt	        |f|f||| |||f       ||fS t        |f|f||| |||f       ||fS )NFr   ir}   )r   rm   ro   rn   maxout_kernel_floatmaxout_kernel_double)	r   rv   rw   r   r   P	out_shapebestwhichs	            rN   maxoutr   t  s    AggGAq!AI)177%8D9Cu5Eww)M-/$q!Q1J	
 ;	 	M-/$q!Q1J	
 ;rP      c                    t        |        | }|st        | d      }| j                  dk(  rt        |f|f|| || j                  f       |S t        |f|f|| || j                  f       |S r   )r   rt   rn   mish_kernel_floatr   mish_kernel_doubler   s         rN   mishr     s~    A
C!5)ww)M-/#q)QVV1L	
 J	 	M-/#q)QVV1L	
 JrP   c          
      0   t        |        t        |      }| j                  d   }| j                  d   }t        ||       t	        ||f| j
                  d      }| j
                  dk(  rt        |f|f|| ||||f       |S t        |f|f|| ||||f       |S Nr   ry   Tr   r}   )r   r   rm   r   ro   rn   reduce_sum_kernel_floatreduce_sum_kernel_doubler   r   rv   rw   r   r   r   r   s           rN   
reduce_sumr     s    AGA	
A	
A7A
!Qqwwd
3Cww)M-/#q'1a1K	
 J	 	!M-/#q'1a1K	
 JrP   c          
      \   t        |        t        |      }| j                  d   }| j                  d   }t        ||       t	        ||f| j
                  d      }| j
                  dk(  rt        |f|f|| ||||f       nt        |f|f|| ||||f       ||j                  d      dz   z  }|S )Nr   ry   Tr   r}   )ry   g|=)	r   r   rm   r   ro   rn   r   r   reshaper   s           rN   reduce_meanr     s    AGA	
A	
A7A
!Qqwwd
3Cww)M-/#q'1a1K	
 	!M-/#q'1a1K	

 7??7#e++CJrP   c                `   t        |        t        |      }| j                  d   }| j                  d   }t        ||d       ||f}t	        || j
                  d      }t	        |dd      }	| j
                  dk(  rt        |f|f||	| ||||f       ||	fS t        |f|f||	| ||||f       ||	fS )Nr   ry   
min_lengthFr   r   r}   )r   r   rm   r   ro   rn   reduce_max_kernel_floatreduce_max_kernel_double)
r   r   rv   rw   r   r   r   r   maxesr   s
             rN   
reduce_maxr     s    AGA	
A	
A7A!,AI9AGG59E9Cu5Eww)M-/%7AqRS1T	
 %<	 	!M-/%7AqRS1T	
 %<rP   g      1@c                    t        |        | }|st        | d      }| j                  dk(  rt        |f|f|| || j                  f       |S t        |f|f|| || j                  f       |S r   )r   rt   rn   swish_kernel_floatr   swish_kernel_doubler   s         rN   swishr     s~    A
C!5)ww)M-/#q)QVV1L	
 J 	M-/#q)QVV1L	
 JrP   c                   t        |        | j                  d   }|dz  dz   }| j                  d   |z  }t        ||      }|j                  d   }t        ||f| j                  d      }	| j
                  dk7  rL|j
                  dk7  r=| j                  dk(  rt        |f|f|	| |||||f       |	S t        |f|f|	| |||||f       |	S r   )r   rm   r   ro   rn   r   backprop_seq2col_kernel_floatbackprop_seq2col_kernel_double)
dYr   r   rv   rw   r   r   r   r   r   s
             rN   backprop_seq2colr     s    B
A	a!B
rA#GQ/G	q	B
!Qrxxt
4C	ww!|)88y ) 13c2wAqRT5U J	 + 13c2wAqRT5U JrP   )r   r   r   r   r   rv   rw   r   r   r   r   r   c                   t        |        t        || j                         | }	|st        | d      }	| j                  dk(  r#t	        |f|f|	| ||||||	j
                  f       |	S t        |f|f|	| ||||||	j
                  f       |	S Nrm   Fri   r}   )r   rm   rt   rn   $backprop_clipped_linear_kernel_floatr   %backprop_clipped_linear_kernel_double)
r   r   r   r   r   r   r   rv   rw   r   s
             rN   backprop_clipped_linearr     s     BARXX&
C"E*	xx9,M "a#((C	
 J 	.M "a#((C	
 JrP   c                   t        |        t        || j                         | }|st        | d      }| j                  dk(  rt	        |f|f|| ||j
                  f       |S t        |f|f|| ||j
                  f       |S r   )r   rm   rt   rn    backprop_hard_swish_kernel_floatr   !backprop_hard_swish_kernel_doubler   r   r   rv   rw   r   s         rN   backprop_hard_swishr   2  s     BARXX&
C"E*	xx9(M-/#r1chh1G	
 J	 	*M-/#r1chh1G	
 JrP   c                   t        |        t        || j                         | }|st        | d      }| j                  dk(  rt	        |f|f|| ||j
                  f       |S t        |f|f|| ||j
                  f       |S r   )r   rm   rt   rn   *backprop_hard_swish_mobilenet_kernel_floatr   +backprop_hard_swish_mobilenet_kernel_doubler   s         rN   backprop_hard_swish_mobilenetr   H  s     BARXX&
C"E*	xx92M-/#r1chh1G	
 J	 	4M-/#r1chh1G	
 JrP   c                   t        |        t        || j                         | }|st        | d      }| j                  dk(  rt	        |f|f|| ||j
                  f       |S t        |f|f|| ||j
                  f       |S r   )r   rm   rt   rn   backprop_dish_kernel_floatr   backprop_dish_kernel_doubler   s         rN   backprop_dishr  ^  s     BARXX&
C"E*	xx9"M-/#r1chh1G	
 J	 	$M-/#r1chh1G	
 JrP   c          	         t        |        t        || j                         | }|st        | d      }| j                  dk(  r t	        |f|f|| |||j
                  f       |S t        |f|f|| |||j
                  f       |S r   )r   rm   rt   rn   backprop_gelu_kernel_floatr   backprop_gelu_kernel_doubler   r   r   r   rv   rw   r   s          rN   backprop_gelur  y  s     BARXX&
C"E*	xx9"M-/#r1i1R	
 J	 	$M-/#r1i1R	
 JrP   c          
          t        |        | j                  d   }| j                  d   }t        |||f| j                  d      }t	        ||||       | j                  dk(  rt        |f|f|| ||||f       |S t        |f|f|| ||||f       |S r   )r   rm   ro   rn   _check_which_maxoutbackprop_maxout_kernel_floatbackprop_maxout_kernel_double)r   r   r   rv   rw   r   r   r   s           rN   backprop_maxoutr    s    B
A
A
!Q"(($
7Cq!Q'	xx9$M-/#r5!Q1J	
 J	 	&M-/#r5!Q1J	
 JrP   c          	         t        |        t        || j                         | }|st        | d      }| j                  dk(  r t	        |f|f|| ||| j
                  f       |S t        |f|f|| ||| j
                  f       |S r   )r   rm   rt   rn   backprop_mish_kernel_floatr   backprop_mish_kernel_doubler  s          rN   backprop_mishr    s     BARXX&
C"E*	xx9"M-/#r1i1Q	
 J	 	$M-/#r1i1Q	
 JrP   c          
      D   t        |        t        |      }t        |j                               }| j                  d   }t        ||       t        ||f| j                  d      }| j                  dk(  rt        |f|f|| ||||f       |S t        |f|f|| ||||f       |S Nry   Fr   r}   )
r   r   intsumrm   r   ro   rn    backprop_reduce_sum_kernel_float!backprop_reduce_sum_kernel_double)d_sumsr   rv   rw   r   r   r   r   s           rN   backprop_reduce_sumr    s    FGAGKKMAQA7A
!Qv||5
9C||y (M-/#vw1a1P	
 J	 	*M-/#vw1a1P	
 JrP   c          
      D   t        |        t        |      }t        |j                               }| j                  d   }t        ||       t        ||f| j                  d      }| j                  dk(  rt        |f|f|| ||||f       |S t        |f|f|| ||||f       |S r  )
r   r   r  r  rm   r   ro   rn   !backprop_reduce_mean_kernel_float"backprop_reduce_mean_kernel_double)d_meansr   rv   rw   r   r   r   r   s           rN   backprop_reduce_meanr    s    GGAGKKMAaA7A
!Qw}}E
:C}}	!)M-/#wAq1Q	
 J	 	+M-/#wAq1Q	
 JrP   c                j   t        |        t        |      }t        |j                               }| j                  d   }t        ||d       t        ||f| j                  d      }t        |||f|       | j                  dk(  rt        |f|f|| |||||f       |S t        |f|f|| |||||f       |S )Nry   r   Tr   r}   )r   r   r  r  rm   r   ro   rn   _check_which_reduce_max backprop_reduce_max_kernel_float!backprop_reduce_max_kernel_double)	d_maxesr   r   rv   rw   r   r   r   r   s	            rN   backprop_reduce_maxr$    s     GGAGKKMAaA7A!,
!Qw}}D
9CEAq673}}	!(M-/#wwPQSTVW1X	
 J	 	*M-/#wwPQSTVW1X	
 JrP   c          
      8   t        |        t        || j                         t        || j                         | }|st        | d      }| j                  dk(  r!t	        |f|f|| ||||j
                  f       |S t        |f|f|| ||||j
                  f       |S r   )r   rm   rt   rn   backprop_swish_kernel_floatr   backprop_swish_kernel_double)r   r   Yr   r   rv   rw   r   s           rN   backprop_swishr)    s     BARXX&ARXX&
C"E*	xx9#M-/#r1aCHH1U	
 J	 	%M-/#r1aCHH1U	
 JrP   c          
          t        | j                  d   dfdd      }d}d}t        |f|f|| ||| j                  d   |f       |S )Nr      uint32Tr         )ro   rm   hash_data_kernel)idsseedrv   rw   r   out_sizein_sizes          rN   hashr4    s[    
#))A,"($
?C HG			c8WciilD9
 JrP   r   rm   c                    | j                   dv sJ d       |-| j                  |k7  rd| d| j                   }t        |      y y )N)r}   r~   z/CUDA kernel can only handle float32 and float64%array has incorrect shape, expected: , was: rn   rm   rZ   r   rm   msgs      rN   r   r   -  sb    99   9 99  SYY%/5eWGCII;Oo 0rP   c                    | j                   dv sJ d       |-| j                  |k7  rd| d| j                   }t        |      y y )N)r}   r~   rz   r|   z=CUDA kernel can only handle float32, float64, int32 and int64r6  r7  r8  r9  s      rN   r   r   7  se    99   G
 GG  SYY%/5eWGCII;Oo 0rP   r   n_elemsc                    | j                   dk(  sJ d       t        j                  | |k\        st        d|       t        j                  |       |k7  rt        d      y )Nrz   z,lengths should be encoded as 32-bit integersz all sequence lengths must be >= z%lengths must sum up to the batch size)rn   r
   allrZ   r  
IndexError)r   r<  r   s      rN   r   r   C  s`    ==G#S%SS#88Gz)*;J<HIIxxG#@AA $rP   nc                 f    | j                   dk(  sJ d       t        | d|      st        d|       y )Nrz   z,indices should be encoded as 32-bit integersr   z'index out of bounds, must be >= 0 && < )rn   _values_within_ranger?  )r   r@  s     rN   r   r   K  s>    ==G#S%SS#A.B1#FGG /rP   r   r   r   c                     ||f}d}| j                   dk(  sJ |       | j                  |k7  rd| d| j                   }t        |      t        | d|      st	        d      y )N:maximum index (which) should be encoded as 32-bit integersrz   5maximum index (which) has incorrect shape, expected: r7  r   )maximum index (which) value out of bounds)rn   rm   rZ   rB  r?  )r   r   r   r   rm   r:  s         rN   r
  r
  R  st    FE
FC;;'!&3&!{{eEeWGTYT_T_S`aoq!,DEE -rP   zT x, T lower, T upperzbool rzx >= lower && x < upperza & bzr = atruewithin_rangec                    d}| j                   dk(  sJ |       | j                  |k7  rd| d| j                   }t        |      t        j                  | dk\  | t        j
                  |d      k  z        st        d      y )NrD  rz   rE  r7  r   r   rF  )rn   rm   rZ   r
   r>  expand_dimsr?  )r   rm   r   r:  s       rN   r   r   l  s    
FC;;'!&3&!{{eEeWGTYT_T_S`ao88UaZED,<,<Wb,I$IJKDEE LrP   )T)ry   )rr   recollectionsr   	functoolsr   pathlibr   typingr   r   r   r   compatr
   r   __file__parentrf   rg   KERNELS_SRCKERNELS_LIST	RawModulerX   rC   rh   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"  r!  r  r  r  r  r   r   r'  r&  boolro   rt   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)  r4  r   r   r  r   r   r
  ReductionKernelrB  r   rb   rP   rN   <module>rY     s    	 #   , ,  '
8n))44f4E1l  DNN"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*  D! 
 F% FrP   