
    3j                       S 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
Jr  SSKJr  SSKJrJr  SSKrSSKrSSKJr  SSKJr  SSKJr  S	S
KJrJrJrJr  S	SKJrJ r J!r!J"r"  S	SK#J$r$  S	SK%J&r&J'r'J(r(  S	SK)J*r*J+r+J,r,J-r-J.r.  S	SKJ/r/J0r0J1r1J2r2  S	SK3J4r4J5r5J6r6J7r7J8r8J9r9J:r:  S	SK;J<r<  \(       a  SSK=J>r>  SSK?J@r@  SSKAJBrB  \R                  R                  \ES5      rFS\G\\4   S\G\\4   S\HSS4S jrIS\J\   S\J\   SS4S jrK " S S5      rL\R                  S S!S\
S"   4S# j5       rN\R                  S S!S\
S"   4S$ j5       rO\R                  S S!S\
S"   4S% j5       rPg)&a  
Side effect tracking and management for TorchDynamo's compilation system.

This module provides infrastructure for tracking and managing side effects that occur
during symbolic execution, including:

- Tracking mutations to objects, attributes, and variables
- Managing context changes (cell variables, global namespace modifications)
- Handling aliasing and object identity preservation
- Managing stack frame state and local variable changes
- Tracking function calls with side effects

Key classes:
- SideEffects: Main container for tracking all side effects during execution
- MutableSideEffects: Specialization for mutable object tracking
- AttributeMutation/ValueMutation: Track specific types of mutations
- Various specialized side effect classes for different scenarios

The side effect system ensures that mutations performed during symbolic execution
are properly replayed during runtime, maintaining the correctness of compiled code
while enabling optimizations where safe.
    N)	GeneratorMutableMapping)CellType)AnyTYPE_CHECKINGAutogradFunctionContextVariable)
OrderedSet)is_structseq_class   )configgraph_break_hintsutils	variables)bytecode_from_templatecreate_call_functioncreate_call_methodcreate_instruction)	PyCodegen)collapse_resume_framesget_stack_above_dynamounimplemented)
AttrSourceGlobalSourceLocalCellSourceSourceTempLocalSource)is_frozen_dataclassis_namedtuple_clsnn_module_new
object_new)AttributeMutationAttributeMutationExistingAttributeMutationNewis_side_effect_safeValueMutationExistingValueMutationNewVariableTracker)FrozenDataClassVariable)OutputGraph)InstructionTranslatorBase)ListVariableside_effects	dict_fromdict_to	mro_indexreturnc                     [        U5      R                  U   nUR                  U5        U R                  5        H  u  pEUR	                  XU5        M     g N)type__mro__clearitems__setitem__)r.   r/   r0   
dict_classkvs         T/home/wildlama/miniconda3/lib/python3.13/site-packages/torch/_dynamo/side_effects.py_manual_dict_setitemr=   J   sI     g&&y1JW!w1- "    	list_fromlist_toc                 X    [         R                  U5        [         R                  X5        g r3   )listr6   extend)r?   r@   s     r<   _manual_list_updaterD   W   s    JJwKK#r>   c                   x  ^  \ rS rSr% Sr\\\4   \S'   \\\\	\4   4   \S'   \
\   \S'   \\\
\R                     4   \S'         ScSS	S\\\4   S-  S\\\\	\4   4   S-  S\\\
\R                     4   S-  S\
\   S-  S
\
\\\
\   4      S-  S\\\S\S\	4   4   S-  SS4U 4S jjjrS\SS4S jrS\SS4S jrS\SS4S jrS\S\4S jrSS S\	S-  4S jrSdS jrS\S\4S jrS\S\4S jrS\4S jrS\4S jrS\4S jrS\SS4S jrS\S\4S  jrS\S!\	S"\SS4S# jr   SeS\S!\	S$\S%\S\4
S& jjr!S'\S"\SS4S( jr"S'\S\4S) jr#S*\S!\	S\4S+ jr$S*\S!\	S"\SS4S, jr%\&S-\'S\4S. j5       r(S\S\4S/ jr)S\S\4S0 jr*S\S!\	S\4S1 jr+S\S\4S2 jr,\-4S\S3\S4\'S\4S5 jjr.\.r/S\S3\S\4S6 jr0S7\1S-  S8\S9\S:\\	\4   S\4
S; jr2S8\'S\'4S< jr3S=\S>\S?\
\   S\4S@ jr4S=\S>\S?\
\   S\4SA jr5S\4SB jr6SC\1S-  SD\7SE\S\4SF jr8SC\1S\S\4SG jr9SH\SI\
\   SS4SJ jr:    SfSK jr;SgSL jr<S\SS4SM jr=S\4SN jr>S\
\   4SO jr?SP\@SS4SQ jrASRSSS\STSS!\	SS4
SU jrBSV\SS4SW jrCSP\@SS4SX jrDShSY jrES\S\	4SZ jrFS[\
\	   SS4S\ jrG SiSP\@S]\SS4S^ jjrHSjS_ jrIS\4S` jrJSjSa jrKSbrLU =rM$ )kSideEffects\   a0  
Maintain records of mutations and provide methods to apply them during code generation.

Handles tracking and applying side effects during PyTorch Dynamo compilation,
maintaining Python semantics by managing mutations, attribute modifications,
and other side effects that occur during program execution.

Key responsibilities:
- Tracks mutations to Python objects, lists, and dictionaries that need to be
applied after an FX graph is run.
- Manages attribute modifications and deletions
- Handles tensor hooks and backward pass state
- Tracks cell variable mutations and global variable changes
- Ensures correct ordering and application of side effects after graph execution

This ensures that optimized code behaves identically to the original Python code with
respect to object mutations and other side effects.
id_to_variablestore_attr_mutations	keepalivemutation_user_stacksNoutput_graphr*   save_for_backwardtensor_hookszvariables.TensorVariablez!variables.RemovableHandleVariabler1   c                 p  > [         TU ]  5         [        R                  " U5      U l        U=(       d    0 U l        U=(       d    0 U l        U=(       d    0 U l        U=(       d    / U l        U=(       d    / U l	        U=(       d    0 U l
        SU l        S U l        [        5       U l        [        5       U l        g )NF)super__init__weakrefrefoutput_graph_weakrefrH   rI   rK   rJ   rM   rN   _has_existing_dict_mutationca_final_callbacks_varset"ignore_mutation_on_these_variablesr
   mutated_sources)	selfrL   rH   rI   rK   rJ   rM   rN   	__class__s	           r<   rQ   SideEffects.__init__v   s    0 	$+KK$=!,2$8$>B!$8$>B!"b!2!8b(.B ,1( <@# IL/ 4><r>   varc                 :    U R                   R                  U5        g)zMutations to this variable will be executed but not not tracked,
typically used for temporary mutations that are later restored.N)rX   addrZ   r]   s     r<   ignore_mutations_onSideEffects.ignore_mutations_on   s     	//33C8r>   c                 Z    XR                   ;   a  U R                   R                  U5        gg)zQRemove a variable from the skip mutation set, restoring normal mutation tracking.N)rX   remover`   s     r<   stop_ignoring_mutations_on&SideEffects.stop_ignoring_mutations_on   s'    99933::3? :r>   keyc                     [         R                  S:X  a  gXR                  ;  a  / U R                  U'   U R                  U   R                  [        R
                  R                  R                  5       5        g)z?Capture the current user stack from the instruction translator.silentN)r   side_effect_replay_policyrK   appendtorch_guardsTracingContextextract_stack)rZ   rg   s     r<   _capture_user_stackSideEffects._capture_user_stack   s^    ++x7///-/D%%c*!!#&--MM((668	
r>   otherc                 "   [        U[        5      (       d   eU R                  UR                  :H  =(       aY    U R                  UR                  :H  =(       a9    U R                  UR                  :H  =(       a    U R
                  UR
                  :H  $ r3   )
isinstancerF   rH   rI   rM   rN   )rZ   rr   s     r<   __eq__SideEffects.__eq__   s}    %---- 5#7#77 8))U-G-GG8&&%*A*AA8 !!U%7%77		
r>   c                    U R                   UR                   :w  aB  U R                   R                  5       nUR                   R                  5       nX#:w  a  SU SU 3$ gU R                  UR                  :w  aB  U R                  R                  5       nUR                  R                  5       nXE:w  a  SU SU 3$ gU R                  UR                  :w  a  gU R                  UR                  :w  a  gg )Nzid_to_variable keys: z != zid_to_variable: unknown diffzstore_attr_mutations keys: z"store_attr_mutations: unknown diffrM   rN   )rH   keysrI   rM   rN   )rZ   rr   sk_itvok_itvsk_samok_sams         r<   diffSideEffects.diff   s    %"6"66((--/F))..0F.vhd6(CC 2&&%*D*DD..335F//446F4VHDII7##u'>'>>&%"4"44!r>   c                 X   U R                  5       nUc   eU R                  U[        U R                  5      U R                  R                  5        VVs0 s H  u  p#U[        U5      _M     snnU R                  [        U R                  5      U R                  U R                  S9$ s  snnf )zCreate a shallow copy)rL   rH   rI   rK   rJ   rM   rN   )rT   r[   dictrH   rI   r7   rK   rB   rJ   rM   rN   )rZ   rS   r:   r;   s       r<   cloneSideEffects.clone   s    '')~~ 3 34'+'@'@'F'F'H"'Htq47
'H" "&!:!:4>>*"44**  

 
	
"s   B&itemc                 2    [        U5      U R                  ;   $ r3   )idrH   rZ   r   s     r<   __contains__SideEffects.__contains__   s    $x4....r>   c                 2    U R                   [        U5         $ r3   )rH   r   r   s     r<   __getitem__SideEffects.__getitem__   s    ""2d8,,r>   c                     U R                  5       n[        U=(       a*    UR                  R                  R                  R
                  5      $ r3   )rT   bool
current_txoutputcurrent_tracer,unsafe_allow_externally_visible_side_effectsrZ   rL   s     r<   9should_allow_externally_visible_side_effects_in_subtracerESideEffects.should_allow_externally_visible_side_effects_in_subtracer   sA    002 k''..==jj
 	
r>   c                     U R                  5       n[        U=(       a*    UR                  R                  R                  R
                  5      $ r3   )rT   r   r   r   r   allow_side_effects_in_hopr   s     r<    should_allow_side_effects_in_hop,SideEffects.should_allow_side_effects_in_hop   sA    002 X''..==WW
 	
r>   c                     U R                  5       n[        U=(       a*    UR                  R                  R                  R
                  5      $ r3   )rT   r   r   r   r   is_reconstructing_generatorr   s     r<   r   'SideEffects.is_reconstructing_generator  sA    002 Z''..==YY
 	
r>   c                 <   UR                   b  [        UR                   5      (       dt  U R                  5       nU(       a\  UR                  R                  R
                  nUR                  c.  [        R                  R                  R                  5       Ul        ggggg)zFRecord the first externally-visible side effect on the current tracer.N)mutation_typer%   rT   r   r   r   side_effect_stackrl   rm   rn   ro   )rZ   r   rL   tracers       r<   _maybe_record_side_effect%SideEffects._maybe_record_side_effect	  s    )2E3
 3
  446L%0077FF++344BBD , 4 	3
)r>   c                    SSK Jn  [        X5      (       a  gU R                  5       (       a  U R	                  U5        gU R                  5       (       a  U R	                  U5        gU R                  5       (       a   [        SSU 3SS/[        R                  QS9  UR                  c   e[        UR                  5      (       d  [        S	S
U 3SS/S9  g)Nr   r   Tz'Generator reconstruction with mutationszmutating object: zCannot reconstruct a generator with variable mutations. Dynamo needs to fully exhaust the generator, which may cause unintended variable modifications.z$Remove mutations from the generator.gb_typecontextexplanationhintszHOP: Unsafe side effectzAttempted to mutate zHMutating a variable from outside the scope of this HOP is not supported.aw  If the HOP is activation checkpointing (torch.utils.checkpoint.checkpoint), this points to a side effect in forward method. Eager activation checkpointing replays that side-effect while recomputing the forward in the backward. If you are ok with side-effect not replayed in the backward, try setting `torch._dynamo.config.skip_fwd_side_effects_in_bwd_under_checkpoint = True`F)torch._dynamo.variables.miscr	   rt   r   r   r   r   r   r   FUNDAMENTALr   r%   )rZ   r   r	   s      r<   check_allowed_side_effect%SideEffects.check_allowed_side_effect  s    P d<<IIKK**400022**40++-- A+D625 ;&22
 !!---"4#5#5661.tf5fx	
 r>   namevaluec                 @   U R                  U5      (       d   eU R                  U5        XR                  ;  a  0 U R                  U'   X0R                  U   U'   U R                  U5        [	        USS 5      nUb%  U R
                  R                  [        XB5      5        g g )Nsource)is_attribute_mutationr   rI   rp   getattrrY   r_   r   )rZ   r   r   r   item_sources        r<   
store_attrSideEffects.store_attr@  s     ))$////&&t,000.0D%%d+05!!$'-  &dHd3"  $$Z%BC #r>   
deleted_okcheckc                     U(       a  U R                  U5      (       d   eU R                  U   U   nU(       dA  [        U[        R                  5      (       a"  [        SSU SU 3S/ [        R                  QS9  U$ )Nz$Attempted to read a deleted variablezitem: z, name:  r   )r   rI   rt   r   DeletedVariabler   r   
USER_ERROR)rZ   r   r   r   r   results         r<   	load_attrSideEffects.load_attrN  s|     --d3333**406j1J1JKK> htf55)445	 r>   cellvarc                    UR                  5       (       a"  [        SSU SU 3S/ [        R                  QS9  [	        U[
        R                  5      (       d   e[	        U[
        R                  5      (       d   eU R                  USU5        g )NzWrite to immutable cellz	cellvar: z	, value: zFDynamo doesn't support writing to immutable/sourceless cell variables.r   cell_contents)	is_immutabler   r   	DIFFICULTrt   r   CellVariabler(   r   )rZ   r   r   s      r<   
store_cellSideEffects.store_cella  s    !!1#G9IeW=d4)334	 '9#9#9::::%!:!:;;;;%8r>   c                    [        U[        R                  5      (       d   eU R                  5       nU(       aS  [	        USS 5      nUbC  UR
                  R                  R                  R                  R                  [        US5      5        U R                  US5      (       a  U R                  USSS9$ UR                  (       a  UR                  $ [        S[        U5      S/ [         R"                  QS9  g )Nr   r   F)r   zRead uninitialized cellzBAttempted to read a cell variable that has not been populated yet.r   )rt   r   r   rT   r   r   r   r   traced_sourcesr_   r   has_pending_mutation_of_attrr   pre_existing_contentsr   strr   r   )rZ   r   rL   cell_sources       r<   	load_cellSideEffects.load_cellm  s    '9#9#9:::: 002!'8T:K&''..==LLPP{O< ,,WoFF>>'?%>HH((000-L\1%001		
r>   gvarc                 f    [        U[        R                  5      (       d   eU R                  X5      $ r3   )rt   r   r(   r   )rZ   r   r   s      r<   load_globalSideEffects.load_global  s*    $	 9 9::::~~d))r>   c                     [        U[        R                  5      (       d   e[        U[        R                  5      (       d   eU R                  XU5        g r3   )rt   r   r(   r   )rZ   r   r   r   s       r<   store_globalSideEffects.store_global  sD     $	 9 9::::%!:!:;;;;E*r>   clsc           
      F   [         R                  " U SS 5      [        R                  [        R                  [
        R                  [        R                  [        R                  [        R                  [        R                  [        R                  [        R                  4	;   $ )N__getattribute__)inspectgetattr_staticobjectr   r   rW   	frozensetintr   rB   tupleBaseException)r   s    r<   "cls_supports_mutation_side_effects.SideEffects.cls_supports_mutation_side_effects  sv    %%c+=tD##!!  &&    !!""**
I
 

 
	
r>   c                 6    [        UR                  [        5      $ r3   )rt   r   r"   r   s     r<   r   !SideEffects.is_attribute_mutation  s    $,,.?@@r>   c                 z    U R                  U5      =(       a$    [        U R                  R                  U5      5      $ r3   )r   r   rI   getr   s     r<   has_pending_mutation SideEffects.has_pending_mutation  s5    ))$/ 
D%%))$/5
 	
r>   c                 n    U R                  U5      =(       a    X R                  R                  US5      ;   $ )N )r   rI   r   )rZ   r   r   s      r<   r   (SideEffects.has_pending_mutation_of_attr  s6    ))
 >//33D"==	>r>   c                    UR                  5       (       a  g[        UR                  [        [        45      (       a  g[        U[
        R                  5      (       a&  XR                  ;   =(       d    UR                  U 5      $ U R                  U5      (       a  XR                  ;   $ UR                  c   eUR                  R                  $ )NFT)r   rt   r   r$   r'   r   UserDefinedObjectVariablerI   is_base_vt_modifiedr   is_modifiedr   s     r<   r   SideEffects.is_modified  s    d((+?AQ*RSSdI??@@444V8P8PQU8VV%%d++4444!!---!!---r>   variablemutation_type_clsc           
      0   [        U5      U R                  ;   a>  [        U SUR                   SU R                  [        U5         R                   S35      eU" 5       Ul        X R                  [        U5      '   U R
                  R                  U5        U$ )z7Start tracking an existing or new variable for mutationz is already tracked for mutation. This could be because you are not using VariableBuilder to construct the variable tracker. Source of new object: z'. Source of previously tracked object: .)r   rH   AssertionErrorr   r   rJ   rk   )rZ   r   r   r   s       r<   
_track_objSideEffects._track_obj  s     d8t*** * ) *2(9 :88<8K8KBtH8U8\8\7]]^	`  "3!4(0BtH%d#r>   c                 ,    U R                  UU[        S9$ )N)r   )r   r#   )rZ   r   r   s      r<   track_object_existing!SideEffects.track_object_existing  s#     7  
 	
r>   
cls_sourceuser_clsvariable_clsoptionsc                    U[         R                  R                  R                  L a<  [        R
                  " SS9   [         R                  R                  5       nS S S 5        O[        U5      nU" W4S[        U5      0UD6nX`R                  [        U5      '   U R                  R                  U5        U$ ! , (       d  f       NV= f)NT)recordr   )rl   autogradfunctionFunctionCtxwarningscatch_warningsFunctionr!   r$   rH   r   rJ   rk   )rZ   r   r   r   r   objr   s          r<   track_object_newSideEffects.track_object_new  s     u~~..:::((5nn--/ 65 X&C
.z:
 

 (0BsG$c" 65s   B77
Cc                 ,   SSK Jn  SSKJn  SSKJn  SSKJn  [        R                  n[        X5      (       a  UR                  U5      (       a  UnGO [        US5      (       a"  [        US5      (       a  U" U5      (       d  UnGO[        U[        R                  R                  5      (       a  [        R                   nGO[        U["        [$        R&                  45      (       a  [        R(                  nGO{[        U[*        [,        45      (       a  [        R.                  nGON[        U[0        5      (       aB  [3        U5      (       a!  [        R4                  R7                  U5      nGO[        R4                  nO[        U[8        5      (       a  [        R:                  nO[        U[<        5      (       a  [        R>                  nO[A        U5      (       a  [B        nO[        U[D        5      (       a  [        RF                  nOn[        U[        RH                  RJ                  5      (       a  [        RL                  nO4[        RN                  RQ                  U5      (       a  [        RN                  n[        U[        R                  5      (       d   eU$ )	Nr   )TorchFunctionModer   )GenericContextWrappingVariable)TorchFunctionModeVariable)is_forbidden_context_manager	__enter____exit__))torch.overridesr	  variables.ctx_managerr
  variables.torch_functionr  variables.user_definedr  r   r   
issubclass is_supported_torch_function_modehasattrrl   nnModuleUnspecializedNNModuleVariabler   collectionsOrderedDictUserDefinedDictVariablerW   r   UserDefinedSetVariabler   r   UserDefinedTupleVariable
get_vt_clsrB   UserDefinedListVariabler   MutableMappingVariabler   r)   r   "UserDefinedExceptionObjectVariableuser_defined_CONSTANT_BASE_TYPESUserDefinedConstantVariableInspectVariableis_matching_class)rZ   r   r	  r
  r  r  r   s          r<   get_variable_clsSideEffects.get_variable_cls  s   5IGH // 	 
 
'HHRR4LHk***--0::9L%((//22$BBL4)@)@"ABB$<<L3	"233$;;L%(( **(AALLXV(AA$''$<<L.11$;;L **2L-00$GGL""77
 
 %@@L&&88BB$44L,	(K(KLLLLr>   base_cls_vtcls_vt	init_argsc                    UR                   n[        U[        R                  R                  5      (       a  [        U5      nU$ [        U[        R                  5      (       a  UR                  nO[        U[        R                  5      (       a  [        nO`[        U[        R                  5      (       a  [        nO:[        U[        R                  5      (       a  UR                   nO[        SU 35      e[        R                  R!                  UR"                  5      (       d   e[%        U5      (       a  U" S /UR&                  -  5      nU$ U(       a^  [        U[        R(                  R*                  5      (       a5  U Vs/ s H  owR-                  5       PM     nn UR"                  " U/UQ76 nU$ UR#                  U5      nU$ s  snf ! [.         a    UR#                  U5      n U$ f = f)NzUnexpected base_cls_vt )r   r  rl   r  r  r    rt   r   BuiltinVariablefnDictBuiltinVariabler   ListBuiltinVariablerB   UserDefinedClassVariableRuntimeErroris_supported_new_method__new__r   n_fieldsr"  r#  as_python_constant	Exception)	rZ   r)  r*  r+  r   r  base_clsargexample_argss	            r<   get_example_valueSideEffects.get_example_value#  s    <<h00)CL 
I +y'@'@AA&>>K)F)FGGK)F)FGGK)K)KLL&,,"%<[M#JKK55MM      "(++ v(9(99:& 
% z&&;;    ENNIS 6 6 8IN
"** #/C 
 &&x0
  O
 !  #** C
 
s   GG
 
G)(G)c           	         UR                   nUR                  nU R                  U5      nU R                  XU5      nU" UUR                   UU[	        U5      S9nXR
                  [        U5      '   U R                  R                  U5        U$ )a  
Creates a UserDefinedObjectVariable (or its subclass) variable tracker
and mark it for attribute mutation tracking.

Also records the variable trackers to call __new__ method on
reconstruction. Roughly, the reconstruction looks like this
    base_cls_vt.__new__(user_cls, *init_args)
)r   r)  r+  r   )	r   r   r'  r;  r$   rH   r   rJ   rk   )	rZ   r)  r*  r+  r   r   r   r  r   s	            r<   track_new_user_defined_object)SideEffects.track_new_user_defined_objectT  s     ]]
<<,,X6$$[)D}}#.z:
 (0BsG$c"r>   c                     [        5       n[        R                  " [        5       S9nX R                  [        U5      '   U R                  R                  U5        U$ )Nr   )r   r   r   r$   rH   r   rJ   rk   )rZ   r  r   s      r<   track_cell_newSideEffects.track_cell_newr  sL     h)).0
 (0BsG$c"r>   r   cellcontentsc                     [         R                  " Uc  S O	[        5       UUS9nX@R                  [	        U5      '   U R
                  R                  U5        U$ )N)r   r   r   )r   r   r#   rH   r   rJ   rk   )rZ   r   rD  rE  r   s        r<   track_cell_existingSideEffects.track_cell_existing}  sT     )) #).$6O6Q"*
 )1BtH%d#r>   c                     [         R                  " [        5       US9nX0R                  [	        U5      '   U R
                  R                  U5        U$ )N)r   r   )r   NewGlobalVariabler#   rH   r   rJ   rk   )rZ   r   r   r   s       r<   track_global_existing!SideEffects.track_global_existing  sF    ..35
 )1BtH%d#r>   ctxargsc                 ~    [        U[        R                  5      (       d   eU R                  R	                  X45        g r3   )rt   r   r	   rM   rk   )rZ   rM  rN  s      r<   track_save_for_backward#SideEffects.track_save_for_backward  s3     #yHHIIII%%sk2r>   c                    UR                    Hp  n[        U5      nUR                  U   nX0R                  ;  d  M.  [        U[        R
                  [        R                  45      (       d  M_  U R                  X$5        Mr     g r3   )rJ   r   rH   rt   r   TensorVariableSymNodeVariabler   )rZ   rr   
other_itemother_idother_variables        r<   -track_runahead_tensor_and_symvar_side_effects9SideEffects.track_runahead_tensor_and_symvar_side_effects  si      //J*~H"11(;N222z!9!99;T;T U8 8 **:F *r>   c                   ^ ^	^
^ [        5       m[        5       m	S[        SS 4U	U U
U4S jjm
S[        S[        4U	4S jjnT R                  R	                  5        Vs/ s H&  n[        UR                  [        5      (       a  M$  UPM(     nn/ nUnUbo  UR                  UR                  UR                  /5        UR                  b*  UR                  c   eUR                  UR                  5        UR                  nUb  Mo  [        R                  " T
UUUR                  R                   T R"                  /-   5        @
T R                  R%                  5        VVs0 s H  u  pxU" U5      (       d  M  Xx_M     snnT l        T R&                  R%                  5        VVs0 s H  u  pxU" U5      (       d  M  Xx_M     snnT l        g s  snf s  snnf s  snnf )Nr]   r1   c                    > U T;   a  g TR                  U 5        [        U R                  [        5      (       a  TR                  U 5        U TR                  ;   a%  [
        R                  " TTR                  U    5        g g r3   )r_   rt   r   r$   rI   r(   visit)r]   live_new_objectsrZ   r\  visiteds    r<   r\  0SideEffects.prune_dead_object_new.<locals>.visit  so    g~KK#++-ABB $$S) d///%%--c2 0r>   c                 N   > [        U R                  [        5      (       a  U T;   $ gNT)rt   r   r$   )r]   r]  s    r<   is_live2SideEffects.prune_dead_object_new.<locals>.is_live  s&    #++-ABB...r>   )rW   r(   r   rH   valuesrt   r   r$   rC   stacksymbolic_localsparentpost_prune_cell_and_freevarsrk   r\  r   backward_staterN   r7   rI   )rZ   txrb  r]   pre_existing_varsinit_live_varscur_txr:   r;   r]  r\  r^  s   `        @@@r<   prune_dead_object_new!SideEffects.prune_dead_object_new  s   (+14	 	4 	 	 	 	T 	 **113
3c//1EF 3 	 
 35 !!6<<1G1G"HI}}( ::FFF%%f&I&IJ]]F   	!		((!!		
  "00668
8TQGAJDAD8
 "66<<>%
>TQ'!*DAD>%
![
T
%
s$   #GGG	1G	G4Gc                    XR                   ;   a  g U R                  U5        U R                  U5        [        UR                  [
        5      (       a  SUR                  l        UR                  b%  U R                  R                  UR                  5        UR                  (       a(  [        U[        R                  5      (       a  SU l        g g g ra  )rX   r   rp   rt   r   r&   r   r   rY   r_   r   ConstDictVariablerU   r`   s     r<   mutationSideEffects.mutation  s    999&&s+  %c'')>??,0C)::!  $$SZZ0::*S)*E*EFF/3D, G:r>   c                     U R                   $ r3   )rU   rZ   s    r<   has_existing_dict_mutation&SideEffects.has_existing_dict_mutation  s    ///r>   c                     U R                   R                  5        Vs/ s H  oR                  U5      (       d  M  UPM     sn$ s  snf r3   )rH   rd  r   r`   s     r<   _get_modified_varsSideEffects._get_modified_vars  s7    #2299;U;?O?OPS?T;UUUs
   AAcgc           	        ^^ U R                  5        GH  m[        TR                  [        5      (       d  TR                  c   eM4  [        T[
        R                  [
        R                  45      (       a  U R                  T5      (       d  M{  [        T[
        R                  5      (       a  TR                  ca  TR                  U4S j5        TR                  [        SS5      5        TR                  T5        [        TR                   T   5      Tl        GM  TR                  c  [#        TR                  5      Tl        GM2  GM5  TR%                  5       (       at  [        T[
        R&                  R(                  5      (       aH  T" TSS9  TR                  T5        TR+                  5         [        TR                   T   5      Tl        GM  GM  [        T[
        R,                  5      (       a  [/        SSS/ S9  GM  [        T[
        R0                  5      (       a  SUU4S	 jjnTR                  U5        OTR                  U4S
 j5        TR                  R2                  c   eT" TR                  R2                  5        TR4                   H  nT" U5        M     TR                  [        S[7        TR4                  5      -   S5      5        TR                  T5        [        TR                   T   5      Tl        [        T[
        R8                  5      (       d  GM  TU R:                  ;   d  GM  U R:                  T   R=                  5        H  u  pETR?                  SS5        TRA                  S5        T" TR                  5        T" [
        RB                  " U5      5        T" U5        TR                  / [E        S5      Q[G        S5      P5        M     GM     U RH                   Hi  u  pgT" UR                  5        TRA                  S5        U H  nT" U5        M     TR                  / [E        [7        U5      5      Q[G        S5      P5        Mk     g )Nc                  D   > T R                  [        R                  S5      $ )N	make_cellload_import_fromr   __name__r{  s   r<   <lambda>3SideEffects.codegen_save_tempvars.<locals>.<lambda>(       3 3ENNK Pr>   r   Fallow_cachez<AutogradFunctionContextVariable escaped Dynamo-traced regionr   zAWe cannot reconstruct a torch.autograd.Function's context object.r   c                     > TR                   c   eT " TR                   5        T R                  T R                  S5      /5        g )Nr4  )r)  extend_outputcreate_load_attrr{  r]   s   r<   load_new_method:SideEffects.codegen_save_tempvars.<locals>.load_new_methodQ  s;    ":::3??+(("*=*=i*H)IJr>   c                  D   > T R                  [        R                  S5      $ )Nr!   r  r  s   r<   r  r  Z  s     3 3ENNL Qr>   r   builtinsr   __setattr__   POP_TOPrM   r1   N)%ry  rt   r   r$   r   r   NamedTupleVariableStructSequenceVariabler   r   
local_nameadd_push_nullr  r   	add_cacher   tempvarsr   	is_tensortorch_functionTensorWithTFOverrideVariable	clear_tosr	   r   r   r   r+  lenr)   rI   r7   r  load_methodConstantVariabler   r   rM   )	rZ   r{  r  r9  r   r   rM  rN  r]   s	    `      @r<   codegen_save_tempvars!SideEffects.codegen_save_tempvars  s~    **,Cc//1EFFzz--- --y/O/OP  //44#y5566
 >>)$$P $$%9!U%CDLL%!0S1A!BCJZZ'!0!@CJ ( 11NN  s.LL% LLN!0S1A!BCJ C!J!JKKZ c	 c9#F#FGGK K $$_5$$Q ((33???3$$//0 ==CsG )   !5a#cmm:L6Le!TUS!,R[[-=>
 sI$E$EFFt888'+'@'@'E'K'K'M++JA}53::955d;<5	((S03S5G	5RS (NI -\ //ICszzNNN./3 'D	2&y1 0r>   tensorhookhandlec                    UR                  5       (       d   e[        U[        R                  5      (       d   e[        U[        R                  5      (       a  UR                  5       (       d   e[        [        R                  U5      (       d   e[        U R                  R                  5       5      nXPR                  ;   a  US-  nXPR                  ;   a  M  XX44U R                  U'   UR                  (       a   eXSl        g )Nr   )r  rt   r   r(   RemovableHandleVariable
is_mutabler  rl   Tensorr  rN   rx   idx)rZ   r  r  r  r   r  s         r<   register_hookSideEffects.register_hook  s     !!!!$	 9 9::::vy@@AA!!##	
$ u||T****$##((*+&&&1HC &&&"(!=#::~
r>   r  c                     U R                   U	 g r3   )rN   )rZ   r  s     r<   remove_hookSideEffects.remove_hook  s    c"r>   c                 $  ^^^ U R                   R                  5        Ho  u  mnnmTR                  (       d   S5       eSUUU4S jjnTR                  U5        T" U5        TR	                  [        SS5      5        TR                  U5        Mq     g )Nz4Hooks on non input tensors NYI - should not get herec                  X   > T " T5        T R                  T R                  T5      /5        g r3   )r  r  )r{  r   r  s   r<   gen_fn)SideEffects.codegen_hooks.<locals>.gen_fn  s&    6
  ""5"5d";!<=r>   r   Fr  )rN   rd  r   r  r  r   r  )rZ   r{  r  r  r  r   r  s    `   @@r<   codegen_hooksSideEffects.codegen_hooks  s     %%'
F ==X"XX=> > V$tH1!U;< LL ] (r>   c                 ~    SSK Jn  U R                  c  [        R                  " / U" 5       S9U l        U R                  $ )Nr   )r'   rA  )variables.baser'   rV   r   r,   )rZ   r'   s     r<   get_ca_final_callbacks_var&SideEffects.get_ca_final_callbacks_var  s;    4&&.*3*@*@"2"4+D' ***r>   c                    [         R                  S:w  d   eU R                  R                  U/ 5      nSUR	                  5        3nSnUR
                  b  [        UR
                  [        5      (       a  SnO[        U[        R                  5      (       a  UR                  b  SUR                   S3nOF[        U[        R                  R                  5      (       a  SnOSUR
                  R                   S3nU(       a  [        5       n/ n[        [!        5       5      nU Hn  n[#        S	 U 5       5      n	X;  d  M  UR%                  U	5        [        Xx-   5      n
UR'                  S
R)                  [*        R,                  " U
5      5      5        Mp     SR)                  U5      nU U S[.        R0                  " US5       3nU$ U U S3nU$ )z1Format a side effect log message with user stack.ri   zMutating object of type z (no source)z* (source: created in torch.compile region)z
 (source: )z- (source: torch function mode stack mutation)z (source name: c              3      #    U  HW  nUR                   UR                  UR                  UR                  [	        US S5      [	        USS5      [	        USS5      4v   MY     g7f)colnoN
end_lineno	end_colno)filenamelinenor   liner   ).0fs     r<   	<genexpr>:SideEffects._format_side_effect_message.<locals>.<genexpr>  s]      $ # 

7D1<6;5 #s   AA!r   z
********

z

z    z+ (unable to find user stacks for mutations))r   rj   rK   r   python_type_namer   rt   r   r   r   r  r  TorchFunctionModeStackVariabler   rW   r   r   r   r_   rk   join	tracebackformat_listtextwrapindent)rZ   r]   	locationsdescriptionsource_infoseenunique_formatted_stacksstack_above_dynamore  stack_tuplestack_augmentedformatted_lineslog_strs                r<   _format_side_effect_message'SideEffects._format_side_effect_message  s   //8;;;--11#r:	01E1E1G0HI$::!#**o66JC!7!788S^^=W *3>>*:!<Y--LL  N !0

/@B5D13#!78N8P!Q" $ $ #$  *HH[)&<=O=W&XO+22	 5 5o FG' #, $4#8#89P#QO$k]$xX^7_6`aG  -},WX  r>   side_effect_messagesc                    ^ T(       d  g T H  n[         R                  U5        M     [        R                  R	                  SS U4S jS9  g )Nartifactc                      SSS.$ )Ndynamo_side_effectsstring)r   encodingr   r   r>   r<   r  8SideEffects._emit_side_effect_messages.<locals>.<lambda>"  s    -$!r>   c                  &   > SR                  T 5      $ )Nz,

========================================

)r  )r  s   r<   r  r  &  s    QVV$ r>   )metadata_fn
payload_fn)side_effects_logdebugrl   _loggingtrace_structured)rZ   r  msgs    ` r<   _emit_side_effect_messages&SideEffects._emit_side_effect_messages  sG    #'C""3' ( 	'' 	( 		
r>   log_side_effectsc           
        ^ ^^^^ / mS[         SS 4UU U4S jjn/ nT R                  5        GH  m[        R                  (       d!  [	        TR
                  [        5      (       d  M:  [	        T[        R                  5      (       ax  T" TSS9  T" TR
                  5        TR                  TR                  S 5      TR                  S 5      [        SSS9/5        UR                  [        S	5      /5        U" T5        M  [	        T[        R                  R                  5      (       a  TR                  R!                  5       (       d  [#        S
SSS/S9  T" TR
                  5        TR%                  S5        T" TSS9  UR                  / ['        S5      Q[        S5      P5        T" TR
                  5        TR%                  S5        UR                  / ['        S5      Q[        S5      P5        U" T5        GM  [	        T[        R(                  [        R*                  45      (       a  TR-                  5       (       a  T" TR
                  5        TR%                  S5        T" TSS9  TR.                  (       a#  T" TR
                  5        TR%                  S5        UR                  / ['        S5      Q[        S5      P5        TR.                  (       a'  UR                  / ['        S5      Q[        S5      P5        U" T5        GM  GM  [	        T[        R0                  R2                  5      (       Ga	  TR5                  U4S j5        TR7                  SS5        [        R0                  R9                  5       nTR:                  S==   U4-  ss'   TR=                  [        SUS95        TR5                  U4S j5        TR?                  TR@                  5        TR=                  [        S[C        TR@                  5      S95        TR7                  SS5        TR=                  [        S5      5        U" T5        GM  [	        T[        RD                  5      (       ao  TRF                  bb  TT RH                  ;   aO  T RK                  T5      nT" U5        UR                  TRM                  TRF                  5      /5        U" T5        GM  GM  T RO                  T5      (       Ga<  [	        TRP                  [R        5      (       a"  [	        T[        RT                  5      (       a  GM  [	        T[        RV                  5      (       Gaj  T RY                  TRZ                  5      (       GaI  0 n[\        R^                  R`                   H)  nTRb                  Rd                  Rg                  5       Xu'   M+      [i        TRj                  5      Rl                  Ro                  [p        Rr                  5      nTR                  [        SUS9[        SUS   S9/5        T" TR
                  5        TR                  [        SUS   S9/5        T" TRZ                  SS9  TR                  [        SUS   S9/5        [y        [\        US9n	UR                  / U	Q[        S5      P5        U" TRZ                  5        GO$[	        T[        Rz                  5      (       Ga  T RY                  TRZ                  5      (       a  0 n[|        R^                  R`                   H)  nTRb                  Rd                  Rg                  5       Xu'   M+     T" TR
                  5        TR                  [        SUS    S9/5        T" TRZ                  SS9  TR                  [        SUS!   S9/5        [y        [|        US9n
UR                  / U
Q[        S5      P5        U" TRZ                  5        Sn[        T RH                  R                  T0 5      R                  5       5       GH  u  p\[	        T[        R                  5      (       al  TRb                  Rd                  R                  U5        T" U5        [	        TR
                  [        5      (       d   eUR                  [        S"US9/5        S#nM  [	        U[        R                  5      (       a  [	        TRP                  [        5      (       au  [        [        TS$S 5      U5      (       aV  TRb                  Rd                  R                  U5        T" TR
                  5        UR                  [        S%US9/5        S#nGMA  GMD  GMG  [	        T[        R                  5      (       a  TR                  U5      (       ax  TR5                  U4S& j5        T" TR
                  5        T" [        R                  " U5      5        T" U5        UR                  / [        S'S5      Q[        S5      P5        S#nGM  [	        T[        R                  5      (       a  TR                  5       (       a  TR                  S(S)5        TR%                  S*5        T" TR
                  5        T" [        R                  " U5      5        T" U5        UR                  / ['        S'5      Q[        S5      P5        S#nGM  TRb                  Rd                  R                  U5        T" U5        T" T5        UR                  [        S+US9/5        S#nGM     U(       a  U" T5        G
M  G
M  [	        T[        R                  5      (       ap  [        TRn                  5       HL  nTR5                  U4S, j5        T" TR
                  5        TR7                  SS5        TR                  5         MN     U" T5        GM~  [	        T[        R                  5      (       ap  [        TR                  5       HL  nTR5                  U4S- j5        T" TR
                  5        TR7                  SS5        TR                  5         MN     U" T5        GM  [	        T[        R                  5      (       a|  S/UU4S. jjnTR5                  U5        T" TR                  TR                  R                  5       5      5        UR                  / [        SS5      Q[        S5      P5        U" T5        GM  [        [i        T5      5      e   [        U5       H  nTR                  U5        M     T(       a  T(       a  T R                  T5        g g g ! [t         a6    [i        TRj                  5      Rl                  Ro                  [v        5      n GNf = f)0Nr]   r1   c                    > [         R                  S:w  a+  T(       a#  TR                  U 5      nTR                  U5        g g g Nri   )r   rj   r  rk   )r]   r  r  rZ   r  s     r<   _maybe_log_side_effectBSideEffects.codegen_update_mutated.<locals>._maybe_log_side_effect1  s<    //8;@P66s;$++C0 AQ;r>   Fr  BUILD_SLICE   )r9  STORE_SUBSCRz1Side effect on existing deque with limited maxlenr   zThis is not supported.z*Don't use a deque with `maxlen` specified.r   rC   r   r  r6   r   updatec                  D   > T R                  [        R                  S5      $ )Nget_torch_function_mode_stackr  r  s   r<   r  4SideEffects.codegen_update_mutated.<locals>.<lambda>      B//(Gr>   co_varnames
STORE_FAST)argvalc                  D   > T R                  [        R                  S5      $ )Nset_torch_function_mode_stackr  r  s   r<   r  r    r  r>   
BUILD_LIST
LOAD_CONSTr0   r/   r.   )varname_mapr@   r?   STORE_GLOBALTr   DELETE_ATTRc                  D   > T R                  [        R                  S5      $ )N object_setattr_ignore_descriptorr  r  s   r<   r  r  O  s    B$7$7 %0R%r>   r  r  r   r  
STORE_ATTRc                  D   > T R                  [        R                  S5      $ N	iter_nextr  r  s   r<   r  r  w  r  r>   c                  D   > T R                  [        R                  S5      $ r  r  r  s   r<   r  r    r  r>   c                  L   > T " TR                   5        T R                  S5        g )Nsetstate)r   r   r  s   r<   r  2SideEffects.codegen_update_mutated.<locals>.gen_fn  s    szzNLL,r>   r  )Zr(   ry  r   replay_side_effectsrt   r   r   r   r,   r  create_load_constr   rk   listsDequeVariablemaxlenis_constant_noner   r  r   rq  SetVariablehas_new_itemsshould_reconstruct_allr  r  r  call_functionget_prev_stack_var_namecode_optionsappend_outputforeachsymbolic_stackr  r   r  rI   r   create_store_derefr   r   r$   r)   r  r   _base_vtr=   __code__r  rj  r   new_varr4   r   r5   indexr  r  
ValueErrorr   r   r  rD   reversedr   r7   rJ  update_co_namesr   r   r#   r  r   r   should_skip_descriptor_setterr  r   needs_slow_setattrr  ListIteratorVariablerangepop_topCountIteratorVariableadvance_countRandomVariable
wrap_staterandomgetstater   r  )rZ   r{  r  r  suffixesr   contents_varr  r0   dict_update_instslist_update_instsside_effect_occurredr   _r  suffixr  r]   s   ```             @@r<   codegen_update_mutated"SideEffects.codegen_update_mutated+  sx    +-	1 	1D 	1 	1
 **,C--j

O7 7 #y55663E*3::  ,,T2,,T2*=a@ !3N!C DE&s+C!>!>?? zz2244! S "$<H	 3::x(3E*+A.*95 3::w'+A.*95 's+C)"="=y?T?T!UVV $$&&szzNNN8,s.113::w/OO/2.y9 11 !!3A!6 29 = +3/3 '6 Y--LL    
   E* //GGI.4'9.  !3L!NO   

3--.  &|S=O=O9PQ   E*  !3I!>?&s+C!7!788S^^=W $333#'>>##6L|$OOR%:%:3>>%J$KL*3/	 4 ++C00 c//1EFF:::L L 55  &&LL 
 #%K 4 = = I I,.EELL,@,@,B) !JH$(O$;$;$A$A'33%	 $$.|IN. ,[5M szzN$$. ,[5K s||7$$. ,[5M )?,+)% OO..y9 +  55  &&LL 
 #%K 3 < < H H,.EELL,@,@,B) !I szzN$$. ,[5K s||7$$. ,[5M )?+)% OO..y9 +( (-$#+--11#r:@@B$KD "#y'B'BCC44T:5	)#**lCCCC /tLM 04,#E9+D+DEE%--/H %gc7D&A4HHEELL88>szzN$OO!3M$!O P 480 I $Y@@ ;;DAA((
 3::955d;<5	 !5a!? 29 = 04,"3	(K(KLL2244 ++JA}53::955d;<5	 S03S5G	5RS 04,44T:5	3 );LQU)V(WX/3,u$x (*3/ (C!?!?@@syy)A$$P szzN$$Q.JJL * 's+C!@!@AAs001A$$P szzN$$Q.JJL 2 's+C!9!9::- -   (3>>#**"5"5"789-a7*95 's+$T#Y//A -F x(FV$ )  4++,@A !5a & H$(O$;$;$A$A$$G	Hs   +<t//<u/.u/c                     [         R                  S:X  a  g [        R                  [        R
                  5      (       d  g U R                  5        H)  nU R                  U5      n[        R                  U5        M+     g r  )	r   rj   r  isEnabledForloggingDEBUGry  r  r  )rZ   r]   r  s      r<   log_side_effects_summary$SideEffects.log_side_effects_summary  s\    ++x7,,W]];;**,C2237C""3' -r>   c                     [        [        U R                  U R                  R	                  5       5      5      =(       d2    U R
                  =(       d    U R                  =(       d    U R
                  (       + $ r3   )anymapr   rH   rd  rN   rM   ru  s    r<   is_emptySideEffects.is_empty  s\    D$$d&9&9&@&@&BCD !  !%%!   	
 	
r>   c                 l    U R                   R                  5         U R                  R                  5         g r3   )rJ   r6   rH   ru  s    r<   r6   SideEffects.clear  s$    !!#r>   )rU   rV   rH   rX   rJ   rY   rK   rT   rM   rI   rN   )NNNNNN)r1   rF   )FF)rr   rF   r1   N)rj  r+   r1   N)r1   zvariables.ListVariable)Fr  )Nr  
__module____qualname____firstlineno____doc__r   r   r(   __annotations__r   rB   r   r  StackSummaryr   r	   rQ   ra   re   rp   r   r   ru   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   staticmethodr4   r   r   r   r   r   r&   r   track_mutabler   r   r  r'  r;  r>  rB  r   rG  rK  rP  rX  rn  rr  rv  ry  r   r  r  r  r  r  r  r  r7  r=  rB  r6   __static_attributes____classcell__)r[   s   @r<   rF   rF   \   sZ   & o-..S/5I0JJKKCyY5K5K0LLMM
 =A&*  -1@#1@ S/12T91@ #?Do9M4N#NO
	1@ #?D9O9O4P#PQ
1@ 9t#1@  143HHI
 1@ *3
 	1@. 
/1@ 1@f9 94 9
@o @$ @

 
4 

F 
t 
- C$J ,
 / / /- - -
4 

$ 

T 
o $ (o ($ (TD#D+.D7FD	D$ !  	
  
&
9/ 
9/ 
9d 
9
 
_ 
.* *s * *+#++.+7F+	+ 
 
 
 
A/ Ad A
 
T 

> > >PT >
. .D .& #8	 "  	
 
* M

 "
 
	
TM  	
 c3h 
*/ /$ /b/$/  / (	/
 
/b$   (	
 
<			tm+3?N	F # / 3"3*.*?3	3G"G	GI
V4O 4 40D 0VD$9 V	 d B*  4	
  
,#s #t #4!	 4!d 4!l+5 53 5n
tCy 
T 
& 7<tBtB/3tB	tBl(
$ 
$ $r>   rF   rj  r+   )NNNc              #      #    U R                   R                  R                  n SU R                   R                  l        Sv   XR                   R                  l        g! XR                   R                  l        f = f7f)zContext manager to temporarily allow side effects with extra outputs.

This is used for special cases (like FSDP functions) that need to perform
side effects even when the general policy is to disallow them.
TN)r   r   r   rj  orig_vals     r<   r   r     sW      yy''AAHF=A		  :=E		  :X		  :   !A=A A=A::A=c              #   4  #    U R                   R                  R                  n SU R                   R                  l        SU R                   R                  l        S v   XR                   R                  l        g ! XR                   R                  l        f = f7fra  )r   r   r   +traced_with_externally_visible_side_effectsrQ  s     r<   2allow_externally_visible_side_effects_in_subtracerrV    sj      yy''TTHYPT		  MOS		  LPX		  MPX		  Ms   !B:A9 B9BBc              #      #    U R                   R                  R                  n SU R                   R                  l        S v   XR                   R                  l        g ! XR                   R                  l        f = f7fra  )r   r   r   rQ  s     r<   "disallow_side_effects_in_generatorrX    sW      yy''CCHH?C		  <?G		  <x		  <rS  )QrI  r  
contextlibr   r;  r  r  r  rR   collections.abcr   r   typesr   typingr   r   rl   torch.nnr   r	   torch.utils._ordered_setr
   torch.utils._pytreer   r   r   r   r   r   bytecode_transformationr   r   r   r   codegenr   excr   r   r   r   r   r   r   r   r   r   r   r    r!   r  r"   r#   r$   r%   r&   r'   r(   r  r)   torch._dynamo.output_graphr*   torch._dynamo.symbolic_convertr+   torch._dynamo.variables.listsr,   r  getArtifactLoggerr  r  r   r   r=   rB   rD   rF   contextmanagerr   rV  rX  r   r>   r<   <module>rh     s  .         5  %   H / 2 9 9   N N V V T T   < 6H: >>33HnM 
.CH~
.(,S#X
.CF
.	
.$49 $tCy $T $
X$ X$v* F#F F F  	Y#	Y 	Y 	Y H#H H Hr>   