+
    –°³jƒJ  ã                   óø   € ^ RI t ^ RIt^ RIHtHt ^ RIHt ^ RIt^ RIH	t	H
t
 ^ RIHt ^RIHt ]P                  ! ]4      tR R ltR	 R
 ltR R ltR R ltRR R lltR R ltRR R lltRR R lltR tR# )é    N)ÚIteratorÚSequence)ÚAny)ÚGradientEdgeÚNode)Ú	Parameter)Úmap_debug_infoc                óR   € V ^8„  d   QhR\         P                  R\        R,          /# )é   ÚtÚreturnN)ÚtorchÚTensorr   )Úformats   "Úg/home/luca/screen-checking/.venv/lib/python3.14/site-packages/torch/distributed/pipelining/_backward.pyÚ__annotate__r      s"   € ÷ ñ ¤§¡ð ´¸µñ ó    c                óæ   € V P                   '       dU   V P                  fG   V P                  V 4      pVP                  pVe   VP                  ^ ,          ^ ,          # \	        R4      hV P                  # )z¡
Get the grad function or grad accumulator for a tensor.

Accumulate grad nodes are lazily created, so we need to a
dummy view in order to trigger its creation.
zRAttempted to get grad_fn, but got None.Is this being created in a no-grad context?)Úrequires_gradÚgrad_fnÚview_asÚnext_functionsÚRuntimeError)r   Úviewed_tr   s   &  r   Ú_get_grad_fn_or_grad_accr      sh   € ð 	‡‡€˜1Ÿ9™9Ò,à—9‘9˜Q“<ˆØ×"Ñ"ˆØÒØ×)Ñ)¨!Õ,¨QÕ/Ð/äð>óð ð
 �y‰yÐr   c          	      ó¶   € V ^8„  d   QhR\         \        ,          R\        \        ,          R\        \        \        ,          \        \        ,          3,          /# )r   ÚrootsÚtarget_nodesr   )Úlistr   ÚsetÚtuple)r   s   "r   r   r   (   s>   € ÷ )ñ )Ü”�:ð)Ü%(¬¥Yð)ä
Œ3Œt�9”cœ$•iÐÕ ñ)r   c                ó°  € \        4       p\        4       p\        P                  ! 4       pV  F3  pVf   K	  Wc9  g   K  VP                  V4       VP	                  V4       K5  	  V'       dk   VP                  4       pW&,          pV FJ  pWƒ9   g   Vf   K  W�9   d   VP                  V4       K(  VP                  V4       VP	                  V4       KL  	  Kr  W43# )zì
This function returns the reverse closure of the given roots,
i.e. the set of nodes that can be reached from the roots by following the
reverse edges of the graph. The target_nodes are the nodes that we want to
include in the closure.
)r    ÚcollectionsÚdequeÚaddÚappendÚpopleft)	r   r   Úreverse_edges_dictÚclosureÚvisited_target_nodesÚqÚnodeÚreverse_edgesÚfns	   &&&      r   Úreverse_closurer/   (   s³   € ô ›€GÜ›5ÐÜ!,×!2Ò!2Ó!4€AÛˆØÔ Ö 3Ø�K‰K˜ÔØ�H‰H�TŽNñ ÷ Ø�y‰y‹{ˆØ*Õ0ˆÛˆBØŒ} ¢
ÙØÔ!Ø$×(Ñ(¨Ô,ÙØ�K‰K˜ŒOØ�H‰H�RŽLó  ð Ð(Ð(r   c                ó~   € V ^8„  d   QhR\         \        ,          R\        \        \         \        ,          3,          /# )r   r   r   )r   r   Údict)r   s   "r   r   r   G   s,   € ÷ ñ ¤4¬¥:ð ´$´t¼TÄ$½ZÐ7GÕ2Hñ r   c                 óÐ  € \         P                  ! 4       p\        4       p\         P                  ! \        4      pV  F3  pVf   K	  WB9  g   K  VP                  V4       VP                  V4       K5  	  V'       dl   VP                  4       pVP                   FI  w  rVVf   K  \        W5,          4      ^ 8X  d   VP                  V4       W5,          P                  V4       KK  	  Ks  V# ©N)
r#   r$   r    Údefaultdictr   r&   r%   r'   r   Úlen)r   r+   Ú	root_seenr(   r,   r.   Ú_s   &      r   Úconstruct_reverse_graphr8   G   s°   € Ü!,×!2Ò!2Ó!4€AÜ›5€IÜ1<×1HÒ1HÌÓ1NÐÛˆØÔ Ö 5Ø�H‰H�TŒNØ�M‰M˜$Öñ ÷ Ø�y‰y‹{ˆØ×(Ô(‰EˆBØŒ~ÜÐ)Õ-Ó.°!Ô3Ø—H‘H˜R”LØ"Õ&×-Ñ-¨dÖ3ó	 )ð
 Ðr   c          	      ó    € V ^8„  d   QhR\         \        ,          R\         \        ,          R\         \        \        \        3,          ,          /# )r   ÚinputsÚparamsr   )r   r   r1   Ústrr   )r   s   "r   r   r   Y   s9   € ÷ 3ñ 3Ü”�Jð3Ü $¤T¥
ð3ä	Œ$Œs”Cˆx�.Õñ3r   c                ó^  € \        V \        4       V4      w  r4\        4       pV Fƒ  p\        V.W24      w  rxRV0RV/p	V Fd  p
VP                  V
4      pVeI   VR,          P	                  V	R,          4      VR&   VR,          P	                  V	R,          4      VR&   Tp	K`  W•V
&   Kf  	  K…  	  \        4       p\        4       p. pVP                  4        FX  p	\        V	4      V9  g   K  VP                  \        V	4      4       VP                  V	4       VP	                  V	R,          4      pKZ  	  V# )a»  
Given a list of inputs and a list of parameters, return a list of parameter
groups, where each group contains the parameters and the intermediates that
are connected to the parameters.

The returned list of parameter groups is a list of dictionaries, where each
dictionary contains the following keys:
- "params": a set of parameters
- "intermediates": a set of intermediates

The returned list of parameter groups is a list of dictionaries,
r;   Úintermediates)	r/   r    r1   ÚgetÚunionÚvaluesÚidr%   r&   )r:   r;   r(   Úinputs_closurer7   Úparam_groupsÚparamr)   ÚintersectedÚparam_groupÚ
input_nodeÚexistingÚunion_paramsÚseen_idsÚunique_param_groupss   &&&            r   Úget_param_groupsrM   Y   s4  € ô" (¨´³Ð7IÓJÑ€NÜ/3«v€LÛˆÜ.ØˆG�^ó 
Ñˆð �u�gØ˜[ð'
ˆó &ˆJØ#×'Ñ'¨
Ó3ˆHØÒ#Ø%-¨hÕ%7×%=Ñ%=¸kÈ(Õ>SÓ%T�˜Ñ"Ø,4°_Õ,E×,KÑ,KØ Õ0ó-�˜Ñ)ð '’à+6˜ZÓ(ó &ñ ô( "›e€LÜ›€HØÐØ#×*Ñ*Ö,ˆÜˆk‹? (Ö*Ø�L‰Lœ˜K›Ô)Ø×&Ñ& {Ô3Ø'×-Ñ-¨k¸(Õ.CÓDŠLñ	 -ð Ðr   c                ó"  € V ^8„  d   QhR\         \        P                  ,          R\         \        ,          R\         \        P                  R,          ,          R,          R\        R\        R\
        \        P                  R,          R3,          /# )	r   Úoutputsr:   Úgrad_outputsNÚretain_graphÚallow_unusedr   .)r   r   r   r   Úboolr!   )r   s   "r   r   r   �   sw   € ÷ ñ Ü”e—l‘lÕ#ðä”S�Mðô œ5Ÿ<™<¨$Õ.Õ/°$Õ6ðô ð	ô
 ðô Œ5�<‰<˜$Õ Ð#Õ$ñr   c                ó  € . p. p\        V4       F]  w  rx\        V\        P                  4      '       g   K'  VP                  '       g   K;  VP                  V4       VP                  V4       K_  	  V'       g-   \        ;QJ d    . R V 4       F  NK  	  5# ! R V 4       4      # \        P                  P                  V VVVVR7      p	R.\        V4      ,          p
\        WYRR7       F	  w  r¼WÊV&   K  	  \        V
4      # )z@Compute input gradients, returning ``None`` for non-grad inputs.c              3   ó&   "  € T F  pR x € K	  	  R # 5ir3   © ©Ú.0r7   s   & r   Ú	<genexpr>Ú,_autograd_grad_for_inputs.<locals>.<genexpr>¡   s   é € Ð*¡6˜a•T£6ùó   ‚)rO   r:   rP   rQ   rR   NT©Ústrict)Ú	enumerateÚ
isinstancer   r   r   r&   r!   ÚautogradÚgradr5   Úzip)rO   r:   rP   rQ   rR   Úgrad_indicesÚinputs_requiring_gradÚiÚinpÚgradsÚresultÚidxÚgs   &&&&&        r   Ú_autograd_grad_for_inputsrk   �   sÝ   € ð !€LØ02ÐÜ˜FÖ#‰ˆÜ�cœ5Ÿ<™<×(Ô(¨S×->×->Ò->Ø×Ñ Ô"Ø!×(Ñ(¨Ö-ñ $÷
 !ßŒuÑ*¡6Ó*�uÐ*ˆuÑ*¡6Ó*Ó*Ð*ä�N‰N×ÑØØ$Ø!Ø!Ø!ð  ó €Eð *.¨´°V³Õ(<€FÜ�l°$×7‰ˆØˆs‹ñ 8ä�‹=Ðr   c                óx  € V ^8„  d   QhR\         \        P                  ,          R\         \        P                  ,          R,          R\         \        ,          R\        \
        ,          R\        \        \        P                  R,          R3,          \         \        \        \        3,          ,          3,          /# )r   Ústage_outputs_or_lossÚoutput_gradsNÚinput_valuesÚweightsr   .)	r   r   r   r   r   r   r!   r1   r<   )r   s   "r   r   r   ±   s‹   € ÷ eñ eÜ¤§¡Õ-ðeä”u—|‘|Õ$ tÕ+ðeô ”s•)ðeô ”iÕ ð	eô
 Œ5”—‘ Õ$ cÐ)Õ*¬D´´c¼3°hµÕ,@Ð@ÕAñer   c           	     óJ  € . p. p\        V 4       Fi  w  rgVP                  '       g   VP                  f   K'  VP                  V4       TP                  Vf   \        P
                  ! V4      MW,          4       Kk  	  \        \        R\        \        V4      4      4      p\        \        RR V 4       4      4      p	\        \        R\        \        V4      4      4      p
\        V4      p\        WšV4      p. p V FY  p\        VR,          4      pWþR&   \        V4       F1  w  ppR pVP                  V! Wæ4      4      pVP                  V4       K3  	  K[  	  V'       d   \        VVVRRR7      pM,\        ;QJ d    . R V 4       F  NK  	  5M! R V 4       4      p\        VV4       F^  w  pp\!        V\        P"                  4      '       g   K(  Vf   K.  VP$                  f
   VVn        KE  V;P$                  V,          un        K`  	  V  F  pVP'                  4        K  	  VV3V F  pVP)                  4        K  	  #   \*         d9   pR\-        T 4       R	\-        T4       R
\-        T4       R2p\/        T4      ThRp?ii ; i  T F  pTP)                  4        K  	  i ; i)aJ  
Compute the gradients for only the stage inputs with
respect to the stage outputs (if non-last stage) or loss (if last stage)

After computing input gradients, we save the intermediate nodes in `param_groups`
for later use in stage_backward_weight. We don't need to save any other intermediate nodes
that aren't needed for dW because when we do dW calculation, we start from saved intermediates.
Detaching the stage_outputs_or_loss at the end of this function is important as
it frees up the memory that the autograd graph is anticipating to be used later (but doesn't actually need).
Nc              3   ó|   "  € T F2  p\        V\        P                  4      '       g   K%  \        V4      x € K4  	  R # 5ir3   )r_   r   r   r   )rX   rf   s   & r   rY   Ú'stage_backward_input.<locals>.<genexpr>Ñ   s0   é € ð á'�CÜ˜c¤5§<¡<×0ô .Ô(¨×-Ð-Û'ùs   ‚"<©<r>   c                 ó   a a€ VV 3R  lpV# )c                 ó‚   <€ SP                  R R4      f   R.\        SR,          4      ,          SR &   V SR ,          S&   R# )rg   Nr>   )r?   r5   )Úgrad_inputsre   rG   s   &€€r   ÚhookÚ4stage_backward_input.<locals>.get_hook.<locals>.hooké   sE   ø€ Ø&Ÿ?™?¨7°DÓ9ÒAØ48°6¼CØ +¨OÕ <ó=õ 4˜K¨Ñ0ð 3>˜ GÕ,¨QÓ/r   rV   )rG   re   rw   s   ff r   Úget_hookÚ&stage_backward_input.<locals>.get_hookè   s   ù€ ö>ð  �Kr   T)rQ   rR   c              3   ó&   "  € T F  pR x € K	  	  R # 5ir3   rV   rW   s   & r   rY   rs   þ   s   é € Ð7©, Q�D«,ùr[   zC
        Failed to run stage backward input:
        Stage output: ú
        Output gradient: ú
        Input: ú	
        )r^   r   r   r&   r   Ú	ones_liker   ÚfilterÚmapr   r8   rM   Úregister_prehookrk   r!   rb   r_   r   ra   Údetach_ÚremoveÚ	Exceptionr	   r   )rm   rn   ro   rp   Úvalid_outputsÚvalid_output_gradsre   Ústage_outputÚstage_output_grad_fnsÚstage_input_grad_fnsÚweight_grad_fnsr(   rD   ÚhandlesrG   r>   Úintermediatery   ÚhandleÚdinputsrf   Údinputr   ÚeÚexc_msgs   &&&&                     r   Ústage_backward_inputr“   ±   s„  € ð  )+€MØ46ÐÜ$Ð%:Ö;‰ˆØ×)×)Ð)¨l×.BÑ.BÒ.JÙØ×Ñ˜\Ô*Ø×!Ñ!Ø-9Ò-AŒE�OŠO˜LÔ)À|Åö	
ñ	 <ô )-Üˆt”SÔ1°=ÓAÓBó)Ðô (,ÜØñá'óó	
ó	(Ðô #'Üˆt”SÔ1°7Ó;Ó<ó#€Oô 1Ð1FÓGÐÜ#ØÐ/Aó€Lð €Gð4Û'ˆKÜ  ¨_Õ!=Ó>ˆMØ+8˜Ñ(Ü#,¨]Ö#;‘��<ò ð &×6Ñ6±xÀÓ7OÓP�Ø—‘˜vÖ&ó $<ñ (÷$ Ü/ØØØ"Ø!Ø!ô‰G÷ ”eÑ7©,Ó7—e‘eÑ7©,Ó7Ó7ˆGä˜|¨WÖ5‰KˆC�Ü˜#œuŸ|™|×,Ô,°Ô1CØ—8‘8Ò#Ø%�C–Hà—H’H Õ&—Hñ 6ó 'ˆAØ�I‰IŽKñ 'ð ˜Ð$ó ˆFØ�M‰MŽOò øô ô +ðä%Ð&;Ó<Ð=ð >Ü(¨Ó6Ð7ð 8Ü˜|Ó,Ð-ð .	ð	ˆô ˜7Ó#¨Ð*ûð+ûó ˆFØ�M‰MŽOò ús?   Ã9A&I Å I Å<AI ÇI ÇAI ÉJÉ3I?É?JÊJ ÊJ"c                óÆ   € V ^8„  d   QhR\         \        ,          R\        \        \        \
        3,          ,          R\        \        P                  R,          R3,          /# )r   rp   rD   r   N.)	r   r   r   r1   r<   r   r!   r   r   )r   s   "r   r   r     sI   € ÷ >ñ >Ü”iÕ ð>Ü04´T¼#¼s¸(µ^Õ0Dð>ä
Œ5�<‰<˜$Õ Ð#Õ$ñ>r   c           	      óD  € / p. p\        V 4       F0  w  rV\        V4      pWe3W7&   VP                  VP                  4       K2  	  V EF®  p. p	. p
\	        VR ,          VR,          4       FJ  w  r¼\        V4       F6  w  rÞVf   K  V	P                  \        WÍ4      4       V
P                  V4       K8  	  KL  	  . p \        VR,          4      ^8”  dJ   \	        VR ,          VR,          RR7       F)  w  r¼VP                  VP                  V3R l4      4       K+  	  VR V	'       d¸   \        ;QJ d    . R VR,           4       F  NK  	  5M! R VR,           4       4      p\        P                  P                  V	VV
VR7      pVR  \	        VR,          V4       F@  w  ppW7,          w  reVP                  f
   VVn        K'  V;P                  V,          un        KB  	  V F  pVP                  4        K  	  EK±  	  \        V4      #   T F  pTP                  4        K  	  i ; i)rg   r>   Tr\   c                 ó   € V# r3   rV   )rP   Úsgs   &&r   Ú<lambda>Ú'stage_backward_weight.<locals>.<lambda><  s   € Ár   c              3   ó:   "  € T F  p\        V^ 4      x € K  	  R# 5i)r   N)r   )rX   Úws   & r   rY   Ú(stage_backward_weight.<locals>.<genexpr>D  s   é € Ð%XÑBW¸Q¤l°1°a×&8Ð&8ÓBWùs   ‚r;   )rP   rQ   )r^   r   r&   ra   rb   r   r5   r‚   r!   r   r`   r„   )rp   rD   rQ   Úgrad_acc_to_weightÚweight_gradsÚindexÚweightÚgrad_accrG   Úvalid_edgesÚvalid_grad_outputsÚgrads_tupler�   re   ra   rŒ   Úweights_edgesÚdweightsÚdwrŽ   s   &&&                 r   Ústage_backward_weightr¨     s  € ð ÐØ.0€LÜ" 7Ö+‰ˆÜ+¨FÓ3ˆØ'- }ÐÑ$Ø×Ñ˜FŸK™KÖ(ñ ,ô
 $ˆØˆØ13Ðä),Ø˜Õ  +¨oÕ">ö*
Ñ%ˆKô % [Ö1‘�ØÔ#Ø×&Ñ&¤|°LÓ'DÔEà&×-Ñ-¨dÖ3ó	 2ñ*
ð ˆð#	 Ü�;˜Õ/Ó0°1Ô4Ü14Ø Õ(Ø Õ0Ø÷2Ñ-�Kð
 —N‘NØ$×5Ñ5Ø4?ÓCóöñ2ð ˜OÐ,çß %¤Ñ%XÀ+ÈhÖBWÓ%X§¡Ñ%XÀ+ÈhÖBWÓ%XÓ X�Ü Ÿ>™>×.Ñ.ØØ!Ø!3Ø!-ð	 /ó �ð   Ð(ä$'¨°HÕ(=¸xÖ$H‘L�H˜bØ$6Õ$@‘M�FØ—{‘{Ò*Ø&(˜žàŸš rÕ)Ÿñ %Ió "�Ø—‘–ô "ñc $ôf �ÓÐøó "�Ø—‘–ò "ús   Â9A*HÄ$
HÄ/B,HÈHc                ó�   € V ^8„  d   QhR\         \        ,          R,          R\        \        P                  R,          R3,          /# )r   Úoutputs_with_grads_idxsNr   .)r   Úintr!   r   r   )r   s   "r   r   r   Z  s@   € ÷ Cñ Cô "¤#�Y¨Õ-ð	Cô
 Œ5�<‰<˜$Õ Ð#Õ$ñCr   c           	     óN  a
a€ Ve/   V Uu. uF  q@V,          NK  	  p pV Uu. uF  qAV,          NK  	  pp . o. o
V
V3R lpV! WV4       \         P                  P                  SS
R7       . pV FX  p\        V\         P                  4      '       d%   VP                  VP                  4       RVn        KG  VP                  R4       KZ  	   \        T4      # u upi u upi   \         d9   pR\        T 4       R\        T4       R\        T4       R2p	\        T	4      ThRp?ii ; i)aw  
This is a helper function to:
1. compute the gradients for the stage inputs, and
2. accumulate gradients for the stage module's parameters.

Given the input value(s) and the corresponding gradient for the output
value(s), compute and accumulate gradients for all parameter values (leaves
in the autograd trace) as well as return a list of the gradients for the
input values
Nc           	      óŽ  <€ \        V \        P                  4      '       d‰   V P                  '       g   V P                  f   R # \        V\        P                  \        R 4      34      '       g   \        R\        V4       24      hSP                  V 4       SP                  V4       R # \        V \        \        34      '       d¢   Vf   R # \        V\        \        34      '       g$   \        R\        V 4       R\        V4       24      h\        V 4      \        V4      8X  g$   \        R\        V 4       R\        V4       24      h\        W4       F  w  r4V! VVV4       K  	  R # \        V \        4      '       dÉ   Vf   R # \        V\        4      '       g   \        R\        V4       24      h\        V P                  4       4      \        VP                  4       4      8X  g@   \        R\        V P                  4       4       R\        VP                  4       4       24      hV  F  pV! W,          W,          V4       K  	  R # R # )	Nz)Expected Tensor or None gradient but got z!grad_value expected to have type z	 but got z/Expected len(output_val) == len(grad_val), got z != zExpected dict, got zExpected keys z, got )r_   r   r   r   r   ÚtypeÚAssertionErrorr&   r!   r   r5   rb   r1   r    Úkeys)Ú
output_valÚgrad_valÚextract_tensors_with_gradsÚovÚgvÚkÚoutput_grad_tensorsÚstage_output_tensorss   &&&   €€r   r³   Ú2stage_backward.<locals>.extract_tensors_with_gradsu  sò  ø€ ô ˜*¤e§l¡l×3Ò3Ø!×/×/Ð/°J×4FÑ4FÒ4NÙÜ! (¬U¯\©\¼4À»:Ð,F×GÒGÜ(ØCÄDÈÃNÐCSÐTóð ð %×+Ñ+¨JÔ7Ø#×*Ñ*¨8Ö4Ü˜J¬´¨×6Ò6ØÒ#ÙÜ! (¬U´D¨M×:Ò:Ü(Ø;¼DÀÓ<LÐ;MÈYÔW[Ð\dÓWeÐVfÐgóð ô ˜:“¬#¨h«-Ô7Ü(ØIÌ#ÈjË/ÐIZÐZ^Ô_bÐckÓ_lÐ^mÐnóð ô " *Ö7‘F�BÙ.ØØØ2öó 8ô ˜J¬×-Ò-ØÒ#ÙÜ! (¬D×1Ò1Ü(Ð+>¼tÀH»~Ð>NÐ)OÓPÐPÜ˜:Ÿ?™?Ó,Ó-´°X·]±]³_Ó1EÔEÜ(Ø(¬¨Z¯_©_Ó->Ó)?Ð(@ÀÄsÈ8Ï=É=Ë?ÓG[ÐF\Ð]óð ó $�AÙ.Ø"� x¥{Ð4Nöó $ñ r   )Úgrad_tensorsz=
        Failed to run stage backward:
        Stage output: r|   r}   r~   )r   r`   Úbackwardr_   r   r&   ra   r…   r	   r   r!   )rˆ   rn   ro   rª   re   r³   rv   Úvalr‘   r’   r·   r¸   s   &&&&      @@r   Ústage_backwardr½   Z  sM  ù€ ð  Ò*á1HÓIÑ1H¨A QŸ˜Ñ1HˆÐIÙ1HÓIÑ1H¨A QŸ˜Ñ1HˆÐIðl+ð 46ÐØ9;Ðö/	ñr 	#ØÐ(Bô	
ô 	�‰×ÑØ Ø,ð 	 ô 	
ð 24ˆÛˆCÜ˜#œuŸ|™|×,Ò,Ø×"Ñ" 3§8¡8Ô,ð  �–à×"Ñ" 4Ö(ñ  ð 		ô( �ÓÐùòc JùÚIøôN ô +ðä% lÓ3Ð4ð 5Ü(¨Ó6Ð7ð 8Ü˜|Ó,Ð-ð .	ð	ˆô ˜7Ó#¨Ð*ûð+ús"   ‹C¢C¶BC! Ã!D$Ã,3DÄD$c                óF   € V f   V# Vf   V # \         P                  ! W4      # )zQ
Coalesce two values, even if one of them is null, returning the non-null
value.
)r   r%   )ÚlhsÚrhss   &&r   Ú_null_coalesce_accumulaterÁ   â  s'   € ð
 ‚{Øˆ
Ø	ŠØˆ
ä�yŠy˜Ó"Ð"r   )NFF)Fr3   )r#   ÚloggingÚcollections.abcr   r   Útypingr   r   Útorch.autograd.graphr   r   Útorch.nnr   Ú_debugr	   Ú	getLoggerÚ__name__Úloggerr   r/   r8   rM   rk   r“   r¨   r½   rÁ   rV   r   r   Ú<module>rË      se   ðó Û ß .Ý ã ß 3Ý å "ð 
×	Ò	˜8Ó	$€õõ,)õ>õ$3÷lõDe÷P>÷BCôP
#r   