+
    kHàjr@  ã                  óº  € R t ^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RIH	t	H
t
HtHt  ^ RIHt Rt ^ RIHt Rt ^ RItRt^ RIHtHt ^ RIHtHt ^ R	IHtHt ^ R
I H!t!H"t" ^ RI#H$t$H%t% ]PL                  ! ]'4      t(Rt)Rt*Rt+Rt,Rt-Rt.Rt/Rt0R R lt1R R lt2R R lt3R t4 ! R R]4      t5R#   ] d    RtRt L‰i ; i  ] d    RtRt L‘i ; i  ] d    RtRt L›i ; i)zÁWeCom callback-mode adapter (self-built apps): decrypt POSTed XML, queue for the agent, ack at once;
reply later via proactive ``message/send``. Multiple apps are scoped by ``corp_id:user_id``.)ÚannotationsN)ÚAnyÚDictÚListÚOptionalTF)Úweb)ÚPlatformÚPlatformConfig)ÚBasePlatformAdapterÚ
SendResult)ÚMessageEventÚMessageType)ÚMessageDeduplicatorÚsend_chunks)ÚWXBizMsgCryptÚWeComCryptoErroriÅ!  z/wecom/callbacki   i   i,  z>https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=z,https://qyapi.weixin.qq.com/cgi-bin/gettokenc               ó    € V ^8„  d   QhRRRR/# )é   ÚtextÚstrÚreturnÚint© )Úformats   "ÚM/home/ubuntu/.hermes/hermes-agent/plugins/platforms/wecom/callback_adapter.pyÚ__annotate__r   4   s   € ÷ %ñ %�Cð %˜Cñ %ó    c                ó6   € \        V P                  R 4      4      # )úutf-8)ÚlenÚencode)r   s   &r   Ú	_utf8_lenr!   4   s   € Üˆt�{‰{˜7Ó#Ó$Ð$r   c               ó   € V ^8„  d   QhRR/# ©r   r   Úboolr   )r   s   "r   r   r   8   s   € ÷ Jñ J¨4ñ Jr   c                 óF   € \         ;'       d    \        ;'       d    \        # )uF   PASSIVE probe (registry ``check_fn``) â€” must never install anything.)ÚAIOHTTP_AVAILABLEÚHTTPX_AVAILABLEÚDEFUSEDXML_AVAILABLEr   r   r   Ú!check_wecom_callback_requirementsr)   8   s   € ä×IÐI¤×IÐIÔ5IÐIr   c               ó   € V ^8„  d   QhRR/# r#   r   )r   s   "r   r   r   =   s   € ÷ /ñ /¨Dñ /r   c                 ó¬   € \        4       '       d   R# R R lp  ^ RIHp T! RT \	        4       4      '       g   R# \        4       #   \         d     R# i ; i)a;  ACTIVE lazy-installer (``ensure_deps_fn``): installs ``defusedxml`` and rebinds globals.

Registered as ``ensure_deps_fn``: the registry's ``create_adapter()`` runs it when the passive probe
fails, right before the gateway connects the platform (#79812). Installs ``defusedxml`` (the only
non-core dep; aiohttp/httpx ship with every messaging install) and rebinds the module globals. Before
this hook existed, the passive ``check_fn`` returned False forever on installs without the ``wecom``
extra and the ``platform.wecom_callback`` LAZY_DEPS entry was never exercised.
Tc               ó   € V ^8„  d   QhRR/# )r   r   Údictr   )r   s   "r   r   Ú8ensure_wecom_callback_requirements.<locals>.__annotate__I   s   € ÷ 9ñ 9�Tñ 9r   c                 ó   € ^ RI Hp  RV RR/# )é    NÚETr(   T)Údefusedxml.ElementTreeÚElementTree)Ú_ETs    r   Ú_importÚ3ensure_wecom_callback_requirements.<locals>._importI   s   € Ý,Ø�cÐ1°4Ð8Ð8r   )Úensure_and_bindFÚwecom)r)   Ú	pm.extrasr7   Ú	ExceptionÚglobals)r5   r7   s     r   Ú"ensure_wecom_callback_requirementsr<   =   sP   € ô )×*Ò*Ùõ9ðÝ-ñ ˜7 G¬W«Y×7Ò7ÙÜ,Ó.Ð.øô	 ô Úðús   šA ÁAÁAc                 ó2   € \         P                  ! R RR7      # )Úsuccessú
text/plain©r   Úcontent_type)r   ÚResponser   r   r   Ú_ackrC   V   s   € Ü�<Š<˜Y°\ÔBÐBr   c                  ó`  a € ] tR t^Zt$ RtR]R&   RtRtR V 3R llt]	R R l4       t
]	R	 R
 l4       tRR/R R lltR R ltR R l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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tR- R. ltR/ R0 ltR1tV ;t# )3ÚWecomCallbackAdapterTr$   Úserves_profile_prefixi   c               ó   € V ^8„  d   QhRR/# )r   Úconfigr	   r   )r   s   "r   r   Ú!WecomCallbackAdapter.__annotate__`   s   € ÷ <ñ <˜~ñ <r   c                	ó‚  <€ \         SV `  V\        P                  4       VP                  ;'       g    / pVP                  R 4      ;'       g    \        pV'       d   \        V4      MRV n        \        VP                  R4      ;'       g    \        4      V n        \        VP                  R4      ;'       g    \        4      V n        V P                  V4      V n        R;V n        ;V n        ;V n        ;V n        V n        \*        P,                  ! 4       V n        \1        \2        R7      V n        / V n        / V n        R# )ÚhostNÚportÚpath)Úttl_seconds)ÚsuperÚ__init__r   ÚWECOM_CALLBACKÚextraÚgetÚDEFAULT_HOSTr   Ú_hostr   ÚDEFAULT_PORTÚ_portÚDEFAULT_PATHÚ_pathÚ_normalize_appsÚ_appsÚ_runnerÚ_siteÚ_appÚ_http_clientÚ
_poll_taskÚasyncioÚQueueÚ_message_queuer   ÚMESSAGE_DEDUP_TTL_SECONDSÚ_dedupÚ_user_app_mapÚ_access_tokens)ÚselfrH   rR   Ú	_raw_hostÚ	__class__s   &&  €r   rP   ÚWecomCallbackAdapter.__init__`   sé   ø€ Ü‰Ñ˜¤×!8Ñ!8Ô9Ø—‘×"Ð" ˆØ—I‘I˜fÓ%×5Ð5¬ˆ	ß'0”S˜”^°dˆŒ
Ü˜Ÿ™ 6Ó*×:Ð:¬lÓ;ˆŒ
Ü˜Ÿ™ 6Ó*×:Ð:¬lÓ;ˆŒ
Ø+/×+?Ñ+?ÀÓ+FˆŒ
ØVZÐZˆŒÐZ�t”zÐZ D¤IÐZ°Ô0AÀDÄOÜ;B¿=º=»?ˆÔÜ)Ô6OÔPˆŒØ-/ˆÔØ9;ˆÖr   c               ó$   € V ^8„  d   QhRRRRRR/# )r   Úcorp_idr   Úuser_idr   r   )r   s   "r   r   rI   o   s!   € ÷ >ñ >˜sð >¨Sð >°Sñ >r   c                	ó$   € V '       d   V  R V 2# T# ©Ú:r   )rm   rn   s   &&r   Ú_user_app_keyÚ"WecomCallbackAdapter._user_app_keyn   s   € ç)0�'�˜!˜G˜9Ð%Ð=°gÐ=r   c               ó    € V ^8„  d   QhRRRR/# )r   rR   údict[str, Any]r   zlist[dict[str, Any]]r   )r   s   "r   r   rI   s   s   € ÷ ñ ˜~ð Ð2Fñ r   c                	ó  € V P                  R 4      p\        V\        4      '       d<   V'       d4   V Uu. uF&  p\        V\        4      '       g   K  \        V4      NK(  	  up# V P                  R4      '       d‚   RV P                  R4      ;'       g    RRV P                  RR4      RV P                  RR4      R\	        V P                  RR4      4      RV P                  RR4      RV P                  RR4      /.# . # u upi )	Úappsrm   ÚnameÚdefaultÚ Úcorp_secretÚagent_idÚtokenÚencoding_aes_key)rS   Ú
isinstanceÚlistr-   r   )rR   rw   Úapps   &  r   rZ   Ú$WecomCallbackAdapter._normalize_appsr   sþ   € à�y‰y˜Ó ˆÜ�dœD×!Ò!§dÙ)-ÓG© #´¸CÄ×1F”I”D˜–I©ÑGÐGØ�9‰9�Y×ÒØ˜UŸY™Y vÓ.×;Ð;°)¸YÈÏ	É	ÐR[Ð]_ÓH`ÐboÐqv×qzÑqzð  |Ið  KMó  rNØ¤ U§Y¡Y¨z¸2Ó%>Ó!?ÀÈ%Ï)É)ÐT[Ð]_ÓJ`ÐbtÐv{×vÑvð  ASð  UWó  wXðYð Zð Zàˆ	ùò	 Hs   ´C=ÁC=Úis_reconnectFc               ó    € V ^8„  d   QhRRRR/# )r   rƒ   r$   r   r   )r   s   "r   r   rI   |   s   € ÷ *ñ *¨Tð *¸dñ *r   c          	   ƒ  	ó  "  € ?V P                   '       g   \        P                  R 4       R# \        4       '       g   \        P                  R4       R# ^ RIHpHp V! V 4      '       g–    \        P                  ! \        P                  \        P                  4      ;_uu_ 4       pVP                  ^4       VP                  RV P                  34       RRR4       \        P                  RV P                  4       R#  ^ RIHp \&        P(                  ! RV! 4       R	7      V n        \,        P.                  ! \0        R
7      V n        V P2                  P4                  P7                  RV P8                  4       V P2                  P4                  P7                  V P:                  V P<                  4       V P2                  P4                  P?                  V P:                  V P@                  4       V! W P2                  V PB                  V P                  V P:                  4      G Rj  x€L
 V n"        \F        PH                  ! V PK                  4       4      V n&        V PO                  4        V PD                  e7   \        PQ                  RV PB                  V P                  V P:                  4       V P                    F  p V PS                  V4      G Rj  x€L
  K  	  R#   + '       g   i     EL; i  \        \         3 d     ELi ; i Lá L8  \T         d3   p\        P                  RTPW                  RR4      T4        Rp?K‹  Rp?ii ; i  \T         d3    T PY                  4       G Rj  x€L 
  \        P[                  R4        R# i ; i5i)z+[WecomCallback] No callback apps configuredFz+[WecomCallback] aiohttp/httpx not installed)Úbind_listenerÚshared_ingress_profilez	127.0.0.1Nz&[WecomCallback] Port %d already in use)Úplatform_httpx_limitsg      4@)ÚtimeoutÚlimits)Úclient_max_sizez/healthz0[WecomCallback] HTTP server listening on %s:%s%sz=[WecomCallback] Initial token refresh failed for app '%s': %srx   ry   Tz[WecomCallback] Failed to start).r[   ÚloggerÚwarningr)   Ú gateway.platforms.shared_ingressr†   r‡   Ú_socketÚsocketÚAF_INETÚSOCK_STREAMÚ
settimeoutÚconnectrW   ÚerrorÚConnectionRefusedErrorÚOSErrorÚ%gateway.platforms._http_client_limitsrˆ   ÚhttpxÚAsyncClientr_   r   ÚApplicationÚ	_MAX_BODYr^   ÚrouterÚadd_getÚ_handle_healthrY   Ú_handle_verifyÚadd_postÚ_handle_callbackrU   r\   ra   Úcreate_taskÚ
_poll_loopr`   Ú_mark_connectedÚinfoÚ_refresh_access_tokenr:   rS   Ú_cleanupÚ	exception)rh   rƒ   r†   r‡   Úsockrˆ   r�   Úexcs   &$      r   r”   ÚWecomCallbackAdapter.connect|   s�  é € ØØ�z�zˆzÜ�N‰NÐHÔIÙÜ0×2Ò2Ü�N‰NÐHÔIÙßZÙ% d×+Ò+ðÜ—^’^¤G§O¡O´W×5HÑ5H×IÔIÈTØ—O‘O AÔ&Ø—L‘L +¨t¯z©zÐ!:Ô;÷ Jô —‘ÐEÀtÇzÁzÔRÙð	åSÜ %× 1Ò 1¸$ÑG\ÓG^Ô _ˆDÔäŸš¼	ÔBˆDŒIØ�I‰I×Ñ×$Ñ$ Y°×0CÑ0CÔDØ�I‰I×Ñ×$Ñ$ T§Z¡Z°×1DÑ1DÔEØ�I‰I×Ñ×%Ñ% d§j¡j°$×2GÑ2GÔHá!.¨t·Y±YÀÇ
Á
ÈDÏJÉJÐX\×XbÑXbÓ!c×cˆDŒLÜ%×1Ò1°$·/±/Ó2CÓDˆDŒOØ× Ñ Ô"Ø�|‰|Ò'Ü—‘ÐNÐPT×PZÑPZÐ\`×\fÑ\fÐhl×hrÑhrÔsØ—z”z�ðEØ×4Ñ4°SÓ9×9Ò9ñ "ñ
 ÷7 J×IÐIûô
 +¬GÐ4ô Úðúñ dñ :øÜ ô EÜ—N‘NÐ#bÐdg×dkÑdkÐlrÐt}Ód~ð  AD÷  Eò  EûðEûô ô 	Ø—-‘-“/×!Ñ!Ü×ÑÐ>Ô?Úð	üsÂ   ‚A'NÁ+;K, Â&/KÃ(K, Ã=NÄ D"M È"LÈ#BM Ê9LËLËLËM ËNËK)	Ë#	K, Ë,LË=NÌ LÌNÌM ÌLÌMÌ'M Ì:M Í MÍM ÍNÍ&M)Í'NÎNÎNÎNc               ó   € V ^8„  d   QhRR/# ©r   r   ÚNoner   )r   s   "r   r   rI   ¨   s   € ÷ 4ñ 4 $ñ 4r   c              ƒ  	ód  "  € R V n         V P                  '       d7   V P                  P                  4         V P                  G Rj  x€L
  RV n        V P                  4       G Rj  x€L
  V P                  4        \        P                  R4       R#  LJ  \        P                   d     L_i ; i LH5i)FNz[WecomCallback] Disconnected)	Ú_runningr`   Úcancelra   ÚCancelledErrorr¨   Ú_mark_disconnectedrŒ   r¦   ©rh   s   &r   Ú
disconnectÚWecomCallbackAdapter.disconnect¨   sŠ   é € ØˆŒØ�?�?ˆ?Ø�O‰O×"Ñ"Ô$ðØ—o‘o×%Ð%ð #ˆDŒOØ�m‰m‹o×ÐØ×ÑÔ!Ü�‰Ð2Ö3ñ &øÜ×)Ñ)ô Ùðúñ 	ùsF   ‚4B0·B ÁBÁB ÁB0Á%B.Á&+B0ÂB ÂB+Â(B0Â*B+Â+B0c               ó   € V ^8„  d   QhRR/# r®   r   )r   s   "r   r   rI   µ   s   € ÷ !ñ ! ñ !r   c              ƒ  	ó  "  € R V n         V P                  '       d#   V P                  P                  4       G R j  x€L
  R ;V n        V n        V P                  '       d#   V P                  P                  4       G R j  x€L
  R V n        R #  LO L5i©N)r]   r\   Úcleanupr^   r_   Úacloserµ   s   &r   r¨   ÚWecomCallbackAdapter._cleanupµ   so   é € ØˆŒ
Ø�<�<ˆ<Ø—,‘,×&Ñ&Ó(×(Ð(Ø#'Ð'ˆŒ�t”yØ××ÐØ×#Ñ#×*Ñ*Ó,×,Ð,Ø ˆÖñ	 )ñ -ùs'   ‚7B¹B	º#BÁBÁ;BÁ<BÂBc          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
r   Úchat_idr   ÚcontentÚreply_toúOptional[str]ÚmetadataúOptional[dict[str, Any]]r   r   r   )r   s   "r   r   rI   ¾   s<   € ÷ ]ñ ] #ð ]°ð ]¸}ð ]Ð_wð ]ð  DNñ ]r   c              ƒ  ó®   a aa"  € S P                  S4      oS P                  VS P                  \        R7      p\	        VVVV 3R l4      G Rj  x€L
 #  L5i)zOOne text message per MAX_MESSAGE_LENGTH-byte chunk; stops at the first failure.)Úlen_fnc                ó*   <€ SP                  SSV 4      # rº   )Ú
_send_text)Úchunkr�   r¿   rh   s   &€€€r   Ú<lambda>Ú+WecomCallbackAdapter.send.<locals>.<lambda>Â   s   ø€ °t·±ÀsÈGÐUZÔ7[r   N)Ú_resolve_app_for_chatÚtruncate_messageÚMAX_MESSAGE_LENGTHr!   r   )rh   r¿   rÀ   rÁ   rÃ   Úchunksr�   s   ff&&& @r   ÚsendÚWecomCallbackAdapter.send¾   sH   úé € à×(Ñ(¨Ó1ˆØ×&Ñ& w°×0GÑ0GÔPYÐ&ÓZˆÜ  Ö)[Ó\×\Ð\Ñ\ùs   …A	AÁAÁAc               ó(   € V ^8„  d   QhRRRRRRRR/# )r   r�   ru   r¿   r   rÀ   r   r   r   )r   s   "r   r   rI   Ä   s)   € ÷ =ñ = Nð =¸Sð =È3ð =ÐS]ñ =r   c              ƒ  	ó`  "  €  R VP                  R^4      R,          RRR\        \        VP                  R4      ;'       g    ^ 4      4      RRV/R^ /p\	        ^4       EF
  pV P                  V4      G Rj  x€L
 pV P                  P                  \         V 2VR	7      G Rj  x€L
 pVP                  4       pVP                  R
4      p	V	R9   dT   V^ 8X  dM   \        P                  RVP                  RR4      V	4       V P                  P                  VR,          R4       KÅ  V	^ 8X  d*   \        R\        VP                  RR4      4      VR7      u # \        R\        V4      R7      u # 	  \        RRR7      #  EL LÙ  \         d!   p
\        R\        T
4      R7      u Rp
?
# Rp
?
ii ; i5i)Útouserrq   Úmsgtyper   Úagentidr|   rÀ   ÚsafeN)ÚjsonÚerrcodezD[WecomCallback] Token rejected for app '%s' (errcode=%s), refreshingrx   ry   TÚmsgidrz   )r>   Ú
message_idÚraw_responseF)r>   r•   zsend failed after token refreshéÿÿÿÿ>   é¤  éAœ  )Úsplitr   r   rS   ÚrangeÚ_get_access_tokenr_   ÚpostÚ	_SEND_URLrØ   rŒ   r�   rg   Úpopr   r:   )rh   r�   r¿   rÀ   ÚpayloadÚ_attemptr}   ÚrespÚdatarÙ   r«   s   &&&&       r   rÈ   ÚWecomCallbackAdapter._send_textÄ   sÏ  é € ð	=Ø §¡¨s°AÓ!6°rÕ!:¸IÀvÈyÔZ]Ô^aÐbe×biÑbiÐjtÓbu×bzÐbzÐyzÓ^{ÓZ|ð  Eð  HQð  SZð  G[ð  ]cð  efð  gˆGÜ! !ŸH�Ø"×4Ñ4°SÓ9×9�Ø!×.Ñ.×3Ñ3´y°kÀ%ÀÐ4IÐPWÐ3ÓX×X�Ø—y‘y“{�ØŸ(™( 9Ó-�Ø˜nÔ,°¸Q´Ü—N‘NÐ#iÐkn×krÑkrÐsyð  |Eó  lFð  HOô  PØ×'Ñ'×+Ñ+¨C°­K¸Ô>ÙØmtÐxyÔmy”z¨$¼3¸t¿x¹xÈÐQSÓ?TÓ;UÐdhÔiò  jô  @Jð  SXô  `cð  dhó  `iô  @jò  jñ %ô  eÐ3TÔUÐUò :ÙXøô ô 	=Ü e´3°s³8Ô<Õ<ûð	=üsr   ‚F.„A3F  Á7E;Á8,F  Â$E>Â%B.F  ÅF.ÅF  Å+F.Å,F  Å:F.Å;F  Å>F  Æ F+ÆF&Æ F+Æ!F.Æ&F+Æ+F.c               ó    € V ^8„  d   QhRRRR/# ©r   r¿   r   r   ru   r   )r   s   "r   r   rI   Õ   s   € ÷ @ñ @¨Sð @°^ñ @r   c                	óŒ  € V P                   P                  V4      pV'       gr   R V9  dk   V P                    Uu. uF   q3P                  R V 24      '       g   K  VNK"  	  pp\        V4      ^8X  d#   V P                   P                  V^ ,          4      MTpV P	                  V4      ;'       g    V P
                  ^ ,          # u upi rp   )rf   rS   Úendswithr   Ú_get_app_by_namer[   )rh   r¿   Úapp_nameÚkÚmatchings   &&   r   rÌ   Ú*WecomCallbackAdapter._resolve_app_for_chatÕ   sž   € Ø×%Ñ%×)Ñ)¨'Ó2ˆß˜C wÔ.Ø#'×#5Ò#5ÓSÑ#5˜a¿¹ÀaÈÀyÀM×9RŸ˜Ñ#5ˆHÐSÜ>AÀ(»mÈqÔ>P�t×)Ñ)×-Ñ-¨h°q­kÔ:ÐV^ˆHØ×$Ñ$ XÓ.×?Ð?°$·*±*¸Qµ-Ð?ùò Ts   ¹CÁCc               ó    € V ^8„  d   QhRRRR/# rì   r   )r   s   "r   r   rI   Ü   s   € ÷ /ñ /¨3ð /°>ñ /r   c              ƒ  	ó   "  € R VRR/# 5i)rx   ÚtypeÚdmr   )rh   r¿   s   &&r   Úget_chat_infoÚ"WecomCallbackAdapter.get_chat_infoÜ   s   é € Ø˜ ¨Ð.Ð.ùs   ‚	c               ó    € V ^8„  d   QhRRRR/# ©r   Úrequestúweb.Requestr   zweb.Responser   )r   s   "r   r   rI   ß   s   € ÷ Qñ Q¨Kð Q¸Lñ Qr   c              ƒ  	ó>   "  € \         P                  ! R RRR/4      # 5i)ÚstatusÚokÚplatformÚwecom_callback)r   Újson_response)rh   rü   s   &&r   rŸ   Ú#WecomCallbackAdapter._handle_healthß   s    é € Ü× Ò  (¨D°*Ð>NÐ!OÓPÐPùs   ‚c               ó    € V ^8„  d   QhRRRR/# rû   r   )r   s   "r   r   rI   â   s   € ÷ 
Nñ 
N¨Kð 
N¸Lñ 
Nr   c              ƒ  óX  "  € V P                  V4      w  r#pVP                  P                  RR4      pV P                   F=  p V P	                  V4      P                  W#WE4      p\        P                  ! VRR7      u # 	  \        P                  ! RRR7      #   \         d     Kg  i ; i5i)u2   GET endpoint â€” WeCom URL verification handshake.Úechostrrz   r?   r@   i“  zsignature verification failed©rÿ   r   )	Ú_signature_paramsÚqueryrS   r[   Ú_crypt_for_appÚ
verify_urlr   rB   r:   )rh   rü   Úmsg_signatureÚ	timestampÚnoncer  r�   Úplains   &&      r   r    Ú#WecomCallbackAdapter._handle_verifyâ   s™   é € à*.×*@Ñ*@ÀÓ*IÑ'ˆ %Ø—-‘-×#Ñ# I¨rÓ2ˆØ—:”:ˆCðØ×+Ñ+¨CÓ0×;Ñ;¸MÐV[Óe�Ü—|’|¨¸\ÔJÒJñ ô �|Š| 3Ð-LÔMÐMøô ô Úðüs*   ‚A B*Á8BÁ;B*ÂB'Â#B*Â&B'Â'B*c               ó    € V ^8„  d   QhRRRR/# rû   r   )r   s   "r   r   rI   î   s   € ÷ Iñ I¨kð I¸lñ Ir   c              ƒ  ó|  "  € V P                  V4      w  r#pVP                  4       G Rj  x€L
 p\        V4      \        8”  d8   \        P                  R\        V4      4       \        P                  ! RRR7      # VP                  RRR7      pV P                   EFK  p V P                  WpP                  WvW#V4      4      pVEe   VP                  '       dX   V P                  P                  VP                  4      '       d-   \        P                  R	VP                  4       \!        4       u # VP"                  '       dy   VP"                  P$                  '       d]   VR
,          V P&                  T P)                  \+        VP-                  R4      ;'       g    R4      VP"                  P$                  4      &   V P.                  P1                  V4      G Rj  x€L
  \!        4       u # 	  \        P                  ! RRR7      #  EL× L-  \2         d     EK|  \4         d    \        P7                  R4         KO  i ; i5i)u8   POST endpoint â€” receive an encrypted message callback.Nu9   [WecomCallback] Payload too large (%d bytes) â€” rejectedi�  zpayload too larger  r   Úreplace)Úerrorsz,[WecomCallback] Duplicate MsgId %s, skippingrx   rm   rz   z&[WecomCallback] Error handling messagei�  zinvalid callback payload)r	  Úreadr   rœ   rŒ   r�   r   rB   Údecoder[   Ú_build_eventÚ_decrypt_requestrÛ   re   Úis_duplicateÚdebugrC   Úsourcern   rf   rr   r   rS   rc   Úputr   r:   r©   )	rh   rü   r  r  r  Ú
body_bytesÚbodyr�   Úevents	   &&       r   r¢   Ú%WecomCallbackAdapter._handle_callbackî   s¿  é € à*.×*@Ñ*@ÀÓ*IÑ'ˆ %Ø"Ÿ<™<›>×)ˆ
Üˆz‹?œYÔ&Ü�N‰NÐVÔX[Ð\fÓXgÔhÜ—<’< sÐ1DÔEÐEØ× Ñ  °Ð Ó;ˆØ—:•:ˆCðØ×)Ñ)¨#×/DÑ/DÀSÐP]ÐjoÓ/pÓq�ØÓ$à×'×'Ð'¨D¯K©K×,DÑ,DÀU×EUÑEU×,VÒ,VÜŸ™Ð%SÐUZ×UeÑUeÔfÜ#›všØ—|—|�|¨¯©×(<×(<Ð(<Øvyð  {Aõ  wB˜×*Ñ*¨4×+=Ñ+=¼cÀ#Ç'Á'È)ÓBT×BZÐBZÐXZÓ>[Ð]b×]iÑ]i×]qÑ]qÓ+rÑsØ×-Ñ-×1Ñ1°%Ó8×8Ð8Ü“v’ñ ô" �|Š| 3Ð-GÔHÐHò- *ñ 9øä#ô ÛÜô Ü× Ñ Ð!IÔJÛðüs‚   ‚(H<ªH«A2H<Â8HÃ*HÄ)HÄ+H<Ä.HÅ HÅ:HÆ?HÇHÇHÇ$H<ÈHÈH9ÈH<ÈH9ÈH9È4H<È8H9È9H<c               ó   € V ^8„  d   QhRR/# )r   rü   rý   r   )r   s   "r   r   rI   
  s   € ÷ `ñ ` ;ñ `r   c                	óh   a € \         ;QJ d    . V 3R  lR 4       F  NK  	  5# ! V 3R  lR 4       4      # )c              3  ó\   <"  € T F!  pSP                   P                  VR 4      x € K#  	  R# 5i)rz   N)r
  rS   )Ú.0rñ   rü   s   & €r   Ú	<genexpr>Ú9WecomCallbackAdapter._signature_params.<locals>.<genexpr>  s'   øé € Ð_Ñ7^°!�W—]‘]×&Ñ& q¨"×-Ð-Ó7^ùs   ƒ),)r  r  r  )Útuple)rü   s   fr   r	  Ú&WecomCallbackAdapter._signature_params	  s'   ø€ çŒuÔ_Ñ7^Ó_�uÐ_ˆuÔ_Ñ7^Ó_Ó_Ð_r   c               ó   € V ^8„  d   QhRR/# r®   r   )r   s   "r   r   rI     s   € ÷ Lñ L $ñ Lr   c              ƒ  	ór  "  €  V P                   P                  4       G Rj  x€L
 p \        P                  ! V P	                  V4      4      pV P
                  P                  V4       VP                  V P
                  P                  4       K‹   Ll  \         d    \        P                  R4        K°  i ; i5i)TNz'[WecomCallback] Failed to enqueue event)rc   rS   ra   r£   Úhandle_messageÚ_background_tasksÚaddÚadd_done_callbackÚdiscardr:   rŒ   r©   )rh   r   Útasks   &  r   r¤   ÚWecomCallbackAdapter._poll_loop  s”   é € ØØ×-Ñ-×1Ñ1Ó3×3ˆEðLÜ×*Ò*¨4×+>Ñ+>¸uÓ+EÓF�Ø×&Ñ&×*Ñ*¨4Ô0Ø×&Ñ& t×'=Ñ'=×'EÑ'EÖFñ	 4øô
 ô LÜ× Ñ Ð!J×KðLüs3   ‚B7¡B¢B7§A%B ÂB7Â B4Â0B7Â3B4Â4B7c               ó0   € V ^8„  d   QhRRRRRRRRRRRR/# )	r   r�   ru   r  r   r  r  r  r   r   )r   s   "r   r   rI     sA   € ÷ jñ j Nð j¸#ð jÈcð jÐ^að jÐjmð jÐruñ jr   c                	ó°   € \         P                  ! V4      P                  R RR7      pV P                  V4      P	                  W4WV4      P                  R4      # )ÚEncryptrz   ©ry   r   )r1   Ú
fromstringÚfindtextr  Údecryptr  )rh   r�   r  r  r  r  Úencrypts   &&&&&& r   r  Ú%WecomCallbackAdapter._decrypt_request  sJ   € Ü—-’- Ó%×.Ñ.¨yÀ"Ð.ÓEˆØ×"Ñ" 3Ó'×/Ñ/°È%ÓY×`Ñ`ÐahÓiÐir   c               ó$   € V ^8„  d   QhRRRRRR/# )r   r�   ru   Úxml_textr   r   zOptional[MessageEvent]r   )r   s   "r   r   rI     s'   € ÷ Añ A ð A¸#ð AÐBXñ Ar   c                	ó´  € \         P                  ! V4      pVP                  R 4      ;'       g    RP                  4       pVR9  g6   VR8X  d1   VP                  R4      ;'       g    RP                  4       R9   d   R# VP                  RRR7      pVP                  RVP	                  RR4      R7      pVP                  R	RR7      P                  4       ;'       g    VR8X  d   R
MRpVP                  R4      ;'       g    V RVP                  RRR7       2pV P                  V P                  We4      VRWUR7      p	\        V\        P                  W’VR7      # )ÚMsgTyperz   r   ÚEventNÚFromUserNamer6  Ú
ToUserNamerm   ÚContentz/startÚMsgIdrq   Ú
CreateTimeÚ0r÷   )r¿   Ú	chat_nameÚ	chat_typern   Ú	user_name)r   Úmessage_typer  Úraw_messagerÛ   >   r   r   >   Ú	subscribeÚenter_agent)r1   r7  r8  ÚlowerrS   ÚstripÚbuild_sourcerr   r   r   ÚTEXT)
rh   r�   r=  ÚrootÚmsg_typern   rm   rÀ   Úmsg_idr  s
   &&&       r   r  Ú!WecomCallbackAdapter._build_event  sH  € Ü�}Š}˜XÓ&ˆØ—M‘M )Ó,×2Ð2°×9Ñ9Ó;ˆàÐ,Ô,°¸WÔ1DÈ$Ï-É-ÐX_ÓJ`×JfÐJfÐdf×ImÑImÓIoð  tPô  JPÙØ—-‘- ¸�-Ó;ˆØ—-‘- °c·g±g¸iÈÓ6L�-ÓMˆØ—-‘- 	°2�-Ó6×<Ñ<Ó>×kÐkÈxÐ[bÔObÁ8ÐhjˆØ—‘˜wÓ'×bÐb¨g¨Y°a¸¿¹ÀlÐ\_¸Ó8`Ð7aÐ+bˆØ×"Ñ"¨4×+=Ñ+=¸gÓ+OÐ[bÐnrð  }DÐ"ó  XˆÜ ´{×7GÑ7GÐPVÐyô  Að  	Ar   c               ó    € V ^8„  d   QhRRRR/# )r   r�   ru   r   r   r   )r   s   "r   r   rI   (  s   € ÷ cñ c .ð c°]ñ cr   c           	     	óê   € \        \        VP                  R 4      ;'       g    R4      \        VP                  R4      ;'       g    R4      \        VP                  R4      ;'       g    R4      R7      # )r}   rz   r~   rm   )r}   r~   Ú
receive_id)r   r   rS   )rh   r�   s   &&r   r  Ú#WecomCallbackAdapter._crypt_for_app(  s�   € Ü¤3 s§w¡w¨wÓ'7×'=Ð'=¸2Ó#>ÔQTÐUX×U\ÑU\Ð]oÓUp×UvÐUvÐtvÓQwô  EHð  IL÷  IPñ  IPð  QZó  I[÷  Iað  Iað  _aó  Ebô  cð  	cr   c               ó    € V ^8„  d   QhRRRR/# )r   rx   rÂ   r   rÄ   r   )r   s   "r   r   rI   +  s   € ÷ dñ d ]ð dÐ7Oñ dr   c                	óX   a€ S'       d!   \        V3R  lV P                   4       R4      # R# )c              3  óV   <"  € T F  qP                  R 4      S8X  g   K  Vx € K   	  R# 5i)rx   N)rS   )r%  r�   rx   s   & €r   r&  Ú8WecomCallbackAdapter._get_app_by_name.<locals>.<genexpr>,  s    øé € ÐJ¡J˜S·'±'¸&³/ÀTÑ2I—S’S£Jùs   ƒ)Ÿ
)N)Únextr[   )rh   rx   s   &fr   rï   Ú%WecomCallbackAdapter._get_app_by_name+  s"   ø€ ßUYŒtÔJ D§J¢JÓJÈDÓQÐcÐ_cÐcr   c               ó    € V ^8„  d   QhRRRR/# ©r   r�   ru   r   r   r   )r   s   "r   r   rI   .  s   € ÷ Gñ G¨>ð G¸cñ Gr   c              ƒ  	ó  "  € V P                   P                  VR ,          4      pV'       d;   VP                  R^ 4      \        P                  ! 4       ^<,           8”  d
   VR,          # V P                  V4      G Rj  x€L
 #  L5i)rx   Ú
expires_atr}   N)rg   rS   Útimer§   )rh   r�   Úcacheds   && r   râ   Ú&WecomCallbackAdapter._get_access_token.  s   é € Ø×$Ñ$×(Ñ(¨¨V­Ó5ˆß"(¨V¯Z©Z¸ÀaÓ-HÌ4Ï9Ê9Ë;ÐY[ÕK[Ô-[ˆv�g�ð  	GÐgk÷  hBñ  hBð  CFó  hG÷  bGð  	Gñ  bGùs   ‚A9BÁ;B Á<Bc               ó    € V ^8„  d   QhRRRR/# ra  r   )r   s   "r   r   rI   2  s   € ÷ 	ñ 	¨~ð 	À#ñ 	r   c           	   ƒ  	ó8  "  € V P                   P                  \        R VP                  R4      RVP                  R4      /R7      G Rj  x€L
 pVP                  4       pVP                  R4      ^ 8w  d   \	        RV 24      hVR,          p\        VP                  R	\        4      4      pR
VR\        P                  ! 4       V,           /V P                  VR,          &   \        P                  RVP                  RR4      VP                  RR4      V4       V#  LÎ5i)Úcorpidrm   Ú
corpsecretr{   )ÚparamsNrÙ   zWeCom token refresh failed: Úaccess_tokenÚ
expires_inr}   rc  rx   zF[WecomCallback] Token refreshed for app '%s' (corp=%s), expires in %ssry   rz   )r_   rS   Ú
_TOKEN_URLrØ   ÚRuntimeErrorr   ÚACCESS_TOKEN_TTL_SECONDSrd  rg   rŒ   r¦   )rh   r�   rè   ré   r}   rm  s   &&    r   r§   Ú*WecomCallbackAdapter._refresh_access_token2  s'  é € Ø×&Ñ&×*Ñ*¬:¸xÈÏÉÐQZÓI[Ð]iÐkn×krÑkrð  tAó  lBð  ?CÐ*ó  D÷  DˆØ�y‰y‹{ˆØ�8‰8�IÓ !Ô#ÜÐ!=¸d¸VÐDÓEÐEØ�^Õ$ˆÜ˜Ÿ™ ,Ô0HÓIÓJˆ
Ø,3°U¸LÌ$Ï)Ê)Ë+ÐXbÕJbÐ+cˆ×Ñ˜C �KÑ(Ü�‰Ð\Ð^a×^eÑ^eÐflÐnwÓ^xÐz}÷  {Bñ  {Bð  CLð  NPó  {Qð  S]ô  	^Øˆñ Dùs   ‚ADÁ	DÁ
CD)rg   r^   r[   re   rU   r_   rc   rY   r`   rW   r\   r±   r]   rf   )NN) Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__rF   Ú__annotations__rÎ   Úsplits_long_messagesrP   Ústaticmethodrr   rZ   r”   r¶   r¨   rÐ   rÈ   rÌ   rø   rŸ   r    r¢   r	  r¤   r  r  r  rï   râ   r§   Ú__static_attributes__Ú__classcell__)rj   s   @r   rE   rE   Z   sÏ   ø‡ à"&Ð˜4Ó&àÐØÐ÷<ð <ð ô>ó ð>ð ôó ðð*°E÷ *õX4õ!÷]õ=õ"@õ/õQõ
NõIð6 ô`ó ð`õLõjõAõcõdõG÷	ó 	r   rE   )6Ú__doc__Ú
__future__r   ra   Úloggingr�   r�   rd  Útypingr   r   r   r   r2   r3   r1   r(   ÚImportErrorÚaiohttpr   r&   r™   r'   Úgateway.configr   r	   Úgateway.platforms.baser
   r   Úgateway.platforms.eventr   r   Úgateway.platforms.helpersr   r   Ú$plugins.platforms.wecom.wecom_cryptor   r   Ú	getLoggerrr  rŒ   rT   rV   rX   rœ   rp  rd   rä   rn  r!   r)   r<   rC   rE   r   r   r   Ú<module>r‡     s  ðñ`õ #ã Û Û Û ß ,Ó ,ð!Ý'ØÐð
ÝØÐð
ÛØ€O÷
 4ß Bß =ß Fß Pà	×	Ò	˜8Ó	$€à€Ø€Ø €Ø€	ØÐ ØÐ ØL€	Ø;€
õ%õJõ
/ò2CôaÐ.ö aøðU ô !Ø	€BØ Òð!ûð ô Ø
€CØÒðûð ô Ø€EØ‚Oðús3   ¦B* ¯B; ¸C Â*B8Â7B8Â;C	ÃC	ÃCÃC