+
    ‰°³jÌp  ã                   ó>  € ^ RI t ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIH	t	 ^ RI
HtHtHt ^RIHt ^RIHt R tR tR t]	R	 4       tR
 tRR ltRR ltRR ltRR ltRR lt ! R R4      t ! R R4      tR tRR ltRR lt R t!]	RR l4       t"RR lt#R# )é    N)Úcontextmanager)ÚAnyÚDictÚList)Úlanguage)Úruntimec                 ó  € R P                  V 4      p RRRRV ,           R.p\        P                  ! V4      pVP                  \        P
                  P                  4      P                  R 4      pV Uu. uF  p\        V4      NK  	  ppV# u upi )Ú,ú
nvidia-smiú-iÚ0z--query-gpu=z--format=csv,noheader,nounits)	ÚjoinÚ
subprocessÚcheck_outputÚdecodeÚsysÚstdoutÚencodingÚsplitÚint)ÚattrsÚcmdÚoutÚretÚxs   &    ÚO/home/luca/screen-checking/.venv/lib/python3.14/site-packages/triton/testing.pyÚnvsmir      sz   € Ø�H‰H�U‹O€EØ˜˜s N°UÕ$:Ð<[Ð
\€CÜ
×
!Ò
! #Ó
&€CØ
�*‰*”S—Z‘Z×(Ñ(Ó
)×
/Ñ
/°Ó
4€CÙÓ
™3�aŒ3ˆqŽ6™3€CÐ
Ø€Jùò  s   Á2B
c                 óx   a a€ \        S 4      o\        S 4      o V V3R  lpV Uu. uF
  q2! V4      NK  	  up# u upi )c                 ó  <€ ^ T u;8:  d   ^8:  g   M \        R4      hV S^,
          ,          p\        P                  ! V4      p\        P                  ! V4      pW,
          p^V,
          SV,          ,          VSV,          ,          ,           # )r   z%Quantiles must be in the range [0, 1])Ú
ValueErrorÚmathÚfloorÚceil)ÚqÚpointÚlowerÚupperÚtÚaÚns   &    €€r   Úget_quantileÚ_quantile.<locals>.get_quantile    sj   ø€ Ø�Q–˜!–ÜÐDÓEÐEØ�Q˜•U•ˆÜ—
’
˜5Ó!ˆÜ—	’	˜%Ó ˆØ�MˆØ�A•˜˜5�Õ! A¨¨%­¥LÕ0Ð0ó    )ÚlenÚsorted)r)   r$   r+   Úqir*   s   f&  @r   Ú	_quantiler1      s9   ù€ ÜˆA‹€AÜˆq‹	€Aö1ñ ()Ó)¡q ˆL˜Ö¡qÑ)Ð)ùÒ)s   ¤7c                 ó(  € Ve'   \        W4      p\        V4      ^8X  d
   V^ ,          pV# VR8X  d   V # VR8X  d   \        V 4      # VR8X  d   \        V 4      # VR8X  d   \        P
                  ! V 4      # VR8X  d   \        P                  ! V 4      # R # )NÚallÚminÚmaxÚmeanÚmedian)r1   r.   r4   r5   Ú
statisticsr6   r7   )ÚtimesÚ	quantilesÚreturn_moder   s   &&& r   Ú_summarize_statisticsr<   ,   s‘   € ØÒÜ˜Ó)ˆÜˆs‹8�qŒ=Ø�a•&ˆCØˆ
Ø�eÔØˆØ	˜Ô	Ü�5‹zÐØ	˜Ô	Ü�5‹zÐØ	˜Ô	Ü�Š˜uÓ%Ð%Ø	˜Ô	 Ü× Ò  Ó'Ð'ñ 
!r-   c               #   ó¢  "  € ^ RI Hp  \        P                  ! R\        P
                  ! 4       P                   2R7      ;_uu_ 4       pV P                  \        P                  P                  VR4      RRR7      p W3x € Ve   V P                  V4       RRR4       R#   Te   T P                  T4       i i ; i  + '       g   i     R# ; i5i)r   Nztriton-bench-proton-)ÚprefixÚprofileÚshadowÚtree)ÚcontextÚdata)Útriton.profilerÚprofilerÚtempfileÚTemporaryDirectoryÚuuidÚuuid4ÚhexÚstartÚosÚpathr   Úfinalize)ÚprotonÚtmpdirÚsessions      r   Ú_proton_bench_sessionrR   >   s¤   é € å$ä	×	$Ò	$Ð.BÄ4Ç:Â:Ã<×CSÑCSÐBTÐ,U×	VÕ	VÐZ`Ø—,‘,œrŸw™wŸ|™|¨F°IÓ>ÈÐW]�,Ó^ˆð	)Ø�/Ò!àÒ"Ø—‘ Ô(÷ 
WÑ	Vøð
 Ò"Ø—‘ Õ(ð #ú÷ 
W×	VÐ	Vüs6   ‚ACÁ3B;Á<B ÂB;Â
CÂ B8Â8B;Â;C	Ã	Cc                 ó˜   aaaa€ . oV3R  loVVVV3R loV  F  pS! V4       K  	  \        S4       UUu. uF  w  r4VNK	  	  upp# u uppi )c                 óÄ   <€ V P                  R . 4      p\        V4      ^ 8X  d*   V P                  R/ 4      P                  R^ 4      R,          # \        V3R lV 4       4      # )ÚchildrenÚmetricsz	time (ns)ç    €„.Ac              3   ó4   <"  € T F  pS! V4      x € K  	  R # 5i©N© )Ú.0ÚchildÚkernel_time_mss   & €r   Ú	<genexpr>ÚF_collect_proton_scope_times.<locals>.kernel_time_ms.<locals>.<genexpr>R   s   øé € Ð?±h¨U‘> %×(Ð(³hùs   ƒ)Úgetr.   Úsum)ÚnoderU   r]   s   & €r   r]   Ú3_collect_proton_scope_times.<locals>.kernel_time_msN   sS   ø€ Ø—8‘8˜J¨Ó+ˆÜˆx‹=˜AÔØ—8‘8˜I rÓ*×.Ñ.¨{¸AÓ>ÀÕDÐDÜÔ?±hÓ?Ó?Ð?r-   c                 ó  <€ V P                  R / 4      P                  RR4      pVP                  S4      '       d$   S! V 4      pV^ 8”  d   SP                  W34       R# V P                  R. 4       F  pS! V4       K  	  R# )ÚframeÚnameÚ NrU   )r`   Ú
startswithÚappend)rb   rf   Útime_msr\   r]   r>   Úscope_timesÚvisits   &   €€€€r   rl   Ú*_collect_proton_scope_times.<locals>.visitT   so   ø€ Ø�x‰x˜ Ó$×(Ñ(¨°Ó4ˆØ�?‰?˜6×"Ò"Ù$ TÓ*ˆGØ˜Œ{Ø×"Ñ" D ?Ô3ÙØ—X‘X˜j¨"Ö-ˆEÙ�%ŽLó .r-   )r/   )Údatabaser>   rb   Ú_Útimer]   rk   rl   s   &f   @@@r   Ú_collect_proton_scope_timesrq   K   sL   û€ Ø€Kõ@÷ð ó ˆÙˆdŽñ ä & {Ô 3Ô4Ñ 3‘W�Q‹DÑ 3Ò4Ð4ùÓ4s   µAc           	     óž  € ^ RI pVR9   g   Q hVP                  P                  VP                  P                  4       4      ;_uu_ 4        V ! 4        Ve2   V F+  pVP	                  4        VP                  R4       RVn        K-  	  VP                  P                  RR7      pVP                  P                  RR7      pVP                  4        \        ^4       F
  p	V ! 4        K  	  VP                  4        VP                  P                  4        VP                  V4      ^,          p
V
^ 8X  d   RpM\        ^\        W,          4      4      pVP                  P                  4       pVP                  P                  V4      ;_uu_ 4        \        V4       F  p	Ve   V F
  pRVn        K  	  V ! 4        K   	  RRR4       VP                  P                  4        . p^
p\        V4       F¤  p	VP                  P                  RR7      pVP                  P                  RR7      pVP                  4        VP!                  4        VP                  4        VP                  P                  4        W×P                  V4      V,          .,          pK¦  	  \#        WÓV4      uuRRR4       #   + '       g   i     L÷; i  + '       g   i     R# ; i)a¢  
Benchmark the runtime of the provided function.

:param fn: Function to benchmark
:type fn: Callable
:param rep: Repetition time (in ms)
:type rep: int
:param grad_to_none: Reset the gradient of the provided tensor to None
:type grad_to_none: torch.tensor, optional
:param return_mode: The statistical measure to return. Options are "min", "max", "mean", "median", or "all". Default is "mean".
:type return_mode: str
NT©Úenable_timingéè  ©r4   r5   r6   r7   r3   )ÚtorchÚcudaÚstreamÚStreamÚdetach_Úrequires_grad_ÚgradÚEventÚrecordÚrangeÚsynchronizeÚelapsed_timer5   r   Ú	CUDAGraphÚgraphÚreplayr<   )ÚfnÚrepÚgrad_to_noner:   r;   rw   r   Ústart_eventÚ	end_eventro   Úestimate_msÚn_repeatÚgr   Ú	n_retriess   &&&&&          r   Údo_bench_cudagraphr�   c   s3  € ó ØÐAÔAÐAÐAà	�‰×	Ñ	˜5Ÿ:™:×,Ñ,Ó.×	/Õ	/á
ŒØÒ#Û!�Ø—	‘	”Ø× Ñ  Ô&Ø�–ñ "ð —j‘j×&Ñ&°TÐ&Ó:ˆØ—J‘J×$Ñ$°4Ð$Ó8ˆ	Ø×ÑÔÜ�q–ˆAÙŽDñ à×ÑÔØ�
‰
×ÑÔ Ø!×.Ñ.¨yÓ9¸AÕ=ˆà˜!ÔØ‰Hä˜1œc #Õ"3Ó4Ó5ˆHð �J‰J× Ñ Ó"ˆØ�Z‰Z×Ñ˜a× Õ Ü˜8–_�ØÒ+Û)˜Ø!%˜žñ *á–ñ	 %÷ !ð 	�
‰
×ÑÔ àˆØˆ	Ü�yÖ!ˆAØŸ*™*×*Ñ*¸Ð*Ó>ˆKØŸ
™
×(Ñ(°tÐ(Ó<ˆIØ×ÑÔ Ø�H‰HŒJØ×ÑÔØ�J‰J×"Ñ"Ô$Ø×,Ñ,¨YÓ7¸(ÕBÐCÕCŠCñ "ô % S°[ÓA÷a 
0Ò	/÷< !× ú÷= 
0×	/Ð	/ús&   Á	EJ;Æ.J(	Æ9C$J;Ê(J8Ê3J;Ê;K	c                óè  € VR9   g   Q h\         P                  P                  P                  4       pVP                  R8w  d   \        R4      h^ RIpVP                  P                  VP                  P                  4       4      ;_uu_ 4        V ! 4        Ve2   V F+  pVP                  4        VP                  R4       RVn        K-  	  VP                  P                  RR7      pVP                  P                  RR7      p	VP                  4        \        ^4       F
  p
V ! 4        K  	  V	P                  4        VP                  P!                  4        VP#                  V	4      ^,          pV^ 8X  d   RM\%        ^\'        W,          4      4      p\)        4       ;_uu_ 4       w  rÞVf   \        R4      h\         P                  P                  P+                  4       pVP                  P-                  4       pR\.        P0                  ! 4       P2                   R	2pVP                  P5                  V4      ;_uu_ 4        \        V4       Fn  pVe   V F
  pRVn        K  	  \         P                  P                  P7                  V4       VP9                  V VR
 24      ;_uu_ 4        V ! 4        RRR4       Kp  	  RRR4       VP                  P!                  4        ^
p \        V4       F  pVP;                  4        K  	  VP                  P!                  4        VP=                  VRR7       \?        VP@                  PC                  V4      V4       Uu. uF  pVV,          NK  	  ppRRR4       \E        XW44      uuRRR4       #   + '       g   i     EKQ  ; i  + '       g   i     Lê; i  TP=                  TRR7       i ; iu upi   + '       g   i     Lk; i  + '       g   i     R# ; i)a~  
Benchmark the runtime of kernels invoked by the provided function using the Proton profiler and CUDA graphs.
This function is similar to `do_bench_cudagraph` that avoids CPU overhead by replaying a CUDA graph with multiple iterations of the provided function,
but it uses the Proton profiler to measure the runtime of each kernel in the graph instead of using CUDA events to measure the total runtime of the graph.
This allows us to get more fine-grained measurements of the kernel runtimes and to exclude cache flushes from the measurement.
Note that this function has several constraints compared to `do_bench_cudagraph`:
- It does not measure GPU operations other than kernels (e.g., memory copies, synchronization, etc.).
- It supports only the NVIDIA GPU. AMD GPU is a TODO.

:param fn: Function to benchmark
:type fn: Callable
:param rep: Repetition time (in ms)
:type rep: int
:param grad_to_none: Reset the gradient of the provided tensor to None
:type grad_to_none: torch.tensor, optional
:param return_mode: The statistical measure to return. Options are "min", "max", "mean", "median", or "all". Default is "mean".
:type return_mode: str
rx   z�do_bench_cudagraph_proton requires the NVIDIA backend because Proton does not reliably attribute CUDA graph replay launches to scopes on HIP.NTrs   ru   úŽProton profiler session could not be created. Make sure you are running on a supported GPU and that the Proton profiler is properly installed.úproton.Ú.Ú08d©Úflushingrv   )#r   ÚdriverÚactiveÚget_current_targetÚbackendÚRuntimeErrorrw   rx   ry   rz   r{   r|   r}   r~   r   r€   r�   r‚   r5   r   rR   Úget_empty_cache_for_benchmarkrƒ   rH   rI   rJ   r„   Úclear_cacheÚscoper…   Ú
deactivaterq   rC   r`   r<   )r†   r‡   rˆ   r:   r;   Útargetrw   r   r‰   rŠ   ro   r‹   rŒ   rO   rQ   Úcacher�   Úscope_prefixÚirŽ   r(   r9   s   &&&&&                 r   Údo_bench_cudagraph_protonr¤   ¦   s  € ð& ÐAÔAÐAÐAä�^‰^×"Ñ"×5Ñ5Ó7€FØ‡~�~˜ÔÜð Tó Uð 	Uó à	�‰×	Ñ	˜5Ÿ:™:×,Ñ,Ó.×	/Õ	/Ù
ŒØÒ#Û!�Ø—	‘	”Ø× Ñ  Ô&Ø�–ñ "ð
 —j‘j×&Ñ&°TÐ&Ó:ˆØ—J‘J×$Ñ$°4Ð$Ó8ˆ	Ø×ÑÔÜ�q–ˆAÙŽDñ à×ÑÔØ�
‰
×ÑÔ Ø!×.Ñ.¨yÓ9¸AÕ=ˆØ&¨!Ô+‘4´°Q¼¸CÕ<MÓ8NÓ1Oˆä"×$Ô$Ñ(9¨ØŠÜ"ðFóGð Gô —N‘N×)Ñ)×GÑGÓIˆEØ—
‘
×$Ñ$Ó&ˆAØ$¤T§Z¢Z£\×%5Ñ%5Ð$6°aÐ8ˆLØ—‘×!Ñ! !×$Õ$Ü˜xž�AØ#Ò/Û!-˜AØ%)˜AžFñ ".ä—N‘N×)Ñ)×5Ñ5°eÔ<ØŸ™¨¨°q¸°gÐ&>×?Õ?Ùœ÷ @Ñ?ñ )÷ %ð �J‰J×"Ñ"Ô$ØˆIð:Ü˜yÖ)�AØ—H‘H–Jñ *à—
‘
×&Ñ&Ô(à×!Ñ! '°DÐ!Ô9ä,GÈÏÉÏÉÐX_ÓH`ÐbnÔ,oÓpÑ,o q�Q˜—]�]Ñ,oˆEÐp÷3 %ô6 % U¨IÓC÷[ 
0Ò	/÷@ @×?Ñ?ú÷ %×$ûð ×!Ñ! '°DÐ!Õ9üâp÷3 %×$ú÷% 
0×	/Ð	/ús{   ÂDO Æ#BO	È=A*NÊ'NÊ/NÊ;$O	Ë <N0Ì:O	ÍOÍ(O	Í*O ÎNÎ
NÎN-Î(O	Î0OÏO	ÏOÏO Ï O1	c                ó8  € VR9   g   Q h\         P                  P                  P                  4       pV ! 4        VP	                  4        \         P                  P                  P                  4       pVP                  RR7      pVP                  RR7      p	VP                  4        \        ^4       F3  p
\         P                  P                  P                  V4       V ! 4        K5  	  V	P                  4        VP	                  4        VP                  V	4      ^,          p\        ^\        W,          4      4      p\        ^\        W+,          4      4      p\        V4       Uu. uF  qæP                  RR7      NK  	  pp\        V4       Uu. uF  qæP                  RR7      NK  	  p	p\        V4       F
  p
V ! 4        K  	  \        V4       Fs  pVe   V F
  pRVn        K  	  \         P                  P                  P                  V4       WŽ,          P                  4        V ! 4        Wž,          P                  4        Ku  	  VP	                  4        \        W‰4       UUu. uF  w  ppVP                  V4      NK  	  ppp\        VWE4      # u upi u upi u uppi )aT  
Benchmark the runtime of the provided function. By default, returns the mean runtime of :code:`fn` as a single float.

:param fn: Function to benchmark
:type fn: Callable
:param warmup: Warmup time (in ms). Controls how long the function is run before timing begins.
:type warmup: int
:param rep: Repetition time (in ms). Controls the total duration of the timed runs.
:type rep: int
:param grad_to_none: Reset the gradient of the provided tensors to None before each run,
    to avoid gradient accumulation affecting timing.
:type grad_to_none: list[torch.Tensor], optional
:param quantiles: If provided, return these quantiles of the runtime distribution instead
    of a summary statistic. For example, ``[0.2, 0.5, 0.8]`` returns the 20th, 50th, and
    80th percentile runtimes in ms. When set, ``return_mode`` is ignored.
:type quantiles: list[float], optional
:param return_mode: The summary statistic to return when ``quantiles`` is not set.
    ``"mean"`` and ``"median"`` return a single float. ``"min"`` and ``"max"`` return
    the fastest and slowest run respectively. ``"all"`` returns the raw list of
    per-run timings in ms. Default is ``"mean"``.
:type return_mode: str
:return: A single float by default, a list of floats if ``quantiles`` is provided,
    or a list of all per-run timings if ``return_mode="all"``.
:rtype: float | list[float]
Trs   Nrv   )r   r—   r˜   Úget_device_interfacer�   rœ   r~   r   r€   r�   r‚   r5   r   r}   Úzipr<   )r†   Úwarmupr‡   rˆ   r:   r;   Údir¡   r‰   rŠ   ro   r‹   Ún_warmuprŒ   r£   r   ÚsÚer9   s   &&&&&&             r   Údo_benchr­   ò   s  € ð4 ÐAÔAÐAÐAä	�‰×	Ñ	×	3Ñ	3Ó	5€Bá„DØ‡N�NÔä�N‰N×!Ñ!×?Ñ?ÓA€Eð —(‘(¨�(Ó.€KØ—‘ t�Ó,€IØ×ÑÔÜ�1ŽXˆÜ�‰×Ñ×)Ñ)¨%Ô0Ù
Žñ ð ×ÑÔØ‡N�NÔØ×*Ñ*¨9Ó5¸Õ9€Kô �1”c˜&Õ.Ó/Ó0€HÜ�1”c˜#Õ+Ó,Ó-€HÜ9>¸x¼ÓI¹°A—8‘8¨$�8Ö/¹€KÐIÜ7<¸X´ÓG±°!—‘¨�Ö-±€IÐGä�8Ž_ˆÙ
Žñ ô �8Ž_ˆð Ò#Û!�Ø�–ñ "ô 	�‰×Ñ×)Ñ)¨%Ô0à�×ÑÔÙ
ŒØ�×ÑÖñ ð ‡N�NÔÜ+.¨{Ô+FÔGÑ+F¡4 1 aˆQ�^‰^˜AÖÑ+F€EÑGÜ  ¨	Ó?Ð?ùò- JùÚGùó( Hs   Å"JÆJÉ Jc           
     óÖ  € VR
9   g   Q h\         P                  P                  P                  4       pV ! 4        VP	                  4        \         P                  P                  P                  4       pVP                  RR7      pVP                  RR7      p	VP                  4        \        ^4       F3  p
\         P                  P                  P                  V4       V ! 4        K5  	  V	P                  4        VP	                  4        VP                  V	4      ^,          pV^ 8X  d   RpRpM6\        ^\        W,          4      4      p\        ^\        W+,          4      4      p\        V4       F
  p
V ! 4        K  	  VP	                  4        R\        P                  ! 4       P                   R2p\!        4       ;_uu_ 4       w  ppVf   \#        R4      h \        V4       Fn  pVe   V F
  pRVn        K  	  \         P                  P                  P                  V4       VP'                  V VR 24      ;_uu_ 4        V ! 4        RRR4       Kp  	  VP	                  4        VP)                  VRR	7       \+        VP,                  P/                  V4      V4      pRRR4       \1        XWE4      #   + '       g   i     Kß  ; i  TP)                  TRR	7       i ; i  + '       g   i     LH; i)aÏ  
Benchmark the runtime of kernels invoked by the provided function using the Proton profiler.

The measured runtime is generally more accurate than `do_bench` for short kernels that are affected by CPU overhead.
Note that this function has several constraints compared to `do_bench`:
- It does not measure GPU operations other than kernels (e.g., memory copies, synchronization, etc.).
- It supports only AMD and NVIDIA GPUs.

:param fn: Function to benchmark.
:type fn: Callable
:param warmup: Warmup time (in ms).
:type warmup: int
:param rep: Repetition time (in ms).
:type rep: int
:param grad_to_none: Reset the gradient of the provided tensor(s) to `None`.
:type grad_to_none: torch.Tensor, optional
:param quantiles: Performance percentiles to return in addition to the median.
:type quantiles: list[float], optional
:param return_mode: The statistical measure to return. Options are "min", "max", "mean", "median", or "all". Default is "mean".
:type return_mode: str
Trs   ru   r’   r“   Nr‘   r”   r•   rv   )r   r—   r˜   r¦   r�   rœ   r~   r   r€   r�   r‚   r5   r   rH   rI   rJ   rR   r›   r}   rž   rŸ   rq   rC   r`   r<   )r†   r¨   r‡   rˆ   r:   r;   r©   r¡   r‰   rŠ   ro   r‹   rª   rŒ   r¢   rO   rQ   r£   r   r9   s   &&&&&&              r   Údo_bench_protonr¯   <  sR  € ð, ÐAÔAÐAÐAä	�‰×	Ñ	×	3Ñ	3Ó	5€Bá„DØ‡N�NÔä�N‰N×!Ñ!×?Ñ?ÓA€Eà—(‘(¨�(Ó.€KØ—‘ t�Ó,€IØ×ÑÔÜ�1ŽXˆÜ�‰×Ñ×)Ñ)¨%Ô0Ù
Žñ ð ×ÑÔØ‡N�NÔØ×*Ñ*¨9Ó5¸Õ9€Kà�aÔØˆØ‰ä�qœ#˜fÕ2Ó3Ó4ˆÜ�qœ#˜cÕ/Ó0Ó1ˆä�8Ž_ˆÙ
Žñ à‡N�NÔàœTŸZšZ›\×-Ñ-Ð.¨aÐ0€LÜ	×	 Ô	 Ñ$5 V¨WØŠ?ÜðBóCð Cð
	6Ü˜8–_�ØÒ+Û)˜Ø!%˜žñ *ä—‘×%Ñ%×1Ñ1°%Ô8Ø—\‘\ \ N°1°S°'Ð":×;Õ;Ù”D÷ <Ñ;ñ %ð �N‰NÔà×Ñ˜g°ÐÔ5ä+¨F¯K©K¯O©O¸GÓ,DÀlÓSˆ÷# 
!ô& ! ¨	Ó?Ð?÷ <×;Ð;ûð ×Ñ˜g°ÐÕ5ú÷ 
!×	 ús=   Æ?KÇA)K È<J,ÉK É 8KÊ,J=Ê7	K Ë KËKËK(	c                ó&  € ^ RI p^ RIp\        WP                  4      '       g   VP	                  V 4      p \        WP                  4      '       g   VP	                  V4      pVf   Rp\        V4      '       d   V! V P                  4      MTpVf   Rp\        V4      '       d   V! V P                  4      MTp\        WP                  4      '       dX   V P                  VP                  8X  d   V P                  4       p V P                  4       P                  4       P                  4       p \        WP                  4      '       dX   VP                  VP                  8X  d   VP                  4       pVP                  4       P                  4       P                  4       pV P                  ^8”  g   VP                  ^8”  d"   VP                  P                  WW#RVR7       R# VP                  WW#R7      '       g   \        V RV  RV R	V R
V R2
4      hR# )aâ  
Asserts that two inputs are close within a certain tolerance.

:param x: The first input.
:type x: scala, list, numpy.ndarray, or torch.Tensor
:param y: The second input.
:type y: scala, list, numpy.ndarray, or torch.Tensor
:param atol: The absolute tolerance. Default value is 1e-2.
:type atol: float, optional
:param rtol: The relative tolerance. Default value is 0.
:type rtol: float, optional
:param err_msg: The error message to use if the assertion fails.
:type err_msg: str
Ng{®Gáz„?g        T)ÚatolÚrtolÚ	equal_nanÚerr_msg)r±   r²   Ú z is not close to z (atol=z, rtol=Ú))Únumpyrw   Ú
isinstanceÚTensorÚtensorÚcallableÚdtypeÚbfloat16ÚfloatÚcpuÚdetachÚsizeÚtestingÚassert_allcloseÚallcloseÚAssertionError)r   Úyr±   r²   r´   Únprw   s   &&&&&  r   Úassert_closerÈ   ‡  sŽ  € ó Ûô �aŸ™×&Ò&Ø�L‰L˜‹OˆÜ�aŸ™×&Ò&Ø�L‰L˜‹Oˆà‚|ØˆÜ$ TŸNšN‰4�—‘Œ=°€Dà‚|ØˆÜ$ TŸNšN‰4�—‘Œ=°€Dô �!—\‘\×"Ò"Ø�7‰7�e—n‘nÔ$Ø—‘“	ˆAØ�E‰E‹G�N‰NÓ×"Ñ"Ó$ˆÜ�!—\‘\×"Ò"Ø�7‰7�e—n‘nÔ$Ø—‘“	ˆAØ�E‰E‹G�N‰NÓ×"Ñ"Ó$ˆð 	‡v�v�„z�Q—V‘V˜a”ZØ
�
‰
×"Ñ" 1¨dÈÐW^Ð"Ô_ÙØ�;‰;�q $ˆ;×2Ò2Ü ˜y¨¨!¨Ð,=¸a¸SÀÈÀvÈWÐUYÐTZÐZ[Ð\Ó]Ð]ñ 3r-   c                   ó:   a € ] tR tRt o RtRV 3R lR lltRtV tR# )Ú	Benchmarkiº  zc
This class is used by the :code:`perf_report` function to generate line plots with a concise API.
Nc                ó²   <€ V ^8„  d   QhRS[ S[,          RS[ S[,          RS[RS[ S[,          RS[ S[,          RS[RS[S[S[3,          RS[R	S[R
S[RS[/# )é   Úx_namesÚx_valsÚline_argÚ	line_valsÚ
line_namesÚ	plot_nameÚargsÚxlabelÚylabelÚx_logÚy_log)r   Ústrr   r   Úbool)ÚformatÚ__classdict__s   "€r   Ú__annotate__ÚBenchmark.__annotate__¿  s‘   ø€ ÷ ;ñ ;á‘c•ð;ñ ‘S•	ð;ñ ð	;ñ
 ™•9ð;ñ ™•Ið;ñ ð;ñ ‘3™�8�nð;ñ ð;ñ ð;ñ ð;ñ ñ;r-   c                ó–   € Wn         W n        W n        W0n        W@n        WPn        W°n        WÀn        W€n        W�n	        W`n
        Wpn        R# )a�  
Constructor.
x_vals can be a list of scalars or a list of tuples/lists. If x_vals is a list
of scalars and there are multiple x_names, all arguments will have the same value.
If x_vals is a list of tuples/lists, each element should have the same length as
x_names.

:param x_names: Name of the arguments that should appear on the x axis of the plot.
:type x_names: List[str]
:param x_vals: List of values to use for the arguments in :code:`x_names`.
:type x_vals: List[Any]
:param line_arg: Argument name for which different values correspond to different lines in the plot.
:type line_arg: str
:param line_vals: List of values to use for the arguments in :code:`line_arg`.
:type line_vals: List[Any]
:param line_names: Label names for the different lines.
:type line_names: List[str]
:param plot_name: Name of the plot.
:type plot_name: str
:param args: Dictionary of keyword arguments to remain fixed throughout the benchmark.
:type args: Dict[str, Any]
:param xlabel: Label for the x axis of the plot.
:type xlabel: str, optional
:param ylabel: Label for the y axis of the plot.
:type ylabel: str, optional
:param x_log: Whether the x axis should be log scale.
:type x_log: bool, optional
:param y_log: Whether the y axis should be log scale.
:type y_log: bool, optional
:param styles: A list of tuples, where each tuple contains two elements: a color and a linestyle.
:type styles: list[tuple[str, str]]
N)rÍ   rÎ   rÖ   rÏ   rÐ   rÑ   r×   ÚstylesrÔ   rÕ   rÒ   rÓ   )ÚselfrÍ   rÎ   rÏ   rÐ   rÑ   rÒ   rÓ   rÔ   rÕ   rÖ   r×   rß   s   &&&&&&&&&&&&&r   Ú__init__ÚBenchmark.__init__¿  sA   € ð^ ŒØŒØŒ
Ø ŒØ"ŒØ$ŒØŒ
ØŒàŒØŒØ"ŒØŽ	r-   )rÓ   rÏ   rÑ   rÐ   rÒ   rß   rÖ   rÍ   rÎ   rÔ   r×   rÕ   )rg   rg   FFN)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__rá   Ú__static_attributes__Ú__classdictcell__©rÛ   s   @r   rÊ   rÊ   º  s   ø‡ € ñ÷;÷ ;ð ;r-   rÊ   c                   óF   a € ] tR tRt o R tRV 3R lR lltR	R ltRtV tR# )
ÚMarkiý  c                ó   € Wn         W n        R # rY   ©r†   Ú
benchmarks)rà   r†   rï   s   &&&r   rá   ÚMark.__init__ÿ  s   € ØŒØ$Žr-   c                ó2   <€ V ^8„  d   QhRS[ RS[RS[RS[/# )rÌ   ÚbenchÚ	save_pathÚ
show_plotsÚ
print_data)rÊ   rØ   rÙ   )rÚ   rÛ   s   "€r   rÜ   ÚMark.__annotate__  s0   ø€ ÷ Cñ C™)ð C±ð CÁð CÑSWñ Cr-   c           	     ó  € ^ RI p^ RIHp	 ^ RIp
VP                   Uu. uF  q» RVP
                   R2NK  	  ppVP                   Uu. uF  q» RVP
                   R2NK  	  ppVP                   Uu. uF  q» RVP
                   R2NK  	  pp\        VP                  4      pV
P                  Wü,           V,           V,           R7      pVP                   EF  p\        V\        \        34      '       g   V Uu. uF  pVNK  	  pp\        V4      \        V4      8w  d   \        R\        V4       RV 24      h\        \        Wû4      4      p. . . pppVP                    FV  pV P"                  ! R/ VBVP$                  V/BVP&                  BVB p Vw  pppVV.,          pVV.,          pVV.,          pKX  	  \        V4      V,           V,           V,           VP*                  \        V4      &   EK  	  VP,                  '       Ede   V	P/                  4        V	P1                  4       pV^ ,          p\3        \        WÍV4      4       EF0  w  pw  ppp VV,          VV ,          ppVP4                  '       d   VP4                  V,          ^ ,          MRp!VP4                  '       d   VP4                  V,          ^,          MRp"VP7                  VV,          VV,          VV!V"R	7       VP9                  4       P;                  4       '       d   KÃ  VP9                  4       P;                  4       '       d   Ké  VP=                  \>        4      pVP=                  \>        4      pVPA                  VV,          VVR
V!R7       EK3  	  VPC                  4        TPE                  VPF                  ;'       g    T4       VPI                  VP
                  4       TPK                  VPL                  '       d   RMR4       TPO                  VPP                  '       d   RMR4       V'       d   V	PS                  4        V'       d8   V	PU                  VPV                  PY                  W!P,                   R24      4       VWü,           ,          pV'       dP   VPZ                  ^,          ^8X  d8   VP\                  P_                  4       w  p#p$VV$,          VV#,          ,
          VR&   V'       d6   \a        VP,                  R,           4       \a        VPc                  4       4       V'       d?   VPe                  VPV                  PY                  W!P,                   R24      RV R2RR7       V# u upi u upi u upi u upi   \(         d    TRRppp ELçi ; i)r   Nz (r¶   z-min (z-max ()Úcolumnsz	Expected z values, got )ÚlabelÚcolorÚlsg333333Ã?)Úalpharú   ÚlogÚlinearz.pngÚDiffÚ:z.csvz%.ÚfF)Úfloat_formatÚindexrZ   )3rL   Úmatplotlib.pyplotÚpyplotÚpandasrÑ   rÕ   ÚlistrÍ   Ú	DataFramerÎ   r¸   Útupler.   r    Údictr§   rÐ   r†   rÏ   rÓ   Ú	TypeErrorÚlocrÒ   ÚfigureÚsubplotÚ	enumeraterß   ÚplotÚisnullr3   Úastyper¾   Úfill_betweenÚlegendÚ
set_xlabelrÔ   Ú
set_ylabelÚ
set_xscalerÖ   Ú
set_yscaler×   ÚshowÚsavefigrM   r   Úshaperø   ÚtolistÚprintÚ	to_stringÚto_csv)%rà   rò   ró   rô   rõ   Údiff_colÚsave_precisionÚkwargsrL   ÚpltÚpdr   Úy_mean_labelsÚy_min_labelsÚy_max_labelsrÍ   Údfro   Úx_argsÚrow_meanÚrow_minÚrow_maxrÆ   r   Úy_meanÚy_minÚy_maxÚaxÚfirst_xr£   Ú
mean_labelÚ	min_labelÚ	max_labelÚcolÚstyÚcol0Úcol1s%   &&&&&&&,                             r   Ú_runÚ	Mark._run  sU  € ãå'ÛØ:?×:JÒ:JÓKÑ:J°Q˜3˜b §¡ ¨aÓ0Ñ:JˆÐKØ=B×=MÒ=MÓNÑ=M¸˜#˜V E§L¡L >°Ó3Ñ=MˆÐNØ=B×=MÒ=MÓNÑ=M¸˜#˜V E§L¡L >°Ó3Ñ=MˆÐNÜ�u—}‘}Ó%ˆØ�\‰\ 'Õ"9¸LÕ"HÈ<Õ"Wˆ\ÓXˆØ—•ˆAä˜a¤$¬ ×/Ò/Ù 'Ó(¡˜1“Q¡�Ð(ä�1‹vœ˜W›Ô%Ü  9¬S°«\¨N¸-ÈÀsÐ!KÓLÐLÜœ#˜g›/Ó*ˆFà)+¨R°˜w�gˆHØ—_”_�Ø—g’gÑV ÐV¨5¯>©>¸1Ð*=ÐVÀÇÁÐVÈvÑV�ð;Ø+.Ñ(�F˜E 5ð ˜V˜HÕ$�Ø˜E˜7Õ"�Ø˜E˜7Õ"’ñ %ô # 1›g¨Õ0°7Õ:¸WÕDˆB�F‰F”3�r“7ŒOñ' ð* �?�?‰?Ø�J‰JŒLØ—‘“ˆBà˜a•jˆGÜ9BÄ3À}ÐdpÓCq×9rÑ5�Ñ5�J 	¨9Ø! )�}¨b°­m�u�Ø,1¯L¯L¨L�e—l‘l 1•o aÖ(¸d�Ø,1¯L¯L¨L�e—l‘l 1•o aÖ(¸d�Ø—‘˜˜7� R¨
¥^¸:ÈSÐUX�ÔYØ—|‘|“~×)Ñ)×+Ô+°E·L±L³N×4FÑ4F×4HÔ4HØ!ŸL™L¬Ó/�EØ!ŸL™L¬Ó/�EØ—O‘O B w¥K°¸ÀTÐQT�O×Uñ :sð �I‰IŒKØ�M‰M˜%Ÿ,™,×1Ð1¨'Ô2Ø�M‰M˜%Ÿ,™,Ô'à�M‰M 5§;§; ;™%°HÔ=Ø�M‰M 5§;§; ;™%°HÔ=ßØ—‘”
ßØ—‘˜BŸG™GŸL™L¨·±Ð6GÀtÐ4LÓMÔNØ�Õ'Õ(ˆß˜Ÿ™ � qÔ(ØŸ™×*Ñ*Ó,‰JˆD�$Ø˜D� B t¥HÕ,ˆBˆv‰JçÜ�%—/‘/ CÕ'Ô(Ü�"—,‘,“.Ô!ßØ�I‰I�b—g‘g—l‘l 9·±Ð0AÀÐ.FÓGÐXZÐ[iÐZjÐjkÐVlØ!ð ô #àˆ	ùò{ LùÚNùÚNùò )øô !ô ;Ø+.°°d 5˜E�F¢5ð;ús)   �UÁUÁ1UÃ8U$ÆU)Õ)U>Õ=U>c           
     ó0  € \        V P                  \        4      pV'       d   V P                  .MV P                  p. p V F&  p	VP                  V P                  ! W“W3/ VB 4       K(  	  V'       d«   \
        P                  ! VR R7       \        \
        P                  P                  VR4      R4      ;_uu_ 4       p
V
P                  R4       VR\        V4        F"  p	V
P                  RV	P                   R24       K$  	  V
P                  R4       RRR4       M V'       d   V'       d
   V^ ,          # V# R#   + '       g   i     L-; i  T'       d¾   \
        P                  ! TR R7       \        \
        P                  P                  TR4      R4      ;_uu_ 4       p
T
P                  R4       TR\        T4        F"  p	T
P                  RT	P                   R24       K$  	  T
P                  R4       RRR4       i   + '       g   i     i ; ii ; i)	T)Úexist_okzresults.htmlÚwz<html><body>
Nz<image src="z.png"/>
z</body></html>
)r¸   rï   rÊ   ri   r9  rL   ÚmakedirsÚopenrM   r   Úwriter.   rÒ   )rà   rô   rõ   ró   Ú	return_dfr"  Úhas_single_benchrï   Ú
result_dfsrò   Úhtmls   &&&&&,     r   ÚrunÚMark.runH  s™  € Ü% d§o¡o´yÓAÐß*:�d—o‘oÑ&ÀÇÁˆ
Øˆ
ð	3Û#�Ø×!Ñ! $§)¢)¨E¸jÑ"_ÐX^Ñ"_Ö`ñ $÷ ä—’˜I°Õ5Üœ"Ÿ'™'Ÿ,™, y°.ÓAÀ3×GÔGÈ4Ø—J‘JÐ/Ô0Ø!+Ð,<¬S°«_Ó!=˜ØŸ
™
 ]°5·?±?Ð2CÀ:Ð#NÖOñ ">à—J‘JÐ1Ô2÷	 HÐGð ÷ ßØ! !•}Ð$à!Ð!Ù÷ H×Gû÷ ä—’˜I°Õ5Üœ"Ÿ'™'Ÿ,™, y°.ÓAÀ3×GÔGÈ4Ø—J‘JÐ/Ô0Ø!+Ð,<¬S°«_Ó!=˜ØŸ
™
 ]°5·?±?Ð2CÀ:Ð#NÖOñ ">à—J‘JÐ1Ô2÷	 H×G×GÐGúð ús2   ¿,E Â=AD;Ä;E	ÅAHÆ!AH	Ç8	HÈHÈ	H)rï   r†   N)Fé   )FFrg   F)	rã   rä   rå   ræ   rá   r9  rE  rè   ré   rê   s   @r   rì   rì   ý  s!   ø‡ € ò%÷Cò C÷Jò r-   rì   c                ó   a € V 3R lpV# )zÚ
Mark a function for benchmarking. The benchmark can then be executed by using the :code:`.run` method on the return value.

:param benchmarks: Benchmarking configurations.
:type benchmarks: List of :class:`Benchmark`
c                 ó   <€ \        V S4      # rY   )rì   rî   s   &€r   Ú<lambda>Úperf_report.<locals>.<lambda>g  s   ø€ œ˜b *Ô-r-   rZ   )rï   Úwrappers   f r   Úperf_reportrM  `  s   ø€ ô .€GØ€Nr-   c                óT  € ^RI Hp V f)   VP                  P                  4       P	                  4       p VP                  P
                  P                  V 4      R,          pVP                  P
                  P                  V 4      R,          pW#,          ^,          R,          ^,          pV# )zreturn DRAM bandwidth in GB/s ©r—   Úmem_clock_rateÚmem_bus_widthrW   )r   r—   r˜   r¦   Úcurrent_deviceÚutilsÚget_device_properties)Údevicer—   Úmem_clock_khzÚ	bus_widthÚbw_gbpss   &    r   Úget_dram_gbpsrY  k  s‚   € õ  Ø‚~Ø—‘×3Ñ3Ó5×DÑDÓFˆØ—M‘M×'Ñ'×=Ñ=¸fÓEÐFVÕW€MØ—‘×#Ñ#×9Ñ9¸&ÓAÀ/ÕR€IØÕ'¨!Õ+¨cÕ1°AÕ5€GØ€Nr-   c                 ó–  € ^ RI p^RIHp V'       g   VP                  P	                  4       pVP
                  P                  P                  V4      R,          ^,          pVP                  P                  V4      pV^ ,          ^8  d   WP                  8X  g   Q hRpM•WP                  VP                  39   d   RpMvWP                  VP                  VP                  39   d   RpMLWP                  \        P                   \        P"                  \        P$                  39   d   RpM\'        R4      hWQ,          V,          R,          pV# )	r   NrO  Úmultiprocessor_counté   i   i   údtype not supportedç•Ö&è.>)rw   r   r—   rx   rR  r˜   rS  rT  Úget_device_capabilityÚfloat16Úfloat32Úint32r½   Úint16Úint8ÚtlÚ
float8e4nvÚfloat8e4b15Úfloat8e5r›   ©	r¼   Ú
clock_raterU  rw   r—   Únum_subcoresÚ
capabilityÚops_per_sub_coreÚtflopss	   &&&      r   Úget_max_tensorcore_tflopsro  w  sú   € ÛåßØ—‘×*Ñ*Ó,ˆà—=‘=×&Ñ&×<Ñ<¸VÓDÐE[Õ\Ð_`Õ`€LØ—‘×1Ñ1°&Ó9€JØ�!…}�qÔØŸ™Ô%Ð%Ð%ØÑà—]‘] E§K¡KÐ0Ô0Ø"ÑØ—}‘} e§n¡n°e·k±kÐBÔBØ"ÑØ—z‘z¤2§=¡=´"·.±.Ä"Ç+Á+ÐNÔNØ#ÑäÐ4Ó5Ð5ØÕ&Ð)9Õ9¸DÕ@€FØ€Mr-   c                  ó   a € V 3R  lpV# )c                 óJ   <a € \         P                  ! S 4      VV 3R  l4       pV# )c                  ó´  <€ ^ RI pVP                  \        P                  ! 4       4      P	                  4       pS
P                  4       VP                  4       8*  pV'       dð   VR8w  dé   \        P                  P                  SP                  R,          4      pR\        P                  R,          RR/pRV9   g   Q R4       hVR,          P                  P                  P                  pV R	SP                   R
V R2p\        P                  ! RRRV.RVR7      p	V	P                   ^ 8X  g   Q R4       hR\#        V	P$                  4      9   g   Q hR# S! V / VB  R# )r   Nzcuda-memcheckÚ__file__ÚPATHÚPYTORCH_NO_CUDA_MEMORY_CACHINGÚ1Úrequestz@memcheck'ed test must have a (possibly unused) `request` fixturez::Ú[Ú]Úpytestz-vsT)Úcapture_outputÚenvz7cuda-memcheck returned an error: bounds checking failedzERROR SUMMARY: 0 errors)ÚpsutilÚProcessrL   Úgetppidrf   ÚitemsrM   ÚrealpathÚ__globals__Úenvironrb   ÚcallspecÚidrã   r   rE  Ú
returncoderØ   r   )rÓ   r"  r}  Ú	ppid_nameÚrun_cuda_memcheckrM   r|  Útest_idr   r   Útarget_kwargsÚtest_fns   *,        €€r   rL  Ú1cuda_memcheck.<locals>.decorator.<locals>.wrapper˜  s&  ø€ ãØŸ™¤r§z¢z£|Ó4×9Ñ9Ó;ˆIØ -× 3Ñ 3Ó 5¸¿¹»Ñ GÐß  Y°/Ô%AÜ—w‘w×'Ñ'¨×(;Ñ(;¸JÕ(GÓH�àœrŸz™z¨&Õ1Ð3SÐUXÐY�Ø  FÔ*ÐnÐ,nÓnÐ*Ø  Õ+×0Ñ0×9Ñ9×<Ñ<�Ø˜˜b ×!1Ñ!1Ð 2°!°G°9¸AÐ>�Ü —n’n o°xÀÈÐ%LÐ]aÐgjÔk�Ø—~‘~¨Ô*ÐeÐ,eÓeÐ*Ø0´C¸¿
¹
³OÔCÐCÒCá˜Ð( Ô(r-   )Ú	functoolsÚwraps)r‹  rL  rŠ  s   f €r   Ú	decoratorÚ cuda_memcheck.<locals>.decorator–  s%   ù€ ä	�Š˜Ó	!õ	)ó 
"ð	)ð" ˆr-   rZ   )rŠ  r�  s   l r   Úcuda_memcheckr‘  ”  s   ø€ õð, Ðr-   c           	   #   óö  "  €  \         P                  ! . RO4       \         P                  ! R RRRV  RV  2.4       \         P                  ! R RRRV RV 2.4       \        R.4      ^ ,          p\        R.4      ^ ,          p\        W ,
          4      ^
8  g   Q RV  R	24       h\        W1,
          4      ^
8  g   Q RV R	24       hRV ,          pRV,          R
,          pWE3x € \         P                  ! . RO4       \         P                  ! . RO4       \         P                  ! . RO4       R#   \         P                  ! . RO4       \         P                  ! . RO4       \         P                  ! . RO4       i ; i5i)r   r   r   z--lock-gpu-clocks=r
   z--lock-memory-clocks=zclocks.current.smzclocks.current.memoryzGPU SMs must run at z MHzgü©ñÒMbP?N)r   r   r   ú-pmrv  gÞ 3ßÁOÌ?i   )r   r   r   r“  r   )r   r   r   z-rgc)r   r   r   z-rmc)r   r   r   Úabs)Úref_sm_clockÚref_mem_clockÚcur_sm_clockÚcur_mem_clockrn  Úgbpss   &&    r   Úset_gpu_clockrš  ¯  sf  é € ðCÜ×ÒÒ EÔFÜ×ÒØØØØ   ¨a°¨~Ð>ð	!
ô 	ô 	×ÒØØØØ# M ?°!°M°?ÐCð	!
ô 	ô Ð1Ð2Ó3°AÕ6ˆÜÐ6Ð7Ó8¸Õ;ˆÜ�<Õ.Ó/°"Ô4Ð_Ð8LÈ\ÈNÐZ^Ð6_Ó_Ð4Ü�=Õ0Ó1°BÔ6ÐbÐ:NÈ}ÈoÐ]aÐ8bÓbÐ6Ø)¨LÕ8ˆØ˜Õ&¨Õ-ˆØˆlÒä×ÒÒ EÔFÜ×ÒÒ AÔBÜ×ÒÒ AÖBøô 	×ÒÒ EÔFÜ×ÒÒ AÔBÜ×ÒÒ AÕBüs   ‚E9„CD, Ã"A
E9Ä,A
E6Å6E9c                 ó  € ^ RI p^RIHp V'       g   VP                  P	                  4       pVP
                  P                  P                  V4      R,          ^,          pVP                  P                  4       pV^ ,          ^8  d2   WP                  8X  d   ^ pM[WP                  8X  d   ^@pMH\        R4      hWP                  8X  d   ^ pM*WP                  VP                  39   d   ^@pM\        R4      hWQ,          V,          R,          pV# )r   NrO  r[  r]  r^  )rw   r   r—   rx   rR  r˜   rS  rT  r_  ra  r`  r›   r½   ri  s	   &&&      r   Úget_max_simd_tflopsrœ  Ì  sÚ   € ÛåßØ—‘×*Ñ*Ó,ˆà—=‘=×&Ñ&×<Ñ<¸VÓDÐE[Õ\Ð_`Õ`€LØ—‘×1Ñ1Ó3€JØ�!…}�qÔØ—M‘MÔ!Ø!ÑØ—m‘mÔ#Ø!ÑäÐ4Ó5Ð5à—M‘MÔ!Ø!ÑØ—}‘} e§n¡nÐ5Ô5Ø!ÑäÐ4Ó5Ð5ØÕ&Ð)9Õ9¸DÕ@€FØ€Mr-   )é   NNr6   )é   éd   NNr6   )NNrg   rY   )iF  i¿  )$r�  r!   rL   r8   r   r   rF   rH   Ú
contextlibr   Útypingr   r   r   rg   r   re  r   r   r1   r<   rR   rq   r�   r¤   r­   r¯   rÈ   rÊ   rì   rM  rY  ro  r‘  rš  rœ  rZ   r-   r   Ú<module>r¢     sÄ   ðÛ Û Û 	Û Û Û 
Û Û Ý %ß "Ñ "Ý Ý òò*ò (ð$ ñ	)ó ð	)ò5ô0@BôFIDôXG@ôTH@ôV0^÷f@ñ @÷F`ñ `òFô	ôò:ð6 óCó ðCö8r-   