+
    jHàj‰n  ã                  ó$  € R t ^ RIHt ^ RIHt ^ 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 ^ RIHt ^ RIHtHtHt ^ RIHt ^ R	IHt ^ R
IHt ^ RIHtHt ^ RI H!t! ]PD                  ! R4      t#RRut$t%0 Rmt& ! R R4      t'R# )zÿVoice-channel / auto-TTS methods for GatewayRunner (split out of ``gateway/run.py``; bound via
the MRO). ``gateway.run`` internals are imported lazily inside method bodies (import cycle), so
``patch("gateway.run.X")`` keeps intercepting them at call time.)Úannotations)Úinstall_hintN)Úsuppress)ÚSequenceMatcher)ÚSimpleNamespace)ÚDictÚListÚOptional)Út)ÚPlatform)Úbuild_auto_tts_output_path)ÚMessageEventÚMessageType)ÚSessionSourcezgateway.runÚ_auto_tts_disabled_chatsÚ_auto_tts_enabled_chatsc                  ój  € ] tR t^"tR2R R lltR R ltR R ltR R	 ltR
 R lt]	R R l4       t
R R ltR R ltR R ltR R lt]	R R l4       tR R ltR R ltR R ltRR/R R  lltR! R" lt]	R# R$ l4       t]	R% R& l4       tRR/R' R( lltR3R) R* lltR+ R, ltR- R. ltR/ R0 ltR1tR# )4ÚGatewayVoiceMixinNc               ó(   € V ^8„  d   QhRRRRRRRR/# )é   Úplatformr   Úchat_idÚstrÚprofileúOptional[str]Úreturn© )Úformats   "Ú6/home/ubuntu/.hermes/hermes-agent/gateway/run_voice.pyÚ__annotate__ÚGatewayVoiceMixin.__annotate__#   s/   € ÷ 
Tñ 
T 8ð 
T°cð 
TÀMð 
TÐ]`ñ 
Tó    c                ó¤   € VP                    RV 2p\        V\        4      '       d   VP                  4       MRpV'       d   VR8X  d   V# V RV 2# )a©  ``<profile>:<platform>:<chat_id>`` under multiplexing (else two bots in one channel
share a key and one ``/voice`` flips the other's); default keeps ``<platform>:<chat>``.

Under multiplexing the key is additionally namespaced by the profile whose bot speaks in the chat
(``<profile>:<platform>:<chat_id>``); the default profile keeps the historical
``<platform>:<chat_id>`` shape so persisted state stays valid. See #75198.
Ú:Ú Údefault)ÚvalueÚ
isinstancer   Ústrip)Úselfr   r   r   Úbases   &&&& r   Ú
_voice_keyÚGatewayVoiceMixin._voice_key#   sQ   € ð —.‘.Ð!  7 )Ð,ˆÜ%/°¼×%=Ò%=�'—-‘-”/À2ˆß" g°Ô&:ˆtÐSÀ7À)È1ÈTÈFÐ@SÐSr!   c               ó    € V ^8„  d   QhRRRR/# )r   Úsourcer   r   r   r   )r   s   "r   r   r    /   s   € ÷ Qñ Q¨Mð Q¸cñ Qr!   c                ót   € V P                  V4      pV P                  VP                  VP                  VR7      # )z}Voice mode belongs to the (bot, chat) pair: namespace is the profile that OWNS the
receiving adapter, not the routed profile.©r   )Ú_adapter_profile_for_sourcer+   r   r   )r)   r.   r   s   && r   Ú_voice_key_for_sourceÚ'GatewayVoiceMixin._voice_key_for_source/   s1   € ð ×2Ñ2°6Ó:ˆØ�‰˜vŸ™°·±ÈˆÓPÐPr!   c               ó   € V ^8„  d   QhRR/# ©r   r   ÚNoner   )r   s   "r   r   r    5   s   € ÷ Cñ C°Tñ Cr!   c                ó|   € \        VR4      '       d*   \        P                  ! V P                  VR7      Vn        R# R# )zDRoute voice transcripts back through the adapter that captured them.Ú_voice_input_callback©ÚadapterN)ÚhasattrÚ	functoolsÚpartialÚ_handle_voice_channel_inputr8   )r)   r:   s   &&r   Ú_bind_voice_input_callbackÚ,GatewayVoiceMixin._bind_voice_input_callback5   s4   € ä�7Ð3×4Ò4Ü,5×,=Ò,=Ø×0Ñ0¸'ô-CˆGÖ)ñ 5r!   c               ó   € V ^8„  d   QhRR/# )r   r   zdict[str, str]r   )r   s   "r   r   r    ;   s   € ÷ <ñ < >ñ <r!   c                	ó  €  \         P                  ! V P                  P                  R R7      4      p\        T\        4      '       g   / # TP                  4        UUu/ uF  w  r#T\        9   g   K  \        T4      TbK   	  pppR T 4        F  p\        P                  RT4       K  	  TP                  4        UUu/ uF  w  r#RT9   g   K  Y#bK  	  upp#   \        \         P
                  \        3 d    / u # i ; iu uppi u uppi )z	utf-8-sig©Úencodingc              3  ó8   "  € T F  pR V9  g   K  Vx € K  	  R# 5i)r#   Nr   )Ú.0Úks   & r   Ú	<genexpr>Ú6GatewayVoiceMixin._load_voice_modes.<locals>.<genexpr>C   s   é € Ð5™u˜!¨°1©—A’A›uùs   ‚	�
z}Skipping legacy unprefixed voice mode key %r during migration. Re-enable voice mode on that chat to rebuild the prefixed key.r#   )ÚjsonÚloadsÚ_VOICE_MODE_PATHÚ	read_textÚFileNotFoundErrorÚJSONDecodeErrorÚOSErrorr'   ÚdictÚitemsÚ_VOICE_MODESr   ÚloggerÚwarning)r)   ÚdatarG   ÚmrR   Úkeys   &     r   Ú_load_voice_modesÚ#GatewayVoiceMixin._load_voice_modes;   så   € ð	Ü—:’:˜d×3Ñ3×=Ñ=À{Ð=ÓSÓTˆDô ˜$¤×%Ò%ØˆIØ'+§z¡z¤|ÔI¡|™t˜q°q¼LÑ7H””�Q“˜’¡|ˆÑIÙ5™uÖ5ˆCÜ�N‰NðQØRUöWñ 6ð "'§¡¤Ô;¡™˜°#¸±(”�’¡Ò;Ð;øô "¤4×#7Ñ#7¼ÐAô 	ØŠIð	üó Jùó
 <s)   ‚0C ÁC?Á1C?Â=DÃDÃ"C<Ã;C<c               ó   € V ^8„  d   QhRR/# r5   r   )r   s   "r   r   r    I   s   € ÷ @ñ @ 4ñ @r!   c                	ó2  €  V P                   P                  P                  R R R7       \        P                  ! V P
                  ^R7      pV P                   P                  VRR7       R#   \         d"   p\        P                  RT4        Rp?R# Rp?ii ; i)T)ÚparentsÚexist_ok)Úindentzutf-8rC   zFailed to save voice modes: %sN)
rL   ÚparentÚmkdirrJ   ÚdumpsÚ_voice_modeÚ
write_textrP   rT   rU   )r)   ÚpayloadÚes   &  r   Ú_save_voice_modesÚ#GatewayVoiceMixin._save_voice_modesI   sz   € ð	@Ø×!Ñ!×(Ñ(×.Ñ.°tÀdÐ.ÔKÜ—j’j ×!1Ñ!1¸!Ô<ˆGØ×!Ñ!×,Ñ,¨W¸wÐ,ÖGøÜô 	@Ü�N‰NÐ;¸Q×?Ò?ûð	@ús   ‚A&A* Á*BÁ5BÂBc               ó(   € V ^8„  d   QhRRRRRRRR/# )r   r   r   ÚonÚboolÚenabler   r6   r   )r   s   "r   r   r    R   s*   € ÷ #ñ #°sð #Àð #ÐQUð #ÐZ^ñ #r!   c               óT  € V'       d   \         \        3M\        \         3w  rE\        \        WR4      ;p\        4      '       g   R# V'       g   VP                  V4       R# VP                  V4       \        \        WR4      ;p\        4      '       d   VP                  V4       R# R# )z©Add/discard ``chat_id`` in the adapter's enabled (``enable=True``) or disabled set;
adding also clears the other set (``/voice off`` and ``/voice on``/``tts`` override).N)Ú_ON_SETÚ_OFF_SETr'   ÚgetattrÚsetÚdiscardÚadd)r:   r   rj   rl   Úadd_toÚ
clear_fromÚtargetÚothers   &&&$    r   Ú_toggle_adapter_auto_tts_setÚ.GatewayVoiceMixin._toggle_adapter_auto_tts_setQ   s   € ÷ 5;œg¤xÑ0ÄÌ7Ð@SÑˆÜ¤G¨G¸TÓ$BÐB˜&ÄC×HÒHÙßØ�N‰N˜7Ô#ÙØ�
‰
�7ÔÜœw w¸DÓAÐA�eÄ3×GÒGØ�M‰M˜'Ö"ñ Hr!   c               ó$   € V ^8„  d   QhRRRRRR/# )r   r   r   Údisabledrk   r   r6   r   )r   s   "r   r   r    _   s'   € ÷ Tñ T¸sð TÈdð TÐW[ñ Tr!   c                	ó.   € V P                  WVR R7       R# )F©rl   N©rx   )r)   r:   r   r{   s   &&&&r   Ú_set_adapter_auto_tts_disabledÚ0GatewayVoiceMixin._set_adapter_auto_tts_disabled_   s   € Ø×)Ñ)¨'¸HÈUÐ)ÖSr!   c               ó$   € V ^8„  d   QhRRRRRR/# )r   r   r   Úenabledrk   r   r6   r   )r   s   "r   r   r    b   s'   € ÷ Rñ R¸cð RÈDð RÐUYñ Rr!   c                	ó.   € V P                  WVR R7       R# )Tr}   Nr~   )r)   r:   r   r‚   s   &&&&r   Ú_set_adapter_auto_tts_enabledÚ/GatewayVoiceMixin._set_adapter_auto_tts_enabledb   s   € Ø×)Ñ)¨'¸GÈDÐ)ÖQr!   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   Ú	voice_keyr   r   Úmoder   r6   r   )r   s   "r   r   r    e   s/   € ÷ Xñ X°Cð XÀ#ð XÈSð XÐUYñ Xr!   c                óp   € W@P                   V&   V P                  4        V P                  WRVR8g  R7       R# )zVRecord+persist ``mode``; mirror into adapter sets (``off`` -> disabled, else enabled).TÚoffr}   N)rc   rg   rx   )r)   r:   r‡   r   rˆ   s   &&&&&r   Ú_apply_voice_modeÚ#GatewayVoiceMixin._apply_voice_modee   s6   € à&*×Ñ˜Ñ#Ø×ÑÔ Ø×)Ñ)¨'¸DÈÐQVÉÐ)ÖWr!   c               ó   € V ^8„  d   QhRR/# r5   r   )r   s   "r   r   r    k   s   € ÷  Fñ  F¸Dñ  Fr!   c                óð  aa	€ \        VRR4      p\        V\        4      '       g   R# \        R03\        RR033 UUu. uF,  w  r4\        \        WR4      ;p\
        4      '       g   K)  WT3NK.  	  pppV'       g   R#  ^ RIHp \        V! 4       P                  R4      ;'       g    / P                  RR	4      4      p\        VR
4      '       d    VP                  R8X  d	   R	Vn        MW�n        V P                  VR\        VRR4      R7      o	V FJ  w  poVP                  4        VP!                  VV	3R lV P"                  P%                  4        4       4       KL  	  R# u uppi   \         d    R	p L·i ; i)z§Restore persisted /voice state into a live adapter: ``_auto_tts_default`` from
``voice.auto_tts``; enabled (voice_only/all) / disabled (off) sets from ``_voice_mode``.r   NrŠ   Ú
voice_onlyÚall)Úload_configÚvoiceÚauto_ttsFÚ_auto_tts_defaultÚa2ar$   Ú_owner_profiler0   c              3  óˆ   <"  € T F7  w  rVS9   g   K  VP                  S4      '       g   K'  V\        S4      R  x € K9  	  R # 5i©N)Ú
startswithÚlen)rF   rX   rˆ   ÚmodesÚprefixs   &  €€r   rH   ÚFGatewayVoiceMixin._sync_voice_mode_state_to_adapter.<locals>.<genexpr>Š   s@   øé € ð FÑ<T©y¨sØ  E™Mô +Ø.1¯n©n¸V×.Dô +˜œS ›[˜\Õ*Ó<Tùs   ƒA“A¬A)rp   r'   r   ro   rn   rq   Úhermes_cli.configr‘   rk   ÚgetÚ	Exceptionr;   r&   r”   r+   ÚclearÚupdaterc   rR   )
r)   r:   r   Únamer›   ÚchatsÚ	chat_setsr‘   Úauto_tts_defaultrœ   s
   &&  `    @r   Ú!_sync_voice_mode_state_to_adapterÚ3GatewayVoiceMixin._sync_voice_mode_state_to_adapterk   s]  ù€ ô ˜7 J°Ó5ˆÜ˜(¤H×-Ò-Ùô "*¨E¨7Ð 3´gÀÈeÐ?TÐ5UÑVô
áV‘�Ü¤7¨7¸$Ó#?Ð?˜%Ä×Eô ˆU‹NÙVð 	ñ 
÷
 Ùð	%Ý5Ü#¡[£]×%6Ñ%6°wÓ%?×%EÐ%EÀ2×$JÑ$JÈ:ÐW\Ó$]Ó^Ðô �7Ð/×0Ò0ð �~‰~ Ô&Ø,1�Õ)à,<Ô)Ø—‘ ¨2´w¸wÐHXÐZ^Ó7_�Ó`ˆÛ%‰LˆE�5Ø�K‰KŒMØ�L‰Lõ F¸D×<LÑ<L×<RÑ<RÔ<Tó Fö Fó &ùó/
øô ô 	%Ø$Òð	%ús#   ¾&EÁ)EÁ>'E% Â&E% Å%E5Å4E5c               ó    € V ^8„  d   QhRRRR/# )r   Úeventr   r   úOptional[int]r   )r   s   "r   r   r    Ž   s   € ÷ Eñ E˜\ð E¨mñ Er!   c                	óÂ   € \        V R R4      p\        VRR4      '       d   \        VP                  4      # \        VRR4      '       d   VP                  P                  # R# )Úraw_messageNÚguild_idÚguild)rp   Úintr®   r¯   Úid)rª   Úraws   & r   Ú_get_guild_idÚGatewayVoiceMixin._get_guild_id�   sO   € ä�e˜]¨DÓ1ˆÜ�3˜
 D×)Ò)Ü�s—|‘|Ó$Ð$Ü& s¨G°T×:Ò:ˆs�y‰y�|‰|ÐDÀÐDr!   c               ó    € V ^8„  d   QhRRRR/# ©r   rª   r   r   r   r   )r   s   "r   r   r    ”   s   € ÷ +Jñ +J°lð +JÀsñ +Jr!   c              ƒ  	ó  a aa	"  € S P                  VP                  4      p\        VR 4      '       g   \        R4      # S P	                  V4      pV'       g   \        R4      # VP                  W1P                  P                  4      G Rj  x€L
 pV'       g   \        R4      # S P                  V4       S P                  VP                  4      o	\        VR4      '       d(   \        P                  ! S P                  VR7      Vn        \        VR4      '       d   V V	3R lVn         VP                  V4      G Rj  x€L
 pT'       g   RTn        \        R4      # \+        TP                  P,                  4      pTP.                  P1                  T4      pTe*   Yv8w  d$   \        TR4      '       d   TP3                  T4       YbP.                  T&   \        TR4      '       d(   TP                  P5                  4       TP6                  T&   S P9                  TS P;                  TP                  4      TP                  P,                  R4       \        RTP<                  R7      #  ELÕ EL(  \         d�   o\         P#                  R	S4       RTn        \&        ;QJ d    T3R
 lR 4       F  '       g   K   RM	  RM! T3R
 lR 4       4      '       g   \        RSR7      u Ro># \        R\)        R4      R7      u Ro># Ro>ii ; i5i)Újoin_voice_channelz!gateway.voice.channel_unsupportedz gateway.voice.channel_guild_onlyNz"gateway.voice.channel_not_in_voiceÚ_on_voice_disconnectr9   Ú_voice_mode_getterc                óŽ   <€ SP                   P                  SP                  \        P                  \        V 4      SR 7      R4      # )r0   rŠ   )rc   rŸ   r+   r   ÚDISCORDr   )r   r)   Úvoice_profiles   &€€r   Ú<lambda>Ú>GatewayVoiceMixin._handle_voice_channel_join.<locals>.<lambda>§   s6   ø€ ¸×9IÑ9I×9MÑ9MØ—‘¤× 0Ñ 0´#°g³,È�ÓVÐX]ô:_r!   z Failed to join voice channel: %sc              3  óZ   <"  € T F   q\        S4      P                  4       9   x € K"  	  R # 5ir˜   )r   Úlower)rF   Útokrf   s   & €r   rH   Ú?GatewayVoiceMixin._handle_voice_channel_join.<locals>.<genexpr>®   s    øé € ÐTÑ8S°œc !›fŸl™l›nÖ,Ó8Sùs   ƒ(+TFz!gateway.voice.channel_join_failed)Úerrorz"gateway.voice.channel_deps_missingÚdiscord)Úhintz&gateway.voice.channel_join_permissionsÚdiscard_pending_voice_inputÚ_voice_sourcesr�   zgateway.voice.channel_joined)r£   )ÚpynaclÚnaclÚdavey)Ú_delivery_adapter_forr.   r;   r
   r³   Úget_user_voice_channelÚuser_idr?   r1   r<   r=   Ú_handle_voice_timeout_cleanupr¹   rº   r¸   r    rT   rU   r8   Úanyr   r°   r   Ú_voice_text_channelsrŸ   rÇ   Úto_dictrÈ   r‹   r2   r£   )
r)   rª   r:   r®   Úvoice_channelÚsuccessÚtext_channel_idÚpreviousrf   r½   s
   f&      @@r   Ú_handle_voice_channel_joinÚ,GatewayVoiceMixin._handle_voice_channel_join”   sc  úé € Ø×,Ñ,¨U¯\©\Ó:ˆÜ�wÐ 4×5Ò5ÜÐ8Ó9Ð9Ø×%Ñ% eÓ,ˆßÜÐ7Ó8Ð8Ø%×<Ñ<¸XÇ|Á|×G[ÑG[Ó\×\ˆßÜÐ9Ó:Ð:à×'Ñ'¨Ô0Ø×8Ñ8¸¿¹ÓFˆÜ�7Ð2×3Ò3Ü+4×+<Ò+<Ø×2Ñ2¸Gô,EˆGÔ(ô �7Ð0×1Ò1õ*_ˆGÔ&ð	YØ#×6Ñ6°}ÓE×EˆG÷ Ø,0ˆGÔ)ÜÐ=Ó>Ð>Ü˜eŸl™l×2Ñ2Ó3ˆð ×/Ñ/×3Ñ3°HÓ=ˆØÒ HÔ$?ÄGÈGÐUr×DsÒDsØ×/Ñ/°Ô9Ø1@×$Ñ$ XÑ.Ü�7Ð,×-Ò-Ø/4¯|©|×/CÑ/CÓ/EˆG×"Ñ" 8Ñ,Ø×Ñ˜w¨×(BÑ(BÀ5Ç<Á<Ó(PØ$Ÿ|™|×3Ñ3°Uô	<äÐ/°m×6HÑ6HÔIÐIòI ]ò FøÜô 	YÜ�N‰NÐ=¸qÔAØ,0ˆGÔ)ß“3ÔTÑ8SÓT—3—3’3ÔTÑ8SÓT×TÒTÜÐ<ÀAÔFÕFÜÐ9ÄÈYÓ@WÔXÕXûð	Yüs†   …ALÁ3LÂ
IÂLÂBLÄ&I% Ä:I"Ä;I% Ä?LÅDLÉ"I% É%K?É0<K:Ê/K:ËK:ËK?ËLËK:Ë4K?Ë5LË:K?Ë?Lc               ó    € V ^8„  d   QhRRRR/# r¶   r   )r   s   "r   r   r    Á   s   € ÷ /ñ /°|ð /Èñ /r!   c              ƒ  	óZ  "  € V P                  VP                  4      pV P                  V4      pV'       d<   \        VR 4      '       d*   \        VR4      '       d   VP	                  V4      '       g   \        R4      #  VP                  V4      G Rj  x€L
  V P                  W P                  VP                  4      VP                  P                  R4       \        VR4      '       d   RVn        \        R4      #  Lh  \         d!   p\        P                  RT4        Rp?LŒRp?ii ; i5i)Úleave_voice_channelÚis_in_voice_channelz gateway.voice.channel_not_joinedNzError leaving voice channel: %srŠ   r8   zgateway.voice.channel_left)rÌ   r.   r³   r;   rÜ   r
   rÛ   r    rT   rU   r‹   r2   r   r8   )r)   rª   r:   r®   rf   s   &&   r   Ú_handle_voice_channel_leaveÚ-GatewayVoiceMixin._handle_voice_channel_leaveÁ   sø   é € Ø×,Ñ,¨U¯\©\Ó:ˆØ×%Ñ% eÓ,ˆßœW WÐ.C×DÒDÜ˜GÐ%:×;Ò;Ø×/Ñ/°×9Ò9ÜÐ7Ó8Ð8ð	AØ×-Ñ-¨hÓ7×7Ð7ð 	×Ñ˜w×(BÑ(BÀ5Ç<Á<Ó(PØ$Ÿ|™|×3Ñ3°Uô	<ä�7Ð3×4Ò4Ø,0ˆGÔ)ÜÐ-Ó.Ð.ñ 8øÜô 	AÜ�N‰NÐ<¸a×@Ñ@ûð	AüsI   ‚A/D+Á2D+Á>C= ÂC;ÂC= ÂA$D+Ã;C= Ã=D(ÄD#ÄD+Ä#D(Ä(D+c               ó    € V ^8„  d   QhRRRR/# )r   r.   r   r   r«   r   )r   s   "r   r   r    Ó   s   € ÷ hñ h¨=ð h¸]ñ hr!   c                ó"  aa€ SP                   \        P                  8w  d   R# V P                  S4      o\	        SRR4      p\        V\        4      '       d   \        SR4      '       g   R# \        VV3R lVP                  4        4       R4      # )a  Guild whose voice call is bound to *source*'s text channel on the bot that ANSWERS it.
Under multiplexing a secondary profile's call lives on its own adapter, never the default's
(#139345): reading ``self.adapters`` would miss its call or borrow the primary bot's.NrÑ   Úvoice_mixer_activec              3  ó¨   <"  € T FG  w  r\        V4      \        SP                  4      8X  g   K*  SP                  V4      '       g   KC  Vx € KI  	  R # 5ir˜   )r   r   rá   )rF   ÚgidÚchannelr:   r.   s   &  €€r   rH   Ú9GatewayVoiceMixin._voice_ack_guild_for.<locals>.<genexpr>Ý   sD   øé € ð a©]™\˜SÜ˜G›¬¨F¯N©NÓ(;Ñ;ô Ø@G×@ZÑ@ZÐ[^×@_÷ ’S«]ùs   ƒ'A¯AÁ
A)
r   r   r¼   rÌ   rp   r'   rQ   r;   ÚnextrR   )r)   r.   Úboundr:   s   &f @r   Ú_voice_ack_guild_forÚ&GatewayVoiceMixin._voice_ack_guild_forÓ   s|   ù€ ð �?‰?œh×.Ñ.Ô.ÙØ×,Ñ,¨VÓ4ˆÜ˜Ð!7¸Ó>ˆÜ˜5¤$×'Ò'¬G°GÐ=Q×,RÒ,RÙÜõ a¨U¯[©[¬]ó aØbfóhð 	hr!   r:   c               ó    € V ^8„  d   QhRRRR/# )r   r   r   r   r6   r   )r   s   "r   r   r    à   s   € ÷ =ñ =°Sð =Èdñ =r!   c          	     óà   € Vf*   V P                   P                  \        P                  4      pV P	                  \        P                  V\        VRR4      R7      pV P                  W#VR4       R# )z¨Adapter callback on voice-channel timeout: clear runner-side voice_mode state.
``adapter`` (bound at join) is that profile's bot, not always ``self.adapters[DISCORD]``.Nr–   r0   rŠ   )ÚadaptersrŸ   r   r¼   r+   rp   r‹   )r)   r   r:   rX   s   &&$ r   rÏ   Ú/GatewayVoiceMixin._handle_voice_timeout_cleanupà   s`   € ð Š?Ø—m‘m×'Ñ'¬×(8Ñ(8Ó9ˆGØ�o‰oœh×.Ñ.°Ü&-¨gÐ7GÈÓ&Nð ó Pˆà×Ñ˜w¨W°eÖ<r!   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   ÚbindingÚtuplerÎ   r°   Ú
transcriptr   r   rk   r   )r   s   "r   r   r    é   s*   € ÷ ñ °eð Àcð ÐWZð Ð_cñ r!   c           	     ó^  a
€ \         P                  ! RR\         P                  ! RRV4      P                  4       P                  4       4      o
S
'       g   R# \        P
                  ! 4       . VOVN5rT\        \        V RR4      ;p\        4      '       g	   / ;q`n	        VP                  V. 4       UUu. uF  w  rxWG,
          R8:  g   K  Wx3NK  	  p	pp\        ;QJ d    V
3R	 lV	 4       F  '       g   K   R
M	  RM! V
3R	 lV	 4       4      '       d   W–V&   R
# W”S
3.,           RR We&   R# u uppi )aQ  Suppress repeated STT outputs for one recent utterance (voice capture can emit it twice a
few seconds apart -> a second queued run and overlapping spoken replies). ``binding`` is
(receiving bot's profile, guild, bound text channel): the store is runner-wide, and another
bot's copy of the utterance, or a new binding, is a separate turn.z[^\w\s]r$   z\s+Ú FÚ_recent_voice_transcriptsNg      (@c              3  óÐ   <"  € T F[  w  rVS8H  ;'       gH    \        \        V4      \        S4      4      ^8¬  ;'       d    \        RVS4      P                  4       R8¬  x € K]  	  R# 5i)é   Ngffffffî?)Úminrš   r   Úratio)rF   Ú_ÚpriorÚ
normalizeds   &  €r   rH   ÚCGatewayVoiceMixin._is_duplicate_voice_transcript.<locals>.<genexpr>õ   sn   øé € ð 'á%‘8�1ð ˜
Ñ"÷ eð e¤s¬3¨u«:´s¸:³Ó'GÈ2Ñ'M÷ (dð (dÜ+:¸4ÀÈ
Ó+S×+YÑ+YÓ+[Ð_cÑ+côeã%ùs   ƒA&–AA&Téûÿÿÿ)ÚreÚsubr(   rÁ   ÚtimeÚ	monotonicr'   rp   rQ   rô   rŸ   rÐ   )r)   rï   rÎ   rñ   ÚnowrX   Úrecent_storeÚtsÚtxtÚrecentrû   s   &&&&      @r   Ú_is_duplicate_voice_transcriptÚ0GatewayVoiceMixin._is_duplicate_voice_transcripté   s  ø€ ô
 —V’V˜J¨¬B¯FªF°6¸3À
Ó,K×,QÑ,QÓ,S×,YÑ,YÓ,[Ó\ˆ
ßÙÜ—>’>Ó#Ð%8 wÐ%8°Ñ%8ˆSÜ¬'°$Ð8SÐUYÓ*ZÐZ˜,Ô\`×aÒaØ<>Ð>ˆLÔ9Ø+7×+;Ñ+;¸CÀÔ+DÔYÑ+D¡ ÈÍÐTXÑHX”)�2“)Ñ+DˆÑYß‹3ô 'á%ó'�3�3Š3ô 'á%ó'÷ 'ò 'ð !'˜ÑÙØ#¨ZÐ'8Ð&9Õ9¸2¸3Ð?ˆÑÙùó Zs   Â1D)ÃD)c               ó    € V ^8„  d   QhRRRR/# )r   rÎ   r°   r   r   r   )r   s   "r   r   r    þ   s   € ÷ @ñ @°3ð @¸=ñ @r!   c                ó¾   € \        V RR4      p\        \        V4      '       d   V! \        V4      4      MRRR4      p\        V\        4      '       d   V'       d   V# R# )zŸ``get_member`` is cache-only; a speaker it misses may still be a cached user, whose display
name (global name or username, no server nickname) beats a bare id.Úget_userNÚdisplay_name)rp   Úcallabler°   r'   r   )ÚclientrÎ   r  r£   s   &&  r   Ú_cached_user_display_nameÚ+GatewayVoiceMixin._cached_user_display_nameý   sO   € ô ˜6 :¨tÓ4ˆÜ´¸(×1CÒ1C‘x¤ G£Ô-ÈÈ~Ð_cÓdˆÜ! $¬×,Ò,·ˆtÐ?¸4Ð?r!   c               ó$   € V ^8„  d   QhRRRRRR/# )r   r®   r°   rÎ   r   r   r   )r   s   "r   r   r      s"   € ÷ )ñ )¨sð )¸Sð )ÐQ^ñ )r!   c           
     óô  € \        V RR4      pV'       d   VP                  V4      MRpV'       d   VP                  \        V4      4      MRp\        VRR4      p\	        V\
        4      '       d   V'       d   TMRpV'       d   VP                  \        V4      4      MRp	\        V R/ 4      P                  V4      ;p
'       d“   \        P                  ! V
4      pVf'   VP                  \        V4      8X  d   VP                  pT;'       g    \        P                  WB4      p\        V4      T;'       g    \        V4      uVn
        Vn        RVn        M¸T;'       g    \        P                  WB4      pRpV	e)   \        \        V RR4      ;p4      '       d   V! V	4      w  rÎV'       d   V P!                  V	4      MRpT P#                  \        V4      V'       d   RMR\        V4      T;'       g    \        V4      V\        V4      VR7      pV	eL   \        \        V R	R4      ;p4      '       d.   \	        V! V	4      ;p\$        4      '       d   Vw  Vn        Vn        \*        P,                  ! V 4      Vn        V# )
ztBound text channel's own source when available (voice shares the text conversation's
session), else a synthetic one.Ú_clientNr  rÈ   Ú_thread_id_and_chat_for_channelÚthreadÚgroup)r   Ú	chat_typerÎ   Ú	user_nameÚ	thread_idr®   Úparent_chat_idÚ_guild_channel_labels)rp   Ú	get_guildÚ
get_memberr°   r'   r   Úget_channelrŸ   r   Ú	from_dictrÎ   r  r   r  Ú
message_idr  Ú_get_parent_channel_idÚbuild_sourcerð   Ú	chat_nameÚ
chat_topicÚweakrefÚrefÚ_transport_adapter_ref)r:   r®   rÎ   Ú
text_ch_idr  r¯   Úmemberr  r  rä   Úsource_datar.   r  Úsplitrù   Ú	parent_idÚlabelsÚcurrents   &&&&              r   Ú_voice_input_sourceÚ%GatewayVoiceMixin._voice_input_source  s  € ô ˜ )¨TÓ2ˆß.4�× Ñ  Ô*¸$ˆß38�×!Ñ!¤# g£,Ô/¸dˆÜ˜v ~°tÓ<ˆÜ$.¨|¼S×$AÒ$AÇl‘LÐX\ˆ	ß9?�&×$Ñ$¤S¨£_Ô5ÀTˆÜ! 'Ð+;¸RÓ@×DÑDÀXÓNÐNˆ;ÖNÜ"×,Ò,¨[Ó9ˆFð Ò  V§^¡^´s¸7³|Ô%CØ"×,Ñ,�	Ø!×aÐaÔ%6×%PÑ%PÐQWÓ%aˆIÜ/2°7«|¸Y×=VÐ=VÌ#ÈgË,Ð,ˆFŒN˜FÔ,ð !%ˆFÕð "×aÐaÔ%6×%PÑ%PÐQWÓ%aˆIØˆIØÒ"¤x¼ÀÐJkÐmqÓ9rÐ0r°×'sÒ'sÙ$ W›~‘�	ßCL˜×6Ñ6°wÔ?ÐRVˆIØ×)Ñ)Ü˜J›¿y±8ÈgÔ_bÐcjÓ_kØ#×3Ð3¤s¨7£|¸yÔSVÐW_ÓS`Ø(ð *ó *ˆFð Ò¤8´g¸gÐG^Ð`dÓ6eÐ,e¨F×#fÒ#fÜ¡V¨G£_Ð4˜'´e×<Ò<Ø6=Ñ3�Ô  &Ô"3ä(/¯ª°GÓ(<ˆÔ%Øˆr!   c               ó$   € V ^8„  d   QhRRRRRR/# )r   r®   r°   rÎ   rñ   r   r   )r   s   "r   r   r    1  s)   € ÷ @,ñ @,Øð@,Ø&)ð@,Ø7:ñ@,r!   c          
   ƒ  ó   "  € Vf*   V P                   P                  \        P                  4      pV'       d   VP                  P                  V4      MRpV'       g   R# T P                  WAW%4      p^ RIHp V! V4       V P                  V\        VRR4      R7      f   ^ RI
Hp V! WF4       R# \        \        VRR4      ;p	\        \        34      '       da   V	'       dY   \        VRR4      p
V
'       d   V
P                  V4      MRpVRJ;'       d     VP!                  \#        V4      VRR	7      R
J Vn        V P'                  V4      '       g   \(        P+                  RV4       R# \        VRR4      W3pV P-                  WÂV4      '       d!   \(        P/                  RWVR,          4       R# \1        \2        4      ;_uu_ 4        VP4                  P7                  V4      pV'       dP   VR,          P9                  RR4      pVP9                  RR4      pVP;                  \=        RW.R7      4      G Rj  x€L
  RRR4       R;ppVP>                  ;'       g    Rp\A        \        VRR4      ;p4      '       dM   \1        \2        4      ;_uu_ 4        V! \#        V4      V4      p\        V\"        4      '       d   TMRpRRR4       \A        \        VRR4      ;p4      '       d-   V! \#        V4      V4      p\        V\B        4      '       d   TMRp\E        Wc\F        PH                  \K        VRR7      VVR7      pVPM                  V4      G Rj  x€L
  R#  EL  + '       g   i     EL&; i  + '       g   i     Lµ; i L05i)z­Handle transcribed voice from a voice channel. ``adapter`` captured the audio; under
multiplexing each profile's bot dispatches through its own adapter, never the default's.N)Úclear_identityr–   )Útransport_profile)Údrop_rejected_routeÚ_allowed_role_idsr  F)r¯   Úis_dmTz/Unauthorized voice input from user %d, ignoringz?Suppressing duplicate voice transcript for guild=%s user=%s: %s:Néd   N:NiÐ  Nz	@everyoneu   @â€‹everyonez@hereu   @â€‹herezgateway.voice.transcript_echo)ÚuserÚtextÚ_resolve_channel_promptÚ_resolve_channel_skills)r®   r¯   )r.   r:  Úmessage_typer­   Úchannel_promptÚ
auto_skill)'rì   rŸ   r   r¼   rÑ   r/  Úgateway.session_identityr3  Ú_canonicalizerp   Úgateway.parked_route_refusalr5  r'   rq   Ú	frozensetr  Ú_is_allowed_userr   Úrole_authorizedÚ_is_user_authorized_for_sourcerT   Údebugr  Úinfor   r    r  r  ÚreplaceÚsendr
   r  r  Úlistr   r   ÚVOICEr   Úhandle_message)r)   r®   rÎ   rñ   r:   r(  r.   r3  r5  Úrolesr  r¯   rï   rä   Ú	safe_textr>  r?  r,  ÚresolverÚresolvedÚskillsrç   rª   s   &&&&$                  r   r>   Ú-GatewayVoiceMixin._handle_voice_channel_input1  s÷  é € ð
 Š?Ø—m‘m×'Ñ'¬×(8Ñ(8Ó9ˆGßCJ�W×1Ñ1×5Ñ5°hÔ?ÐPTˆ
ßÙØ×)Ñ)¨'¸WÓQˆõ 	<Ù�vÔØ×Ñ˜f¼ÀÐIYÐ[_Ó8`ÐÓaÒiÝHÙ Ô0Ùô œw wÐ0CÀTÓJÐJ�eÌSÔR[ÐL\×]Ò]×bgÜ˜W i°Ó6ˆFß28�F×$Ñ$ XÔ.¸dˆEØ%*°$Ð%6÷ &@ð &@¸7×;SÑ;SÜ�G“ E°ð <Tó <8Ø;?ð<@ˆFÔ"à×2Ñ2°6×:Ò:Ü�L‰LÐJÈGÔTÙÜ˜7Ð$4°dÓ;¸XÐRˆØ×.Ñ.¨wÀ×LÒLÜ�K‰KÐYØ ¨:°dÕ+;ô=áä”i× Õ Ø—o‘o×1Ñ1°*Ó=ˆGßØ& uÕ-×5Ñ5°kÐCTÓU�	Ø%×-Ñ-¨g°}ÓE�	Ø—l‘l¤1Ð%DÈ7Ô#cÓd×dÐd÷ !ð '+Ð*ˆ˜Ø×)Ñ)×1Ð1¨Tˆ	Ü¤¨Ð1JÈDÓ QÐQ�H×RÒRÜœ)×$Õ$Ù#¤C¨
£O°YÓ?�Ü-7¸Ä#×-FÒ-F¡ÈD�÷ %ô œg gÐ/HÈ$ÓOÐO�F×PÒPÙœ3˜z›?¨IÓ6ˆEÜ",¨U´D×"9Ò"9™¸tˆJô Ø¼×9JÑ9JÜ'°ÀÔFØ)°jôBˆð ×$Ñ$ UÓ+×+Ò+ò' e÷ !× Ð ú÷ %×$úñ 	,ùsz   ‚5M>¸$M>ÁBM>Ã 2M>Ä;M>ÅA6M>ÇA.MÈ3MÈ4MÈ8M>É8M>Ê-M)Ê<BM>ÍM<ÍM>ÍMÍM&	Í 	M>Í)M9	Í4	M>c          
     ó,   € V ^8„  d   QhRRRRRRRRR	R/# )
r   rª   r   Úresponser   Úagent_messagesrK  Úalready_sentrk   r   r   )r   s   "r   r   r    s  s4   € ÷ +9ñ +9Ø!ð+9Ø-0ð+9ØBFð+9ØVZð+9à	ñ+9r!   c           
     óF  € V'       d   VP                  R4      '       d   R# \        VP                  P                  RR4      R8X  d   R# VP                  P                  \        P
                  8X  d   R# VP                  P                  pV P                  P                  V P                  VP                  4      4      pVP                  \        P                  8H  pV P                  VP                  4      pRp	\        \        4      ;_uu_ 4        \!        VP#                  V4      4      p	RRR4       VR8X  gS   VR8X  d	   V'       gD   Vf	   V	'       g8   \$        P'                  RWiWQP                  P                  P(                  4       R# \+        R	 \-        \/        \1        V4      4      4       4       ^ 4      p
\2        ;QJ d    R
 W:R  4       F  '       g   K   RM	  RM! R
 W:R  4       4      '       d   R# T;'       d    V'       * '       * #   + '       g   i     Lí; i)u  False when voice_mode is off for this chat, the response is empty/an error, the agent
already called text_to_speech this turn, or voice input + base adapter auto-TTS handled it
â€” UNLESS streaming consumed the response (already_sent): then the runner must do it.zError:Fr&   Nr•   r�   r�   zIAuto voice reply skipped: mode=%s adapter_auto_tts=%s chat=%s platform=%sc              3  óZ   "  € T F!  w  rVP                  R 4      R8X  g   K  Vx € K#  	  R# 5i)Úroler9  N©rŸ   )rF   ÚirW   s   &  r   rH   Ú=GatewayVoiceMixin._should_send_voice_reply.<locals>.<genexpr>–  s+   é € ð 2Ñ$M™D˜AØŸ™˜v›¨&Ñ0÷ ’aÓ$Mùs   ‚+¡
+c              3  óî   "  € T Fk  qP                  R 4      R8X  g   K  VP                  R4      ;'       g    .  F2  pVP                  R4      ;'       g    / P                  R4      R8H  x € K4  	  Km  	  R# 5i)rZ  Ú	assistantÚ
tool_callsÚfunctionr£   Útext_to_speechNr[  )rF   ÚmsgÚtcs   &  r   rH   r]  ˜  sn   é € ð 8Ù0�3·G±G¸F³OÀ{Ñ4Rô JàŸ'™' ,Ó/×5Ð5°2Ò5�2ð —‘�zÓ"×(Ð( b×-Ñ-¨fÓ5Ð9IÖIá5ñ JÛ0ùs   ‚A5žA5¶A5Á!A5T)r™   rp   r.   r   r   ÚLOCALr   rc   rŸ   r2   r=  r   rL  rÌ   r   r    rk   Ú_should_auto_tts_for_chatrT   rG  r&   ræ   ÚreversedrK  Ú	enumeraterÐ   )r)   rª   rU  rV  rW  r   Ú
voice_modeÚis_voice_inputr:   Úadapter_auto_ttsÚstarts   &&&&&      r   Ú_should_send_voice_replyÚ*GatewayVoiceMixin._should_send_voice_replys  sª  € ÷ ˜8×.Ñ.¨x×8Ò8Ùô �5—<‘<×(Ñ(¨'°4Ó8¸EÔAÙð �<‰<× Ñ ¤H§N¡NÔ2ÙØ—,‘,×&Ñ&ˆØ×%Ñ%×)Ñ)¨$×*DÑ*DÀUÇ\Á\Ó*RÓSˆ
Ø×+Ñ+¬{×/@Ñ/@Ñ@ˆØ×,Ñ,¨U¯\©\Ó:ˆØ ÐÜ”i× Õ Ü# G×$EÑ$EÀgÓ$NÓOÐ÷ !ð ˜eÔ#¨
°lÔ(BÇ~ØÒ&×+;Ü�L‰LØ[Ø¨g·|±|×7LÑ7L×7RÑ7RôTñ äñ 2¤H¬T´)¸NÓ2KÓ-LÔ$Mó 2Ø34ó6ˆç‹3ñ 8Ø(¨Ñ0ó8�3�3Š3ñ 8Ø(¨Ñ0ó8÷ 8ò 8ñ ð #×7Ð7¨<Ô'7Ô8Ð8÷' !× ús   ÄHÈH 	c               ó   € V ^8„  d   QhRR/# )r   r   rk   r   )r   s   "r   r   r       s   € ÷ Hñ H¨dñ Hr!   c                	óB   € \        \        V P                  R R4      4      # )Ústt_echo_transcriptsT)rk   rp   Úconfig)r)   s   &r   Ú_should_echo_stt_transcriptsÚ.GatewayVoiceMixin._should_echo_stt_transcripts   s   € Ü”G˜DŸK™KÐ)?ÀÓFÓGÐGr!   c               ó$   € V ^8„  d   QhRRRRRR/# )r   rª   r   r:  r   r   r6   r   )r   s   "r   r   r    £  s!   € ÷ "!ñ "!¨\ð "!Àð "!Èñ "!r!   c           
   ƒ  óv  "  € R. rC ^ RI Hp ^ RIHp V! V4      pV'       gN    V0VmR0,
           F9  p\	        \
        4      ;_uu_ 4        \        P                  ! V4       RRR4       K;  	  R# \        VP                  P                  4      p\        P                  ! WgVR7      G Rj  x€L
 p	 \        P                  ! V	4      p
T
P'                  R4      ;'       g    T
P'                  RT4      .pT Uu. uF>  qˆ'       g   K  \        P(                  P+                  T4      '       g   K3  \-        T4      NK@  	  ppT
P'                  R	4      '       d	   T'       gs   \"        P%                  R
T
P'                  R4      4        T0TmR0,
           F9  p\	        \
        4      ;_uu_ 4        \        P                  ! T4       RRR4       K;  	  R# TpT P/                  Y4      G Rj  x€L
  T0TmR0,
           F9  p\	        \
        4      ;_uu_ 4        \        P                  ! T4       RRR4       K;  	  R#   + '       g   i     EK  ; i ELŸ  \        P                  \         3 dŠ    \"        P%                  RT	'       d
   T	R,          MT	4        T0TmR0,
           FM  p\	        \
        4      ;_uu_ 4        \        P                  ! T4       RRR4       K;    + '       g   i     KL  ; i	  R# i ; iu upi   + '       g   i     EK|  ; i EL*  \0         d$   p\"        P%                  RTRR7        Rp?ELQRp?ii ; i  + '       g   i     EK^  ; i  T0TmR0,
           FM  p\	        \
        4      ;_uu_ 4        \        P                  ! T4       RRR4       K;    + '       g   i     KL  ; i	  i ; i5i)zìGenerate TTS audio and send as a voice message before the text reply. The TTS tool
may return one combined file or several separately valid ones (combination unavailable /
over a platform limit); legacy single-file results keep working.N)Ú_strip_markdown_for_tts)Útext_to_speech_tool)r:  Úoutput_pathz.Auto voice reply TTS returned invalid JSON: %s:NéÈ   NÚ
file_pathsÚ	file_pathrÔ   zAuto voice reply TTS failed: %srÄ   zAuto voice reply failed: %sT)Úexc_info)Útools.tts_text_normalizerw  Útools.tts_toolrx  r   rP   ÚosÚunlinkr   r.   r   ÚasyncioÚ	to_threadrJ   rK   rO   Ú	TypeErrorrT   rU   rŸ   ÚpathÚisfiler   Ú_deliver_voice_replyr    )r)   rª   r:  Ú
audio_pathÚactual_pathsrw  rx  Útts_textÚpr²   ÚresultÚ
candidatesÚpathsrf   s   &&&           r   Ú_send_voice_replyÚ#GatewayVoiceMixin._send_voice_reply£  sÖ  é € ð $(¨�Lð	!ÝHÝ:Ù.¨tÓ4ˆHßØð, "Ð1 LÐ1°T°F×:Ð:�Üœg×&Õ&Ü—I’I˜a”L÷ 'Ñ&ó ;ô' 4°E·L±L×4IÑ4IÓJˆJÜ×)Ò)Ð*=Ø6@ôB÷ BˆCðÜŸš C›�ð
  Ÿ™ LÓ1×ZÐZ°f·j±jÀÈjÓ6YÐ5ZˆJÙ%/ÓK¡Z ³1”V¼¿¹¿¹È×9J”V”S˜–V¡ZˆEÐKØ—:‘:˜i×(Ò(·Ü—‘Ð@À&Ç*Á*ÈWÓBUÔVØð "Ð1 LÐ1°T°F×:Ð:�Üœg×&Õ&Ü—I’I˜a”L÷ 'Ñ&ó ;ð !ˆLØ×+Ñ+¨EÓ@×@Ð@ð "Ð1 LÐ1°T°F×:Ð:�Üœg×&Õ&Ü—I’I˜a”L÷ 'Ñ&ó ;ß&×&Ñ&úò'Bøô ×(Ñ(¬)Ð4ô Ü—‘ÐOß,/˜s 4žy°Sô:àð "Ð1 LÐ1°T°F×:Ð:�Üœg×&Õ&Ü—I’I˜a”L÷ '×&×&Ò&úó ;ðüò
 L÷ '×&Ñ&úò AøÜô 	LÜ�N‰NÐ8¸!ÀdˆN×KÒKûð	Lú÷ '×&Ñ&ûð "Ð1 LÐ1°T°F×:Ð:�Üœg×&Õ&Ü—I’I˜a”L÷ '×&×&Ò&úò ;üsA  ‚N9‡L ¤'N9ÁH4Á"N9Á0:L Â*I	Â+L Â0I ÃL ÃL Ã6	K3Ä"K3Ä+K3Ä: L Å%L Æ'N9Æ(K8Æ?N9ÇL Ç#LÇ$L Ç('N9ÈMÈ&N9È4IÈ?
N9É	L É2K0É?K0ÊL Ê'N9Ê6KË
N9ËK(Ë"N9Ë/K0Ë0L Ë8L
Ì
N9ÌL ÌL>ÌL9Ì3M Ì9L>Ì>M ÍMÍ
N9Í(N6Í>NÎ
N6ÎN0Î*N6Î6N9c               ó$   € V ^8„  d   QhRRRRRR/# )r   rª   r   Úaudio_pathsz	list[str]r   r6   r   )r   s   "r   r   r    Ç  s"   € ÷ 3ñ 3°ð 3È9ð 3ÐY]ñ 3r!   c              ƒ  ór  "  € V P                  VP                  4      pV P                  V4      p\        VRR4      p\        VRR4      pV'       dL   \	        V4      '       d;   \	        V4      '       d*   V! V4      '       d   V F  pV! WG4      G Rj  x€L
  K  	  R# \	        \        VRR4      ;p4      '       g   R# V P                  V4      p	\        V P                  VP                  V	4      ;'       g    / 4      p
RV
R&   V F*  pV! VP                  P                  WyV
R7      G Rj  x€L
  K,  	  R#  L¡ L5i)zPPlay the files in the connected voice channel, else send them as voice messages.Úplay_in_voice_channelNrÜ   Ú
send_voiceTÚnotify)r   rˆ  Úreply_toÚmetadata)	rÌ   r.   r³   rp   r  Ú_reply_anchor_for_eventrQ   Ú_thread_metadata_for_sourcer   )r)   rª   r’  r:   r®   ÚplayÚis_in_vcr…  r•  Úreply_anchorÚthread_metas   &&&        r   r‡  Ú&GatewayVoiceMixin._deliver_voice_replyÇ  s  é € à×,Ñ,¨U¯\©\Ó:ˆØ×%Ñ% eÓ,ˆÜ�wÐ 7¸Ó>ˆÜ˜7Ð$9¸4Ó@ˆßœ Ÿš¬8°H×+=Ò+=Á(È8×BTÒBTÛ#�Ù˜8Ó*×*Ò*ñ $áÜ¤g¨g°|ÀTÓ&JÐJ˜
×KÒKÙØ×3Ñ3°EÓ:ˆô ˜4×;Ñ;¸E¿L¹LÈ,ÓW×]Ð]Ð[]Ó^ˆØ $ˆ�HÑÛˆDÙ U§\¡\×%9Ñ%9ÀdØ&1ô3÷ 3ò 3ó  ñ +ñ3ùs1   ‚A>D7ÂD7ÂD3ÂA"D7Ã53D7Ä(D5Ä)D7Ä5D7)rô   r˜   )F)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__r+   r2   r?   rY   rg   Ústaticmethodrx   r   r„   r‹   r§   r³   r×   rÝ   rè   rÏ   r  r  r/  r>   rm  rs  r�  r‡  Ú__static_attributes__r   r!   r   r   r   "   sÜ   † ÷
TõQõCõ<õ@ð ô#ó ð#õTõRõXõ FðD ôEó ðEõ+JõZ/õ$hð=ÀT÷ =õð( ô@ó ð@ð ô)ó ð)ðV@,ØGK÷@,÷D+9õZHõ"!÷H3ñ 3r!   r   >   r�   rŠ   r�   )(Ú__doc__Ú
__future__r   Úpmr   r‚  r<   rJ   Úloggingr€  rþ   r   r%  Ú
contextlibr   Údifflibr   Útypesr   Útypingr   r   r	   Ú
agent.i18nr
   Úgateway.configr   Úgateway.platforms.baser   Úgateway.platforms.eventr   r   Úgateway.sessionr   Ú	getLoggerrT   ro   rn   rS   r   r   r!   r   Ú<module>r´     sy   ðñDõ #å Û Û Û Û Û 	Û 	Û Û Ý Ý #Ý !ß 'Ñ 'å Ý #Ý =ß =Ý )à	×	Ò	˜=Ó	)€ð /Ð0IÐ €ˆ'Ú+€÷x3ó x3r!   