Ë
    g^(hûL  ã                   ó¨  — 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 d dlmZm	Z	 d dl
Z
d dlmZ d dlmc mc mZ d dlmc mc mZ d dlmZ d dlmZmZ d dlmZmZmZmZm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(m)Z) d dl*m+Z+m,Z,m-Z- 	 d dl.m/Z0 e
jf                  jh                  Z4 ejj                  e6«      Z7de
jp                  jr                  de:e;df   de<e=e;f   de;fd„Z>de
jp                  jr                  de:e;df   de<e=e;f   de?fd„Z@de
jp                  jr                  de:e;df   de<e=e;f   ddfd„ZA G d„ d«      ZBy# e1$ r	 d dl.m2Z0 Y Œ¾w xY w)é    N)ÚSequence)ÚcastÚOptional)Ú
DeviceMesh)ÚDTensorSpecÚ
TensorMeta)Ú_is_inplace_opÚ_is_out_variant_opÚOpInfoÚOpSchemaÚOutputSpecType)Úis_rng_supported_mesh)Úredistribute_local_tensor)ÚShardingPropagator)Úconvolution_backward_handlerÚconvolution_handler)Útry_find_mesh_from_args)ÚPartialÚ	PlacementÚ	Replicate)Ú_cxx_pytree)Ú_pytreeÚop_callÚargs.ÚkwargsÚreturnc                 óP   —  | j                   |i |¤Ž}|t        ur|S t        d«      ‚)zˆ
    Decomposes a op to core ATen op, this handler is mostly here
    for inference mode usage where the ops are not core aten ops.
    zDecomposition failed)Ú	decomposeÚNotImplementedÚRuntimeError)r   r   r   Úrs       ú`/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/torch/distributed/tensor/_dispatch.pyÚdecompose_handlerr#   +   s4   € ð 	ˆ×Ñ˜4Ð* 6Ñ*€AØ”ÑØˆäÐ1Ó2Ð2ó    c                 ó¨   — t        t        j                  |d   «      }t        t        j                  |d   «      }|j                  |j                  k(  S )Nr   é   )r   ÚtorchÚTensorÚshape)r   r   r   ÚlhsÚrhss        r"   Úis_same_size_handlerr,   ;   s?   € ô
 Œu�|‰|˜T !™WÓ
%€CÜ
Œu�|‰|˜T !™WÓ
%€CØ�9‰9˜Ÿ	™	Ñ!Ð!r$   c           	      ót  — t         j                  j                  j                  | ||«      }t	        j
                  t        t        t           |j                  «      |j                  «      }t        t        t        df   |«      } | |i |j                  ¤Ž t        t        t         j                     |d   «      d   }|j                  }|j                  }g }|D ]>  }	t        |	t         «      r|j#                  |	«       Œ%|j#                  t%        d«      «       Œ@ t        t&        j(                  |d   «      }
t+        |t        |«      t-        |
j/                  «       |
j1                  «       |
j2                  ¬«      ¬«      }t        j                  |
|d¬«      }|j5                  «       }|
j7                  |«       y )	N.r   Úmaxr&   ©r)   ÚstrideÚdtype)ÚmeshÚ
placementsÚtensor_metaF)Úlocal_tensorÚspecÚrequires_grad)ÚdtensorÚDTensorÚ_op_dispatcherÚunwrap_to_op_infoÚpytreeÚtree_unflattenr   ÚlistÚobjectÚ
local_argsÚargs_tree_specÚtupleÚlocal_kwargsr3   Údevice_meshÚ
isinstancer   Úappendr   r'   r(   r   r   Úsizer0   r1   Úfull_tensorÚcopy_)r   r   r   Úop_infoÚlocal_tensor_argsÚgrad_dtensorÚgrad_placementsr2   Úfound_inf_placementsÚ	placementÚtarget_tensorr6   Úfound_inf_dtensorÚ	found_infs                 r"   Úfound_inf_reduce_handlerrS   E   s{  € ô
 �o‰o×,Ñ,×>Ñ>¸wÈÈfÓU€GÜ×-Ñ-ÜŒT”&‰\˜7×-Ñ-Ó.Ø×ÑóÐô œU¤6¨3 ;Ñ/Ð1BÓCÐÙÐÐ7 '×"6Ñ"6Ò7äœœWŸ_™_Ñ-¨t°A©wÓ7¸Ñ:€LØ"×-Ñ-€OØ×#Ñ#€Dà,.ÐØ$ò 8ˆ	Ü�i¤Ô+Ø ×'Ñ'¨	Õ2à ×'Ñ'¬°«Õ7ð	8ô œŸ™ t¨A¡wÓ/€MÜØÜÐ-Ó.ÜØ×$Ñ$Ó&Ø ×'Ñ'Ó)Ø×%Ñ%ô
ô€Dô  Ÿ™Ø"¨¸UôÐð "×-Ñ-Ó/€IØ×Ñ˜	Õ"r$   c                   óP  — e Zd ZdZdd„Zdej                  j                  dee	df   de
ee	f   de	fd	„Zed
ededdfd„«       Zdej                  j                  dee	df   de
ee	f   defd„Zede	dede	fd„«       Zdej                  j                  dej(                  dedefd„Zy)ÚOpDispatcheraù  
    Op dispatching class instance to handle args/kwargs pre-processing (un-wrapping), sharding
    propagation, redistribute local args, local compute, and post-processing (re-wrapping). It
    also handles any op specific logic if necessary.

    NOTE: Given the runtime overhead of Tensor subclass (__torch_dispatch__), the OpDispatcher
    is designed to minimize the CPU overhead by using the tricks of proper unflattening, faster
    pytree if needed, and leveraging various caching mechanisms implemented in the sharding
    propagation and redistribute modules. The CPU overhead is critical to eager mode performance,
    one need to carefully measure the CPU overhead when making significant changes to the
    OpDispatcher and ShardingPropagator.
    r   Nc                 ó¨  — t        «       | _        t        j                  j                  t        j
                  j                  t        j                  j                  t        j                  j                  t        j                  j                  t        j                  j                  t        j                  j                  t        j                  j                  t        j                  j                  t        j                  j                  h
| _        t        j                   j                  t"        t        j$                  j                  t"        t        j&                  j                  t(        t        j*                  j                  t,        t        j.                  j                  t0        t        j2                  j                  t4        i| _        d| _        y )NF)r   Úsharding_propagatorÚatenÚnative_dropoutÚdefaultÚnormal_Ú	rand_likeÚ
randn_likeÚrandint_likeÚ	low_dtypeÚlow_dtype_outÚuniform_Ú	bernoulliÚ
bernoulli_ÚfloatÚ_random_opsÚlinearr#   ÚmatmulÚis_same_sizer,   Úconvolutionr   Úconvolution_backwardr   Ú*_amp_foreach_non_finite_check_and_unscale_rS   Ú_custom_op_handlersÚ_allow_implicit_replication)Úselfs    r"   Ú__init__zOpDispatcher.__init__|   s  € Ü#5Ó#7ˆÔ ä×Ñ×'Ñ'Ü�L‰L× Ñ Ü�N‰N×"Ñ"Ü�O‰O×#Ñ#Ü×Ñ×%Ñ%Ü×Ñ×'Ñ'Ü×Ñ×+Ñ+Ü�M‰M×!Ñ!Ü�N‰N×"Ñ"Ü�O‰O×!Ñ!ð
ˆÔô �K‰K×ÑÔ!2Ü�K‰K×ÑÔ!2Ü×Ñ×%Ñ%Ô';Ü×Ñ×$Ñ$Ô&9Ü×%Ñ%×-Ñ-Ô/KÜ×;Ñ;×CÑCÔE]ð$
ˆÔ ð ,1ˆÕ(r$   r   r   .r   c                 óP
  — || j                   v r | j                   |   |||«      S | j                  |||«      }t        j                  d|j                  «       | j
                  j                  |«       |j                  }t        j                  d||«       |€J d«       ‚|j                  }|j                  «       ��±|j                  r*|j                  €J ‚| j                  ||j                  «       |j                  r?t        j                  t!        t"        t$           |j&                  «      |j                  «      n|j&                  }t!        t(        t$        df   |«      }|| j*                  v rêt,        j.                  s)t1        |«      rt-        j2                  |«      t,        _        t!        t4        j6                  |d   «      t!        t8        j:                  |d   «      }	}t,        j.                  r5|	j<                  s)t,        j.                  j?                  |j@                  «      ntC        jD                  «       }
|
5   ||i |jF                  ¤Ž}ddd«       nç ||i |jF                  ¤Ž}nÔ|jH                  }|j                  jJ                  jL                  jN                  }|€d}n™dtP        dt8        j:                  fd	„}tS        |tP        «      r	 ||«      }nftS        |tT        «      rV|D �cg c]  }|� ||«      nd‘Œ }}tS        |t"        «      sJ ‚d|v r'tW        |d   jX                  «      }t[        d
|› d�«      ‚|jH                  €˜|t\        j^                  j`                  k(  r{tc        te        jf                  «       «      D �cg c]  }d‘Œ }}te        jh                  |«       t#        tk        d„ |«      «      }tm        jn                  tp        jr                  |d«      }tu        |«      r|jH                  �|d   S ytw        |«      rçtS        |jH                  t(        «      s|jH                  fn|jH                  }g }d}|jL                  jx                  D ]d  }|jz                  sŒt!        t4        j6                  ||j|                     «      }t!        tP        ||   «      |_         |j                  |«       |dz  }Œf t�        |«      dk\  sJ d«       ‚t�        |«      dkD  rt)        |«      S |d   S | jƒ                  |jH                  «      S # 1 sw Y   �ŒÙxY wc c}w c c}w )z(
        Main dispatching logic
        zDispatching op_call: %szoutput_sharding for %s: %sNz"output sharding should not be None.r   r6   r   c                 ó  — | j                   �h| j                   j                  }| j                   j                  }t        |«      dk(  rt	        j
                  d|¬«      S t	        j                  g |¬«      S t        | › d�«      ‚)Nr   © )r1   z has no tensor metadata.)r4   r)   r1   Úlenr'   ÚzerosÚtensorr    )r6   r)   r1   s      r"   Údefault_tensorz-OpDispatcher.dispatch.<locals>.default_tensorê   sr   € Ø×'Ñ'Ð3Ø $× 0Ñ 0× 6Ñ 6˜Ø $× 0Ñ 0× 6Ñ 6˜Ü˜u›:¨š?ä#(§;¡;¨r¸Ô#?Ð?ô $)§<¡<°¸%Ô#@Ð@ä*¨d¨VÐ3KÐ+LÓMÐMr$   zreturn type z in DTensor op is not supportedc                 ó
   — | d uS ©Nrr   )Úxs    r"   ú<lambda>z'OpDispatcher.dispatch.<locals>.<lambda>  s
   € °¸$°€ r$   Tr&   z,out variant should have at least one out arg)Brl   r;   ÚloggerÚdebugÚschemarW   Ú	propagateÚoutput_shardingÚcompute_meshÚget_coordinateÚneeds_redistributeÚredistribute_schemaÚredistribute_local_argsrA   r<   r=   r   r>   r?   r@   rB   re   ÚrandomÚ_rng_trackerr   ÚOffsetBasedRNGTrackerr8   r9   r'   r(   Úis_metaÚ_distribute_regionÚ_specÚ
contextlibÚnullcontextrC   Úoutput_specÚopÚ_schemaÚreturnsr   rE   r   ÚstrÚtypeÚNotImplementedErrorrX   ÚequalrZ   ÚrangeÚdistÚget_world_sizeÚall_gather_objectÚfilterÚ	functoolsÚreduceÚoperatorÚand_r	   r
   Ú	argumentsÚis_outÚnamerF   rs   Úwrap)rn   r   r   r   rJ   r   r2   rK   Ú	first_argÚfirst_local_argÚrng_contextÚlocal_resultsr6   Úret_listrv   ÚsÚret_typeÚ_Úobj_listÚoutput_specsÚout_dtsÚspec_idxÚargumentÚout_dts                           r"   ÚdispatchzOpDispatcher.dispatch™   s¹  € ð �d×.Ñ.Ñ.Ø4�4×+Ñ+¨GÑ4°W¸dÀFÓKÐKð ×(Ñ(¨°$¸Ó?ˆÜ�‰Ð.°·±Ô?à× Ñ ×*Ñ*¨7Ô3Ø!×1Ñ1ˆÜ�‰Ð1°7¸OÔLØÐ*ÐPÐ,PÓPÐ*à×#Ñ#ˆØ×ÑÓ Ñ,à×1Ò1ð '×:Ñ:ÐFÐFÐFØ×,Ñ,Ø˜_×@Ñ@ôð ×)Ò)ô ×%Ñ%Üœœf™ w×'9Ñ'9Ó:¸G×<RÑ<Rôð ×'Ñ'ð ô !%¤U¬6°3¨;Ñ%7Ð9JÓ KÐØ˜$×*Ñ*Ñ*Ü×*Ò*Ô/DÀTÔ/Jô +1×*FÑ*FÀtÓ*L”FÔ'ô œŸ™¨$¨q©'Ó2ÜœŸ™Ð'8¸Ñ';Ó<ð +�	ô ×*Ò*°?×3JÒ3Jô ×'Ñ'×:Ñ:¸9¿?¹?ÔKä#×/Ñ/Ó1ð ð !ñ XÙ$+Ð->Ð$WÀ'×BVÑBVÑ$W�M÷Xð Xñ !(Ð):Ð S¸g×>RÑ>RÑ S‘ð #×.Ñ.ˆDØ—~‘~×(Ñ(×0Ñ0×8Ñ8ˆHàˆ|ð !%‘ðN¬ð N¼¿¹ó Nô ˜d¤KÔ0á$2°4Ó$8‘MÜ ¤hÔ/ð OSö%ØIJ¨Q¨]™ qÔ)ÀÑDð%�Mð %ô & m´TÔ:Ð:Ð:Ø˜}Ñ,Ü#& x°¡{×'7Ñ'7Ó#8˜Ü1Ø*¨8¨*Ð4SÐTóð ð ×&Ñ&Ð.Øœ$Ÿ*™*×,Ñ,Ò,ô +0´×0CÑ0CÓ0EÓ*FÖG QšDÐG�ÐGÜ×&Ñ& x°Ô?Ü¤Ñ'>ÀÓ IÓJ�ä )× 0Ñ 0´·±ÀÈ$Ó O�ä˜'Ô"à×*Ñ*Ð6Ø˜A‘w�àÜ Ô(ô " /×"=Ñ"=¼uÔEð !×,Ñ,Ñ.à$×0Ñ0ð ð
 ˆGØˆHØ#ŸO™O×5Ñ5ò "�Ø—?“?Ü!¤'§/¡/°6¸(¿-¹-Ñ3HÓI�FÜ#'¬°\À(Ñ5KÓ#L�F”LØ—N‘N 6Ô*Ø ‘M‘Hð"ô �w“< 1Ò$ÐTÐ&TÓTÐ$Ü%(¨£\°AÒ%5”5˜“>ÐE¸7À1¹:ÐEà—9‘9˜]¨O×,GÑ,GÓHÐH÷kXñ XüòN%ùò Hs   È?TË0TÎ
	T#ÔTrJ   Úsuggested_input_schemac                 óê  — | j                   �)t        t        j                  |j                  «      «      }n|j                  }g }t        | j                  «      D ]ˆ  \  }}||   }t        |t        «      r]t        t        j                  | j                  |   «      }||k7  rt        |||«      }|j                  |«       Œf|j                  |«       Œx|j                  |«       ŒŠ t        |«      | _        y rx   )rA   rB   r<   Útree_leavesÚargs_schemaÚ	enumerateÚflat_args_schemarE   r   r   r'   r(   r@   r   rF   )	rJ   r±   Úflatten_args_schema_to_reshardÚnew_local_argsÚiÚarg_specÚreshard_arg_specr5   Úresharded_local_tensors	            r"   r„   z$OpDispatcher.redistribute_local_args,  së   € ð ×!Ñ!Ð-Ü-2Ü×"Ñ"Ð#9×#EÑ#EÓFó.Ñ*ð .D×-OÑ-OÐ*à')ˆÜ$ W×%=Ñ%=Ó>ò 	8‰KˆAˆxØ=¸aÑ@ÐÜ˜(¤KÔ0Ü#¤E§L¡L°'×2DÑ2DÀQÑ2GÓH�ØÐ/Ò/Ü-FØ$ hÐ0@ó.Ð*ð #×)Ñ)Ð*@ÕAà"×)Ñ)¨,Õ7à×%Ñ%Ð&6Õ7ð	8ô # >Ó2ˆÕr$   c           
      óx  — | j                   j                  j                  |d «      }|�'|j                  rt	        j
                  |«      \  }}|}n|d }}g }i }	g }
i }d }|D ]â  }t        |t        j                  «      rF|
j                  |j                  «       |j                  |j                  «       |�ŒV|j                  }Œct        |t        j                  «      rD|xs t        ||«      }|j                  | j!                  |||«      «       |
j                  |«       ŒÁ|j                  |«       |
j                  |«       Œä |j#                  «       D ]Ž  \  }}t        |t        j                  «      r|j                  ||<   |j                  |	|<   Œ?t        |t        j                  «      r,|xs t        ||«      }| j!                  |||«      |	|<   |||<   Œ…||	|<   |||<   Œ� |€J d|› d�«       ‚t%        |t'        ||rt	        j(                  ||«      n
t+        |«      |	|¬«      |t+        |
«      ||«      }|S )Nz*found no DeviceMesh from dtensor args for ú!)Úschema_info)rW   Úop_to_schema_infoÚgetÚneeds_pytreer<   Útree_flattenrE   r8   r9   rF   Ú_local_tensorrŠ   rD   r'   r(   r   Ú%_try_replicate_spec_for_scalar_tensorÚitemsr   r   r=   rB   )rn   r   r   r   Úruntime_schema_infoÚ	tree_argsÚ	args_specÚ	args_listr´   Úkwargs_schemar@   rC   r€   ÚargÚkÚvrJ   s                    r"   r;   zOpDispatcher.unwrap_to_op_infoJ  s^  € ð #×6Ñ6×HÑH×LÑLØ�Tó
Ðð Ð*Ð/B×/OÒ/Oä#)×#6Ñ#6°tÓ#<Ñ ˆI�yØ*3‰Ià#'¨�yˆIà$&ˆØ+-ˆØ#%ˆ
Ø*,ˆØ-1ˆàò 	'ˆCÜ˜#œwŸ™Ô/Ø×!Ñ! #×"3Ñ"3Ô4Ø×"Ñ" 3§9¡9Ô-ØÑ'à#&§?¡?‘LÜ˜C¤§¡Ô.Ø+ò  Ô/FØ˜Yó0�ð ×"Ñ"Ø×>Ñ>Ø  lóôð
 ×!Ñ! #Õ&ð ×"Ñ" 3Ô'Ø×!Ñ! #Õ&ð)	'ð, —L‘L“Nò 	$‰DˆAˆqÜ˜!œWŸ_™_Ô-Ø"#§/¡/�˜Q‘Ø#$§7¡7�˜aÒ Ü˜AœuŸ|™|Ô,Ø+ò  Ô/FØ˜Yó0�ð $(×#MÑ#MØ˜Q ó$�˜aÑ ð #$�˜Q’ð $%�˜aÑ Ø"#�˜Q’ð	$ð" Ð'ð 	
Ø8¸¸	ÀÐCó	
Ð'ô ØÜØñ !ô ×)Ñ)¨+°yÔAä˜{Ó+àØ/ô	ð Ü�*ÓØØó
ˆð" ˆr$   Úresr6   c                 ó
  — t        | t        j                  «      rW|�=t        |t        «      sJ d|› d�«       ‚t	        j
                  | || j                  ¬«      S | j                  dk(  sJ d«       ‚| S t        | t        t        f«      r{|�t        |t        t        f«      sJ d|› d�«       ‚g }t        | |«      D ]*  \  }}|j                  t        j                  ||«      «       Œ, t        | t        «      rt        |«      S |S | S )NzBoutput spec does not match with output! Expected DTensorSpec, got ú.)r7   r   zoutput tensor should be scalar!zAoutput spec does not match with output! Expected list/tuple, got )rE   r'   r(   r   r8   r9   r7   Úndimr>   rB   ÚziprF   rU   r¡   )rÏ   r6   Úres_listÚer§   s        r"   r¡   zOpDispatcher.wrapŸ  s  € ä�cœ5Ÿ<™<Ô(ØÐÜ! $¬Ô4ð ØXÐY]ÐX^Ð^_Ð`óÐ4ô —‘ s¨DÀ×@QÑ@QÔRÐRð —x‘x 1’}ÐGÐ&GÓG�}Ø�
Ü˜œd¤E˜]Ô+ØÐ#¬
°4¼$Ä¸Ô(Gð ØSÐTXÐSYÐYZÐ[óÐGð ˆHÜ˜C ›ò 9‘��1Ø—‘¤× 1Ñ 1°!°QÓ 7Õ8ð9ô '1°´eÔ&<”5˜“?ÐJÀ(ÐJð ˆJr$   Ú
tensor_argr€   c           	      ór  — |j                  «       dk(  r$|j                  dk(  rt        j                  d«       |j                  «       dk(  s| j                  rTt        |t        «       f|j                  z  t        |j                  |j                  «       |j                  ¬«      ¬«      }|S t        |› d�«      ‚)Nr&   zàFound a non-scalar tensor with numel=1 and ndim!=0, we are implicitly creating a replicated DTensor for it. However, please consider changing it to a scalar tensor or explicitly create a DTensor under distributed enviroment.r/   )r4   zw: got mixed torch.Tensor and DTensor, need to convert all torch.Tensor to DTensor before calling distributed operators!)ÚnumelrÒ   ÚwarningsÚwarnrm   r   r   r   r)   r0   r1   r    )rn   r   rÖ   r€   Úreplication_specs        r"   rÅ   z2OpDispatcher._try_replicate_spec_for_scalar_tensor¹  s»   € ð ×ÑÓ Ò" z§¡¸!Ò';Ü�M‰MðOôð ×ÑÓ Ò" d×&FÒ&Fä*ØÜ“� ×!2Ñ!2Ñ2Ü&Ø$×*Ñ*Ø%×,Ñ,Ó.Ø$×*Ñ*ôô Ðð  Ðô	 Ø�)ð Qð Qóð r$   )r   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ro   r'   Ú_opsÚ
OpOverloadrB   r?   Údictr‘   r°   Ústaticmethodr   r   r„   r;   r   r¡   r(   r   r   rÅ   rr   r$   r"   rU   rU   n   s;  „ ñó1ð:QIà—‘×&Ñ&ðQIð �F˜C�KÑ ðQIð �S˜&�[Ñ!ð	QIð
 
óQIðf ð3Øð3à (ð3ð 
ò3ó ð3ð:Sà—‘×&Ñ&ðSð �F˜C�KÑ ðSð �S˜&�[Ñ!ð	Sð
 
óSðj ð�&ð  ð °6ò ó ðð2 à—‘×&Ñ&ð ð —L‘Lð ð !ð	 ð
 
ô r$   rU   )Cr‹   rš   Úloggingrœ   rÙ   Úcollections.abcr   Útypingr   r   r'   Útorch.distributedÚdistributedr–   Útorch.distributed.tensor._apiru   Ú_apir8   Ú torch.distributed.tensor._randomÚ_randomr…   Útorch.distributed.device_meshr   Ú&torch.distributed.tensor._dtensor_specr   r   Ú#torch.distributed.tensor._op_schemar	   r
   r   r   r   r   Ú&torch.distributed.tensor._redistributer   Ú'torch.distributed.tensor._sharding_propr   Ú!torch.distributed.tensor._tp_convr   r   Útorch.distributed.tensor._utilsr   Ú(torch.distributed.tensor.placement_typesr   r   r   Útorch.utilsr   r<   ÚImportErrorr   ÚopsrX   Ú	getLoggerrÜ   r{   rà   rá   rB   r?   râ   r‘   r#   Úboolr,   rS   rU   rr   r$   r"   ú<module>rú      ss  ðã Û Û Û Û Ý $ß !ã Ý  ß /Ó /ß 1Ó 1Ý 4ß J÷õ õ CÝ LÝ F÷õ Dß RÑ Rð.Ý1ð ‡y�y‡~�~€Ø	ˆ×	Ñ	˜8Ó	$€ð3Ø�Z‰Z×"Ñ"ð3à
�˜�Ñ
ð3ð ��f�Ñð3ð ó	3ð "Ø�Z‰Z×"Ñ"ð"à
�˜�Ñ
ð"ð ��f�Ñð"ð 
ó	"ð&#Ø�Z‰Z×"Ñ"ð&#à
�˜�Ñ
ð&#ð ��f�Ñð&#ð 
ó	&#÷Rj ò j øðU ò .ß-ð.ús   ÂE ÅEÅE