
    ȅi                        S SK Jr  S SKrS SKrS SKrS SKrS SKrS SKrS SKrS SK	r	S SK
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  S SKJrJrJrJrJrJrJr  S SKJ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'  S SK(J)r)  \RT                  " \+5      r,\(       a,  S SK-J.r.J/r/J0r0  S SK1J2r2  S SK3r3S SK4J5r5  S SK6J7r7  S SK8J9r9  S SK:J;r;   \Rx                  " S5      r=\Rx                  " S5      r>\" SSSS9 " S S5      5       r? " S S\5      r@ " S S\R                  5      rB  " S S5      rC\R$                  " SS 9 " S! S"5      5       rD " S# S$\5      rE\R$                  " SS%9 " S& S'5      5       rF\" S(5      rG \R$                  " SS 9 " S) S*5      5       rH \R$                  " SS 9 " S+ S,\H5      5       rI \R$                  " SS 9 " S- S.\H5      5       rJ  " S/ S0\\G   5      rK " S1 S25      rL " S3 S45      rM " S5 S6\K\M   5      rN " S7 S85      rO " S9 S:\K\O   5      rP " S; S<5      rQ  " S= S>\K\L   5      rR " S? S@5      rS " SA SB\S5      rT " SC SD5      rU\R                  " 5       rW  " SE SF5      rX " SG SH5      rY\    STSI j5       rZ\    SUSJ j5       r[\SVSK j5       r\\ SW     SXSL jj5       r\\" 5        SW     SYSM jj5       r\\\" SS 9 " SN SO5      5       r]\\" SS 9 " SP SQ\]5      5       r^SWSZSR jjr_S[SS jr`g)\    )annotationsN)abstractmethod)defaultdict)contextmanager)	dataclass)AnyGeneric
NamedTupleOptionaloverloadTYPE_CHECKINGTypeVar)dataclass_transform)_pytree)
OrderedSet)is_traceable_wrapper_subclass)CapturedTracebackformat_frame)WeakTensorKeyDictionary)Callable	GeneratorIterator)CodeType)DDPOptimizerContext)	PyCodegen)ViewAndMutationMetaFakeTensorModez-^(?P<frame_id>\d+)/(?P<frame_compile_id>\d+)$zQ^!(?P<compiled_autograd_id>\d+)(?:/(?P<frame_id>\d+)/(?P<frame_compile_id>\d+))?$T)frozenkw_onlyslotsc                  V    \ rS rSr% S\S'   S\S'   SrS\S'   S
S jr\SS j5       rS	r	g)	CompileIdD   
int | Noneframe_idframe_compile_idNcompiled_autograd_idc                   U R                   b  U R                  S L U R                  S L :w  a%  [        SU R                   SU R                   35      eSnU R                  b  SU R                   SU R                   3nSU R                    U 3$ U R                  b  U R                  c%  [        SU R                   SU R                   35      eU R                   SU R                   3$ )NzMframe_id and frame_compile_id must both be None or both be set, got frame_id=z, frame_compile_id= /!z=frame_id and frame_compile_id must not be None, got frame_id=)r(   r&   r'   AssertionError)self	frame_strs     G/home/james-whalen/.local/lib/python3.13/site-packages/torch/_guards.py__str__CompileId.__str__S   s   $$0%4+@+@D+HI$$$(MM?2EdF[F[E\^  I}}(a0E0E/FG	t001)==}}$(=(=(E$$$(MM?2EdF[F[E\^  mm_Ad&;&;%<==    c                <   Uc  g [         [        4 H`  nUR                  U5      =n(       d  M  UR                  5       nUR	                  5        H  u  pVUc  M
  [        U5      XE'   M     U " S0 UD6s  $    [        e! [         a  n[        SU S35      UeSnAff = f)zt
Factory method that creates a CompileId from its string representation.
Keep this in sync with the __str__ method.
NzInvalid compile_id '' )COMPILE_ID_PATTERNCA_COMPILE_ID_PATTERNmatch	groupdictitemsint
ValueError	Exception)cls
compile_idpatternr9   groupskves           r0   from_stringCompileId.from_stringh   s     	J.0EF#MM*5555"__.F &=(+AFI !/ ==( G !  	J3J<qABI	Js(   %A< &A< A< 4A< <
BBBr6   returnstr)r@   
str | NonerI   CompileId | None)
__name__
__module____qualname____firstlineno____annotations__r(   r1   classmethodrF   __static_attributes__r6   r3   r0   r#   r#   D   s8    
 !  (,*+
>* J Jr3   r#   c                  4    \ rS rSr% S\S'   S\S'   S	S jrSrg)
TraceId   r#   r@   r<   attemptc                    U R                   S:X  a  [        U R                  5      $ U R                   SU R                    3$ )Nr   _)rW   rJ   r@   r.   s    r0   r1   TraceId.__str__   s7    <<1t''oo&a~66r3   r6   NrH   rM   rN   rO   rP   rQ   r1   rS   r6   r3   r0   rU   rU      s     L7r3   rU   c                      \ rS rSrSrSrSrSrSrSr	Sr
S	rS
rSrSrSrSrSrSrSrSrSS jrSS jrSS jrSS jrSS jrSrg)GuardSource   r                           	   
                     c                H    U [         R                  [         R                  4;   $ N)r^   GLOBAL_FSDP_MODULELOCAL_FSDP_MODULErZ   s    r0   is_fsdp_moduleGuardSource.is_fsdp_module   s    668U8UVVVr3   c                    SS K Js  Jn  UR                  (       a:  U [        R
                  [        R                  4;   =(       d    U R                  5       $ U [        R
                  [        R                  4;   $ )Nr   )torch._dynamo.config_dynamoconfig_unsafe_skip_fsdp_module_guardsr^   GLOBAL_SPECIALIZED_NN_MODULELOCAL_SPECIALIZED_NN_MODULErt   )r.   ry   s     r0   is_specialized_nn_module$GuardSource.is_specialized_nn_module   sn    --11<<;; )
 &&( 4433
 
 	
r3   c                    U [         R                  [         R                  [         R                  [         R                  4;   $ rq   )r^   GLOBAL_UNSPECIALIZED_NN_MODULELOCAL_UNSPECIALIZED_NN_MODULE&GLOBAL_UNSPECIALIZED_BUILTIN_NN_MODULE%LOCAL_UNSPECIALIZED_BUILTIN_NN_MODULErZ   s    r0   is_unspecialized_nn_module&GuardSource.is_unspecialized_nn_module   s8    6655>>==	
 
 	
r3   c                H    U [         R                  [         R                  4;   $ rq   )r^   r   r   rZ   s    r0   "is_unspecialized_builtin_nn_module.GuardSource.is_unspecialized_builtin_nn_module   s&    >>==
 
 	
r3   c                    U [         R                  [         R                  [         R                  [         R                  [         R
                  4;   $ rq   )r^   LOCALr|   rs   r   r   rZ   s    r0   is_localGuardSource.is_local   sA    33))55==
 
 	
r3   r6   NrI   bool)rM   rN   rO   rP   r   GLOBALr|   r{   CONSTANTRANDOM_VALUE	SHAPE_ENVrs   rr   BACKWARD_STATE	EPHEMERALSYNTHETIC_LOCALr   r   r   r   
TEMP_LOCALrt   r}   r   r   r   rS   r6   r3   r0   r^   r^      sy    EF"##$ HLINIO$&!%'",.)-/*JW
"


r3   r^   c                      \ rS rSrSrg)GuardBuilderBase   r6   NrM   rN   rO   rP   rS   r6   r3   r0   r   r      s    r3   r   )r   c                  4    \ rS rSr% S\S'   S\S'   S	S jrSrg)
SLoc   z#traceback.FrameSummary | str | Noneframework_locrK   maybe_user_locc                    [        U R                  [        5      (       a  U R                  O[        U R                  5      nU R                  b  U R                   SU S3$ SU S3$ )Nz ()()
isinstancer   rJ   r   r   )r.   flocs     r0   r1   SLoc.__str__   sk     $,,c22 d001 	
 *))*"TF!44tfA;r3   r6   NrH   r\   r6   r3   r0   r   r      s    66	r3   r   c                  4    \ rS rSr% S\S'   S\S'   S\S'   Srg	)

ShapeGuard   zsympy.logic.boolalg.Booleanexprr   slocr   size_obliviousr6   NrM   rN   rO   rP   rQ   rS   r6   r3   r0   r   r      s    
%%
Jr3   r   )r!   c                  b   \ rS rSr% S\S'   S\S'   SrS\S'   SrS\S	'   SrS
\S'   SrS\S'   Sr	S\S'   Sr
S\S'   SrS\S'   SrS\S'   S'S jrS(S jrS)S jrS*S jr\S+S j5       r\S,S j5       r\S-S j5       rS+S jrS+S jrS.S  jrS/S! jrS/S" jrS/S# jrS+S$ jr          S0S% jrS&rg)1Guard   Sourceoriginating_sourcez)Callable[[GuardBuilderBase, Guard], None]	create_fnNzlist[str] | Noneguard_types	code_listzobject | Noneobj_weakref!weakref.ReferenceType[Any] | Noneguarded_class_weakrefzCapturedTraceback | Nonestackztraceback.StackSummary | None
user_stackr%   _hashFr   _unserializablec                    U R                   c:  [        U R                  U R                  [	        U R
                  5      45      U l         U R                   $ rq   )r   hashnamesourceidr   rZ   s    r0   __hash__Guard.__hash__  s:    ::tyy$++r$..7IJKDJzzr3   c                   [        U R                  [        R                  5      =(       aD    U R                  R                  [
        R                  R                  R                  R                  L nUU R                  (       a  U R                  R                  OS[        U R                  5      U R                  U R                  5       R                  R                   4$ )N)r   r   	functoolspartialfunctorchrx   guardsGuardBuilderDUPLICATE_INPUTr   valuelenr   inner_create_fn__code__co_firstlineno)r.   is_duplicate_inputs     r0   sort_keyGuard.sort_key  s    
 t~~y'8'89 Y##u}}';';'H'H'X'XX 	
 !%DKK"		NII  "++::
 	
r3   c                D    U R                  5       UR                  5       :  $ rq   )r   r.   others     r0   __lt__Guard.__lt__+  s    }}!111r3   c                    [        U R                  [        R                  5      (       a  U R                  R                  $ U R                  $ rq   )r   r   r   r   r   rZ   s    r0   r   Guard.inner_create_fn.  s3    dnni&7&788>>&&&>>!r3   c                .    U R                   R                  $ rq   )r   r   rZ   s    r0   r   
Guard.name4  s    &&+++r3   c                .    U R                   R                  $ rq   )r   guard_sourcerZ   s    r0   r   Guard.source8  s    &&333r3   c           
     "   [        U [        R                  5      (       af  U " 5       nUbD  S[        [	        U 5      5       SUR
                  R                   S[        [	        U5      5       S3$ S[        [	        U 5      5       S3$ [        U 5      $ )a  
This is a workaround of a Python weakref bug.

`obj_weakref` is instance returned by `weakref.ref`,
`str(obj_weakref)` is buggy if the original obj overrides __getattr__, e.g:

    class MyConfig(dict):
        def __getattr__(self, x):
            return self[x]

    obj = MyConfig(offset=5)
    obj_weakref = weakref.ref(obj)
    str(obj_weakref)  # raise error: KeyError: '__name__'
z<weakref at z; to 'z' at >z; dead>)r   weakrefReferenceTypehexr   	__class__rM   rJ   )r   objs     r0   weakref_to_strGuard.weakref_to_str<  s      k7#8#899-C%c"[/&:%;6#--BXBXAYY^_bceficj_k^llmnn%c"[/&:%;7CC{##r3   c                d   SU R                   (       a$  U R                   R                  R                  5       OS S[        U R                  5       SU R	                  5       R
                   SU R                   SU R                   SU R                  U R                  5       SU R                   S3nU$ )	Nz	
        r*    z&
        {
            'guard_types': z,
            'code': z,
            'obj_weakref': z
            'guarded_class': z
        }
        )r   r   lowerreprr   rM   r   r   r   r   r   )r.   ss     r0   __repr__Guard.__repr__U  s    	%)[[					!b94		?:K1TMaMaMcMlMlLm n ,,- .^^$ % //0@0@AB C"889 :	 r3   c                   S[        U R                  5       S3nU R                  (       a$  U R                  R                  R                  5       OSnUSU S3-  nUSU R	                  5       R
                   S3-  nUSU R                   S3-  nUSU R                   S3-  nUSU R                  U R                  5       S3-  nUS	U R                   S3-  nU$ )
NzName: 
r*   z    Source: z    Create Function: z    Guard Types: z    Code List: z    Object Weakref: z    Guarded Class Weakref: )r   r   r   r   r   rM   r   r   r   r   r   )r.   outputr   s      r0   r1   Guard.__str__a  s    $tyy/*"--1[[!!'')bL++)$*>*>*@*I*I)J"MM%d&6&6%7r::ODNN#3266()<)<T=M=M)N(OrRR/0J0J/K2NNr3   c           	     \    U R                  X5      $ ! [         a    [        R                  S[	        U 5      R                  5       5        U R                  (       aN  [        R                  SSR                  U R                  R                  5       SS  5      R                  5       5        e f = f)NzError while creating guard:
%szCreated at:
%sr*   )
r   r>   log	exceptionrJ   rstripr   errorjoinformat)r.   builders     r0   createGuard.createl  s    	>>'00 	MM;SY=M=M=OPzz		+RWWTZZ5F5F5H5M-N-U-U-WX		s
    BB+c                6    U R                   R                  5       $ rq   )r   r}   rZ   s    r0   r}   Guard.is_specialized_nn_moduleu  s    {{3355r3   c                6    U R                   R                  5       $ rq   )r   rt   rZ   s    r0   rt   Guard.is_fsdp_modulex  s    {{))++r3   c                6    U R                   R                  5       $ rq   )r   r   rZ   s    r0   r   Guard.is_local{  s    {{##%%r3   c                    [        U R                  [        R                  5      (       a"  U R                  R                  nUR
                  $ U R                  nUR
                  $ rq   )r   r   r   r   r   rM   )r.   r   s     r0   create_fn_nameGuard.create_fn_name~  sM    dnni&7&788++I !!! I!!!r3   c                   U R                   (       d  / U l         U R                   R                  U5        U R                  US 4;  a  [        SU R                   SU 35      eX l        U R                  (       d  X0l        OU R                  R                  U5        U R                  US 4;   =(       d.    [        U R                  5      =(       a    U R                  5       S L nU(       d  [        SU R                   SU 35      eX@l        g )Nz1Guarded class id must be identical, or None, got z vs zHGuarded object must be identical, None or ephemeral (dead weakref), got )r   appendr   r-   r   extendr   callable)r.   
guard_typeguarded_classr   r   is_valids         r0   set_export_infoGuard.set_export_info  s    !D
+%%mT-BB 112$}oG  &3"~~&NNN!!), d 33 +(() +  "d* 	
  ''([M;  'r3   )r   r   r   r   r   rI   r<   )rI   ztuple[bool, int, int, str, int])r   r   rI   r   )rI   z(Callable[[GuardBuilderBase, Guard], Any]rH   rI   r^   )r   objectrI   rJ   )r   r   rI   r   r   )
r  rJ   r  r   r   	list[str]r   r  rI   None)rM   rN   rO   rP   rQ   r   r   r   r   r   r   r   r   r   r   r   r   propertyr   r   staticmethodr   r   r1   r   r}   rt   r   r  r  rS   r6   r3   r0   r   r      s   & 88 %)K!("&I&!%K%?C<C&*E#*04J-4E:!OT!

 2" , , 4 4 $ $0
	6,&"&'&' 9&' 	&'
 &' 
&'r3   r   Tc                      \ rS rSrSrg)GuardEnvExpri  r6   Nr   r6   r3   r0   r  r    s    r3   r  c                  4    \ rS rSr% S\S'   S\S'   SS jrSrg)	DuplicateInputsi  r   input_source_ainput_source_bc                h    U R                   U R                  :X  a  [        SU R                    35      eg )Nz9input_source_a and input_source_b must be different, got )r  r  r-   rZ   s    r0   __post_init__DuplicateInputs.__post_init__  s>    $"5"55 **+-  6r3   r6   NrI   r  )rM   rN   rO   rP   rQ   r   rS   r6   r3   r0   r  r    s    r3   r  c                  *    \ rS rSr% S\S'   S\S'   Srg)StorageOverlapi  zlist[Source]overlapping_sourcesnon_overlapping_sourcesr6   Nr   r6   r3   r0   r$  r$    s    %%))r3   r$  c                  <    \ rS rSr\SS j5       r\SS j5       rSrg)Checkpointablei  c                    g rq   r6   rZ   s    r0   copy_graphstateCheckpointable.copy_graphstate  s    $'r3   c                    g rq   r6   r.   states     r0   restore_graphstate!Checkpointable.restore_graphstate  s    47r3   r6   N)rI   r  )r.  r  rI   r  )rM   rN   rO   rP   r   r*  r/  rS   r6   r3   r0   r(  r(    s    ' '7 7r3   r(  c                  B    \ rS rSr% SrS\S'   S
S jrSS jrSS jrSr	g	)GuardsCheckpointStatei  zO
The GuardCheckpointState - it is the T of Checkpointable[T] for GuardsContext
OrderedSet[Guard]dynamo_guardsc                    Xl         g rq   r4  )r.   r4  s     r0   __init__GuardsCheckpointState.__init__   s    *r3   c                p    U R                   R                  UR                   5      n[        U5      S:X  a  gU$ )z
Produces a delta against another GuardsCheckpointState.

Returns None if no delta is found, otherwise, return an OrderedSet() of mismatched
Guard type objects.
r   N)r4  
differencer   r.   r   rs      r0   diffGuardsCheckpointState.diff  s3     ))%*=*=>q6Q;r3   c                T    [        U[        5      (       d  gU R                  U5      S L $ NF)r   r2  r=  r   s     r0   __eq__GuardsCheckpointState.__eq__  s'    %!677yy4''r3   r6  N)r4  r3  rI   r  )r   r2  rI   Optional[OrderedSet[Guard]]r   r  rI   r   )
rM   rN   rO   rP   __doc__rQ   r7  r=  rA  rS   r6   r3   r0   r2  r2    s     %$+
(r3   r2  c                  B    \ rS rSr% 0 rS\S'   S	S jrS
S jrSS jrSr	g)ModuleContextCheckpointStatei  dict[str, torch.nn.Module]
nn_modulesc                    Xl         g rq   rI  )r.   rI  s     r0   r7  %ModuleContextCheckpointState.__init__  s    $r3   c                    [        U R                  R                  5       5      R                  [        UR                  R                  5       5      5      n[	        U5      S:X  a  gU$ )z
Produces a delta against another ModuleContextCheckpointState.

Returns None if no delta is found, otherwise, return a set() of mismatched
module key names.
r   N)setrI  keysr:  r   r;  s      r0   r=  !ModuleContextCheckpointState.diff  sM     $$&'223u7G7G7L7L7N3OPq6Q;r3   c                T    [        U[        5      (       d  gU R                  U5      S L $ r@  )r   rG  r=  r   s     r0   rA  #ModuleContextCheckpointState.__eq__'  '    %!=>>yy4''r3   rK  N)rI  rH  rI   r  )r   rG  rI   set[str] | NonerD  )
rM   rN   rO   rP   rI  rQ   r7  r=  rA  rS   r6   r3   r0   rG  rG    s    -/J*/%
(r3   rG  c                  2    \ rS rSrSS jrSS jrS	S jrSrg)
ModuleContexti-  c                    0 U l         g rq   rK  rZ   s    r0   r7  ModuleContext.__init__.  s	    *,r3   c                >    [        [        U R                  5      5      $ rq   )rG  dictrI  rZ   s    r0   r*  ModuleContext.copy_graphstate1  s    +D,ABBr3   c                ~    [        U[        5      (       d  [        S[        U5       35      eUR                  U l        g )Nz+expected ModuleContextCheckpointState, got )r   rG  r-   typerI  r-  s     r0   r/   ModuleContext.restore_graphstate4  s:    %!=>> =d5k]K   **r3   rK  Nr"  )rI   rG  )r.  rG  rI   r  rM   rN   rO   rP   r7  r*  r/  rS   r6   r3   r0   rV  rV  -  s    -C+r3   rV  c                  B    \ rS rSr% 0 rS\S'   S	S jrS
S jrSS jrSr	g)GlobalContextCheckpointStatei<  dict[str, tuple[Callable, Any]]global_statec                    Xl         g rq   rc  )r.   global_statess     r0   r7  %GlobalContextCheckpointState.__init__?  s    )r3   c                    [        U R                  R                  5       5      R                  [        UR                  R                  5       5      5      n[	        U5      S:X  a  gU$ )z
Produces a delta against another GlobalContextCheckpointState.

Returns None if no delta is found, otherwise, return a set() of mismatched
global key names.
r   N)rN  rc  rO  r:  r   r;  s      r0   r=  !GlobalContextCheckpointState.diffB  sO     !!&&()44S9K9K9P9P9R5STq6Q;r3   c                T    [        U[        5      (       d  gU R                  U5      S L $ r@  )r   ra  r=  r   s     r0   rA  #GlobalContextCheckpointState.__eq__N  rS  r3   re  N)rf  rb  rI   r  )r   ra  rI   rT  rD  )
rM   rN   rO   rP   rc  rQ   r7  r=  rA  rS   r6   r3   r0   ra  ra  <  s    46L16*
(r3   ra  c                  >    \ rS rSrSr1 SkrS	S jrS
S jrSS jrSr	g)GlobalContextiT  zn
This keeps track of the global torch state during tracing of a function.
For example, torch.is_grad_enabled.
>   grad_enabledautocast_enabledautocast_cpu_dtypeautocast_gpu_dtypeautocast_cpu_enabledautocast_cache_enabledc                    0 U l         g rq   re  rZ   s    r0   r7  GlobalContext.__init__c  s
    =?r3   c                ,    [        U R                  5      $ rq   )ra  rc  rZ   s    r0   r*  GlobalContext.copy_graphstatef  s    +D,=,=>>r3   c                   [        U[        5      (       d  [        S[        U5       35      eUR                  U l        [        U R                  5      [        U R                  5      :X  a1  [        U R                  R                  5       5      U R                  :X  d<  [        S[        U R                  R                  5       5       SU R                   35      eU R                  R                  5        H  u  p#U" U5        M     g )Nz+expected GlobalContextCheckpointState, got z Global state mismatch: got keys z, expected )
r   ra  r-   r]  rc  r   _supported_global_statesrN  rO  values)r.   r.  r   argss       r0   r/   GlobalContext.restore_graphstatei  s    %!=>> =d5k]K  "..!!"c$*G*G&HHD%%**,-1N1NN 23t7H7H7M7M7O3P2Q R 99:<  ++224JDJ 5r3   re  Nr"  )rI   ra  )r.  ra  rI   r  )
rM   rN   rO   rP   rE  ry  r7  r*  r/  rS   r6   r3   r0   rm  rm  T  s    
 @?r3   rm  c                      \ rS rSrSSS jjrSS jrSS jrSS jrSS jrSS	S
.       SS jjr	SS jr
SS jrSrg)	GuardsSeti}  Nc                6    Uc  [        5       U l        g Xl        g rq   )r   inner)r.   r  s     r0   r7  GuardsSet.__init__~  s    =,6LDJJr3   c                ,    [        U R                  5      $ rq   )iterr  rZ   s    r0   __iter__GuardsSet.__iter__      DJJr3   c                ,    [        U R                  5      $ rq   )r   r  rZ   s    r0   __len__GuardsSet.__len__  s    4::r3   c                F    [        U R                  UR                  -
  5      $ rq   )r~  r  r   s     r0   __sub__GuardsSet.__sub__  s    ekk122r3   c                ,    [        U R                  5      $ rq   )r   r  rZ   s    r0   __bool__GuardsSet.__bool__  r  r3   Tr   )collect_debug_stackskipc                  XR                   ;   a  g U(       a)  UR                  c  [        R                  " SU-   S9Ul        UR                  c  [
        R                  5       Ul        U R                   R                  U5        g Nr`   )r  )r  r   r   extractr   TracingContextextract_stackadd)r.   guardr  r  s       r0   r  GuardsSet.add  sa     JJ{{"/77QXF#-;;=E

ur3   c                H    U H  nU H  nU R                  USS9  M     M     g r  )r  )r.   othersogs       r0   updateGuardsSet.update  s&    A#  r3   c                ^   ^^ SSK Jm  [        UU4S jU R                   5       5      U l        g)z.Delete all guards that contains a given sourcer`   )is_from_sourcec              3  \   >#    U  H!  nT" UR                   T5      (       a  M  Uv   M#     g 7frq   )r   ).0r  r  r   s     r0   	<genexpr>6GuardsSet.remove_guards_with_source.<locals>.<genexpr>  s%       
!!8L8Lf)UAAzs   ,	,N)_dynamo.sourcer  r   r  )r.   r   r  s    `@r0   remove_guards_with_source#GuardsSet.remove_guards_with_source  s#    2  
zz 
 

r3   )r  rq   )r  rC  rI   r  )rI   zIterator[Guard]r  )r   r~  rI   r~  r   )r  r   r  r   r  r<   rI   r  )r  z
set[Guard]rI   r  )r   r   rI   r  )rM   rN   rO   rP   r7  r  r  r  r  r  r  r  rS   r6   r3   r0   r~  r~  }  sR     
3  <@Q

48
GJ
	
$

r3   r~  c                  2    \ rS rSrSS jrSS jrS	S jrSrg)
GuardsContexti  c                0    [        5       U l        / U l        g rq   )r~  r4  aotautograd_guardsrZ   s    r0   r7  GuardsContext.__init__  s    (168r3   c                R    [        [        U R                  R                  5      5      $ rq   )r2  r   r4  r  rZ   s    r0   r*  GuardsContext.copy_graphstate  s    $Z0B0B0H0H%IJJr3   c                    [        U[        5      (       d  [        S[        U5       35      e[	        UR
                  5      U l        g )Nz$expected GuardsCheckpointState, got )r   r2  r-   r]  r~  r4  r-  s     r0   r/   GuardsContext.restore_graphstate  s:    %!677 #GU}!UVV&u':':;r3   )r  r4  Nr"  )rI   r2  )r.  r2  rI   r  r_  r6   r3   r0   r  r    s    9K<r3   r  c                      \ rS rSr\SS j5       r\SS j5       r\SS j5       r\SS j5       r\SS j5       r	\SS j5       r
\        SS j5       r\      SS	 j5       rS
rg)HopSubgraphCachei  c                    g rq   r6   r.   fn_id
identifiers      r0   add_dynamo_installed_submodule/HopSubgraphCache.add_dynamo_installed_submodule  s    SVr3   c                    g rq   r6   r.   r  s     r0   get_dynamo_installed_submodules0HopSubgraphCache.get_dynamo_installed_submodules      HKr3   c                    g rq   r6   r.   r  keys      r0   add_autograd_key_entry'HopSubgraphCache.add_autograd_key_entry  s    NQr3   c                    g rq   r6   r.   r  s     r0   get_autograd_key_entry'HopSubgraphCache.get_autograd_key_entry  s    JMr3   c                    g rq   r6   r  s      r0   add_proxy_dispatch_entry)HopSubgraphCache.add_proxy_dispatch_entry  s    PSr3   c                    g rq   r6   r  s     r0   get_proxy_dispatch_entry)HopSubgraphCache.get_proxy_dispatch_entry  s    LOr3   c                    g rq   r6   )r.   r  tangent_metadatagmods       r0   add_lazy_bwd_entry#HopSubgraphCache.add_lazy_bwd_entry  s     r3   c                    g rq   r6   r.   r  r  s      r0   get_lazy_bwd_entry#HopSubgraphCache.get_lazy_bwd_entry  s     :=r3   r6   Nr  r<   r  rJ   rI   r  r  r<   rI   r  r  rJ   r  r   rI   r  r  rJ   rI   zCallable | Noner  rJ   r  tuple[object]r  ztorch.fx.GraphModulerI   r<   r  rJ   r  r  rI   z.tuple[torch.fx.GraphModule | None, int | None])rM   rN   rO   rP   r   r  r  r  r  r  r  r  r  rS   r6   r3   r0   r  r    s    V VK KQ QM MS SO O ( #	
 
  ==1>=	7= =r3   r  c                      \ rS rSrSS jrSS jrSS jrSS jrSS jrSS jr	SS jr
        SS	 jr      SS
 jrSS jrSS jrSrg)InvokeSubgraphCachei  c                ~    0 U l         0 U l        [        [        5      U l        [        [
        5      U l        0 U l        g rq   )autograd_cacheproxy_dispatch_cacher   listdynamo_installed_submodulesrZ  lazy_bwd_cacheeffects_cacherZ   s    r0   r7  InvokeSubgraphCache.__init__  s>    359;!ALTAR(  	
  	r3   c                @    U R                   U   R                  U5        g rq   )r  r	  r  s      r0   r  2InvokeSubgraphCache.add_dynamo_installed_submodule  s    ((/66zBr3   c                :    U R                   R                  U/ 5      $ rq   )r  getr  s     r0   r  3InvokeSubgraphCache.get_dynamo_installed_submodules  s    //33E2>>r3   c                     X R                   U'   g rq   )r  r  s      r0   r  *InvokeSubgraphCache.add_autograd_key_entry  s    *-J'r3   c                :    U R                   R                  US 5      $ rq   )r  r  r  s     r0   r  *InvokeSubgraphCache.get_autograd_key_entry  s    ""&&z488r3   c                     X R                   U'   g rq   )r  r  s      r0   r  ,InvokeSubgraphCache.add_proxy_dispatch_entry  s    03!!*-r3   c                :    U R                   R                  US 5      $ rq   )r  r  r  s     r0   r  ,InvokeSubgraphCache.get_proxy_dispatch_entry  s    ((,,Z>>r3   c                \    [        U R                  U   5      nX44U R                  U   U'   U$ rq   )r   r  )r.   r  r  r  	num_gmodss        r0   r  &InvokeSubgraphCache.add_lazy_bwd_entry  s8     ++J78	=A<MJ'(89r3   c                `    XR                   ;  a  gU R                   U   R                  US5      $ )N)NN)r  r  r  s      r0   r  &InvokeSubgraphCache.get_lazy_bwd_entry  s2     000"":.223C\RRr3   c           	         U R                   R                  US5      =n(       a  X#:w  a  [        SU SU SU S35      eX R                   U'   g)z>Store the effect types for a given invoke_subgraph identifier.NzPDifferent number of effects were found for invoke_subgraph call with identifier z,. 
Previously we had the following effects: z.
But now we have: .)r  r  r-   )r.   r  effectsprev_effectss       r0   add_effectsInvokeSubgraphCache.add_effects  sj    --11*dCC<C&$,,6< 8@@L~ N((/y3  *1:&r3   c                :    U R                   R                  US5      $ )zARetrieve the effect types for a given invoke_subgraph identifier.N)r  r  r  s     r0   get_effectsInvokeSubgraphCache.get_effects!  s    !!%%j$77r3   )r  r  r  r  r  Nr"  r  r  r  r  r  r  )r  rJ   r  rN  rI   r  )r  rJ   rI   z
set | None)rM   rN   rO   rP   r7  r  r  r  r  r  r  r  r  r  r  rS   r6   r3   r0   r  r    s|    	C?.94?		 (	 #		
 
	SS1>S	7S
18r3   r  c                  (    \ rS rSrSS jrSS jrSrg)HopDispatchSetCachei&  c                2    SSK Jn  U[        5       0U l        g )Nr   )invoke_subgraph)'torch._higher_order_ops.invoke_subgraphr  r  hop_cache_map)r.   r  s     r0   r7  HopDispatchSetCache.__init__'  s    K-/B/DEr3   c                @    XR                   ;  a  g U R                   U   $ rq   r  )r.   ops     r0   	get_cacheHopDispatchSetCache.get_cache-  s"    '''!!"%%r3   r  Nr"  )r  ztorch._ops.HigherOrderOperatorrI   zHopSubgraphCache | None)rM   rN   rO   rP   r7  r  rS   r6   r3   r0   r  r  &  s    F&r3   r  c                  n    \ rS rSr\S	S j5       r\S
S j5       rSS jr\SS j5       r\SS j5       r	Sr
g)CompileContextiH  c                 Z    [         R                  c  [        S5      e[         R                  $ )Nzcompile_context is not set)_TLScompile_contextr-   r6   r3   r0   r  CompileContext.getI  s&    ' !=>>###r3   c                 $    [        [        SS 5      $ Nr  getattrr  r6   r3   r0   try_getCompileContext.try_getO      t.55r3   c                    Ub,  [        U[        5      (       d  [        S[        U5       35      eXl        SU l        / U l        g )Nz*compile_id must be None or CompileId, got r   )r   r#   r-   r]  r@   rW   shape_env_guards)r.   r@   s     r0   r7  CompileContext.__init__S  sG    !*Z*K*K <T*=M<NO  -7+-r3   c                 J    [         R                  5       n U c  g U R                  $ rq   )r  r  r@   rZ   s    r0   current_compile_id!CompileContext.current_compile_id]  s"    %%'<r3   c                     [         R                  5       n U c  g U R                  c  g [        U R                  U R                  5      $ rq   )r  r  r@   rU   rW   rZ   s    r0   current_trace_idCompileContext.current_trace_idd  s:    %%'<??"t55r3   )rW   r@   r  N)rI   r  )rI   CompileContext | None)r@   rL   rI   r  )rI   rL   )rI   zTraceId | None)rM   rN   rO   rP   r  r  r  r7  r   r#  rS   r6   r3   r0   r  r  H  sU    $ $
 6 6.   6 6r3   r  c                  V   \ rS rSrSr\SS j5       r\SS j5       rSS jrSS jr	\\
SS j5       5       r\SS j5       rSS	 jr\\R                  SS
 j5       5       r\\R                      SS j5       5       r\\R                  SS j5       5       r\SS j5       r\SS j5       rSrg)r  in  z
Provides the currently installed TracingContext, or None.

Note that it is a staticmethod, and invocations outside of `with tracing()` (see below), are valid but
will return None.
c                 $    [        [        SS 5      $ )Ntracing_contextr  r6   r3   r0   r  TracingContext.try_getv  r  r3   c                 R    [         R                  5       =n (       a  U $ [        S5      e)Nz<TracingContext.get() must be called within an ongoing trace.)r  r  RuntimeError)ctxs    r0   r  TracingContext.getz  s+     ((**3*JJ
 	
r3   c                   [        5       U l        [        5       U l        [	        5       U l        [        5       U l        [        5       U l        Xl	        / U l
        S U l        S U l        S U l        S U l        S U l        S U l        S U l        S U l        SU l        [)        5       U l        SU l        [/        5       U l        / U l        g r@  )r  guards_contextrV  module_contextrm  global_contextrZ  previously_inlined_functionspreviously_cleaned_instructions	fake_modeframe_summary_stackloc_in_framefw_metadataddp_optimizer_ctxaot_graph_nameparams_flatparams_flat_unwrap_subclassesparams_unwrapped_to_flat_indexoutput_strides#force_unspec_int_unbacked_size_liker   tensor_to_contextfakify_first_callr  hop_dispatch_set_cachetraced_code)r.   r4  s     r0   r7  TracingContext.__init__  s    +o+o+o<@F)?Cv,09AC  :>7;=A04-1?C*@D+ DH 490!8!:
 "'&9&;#+-r3   c                    0 U R                   l        U R                  R                  5         U R                  R                  5         g rq   )r1  rc  r2  clearr3  rZ   s    r0   rE  TracingContext.clear  s6     ,.())//1,,224r3   c               +  V  #    0 n[         R                  5       nU  H  n[        X#5      X'   M     U R                  5        H  u  p4[	        X#U5        M      S v   UR                  5        H  u  p4[	        X#U5        M     g ! UR                  5        H  u  p4[	        X#U5        M     f = f7frq   )r  r  r  r;   setattr)kwargspriorr,  r  vals        r0   patchTracingContext.patch  s        "C *EJ  HCCc" '	'!KKM#& *EKKM#& *s   AB)A? &B)?'B&&B)c                     [         R                  5       n U c  [        R                  " 5       $ U R                  nU R
                  b  XR                  5       /-   n[        R                  R                  U5      $ rq   )r  r  	tracebackStackSummaryr5  r6  _populate_loc_in_frame_summary	from_list)r.   r   s     r0   r  TracingContext.extract_stack  sf    %%'<))++(((@@BCCE%%//66r3   c                |    U R                   c  [        S5      eU R                   u  pn[        R                  " XUSS9$ )Nzloc_in_frame must not be NoneF)lookup_line)r6  r-   rO  FrameSummary)r.   filenamelineno
frame_names       r0   rQ  -TracingContext._populate_loc_in_frame_summary  s@    $ !@AA'+'8'8$*%%h
PUVVr3   c               #    #    [         R                  5       n [        R                  R                  R                  U S/ 5         [        R                  R                  R                  U SS 5          S v    S S S 5        S S S 5        g ! [         a  n[        US5      (       d  S Ul        e S nAff = f! , (       d  f       NB= f! , (       d  f       g = f7f)Nr5  r6  
real_stack)	r  r  unittestmockrL  r  r>   hasattrr\  )tcrE   s     r0   clear_frameTracingContext.clear_frame  s      !MM&&r+@"EMM&&r>4@ A FE
  $ q,//#'AL)	 A@ FEsT   A C,C.B10B5C=	C
B.B))B..B11
B?	;C
CCc              #    #    [         R                  5       nU b  UR                  R                  U 5        UR                  nS Ul         S v    U b  UR                  R                  5         X!l        g ! [
         a,  n[        US5      (       d  UR                  5       Ul        e S nAff = f! U b  UR                  R                  5         X!l        f = f7f)Nr\  )
r  r  r5  r	  r6  r>   r_  r  r\  pop)frame_summaryr`  oldrE   s       r0   current_frameTracingContext.current_frame  s      !$""))-8oo		" (&&**,!O  	1l++!//1	
 (&&**,!Os6   AC	A2 $C2
B(<'B##B((B+ +%CCc               #     #    [         R                  5       n U c  S v   g U R                  n/ U l         U R                  v   Xl        g ! Xl        f = f7frq   )r  r  r=  )r`  old_output_stridess     r0   report_output_strides$TracingContext.report_output_strides  sT     
 ##%:J..	3### 2 2s   0AA AAAc                :    XU4[         R                  5       l        g rq   )r  r  r6  )rW  rX  rY  s      r0   set_current_locTracingContext.set_current_loc&  s     .6z,J)r3   c                 J    [         R                  5       n U c  g U R                  $ rq   )r  r  rB  )r`  s    r0   get_traced_codeTracingContext.get_traced_code,  s"    ##%:~~r3   )r9  r8  r4  r@  r>  r5  r7  r1  r/  rA  r6  r0  r=  r:  r;  r<  r3  r2  r?  rB  N)rI   TracingContext | None)rI   r  )r4  FakeTensorMode | NonerI   r  r"  )rI  r   rI   Generator[None, None, None])rI   ztraceback.StackSummary)rI   ztraceback.FrameSummary)rI   ru  )re  ztraceback.FrameSummary | NonerI   ru  )rI   z:Generator[list[tuple[int, ...] | None] | None, None, None])rW  rJ   rX  r<   rY  rJ   rI   r  )rI   zlist[CodeType] | None)rM   rN   rO   rP   rE  r  r  r  r7  rE  r   rL  r  rQ  
contextlibra  rg  rk  rn  rq  rS   r6   r3   r0   r  r  n  s    6 6 
 
1.f5 '  ' 7 7W   < "4"	$"  "* 3  3 K K
  r3   r  c              #     #    [        [        SS 5      nU [        l         U v   U[        l        g ! U[        l        f = f7fr  )r  r  r  )contextold_contexts     r0   r  r  4  s8      $ 148K"D+*{s   A 0 A =A c              #  *  #    [        [        SS5      nU [        l         U v    U bH  U R                  b;  U R                  R                  b$  U R                  R                  R                  5         U[        l        g! [         a/  n[	        US5      (       d  U b  U R                  5       Ul        e SnAff = f! U bH  U R                  b;  U R                  R                  b$  U R                  R                  R                  5         U[        l        f = f7f)z
This function installs the passed in tracing context as a dynamic scoped
global variable.

Calls to TracingContext.get() while not under a `with tracing()` context
will return None.
r(  Nr\  )
r  r  r(  r>   r_  r  r\  r4  	shape_envcleanup)rx  ry  rE   s      r0   tracingr}  @  s      $ 148K"D+ !!-!!++7''//1*  q,''G,?"002AL !!-!!++7''//1*s5   DA< AD<
B5*B00B55B8 8ADDc                    g rq   r6   r?   rI  s     r0   dataclass_with_cached_hashr  ]  r  r3   c                    g rq   r6   r  s     r0   r  r  a  s     $'r3   c                .   ^ SU4S jjnU c  U$ U" U 5      $ )Nc                ~   >^ [         R                  " U 40 TD6nU R                  mSU4S jjnS nX!l        X1l        U$ )Nc                x   > [        U S5      (       d  [        R                  U ST" U 5      5        U R                  $ )Nr   )r_  r  __setattr__r   )r.   old_hashs    r0   r   :dataclass_with_cached_hash.<locals>.wrap.<locals>.__hash__o  s0    4))""4(4.A::r3   c                v   ^  [         R                  " T 5      n[        U 4S jU 5       5      nT R                  U4$ )Nc              3  P   >#    U  H  n[        TUR                  5      v   M     g 7frq   )r  r   )r  fr.   s     r0   r  Odataclass_with_cached_hash.<locals>.wrap.<locals>.__reduce__.<locals>.<genexpr>y  s      G1qvv!6!6s   #&)dataclassesfieldstupler   )r.   r  field_valuess   `  r0   
__reduce__<dataclass_with_cached_hash.<locals>.wrap.<locals>.__reduce__t  s4     !''-F  G GGLNNL11r3   r  )r  r   r   r  )	cls_innernew_clsr   r  r  rI  s       @r0   wrap(dataclass_with_cached_hash.<locals>.wrapk  s@    ''	<V<%%	
	2 $'r3   )r  type[T]rI   r  r6   )r?   rI  r  s    ` r0   r  r  g  s    * {9r3   c                      \ rS rSrSS jrSS jrSS jr\R                  SS j5       r	\
SS j5       r\R                  SS j5       r        SS jrSS	 jrSS
 jrSS jrSrg)r   i  c                    gr@  r6   rZ   s    r0   is_dict_keySource.is_dict_key      r3   c                    gr@  r6   rZ   s    r0   is_ephemeralSource.is_ephemeral  r  r3   c                    [         erq   NotImplementedError)r.   codegens     r0   reconstructSource.reconstruct  s    !!r3   c                    [         erq   r  rZ   s    r0   r   Source.guard_source  s    !!r3   c                    [         e)a  
A template for the name of the source. Used to prevent code duplication between
`name` and `get_value`.

For non-ChainedSources, `name` and `get_value` use the returned string directly.

For ChainedSources, `name` and `get_value` expect the return to be a format string
with `{0}` present - `name` and `get_value` will apply different values to this function's
returned format string.
r  rZ   s    r0   _name_templateSource._name_template  s
     "!r3   c                    U R                   $ rq   )r  rZ   s    r0   r   Source.name  s    """r3   c                L    X;   a  X0   $ [        U R                  X5      nXCU '   U$ rq   )evalr  )r.   globalslocalscacher   s        r0   	get_valueSource.get_value  s/     =;T((':dr3   c                ^    U R                   [        R                  L a  [        e[	        X5      $ rq   )r   r^   r   r  r   )r.   fns     r0   
make_guardSource.make_guard  s&     4 44%%Tr3   c                6    U R                   R                  5       $ rq   )r   r}   rZ   s    r0   r}   Source.is_specialized_nn_module  s      99;;r3   c                <    U R                   [        R                  :g  $ )z+True if you can guard on attributes of this)r   r^   r   rZ   s    r0   subguards_allowedSource.subguards_allowed  s      K$?$???r3   r6   Nr   )r  r   rI   r  r  rH   r  dict[str, Any]r  r  r  z&weakref.WeakKeyDictionary[Source, Any]rI   r   )r  zCallable[..., Any]rI   r   )rM   rN   rO   rP   r  r  r  r   cached_propertyr   r  r  r   r  r  r}   r  rS   r6   r3   r0   r   r     s    " " " " " # #

 
 6	

 


<@r3   r   c                      \ rS rSr% S\S'   SS jrSS jr\R                  SS j5       r	SS jr
\R                  SS j5       r        SS	 jrS
rg)ChainedSourcei  r   basec                6    U R                   R                  5       $ rq   )r  r  rZ   s    r0   r  ChainedSource.is_dict_key  s    yy$$&&r3   c                6    U R                   R                  5       $ rq   )r  r  rZ   s    r0   r  ChainedSource.is_ephemeral  s    yy%%''r3   c                .    U R                   R                  $ rq   )r  r   rZ   s    r0   r   ChainedSource.guard_source  s    yy%%%r3   c                z    U n[        U[        5      (       a#  UR                  n[        U[        5      (       a  M#  U$ rq   )r   r  r  )r.   currents     r0   get_baseChainedSource.get_base  s1    -00llG -00r3   c                `    U R                   R                  U R                  R                  5      $ rq   )r  r   r  r   rZ   s    r0   r   ChainedSource.name  s!    ""))$))..99r3   c                    X;   a  X0   $ SnSnXB;   a  SU 3nUS-  nXB;   a  M  U R                   R                  XU5      X$'   [        U R                  R	                  U5      X5      nX$	 XcU '   U$ )Ntmpr   r`   )r  r  r  r  r   )r.   r  r  r  tmpvarcounterr   s          r0   r  ChainedSource.get_value  s     =;7)_FqLG  ,,WeDT((//7INdr3   r6   Nr   r  )rI   r   rH   r  )rM   rN   rO   rP   rQ   r  r  r   r  r   r  r   r  rS   r6   r3   r0   r  r    su    
L'( & & : :  6	
 
r3   r  c                   SSK JnJnJn  [        R                  5       =n(       a  UR                  nUb  U$ / nSSKJn  [        [        U" 5       5      5       H+  u  p[        X5      (       d  M  UR                  U	SU45        M-     [        R                  " U 5      n
[        U
5       H  u  p[        X5      (       a  UR                  UR                  SU45        [        U5      (       d  ME  / nU" XS9  U Vs/ s H  n[        X5      (       d  M  UPM     nnUR!                  [        U5       VVs/ s H  u  nnUR                  SU 3U4PM     snn5        M     U(       ab  US   u  nnnUS	S  HN  u  n	nnXYLd  M  [#        S
U SU SU SU	 SU SU SU SU SUR$                   SU SU SU	R$                   35      e   U$ gs  snf s  snnf )ax  
Attempts to "detect" what the current fake mode is.  If there is one ambiently
available from TracingContext, we preferentially use that.  Otherwise, we
heuristically detect the fake mode via the following sources, in order of
priority:

    - Currently active fake mode on stack
    - Fake mode associated with passed in tensors (inputs does not
      have to be flattened)
r   )
FakeTensorr   get_plain_tensorsN _get_current_dispatch_mode_stackzactive fake modezfake tensor input)outzsubclass input r`   zfake mode (z) from r   z doesn't match mode (z

fake mode from z allocated at:
z
fake mode from )torch._subclasses.fake_tensorr  r   r  r  r  r4  torch.utils._python_dispatchr  	enumeratereversedr   r	  pytreetree_leavesr   r
  r-   r   )inputsr  r   r  rx  r4  
fake_modesr  imflat_inputs
flat_inputr  xfake_tensorsixtensordesc1i1desc2i2s                        r0   detect_fake_moder    s     !((**w*%%	 JM(#C#EFGa((q"4a89 H $$V,K";/j--z335H!LM(44;=Cj2.a*Q";3  .  '0&=&=
F %%'<bA&= 0  )!}	5"&qrNLAub!$!)GE7!B4?TUVTWW^_d^eefgifj k&&+WAbT1A)//AR S&&+WAbT1A!''L  + -.s   9GG2Gc                     SSK Jn   SSKJn  [	        [        U" 5       5      5       H  u  p#[        X05      (       d  M  Us  $    g)zr
Inspects the dispatch mode stack for an active fake mode and returns it.
Returns None if no fake mode is active.
r   r   r  N)r  r   r  r  r  r  r   )r   r  rY   r  s       r0   active_fake_moder  1  s:    
 =M(#C#EFGa((H H r3   )rx  r%  rI   z,Generator[CompileContext | None, None, None])rx  rs  rI   z,Generator[TracingContext | None, None, None])r?   r  rI  r   rI   r  rq   )r?   r  rI  r   rI   zCallable[[type[T]], type[T]])r?   ztype[T] | NonerI  r   rI   z&type[T] | Callable[[type[T]], type[T]])r  r   rI   rt  )rI   rt  )a
__future__r   rv  r  enumr   loggingre	threadingrO  unittest.mockr]  r   abcr   collectionsr   r   r   typingr   r	   r
   r   r   r   r   typing_extensionsr   r   torch.utilsr   r  torch.utils._ordered_setr   r  r   torch.utils._tracebackr   r   torch.utils.weakr   	getLoggerrM   r   collections.abcr   r   r   typesr   sympy"torch._dynamo.backends.distributedr   torch._dynamo.codegenr   &torch._functorch._aot_autograd.schemasr   r  r   compiler7   r8   r#   rU   Enumr^   r   r   r   r   r  r  r  r$  r(  r2  rG  rV  ra  rm  r~  r  r  r  r  localr  r  r  r  r}  r  r   r  r  r  r6   r3   r0   <module>r     s   "      	      # % ! W W W 1  ) / F B 4 ! ==F/J< ZZ PQ 

X " $D17J 7J 27Jt7j 7<
$)) <
~	 	 d#  $   T"u' u' #u'p CL d#	 	 $	 d#	l 	 $	 d#*\ * $*

8WQZ 8( (8( (0+N#?@ +( (0$N#?@ $R,
 ,
^<N#89 <= =B?8* ?8D
& 
& &#6 #6LC CL +"+1+ + +"+1+ +8 
 K 
 K 
'	' #'!' 
'
 	*-+ @ 4(6@ 6@ )6@t 4()F ) ))X>Br3   