§
    Ètºf’/  ã                   óv  — d Z ddlZddlZddlmZ ddlmZ ddlmZ ddl	m
Z
 ddlmZ ddlmZ  G d	„ d
e¦  «        Z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a ed¦  «         dZ G d„ dej        ej         ¦  «        Z! e!¦   «         Z"e" #                    ¦   «          e" $                    d¦  «         d„ Z%d„ Z&dS )zé
Banana -- s-exp based protocol.

Future Plans: This module is almost entirely stable.  The same caveat applies
to it as applies to L{twisted.spread.jelly}, however.  Read its future plans
for more details.

@author: Glyph Lefkowitz
é    N)ÚBytesIO)Úprotocol)Ústyles)Úlog)Ú	iterbytes)ÚfullyQualifiedNamec                   ó   — e Zd ZdS )ÚBananaErrorN)Ú__name__Ú
__module__Ú__qualname__© ó    úT/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/twisted/spread/banana.pyr
   r
      s   € € € € € Ø€Dr   r
   c                 óš   — | dk    r |d¦  «         d S | dk    s
J d¦   «         ‚| r% |t          | dz  f¦  «        ¦  «         | dz	  } | °#d S d S )Nr   ó    z!can only encode positive integersé   é   )Úbytes)ÚintegerÚstreams     r   Úint2b128r      s   € Ø�!‚|€|Øˆˆu‰ŒˆØˆØ�QŠ;ˆ;ˆ;Ð;‰;Œ;ˆ;Ø
ð Øˆ�u�g ‘nÐ&Ñ'Ô'Ñ(Ô(Ð(Ø˜Q‘,ˆð ð ð ð ð ð r   c                 ój   — d}d}t          | ¦  «        D ]}t          |¦  «        }|||z  z  }|dz  }Œ|S )zí
    Convert an integer represented as a base 128 string into an L{int}.

    @param st: The integer encoded in a byte string.
    @type st: L{bytes}

    @return: The integer value extracted from the byte string.
    @rtype: L{int}
    é   r   r   )r   Úord)ÚstÚeÚiÚcharÚns        r   Úb1282intr!   )   sK   € ð 	
€AØ	€AÝ˜"‘”ð ð ˆÝ�‰IŒIˆØ	ˆQ�‰U‰
ˆØ	ˆa‰ˆˆØ€Hr   ó   €ó   �ó   ‚ó   ƒó   „ó   …ó   †ó   ‡c                 ó
   — | a dS )ak  
    Set the limit on the prefix length for all Banana connections
    established after this call.

    The prefix length limit determines how many bytes of prefix a banana
    decoder will allow before rejecting a potential object as too large.

    @type limit: L{int}
    @param limit: The number of bytes of prefix for banana to allow when
    decoding.
    N)Ú_PREFIX_LIMIT)Úlimits    r   ÚsetPrefixLimitr-   K   s   € ð €M€M€Mr   é@   i  
 c                   ó8  — e Zd ZdZddgZdZeZd„ Zd„ Z	d„ Z
d„ Zd	„ Zd
„ ZdZd„ Zd„ Zi dd“dd“dd“dd“dd“dd“dd“dd“dd“d d!“d"d#“d$d%“d&d'“d(d)“d*d+“d,d-“d.d/“d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>œ¥Zi Ze                     ¦   «         D ]
\  ZZeee<   ŒdBd?„Zd@„ ZdA„ ZdS )CÚBananazé
    L{Banana} implements the I{Banana} s-expression protocol, client and
    server.

    @ivar knownDialects: These are the profiles supported by this Banana
        implementation.
    @type knownDialects: L{list} of L{bytes}
    ó   pbó   noneNc                 ór   — || _         d|dz  z   dz   | _        d| _        d| _        d|dz  z  dz
  | _        dS )zt
        Set the prefix limit for decoding done by this protocol instance.

        @see: L{setPrefixLimit}
        é   r   r   i   €iÿÿÿN)ÚprefixLimitÚ_smallestLongIntÚ_smallestIntÚ_largestIntÚ_largestLongInt)Úselfr,   s     r   r-   zBanana.setPrefixLimitr   sQ   € ð !ˆÔØ"#¨°©	Ñ"2Ð 3°aÑ 7ˆÔØ$ˆÔØ$ˆÔØ  U¨Q¡YÑ/°!Ñ3ˆÔÐÐr   c                 ó   — dS )zPSurrogate for connectionMade
        Called after protocol negotiation.
        Nr   ©r:   s    r   ÚconnectionReadyzBanana.connectionReady~   s   € € € r   c                 ó<   — || _         |                      ¦   «          d S ©N)ÚcurrentDialectr=   )r:   Údialects     r   Ú_selectDialectzBanana._selectDialectƒ   s"   € Ø%ˆÔØ×ÒÑÔÐÐÐr   c                 ó¾  — | j         r|                      |¦  «         d S | j        rj|D ]8}|| j        v r-|                      |¦  «         |                      |¦  «          d S Œ9t          j        d¦  «         | j         	                    ¦   «          d S || j        v r|                      |¦  «         d S t          j        d¦  «         | j         	                    ¦   «          d S )NzSThe client doesn't speak any of the protocols offered by the server: disconnecting.zYThe client selected a protocol the server didn't suggest and doesn't know: disconnecting.)
r@   ÚexpressionReceivedÚisClientÚknownDialectsÚsendEncodedrB   r   ÚmsgÚ	transportÚloseConnection)r:   ÚobjÚ	serverVers      r   ÚcallExpressionReceivedzBanana.callExpressionReceived‡   s  € ØÔð 	4Ø×#Ò# CÑ(Ô(Ð(Ð(Ð(ð Œ}ð 4à!$ð 4ð 4�IØ  DÔ$6Ð6Ð6Ø×(Ò(¨Ñ3Ô3Ð3Ø×+Ò+¨IÑ6Ô6Ð6Ø˜˜ð 7õ ”Gð@ñô ð ð ”N×1Ò1Ñ3Ô3Ð3Ð3Ð3à˜$Ô,Ð,Ð,Ø×'Ò'¨Ñ,Ô,Ð,Ð,Ð,õ ”GðCñô ð ð ”N×1Ò1Ñ3Ô3Ð3Ð3Ð3r   c                 óŽ   — |                       t          ¦  «         d | _        | j        s|                      | j        ¦  «         d S d S r?   )r-   r+   r@   rE   rG   rF   r<   s    r   ÚconnectionMadezBanana.connectionMade¥   sO   € Ø×Ò�MÑ*Ô*Ð*Ø"ˆÔØŒ}ð 	1Ø×Ò˜TÔ/Ñ0Ô0Ð0Ð0Ð0ð	1ð 	1r   c                 óˆ   — | j         }|r#|d         d                              |¦  «         d S |                      |¦  «         d S )Néÿÿÿÿr   )Ú	listStackÚappendrM   )r:   ÚitemÚls      r   ÚgotItemzBanana.gotItem«   sK   € ØŒNˆØð 	.ØˆbŒE�!ŒH�OŠO˜DÑ!Ô!Ð!Ð!Ð!à×'Ò'¨Ñ-Ô-Ð-Ð-Ð-r   r   c                 óV  — | j         |z   }| j        }| j        }|�r†| j         |k    s=J d                     t	          | j         ¦  «        t	          |¦  «        ¦  «        ¦   «         ‚|| _         d}t          |¦  «        D ]}|t          k    r n+|dz   }Œ|| j        k    rt          d| j        fz  ¦  «        ‚d S |d |…         }|||dz   …         }||dz   d …         }	t          |¦  «        | j        k    rt          d| j        fz  ¦  «        ‚|t          k    rDt          |¦  «        }|t          k    rt          d¦  «        ‚|                     |g f¦  «         |	}�nÇ|t          k    r]t          |¦  «        }|t          k    rt          d¦  «        ‚t          |	¦  «        |k    r|	|d …         } ||	d |…         ¦  «         �nad S |t          k    r|	}t          |¦  «        } ||¦  «         �n6|t           k    r|	}t          |¦  «        } ||¦  «         �n|t"          k    r|	}t          |¦  «        } || ¦  «         nä|t$          k    r|	}t          |¦  «         } ||¦  «         n»|t&          k    rG|	}t          |¦  «        }| j        |         }
| j        dk    r ||
¦  «         n{t-          d	|
›�¦  «        ‚|t.          k    rLt          |	¦  «        d
k    r7|	d
d …         } |t1          j        d|	d d
…         ¦  «        d         ¦  «         nd S t-          d|›�¦  «        ‚|r}t          |d         d         ¦  «        |d         d         k    rR|                     ¦   «         d         }
 ||
¦  «         |r+t          |d         d         ¦  «        |d         d         k    °R|�°†d| _         d S )NzThis ain't right: {} {}r   r   z1Security precaution: more than %d bytes of prefixz9Security precaution: longer than %d bytes worth of prefixz#Security precaution: List too long.z%Security precaution: String too long.r1   zInvalid item for pb protocol é   ú!dzInvalid Type Byte rQ   r   )ÚbufferrR   rV   ÚformatÚreprr   ÚHIGH_BIT_SETr5   r
   ÚlenÚLISTr!   Ú
SIZE_LIMITrS   ÚSTRINGÚINTÚLONGINTÚLONGNEGÚNEGÚVOCABÚincomingVocabularyr@   ÚNotImplementedErrorÚFLOATÚstructÚunpackÚpop)r:   ÚchunkrZ   rR   rV   ÚposÚchÚnumÚtypebyteÚrestrT   s              r   ÚdataReceivedzBanana.dataReceived´   s  € Ø”˜uÑ$ˆØ”Nˆ	Ø”,ˆØñ L	Ø”; &Ò(Ð(Ð(Ð*C×*JÒ*JÝ�T”[Ñ!Ô!Ý�V‘”ñ+ô +Ñ(Ô(Ð(ð !ˆDŒKØˆCÝ Ñ'Ô'ð 
ð 
�Ø�Ò%Ð%Ø�EØ˜A‘g��à˜Ô)Ò)Ð)Ý%ØKØÔ+Ð-ñ.ñô ð ð �Ø˜˜#˜”,ˆCØ˜c C¨!¡G˜mÔ,ˆHØ˜# ™'˜)˜)Ô$ˆDÝ�3‰xŒx˜$Ô*Ò*Ð*Ý!ØOØÔ'Ð)ñ*ñô ð ð �4ÒÐÝ˜s‘m”m�Ø�Ò#Ð#Ý%Ð&KÑLÔLÐLØ× Ò  # r Ñ+Ô+Ð+Ø�‘Ø�VÒ#Ð#Ý˜s‘m”m�Ø�Ò#Ð#Ý%Ð&MÑNÔNÐNÝ�t‘9”9 Ò#Ð#Ø! # $ $œZ�FØ�G˜D  # œJÑ'Ô'Ð'Ñ'à�FØ�S’�Ø�Ý˜s‘m”m�Ø�˜‘”�‘Ø�WÒ$Ð$Ø�Ý˜s‘m”m�Ø�˜‘”�‘Ø�WÒ$Ð$Ø�Ý˜s‘m”m�Ø�˜˜‘”��Ø�S’�Ø�Ý ‘}”}�n�Ø�˜‘”��Ø�UÒ"Ð"Ø�Ý˜s‘m”m�ØÔ.¨sÔ3�ØÔ&¨%Ò/Ð/à�G˜D‘M”M�M�Må-Ð.VÈdÐ.VÐ.VÑWÔWÐWØ�UÒ"Ð"Ý�t‘9”9 ’>�>Ø! ! " "œX�FØ�G�FœM¨$°°R°a°R´Ñ9Ô9¸!Ô<Ñ=Ô=Ð=Ð=à�Få)Ð*K¸xÐ*KÐ*KÑLÔLÐLØð ¥ Y¨r¤]°1Ô%5Ñ!6Ô!6¸)ÀB¼-ÈÔ:JÒ!JÐ!JØ —}’}‘” qÔ)�Ø�˜‘”�ð ð ¥ Y¨r¤]°1Ô%5Ñ!6Ô!6¸)ÀB¼-ÈÔ:JÒ!JÐ!JðU ñ L	ðZ ˆŒˆˆr   c                 ó   — t          ¦   «         ‚)z=Called when an expression (list, string, or int) is received.)rh   )r:   Úlsts     r   rD   zBanana.expressionReceived  s   € å!Ñ#Ô#Ð#r   s   Noner   s   classr4   s   dereferenceé   s	   referenceé   s
   dictionaryé   s   functioné   s   instancer   s   listrX   s   moduleé	   s
   persistenté
   s   tupleé   s   unpersistableé   s   copyé   s   cacheé   s   cachedé   s   remoteé   s   localé   é   é   é   é   é   é   é   é   é   é   é   é   é   é   )s   lcaches   versions   logins   passwords	   challenges	   logged_ins   not_logged_ins   cachemessages   messages   answers   errors   decrefs   decaches   uncachec                 ól   — g | _         t          j        | j        ¦  «        | _        d| _        || _        d S )Nr   )rR   ÚcopyÚoutgoingVocabularyÚoutgoingSymbolsÚoutgoingSymbolCountrE   )r:   rE   s     r   Ú__init__zBanana.__init__4  s1   € ØˆŒÝ#œy¨Ô)@ÑAÔAˆÔØ#$ˆÔ Ø ˆŒˆˆr   c                 ó´   — t          ¦   «         }|                      ||j        ¦  «         |                     ¦   «         }| j                             |¦  «         dS )a  
        Send the encoded representation of the given object:

        @param obj: An object to encode and send.

        @raise BananaError: If the given object is not an instance of one of
            the types supported by Banana.

        @return: L{None}
        N)r   Ú_encodeÚwriteÚgetvaluerI   )r:   rK   ÚencodeStreamÚvalues       r   rG   zBanana.sendEncoded:  sQ   € õ ‘y”yˆØ�Š�S˜,Ô,Ñ-Ô-Ð-Ø×%Ò%Ñ'Ô'ˆØŒ×Ò˜UÑ#Ô#Ð#Ð#Ð#r   c           	      óž  — t          |t          t          f¦  «        r‚t          |¦  «        t          k    r t          dt          |¦  «        fz  ¦  «        ‚t          t          |¦  «        |¦  «          |t          ¦  «         |D ]}|                      ||¦  «         Œd S t          |t          ¦  «        rÏ|| j
        k     s|| j        k    rt          d|fz  ¦  «        ‚|| j        k     r#t          | |¦  «          |t          ¦  «         d S |dk     r#t          | |¦  «          |t          ¦  «         d S || j        k    r"t          ||¦  «          |t           ¦  «         d S t          ||¦  «          |t"          ¦  «         d S t          |t$          ¦  «        r0 |t&          ¦  «          |t)          j        d|¦  «        ¦  «         d S t          |t,          ¦  «        rµ| j        dk    r8|| j        v r/| j        |         }t          ||¦  «          |t2          ¦  «         d S t          |¦  «        t          k    r t          dt          |¦  «        fz  ¦  «        ‚t          t          |¦  «        |¦  «          |t4          ¦  «          ||¦  «         d S t          d                     t9          t;          |¦  «        ¦  «        |¦  «        ¦  «        ‚)Nz#list/tuple is too long to send (%d)zint is too large to send (%d)r   rY   r1   z$byte string is too long to send (%d)z#Banana cannot send {} objects: {!r})Ú
isinstanceÚlistÚtupler^   r`   r
   r   r_   r˜   Úintr6   r9   r7   rd   re   r8   rb   rc   Úfloatri   rj   Úpackr   r@   r”   rf   ra   r[   r   Útype)r:   rK   r™   ÚelemÚsymbolIDs        r   r˜   zBanana._encodeJ  sÅ  € Ý�c�D¥%˜=Ñ)Ô)ð ,	Ý�3‰xŒx�*Ò$Ð$Ý!Ð"GÍ3ÈsÉ8Ì8È+Ñ"UÑVÔVÐVÝ•S˜‘X”X˜uÑ%Ô%Ð%ØˆE•$‰KŒKˆKØð *ð *�Ø—’˜T 5Ñ)Ô)Ð)Ð)ð*ð *å˜�SÑ!Ô!ð %	Ø�TÔ*Ò*Ð*¨c°DÔ4HÒ.HÐ.HÝ!Ð"AÀSÀFÑ"JÑKÔKÐKØ�TÔ&Ò&Ð&Ý˜#˜˜uÑ%Ô%Ð%Ø�•g‘”���Ø�q’�Ý˜#˜˜uÑ%Ô%Ð%Ø�•c‘
”
�
�
�
Ø˜Ô(Ò(Ð(Ý˜˜eÑ$Ô$Ð$Ø�•c‘
”
�
�
�
å˜˜eÑ$Ô$Ð$Ø�•g‘”���Ý˜�UÑ#Ô#ð 	ØˆE•%‰LŒLˆLØˆE•&”+˜d CÑ(Ô(Ñ)Ô)Ð)Ð)Ð)Ý˜�UÑ#Ô#ð 	àÔ" eÒ+Ð+°°tÔ7KÐ0KÐ0KØÔ/°Ô4�Ý˜ 5Ñ)Ô)Ð)Ø�•e‘”���å�s‘8”8�jÒ(Ð(Ý%Ø>Å#ÀcÁ(Ä(ÀÑLñô ð õ �˜S™œ 5Ñ)Ô)Ð)Ø�•f‘”�Ø��c‘
”
�
�
�
åØ5×<Ò<Ý&¥t¨C¡y¤yÑ1Ô1°3ñô ñô ð r   )r   )r   r   r   Ú__doc__rF   r5   r`   Ú	sizeLimitr-   r=   rB   rM   rO   rV   rZ   rs   rD   r“   rg   ÚitemsÚkÚvr–   rG   r˜   r   r   r   r0   r0   a   s-  € € € € € ðð ð ˜GÐ$€Mà€KØ€Ið
4ð 
4ð 
4ðð ð ð
ð ð ð4ð 4ð 4ð<1ð 1ð 1ð.ð .ð .ð €FðQð Qð Qðf$ð $ð $ð#à�ð#ð 	�!ð#ð 	˜ð	#ð
 	�að#ð 	�qð#ð 	�Qð#ð 	�Qð#ð 	�ð#ð 	�1ð#ð 	�rð#ð 	�"ð#ð 	˜"ð#ð 	�ð#ð  	�"ð!#ð" 	�2ð##ð$ 	�2ð%#ð& 	�"ð'#ð( àØØØØØØØØØØØØðE#ð #ð #ÐðJ ÐØ"×(Ò(Ñ*Ô*ð "ð "‰ˆˆ1Ø !Ð˜1ÑÐð!ð !ð !ð !ð$ð $ð $ð -ð -ð -ð -ð -r   r0   r2   c                 ó’   — t          ¦   «         }|t          _        t                               | ¦  «         |                     ¦   «         S )zEncode a list s-expression.)r   Ú_irI   rG   rš   )ru   r›   s     r   Úencoder®   €  s6   € å‘9”9€LØ…B„LÝ‡N‚N�3ÑÔÐØ× Ò Ñ"Ô"Ð"r   c                 óÆ   — g }|j         t          _        	 t                               | ¦  «         dt          _        t          `n# dt          _        t          `w xY w|d         S )z)
    Decode a banana-encoded string.
    r   r   )rS   r­   rD   rs   rZ   )r   rU   s     r   Údecoder°   ˆ  s_   € ð 	€AØœH…BÔð"Ý
�Š˜ÑÔÐà�Œ	ÝÐ!Ð!øð �Œ	ÝÐ!Ð!Ð!Ð!Ð!ØˆQŒ4€Ks   •A ÁA)'r§   r’   rj   Úior   Útwisted.internetr   Útwisted.persistedr   Útwisted.pythonr   Útwisted.python.compatr   Útwisted.python.reflectr   Ú	Exceptionr
   r   r!   r_   rb   ra   re   ri   rc   rd   rf   r]   r-   r+   r`   ÚProtocolÚ	Ephemeralr0   r­   rO   rB   r®   r°   r   r   r   ú<module>rº      sÇ  ðð
ð ð €€€Ø €€€Ø Ð Ð Ð Ð Ð à %Ð %Ð %Ð %Ð %Ð %Ø $Ð $Ð $Ð $Ð $Ð $Ø Ð Ð Ð Ð Ð Ø +Ð +Ð +Ð +Ð +Ð +Ø 5Ð 5Ð 5Ð 5Ð 5Ð 5ð	ð 	ð 	ð 	ð 	�)ñ 	ô 	ð 	ðð ð ðð ð ð( €Ø€Ø	€Ø€Ø€à
€Ø
€à€à€ðð ð ð  €Ø €ˆrÑ Ô Ð à€
ðVð Vð Vð Vð VˆXÔ Ô 0ñ Vô Vð Vðt €V�X„X€Ø × Ò Ñ Ô Ð Ø × Ò �'Ñ Ô Ð ð#ð #ð #ðð ð ð ð r   