
    קgHh                     b   U d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlmZm	Z	m
Z
mZmZm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 d dlZd dlmZ 	 g dZdd	d
Zh dZd Z	 d.dedej        e         dej        fdZ i Z!ej"        edf         e#d<    G d d          Z$e j%         G d d                      Z&dede	fdZ'deddfdZ(deddfdZ)dedej*        eef         fdZ+deddfdZ,d ej-        de.fd!Z/ded"ej        ddfd#Z0d$ej1        d%eddfd&Z2d' Z3d( Z4d/d*Z5d+ Z6d0d-Z7dS )1    N)FunctionSchemaOperatorName
SchemaKindBaseTypeListTypeBaseTy)get_ctx   )autograd_kernel_indirectionconstruct_autograd_kernel)infer_schema)	custom_opCustomOpr	   CPUCUDA)cpucuda>   atatenprimprimstorchpytorchc                  :    t          j        dt                     d S )Nzwtorch._custom_op is deprecated and will be removed in PyTorch 2.6, please use the equivalent torch.library API instead.)warningswarnDeprecationWarning     Q/var/www/html/ai-engine/env/lib/python3.11/site-packages/torch/_custom_op/impl.pywarn_deprecatedr!   -   s-    M	89KM M M M Mr   qualnamemanual_schemareturnc                 2     t                        fd}|S )L
    This API is deprecated, please use torch.library.custom_op instead
    c           	         t          j        |           st          dt          |                      t	          
          \  }}t          |           | j        |k    rt          d
 d| d| j         d          	t          | d          n	}| | }t          j	        |          }t          |           	t          ||            t          j        |d          }|                    |           t          ||j                  }t#          |||||d	
          }| j        |_        | j        |_        | j        |_         t          j        ||j        d          t-          t/          j        |                               t2          j                            |t9          j        t<          t/          j        |                               |S )NzDcustom_op(...)(func): Expected `func` to be a Python function, got: zcustom_op(qualname='z-', ...)(func): expected `func` to have name 'z' but got 'zX'. Please either change the name of `func` or the qualname that is passed to `custom_op`r   )mutates_argsFRAGMENTT_private_accessAutograd)inspect
isfunction
ValueErrortypeparse_qualnamevalidate_namespace__name__r   r   parsevalidate_schema validate_function_matches_schemalibraryLibrarydefinefind_ophandle_or_thrownamer   
__module____doc__impl_opnamer   weakrefproxyr   _C#_dispatch_set_report_error_callback	functoolspartialreport_error_callback)funcnsr;   schema
schema_strfunction_schemalibophandleresultr#   r"   s            r    innerzcustom_op.<locals>.inner;   s   !$'' 	/"&t**/ /  
 "(++D2=D  ,x , ,!%, ,26-, , ,   9F8Md4444S`&f&&
(.z::((($,_dCCCob*--

:)"o.BCC#r?D(TXYYY- O5S&.*55'f(=(=>>	
 	
 	
 	44i'(=w}V?T?TUU	
 	
 	
 r   )r!   )r"   r#   rO   s   `` r    r   r   3   s8     ) ) ) ) ) )V Lr   r   global_registryc                        e Zd ZdZdd fd
Zd ZddZd Zd	 Zd
 Z	d Z
d Z	 ddej        eej        e         f         dej        fdZd Zdej        fdZddej        fdZd Zd Zd Zd ZddZddZ xZS )r   r&   Fr*   c                0   t                                                       t                       |st          d          | d| }|| _        || _        || _        || _        || _        || _	        d | _
        i | _        d| _        | t          | j	        <   d S )Nz|The CustomOp constructor is private and we do not guarantee BC for it. Please use custom_op(...) to create a CustomOp object::F)super__init__r!   RuntimeError_schema_cpp_ns_lib	_ophandler?   	_qualnamer3   _impls'_registered_autograd_kernel_indirectionrP   )	selfrL   cpp_nsrI   operator_namerM   r+   r;   	__class__s	           r    rU   zCustomOp.__init__w   s     	S   ++M++%(	5=)" KM7<4*.'''r   c                     | j         rJ | j                            | j        t	          t          j        |                     d           d| _         d S )Nr,   T)r]   rY   r>   r?   r   r@   rA   r^   s    r    %_register_autograd_kernel_indirectionz.CustomOp._register_autograd_kernel_indirection   sM    ????	t|%@tATAT%U%UWabbb7;444r      c                 @   |                      |          r9| j        |         }|J |j        }t          d| d| j         d| d| d	          t          j        t          j        |                    }|j	         d|j
         }t          ||          | j        |<   d S )NzAttempting to register a z impl for operator z that already has a z  impl registered from Python at z. This is not supported.:)	_has_implr\   locationrV   r[   r-   getframeinfosys	_getframefilenamelinenoFuncAndLocation)r^   kindrG   
stacklevelfunc_and_locationri   frames          r    _register_implzCustomOp._register_impl   s    >>$ 	 $D 1$000(1H6D 6 6T^ 6 6&*6 66 6 6  
 $S]:%>%>??n55u|55+D(;;Dr   c                     | j         |         S Nr\   r^   rp   s     r    	_get_implzCustomOp._get_impl   s    {4  r   c                     || j         v S rv   rw   rx   s     r    rh   zCustomOp._has_impl   s    t{""r   c                     | ` t          t          j        | j                  }t          || j                  rt          || j                   t          | j	        = d S rv   )
rY   getattrr   opsrX   hasattrr?   delattrrP   r[   )r^   opnamespaces     r    _destroyzCustomOp._destroy   sR     Iei66;-- 	/K...DN+++r   c                     d| j          dS )Nz<CustomOp(op="z")>)r[   rc   s    r    __repr__zCustomOp.__repr__   s    33333r   c                 :    t          j        | j        g|R i |}|S rv   )rB   _dispatch_call_boxedrZ   )r^   argskwargsrN   s       r    __call__zCustomOp.__call__   s+     (I$III&IIr   device_typesr$   c                 r     t          t                    rgD ]}t          |            fd}|S )T
        This API is deprecated, please use torch.library.custom_op instead
        c                     t                    D ]e}                    |                               ||            t          |         } t	          j        j        j        |          |            f| S )Nrq   )set_check_doesnt_have_library_implrt   SUPPORTED_DEVICE_TYPE_TO_KEYr7   r>   rY   r?   )fdevice_typedispatch_key_stacklevelr   r^   s      r    rO   zCustomOp.impl.<locals>.inner   s    "<00 G G44[AAA##K{#KKK;KHCTYlCCAFFFFHr   )
isinstancestrvalidate_device_type)r^   r   r   r   rO   s   ```  r    r>   zCustomOp.impl   sj     lC(( 	*(>L' 	. 	.K ----	 	 	 	 	 	 	 r   c                     |                      |          rd S t          |         }t          j        | j        |          rt          d| d| j         d          d S )Nzimpl(..., device_types=z): the operator zs already has an implementation for this device type via a pre-existing torch.library or TORCH_LIBRARY registration.)rh   r   rB   ._dispatch_has_computed_kernel_for_dispatch_keyr[   rV   )r^   r   keys      r    r   z(CustomOp._check_doesnt_have_library_impl   s    >>+&& 	F*;7<T^SQQ 	NM+ M Mt~ M M MN N N	N 	Nr   c                       fd}|S )z2Register an implementation for a factory function.c                                          d|             t          j        j        j        d          |            | S )NfactoryBackendSelect)rt   r7   r>   rY   r?   )r   r^   s    r    rO   z$CustomOp.impl_factory.<locals>.inner   s@    	1---BGLDL/BB1EEEHr   r   )r^   rO   s   ` r    impl_factoryzCustomOp.impl_factory   s#    	 	 	 	 	
 r   c                       fd}|S )r   c                 ,                                                          d                                d          j        j        t          j                    fd            }j                            j	        |d            S )Nabstractr   c                      fd}t           j        j                            |          5   | i |cd d d            S # 1 swxY w Y   d S )Nc                  .    t          d d            )Nz<Attempted to call get_ctx() for the meta implementation for a  .You have presumably called get_ctx() because the operator has a data-dependent output shape; if so, there is no such meta implementation and this error is the correct behavior. Otherwise, please remove the call to get_ctx() in the implementation registered with impl_abstract at rV   )ri   r"   s   r    error_on_ctxzOCustomOp.impl_abstract.<locals>.inner.<locals>.f_with_ctx.<locals>.error_on_ctx   s6    &)') ) ') )	 	 	r   )r   _library	fake_implset_ctx_getter)r   r   r   r   ri   r"   s      r    
f_with_ctxz9CustomOp.impl_abstract.<locals>.inner.<locals>.f_with_ctx   s    
 
 
 
 
 
 ^-<<\JJ . .1d-f--. . . . . . . . . . . . . . . . . .s   AAAMeta)
$_check_doesnt_have_library_meta_implrt   ry   ri   r[   rD   wrapsrY   r>   r?   )r   r   ri   r"   r   r^   s   ` @@r    rO   z%CustomOp.impl_abstract.<locals>.inner   s    55777
A+FFF~~j11:H~H _Q. . . . . .  .  INN4<V<<<Hr   r   r^   r   rO   s   `` r    impl_abstractzCustomOp.impl_abstract   s)    
	 	 	 	 	 	8 r   c                      fd} j                                         t          j        k    r |d           j        }j        s |d           t          |          dk    sJ t          d |D                       }|r |d           t          t          j	                  dt          t          j
                  dt          t          j                  d	t          t          j                  d
t          t          j                  dt          t          t          j                  d           di}j        D ]B}|j        |v r |dt!          |                                           d|j         d           Cd S )Nc                 >    t          d|  dj         d           )NzCCannot use torch._custom_ops APIs to register backward formula for z. Got operator z with schema: )rV   r[   )detailrI   r^   s    r    errorz4CustomOp._check_can_register_backward.<locals>.error  sC    :%: :>: :17: :  r   znon-functional operatorzoperator with no returnsr   c              3   B   K   | ]}|j         d uo|j         j         V  d S rv   )
annotationis_write).0rs     r    	<genexpr>z8CustomOp._check_can_register_backward.<locals>.<genexpr>#  sG       #
 #
GHAL$BQ\-B)B#
 #
 #
 #
 #
 #
r   zoperator that returns viewsintSymIntboolfloatTensorzList[Tensor]zoperator with return not in z (got ))rW   rp   r   
functionalreturnslenanyr   r   r   r   r   r   r   r   r0   listvalues)r^   r   retsis_non_mutating_viewallowed_return_typesretrI   s   `     @r    _check_can_register_backwardz%CustomOp._check_can_register_backward  s   	 	 	 	 	 	 ;;==J111E+,,,~~ 	.E,---4yy1}}}}" #
 #
LP#
 #
 #
  
  
   	1E/000 VZ  %V]##XV[!!6V\""GV]##XXfm,,d33^ 
 > 	i 	iCx///Eg6J6Q6Q6S6S1T1Tgg\_\dggghhhh	i 	ir   c                     | j         rd S t          j        | j        d          rt	          d| j         d          dD ]7}t          j        | j        |          rt	          d| j         d| d          8d S )NCompositeImplicitAutogradz3impl_backward/impl_save_for_backward: the operator a3   already has an implementation for this device type via a pre-existing registration to DispatchKey::CompositeImplicitAutograd.CompositeImplicitAutograd operators do not need an autograd formula; instead, the operator will decompose into its constituents and those can have autograd formulas defined on them.)r,   AutogradCPUAutogradCUDAz; already has an Autograd kernel registered to DispatchKey::z vi a pre-existing torch.library or TORCH_LIBRARY registration. Please either remove those registrations or don't use the torch._custom_ops APIs)r]   rB   %_dispatch_has_kernel_for_dispatch_keyr[   rV   )r^   r   s     r    (_check_doesnt_have_library_autograd_implz1CustomOp._check_doesnt_have_library_autograd_impl7  s    7 	F3DND_`` 	@?dn ? ? ?@ @ @ ? 	[ 	[C7LL ["Z$(NZ Z25Z Z Z[ [ [[	[ 	[r   c                 h   |                      d          rd S t          j        | j        d          rt          j        | j        d          sd S t          j        | j        d          rt	          d| j         d          t          j        | j        d          rt	          d| j         d          d S )Nr   CompositeExplicitAutogradr   r   z!impl_abstract(...): the operator a-   already has an implementation for this device type via a pre-existing registration to DispatchKey::CompositeImplicitAutograd.CompositeImplicitAutograd operators do not need an abstract impl; instead, the operator will decompose into its constituents and those can have abstract impls defined on them.z already has an DispatchKey::Meta implementation via a pre-existing torch.library or TORCH_LIBRARY registration. Please either remove that registration or don't call impl_abstract.)rh   rB   r   r[   rV   rc   s    r    r   z-CustomOp._check_doesnt_have_library_meta_implO  s    >>*%% 	F 4T^E`aa	<T^VTT	 F 3DND_`` 	=<DN < < <= = = 3DNFKK 	XWDN W W WX X X	X 	Xr   c           
      N   |                      d          sJ |                      d          sJ t          | j        | j        | t	          | j                  |                     d          j        |                     d          j                  }|                     d|           d S )Nbackwardsave_for_backwardautograd)	rh   r   rW   _output_differentiabilityget_opr[   ry   rG   rt   )r^   kernels     r    _register_autograd_kernelz"CustomOp._register_autograd_kernelx  s    ~~j)))))~~122222*L*4>""NN.//4NN:&&+- - 	J/////r   c                       fd}|S )zyRegister a function that tells us what to save for backward.

        Please see impl_backward for more details.
        c                                                                                       j        s                                                     d|                                d          r                                 d S d S )Nr   r   r   )r   r   r]   rd   rt   rh   r   )r   r   r^   s    r    rO   z.CustomOp.impl_save_for_backward.<locals>.inner  s    --///99;;;? =::<<< 3Q;OOO~~j)) 1..000001 1r   r   r   s   `` r    impl_save_for_backwardzCustomOp.impl_save_for_backward  s)    
	1 	1 	1 	1 	1 	1 r   Nc                     |fd}t          t                    s
 |             D ]!}t          |t                    s
 |             "t           j        j                  t                    k    r
 |              fd}|S )r   Nc                  (    t          d            )Nzimpl_backward(output_differentiability): expected output_differentiability to be a list of bools with length equal to the number of outputs of this CustomOp got: r   )output_differentiabilitys   r    yellz$CustomOp.impl_backward.<locals>.yell  s)    "7 57 78 8 8r   c                 "                                                                      j        s                                                     d|            _                            d          r                                 d S d S )Nr   r   r   )r   r   r]   rd   rt   r   rh   r   )r   r   r   r^   s    r    rO   z%CustomOp.impl_backward.<locals>.inner  s    --///99;;;? =::<<<
A+FFF-ED*~~122 1..000001 1r   )r   r   r   r   rW   r   )r^   r   r   r   diffrO   s   ```   r    impl_backwardzCustomOp.impl_backward  s     $/8 8 8 8 8 6== 0  !$-- DFFF4<'((C0H,I,III	1 	1 	1 	1 	1 	1 	1 r   )re   )Nre   )r3   r<   __qualname__r=   rU   rd   rt   ry   rh   r   r   r   typingUnionr   IterableCallabler>   r   r   r   r   r   r   r   r   r   __classcell__)ra   s   @r    r   r   r   s         Y^ / / / / / / /4< < << < < <! ! !# # #, , ,4 4 4   RS "Lfoc.B)BC	   *N N Nfo    ! !fo ! ! ! !F#i #i #iJ[ [ [0"X "X "XR
0 
0 
0          r   c                   .    e Zd ZU ej        ed<   eed<   dS )ro   rG   ri   N)r3   r<   r   r   r   __annotations__r   r   r   r    ro   ro     s'         
/MMMMMr   ro   r_   r`   c                 z    |j         dn|j         }t          j        |  dt          |j                   |          S )N rS   )overload_namerB   _dispatch_find_schema_or_throwr   r;   )r_   r`   r   s      r    r:   r:     sN    )1}7R  ,..S+,,..  r   rH   c                 r    d| v rt          d|  d          | t          v rt          d|  d|  d          d S )N.zcustom_op(..., ns="zC"): expected ns to not contain any . (and be a valid variable name)zcustom_op(..., ns='z'): 'z9' is a reserved namespace, please choose something else. )r/   RESERVED_NS)rH   s    r    r2   r2     s|    
byy$" $ $ $
 
 	
 
[." . .2 . . .
 
 	
 r   rI   c                     t           j        j                            |           st	          d|            | j        j        t	          d|            d S )Nzcustom_op only supports functional operators (ops that do not mutate any inputs, do not return views of the inputs, and has at least one return). Got the following non-functional schema: zUcustom_op does not support arguments named 'self'. Please rename your argument. Got: )r   r   utilsis_functional_schemar/   	argumentsself_arg)rI   s    r    r5   r5     s    >44V<< 
A 9?A A
 
 	
  ,3*03 3
 
 	
 -,r   c                     |                      dd          }t          |          dk    rt          d|  d          d|d         v rt          d|            |d         |d         fS )	NrS   r
   re   z$Expected there to be a namespace in z;, i.e. The operator name should look something like ns::foor   zThe torch.custom_ops APIs do not handle overloads, i.e. operator names with '.' in them. Please name your operator something like ns::foo. Got: r   )splitr   r/   )r"   namess     r    r1   r1     s    NN4##E
5zzQ M M M M N N 	N
eAh , "*, , - - 	- 8U1Xr   r   c                 r    | t           vr-t          d|  dt                                            d          d S )NzCustomOp.impl(device_types=[z(, ...]): we only support device_type in r   )r   r/   keys)r   s    r    r   r     sW    6669; 9 9.33559 9 9
 
 	
 76r   paramc                 T    | j         t          j        j        t          j        j        fv S rv   )rp   r-   	ParameterPOSITIONAL_OR_KEYWORDKEYWORD_ONLY)r   s    r    supported_paramr    s(    :/&  r   rG   c                 v    t          j        |          t          d j                                        D                       st          d           t          d j                                        D                       sj        t           j        j	        urt          d           d j                                        D             }d j                                        D             } fd fdfd	} || j
        j                    || j
        j                   d S )
Nc              3   :   K   | ]\  }}t          |          V  d S rv   )r  r   _ps      r    r   z3validate_function_matches_schema.<locals>.<genexpr>   s.      EEdaq!!EEEEEEr   zcustom_op(..., manual_schema)(func): positional-only args, varargs, and kwargs are not supported. Please rewrite `func` to not have them. Got `func` with signature: c              3   L   K   | ]\  }}|j         t          j        j        uV   d S rv   )r   r-   r   emptyr  s      r    r   z3validate_function_matches_schema.<locals>.<genexpr>  sG       
 
1 L 1 77
 
 
 
 
 
r   zcustom_op(..., manual_schema)(func): When passing in a manual schema, we expect `func` to have no type annotations to avoid ambiguity. Got `func` with signature: c                 P    g | ]#\  }}|j         t          j        j        k    ||f$S r   )rp   r-   r   r  r   r;   r   s      r    
<listcomp>z4validate_function_matches_schema.<locals>.<listcomp>  s=       D%:*@@@ 
u@@@r   c                 P    g | ]#\  }}|j         t          j        j        k    ||f$S r   )rp   r-   r   r  r  s      r    r  z4validate_function_matches_schema.<locals>.<listcomp>  s=       D%:*777 
u777r   c                  .    t          d d            )Nzcustom_op(..., manual_schema)(func): When passing in a manual schema, we expect `func`'s signature to match `manual_schema` (aside from type annotations). func's signature: , manual_schema: r/   rI   sigs   r    r   z/validate_function_matches_schema.<locals>.error  =    @ "%@ @ 8>@ @
 
 	
r   c                  .    t          d d            )Nzycustom_op(..., manual_schema)(func): neither func nor manual_schema should have default arguments. Got func's signature: r  r  r  s   r    error_default_argsz<validate_function_matches_schema.<locals>.error_default_args'  r  r   c                 
   t          |           t          |          k    r
              t          | |          D ]F\  \  }}}||j        k    r
              |j        t          j        j        us|j        
              Gd S rv   )r   zipr;   defaultr-   r   r
  )sig_argsschema_argsr;   r   argr   r  s        r    comparez1validate_function_matches_schema.<locals>.compare/  s    x==C,,,,EGGG"%h"<"< 	% 	%MT53sx}G$5$;;;s{?V""$$$		% 	%r   )r-   	signatureall
parametersitemsr/   r   return_annotation	Signaturer
  r   flat_positionalflat_kwarg_only)rI   rG   
positional	kwargonlyr  r   r  r  s   `    @@@r    r6   r6     s    
D
!
!CEEcn.B.B.D.DEEEEE 
B<?B B
 
 	
 	 
 
,,..
 
 
 	
 	


  (9(???;58; ;
 
 	
 >//11  J
 >//11  I
 
 
 
 
 

 
 
 
 
 
% % % % % % GJ(8999GIv'788888r   r   r   c           
          |dk    rt          |  d          |dk    rt          |  d          |dv r/|                                }t          |  d| d| d| d	          t          |  d
| d          )N	Undefineda  : There were no Tensor inputs to this operator (e.g. you passed an empty list of Tensors). If your operator is a factory function (that is, it takes no Tensors and constructs a new one), then please use CustomOp.impl_factory to register an implementation for itr   z: when running with device='Meta' tensors: there is no abstract impl registered for this CustomOp. Please register one via CustomOp.impl_abstract to get this CustomOp to work with Meta tensors)r   r   z: when running with device='z' tensors: there is no zW impl registered for this CustomOp. Please register one via CustomOp.impl(device_type='z')z%: No implementation for dispatch key z. It is likely that we have not added this functionality yet, please either open an issue or if you're feeling adventurous, use the low-level torch.library API)NotImplementedErrorlower)r   r   devices      r    rF   rF   <  s    
k! ( ( (
 
 	
 f}}! U U U
 
 	

 o! 5 5f 5 55 5*05 5 5
 
 	

  	 	3 	 	 	  r   c                 Z   | j         }t          j                            |d          }|                                                     d          d         }t          | j                  }|                    d          d         }t          j	        |          }t          ||||| d          S )Nr)   rS   Tr*   )	namespacer   r7   r8   r;   r   r   rW   r   r4   r   )oprH   rL   r;   rJ   rI   s         r    custom_op_from_existingr1  Z  s    	B
-

J
/
/C7799??4  $DRZJ!!$''+J!*--FCVT2tDDDDr   c                 D     fd}t                     \  }}t          t          j        |          s
 |             t	          t          j        |          }t          ||          s
 |             t	          ||          }t          |d          s
 |             |j        S )Nc                  *    t          d  d          )NzCould not find the operator z~. Please make sure you have already registered the operator and (if registered from C++) loaded it via torch.ops.load_library.r  )r"   s   r    error_not_foundzget_op.<locals>.error_not_foundf  s+    58 5 5 56 6 	6r   r  )r1   r~   r   r}   r|   r  )r"   r4  rH   r;   r   packets   `     r    r   r   e  s    6 6 6 6 6 h''HB59b!! %)R((K;%% [$''F69%% >r   Fc                     | t           v rt           |          S |st          d|  d          t          |           }t          |          }|S )NzCould not find custom op "z5". Did you register it via the torch._custom_ops API?)rP   rV   r   r1  )r"   also_check_torch_libraryoverloadrN   s       r    _find_custom_opr9  x  si    ?""x((# +* * * *+ + 	+ hH$X..FMr   c                     | t           j        j        j        vrd S t           j        j        j        |          }|d S |                    d          sd S |                    d          j        S )Nr   )r   
_custom_opr>   rP   rh   ry   rG   )r"   r   s     r    get_abstract_implr<    sk    u',<<<t %5h?Itz** tz**//r   Tc           	      @   |                      d          \  }}| | }t          j        |          }t          |           |rt          j        j        j        gng }t          j	        |d          }|
                    ||           t          ||j                  }	t          |||||	d          }
|
                                 t          j                            |	t!          j        t$          t'          j        |
                               t+          |           S )NrS   r)   )tagsTr*   )r   r   r4   r5   r   rB   Tagneeds_fixed_stride_orderr7   r8   r9   r:   r;   r   rd   rC   rD   rE   rF   r@   rA   r   )r"   rI   r@  rH   r;   rJ   rK   r>  rL   rM   rN   s              r    _custom_op_with_schemarA    s   ~~d##HB"&""J$*:66OO$$$6NVEHL122TVD
/"j
)
)CJJzJ%%%%b/*>??Hc2hPTUUUF
00222	H00)#$97=;P;PQQ   (r   rv   )F)T)8dataclassesrD   r-   rk   r   r@   r   torchgen.modelr   r   r   r   r   r   r   torch._CrB   torch.libraryr7   r	   r   r   r   torch._library.infer_schemar   __all__r   r   r!   r   Optionalr   r   rP   Dictr   r   	dataclassro   r:   r2   r5   Tupler1   r   r   r   r  r6   AnyrF   r1  r   r9  r<  rA  r   r   r    <module>rM     s             



    _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _              ! ! ! ! ! ! L L L L L L L L " " " " 4 4 4 4 4 4
 /
.
.       M M M :>3 33"(/#"63_3 3 3 3x 13S*_- 2 2 2~ ~ ~ ~ ~ ~ ~ ~B
        
3 |    

3 

4 

 

 

 


N 
t 
 
 
 
"
S 
V\#s(%; 
 
 
 

c 
d 
 
 
 
7,     >9>9"(/>9	>9 >9 >9 >9BVZ c d    <E E E  &	 	 	 	0 0 0     r   