ó
    ð›‘hý‘ ã                   óÚ  • S SK r S SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKrS SK	r	S SK
JrJrJrJr  S SKJr  S SKJr  S SKJr  S SKJr  S SKJrJrJr  S SKJrJrJrJr  S S	K J!r!  S S
K"J#r#J$r$J%r%J&r&J'r'  S SK"J(r(  S SK"J)r)  S SK*J+r+  S SK,J-r-J.r.  S SK/J0r0  S SK1J2r2  S SK3J4r4J5r5  S SK"J6r6  S SK7r7S SK8r8\9" S5      r:Sr;S r<S r= " S S\>5      r? " S S\>5      r@S rA " S S\>5      rB " S S\)5      rC\Rˆ                  " \C5        \Rˆ                  " \C5        \Rˆ                  " \C5         " S S \>5      rE " S! S"\>5      rFS#rG " S$ S%\C5      rH " S& S'\F5      rI " S( S)\C5      rJ " S* S+\F5      rKg),é    N)ÚOptionalÚUnionÚTupleÚDict)Úpformat)Údeque)Úparse)Ú__version__)ÚIWebSocketChannelÚIWebSocketChannelFrameApiÚIWebSocketChannelStreamingApi)ÚConnectingRequestÚConnectionRequestÚConnectionResponseÚConnectionDeny)ÚTransportDetails)Ú	StopwatchÚwildcards2patternsÚencode_truncateÚhltypeÚhlval)Ú_LazyHexFormatter)ÚObservableMixin)ÚUtf8Validator)ÚXorMaskerNullÚcreate_xor_masker)Ú PERMESSAGE_COMPRESSION_EXTENSION)Ú	parse_url)ÚPayloadExceededErrorÚDisconnected)Ú_maybe_tls_reason)ÚWebSocketProtocolÚWebSocketFactoryÚWebSocketServerProtocolÚWebSocketServerFactoryÚWebSocketClientProtocolÚWebSocketClientFactoryc                 óP  • U R                  5       S:X  a  g[        R                  " U 5      nUR                  R                  5       nUS:X  a  gUR                  nUR
                  nUc	   SSS.U   nU(       d  [        SR                  U 5      5      eX#U4$ ! [         a    Sn N3f = f)zš
Given an RFC6455 Origin URL, this returns the (scheme, host, port)
triple. If there's no port, and the scheme isn't http or https
then port will be None
ÚnullÚfileNi»  éP   )ÚhttpsÚhttpzNo host part in Origin '{}')	Úlowerr	   ÚurlsplitÚschemeÚhostnameÚportÚKeyErrorÚ
ValueErrorÚformat)ÚurlÚresr0   Úhostr2   s        Ú_C:\Users\psant\Downloads\Noiseback\school\venv\Lib\site-packages\autobahn/websocket/protocol.pyÚ_url_to_originr:   M   sª   € ð ‡y�yƒ{�fÓØä
�.Š.˜Ó
€CØ�Z‰Z×ÑÓ€FØ�Óð à�<‰<€DØ�8‰8€DØ�|ð	Ø ¨"Ñ-¨fÑ5ˆDö ÜÐ6×=Ñ=¸cÓBÓCÐCØ˜ÐÐøô ó 	ØŠDð	ús   Á)B ÂB%Â$B%c                 óâ   • U S:X  a  g[        U [        5      (       a  [        U 5      S:X  d  [        S5      eU u  pEnSnUR	                  UUUS9nU H  n	U	R                  U5      (       d  M    g   g)a€  
Internal helper. Returns True if the provided websocket_origin
triple should be considered valid given the provided policy and
expected host_port.

Currently, the policy is just the list of allowedOriginsPatterns
from the WebSocketProtocol instance. Schemes and ports are matched
first, and only if there is not a mismatch do we compare each
allowed-origin pattern against the host.
r)   Fé   z$'websocket_origin' must be a 3-tuplez{scheme}://{host}:{port})r0   r8   r2   T)Ú
isinstanceÚtupleÚlenr4   r5   Úmatch)
Úwebsocket_originÚhost_schemeÚ	host_portÚhost_policyÚorigin_schemeÚorigin_hostÚorigin_portÚtemplateÚorigin_headerÚorigin_patterns
             r9   Ú_is_same_originrK   j   sˆ   € ð ˜6Ó!àäÐ&¬×.Ñ.´cÐ:JÓ6KÈqÓ6PÜÐ?Ó@Ð@à0@Ñ-€] ð *€HØ—O‘OØØØð $ð €Mó &ˆØ×Ñ ×.Ó.Ùñ &ð ó    c                   ó,   • \ rS rSrS rS rS rS rSrg)ÚTrafficStatséš   c                 ó$   • U R                  5         g ©N)Úreset©Úselfs    r9   Ú__init__ÚTrafficStats.__init__œ   s   € Ø�
‰
�rL   c                 ó¬   • SU l         SU l        SU l        SU l        SU l        SU l        SU l        SU l        SU l        SU l	        SU l
        SU l        g ©Nr   )ÚoutgoingOctetsWireLevelÚoutgoingOctetsWebSocketLevelÚoutgoingOctetsAppLevelÚoutgoingWebSocketFramesÚoutgoingWebSocketMessagesÚincomingOctetsWireLevelÚincomingOctetsWebSocketLevelÚincomingOctetsAppLevelÚincomingWebSocketFramesÚincomingWebSocketMessagesÚpreopenOutgoingOctetsWireLevelÚpreopenIncomingOctetsWireLevelrS   s    r9   rR   ÚTrafficStats.resetŸ   sf   € ð ()ˆÔ$Ø,-ˆÔ)Ø&'ˆÔ#Ø'(ˆÔ$Ø)*ˆÔ&à'(ˆÔ$Ø,-ˆÔ)Ø&'ˆÔ#Ø'(ˆÔ$Ø)*ˆÔ&ð
 /0ˆÔ+Ø./ˆÕ+rL   c                 óz  • U R                   S:”  a,  [        U R                  5      [        U R                   5      -  nOS nU R                  S:”  a,  [        U R                  5      [        U R                  5      -  nOS nU R                  S:”  a9  [        U R
                  U R                  -
  5      [        U R                  5      -  nOS nU R                  S:”  a9  [        U R                  U R                  -
  5      [        U R                  5      -  nOS n0 SU R
                  _SU R                  _SU R                   _SU_SU_SU R                  _SU R                  _S	U R                  _S
U R                  _SU R                  _SU R                  _SU_SU_SU R                  _SU R                  _SU R                  _$ )Nr   rY   rZ   r[   ÚoutgoingCompressionRatioÚoutgoingWebSocketOverheadr\   r]   rc   r^   r_   r`   ÚincomingCompressionRatioÚincomingWebSocketOverheadra   rb   rd   )r[   ÚfloatrZ   r`   r_   rY   r^   r\   r]   rc   ra   rb   rd   )rT   rg   ri   rh   rj   s        r9   Ú__json__ÚTrafficStats.__json__´   s8  € ð ×&Ñ&¨Ó*Ü',¨T×-NÑ-NÓ'OÔRWÐX\×XsÑXsÓRtÑ'tÑ$à'+Ð$Ø×&Ñ&¨Ó*Ü',¨T×-NÑ-NÓ'OÔRWÐX\×XsÑXsÓRtÑ'tÑ$à'+Ð$ð ×,Ñ,¨qÓ0Ü(-¨d×.JÑ.JÈT×MnÑMnÑ.nÓ(oÔrwÐx|÷  yZñ  yZó  s[ñ  )[Ñ%à(,Ð%Ø×,Ñ,¨qÓ0Ü(-¨d×.JÑ.JÈT×MnÑMnÑ.nÓ(oÔrwÐx|÷  yZñ  yZó  s[ñ  )[Ñ%à(,Ð%ðWÐ)¨4×+GÑ+Gð WØ.°×0QÑ0QðWà(¨$×*EÑ*EðWð +Ð,DðWð ,Ð-Fð	Wð
 *¨4×+GÑ+GðWð ,¨T×-KÑ-KðWð 1°$×2UÑ2UðWð *¨4×+GÑ+GðWð /°×0QÑ0QðWð )¨$×*EÑ*EðWð +Ð,DðWð ,Ð-FðWð *¨4×+GÑ+GðWð ,¨T×-KÑ-KðWð  1°$×2UÑ2Uð!Wð 	WrL   c                 óJ   • [         R                  " U R                  5       5      $ rQ   )ÚjsonÚdumpsrl   rS   s    r9   Ú__str__ÚTrafficStats.__str__Þ   s   € Ü�zŠz˜$Ÿ-™-›/Ó*Ð*rL   )r`   r_   r^   ra   rb   r[   rZ   rY   r\   r]   rd   rc   N)	Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__rU   rR   rl   rq   Ú__static_attributes__© rL   r9   rN   rN   š   s   † òò0ò*(WõT+rL   rN   c                   ó   • \ rS rSrSrS rSrg)ÚFrameHeaderéâ   zL
Thin-wrapper for storing WebSocket frame metadata.

FOR INTERNAL USE ONLY!
c                 ó@   • Xl         X l        X0l        X@l        XPl        g)a   
Constructor.

:param opcode: Frame opcode (0-15).
:type opcode: int
:param fin: Frame FIN flag.
:type fin: bool
:param rsv: Frame reserved flags (0-7).
:type rsv: int
:param length: Frame payload length.
:type length: int
:param mask: Frame mask (binary string) or None.
:type mask: str
N)ÚopcodeÚfinÚrsvÚlengthÚmask)rT   r}   r~   r   r€   r�   s         r9   rU   ÚFrameHeader.__init__é   s   € ð ŒØŒØŒØŒØ�	rL   )r~   r€   r�   r}   r   N©rs   rt   ru   rv   Ú__doc__rU   rw   rx   rL   r9   rz   rz   â   s   † ñõrL   rz   c                 ó˜  • U R                  S5      R                  5       nUS   R                  5       n0 n0 nUSS  Hˆ  nUR                  S5      nUS:”  an  USU R                  5       R	                  5       nXVS-   S R                  5       nXs;   a)  X7==   SR                  U5      -  ss'   XG==   S-  ss'   M~  XƒU'   SXG'   Mˆ  MŠ     X#U4$ )ai  
   Parses the beginning of a HTTP request header (the data up to the 

line) into a pair
   of status line and HTTP headers dictionary.
   Header keys are normalized to all-lower-case.

   FOR INTERNAL USE ONLY!

   :param data: The HTTP header data up to the 

line.
   :type data: bytes

   :returns: Tuple of HTTP status line, headers and headers count.
   z
iso-8859-1r   é   NÚ:z, {})ÚdecodeÚ
splitlinesÚstripÚfindr.   r5   )	ÚdataÚrawÚhttp_status_lineÚhttp_headersÚhttp_headers_cntÚhÚiÚkeyÚvalues	            r9   ÚparseHttpHeaderr•   ÿ   sÙ   € ð* �+‰+�lÓ
#×
.Ñ
.Ó
0€CØ˜1‘v—|‘|“~ÐØ€LØÐØ��‹WˆØ�F‰F�3‹KˆØˆq‹5à�B�Q�%—+‘+“-×%Ñ%Ó'ˆCØ˜!‘e�f�I—O‘OÓ%ˆEð Ó"ØÓ! V§]¡]°5Ó%9Ñ9Ó!Ø Ó%¨Ñ*Õ%à$)˜SÑ!Ø()Ð Ó%ñ ñ! ð" Ð+;Ð;Ð;rL   c                   ó@   • \ rS rSrSrS rS rSS jrS rS r	S r
S	rg
)ÚTimingsé,  zq
Helper class to track timings by key. This class also supports item access,
iteration and conversion to string.
c                 ó0   • [        5       U l        0 U l        g rQ   )r   Ú
_stopwatchÚ_timingsrS   s    r9   rU   ÚTimings.__init__2  s   € Ü#›+ˆŒØˆ�rL   c                 óR   • U R                   R                  5       U R                  U'   g)zY
Track elapsed for key.

:param key: Key under which to track the timing.
:type key: str
N)rš   Úelapsedr›   ©rT   r“   s     r9   ÚtrackÚTimings.track6  s   € ð "Ÿ_™_×4Ñ4Ó6ˆ�‰�cÒrL   c                 óî  • X R                   ;   aÎ  XR                   ;   a¿  U R                   U   U R                   U   -
  nU(       a—  US:  a  SR                  [        US-  5      5      nObUS:  a  SR                  [        US-  5      5      nO>US:  a  SR                  [        US	-  5      5      nOS
R                  [        U5      5      nUR                  S5      $ U$ U(       a  SR                  S5      $ g)a�  
Get elapsed difference between two previously tracked keys.

:param startKey: First key for interval (older timestamp).
:type startKey: str
:param endKey: Second key for interval (younger timestamp).
:type endKey: str
:param formatted: If ``True``, format computed time period and return string.
:type formatted: bool

:returns: Computed time period in seconds (or formatted string).
çñhãˆµøä>z{} nsg    eÍÍAg{®Gáz„?z{} usg    €„.Aé
   z{} msg     @�@z{} sé   zn.a.N)r›   r5   ÚroundÚrjust)rT   ÚstartKeyÚendKeyÚ	formattedÚdÚss         r9   ÚdiffÚTimings.diff?  sÉ   € ð —]‘]Ó" x·=±=Ó'@Ø—‘˜fÑ%¨¯©°hÑ(?Ñ?ˆAÞØ�w“;ØŸ™¤u¨Q°©_Ó'=Ó>‘AØ˜“XØŸ™¤u¨Q°©\Ó':Ó;‘AØ˜“VØŸ™¤u¨Q°©YÓ'7Ó8‘AàŸ™¤e¨A£hÓ/�AØ—w‘w˜q“zÐ!à�æØ—|‘| A“Ð&àrL   c                 ó:   • U R                   R                  US 5      $ rQ   )r›   ÚgetrŸ   s     r9   Ú__getitem__ÚTimings.__getitem__`  s   € Ø�}‰}× Ñ   dÓ+Ð+rL   c                 ó6   • U R                   R                  5       $ rQ   )r›   Ú__iter__rS   s    r9   r´   ÚTimings.__iter__c  s   € Ø�}‰}×%Ñ%Ó'Ð'rL   c                 ó,   • [        U R                  5      $ rQ   )r   r›   rS   s    r9   rq   ÚTimings.__str__f  s   € Ü�t—}‘}Ó%Ð%rL   )rš   r›   N©T)rs   rt   ru   rv   r„   rU   r    r­   r±   r´   rq   rw   rx   rL   r9   r—   r—   ,  s&   † ñò
ò7ôòB,ò(õ&rL   r—   c                   óô  • \ rS rSrSrSr/ SQr SS/r SSSSSSSSSS.	r SSS	.r	 Sr
 S
r Sr Sr Sr SrSrSrSrSrSrSrSrSrSr Sr Sr Sr Sr Sr Sr Sr Sr  Sr! Sr" Sr# Sr$ Sr% Sr& S r' \\\\\\ \!\"\#\$\%/r( / S!Qr) / S"Qr* / S#Qr+ S$ r,\-S%\.\/   4S& j5       r0S' r1S( r2S) r3S* r4S+ r5S, r6S- r7S. r8S/ r9S0 r:S1 r;S2 r<S3 r=S4 r>S5 r?S6 r@S7 rASbS8 jrBS9 rC\S:4S; jrDS< rES= rFS> rGS? rHS@ rISA rJSB rKSC rLSD rMSE rNSF rOSG rPSH rQSI rRSJ rSScSL jrTSM rUSN rVSO rWSP rXSQ rYSR rZ       SdSS jr[SeST jr\SU r]SV r^SeSW jr_SfSX jr`SgSY jraShSZ jrbS[ rcSbS\ jrdS] reSbS^ jrf    SiS_ jrgSjS` jrhSarigK)kr"   ij  a  
Protocol base class for WebSocket.

This class implements:

  * :class:`autobahn.websocket.interfaces.IWebSocketChannel`
  * :class:`autobahn.websocket.interfaces.IWebSocketChannelFrameApi`
  * :class:`autobahn.websocket.interfaces.IWebSocketChannelStreamingApi`
z<never connected>)	r¤   é   é   é   é   é   é   é   é   r¥   r¼   r»   rÁ   )r¥   r¼   s$   258EAFA5-E914-47DA-95CA-C5AB0DC85B11r£   r†   é   r   r<   é   éè  ié  iê  ië  iì  ií  iî  iï  ið  iñ  iò  ió  iô  iõ  iö  i÷  )Ú	logOctetsÚ	logFramesÚtrackTimingsÚutf8validateIncomingÚ	applyMaskÚmaxFramePayloadSizeÚmaxMessagePayloadSizeÚautoFragmentSizeÚ
failByDropÚechoCloseCodeReasonÚopenHandshakeTimeoutÚcloseHandshakeTimeoutÚ
tcpNoDelayÚautoPingIntervalÚautoPingTimeoutÚautoPingSizeÚautoPingRestartOnAnyTraffic)ÚversionsÚ	webStatusÚrequireMaskedClientFramesÚmaskServerFramesÚperMessageCompressionAcceptÚserveFlashSocketPolicyÚflashSocketPolicyÚallowedOriginsÚallowedOriginsPatternsÚallowNullOriginÚmaxConnectionsÚtrustXForwardedFor)ÚversionÚacceptMaskedServerFramesÚmaskClientFramesÚserverConnectionDropTimeoutÚperMessageCompressionOffersrÚ   c                 ó®   • [         R                  " 5       U l        [         R                  " 5       U l        U R	                  S/5        [        5       U l        g )NÚmessage)ÚtxaioÚcreate_futureÚ	is_closedÚis_openÚset_valid_eventsr   Ú_transport_detailsrS   s    r9   rU   ÚWebSocketProtocol.__init__(  sH   € ä×,Ò,Ó.ˆŒÜ×*Ò*Ó,ˆŒð 	×ÑØð
ô 	ô ?OÓ>PˆÕrL   Úreturnc                 ó   • U R                   $ )zL
Implements :class:`autobahn.wamp.interfaces.ITransport.transport_details`.
)rî   rS   s    r9   Útransport_detailsÚ#WebSocketProtocol.transport_details7  s   € ð
 ×&Ñ&Ð&rL   c                 ó:   • U R                   R                  S5        g)zK
Implements :meth:`autobahn.websocket.interfaces.IWebSocketChannel.onOpen`
zWebSocketProtocol.onOpenN©ÚlogÚdebugrS   s    r9   ÚonOpenÚWebSocketProtocol.onOpen>  s   € ð 	�‰�‰Ð1Õ2rL   c                 ó,   • Xl         / U l        SU l        g)zS
Implements :meth:`autobahn.websocket.interfaces.IWebSocketChannel.onMessageBegin`
r   N)Úmessage_is_binaryÚmessage_dataÚmessage_data_total_length)rT   ÚisBinarys     r9   ÚonMessageBeginÚ WebSocketProtocol.onMessageBeginD  s   € ð "*ÔØˆÔØ)*ˆÕ&rL   c                 ó
  • Xl         / U l        U =R                  U-  sl        U R                  (       dÐ  SU R                  s=:  a  U R                  :  aV  O  OSSU l        U R                  U R                  U R                  SR                  U R                  U R                  5      5        gSU R                  s=:  a  U:  aA  O  gSU l	        U R                  UU R                  SR                  XR                  5      5        ggg)zX
Implements :meth:`autobahn.websocket.interfaces.IWebSocketChannel.onMessageFrameBegin`
r   TzEreceived WebSocket message size {} exceeds payload limit of {} octetszCreceived WebSocket frame size {} exceeds payload limit of {} octetsN)
Úframe_lengthÚ
frame_datarý   Ú
failedByMerË   Ú wasMaxMessagePayloadSizeExceededÚ_max_message_size_exceededr5   rÊ   ÚwasMaxFramePayloadSizeExceeded)rT   r€   s     r9   ÚonMessageFrameBeginÚ%WebSocketProtocol.onMessageFrameBeginL  s  € ð #ÔØˆŒØ×&Ò&¨&Ñ0Õ&Ø��Ø�4×-Ñ-ÕN°×0NÑ0NÖNØ8<�Ô5Ø×/Ñ/°×0NÑ0NØ04×0JÑ0JØ0w×0~Ñ0~ð  @D÷  @^ñ  @^ð  `d÷  `zñ  `zó  1{õ|ð �T×-Ñ-Õ6°Ö6Ø6:�Ô3Ø×/Ñ/°Ø04×0HÑ0HØ0u×0|Ñ0|ð  ~D÷  F^ñ  F^ó  1_õ`ð 7ð rL   c                 óÞ  • U R                   (       dÜ  U R                  S:X  a°  U =R                  [        U5      -  sl        SU R                  s=:  a  U R                  :  aU  O  ORSU l        U R                  U R                  U R                  SR                  U R                  U R                  5      5        U R                  R                  U5        gU R                  R                  U5        gg)zW
Implements :meth:`autobahn.websocket.interfaces.IWebSocketChannel.onMessageFrameData`
r   TzYreceived (partial) WebSocket message size {} (already) exceeds payload limit of {} octetsN)r  Úwebsocket_versionrý   r?   rË   r  r  r5   rü   Úappendr  ©rT   Úpayloads     r9   ÚonMessageFrameDataÚ$WebSocketProtocol.onMessageFrameData_  sÞ   € ð ��Ø×%Ñ%¨Ó*Ø×.Ò.´#°g³,Ñ>Õ.Ø�t×1Ñ1ÕR°D×4RÑ4RÖRØ<@�DÔ9Ø×3Ñ3°D×4RÑ4RØ48×4NÑ4Nð 5P÷  5Wñ  5Wð  X\÷  Xvñ  Xvð  x|÷  xRñ  xRó  5SôTð ×!Ñ!×(Ñ(¨Õ1à—‘×&Ñ& wÕ/ð rL   c                 ój   • U R                   (       d  U R                  U R                  5        SU l        g)zV
Implements :meth:`autobahn.websocket.interfaces.IWebSocketChannel.onMessageFrameEnd`
N)r  Ú_onMessageFramer  rS   s    r9   ÚonMessageFrameEndÚ#WebSocketProtocol.onMessageFrameEndo  s$   € ð ��Ø× Ñ  §¡Ô1àˆ�rL   c                 ó^   • U R                   (       d  U R                  R                  U5        gg)zS
Implements :meth:`autobahn.websocket.interfaces.IWebSocketChannel.onMessageFrame`
N)r  rü   Úextendr  s     r9   ÚonMessageFrameÚ WebSocketProtocol.onMessageFramex  s$   € ð ��Ø×Ñ×$Ñ$ WÕ-ð rL   c                 ón  ^ • T R                   (       dœ  SR                  T R                  5      nT R                  (       a  T R                  R	                  S5        T R                  UT R                  5        T R                  SUT R                  S9nU 4S jn[        R                  " USU5        ST l        g)zQ
Implements :meth:`autobahn.websocket.interfaces.IWebSocketChannel.onMessageEnd`
rL   Ú	onMessagerè   )Ú	is_binaryc                 ó:   >• TR                   R                  SU S9  g )Nz&Firing signal 'message' failed: {fail}©Úfail)rö   Úerror)ÚfrT   s    €r9   r  Ú-WebSocketProtocol.onMessageEnd.<locals>.error�  s   ø€ Ø—‘—‘Ø<Øð ò rL   N)
r  Újoinrü   ÚtrackedTimingsr    Ú
_onMessagerû   Úfireré   Úadd_callbacks)rT   r  r   r  s   `   r9   ÚonMessageEndÚWebSocketProtocol.onMessageEnd  sŽ   ø€ ð ��Ø—h‘h˜t×0Ñ0Ó1ˆGØ×"×"Ø×#Ñ#×)Ñ)¨+Ô6Ø�O‰O˜G T×%;Ñ%;Ô<ð —	‘	˜) W¸×8NÑ8N�	ÐOˆAõô ×Ò  4¨Ô/à ˆÕrL   c                 ó^   • U R                   R                  SU(       a  [        U5      OSUS9  g)zN
Implements :meth:`autobahn.websocket.interfaces.IWebSocketChannel.onMessage`
zOWebSocketProtocol.onMessage(payload=<{payload_len} bytes)>, isBinary={isBinary}r   )Úpayload_lenrþ   N©rö   r÷   r?   )rT   r  rþ   s      r9   r  ÚWebSocketProtocol.onMessage—  s*   € ð 	�‰�‰Ø]Þ)0œ˜Wœ°aØð 	ò 	
rL   c                 ó¼   • U R                   R                  SU(       a  [        U5      OSS9  U R                  [        R
                  :X  a  U R                  U5        gg)zK
Implements :meth:`autobahn.websocket.interfaces.IWebSocketChannel.onPing`
z7WebSocketProtocol.onPing(payload=<{payload_len} bytes>)r   ©r*  N)rö   r÷   r?   Ústater"   Ú
STATE_OPENÚsendPongr  s     r9   ÚonPingÚWebSocketProtocol.onPing¡  sM   € ð 	�‰�‰ØEÞ)0œ˜Wœ°að 	ñ 	
ð �:‰:Ô*×5Ñ5Ó5Ø�M‰M˜'Õ"ð 6rL   c                 ó\   • U R                   R                  SU(       a  [        U5      OSS9  g)zK
Implements :meth:`autobahn.websocket.interfaces.IWebSocketChannel.onPong`
z7WebSocketProtocol.onPong(payload=<{payload_len} bytes>)r   r.  Nr+  r  s     r9   ÚonPongÚWebSocketProtocol.onPong¬  s'   € ð 	�‰�‰ØEÞ)0œ˜Wœ°að 	ò 	
rL   c                 ó<   • U R                   R                  SUUUS9  g)zL
Implements :meth:`autobahn.websocket.interfaces.IWebSocketChannel.onClose`
zLWebSocketProtocol.onClose(wasClean={wasClean}, code={code}, reason={reason}))ÚwasCleanÚcodeÚreasonNrõ   )rT   r8  r9  r:  s       r9   ÚonCloseÚWebSocketProtocol.onCloseµ  s%   € ð 	�‰�‰ØZØØØð	 	ò 	
rL   c                 ó€  • SU l         SU l        Ubl  US:  d*  SUs=::  a  S::  a  O  OU[        R                  ;  d  US:¼  a<  U R	                  SR                  U5      5      (       a  g[        R                  U l         OXl         Ub]  [        5       nUR                  U5      nUS   (       a
  US   (       d  U R                  S	5      (       a  gOUR                  S
5      U l        U R                  [        R                  :X  a½  U R                  b<  U R                  R                  S5        U R                  R!                  5         SU l        SU l        U R$                  R&                  (       a  U R)                  SS9  gU R*                  S:”  a1  [,        R.                  " U R*                  U R0                  5      U l        ggU R                  [        R4                  :X  a²  SU l        U R6                  S:X  a  U R9                  SS9  O_U R:                  (       a0  U R9                  U R                   [=        U R                  S5      SS9  OU R9                  [        R                  SS9  U R$                  R&                  (       a  U R)                  SS9  ggU R                  [        R>                  :X  a  SU l        g[A        S5      e)a	  
Callback when a Close frame was received. The default implementation answers by
sending a Close when no Close was sent before. Otherwise it drops
the TCP connection either immediately (when we are a server) or after a timeout
(when we are a client and expect the server to drop the TCP).

:param code: Close status code, if there was one (:class:`WebSocketProtocol`.CLOSE_STATUS_CODE_*).
:type code: int
:param reasonRaw: Close reason (when present, a status code MUST have been also be present).
:type reasonRaw: bytes
NrÄ   i·  iˆ  zinvalid close code {}Tr   r†   z'invalid close reason (non-UTF8 payload)Úutf8z?connection closed properly: canceling closing handshake timeout©Úabort)ÚisReplyé{   ©r9  Ú
reasonUtf8rA  )r9  rA  Fúlogic error)!ÚremoteCloseCodeÚremoteCloseReasonr"   ÚCLOSE_STATUS_CODES_ALLOWEDÚ_protocol_violationr5   ÚCLOSE_STATUS_CODE_NORMALr   ÚvalidateÚ_invalid_payloadrˆ   r/  ÚSTATE_CLOSINGÚcloseHandshakeTimeoutCallrö   r÷   Úcancelr8  ÚfactoryÚisServerÚdropConnectionrå   ré   Ú
call_laterÚonServerConnectionDropTimeoutÚserverConnectionDropTimeoutCallr0  r  ÚsendCloseFramerÎ   r   ÚSTATE_CLOSEDÚ	Exception)rT   r9  Ú	reasonRawÚuÚvals        r9   ÚonCloseFrameÚWebSocketProtocol.onCloseFrameÀ  s{  € ð  $ˆÔØ!%ˆÔð Ñ ¨£°¸Õ1EÀÖ1EÈ$ÔVg÷  WCñ  WCó  KCð  HLð  PTó  HTØ×'Ñ'Ð(?×(FÑ(FÀtÓ(L×MÑMØä'8×'QÑ'Q�Õ$à#'Ô ð Ñ ô “ˆAØ—*‘*˜YÓ'ˆCð ˜—F˜s 1ŸvØ×(Ñ(Ð)R×SÑSØð Tð *3×)9Ñ)9¸&Ó)A�Ô&ð �:‰:Ô*×8Ñ8Ó8ð ×-Ñ-Ñ9Ø—‘—‘Ð`ÔaØ×.Ñ.×5Ñ5Ô7Ø15�Ô.à ˆDŒMà�|‰|×$×$à×#Ñ#¨$Ð#Ò/ð ×3Ñ3°aÓ7Ü;@×;KÒ;KØ×8Ñ8Ø×:Ñ:ó<�DÕ8ð 8ð �Z‰ZÔ,×7Ñ7Ó7ð !ˆDŒMà×%Ñ%¨Ó*Ø×#Ñ#¨DÐ#Ò1ð ×+×+Ø×'Ñ'¨T×-AÑ-AÌoÐ^b×^tÑ^tÐvyÓNzð  EIÐ'ò  Jà×'Ñ'Ô->×-WÑ-WÐaeÐ'Ñfà�|‰|×$×$à×#Ñ#¨%Ð#Ò0ð
 à�Z‰ZÔ,×9Ñ9Ó9à!ˆD�Mô ˜MÓ*Ð*rL   c                 óÎ   • SU l         U R                  [        R                  :w  a%  SU l        SU l        SU l        U R                  SS9  gU R                  R                  S5        g)z¸
We (a client) expected the peer (a server) to drop the connection,
but it didn't (in time self.serverConnectionDropTimeout).
So we drop the connection, but set self.wasClean = False.
NFzPWebSocket closing handshake timeout (server did not drop TCP connection in time)Tr?  zQskipping closing handshake timeout: server did indeed drop the connection in time)
rU  r/  r"   rW  r8  ÚwasNotCleanReasonÚwasServerConnectionDropTimeoutrR  rö   r÷   rS   s    r9   rT  Ú/WebSocketProtocol.onServerConnectionDropTimeout#  sX   € ð 04ˆÔ,à�:‰:Ô*×7Ñ7Ó7Ø!ˆDŒMØ%wˆDÔ"Ø26ˆDÔ/Ø×Ñ dÐÒ+à�H‰H�N‰NÐnÕorL   c                 ó(  • SU l         U R                  [        R                  [        R                  4;   a%  SU l        SU l        SU l        U R                  SS9  gU R                  [        R                  :X  a  U R                  R                  S5        gU R                  [        R                  :X  a  U R                  R                  S5        gU R                  [        R                  :X  a  U R                  R                  S5        g[        S	5      e)
z³
We expected the peer to complete the opening handshake with to us.
It didn't do so (in time self.openHandshakeTimeout).
So we drop the connection, but set self.wasClean = False.
NFzWWebSocket opening handshake timeout (peer did not finish the opening handshake in time)Tr?  zeskipping opening handshake timeout: WebSocket connection is open (opening handshake already finished)zNskipping opening handshake timeout: WebSocket connection is already closing ..zJskipping opening handshake timeout: WebSocket connection is already closedrE  )ÚopenHandshakeTimeoutCallr/  r"   ÚSTATE_CONNECTINGÚSTATE_PROXY_CONNECTINGr8  r_  ÚwasOpenHandshakeTimeoutrR  r0  rö   r÷   rM  rW  rX  rS   s    r9   ÚonOpenHandshakeTimeoutÚ(WebSocketProtocol.onOpenHandshakeTimeout3  sÒ   € ð )-ˆÔ%à�:‰:Ô+×<Ñ<Ô>O×>fÑ>fÐgÓgØ!ˆDŒMØ%~ˆDÔ"Ø+/ˆDÔ(Ø×Ñ dÐÒ+Ø�Z‰ZÔ,×7Ñ7Ó7Ø�H‰H�N‰Nð  Cõ  DØ�Z‰ZÔ,×:Ñ:Ó:Ø�H‰H�N‰NÐkÕlØ�Z‰ZÔ,×9Ñ9Ó9Ø�H‰H�N‰NÐgÕhô ˜MÓ*Ð*rL   c                 óÎ   • SU l         U R                  [        R                  :w  a%  SU l        SU l        SU l        U R                  SS9  gU R                  R                  S5        g)zÚ
We expected the peer to respond to us initiating a close handshake. It didn't
respond (in time self.closeHandshakeTimeout) with a close response frame though.
So we drop the connection, but set self.wasClean = False.
NFzWWebSocket closing handshake timeout (peer did not finish the closing handshake in time)Tr?  zJskipping closing handshake timeout: WebSocket connection is already closed)
rN  r/  r"   rW  r8  r_  ÚwasCloseHandshakeTimeoutrR  rö   r÷   rS   s    r9   ÚonCloseHandshakeTimeoutÚ)WebSocketProtocol.onCloseHandshakeTimeoutJ  sX   € ð *.ˆÔ&à�:‰:Ô*×7Ñ7Ó7Ø!ˆDŒMØ%~ˆDÔ"Ø,0ˆDÔ)Ø×Ñ dÐÒ+à�H‰H�N‰NÐgÕhrL   c           	      óN   • U R                   R                  S[        U5      XX4S9  g)aÑ  
When doing automatic ping/pongs, this is called upon a successful pong.

:param ping_sent: Posix time in ns when ping was sent.
:param ping_seq: Sequence number of ping that was sent.
:param pong_received: Posix time in ns when pong was received.
:param pong_rtt: Pong roundtrip-time in ms measured.
:param payload: The complete WebSocket ping/pong message payload
    (ping_sent 8 bytes big-endian | ping_seq 4 bytes big endian | max. 113 optional random bytes).
z‚Auto ping/pong: received pending pong (size={size}) for auto-ping (sent={sent}, seq={seq}, received={received}) in RTT of {rtt} ms)ÚsizeÚsentÚseqÚreceivedÚrttNr+  )rT   Ú	ping_sentÚping_seqÚpong_receivedÚpong_rttr  s         r9   Ú
onAutoPongÚWebSocketProtocol.onAutoPongZ  s+   € ð 	�‰�‰ð QÜ�W“ IÀmð 	ò 	crL   c                 óL   • SU l         SU l        SU l        U R                  SS9  g)z‚
When doing automatic ping/pongs to detect broken connection, the peer
did not reply in time to our ping. We drop the connection.
Fz?WebSocket ping timeout (peer did not respond with pong in time)NTr?  )r8  r_  ÚautoPingTimeoutCallrR  rS   s    r9   ÚonAutoPingTimeoutÚ#WebSocketProtocol.onAutoPingTimeouti  s,   € ð
 ˆŒØ!bˆÔØ#'ˆÔ Ø×Ñ $ÐÒ'rL   c                 ó  • U R                  5         U R                  [        R                  :w  aµ  U R                  (       a&  U R
                  R                  SU R                  US9  O/U R
                  R                  SU R                  XR                  S9  SU l
        [        R                  U l        [        R                  " U R                  U 5        U R                  U5        gU R
                  R                  SU R                  S9  g)	z%
Drop the underlying TCP connection.
z5dropping connection to peer {peer} with abort={abort})Úpeerr@  z?dropping connection to peer {peer} with abort={abort}: {reason})r~  r@  r:  TzFdropping connection to peer {peer} skipped - connection already closed)r~  N)ÚunregisterProducerr/  r"   rW  r8  rö   r÷   r~  Úwarnr_  ÚdroppedByMeré   Úresolverë   Ú_closeConnection)rT   r@  s     r9   rR  Ú WebSocketProtocol.dropConnections  sÌ   € ð 	×ÑÔ!Ø�:‰:Ô*×7Ñ7Ó7à�}�}Ø—‘—‘ÐVÐ]a×]fÑ]fÐns�Òtà—‘—‘Ð_Ðfj×foÑfoÐw|÷  F\ñ  F\�ñ  ]à#ˆDÔô
 +×7Ñ7ˆDŒJÜ�MŠM˜$Ÿ.™.¨$Ô/à×!Ñ! %Õ(à�H‰H�N‰NÐcÐjn×jsÑjsˆNÒtrL   c                 óF   •  U R                  [        R                  U5        g rQ   )Ú_fail_connectionr"   Ú!CLOSE_STATUS_CODE_MESSAGE_TOO_BIGr   )rT   Úmsg_sizeÚmax_msg_sizer:  s       r9   r  Ú,WebSocketProtocol._max_message_size_exceeded‹  s   € àØ×!Ñ!Ô"3×"UÑ"UÐW]Õ^rL   z
going awayc                 óÈ  • U R                   [        R                  :w  a©  U R                  R	                  SXS9  SU l        U R                  (       a-  SU l        SR                  U5      U l	        U R                  SS9  g
U R                   [        R                  :w  a  U R                  U[        US5      SS9  g
U R                  SS9  g
U R                  R                  S	5        g
)z!
Fails the WebSocket connection.
z6failing WebSocket connection (code={code}): "{reason}")r9  r:  TFz+I dropped the WebSocket TCP connection: {0}r?  rB  rC  z=skip failing of connection since connection is already closedN)r/  r"   rW  rö   r€  r  rÍ   r8  r5   r_  rR  rM  rV  r   r÷   )rT   r9  r:  s      r9   r†  Ú"WebSocketProtocol._fail_connection’  sÀ   € ð �:‰:Ô*×7Ñ7Ó7Ø�H‰H�M‰MÐRÐY]ˆMÑmà"ˆDŒOà��à %�”Ø)V×)]Ñ)]Ð^dÓ)e�Ô&Ø×#Ñ#¨$Ð#Ò/ð —:‘:Ô!2×!@Ñ!@Ó@à×'Ñ'¨T¼oÈfÐVYÓ>ZÐdiÐ'Òjð ×'Ñ'¨eÐ'Ò4ð �H‰H�N‰NÐZÕ[rL   c                 óœ   • U R                   R                  SUS9  U R                  [        R                  U5        U R
                  (       a  gg)zÚ
Fired when a WebSocket protocol violation/error occurs.

:param reason: Protocol violation that was encountered (human readable).
:type reason: str

:returns: True, when any further processing should be discontinued.
zProtocol violation: {reason}©r:  TF)rö   r÷   r†  r"   Ú CLOSE_STATUS_CODE_PROTOCOL_ERRORrÍ   ©rT   r:  s     r9   rI  Ú%WebSocketProtocol._protocol_violation­  s@   € ð 	�‰�‰Ð5¸fˆÑEà×ÑÔ/×PÑPÐRXÔYà�?�?Øð rL   c                 óœ   • U R                   R                  SUS9  U R                  [        R                  U5        U R
                  (       a  gg)aK  
Fired when invalid payload is encountered. Currently, this only happens
for text message when payload is invalid UTF-8 or close frames with
close reason that is invalid UTF-8.

:param reason: What was invalid for the payload (human readable).
:type reason: str

:returns: True, when any further processing should be discontinued.
zInvalid payload: {reason}rŽ  TF)rö   r÷   r†  r"   Ú!CLOSE_STATUS_CODE_INVALID_PAYLOADrÍ   r�  s     r9   rL  Ú"WebSocketProtocol._invalid_payloadÁ  s@   € ð 	�‰�‰Ð2¸6ˆÑBà×ÑÔ/×QÑQÐSYÔZà�?�?Øð rL   c                 ó¤   • [        U S5      (       a  U R                  U:w  a/  Xl        U R                  (       a  [        5       U l        gSU l        gg)zl
Enable/disable tracking of detailed timings.

:param enable: Turn time tracking on/off.
:type enable: bool
rÇ   N)ÚhasattrrÇ   r—   r#  )rT   Úenables     r9   ÚsetTrackTimingsÚ!WebSocketProtocol.setTrackTimings×  sE   € ô �t˜^×,Ñ,°×0AÑ0AÀVÓ0KØ &ÔØ× × Ü&-£i�Õ#à&*�Õ#ð 1LrL   c           	      ó@  • / nU R                    H‡  n[        X5      (       dA  [        X[        U R                  U5      5        U R                  R
                  R                  nOU R
                  R                  nUR                  U[        X5      U45        M‰     U R                  R                  S[        U5      S9  SU l        SU l        U R                  U R                  5        [        5       U l        U R                  R"                  (       d-  U R                  R$                  b  [&        R(                  U l        O[&        R,                  U l        [&        R.                  U l        SU l        [5        5       U l        SU l        [;        5       U l        SU l        SU l         SU l!        SU l"        SU l#        SU l$        SU l%        SU l&        SU l'        SU l(        SU l)        SU l*        SU l+        SU l,        SU l-        U R                  R"                  (       d  SU l.        SU l/        SU l0        SU l1        SU l2        SU l3        SU l4        SU l5        U Rl                  S:”  a@  U R                  Rn                  Rq                  U Rl                  U Rr                  5      U l/        gg)z˜
This is called by network framework when a new TCP connection has been established
and handed over to a Protocol instance (an instance of this class).
z
{attrs})ÚattrsNrL   Fr   ):ÚCONFIG_ATTRSr–  ÚsetattrÚgetattrrP  Ú	__class__rs   r  rö   r÷   r   Ú_perMessageCompressr#  r˜  rÇ   rN   ÚtrafficStatsrQ  Úproxyr"   re  r/  rd  ÚSEND_STATE_GROUNDÚ
send_staterŒ   r   Ú
send_queueÚ	triggeredr   Úutf8validatorr  r  Ú
closedByMer  r�  r8  r_  r`  rf  rj  ÚwasServingFlashSocketPolicyFileÚlocalCloseCodeÚlocalCloseReasonrF  rG  rU  rc  rN  rz  ÚautoPingPendingÚautoPingPendingCallÚautoPingPendingSeqÚautoPingPendingSentrÏ   Ú_batched_timerrS  rg  )rT   ÚconfigAttrLogÚ
configAttrÚconfigAttrSources       r9   Ú_connectionMadeÚ!WebSocketProtocol._connectionMadeå  sW  € ð ˆØ×+Ô+ˆJÜ˜4×,Ñ,Ü˜¬'°$·,±,À
Ó*KÔLØ#'§<¡<×#9Ñ#9×#BÑ#BÑ à#'§>¡>×#:Ñ#:Ð Ø× Ñ  *¬g°dÓ.GÐIYÐ!ZÖ[ñ ,ð 	�‰�‰�{¬'°-Ó*@ˆÑAð $(ˆÔ ð #ˆÔØ×Ñ˜T×.Ñ.Ô/ô )›NˆÔð �|‰|×$×$¨¯©×);Ñ);Ñ)GÜ*×AÑAˆD�Jä*×;Ñ;ˆDŒJÜ+×=Ñ=ˆŒØˆŒ	ô
  ›'ˆŒØˆŒô +›_ˆÔð /4ˆÔ+Ø05ˆÔ-ð
  ˆŒð
  ˆŒð !ˆÔð ˆŒð "&ˆÔð /4ˆÔ+ð (-ˆÔ$ð ).ˆÔ%ð 05ˆÔ,ð #ˆÔð !%ˆÔð  $ˆÔð "&ˆÔð �|‰|×$×$Ø37ˆDÔ0Ø(,ˆÔ%Ø)-ˆÔ&à#'ˆÔ Ø#ˆÔØ#'ˆÔ Ø"#ˆÔØ#'ˆÔ ð ×$Ñ$ qÓ(Ø,0¯L©L×,GÑ,G×,RÑ,RØ×)Ñ)Ø×+Ñ+ó-ˆDÕ)ð )rL   c                 óH  • U R                   R                  SUS9  U R                  R                  (       dI  U R                  b<  U R                   R                  S5        U R                  R                  5         SU l        U R                  (       a<  U R                   R                  S5        U R                  R                  5         SU l        U R                  (       a<  U R                   R                  S5        U R                  R                  5         SU l        U R                  b!  U R                  R                  5         SU l        U R                  [        R                  :w  a6  [        R                  U l	        [        R                  " U R                  U 5        U R                  (       a  U R                   R                  S5        gU R                   (       d™  U R"                  (       dC  U R$                  c6  ['        USS5      nU(       d  SO
[)        U5      nU(       a  X0l        OS	U l        U R+                  U R                   [        R,                  S
R/                  U R$                  5      5        gU R+                  U R                   U R0                  U R2                  5        g)zK
This is called by network framework when a transport connection was
lost.
z_connectionLost: {reason}rŽ  Nz&serverConnectionDropTimeoutCall.cancelzBAuto ping/pong: canceling autoPingPendingCall upon lost connectionzBAuto ping/pong: canceling autoPingTimeoutCall upon lost connectionz9connection dropped after serving Flash Socket Policy Filer”   zLpeer dropped the TCP connection without previous WebSocket closing handshakez&connection was closed uncleanly ("{}"))rö   r÷   rP  rQ  rU  rO  r­  rz  rc  r/  r"   rW  ré   r‚  rë   r©  r8  r�  r_  rž  r!   Ú_onCloseÚ CLOSE_STATUS_CODE_ABNORMAL_CLOSEr5   rF  rG  )rT   r:  Úreason_valueÚreason_strings       r9   Ú_connectionLostÚ!WebSocketProtocol._connectionLost[  só  € ð 	�‰�‰Ð2¸6ˆÑBà�|‰|×$×$¨×)MÑ)MÑ)YØ�H‰H�N‰NÐCÔDØ×0Ñ0×7Ñ7Ô9Ø37ˆDÔ0ð ×#×#Ø�H‰H�N‰NÐ_Ô`Ø×$Ñ$×+Ñ+Ô-Ø'+ˆDÔ$à×#×#Ø�H‰H�N‰NÐ_Ô`Ø×$Ñ$×+Ñ+Ô-Ø'+ˆDÔ$ð ×(Ñ(Ñ4Ø×)Ñ)×0Ñ0Ô2Ø,0ˆDÔ)ð �:‰:Ô*×7Ñ7Ó7Ü*×7Ñ7ˆDŒJÜ�MŠM˜$Ÿ.™.¨$Ô/à×/×/Ø�H‰H�N‰NÐVÕWà—=—=Ø×'×'¨D×,BÑ,BÑ,JÜ#*¨6°7¸DÓ#A�LÞ0<¡DÔBSÐT`ÓBa�MÞ$Ø1>Õ.à1˜Ô.Ø—‘˜dŸm™mÔ->×-_Ñ-_ð  bJ÷  bQñ  bQð  RV÷  Rhñ  Rhó  biõ  jà—‘˜dŸm™m¨T×-AÑ-AÀ4×CYÑCYÕZrL   c                 ó`   • U R                   R                  SU R                  [        U5      S9  g)z]
Hook fired right after raw octets have been received, but only when
self.logOctets == True.
z)RX Octets from {peer} : octets = {octets})r~  ÚoctetsN©rö   r÷   r~  r   ©rT   rŒ   s     r9   ÚlogRxOctetsÚWebSocketProtocol.logRxOctets�  s+   € ð
 	�‰�‰Ø7Ø—‘Ü$ TÓ*ð 	ò 	
rL   c                 ób   • U R                   R                  SU R                  U[        U5      S9  g)zY
Hook fired right after raw octets have been sent, but only when
self.logOctets == True.
z6TX Octets to {peer} : sync = {sync}, octets = {octets})r~  Úsyncr¾  Nr¿  )rT   rŒ   rÄ  s      r9   ÚlogTxOctetsÚWebSocketProtocol.logTxOctets›  s.   € ð
 	�‰�‰ØDØ—‘ØÜ$ TÓ*ð	 	ò 	
rL   c                 ót  • SR                  U5      nU R                  R                  SU R                  UR                  UR
                  UR                  UR                  (       a   [        R                  " UR                  5      OSUR                  UR                  S:X  a  [        U5      O
[        U5      S9  g)zm
Hook fired right after WebSocket frame has been received and decoded,
but only when self.logFrames == True.
rL   zyRX Frame from {peer} : fin = {fin}, rsv = {rsv}, opcode = {opcode}, mask = {mask}, length = {length}, payload = {payload}Ú-r†   )r~  r~   r   r}   r�   r€   r  N)r"  rö   r÷   r~  r~   r   r}   r�   ÚbinasciiÚb2a_hexr€   Úreprr   )rT   ÚframeHeaderr  rŒ   s       r9   Ú
logRxFrameÚWebSocketProtocol.logRxFrame§  s�   € ð
 �x‰x˜Ó ˆØ�‰�‰ðFà—‘Ø—‘Ø—‘Ø×%Ñ%Ø7B×7G×7G”×!Ò! +×"2Ñ"2Ô3ÈSØ×%Ñ%Ø"-×"4Ñ"4¸Ó"9”D˜”JÔ?PÐQUÓ?Vð 	ò 
	
rL   c                 óX  • U R                   R                  SU R                  UR                  UR                  UR
                  UR                  (       a   [        R                  " UR                  5      OSUR                  UUUUR
                  S:X  a  [        U5      O
[        U5      S9  g)zi
Hook fired right after WebSocket frame has been encoded and sent, but
only when self.logFrames == True.
z¾TX Frame to {peer} : fin = {fin}, rsv = {rsv}, opcode = {opcode}, mask = {mask}, length = {length}, repeat_length = {repeat_length}, chopsize = {chopsize}, sync = {sync}, payload = {payload}rÈ  r†   )
r~  r~   r   r}   r�   r€   Úrepeat_lengthÚchopsizerÄ  r  N)rö   r÷   r~  r~   r   r}   r�   rÉ  rÊ  r€   rË  r   )rT   rÌ  r  ÚrepeatLengthrÑ  rÄ  s         r9   Ú
logTxFrameÚWebSocketProtocol.logTxFrame¹  sŒ   € ð
 	�‰�‰ðIð —‘Ø—‘Ø—‘Ø×%Ñ%Ø7B×7G×7G”×!Ò! +×"2Ñ"2Ô3ÈSØ×%Ñ%Ø&ØØØ%0×%7Ñ%7¸1Ó%<”D˜”MÔBSÐT[ÓB\ð 	ò 	
rL   c                 óè  • U R                   [        R                  :X  a)  U R                  =R                  [        U5      -  sl        OdU R                   [        R                  :X  d  U R                   [        R                  :X  a(  U R                  =R                  [        U5      -  sl        U R                  (       a  U R                  U5        U =R                  U-  sl        U R                  5         g)zR
This is called by network framework upon receiving data on transport
connection.
N)r/  r"   r0  r¡  r^   r?   rd  re  rd   rÅ   rÁ  rŒ   ÚconsumeDatarÀ  s     r9   Ú_dataReceivedÚWebSocketProtocol._dataReceivedÎ  s¡   € ð
 �:‰:Ô*×5Ñ5Ó5Ø×Ñ×5Ò5¼¸T»ÑBÖ5Ø�Z‰ZÔ,×=Ñ=Ó=ÀÇÁÔO`×OwÑOwÓAwØ×Ñ×<Ò<ÄÀDÃ	ÑIÕ<à�>�>Ø×Ñ˜TÔ"Ø�	Š	�TÑ�	Ø×ÑÕrL   c                 óš  • U R                   [        R                  :X  d  U R                   [        R                  :X  am  U R	                  5       (       aW  U R                   [        R
                  :w  a8   U R	                  5       (       a!  U R                   [        R
                  :w  a  M6  ggggU R                   [        R                  :X  a  U R                  5         gU R                   [        R                  :X  a  U R                  5         gU R                   [        R
                  :X  a  U R                  R                  S5        g[        S5      e)z#
Consume buffered (incoming) data.
zreceived data in STATE_CLOSEDzinvalid stateN)r/  r"   r0  rM  ÚprocessDatarW  re  ÚprocessProxyConnectrd  ÚprocessHandshakerö   r÷   rX  rS   s    r9   rÖ  ÚWebSocketProtocol.consumeDataÝ  sô   € ð �:‰:Ô*×5Ñ5Ó5¸¿¹ÔGX×GfÑGfÓ9fð ×"Ñ"×$Ñ$¨¯©Ô7H×7UÑ7UÓ)UØð ×"Ñ"×$Ñ$¨¯©Ô7H×7UÑ7UÖ)UÐ$Ð)UÐ$ð
 �Z‰ZÔ,×CÑCÓCà×$Ñ$Õ&ð �Z‰ZÔ,×=Ñ=Ó=ð ×!Ñ!Õ#ð �Z‰ZÔ,×9Ñ9Ó9ð �H‰H�N‰NÐ:Õ;ô
 ˜OÓ,Ð,rL   c                 ó   • [        S5      e)z
Process proxy connect.
z@must implement proxy connect (client or server) in derived class©rX  rS   s    r9   rÛ  Ú%WebSocketProtocol.processProxyConnect  s   € ô ÐZÓ[Ð[rL   c                 ó   • [        S5      e)z
Process WebSocket handshake.
z<must implement handshake (client or server) in derived classrß  rS   s    r9   rÜ  Ú"WebSocketProtocol.processHandshake  s   € ô ÐVÓWÐWrL   c                 óV   • U R                   (       d  SU l         U R                  5         gg)zX
Trigger sending stuff from send queue (which is only used for
chopped/synched writes).
TN)r¦  Ú_sendrS   s    r9   Ú_triggerÚWebSocketProtocol._trigger  s    € ð
 �~�~Ø!ˆDŒNØ�J‰J�Lð rL   c                 ó>  • [        U R                  5      S:”  Ga|  U R                  R                  5       nU R                  [        R
                  :w  aù  U R                  R                  US   5        U R                  [        R                  :X  a,  U R                  =R                  [        US   5      -  sl
        OgU R                  [        R                  :X  d  U R                  [        R                  :X  a+  U R                  =R                  [        US   5      -  sl        U R                  (       a  U R                  US   US   5        OU R                   R#                  S5        [$        R&                  " [        R(                  U R*                  5        gSU l        g)z]
Send out stuff from send queue. For details how this works, see
test/trickling in the repo.
r   r†   z1skipped delayed write, since connection is closedFN)r?   r¥  Úpopleftr/  r"   rW  Ú	transportÚwriter0  r¡  rY   rd  re  rc   rÅ   rÅ  rö   r÷   ré   rS  Ú_QUEUED_WRITE_DELAYrä  r¦  )rT   Úes     r9   rä  ÚWebSocketProtocol._send  s  € ô
 ˆt�‰Ó !Ô#Ø—‘×'Ñ'Ó)ˆAà�z‰zÔ.×;Ñ;Ó;à—‘×$Ñ$ Q q¡TÔ*à—:‘:Ô!2×!=Ñ!=Ó=Ø×%Ñ%×=Ò=ÄÀQÀqÁTÃÑJÖ=Ø—Z‘ZÔ#4×#EÑ#EÓEÈÏÉÔWh×WÑWÓIØ×%Ñ%×DÒDÌÈAÈaÉDË	ÑQÕDà—>—>Ø×$Ñ$ Q q¡T¨1¨Q©4Ô0øà—‘—‘ÐRÔSô ×ÒÔ.×BÑBÀDÇJÁJÕOà"ˆD�NrL   Nc           
      óô  • U(       af  US:”  a`  Sn[        U5      nSnU(       d9  XC-   nXu:¼  a  SnUnU R                  R                  XU S45        XC-  nU(       d  M9  U R                  5         gU(       d  [        U R                  5      S:”  a-  U R                  R                  X45        U R                  5         gU R                  R                  U5        U R                  R                  S[        U R                  5      [        U R                  5      [        [        U5      5      S9  U R                  [        R                  :X  a)  U R                  =R                   [        U5      -  sl        OdU R                  [        R"                  :X  d  U R                  [        R$                  :X  a(  U R                  =R&                  [        U5      -  sl        U R(                  (       a  U R+                  US5        gg)a¦  
Wrapper for self.transport.write which allows to give a chopsize.
When asked to chop up writing to TCP stream, we write only chopsize
octets and then give up control to select() in underlying reactor so
that bytes get onto wire immediately. Note that this is different from
and unrelated to WebSocket data message fragmentation. Note that this
is also different from the TcpNoDelay option which can be set on the
socket.
r   FTz,{func} sent {data_len} bytes for peer {peer})Úfuncr~  Údata_lenN)r?   r¥  r  rå  ré  rê  rö   r÷   r   ÚsendDatar   r~  r/  r"   r0  r¡  rY   rd  re  rc   rÅ   rÅ  )rT   rŒ   rÄ  rÑ  r’   ÚnÚdoneÚjs           r9   rñ  ÚWebSocketProtocol.sendData;  sw  € ö ˜ 1›ØˆAÜ�D“	ˆAØˆDÞØ‘L�Ø“6Ø�DØ�AØ—‘×&Ñ&¨¨q¨	°4Ð'8Ô9Ø‘�÷ �dð �M‰M�Oæ”s˜4Ÿ?™?Ó+¨aÓ/Ø—‘×&Ñ&¨ |Ô4Ø—‘•à—‘×$Ñ$ TÔ*Ø—‘—‘ÐMÜ$*¨4¯=©=Ó$9Ü$)¨$¯)©)Ó$4Ü(-¬c°$«iÓ(8ð ñ :ð
 —:‘:Ô!2×!=Ñ!=Ó=Ø×%Ñ%×=Ò=ÄÀTÃÑJÖ=Ø—Z‘ZÔ#4×#EÑ#EÓEÈÏÉÔWh×WÑWÓIØ×%Ñ%×DÒDÌÈDË	ÑQÕDà—>—>Ø×$Ñ$ T¨5Õ1ð "rL   c                 óÄ   • U R                   b  UR                  (       a  U R                  UR                  5        gU R	                  UR
                  UR                  5        g)zX
Implements :func:`autobahn.websocket.interfaces.IWebSocketChannel.sendPreparedMessage`
N)r   ÚdoNotCompressrñ  ÚpayloadHybiÚsendMessager  Úbinary)rT   ÚpreparedMsgs     r9   ÚsendPreparedMessageÚ%WebSocketProtocol.sendPreparedMessaged  sF   € ð ×#Ñ#Ñ+¨{×/H×/HØ�M‰M˜+×1Ñ1Õ2à×Ñ˜[×0Ñ0°+×2DÑ2DÕErL   c                 ó   • [        U R                  5      nU R                  Gc   US:¼  Ga˜  U R                  S   nUS-  S:g  nUS-  S-	  nUS-  nU R                  S   nUS-  S:g  nUS	-  nUS:w  a:  U R                  b  US:X  a  O&U R	                  S
R                  U5      5      (       a  gU R                  R                  (       a/  U R                  (       a  U(       d  U R	                  S5      (       a  gU R                  R                  (       d/  U R                  (       d  U(       a  U R	                  S5      (       a  gUS:”  aØ  U(       d  U R	                  S5      (       a  gUS:”  a  U R	                  S5      (       a  gUS;  a&  U R	                  SR                  U5      5      (       a  gUS:X  a  US:X  a  U R	                  S5      (       a  gU R                  b@  US:X  a:  U R	                  SR                  U R                  R                  5      5      (       a  gOæUS;  a&  U R	                  SR                  U5      5      (       a  gU R                  (       d  US:X  a  U R	                  S5      (       a  gU R                  (       a  US:w  a  U R	                  S5      (       a  gU R                  bQ  US:X  aK  U R                  (       a:  U R	                  SR                  U R                  R                  5      5      (       a  gU(       a  SnOSnUS:  a  SU-   n	O#US:X  a  SU-   n	OUS	:X  a  SU-   n	O[        S5      eX:¼  Ga~  Sn
US:X  aL  [        R                  " SU R                  XªS-    5      S   nUS:  a  U R	                  S 5      (       a  gU
S-  n
OqUS	:X  ai  [        R                  " S!U R                  XªS-    5      S   nUS":”  a  U R	                  S#5      (       a  gUS$:  a  U R	                  S 5      (       a  gU
S-  n
OUnSnU(       a  U R                  XªS-    nU
S-  n
U(       a(  US:”  a"  U R                  (       a  [!        XË5      U l        O[%        5       U l        U R                  U
S U l        ['        UUUUU5      U l        U R)                  5         US:H  =(       d    [        U R                  5      S:„  $ ggU R                  R*                  U R"                  R-                  5       -
  nX:¼  a&  U R                  SU nUnU R                  US U l        OU R                  nUnS%U l        US:”  a  U R"                  R/                  U5      nOS%nU R1                  U5      nUSL a  gU R"                  R-                  5       U R                  R*                  :X  a  U R3                  5       nUSL a  g[        U R                  5      S:„  $ )&zs
After WebSocket handshake has been completed, this procedure will do
all subsequent processing of incoming bytes.
NrÂ   r   é€   ép   rÃ   r¾   r†   é   z$RSV = {} and no extension negotiatedFzunmasked client-to-server framezmasked server-to-client frameé   zfragmented control frameé}   z.control frame with payload length > 125 octets)r¥   é	   r¤   z&control frame using reserved opcode {}r¥   z/received close control frame with payload len 1z&received compressed control frame [{}]©r   r†   rÂ   z#data frame using reserved opcode {}z;received continuation data frame outside fragmented messagezDreceived non-continuation data frame while inside fragmented messagez;received continuation data frame with compress bit set [{}]é~   r¤   rE  ú!Hz=invalid data frame length (not using minimal length encoding)ú!Qì   ÿÿÿÿ z!invalid data frame length (>2^63)i   rL   )r?   rŒ   Úcurrent_framer   rI  r5   rP  rQ  rØ   rã   ÚEXTENSION_NAMEÚinside_messagerX  ÚstructÚunpackrÉ   r   Úcurrent_frame_maskerr   rz   ÚonFrameBeginr€   ÚpointerÚprocessÚonFrameDataÚ
onFrameEnd)rT   Úbuffered_lenÚbÚ	frame_finÚ	frame_rsvÚframe_opcodeÚframe_maskedÚframe_payload_len1Úmask_lenÚframe_header_lenr’   Úframe_payload_lenÚ
frame_maskÚrestrŒ   r€   r  Úfrs                     r9   rÚ  ÚWebSocketProtocol.processDatam  s½  € ô
 ˜4Ÿ9™9“~ˆð ×ÑÒ%ð ˜qÔ ð —I‘I˜a‘L�Ø ™X¨!™O�	Ø ™X¨!™O�	Ø  4™x�ð —I‘I˜a‘L�Ø ! D¡¨Q™�Ø%&¨¡XÐ"ð
  “>Ø×/Ñ/Ñ;À	ÈQÃØà×3Ñ3Ð4Z×4aÑ4aÐbkÓ4l×mÑmØ#(ð —<‘<×(×(¨T×-K×-KÖT`Ø×/Ñ/Ð0Q×RÑRØ$ð —|‘|×,×,°T×5R×5RÖWcØ×/Ñ/Ð0O×PÑPØ$ð   !Ó#ö %Ø×3Ñ3Ð4N×OÑOØ#(ð *¨CÓ/Ø×3Ñ3Ð4d×eÑeØ#(ð $¨:Ó5Ø×3Ñ3Ð4\×4cÑ4cÐdpÓ4q×rÑrØ#(ð
 $ qÓ(Ð-?À1Ó-DØ×3Ñ3Ð4e×fÑfØ#(ð ×/Ñ/Ñ;À	ÈQÃØ×3Ñ3Ð4\×4cÑ4cÐdh×d|Ñd|÷  eLñ  eLó  5M÷  Nñ  NØ#(øð $¨9Ó4Ø×3Ñ3Ð4Y×4`Ñ4`ÐamÓ4n×oÑoØ#(ð  ×.×.°<À1Ó3DØ×3Ñ3Ð4q×rÑrØ#(ð ×*×*¨|¸qÓ/@Ø×3Ñ3Ð4z×{Ñ{Ø#(ð ×/Ñ/Ñ;À	ÈQÃÐSW×Sf×SfØ×3Ñ3Ð4q×4xÑ4xÐy}÷  zRñ  zR÷  zañ  zaó  5b÷  cñ  cØ#(ö  Ø ‘Hà �Hà%¨Ó+Ø'(¨8¡|Ñ$Ø'¨3Ó.Ø',¨xÑ'7Ñ$Ø'¨3Ó.Ø',¨xÑ'7Ñ$ä# MÓ2Ð2ð
  Ô3ð �Að *¨SÓ0Ü,2¯MªM¸$ÀÇ	Á	È!ÐPQÉEÐ@RÓ,SÐTUÑ,VÐ)Ø,¨sÓ2Ø#×7Ñ7Ð8w×xÑxØ',Ø˜Q™™Ø+¨sÓ2Ü,2¯MªM¸$ÀÇ	Á	È!ÐPQÉEÐ@RÓ,SÐTUÑ,VÐ)Ø,Ð/AÓAØ#×7Ñ7Ð8[×\Ñ\Ø',Ø,¨uÓ4Ø#×7Ñ7Ð8w×xÑxØ',Ø˜Q™™à,>Ð)ð "&�JÞ#Ø%)§Y¡Y¨q°Q±Ð%7˜
Ø˜Q™˜æ#Ð(9¸AÓ(=À$Ç.Ç.Ü4EÀjÓ4d˜Õ1ä4A³O˜Ô1ð !%§	¡	¨!¨" �D”Iô *5°\Ø5>Ø5>Ø5FØ5?ó	*A�DÔ&ð ×%Ñ%Ô'ð -°Ñ1×G´S¸¿¹³^ÀaÑ5GÐGð !àð ×%Ñ%×,Ñ,¨t×/HÑ/H×/PÑ/PÓ/RÑRˆDØÓ#Ø—y‘y  $Ð'�Ø�Ø ŸI™I d eÐ,�•	à—y‘y�Ø%�Ø�”	à˜‹zð ×3Ñ3×;Ñ;¸DÓA‘ð �ð ×!Ñ! 'Ó*ˆBà�UŠ{Øð ×(Ñ(×0Ñ0Ó2°d×6HÑ6H×6OÑ6OÓOØ—_‘_Ó&�à˜’;Ø ô �t—y‘y“> AÑ%Ð%rL   c                 óú  • U R                   R                  S:”  a  / U l        gU R                  (       Gd"  SU l        U R                  b<  U R                   R
                  S:X  a"  SU l        U R                  R                  5         OSU l        U R                   R                  [        R                  :X  a:  U R                  (       a)  U R                  R                  5         SU l        SU l        OSU l        U R                  (       a  U R                  R!                  S5        U R#                  U R                   R                  [        R$                  :H  5        U R'                  U R                   R(                  5        g)z
Begin of receive new frame.
r  TNrÃ   F)TTr   r   rÿ   )r
  r}   Úcontrol_frame_datar  r   r   Ú_isMessageCompressedÚstart_decompress_messager"   ÚMESSAGE_TYPE_TEXTrÈ   r§  rR   Ú"utf8validateIncomingCurrentMessageÚutf8validateLastr#  r    Ú_onMessageBeginÚMESSAGE_TYPE_BINARYÚ_onMessageFrameBeginr€   rS   s    r9   r  ÚWebSocketProtocol.onFrameBegin\  s,  € ð ×Ñ×$Ñ$ qÓ(Ø&(ˆDÕ#ð ×&×&Ð&à&*�Ô#ð ×+Ñ+Ñ7¸D×<NÑ<N×<RÑ<RÐVWÓ<WØ04�DÔ-Ø×,Ñ,×EÑEÕGà05�DÔ-ð ×%Ñ%×,Ñ,Ô0A×0SÑ0SÓSÐX\×Xq×XqØ×&Ñ&×,Ñ,Ô.Ø>B�DÔ;Ø,>�DÕ)à>C�DÔ;ð ×&×&Ø×'Ñ'×-Ñ-Ð.>Ô?ð ×$Ñ$ T×%7Ñ%7×%>Ñ%>ÔBS×BgÑBgÑ%gÔhà×%Ñ% d×&8Ñ&8×&?Ñ&?Õ@rL   c                 ó&  • U R                   R                  S:”  a  U R                  R                  U5        gU R                  (       aV  [        U5      nU R                  R                  SU[        U5      S9  U R                  R                  U5      n[        U5      nO[        U5      nUnUnU R                  [        R                  :X  a>  U R                  =R                  U-  sl        U R                  =R                   U-  sl        U R"                  (       ag  U R$                  R'                  U5      U l        U R(                  S   (       d3  U R+                  SR-                  U R(                  S   5      5      (       a  gU R/                  U5        g)	z!
New data received within frame.
r  zRX compressed [length]: octets)Úlegnthr¾  r   zQencountered invalid UTF-8 while processing text message at payload octet index {}r<   FN)r
  r}   r$  r  r%  r?   rö   r÷   r   r   Údecompress_message_datar/  r"   r0  r¡  r_   r`   r(  r§  rK  r)  rL  r5   Ú_onMessageFrameData)rT   r  ÚcompressedLenÚuncompressedLenÚls        r9   r  ÚWebSocketProtocol.onFrameData…  sk  € ð ×Ñ×$Ñ$ qÓ(Ø×#Ñ#×*Ñ*¨7Õ3ð ×(×(Ü # G£�Ø—‘—‘Ø4Ø(Ü,¨WÓ5ð ñ ð ×2Ñ2×JÑJÈ7ÓS�Ü"% g£,‘ä˜“L�Ø !�Ø"#�à�z‰zÔ.×9Ñ9Ó9Ø×!Ñ!×>Ò>À-ÑOÕ>Ø×!Ñ!×8Ò8¸OÑKÕ8ð ×6×6Ø(,×(:Ñ(:×(CÑ(CÀGÓ(L�Ô%Ø×,Ñ,¨Q×/Ø×,Ñ,ð  .A÷  .Hñ  .Hð  IM÷  I^ñ  I^ð  _`ñ  Iaó  .b÷  cñ  cØ$à×$Ñ$ WÕ-rL   c                 ó(  • U R                   R                  S:”  aI  U R                  (       a&  U R                  U R                   U R                  5        U R                  5         GO¨U R                  [        R                  :X  a  U R                  =R                  S-  sl
        U R                  (       a&  U R                  U R                   U R                  5        U R                  5         U R                  (       a!  U R                  (       a  U R                  5         U R                   R                   (       a×  U R"                  (       a  U R$                  R'                  5         U R(                  (       aG  U R*                  S   (       d3  U R-                  SR/                  U R*                  S   5      5      (       a  gU R                  [        R                  :X  a  U R                  =R0                  S-  sl        U R3                  5         SU l        SU l         g)z
End of frame received.
r  r†   zTUTF-8 text message payload ended within Unicode code point at payload octet index {}r<   FN)r
  r}   rÆ   rÍ  r$  ÚprocessControlFramer/  r"   r0  r¡  ra   r  Ú_onMessageFrameEndrz  rÕ   Ú_cancelAutoPingTimeoutCallr~   r%  r   Úend_decompress_messager(  r)  rL  r5   rb   Ú_onMessageEndr  rS   s    r9   r  ÚWebSocketProtocol.onFrameEnd¬  s—  € ð ×Ñ×$Ñ$ qÓ(Ø�~�~Ø—‘ × 2Ñ 2°D×4KÑ4KÔLØ×$Ñ$Ö&à�z‰zÔ.×9Ñ9Ó9Ø×!Ñ!×9Ò9¸QÑ>Õ9Ø�~�~Ø—‘ × 2Ñ 2°D·O±OÔDà×#Ñ#Ô%à×'×'¨D×,L×,Lð ×/Ñ/Ô1à×!Ñ!×%×%ð ×,×,Ø×,Ñ,×CÑCÔEð ×:×:Ø×0Ñ0°×3Ø×0Ñ0ð  2H÷  2Oñ  2Oð  PT÷  Peñ  Peð  fgñ  Phó  2i÷  jñ  jØ#(à—:‘:Ô!2×!=Ñ!=Ó=Ø×%Ñ%×?Ò?À1ÑDÕ?à×"Ñ"Ô$Ø&+�Ô#à!ˆÕrL   c                 ó¤  • SR                  U R                  5      nSU l        U R                  R                  S:X  aV  SnSn[	        U5      nUS:”  a(  [
        R                  " SUSS 5      S   nUS:”  a  USS nU R                  X#5      (       a  g gU R                  R                  S	:X  a  U R                  U5        gU R                  R                  S
:X  GaT  U R                  (       Ga0   XR                  :X  Ga  [
        R                  " SUSS 5      S   n[
        R                  " SUSS 5      S   n[        R                  " 5       n[        Xu-
  S-  5      nU R                  XVXxU5        U R                  (       a  U R                  R                  5         SU l	        SU l        SU l        U R"                  (       a?  U R$                  R&                  R)                  U R"                  U R*                  5      U l        OU R.                  R1                  S5         U R3                  U5        g g!   U R.                  R1                  S5         N3= f)z.
Process a completely received control frame.
rL   Nr¥   r†   r  r   rÂ   Fr  r¤   ú>Qú>Lr»   i@B z)Auto ping/pong: received non-pending pongT)r"  r$  r
  r}   r?   r  r  r\  Ú_onPingr¬  ÚtimeÚtime_nsÚintrw  rz  rO  r¯  rÒ   rP  r°  rS  Ú_sendAutoPingr­  rö   r€  Ú_onPong)	rT   r  r9  rY  Úllrs  rt  ru  rv  s	            r9   r7  Ú%WebSocketProtocol.processControlFrameØ  s  € ð —(‘(˜4×2Ñ2Ó3ˆØ"&ˆÔð ×Ñ×$Ñ$¨Ó)àˆDØˆIÜ�W“ˆBØ�A‹vÜ—}’} T¨7°1°Q¨<Ó8¸Ñ;�Ø˜“6Ø '¨¨ �Ià× Ñ  ×1Ñ1Øð 2ðl ðc ×Ñ×&Ñ&¨!Ó+Ø�L‰L˜Ô!ð` ðY ×Ñ×&Ñ&¨"Ô,ð ×#×#Ð#ðOØ×"6Ñ"6Ô6ä$*§M¢M°$¸ÀÀ¸Ó$DÀQÑ$G˜	ô $*§=¢=°°w¸qÀ°}Ó#EÀaÑ#H˜ä(,¯ª«˜Ü#&¨Ñ(AÀUÑ'JÓ#K˜àŸ™¨	¸]ÐV]Ô^à×3×3Ø ×4Ñ4×;Ñ;Ô=à/3˜Ô,Ø37˜Ô0Ø37˜Ô0à×0×0Ø7;·|±|×7RÑ7R×7]Ñ7]Ø $× 5Ñ 5Ø $× 2Ñ 2ó8˜DÔ4øð
 Ÿ™Ÿ™Ð&QÕRð �L‰L˜Ô!ð ð àøðOØ—H‘H—M‘MÐ"MÖNús   Ã-DH0 È H0 È0Ic	                 ó  • Ub~  [        U5      S:  a$  [        SR                  U[        U5      5      5      eUn	SR                  [	        U[        U5      -  5       V
s/ s H  o¢PM     sn
5      USU[        U5      -   -   nO[        U5      n	UnSnU(       a  US-  nXÄS-  S-  -  nXÁS-  -  nSnU(       dX  U R
                  R                  (       d  U R                  (       d,  U R
                  R                  (       a„  U R                  (       as  US-  nU(       d.  [        R                  " S	[        R                  " S
5      5      nUnOSnU	S:”  a.  U R                  (       a  [        XY5      nUR                  U5      nOUnOSnUnSnU	S::  a  XÙ-  nOQU	S::  a  US-  n[        R                  " SU	5      nO.U	S::  a  US-  n[        R                  " SU	5      nO[        S5      eSR                  UR!                  SS5      UR!                  SS5      UUU/5      nUS;   a  U R"                  =R$                  S-  sl        U R&                  (       a   [)        XXIU5      nU R+                  UX&Xx5        U R-                  UX‡5        gs  sn
f )aç  
Send out frame. Normally only used internally via sendMessage(),
sendPing(), sendPong() and sendClose().

This method deliberately allows to send invalid frames (that is frames
invalid per-se, or frames invalid because of protocol state). Other
than in fuzzing servers, calling methods will ensure that no invalid
frames are sent.

In addition, this method supports explicit specification of payload
length. When payload_len is given, it will always write that many
octets to the stream. It'll wrap within payload, resending parts of
that when more octets were requested The use case is again for fuzzing
server which want to sent increasing amounts of payload data to peers
without having to construct potentially large messages themselves.
Nr†   zJcannot construct repeated payload with length {} from payload of length {}rL   r   rÿ  r¥   rÃ   ú!Ié    r  éÿÿ  r  r  r	  r  r  úinvalid payload lengthÚbigr  )r?   rX  r5   r"  ÚrangerP  rQ  rä   rÙ   r  ÚpackÚrandomÚgetrandbitsrÉ   r   r  Úto_bytesr¡  r\   rÆ   rz   rÓ  rñ  )rT   r}   r  r~   r   r�   r*  rÑ  rÄ  r4  Ú_ÚplÚb0Úb1ÚmvÚmaskerÚplmÚelr�   rÌ  s                       r9   Ú	sendFrameÚWebSocketProtocol.sendFrame#  s_  € ð2 Ñ"Ü�7‹|˜aÓÜÐ l× sÑ sÐtô  BEð  FMó  BNó  !Oó  Pð  PØˆAØ—‘¬E°+ÄÀWÃÑ2MÔ,NÓOÒ,N qš7Ñ,NÑOÓPÐSZÐ[vÐ\gÔjmÐnuÓjvÑ\vÐSwÑw‰Bä�G“ˆAØˆBð ˆÞØ�6‰NˆBØ
�Q‰w˜1‰nÑˆØ
�s‰lÑˆð ˆÞ˜Ÿ™×-×-°$×2G×2GÈTÏ\É\×Mb×MbÐgk×g|×g|Ø�&‰LˆBÞô —{’{ 4¬×);Ò);¸BÓ)?Ó@�Ø‘à�ð �1‹u˜ŸŸÜ*¨4Ó3�Ø—n‘n RÓ(‘à‘ð ˆBØˆCàˆØ�‹8Ø‰G‰BØ�&‹[Ø�#‰IˆBÜ—’˜T 1Ó%‰BØÐ$Ó$Ø�#‰IˆBÜ—’˜T 1Ó%‰BäÐ4Ó5Ð5à�h‰h˜Ÿ™ A uÓ-¨r¯{©{¸1¸eÓ/DÀbÈ"ÈcÐRÓSˆØ�YÓØ×Ñ×5Ò5¸Ñ:Õ5à�>�>Ü% f°3¸4Ó@ˆKØ�O‰O˜K¨¸xÔNð 	�‰�c˜4Õ*ùòA Ps   ÁJc                 óæ   • U R                   [        R                  :w  a  gU(       a<  [        U5      nUS:”  a  [	        SR                  U5      5      eU R                  SUS9  gU R                  SS9  g)zM
Implements :func:`autobahn.websocket.interfaces.IWebSocketChannel.sendPing`
Nr  z@invalid payload for PING (payload length must be <= 125, was {})r  ©r}   r  ©r}   ©r/  r"   r0  r?   rX  r5   r[  ©rT   r  r4  s      r9   ÚsendPingÚWebSocketProtocol.sendPing‚  sc   € ð �:‰:Ô*×5Ñ5Ó5ØÞÜ�G“ˆAØ�3‹wÜÐ b× iÑ iÐjkÓ lÓmÐmØ�N‰N !¨WˆNÒ5à�N‰N !ˆNÒ$rL   c                 óÞ  • U R                   R                  S5        S U l        [        R                  " 5       U l        U =R                  S-  sl        SR                  [        R                  " SU R
                  5      [        R                  " SU R                  5      [        R                  " U R                  S-
  5      /5      U l        U R                  U R                  5        U R                  (       ax  U R                   R                  SU R                  [!        U R                  5      S9  U R"                  R$                  R'                  U R                  U R(                  5      U l        g g )	Nz+Auto ping/pong: sending ping auto-ping/pongr†   rL   r>  r?  r»   z@Expecting pong in {seconds} seconds for auto-ping ({size} bytes))Úsecondsrn  )rö   r÷   r­  rA  rB  r¯  r®  r"  r  rO  ÚosÚurandomrÔ   r¬  rb  rÓ   r?   rP  r°  rS  r{  rz  rS   s    r9   rD  ÚWebSocketProtocol._sendAutoPing�  s  € à�‰�‰ÐDÔEà#'ˆÔ ä#'§<¢<£>ˆÔ Ø×Ò 1Ñ$ÕØ"Ÿx™x¬¯ª°T¸4×;SÑ;SÓ)TÜ)/¯ª°T¸4×;RÑ;RÓ)SÜ)+¯ª°D×4EÑ4EÈÑ4JÓ)Kð)Mó  NˆÔð 	�‰�d×*Ñ*Ô+à××Ø�H‰H�N‰NØRØ×,Ñ,Ü˜×-Ñ-Ó.ð ñ ð
 (,§|¡|×'BÑ'B×'MÑ'MØ×$Ñ$Ø×&Ñ&ó(ˆDÕ$ð  rL   c                 óÆ  • U R                   R                  S5        U R                  R                  5         SU l        SU l        U R
                  (       a!  U R
                  R                  5         SU l        U R                  (       a[  U R                   R                  S5        U R                  R                  R                  U R                  U R                  5      U l        gg)zÁ
When data is received from client, use it in leu of timely PONG response - cancel pending timeout call
that will drop connection. See https://github.com/crossbario/autobahn-python/issues/1327
z3Cancelling autoPingTimeoutCall due to incoming dataNzScheduling auto-ping/pong)rö   r÷   rz  rO  r¬  r­  rÒ   rP  r°  rS  rD  rS   s    r9   r9  Ú,WebSocketProtocol._cancelAutoPingTimeoutCall©  sª   € ð
 	�‰�‰ÐLÔMØ× Ñ ×'Ñ'Ô)Ø#'ˆÔ à#ˆÔà×#×#Ø×$Ñ$×+Ñ+Ô-Ø'+ˆDÔ$ð × × Ø�H‰H�N‰NÐ6Ô7Ø'+§|¡|×'BÑ'B×'MÑ'MØ×%Ñ%Ø×"Ñ"ó(ˆDÕ$ð !rL   c                 óæ   • U R                   [        R                  :w  a  gU(       a<  [        U5      nUS:”  a  [	        SR                  U5      5      eU R                  SUS9  gU R                  SS9  g)zM
Implements :func:`autobahn.websocket.interfaces.IWebSocketChannel.sendPong`
Nr  z@invalid payload for PONG (payload length must be <= 125, was {})r¤   r^  r_  r`  ra  s      r9   r1  ÚWebSocketProtocol.sendPongÀ  sc   € ð �:‰:Ô*×5Ñ5Ó5ØÞÜ�G“ˆAØ�3‹wÜÐ b× iÑ iÐjkÓ lÓmÐmØ�N‰N "¨gˆNÒ6à�N‰N "ˆNÒ%rL   c                 ó:  • U R                   [        R                  :X  a  U R                  R	                  S5        gU R                   [        R
                  :X  a  U R                  R	                  S5        gU R                   [        R                  [        R                  4;   a  [        S5      eU R                   [        R                  :X  aÆ  SnUb  U[        R                  " SU5      -  nUb  XB-  nU R                  SUS9  [        R                  U l         U(       + U l        Xl        X l        U R                  (       aQ  U R                   S	:”  a@  U R"                  R$                  R'                  U R                   U R(                  5      U l        ggg[        S
5      e)zš
Send a close frame and update protocol state. Note, that this is
an internal method which deliberately allows not send close
frame with invalid payload.
z3ignoring sendCloseFrame since connection is closingz7ignoring sendCloseFrame since connection already closedz+cannot close a connection not yet connectedrL   Nr  r¥   r^  r   rE  )r/  r"   rM  rö   r÷   rW  re  rd  rX  r0  r  rO  r[  r¨  rª  r«  rÐ   rP  r°  rS  rk  rN  )rT   r9  rD  rA  r  s        r9   rV  Ú WebSocketProtocol.sendCloseFrameÎ  sJ  € ð �:‰:Ô*×8Ñ8Ó8Ø�H‰H�N‰NÐPÕQà�Z‰ZÔ,×9Ñ9Ó9Ø�H‰H�N‰NÐTÕUà�Z‰ZÔ-×DÑDÔFW×FhÑFhÐiÓiÜÐIÓJÐJà�Z‰ZÔ,×7Ñ7Ó7ð ˆGØÑØœ6Ÿ;š; t¨TÓ2Ñ2�ØÑ%ØÑ%�Ø�N‰N !¨WˆNÑ5ô +×8Ñ8ˆDŒJØ")œkˆDŒOð #'ÔØ$.Ô!ð �� 4×#=Ñ#=ÀÓ#AØ15·±×1LÑ1L×1WÑ1WØ×.Ñ.Ø×0Ñ0ó2�Õ.ð $Bˆô ˜MÓ*Ð*rL   c                 ó   • Ube  [        U5      [        :w  a#  [        SR                  [        U5      5      5      eUS:w  a)  SUs=::  a  S::  d  O  [        SR                  U5      5      eUbQ  Uc  [        S5      e[        U5      [        :w  a#  [        SR                  [        U5      5      5      e[        US	5      nOSnU R                  XS
S9  g)zN
Implements :func:`autobahn.websocket.interfaces.IWebSocketChannel.sendClose`
Nz5invalid type '{}' for close code (must be an integer)rÄ   i¸  i‡  z9invalid close code {} (must be 1000 or from [3000, 4999])zclose reason without close codez)reason must be of type unicode (was '{}')rB  FrC  )ÚtyperC  rX  r5   Ústrr   rV  )rT   r9  r:  rD  s       r9   Ú	sendCloseÚWebSocketProtocol.sendCloseù  sÆ   € ð ÑÜ�D‹zœSÓ ÜÐ W× ^Ñ ^Ô_cÐdhÓ_iÓ jÓkÐkð �t‹| T¨TÕ%9°TÕ%9ÜÐ [× bÑ bÐcgÓ hÓiÐiàÑØ‰|ÜÐ AÓBÐBä�F‹|œsÓ"ÜÐ K× RÑ RÔSWÐX^ÓS_Ó `ÓaÐaä(¨°Ó5‰JàˆJà×Ñ ÀeÐÒLrL   c                 óÎ  • U R                   [        R                  :w  a  gU R                  [        R                  :w  a  [        S5      eU(       a  [        R                  O[        R                  U l        [        R                  U l        U R                  b)  U(       d"  SU l        U R                  R                  5         OSU l        U R                  =R                  S-  sl        g)zQ
Implements :func:`autobahn.websocket.interfaces.IWebSocketChannel.beginMessage`
Nz?WebSocketProtocol.beginMessage invalid in current sending stateTFr†   )r/  r"   r0  r¤  r£  rX  r+  r'  Úsend_message_opcodeÚSEND_STATE_MESSAGE_BEGINr   Úsend_compressedÚstart_compress_messager¡  r]   )rT   rþ   r÷  s      r9   ÚbeginMessageÚWebSocketProtocol.beginMessage  s«   € ð �:‰:Ô*×5Ñ5Ó5Øð �?‰?Ô/×AÑAÓAÜÐ]Ó^Ð^æLTÔ#4×#HÒ#HÔZk×Z}ÑZ}ˆÔ Ü+×DÑDˆŒð ×#Ñ#Ñ/¾Ø#'ˆDÔ Ø×$Ñ$×;Ñ;Õ=à#(ˆDÔ à×Ñ×3Ò3°qÑ8Ö3rL   c                 óÄ  • U R                   [        R                  :w  a  gU R                  [        R                  [        R
                  4;  a$  [        SR                  U R                  5      5      e[        U5      [        :w  d  US:  d  US:”  a  [        S5      eXl
        U R                  =R                  S-  sl        U R                  R                  (       d  U R                  (       d,  U R                  R                  (       aB  U R                   (       a1  ["        R$                  " S[&        R(                  " S5      5      U l        OSU l        U R*                  (       a3  US:”  a-  U R,                  (       a  [/        U R*                  U5      U l        O[3        5       U l        SnU R                  [        R                  :X  a=  X R4                  S	-  -  nU R6                  (       a  US
-  n[        R
                  U l        O SnU R*                  (       a  US	-  nU R*                  nOSnSnUS::  a  X1-  nOQUS::  a  US-  n["        R$                  " SU5      nO.US::  a  US-  n["        R$                  " SU5      nO[        S5      eSR9                  UR;                  SS5      UR;                  SS5      XT/5      nU R=                  U5        [        R>                  U l        g)zV
Implements :func:`autobahn.websocket.interfaces.IWebSocketChannel.beginMessageFrame`
NzIWebSocketProtocol.beginMessageFrame invalid in current sending state [{}]r   r	  z&invalid value for message frame lengthr†   rI  rJ  rÿ  é@   rL   r  rK  r  r  r  r  rL  rM  ) r/  r"   r0  r¤  rv  ÚSEND_STATE_INSIDE_MESSAGErX  r5   rp  rC  Úsend_message_frame_lengthr¡  r\   rP  rQ  rä   rÙ   r  rO  rP  rQ  Úsend_message_frame_maskrÉ   r   Úsend_message_frame_maskerr   ru  rw  r"  rR  rñ  ÚSEND_STATE_INSIDE_MESSAGE_FRAME)rT   r€   rU  rV  rW  rZ  Úheaders          r9   ÚbeginMessageFrameÚ#WebSocketProtocol.beginMessageFrame/  sQ  € ð �:‰:Ô*×5Ñ5Ó5Øð �?‰?Ô#4×#MÑ#MÔO`×OzÑOzÐ"{Ó{ÜÐg×nÑnÐos×o~Ño~Óó  Að  Aä�‹<œ3Ó &¨1£*°Ð9KÓ0KÜÐDÓEÐEà)/Ô&à×Ñ×1Ò1°QÑ6Õ1à—‘×%×%¨$×*?×*?ÀTÇ\Á\×EZ×EZÐ_c×_t×_tô ,2¯;ª;°t¼V×=OÒ=OÐPRÓ=SÓ+TˆDÕ(ð
 ,0ˆDÔ(ð ×'×'¨F°Q«J¸4¿>¿>Ü->¸t×?[Ñ?[Ð]cÓ-dˆDÕ*ä-:«_ˆDÔ*ð
 ˆØ�?‰?Ô/×HÑHÓHà×*Ñ*¨SÑ0Ñ0ˆBà×#×#Ø�lÑ"�ä/×IÑIˆD�Oàð ˆØ×'×'Ø�&‰LˆBØ×-Ñ-‰BàˆBàˆØ�S‹=Ø‰L‰BØ�vÓØ�#‰IˆBÜ—’˜T 6Ó*‰BØÐ)Ó)Ø�#‰IˆBÜ—’˜T 6Ó*‰BäÐ4Ó5Ð5ð —‘˜2Ÿ;™; q¨%Ó0°"·+±+¸aÀÓ2GÈÐPÓQˆà�‰�fÔô ,×KÑKˆ�rL   c                 óR  • U R                   [        R                  :w  a  gU R                  (       d(  U R                  =R
                  [        U5      -  sl        U R                  =R                  [        U5      -  sl        U R                  [        R                  :w  a  [        S5      e[        U5      nU R                  R                  5       U-   U R                  :”  a2  U R                  U R                  R                  5       -
  nX4-
  * nUSU nO.UnU R                  U R                  R                  5       -
  U-
  nUnU R                  R                  U5      nU R                  XrS9  U R                  R                  5       U R                  :¼  a  [        R                   U l        U$ )zY
Implements :func:`autobahn.websocket.interfaces.IWebSocketChannel.sendMessageFrameData`
NzGWebSocketProtocol.sendMessageFrameData invalid in current sending state)rÄ  )r/  r"   r0  rw  r¡  r[   r?   rZ   r¤  r�  rX  r€  r  r~  r  rñ  r}  )rT   r  rÄ  Úrlr4  r   rT  rY  s           r9   ÚsendMessageFrameDataÚ&WebSocketProtocol.sendMessageFrameData„  s`  € ð �:‰:Ô*×5Ñ5Ó5Øà×#×#Ø×Ñ×4Ò4¼¸G»ÑDÕ4Ø×Ñ×6Ò6¼#¸g»,ÑFÕ6à�?‰?Ô/×OÑOÓOÜÐeÓfÐfä�‹\ˆØ×)Ñ)×1Ñ1Ó3°bÑ8¸4×;YÑ;YÓYØ×.Ñ.°×1OÑ1O×1WÑ1WÓ1YÑYˆAØ‘V�9ˆDØ˜˜!�‰BàˆAØ×1Ñ1°D×4RÑ4R×4ZÑ4ZÓ4\Ñ\Ð_`Ñ`ˆDØˆBð ×,Ñ,×4Ñ4°RÓ8ˆð 	�‰�cˆÑ%ð ×)Ñ)×1Ñ1Ó3°t×7UÑ7UÓUÜ/×IÑIˆDŒOð ˆrL   c                 ó:  • U R                   [        R                  :w  a  gU R                  (       aC  U R                  R                  5       nU R                  =R                  [        U5      -  sl        OSnU R                  SUSS9  [        R                  U l        g)zO
Implements :func:`autobahn.websocket.interfaces.IWebSocketChannel.endMessage`
NrL   r   T)r}   r  r~   )r/  r"   r0  rw  r   Úend_compress_messager¡  rZ   r?   r[  r£  r¤  r  s     r9   Ú
endMessageÚWebSocketProtocol.endMessage¯  sz   € ð �:‰:Ô*×5Ñ5Ó5Øð ××Ø×.Ñ.×CÑCÓEˆGØ×Ñ×:Ò:¼cÀ'»lÑJÖ:ð ˆGØ�‰˜a¨°dˆÑ;ä+×=Ñ=ˆ�rL   c                 ó@  • U R                   [        R                  :w  a  gU R                  (       aC  U R                  =R
                  [        U5      -  sl        U R                  R                  U5      nU R                  [        U5      5        U R                  X5        g)zU
Implements :func:`autobahn.websocket.interfaces.IWebSocketChannel.sendMessageFrame`
N)r/  r"   r0  rw  r¡  r[   r?   r   Úcompress_message_datarƒ  r‡  )rT   r  rÄ  s      r9   ÚsendMessageFrameÚ"WebSocketProtocol.sendMessageFrameÅ  st   € ð �:‰:Ô*×5Ñ5Ó5Øà××Ø×Ñ×4Ò4¼¸G»ÑDÕ4Ø×.Ñ.×DÑDÀWÓMˆGà×Ñœs 7›|Ô,Ø×!Ñ! 'Õ0rL   c                 óª  • [        U5      [        :X  d   SR                  [        U5      5      5       e[        U5      [        :X  d   SR                  [        U5      5      5       eUb2  [        U5      [        :X  d   SR                  [        U5      5      5       e[        U5      [        :X  d   SR                  [        U5      5      5       e[        U5      [        :X  d   SR                  [        U5      5      5       eU R
                  [        R                  :w  a  [        S5      eU R                  (       a  U R                  R                  S5        U(       a  S	nOS
nU R                  =R                  S
-  sl        U R                  b½  U(       d¶  SnU R                  R                  5         U R                  =R                  [!        U5      -  sl        U R                  R#                  U5      nU R                  R%                  5       n	SR'                  X‰/5      n[!        U5      n
U R                  =R(                  U
-  sl        OKSn[!        U5      n
U R                  =R                  U
-  sl        U R                  =R(                  U
-  sl        SU R*                  s=:  a  U
:  aK  O  OHSU l        SR                  X R*                  5      nU R.                  R1                  U5        [3        U5      eUb  UnOU R4                  S:”  a  U R4                  nOSnUb  [!        U5      U::  a  U R7                  XaXG(       a  SOSS9  gUS
:  a  [9        SR                  U5      5      e[!        U5      nSnSnSnU(       dV  Xì-   nUU:”  a  SnUnU(       a   U R7                  XaUU XôU(       a  SOSS9  SnOU R7                  SXU XôS9  Xì-  nU(       d  MU  gg)zP
Implements :func:`autobahn.websocket.interfaces.IWebSocketChannel.sendMessage`
z,"payload" must have type bytes, but was "{}"z,"isBinary" must have type bool, but was "{}"Nz/"fragmentSize" must have type int, but was "{}"z("sync" must have type bool, but was "{}"z1"doNotCompress" must have type bool, but was "{}"z$Attempt to send on a closed protocolrù  rÂ   r†   TrL   Fr   zQtried to send WebSocket message with size {} exceeding payload limit of {} octetsrÃ   )r}   r  rÄ  r   z1payload fragment size must be at least 1 (was {}))r}   r  r~   rÄ  r   )r}   r  r~   rÄ  )rp  Úbytesr5   ÚboolrC  r/  r"   r0  r    r#  r    r¡  r]   r   rx  r[   r?   rŽ  rŠ  r"  rZ   rË   r  rö   r€  r   rÌ   r[  rX  )rT   r  rþ   ÚfragmentSizerÄ  r÷  r}   ÚsendCompressedÚpayload1Úpayload2r*  ÚemsgÚpfsrò  r’   ró  Úfirstrô  s                     r9   rù  ÚWebSocketProtocol.sendMessageÓ  sw  € ô �G‹}¤Ó%ÐkÐ'U×'\Ñ'\Ô]aÐbiÓ]jÓ'kÓkÐ%Ü�H‹~¤Ó%ÐlÐ'U×'\Ñ'\Ô]aÐbjÓ]kÓ'lÓlÐ%ØÑ#¤t¨LÓ'9¼SÓ'@ð  	OÐBs×BzÑBzÔ{ð  AMó  |Nó  COó  	OÐ@Ü�D‹zœTÓ!Ð`Ð#M×#TÑ#TÔUYÐZ^ÓU_Ó#`Ó`Ð!Ü�MÓ"¤dÓ*Ð{Ð,_×,fÑ,fÔgkÐlyÓgzÓ,{Ó{Ð*à�:‰:Ô*×5Ñ5Ó5ÜÐEÓFÐFà××Ø×Ñ×%Ñ% mÔ4ö Ø‰FàˆFà×Ñ×3Ò3°qÑ8Õ3ð ×#Ñ#Ñ/¾Ø!ˆNà×$Ñ$×;Ñ;Ô=à×Ñ×4Ò4¼¸G»ÑDÕ4à×/Ñ/×EÑEÀgÓNˆHØ×/Ñ/×DÑDÓFˆHØ—h‘h Ð3Ó4ˆGä˜g›,ˆKà×Ñ×:Ò:¸kÑIÖ:ð #ˆNÜ˜g›,ˆKØ×Ñ×4Ò4¸ÑCÕ4Ø×Ñ×:Ò:¸kÑIÕ:àˆt×)Ñ)Õ7¨KÖ7Ø48ˆDÔ1Øf×mÑmÐny÷  |Vñ  |Vó  WˆDØ�H‰H�M‰M˜$ÔÜ& tÓ,Ð,ð Ñ#Ø‰Cà×$Ñ$ qÓ(Ø×+Ñ+‘à�ð ‰;œ#˜g›,¨#Ó-Ø�N‰N &ÀÍ~É!ÐcdˆNÒeð
 �Q‹wÜÐ S× ZÑ ZÐ[^Ó _Ó`Ð`Ü�G“ˆAØˆAØˆDØˆEÞØ‘G�Ø�q“5Ø�DØ�AÞØ—N‘N¨&À!ÀA¸,ÈDÖftÑabÐz{�NÑ|Ø!‘Eà—N‘N¨!°W¸q°\Àt�NÑWØ‘�÷ ’drL   c                 ó,  • / nUR                  S5       Vs/ s H  n[        UR                  5       5      PM     nnU GHC  nUS:w  d  M  UR                  S5       Vs/ s H  oDR                  5       PM     nn[        U5      S:”  aú  US   R	                  5       n0 n	USS  HÇ  n
U
R                  S5       Vs/ s H  oDR                  5       PM     n
nU
S   R	                  5       n[        U
5      S:”  aV  SR                  U
SS 5      nU(       a:  [        U5      S:”  a  US   S:X  a  USS n[        U5      S:”  a  US	   S:X  a  USS	 nOS
nX¹;  a  / X›'   X›   R                  U5        MÉ     UR                  X‰45        GMC  GMF     U$ s  snf s  snf s  snf )z,
Parse the Sec-WebSocket-Extensions header.
Ú,Ú Ú;r   r†   NÚ=Ú"éÿÿÿÿT)Úsplitrq  rŠ   r?   r.   r"  r  )rT   r‚  ÚremoveQuotesÚ
extensionsÚxÚextsrì  ÚextÚ	extensionÚparamsÚpr“   r”   s                r9   Ú_parseExtensionsHeaderÚ(WebSocketProtocol._parseExtensionsHeader2	  ss  € ð ˆ
Ø(.¯©°SÔ(9Ó:Ò(9 1”�A—G‘G“I–Ñ(9ˆÐ:ÜˆAØ�B�wØ*+¯'©'°#¬,Ó7ª, Q—w‘w–y©,�Ð7Ü�s“8˜a“<Ø # A¡§¡£�IØ�FØ   ›W˜Ø01·±¸´Ó=²¨1ŸW™WžY±˜Ð=Ø ™dŸj™j›l˜Ü˜q›6 A›:Ø$'§H¡H¨Q¨q¨r¨U£O˜EÞ+Ü#& u£:°£>°e¸A±hÀ#³oØ,1°!°"¨I EÜ#& u£:°£>°e¸B±iÀ3Ó6FØ,1°#°2¨J Eøà$(˜EØÓ,Ø*,˜F™KØ™×*Ñ*¨5Ö1ñ %ð ×%Ñ% yÐ&9×:âñ/ ð0 Ðùò3 ;ùò 8ùò
 >s   –#FÁFÂ6F)5r%  r   rî   r¬  r­  r¯  r®  rz  rN  r¨  r$  r
  r  rŒ   r�  r  r  r  r  rë   rì   rª  r«  rü   rý   rû   rc  rF  rG  rw  r~  r  r€  ru  r¥  r¤  rU  r/  rÇ   r#  r¡  r¦  r(  r)  r§  r8  rj  r  r  r_  rf  r`  r©  )F)FN)rL   Tr   NNNFrQ   )NNF)NN©FF)FNFFr¸   )jrs   rt   ru   rv   r„   r~  ÚSUPPORTED_SPEC_VERSIONSÚSUPPORTED_PROTOCOL_VERSIONSÚSPEC_TO_PROTOCOL_VERSIONÚPROTOCOL_TO_SPEC_VERSIONÚDEFAULT_SPEC_VERSIONÚ	_WS_MAGICrë  r'  r+  rW  rd  rM  r0  re  r£  rv  r}  r�  rJ  ÚCLOSE_STATUS_CODE_GOING_AWAYr�  Ú"CLOSE_STATUS_CODE_UNSUPPORTED_DATAÚCLOSE_STATUS_CODE_RESERVED1ÚCLOSE_STATUS_CODE_NULLr¸  r“  Ú"CLOSE_STATUS_CODE_POLICY_VIOLATIONr‡  Ú%CLOSE_STATUS_CODE_MANDATORY_EXTENSIONÚ CLOSE_STATUS_CODE_INTERNAL_ERRORÚ!CLOSE_STATUS_CODE_SERVICE_RESTARTÚ!CLOSE_STATUS_CODE_TRY_AGAIN_LATERÚCLOSE_STATUS_CODE_UNASSIGNED1Ú&CLOSE_STATUS_CODE_TLS_HANDSHAKE_FAILEDrH  ÚCONFIG_ATTRS_COMMONÚCONFIG_ATTRS_SERVERÚCONFIG_ATTRS_CLIENTrU   Úpropertyr   r   rò   rø   rÿ   r  r  r  r  r'  r  r2  r5  r;  r\  rT  rg  rk  rw  r{  rR  r  r†  rI  rL  r˜  r´  r»  rÁ  rÅ  rÍ  rÓ  r×  rÖ  rÛ  rÜ  rå  rä  rñ  rü  rÚ  r  r  r  r7  r[  rb  rD  r9  r1  rV  rr  ry  rƒ  r‡  r‹  r�  rù  r¬  rw   rx   rL   r9   r"   r"   j  sO  † ñð €DâBÐðð $% b 'Ððð %&¨1°!¸ÀÈÐQSÐY[ÐacÑdÐðð $&¨2™Ððð
 Ððð
 8€Iðð
 "Ððð Ððð Ððð €LØÐØ€MØ€JØÐð ÐØ ÐØ !ÐØ&'Ð#ð
  $ÐØ%à#'Ð Øà'+Ð$Øà)-Ð&Øà"&ÐØà!ÐØUà'+Ð$Ø_à(,Ð%Ø%à)-Ð&Øà(,Ð%Øà,0Ð)Øà'+Ð$ØIà(,Ð%Øà(,Ð%Øà$(Ð!Øà-1Ð*ð Gà":Ø">Ø"BØ"DØ"CØ"DØ"CØ"GØ"BØ"CØ"Cð
"EÐð 1ò:Ðð"ò1Ððò:ÐðòQð ð' 8Ð,<Ñ#=ó 'ó ð'ò3ò+ò`ò&0ò ò.ò!ò0
ò	#ò
ò	
òa+òFpò +ò.iò cò(ôuò0/ð %AÈô \ò6ò(ò,+òtòl2[òj	
ò

ò
ò$
ò*ò(-òT\òXòò#ô>'2òRFòm&ò^'AòR%.òN*"òXIðZ ØØØØ"ØØô]+ô~%òò2ô.&ô)+ôVMô:9ò2SLôj)òV>ô,1ð  #Ø!%ØØ"'ô]÷~rL   r"   c                   ó   • \ rS rSrSrS rSrg)ÚPreparedMessageiX	  z¡
Encapsulates a prepared message to be sent later once or multiple
times on one or more WebSocket connections.
This can be used for optimizing Broadcast/PubSub.
c                 óN  • U(       d  Xl         X l        X@l        [        U5      nU(       a  SOSnU(       aQ  Sn[        R
                  " S[        R                  " S5      5      nUS:X  a  Un	O![        X…5      R                  U5      n	OSnSnUn	Sn
US::  a  Xu-  nOQUS	::  a  US
-  n[        R
                  " SU5      n
O.US::  a  US-  n[        R
                  " SU5      n
O[        S5      eSR                  UR                  SS5      UR                  SS5      X¨U	/5      U l        g)aH  
Ctor for a prepared message.

:param payload: The message payload.
:type payload: str
:param isBinary: Provide `True` for binary payload.
:type isBinary: bool
:param applyMask: Provide `True` if WebSocket message is to be masked (required for client to server WebSocket messages).
:type applyMask: bool
:param doNotCompress: Iff `True`, never compress this message. This
    only applies when WebSocket compression has been negotiated on the
    WebSocket connection. Use when you know the payload incompressible
    (e.g. encrypted or already compressed).
:type doNotCompress: bool
é‚   é�   rÿ  rI  rJ  r   rL   r  rK  r  r  r	  r  r  rL  r†   rM  N)r  rú  r÷  r?   r  rO  rP  rQ  r   r  rX  r"  rR  rø  )rT   r  rþ   rÉ   r÷  r4  rU  rV  r�   rY  rZ  s              r9   rU   ÚPreparedMessage.__init___	  s  € ö  ð #ŒLØ"ŒKØ*Ôä�‹Lˆö  (‰l¨lˆö ØˆBä—;’;˜t¤V×%7Ò%7¸Ó%;Ó<ˆDØ�A‹vØ‘ä'¨Ó0×8Ñ8¸ÓA‘àˆBØˆDØˆCð ˆØ�‹8Ø‰G‰BØ�&‹[Ø�#‰IˆBÜ—’˜T 1Ó%‰BØÐ$Ó$Ø�#‰IˆBÜ—’˜T 1Ó%‰BäÐ4Ó5Ð5ð Ÿ8™8 R§[¡[°°EÓ%:¸B¿K¹KÈÈ5Ó<QÐSUÐ]`Ð$aÓbˆÕrL   )rú  r÷  r  rø  Nrƒ   rx   rL   r9   rÅ  rÅ  X	  s   † ñõ=crL   rÅ  c                   ó"   • \ rS rSrSrSS jrSrg)r#   iŸ	  zˆ
Mixin for
:class:`autobahn.websocket.protocol.WebSocketClientFactory` and
:class:`autobahn.websocket.protocol.WebSocketServerFactory`.
c                 ó<   • U R                   (       + n[        XXC5      $ )a”  
Prepare a WebSocket message. This can be later sent on multiple
instances of :class:`autobahn.websocket.WebSocketProtocol` using
:meth:`autobahn.websocket.WebSocketProtocol.sendPreparedMessage`.

By doing so, you can avoid the (small) overhead of framing the
*same* payload into WebSocket messages multiple times when that
same payload is to be sent out on multiple connections.

:param payload: The message payload.
:type payload: bytes
:param isBinary: `True` iff payload is binary, else the payload must be
    UTF-8 encoded text.
:type isBinary: bool
:param doNotCompress: Iff `True`, never compress this message. This
    only applies when WebSocket compression has been negotiated on the
    WebSocket connection. Use when you know the payload incompressible
    (e.g. encrypted or already compressed).
:type doNotCompress: bool

:returns: An instance of :class:`autobahn.websocket.protocol.PreparedMessage`.
)rQ  rÅ  )rT   r  rþ   r÷  rÉ   s        r9   ÚprepareMessageÚWebSocketFactory.prepareMessage¦	  s   € ð. Ÿ™Ô%ˆ	Ü˜w°)ÓKÐKrL   rx   Nr®  )rs   rt   ru   rv   r„   rÌ  rw   rx   rL   r9   r#   r#   Ÿ	  s   † ñ÷LrL   r#   a1  <!DOCTYPE html>
<html>
   <head>
      {}
      <style>
         body {{
            color: #fff;
            background-color: #027eae;
            font-family: "Segoe UI", "Lucida Grande", "Helvetica Neue", Helvetica, Arial, sans-serif;
            font-size: 16px;
         }}

         a, a:visited, a:hover {{
            color: #fff;
         }}
      </style>
   </head>
   <body>
      <h1>AutobahnPython {}</h1>
      <p>
         I am not Web server, but a <b>WebSocket Endpoint</b>.
      </p>
      <p>
         You can talk to me using the <a href="http://tools.ietf.org/html/rfc6455">WebSocket</a> protocol.
      </p>
      <p>
         For more information, please see:
         <ul>
            <li><a href="http://crossbar.io/autobahn">Autobahn</a></li>
         </ul>
      </p>
   </body>
</html>
c            
       óÎ   • \ rS rSrSr\R                  \R                  -   rS\	S\
\\   \\\   \\\4   4   4   4S jrS rS rS rS	 rS
 rSS jrSS jrS rS rSS jrSrg)r$   iå	  z,
Protocol base class for WebSocket servers.
Úrequestrð   c                 ó`   • U R                   R                  S[        U R                  5      US9  g)aõ  
Callback fired during WebSocket opening handshake when new WebSocket client
connection is about to be established.

When you want to accept the connection, return the accepted protocol
from list of WebSocket (sub)protocols provided by client or `None` to
speak no specific one or when the client protocol list was empty.

You may also return a pair of `(protocol, headers)` to send additional
HTTP headers, with `headers` being a dictionary of key-values.

Throw :class:`autobahn.websocket.types.ConnectionDeny` when you don't want
to accept the WebSocket connection request.

:param request: WebSocket connection request information.

:returns: You may return one of: ``None``: the connection is accepted with no specific WebSocket subprotocol,
    ``str``: the connection is accepted with the returned name as the WebSocket subprotocol, or
    ``(str, dict)``: a pair of subprotocol accepted and HTTP headers to send to the client.
    You can also return a Deferred/Future that resolves/rejects to the above.
z{func}: request={request})rï  rÏ  N)rö   r÷   r   Ú	onConnect©rT   rÏ  s     r9   rÑ  Ú!WebSocketServerProtocol.onConnectì	  s(   € ð, 	�‰�‰Ð2¼ÀÇÁÓ9OÐY`ˆÑaØrL   c                 óÜ   • U R                   R                  S[        U R                  5      U R                  S9  [
        R                  U 5        U R                  =R                  S-  sl        g)a	  
Called by network framework when new transport connection from client was
accepted. Default implementation will prepare for initial WebSocket opening
handshake. When overriding in derived class, make sure to call this base class
implementation *before* your code.
ú,{func}: connection accepted from peer {peer}©rï  r~  r†   N)rö   r÷   r   r´  r~  r"   rP  ÚcountConnectionsrS   s    r9   r´  Ú'WebSocketServerProtocol._connectionMade
  sT   € ð 	�‰�‰ÐEÜ" 4×#7Ñ#7Ó8¸t¿y¹yð 	ñ 	Jä×)Ñ)¨$Ô/Ø�‰×%Ò%¨Ñ*Ö%rL   c                 óð   • U R                   R                  S[        U R                  5      U R                  [        U5      S9  [        R                  X5        U R                  =R                  S-  sl        g)zù
Called by network framework when established transport connection from client
was lost. Default implementation will tear down all state properly.
When overriding in derived class, make sure to call this base class
implementation *after* your code.
ú7{func}: connection lost to peer {peer}: reason={reason}©rï  r~  r:  r†   N)	rö   r÷   r   r»  r~  r   r"   rP  r×  r�  s     r9   r»  Ú'WebSocketServerProtocol._connectionLost
  s]   € ð 	�‰�‰ÐPÜ" 4×#7Ñ#7Ó8¸t¿y¹yÔQVÐW]ÓQ^ð 	ñ 	`ä×)Ñ)¨$Ô7Ø�‰×%Ò%¨Ñ*Ö%rL   c                 ó   • [        S5      e)NzAutobahn isn't a proxy serverrß  rS   s    r9   rÛ  Ú+WebSocketServerProtocol.processProxyConnect
  s   € ÜÐ7Ó8Ð8rL   c                 ój  ^ • T R                   R                  S5      nUS:¼  Gab  T R                  R                  S[	        T R
                  5      [        U5      S9  T R                   SUS-    T l        T R                  R                  ST R                  S9   [        T R                  5      u  T l	        T l
        nS
T R                  ;   af  T R                  (       aU  T R                  S
   R                  S5       Vs/ s H  oDR!                  5       PM     nnUT R                  * S nUS   T l        T R                  R                  ST R                  S9  T R                  R                  ST R                  S9  T R                  R                  5       n[%        U5      S:w  a*  T R                  SR                  T R                  5      5      $ US   R!                  5       S:w  a$  T R                  SR                  US   5      S5      $ US   R!                  5       R                  S5      n[%        U5      S:w  d  US   S:w  d	  US   S;  a$  T R                  SR                  US   5      S5      $ US   R!                  5       T l         [(        R*                  " T R&                  5      u  pšp¼pÞU	S:w  d  U
S:w  a   US:w  a   T R                  SR                  U5      5      $ UT l        [(        R.                  " U5      T l        ST R                  ;  a  T R                  S 5      $ US   S:”  a  T R                  S!5      $ T R                  S   R!                  5       T l        T R2                  R                  S"5      S:¼  Ga  T R2                  R5                  S#5      (       dã  T R2                  R7                  S"S5      u  nn [9        [;        UR!                  5       5      5      nT R>                  R@                  (       ad  UT R>                  R@                  :w  aI  T R                  S%R                  U[;        T R2                  5      T R>                  R@                  5      5      $ OT R                  R                  S&5        UT l        S'T R                  ;  Gaˆ  T RB                  (       Gad  S(T R0                  ;   Ga  [%        T R0                  S(   5      S:”  aü  [D        RF                  RI                  T R0                  S(   S   5      nURK                  5       RM                  5       RO                  5       nS)T R0                  ;   ae  [%        T R0                  S)   5      S:”  aI  [9        T R0                  S)   S   5      nT R                  R                  S*UUS+9  T RQ                  UU5        OWT R                  R                  S,US-9  T RS                  U5        O+T R                  R                  S.5        T RQ                  5         T RU                  S/S09  gT R                  S1S25      $ S/nT R                  S'   R                  S5       H)  nUR!                  5       RW                  5       S3:X  d  M'  S4n  O   U(       d-  T R                  S5R                  T R                  S'   5      5      $ S6T R                  ;  a  T R                  S75      $ S/nT R                  S6   R                  S5       H)  nUR!                  5       RW                  5       S':X  d  M'  S4n  O   U(       d-  T R                  S8R                  T R                  S6   5      5      $ S9T R                  ;  a,  T R                  R                  S:5        T R                  S;5      $ T R                  R                  S<5        US9   S:”  a  T R                  S=5      $  [9        T R                  S9   5      nUT RX                  ;  av  [[        T RX                  5      nUR]                  5         SR_                  U Vs/ s H  n[;        U5      PM     sn5      nT R                  S?R                  UU5      S@SAU4/5      $ UT l0        SBT R                  ;   a…  T R                  SB   R                  S5       Vs/ s H  n[;        UR!                  5       5      PM     nn0 nU H0  nUU;   a"  T R                  SCR                  U5      5      s  $ SUU'   M2     UT l1        O/ T l1        T R`                  SD:  a  SEnOSFnST l2        UT R                  ;   aU  UU   S:”  a  T R                  SG5      $ T R                  U   R!                  5       T l2         [g        T Rd                  5      nS4nOS/nU(       a»  WSI:X  a  T R>                  Rh                  (       a  S4n Of[k        UT R>                  Rl                  (       a  SJOSKT R>                  R@                  =(       d    T R>                  Rn                  T Rp                  5      n U (       d*  T R                  SLR                  T Rd                  5      5      $ SMT R                  ;  a  T R                  SN5      $ USM   S:”  a  T R                  SO5      $ T R                  SM   R!                  5       n![%        U!5      SP:w  a   T R                  SQR                  U!5      5      $ U!SRS SS:w  a   T R                  STR                  U!5      5      $ U!SSR  H,  nUSU;  d  M  T R                  SVR                  UU!5      5      s  $    / T l9        SWT R                  ;   a=  USW   S:”  a  T R                  SX5      $ T Ru                  T R                  SW   5      T l9        T R                   US-   S T l         U!T l;        T Rx                  S:”  a5  T R>                  Rz                  T Rx                  :”  a  T R                  SYSZS[9  g[}        T R"                  T R                  T R2                  T R,                  T R0                  T R`                  T Rd                  T Rb                  T Rr                  5	      n"[~        R€                  " T R‚                  U"5      n#U 4S\ jn$[~        R„                  " U#T R†                  U$5        gT Rˆ                  (       aÐ  T R                   R                  S]5      n%U%S:¼  a®  T R                  R                  S^5        T Rˆ                  (       af  T R                  R                  S_T RŠ                  S`9  T R�                  T RŠ                  R�                  Sa5      5        S4T lH        T RU                  5         gT R                  R                  Sb5        ggg! [         a*  nT R                  S	R                  U5      5      s SnA$ SnAff = fs  snf !   T R                  SR                  US   R!                  5       5      5      s $ = f! [<         aN    T R                  S$R                  [;        UR!                  5       5      [;        T R2                  5      5      5      s $ f = f! [<         a0    T R                  S>R                  T R                  S9   5      5      s $ f = fs  snf s  snf ! [<         a*  nT R                  SHR                  U5      5      s SnA$ SnAff = f)cz:
Process WebSocket opening handshake request from client.
ó   

r   z?{func} found end of HTTP request header at byte {end_of_header})rï  Úend_of_headerNrÃ   z received HTTP request:

{data}

)rŒ   z@Error during parsing of HTTP status line / request headers : {0}zx-forwarded-forr�  ú9received HTTP status line in opening handshake : {status}©Ústatusú6received HTTP headers in opening handshake : {headers}©Úheadersr<   z!Bad HTTP request status line "{}"ÚGETzHTTP method "{}" not allowedi•  rÂ   Ú/ÚHTTPr†   )z1.1úUnsupported HTTP version "{}"iù  rž  z;HTTP requested resource contains a fragment identifier "{}"z0Bad HTTP request resource - could not parse "{}"r8   z5HTTP Host header missing in opening handshake requestzDHTTP Host header appears more than once in opening handshake requestr‡   Ú]z*invalid port "{}" in HTTP Host header "{}"zHport {} in HTTP Host header "{}" does not match server listening port {}zOskipping opening handshake port checking - neither WS URL nor external port setÚupgradeÚredirectÚafterzvHTTP Upgrade header missing : render server status page and meta-refresh-redirecting to {url} after {duration} seconds)r6   Údurationz6HTTP Upgrade header missing : 303-redirecting to {url})r6   z7HTTP Upgrade header missing : render server status pageFr?  úHTTP Upgrade header missingiª  Ú	websocketTzNHTTP Upgrade headers do not include "websocket" value (case-insensitive): "{}"Ú
connectionúHTTP Connection header missingzOHTTP Connection headers do not include "upgrade" value (case-insensitive): "{}"zsec-websocket-versionzHixie76 protocol detectedz=WebSocket connection denied - Hixie76 protocol not supported.zHybi protocol detectedzUHTTP Sec-WebSocket-Version header appears more than once in opening handshake requestzScould not parse HTTP Sec-WebSocket-Version header "{}" in opening handshake requestz;WebSocket version {} not supported (supported versions: {})é�  zSec-WebSocket-Versionúsec-websocket-protocolzGduplicate protocol "{}" specified in HTTP Sec-WebSocket-Protocol headerr¼   zsec-websocket-originÚoriginzFHTTP Origin header appears more than once in opening handshake requestzHTTP Origin header invalid: {}r)   r,   r-   z5WebSocket connection denied: origin '{0}' not allowedzsec-websocket-keyz%HTTP Sec-WebSocket-Key header missingzQHTTP Sec-WebSocket-Key header appears more than once in opening handshake requesté   z:bad Sec-WebSocket-Key (length must be 24 ASCII chars) "{}"éþÿÿÿz==z4bad Sec-WebSocket-Key (invalid base64 encoding) "{}"z@abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/zFbad character "{}" in Sec-WebSocket-Key (invalid base64 encoding) "{}"úsec-websocket-extensionszXHTTP Sec-WebSocket-Extensions header appears more than once in opening handshake requestz%maximum number of connections reachedi÷  )r9  c                 óº  >• [        U R                  [        5      (       a;  TR                  U R                  R                  U R                  R
                  5        g TR                  R                  SU S9  TR                  R                  S[        R                  " U 5      S9  TR                  SR                  U R                  5      [        R                  5      $ )Nz1Unexpected exception in onConnect ['{err.value}'])Úerrz{tb})ÚtbzInternal server error: {})r=   r”   r   ÚfailHandshaker:  r9  rö   r€  ré   Úfailure_format_tracebackr5   ÚINTERNAL_SERVER_ERROR)rü  rT   s    €r9   Úforward_errorÚ?WebSocketServerProtocol.processHandshake.<locals>.forward_error_  s©   ø€ Ü! #§)¡)¬^×<Ñ<à×*Ñ*¨3¯9©9×+;Ñ+;¸S¿Y¹Y¿^¹^ÕLð Ÿ™Ÿ™Ð&YÐ_b˜ÑcØŸ™Ÿ™ f´×1OÒ1OÐPSÓ1T˜ÑUØ#×1Ñ1Ð2M×2TÑ2TÐUX×U^ÑU^Ó2_Ôao÷  bFñ  bFó   Gð  GrL   s   <policy-file-request/> z)received Flash Socket Policy File requestz+sending Flash Socket Policy File :
{policy})Úpolicyr>  zëNo Flash Policy File served. You might want to serve a Flask Socket Policy file on the destination port since you received a request for it. See WebSocketServerFactory.serveFlashSocketPolicy and WebSocketServerFactory.flashSocketPolicy)IrŒ   r‹   rö   r÷   r   rÜ  r   Úhttp_request_datar•   rŽ   r�   rX  rþ  r5   rá   r£  rŠ   r~  r?   Úhttp_request_urir	   ÚurlparseÚhttp_request_pathÚparse_qsÚhttp_request_paramsÚhttp_request_hostÚendswithÚrsplitrC  rq  r4   rP  ÚexternalPortr×   Ú	hyperlinkÚURLÚ	from_textÚto_uriÚ	normalizeÚto_textÚsendServerStatusÚsendRedirectrR  r.   rÖ   ÚsortedÚreverser"  r  Úwebsocket_protocolsrA   r:   rß   rK   ÚisSecurer2   rÞ   Úwebsocket_extensionsr¬  Ú_wskeyrà   r×  r   ré   Ú	as_futurerÑ  r&  ÚsucceedHandshakerÛ   rÜ   rñ  Úencoder©  )&rT   rá  r�   rì  r¦  Ú	addressesÚtrusted_addressesr†  Úvsr0   ÚnetlocÚpathrª  ÚqueryÚfragmentr‘   r«  r2   r6   rï  ÚupgradeWebSocketrZ  ÚconnectionUpgradeÚcrâ   ÚsvÚsvsÚ	protocolsÚppÚwebsocket_origin_header_keyÚorigin_tupleÚhave_originÚorigin_is_allowedr“   rÏ  r   r  Úflash_policy_file_requests&   `                                     r9   rÜ  Ú(WebSocketServerProtocol.processHandshake 
  s@  ø€ ð Ÿ	™	Ÿ™Ð':Ó;ˆØ˜AÔØ�H‰H�N‰NÐ\Ü & t×'<Ñ'<Ó =ÌUÐS`ÓMað ñ cð &*§Y¡YÐ/A°ÀÑ0AÐ%BˆDÔ"Ø�H‰H�N‰NØ6Ø×+Ñ+ð ñ ðxÜM\Ð]a×]sÑ]sÓMtÑJ�Ô% tÔ'8Ð:Jð ! D×$5Ñ$5Ó5¸$×:Q×:QØ04×0AÑ0AÐBSÑ0T×0ZÑ0ZÐ[^Ô0_Ó`Ò0_¨1ŸW™WžYÑ0_�	Ð`Ø$-¨t×/FÑ/FÐ.FÐ.GÐ$HÐ!Ø-¨aÑ0�”	ð �H‰H�N‰NØKØ×,Ñ,ð ñ ð �H‰H�N‰NØHØ×)Ñ)ð ñ ð ×&Ñ&×,Ñ,Ó.ˆBÜ�2‹w˜!‹|Ø×)Ñ)Ð*M×*TÑ*TÐUY×UjÑUjÓ*kÓlÐlØ�!‰u�{‰{‹} Ó%Ø×)Ñ)Ð*H×*OÑ*OÐPRÐSTÑPUÓ*VÐX[Ó\Ð\Ø�A‘—‘“×$Ñ$ SÓ)ˆBÜ�2‹w˜!‹|˜r !™u¨›°"°Q±%¸wÓ2FØ×)Ñ)Ð*I×*PÑ*PÐQSÐTUÑQVÓ*WÐY\Ó]Ð]ð %' q¡E§K¡K£MˆDÔ!ðtÜBGÇ.Â.ÐQU×QfÑQfÓBgÑ?� ¨uð ˜R“< 6¨R£<Øð ˜r“>Ø×-Ñ-Ð.k×.rÑ.rÐs{Ó.|Ó}Ð}ð *.�Ô&Ü+0¯>ª>¸%Ó+@�Ô(ð ˜T×.Ñ.Ó.Ø×)Ñ)Ð*aÓbÐbà Ñ'¨!Ó+Ø×)Ñ)Ð*pÓqÐqà%)×%6Ñ%6°vÑ%>×%DÑ%DÓ%FˆDÔ"à×%Ñ%×*Ñ*¨3Ó/°1Ô4¸T×=SÑ=S×=\Ñ=\Ð]`×=aÑ=aØ×/Ñ/×6Ñ6°s¸AÓ>‘��Að@Üœs 1§7¡7£9›~Ó.�Dð —<‘<×,×,Ø˜tŸ|™|×8Ñ8Ó8Ø#×1Ñ1Ð2|÷  3Dñ  3Dð  EIô  KNð  OS÷  Oeñ  Oeó  Kfð  hl÷  htñ  ht÷  hAñ  hAó  3Bó   Cð  Cð 9ð —H‘H—N‘NÐ#tÔuà)*�Ô&ð  × 1Ñ 1Ô1ð —>—>�>Ø! T×%=Ñ%=Ô=Ä#Àd×F^ÑF^Ð_iÑFjÓBkÐnoÓBoô  (Ÿm™m×5Ñ5°d×6NÑ6NÈzÑ6ZÐ[\Ñ6]Ó^˜Ø!Ÿj™j›l×4Ñ4Ó6×>Ñ>Ó@˜Ø" d×&>Ñ&>Ó>Ä3Àt×G_ÑG_Ð`gÑGhÓCiÐlmÓCmÜ$'¨×(@Ñ(@ÀÑ(IÈ!Ñ(LÓ$M˜EØ ŸH™HŸN™Nð!]à$'Ø).ð	 +ñ ð !×1Ñ1°#°uÕ=à ŸH™HŸN™NØ XØ$'ð +ñ ð !×-Ñ-¨cÕ2àŸ™Ÿ™Ð'`ÔaØ×-Ñ-Ô/Ø×'Ñ'¨eÐ'Ñ4Øà×-Ñ-Ð.KÈSÓQÐQØ$ÐØ×&Ñ& yÑ1×7Ñ7¸Ö<�Ø—7‘7“9—?‘?Ó$¨Õ3Ø'+Ð$Ùñ =ö $Ø×)Ñ)Ð*z÷  +Bñ  +Bð  CG÷  CTñ  CTð  U^ñ  C_ó  +`ó  að  að  4×#4Ñ#4Ó4Ø×)Ñ)Ð*JÓKÐKØ %ÐØ×&Ñ& |Ñ4×:Ñ:¸3Ö?�Ø—7‘7“9—?‘?Ó$¨	Õ1Ø(,Ð%Ùñ @ö %Ø×)Ñ)Ð*{÷  +Cñ  +Cð  DH÷  DUñ  DUð  Vbñ  Dcó  +dó  eð  eð '¨d×.?Ñ.?Ó?Ø—‘—‘Ð:Ô;Ø×)Ñ)Ð*iÓjÐjà—‘—‘Ð7Ô8Ø#Ð$;Ñ<¸qÓ@Ø×-Ñ-ð  /Fó  Gð  GðxÜ! $×"3Ñ"3Ð4KÑ"LÓM�Gð ˜dŸm™mÓ+ô ˜DŸM™MÓ*�Ø—
‘
”Ø—h‘h±Ó3²¨1¤ A¦±Ñ3Ó4�Ø×)Ñ)Ð*g×*nÑ*nÐovÐx{Ó*|Ø*-Ø,CÀSÐ+IÐ*JóLð Lð
 *1�Ô&ð (¨4×+<Ñ+<Ó<Ø59×5FÑ5FÐG_Ñ5`×5fÑ5fÐgjÔ5kÓlÒ5k°œS §¡£ž^Ñ5k�	Ðlà�Û"�AØ˜B“wØ#×1Ñ1Ð2{÷  3Cñ  3Cð  DEó  3Fó   Gò  Gà !˜˜1›ñ	 #ð ,5�Õ(à+-�Ô(ð
 ×%Ñ%¨Ó*à.DÑ+ð /7Ð+à$&ˆDÔ!Ø*¨d×.?Ñ.?Ó?Ø#Ð$?Ñ@À1ÓDØ×-Ñ-Ð.vÓwÐwØ(,×(9Ñ(9Ð:UÑ(V×(\Ñ(\Ó(^�Ô%ðÜ#1°$×2GÑ2GÓ#H�Lð
 #‘ð $�æØ 6Ó)¨d¯l©l×.J×.JØ(,Ñ%ä(7Ø$Ø#'§<¡<×#8×#8™¸fØŸ™×1Ñ1×F°T·\±\×5FÑ5FØ×3Ñ3ó	)Ð%ö )Ø×-Ñ-ð&ß&,¡f¨T×-BÑ-BÓ&Cóð ð #¨$×*;Ñ*;Ó;Ø×)Ñ)Ð*QÓRÐRØÐ 3Ñ4°qÓ8Ø×)Ñ)Ð*}Ó~Ð~Ø×#Ñ#Ð$7Ñ8×>Ñ>Ó@ˆCÜ�3‹x˜2‹~Ø×)Ñ)Ð*f×*mÑ*mÐnqÓ*rÓsÐsØ�2�3ˆx˜4ÓØ×)Ñ)Ð*`×*gÑ*gÐhkÓ*lÓmÐmØ˜˜"“X�ØÐ^Õ^Ø×-Ñ-Ð.v×.}Ñ.}Ð~ð  BEó  /Fó  Gò  Gñ ð )+ˆDÔ%Ø)¨T×->Ñ->Ó>Ø#Ð$>Ñ?À!ÓCØ×-Ñ-ð  /Ió  Jð  Jð 15×0KÑ0KÈD×L]ÑL]Ð^xÑLyÓ0z�DÔ-ð Ÿ	™	 -°!Ñ"3Ð"4Ð5ˆDŒIð
 ˆDŒKð ×"Ñ" QÓ&¨4¯<©<×+HÑ+HÈ4×K^ÑK^Ó+^ð ×"Ñ"Ð#JÐQTÐ"ÒUô
 ,¨D¯I©IØ,0×,=Ñ,=Ø,0×,BÑ,BØ,0×,BÑ,BØ,0×,DÑ,DØ,0×,BÑ,BØ,0×,AÑ,AØ,0×,DÑ,DØ,0×,EÑ,EóG�ô  —O’O D§N¡N°GÓ<�õGô ×#Ò# A t×'<Ñ'<¸mÕLà×(×(Ø(,¯	©	¯©Ð7TÓ(UÐ%Ø(¨AÓ-Ø—‘—‘ÐJÔKà×.×.Ø—H‘H—N‘NØFØ#×5Ñ5ð #ñ ð
 —M‘M $×"8Ñ"8×"?Ñ"?ÀÓ"GÔHà;?�DÔ8à×'Ñ'Õ)à—H‘H—N‘NðCõð .ð )øôm	 ó xØ×)Ñ)Ð*l×*sÑ*sÐtuÓ*vÓwÕwûðxüò aøð\tØ×)Ñ)Ð*\×*cÑ*cÐdfÐghÑdi×doÑdoÓdqÓ*rÓsÒsûô  "ó @Ø×-Ñ-Ð.Z×.aÑ.aÔbeÐfg×fmÑfmÓfoÓbpÜbeÐfj×f|Ñf|Ób}ó/ó @ò @ð@ûôt "ó xØ×-Ñ-ð  /D÷  /Kñ  /Kð  LP÷  L]ñ  L]ð  ^uñ  Lvó  /wó  xò  xðxüò  4ùò møô< "ó Ø×-Ñ-Ø8×?Ñ?ÀÓBóõ ûðús†   Â#u( Ã;vÊAv$ Ë"v$ Î<"w Þ-x7 à	y4â#y9åy> õ(
võ2vövövö$3w÷Ax4ø3x4ø77y1ù0y1ù>
z2úz-ú'z2ú-z2c                 óB  • Sn0 n[        U5      [        :X  a)  [        U5      S:”  a  US   n[        U5      S:”  a  US   nOUnUb  X R                  ;  a  [	        S5      eX l        U R                  n/ U l        / n/ nU R                   Hu  u  pxU R                  R                  SUUS9  U[        ;   a1  [        U   n	 U	S   R                  U5      n
UR                  U
5        M[  U R                  R                  SUS	9  Mw     [        U5      S:”  a´  U R!                  U5      nUb†  [        UR"                     n	U	S
   R%                  U R&                  R(                  U5      U l        U R                  R                  U R*                  5        UR                  UR-                  5       5        OU R                  R                  SUS9  SnU R&                  R.                  (       a(  USR1                  U R&                  R.                  5      -  nUS-  nUS-  nU R&                  R2                  R5                  5       UR5                  5       4 H\  nU HS  n[7        US   [        45      (       a  US   /nO [9        US   5      nU H  nUSR1                  US   U5      -  nM     MU     M^     U R
                  b  USR1                  U R
                  5      -  n[<        R>                  " 5       nURA                  URC                  S5      [D        RF                  -   5        [H        RJ                  " URM                  5       5      nUSR1                  URO                  5       5      -  n[        U5      S:”  a#  USR1                  SRQ                  U5      5      -  nUS-  nSnU R                  R                  SUS9  U RS                  URC                  S5      5        U(       a4  U R                  R                  S[U        U5      S9  U RS                  U5        XÐl+        [D        RX                  U l-        U R\                  b<  U R                  R                  S5        U R\                  R_                  5         SU l.        SU l0        SU l1        U Rd                  (       a?  U R&                  Rf                  Ri                  U Rd                  U Rj                  5      U l6        U Rn                  (       a  U Rn                  Rq                  S5        U Rs                  5         [t        Rv                  " U Rx                  S5        [        U Rz                  5      S:”  a  U R}                  5         gg! [         a&  nU R                  [        U5      5      s SnAs  $ SnAff = f! [:         a
    US   /n GNf = f)z\
Callback after onConnect() returns successfully. Generates the response for the handshake.
Nr   r†   z;protocol accepted must be from the list client sent or Noneú?parsed WebSocket extension '{extension}' with params '{params}'©r©  rª  ÚOfferzSclient requested '{extension}' extension we don't support or which is not activated)r©  ÚPMCEzXclient request permessage-compress extension, but we did not accept any offer [{offers}])Úoffersz"HTTP/1.1 101 Switching Protocols
úServer: {}
úUpgrade: WebSocket
úConnection: Upgrade
ú{}: {}
úSec-WebSocket-Protocol: {}
r>  zSec-WebSocket-Accept: {}
úSec-WebSocket-Extensions: {}
r�  ú
z"sending HTTP response:

{response}©Úresponsez%sending HTTP response body:

{octets})r¾  úopenHandshakeTimeoutCall.cancelFrø   )?rp  r>   r?   r  rX  Úwebsocket_protocol_in_user  Úwebsocket_extensions_in_user  rö   r÷   r   r	   r  rþ  rq  rÚ   r  Úcreate_from_offer_acceptrP  rQ  r   Úget_extension_stringÚserverr5   rç  Úitemsr=   ÚiterÚ	TypeErrorÚhashlibÚsha1Úupdater  r"   r´  Úbase64Ú	b64encodeÚdigestrˆ   r"  rñ  r   Úhttp_response_datar0  r/  rc  rO  r  r
  rÒ   r°  rS  rD  r­  r#  r    Ú_onOpenré   r‚  rì   rŒ   rÖ  )rT   r7   Úprotocolrç  r“   ÚextensionResponseÚ
pmceOffersr©  rª  r7  Úofferrì  ÚacceptrA  Úheaders_sourceÚuhÚheader_valuesÚheader_valuerL  Úsec_websocket_acceptÚresponse_bodys                        r9   r  Ú(WebSocketServerProtocol.succeedHandshake„  s  € ð ˆØˆÜ�‹9œÓÜ�3‹x˜!‹|Ø˜q™6�Ü�3‹x˜!‹|Ø˜a™&�øàˆHàÑ¨×5MÑ5MÓ)MÜÐYÓZÐZà)1Ô&Ø�k‰kˆð ,.ˆÔ(àÐð ˆ
ð $(×#<Ô#<ÑˆYà�H‰H�N‰NØQØ#Øð ñ ð Ô<Ó<ä7¸	ÑB�ð6Ø  ™M×/Ñ/°Ó7�EØ×%Ñ% eÖ,ð
 —‘—‘ð0à'ð ó ñ+ $=ô: ˆz‹?˜QÓØ×5Ñ5°jÓAˆFØÑ!Ü7¸×8MÑ8MÑN�Ø+/°©<×+PÑ+PÐQU×Q]ÑQ]×QfÑQfÐhnÓ+o�Ô(Ø×0Ñ0×7Ñ7¸×8PÑ8PÔQØ!×(Ñ(¨×)DÑ)DÓ)FÕGà—‘—‘ð6à%ð ñ ð >ˆà�<‰<××ØÐ,×3Ñ3°D·L±L×4GÑ4GÓHÑHˆHàÐ0Ñ0ˆØÐ1Ñ1ˆð
  $Ÿ|™|×3Ñ3×9Ñ9Ó;¸W¿]¹]»_ÓMˆNÛ$�Ü˜b ™e¤c W×-Ñ-Ø%'¨¡U G‘Mð0Ü(,¨R°©U«˜ó %2�LØÐ 0× 7Ñ 7¸¸1¹¸|Ó LÑL’Hó %2ó %ñ Nð ×)Ñ)Ñ5ØÐ<×CÑCÀD×DbÑDbÓcÑcˆHô �|Š|‹~ˆà�‰�C—J‘J˜vÓ&Ô):×)DÑ)DÑDÔEÜ%×/Ò/°·±³Ó>ÐàÐ6×=Ñ=Ð>R×>YÑ>YÓ>[Ó\Ñ\ˆô Ð Ó! AÓ%ØÐ>×EÑEÀcÇhÁhÐO`ÓFaÓbÑbˆHð 	�JÑˆØˆð 	�‰�‰Ð=ÈˆÑQØ�‰�h—o‘o fÓ-Ô.æØ�H‰H�N‰NØ9Ü(¨Ó7ð ñ ð �M‰M˜-Ô(ð #+Ôô '×1Ñ1ˆŒ
ð ×(Ñ(Ñ4Ø�H‰H�N‰NÐ<Ô=Ø×)Ñ)×0Ñ0Ô2Ø,0ˆDÔ)ð $ˆÔØ!ˆÔð × × Ø'+§|¡|×'BÑ'B×'MÑ'MØ×%Ñ%Ø×"Ñ"ó(ˆDÔ$ð ××Ø×Ñ×%Ñ% hÔ/Ø�‰Œä�Š�d—l‘l DÔ)ô ˆt�y‰y‹>˜AÓØ×ÑÕð øôw !ó 6Ø×-Ñ-¬c°!«fÓ5×5ûð6ûô\ %ó 0Ø)+¨A©¨›ð0ús0   Â=%UÉ1V
Õ
VÕ!VÕ:VÖVÖ
VÖVNc                 ó†   • Xl         U R                  R                  SUS9  U R                  X!U5        U R	                  SS9  g)zv
During opening handshake the client request was invalid, we send a HTTP
error response and then drop the connection.
ú0failing WebSocket opening handshake ('{reason}')rŽ  Fr?  N)r_  rö   ÚinfoÚsendHttpErrorResponserR  )rT   r:  r9  ÚresponseHeaderss       r9   rþ  Ú%WebSocketServerProtocol.failHandshake3  sA   € ð
 "(ÔØ�‰�‰ÐHÐQWˆÑXØ×"Ñ" 4°ÔAØ×Ñ %ÐÒ(rL   c                 óÆ   • SR                  X5      nU(       a$  U H  nUSR                  US   US   5      -  nM      US-  nU R                  UR                  S5      5        g)z
Send out HTTP error response.
zHTTP/1.1 {0} {1}
z
{0}: {1}
r   r†   r?  r>  N)r5   rñ  r  )rT   r9  r:  rc  rA  r‘   s         r9   rb  Ú-WebSocketServerProtocol.sendHttpErrorResponse=  s`   € ð .×4Ñ4°TÓBˆÞÛ$�ØÐ.×5Ñ5°a¸±d¸A¸a¹DÓAÑA’ñ %à�JÑˆØ�‰�h—o‘o fÓ-Õ.rL   c                 óŒ  • UR                  S5      nSnU R                  R                  bB  U R                  R                  S:w  a(  USR                  U R                  R                  5      -  nUS-  nUSR                  [	        U5      5      -  nUS-  nU R                  UR                  S5      5        U R                  U5        g)	z
Send HTML page HTTP response.
r>  zHTTP/1.1 200 OK
Nrž  r9  z(Content-Type: text/html; charset=UTF-8
zContent-Length: {}
r?  )r  rP  rG  r5   r?   rñ  )rT   ÚhtmlÚresponseBodyrA  s       r9   ÚsendHtmlÚ WebSocketServerProtocol.sendHtmlH  s©   € ð —{‘{ 6Ó*ˆØ,ˆØ�<‰<×ÑÑ*¨t¯|©|×/BÑ/BÀbÓ/HØÐ,×3Ñ3°D·L±L×4GÑ4GÓHÑHˆHØÐDÑDˆØÐ0×7Ñ7¼¸LÓ8IÓJÑJˆØ�JÑˆØ�‰�h—o‘o fÓ-Ô.Ø�‰�lÕ#rL   c                 ó,  • SnU R                   R                  bB  U R                   R                  S:w  a(  USR                  U R                   R                  5      -  nUSR                  U5      -  nUS-  nU R                  UR	                  S5      5        g)z$
Send HTTP Redirect (303) response.
zHTTP/1.1 303
Nrž  r9  zLocation: {}
r?  r>  )rP  rG  r5   rñ  r  )rT   r6   rA  s      r9   r  Ú$WebSocketServerProtocol.sendRedirectV  s   € ð *ˆØ�<‰<×ÑÑ*¨t¯|©|×/BÑ/BÀbÓ/HØÐ,×3Ñ3°D·L±L×4GÑ4GÓHÑHˆHØÐ*×1Ñ1°#Ó6Ñ6ˆØ�JÑˆØ�‰�h—o‘o fÓ-Õ.rL   c                 óŒ   • U(       a  SR                  X!5      nOSnU R                  [        R                  U[        5      5        g)z‰
Used to send out server status/version upon receiving a HTTP/GET without
upgrade to WebSocket header (and option serverStatus is True).
z1<meta http-equiv="refresh" content="{};URL='{}'">rž  N)r5   rj  Ú_SERVER_STATUS_TEMPLATEr
   )rT   ÚredirectUrlÚredirectAfterrî  s       r9   r  Ú(WebSocketServerProtocol.sendServerStatusa  s7   € ö
 ØN×UÑUÐVcÓq‰HàˆHØ�‰Ô-×4Ñ4°X¼{ÓKÕLrL   )r   r  r­  r
  rŒ   r�   r  r
  r	  r  r  rQ  rŽ   r  rc  r~  r/  r_  r©  r  rD  rA   rC  r  r  )rõ  NrQ   rX   )rs   rt   ru   rv   r„   r"   rÀ  rÁ  rœ  r   r   r   rq  r   r   rÑ  r´  r»  rÛ  rÜ  r  rþ  rb  rj  r  r  rw   rx   rL   r9   r$   r$   å	  s—   † ñð %×8Ñ8Ð;L×;`Ñ;`Ñ`€LðÐ!2ð °u¸XÀc¹]ÈEÐRZÐ[^ÑR_ÐaeÐfiÐknÐfnÑaoÐRoÑLpÐ=pÑ7qô ò2
+ò
+ò9òbòHmô^)ô	/ò$ò	/÷	MrL   r$   c                   ó²   • \ rS rSrSr\r Sr SSSR                  \	5      SS4S jr
     SS jrS r                         SS	 jrS
 rSrg)r%   im  z|
A protocol factory for WebSocket servers.

Implements :func:`autobahn.websocket.interfaces.IWebSocketServerChannelFactory`
TNúAutobahnPython/{}c                 óà   • SU l         SU l        SU l        [        R                  " SSS9U l        [        R                  " 5         U R                  XX4U5        U R                  5         SU l
        g)zZ
Implements :func:`autobahn.websocket.interfaces.IWebSocketServerChannelFactory.__init__`
Fçš™™™™™É?rÄ   ©Úbucket_secondsÚ
chunk_sizer   N)rÅ   rÆ   rÇ   ré   Úmake_batched_timerr°  rP  ÚseedÚsetSessionParametersÚresetProtocolOptionsr×  )rT   r6   r+  rG  rç  r  s         r9   rU   ÚWebSocketServerFactory.__init__~  sl   € ð ˆŒØˆŒØ!ˆÔô $×6Ò6Ø Øñ
ˆÔô 	�ŠŒð 	×!Ñ! #°&À<ÔPð 	×!Ñ!Ô#ð !"ˆÕrL   c                 ó  • [        U=(       d    S5      u  pgp‰p«[        U5      S:”  a  [        S5      eXl        X`l        Xpl        X€l        X�l        X l        X°l	        U=(       d    / U l
        X0l        U=(       d    0 U l        XPl        g)zf
Implements :func:`autobahn.websocket.interfaces.IWebSocketServerChannelFactory.setSessionParameters`
úws://localhostr   z3query parameters specified for server WebSocket URLN)r   r?   rX  r6   r  r8   r2   Úresourcer#  rª  r+  rG  rç  r  )rT   r6   r+  rG  rç  r  r  r8   r2   r�  r#  rª  s               r9   r|  Ú+WebSocketServerFactory.setSessionParameters   sw   € ô :CÀ3×CZÐJZÓ9[Ñ6ˆ˜¨Üˆv‹;˜‹?ÜÐQÓRÐRØŒØ ŒØŒ	ØŒ	Ø ŒØŒ	ØŒà"Ÿ bˆŒØŒØ—} "ˆŒà(ÕrL   c                 ó¶  • [         R                  U l        SU l        SU l        SU l        SU l        SU l        SU l        SU l	        SU l
        SU l        SU l        SU l        SU l        SU l        SU l        SU l        S U l        SU l        SU l        SU l        SU l        S	/U l        [1        U R.                  5      U l        SU l        SU l        SU l        g
)zf
Implements :func:`autobahn.websocket.interfaces.IWebSocketServerChannelFactory.resetProtocolOptions`
TFr   é   r†   z`<cross-domain-policy>
     <allow-access-from domain="*" to-ports="*" />
</cross-domain-policy> c                 ó   • g rQ   rx   ©rS  s    r9   Ú<lambda>Ú=WebSocketServerFactory.resetProtocolOptions.<locals>.<lambda>Õ  ó   € °TrL   r»   Ú*N)r"   r°  rÖ   r×   rÈ   rØ   rÙ   rÉ   rÊ   rË   rÌ   rÍ   rÎ   rÏ   rÐ   rÑ   rÛ   rÜ   rÚ   rÒ   rÓ   rÔ   rÕ   rÝ   r   rÞ   rß   rà   rá   rS   s    r9   r}  Ú+WebSocketServerFactory.resetProtocolOptions¼  sð   € ô *×EÑEˆŒØˆŒØ$(ˆÔ!Ø)-ˆÔ&Ø %ˆÔØˆŒØ#$ˆÔ Ø%&ˆÔ"Ø !ˆÔØˆŒØ#(ˆÔ Ø$%ˆÔ!Ø%&ˆÔ"ØˆŒØ&+ˆÔ#ð"ˆÔñ ,:ˆÔ(ð !"ˆÔØ ˆÔØˆÔð ,0ˆÔ(ð  #˜eˆÔÜ&8¸×9LÑ9LÓ&MˆÔ#Ø#ˆÔð  ˆÔð #$ˆÕrL   c                 óÔ  • Ubn  U H@  nU[         R                  ;  d  M  [        SR                  U[         R                  5      5      e   [	        U5      [	        U R
                  5      :w  a  Xl        Ub  X R                  :w  a  X l        Ub  X0R                  :w  a  X0l        Ub  XPR                  :w  a  XPl        Ub  X@R                  :w  a  X@l	        Ub  X`R                  :w  a  X`l
        Ub  XpR                  :w  a  Xpl        Ub  X€R                  :w  a  X€l        U	b  X�R                  :w  a  X�l        U
b  X R                  :w  a  X l        Ub  X°R                  :w  a  X°l        Ub  XÀR                   :w  a  XÀl        Ub  XÐR"                  :w  a  XÐl        Ub  XàR$                  :w  a  Xàl        Ub  XðR&                  :w  a  Xðl        Ub  UU R(                  :w  a  UU l        Ub  UU R*                  :w  a  UU l        UbQ  UU R,                  :w  aA  [/        U5      [0        :X  d  [/        U5      [2        :X  d   eSUs=::  a  S::  d   e   eUU l        Ub,  UU R4                  :w  a  [/        U5      [6        :X  d   eUU l        Ub  UU R8                  :w  a  UU l        Ub  UU R:                  :w  a  UU l        Ub1  UU R<                  :w  a!  UU l        [?        U R<                  5      U l         US;  a  [C        S5      eUU l"        Ub4  UU RF                  :w  a$  [/        U5      [2        :X  d   eUS:¼  d   eUU l#        Ub6  UU RH                  :w  a%  [/        U5      [2        :X  d   eUS:¼  d   eUU l$        ggg)zd
Implements :func:`autobahn.websocket.interfaces.IWebSocketServerChannelFactory.setProtocolOptions`
Nz:invalid WebSocket protocol version {} (allowed values: {})r»   r  )TFzallowNullOrigin must be a boolr   )%r"   r°  rX  r5   ÚsetrÖ   r×   rÈ   rØ   rÙ   rÉ   rÊ   rË   rÌ   rÍ   rÎ   rÏ   rÐ   rÑ   rÚ   rÒ   rÓ   rÔ   rp  rk   rC  rÕ   r“  rÛ   rÜ   rÝ   r   rÞ   r4   rß   rà   rá   )rT   rÖ   r×   rÈ   rÙ   rØ   rÉ   rÊ   rË   rÌ   rÍ   rÎ   rÏ   rÐ   rÑ   rÚ   rÒ   rÓ   rÔ   rÕ   rÛ   rÜ   rÝ   rß   rà   rá   Úvs                              r9   ÚsetProtocolOptionsÚ)WebSocketServerFactory.setProtocolOptionsë  sq  € ð: ÑÛ�ØÔ-×IÑIÕIÜ#Ð$`×$gÑ$gÐhiÔk|÷  lYñ  lYó  %Zó  [ð  [ñ ô �8‹}¤ D§M¡MÓ 2Ó2Ø (”àÑ  Y·.±.Ó%@Ø&ŒNàÑ+Ð0D×HaÑHaÓ0aØ(<Ô%à$Ñ0Ð5N×RpÑRpÓ5pØ-FÔ*àÑ'Ð,<×@UÑ@UÓ,UØ$4Ô!àÑ  Y·.±.Ó%@Ø&ŒNàÑ*Ð/B×F^ÑF^Ó/^Ø':Ô$à Ñ,Ð1F×JdÑJdÓ1dØ)>Ô&àÑ'Ð,<×@UÑ@UÓ,UØ$4Ô!àÑ! j·O±OÓ&CØ(ŒOàÑ*Ð/B×F^ÑF^Ó/^Ø':Ô$àÑ+Ð0D×HaÑHaÓ0aØ(<Ô%à Ñ,Ð1F×JdÑJdÓ1dØ)>Ô&àÑ! j·O±OÓ&CØ(ŒOà&Ñ2Ð7R×VvÑVvÓ7vØ/JÔ,àÑ'Ð,<À×@UÑ@UÓ,UØ$4ˆDÔ!àÑ&¨?¸d×>RÑ>RÓ+RØ#2ˆDÔ àÑ#¨¸×8IÑ8IÓ(IÜ˜Ó%¬Ó.´$°|Ó2DÌÓ2KÐLÐKØ˜Õ,¨Ó,Ð-Ñ,Ð-Ð,Ø ,ˆDÔà&Ñ2Ð7RÐVZ×VvÑVvÓ7vÜÐ3Ó4¼Ó<Ð=Ð<Ø/JˆDÔ,à!Ñ-Ð2HÈD×LgÑLgÓ2gØ*@ˆDÔ'àÑ(Ð->À$×BXÑBXÓ-XØ%6ˆDÔ"àÑ%¨.¸D×<OÑ<OÓ*OØ"0ˆDÔÜ*<¸T×=PÑ=PÓ*QˆDÔ'à -Ó/ÜÐ=Ó>Ð>Ø.ˆÔàÑ%¨.¸D×<OÑ<OÓ*OÜ˜Ó'¬3Ó.Ð/Ð.Ø! QÓ&Ð'Ð&Ø"0ˆDÔàÑ)Ð.@ÀD×D[ÑD[Ó.[ÜÐ*Ó+¬sÓ2Ð3Ð2Ø%¨Ó*Ð+Ð*Ø&8ˆDÕ#ð /\Ð)rL   c                 ó   • U R                   $ )z^
Get number of currently connected clients.

:returns: Number of currently connected clients.
)r×  rS   s    r9   ÚgetConnectionCountÚ)WebSocketServerFactory.getConnectionCount`  s   € ð ×$Ñ$Ð$rL   )*r°  rß   rÝ   rÞ   rÉ   rÌ   rÒ   rÕ   rÔ   rÓ   rÐ   r×  rÎ   r  rÍ   rÜ   rç  r8   r  rÆ   rÅ   rÙ   rà   rÊ   rË   rÏ   rª  r#  rÚ   r2   r+  rØ   r�  rÛ   rG  rÑ   rÇ   rá   r6   rÈ   rÖ   r×   )NNNNN)NNNNNNNNNNNNNNNNNNNNNNFNN)rs   rt   ru   rv   r„   r$   rS  rQ  r5   r
   rU   r|  r}  r�  r’  rw   rx   rL   r9   r%   r%   m  s¶   † ñð '€Hðð €Hðð
 ØØ+×2Ñ2°;Ó?ØØ"ô "ðF "&Ø'+Ø$(Ø%)Ø*.ô)ò8-$ð` %)Ø%)Ø04Ø,0Ø59Ø%)Ø/3Ø15Ø,0Ø&*Ø/3Ø04Ø15Ø&*Ø7;Ø,0Ø+/Ø(,Ø7;Ø26Ø-1Ø*.Ø+0Ø*.Ø.2ô3s9õj%rL   r%   c                   óª   • \ rS rSrSr\R                  \R                  -   rS\	S\
\   4S jrS\S\4S jrS rS	 rS
 rS rS rS rS rS rS rSrg)r&   ii  z,
Protocol base class for WebSocket clients.
rò   rð   c                 ó   • g)am  
Callback fired after the connection is established, but before the
handshake has started. This may return a
:class:`autobahn.websocket.types.ConnectingRequest` instance
(or a future which resolves to one) to control aspects of the
handshake (or None for defaults)

:param transport_details: Details of the transport underlying the WebSocket connection being established.

:returns: A :class:`autobahn.websocket.types.ConnectingRequest`
    instance is returned to indicate which options should be
    used for this connection. If you wish to use the default
    behavior, ``None`` may be returned (this is the default).
Nrx   )rT   rò   s     r9   ÚonConnectingÚ$WebSocketClientProtocol.onConnectingp  ó   � rL   rA  c                 ó   • g)zÒ
Callback fired directly after WebSocket opening handshake when new WebSocket
connection was established from the client to a server.

:param response: WebSocket connection response information sent by server.
Nrx   )rT   rA  s     r9   rÑ  Ú!WebSocketClientProtocol.onConnect€  r˜  rL   c                 óD  • U R                   R                  S[        U R                  5      U R                  S9  [
        R                  U 5        U R                  R                  (       d(  U R                  R                  b  U R                  5         gU R                  5         g)a  
Called by network framework when new transport connection to server was established. Default
implementation will start the initial WebSocket opening handshake (or proxy connect).
When overriding in derived class, make sure to call this base class
implementation _before_ your code.
rÕ  rÖ  N)rö   r÷   r   r´  r~  r"   rP  rQ  r¢  ÚstartProxyConnectÚstartHandshakerS   s    r9   r´  Ú'WebSocketClientProtocol._connectionMadeˆ  su   € ð 	�‰�‰ÐEÜ" 4×#7Ñ#7Ó8¸t¿y¹yð 	ñ 	Jä×)Ñ)¨$Ô/à�|‰|×$×$¨¯©×);Ñ);Ñ)Gà×"Ñ"Õ$ð ×ÑÕ!rL   c                 ó²   • U R                   R                  S[        U R                  5      U R                  [        U5      S9  [        R                  X5        g)z÷
Called by network framework when established transport connection to server was lost. Default
implementation will tear down all state properly.
When overriding in derived class, make sure to call this base class
implementation _after_ your code.
rÚ  rÛ  N)rö   r÷   r   r»  r~  r   r"   r�  s     r9   r»  Ú'WebSocketClientProtocol._connectionLostš  sH   € ð 	�‰�‰ÐPÜ" 4×#7Ñ#7Ó8¸t¿y¹yÔQVÐW]ÓQ^ð 	ñ 	`ä×)Ñ)¨$Õ7rL   c                 óp  • SR                  U R                  R                  U R                  R                  5      nUSR                  U R                  R                  U R                  R                  5      -  nUS-  nU R                  R                  SUS9  U R                  UR                  S5      5        g)z
Connect to explicit proxy.
zCONNECT {}:{} HTTP/1.1
úHost: {}:{}
r?  z	{request})rÏ  r>  N)r5   rP  r8   r2   rö   r÷   rñ  r  rÒ  s     r9   rœ  Ú)WebSocketClientProtocol.startProxyConnect¥  s‰   € ð 3×9Ñ9¸$¿,¹,×:KÑ:KÈTÏ\É\×M^ÑM^Ó_ˆØÐ(×/Ñ/°·±×0AÑ0AÀ4Ç<Á<×CTÑCTÓUÑUˆØ�:Ñˆà�‰�‰�{¨GˆÑ4à�‰�g—n‘n VÓ,Õ-rL   c                 óœ  • U R                   R                  S5      nUS:¼  Gaé  U R                   SUS-    nU R                  R                  SUS9  [	        U5      u  p4nU R                  R                  SUS9  U R                  R                  S	US
9  UR                  5       n[        U5      S:  a   U R                  SR                  U5      5      $ US   R                  5       nUS;  a   U R                  SR                  U5      5      $  [        US   R                  5       5      nSUs=::  a  S:  dH  O  [        U5      S:”  a  SR                  USS 5      n	OSn	U R                  SR                  X‰5      5      $ U R                   US-   S U l         [        R                  U l        [        U R                   5      S:”  a  U R!                  5         U R"                  R$                  (       a  U R'                  5         U R)                  5         gg! [         a4    U R                  SR                  US   R                  5       5      5      s $ f = f)z,
Process HTTP/CONNECT response from server.
rà  r   NrÃ   z%received HTTP response:

{response}

r@  z>received HTTP status line for proxy connect request : {status}rã  z;received HTTP headers for proxy connect request : {headers}ræ  rÂ   ú"Bad HTTP response status line "{}")úHTTP/1.1zHTTP/1.0rë  r†   úBad HTTP status code "{}"éÈ   r˜   Ú rž  z$HTTP proxy connect failed ({}): "{}")rŒ   r‹   rö   r÷   r•   r£  r?   ÚfailProxyConnectr5   rŠ   rC  r4   r"  r"   rd  r/  rÖ  rP  r  ÚstartTLSr�  )
rT   rá  rQ  rŽ   r�   r�   ÚslÚhttp_versionÚstatus_coder:  s
             r9   rÛ  Ú+WebSocketClientProtocol.processProxyConnect³  s1  € ð Ÿ	™	Ÿ™Ð':Ó;ˆØ˜AÔà!%§¡Ð+=¨M¸AÑ,=Ð!>ÐØ�H‰H�N‰NØ;Ø+ð ñ ô BQÐQcÓAdÑ>ÐÐ-=ð �H‰H�N‰NØPØ'ð ñ ð �H‰H�N‰NØMØ$ð ñ ð "×'Ñ'Ó)ˆBÜ�2‹w˜‹{Ø×,Ñ,Ð-Q×-XÑ-XÐYiÓ-jÓkÐkð ˜a™5Ÿ;™;›=ˆLØÐ#;Ó;Ø×,Ñ,Ð-L×-SÑ-SÐT`Ó-aÓbÐbð`Ü! " Q¡%§+¡+£-Ó0�ð ˜;Õ,¨Õ,ô
 �r“7˜Q“;Ø ŸX™X b¨¨ fÓ-‘Fà�FØ×,Ñ,Ð-S×-ZÑ-ZÐ[fÓ-oÓpÐpð Ÿ	™	 -°!Ñ"3Ð"4Ð5ˆDŒIô +×;Ñ;ˆDŒJô �4—9‘9‹~ Ó!Ø× Ñ Ô"ð �|‰|×$×$Ø—‘”Ø×ÑÕ!ðM øôN ó `Ø×,Ñ,Ð-H×-OÑ-OÐPRÐSTÑPU×P[ÑP[ÓP]Ó-^Ó_Ò_ð`ús   Ä
H È;IÉ
Ic                 óV   • U R                   R                  SUS9  U R                  SS9  g)zo
During initial explicit proxy connect, the server response indicates some failure and we drop the
connection.
z"failing proxy connect ('{reason}')rŽ  Tr?  N)rö   r÷   rR  r�  s     r9   rª  Ú(WebSocketClientProtocol.failProxyConnect  s*   € ð
 	�‰�‰Ð;ÀFˆÑKØ×Ñ $ÐÒ'rL   c                 óB  ^ • T R                   R                  S[        T R                  5      [	        T R
                  R                  5       5      S9  [        R                  " T R                  T R
                  5      nU 4S jnU 4S jn[        R                  " XU5        U$ )z$
Start WebSocket opening handshake.
zF{meth}: starting handshake with transport_details=
{transport_details})Úmethrò   c           
      óf  >• U c›  [        TR                  R                  TR                  R                  TR                  R                  TR                  R
                  TR                  R                  TR                  R                  TR                  R                  S9n TR                  U 5        U $ )z-
onConnecting succeeded and returned options
)r8   r2   r�  rç  Ú	useragentr÷  r+  )
r   rP  r8   r2   r�  rç  rµ  r÷  r+  Ú_actuallyStartHandshake)Úrequest_optionsrT   s    €r9   Úgot_optionsÚ;WebSocketClientProtocol.startHandshake.<locals>.got_options  sˆ   ø€ ð Ñ&ô #4àŸ™×*Ñ*ØŸ™×*Ñ*Ø!Ÿ\™\×2Ñ2à ŸL™L×0Ñ0Ø"Ÿl™l×4Ñ4ØŸ<™<×.Ñ.Ø"Ÿl™l×4Ñ4ñ
#�ð ×(Ñ(¨Ô9Ø"Ð"rL   c                 ó€   >• TR                   R                  SU [        TR                  5      S9  TR	                  SS9  g )Nz"{meth} onConnecting failed: {fail})r  r³  Fr?  )rö   r  r   r�  rR  ©r  rT   s    €r9   Úoptions_failedÚ>WebSocketClientProtocol.startHandshake.<locals>.options_failed,  sB   ø€ Ø�H‰H�N‰NØ4ØÜ˜D×/Ñ/Ó0ð ñ ð
 ×Ñ eÐÑ,àrL   )rö   r÷   r   r�  r   rî   Úmarshalré   r  r–  r&  )rT   Ú	options_dr¸  r¼  s   `   r9   r�  Ú&WebSocketClientProtocol.startHandshake
  sƒ   ø€ ð 	�‰�‰Ð`Ü" 4×#6Ñ#6Ó7Ü)0°×1HÑ1H×1PÑ1PÓ1RÓ)Sð 	ñ 	Uô —O’O D×$5Ñ$5°t×7NÑ7NÓOˆ	õ	#õ,	ô 	×Ò˜I°NÔCØÐrL   c                 ó’  • SR                  UR                  5      nUR                  b.  UR                  S:w  a  USR                  UR                  5      -  nUSR                  UR                  UR                  5      -  nUS-  nUS-  nUS-  nUS	-  nUR
                  R                  5        H  nUS
R                  US   US   5      -  nM      [        R                  " [        R                  " S5      5      U l        USR                  U R                  R                  5       5      -  nUR                  (       aM  U R                  S:”  a  USR                  UR                  5      -  nOUSR                  UR                  5      -  n[        UR                   5      S:”  a-  USR                  SR#                  UR                   5      5      -  n/ nU R$                   H"  nUR'                  UR)                  5       5        M$     [        U5      S:”  a#  USR                  SR#                  U5      5      -  nUSR                  [*        R,                  U R                     5      -  nUS-  nUR/                  S5      U l        U R3                  U R0                  5        U R4                  R7                  S[9        U R:                  5      US9  g)zh
Internal helper.

Actually send the WebSocket opening handshake after receiving
valid request options.
zGET {} HTTP/1.1
Nrž  zUser-Agent: {}
r¢  r:  r;  zPragma: no-cache
zCache-Control: no-cache
r<  r   r†   r¿   zSec-WebSocket-Key: {}
r¤   zOrigin: {}
zSec-WebSocket-Origin: {}
r=  r�  r>  zSec-WebSocket-Version: {}
r?  r>  z${meth}: sent HTTP request:
{request})r³  rÏ  )r5   r�  rµ  r8   r2   rç  rH  rN  rO  rf  rg  Úwebsocket_keyrˆ   r÷  râ   r?   r+  r"  ræ   r  rF  r"   r±  r  r  rñ  rö   r÷   r   r¶  )rT   r·  rÏ  rY  r¥  rV  s         r9   r¶  Ú/WebSocketClientProtocol._actuallyStartHandshake8  s…  € ð ,×2Ñ2°?×3KÑ3KÓLˆà×$Ñ$Ñ0°_×5NÑ5NÐRTÓ5TØÐ/×6Ñ6°×7PÑ7PÓQÑQˆGàÐ(×/Ñ/°×0DÑ0DÀo×FZÑFZÓ[Ñ[ˆØÐ/Ñ/ˆØÐ0Ñ0ˆð 	Ð-Ñ-ˆØÐ4Ñ4ˆð "×)Ñ)×/Ñ/Ö1ˆBØÐ'×.Ñ.¨r°!©u°b¸±eÓ<Ñ<ŠGñ 2ô
 $×-Ò-¬b¯jªj¸«nÓ=ˆÔØÐ2×9Ñ9¸$×:LÑ:L×:SÑ:SÓ:UÓVÑVˆð ×!×!Ø�|‰|˜bÓ ØÐ/×6Ñ6°×7MÑ7MÓNÑN‘àÐ=×DÑDÀ_×E[ÑE[Ó\Ñ\�ô ˆ×(Ñ(Ó)¨AÓ-ØÐ;×BÑBÀ3Ç8Á8ÈO×LeÑLeÓCfÓgÑgˆGð ˆ
ð ×5Ô5ˆEØ×Ñ˜e×8Ñ8Ó:Ö;ñ 6ô ˆz‹?˜QÓØÐ=×DÑDÀSÇXÁXÈjÓEYÓZÑZˆGð 	Ð6×=Ñ=Ô>O×>hÑ>hÐim×iuÑiuÑ>vÓwÑwˆà�:Ñˆà!(§¡°Ó!7ˆÔØ�‰�d×,Ñ,Ô-à�‰�‰Ð>ÄVÈD×LhÑLhÓEiØ&ð 	ò 	(rL   c                 óÀ  ^ • T R                   R                  S5      nUS:¼  GaG  T R                   SUS-    T l        T R                  R	                  S[        T R                  5      T R                  R                  S5      S9  [        T R                  5      u  T l	        T l
        nT R                  R	                  ST R                  S	9  T R                  R	                  S
T R                  S9  T R                  R                  5       n[        U5      S:  a*  T R                  SR                  T R                  5      5      $ US   R                  5       nUS:w  a   T R                  SR                  U5      5      $  [!        US   R                  5       5      nUS:w  aF  [        U5      S:”  a  SR%                  USS 5      nOSnT R                  SR                  XV5      5      $ ST R                  ;  a  T R                  S5      $ T R                  S   R                  5       R'                  5       S:w  a-  T R                  SR                  T R                  S   5      5      $ ST R                  ;  a  T R                  S5      $ SnT R                  S   R                  S5       H)  nUR                  5       R'                  5       S:X  d  M'  Sn  O   U(       d-  T R                  SR                  T R                  S   5      5      $ S T R                  ;  a  T R                  S!5      $ US    S:”  a  T R                  S"5      $ T R                  S    R                  5       n	[(        R*                  " 5       n
U
R-                  T R.                  [0        R2                  -   5        [4        R6                  " U
R9                  5       5      R                  5       nX›:w  a   T R                  S#R                  X¹5      5      $ / T l        S$T R                  ;   GaC  US$   S:”  a  T R                  S%5      $ T R=                  T R                  S$   5      nU GH  u  pÞT R                  R	                  S&UUS'9  U[>        ;   aº  T R@                  b  T R                  S(5      s  $ [>        U   n US)   RC                  U5      nT RI                  U5      nUc  T R                  S*5      s  $ US+   RK                  T RL                  RN                  U5      T l         T R:                  RQ                  T R@                  5        Må  T R                  S,R                  U5      5      s  $    ST l)        S-T R                  ;   aœ  US-   S:”  a  T R                  S.5      $ [G        T R                  S-   R                  5       5      nUS:w  aV  UT RL                  RT                  ;  a5  T R                  S/R                  UT RL                  RT                  5      5      $ UT l)        T R                   US-   S T l         [0        RV                  T l,        T RZ                  b<  T R                  R	                  S05        T RZ                  R]                  5         ST l-        ST l/        ST l0        T Rb                  T l2        T Rf                  (       a?  T RL                  Rh                  Rk                  T Rf                  T Rl                  5      T l7        [q        T Rr                  T R                  T Rd                  T RR                  T R:                  5      n[t        Rv                  " T Rx                  U5      nU 4S1 jnU 4S2 jn[t        Rz                  " UUU5        U$ g! ["         a4    T R                  SR                  US   R                  5       5      5      s $ f = f! [D         a&  nT R                  [G        U5      5      s SnAs  $ SnAff = f)3z;
Process WebSocket opening handshake response from server.
rà  r   NrÃ   z*{meth}: received HTTP response:
{response}r>  )r³  rA  râ  rã  rå  ræ  rÂ   r¥  r¦  rë  r†   r§  ée   r©  rž  z,WebSocket connection upgrade failed [{}]: {}rí  rñ  rò  zGHTTP Upgrade header different from "websocket" (case-insensitive): "{}"ró  rô  Fr�  TzPHTTP Connection header does not include "upgrade" value (case-insensitive): "{}"zsec-websocket-acceptzCHTTP Sec-WebSocket-Accept header missing in opening handshake replyzRHTTP Sec-WebSocket-Accept header appears more than once in opening handshake replyz<HTTP Sec-WebSocket-Accept bogus value : expected {} / got {}rú  zVHTTP Sec-WebSocket-Extensions header appears more than once in opening handshake replyr4  r5  z6multiple occurrence of a permessage-compress extensionÚResponsezMWebSocket permessage-compress extension response from server denied by clientr7  z]server wants to use extension "{}" we did not request, have not implemented or did not enablerö  zTHTTP Sec-WebSocket-Protocol header appears more than once in opening handshake replyzTsubprotocol selected by server "{}" not in subprotocol list requested by client "{}"rB  c                 óH  >• TR                   R                  SU S9  TR                  (       a  TR                  R                  S5        TR	                  5         [
        R                  " TR                  S 5        [        TR                  5      S:”  a  TR                  5         g g )Nz;onConnect callback completed successfully with result={res})r7   rø   r   )rö   r÷   r#  r    rR  ré   r‚  rì   r?   rŒ   rÖ  )r7   rT   s    €r9   Úon_connect_successÚDWebSocketClientProtocol.processHandshake.<locals>.on_connect_successK  sr   ø€ Ø—‘—‘Ð\Ðbe�ÑfØ×&×&Ø×'Ñ'×-Ñ-¨hÔ7Ø—‘”Ü—’˜dŸl™l¨DÔ1Ü�t—y‘y“> AÓ%Ø×$Ñ$Õ&ð &rL   c                 ó|   >• TR                   R                  SU S9  TR                  SSR                  U 5      5        g )NzonConnect failed with {fail}r  rÄ   z{})rö   r  r†  r5   r»  s    €r9   Úon_connect_failedÚCWebSocketClientProtocol.processHandshake.<locals>.on_connect_failedT  s9   ø€ Ø—‘—‘Ø2Øð ñ ð ×%Ñ% d¨D¯K©K¸Ó,=Õ>rL   )>rŒ   r‹   rQ  rö   r÷   r   rÜ  rˆ   r•   rŽ   r�   r£  r?   rþ  r5   rŠ   rC  r4   r"  r.   rK  rL  rM  rÂ  r"   r´  rN  rO  rP  rD  r¬  r   r   r	   rX  rq  rÚ   Úcreate_from_response_acceptrP  rQ  r  rC  r+  r0  r/  rc  rO  r  r
  râ   r  rÒ   r°  rS  rD  r­  r   r~  ré   r  Ú
_onConnectr&  )rT   rá  r�   r¬  r­  r®  r:  r'  r(  Úsec_websocket_accept_gotrL  r\  r  r©  rª  r7  ÚpmceResponserì  rW  ÚsprA  r«   rÈ  rË  s   `                       r9   rÜ  Ú(WebSocketClientProtocol.processHandshake‚  sÜ  ø€ ð Ÿ	™	Ÿ™Ð':Ó;ˆØ˜AÔà-1¯Y©YÐ7I¸ÈÑ8IÐ-JˆDÔ#Ø�H‰H�N‰NÐHÌvÐVZ×VkÑVkÓOlØ$(×$;Ñ$;×$BÑ$BÀ6Ó$Jð ñ Lô
 L[Ð[_×[rÑ[rÓKsÑHˆTÔ" DÔ$5Ð7Gð �H‰H�N‰NØKØ×,Ñ,ð ñ ð �H‰H�N‰NØHØ×)Ñ)ð ñ ð ×&Ñ&×,Ñ,Ó.ˆBÜ�2‹w˜‹{Ø×)Ñ)Ð*N×*UÑ*UÐVZ×VkÑVkÓ*lÓmÐmð ˜a™5Ÿ;™;›=ˆLØ˜zÓ)Ø×)Ñ)Ð*I×*PÑ*PÐQ]Ó*^Ó_Ð_ð]Ü! " Q¡%§+¡+£-Ó0�ð ˜cÓ!ô
 �r“7˜Q“;Ø ŸX™X b¨¨ fÓ-‘Fà�FØ×)Ñ)Ð*X×*_Ñ*_Ð`kÓ*tÓuÐuð  × 1Ñ 1Ó1Ø×)Ñ)Ð*GÓHÐHØ× Ñ  Ñ+×1Ñ1Ó3×9Ñ9Ó;¸{ÓJØ×)Ñ)Ð*s×*zÑ*zÐ{÷  |Mñ  |Mð  NWñ  |Xó  +Yó  Zð  Zð  4×#4Ñ#4Ó4Ø×)Ñ)Ð*JÓKÐKØ %ÐØ×&Ñ& |Ñ4×:Ñ:¸3Ö?�Ø—7‘7“9—?‘?Ó$¨	Õ1Ø(,Ð%Ùñ @ö %Ø×)Ñ)Ð*|÷  +Dñ  +Dð  EI÷  EVñ  EVð  Wcñ  Edó  +eó  fð  fð &¨T×->Ñ->Ó>Ø×)Ñ)Ð*oÓpÐpà#Ð$:Ñ;¸aÓ?Ø×-Ñ-ð  /Có  Dð  DØ+/×+<Ñ+<Ð=SÑ+T×+ZÑ+ZÓ+\Ð(ä—|’|“~�Ø—‘˜D×.Ñ.Ô1B×1LÑ1LÑLÔMÜ'-×'7Ò'7¸¿¹»Ó'F×'MÑ'MÓ'OÐ$à+ÓCØ×-Ñ-Ð.l×.sÑ.sð  uIó  /dó  eð  eð 02ˆDÔ,à)¨T×->Ñ->Ô>à#Ð$>Ñ?À!ÓCØ×-Ñ-ð  /Gó  Hð  Hð ,0×+FÑ+FÀt×GXÑGXÐYsÑGtÓ+uÐ(ô ,@Ñ'�Yà—H‘H—N‘NØYØ"+Ø%ð #ñ ð !Ô$DÓDð  ×3Ñ3Ñ?Ø#'×#5Ñ#5Ð6nÓ#oÒoä?À	ÑJ˜ð>Ø+/°
Ñ+;×+AÑ+AÀ&Ó+I˜Lð "&×!AÑ!AÀ,Ó!O˜à!™>Ø#'×#5Ñ#5ð  7Fó  $Gò  Gà37¸±<×3[Ñ3[Ð\`×\hÑ\h×\qÑ\qÐsyÓ3z˜Ô0à×8Ñ8×?Ñ?À×@XÑ@XÖYð  $×1Ñ1ð  3R÷  3Yñ  3Yð  Zcó  3dó   eò  eñE ,@ðL .2ˆDÔ*Ø'¨4×+<Ñ+<Ó<Ø#Ð$<Ñ=ÀÓAØ×-Ñ-ð  /Eó  Fð  FÜ˜×*Ñ*Ð+CÑD×JÑJÓLÓM�Ø˜“8Ø §¡×!7Ñ!7Ó7Ø#×1Ñ1ð  3I÷  3Pñ  3Pð  QSð  UY÷  Uañ  Ua÷  Ukñ  Ukó  3ló   mð  mð :<˜Ô6ð Ÿ	™	 -°!Ñ"3Ð"4Ð5ˆDŒIô +×5Ñ5ˆDŒJð ×,Ñ,Ñ8Ø—‘—‘Ð@ÔAØ×-Ñ-×4Ñ4Ô6Ø04�Ô-ð #(ˆDÔØ!%ˆDÔØ%)§\¡\ˆDÔ"ð ×$×$Ø+/¯<©<×+FÑ+F×+QÑ+QØ×)Ñ)Ø×&Ñ&ó,�Ô(ô *¨$¯)©)Ø*.×*;Ñ*;Ø*.×*@Ñ*@Ø*.×*HÑ*HØ*.×*JÑ*Jó	LˆHô —’ §¡°Ó:ˆAõ'õ?ô ×Ò Ð#5Ð7HÔIØˆHðg øôJ ó ]Ø×)Ñ)Ð*E×*LÑ*LÈRÐPQÉUÏ[É[Ë]Ó*[Ó\Ò\ð]ûôn  )ó >Ø#'×#5Ñ#5´c¸!³fÓ#=×=ûð>ús0   Å:], Ò^-Ý,;^*Þ)^*Þ-
_Þ7_ß_ß_c                 ób   • Xl         U R                  R                  SUS9  U R                  SS9  g)zU
During opening handshake the server response is invalid and we drop the
connection.
r`  rŽ  Tr?  N)r_  rö   ra  rR  r�  s     r9   rþ  Ú%WebSocketClientProtocol.failHandshake^  s8   € ð
 "(ÔØ�‰�‰Ø>Øð 	ñ 	
ð 	×Ñ $ÐÒ'rL   )r   r­  r
  rŒ   r�   r  rQ  rŽ   r  rc  r/  r_  rD  rÂ  rC  r  N)rs   rt   ru   rv   r„   r"   rÀ  rÂ  rœ  r   r   r   r–  r   ÚNoneTyperÑ  r´  r»  rœ  rÛ  rª  r�  r¶  rÜ  rþ  rw   rx   rL   r9   r&   r&   i  s‚   † ñð %×8Ñ8Ð;L×;`Ñ;`Ñ`€LðÐ.>ð À8ÐL]ÑC^ô ð Ð"4ð ¸ô ò"ò$	8ò.òM"ò^(ò,ò\H(òTZõx
(rL   r&   c                   ó¦   • \ rS rSrSr\r Sr SSSSR                  \	5      SS4S jr
      SS jrS r                    SS	 jrS
rg)r'   ik  z|
A protocol factory for WebSocket clients.

Implements :func:`autobahn.websocket.interfaces.IWebSocketClientChannelFactory`
FNrt  c                 óÒ   • SU l         SU l        SU l        [        R                  " SSS9U l        [        R                  " 5         U R                  XX4XV5        U R                  5         g)zZ
Implements :func:`autobahn.websocket.interfaces.IWebSocketClientChannelFactory.__init__`
Frv  rÄ   rw  N)
rÅ   rÆ   rÇ   ré   rz  r°  rP  r{  r|  r}  )rT   r6   r÷  r+  rµ  rç  r¢  s          r9   rU   ÚWebSocketClientFactory.__init__|  sb   € ð ˆŒØˆŒØ!ˆÔô $×6Ò6Ø Øñ
ˆÔô 	�ŠŒð 	×!Ñ! #¨yÀWÔTð 	×!Ñ!Õ#rL   c                 óì   • [        U=(       d    S5      u  pxpšp¼Xl        Xpl        X€l        X�l        X l        X°l        XÀl        X l        U=(       d    / U l	        X@l
        U=(       d    0 U l        X`l        g)zf
Implements :func:`autobahn.websocket.interfaces.IWebSocketClientChannelFactory.setSessionParameters`
r€  N)r   r6   r  r8   r2   r�  r#  rª  r÷  r+  rµ  rç  r¢  )rT   r6   r÷  r+  rµ  rç  r¢  r  r8   r2   r�  r#  rª  s                r9   r|  Ú+WebSocketClientFactory.setSessionParameters›  sd   € ô :CÀ3×CZÐJZÓ9[Ñ6ˆ˜¨ØŒØ ŒØŒ	ØŒ	Ø ŒØŒ	ØŒàŒØ"Ÿ bˆŒØ"ŒØ—} "ˆŒà�
rL   c                 ó:  • [         R                  U l        SU l        SU l        SU l        SU l        SU l        SU l        SU l	        SU l
        SU l        SU l        SU l        SU l        SU l        / U l        S U l        SU l        SU l        SU l        SU l        g)	zf
Implements :func:`autobahn.websocket.interfaces.IWebSocketClientChannelFactory.resetProtocolOptions`
TFr   r†   r„  c                 ó   • g rQ   rx   r†  s    r9   r‡  Ú=WebSocketClientFactory.resetProtocolOptions.<locals>.<lambda>Ì  r‰  rL   r»   N)r"   r³  râ   rÈ   rã   rä   rÉ   rÊ   rË   rÌ   rÍ   rÎ   rå   rÏ   rÐ   rÑ   ræ   rÚ   rÒ   rÓ   rÔ   rÕ   rS   s    r9   r}  Ú+WebSocketClientFactory.resetProtocolOptions¶  s¬   € ô )×=Ñ=ˆŒØ$(ˆÔ!Ø(-ˆÔ%Ø $ˆÔØˆŒØ#$ˆÔ Ø%&ˆÔ"Ø !ˆÔØˆŒØ#(ˆÔ Ø+,ˆÔ(Ø$%ˆÔ!Ø%&ˆÔ"ØˆŒð ,.ˆÔ(Ù+9ˆÔ(ð !"ˆÔØ ˆÔØˆÔð ,0ˆÕ(rL   c                 óÞ  • UbR  U[         R                  ;  a)  [        SR                  U[         R                  5      5      eXR                  :w  a  Xl        Ub  X R
                  :w  a  X l        Ub  X0R                  :w  a  X0l        Ub  X@R                  :w  a  X@l        Ub  XPR                  :w  a  XPl        Ub  X`R                  :w  a  X`l	        Ub  XpR                  :w  a  Xpl
        Ub  X€R                  :w  a  X€l        U	b  X�R                  :w  a  X�l        U
b  X R                  :w  a  X l        Ub  X°R                  :w  a  X°l        Ub  XÀR                  :w  a  XÀl        Ub  XÐR                   :w  a  XÐl        Ub  XàR"                  :w  a  Xàl        UbŠ  [$        R&                  " U5      [$        R&                  " U R(                  5      :w  aR  [+        U5      [,        :X  a  [.        R0                  " U5      U l        O#[        SR                  [+        U5      5      5      eUb  UU R2                  :w  a  UU l        Ub  UU R4                  :w  a  UU l        Ub  UU R6                  :w  a  UU l        UbQ  UU R8                  :w  aA  [+        U5      [:        :X  d  [+        U5      [<        :X  d   eSUs=::  a  S::  d   e   eUU l        Ub.  UU R>                  :w  a  [+        U5      [@        :X  d   eUU l        ggg)zd
Implements :func:`autobahn.websocket.interfaces.IWebSocketClientChannelFactory.setProtocolOptions`
Nz7invalid WebSocket draft version {} (allowed values: {})z?invalid type {} for perMessageCompressionOffers - expected listr»   r  )!r"   r¯  rX  r5   râ   rÈ   rã   rä   rÉ   rÊ   rË   rÌ   rÍ   rÎ   rå   rÏ   rÐ   rÑ   Úpicklerp   ræ   rp  ÚlistÚcopyÚdeepcopyrÚ   rÒ   rÓ   rÔ   rk   rC  rÕ   r“  )rT   râ   rÈ   rã   rä   rÉ   rÊ   rË   rÌ   rÍ   rÎ   rå   rÏ   rÐ   rÑ   ræ   rÚ   rÒ   rÓ   rÔ   rÕ   s                        r9   r�  Ú)WebSocketClientFactory.setProtocolOptions×  sñ  € ð0 ÑØÔ/×GÑGÓGÜÐ Y× `Ñ `ÐahÔj{÷  kTñ  kTó  !Uó  Vð  VØŸ,™,Ó&Ø&”àÑ+Ð0D×HaÑHaÓ0aØ(<Ô%à#Ñ/Ð4L×PmÑPmÓ4mØ,DÔ)àÑ'Ð,<×@UÑ@UÓ,UØ$4Ô!àÑ  Y·.±.Ó%@Ø&ŒNàÑ*Ð/B×F^ÑF^Ó/^Ø':Ô$à Ñ,Ð1F×JdÑJdÓ1dØ)>Ô&àÑ'Ð,<×@UÑ@UÓ,UØ$4Ô!àÑ! j·O±OÓ&CØ(ŒOàÑ*Ð/B×F^ÑF^Ó/^Ø':Ô$à&Ñ2Ð7R×VvÑVvÓ7vØ/JÔ,àÑ+Ð0D×HaÑHaÓ0aØ(<Ô%à Ñ,Ð1F×JdÑJdÓ1dØ)>Ô&àÑ! j·O±OÓ&CØ(ŒOà&Ñ2´v·|²|ÐD_Ó7`Ôdj×dpÒdpÐqu÷  rRñ  rRó  eSó  8SÜÐ/Ó0´DÓ8ô 48·=²=ÐA\Ó3]�Õ0äÐ a× hÑ hÔimð  oJó  jKó  !Ló  Mð  Mà&Ñ2Ð7RÐVZ×VvÑVvÓ7vØ/JˆDÔ,àÑ'Ð,<À×@UÑ@UÓ,UØ$4ˆDÔ!àÑ&¨?¸d×>RÑ>RÓ+RØ#2ˆDÔ àÑ#¨¸×8IÑ8IÓ(IÜ˜Ó%¬Ó.´$°|Ó2DÌÓ2KÐLÐKØ˜Õ,¨Ó,Ð-Ñ,Ð-Ð,Ø ,ˆDÔà&Ñ2Ð7RÐVZ×VvÑVvÓ7vÜÐ3Ó4¼Ó<Ð=Ð<Ø/JˆDÕ,ð 8wÐ2rL   )$r°  rã   rÉ   rÌ   rÒ   rÕ   rÔ   rÓ   rÐ   rÎ   rÍ   rç  r8   r  rÆ   rÅ   rä   rÊ   rË   rÏ   r÷  rª  r#  rÚ   ræ   r2   r+  r¢  r�  rå   rÑ   rÇ   r6   rµ  rÈ   râ   )NNNNNN)NNNNNNNNNNNNNNNNNNNN)rs   rt   ru   rv   r„   r&   rS  rQ  r5   r
   rU   r|  r}  r�  rw   rx   rL   r9   r'   r'   k  s¨   † ñð '€Hðð €Hðð
 ØØØ.×5Ñ5°kÓBØØô$ð@ "&Ø$(Ø'+Ø'+Ø%)Ø#'ôò60ðD $(Ø04Ø48Ø,0Ø%)Ø/3Ø15Ø,0Ø&*Ø/3Ø7;Ø04Ø15Ø&*Ø7;Ø7;Ø,0Ø+/Ø(,Ø7;÷)^KrL   r'   )LrÉ  rK  rN  r  rP  rf  rà  râ  ro   rA  Útypingr   r   r   r   Úpprintr   Úcollectionsr   Úurllibr	   Úautobahnr
   Úautobahn.websocket.interfacesr   r   r   Úautobahn.websocket.typesr   r   r   r   Úautobahn.wamp.typesr   Úautobahn.utilr   r   r   r   r   r   r   Ú autobahn.websocket.utf8validatorr   Úautobahn.websocket.xormaskerr   r   Úautobahn.websocket.compressr   Úautobahn.websocket.utilr   Úautobahn.exceptionr   r    r!   ré   r  rp  rÕ  Ú__all__r:   rK   ÚobjectrN   rz   r•   r—   r"   ÚregisterrÅ  r#   ro  r$   r%   r&   r'   rx   rL   r9   Ú<module>rö     sf  ðó6 Û Û Û Û Û 	Û Û Û Û ß /Ó /Ý Ý Ý å  ÷"ñ "÷ nÓ mÝ 0ç WÕ WÝ +Ý )Ý :ß IÝ HÝ -ß AÝ +ã Û ñ �‹:€ð%€òò:-ô`E+�6ô E+ôP�&ô ò:*<ôZ;&ˆfô ;&ô|f˜ô fðR? × Ò Ð,Ô -Ø × "Ò "Ð#4Ô 5Ø × &Ò &Ð'8Ô 9ôDc�fô DcôNL�vô LðD!Ð ôHE
MÐ/ô E
MôPy%Ð-ô y%ôx(Ð/ô (ôDJKÐ-õ JKrL   