+
    &jz                        ^ RI t ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIHu Hu H	t
 ^ RIHt ^ RIHt ^ RIHt ^ RIHtHtHtHtHtHt ^ RIHtHtHtHtHtHtHtHt ^ RI H!t!H"t" ^ RI#H$t$ ^RI%H&t&H't'H(t( . R Ot)]t*R	]PV                  ]PX                  PV                  ]PZ                  ]PX                  PZ                  /R
]PX                  PV                  ]P                  PV                  ]PX                  PZ                  ]P                  PZ                  //t.R t/R!R lt0R"R lt1R t2R t3R#R lt4R$R lt5R t6R t7]Pp                  ! ]&4      R%R l4       t9R t:R t;]Pp                  ! ]&4      R&R l4       t<]Pp                  ! ]&4      R]Pz                  RR3R l4       t>]Pp                  ! ]&4      R&R l4       t?]Pp                  ! ]&4      R#R l4       t@]Pp                  ! ]&4      R'R l4       tAR(R ltBR#R ltCR)R ltDR# )*    N)_FusedModule)_is_activation_post_process)_activation_is_memoryless_add_module_to_qconfig_obs_ctrdefault_dynamic_qconfigfloat16_dynamic_qconfig!float_qparams_weight_only_qconfig&float_qparams_weight_only_qconfig_4bit)_get_special_act_post_process_has_special_act_post_process)get_default_dynamic_quant_module_mappingsget_default_qat_module_mappings$get_default_qconfig_propagation_list(get_default_static_quant_module_mappings2get_default_static_quant_reference_module_mappingsno_observer_set)DeQuantStubQuantWrapper)type_before_parametrizations)DEPRECATION_WARNINGget_qparam_dict)has_no_children_ignoring_parametrizations%float_to_observed_custom_module_class)observed_to_quantized_custom_module_classc                     \         # )z'Defines the default custom config dict.)_DEFAULT_CUSTOM_CONFIG_DICT     v/Users/jameslopez/projects/CWCArchive/cwc-podcast/.venv/lib/python3.14/site-packages/torch/ao/quantization/quantize.pyget_default_custom_config_dictr    G   s    &&r   c                   VP                  \        V 4      V4      pVP                  W54      p\        V RV4      p\        P                  P
                  P                  P                  WP4       \        WP4      pW`n        V P                  4        Fi  w  rxV'       d   VR,           V,           MTp	Ve;   WtP                  R. 4      9   d   K;  \        V4      VP                  R. 4      9   d   K]  \        WWi4       Kk  	  R# )a  This is a helper function for `propagate_qconfig_`

Args:
    module: input module
    qconfig_dict: dictionary that maps from name of submodule to quantization
                 configuration
    qconfig_parent: quantization config of parent module, we will fallback to
                   this config when there is no specified config for current
                   module
    prefix: corresponding prefix of the current module, used as key in
            qconfig_dict
    prepare_custom_config_dict: dictionary for custom handling of modules
                                see docs for :func:`~torch.ao.quantization.prepare_fx`

Return:
    None, module is modified inplace with qconfig attached
qconfig.Nnon_traceable_module_namenon_traceable_module_class)getr   getattrtorchaoquantizationr"   _assert_valid_qconfigr   named_childrentype_propagate_qconfig_helper)
moduleqconfig_dictqconfig_parentprefixprepare_custom_config_dictmodule_qconfigqconfig_with_device_checknamechildmodule_prefixs
   &&&&&     r   r.   r.   L   s    2 "%%$V,nN "%%f=NVY?N	HH!!77O >~ V.N,,./5t+4%-223NPRSSE{)--.JBOP &%> /r   c                8    Vf   / pVf   / p\        WVR7       R# )ac  Propagate qconfig through the module hierarchy and assign `qconfig`
attribute on each leaf module

Args:
    module: input module
    qconfig_dict: dictionary that maps from name or type of submodule to
        quantization configuration, qconfig applies to all submodules of a
        given module unless qconfig for the submodules are specified (when
        the submodule already has qconfig attribute)
    prepare_custom_config_dict: dictionary for custom handling of modules
        see docs for :func:`~torch.ao.quantization.prepare_fx`

Return:
    None, module is modified inplace with qconfig attached
N)r3   )r.   )r/   r0   r3   s   &&&r   propagate_qconfig_r:   }   s)      !)%'"9Sr   c                $    V P                  V4      # )z.Forward hook that calls observer on the outputactivation_post_process)selfinputoutputs   &&&r   _observer_forward_hookrA      s    ''//r   c                2    V P                  V^ ,          4      # )z2Forward pre hook that calls observer on the outputr<   )r>   r?   s   &&r   _observer_forward_pre_hookrC      s    ''a11r   Fc                     \        V R 4      '       g   \        R4      hV'       d   V P                  \        RR7       R# V P	                  \
        RR7       R# )r=   zGExpect activation_post_process attribute already attached to the moduleT)prependN)hasattrAssertionErrorregister_forward_pre_hookrC   register_forward_hookrA   )r/   pre_hooks   &&r   &_register_activation_post_process_hookrK      sM    6455U
 	
 (()CT(R$$%;T$Jr   c                  aaa Vf   \        4       pVf   / pSfP   \        V 4      p\        V4      ^8  d   \        RV 24      h\        V4      ^ 8  d   \	        \        V4      4      MRoR
R loR oR
VVV3R llpV P                  4        EF  w  rx\        V4      \        P                  J d   K%  \        \        V4      \        P                  \        P                  34      '       dU   S! V4      '       dE   \        VR4      '       g   \        R\        V4       R24      hS! VP                  S4      Vn        K  K  \#        V\$        4      '       d   S! V4      '       d   V! V4       K  K  Ve-   \        V4      V9   d   S! V4      '       d   V! V4       EK  EK  \'        V4      '       d   \)        V4      p	V! W4       EK9  S! V4      '       dq   \        V4      V9   da   V\        V4      ,          p
V
P+                  V4      p\-        WV4       \        V
\/        \1        4       4      4      '       g   V! V4       EK  EK  \3        VVVSV4       EK  	  \5        V 4      '       dC   \#        V \6        P                  P8                  4      '       g   \        V 4      V9   d	   V! V 4       \        V R	4      '       dI   \#        V \6        P                  P8                  4      '       g   \        V 4      V9   d   V! V 4       R# R# R# R# )aG  Add observer for the leaf child of the module.

This function insert observer module to all leaf child module that
has a valid qconfig attribute.

Args:
    module: input module with qconfig attributes for all the leaf modules that we want to quantize
    qconfig_propagation_list: a list of quantizable modules that will have observers added to them
        if they are leaf nodes
    device: parent device, if any
    non_leaf_module_list: list of non-leaf modules we want to add observer

Return:
    None, module is modified inplace with added observer modules and forward_hooks
NzR_add_observer_ only works with cpu or single-device CUDA modules, but got devices c                 f    Vf   V P                  4       MV! 4       pVe   VP                  V4       V# N)
activationto)r"   devicespecial_act_post_processrO   s   &&& r   get_activation_post_process3_add_observer_.<locals>.get_activation_post_process   s=     (/  )+ 	
 MM&!r   c                 F    \        V R 4      ;'       d    V P                  RJ# r"   NrF   r"   )ms   &r   needs_observation)_add_observer_.<locals>.needs_observation   s     q)$>>$)>>r   c                   < S! V 4      '       d_   \        V \        4      '       gG   V P                  RS! V P                  SV4      4       \	        V \        V P                  4      R7       R# R# R# )z]Adds an activation post process module and register
a pre or post hook that calls the module
r=   rJ   N)
isinstancer   
add_moduler"   rK   r   )rX   rR   rQ   rS   rY   s   &&r   insert_activation_post_process6_add_observer_.<locals>.insert_activation_post_process   sa    
 Q
1k(B(BLL)+IIv'? 35aii@ )Cr   r=   zfunctional class z- has no pre-defined `activation_post_process`weight_fake_quantrN   )r   _get_unique_devices_lenrG   nextiterr,   r   nnDropout
issubclassnnqFloatFunctionalQFunctionalrF   r"   r=   r]   r   r   r   
from_floatsetattrtupler   _add_observer_r   r(   
Sequential)r/   qconfig_propagation_listnon_leaf_module_listrQ   custom_module_class_mappingdevicesr_   r6   r7   rR   observed_classobserved_childrS   rY   s   &&&f&       @@r   ro   ro      s   ,  '#G#I "*&(# ~&v.w<! deldmn  ),Gq(8d7m$d? & ,,.'."**<(/#2E2Es1W
 
 !''u&?@@(+,H,O+PP}~  1LMM61- ( |,, ''.u5 ( !,,U37KK ''.u5 (*511'DU'K$*5Ke$$,U37RR8,U3N ,66u=NF.1 neO4E.FGG.~> H ($+U /j 	2&996588#6#677(04LL&v. 	+,,6588#6#677(04LL&v. M 8 	-r   c                 8   V P                  4        Uu0 uF+  qP                  P                  R 8w  g   K  VP                  kK-  	  upV P                  4        Uu0 uF+  qP                  P                  R 8w  g   K  VP                  kK-  	  up,          # u upi u upi )meta)
parametersrQ   r-   buffers)r/   ps   & r   rb   rb   6  sy    $//1M1XX]]f5LHAHH1M ..*Q*Qhhmmv.E*Q  M Qs   BBB9Bc                    \        V 4      '       d0   \        V R4      '       d   V P                  '       d   \        V 4      # V P	                  4        F  w  r\        V4      V P                  V&   K  	  V # )aO  Wrap the leaf child module in QuantWrapper if it has a valid qconfig
Note that this function will modify the children of module inplace and it
can return a new module which wraps the input module as well.

Args:
    module: input module with qconfig attributes for all the leaf modules
    that we want to quantize

Return:
    Either the inplace modified module with submodules wrapped in
    `QuantWrapper` based on qconfig or a new `QuantWrapper` module which
    wraps the input module, the latter case only happens when the input
    module is a leaf module and we want to quantize it.
r"   )r   rF   r"   r   r,   add_quant_dequant_modules)r/   r6   r7   s   &  r   r}   r}   <  s]      	2&99FI&&NNNF##,,. 1% 8 /Mr   c                   \         P                  P                  R4       Vf   \        4       pVP	                  R/ 4      pV'       g   \
        P                  ! V 4      p TpVf   \        4       p\        V RR7       \        ;QJ d*    R V P                  4        4       F  '       g   K   RM	  RM! R V P                  4        4       4      '       g   \        P                  ! R^R	7       \        V VVVR
7       V # )a  Prepares a copy of the model for quantization calibration or quantization-aware training.

Quantization configuration should be assigned preemptively
to individual submodules in `.qconfig` attribute.

The model will be attached with observer or fake quant modules, and qconfig
will be propagated.

Args:
    `model`: input model to be modified in-place
    `inplace`: carry out model transformations in-place, the original module is mutated
    `allow_list`: list of quantizable modules
    `observer_non_leaf_module_list`: list of non-leaf modules we want to add observer
    `prepare_custom_config_dict`: customization configuration dictionary for prepare function

.. code-block:: python

   # Example of prepare_custom_config_dict:
   prepare_custom_config_dict = {
       # user will manually define the corresponding observed
       # module class which has a from_float class method that converts
       # float custom module to observed custom module
       "float_to_observed_custom_module_class": {CustomModule: ObservedCustomModule}
   }

z!quantization_api.quantize.prepareNr   r0   c              3   b   "   T F%  p\        VR 4      ;'       d    VP                  x  K'  	  R# 5irV   rW   ).0rX   s   & r   	<genexpr>prepare.<locals>.<genexpr>  s&     LOqwq)$222Os   //TFzNone of the submodule got qconfig applied. Make sure you passed correct configuration through `qconfig_dict` or by assigning the `.qconfig` attribute directly on submodules)
stacklevel)rs   )r(   _C_log_api_usage_oncer    r&   copydeepcopyr   r:   anymoduleswarningswarnro   )modelinplace
allow_listobserver_non_leaf_module_listr3   rs   rq   s   &&&&&  r   preparer   W  s    D 
HH  !DE!)%C%E""<"@"@/# e$  *#G#I u40 3LEMMOL333LEMMOLLLK 		
  %$?	 Lr   c                    a  \        S R 4      '       d(   \        S P                  4      '       d   \        S R 4       RV 3R llpV! RR7       V! RR7       R# )r=   Fc                   < V '       d   SP                   MSP                  pV '       d   \        M\        p\	        4       pVP                  4        F  w  rEWRJ g   K  VP                  V4       K  	  V F  pVP                  V4       K  	  R # rN   )_forward_pre_hooks_forward_hooksrC   rA   setitemsaddpop)rJ   hook_mapobserver_hookhandle_ids_to_remove	handle_idhook_fnr/   s   &     r   remove_hooks5_remove_activation_post_process.<locals>.remove_hooks  sp    086,,f>S>S*2&8N 	  #u"*.."2I'$((3 #3 .ILL# .r   Tr\   NF)rF   r   r=   delattr)r/   r   s   f r   _remove_activation_post_processr     sM     v0116Q&&7 7 	12
$ $% r   c                    V P                  4        F  p\        V4       K  	  \        V R4      '       d   V =\	        V 4       R# )zzClean up the qconfig left in the module so that new qconfig can be
propagated.

Args:
    module: module to be cleaned up
r"   N)children_remove_qconfigrF   r"   r   )r/   r7   s   & r   r   r     s9     " # vy!!N#F+r   c                   \         P                  P                  R4       Vf   \        4       pV'       g   \        P
                  ! V 4      p V P                  4        \        V RR7       V! V .VO5!   \        WRR7       V # )aS  Quantize the input float model with post training static quantization.

First it will prepare the model for calibration, then it calls
`run_fn` which will run the calibration step, after that we will
convert the model to a quantized model.

Args:
    model: input float model
    run_fn: a calibration function for calibrating the prepared model
    run_args: positional arguments for `run_fn`
    inplace: carry out model transformations in-place, the original module is mutated
    mapping: correspondence between original module types and quantized counterparts

Return:
    Quantized model.
z"quantization_api.quantize.quantizeTr   )	r(   r   r   r   r   r   evalr   convert)r   run_fnrun_argsmappingr   s   &&&&&r   quantizer     sd    $ 
HH  !EF:<e$	JJLE4 
58ED)Lr   c                   \         P                  P                  R4       VEf   V\         P                  8X  d}   \        P
                  \        \        P                  \        \        P                  \        \        P                  \        \        P                  \        \        P                  \        /pEMV\         P                  8X  d}   \        P
                  \        \        P                  \        \        P                  \        \        P                  \        \        P                  \        \        P                  \        /pEM;V\         P                  8X  d,   \        P                  \         \        P"                  \         /pMV\         P$                  8X  d   \        P                  \&        /pM\)        RV R24      h\+        V\,        4      '       d   V\         P                  J d   \        pMfV\         P                  J d   \        pMKV\         P                  J d   \         pM0V\         P$                  J d   \&        pM\/        R\1        V4      4      h\3        \5        V\6        P8                  ! V4      4      4      pVf   \;        4       pV'       g   \<        P>                  ! V 4      p V PA                  4        \C        W4       \E        WRR7       V # )a*  Converts a float model to dynamic (i.e. weights-only) quantized model.

Replaces specified modules with dynamic weight-only quantized versions and output the quantized model.

For simplest usage provide `dtype` argument that can be float16 or qint8. Weight-only quantization
by default is performed for layers with large weights size - i.e. Linear and RNN variants.

Fine grained control is possible with `qconfig` and `mapping` that act similarly to `quantize()`.
If `qconfig` is provided, the `dtype` argument is ignored.

Args:
    model: input model
    qconfig_spec: Either:

        - A dictionary that maps from name or type of submodule to quantization
          configuration, qconfig applies to all submodules of a given
          module unless qconfig for the submodules are specified (when the
          submodule already has qconfig attribute). Entries in the dictionary
          need to be QConfig instances.

        - A set of types and/or submodule names to apply dynamic quantization to,
          in which case the `dtype` argument is used to specify the bit-width

    inplace: carry out model transformations in-place, the original module is mutated
    mapping: maps type of a submodule to a type of corresponding dynamically quantized version
        with which the submodule needs to be replaced

z*quantization_api.quantize.quantize_dynamicz5Don't know how to quantize with default settings for z. Provide full qconfig pleasez.Unknown dtype specified for quantize_dynamic: Tr   )#r(   r   r   qint8rf   Linearr   LSTMGRULSTMCellRNNCellGRUCellfloat16r   quint8EmbeddingBagr	   	Embeddingquint4x2r
   
ValueErrorr]   r   RuntimeErrorstrdictzip	itertoolsrepeatr   r   r   r   r:   r   )r   qconfig_specdtyper   r   default_qconfigs   &&&&& r   quantize_dynamicr     s   @ 
HH  !MNEKK		20/4

3

3L emm#		20/4

3

3L ell"!B?L enn$!GL GwNkl  
L#	&	&EKK5Oemm#5Oell"?Oenn$DO@#e*  Ci.>.>.OPQ;=e$	JJLu+ED)Lr   c                V   \         P                  P                  R4       V P                  '       g   \	        R4      hVf   \        4       pV'       g   \        P                  ! V 4      p \        V RR7       \        WRRR7       \        V \        VP                  4       4      RR7       V # )	a  
Prepares a copy of the model for quantization calibration or
quantization-aware training and converts it to quantized version.

Quantization configuration should be assigned preemptively
to individual submodules in `.qconfig` attribute.

Args:
    model: input model to be modified in-place
    mapping: dictionary that maps float modules to quantized modules to be
             replaced.
    inplace: carry out model transformations in-place, the original module
             is mutated
z%quantization_api.quantize.prepare_qatz1prepare_qat only works on models in training modeNr   TF)r   r   remove_qconfig)r   r   )r(   r   r   trainingrG   r   r   r   r:   r   r   r   values)r   r   r   s   &&&r   prepare_qatr   >  s~      
HH  !HI>>>PQQ13e$u40EDGEW^^5E1FPTULr   c                    \         P                  P                  R4       V'       g   \        P                  ! V 4      p V P                  4        \        V RR7       V! V .VO5!   \        V RR7       V # )aC  Do quantization aware training and output a quantized model

Args:
    model: input model
    run_fn: a function for evaluating the prepared model, can be a
            function that simply runs the prepared model or a training
            loop
    run_args: positional arguments for `run_fn`

Return:
    Quantized model.
z&quantization_api.quantize.quantize_qatTr   )r(   r   r   r   r   trainr   r   )r   r   r   r   s   &&&&r   quantize_qatr   ]  sW     
HH  !IJe$	KKMt$
58E4 Lr   c           	         \         P                  P                  R4       V'       g   \        P                  ! V 4      p \        V VRVVVR7       V'       d   \        V 4       V # )ad  Converts submodules in input module to a different module according to `mapping`
by calling `from_float` method on the target module class. And remove qconfig at the
end if remove_qconfig is set to True.

Args:
    `module`: prepared and calibrated module
    `mapping`: a dictionary that maps from source module type to target
               module type, can be overwritten to allow swapping user defined
               Modules
    `inplace`: carry out model transformations in-place, the original module
               is mutated
    `convert_custom_config_dict`: custom configuration dictionary for convert function
    `use_precomputed_fake_quant`: a flag to enable use of precomputed fake quant

.. code-block:: python

   # Example of convert_custom_config_dict:
   convert_custom_config_dict = {
       # user will manually define the corresponding quantized
       # module class which has a from_observed class method that converts
       # observed custom module to quantized custom module
       "observed_to_quantized_custom_module_class": {
           ObservedCustomModule: QuantizedCustomModule
       }
   }

z!quantization_api.quantize.convertT)r   is_referenceconvert_custom_config_dictuse_precomputed_fake_quant)r(   r   r   r   r   _convertr   )r/   r   r   r   r   r   r   s   &&&&&&&r   r   r   u  sU    J 
HH  !DEv&!#=#= Mr   c           
        Vf   V'       d   \        4       M	\        4       pVf   \        4       pVP                  R/ 4      pV'       g   \        P
                  ! V 4      p / pV P                  4        FJ  w  r\        V	\        4      '       g"   \        V	4      V9  d   \        V	VRVVVR7       \        WWe4      Wx&   KL  	  VP                  4        F  w  rWP                  V
&   K  	  V # )aC  Converts submodules in input module to a different module according to `mapping`
by calling `from_float` method on the target module class

Args:
    module: input module
    mapping: a dictionary that maps from source module type to target
             module type, can be overwritten to allow swapping user defined
             Modules
    inplace: carry out model transformations in-place, the original module
             is mutated
    is_reference: a flag to enable quantized reference module
    use_precomputed_fake_quant: a flag to enable use of precomputed fake quant

r   Tr   )r   r   r    r&   r   r   r,   r]   r   r   r   swap_moduler   r~   )r/   r   r   r   r   r   rs   reassignr6   modkeyvalues   &&&&&&      r   r   r     s    ,   ?@9; 	
 ")%C%E""<"@"@3R# v&H**,	 3--,S19TT*+E %5
 -& nn&
$ ' Mr   c                   T p\        V R4      '       EdQ   V P                  EeB   Rp\        V 4      V9   d%   V\        V 4      ,          P                  V 4      pRpM\        V 4      V9   d   V\        V 4      ,          p\        VR4      '       du   VP                  '       dc   V P                  f   \        R4      hV P                  P                  4       pV! V P                  4       \        V4      pVP                  W4      pMU\        P                  ! VP                  4      p	RV	P                  9   d   VP                  WR7      pMVP                  V 4      pRpV'       Ed   V P                  P                  4        F  p
VP                  V
4       K  	  V P                  P                  4        F   pV\         Jg   K  VP#                  V4       K"  	  \%        V 4      p\'        V4      ^8:  g:   \'        V4      ^8X  d   \(        P*                  ! R	4      V9   g   \        R
V 24      h\'        V4      ^ 8  d   \-        \/        V4      4      MRpV'       d   VP1                  V4       V# )zSwaps the module if it has a quantized counterpart and it has an
`observer` attached.

Args:
    mod: input module
    mapping: a dictionary that maps from nn module to nnq module

Return:
    The corresponding quantized module of `mod`
r"   NFT_IS_REFERENCEzAmodule qconfig must not be None when swapping to reference moduler   r   rx   zOswap_module only works with cpu or single-device CUDA modules, but got devices )rF   r"   r   from_observedr   rG   weightr   rl   inspect	signaturery   r   r   rH   r   rA   rI   rb   rc   r(   rQ   rd   re   rP   )r   r   rs   r   new_modswappedqmodweight_post_processweight_qparamssigpre_hook_fnr   rt   rQ   s   &&&&          r   r   r     s    GsI3;;#:',0KK1,S1mC   G)#.'97<=Dt_--$2D2D2D;;&([  '*kk&8&8&:##CJJ/!01D!E//#>''8/3>>A"oo . G #ooc2GG7"55<<>11+>  ? --446"8811': 7
 +3/GG!LA%%,,v*>'*I$efmeno  -0L1,<T$w-($F

6"Nr   c                    R p\        V R4      '       d   V P                  W! V4      R,           &   V P                  4        F*  w  rEV'       d   V! V4      V,           MTp\        WQV4       K,  	  R# )a  Traverse the modules and save all observers into dict.
This is mainly used for quantization accuracy debug
Args:
    mod: the top module we want to save all observers
    prefix: the prefix for the current module
    target_dict: the dictionary used to save all the observers
c                 &    V R 8X  d   V # V R,           # ) r#   r   )r2   s   &r   
get_prefix&_get_observer_dict.<locals>.get_prefix4  s    2v76C<7r   r=   N)rF   r=   r,   _get_observer_dict)r   target_dictr2   r   r6   r7   r8   s   &&&    r   r   r   +  si    8 s-..'' 	Jv&)BBC ))+5;
6*T15}= ,r   )
r    r:   r}   r   r   r   r   r   r   r   )Nr   N)NNr   )NNNN)FNNN)NF)NFTFNF)NFFNF)r   )Er   r   r   typing_extensionsr   r(   torch.ao.nn.quantizedr)   rf   	quantizedri   torch.nntorch.ao.nn.intrinsicr   torch.ao.quantization.observerr   torch.ao.quantization.qconfigr   r   r   r   r	   r
   +torch.ao.quantization.quantization_mappingsr   r   r   r   r   r   r   r   torch.ao.quantization.stubsr   r   torch.nn.utils.parametrizer   utilsr   r   r   __all__is_activation_post_processr   quantizableMultiheadAttentionr   r    r.   r:   rA   rC   rK   ro   rb   r}   
deprecatedr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>r      s         # #  . F 	 	 	 B C  9  ,
$$
r~~@@. 0
R\\..
))2<<+J+J2	 '
.b20
2
KH/V6 12@ 3@F!4,  12 3: 12EKKuW 3Wt 12 3< 12 3. 121 31h;|@F>r   