
    Αi\                       % S SK Jr  S SKrS SKrS SKrS SKrS SKrS SKrS SKrS SK	r	S SK
Jr  S SKJr  S SKJrJrJr  \(       a  S SKJrJr  S SKJr  \\\   -  S-  rS\S	'   S<S jrS=S jrS r " S S5      r " S S\5      r " S S\5      r " S S\R@                  5      r!S\" S5      0r"S\S'   S1r#Sr$S
\S'   Sr%S
\S'       S>S jr&\S  5       r'S?S! jr(S@S" jr)SAS# jr*S@S$ jr+SBS% jr,S& r-S' r. " S( S)5      r/\/" 5       r00 r1S*\S+'   S, r2S- r3S. r4S/S0.     SCS1 jjr5SDS2 jr6SSS3S/S4.         SES5 jjr7SFS6 jr8\S7SS/S8.       SGS9 jj5       r9SHS: jr:S; r;g)I    )annotationsN)contextmanager)cache)TYPE_CHECKINGAnyLiteral)	GeneratorIterable)	TypeAliasr   
_ScopeTypestrc                @    [         R                  " SU  S3[        SS9  g )NzThe interface 'z' is a fake implementation for torch compatibility. It does not have the actual functionality of PyTorch. Please refer to the PaddlePaddle documentation for equivalent functionality.   )category
stacklevel)warningswarnUserWarningnames    S/var/www/html/banglarbhumi/venv/lib/python3.13/site-packages/paddle/compat/proxy.pywarning_about_fake_interfacer   %   s)    MM
$  W 	W     c                2   ^  U 4S jnX!S'   [        T SU5      $ )z7Create a fake class with the given name and attributes.c                    > [        T5      $ Nr   argskwargsr   s     r   <lambda>#create_fake_class.<locals>.<lambda>1   s    %A$%Gr   __init__ )type)r   attrsnew_fns   `  r   create_fake_classr(   /   s    GF*b%  r   c                "   ^  U 4S jnT Ul         U$ )z>Create a fake function with the given name and implementation.c                    > [        T5      $ r   r   r   s     r   r!   &create_fake_function.<locals>.<lambda>8   s    !=d!Cr   )__name__)r   fns   ` r   create_fake_functionr.   6   s    	CBBKIr   c                      \ rS rSrS rSrg)OverriddenAttribute=   c                    [         er   )NotImplementedErrorselfs    r   	get_valueOverriddenAttribute.get_value>   s    !!r   r$   N)r,   
__module____qualname____firstlineno__r6   __static_attributes__r$   r   r   r0   r0   =   s    "r   r0   c                  $    \ rS rSrSS jrS rSrg)LazyImportOverriddenAttributeB   c                    Xl         g r   
_full_name)r5   	full_names     r   r#   &LazyImportOverriddenAttribute.__init__C   s    #r   c                    U R                   R                  S5      n[        R                  " US   5      nUnUSS   H  n[	        X45      nM     U$ )N.r      )rA   split	importlibimport_modulegetattr)r5   partsroot_moduleresultparts        r   r6   'LazyImportOverriddenAttribute.get_valueF   sN    %%c*--eAh7!"IDV*F r   r@   N)rB   r   r,   r8   r9   r:   r#   r6   r;   r$   r   r   r=   r=   B   s    $r   r=   c                  $    \ rS rSrSS jrS rSrg)RawOverriddenAttributeO   c                    Xl         g r   _value)r5   values     r   r#   RawOverriddenAttribute.__init__P   s    r   c                    U R                   $ r   rU   r4   s    r   r6    RawOverriddenAttribute.get_valueS   s    {{r   rU   N)rW   r   rP   r$   r   r   rR   rR   O   s    r   rR   c                  B   ^  \ rS rSr      SU 4S jjrSS jrSrU =r$ )ProxyModuleW   c                H   > [         TU ]  U5        Xl        X l        X0l        g r   )superr#   _original_module_proxy_name
_overrides)r5   original_module
proxy_name	overrides	__class__s       r   r#   ProxyModule.__init__X   s#     	$ /%#r   c                    XR                   ;   a  U R                   U   R                  5       $ [        U R                  U5      $ r   )rb   r6   rJ   r`   )r5   r   s     r   __getattr__ProxyModule.__getattr__c   s7    ??"??4(2244t,,d33r   )r`   rb   ra   )rc   ztypes.ModuleTyperd   r   re   dict[str, OverriddenAttribute])r   r   returnr   )r,   r8   r9   r:   r#   ri   r;   __classcell__)rf   s   @r   r\   r\   W   s.    	$)	$ 	$ 2		$4 4r   r\   z
torch.reluzpaddle.nn.functional.relurk   GLOBAL_OVERRIDEStvm_ffi__disable_torch_proxy__MAGIC_DISABLED_MODULE_ATTR__enable_torch_proxy__MAGIC_ENABLED_MODULE_ATTRc                .    [         R                  U 5        g r   )rn   update)re   s    r   _extend_torch_proxy_overridesrv   u   s     I&r   c                    SS K n SnSnSn0 n[        R                  " U R                  R                  U R                  R
                  S-   5       H  n[        R                  " UR                  5      n[        Xc5      (       d  M5  [        Xc5      nUR                  R                  XS5      nU H:  n	U	R                  S5      (       a  M  [        Xi5      n
U SU	 3n[        U
5      XK'   M<     M     [        U5        g )Nr   zpaddle.compattorch__all__rE   rF   _)paddle.compatpkgutilwalk_packagescompat__path__r,   rH   rI   r   hasattrrJ   replace
startswithrR   rv   )paddlePADDLE_PREFIXTORCH_PREFIXPUBLIC_ATTR_DECLARATIONcompat_overridesmodule_infomodulepublic_attrstorch_module_name	attr_namepaddle_attrtorch_attr_names               r   _register_compat_overrider   {   s    #ML',,$ (()9)9:633"6CL + 0 0 8 8Q! *	'',,%f8%6$7q"D4J5 1 *$ ""23r   c                @    X:H  =(       d    U R                  U S35      $ )NrE   )r   r   r   s     r   $_is_specific_module_or_its_submoduler      s    >:T__xq\::r   c                    [        U S5      $ )Nrx   r   r   s    r   _is_torch_moduler      s    /g>>r   c                :    U H  n[        X5      (       d  M    g   gNTFr   )r   scopeenabled_modules      r   $_is_torch_proxy_local_enabled_moduler      s    /EE   r   c                B    [          H  n[        X5      (       d  M    g   gr   )TORCH_PROXY_BLOCKED_MODULESr   )r   blocked_modules     r   _is_torch_proxy_blocked_moduler      s    5/EE 6 r   c                    [         R                  " 5       nUb2  UR                  R                  U 5      (       a  gUR                  nUb  M2  gr   )inspectcurrentframe	f_globalsgetf_back)dunder_attrframes     r   ._is_called_by_module_with_specific_dunder_attrr      sD      "E

??{++ 
 r   c                      [        [        5      $ r   )r   rq   r$   r   r   (_is_called_by_torch_proxy_blocked_moduler      s    9" r   c                      [        [        5      $ r   )r   rs   r$   r   r   ._is_called_by_torch_proxy_local_enabled_moduler      s    9! r   c                      \ rS rSr% SrS\S'   S\S'   SSS jjrSS	 jrSS
 jr      SS jr	SS jr
SS jrSS jrSS jrSrg)TorchProxyMetaFinder   z
PyTorch compatibility layer for PaddlePaddle.

This class provides a way to `import torch` but actually loads PaddlePaddle.

Inspired by the setuptools _distutils_hack.
set[str]_local_enabled_scopebool_globally_enabledNc                &    U R                  U5        g r   )
_set_scoper5   r   s     r   r#   TorchProxyMetaFinder.__init__   s    r   c                F    U=(       d
    [        5       U l        US L U l        g r   )setr   r   r   s     r   r   TorchProxyMetaFinder._set_scope   s    $)NSU!!&$r   c                   [        U5      (       a  U R                  U5      $ [        XR                  5      (       a  U R	                  U5      $ [        U5      (       d  g [        5       (       a  U[        ;   a  U R                  U5      $ g U R                  (       d+  [        5       (       d  U[        ;   a  U R                  U5      $ g U R                  U5      $ r   )r   )_find_spec_for_torch_proxy_blocked_moduler   r   /_find_spec_for_torch_proxy_local_enabled_moduler   r   TORCH_MODULES_CACHE"_find_spec_for_cached_torch_moduler   r   _find_spec_for_torch_module)r5   fullnamepathtargets       r   	find_specTorchProxyMetaFinder.find_spec   s    )(33AA(KK///
 
 GG   ))355..>>xHH &&BDD..>>xHH//99r   c                D  ^^^ [        SS9   [        R                  R                  U5      nUc
   S S S 5        g UR                  mTc
   S S S 5        g  " UUU4S jS[        R
                  R                  5      nS S S 5        W" 5       Wl        U$ ! , (       d  f       N= f)NF)enablec                  2   > \ rS rSrU4S jrU UU4S jrSrg)QTorchProxyMetaFinder._find_spec_for_specific_module.<locals>.SpecificModuleLoaderi  c                  > TR                  U5      nUcq  [        R                  " UR                  5      nXl        Xl        UR                  b  UR                  Ul        UR                  b  [        UR                  5      Ul
        U$ r   )create_moduletypes
ModuleTyper   __spec__
__loader__origin__file__submodule_search_locationslistr   )r5   specmodoriginal_loaders      r   r   _TorchProxyMetaFinder._find_spec_for_specific_module.<locals>.SpecificModuleLoader.create_module  sp    )77=C{ $..tyy9'+)-;;2+/;;CL::F+/0O0O+PCLJr   c                   > [        TSS9   TR                  U5        S S S 5        SUR                  T'   g ! , (       d  f       N= f)NT)r   silent)use_torch_proxy_guardexec_module__dict__)r5   r   enable_proxy_when_exec_moduler   patched_dunder_attrs     r   r   ]TorchProxyMetaFinder._find_spec_for_specific_module.<locals>.SpecificModuleLoader.exec_module  sB    .<T (33F;
 <@FOO$78 s	   6
Ar$   Nr,   r8   r9   r:   r   r   r;   )r   r   r   s   r   SpecificModuleLoaderr     s    @ @r   r   )r   rH   utilr   loaderabcLoader)r5   r   r   r   r   r   r   s     ``  @r   _find_spec_for_specific_module3TorchProxyMetaFinder._find_spec_for_specific_module   s     #%0>>++H5D| 10 #kkO& 10@ @y}}';'; @ 1@ +,C 10s   $BB(B
Bc                ,    U R                  US[        S9$ )NTr   r   )r   rs   r5   r   s     r   r   DTorchProxyMetaFinder._find_spec_for_torch_proxy_local_enabled_module  s#    22*. 9 3 
 	
r   c                ,    U R                  US[        S9$ )NFr   )r   rq   r   s     r   r   >TorchProxyMetaFinder._find_spec_for_torch_proxy_blocked_module%  s#    22*/ : 3 
 	
r   c           	        ^ [         U   m " U4S jS[        R                  R                  5      n[        R                  R                  UU" 5       [        TSS 5      SS9n[        [        TS/ 5      5      Ul        U$ )Nc                  (   > \ rS rSrU 4S jrS rSrg)XTorchProxyMetaFinder._find_spec_for_cached_torch_module.<locals>.CachedTorchModuleLoaderi0  c                   > T$ r   r$   )r5   r   r   s     r   r   fTorchProxyMetaFinder._find_spec_for_cached_torch_module.<locals>.CachedTorchModuleLoader.create_module1  s    r   c                    g r   r$   )r5   r   s     r   r   dTorchProxyMetaFinder._find_spec_for_cached_torch_module.<locals>.CachedTorchModuleLoader.exec_module4  s    r   r$   Nr   )r   s   r   CachedTorchModuleLoaderr   0  s    r   r   r   T)r   
is_packager   )	r   rH   r   r   r   spec_from_loaderrJ   r   r   )r5   r   r   r   r   s       @r   r   7TorchProxyMetaFinder._find_spec_for_cached_torch_module,  ss    $X.	imm&:&: 	 ~~..#%6:t4	 / 
 +/wvz2/N*O'r   c           
       ^^ UR                  SSS5      n[        R                  " U5      n[        R	                  5        VVs0 s H5  u  pEUR                  U S35      (       d  M   UR                  U S35      U_M7     snnm[        US5      m " UU4S jS[        R                  R                  5      n[        R                  R                  UU" X15      T[        USS 5      S	9$ s  snnf )
Nrx   r   rF   rE   r   c                  6   > \ rS rSrS rU U4S jrU4S jrSrg)JTorchProxyMetaFinder._find_spec_for_torch_module.<locals>.TorchProxyLoaderiO  c                    Xl         X l        g r   _source_target_name)r5   sourcetarget_names      r   r#   STorchProxyMetaFinder._find_spec_for_torch_module.<locals>.TorchProxyLoader.__init__P  s    %$/!r   c                F  > [        U R                  U R                  T5      n[        U R                  SS 5      Ul        T(       a8  [        [        U R                  S/ 5      5      Ul        U R                  Ul        U$ U R                  R                  S5      S   Ul        U$ )Nr   r   rE   r   )	r\   r   r   rJ   r   r   r   __package__
rpartition)r5   r   r   is_pkgre   s      r   r   XTorchProxyMetaFinder._find_spec_for_torch_module.<locals>.TorchProxyLoader.create_moduleT  s    !$,,0A0A9M&t||ZF#'j"(M#NCL&*&7&7CO 
 '+&7&7&B&B3&G&JCO
r   c                  > U R                   R                  R                  5        H  u  p#US;   a  M  UT;   a  M  [        U[        R
                  5      (       am  [        UU R                   SU 3TR                  5        VVs0 s H5  u  pEUR                  U S35      (       d  M   UR                  U S35      U_M7     snn5      nX1R                  U'   M     g s  snnf )N)r,   r  r   r   rE   )
r   r   items
isinstancer   r   r\   r   r   removeprefix)r5   r   kvkkvvre   s         r   r   VTorchProxyMetaFinder._find_spec_for_torch_module.<locals>.TorchProxyLoader.exec_modulea  s     !LL11779DAOO I~ !!U%5%566'#0011#6 /8oo.?.?FB#%==A3a#9 !=1#Q 8" <.? *+OOA& :s   C&Cr   N)r,   r8   r9   r:   r#   r   r   r;   )r  re   s   r   TorchProxyLoaderr   O  s    0+ +r   r  r   )r   r   )r   rH   rI   rn   r  r   r
  r   r   r   r   r   rJ   )	r5   r   module_namesource_moduler  r  r  r  re   s	          @@r   r   0TorchProxyMetaFinder._find_spec_for_torch_moduleC  s    &&w!<!//< )..0
0||xjN+ .ANNhZq>*A-0
	 
3$	+ $	+y}}33 $	+P ~~..]5=*d;	 / 
 	
a
s   C'&C')r   r   r   )r   set[str] | None)r   r   r   r   r   r   )r   r   )r,   r8   r9   r:   __doc____annotations__r#   r   r   r   r   r   r   r   r;   r$   r   r   r   r      sZ     #"/::(( (,( !	(T

.9
r   r   zdict[str, types.ModuleType]r   c                     [        [        R                  R                  5       5       H?  u  p[	        U 5      (       d  M  [        U[        5      (       d  M.  [        R                  U 	 MA     g r   )r   sysmodulesr  r   r	  r\   r   s     r   _clear_torch_proxy_modulesr    sC    S[[..01D!!j&E&ED! 2r   c                    [        [        R                  R                  5       5       HW  u  p[	        U 5      (       d  M  [        U[        5      (       d  [        R                  U    [        U '   [        R                  U 	 MY     g r   )r   r  r  r  r   r	  r\   r   r   s     r   _swap_torch_modules_to_cacher    sX    S[[..01D!!fk22,/KK,=#D)D!	 2r   c                     [        [        5       H8  n [        U 5      (       d   SU  S35       e[        U    [        R                  U '   M:     g )N`z` is not a PyTorch module)r   r   r   r  r  r   s    r   _copy_torch_modules_from_cacher    sE    ()%%J4&0I'JJ%/5D *r   Fr   c                 ^ SU4S jjn[         [        R                  ;  a  [         R                  U 5        g [         R                  (       a!  U b  U" S5        [         R                  U 5        g U c  U" S5        S[         l        g U [         R
                  :w  a  U" S[         R
                   SU  S35        [         =R
                  U -  sl        g )	Nc                B   > T(       a  g [         R                  " U 5        g r   )r   r   )msgr   s    r   _warn_or_not2_modify_scope_of_torch_proxy.<locals>._warn_or_not  s    cr   z=PyTorch already enabled globally, scope modification ignored.zAEnabling PyTorch compat globally, previous scope will be ignored.Tz0Extending PyTorch compat scope, previous scope: z, new scope: rE   )r#  r   )TORCH_PROXY_FINDERr  	meta_pathr   r   r   )r   r   r$  s    ` r   _modify_scope_of_torch_proxyr(    s    

 .%%e,++O 	%%e,}O	
 04,"777>?Q?f?f>ggtuzt{{|}	
 ++u4+r   c                P    U c  g [        U [        5      (       a  U 1$ [        U 5      $ r   )r	  r   r   r   s    r   _parse_scoper+    s(    }%wu:r   rx   r   blocked_modulesbackendr   c                    US:X  d
   SU 35       e[        U5      nUb  [        U5        [        U 5      n [        5         [        5         [	        XS9  [
        R                  R                  S[        5        g)a  
Enable the PyTorch compat by adding the TorchProxyMetaFinder to sys.meta_path.
This allows importing 'torch' modules that are actually proxies to PaddlePaddle.

Args:
    scope (str or Iterable[str], optional): Specific module or modules to enable
        PyTorch compat for. If None, enables PyTorch compat globally. Defaults to None.
    blocked_modules (str or Iterable[str], optional): Specific module or modules to
        exclude from PyTorch compat. Defaults to None.
    backend (str, optional): The backend to enable compat for. Currently only
        "torch" is supported. Defaults to "torch".
    silent (bool, optional): If True, suppresses warnings about scope changes.
        Defaults to False.

Example:
    .. code-block:: pycon
        :name: enable-compat-in-global-scope

        >>> import paddle
        >>> paddle.enable_compat()  # Enable torch compat globally
        >>> import torch  # type: ignore[import-not-found] # This will import paddle as torch
        >>> assert torch.sin is paddle.sin
        >>> paddle.disable_compat()  # Disable torch compat

    .. code-block:: pycon
        :name: enable-compat-in-specific-scope

        >>> import paddle
        >>> paddle.enable_compat(scope={"triton"})  # Enable torch compat for 'triton' module only
        >>> import triton  # type: ignore[import-untyped] # All `import torch` inside `triton` will proxy to paddle
        >>> try:
        ...     import torch  # type: ignore[import-not-found] # This will raise ModuleNotFoundError
        ... except ModuleNotFoundError:
        ...     print("PyTorch compat is not enabled globally.")
        >>> paddle.disable_compat()  # Disable torch compat
rx   zUnsupported backend: Nr   r   )	r+  "extend_torch_proxy_blocked_modulesr   r  r(  r  r'  insertr&  r,  s       r   enable_torch_proxyr2    sk    V g@!6wi@@"?3O"*?;E " 6MM./r   c                     [         [        R                  ;   a8  [        R                  R                  [         5        [	        5         [        5         g[        R                  " S5        g)a  
Disable the PyTorch proxy by removing the TorchProxyMetaFinder from sys.meta_path.
This prevents 'torch' imports from being proxied to PaddlePaddle.

Example:
    .. code-block:: pycon

        >>> import paddle
        >>> paddle.enable_compat()  # Enable torch compat globally
        >>> import torch  # type: ignore[import-not-found] # This will import paddle as torch
        >>> assert torch.sin is paddle.sin
        >>> paddle.disable_compat()  # Disable torch compat
        >>> try:
        ...     import torch  # This will raise ModuleNotFoundError
        ... except ModuleNotFoundError:
        ...     print("PyTorch compat is disabled.")
Nztorch compat is not installed.)r&  r  r'  remover  r  r   r   r$   r   r   disable_torch_proxyr5    s?    $ S]]*/0"$&(MM23r   T)r   r   r   c              #  T  #    [        U5      n[        [        R                  ;   n[	        [        R
                  5      n[        R                  nX:X  a%  U(       a  Ub  XA=(       d
    [	        5       :X  a  Sv   gU (       a/  [        XS9   Sv   U[        l        U[        l        [        5         g[        5          Sv   [        SSS9  U[        l        U[        l        g! U[        l        U[        l        [        5         f = f! [        SSS9  U[        l        U[        l        f = f7f)a  
Context manager to temporarily enable or disable the PyTorch compat.

When `enable` is True (default), the PyTorch compat is enabled for the duration
of the context and restored to its previous state afterwards. When `enable`
is False, the PyTorch compat is disabled for the duration of the context and
restored afterwards.

Args:
    enable (bool, optional): Whether to enable or disable the PyTorch compat
        within the context. Defaults to True.
    scope (str or Iterable[str], optional): Specific module or modules to enable
        PyTorch compat for. If None, uses the global scope. Defaults to None.
    silent (bool, optional): If True, suppresses warnings about scope changes.
        Defaults to False.

Example:
    .. code-block:: pycon

        >>> import paddle

        >>> with paddle.compat.use_torch_proxy_guard():
        ...     # code that requires the Torch compat to be enabled
        ...     import torch  # type: ignore[import-not-found]
        ...
        ...     assert torch.sin is paddle.sin
        ...     # Temporarily disable the Torch compat
        ...     with paddle.compat.use_torch_proxy_guard(enable=False):
        ...         try:
        ...             import torch
        ...         except ModuleNotFoundError:
        ...             print("Torch compat is disabled within this block.")
        ...     # Torch compat is re-enabled here
        ...     import torch
        ...
        ...     assert torch.sin is paddle.sin
N)r   r   T)	r+  r&  r  r'  r   r   r   r2  r5  )r   r   r   already_has_torch_proxyoriginal_local_enabled_scopeoriginal_globally_enableds         r   r   r     s    X E0CMMA#&'9'N'N#O  2 D D(	"u}(^ce<6	" - 3 4M0!	MT$7, 3 4M0 - 3 4M0! T$7, 3 4M0s6   BD(	C +D(9D =!D("D  D("D%%D(c                .    [         R                  U 5        g)a!  Add modules to the PyTorch proxy blocked list.

Modules in the blocked list will not use PyTorch compat when imported,
and their functions will not trigger PyTorch compat when called.

By default, some modules are already in the blocked list, such as 'tvm_ffi'.

Args:
    modules(Iterable[str]): An iterable of module names to block from PyTorch compat.

Example:
    .. code-block:: pycon

        >>> import paddle
        >>> paddle.enable_compat()  # Enable torch compat globally
        >>> # Add 'my_custom_module' to the blocked list
        >>> paddle.compat.extend_torch_proxy_blocked_modules(['my_custom_module'])
        >>> # doctest: +SKIP('my_custom_module is not available')
        >>> import my_custom_module  # type: ignore[import-not-found] # This import will not use torch compat
N)r   ru   )r  s    r   r0  r0  ]  s    *  &&w/r   c                 "    [        S1S9  SSKn U $ )a  
Enable the triton support and return triton module.
Args: None.
Returns: triton module

Example:
    .. code-block:: pycon

        >>> # doctest: +REQUIRES(env:GPU)
        >>> from paddle.compat import paddle_triton_fun
        >>> triton = paddle_triton_fun()
        >>> import triton.language as tl

        >>> @triton.jit
        >>> def add_kernel(X, Y, Z, N, BLOCK: tl.constexpr):
        ...     pid = tl.program_id(0)
        ...     offs = pid * BLOCK + tl.arange(0, BLOCK)
        ...     mask = offs < N
        ...     x = tl.load(X + offs, mask=mask)
        ...     y = tl.load(Y + offs, mask=mask)
        ...     tl.store(Z + offs, x + y, mask=mask)
tritonr*  r   N)r2  r<  )r<  s    r   paddle_triton_funr=  u  s    . hZ(Mr   )r   r   )r&   zdict[str, Any])re   rk   rl   None)r   r   r   r   rl   r   )r   r   rl   r   )r   r   r   r   rl   r   )r   r   rl   r   )r   r  r   r   rl   r>  )r   zstr | Iterable[str] | Nonerl   r  )
r   r   r-  r   r.  zLiteral['torch']r   r   rl   r>  )rl   r>  )r   r   r   r   r   r   rl   zGenerator[None, None, None])r  zIterable[str]rl   r>  )<
__future__r   rH   importlib.abcimportlib.utilr   r|   r  r   r   
contextlibr   	functoolsr   typingr   r   r   collections.abcr	   r
   typing_extensionsr   r   r   r  r   r(   r.   r0   r=   rR   r   r\   rn   r   rq   rs   rv   r   r   r   r   r   r   r   r   r   r&  r   r  r  r  r(  r+  r2  r5  r   r0  r=  r$   r   r   <module>rG     s'   #      
   %  . .3+(3-/$6J	6!" "

$7 
0 4%"" 4& /0KL4 0 
   #< C ;!9 3 9'-'	' 4 4:;?x
 x
v *+ 35 0 5""6 55 5 
	5D "& '3030  30 	30
 30 
30l44  	HMHM HM 	HM
 !HM HMV00r   