+
    kHàj  ã                   ór   € R t ^ RIt^ RIt^ RIt^ RIHt ]P                  ! ]4      tRt	Rt
Rt ! R R4      tR# )z³Durable per-channel receive cursors for the Buzz adapter (#90464): a restart resumes from the saved
cursor instead of reseeding from history and marking downtime arrivals as seen.N©ÚPathiô  Úbuzzzchannel-cursors.jsonc                   ó°   a € ] tR t^t o ]V 3R lR l4       tV 3R lR ltV 3R lR ltV 3R lR lt]V 3R	 lR
 l4       t	]V 3R lR l4       t
R tRtV tR# )ÚBuzzCursorMixinc                ó    <€ V ^8„  d   QhRS[ /# ©é   Úreturnr   )ÚformatÚ__classdict__s   "€ÚH/home/ubuntu/.hermes/hermes-agent/plugins/platforms/buzz/buzz_cursors.pyÚ__annotate__ÚBuzzCursorMixin.__annotate__   s   ø€ ÷ Qñ Q™$ñ Qó    c                 óH   € ^ RI Hp  V ! 4       \        ,          \        ,          # )é    ©Úget_hermes_home)Úhermes_constantsr   Ú_CURSOR_STATE_SUBDIRÚ_CURSOR_STATE_FILENAMEr   s    r   Ú_cursor_pathÚBuzzCursorMixin._cursor_path   s   € å4ÙÓ Ô#7Õ7Ô:PÕPÐPr   c                ó   <€ V ^8„  d   QhRR/# ©r	   r
   N© )r   r   s   "€r   r   r      s   ø€ ÷ Iñ I˜tñ Ir   c                ó  € / V n          V P                  4       ;pP                  4       '       g   R# \        P                  ! VP                  RR7      4      p\        T\        4      '       dA   TP                  R4      T P                  8w  g!   TP                  R4      T P                  8w  d   R# \        TP                  R	4      ;p\        4      '       g   R# TP                  4        FÎ  w  rE\        T\        4      '       g   K   \        TP                  R
4      ;'       g    ^ 4      pTP                  R4      p\        T\$        4      '       d$   T Uu. uF  p\'        T4      NK  	  up\(        ) R M. p	R\'        TP                  R4      ;'       g    R4      R
TRT	/T P                   \'        T4      &   KÐ  	  R#   \         d    \        P                  RRR7        R# i ; i  \         \"        3 d     EK  i ; iu upi )zkRead persisted cursors; another identity/relay's file is ignored (ids collide), failures seed from history.Nz	utf-8-sig)Úencodingz$Buzz: could not read channel cursorsT©Úexc_infoÚidentityÚrelayÚchannelsÚlast_tsÚseenÚ	chat_typeÚ )Ú_restored_cursorsr   ÚexistsÚjsonÚloadsÚ	read_textÚ	ExceptionÚloggerÚdebugÚ
isinstanceÚdictÚgetÚ_self_pubkeyÚ	relay_urlÚitemsÚintÚ	TypeErrorÚ
ValueErrorÚlistÚstrÚ	_SEEN_CAP)
ÚselfÚpathÚdatar#   Ú
channel_idÚentryr$   Úraw_seenÚevent_idr%   s
   &         r   Ú_load_cursorsÚBuzzCursorMixin._load_cursors   s¸  € à!#ˆÔð	Ø ×-Ñ-Ó/Ð/�D×7Ñ7×9Ò9ÙÜ—:’:˜dŸn™n°k˜nÓBÓCˆDô ˜$¤×%Ò%¨¯©°*Ó)=À×ARÑARÔ)RÐVZ×V^ÑV^Ð_fÓVgÐko×kyÑkyÔVyÙÜ d§h¡h¨zÓ&:Ð:˜(¼D×AÒAÙØ!)§¡Ö!1ÑˆJÜ˜e¤T×*Ò*ÙðÜ˜eŸi™i¨	Ó2×7Ð7°aÓ8�ð —y‘y Ó(ˆHÜLVÐW_Ôae×LfÒLf±(Ó;±( h”C˜–M±(Ñ;¼Y¸J¸KÑHÐlnˆDØ7BÄCÈÏ	É	ÐR]ÓH^×HdÐHdÐbdÓDeÐgpÐryð  |Bð  DHð  7IˆD×"Ñ"¤3 z£?Ó3ó "2øô ô 	Ü�L‰LÐ?È$ˆLÔOÚð	ûô œzÐ*ô Ûðüò <s4   ‰%F< ±&F< ÄG%Ä#G%ÅG>Æ<"G"Ç!G"Ç%G;Ç:G;c                ó    <€ V ^8„  d   QhRS[ /# r   )r1   )r   r   s   "€r   r   r   .   s   ø€ ÷ 	^ñ 	^¡ñ 	^r   c                óh  € V P                   P                  4        UUu/ uFk  w  rTRVP                  R4      ;'       g    RR\        VP                  R4      ;'       g    ^ 4      R\	        VP                  R4      ;'       g    R4      /bKm  	  pppRV P
                  RV P                  RV/# u uppi )	zaSnapshot of every watched channel's cursor (taken on the loop: ``_channel_state`` is loop-owned).r&   Úgroupr$   r%   r!   r"   r#   r   )Ú_channel_stater5   r2   r6   r9   r3   r4   )r<   r?   Ústater#   s   &   r   Ú_cursor_payloadÚBuzzCursorMixin._cursor_payload.   s¸   € ð &*×%8Ñ%8×%>Ñ%>Ô%@ô
ñ
 &AÑ!�
ð	 Ø˜UŸY™Y {Ó3×>Ð>°wÀ	Ì3ÈuÏyÉyÐYbÓOc×OhÐOhÐghÓKiØœ˜UŸY™Y vÓ.×4Ð4°"Ó5ðò ñ &Að 	ñ 
ð ˜D×-Ñ-¨w¸¿¹È
ÐT\Ð]Ð]ùó
s   ž B.¿B.Á#B.ÂB.c                ó   <€ V ^8„  d   QhRR/# r   r   )r   r   s   "€r   r   r   9   s   ø€ ÷ Iñ I˜tñ Ir   c                ób   € V P                  V P                  4       V P                  4       4       R# )z6Persist every watched channel's cursor.  Never raises.N)Ú_write_cursorsr   rJ   )r<   s   &r   Ú_save_cursorsÚBuzzCursorMixin._save_cursors9   s$   € à×Ñ˜D×-Ñ-Ó/°×1EÑ1EÓ1GÖHr   c                ó*   <€ V ^8„  d   QhRS[ RS[RR/# )r	   r=   Úpayloadr
   N)r   r1   )r   r   s   "€r   r   r   >   s'   ø€ ÷ Sñ S™Tð S©Dð S°Tñ Sr   c                óz   €  ^ RI Hp V! WRR7       R#   \         d    \        P	                  RRR7        R# i ; i)r   )Úatomic_json_writeN)Úindentz'Buzz: could not persist channel cursorsTr   )ÚutilsrT   r-   r.   r/   )r=   rR   rT   s   && r   rN   ÚBuzzCursorMixin._write_cursors=   s7   € ð	SÝ/Ù˜d°D×9øÜô 	SÜ�L‰LÐBÈTˆL×Rð	Sús   ‚ ”":¹:c                ó&   <€ V ^8„  d   QhRS[ RS[/# )r	   rI   r
   )r1   Útuple)r   r   s   "€r   r   r   F   s   ø€ ÷ iñ i™Dð i¡Uñ ir   c                óÔ   € V P                  R4      ;'       g    Rp\        V P                  R4      ;'       g    ^ 4      \        V4      V'       d   \        \	        V4      R4      3# R3# )z/Cheap change detector for one channel's cursor.r%   r$   Nr   )r2   r6   ÚlenÚnextÚreversed)rI   r%   s   & r   Ú_cursor_markÚBuzzCursorMixin._cursor_markE   sY   € ð �y‰y˜Ó ×&Ð& BˆÜ�5—9‘9˜YÓ'×,Ð,¨1Ó-¬s°4«y×Y]¼4ÄÈÃÐPTÓ;UÐhÐhÐcgÐhÐhr   c                óv   a aa€ S P                  4       oS P                  ^,           ;S n        oR VVV 3R llpV# )a  A write of the cursor as it stands now. A deferred write runs after the reader marked later
events seen before their dispatch committed, so it must never re-read the live state; and a
write older than one already landed is skipped, so the file never moves back.c                ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   Ú4BuzzCursorMixin._cursor_writer.<locals>.__annotate__R   s   € ÷ 	_ñ 	_˜tñ 	_r   c               “   óP  <"  € SP                   ;_uu_4       GR j  x€L
  S SP                  8”  d@   S Sn        \        P                  ! SP                  SP                  4       S4      G R j  x€L
  R R R 4      GR j  x€L
  R #  Lf L L
  + GR j  x€L 
 '       g   i     R # ; i5i)N)Ú_cursor_write_lockÚ_cursor_writtenÚasyncioÚ	to_threadrN   r   )Ú
generationrR   r<   s   €€€r   ÚpersistÚ/BuzzCursorMixin._cursor_writer.<locals>.persistR   sr   øé € à×.×.×.Ó.Ø × 4Ñ 4Ô4Ø+5�DÔ(Ü!×+Ò+¨D×,?Ñ,?À×ARÑARÓATÐV]Ó^×^Ð^÷ /×.Ó.ñ _÷ /×.×.Ó.üs]   ƒB&œB�B& AB	Á,BÁ-B	Á1B&Á<BÁ=B&ÂB	ÂB&Â	B#	ÂBÂ
B#	ÂB#	Â	B&)rJ   Ú_cursor_snapshots)r<   ri   rh   rR   s   f @@r   Ú_cursor_writerÚBuzzCursorMixin._cursor_writerK   s>   ú€ ð ×&Ñ&Ó(ˆØ.2×.DÑ.DÀqÕ.HÐHˆÔ ÷	_ò 	_ð ˆr   )rk   re   r(   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ústaticmethodr   rC   rJ   rO   rN   r^   rl   Ú__static_attributes__Ú__classdictcell__)r   s   @r   r   r      ss   ø‡ € Ø÷Qó ðQ÷Ið I÷2	^ð 	^÷Ið Ið ÷Só ðSð ÷ió ði÷
ð r   r   )Ú__doc__rf   r*   ÚloggingÚpathlibr   Ú	getLoggerrn   r.   r;   r   r   r   r   r   r   Ú<module>ry      sD   ðñSã Û Û Ý à	×	Ò	˜8Ó	$€à€	ØÐ Ø/Ð ÷Ió Ir   