§
    ž²Åj#6  ã                   ó¨  — d dl Z d dlZd dlZd dlmZ d dl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 dd	lmZ dd
lmZ  ej        e¦  «        Z	 ed„ ¦   «         Zd„ Zd„ Zed„ ¦   «         Zed„ ¦   «         Zed„ ¦   «         Z ed¬¦  «        d„ ¦   «         Z d„ Z!d4d„Z"de	j#        j$        de%fd„Z&d„ Z'	 	 d5d„Z( ede(¬¦  «          ee!d¬¦  «        Z) ede)¬¦  «         d „ Z* ed!e*¬¦  «         d"„ Z+ ed#e+¬¦  «          ee¬$¦  «        Z, ed%e,¬¦  «          G d&„ d'e-¦  «        Z. G d(„ d)e-¦  «        Z/ed*e	j0        j1        fd+„¦   «         Z2ed*e	j0        j1        fd,„¦   «         Z3ed*e	j0        j1        fd-„¦   «         Z4ed*e	j0        j1        fd.„¦   «         Z5e j6         G d/„ d0¦  «        ¦   «         Z7d*e	j0        j1        fd1„Z8 G d2„ d3¦  «        Z9dS )6é    N)Úimport_module)ÚAnyÚListÚOptional)Ú#min_cut_rematerialization_partition)Ú_guards)Úconfig)Ú
ts_compileé   )Úaot_autograd)Úregister_debug_backendc                 óJ   — |rt                                d|¦  «         | j        S )Nz&eager backend ignoring extra kwargs %s)ÚlogÚwarningÚforward)ÚgmÚfake_tensor_inputsÚkwargss      úQC:\Projects\Historical\venv\Lib\site-packages\torch/_dynamo/backends/debugging.pyÚeagerr      s(   € àð FÝ�ŠÐ<¸fÑEÔEÐEØŒ:Ðó    c                 ó"   — t          | g¦  «        S ©N)Ú,make_eager_backend_with_torch_function_modes)Úmodes    r   Ú+make_eager_backend_with_torch_function_moder   "   s   € Ý7¸¸Ñ?Ô?Ð?r   c                 ó"   ‡ ‡— ddl mŠ ˆˆ fd„}|S )zèUsed to trace HOPs (cond and while) for eager exectution, the metadata
    TF mode mutates vars outside of the scope of the HOP, and we can't have graph breaks
    in the HOP, so we need to externally run this mode and not trace it.r   )Ú	ExitStackc                 ó†   •—  ‰¦   «         }‰D ]}|                      |¦  «         Œ| j        }|                     ¦   «          |S r   )Úenter_contextr   Úclose)r   r   r   Ústackr   Úresultr   Úmodess         €€r   Úfnz8make_eager_backend_with_torch_function_modes.<locals>.fn,   sM   ø€ Ø�	‘”ˆØð 	&ð 	&ˆDØ×Ò Ñ%Ô%Ð%Ð%à”ˆØ�Š‰ŒˆØˆr   )Ú
contextlibr   )r$   r%   r   s   ` @r   r   r   &   s=   øø€ ð %Ð$Ð$Ð$Ð$Ð$ðð ð ð ð ð ð €Ir   c                 óL   ‡ — |rt                                d|¦  «         ˆ fd„}|S )Nz/eager_noexcept backend ignoring extra kwargs %sc                  ó~   •— 	  ‰| Ž S # t           $ r*}t          j        j                             d¦  «        |‚d }~ww xY w)Nz7Unexpected exception when running generated GraphModule)Ú	ExceptionÚtorchÚ_dynamoÚexcÚTorchDynamoException)ÚargsÚer   s     €r   Úinnerzeager_noexcept.<locals>.inner?   sV   ø€ ð	Ø�2�t�9ÐøÝð 	ð 	ð 	Ý”-Ô#×8Ò8ØIñô àðøøøøð	øøøs   ƒ ˆ
<’%7·<)r   r   )r   r   r   r0   s   `   r   Úeager_noexceptr1   8   sA   ø€ àð OÝ�ŠÐEÀvÑNÔNÐNðð ð ð ð ð €Lr   c                 ó    ‡ — |rt                                d|¦  «         ddlm} ˆ fd„}  ||d¬¦  «        |Ž }|                     ¦   «          |S )Nz3pre_dispatch_eager backend ignoring extra kwargs %sr   )Úmake_fxc                  óP   •— t          j                             ‰¦  «        j        | Ž S r   ©r*   ÚfxÚInterpreterÚrun)r.   r   s    €r   Úrunnable_gmz'pre_dispatch_eager.<locals>.runnable_gmQ   s!   ø€ ÝŒx×#Ò# BÑ'Ô'Ô+¨TÐ2Ð2r   T)Úpre_dispatch)r   r   Ú"torch.fx.experimental.proxy_tensorr3   Úprint_readable)r   r   r   r3   r9   Úpre_dispatch_gms   `     r   Úpre_dispatch_eagerr>   J   s‚   ø€ àð SÝ�ŠÐIÈ6ÑRÔRÐRà:Ð:Ð:Ð:Ð:Ð:ð3ð 3ð 3ð 3ð 3ð >�g�g˜k¸Ð=Ñ=Ô=Ð?QÐR€OØ×"Ò"Ñ$Ô$Ð$àÐr   c                 ó\   ‡ ‡— |rt                                d|¦  «         ddlmŠ ˆˆ fd„}|S )Nz,eager_debug backend ignoring extra kwargs %sr   )ÚSchemaCheckModec                  ó˜   •—  ‰¦   «         5  t          j                             ‰¦  «        j        | Ž cd d d ¦  «         S # 1 swxY w Y   d S r   r5   )r.   r@   r   s    €€r   r0   zeager_debug.<locals>.innerd   s�   ø€ Øˆ_ÑÔð 	7ð 	7Ý”8×'Ò'¨Ñ+Ô+Ô/°Ð6ð	7ð 	7ð 	7ð 	7ñ 	7ô 	7ð 	7ð 	7ð 	7ð 	7ð 	7ð 	7øøøð 	7ð 	7ð 	7ð 	7ð 	7ð 	7s   Œ&?¿AÁA)r   r   Ú#torch._subclasses.schema_check_moder@   )r   r   r   r0   r@   s   `   @r   Úeager_debugrC   Z   sY   øø€ àð LÝ�ŠÐBÀFÑKÔKÐKàCÐCÐCÐCÐCÐCð
7ð 7ð 7ð 7ð 7ð 7ð €Lr   Úts)Únamec                 ó@   — t           j                             | ¦  «        S r   )r*   ÚjitÚscript)r   r   s     r   ÚtorchscriptrI   k   s   € åŒ9×Ò˜BÑÔÐr   c                 ó    ‡ — ˆ fd„}d|_         |S )Nc                 óh   •— t           j                             ‰¦  «                             | ¦  «        S r   )r*   r6   r7   Ú	boxed_run)r.   Úfx_gs    €r   r8   zboxed_nop.<locals>.runr   s'   ø€ ÝŒx×#Ò# DÑ)Ô)×3Ò3°DÑ9Ô9Ð9r   T©Ú_boxed_call)rM   Úexample_inputsr8   s   `  r   Ú	boxed_noprQ   q   s*   ø€ ð:ð :ð :ð :ð :ð €C„OØ€Jr   c                 ó$   ‡ ‡— ˆ ˆfd„}d|_         |S )Nc                 óÚ   •— t           j                             ‰¦  «        5  t           j                             ‰¦  «                             | ¦  «        cd d d ¦  «         S # 1 swxY w Y   d S r   )r*   Ú_subclassesÚCrossRefFakeModer6   r7   rL   )r.   rM   Úignore_op_fns    €€r   r8   z$fake_crossref_boxed_nop.<locals>.runz   sŸ   ø€ ÝÔ×/Ò/°Ñ=Ô=ð 	>ð 	>Ý”8×'Ò'¨Ñ-Ô-×7Ò7¸Ñ=Ô=ð	>ð 	>ð 	>ð 	>ñ 	>ô 	>ð 	>ð 	>ð 	>ð 	>ð 	>ð 	>øøøð 	>ð 	>ð 	>ð 	>ð 	>ð 	>s   ¡2A Á A$Á'A$TrN   )rM   rP   rV   r8   s   ` ` r   Úfake_crossref_boxed_noprW   y   s0   øø€ ð>ð >ð >ð >ð >ð >ð €C„OØ€Jr   ÚopÚreturnc                 ó   — | j         dv S )N)ÚatenÚprimsÚprim)Ú	namespace)rX   s    r   Úignore_builtinsr_   ‚   s   € ØŒ<Ð4Ð4Ð4r   c                  óö   — t           j        j        j        st          S t           j        j        j        dk    rt
          S t           j        j        j        dk    sJ ‚t          j        t
          t          ¬¦  «        S )NÚallÚ
custom_ops)rV   )	r*   Ú
_functorchr	   Úfake_tensor_crossrefrQ   rW   Ú	functoolsÚpartialr_   © r   r   Úget_nop_funcrh   †   se   € ÝÔÔ"Ô7ð XÝÐÝ	Ô	Ô	 Ô	5¸Ò	>Ð	>Ý&Ð&åÔÔ&Ô;¸|ÒKÐKÐKÐKÝÔ Õ!8ÅÐWÑWÔWÐWr   c                 ó^   —  t          |pt          |pt          t          d¬¦  «        | |fi |¤ŽS )NT)Úfw_compilerÚbw_compilerÚpartition_fnÚkeep_inference_input_mutations)r   rQ   r   )r   r   rj   rk   r   s        r   Ú	aot_eagerrn   ’   sT   € ð�<ØÐ,¥9ØÐ,¥9Ý8Ø'+ð	ñ ô ð
 	Ð
ð(ð (ð
 !'ð(ð (ð (r   rn   )rE   Úcompiler_fnT)rj   rm   Úaot_eager_default_partitionerc                 ó¢  — |rt                                d|¦  «         ddlm} ddi}|                     d¦  «        x}r|                     |¦  «         t          j        |¦  «        5   t          t          ¦   «         t          ¦   «         d„ t          j        t          d¬	¦  «        ¬
¦  «        | |¦  «        cd d d ¦  «         S # 1 swxY w Y   d S )Nz;aot_eager_decomp_partition backend ignoring extra kwargs %sr   )ÚCompilerBisectorÚunlift_effect_tokensTÚaot_eager_decomp_partitionc                  óD   — t          d¦  «                             ¦   «         S )Nztorch._inductor.compile_fx)r   Úselect_decomp_tablerg   r   r   ú<lambda>z,aot_eager_decomp_partition.<locals>.<lambda>Ã   s"   € ¥=Ø,ñ$ô $ç!Ò!Ñ#Ô#ð r   Úinductor)Úcompiler)rj   rk   Údecompositionsrl   )r   r   Ú!torch._inductor.compiler_bisectorrr   Úget_config_changeÚupdateÚfunctorch_configÚpatchr   rh   re   rf   r   )r   r   r   rr   Úconfig_patchesÚbisect_changess         r   rt   rt   ¯   sM  € Øð 
Ý�ŠØIÈ6ñ	
ô 	
ð 	
ð CÐBÐBÐBÐBÐBà,¨dÐ3€NØ)×;Ò;Ø$ñô ð €~ð .ð 	×Ò˜nÑ-Ô-Ð-å	Ô	 Ñ	/Ô	/ð "ð "ð
�|å$™œÝ$™œð$ð $õ #Ô*Ý3¸jðñ ô ð
ñ 
ô 
ð Ð ñ"ô "ð"ð "ð "ð "ñ "ô "ð "ð "ð "ð "ð "ð "øøøð "ð "ð "ð "ð "ð "s   Á(ACÃCÃCrt   c                 ó°   — t           j        sdnt           j        }t          j        |¬¦  «        5  t          | |fi |¤Žcd d d ¦  «         S # 1 swxY w Y   d S )Nrb   )rd   )r~   rd   r   rt   )r   r   r   Ú
config_vals       r   Ú#aot_eager_decomp_partition_crossrefr„   Ñ   sÂ   € õ  Ô4ð	3ˆˆåÔ2ð õ
 
Ô	°ZÐ	@Ñ	@Ô	@ð Lð LÝ)¨"Ð.@ÐKÐKÀFÐKÐKðLð Lð Lð Lñ Lô Lð Lð Lð Lð Lð Lð Løøøð Lð Lð Lð Lð Lð Ls   °AÁAÁAr„   )rj   Úaot_tsc                   ó   — e Zd ZdS )ÚReluCompileErrorN©Ú__name__Ú
__module__Ú__qualname__rg   r   r   r‡   r‡   î   ó   € € € € € Ø€Dr   r‡   c                   ó   — e Zd ZdS )ÚTestingOnlyCompileErrorNrˆ   rg   r   r   rŽ   rŽ   ò   rŒ   r   rŽ   r   c                 ó\   — | j         j        D ]}|j        t          j        k    rt
          ‚Œ| S r   )ÚgraphÚnodesÚtargetr*   Úrelur‡   ©r   rP   Únodes      r   Úrelu_compile_error_TESTING_ONLYr–   ö   s4   € à””ð #ð #ˆØŒ;�%œ*Ò$Ð$Ý"Ð"ð %à€Ir   c                 ó¦   — | j         j        D ]/}|j        t          j        k    rt          j        |_        d|_        Œ0|                      ¦   «          | S )N)FÚReluRuntimeError)r�   r‘   r’   r*   r“   Ú_assertr.   Ú	recompiler”   s      r   Úrelu_runtime_error_TESTING_ONLYr›   þ   sG   € à””ð 4ð 4ˆØŒ;�%œ*Ò$Ð$Ýœ-ˆDŒKØ3ˆDŒIøØ‡L‚L�N„N€NØ€Ir   c                 óÀ   — | j         j        D ]<}|j        t          j        k    r%t          j        |_        |j        d         df|_        Œ=|                      ¦   «          | S )Nr   r   )r�   r‘   r’   r*   r“   Úaddr.   rš   r”   s      r   Ú relu_accuracy_error_TESTING_ONLYrž     sR   € à””ð *ð *ˆØŒ;�%œ*Ò$Ð$Ýœ)ˆDŒKØœ 1œ qÐ)ˆDŒIøØ‡L‚L�N„N€Nà€Ir   c                 óh   — | j         j        D ]}|j        dk    r nŒ| S |D ]}|j        st          ‚Œ| S )NÚcall_function)r�   r‘   rX   Úis_leafrŽ   )r   rP   r•   Úts       r   Ú#non_leaf_compile_error_TESTING_ONLYr£     s^   € ð ””ð ð ˆØŒ7�oÒ%Ð%ØˆEð &ð ˆ	Øð *ð *ˆØŒyð 	*Ý)Ð)ð	*à€Ir   c                   ó  — e Zd ZU dZeej        j                 ed<   e	ed<   e	ed<   ee
         ed<   e	ed<   dZeeej        j                          ed<   dZeeej                          ed	<   dZee         ed
<   defd„ZdS )ÚExplainOutputzu
    This is the output of :func:`torch._dynamo.explain()`
    There is no reason to create this class directly.
    ÚgraphsÚgraph_countÚgraph_break_countÚbreak_reasonsÚop_countNÚops_per_graphÚ
out_guardsÚcompile_timesrY   c                 ó.  — d| j         › d�}|d| j        › d�z  }|d| j        › d�z  }|dz  }t          | j        ¦  «        D ]7\  }}|d|dz   › d�z  }|d	|j        › d�z  }|d
z  }|j        D ]}|d|› d�z  }ŒŒ8| j        �9|dz  }t          | j        ¦  «        D ]\  }}|d|dz   › d�z  }|D ]}|d|› d�z  }ŒŒ | j        �@|dz  }t          | j        ¦  «        D ]&\  }}|d|dz   › d�z  }|dt          |¦  «        › �z  }Œ'| j
        �|d| j
        › d�z  }|S )NzGraph Count: ú
zGraph Break Count: z
Op Count: zBreak Reasons:
z  Break Reason r   z:
z    Reason: z    User Stack:
z      zOps per Graph:
z  Ops z    zOut Guards:
z  Guard zCompile Times: )r§   r¨   rª   Ú	enumerater©   ÚreasonÚ
user_stackr«   r¬   Ústrr­   )	ÚselfÚoutputÚidxÚbreak_reasonÚframe_summaryÚopsrX   ÚiÚguards	            r   Ú__str__zExplainOutput.__str__4  sà  € Ø5 Ô!1Ð5Ð5Ð5ˆØÐB¨Ô(>ÐBÐBÐBÑBˆØÐ0˜tœ}Ð0Ð0Ð0Ñ0ˆàÐ$Ñ$ˆÝ!*¨4Ô+=Ñ!>Ô!>ð 	5ð 	5ÑˆC�ØÐ2¨¨A©Ð2Ð2Ð2Ñ2ˆFØÐ< \Ô%8Ð<Ð<Ð<Ñ<ˆFØÐ)Ñ)ˆFØ!-Ô!8ð 5ð 5�ØÐ4 =Ð4Ð4Ð4Ñ4��ð5ð ÔÐ)ØÐ(Ñ(ˆFÝ% dÔ&8Ñ9Ô9ð ,ð ,‘��SØÐ- 3 q¡5Ð-Ð-Ð-Ñ-�Øð ,ð ,�BØ˜m R˜m˜m˜mÑ+�F�Fð,ð Œ?Ð&Ø�oÑ%ˆFÝ% d¤oÑ6Ô6ð .ð .‘��5ØÐ- Q q¡SÐ-Ð-Ð-Ñ-�ØÐ-¥ U¡¤Ð-Ð-Ñ-��àÔÐ)ØÐ>¨Ô(:Ð>Ð>Ð>Ñ>ˆFØˆr   )r‰   rŠ   r‹   Ú__doc__r   r*   r6   ÚGraphModuleÚ__annotations__Úintr   r«   r   ÚNoder¬   r   ÚGuardr­   r³   r¼   rg   r   r   r¥   r¥   "  sÞ   € € € € € € ðð ð
 �”Ô%Ô&Ð&Ð&Ñ&ØÐÐÑØÐÐÑØØôð ð ñ ð €M€M�MØ37€M�8˜D ¤¤Ô/Ô0Ð7Ð7Ñ7Ø04€J�˜˜gœmÔ,Ô-Ð4Ð4Ñ4Ø#'€M�8˜C”=Ð'Ð'Ñ'ð˜ð ð ð ð ð ð r   r¥   c                 ó   — |                      | ¦  «         d„ | j        j        D ¦   «         }|t          |¦  «        z  }|                      |¦  «         | j        j        r|                      | j        ¦  «         | ||||fS )a¨  
    This function is a utility which processes a torch.fx.GraphModule and
    accumulates information about its ops, graph breaks, and other details. It
    is intended to be used by the ExplainWithBackend class and
    `torch._dynamo.explain()` to provide details from Dynamo's graph capture.

    Parameters:
        gm (torch.fx.GraphModule): The GraphModule to be processed.
        graphs (list): A list that accumulates all the GraphModules processed.
        op_count (int): The total count of operations in all GraphModules processed so far.
        ops_per_graph (list): A list that accumulates the operations of each GraphModule.
        break_reasons (list): A list that accumulates the reasons for breaks in each GraphModule.

    Returns:
        tuple: A tuple containing the processed GraphModule, the updated lists of graphs,
               operations per graph, and break reasons, and the updated operation count.
    c                 ó2   — g | ]}|j         d k    ¯|j        ‘ŒS )r    )rX   r’   )Ú.0r•   s     r   ú
<listcomp>z)_explain_graph_detail.<locals>.<listcomp>h  s&   € Ð
PÐ
PÐ
P˜4°T´WÀÒ5OÐ5Oˆ4Œ;Ð5OÐ5OÐ5Or   )Úappendr�   r‘   ÚlenÚcompile_subgraph_reasonÚgraph_break)r   r¦   rª   r«   r©   r¹   s         r   Ú_explain_graph_detailrË   S  s‡   € ð( ‡M‚M�"ÑÔÐØ
PÐ
P 2¤8¤>Ð
PÑ
PÔ
P€CØ•�C‘”Ñ€HØ×Ò˜ÑÔÐØ	Ô!Ô-ð 9Ø×Ò˜RÔ7Ñ8Ô8Ð8àˆv�x °Ð=Ð=r   c                   óF   — e Zd ZdZdd„Zdej        j        fd„Zde	fd„Z
dS )	ÚExplainWithBackenda  
    This class is intended to be used as a backend for `torch.compile`. It is
    composable with other backends. When used in this way, it accumulates
    information about graph breaks, ops, and other info and provides a string
    representation summarizing this information.

    Attributes:
        backend (str): The name of the backend to use for optimization.
        graphs (list): A list of the graphs captured by TorchDynamo.
        op_count (int): The total number of operations in all optimized graphs.
        break_reasons (list): A list of graph break reasons with stack traces.

    Example Usage:
        def fn(x):
            x = torch.sigmoid(x)
            return x

        torch._dynamo.reset()
        eb = ExplainWithBackend("inductor")
        optimized_fn = torch.compile(fn, backend=eb)
        result = optimized_fn(torch.randn(5))
        print(eb.output())
    rY   Nc                 ó\   — ddl m}  ||¦  «        | _        g | _        d| _        g | _        d S )Nr   )Úlookup_backendr   )ÚregistryrÏ   Úbackendr¦   rª   r©   )r´   rÑ   rÏ   s      r   Ú__init__zExplainWithBackend.__init__Š  sA   € Ø,Ð,Ð,Ð,Ð,Ð,à%�~ gÑ.Ô.ˆŒØˆŒØˆŒØˆÔÐÐr   r   c                 óœ   — t          || j        | j        g | j        ¦  «        \  }| _        | _        }| _        |                      ||¦  «        S r   )rË   r¦   rª   r©   rÑ   )r´   r   rP   Ú_s       r   Ú__call__zExplainWithBackend.__call__’  sM   € Ý@UØ�”˜Tœ]¨B°Ô0BñA
ô A
Ñ=ˆˆDŒK˜œ¨¨4Ô+=ð �|Š|˜B Ñ/Ô/Ð/r   c                 óx   — t          | j        ¦  «        }t          | j        ||dz
  | j        | j        ¦  «        }|S )Nr   )rÈ   r¦   r¥   r©   rª   )r´   r§   rµ   s      r   rµ   zExplainWithBackend.output˜  sA   € Ý˜$œ+Ñ&Ô&ˆÝØŒKØØ˜!‰OØÔØŒMñ
ô 
ˆð ˆr   )rY   N)r‰   rŠ   r‹   r½   rÒ   r*   r6   r¾   rÕ   r¥   rµ   rg   r   r   rÍ   rÍ   q  sm   € € € € € ðð ð0 ð  ð  ð  ð0˜5œ8Ô/ð 0ð 0ð 0ð 0ð
˜ð 
ð 
ð 
ð 
ð 
ð 
r   rÍ   r   )NN):Údataclassesre   ÚloggingÚ	importlibr   Útypingr   r   r   r*   Úfunctorch.compiler   r   Útorch._functorchr	   r~   Útorch._functorch.compilersr
   Úcommonr   rÐ   r   Úregister_backendÚ	getLoggerr‰   r   r   r   r   r1   r>   rC   rI   rQ   rW   Ú_opsÚ
OpOverloadÚboolr_   rh   rn   rp   rt   r„   r…   r)   r‡   rŽ   r6   r¾   r–   r›   rž   r£   Ú	dataclassr¥   rË   rÍ   rg   r   r   ú<module>rå      s’  ðð Ð Ð Ð Ø Ð Ð Ð Ø €€€Ø #Ð #Ð #Ð #Ð #Ð #Ø &Ð &Ð &Ð &Ð &Ð &Ð &Ð &Ð &Ð &à €€€Ø AÐ AÐ AÐ AÐ AÐ AØ Ð Ð Ð Ð Ð Ø 7Ð 7Ð 7Ð 7Ð 7Ð 7Ø 1Ð 1Ð 1Ð 1Ð 1Ð 1à  Ð  Ð  Ð  Ð  Ð  Ø @Ð @Ð @Ð @Ð @Ð @ð €gÔ˜Ñ!Ô!€ðð
 ðð ñ Ôðð@ð @ð @ðð ð ð$ ðð ñ Ôðð" ðð ñ Ôðð ðð ñ Ôðð  Ð�tÐÑÔð ð  ñ Ôð ð
ð ð ðð ð ð ð5˜œ
Ô-ð 5°$ð 5ð 5ð 5ð 5ðXð Xð Xð Øð	(ð (ð (ð (ð Ð �k¨yÐ 9Ñ 9Ô 9Ð 9à , Ø¸$ð!ñ !ô !Ð ð Ð Ø	(Ð6Sðñ ô ð ð"ð "ð "ð: Ð Ø	%Ð3Mðñ ô ð ð

Lð 
Lð 
Lð Ð Ø	.Ø3ðñ ô ð ð 
ˆ *Ð	-Ñ	-Ô	-€Ø Ð �h¨FÐ 3Ñ 3Ô 3Ð 3ð	ð 	ð 	ð 	ð 	�yñ 	ô 	ð 	ð	ð 	ð 	ð 	ð 	˜iñ 	ô 	ð 	ð ð¨¬Ô(<ð ð ð ñ Ôðð ð¨¬Ô(<ð ð ð ñ Ôðð ð¨¬Ô)=ð ð ð ñ Ôðð ð¨E¬HÔ,@ð ð ð ñ Ôðð Ôð-ð -ð -ð -ð -ñ -ô -ñ Ôð-ð`>ØŒÔð>ð >ð >ð >ð<1ð 1ð 1ð 1ð 1ñ 1ô 1ð 1ð 1ð 1r   