Ë
    S"“jx†  ã                   óv  — d Z ddlZddlZddlZddlZddlmZ ddlmZm	Z	 ddl
mZ
mZ ddlmZ dZd	Zd
ZdZdZ G d„ d«      Z ed«      Z ed«      Zej0                  ej2                  z
  dz  Z e«       Zd„ Zd„ Z G d„ de«      Z G d„ de«      Z  G d„ d«      Z! G d„ d«      Z" G d„ d«      Z# G d„ d«      Z$y)a²  
This module deals with correct handling of updates, including gaps, and knowing when the code
should "get difference" (the set of updates that the client should know by now minus the set
of updates that it actually knows).

Each chat has its own [`Entry`] in the [`MessageBox`] (this `struct` is the "entry point").
At any given time, the message box may be either getting difference for them (entry is in
[`MessageBox::getting_diff_for`]) or not. If not getting difference, a possible gap may be
found for the updates (entry is in [`MessageBox::possible_gaps`]). Otherwise, the entry is
on its happy path.

Gaps are cleared when they are either resolved on their own (by waiting for a short time)
or because we got the difference for the corresponding entry.

While there are entries for which their difference must be fetched,
[`MessageBox::check_deadlines`] will always return [`Instant::now`], since "now" is the time
to get the difference.
é    N)ÚEnumé   )ÚSessionStateÚChannelStateé   )ÚtypesÚ	functions)Úget_running_loopi † éd   g      à?i„  c                   ó   — e Zd ZdZdd„Zd„ Zy)ÚSentinel©ÚtagNc                 ó   — |xs d| _         y )NÚ_r   )Úselfr   s     ú]/var/www/api.ozpay.ru/ozpay/venv/lib/python3.12/site-packages/telethon/_updates/messagebox.pyÚ__init__zSentinel.__init__4   s   € Ø’:˜#ˆ�ó    c                 ó   — | j                   S ©Nr   ©r   s    r   Ú__repr__zSentinel.__repr__7   s   € Ø�x‰xˆr   r   )Ú__name__Ú
__module__Ú__qualname__Ú	__slots__r   r   © r   r   r   r   1   s   „ Ø€Ióór   r   ÚACCOUNTÚSECRETc                  ó@   — t        «       j                  «       t        z   S r   )r
   ÚtimeÚNO_UPDATES_TIMEOUTr   r   r   Únext_updates_deadliner$   G   s   € ÜÓ×"Ñ"Ó$Ô'9Ñ9Ð9r   c                  ó¢   — t        j                   t        j                  d«      d d Ž j                  t         j                  j
                  ¬«      S )Nr   é   )Útzinfo)Údatetimer"   ÚgmtimeÚreplaceÚtimezoneÚutcr   r   r   Úepochr-   J   s<   € Ü×ÑœdŸk™k¨!›n¨R¨aÐ0Ð1×9Ñ9Ä×ARÑAR×AVÑAVÐ9ÓWÐWr   c                   ó   — e Zd Zd„ Zy)ÚGapErrorc                  ó   — y)Nz
GapError()r   r   s    r   r   zGapError.__repr__N   s   € Ør   N)r   r   r   r   r   r   r   r/   r/   M   s   „ ór   r/   c                   ó   — e Zd ZdZdZy)ÚPrematureEndReasonÚtmpÚbanN)r   r   r   ÚTEMPORARY_SERVER_ISSUESÚBANNEDr   r   r   r2   r2   R   s   „ Ø#ÐØ�Fr   r2   c                   ó:   — e Zd ZdZdededefd„Zed„ «       Zd„ Z	y)	ÚPtsInfo©ÚptsÚ	pts_countÚentryr:   r;   r<   c                 ó.   — || _         || _        || _        y r   r9   )r   r:   r;   r<   s       r   r   zPtsInfo.__init__[   s   € ð ˆŒØ"ˆŒØˆ�
r   c                 ó   — t        |dd «      }|r=t        |dd «      xs d}	 |j                  j                  j                  } | |||¬«      S t        |dd «      }|r | |dt        ¬«      S y # t        $ r t        |dd «      xs t
        }Y ŒJw xY w)Nr:   r;   r   Ú
channel_idr9   Úqtsr   )ÚgetattrÚmessageÚpeer_idr?   ÚAttributeErrorÚENTRY_ACCOUNTÚENTRY_SECRET)ÚclsÚupdater:   r;   r<   r@   s         r   Úfrom_updatezPtsInfo.from_updatee   s›   € ä�f˜e TÓ*ˆÙÜ ¨°TÓ:Ò?¸aˆIðMØŸ™×.Ñ.×9Ñ9�ñ ˜3¨)¸5ÔAÐAä�f˜e TÓ*ˆÙÙ˜3¨!´<Ô@Ð@àøô "ò MÜ ¨°dÓ;ÒL¼}’ðMús   ¢ A, Á,BÂBc                 óV   — d| j                   › d| j                  › d| j                  › d�S )NzPtsInfo(pts=z, pts_count=z, entry=ú)r9   r   s    r   r   zPtsInfo.__repr__v   s+   € Ø˜dŸh™h˜Z |°D·N±NÐ3CÀ8ÈDÏJÉJÈ<ÐWXÐYÐYr   N)
r   r   r   r   ÚintÚobjectr   ÚclassmethodrI   r   r   r   r   r8   r8   X   sB   „ Ø-€Iðàðð ðð ó	ð ñó ðó Zr   r8   c                   ó&   — e Zd ZdZdedefd„Zd„ Zy)ÚState©r:   Údeadliner:   rR   c                 ó    — || _         || _        y r   rQ   )r   r:   rR   s      r   r   zState.__init__~   s   € ð ˆŒØ ˆ�r   c                 ó<   — d| j                   › d| j                  › d�S )Nz
State(pts=z, deadline=rK   rQ   r   s    r   r   zState.__repr__ˆ   s   € Ø˜DŸH™H˜: [°·±°¸qÐAÐAr   N)r   r   r   r   rL   Úfloatr   r   r   r   r   rP   rP   {   s&   „ Ø#€Ið!ð ð!ð
 ó!óBr   rP   c                   ó&   — e Zd ZdZdedefd„Zd„ Zy)ÚPossibleGap©rR   ÚupdatesrR   rY   c                 ó    — || _         || _        y r   rX   )r   rR   rY   s      r   r   zPossibleGap.__init__—   s   € ð !ˆŒØˆ�r   c                 óN   — d| j                   › dt        | j                  «      › d�S )NzPossibleGap(deadline=z, update_count=rK   )rR   ÚlenrY   r   s    r   r   zPossibleGap.__repr__    s&   € Ø& t§}¡} o°_ÄSÈÏÉÓEVÐDWÐWXÐYÐYr   N)r   r   r   r   rU   Úlistr   r   r   r   r   rW   rW   ”   s$   „ Ø'€Iðàðð ó	óZr   rW   c                   ó
  — e Zd ZdZe e«        ej                  d¬«      z   edeefde	dej                  de
ded	e	d
efd„Zd„ Zd„ Zd„ Zdefd„Zd„ 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„ Z!d e"fd!„Z#y)#Ú
MessageBox)Ú_logÚmapÚdateÚseqÚnext_deadlineÚpossible_gapsÚgetting_diff_forr   )ÚsecondsNra   rb   rc   rd   re   rf   c                 óÖ   — || _         |t        u ri n|| _        || _        || _        || _        |t        u ri n|| _        |t        u r
t        «       n|| _        	 | j                  d«       y )NzMessageBox initialized)
r`   Ú	_sentinelra   rb   rc   rd   re   Úsetrf   Ú_trace)r   Úlogra   rb   rc   rd   re   rf   s           r   r   zMessageBox.__init__ª   sf   € ð2 ˆŒ	Ø¤	Ñ)‘2¨sˆŒØˆŒ	ØˆŒØ*ˆÔØ#0´IÑ#=™RÀ=ˆÔØ)9¼YÑ)F¤¤ÐL\ˆÔàØ�K‰KÐ0Õ1r   c                 óì   — | j                   j                  t        d| j                  | j                  j                  «       | j                  «        | j                   j                  t        |g|¢­i |¤Ž y )Nz7Current MessageBox state: seq = %r, date = %s, map = %r)r`   rl   ÚLOG_LEVEL_TRACErc   rb   Ú	isoformatra   )r   ÚmsgÚargsÚkwargss       r   rk   zMessageBox._traceÎ   sT   € ð
 	�	‰	�‰”oÐ'`Ø—h‘h §	¡	× 3Ñ 3Ó 5°t·x±xô	Aàˆ�	‰	�‰”o sÐ<¨TÒ<°VÓ<r   c                 ór  ‡— 	 | j                  d||«       t        «       Š| j                  j                  «        |j                  t
        k7  r(t        |j                  ‰¬«      | j                  t        <   |j                  t
        k7  r(t        |j                  ‰¬«      | j                  t        <   | j                  j                  ˆfd„|D «       «       t        j                  j                  |j                  t        j                  j                  ¬«      | _        |j                   | _        t        | _        y)zO
        Create a [`MessageBox`] from a previously known update state.
        z?Loading MessageBox with session_state = %r, channel_states = %rrQ   c              3   ód   •K  — | ]'  }|j                   t        |j                  ‰¬ «      f–— Œ) y­w)rQ   N)r?   rP   r:   )Ú.0ÚsrR   s     €r   ú	<genexpr>z"MessageBox.load.<locals>.<genexpr>ç   s&   øè ø€ ÒdÐPQ˜Ÿ™¤u°·±ÀÔ'JÔKÑdùs   ƒ-0)ÚtzN)rk   r$   ra   Úclearr:   ÚNO_SEQrP   rE   r@   rF   rH   r(   Úfromtimestamprb   r+   r,   rc   rd   )r   Úsession_stateÚchannel_statesrR   s      @r   ÚloadzMessageBox.loadÙ   sÞ   ø€ ð Ø�K‰KÐYÐ[hÐjxÔyä(Ó*ˆà�‰�‰ÔØ×Ñ¤Ò&Ü&+°×0AÑ0AÈHÔ&UˆD�H‰H”]Ñ#Ø×Ñ¤Ò&Ü%*¨}×/@Ñ/@È8Ô%TˆD�H‰H”\Ñ"Ø�‰�‰ÓdÐUcÔdÔdä×%Ñ%×3Ñ3°M×4FÑ4FÌ8×K\ÑK\×K`ÑK`Ð3ÓaˆŒ	Ø ×$Ñ$ˆŒÜ*ˆÕr   c           	      ó²  — t        t        | j                  v r| j                  t           j                  nt        t
        | j                  v r| j                  t
           j                  nt        | j                  | j                  ¬«      | j                  j                  «       D ��ci c]#  \  }}t        |t        «      sŒ||j                  “Œ% c}}fS c c}}w )zb
        Return the current state.

        This should be used for persisting the state.
        )r:   r@   rb   rc   )ÚdictrE   ra   r:   rz   rF   rb   rc   ÚitemsÚ
isinstancerL   )r   ÚidÚstates      r   r|   zMessageBox.session_stateí   sš   € ô Ü/<ÀÇÁÑ/H�—‘œÑ'×+Ò+ÌfÜ.:¸d¿h¹hÑ.F�—‘œÑ&×*Ò*ÌFØ—‘Ø—‘ô	
ð
 ,0¯8©8¯>©>Ó+;×S™i˜b %¼zÈ"ÌcÕ?RˆB�—	‘	‰MÓSðTð 	Tùó
 Ts   Â&CÂ?CÚreturnc                 ó&   — t         | j                  vS )zO
        Return true if the message box is empty and has no state yet.
        )rE   ra   r   s    r   Úis_emptyzMessageBox.is_emptyú   s   € ô  D§H¡HÐ,Ð,r   c                 óð  ‡— t        «       j                  «       Š| j                  r‰S t        «       }| j                  r,t        |gd„ | j                  j                  «       D «       ¢­Ž }nE| j                  | j                  v r-t        || j                  | j                     j                  «      }‰|k\  rÂ| j                  j                  ˆfd„| j                  j                  «       D «       «       | j                  j                  ˆfd„| j                  j                  «       D «       «       	 | j                  d| j                  «       | j                  D ]  }| j                  j                  |d«       Œ  |S )a*  
        Return the next deadline when receiving updates should timeout.

        If a deadline expired, the corresponding entries will be marked as needing to get its difference.
        While there are entries pending of getting their difference, this method returns the current instant.
        c              3   ó4   K  — | ]  }|j                   –— Œ y ­wr   ©rR   )ru   Úgaps     r   rw   z-MessageBox.check_deadlines.<locals>.<genexpr>  s   è ø€ Ò&[¸ s§|¥|Ñ&[ùs   ‚c              3   óH   •K  — | ]  \  }}‰|j                   k\  sŒ|–— Œ y ­wr   rŠ   )ru   r<   r‹   Únows      €r   rw   z-MessageBox.check_deadlines.<locals>.<genexpr>  s$   øè ø€ Ò(s±:°5¸#Ð_bÐfi×frÑfrÓ_r¬Ñ(sùó   ƒ"›"c              3   óH   •K  — | ]  \  }}‰|j                   k\  sŒ|–— Œ y ­wr   rŠ   )ru   r<   r„   r�   s      €r   rw   z-MessageBox.check_deadlines.<locals>.<genexpr>  s$   øè ø€ Ò(m±<°5¸%ÐWZÐ^c×^lÑ^lÓWl¬Ñ(mùrŽ   z&Deadlines met, now getting diff for %rN)r
   r"   rf   r$   re   ÚminÚvaluesrd   ra   rR   rH   r�   rk   Úpop)r   rR   r<   r�   s      @r   Úcheck_deadlineszMessageBox.check_deadlines   s1  ø€ ô Ó ×%Ñ%Ó'ˆà× Ò ØˆJä(Ó*ˆð ×ÒÜ˜8Ð\Ñ&[¸t×?QÑ?Q×?XÑ?XÓ?ZÔ&[Ò\‰HØ×Ñ 4§8¡8Ñ+Ü˜8 T§X¡X¨d×.@Ñ.@Ñ%A×%JÑ%JÓKˆHð
 �(Š?à×!Ñ!×(Ñ(Ó(sÀ×ASÑAS×AYÑAYÓA[Ô(sÔsØ×!Ñ!×(Ñ(Ó(mÀ4Ç8Á8Ç>Á>ÓCSÔ(mÔmàØ—‘ÐDÀd×F[ÑF[Ô\ð ×.Ñ.ò 4�Ø×"Ñ"×&Ñ& u¨dÕ3ð4ð ˆr   c                 óz  — |sy |D ]/  }|| j                   vrt        d«      ‚|| j                   |   _        Œ1 | j                  |v r/t	        | j                   j                  «       d„ ¬«      d   | _        y | j                  | j                   v r/|| j                   | j                     j                  k  r| _        y y y )Nz@Called reset_deadline on an entry for which we do not have statec                 ó    — | d   j                   S )Nr   rŠ   )Úentry_states    r   ú<lambda>z,MessageBox.reset_deadlines.<locals>.<lambda>3  s   € È{Ð[\É~×OfÑOf€ r   ©Úkeyr   )ra   ÚRuntimeErrorrR   rd   r�   r�   )r   ÚentriesrR   r<   s       r   Úreset_deadlineszMessageBox.reset_deadlines)  s±   € ÙØØò 	0ˆEØ˜DŸH™HÑ$Ü"Ð#eÓfÐfØ'/ˆD�H‰H�U‰OÕ$ð	0ð
 ×Ñ Ñ(ä!$ T§X¡X§^¡^Ó%5Ñ;fÔ!gÐhiÑ!jˆDÕØ×Ñ 4§8¡8Ñ+°¸4¿8¹8ÀD×DVÑDVÑ;W×;`Ñ;`Ò0`ð "'ˆDÕð 1aÐ+r   c                 ól   — | j                  |ht        «       j                  «       |xs t        z   «       y r   )rœ   r
   r"   r#   )r   r?   Útimeouts      r   Úreset_channel_deadlinez!MessageBox.reset_channel_deadline;  s,   € Ø×Ñ˜j˜\Ô+;Ó+=×+BÑ+BÓ+DÈÒHeÔSeÑ+fÕgr   c                 óú  — 	 | j                  d|«       t        «       }|j                  t        k7  s|s)t	        |j                  |¬«      | j
                  t        <   n | j
                  j                  t        d «       |j                  t        k7  s|s)t	        |j                  |¬«      | j
                  t        <   n | j
                  j                  t        d «       |j                  | _
        |j                  | _        y )NzSetting state %srQ   )rk   r$   r:   rz   rP   ra   rE   r’   r@   rF   rb   rc   )r   r„   ÚresetrR   s       r   Ú	set_statezMessageBox.set_stateB  s¦   € ØØ�K‰KÐ*¨EÔ2ä(Ó*ˆà�9‰9œÒ¡eÜ&+°·	±	ÀHÔ&MˆD�H‰H”]Ò#à�H‰H�L‰Lœ¨Ô-ð �9‰9œÒ¡eÜ%*¨u¯y©yÀ8Ô%LˆD�H‰H”\Ò"à�H‰H�L‰Lœ tÔ,à—J‘JˆŒ	Ø—9‘9ˆ�r   c                 óŽ   — 	 | j                  d||«       || j                  vr#t        |t        «       ¬«      | j                  |<   y y )Nz&Trying to set channel state for %r: %rrQ   )rk   ra   rP   r$   )r   rƒ   r:   s      r   Útry_set_channel_statez MessageBox.try_set_channel_state_  s?   € ØØ�K‰KÐ@À"ÀcÔJà�T—X‘XÑÜ  SÔ3HÓ3JÔKˆD�H‰H�RŠLð r   c                 ó  — || j                   vr.|| j                  v rt        d«      ‚	 | j                  d||«       y 	 | j                  d||«       | j                  j                  |«       | j                  j                  |d «       y )Nz@Should not have a possible_gap for an entry not in the state mapzFShould get difference for %r because %s but cannot due to missing hashz+Marking %r as needing difference because %s)ra   re   rš   rk   rf   Úaddr’   )r   r<   Úreasons      r   Útry_begin_get_diffzMessageBox.try_begin_get_diffj  s   € Ø˜Ÿ™Ñ à˜×*Ñ*Ñ*Ü"Ð#eÓfÐfàØ—‘ÐdÐfkÐmsÔtØàØ�K‰KÐEÀuÈfÔUØ×Ñ×!Ñ! %Ô(Ø×Ñ×Ñ˜u dÕ+r   c                 óÌ   — 	 | j                   j                  |«       | j	                  |ht        «       «       || j                  vsJ d«       ‚y # t        $ r t        d«      ‚w xY w)Nz>Called end_get_diff on an entry which was not getting diff forz2gaps shouldn't be created while getting difference)rf   ÚremoveÚKeyErrorrš   rœ   r$   re   )r   r<   s     r   Úend_get_diffzMessageBox.end_get_diff|  sm   € ð	aØ×!Ñ!×(Ñ(¨Ô/ð 	×Ñ˜e˜WÔ&;Ó&=Ô>Ø˜D×.Ñ.Ñ.ÐdÐ0dÓdÑ.øô	 ò 	aÜÐ_Ó`Ð`ð	aús   ‚A ÁA#c           
      óö  ‡ ‡— t        |dd«      }|}g }t        |dd «      }t        |dd «      }t        |dd «      }t        |dd «      xs g }	t        |dd «      xs g }
	 ‰ j                  d|||r|j                  «       nd |«       |€‰ j                  t        d	«       t
        ‚|€t        }|€|}t        |d
d «      xs) t        |t        j                  «      r|j                  n|g}|D ]	  }||_        Œ |t        k7  rV‰ j                  dz   |kD  r	 ‰ j                  d«       |	|
fS ‰ j                  dz   |k  r‰ j                  t        d«       t
        ‚d„ }t        «       Š|j                  t        d ˆˆ fd„t!        ||¬«      D «       «      «       ‰ j#                  ‰t%        «       «       ‰ j&                  �r]	 ‰ j                  dt)        ‰ j&                  «      «       t+        ‰ j&                  j-                  «       «      D ]Ñ  }‰ j&                  |   j.                  j1                  |¬«       t3        t)        ‰ j&                  |   j.                  «      «      D ]x  }‰ j&                  |   j.                  j5                  d«      }‰ j7                  |d ¬«      }|sŒA|j9                  |«       	 ‰ j                  dt:        j=                  |«      |«       Œz ŒÓ ‰ j&                  j?                  «       D ��ci c]  \  }}|j.                  sŒ||“Œ c}}‰ _        |j                  d„ |D «       «       |rB‰ j&                  s6	 ‰ j                  d«       |tA        «       k7  r|‰ _!        |t        k7  r|‰ _        |	|
fS c c}}w )NÚ_self_outgoingFrb   rc   Ú	seq_startÚusersÚchatsz?Processing updates with seq = %r, seq_start = %r, date = %s: %szreceived updatesTooLongrY   r   z9Skipping updates as they should have already been handledzdetected gapc                 óf   — t         j                  | «      }|r|j                  |j                  z
  S dS )Nr   )r8   rI   r:   r;   )rH   r:   s     r   Ú
_sort_gapsz.MessageBox.process_updates.<locals>._sort_gapsÊ  s,   € Ü×%Ñ% fÓ-ˆCÙ.1�3—7‘7˜SŸ]™]Ñ*Ð8°qÐ8r   c              3   óD   •K  — | ]  }‰j                  |‰¬ «      –— Œ y­w)©rœ   N)Úapply_pts_info)ru   Úurœ   r   s     €€r   rw   z-MessageBox.process_updates.<locals>.<genexpr>Ð  s+   øè ø€ ò $6ð
 ð	 ×Ñ °?Ð×Cñ$6ùs   ƒ r˜   z#Trying to re-apply %r possible gapsr   rµ   zResolved gap with %r: %sc              3   ó:   K  — | ]  }|j                   rŒ|–— Œ y ­wr   )r®   )ru   r·   s     r   rw   z-MessageBox.process_updates.<locals>.<genexpr>ï  s   è ø€ ÒE °A×4DÓ4Dœ1ÑEùs   ‚”z(Updating seq as all updates were applied)"rA   rk   ro   r¨   rE   r/   rz   r‚   ÚtlÚUpdateShortrH   r®   rc   rj   ÚextendÚfilterÚsortedrœ   r$   re   r\   r]   ÚkeysrY   ÚsortÚranger’   r¶   Úappendr8   rI   r�   r-   rb   )r   rY   Úchat_hashesÚresultÚself_outgoingÚreal_resultrb   rc   r¯   r°   r±   r·   r³   r™   r   rH   r<   r‹   rœ   s   `                 @r   Úprocess_updateszMessageBox.process_updates•  sO  ù€ ô   Ð)9¸5ÓAˆØˆØˆä�w ¨Ó-ˆÜ�g˜u dÓ+ˆÜ˜G [°$Ó7ˆ	Ü˜ ¨$Ó/Ò5°2ˆÜ˜ ¨$Ó/Ò5°2ˆàØ�K‰KÐYØ˜Y¹D¨¯©Ô(8ÀdÈGôUð ˆ<à×#Ñ#¤MÐ3LÔMÜˆNØˆ;ÜˆCØÐØˆIô ˜' 9¨dÓ3Ò{Ì*ÐU\Ô^`×^lÑ^lÔJm¸¿ºÐszÐ7{ˆàò 	-ˆAØ,ˆAÕð	-ð
 œÒØ�x‰x˜!‰|˜iÒ'àØ—K‘KÐ [Ô\Ø˜u�~Ð%Ø—‘˜A‘ 	Ò)à×'Ñ'¬°~ÔFÜ�ò	9ô ›%ˆà�‰”f˜Tô $6ô
 ˜G¨Ô4ô$6ó 7ô 	8ð 	×Ñ˜_Ô.CÓ.EÔFà×ÓØØ—‘ÐAÄ3Àt×GYÑGYÓCZÔ[ô ˜D×.Ñ.×3Ñ3Ó5Ó6ò i�Ø×"Ñ" 3Ñ'×/Ñ/×4Ñ4¸Ð4ÔDäœs 4×#5Ñ#5°cÑ#:×#BÑ#BÓCÓDò 	i�AØ!×/Ñ/°Ñ4×<Ñ<×@Ñ@ÀÓC�Fð "×0Ñ0°ÈÐ0ÓN�FÚØŸ™ fÔ-Ø$Ø ŸK™KÐ(BÄG×DWÑDWÐX^ÓD_ÐagÕhñ	iðið @D×?QÑ?Q×?WÑ?WÓ?Y×!i±°¸Ð]`×]hÓ]h %¨¡*Ó!iˆDÔà×ÑÑE fÔEÔEá˜$×,Ò,ð Ø—‘ÐFÔGØ”u“wŠØ �”	Ø”fŠ}Ø�”à�uˆ~Ðùó "js   Ë2M5ÌM5c                óø  — t        |t        j                  «      r| j                  |j                  d«       y t
        j                  |«      }|s	 | j                  d|«       |S |r|j                  |j                  «       |j                  | j                  v r	 | j                  d|«       y |j                  | j                  v �r'| j                  |j                     j                  }||j                  z   |j                  kD  r	 | j                  d|||«       y ||j                  z   |j                  k  r¡	 | j                  d|||«       |j                  | j                  vrAt        t!        «       j#                  «       t$        z   g ¬«      | j                  |j                  <   | j                  |j                     j&                  j)                  |«       y 	 | j                  d|||«       |j                  | j                  v r*|j                  | j                  |j                     _        |S t+        |j                  |j                  rdnd	z
  xs d	t-        «       ¬
«      | j                  |j                  <   |S )Nzreceived updateChannelTooLongz7No pts in update, so it can be applied in any order: %sz:Skipping update with %r as its difference is being fetchedz+Skipping update since local pts %r > %r: %sz(Possible gap since local pts %r < %r: %srX   z/Applying update pts since local pts %r = %r: %sr   r   rQ   )r‚   r¹   ÚUpdateChannelTooLongr¨   r?   r8   rI   rk   r¦   r<   rf   ra   r:   r;   re   rW   r
   r"   ÚPOSSIBLE_GAP_TIMEOUTrY   rÁ   rP   r$   )r   rH   rœ   r:   Ú	local_ptss        r   r¶   zMessageBox.apply_pts_info  s  € ô �fœb×5Ñ5Ô6Ø×#Ñ# F×$5Ñ$5Ð7VÔWØä×!Ñ! &Ó)ˆÙàØ—‘ÐUÐW]Ô^ØˆMñ Ø×Ñ §	¡	Ô*à�9‰9˜×-Ñ-Ñ-ð Ø—‘ÐXÐZ]Ô^Øà�9‰9˜Ÿ™Ò ØŸ™ §¡Ñ+×/Ñ/ˆIØ˜3Ÿ=™=Ñ(¨3¯7©7Ò2àØ—K‘KÐ MÈyÐZ]Ð_eÔfØØ˜SŸ]™]Ñ*¨S¯W©WÒ4ð Ø—K‘KÐ JÈIÐWZÐ\bÔcØ—9‘9 D×$6Ñ$6Ñ6Ü4?Ü!1Ó!3×!8Ñ!8Ó!:Ô=QÑ!QØ "ô5�D×&Ñ& s§y¡yÑ1ð
 ×"Ñ" 3§9¡9Ñ-×5Ñ5×<Ñ<¸VÔDØð Ø—K‘KÐ QÐS\Ð^aÐciÔjð  �9‰9˜Ÿ™Ñ Ø&)§g¡gˆD�H‰H�S—Y‘YÑÔ#ð ˆô #(Ø—W‘W S§]¢]¡¸Ñ:Ò@¸qÜ.Ó0ô#ˆD�H‰H�S—Y‘YÑð
 ˆr   c                 ó˜  — t         t        fD ]»  }|| j                  v sŒ|| j                  vrt	        d«      ‚t
        j                  j                  | j                  t            j                  d | j                  t        | j                  v r| j                  t           j                  nt        ¬«      }	 | j                  d|«       |c S  y )NúAShould not try to get difference for an entry without known state)r:   Úpts_total_limitrb   r@   z Requesting account difference %s)rE   rF   rf   ra   rš   ÚfnrY   ÚGetDifferenceRequestr:   rb   rz   rk   )r   r<   Úgds      r   Úget_differencezMessageBox.get_difference`  s¯   € Ü#¤\Ð2ò 	ˆEØ˜×-Ñ-Ò-Ø §¡Ñ(Ü&Ð'jÓkÐkä—Z‘Z×4Ñ4ØŸ™¤Ñ/×3Ñ3Ø$(ØŸ™Ü6BÀdÇhÁhÑ6N˜Ÿ™¤Ñ.×2Ò2ÔTZð	 5ó �ð Ø—K‘KÐ BÀBÔGØ’	ð	ð r   c                 ó®  — 	 | j                  d|«       d }d }t        |t        j                  j                  «      r+d}|j
                  | _        |j                  | _        g g g f}�nt        |t        j                  j                  «      r;d}|j                  |j                  |j                  «       | j                  ||«      }n¬t        |t        j                  j                  «      r;d}|j                  |j                  |j                  «       | j                  ||«      }nMt        |t        j                  j                  «      r)d}|j                  | j                  t            _        g g g f}|rat         | j"                  v }t$        | j"                  v }|s|st'        d«      ‚|r| j)                  t         «       |r| j)                  t$        «       |S )NTzApplying account difference %sFzXShould not be applying the difference when neither account or secret was diff was active)rk   r‚   r¹   rY   ÚDifferenceEmptyrb   rc   Ú
Differencer»   r°   r±   Úapply_difference_typeÚDifferenceSliceÚDifferenceTooLongr:   ra   rE   rf   rF   rš   r¬   )r   ÚdiffrÂ   ÚfinishrÃ   ÚaccountÚsecrets          r   Úapply_differencezMessageBox.apply_differences  sv  € ð
 Ø�K‰KÐ8¸$Ô?àˆØˆä�dœBŸJ™J×6Ñ6Ô7ØˆFØŸ	™	ˆDŒIØ—x‘xˆDŒHØ˜˜R�ZŠFÜ˜œbŸj™j×3Ñ3Ô4ØˆFØ×Ñ˜tŸz™z¨4¯:©:Ô6Ø×/Ñ/°°kÓB‰FÜ˜œbŸj™j×8Ñ8Ô9ØˆFØ×Ñ˜tŸz™z¨4¯:©:Ô6Ø×/Ñ/°°kÓB‰FÜ˜œbŸj™j×:Ñ:Ô;ØˆFØ*.¯(©(ˆD�H‰H”]Ñ#Ô'Ø˜˜R�ZˆFáÜ# t×'<Ñ'<Ð<ˆGÜ! T×%:Ñ%:Ð:ˆFá¡6Ü"Ð#}Ó~Ð~ñ Ø×!Ñ!¤-Ô0ÙØ×!Ñ!¤,Ô/àˆr   c           	      óÆ  — t        |dd «      xs |j                  }| j                  |d¬«       g }| j                  t	        j
                  |j                  |j                  |j                  t        «       t        ¬«      ||«       |j                  d„ |j                  D «       «       |j                  d„ |j                  D «       «       ||j                  |j                  fS )NÚintermediate_stateF)r¡   ©rY   r°   r±   rb   rc   c              3   ó\   K  — | ]$  }t        j                  |t        t        ¬ «      –— Œ& y­w©)rB   r:   r;   N)r¹   ÚUpdateNewMessagerz   ©ru   Úms     r   rw   z3MessageBox.apply_difference_type.<locals>.<genexpr>²  s3   è ø€ ò &ð ô	 ×*Ñ*ØÜÜ÷
ð 
ñ &ùó   ‚*,c              3   óR   K  — | ]  }t        j                  |t        ¬ «      –— Œ! y­w))rB   r@   N)r¹   ÚUpdateNewEncryptedMessagerz   rã   s     r   rw   z3MessageBox.apply_difference_type.<locals>.<genexpr>·  s0   è ø€ ò 0ð ô ×3Ñ3ØÜ÷
ð 
ñ 0ùs   ‚%')rA   r„   r¢   rÆ   r¹   ÚUpdatesÚother_updatesr°   r±   r-   rz   r»   Únew_messagesÚnew_encrypted_messages)r   rØ   rÂ   r„   rY   s        r   rÕ   z MessageBox.apply_difference_typeŸ  sÏ   € ô
 ˜Ð2°DÓ9ÒG¸T¿Z¹ZˆØ�‰�u EˆÔ*ð ˆØ×ÑœRŸZ™ZØ×&Ñ&Ø—*‘*Ø—*‘*Ü“Üô
ð ˜ô	!ð 	�‰ñ &ð ×$Ñ$ô	&ô 	&ð
 	�‰ñ 0ð ×.Ñ.ô0ô 	0ð
 ˜Ÿ
™
 D§J¡JÐ.Ð.r   c                 óì   — 	 | j                  d«       t        | j                  v }t        | j                  v }|s|st	        d«      ‚|r| j                  t        «       |r| j                  t        «       y y )NzEnding account differencezVShould not be ending get difference when neither account or secret was diff was active)rk   rE   rf   rF   rš   r¬   )r   rÚ   rÛ   s      r   Úend_differencezMessageBox.end_difference¾  sl   € ØØ�K‰KÐ3Ô4ä 4×#8Ñ#8Ð8ˆÜ ×!6Ñ!6Ð6ˆá™vÜÐwÓxÐxñ Ø×ÑœmÔ,ÙØ×ÑœlÕ+ð r   c                 ó:  — t        d„ | j                  D «       d «      }|sy |j                  |«      }|s.| j                  |«       | j                  j                  |d «       y | j                  j                  |«      }|st        d«      ‚t        j                  j                  dt        j                  |j                  |j                  «      t        j                  «       |j                  |j                   rt"        nt$        ¬«      }	 | j'                  d|«       |S )Nc              3   óB   K  — | ]  }t        |t        «      sŒ|–— Œ y ­wr   )r‚   rL   )ru   rƒ   s     r   rw   z4MessageBox.get_channel_difference.<locals>.<genexpr>×  s   è ø€ ÒP˜R¼JÀrÌ3Õ<O”bÑPùs   ‚˜rÌ   F)ÚforceÚchannelr¼   r:   Úlimitz Requesting channel difference %s)Únextrf   Úgetr¬   ra   r’   rš   rÎ   rY   ÚGetChannelDifferenceRequestr¹   ÚInputChannelrƒ   ÚhashÚChannelMessagesFilterEmptyr:   Úself_botÚBOT_CHANNEL_DIFF_LIMITÚUSER_CHANNEL_DIFF_LIMITrk   )r   rÂ   r<   Úpackedr„   rÐ   s         r   Úget_channel_differencez!MessageBox.get_channel_differenceÓ  sé   € ô ÑP 4×#8Ñ#8ÔPÐRVÓWˆÙØà—‘ Ó'ˆÙð ×Ñ˜eÔ$ð �H‰H�L‰L˜ Ô%Øà—‘—‘˜UÓ#ˆÙÜÐbÓcÐcä�Z‰Z×3Ñ3ØÜ—O‘O F§I¡I¨v¯{©{Ó;Ü×0Ñ0Ó2Ø—	‘	Ø,7×,@Ò,@Õ(ÔF]ð 4ó 
ˆð Ø�K‰KÐ:¸BÔ?Øˆ	r   c           	      óò  — |j                   j                  }	 | j                  d||«       | j                  j	                  |d «       t        |t        j                  j                  «      rB|j                  sJ ‚| j                  |«       |j                  | j                  |   _        g g g fS t        |t        j                  j                  «      r}|j                  sJ ‚|j                  j                  | j                  |   _        |j                  |j                   |j"                  «       | j%                  ||j&                  «       g g g fS t        |t        j                  j(                  «      �r|j                  r| j                  |«       |j                  | j                  |   _        |j                  |j                   |j"                  «       g }| j+                  t        j,                  |j.                  |j                   |j"                  t1        «       t2        ¬«      ||«       |j                  d„ |j4                  D «       «       | j%                  |d «       ||j                   |j"                  fS y )Nz&Applying channel difference for %r: %srß   c              3   ó\   K  — | ]$  }t        j                  |t        t        ¬ «      –— Œ& y­wrá   )r¹   ÚUpdateNewChannelMessagerz   rã   s     r   rw   z6MessageBox.apply_channel_difference.<locals>.<genexpr>  s3   è ø€ ò *ð ô	 ×5Ñ5ØÜÜ ÷ð ñ *ùrå   )rñ   r?   rk   re   r’   r‚   r¹   rY   ÚChannelDifferenceEmptyÚfinalr¬   r:   ra   ÚChannelDifferenceTooLongÚdialogr»   r°   r±   rŸ   rž   ÚChannelDifferencerÆ   rè   ré   r-   rz   rê   )r   ÚrequestrØ   rÂ   r<   rY   s         r   Úapply_channel_differencez#MessageBox.apply_channel_differenceõ  så  € ð —‘×*Ñ*ˆØØ�K‰KÐ@À%ÈÔNà×Ñ×Ñ˜u dÔ+ä�dœBŸJ™J×=Ñ=Ô>Ø—:’:Ð�:Ø×Ñ˜eÔ$Ø"&§(¡(ˆD�H‰H�U‰OÔØ�r˜2�:ÐÜ˜œbŸj™j×AÑAÔBØ—:’:Ð�:Ø"&§+¡+§/¡/ˆD�H‰H�U‰OÔØ×Ñ˜tŸz™z¨4¯:©:Ô6Ø×'Ñ'¨¨t¯|©|Ô<ð �r˜2�:ÐÜ˜œbŸj™j×:Ñ:Õ;Ø�zŠzØ×!Ñ! %Ô(à"&§(¡(ˆD�H‰H�U‰OÔØ×Ñ˜tŸz™z¨4¯:©:Ô6àˆGØ× Ñ ¤§¡Ø×*Ñ*Ø—j‘jØ—j‘jÜ“WÜô"ð ˜Gô%ð �N‰Nñ *ð ×(Ñ(ô	*ô *ð
 ×'Ñ'¨¨tÔ4à˜DŸJ™J¨¯
©
Ð2Ð2ð/ <r   r§   c                 óŠ  — |j                   j                  }	 | j                  d||«       |t        j                  k(  r.| j
                  j                  |d «       | j                  |«       y |t        j                  k(  r;| j
                  j                  |d «       | j                  |«       | j                  |= y t        d«      ‚)Nz+Ending channel difference for %r because %sz(Unknown reason to end channel difference)rñ   r?   rk   r2   r5   re   r’   r¬   r6   ra   rš   )r   r  r§   rÂ   r<   s        r   Úend_channel_differencez!MessageBox.end_channel_difference(  s¢   € Ø—‘×*Ñ*ˆØØ�K‰KÐEÀuÈfÔUàÔ'×?Ñ?Ò?à×Ñ×"Ñ" 5¨$Ô/Ø×Ñ˜eÕ$ØÔ)×0Ñ0Ò0à×Ñ×"Ñ" 5¨$Ô/Ø×Ñ˜eÔ$Ø—‘˜‘äÐIÓJÐJr   )T)$r   r   r   r   ri   r-   r(   Ú	timedeltarz   r€   rL   rM   rj   r   rk   r~   r|   Úboolr‡   r“   rœ   rŸ   r¢   r¤   r¨   r¬   rÆ   r¶   rÑ   rÜ   rÕ   rí   rý   r  r2   r	  r   r   r   r_   r_   §   s  „ Ød€Ið ñ #(£'Ð,>¨H×,>Ñ,>ÀqÔ,IÑ"IØð !%ð (ð !*ñ/"2ð ð	"2ð ×Ñð"2ð ð"2ð ð"2ð( ð)"2ð. ó/"2òH=ò+ò(Tð-˜$ó -ò$òR'ò$hóò:Lò,ò$eò2fòZWò|ò&*òX/ò>,ò*òD13ðfKÐ6Hô Kr   r_   )%Ú__doc__Úasyncior(   r"   ÚloggingÚenumr   Úsessionr   r   r¹   r   r	   rÎ   Úhelpersr
   rz   rú   rû   rÉ   r#   r   rE   rF   ÚDEBUGÚNOTSETrn   ri   r$   r-   Ú
ValueErrorr/   r2   r8   rP   rW   r_   r   r   r   ú<module>r     sß   ðñó$ Û Û Û Ý ß /ß -Ý &ð 
€ð  Ð ØÐ ð Ð ð Ð ÷ñ ñ ˜Ó#€á˜Ó!€ð
 —=‘= 7§>¡>Ñ1°aÑ7€á‹J€	ò:òXôˆzô ô
˜ô ÷Zñ Z÷FBñ B÷2Zñ Z÷&P
Kò P
Kr   