Ë
    g^(hã¤  ã                   ó‚  — d dl Z d dlmZ d dlZd dlmZ d dlmZmZ d dl	m
Z
mZ  edd«      Zej                  ej                  ej                  ej                   ej"                  gZej&                  ej(                  gZeD � ci c];  } |  ej,                  | «      j.                   ej,                  | «      j0                  f“Œ= c} Zej5                  eD � ci c]G  } |  e ej8                  | «      j.                  «       e ej8                  | «      j0                  «      f“ŒI c} «       d„ Zej=                  d	«        e
ed
d«      dej>                  de dedededejB                  dej>                  fd„«       Z" e
ed
d«      dej>                  de dedededejB                  dej>                  fd„«       Z#ej=                  d«        e
edd«      dej>                  dej>                  dej>                  dededejB                  dej>                  fd„«       Z$ e
edd«      dej>                  dej>                  dej>                  dededejB                  dej>                  fd„«       Z%ej=                  d«        e
edd«      dej>                  dej>                  dej>                  dej>                  dej>                  dejB                  dej>                  fd„«       Z& e
edd«      dej>                  dej>                  dej>                  dej>                  dej>                  dejB                  dej>                  fd„«       Z'ej=                  d«        e
edd«      dd œdej>                  de dedededejB                  d!eejB                     dej>                  fd"„«       Z( e
edd«      dd œdej>                  dej>                  dej>                  dededejB                  d!eejB                     dej>                  fd#„«       Z)ej=                  d$«        e
ed%d«      dd œdej>                  dej>                  dej>                  dededejB                  d!eejB                     dej>                  fd&„«       Z* e
ed%d«      dd œdej>                  dej>                  dej>                  dededejB                  d!eejB                     dej>                  fd'„«       Z+ej=                  d(«        e
ed)d«      dd œdej>                  dej>                  dej>                  dej>                  dej>                  dejB                  d!eejB                     dej>                  fd*„«       Z, e
ed)d«      dd œd!eejB                     dej>                  fd+„«       Z-ej=                  d,«        e
ed-d«      dej>                  d.ed/ed0e dejB                  de.ej>                  ej>                  f   fd1„«       Z/ej=                  d2«        e
ed3d«      dej>                  d.ed/ed0e dejB                  de.ej>                  ej>                  f   fd4„«       Z0 e
ed-d«      dej>                  deded0e dejB                  de.ej>                  ej>                  f   fd5„«       Z1 e
ed3d«      dej>                  deded0e dejB                  de.ej>                  ej>                  f   fd6„«       Z2d7„ Z3ej=                  d8«        e
ed9d«      dej>                  d:ej>                  d;ej>                  d<edededejB                  dej>                  fd=„«       Z4 e
ed9d«      dej>                  d:ej>                  d;ej>                  d<edededejB                  dej>                  fd>„«       Z5ej=                  d?«        e
ed@d«      dd œdej>                  d:ej>                  d;eej>                     d<edededejB                  d!eejB                     dej>                  fdA„«       Z6 e
ed@d«      dd œdej>                  d:ej>                  d;eej>                     d<edededejB                  d!eejB                     dej>                  fdB„«       Z7ej=                  dC«        e
edDd«      dej>                  dejB                  de.ej>                  ej>                  f   fdE„«       Z8 e
edDd«      dej>                  dejB                  de.ej>                  ej>                  f   fdF„«       Z9ej=                  dG«        e
edHdI«      dej>                  dejB                  de.ej>                  ej>                  f   fdJ„«       Z:ej=                  dK«        e
edLd«      dej>                  dejB                  de.ej>                  ej>                  f   fdM„«       Z; e
edLd«      dej>                  dejB                  de.ej>                  ej>                  f   fdN„«       Z<dO„ Z=ej=                  dP«        e
edQd«      dej>                  d:ej>                  d;ej>                  dededejB                  fdR„«       Z> e
edQd«      dej>                  d:ej>                  d;ej>                  dededejB                  fdS„«       Z?ej=                  dT«        e
edUd«      ej€                  fdej>                  d:ej>                  d;ej>                  dededejB                  dVejB                  fdW„«       ZA e
edUd«      ej€                  fdej>                  d:ej>                  d;ej>                  dededejB                  dVejB                  fdX„«       ZBej=                  dY«        e
edZd«      	 dndej>                  d:ej>                  d;ej>                  dededejB                  fd\„«       ZC e
edZd«      	 dndej>                  d:ej>                  d;ej>                  dededejB                  fd]„«       ZDej=                  d^«        e
ed_d«      d[ej€                  fd`ej>                  d:ej>                  d;eej>                     dededejB                  daedVejB                  fdb„«       ZEej=                  dc«        G dd„ deejŒ                  jŽ                  «      ZH e
edfdg«      dej>                  d:ej>                  d;ej>                  d<edededej>                  fdh„«       ZI e
edfd«      dej>                  d:ej>                  d;ej>                  d<edededej>                  fdi„«       ZJej=                  dj«        e
edkd«      dej>                  dejB                  dej>                  fdl„«       ZK e
edkd«      dej>                  dejB                  dej>                  fdm„«       ZLyc c} w c c} w )oé    N)ÚOptional)Ú_unsqueeze_multiple)Údetermine_qparamsÚvalidate_qmin_qmax)ÚimplÚLibraryÚquantized_decomposedÚDEFc                 ó�   — |t         vrt        d|› �«      ‚t         |   \  }}| |k\  sJ d|› d| › �«       ‚||k  sJ d|› d|› �«       ‚y )NzUnsupported dtype: z9quant_min out of bound for dtype, quant_min_lower_bound: z quant_min: z9quant_max out of bound for dtype, quant_max_upper_bound: z quant_max: )Ú_DTYPE_TO_QVALUE_BOUNDSÚ
ValueError)Ú	quant_minÚ	quant_maxÚdtypeÚquant_min_lower_boundÚquant_max_upper_bounds        úb/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/torch/ao/quantization/fx/_decomposed.pyÚ_quant_min_max_bounds_checkr      s‹   € ØÔ+Ñ+ÜÐ.¨u¨gÐ6Ó7Ð7Ü3JÈ5Ñ3QÑ0ÐÐ0àÐ-Ò-ð ð	"Ø"7Ð!8¸ÀYÀKð	QóÐ-ð
 Ð-Ò-ð ð	"Ø"7Ð!8¸ÀYÀKð	QóÑ-ó    zxquantize_per_tensor(Tensor input, float scale, int zero_point, int quant_min, int quant_max, ScalarType dtype) -> TensorÚquantize_per_tensorÚCompositeExplicitAutogradÚinputÚscaleÚ
zero_pointr   r   r   Úreturnc                 óœ  — | j                   t        j                  t        j                  fv r| j	                  t        j
                  «      } | j                   t        j
                  k(  sJ d| j                   › �«       ‚t        |||«       d|z  }t        j                  t        j                  | |z  «      |z   ||«      j	                  |«      S )aì  Affine quantization for the Tensor using the same quantization parameters to map
    from floating point to quantized values

    Args:
       input (torch.Tensor): original float32 or bfloat16 Tensor
       scale (float): quantization parameter for affine quantization
       zero_point (int): quantization parameter for affine quantization
       quant_min (int): minimum quantized value for output Tensor
       quant_max (int): maximum quantized value for output Tensor
       dtype (torch.dtype): requested dtype (e.g. torch.uint8) for output Tensor

    Returns:
       Tensor with requested dtype (e.g. torch.uint8), note the quantization parameters
       are not stored in the Tensor, we are storing them in function arguments instead
    ú<Expecting input to have dtype torch.float32, but got dtype: ç      ð?)	r   ÚtorchÚfloat16Úbfloat16ÚtoÚfloat32r   ÚclampÚround)r   r   r   r   r   r   Ú	inv_scales          r   r   r   1   s¥   € ð0 ‡{�{”u—}‘}¤e§n¡nÐ5Ñ5Ø—‘œŸ™Ó'ˆà�‰”u—}‘}Ò$ðTà	EÀeÇkÁkÀ]ÐSóTØ$ä 	¨9°eÔ<à�e‘€IÜ�;‰;Ü�‰�E˜IÑ%Ó&¨Ñ3°YÀ	óç�bˆƒiðr   ÚMetac                 ó(  — | j                   t        j                  t        j                  fv r| j	                  t        j
                  «      } | j                   t        j
                  k(  sJ d| j                   › �«       ‚t        j                  | |¬«      S )Nr   ©r   )r   r   r    r!   r"   r#   Ú
empty_like©r   r   r   r   r   r   s         r   Úquantize_per_tensor_metar,   V   so   € ð ‡{�{”u—}‘}¤e§n¡nÐ5Ñ5Ø—‘œŸ™Ó'ˆà�‰”u—}‘}Ò$ðTà	EÀeÇkÁkÀ]ÐSóTØ$ä×Ñ˜E¨Ô/Ð/r   zƒquantize_per_tensor.tensor(Tensor input, Tensor scale, Tensor zero_point, int quant_min, int quant_max, ScalarType dtype) -> Tensorzquantize_per_tensor.tensorc                 ó  — |j                  «       dk(  sJ d|j                  «       › �«       ‚|j                  «       dk(  sJ d|j                  «       › �«       ‚t        | |j                  «       |j                  «       |||«      S ©zëAffine quantization for the Tensor using the same quantization parameters to map
    from floating point to quantized values
    Same as `quantize_per_tensor` but scale and zero_point are Scalar Tensor instead of
    scalar values
    é   ú>Expecting zero_point tensor to be one element, but received : ú9Expecting scale tensor to be one element, but received : ©Únumelr   Úitemr+   s         r   Úquantize_per_tensor_tensorr5   m   sŽ   € ð" 	×ÑÓ˜aÒð]à	GÈ
×HXÑHXÓHZÐG[Ð\ó]Øð 	�‰‹˜ÒðSà	BÀ5Ç;Á;Ã=À/ÐRóSØäØˆu�z‰z‹|˜ZŸ_™_Ó.°	¸9Àeóð r   c                 óÔ  — | j                   t        j                  t        j                  fv r| j	                  t        j
                  «      } |j                  «       dk(  sJ d|j                  «       › �«       ‚|j                  «       dk(  sJ d|j                  «       › �«       ‚| j                   t        j
                  k(  sJ d| j                   › �«       ‚t        j                  | |¬«      S )Nr/   r0   r1   r   r)   )r   r   r    r!   r"   r#   r3   r*   r+   s         r   Úquantize_per_tensor_tensor_metar7   ˆ   sÔ   € ð ‡{�{”u—}‘}¤e§n¡nÐ5Ñ5Ø—‘œŸ™Ó'ˆà×ÑÓ˜aÒð]à	GÈ
×HXÑHXÓHZÐG[Ð\ó]Øð 	�‰‹˜ÒðSà	BÀ5Ç;Á;Ã=À/ÐRóSØð 	�‰”u—}‘}Ò$ðTà	EÀeÇkÁkÀ]ÐSóTØ$ä×Ñ˜E¨Ô/Ð/r   zŠquantize_per_tensor.tensor2(Tensor input, Tensor scale, Tensor zero_point, Tensor quant_min, Tensor quant_max, ScalarType dtype) -> Tensorzquantize_per_tensor.tensor2c                 ó>  — |j                  «       dk(  sJ d|j                  «       › �«       ‚|j                  «       dk(  sJ d|j                  «       › �«       ‚t        | |j                  «       |j                  «       |j                  «       |j                  «       |«      S r.   r2   r+   s         r   Úquantize_per_tensor_tensor2r9   ¦   s¡   € ð" 	×ÑÓ˜aÒð]à	GÈ
×HXÑHXÓHZÐG[Ð\ó]Øð 	�‰‹˜ÒðSà	BÀ5Ç;Á;Ã=À/ÐRóSØäØØ�
‰
‹Ø�‰ÓØ�‰ÓØ�‰ÓØóð r   c                 ó"   — t        | |||||«      S ©N)r7   r+   s         r   Ú quantize_per_tensor_tensor2_metar<   Æ   s   € ô +Øˆu�j )¨Y¸óð r   z™dequantize_per_tensor(Tensor input, float scale, int zero_point, int quant_min, int quant_max, ScalarType dtype, *, ScalarType? out_dtype=None) -> TensorÚdequantize_per_tensor©Ú	out_dtyper?   c                óÌ   — | j                   |k(  sJ d|› d| j                   › �«       ‚|€t        j                  }|t        v r| j	                  |«      |z
  |z  S t        d|› �«      ‚)aþ  Affine dequantization for the Tensor using the same quantization parameters to map
    from quantized values to floating point values

    Args:
       input (torch.Tensor): Tensor with dtype matching `dtype` argument,
       e.g. (`torch.uint8`), it is a per tensor quantized Tensor if combined with
       quantization parameters in the argument of this function (scale/zero_point)

       scale (float): quantization parameter for affine quantization

       zero_point (int): quantization parameter for affine quantization

       quant_min (int): minimum quantized value for input Tensor (not used in computation,
       reserved for pattern matching)

       quant_max (int): maximum quantized value for input Tensor (not used in computation,
       reserved for pattern matching)

       dtype (torch.dtype): dtype for input Tensor (not used in computation,
       reserved for pattern matching)

       out_dtype (torch.dtype?): optional dtype for output Tensor

    Returns:
       dequantized float32 Tensor
    úExpecting input to have dtype: z
, but got ú,Unsupported dtype in dequantize_per_tensor: )r   r   r#   r   r"   r   ©r   r   r   r   r   r   r?   s          r   r=   r=   Þ   sz   € ðL 	�‰�uÒðHà	(¨¨¨z¸%¿+¹+¸ÐGóHØàÐÜ—M‘Mˆ	ØÔ'Ñ'ð —‘˜Ó# jÑ0°EÑ9Ð9äÐGÈÀwÐOÓPÐPr   c                óT   — |€t         j                  }t        j                  | |¬«      S ©Nr)   )r   r#   r*   rC   s          r   Údequantize_per_tensor_metarF     s&   € ð ÐÜ—M‘Mˆ	Ü×Ñ˜E¨Ô3Ð3r   z¤dequantize_per_tensor.tensor(Tensor input, Tensor scale, Tensor zero_point, int quant_min, int quant_max, ScalarType dtype, *, ScalarType? out_dtype=None) -> Tensorzdequantize_per_tensor.tensorc          	      ó
  — |j                  «       dk(  sJ d|j                  «       › �«       ‚|j                  «       dk(  sJ d|j                  «       › �«       ‚t        | |j                  «       |j                  «       ||||¬«      S ©zöAffine dequantization for the Tensor using the same quantization parameters to map
    from quantized values to floating point values
    Same as `dequantize_per_tensor` but scale and zero_point are Scalar Tensor instead of
    scalar values
    r/   r0   r1   r>   ©r3   r=   r4   rC   s          r   Údequantize_per_tensor_tensorrJ   '  s–   € ð* 	×ÑÓ˜aÒð]à	GÈ
×HXÑHXÓHZÐG[Ð\ó]Øð 	�‰‹˜ÒðSà	BÀ5Ç;Á;Ã=À/ÐRóSØä ØØ�
‰
‹Ø�‰ÓØØØØôð r   c                ó^  — |€t         j                  }|j                  «       dk(  sJ d|j                  «       › �«       ‚|j                  «       dk(  sJ d|j                  «       › �«       ‚| j                  |k(  s
J d|› �«       ‚|t        v rt        j
                  | |¬«      S t        d|› �«      ‚)Nr/   r0   r1   rA   r)   rB   )r   r#   r3   r   r   r*   r   rC   s          r   Ú!dequantize_per_tensor_tensor_metarL   L  sÄ   € ð ÐÜ—M‘Mˆ	à×ÑÓ˜aÒð]à	GÈ
×HXÑHXÓHZÐG[Ð\ó]Øð 	�‰‹˜ÒðSà	BÀ5Ç;Á;Ã=À/ÐRóSØà�;‰;˜%ÒÐJÐ#BÀ5À'Ð!JÓJÐØÔ'Ñ'Ü×Ñ ¨YÔ7Ð7äÐGÈÀwÐOÓPÐPr   z«dequantize_per_tensor.tensor2(Tensor input, Tensor scale, Tensor zero_point, Tensor quant_min, Tensor quant_max, ScalarType dtype, *, ScalarType? out_dtype=None) -> Tensorzdequantize_per_tensor.tensor2c          	      óB  — |j                  «       dk(  sJ d|j                  «       › �«       ‚|j                  «       dk(  sJ d|j                  «       › �«       ‚t        | |j                  «       |j                  «       |j                  «       |j                  «       ||¬«      S rH   rI   rC   s          r   Údequantize_per_tensor_tensor2rN   m  s¤   € ð* 	×ÑÓ˜aÒð]à	GÈ
×HXÑHXÓHZÐG[Ð\ó]Øð 	�‰‹˜ÒðSà	BÀ5Ç;Á;Ã=À/ÐRóSØä ØØ�
‰
‹Ø�‰ÓØ�‰ÓØ�‰ÓØØôð r   c          	      ó&   — t        | ||||||¬«      S )Nr>   )rL   rC   s          r   Ú"dequantize_per_tensor_tensor2_metarP   ’  s    € ô -Øˆu�j )¨Y¸Èôð r   zrchoose_qparams.tensor(Tensor input, int quant_min, int quant_max, float eps, ScalarType dtype) -> (Tensor, Tensor)zchoose_qparams.tensorÚqminÚqmaxÚepsc           
      ó‚  — | j                   t        j                  t        j                  t        j                  fv sJ d| j                   › �«       ‚|t
        v sJ dt
        j                  «       › d|› �«       ‚t        ||«       t        j                  | «      \  }}t        |||||t        j                  |g«      d¬«      S )á[  Given an input Tensor, derive the per tensor affine quantization parameter
    (scale and zero_point) for target quantized Tensor from the Tensor

    Args:
       input (torch.Tensor): floating point input Tensor
       quant_min (int): minimum quantized value for target quantized Tensor
       quant_max (int): maximum quantized value for target quantized Tensor
       dtype (torch.dtype): dtype for target quantized Tensor

    Returns:
       scale (float): quantization parameter for the target quantized Tensor
       zero_point (int): quantization parameter for the target quantized Tensor
    úCExpecting input to have dtype torch.float32/16/b16, but got dtype: ú$Expecting target dtype to be one of ú, but got: F)Úhas_customized_qrange)r   r   r#   r    r!   r   Úkeysr   Úaminmaxr   ÚTensor©r   rQ   rR   rS   r   Úmin_valÚmax_vals          r   Úchoose_qparams_tensorr`   ¨  sÍ   € ð" �;‰;Ü�‰Ü�‰Ü�‰ðñ ð [ð 
MÈUÏ[É[ÈMÐZó	[ð ð 	Ô(Ñ(ðaà	-Ô.E×.JÑ.JÓ.LÐ-MÈ[ÐY^ÐX_Ð`óaØ(ä�t˜TÔ"ä—}‘} UÓ+Ñ€GˆWäØØØØØÜ�‰�c�UÓØ#ôð r   z|choose_qparams_symmetric.tensor(Tensor input, int quant_min, int quant_max, float eps, ScalarType dtype) -> (Tensor, Tensor)zchoose_qparams_symmetric.tensorc           
      ó   — | j                   t        j                  t        j                  t        j                  fv sJ d| j                   › �«       ‚|t
        v sJ dt
        j                  «       › d|› �«       ‚t        ||«       t        j                  | «      \  }}t        |||||t        j                  |g«      dt        j                  ¬«      S )rU   rV   rW   rX   F)rY   Úqscheme)r   r   r#   r    r!   r   rZ   r   r[   r   r\   Úper_tensor_symmetricr]   s          r   Úchoose_qparams_symmetric_tensorrd   Ö  sÖ   € ð* �;‰;Ü�‰Ü�‰Ü�‰ðñ ð [ð 
MÈUÏ[É[ÈMÐZó	[ð ð 	Ô(Ñ(ðaà	-Ô.E×.JÑ.JÓ.LÐ-MÈ[ÐY^ÐX_Ð`óaØ(ä�t˜TÔ"ä—}‘} UÓ+Ñ€GˆWÜØØØØØÜ�‰�c�UÓØ#Ü×*Ñ*ô	ð 	r   c                 ó„  — | j                   t        j                  t        j                  t        j                  fv sJ d| j                   › �«       ‚||k  sJ d|› d|› �«       ‚t        j
                  dt        j                  | j                  ¬«      t        j
                  dt        j                  | j                  ¬«      fS )NrV   zKExpecting quant_min to be smaller than quant_max but received min:         z max: r/   ©r   Údevice)	r   r   r#   r    r!   ÚemptyÚdoublerg   Úint64©r   r   r   rS   r   s        r   Úchoose_qparams_tensor_metarl     s·   € ð �;‰;Ü�‰Ü�‰Ü�‰ðñ ð [ð 
MÈUÏ[É[ÈMÐZó	[ð ð 	�IÒð&ð
	Ø	ˆ�6˜)˜ð&ó&Øô �;‰;�q¤§¡°U·\±\ÔBÄEÇKÁKØ	”—‘ U§\¡\ôEð ð r   c                 óÂ   — t        j                  dt         j                  | j                  ¬«      t        j                  dt         j                  | j                  ¬«      fS )Nr/   rf   )r   rh   ri   rg   rj   rk   s        r   Ú$choose_qparams_symmetric_tensor_metarn     sA   € ô �;‰;�q¤§¡°U·\±\ÔBÄEÇKÁKØ	”—‘ U§\¡\ôEð ð r   c                 ó–   — t        t        | j                  «       «      «      }d||<   ||d<   | j                  t	        |«      «      }||fS )Nr   )ÚlistÚrangeÚdimÚpermuteÚtuple)ÚxÚaxisÚnew_axis_listÚys       r   Ú_permute_to_axis_zerory     sH   € Üœ˜qŸu™u›w›Ó(€MØ€M�$ÑØ€M�!ÑØ	�	‰	”%˜Ó&Ó'€AØˆmÐÐr   z‰quantize_per_channel(Tensor input, Tensor scales, Tensor zero_points, int axis, int quant_min, int quant_max, ScalarType dtype) -> TensorÚquantize_per_channelÚscalesÚzero_pointsrv   c                 óÔ  — | j                   t        j                  t        j                  fv r| j	                  t        j
                  «      } | j                   t        j
                  k(  sJ d| j                   › �«       ‚|| j                  «       k  sJ d| j                  «       › �«       ‚t        |||«       t        | |«      \  } }dg| j                  «       z  }|j                  d   |d<   |j                  |«      }|j                  |«      }t        j                  t        j                  | d|z  z  «      |z   ||«      }	|	j                  t        |«      «      }
|
j	                  |«      S )at  Affine per channel quantization for the Tensor using the same quantization
    parameters for each channel/axis to map from floating point to quantized values

    Args:
       input (torch.Tensor): original float32 or bfloat16 Tensor
       scales (torch.Tensor): a list of scale quantization parameter for
       affine quantization, one per channel
       zero_point (torch.Tensor): a list of zero_point quantization parameter for
       affine quantization, one per channel
       quant_min (int): minimum quantized value for output Tensor
       quant_max (int): maximum quantized value for output Tensor
       dtype (torch.dtype): requested dtype (e.g. torch.uint8) for output Tensor

    Returns:
       Tensor with requested dtype (e.g. torch.uint8), note the quantization parameters
       are not stored in the Tensor, we are storing them in function arguments instead
    r   úExpecting axis to be < r/   r   r   )r   r   r    r!   r"   r#   rr   r   ry   ÚshapeÚviewr$   r%   rs   rt   )r   r{   r|   rv   r   r   r   Úpermute_axis_listÚ	new_shapeÚresÚouts              r   rz   rz   ,  s2  € ð6 ‡{�{”u—}‘}¤e§n¡nÐ5Ñ5Ø—‘œŸ™Ó'ˆà�‰”u—}‘}Ò$ðTà	EÀeÇkÁkÀ]ÐSóTØ$à�%—)‘)“+ÒÐFÐ!8¸¿¹»¸ÐFÓFÐÜ 	¨9°eÔ<Ü4°U¸DÓAÑ€EÐà��e—i‘i“kÑ!€IØ—<‘< ‘?€Iˆa�LØ�[‰[˜Ó#€FØ×"Ñ" 9Ó-€Kä
�+‰+Ü�‰�E˜S 6™\Ñ*Ó+¨kÑ9¸9Àió€Cð �+‰+”eÐ-Ó.Ó
/€CØ�6‰6�%‹=Ðr   c                 ó˜  — | j                   t        j                  t        j                  fv r| j	                  t        j
                  «      } | j                   t        j
                  k(  sJ d| j                   › �«       ‚|| j                  «       k  sJ d| j                  «       › �«       ‚t        |||«       t        j                  | |¬«      S )Nr   r~   r)   )	r   r   r    r!   r"   r#   rr   r   r*   )r   r{   r|   rv   r   r   r   s          r   Úquantize_per_channel_metar†   \  s¢   € ð ‡{�{”u—}‘}¤e§n¡nÐ5Ñ5Ø—‘œŸ™Ó'ˆà�‰”u—}‘}Ò$ðTà	EÀeÇkÁkÀ]ÐSóTØ$à�%—)‘)“+ÒÐFÐ!8¸¿¹»¸ÐFÓFÐÜ 	¨9°eÔ<Ü×Ñ˜E¨Ô/Ð/r   z«dequantize_per_channel(Tensor input, Tensor scales, Tensor? zero_points, int axis, int quant_min, int quant_max, ScalarType dtype, *, ScalarType? out_dtype=None) -> TensorÚdequantize_per_channelc                ó  — | j                   |k(  sJ d|› d| j                   › �«       ‚|€t        j                  }|| j                  «       k  sJ d| j                  «       › �«       ‚t	        |||«       t        | |«      \  } }dg| j                  «       z  }	|j                  d   |	d<   |j                  |	«      }|�| |j                  |	«      z
  |z  }
n| |z  }
|
j                  |«      }
|
j                  t        |«      «      }|S )a›  Affine per channel dequantization for the Tensor using the same quantization
    parameters for each channel/axis to map from quantized values to floating point values

    Args:
       input (torch.Tensor): Tensor with dtype matching `dtype` argument,
       e.g. (`torch.uint8`), it is a per channel quantized Tensor if combined with
       quantization parameter in the argument of this function (scales/zero_points/axis)

       scales (torch.Tensor): a list of scale quantization parameter for
       affine quantization, one per channel

       zero_points (torch.Tensor): a list of zero_point quantization parameter for
       affine quantization, one per channel

       quant_min (int): minimum quantized value for output Tensor (not used in computation,
       reserved for pattern matching)

       quant_max (int): maximum quantized value for output Tensor (not used in computation,
       reserved for pattern matching)

       dtype (torch.dtype): requested dtype for output Tensor (not used in computation,
       reserved for pattern matching)

       out_dtype (torch.dtype?): optional dtype for output Tensor

    Returns:
       dequantized float32 Tensor
    úExpecting input to have dtype ú, but got dtype: r~   r/   r   )r   r   r#   rr   r   ry   r   r€   r"   rs   rt   )r   r{   r|   rv   r   r   r   r?   r�   r‚   rƒ   r„   s               r   r‡   r‡   z  s
  € ðR 	�‰�uÒðNà	'¨ wÐ.?ÀÇÁ¸}ÐMóNØàÐÜ—M‘Mˆ	Ø�%—)‘)“+ÒÐFÐ!8¸¿¹»¸ÐFÓFÐÜ 	¨9°eÔ<Ü4°U¸DÓAÑ€EÐà��e—i‘i“kÑ!€IØ—<‘< ‘?€Iˆa�LØ�[‰[˜Ó#€FØÐØ�{×'Ñ'¨	Ó2Ñ2°fÑ<‰à�f‰nˆà
�&‰&�Ó
€Cà
�+‰+”eÐ-Ó.Ó
/€CØ€Jr   c                ó  — | j                   |k(  sJ d|› d| j                   › �«       ‚|€t        j                  }|| j                  «       k  sJ d| j                  «       › �«       ‚t	        |||«       t        j
                  | |¬«      S )Nr‰   rŠ   r~   r)   )r   r   r#   rr   r   r*   )r   r{   r|   rv   r   r   r   r?   s           r   Údequantize_per_channel_metarŒ   ¹  s‰   € ð 	�‰�uÒðNà	'¨ wÐ.?ÀÇÁ¸}ÐMóNØàÐÜ—M‘Mˆ	Ø�%—)‘)“+ÒÐFÐ!8¸¿¹»¸ÐFÓFÐÜ 	¨9°eÔ<Ü×Ñ˜E¨Ô3Ð3r   zLchoose_qparams_per_token(Tensor input, ScalarType dtype) -> (Tensor, Tensor)Úchoose_qparams_per_tokenc                 óp  — | j                  «       j                  dd¬«      }|j                  t        j                  k(  r|j                  «       }|t        j                  k(  rd}d|dz
  z  dz
  }nt        d|› �«      ‚|j                  d¬	«      j                  |«      }t        j                  |«      }||fS )
á  Choose quantization parameters for per token quantization. This means for a N dimension Tensor
    (M1, M2, ...Mn, N), we calculate scales/zero_points for each N elements and quantize
    every N elements with the same quantization parameter. The dimension for scales/zero_points
    will be (M1 * M2 ... * Mn)

    Args:
       input (torch.Tensor): original float32/float16 Tensor
       dtype (torch.dtype): dtype (e.g. torch.uint8) for input Tensor

    Returns:
        scales and zero_points, both float32 Tensors
    éÿÿÿÿT©rr   Úkeepdimé   é   r/   z/unsupported dtype in choose_qparams_per_token: gñhãˆµøä>©Úmin)ÚabsÚamaxr   r   r    ÚfloatÚint8Ú	Exceptionr$   ÚdivÚ
zeros_like)r   r   r{   Ún_bitsr   r|   s         r   r�   r�   Ô  s²   € ð, �Y‰Y‹[×Ñ "¨dÐÓ3€FØ‡|�|”u—}‘}Ò$à�L‰L‹Nð 	ð ”—
‘
ÒØˆØ˜& 1™*Ñ%¨Ñ)‰	äØ=¸e¸WÐEó
ð 	
ð �\‰\˜dˆ\Ó#×'Ñ'¨	Ó2€FÜ×"Ñ" 6Ó*€KØ�;ÐÐr   c                 óú   — t        | j                  d d «      dgz   }t        j                  |t        j                  | j
                  ¬«      t        j                  |t        j                  | j
                  ¬«      fS ©Nr�   r/   rf   ©rp   r   r   rh   ri   rg   rj   ©r   r   Úsizes      r   Úchoose_qparams_per_token_metar¤   ü  ó]   € ô �—‘˜C˜RÐ Ó! Q CÑ'€DÜ�;‰;�t¤5§<¡<¸¿¹ÔEÄuÇ{Á{Ø”E—K‘K¨¯©ôHð ð r   z]_choose_qparams_per_token_asymmetric_impl(Tensor input, ScalarType dtype) -> (Tensor, Tensor)Ú)_choose_qparams_per_token_asymmetric_implÚCompositeImplicitAutogradc                 óê  — d\  }}t        j                  | dd¬«      }t        j                  | dd¬«      }t        j                  |t        j                  |«      «      }t        j
                  |t        j                  |«      «      }t        j                  t         j                  «      j                  }||z
  t        ||z
  «      z  }	|	j                  |¬«      }	||	z  }
||	z  }||
z   }||z   }t        j                  ||z   dkD  ||
z
  ||z
  «      }t        j                  |||«      j                  «       }|	j                  t         j                  «      |j                  t         j                  «      fS )r�   )i€ÿÿÿé   r�   Tr‘   r•   r   )r   Úaminr˜   r–   r�   ÚmaxÚfinfor#   rS   r™   r$   Úwherer%   r"   Úfloat64rj   )r   r   rQ   rR   r^   r_   Úmin_val_negÚmax_val_posrS   r   Údescaled_minÚdescaled_maxÚzero_point_from_min_errorÚzero_point_from_max_errorr   s                  r   r¦   r¦     sC  € ð, �J€Dˆ$Ü�j‰j˜ B°Ô5€GÜ�j‰j˜ B°Ô5€GÜ—)‘)˜G¤U×%5Ñ%5°gÓ%>Ó?€KÜ—)‘)˜G¤U×%5Ñ%5°gÓ%>Ó?€KÜ
�+‰+”e—m‘mÓ
$×
(Ñ
(€Cð ˜;Ñ&¬%°°t±Ó*<Ñ<€EØ�K‰K˜CˆKÓ €Eð  Ñ&€LØ Ñ&€LØ $ |Ñ 3ÐØ $ |Ñ 3ÐÜ—‘Ø!Ð$=Ñ=ÀÑAØˆ|ÑØˆ|Ñó€Jô
 —‘˜Z¨¨tÓ4×:Ñ:Ó<€Jà�8‰8”E—M‘MÓ" J§M¡M´%·+±+Ó$>Ð>Ð>r   zWchoose_qparams_per_token_asymmetric(Tensor input, ScalarType dtype) -> (Tensor, Tensor)Ú#choose_qparams_per_token_asymmetricc                 ó   — t        | |«      S r;   )r¦   ©r   r   s     r   rµ   rµ   E  s   € ô 5°U¸EÓBÐBr   c                 óú   — t        | j                  d d «      dgz   }t        j                  |t        j                  | j
                  ¬«      t        j                  |t        j                  | j
                  ¬«      fS r    r¡   r¢   s      r   Ú(choose_qparams_per_token_asymmetric_metar¹   Q  r¥   r   c                 ó  — t        j                  t        | j                  «       «      d d «      }||j	                  «       k(  sJ d|› d|j                  «       › �«       ‚||j	                  «       k(  sJ d|› d|j                  «       › �«       ‚y )Nr�   znum_tokens: z	 scales: z zero_points: )ÚmathÚprodrp   r£   r3   )r   r{   r|   Ú
num_tokenss       r   Ú!_per_token_quant_qparam_dim_checkr¾   `  s�   € Ü—‘œ4 §
¡
£Ó-¨c¨rÐ2Ó3€Jà�f—l‘l“nÒ$ð;à	�j�\ ¨6¯;©;«=¨/Ð:ó;Ø$ð 	�k×'Ñ'Ó)Ò)ðEà	�j�\ °×0@Ñ0@Ó0BÐ/CÐDóEÙ)r   z}quantize_per_token(Tensor input, Tensor scales, Tensor zero_points, int quant_min, int quant_max, ScalarType dtype) -> TensorÚquantize_per_tokenc                 óÚ   — t        |||«       t        | ||«       | j                  d|z  «      j                  |«      j	                  «       j                  ||«      j                  |«      } | S )a  Per token quantization for the Tensor using the quantization parameters to map
    from floating point to quantized values. This means for a N dimension Tensor
    (M1, M2, ...Mn, N), we calculate scales/zero_points for each N elements and quantize
    every N elements with the same quantization parameter. The dimension for scales/zero_points
    will be (M1 * M2 ... * Mn)

    Args:
       input (torch.Tensor): original float32 or bfloat16 Tensor
       scales (float32 torch.Tensor): quantization parameter for per token affine quantization
       zero_points (int32 torch.Tensor): quantization parameter for per token affine quantization
       quant_min (int): minimum quantized value for output Tensor
       quant_max (int): maximum quantized value for output Tensor
       dtype (torch.dtype): requested dtype (e.g. torch.uint8) for output Tensor

    Returns:
       Tensor with requested dtype (e.g. torch.uint8), note the quantization parameters
       are not stored in the Tensor, we are storing them in function arguments instead
    r   )r   r¾   ÚmulÚaddr%   r$   r"   ©r   r{   r|   r   r   r   s         r   r¿   r¿   p  s^   € ô6   	¨9°eÔ<Ü% e¨V°[ÔAà�	‰	�#˜‘,Óß	‰ˆ[Ó	ß	‰‹ß	‰ˆy˜)Ó	$ß	‰ˆE‹ð 
ð €Lr   c                 óJ   — t        |||«       t        j                  | |¬«      S rE   ©r   r   r*   rÃ   s         r   Úquantize_per_token_metarÆ   —  s#   € ô   	¨9°eÔ<Ü×Ñ˜E¨Ô/Ð/r   z˜dequantize_per_token(Tensor input, Tensor scales, Tensor zero_points, int quant_min, int quant_max, ScalarType dtype, ScalarType output_dtype) -> TensorÚdequantize_per_tokenÚoutput_dtypec                 ó8   — | |z
  } | |z  } | j                  |«      S )aå  Per token dequantization for the Tensor using the quantization parameters to map
    from floating point to quantized values. This means for a N dimension Tensor
    (M1, M2, ...Mn, N), we calculate scales/zero_points for each N elements and quantize
    every N elements with the same quantization parameter. The dimension for scales/zero_points
    will be (M1 * M2 ... * Mn)

    Args:
       input (torch.Tensor): quantized Tensor (uint8, int8 etc.)
       scales (float64 torch.Tensor): quantization parameter for per token affine quantization
       zero_points (int64 torch.Tensor): quantization parameter for per token affine quantization
       quant_min (int): minimum quantized value for input Tensor
       quant_max (int): maximum quantized value for input Tensor
       dtype (torch.dtype): dtype (e.g. torch.uint8) for input Tensor
       output_dtype (torch.dtype): dtype (e.g. torch.float32) for output Tensor

    Returns:
       dequantized Tensor with dtype `output_dtype`
    )r"   ©r   r{   r|   r   r   r   rÈ   s          r   rÇ   rÇ   ª  s&   € ð8 �KÑ€EØ�F‰N€Eà�8‰8�LÓ!Ð!r   c                 óJ   — t        |||«       t        j                  | |¬«      S rE   rÅ   rÊ   s          r   Údequantize_per_token_metarÌ   Ì  s#   € ô   	¨9°eÔ<ä×Ñ˜E¨Ô6Ð6r   z•quantize_per_channel_group(Tensor input, Tensor scales, Tensor zero_points, int quant_min, int quant_max, ScalarType dtype, int group_size) -> TensorÚquantize_per_channel_groupé€   c                 óL  — |dkD  sJ ‚|| j                   d   kD  r!|j                   d   dk(  r| j                   d   }| j                   d   |z  dk(  sJ ‚| j                  «       dk(  sJ ‚| j                  d|«      }t        j                  |«      j                  «       dk(  sJ ‚|j                  dd«      }|j                  dd«      }|j                  d|z  «      j                  |«      j                  «       j                  ||«      j                  |«      j                  | «      }|S )Nr/   r�   r   r”   r   )r   rr   Úreshaper   ÚisnanÚsumrÁ   rÂ   r%   Úclamp_r"   Ú
reshape_as)	r   r{   r|   r   r   r   Ú
group_sizeÚto_quantÚ
input_int8s	            r   rÍ   rÍ   â  s  € ð ˜Š>Ðˆ>à�E—K‘K ‘OÒ#¨¯©°RÑ(8¸AÒ(=Ø—[‘[ ‘_ˆ
à�;‰;�r‰?˜ZÑ'¨1Ò,Ð,Ð,Ø�9‰9‹;˜!ÒÐÐð �}‰}˜R Ó,€HÜ�;‰;�xÓ ×$Ñ$Ó&¨!Ò+Ð+Ð+à�^‰^˜B Ó"€FØ×%Ñ% b¨!Ó,€Kð 	�‰�S˜6‘\Ó"ß	‰ˆ[Ó	ß	‰‹ß	‰�	˜9Ó	%ß	‰ˆE‹ß	‰�EÓ	ð ð Ðr   c                 óü   — |dkD  sJ ‚|| j                   d   kD  r!|j                   d   dk(  r| j                   d   }| j                   d   |z  dk(  sJ ‚| j                  «       dk(  sJ ‚t        j                  | |¬«      S )aX  Groupwise quantization within each channel for an 2-d Tensor using the quantization parameters
    to map from floating point to quantized values. This means for each row of a 2-d Tensor
    (M, N), we calculate scales/zero_points for each `group_size` elements
    and quantize every `group_size` elements with the same quantization parameter.
    The dimension for scales/zero_points will be (M * ceil(N, group_size),)

    Args:
       input (torch.Tensor): original float32 or bfloat16 Tensor
       scales (float32 torch.Tensor): quantization parameter for per channel group affine quantization
       zero_points (int32 torch.Tensor): quantization parameter for per channel group affine quantization
       quant_min (int): minimum quantized value for output Tensor
       quant_max (int): maximum quantized value for output Tensor
       dtype (torch.dtype): requested dtype (e.g. torch.uint8) for output Tensor

    Returns:
       Tensor with requested dtype (e.g. torch.uint8), note the quantization parameters
       are not stored in the Tensor, we are storing them in function arguments instead
    r/   r�   r   r”   r)   )r   rr   r   r*   )r   r{   r|   r   r   r   rÕ   s          r   Úquantize_per_channel_group_metarÙ   	  s   € ð8 ˜Š>Ðˆ>à�E—K‘K ‘OÒ#¨¯©°RÑ(8¸AÒ(=Ø—[‘[ ‘_ˆ
à�;‰;�r‰?˜ZÑ'¨1Ò,Ð,Ð,Ø�9‰9‹;˜!ÒÐÐÜ×Ñ˜E¨Ô/Ð/r   z±dequantize_per_channel_group(Tensor input, Tensor scales, Tensor? zero_points, int quant_min, int quant_max, ScalarType dtype, int group_size, ScalarType output_dtype) -> TensorÚdequantize_per_channel_groupÚw_int8rÕ   c                 ó   — |dkD  sJ ‚|| j                   d   kD  r!|j                   d   dk(  r| j                   d   }| j                   d   |z  dk(  sJ ‚| j                  «       dk(  sJ ‚| j                  d|«      }|j                  dd«      }|�|j                  dd«      }	n0t        j                  g t        j
                  |j                  ¬«      }	|j                  |	«      j                  |«      j                  | «      j                  |«      }
|
S )a!  Groupwise dequantization within each channel for an 2-d Tensor using the quantization parameters
    to map from floating point to quantized values. This means for each row of a 2-d Tensor
    (M, N), we calculate scales/zero_points for each `group_size` elements
    and quantize every `group_size` elements with the same quantization parameter.
    The dimension for scales/zero_points will be (M * ceil(N, group_size),)

    Args:
       input (torch.Tensor): quantized Tensor (uint8/int8 etc.)
       scales (float32 torch.Tensor): quantization parameter for per channel group affine quantization
       zero_points (int32 torch.Tensor): quantization parameter for per channel group affine quantization
       quant_min (int): minimum quantized value for input Tensor
       quant_max (int): maximum quantized value for input Tensor
       dtype (torch.dtype): dtype (e.g. torch.uint8) for input Tensor
       output_dtype (torch.dtype): dtype (e.g. torch.float32) for output Tensor

    Returns:
       dequantized Tensor with dtype `output_dtype`
    r/   r�   r   r”   rf   )r   rr   rÐ   r   ÚzerosÚint32rg   ÚsubrÁ   rÔ   r"   )rÛ   r{   r|   r   r   r   rÕ   rÈ   Úw_int8_groupedÚzpÚw_dqs              r   rÚ   rÚ   5  sø   € ðD ˜Š>Ðˆ>à�F—L‘L Ñ$Ò$¨¯©°bÑ)9¸QÒ)>Ø—\‘\ "Ñ%ˆ
Ø�<‰<˜Ñ˜jÑ(¨AÒ-Ð-Ð-Ø�:‰:‹<˜1ÒÐÐà—^‘^ B¨
Ó3€NØ�^‰^˜B Ó"€FØÐØ× Ñ   QÓ'‰ä�[‰[˜¤5§;¡;°v·}±}ÔEˆØ×Ñ˜bÓ!×%Ñ% fÓ-×8Ñ8¸Ó@×CÑCÀLÓQ€DØ€Kr   zyfake_quant_per_channel(Tensor input, Tensor scales, Tensor zero_points, int axis, int quant_min, int quant_max) -> Tensorc                   ó,   — e Zd Zed„ «       Zed„ «       Zy)ÚFakeQuantPerChannelc                 ó  — |j                   t        j                  k7  r|j                  t        j                  «      }|j                   t        j                  k7  r|j                  t        j                  «      }|j                   t        j                  k(  sJ d|j                   › �«       ‚||j                  «       k  sJ d|j                  «       › �«       ‚t        t        d|«      «      t        t        |dz   |j                  «      «      z   }t        ||«      }t        ||«      }	t        j                  |d|z  z  «      |	z   }
t        j                  |
||«      |	z
  |z  }t        j                  |
|k\  |
|k  «      }| j                  |«       |S )Nr   r~   r   r/   r   )r   r   r#   r"   rÞ   rr   rp   rq   Úndimr   r%   r$   Úlogical_andÚsave_for_backward)Úctxr   r{   r|   rv   r   r   Úbroadcast_dimsÚunsqueeze_scalesÚunsqueeze_zero_pointsÚtempr„   Úmasks                r   ÚforwardzFakeQuantPerChannel.forwardo  sO  € à�<‰<œ5Ÿ=™=Ò(Ø—Y‘YœuŸ}™}Ó-ˆFØ×Ñ¤§¡Ò+Ø%Ÿ.™.¬¯©Ó5ˆKà�K‰Kœ5Ÿ=™=Ò(ð	XàIÈ%Ï+É+ÈÐWó	XØ(à�e—i‘i“kÒ!ÐJÐ%<¸U¿Y¹Y»[¸MÐ#JÓJÐ!Üœe A t›nÓ-´´U¸4À!¹8ÀUÇZÁZÓ5PÓ0QÑQˆÜ.¨v°~ÓFÐÜ 3°KÀÓ PÐÜ�{‰{˜5 CÐ*:Ñ$:Ñ;Ó<Ð?TÑTˆä�K‰K˜˜i¨Ó3Ð6KÑKØñˆô × Ñ  $¨)Ñ"3°t¸yÑ7HÓJˆà×Ñ˜dÔ#Øˆ
r   c                 ó4   — | j                   \  }||z  d d d d d fS r;   )Úsaved_tensors)ré   Úgyrî   s      r   ÚbackwardzFakeQuantPerChannel.backward…  s&   € à×#Ñ#‰ˆØ�D‰y˜$  d¨D°$Ð6Ð6r   N)Ú__name__Ú
__module__Ú__qualname__Ústaticmethodrï   ró   © r   r   rä   rä   n  s(   „ Øñó ðð* ñ7ó ñ7r   rä   Úfake_quant_per_channelÚAutogradc                 ó6   — t         j                  | |||||«      S r;   )rä   Úapply©r   r{   r|   rv   r   r   s         r   rù   rù   ‹  s$   € ô ×$Ñ$Øˆv�{ D¨)°Yóð r   c                 ó,   — t        j                  | «      S r;   ©r   r*   rý   s         r   Úfake_quant_per_channel_metar   ™  s   € ô ×Ñ˜EÓ"Ð"r   zFconvert_element_type.no_fuse(Tensor input, ScalarType dtype) -> Tensorzconvert_element_type.no_fusec                 ój   — t         j                  j                  j                  j	                  | |«      S r;   )r   ÚopsÚprimsÚconvert_element_typeÚdefaultr·   s     r   r  r  ª  s%   € ô �9‰9�?‰?×/Ñ/×7Ñ7¸¸uÓEÐEr   c                 ó0   — t        j                  | |¬«      S rE   rÿ   r·   s     r   Úconvert_element_type_metar  ³  s   € ä×Ñ˜E¨Ô/Ð/r   )rÎ   )Mr»   Útypingr   r   Útorch._refsr   Útorch.ao.quantization.utilsr   r   Útorch.libraryr   r   Úquantized_decomposed_libÚuint8rš   Úuint16Úint16rÞ   Ú_INTEGER_DTYPESÚfloat8_e5m2Úfloat8_e4m3fnÚ_FLOAT_DTYPESÚiinfor–   r«   r   ÚupdateÚintr¬   r   Údefiner\   r™   r   r   r,   r5   r7   r9   r<   r=   rF   rJ   rL   rN   rP   rt   r`   rd   rl   rn   ry   rz   r†   r‡   rŒ   r�   r¤   r¦   rµ   r¹   r¾   r¿   rÆ   r#   rÇ   rÌ   rÍ   rÙ   rÚ   ÚautogradÚFunctionrä   rù   r   r  r  )Úks   0r   ú<module>r     sü  ðã Ý ã Ý +ß Mß 'ñ
 #Ð#9¸5ÓAÐ à—;‘; §
¡
¨E¯L©L¸%¿+¹+ÀuÇ{Á{ÐS€Ø×"Ñ" E×$7Ñ$7Ð8€ð :IöØ45€Aˆˆ�‰�A‹×Ñ˜K˜EŸK™K¨›N×.Ñ.Ð/Ñ/òÐ ð × Ñ ØDQÖR¸q€Q‰ˆ[ˆU�[‰[˜‹^×ÑÓ	 ¡# k e§k¡k°!£n×&8Ñ&8Ó"9Ð:Ñ:ÒRôòð  × Ñ ð@ôñ ÐÐ 5Ð7RÓSð!Ø�<‰<ð!àð!ð ð!ð ð	!ð
 ð!ð �;‰;ð!ð ‡\�\ò!ó Tð!ñH ÐÐ 5°vÓ>ð0Ø�<‰<ð0àð0ð ð0ð ð	0ð
 ð0ð �;‰;ð0ð ‡\�\ò0ó ?ð0ð  × Ñ ð@ôñ ØÐ:Ð<WóðØ�<‰<ðà�<‰<ðð —‘ðð ð	ð
 ðð �;‰;ðð ‡\�\òóðñ0 ÐÐ <¸fÓEð0Ø�<‰<ð0à�<‰<ð0ð —‘ð0ð ð	0ð
 ð0ð �;‰;ð0ð ‡\�\ò0ó Fð0ð. × Ñ ðFôñ ØÐ;Ð=XóðØ�<‰<ðà�<‰<ðð —‘ðð �|‰|ð	ð
 �|‰|ðð �;‰;ðð ‡\�\òóðñ: ÐÐ =¸vÓFð
Ø�<‰<ð
à�<‰<ð
ð —‘ð
ð �|‰|ð	
ð
 �|‰|ð
ð �;‰;ð
ð ‡\�\ò
ó Gð
ð" × Ñ ð_ôñ ÐÐ 7Ð9TÓUð (,ò/QØ�<‰<ð/Qàð/Qð ð/Qð ð	/Qð
 ð/Qð �;‰;ð/Qð ˜Ÿ™Ñ$ð/Qð ‡\�\ò/Qó Vð/Qñd ÐÐ 7¸Ó@ð (,ò4Ø�<‰<ð4à�<‰<ð4ð —‘ð4ð ð	4ð
 ð4ð �;‰;ð4ð ˜Ÿ™Ñ$ð4ð ‡\�\ò4ó Að4ð × Ñ ð_ôñ ØØ"Øóð (,òØ�<‰<ðà�<‰<ðð —‘ðð ð	ð
 ðð �;‰;ðð ˜Ÿ™Ñ$ðð ‡\�\òóð
ñ@ ÐÐ >ÀÓGð (,òQØ�<‰<ðQà�<‰<ðQð —‘ðQð ð	Qð
 ðQð �;‰;ðQð ˜Ÿ™Ñ$ðQð ‡\�\òQó HðQð4 × Ñ ðeôñ ØØ#Øóð (,òØ�<‰<ðà�<‰<ðð —‘ðð �|‰|ð	ð
 �|‰|ðð �;‰;ðð ˜Ÿ™Ñ$ðð ‡\�\òóð
ñ@ ÐÐ ?ÀÓHð (,òð ˜Ÿ™Ñ$ðð ‡\�\òó Iðð × Ñ ð7ôñ ÐÐ 7Ð9TÓUð$Ø�<‰<ð$Ø"ð$Ø*-ð$Ø49ð$ØBGÇ+Á+ð$à
ˆ5�<‰<˜Ÿ™Ð%Ñ&ò$ó Vð$ðN × Ñ ð7ôñ ØØ%Øóð
$Ø�<‰<ð$Ø"ð$Ø*-ð$Ø49ð$ØBGÇ+Á+ð$à
ˆ5�<‰<˜Ÿ™Ð%Ñ&ò$óð
$ñN ÐÐ 7¸Ó@ðØ�<‰<ðØ$'ðØ47ðØ>CðØLQÏKÉKðà
ˆ5�<‰<˜Ÿ™Ð%Ñ&òó Aðñ" ÐÐ AÀ6ÓJðØ�<‰<ðØ$'ðØ47ðØ>CðØLQÏKÉKðà
ˆ5�<‰<˜Ÿ™Ð%Ñ&òó Kðòð × Ñ ð@ôñ ÐÐ 6Ð8SÓTð,Ø�<‰<ð,à�L‰Lð,ð —‘ð,ð ð	,ð
 ð,ð ð,ð �;‰;ð,ð ‡\�\ò,ó Uð,ñ^ ÐÐ 6¸Ó?ð0Ø�<‰<ð0à�L‰Lð0ð —‘ð0ð ð	0ð
 ð0ð ð0ð �;‰;ð0ð ‡\�\ò0ó @ð0ð. × Ñ ð_ôñ ÐÐ 8Ð:UÓVð (,ò;Ø�<‰<ð;à�L‰Lð;ð ˜%Ÿ,™,Ñ'ð;ð ð	;ð
 ð;ð ð;ð �;‰;ð;ð ˜Ÿ™Ñ$ð;ð ‡\�\ò;ó Wð;ñ| ÐÐ 8¸&ÓAð (,ò4Ø�<‰<ð4à�L‰Lð4ð ˜%Ÿ,™,Ñ'ð4ð ð	4ð
 ð4ð ð4ð �;‰;ð4ð ˜Ÿ™Ñ$ð4ð ‡\�\ò4ó Bð4ð* × Ñ ØRôñ
 ØØØóð
 Ø�<‰<ð à�;‰;ð ð ˆ5�<‰<˜Ÿ™Ð%Ñ&ò óð
 ñF ØØØ
óð
Ø�<‰<ðà�;‰;ðð ˆ5�<‰<˜Ÿ™Ð%Ñ&òóð
ð × Ñ Øcôñ
 ØØ/Øóð
(?Ø�<‰<ð(?à�;‰;ð(?ð ˆ5�<‰<˜Ÿ™Ð%Ñ&ò(?óð
(?ðV × Ñ Ø]ôñ
 ØØ)Øóð
CØ�<‰<ðCà�;‰;ðCð ˆ5�<‰<˜Ÿ™Ð%Ñ&òCóð
Cñ ØØ)Ø
óð
Ø�<‰<ðà�;‰;ðð ˆ5�<‰<˜Ÿ™Ð%Ñ&òóð
òEð × Ñ ð@ôñ ÐÐ 4Ð6QÓRð#Ø�<‰<ð#à�L‰Lð#ð —‘ð#ð ð	#ð
 ð#ð �;‰;ò#ó Sð#ñL ÐÐ 4°fÓ=ð	0Ø�<‰<ð	0à�L‰Lð	0ð —‘ð	0ð ð		0ð
 ð	0ð �;‰;ò	0ó >ð	0ð × Ñ ðYôñ ÐÐ 6Ð8SÓTð !&§¡ñ"Ø�<‰<ð"à�L‰Lð"ð —‘ð"ð ð	"ð
 ð"ð �;‰;ð"ð —+‘+ò"ó Uð"ñB ÐÐ 6¸Ó?ð !&§¡ñ7Ø�<‰<ð7à�L‰Lð7ð —‘ð7ð ð	7ð
 ð7ð �;‰;ð7ð —+‘+ò7ó @ð7ð × Ñ ðAôñ ØÐ:Ð<Wóð ñ!Ø�<‰<ð!à�L‰Lð!ð —‘ð!ð ð	!ð
 ð!ð �;‰;ò!óð!ñH ÐÐ <¸fÓEð ñ"0Ø�<‰<ð"0à�L‰Lð"0ð —‘ð"0ð ð	"0ð
 ð"0ð �;‰;ò"0ó Fð"0ðJ × Ñ ðZôñ ØØ"Øóð Ø %§¡ñ+Ø�L‰Lð+à�L‰Lð+ð ˜%Ÿ,™,Ñ'ð+ð ð	+ð
 ð+ð �;‰;ð+ð ð+ð —+‘+ò+óð
+ð\ × Ñ ð.ôô7˜%Ÿ.™.×1Ñ1ô 7ñ: ÐÐ 8¸*ÓEð
Ø�<‰<ð
à�L‰Lð
ð —‘ð
ð ð	
ð
 ð
ð ð
ð ‡\�\ò
ó Fð
ñ ÐÐ 8¸&ÓAð#Ø�<‰<ð#à�L‰Lð#ð —‘ð#ð ð	#ð
 ð#ð ð#ð ‡\�\ò#ó Bð#ð × Ñ ØLôñ
 ØØ"Øóð
F §¡ð F°U·[±[ð FÀUÇ\Á\ò Fóð
Fñ ÐÐ >ÀÓGð0 U§\¡\ð 0¸%¿+¹+ð 0È%Ï,É,ò 0ó Hñ0ùòE%ùò Ss   ÂA v7ÃAv<