§
   Õ^‚¾Ì#è÷ã                   ó  — d Z ddlZddlZddlZddlZddlZddlZdZdZdZ	ddiZ
dd„Z G d„ d	¦  «        Z G d
„ d¦  «        Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z G d„ d¦  «        Zd„ Zd d„Zd„ Z G d„ d¦  «        Zd„ Zd„ Zd!d„ZdS )"aÄ  Game probe -- trace, state and remote control of a running Millionaire game (development only).

Shared by the headless harness (scripts/game_harness) and the real game modal in Kodi. In Kodi it is attached only
while the dev harness is enabled (the flag file harness/ENABLED, created by scripts/dialog_harness/kodi_live.py);
otherwise `attach_if_enabled` returns at once and nothing of the game changes.

A probe records into <dir>/trace.jsonl:
  content.*   every call of the content source (begin/welcome/question/feedback/tip) with its result or error
  llm.*       every LLM call of the game (system prompt, chat messages, parsed answer, usage, provider/model, ms)
  http        every HTTP request of the addon while the probe runs (body and answer, never headers / API keys)
  state       each change of the game screen (screen, game state, round)
and keeps <dir>/state.json up to date (see `snapshot`). Commands are JSON files in <dir>/cmd/ (see `Bridge`).
é    NÚABCDi@ gš™™™™™É?Úbridgec                 óØ  ‡— ‰dk    rt          | ¦  «        S t          | t          t          t          t
          f¦  «        s| €| S t          | t          ¦  «        r ˆfd„|                      ¦   «         D ¦   «         S t          | t          t          t          f¦  «        rˆfd„| D ¦   «         S t          | d¦  «        r%t          |                      ¦   «         ‰dz   ¦  «        S t          | ¦  «        S )Né   c                 óX   •— i | ]&\  }}t          |¦  «        t          |‰d z   ¦  «        “Œ'S ©é   )ÚstrÚ	_jsonable)Ú.0ÚkÚvÚdepths      €úe/Users/chudy/Library/Application Support/Kodi/addons/plugin.video.milionar/wcs/devtools/game_probe.pyú
<dictcomp>z_jsonable.<locals>.<dictcomp>"   s3   ø€ ÐJÐJÐJ±D°A°q•�A‘”�	 ! U¨Q¡YÑ/Ô/ÐJÐJÐJó    c                 ó6   •— g | ]}t          |‰d z   ¦  «        ‘ŒS r   )r   )r   r   r   s     €r   ú
<listcomp>z_jsonable.<locals>.<listcomp>$   s'   ø€ Ð7Ð7Ð7¨A•	˜!˜U Q™YÑ'Ô'Ð7Ð7Ð7r   Ú_asdictr	   )ÚreprÚ
isinstancer
   ÚintÚfloatÚboolÚdictÚitemsÚlistÚtupleÚsetÚhasattrr   r   )Úvaluer   s    `r   r   r      sÞ   ø€ Øˆq‚y€yÝ�E‰{Œ{ÐÝ�%�#�s¥E­4Ð0Ñ1Ô1ð °U°]ØˆÝ�%�ÑÔð KØJÐJÐJÐJ¸E¿KºK¹M¼MÐJÑJÔJÐJÝ�%�$¥¥sÐ+Ñ,Ô,ð 8Ø7Ð7Ð7Ð7°Ð7Ñ7Ô7Ð7Ýˆu�iÑ Ô ð 5Ý˜Ÿš™œ¨%°!©)Ñ4Ô4Ð4Ý�‰;Œ;Ðr   c                   ó&   — e Zd ZdZdd„Zd„ Zd„ ZdS )ÚTracez>Thread safe event log, in memory and appended to a JSONL file.Nc                 óV  — || _         g | _        g | _        t          j        ¦   «         | _        t          j        ¦   «         | _        d| _        |rVt          j          
                    |¦  «        }|r7t          j                              |¦  «        st          j        |¦  «         d S d S d S d S ©Nr   )ÚpathÚeventsÚ	listenersÚ	threadingÚLockÚ_lockÚtimeÚ_t0Ú_idsÚosÚdirnameÚisdirÚmakedirs)Úselfr&   Úfolders      r   Ú__init__zTrace.__init__-   s¦   € ØˆŒ	ØˆŒØˆŒÝ”^Ñ%Ô%ˆŒ
Ý”9‘;”;ˆŒØˆŒ	Øð 	$Ý”W—_’_ TÑ*Ô*ˆFØð $�bœgŸmšm¨FÑ3Ô3ð $Ý”˜FÑ#Ô#Ð#Ð#Ð#ð	$ð 	$ð$ð $ð $ð $r   c                 ór   — | j         5  | xj        dz  c_        | j        cd d d ¦  «         S # 1 swxY w Y   d S )Nr	   )r+   r.   ©r3   s    r   Únext_idzTrace.next_id9   s‚   € ØŒZð 	ð 	ØˆIŒI˜‰NˆIŒIØ”9ð	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s   ˆ,¬0³0c                 ó¼  — | j         5  t          | j        ¦  «        dz   t          t	          j        ¦   «         | j        z
  d¦  «        |t          j        ¦   «         j        dœ}| 	                    t          |¦  «        ¦  «         | j                             |¦  «         | j        rm	 t          | j        dd¬¦  «        5 }|                     t          j        |d¬¦  «        d	z   ¦  «         d d d ¦  «         n# 1 swxY w Y   n# t"          $ r Y nw xY wd d d ¦  «         n# 1 swxY w Y   t%          | j        ¦  «        D ]}	  ||¦  «         Œ# t(          $ r Y Œw xY w|S )
Nr	   é   )ÚseqÚtÚkindÚthreadÚaúutf-8©ÚencodingF)Úensure_asciiú
)r+   Úlenr'   Úroundr,   r-   r)   Úcurrent_threadÚnameÚupdater   Úappendr&   ÚopenÚwriteÚjsonÚdumpsÚOSErrorr   r(   Ú	Exception)r3   r=   ÚdataÚeventÚhandleÚlisteners         r   Úemitz
Trace.emit>   sü  € ØŒZð 
	ð 
	Ý ¤Ñ,Ô,¨qÑ0µu½T¼Y¹[¼[È4Ì8Ñ=SÐUVÑ7WÔ7WÐaeÝ(Ô7Ñ9Ô9Ô>ð@ð @ˆEà�LŠL� 4™œÑ)Ô)Ð)ØŒK×Ò˜uÑ%Ô%Ð%ØŒyð ðÝ˜dœi¨°wÐ?Ñ?Ô?ð SÀ6ØŸš¥T¤Z°ÀEÐ%JÑ%JÔ%JÈTÑ%QÑRÔRÐRðSð Sð Sñ Sô Sð Sð Sð Sð Sð Sð Søøøð Sð Sð Sð Søøåð ð ð Ø�Dðøøøð
	ð 
	ð 
	ñ 
	ô 
	ð 
	ð 
	ð 
	ð 
	ð 
	ð 
	øøøð 
	ð 
	ð 
	ð 
	õ ˜Tœ^Ñ,Ô,ð 	ð 	ˆHðØ�˜‘”��øÝð ð ð Ø�ðøøøàˆsl   ˆBDÂ&DÂ=-C6Ã*DÃ6C:	Ã:DÃ=C:	Ã>DÄDÄ
DÄDÄDÄDÄD"Ä%D"Å EÅ
EÅE©N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r5   r8   rU   © r   r   r#   r#   *   sL   € € € € € ØHÐHð
$ð 
$ð 
$ð 
$ðð ð ð
ð ð ð ð r   r#   c                   ó6   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	dS )	ÚInstrumentsz_Wraps the content source, the LLM entry points and `requests` so every step lands in the trace.c                 ó"   — || _         g | _        d S rV   )ÚtraceÚ_undo)r3   r_   s     r   r5   zInstruments.__init__Y   s   € ØˆŒ
ØˆŒ
ˆ
ˆ
r   c                 ó€   — |                       |¦  «         |                      ¦   «          |                      ¦   «          | S rV   )Ú_wrap_contentÚ	_wrap_llmÚ
_wrap_http)r3   Úcontents     r   ÚinstallzInstruments.install]   s;   € Ø×Ò˜7Ñ#Ô#Ð#Ø�ŠÑÔÐØ�ŠÑÔÐØˆr   c                 óä   — | j         rh| j                              ¦   «         \  }}}}	 |r|j                             |d ¦  «         nt          |||¦  «         n# t          $ r Y nw xY w| j         °fd S d S rV   )r`   ÚpopÚ__dict__ÚsetattrrP   )r3   ÚownerrH   ÚoriginalÚis_instances        r   Ú	uninstallzInstruments.uninstallc   s¡   € ØŒjð 	Ø15´·²Ñ1AÔ1AÑ.ˆE�4˜ ;ðØð 3Ø”N×&Ò& t¨TÑ2Ô2Ð2Ð2å˜E 4¨Ñ2Ô2Ð2øøÝð ð ð Ø�ðøøøð Œjð 	ð 	ð 	ð 	ð 	s   §/A Á
A$Á#A$c           	      óê   ‡‡— | j         ŠdD ]f}t          ‰|d ¦  «        }|�t          |dd¦  «        rŒ'ˆˆfd„}t          ‰| |||¦  «        ¦  «         | j                             ‰|d df¦  «         Œgd S )N)ÚbeginÚwelcomeÚquestionÚfeedbackÚtipÚ_probeFc                 ó*   •‡ ‡— ˆˆ ˆˆfd„}d|_         |S )Nc                  óì  •— ‰                      ¦   «         }‰                     d|‰
t          ‰	dd¦  «        t          | ¦  «        ¬¦  «         t	          j        ¦   «         }	  ‰| i |¤Ž}nr# t
          $ re}‰                     d|‰
t          |¦  «        d                     t          |¦  «        j	        |¦  «        t          j        ¦   «         ¬¦  «         ‚ d }~ww xY wi }‰
dk    r(t          ‰	d	d¦  «        |d	<   t          ‰	d
d¦  «        |d
<   t          ‰	dd ¦  «        }|r7‰
dv r3d„ |D ¦   «         }|r|d         d         nd|d<   t          |¦  «        |d<    ‰j        d|‰
t          |¦  «        |dœ|¤Ž |S )Nzcontent.callrH   Ú )ÚcallÚmethodÚsourceÚargszcontent.errorú{}: {})ry   rz   ÚmsÚerrorÚ	tracebackrp   Úsystem_promptÚ
session_idÚchat_history)rq   rr   rs   c                 óD   — g | ]}|                      d ¦  «        dk    ¯|‘ŒS )ÚroleÚuser©Úget©r   Úms     r   r   zLInstruments._wrap_content.<locals>.make.<locals>.wrapper.<locals>.<listcomp>‰   s,   € Ð OÐ OÐ O q°q·u²u¸V±}´}ÈÒ7NÐ7N Ð7NÐ7NÐ7Nr   éÿÿÿÿre   Úuser_messageÚhistory_lenúcontent.result)ry   rz   r~   Úresult)rŽ   )r8   rU   Úgetattrr   r,   rP   Ú_msÚformatÚtyperW   r€   Ú
format_excrE   )r|   Úkwargsry   Ústartedr�   ÚexcÚextraÚhistoryÚusersre   rH   rl   r_   s            €€€€r   Úwrapperz8Instruments._wrap_content.<locals>.make.<locals>.wrapperx   s¹  ø€ Ø Ÿ=š=™?œ?�DØ—J’J˜~°DÀÍgÐV]Ð_eÐgiÑNjÔNjÝ$(¨¡J¤Jð ñ 0ô 0ð 0å"œi™kœk�GðØ!) ¨4Ð!:°6Ð!:Ð!:˜˜øÝ$ð ð ð ØŸ
š
 ?¸ÀdÍsÐSZÉ|Ì|Ø)1¯ª½¸c¹¼Ô9KÈSÑ)QÔ)QÕ]fÔ]qÑ]sÔ]sð #ñ uô uð uàøøøøðøøøð �EØ˜w’�Ý18¸À/ÐSUÑ1VÔ1V˜˜oÑ.Ý.5°g¸|ÈRÑ.PÔ.P˜˜lÑ+Ý% g¨~¸tÑDÔD�GØð < 4Ð+NÐ#NÐ#NØ OÐ O¨GÐ OÑ OÔ O˜ØHMÐ0U°°b´	¸)Ô0DÐ0DÐSU˜˜nÑ-Ý/2°7©|¬|˜˜mÑ,Ø�E”JÐq°dÀ4ÍCÐPWÉLÌLÐagÐqÐqÐkpÐqÐqÐqØ!�Ms   Á A) Á)
CÁ3A CÃCT©ru   )rH   rl   r›   re   r_   s   `` €€r   Úmakez'Instruments._wrap_content.<locals>.makew   s;   øøø€ ð"ð "ð "ð "ð "ð "ð "ð "ð, "&�”Ø�r   T)r_   r�   rj   r`   rJ   )r3   re   rH   rl   r�   r_   s    `   @r   rb   zInstruments._wrap_contentp   s¯   øø€ Ø”
ˆØGð 	;ð 	;ˆDÝ˜w¨¨dÑ3Ô3ˆHØÐ¥7¨8°X¸uÑ#EÔ#EÐØðð ð ð ð ð õ2 �G˜T 4 4¨¨hÑ#7Ô#7Ñ8Ô8Ð8ØŒJ×Ò˜w¨¨d°DÐ9Ñ:Ô:Ð:Ð:ð?	;ð 	;r   c                 ó†  ‡‡‡‡— 	 ddl m} n# t          $ r Y d S w xY w| j        Šd„ Š|j        Št          ‰dd¦  «        s4dˆˆˆfd„	}d|_        ||_        | j                             |d‰df¦  «         |j	        Št          ‰dd¦  «        s5ˆˆˆfd	„}d|_        ||_	        | j                             |d
‰df¦  «         d S d S )Nr   )Ú	AIHandlerc                  ó‚   — 	 ddl m}  |                      ¦   «         |                      ¦   «         fS # t          $ r Y dS w xY w)Nr   ©Úai_provider)rx   rx   )Úwcs.ai.AIProviderr¢   Úget_current_providerÚget_current_modelrP   r¡   s    r   Ú
model_infoz)Instruments._wrap_llm.<locals>.model_infoœ   s^   € ðØ9Ð9Ð9Ð9Ð9Ð9Ø"×7Ò7Ñ9Ô9¸;×;XÒ;XÑ;ZÔ;ZÐZÐZøÝð ð ð Ø�v�vðøøøs   ‚-0 °
>½>ru   Fc                 ó   •— ‰                      ¦   «         } ‰¦   «         \  }}‰                     d|d||| d„ |D ¦   «         |¬¦  «         t          j        ¦   «         }	  ‰| |fd|i|¤Ž\  }}	nt# t          $ rg}
‰                     d|d||t	          |¦  «        d                     t          |
¦  «        j        |
¦  «        t          j	        ¦   «         ¬¦  «         ‚ d }
~
ww xY w‰                     d	|d||t	          |¦  «        ||	¬
¦  «         ||	fS )Núllm.requestÚchatc                 ó,   — g | ]}t          |¦  «        ‘ŒS r[   )r   r‰   s     r   r   z?Instruments._wrap_llm.<locals>.chat_wrapper.<locals>.<listcomp>©   s   € ÐA\ÐA\ÐA\ÈaÅ$ÀqÁ'Ä'ÐA\ÐA\ÐA\r   )ry   ÚpurposeÚproviderÚmodelr�   ÚmessagesÚoptionsr‚   ú	llm.errorr}   ©ry   r«   r¬   r­   r~   r   r€   úllm.response)ry   r«   r¬   r­   r~   rQ   Úusage)
r8   rU   r,   rP   r‘   r’   r“   rW   r€   r”   )r�   r®   r‚   r•   ry   r¬   r­   r–   rQ   r³   r—   r©   r¦   r_   s              €€€r   Úchat_wrapperz+Instruments._wrap_llm.<locals>.chat_wrapper¥   sT  ø€ Ø—}’}‘”�Ø", *¡,¤,‘�˜%Ø—
’
˜=¨t¸VÈhÐ^cØ)6ÐA\ÐA\ÐS[ÐA\ÑA\ÔA\Ðflð ñ nô nð nåœ)™+œ+�ðØ"& $ }°hÐ"`Ð"`È:Ð"`ÐY_Ð"`Ð"`‘K�D˜%˜%øÝ ð ð ð Ø—J’J˜{°¸vÐPXÐ`eÝ"% g¡,¤,°h·o²oÅdÈ3ÁiÄiÔFXÐZ]Ñ6^Ô6^Ý)2Ô)=Ñ)?Ô)?ð ñ Aô Að Að øøøøð	øøøð
 —
’
˜>°¸fÈxÐ_dÝ! '™lœl°¸Uð ñ Dô Dð Dà˜U�{Ð"s   ÁA. Á.
CÁ8A"CÃCTÚgenerate_millionaire_chatc                  ó  •— ‰
                      ¦   «         } ‰¦   «         \  }}‰
                     d|d||t          | ¦  «        |¬¦  «         t          j        ¦   «         }	  ‰	| i |¤Ž}nt# t          $ rg}‰
                     d|d||t          |¦  «        d                     t          |¦  «        j        |¦  «        t          j
        ¦   «         ¬¦  «         ‚ d }~ww xY w‰
                     d|d||t          |¦  «        |¬¦  «         |S )	Nr¨   rt   )ry   r«   r¬   r­   r|   r•   r°   r}   r±   r²   )ry   r«   r¬   r­   r~   rQ   )r8   rU   r   r,   rP   r‘   r’   r“   rW   r€   r”   )r|   r•   ry   r¬   r­   r–   Útextr—   r¦   rt   r_   s           €€€r   Útip_wrapperz*Instruments._wrap_llm.<locals>.tip_wrapper»   s*  ø€ Ø—}’}‘”�Ø", *¡,¤,‘�˜%Ø—
’
˜=¨t¸UÈXÐ]bÝ $ T¡
¤
°6ð ñ ;ô ;ð ;åœ)™+œ+�ðØ˜3 Ð/¨Ð/Ð/�D�DøÝ ð ð ð Ø—J’J˜{°¸uÈxÐ_dÝ"% g¡,¤,°h·o²oÅdÈ3ÁiÄiÔFXÐZ]Ñ6^Ô6^Ý)2Ô)=Ñ)?Ô)?ð ñ Aô Að Að øøøøð	øøøð
 —
’
˜>°¸eÈhÐ^cÝ! '™lœl°ð ñ 7ô 7ð 7à�s   Á A) Á)
CÁ3A"CÃCÚgenerate_director_tiprV   )
Úwcs.airŸ   rP   r_   rµ   r�   ru   r`   rJ   r¹   )r3   rŸ   r´   r¸   r©   r¦   rt   r_   s       @@@@r   rc   zInstruments._wrap_llm•   sU  øøøø€ ð	Ø(Ð(Ð(Ð(Ð(Ð(Ð(øÝð 	ð 	ð 	ØˆFˆFð	øøøà”
ˆð	ð 	ð 	ð Ô2ˆÝ�t˜X uÑ-Ô-ð 	Uð#ð #ð #ð #ð #ð #ð #ð #ð  #'ˆLÔØ2>ˆIÔ/ØŒJ×Ò˜yÐ*EÀtÈUÐSÑTÔTÐTàÔ-ˆÝ�s˜H eÑ,Ô,ð 	Pðð ð ð ð ð ð ð  "&ˆKÔØ.9ˆIÔ+ØŒJ×Ò˜yÐ*AÀ3ÈÐNÑOÔOÐOÐOÐOð'	Pð 	Ps   † �
šc           	      ó  ‡— 	 dd l }n# t          $ r Y d S w xY w| j        ŠdD ]b}t          ||¦  «        }t          |dd¦  «        rŒ$ˆfd„}t	          || |||¦  «        ¦  «         | j                             |||df¦  «         Œcd S )Nr   )Úpostrˆ   ru   Fc                 ó(   •‡ ‡— ˆ ˆˆfd„}d|_         |S )Nc                 ó  •— ‰
                      ¦   «         }|                     d¦  «        }|€Wt          |                     d¦  «        t          t          f¦  «        r(d                     t          |d         ¦  «        ¦  «        }t          j        ¦   «         }	  ‰	| g|¢R i |¤Ž}n�# t          $ rt}‰
 	                    d|‰ 
                    ¦   «         t          | ¦  «        |t          |¦  «        d                     t          |¦  «        j        |¦  «        ¬¦  «         ‚ d }~ww xY w‰
 	                    d|‰ 
                    ¦   «         t          | ¦  «        |t          |¦  «        |j        t!          |¦  «        ¬¦  «         |S )NrM   rQ   z
<{} bytes>Úhttpr}   )ry   rz   ÚurlÚrequestr~   r   )ry   rz   rÀ   rÁ   r~   ÚstatusÚresponse)r8   rˆ   r   r
   Úbytesr’   rE   r,   rP   rU   ÚupperÚ
_clean_urlr‘   r“   rW   Ústatus_codeÚ_response_body)rÀ   r|   r•   ry   Úbodyr–   rÃ   r—   rz   rl   r_   s           €€€r   r›   z5Instruments._wrap_http.<locals>.make.<locals>.wrapperÝ   sm  ø€ Ø Ÿ=š=™?œ?�DØ!Ÿ:š: fÑ-Ô-�DØ�|­
°6·:²:¸fÑ3EÔ3EÍÍUÀ|Ñ(TÔ(T�|Ø+×2Ò2µ3°v¸f´~Ñ3FÔ3FÑGÔG˜Ý"œi™kœk�GðØ#+ 8¨CÐ#A°$Ð#AÐ#AÐ#A¸&Ð#AÐ#A˜˜øÝ$ð ð ð ØŸ
š
 6°¸V¿\º\¹^¼^ÕQ[Ð\_ÑQ`ÔQ`ÐjnÝ&)¨'¡l¤l¸(¿/º/Í$ÈsÉ)Ì)ÔJ\Ð^aÑ:bÔ:bð #ñ dô dð dàøøøøðøøøð —J’J˜v¨D¸¿º¹¼ÍZÐX[É_Ì_ÐfjÝ"% g¡,¤,°xÔ7KÕVdÐemÑVnÔVnð ñ pô pð pà#�Os   ÂB% Â%
D#Â/A/DÄD#Trœ   )rz   rl   r›   r_   s   `` €r   r�   z$Instruments._wrap_http.<locals>.makeÜ   s6   øøø€ ð$ð $ð $ð $ð $ð $ð $ð "&�”Ø�r   )ÚrequestsrP   r_   r�   rj   r`   rJ   )r3   rÊ   rz   rl   r�   r_   s        @r   rd   zInstruments._wrap_httpÑ   sÚ   ø€ ð	ØˆOˆOˆOˆOøÝð 	ð 	ð 	ØˆFˆFð	øøøà”
ˆØ%ð 	Cð 	CˆFÝ˜x¨Ñ0Ô0ˆHÝ�x ¨5Ñ1Ô1ð Øðð ð ð ð õ$ �H˜f d d¨6°8Ñ&<Ô&<Ñ=Ô=Ð=ØŒJ×Ò˜x¨°¸5ÐAÑBÔBÐBÐBð1	Cð 	Cs   ƒ ˆ
•N)
rW   rX   rY   rZ   r5   rf   rn   rb   rc   rd   r[   r   r   r]   r]   V   s~   € € € € € ØiÐiðð ð ðð ð ð	ð 	ð 	ð!;ð !;ð !;ðJ8Pð 8Pð 8PðxCð Cð Cð Cð Cr   r]   c                 óN   — t          t          j        ¦   «         | z
  dz  ¦  «        S )Niè  )r   r,   )r–   s    r   r‘   r‘   ò   s    € Ý•”	‘”˜gÑ%¨Ñ-Ñ.Ô.Ð.r   c                 óT   — t          | ¦  «                             dd¦  «        d         S )Nú?r	   r   )r
   Úsplit)rÀ   s    r   rÆ   rÆ   ö   s!   € Ýˆs‰8Œ8�>Š>˜#˜qÑ!Ô! !Ô$Ð$r   c                 ó,  — | j                              dd¦  «        }d|v r%	 |                      ¦   «         S # t          $ r Y nw xY w|                     d¦  «        r(d                     |t          | j        ¦  «        ¦  «        S | j        d t          …         S )NzContent-Typerx   rM   )zaudio/zimage/zapplication/octet-streamz<{} {} bytes>)
Úheadersrˆ   rM   Ú
ValueErrorÚ
startswithr’   rE   re   r·   ÚMAX_BODY)rÃ   r=   s     r   rÈ   rÈ   ú   sž   € ØÔ×Ò °Ñ3Ô3€DØ�€~€~ð	Ø—=’=‘?”?Ð"øÝð 	ð 	ð 	ØˆDð	øøøà‡‚ÐGÑHÔHð CØ×%Ò% d­C°Ô0@Ñ,AÔ,AÑBÔBÐBØŒ=˜�(˜Ô#Ð#s   ¡5 µ
AÁAc                 ó\  ‡ ‡— t          ‰ dd¦  «        }t          t          j        ¦   «         d¦  «        |dut          ‰ ¦  «        t	          ‰                      d¦  «        ¦  «        t	          ‰                      d¦  «        ¦  «        dœ}|€|S t          ‰ dd¦  «        d	k    �rnd
dlm} |j        }|j	        j
        dk    }|r|j        nd}|r;|r9|j        t          |j        ¦  «        |j        t           |j                 |j        dœnd}|                     d	d|j	        j
        ‰ j        ‰ j        |                     ¦   «         |                     ¦   «         dk    rdn|                     ¦   «         |r
|j        dz   nd
|r|j        nd
|r|j        nd|r|j        nd
|r |j        rt5          |j        j        ¦  «        nd
||r|j        ndd
di g |                     ¦   «         dk    |rˆ fd„|D ¦   «         ni ¬¦  «         t;          |¦  «        |d<   |S d
dlm} |j         Š‰j!        pd}| "                    ‰¦  «        }	|j#        rdnd|	d<   ‰j$        }
|                     i d|j%        j&        “dt          |
dd¦  «        “dt          |
dd¦  «        “dt5          t          |
d g ¦  «        pg ¦  «        “d!‰j        “d"‰j        “d#| '                    ‰¦  «        “d$‰j(        “d%‰j)        “d&‰j*        “dtW          |¦  «        “d'‰j,        du“d(‰j-         .                    ¦   «         “d)t          ‰d*d¦  «        “d+‰j/        “d,‰j0        “d-‰j1        ‰j2        ‰j3        d.œ“ˆfd/„ti          d0¦  «        D ¦   «         ‰j5        ‰j6        ‰j7        |j#        d|	d1œ¥¦  «         t;          |¦  «        |d<   |S )2z>Everything worth knowing about the game right now (JSON safe).Ú_adapterNr:   zWCS.Game.SettingszWCS.Game.Exit)r<   ÚaliveÚfocusÚsettings_openÚexit_promptÚmodeÚmillionaireÚstoryr   )ÚFIELDSÚdemo)rr   r¯   ÚcorrectÚcorrect_letterÚexplanationÚmodernrr   Úplayingr	   FÚloadingc                 óB   •— i | ]}|‰                      d |z   ¦  «        “ŒS )z
WCS.Story.©ÚgetProperty©r   rH   Úmodals     €r   r   zsnapshot.<locals>.<dictcomp>!  s.   ø€ ÐZÐZÐZÈ4˜$ × 1Ò 1°,ÀÑ2EÑ FÔ FÐZÐZÐZr   )rÚ   Údesignre   ÚtitleÚ
media_typeÚscreenÚ
game_staterF   ÚscoreÚlivesÚansweredÚquestion_countrr   ÚselectedÚ	countdownÚautoplayÚ	lifelinesÚremovedÚbuttons_readyÚviewÚsettled)Ú	game_viewÚtruerx   ÚButtonsReadyrê   re   rH   r‚   Úchat_lenrƒ   rë   rì   rí   rî   rF   rï   Ú
prefetchedÚprefetch_doneró   Úselected_answer_indexrs   rô   rö   )Ú5050rt   Úaudiencec                 ó4   •— g | ]}‰j         ¯	|‰j         v¯|‘ŒS r[   )Úlifeline_5050_indices)r   ÚiÚgames     €r   r   zsnapshot.<locals>.<listcomp><  s/   ø€ ÐnÐnÐn˜!¨4Ô+EÐnÈ!ÐSWÔSmÐJmÐJm�AÐJmÐJmÐJmr   é   )r÷   rt   Úpollrõ   rø   rú   rù   )8r�   rF   r,   Ú_focusr   rç   Úwcs.games.story.viewrÝ   Úenginer{   rH   Úscenerr   r   r¯   rß   ÚLETTERSÚrevealrI   rë   rì   rí   Úindexrð   rñ   ÚpackrE   Úscenesró   rú   Ú	wcs.gamesrû   Ú
controllerÚcurrent_questionrù   Ú_buttons_readyre   rê   ÚkeyÚ	screen_ofrî   Úcurrent_roundrï   Ú	_questionÚprefetched_questionÚprefetch_readyÚis_setÚfeedback_datarô   Úlifeline_5050_usedÚlifeline_tip_usedÚlifeline_audience_usedÚrangeÚtip_viewÚ	poll_viewÚ_autoplay_enabled)ré   ÚadapterÚbaserÝ   r  rÞ   r  rr   rû   rù   re   r  s   `          @r   Úsnapshotr(  
  s…  øø€ å�e˜Z¨Ñ.Ô.€GÝ•t”y‘{”{ AÑ&Ô&°ÀÐ1DÍvÐV[É}Ì}Ý! %×"3Ò"3Ð4GÑ"HÔ"HÑIÔIÝ × 1Ò 1°/Ñ BÔ BÑCÔCðEð E€Dð €ØˆÝˆu�f˜mÑ,Ô,°Ò7Ñ7Ø/Ð/Ð/Ð/Ð/Ð/Ø”ˆØŒ~Ô" fÒ,ˆØ &Ð0�”�¨Dˆà_dðxØimðx ¤½DÀÄÑ<OÔ<OÐ\aÔ\iÝ'.¨u¬}Ô'=ÈeÌlð\ð \ð \Øswð 	à�Š˜¨¸7¼>Ô;NÐV[ÔVaØ$Ô/¸¿ºÑ8HÔ8HØ,3¯NªNÑ,<Ô,<À
Ò,JÐ,J˜y˜yÐPW×P^ÒP^ÑP`ÔP`Ø.4Ð;˜&œ,¨Ñ*Ð*¸!ÐU[ÐCbÀ6Ä>À>ÐabØ*0Ð7˜&œ,˜,°aÐU[ÐBbÀ&Ä/À/ÐabØ>DÐ#[ÈÌÐ#[¥3 v¤{Ô'9Ñ#:Ô#:Ð#:ÐZ[Ø%À6Ð0S°´°ÈtÐ_`Ø"¨b¸"ÈGÏNÊNÑL\ÔL\Ð`iÒLiØ^bÐjÐZÐZÐZÐZÐSYÐZÑZÔZÐZÐhjð 	ñ 	lô 	lð 	lõ " $™-œ-ˆˆY‰ØˆØ#Ð#Ð#Ð#Ð#Ð#ØÔ€DØÔ$Ð,¨€HØ�>Š>˜$ÑÔ€DØ%,Ô%;ÐC˜6˜6À€DˆÑØŒl€GØ‡K‚Kð Ø�'”.Ô$ðà•7˜7 F¨BÑ/Ô/ðð 	•g˜g |°RÑ8Ô8ðð 	•C� ¨¸Ñ<Ô<ÐBÀÑCÔCð	ð
 	�”ðð
 *¨4¬?ðð 	�)×%Ò% dÑ+Ô+ðð 	�d”oðð 	�Ô#ðð 	�”ðð 	•I˜hÑ'Ô'ðð 	�dÔ.°dÐ:ðð 	˜Ô,×3Ò3Ñ5Ô5ðð 	•G˜DÐ"9¸4Ñ@Ô@ðð 	�DÔ&ðð 	�T”^ðð  	˜dÔ5¸dÔ>TØ"&Ô"=ð?ð ?ð!ð$ oÐnÐnÐn�u Q™xœxÐnÑnÔnØŒ} d¤nØÔ*Ø Ô/ØØð/ð ð ñ ô ð õ2 ˜d‘m”m€Dˆ�OØ€Kr   c                 óN   — 	 |                       ¦   «         S # t          $ r Y d S w xY wrV   )Ú
getFocusIdrP   )ré   s    r   r
  r
  G  s;   € ðØ×ÒÑ!Ô!Ð!øÝð ð ð Øˆtˆtðøøøs   ‚ –
$£$c                 óÆ   — | sd S t          | ¦  «        }|                     dd¦  «        }t          |t          ¦  «        rd|cxk    rdk     rn nt          |         nd|d<   |S )Nrß   r   r  rÍ   rà   )r   rˆ   r   r   r  )rr   rQ   rß   s      r   r  r  N  sz   € Øð ØˆtÝ�‰>Œ>€DØ�hŠh�y !Ñ$Ô$€GÝ1;¸GÅSÑ1IÔ1IÐgÈaÐSZÐN^ÐN^ÒN^ÐN^Ð]^ÒN^ÐN^ÐN^ÐN^ÐN^�W WÔ-Ð-Ðdg€DÐ	ÑØ€Kr   c                 ó@  — |                       d¦  «        sdS |                       d¦  «        |                       di ¦  «        }}|dv rdS |dk    rP|                       d¦  «        dk    o6t          |                       d	¦  «        p|                       d
¦  «        ¦  «        S |dk    rdS |dk    rK|                       d¦  «        dk    o1|                      d¦  «        dk    o|                      d¦  «        dk    S |dv r"t          |                       d¦  «        ¦  «        S dS )zdTrue when the game waits for the player (nothing is being prepared, no countdown or animation runs).rÖ   Trí   rù   )rë   Úrulesr   ÚresultsÚintrorî   Úwelcome_screenrÿ   r   rä   Frr   rã   ÚTipStateÚ	PollStateÚrunning)rs   ÚgameoverÚwinrø   )rˆ   r   )Úsnaprí   rù   s      r   rú   rú   W  s1  € à�8Š8�GÑÔð ØˆtØ—8’8˜HÑ%Ô% t§x¢x°¸Ñ';Ô';ˆD€FØÐ7Ð7Ð7ØˆtØ�ÒÐØ�xŠx˜Ñ%Ô%Ð)9Ò9Ðw½dÀ4Ç8Â8ÈLÑCYÔCYÐCvÐ]a×]eÒ]eÐfuÑ]vÔ]vÑ>wÔ>wÐwØ�ÒÐØˆuØ�ÒÐØ—’˜Ñ&Ô&¨)Ò3ð 7¸¿ºÀÑ8LÔ8LÐPYÒ8Yð 7Ø—H’H˜[Ñ)Ô)¨YÒ6ð	8àÐ0Ð0Ð0Ý�D—H’H˜_Ñ-Ô-Ñ.Ô.Ð.Øˆ5r   c                 ó    ‡ — ˆ fd„dD ¦   «         S )Nc                 ó<   •— i | ]}|‰                      |¦  «        “ŒS r[   r‡   )r   r   r6  s     €r   r   z_brief.<locals>.<dictcomp>k  s%   ø€ ÐiÐiÐi˜qˆAˆt�xŠx˜‰{Œ{ÐiÐiÐir   )rí   rî   rF   rú   r×   rÙ   r[   )r6  s   `r   Ú_briefr9  j  s   ø€ ØiÐiÐiÐiÐ$hÐiÑiÔiÐir   c                   ó   — e Zd Zd„ Zd„ ZdS )Ú_BackActionc                 ó   — dS )Né\   r[   r7   s    r   ÚgetIdz_BackAction.getIds  s   € Øˆrr   c                 ó   — dS r%   r[   r7   s    r   ÚgetButtonCodez_BackAction.getButtonCodev  s   € Øˆqr   N)rW   rX   rY   r>  r@  r[   r   r   r;  r;  r  s2   € € € € € ðð ð ðð ð ð ð r   r;  c           	      ó|   — t          | j        |t          | dd¦  «        | j                             ¦   «         ¦  «        S )z[Control id of an intent in the modal's design (answer0-3 / A-D, life5050, start, next ...).rÚ   rx   )Úcontrol_forÚ_designr�   rÕ   rí   )ré   Úintents     r   Ú
control_ofrE  z  s2   € å�u”} f­g°e¸VÀRÑ.HÔ.HÈ%Ì.×J_ÒJ_ÑJaÔJaÑbÔbÐbr   rx   c                 óh  — t          |¦  «        }|dk    rs|                     d¦  «        rdt          |dd…         ¦  «        z   S |dk    r
|dk    rdnd	S |d
k    rddddœ                     |d¦  «        S ddddddœ}||v r||         S | j                             ¦   «         D ]\  }}||k    r|c S ŒdS )zSThe same intent resolution for an attached modal and native clicks from a snapshot.rÜ   Úansweri>&  é   NÚstartrë   i�%  i5&  Úbacki6&  i7&  i9&  )r-  rä   r   iª%  iB&  iD&  iE&  i8&  )ÚnextÚagainrë   ÚhomeÚretry)Únormalize_intentrÒ   r   rˆ   Úclicksr   )rê   rD  rÚ   rí   Ústory_controlsÚcontrolrH   s          r   rB  rB    sø   € å˜fÑ%Ô%€FØˆw‚€Ø×Ò˜XÑ&Ô&ð 	*Ø�#˜f Q R Rœj™/œ/Ñ)Ð)Ø�WÒÐØ! WÒ,Ð,�4�4°$Ð6Ø�VÒÐØ!¨d¸TÐBÐB×FÒFÀvÈtÑTÔTÐTØ"&°ÀÈdÐ]aÐbÐbˆØ�^Ð#Ð#Ø! &Ô)Ð)Øœ×,Ò,Ñ.Ô.ð ð ‰ˆ�Ø�6Š>ˆ>ØˆNˆNˆNð àˆ4r   c                 ó®   — t          | ¦  «                             ¦   «         } dddddddddd	d
œ
}|                     |                      ¦   «         | ¦  «        S )NÚanswer0Úanswer1Úanswer2Úanswer3Úlife5050ÚlifetipÚlifeaudienceÚ	exit_stayÚexit_confirm)
r?   ÚbÚcÚdr  rt   r  r	  ÚstayÚleave)r
   Ústriprˆ   Úlower)rD  Úaliasess     r   rO  rO  ’  s\   € Ý�‰[Œ[×ÒÑ Ô €FØ I°IÀIÐWaØ¨^À^Ð]hØ&ð(ð (€Gð �;Š;�v—|’|‘~”~ vÑ.Ô.Ð.r   c                   óV   — e Zd ZdZdd„Zd„ Zd„ Zd„ Zd„ Zd„ Z	d	„ Z
d
„ Zd„ Zd„ Zd„ ZdS )ÚBridgea�  Keeps <dir>/state.json current, records the trace and runs commands from <dir>/cmd/*.json.

    Command {"id": str, "op": ...}; the answer goes to <dir>/res-<id>.json {"id", "ok", "result" | "error"}.
      act      {"intent": "start" | "answer1" | "B" | "life5050" | "next" ...} -> onClick of its control
      click    {"control": 9500}                                              -> onClick(control)
      back     {}                                                             -> Back as from the remote
      close    {}                                                             -> close the game window
      props    {"names": ["WCS.Game.Screen", ...]}                            window properties as the XML reads them
      seed     {"value": 1}                                                   random.seed (repeatable lifelines)
      snapshot {}
      chat     {}                         system prompt + chat history of the AI content
      call     {"method": "show_generation_error", "args": [...]}            a controller method (debug)
      set      {"attrs": {"current_round": 5}}                                 controller attributes (debug)
    Nc                 ó~  — || _         || _        t          j                             |d¦  «        | _        |p,t          t          j                             |d¦  «        ¦  «        | _        d | _        t          j
        ¦   «         | _        d | _        d | _        d | _        t          j        ¦   «         j        d d…         | _        t          j        ¦   «         | _        t          j                             |d¦  «        | _        || j        fD ]5}t          j                             |¦  «        st          j        |¦  «         Œ6d S )NÚcmdútrace.jsonlé   ÚOWNER)ré   r4   r/   r&   ÚjoinÚcmd_dirr#   r_   Úinstrumentsr)   ÚEventÚ_stopÚ_threadÚ_last_briefÚ_contentÚuuidÚuuid4ÚhexÚidr*   Ú_write_lockÚ
owner_pathr1   r2   )r3   ré   r4   r_   r&   s        r   r5   zBridge.__init__ª  sÿ   € ØˆŒ
ØˆŒÝ”w—|’| F¨EÑ2Ô2ˆŒØÐH�e¥B¤G§L¢L°¸Ñ$GÔ$GÑHÔHˆŒ
ØˆÔÝ”_Ñ&Ô&ˆŒ
ØˆŒØˆÔØˆŒÝ”*‘,”,Ô" 3 B 3Ô'ˆŒÝ$œ>Ñ+Ô+ˆÔÝœ'Ÿ,š, v¨wÑ7Ô7ˆŒØ˜Tœ\Ð*ð 	"ð 	"ˆDÝ”7—=’= Ñ&Ô&ð "Ý”˜DÑ!Ô!Ð!øð	"ð 	"r   c                 ó~  — t          | j        d¦  «        5 }|                     | j        ¦  «         d d d ¦  «         n# 1 swxY w Y   | j                             d| j        | j        ¬¦  «         |                      ¦   «          t          j	        | j
        dd¬¦  «        | _        | j                             ¦   «          | S )NÚwzprobe.start)r4   Úprobez
game-probeT)ÚtargetrH   Údaemon)rK   ry  rL   rw  r_   rU   r4   Ú
instrumentr)   ÚThreadÚ_looprq  rI  ©r3   rS   s     r   rI  zBridge.start½  sÝ   € Ý�$”/ 3Ñ'Ô'ð 	"¨6Ø�LŠL˜œÑ!Ô!Ð!ð	"ð 	"ð 	"ñ 	"ô 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"øøøð 	"ð 	"ð 	"ð 	"àŒ
�Š˜¨d¬kÀÄˆÑIÔIÐIØ�ŠÑÔÐÝ Ô'¨t¬zÀÐUYÐZÑZÔZˆŒØŒ×ÒÑÔÐØˆs   –=½AÁAc                 ó¦  — t          | j        dd¦  «        }t          | j        dd¦  «        dk    r0| j        r | j                             ¦   «          d| _        d| _        dS |r|j        j        nd}|�	|| j        u rdS | j        r| j                             ¦   «          || _        t          | j        ¦  «         	                    |¦  «        | _        dS )za(Re)wrap the content of the current adapter (a new adapter comes with every return to the title).rÕ   NrÚ   rx   rÜ   )
r�   ré   rn  rn   rs  r  re   r]   r_   rf   )r3   r&  re   s      r   r  zBridge.instrumentÆ  sÚ   € å˜$œ* j°$Ñ7Ô7ˆÝ�4”:˜v rÑ*Ô*¨gÒ5Ð5ØÔð (ØÔ ×*Ò*Ñ,Ô,Ð,Ø#'�Ô Ø ˆDŒMØˆFØ07ÐA�'Ô$Ô,Ð,¸TˆØˆ?˜g¨¬Ð6Ð6ØˆFØÔð 	)ØÔ×&Ò&Ñ(Ô(Ð(ØˆŒÝ& t¤zÑ2Ô2×:Ò:¸7ÑCÔCˆÔÐÐr   c                 óà   — 	 t          | j        ¦  «        5 }|                     ¦   «                              ¦   «         | j        k    cd d d ¦  «         S # 1 swxY w Y   d S # t
          $ r Y dS w xY w)NT)rK   ry  Úreadrb  rw  rO   r‚  s     r   Úowns_folderzBridge.owns_folder×  s¸   € ð	Ý�d”oÑ&Ô&ð 8¨&Ø—{’{‘}”}×*Ò*Ñ,Ô,°´Ò7ð8ð 8ð 8ð 8ñ 8ô 8ð 8ð 8ð 8ð 8ð 8ð 8øøøð 8ð 8ð 8ð 8ð 8ð 8øåð 	ð 	ð 	Ø�4�4ð	øøøs4   ‚A –/AÁA ÁAÁA ÁAÁA Á
A-Á,A-c                 óf  — | j                              ¦   «          | j        r | j                             ¦   «          d | _        |                      ¦   «         r\	 |                      t          | j        ¦  «        ¦  «         n# t          $ r Y nw xY w| j	         
                    d| j        ¬¦  «         d S d S )Nz
probe.stop)r|  )rp  r   rn  rn   r†  Ú_write_stater(  ré   rP   r_   rU   rw  r7   s    r   ÚstopzBridge.stopÞ  sÀ   € ØŒ
�ŠÑÔÐØÔð 	$ØÔ×&Ò&Ñ(Ô(Ð(Ø#ˆDÔØ×ÒÑÔð 	9ðØ×!Ò!¥(¨4¬:Ñ"6Ô"6Ñ7Ô7Ð7Ð7øÝð ð ð Ø�ðøøøàŒJ�OŠO˜L°´ˆOÑ8Ô8Ð8Ð8Ð8ð	9ð 	9s   Á'A> Á>
BÂ
Bc                 ó   — | j                              ¦   «         sô|                      ¦   «         s|                      ¦   «          d S 	 |                      ¦   «          |                      ¦   «          |                      ¦   «          nR# t          $ rE}| j         	                    dt          |¦  «        t          j        ¦   «         ¬¦  «         Y d }~nd }~ww xY w| j                              t          ¦  «         | j                              ¦   «         ¯òd S d S )Nzprobe.error)r   r€   )rp  r  r†  r‰  r  ÚpublishÚ	_commandsrP   r_   rU   r
   r€   r”   ÚwaitÚPOLL_S)r3   r—   s     r   r�  zBridge._loopì  s  € Ø”*×#Ò#Ñ%Ô%ð 
	$Ø×#Ò#Ñ%Ô%ð Ø—	’	‘”�Ø�ðaØ—’Ñ!Ô!Ð!Ø—’‘”�Ø—’Ñ Ô Ð Ð øÝð að að aØ”
—’ µS¸±X´XÍÔI]ÑI_ÔI_�Ñ`Ô`Ð`Ð`Ð`Ð`Ð`Ð`øøøøðaøøøàŒJ�OŠO�FÑ#Ô#Ð#ð ”*×#Ò#Ñ%Ô%ð 
	$ð 
	$ð 
	$ð 
	$ð 
	$s   Á<B Â
CÂ;CÃCc                 ó¾   — t          | j        ¦  «        }t          |¦  «        }|| j        k    r|| _         | j        j        di |¤Ž |                      |¦  «         |S )NÚstate)r�  )r(  ré   r9  rr  r_   rU   rˆ  )r3   r6  Úbriefs      r   r‹  zBridge.publishù  se   € Ý˜œ
Ñ#Ô#ˆÝ�t‘”ˆØ�DÔ$Ò$Ð$Ø$ˆDÔØˆDŒJŒOÐ-Ð- uÐ-Ð-Ð-Ø×Ò˜$ÑÔÐØˆr   c                 óv  — | j         |d<   t          j                             | j        d¦  «        }| j        5  |dz   }t          |dd¬¦  «        5 }t          j        t          |¦  «        |dd¬	¦  «         d d d ¦  «         n# 1 swxY w Y   t          j
        ||¦  «         d d d ¦  «         d S # 1 swxY w Y   d S )
Nr|  ú
state.jsonú.tmpr{  r@   rA   Fr	   ©rC   Úindent)rw  r/   r&   rl  r4   rx  rK   rM   Údumpr   Úreplace)r3   r6  r&   ÚtmprS   s        r   rˆ  zBridge._write_state  sB  € ØœˆˆW‰ÝŒw�|Š|˜DœK¨Ñ6Ô6ˆØÔð 	"ð 	"Ø˜‘-ˆCÝ�c˜3¨Ð1Ñ1Ô1ð Q°VÝ”	�) D™/œ/¨6ÀÈaÐPÑPÔPÐPðQð Qð Qñ Qô Qð Qð Qð Qð Qð Qð Qøøøð Qð Qð Qð QåŒJ�s˜DÑ!Ô!Ð!ð		"ð 	"ð 	"ñ 	"ô 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"øøøð 	"ð 	"ð 	"ð 	"ð 	"ð 	"s5   ·B.Á&BÁ5B.ÂB	ÂB.ÂB	Â	B.Â.B2Â5B2c                 óÌ  — t          t          j        | j        ¦  «        ¦  «        D ]¼}|                     d¦  «        sŒt          j                             | j        |¦  «        }	 t          |d¬¦  «        5 }t          j	        |¦  «        }d d d ¦  «         n# 1 swxY w Y   n# t          t          f$ r Y Œ�w xY wt          j        |¦  «         |                      |¦  «         Œ½d S )Nz.jsonr@   rA   )Úsortedr/   Úlistdirrm  Úendswithr&   rl  rK   rM   ÚloadrO   rÑ   ÚremoveÚexecute)r3   rH   r&   rS   Úcommands        r   rŒ  zBridge._commands  s  € Ý�2œ: d¤lÑ3Ô3Ñ4Ô4ð 
	"ð 
	"ˆDØ—=’= Ñ)Ô)ð ØÝ”7—<’< ¤¨dÑ3Ô3ˆDðÝ˜$¨Ð1Ñ1Ô1ð 0°VÝ"œi¨Ñ/Ô/�Gð0ð 0ð 0ñ 0ô 0ð 0ð 0ð 0ð 0ð 0ð 0øøøð 0ð 0ð 0ð 0øøå�ZÐ(ð ð ð Ø�ðøøøåŒI�d‰OŒOˆOØ�LŠL˜Ñ!Ô!Ð!Ð!ð
	"ð 
	"s6   Á%B#Á6BÂB#ÂB	ÂB#ÂB	ÂB#Â#B7Â6B7c                 ó$  — t          |                     d¦  «        pt          j        ¦   «         j        d d…         ¦  «        } | j        j        di |¤Ž 	 d|                      |¦  «        dœ}nT# t          $ rG}dd 	                    t          |¦  «        j        |¦  «        t          j        ¦   «         dœ}Y d }~nd }~ww xY w	 |                      ¦   «          n# t          $ r Y nw xY w||d<   t          j                             | j        d	 	                    |¦  «        ¦  «        }t'          |d
z   dd¬¦  «        5 }t)          j        t-          |¦  «        |dd¬¦  «         d d d ¦  «         n# 1 swxY w Y   t          j        |d
z   |¦  «         |S )Nrw  é
   r¡  T)Úokr�   Fr}   )r¤  r   r€   zres-{}.jsonr”  r{  r@   rA   r	   r•  )r¡  )r
   rˆ   rt  ru  rv  r_   rU   ÚrunrP   r’   r“   rW   r€   r”   r‹  r/   r&   rl  r4   rK   rM   r—  r   r˜  )r3   r¡  Ú
command_idr�   r—   r&   rS   s          r   r   zBridge.execute  sã  € Ý˜Ÿš TÑ*Ô*ÐC­d¬j©l¬lÔ.>¸sÀ¸sÔ.CÑDÔDˆ
ØˆŒ
ŒÐ-Ð- WÐ-Ð-Ð-ð	;Ø ¨D¯HªH°WÑ,=Ô,=Ð>Ð>ˆFˆFøÝð 	;ð 	;ð 	;Ø!¨H¯OªO½DÀ¹I¼IÔ<NÐPSÑ,TÔ,TÝ#,Ô#7Ñ#9Ô#9ð;ð ;ˆFˆFˆFˆFˆFˆFøøøøð	;øøøð	Ø�LŠL‰NŒNˆNˆNøÝð 	ð 	ð 	ØˆDð	øøøà!ˆˆt‰ÝŒw�|Š|˜DœK¨×)=Ò)=¸jÑ)IÔ)IÑJÔJˆÝ�$˜‘- ¨wÐ7Ñ7Ô7ð 	O¸6ÝŒI•i Ñ'Ô'¨¸eÈAÐNÑNÔNÐNð	Oð 	Oð 	Oñ 	Oô 	Oð 	Oð 	Oð 	Oð 	Oð 	Oð 	Oøøøð 	Oð 	Oð 	Oð 	Oå
Œ
�4˜&‘= $Ñ'Ô'Ð'Øˆs<   ÁA/ Á/
C Á9=B;Â;C ÃC Ã
C&Ã%C&Ä;&E-Å-E1Å4E1c                 óf  ‡
— |                      d¦  «        }| j        Š
|dk    rxt          ‰
|d         ¦  «        }|€3t          d                     |d         ‰
j        j        ¦  «        ¦  «        ‚‰
                     |¦  «         |                      ¦   «          d|iS |dk    rS‰
                     t          |d         ¦  «        ¦  «         |                      ¦   «          dt          |d         ¦  «        iS |dk    r#‰
 
                    t          ¦   «         ¦  «         i S |dk    rt          ‰
¦  «        S |d	k    r"ˆ
fd
„|                      dg ¦  «        D ¦   «         S |dk    rCdd l}|                     |                      d¦  «        ¦  «         d|                      d¦  «        iS |dk    r‰
                     ¦   «          i S t!          ‰
dd ¦  «        }|€t#          d¦  «        ‚t!          ‰
dd¦  «        dk    r|dk    rdg ddœS t          d¦  «        ‚|j        }|dk    r:|j        }t!          |dd¦  «        t!          |dg ¦  «        t!          |dd¦  «        dœS |dk    rH t!          ||d         ¦  «        |                      dg ¦  «        i |                      di ¦  «        ¤Ž}d|iS |dk    rd|                      d i ¦  «                             ¦   «         D ]\  }	}t+          ||	|¦  «         Œdt-          |                      d i ¦  «        ¦  «        iS t          d!                     |¦  «        ¦  «        ‚)"NÚopÚactrD  z'intent {!r} has no control in design {}rR  ÚclickrJ  r(  Úpropsc                 ó<   •— i | ]}|‰                      |¦  «        “ŒS r[   ræ   rè   s     €r   r   zBridge.run.<locals>.<dictcomp>@  s)   ø€ ÐWÐWÐW°d�D˜%×+Ò+¨DÑ1Ô1ÐWÐWÐWr   ÚnamesÚseedr   r!   ÚcloserÕ   zthe game is not runningrÚ   rx   rÜ   r©   )r�   r®   r‚   zCStory debug access uses snapshot and props, not controller mutationr�   rƒ   r‚   ry   rz   r|   r•   r   Úattrszunknown op: {})rˆ   ré   rE  rÑ   r’   rC  r  ÚonClickr  r   ÚonActionr;  r(  Úrandomr®  r¯  r�   ÚRuntimeErrorr  re   r   rj   r›  )r3   r¡  r¨  rR  r³  r&  r  re   r!   r  ré   s             @r   r¥  z
Bridge.run+  s\  ø€ Ø�[Š[˜ÑÔˆØ”
ˆØ�Š;ˆ;Ý  ¨°Ô(9Ñ:Ô:ˆGØˆÝ Ð!J×!QÒ!QØ˜HÔ% u¤}Ô'8ñ":ô ":ñ ;ô ;ð ;à�MŠM˜'Ñ"Ô"Ð"Ø�OŠOÑÔÐØ˜wÐ'Ð'Ø�Š=ˆ=Ø�MŠM�#˜g iÔ0Ñ1Ô1Ñ2Ô2Ð2Ø�OŠOÑÔÐØ�s 7¨9Ô#5Ñ6Ô6Ð7Ð7Ø�Š<ˆ<Ø�NŠN�;™=œ=Ñ)Ô)Ð)ØˆIØ�ÒÐÝ˜E‘?”?Ð"Ø�Š=ˆ=ØWÐWÐWÐW¸g¿kºkÈ'ÐSUÑ>VÔ>VÐWÑWÔWÐWØ�Š<ˆ<ØˆMˆMˆMØ�KŠK˜Ÿš GÑ,Ô,Ñ-Ô-Ð-Ø˜GŸKšK¨Ñ0Ô0Ð1Ð1Ø�Š=ˆ=Ø�KŠK‰MŒMˆMØˆIÝ˜% ¨TÑ2Ô2ˆØˆ?ÝÐ8Ñ9Ô9Ð9Ý�5˜& "Ñ%Ô%¨Ò0Ð0Ø�VŠ|ˆ|Ø)+¸È2ÐNÐNÐNÝÐbÑcÔcÐcØÔ!ˆØ�Š<ˆ<Ø”lˆGÝ%,¨W°oÀrÑ%JÔ%JÝ '¨°ÀÑ DÔ DÕT[Ð\cÐeqÐsuÑTvÔTvðxð xð xà�Š<ˆ<Ø4•G˜D '¨(Ô"3Ñ4Ô4°g·k²kÀ&È"Ñ6MÔ6MÐkÐQX×Q\ÒQ\Ð]eÐgiÑQjÔQjÐkÐkˆEØ˜UÐ#Ð#Ø�Š;ˆ;Ø%Ÿkšk¨'°2Ñ6Ô6×<Ò<Ñ>Ô>ð *ð *‘
��UÝ˜˜c 5Ñ)Ô)Ð)Ð)Ø�6 '§+¢+¨g°rÑ":Ô":Ñ;Ô;Ð<Ð<ÝÐ)×0Ò0°Ñ4Ô4Ñ5Ô5Ð5r   rV   )rW   rX   rY   rZ   r5   rI  r  r†  r‰  r�  r‹  rˆ  rŒ  r   r¥  r[   r   r   rf  rf  š  sË   € € € € € ðð ð"ð "ð "ð "ð&ð ð ðDð Dð Dð"ð ð ð
9ð 
9ð 
9ð$ð $ð $ðð ð ð"ð "ð "ð"ð "ð "ðð ð ð&06ð 06ð 06ð 06ð 06r   rf  c                  óx   — dd l } |                      d¦  «        }|t          j                             |d¦  «        fS )Nr   z;special://profile/addon_data/plugin.video.milionar/harness/r  )ÚxbmcvfsÚtranslatePathr/   r&   rl  )r¶  r'  s     r   Ú_kodi_folderr¸  b  s:   € Ø€N€N€NØ× Ò Ð!^Ñ_Ô_€DØ•”—’˜d FÑ+Ô+Ð+Ð+r   c                 óÄ  — 	 t           d         �@t           d         j        | u r,t           d                              ¦   «          t           d         S t          ¦   «         \  }}t          j                             t          j                             |d¦  «        ¦  «        sdS t          ¦   «          t          j         	                    |¦  «        rƒt	          j
        |¦  «        D ]n}t          j                             ||¦  «        }t          j                             |¦  «        r-|                     d¦  «        s|dv rt	          j        |¦  «         Œot          | |¦  «                             ¦   «         t           d<   t           d         S # t           $ rO}	 ddl}|                     d                     |¦  «        |j        ¦  «         n# t           $ r Y nw xY wY d}~dS d}~ww xY w)z^Start a Bridge for the game modal when harness/ENABLED exists (no-op otherwise, never raises).r   NÚENABLEDzres-)ri  r“  r   u0   [MilionÃ¡Å™ Harness] game probe not attached: {})Ú_ACTIVEré   r  r¸  r/   r&   Úexistsrl  Údetachr1   rœ  ÚisfilerÒ   rŸ  rf  rI  rP   ÚxbmcÚlogr’   Ú
LOGWARNING)ré   r'  r4   rH   r&   r—   r¿  s          r   Úattach_if_enabledrÂ  h  s¼  € ðÝ�8ÔÐ(­W°XÔ->Ô-DÈÐ-MÐ-MÝ�HÔ×(Ò(Ñ*Ô*Ð*Ý˜8Ô$Ð$Ý#‘~”~‰ˆˆfÝŒw�~Š~�bœgŸlšl¨4°Ñ;Ô;Ñ<Ô<ð 	Ø�4Ý‰ŒˆÝŒ7�=Š=˜Ñ Ô ð 	$Ýœ
 6Ñ*Ô*ð $ð $�Ý”w—|’| F¨DÑ1Ô1�Ý”7—>’> $Ñ'Ô'ð $¨T¯_ª_¸VÑ-DÔ-Dð $ÈÐPmÐHmÐHmÝ”I˜d‘O”O�OøÝ" 5¨&Ñ1Ô1×7Ò7Ñ9Ô9��ÑÝ�xÔ Ð øÝð ð ð ð	ØˆKˆKˆKØ�HŠHÐG×NÒNÈsÑSÔSÐUYÔUdÑeÔeÐeÐeøÝð 	ð 	ð 	ØˆDð	øøøàˆtˆtˆtˆtˆtøøøøðøøøsD   ‚AF ÁAF ÂC&F Æ
GÆ2GÇGÇ
GÇGÇGÇGÇGc                 óž   — t           d         }|�| �|j        | urd S d t           d<   	 |                     ¦   «          d S # t          $ r Y d S w xY w)Nr   )r»  ré   r‰  rP   )ré   r   s     r   r½  r½  ‚  si   € Ý�XÔ€FØ€~˜%Ð+°´ÀEÐ0IÐ0IØˆØ…GˆHÑðØ�Š‰ŒˆˆˆøÝð ð ð Øˆˆðøøøs   ¨> ¾
AÁA)r   )rx   NrV   )rZ   rM   r/   r)   r,   r€   rt  r  rÓ   rŽ  r»  r   r#   r]   r‘   rÆ   rÈ   r(  r
  r  rú   r9  r;  rE  rB  rO  rf  r¸  rÂ  r½  r[   r   r   ú<module>rÄ     s"  ððð ð €€€Ø 	€	€	€	Ø Ð Ð Ð Ø €€€Ø Ð Ð Ð Ø €€€à
€Ø€Ø	€Ø�TÐ
€ðð ð ð ð%ð %ð %ð %ð %ñ %ô %ð %ðXYCð YCð YCð YCð YCñ YCô YCð YCðx/ð /ð /ð%ð %ð %ð	$ð 	$ð 	$ð :ð :ð :ðzð ð ðð ð ðð ð ð&jð jð jðð ð ð ð ñ ô ð ðcð cð cð
ð ð ð ð&/ð /ð /ðA6ð A6ð A6ð A6ð A6ñ A6ô A6ð A6ðP,ð ,ð ,ðð ð ð4ð ð ð ð ð r   