
    jEs                       d dl mZ d dlZd dlZd dlZd dlZd dlZd dl	m
Z
mZmZ d dlmZ d dlmZmZmZ d dlZddlmZ ddlmZmZ dd	lmZmZ dd
lmZmZmZm Z m!Z! ddl"m#Z# ddl$m%Z% ddl&m'Z' ddl(m)Z)m*Z* ddl+m,Z,m-Z- ddl.m/Z/m0Z0m1Z1m2Z2 ddl3m4Z4 ddlm5Z5m6Z6m7Z7 ddl8m9Z9m:Z: ddl;m<Z< ddl=m>Z> g dZ? e@ejA        B                    dd                    ZC G d de<          ZD G d d          ZE	 	 d:d;d$ZF	 d d%lGmHZH d d&lIm/ZJ eHjK        eHjK        eHjL        eHjL        d'ZMd(d)d(d)d'ZNd<d/ZOn# eP$ r d<d0ZOY nw xY wd=d3ZQdddd4d>d9ZRdS )?    )annotationsN)AsyncIterator	GeneratorSequence)TracebackType)AnyCallableLiteral   )process_exception)ClientProtocolbackoff)HeadersHeadersLike)InvalidProxyMessageInvalidProxyStatusInvalidStatus
ProxyErrorSecurityError)ClientExtensionFactory) enable_client_permessage_deflate)validate_subprotocols)
USER_AGENTResponse)
CONNECTINGEvent)Proxy	get_proxyparse_proxyprepare_connect_request)StreamReader)
LoggerLikeOriginSubprotocol)WebSocketURI	parse_uri   )
Connection)race_events)connectunix_connectClientConnectionWEBSOCKETS_MAX_REDIRECTS10c                  J     e Zd ZdZdddddd fdZdefddZd  fdZ xZS )!r,   al  
    :mod:`trio` implementation of a WebSocket client connection.

    :class:`ClientConnection` provides :meth:`recv` and :meth:`send` coroutines
    for receiving and sending messages.

    It supports asynchronous iteration to receive messages::

        async for message in websocket:
            await process(message)

    The iterator exits normally when the connection is closed with close code
    1000 (OK) or 1001 (going away) or without a close code. It raises a
    :exc:`~websockets.exceptions.ConnectionClosedError` when the connection is
    closed with any other code.

    The ``ping_interval``, ``ping_timeout``, ``close_timeout``, and
    ``max_queue`` arguments have the same meaning as in :func:`connect`.

    Args:
        nursery: Trio nursery.
        stream: Trio stream connected to a WebSocket server.
        protocol: Sans-I/O connection.

       
      ping_intervalping_timeoutclose_timeout	max_queuenurserytrio.Nurserystreamtrio.abc.Streamprotocolr   r4   float | Noner5   r6   r7   *int | None | tuple[int | None, int | None]returnNonec          	         |  t                                          |||||||           t          j                    | _        d S )Nr3   )super__init__trior   response_rcvd)	selfr8   r:   r<   r4   r5   r6   r7   	__class__s	           `/workspace/show-city-briefing-agent/.venv/lib/python3.11/site-packages/websockets/trio/client.pyrC   zClientConnection.__init__E   sW     	%'%' 	 	
 	
 	
 "Z\\    Nadditional_headersHeadersLike | Noneuser_agent_header
str | Nonec                  K   | j                                         | _        || j        j                            |           | | j        j                            d|           |                     t                    4 d{V  | j                             | j                   ddd          d{V  n# 1 d{V swxY w Y   t          | j
        | j                   d{V  | j         j        | j         j        dS )z1
        Perform the opening handshake.

        Nz
User-Agent)expected_state)r<   r*   requestheadersupdate
setdefaultsend_contextr   send_requestr)   rE   stream_closedhandshake_exc)rF   rJ   rL   s      rH   	handshakezClientConnection.handshake\   s      },,..)L ''(:;;;(L ++L:KLLL$$J$?? 	5 	5 	5 	5 	5 	5 	5 	5M&&t|444	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 $,d.@AAAAAAAAA =&2--- 32s    B77
CCeventr   c                    | j         9t          |t                    sJ || _         | j                                         dS t                                          |           dS )z.
        Process one incoming event.

        N)response
isinstancer   rE   setrB   process_event)rF   rY   rG   s     rH   r^   zClientConnection.process_eventv   se     = eX.....!DM""$$$$$ GG!!%(((((rI   )r8   r9   r:   r;   r<   r   r4   r=   r5   r=   r6   r=   r7   r>   r?   r@   )rJ   rK   rL   rM   r?   r@   )rY   r   r?   r@   )	__name__
__module____qualname____doc__rC   r   rX   r^   __classcell__)rG   s   @rH   r,   r,   *   s         @ ')%'&(@B* * * * * * * *2 26(2. . . . .4) ) ) ) ) ) ) ) ) )rI   r,   c                      e Zd ZdZddddddddedddeddddeddddd	dMd4ZdNd6ZdOd7Z	dPd;Z
dQd?ZdPd@ZdRdAZdSdHZdTdIZdSdJZdUdLZdS )Vr*   aq  
    Connect to the WebSocket server at ``uri``.

    This coroutine returns a :class:`ClientConnection` instance, which you can
    use to send and receive messages.

    :func:`connect` may be used as an asynchronous context manager::

        from websockets.trio.client import connect

        async with connect(...) as websocket:
            ...

    The connection is closed automatically when exiting the context.

    :func:`connect` can be used as an infinite asynchronous iterator to
    reconnect automatically on errors::

        async for websocket in connect(...):
            try:
                ...
            except websockets.exceptions.ConnectionClosed:
                continue

    If the connection fails with a transient error, it is retried with
    exponential backoff. If it fails with a fatal error, the exception is
    raised, breaking out of the loop.

    The connection is closed automatically after each iteration of the loop.

    Args:
        uri: URI of the WebSocket server.
        stream: Preexisting TCP stream. ``stream`` overrides the host and port
            from ``uri``. You may call :func:`~trio.open_tcp_stream` to create a
            suitable TCP stream.
        ssl: Configuration for enabling TLS on the connection.
        server_hostname: Host name for the TLS handshake. ``server_hostname``
            overrides the host name from ``uri``.
        origin: Value of the ``Origin`` header, for servers that require it.
        extensions: List of supported extensions, in order in which they
            should be negotiated and run.
        subprotocols: List of supported subprotocols, in order of decreasing
            preference.
        compression: The "permessage-deflate" extension is enabled by default.
            Set ``compression`` to :obj:`None` to disable it. See the
            :doc:`compression guide <../../topics/compression>` for details.
        additional_headers: Arbitrary HTTP headers to add to the handshake
            request.
        user_agent_header: Value of  the ``User-Agent`` request header.
            It defaults to ``"Python/x.y.z websockets/X.Y"``.
            Setting it to :obj:`None` removes the header.
        proxy: If a proxy is configured, it is used by default. Set ``proxy``
            to :obj:`None` to disable the proxy or to the address of a proxy
            to override the system configuration. See the :doc:`proxy docs
            <../../topics/proxies>` for details.
        proxy_ssl: Configuration for enabling TLS on the proxy connection.
        proxy_server_hostname: Host name for the TLS handshake with the proxy.
            ``proxy_server_hostname`` overrides the host name from ``proxy``.
        process_exception: When reconnecting automatically, tell whether an
            error is transient or fatal. The default behavior is defined by
            :func:`process_exception`. Refer to its documentation for details.
        open_timeout: Timeout for opening the connection in seconds.
            :obj:`None` disables the timeout.
        ping_interval: Interval between keepalive pings in seconds.
            :obj:`None` disables keepalive.
        ping_timeout: Timeout for keepalive pings in seconds.
            :obj:`None` disables timeouts.
        close_timeout: Timeout for closing the connection in seconds.
            :obj:`None` disables the timeout.
        reconnect_delays: Delays in seconds between reconnection attempts.
            Default is exponential backoff with 5s jitter, capped at 60s.
        max_size: Maximum size of incoming messages in bytes.
            :obj:`None` disables the limit. You may pass a ``(max_message_size,
            max_fragment_size)`` tuple to set different limits for messages and
            fragments when you expect long messages sent in short fragments.
        max_queue: High-water mark of the buffer where frames are received.
            It defaults to 16 frames. The low-water mark defaults to ``max_queue
            // 4``. You may pass a ``(high, low)`` tuple to set the high-water
            and low-water marks. If you want to disable flow control entirely,
            you may set it to ``None``, although that's a bad idea.
        logger: Logger for this client.
            It defaults to ``logging.getLogger("websockets.client")``.
            See the :doc:`logging guide <../../topics/logging>` for details.
        create_connection: Factory for the :class:`ClientConnection` managing
            the connection. Set it to a wrapper or a subclass to customize
            connection handling.

    Any other keyword arguments are passed to :func:`~trio.open_tcp_stream`.

    Raises:
        InvalidURI: If ``uri`` isn't a valid WebSocket URI.
        InvalidProxy: If ``proxy`` isn't a valid proxy.
        OSError: If the TCP connection fails.
        InvalidHandshake: If the opening handshake fails.
        TimeoutError: If the opening handshake times out.

    NdeflateTr1   r0   i   r2   )r:   sslserver_hostnameorigin
extensionssubprotocolscompressionrJ   rL   proxy	proxy_sslproxy_server_hostnamer   open_timeoutr4   r5   r6   reconnect_delaysmax_sizer7   loggercreate_connectionuristrr:   trio.abc.Stream | Nonerf   ssl_module.SSLContext | Nonerg   rM   rh   Origin | Noneri   'Sequence[ClientExtensionFactory] | Nonerj   Sequence[Subprotocol] | Nonerk   rJ   rK   rL   rl   str | Literal[True] | Nonerm   rn   r   'Callable[[Exception], Exception | None]ro   r=   r4   r5   r6   rp   Callable[[], Generator[float]]rq   r>   r7   rr   LoggerLike | Noners   type[ClientConnection] | Nonekwargsr   r?   r@   c               P   || _         t          |          | _        | j        j        s|t	          d          |t          |           |dk    rt          |          }n|t	          d|           |t          j        d          }|t          }|| _
        || _        || _        |	| _        |
| _        || _        || _        || _        || _        || _        || _        || _        || _        || _        t1          |||||          | _        t1          ||||          | _        d S )Nz-ssl argument is incompatible with a ws:// URIre   zunsupported compression: zwebsockets.client)rh   ri   rj   rq   rr   r3   )rt   r&   ws_urisecure
ValueErrorr   r   logging	getLoggerr,   r:   rf   rg   rJ   rL   rl   rm   rn   r   ro   rp   rr   rs   open_tcp_stream_kwargsdictprotocol_kwargsconnection_kwargs)rF   rt   r:   rf   rg   rh   ri   rj   rk   rJ   rL   rl   rm   rn   r   ro   r4   r5   r6   rp   rq   r7   rr   rs   r   s                            rH   rC   zconnect.__init__   sc   H nn{! 	NcoLMMM#!,///)##9*EEJJ$FFFGGG>&':;;F$ 0."4!2
"%:"!2( 0!2&,##!% 
  
  
 "&'%'	"
 "
 "
rI   r;   c                H  K   | j                                         }| j        }|                    dd          rd}|du rt	          | j                  }|                    dd          r t          j        |d                    d{V S |t          |          }|j
        dd         dk    r1t          || j        |                    dd          	           d{V S |j
        dd
         dk    rM|j
        dk    r| j        t          d          t          || j        f| j        | j        | j        d| d{V S t#          d          |                    d| j        j                   |                    d| j        j                   t          j        di | d{V S )zFOpen a TCP or Unix connection to the server, possibly through a proxy.unixFNTpath   sockslocal_address)
local_addr   httphttpsz8proxy_ssl argument is incompatible with an http:// proxyrL   rf   rg   z&parse_proxy returned unsupported proxyhostport )r   copyrl   getr   r   poprD   open_unix_socketr   schemeconnect_socks_proxyrm   r   connect_http_proxyrL   rn   AssertionErrorrS   r   r   open_tcp_stream)rF   r   rl   proxy_parseds       rH   r   zconnect.open_tcp_stream?  s!     ,1133
::fe$$ 	ED==dk**E::fe$$ #	8.vf~>>>>>>>>>&u--L"2A2&'110 K  &zz/4@@          $RaR(F22&'11dn6P$R   0 K '+&<$($>           %%MNNN fdk&6777fdk&6777-77777777777rI   c                   K   | j         t          j                    }n| j         }| j        | j        j        }n| j        }t          j        |||d          }|                                 d{V  |S )zEnable TLS on the connection.NTrg   https_compatible)	rf   
ssl_modulecreate_default_contextrg   r   r   rD   	SSLStreamdo_handshake)rF   r:   rf   rg   
ssl_streams        rH   
enable_tlszconnect.enable_tlsn  s      8355CC(C'"k.OO"2O^+!	
 
 

 %%'''''''''rI   r8   r9   r,   c                  K   | j         |                                  d{V }n| j         }	 | j        j        r|                     |           d{V }t          | j        fi | j        } | j        |||fi | j        }|	                    | j
        | j                   d{V  |S # t          j        $ r* t          j        |           d{V  t          d          t           $ r t          j        |           d{V   w xY w)zCreate a WebSocket connection.Nznursery should be canceled)r:   r   r   r   r   r   r   rs   r   rX   rJ   rL   rD   	Cancelledaclose_forcefullyr   	Exception)rF   r8   r:   r<   
connections        rH   open_connectionzconnect.open_connection  s      ;//11111111FF[F#	{! 7#v66666666% & H 0/  (	 J &&'&        
 ~ 	? 	? 	?(000000000 !!=>>> 	 	 	 (000000000	s   A:B( (ADexcr   Exception | strc                R   t          |t                    r|j        j        dv rd|j        j        v s|S | j        }t          j                            | j	        |j        j        d                   }t          |          }| j        t          d| d          S |j        r|j        st          d|           S |j        |j        k    s |j        |j        k    s|j        |j        k    r| j                            dd          rt          d	| d
          S | j                            d          | j                            d          t          d	| d          S | j        Bt)          d t)          | j                                                  D                       | _        |S )z
        Determine whether a connection error is a redirect that can be followed.

        Return the new URI if it's a valid redirect. Else, return an exception.

        ),  i-  i.  i/  i3  i4  LocationNzcannot follow redirect to z with a preexisting streamz)cannot follow redirect to non-secure URI r   Fz'cannot follow cross-origin redirect to z with a Unix socketr   r   z with an explicit host or portc              3  P   K   | ]!\  }}|                                 d v||fV  "dS ))authorizationcookiezproxy-authorizationN)lower).0keyvalues      rH   	<genexpr>z+connect.process_redirect.<locals>.<genexpr>  s\        &C99;;QR R eR R R R rI   )r\   r   r[   status_coderQ   r   urllibparseurljoinrt   r&   r:   r   r   r   r   r   r   r   rJ   r   	raw_items)rF   r   
old_ws_urinew_uri
new_ws_uris        rH   process_redirectzconnect.process_redirect  s    sM**	(  cl222J[
,&&tx1Ej1QRRw''
 ;"PWPPP  
  	XZ%6 	X !VW!V!VWWW !222*/11*/11 *..vu== !*g * * *   +//77C.226::F!5g 5 5 5   &2*1 *1$2I*J*J*T*T*V*V  + +' rI   c                |  K   	 | j         t          j                    nt          j        | j                   5  t	          t
                    D ]}	 |                     |           d {V }|                                 |c cd d d            S # t          $ rW}| 	                    |          }t          |t                    r||u r |||| _        t          |          | _        Y d }~d }~ww xY wt          dt
           d          # 1 swxY w Y   d S # t          j        $ r}t!          d          |d }~ww xY w)Nz
more than z
 redirectsz"timed out during opening handshake)ro   rD   CancelScope
fail_afterrangeMAX_REDIRECTSr   start_keepaliver   r   r\   rt   r&   r   r   TooSlowErrorTimeoutError)rF   r8   _r   r   
exc_or_uris         rH   r*   zconnect.connect  s     	N $,  """_T%677P P
 }-- P PA*+/+?+?+H+H%H%H%H%H%H%H
  #22444)))1P P P P P P P P % % % %%)%:%:3%?%?
%j)<< 
%)S00 %&0c 9 (2DH*3J*?*?DK$HHHH%$ ((N](N(N(NOOO5P P P P P P P P P P8   	N 	N 	NCDD#M	Nse   3D D
B*D
D 
C/AC*%D
*C//D

DD DD D;&D66D;c                4  K   |                                   d {V  	 |                     | j                   d {V | _        | j        S # t          $ rC}|                     t          |          ||j                   d {V  t          d          d }~ww xY w)Nz4expected __aexit_nursery__ to re-raise the exception)	__aenter_nursery__r*   r8   r   BaseException__aexit_nursery__type__traceback__r   )rF   r   s     rH   
__aenter__zconnect.__aenter__  s      %%'''''''''	Y$(LL$>$>>>>>>>DO?" 	Y 	Y 	Y((cC9JKKKKKKKKK !WXXX	Ys   +A
 

B>BBexc_typetype[BaseException] | None	exc_valueBaseException | None	tracebackTracebackType | Nonec                   K   	 	 | j                                          d {V  | ` n# | ` w xY w	 |                     |||           d {V  d S # |                     |||           d {V  w xY w)N)r   acloser   )rF   r   r   r   s       rH   	__aexit__zconnect.__aexit__%  s      	I$o,,.........OODO####O((9iHHHHHHHHHHH$((9iHHHHHHHHHHs   ' A +A A-c                   K   t          | d          rt          d          t          j                    | _        | j                                         d {V | _        d S )Nnursery_managerzconnect() isn't reentrant)hasattrRuntimeErrorrD   open_nurseryr   r   r8   )rF   s    rH   r   zconnect.__aenter_nursery__3  se      4*++ 	<:;;;#022!1<<>>>>>>>>rI   c                R  K   	 | j                             |||           d {V  nw# t          $ rj}t          |t                    sJ 	 t
          j                            |           n(# t
          j        j        $ r t          d          |w xY wY d }~nd }~ww xY w| ` d S # | ` w xY w)Nz8unexpected multiple exceptions; please file a bug report)
r   r   r   r\   BaseExceptionGrouprD   _util!raise_single_exception_from_groupMultipleExceptionErrorr   )rF   r   r   r   r   s        rH   r   zconnect.__aexit_nursery__9  s      	%&009iPPPPPPPPPP 	 	 	c#566666
<<SAAAA:4   $N  BAAAA	 $$$$$$$$sC   "' B" 
BB	A)(B)%BBB" BB" "B&AsyncIterator[ClientConnection]c               &  K   d }	 	 | 4 d {V }|W V  d d d           d {V  n# 1 d {V swxY w Y   d }n# t           $ r}	 |                     |          }n# t           $ r}|}Y d }~nd }~ww xY w||u r |||||                                 }t          |          }| j                            d|t          j        |          d                                                    t          j
        |           d {V  Y d }~nd }~ww xY w)NTz0connect failed; reconnecting in %.1f seconds: %sr   )r   r   rp   nextrr   infor   format_exception_onlystriprD   sleep)rF   delaysr   r   new_exc
raised_excdelays          rH   	__aiter__zconnect.__aiter__S  s     *.#	" % % % % % % %:$$$$$% % % % % % % % % % % % % % % % % % % % % % % % % % %B ?  ( ( (
)"44S99GG  ) ) )(GGGGGG)
 c>>&!s* >!2244FV  F3C88;AACC  
 j''''''''''''''7(	#	sR   ; '; 
1; 1; 
DAD	
A2&A-(D	-A22BD		D)2rt   ru   r:   rv   rf   rw   rg   rM   rh   rx   ri   ry   rj   rz   rk   rM   rJ   rK   rL   rM   rl   r{   rm   rw   rn   rM   r   r|   ro   r=   r4   r=   r5   r=   r6   r=   rp   r}   rq   r>   r7   r>   rr   r~   rs   r   r   r   r?   r@   )r?   r;   )r:   r;   r?   r;   )r8   r9   r?   r,   )r   r   r?   r   )r?   r,   )r   r   r   r   r   r   r?   r@   )r?   r@   )r?   r   )r_   r`   ra   rb   r   r   r   rC   r   r   r   r   r*   r   r   r   r   r   r   rI   rH   r*   r*      sg       ` `T *.,0&* $>B59"+15(2,026,0EV%'&(%'&(;B?D@B$(;?AQ
 Q
 Q
 Q
 Q
 Q
f-8 -8 -8 -8^   &+ + + +ZE E E EN N  N  N  NNY Y Y YI I I I? ? ? ?% % % %4% % % % % %rI   r*   r   rM   rt   r   r   r?   c                Z    ||                     d          d}nd}t          d|d| d|S )a  
    Connect to a WebSocket server listening on a Unix socket.

    This function accepts the same keyword arguments as :func:`connect`.

    It's only available on Unix.

    It's mainly useful for debugging servers listening on Unix sockets.

    Args:
        path: File system path to the Unix socket.
        uri: URI of the WebSocket server. ``uri`` defaults to
            ``ws://localhost/`` or, when a ``ssl`` argument is provided, to
            ``wss://localhost/``.

    Nrf   zws://localhost/zwss://localhost/T)rt   r   r   r   )r   r*   )r   rt   r   s      rH   r+   r+   {  sD    * {::e$#CC$C;sD;;F;;;rI   )	ProxyType)r   )socks5hsocks5socks4asocks4TFrl   r   r   r%   r;   c           	     R  K   t          t          | j                 | j        | j        | j        | j        t          | j                           }	 t          j	         |j
        |j        |j        fi | d{V           S # t          $ r  t          $ r}t          d          |d}~ww xY w)z0Connect via a SOCKS proxy and return the socket.Nz failed to connect to SOCKS proxy)
SocksProxySOCKS_PROXY_TYPESr   r   r   usernamepasswordSOCKS_PROXY_RDNSrD   SocketStreamr*   OSErrorr   r   )rl   r   r   socks_proxyr   s        rH   r   r     s       !el+JJNNU\*
 
	J$)k)&+v{MMfMMMMMMMM    	 	 	 	J 	J 	J?@@cI	Js   0A= =B&B!!B&c                $   K   t          d          )Nz6connecting through a SOCKS proxy requires python-socks)ImportError)rl   r   r   s      rH   r   r     s      
 RSSSrI   r:   r   c                  K   t                      }t          j        |j        |j        |j        d          }	 	 |                     d           d {V }|r|                    |           n|                                 t          |           W# t          $ rS}t          |j        t                    sJ |j        }d|j        cxk    rdk     r
n n|cY d }~S t          |          d }~wt          $ r}t!          d          |d }~ww xY w)NT)rl   i      r   z0did not receive a valid HTTP response from proxy)r!   r   r   	read_line
read_exactread_to_eofreceive_some	feed_datafeed_eofr   StopIterationr\   r   r   r   r   r   )r:   readerparserdatar   r[   s         rH   read_connect_responser    sX     ^^F^	  F	,,T22222222D "  &&&&!!!LLL	  / / /#)X.....9(&,,,,,,,,,OOOOOO$X...   !>
 
	s0   AB 
D9C)DC))D6DDr   rL   rf   rw   rg   c                 K   t          j        | j        | j        fi | d {V }	 | j        dk    rR|t          j                    }|| j        }t          j        |||d          }|                                 d {V  |}t          | ||          }|
                    |           d {V  t          |           d {V  n5# t           j        t          f$ r t          j        |           d {V   w xY w|S )Nr   Tr   )rD   r   r   r   r   r   r   r   r   r    send_allr  r   r   r   )	rl   r   rL   rf   rg   r   r:   r   rP   s	            rH   r   r     sa      '
EJII&IIIIIIIIF<7""{ 799&"'* /!%	  J ))+++++++++F *%9JKKoog&&&&&&&&&#F++++++++++NI&   $V,,,,,,,,, Ms   BC 2C8)NN)r   rM   rt   rM   r   r   r?   r*   )rl   r   r   r%   r   r   r?   r;   )r:   r;   r?   r   )rl   r   r   r%   rL   rM   rf   rw   rg   rM   r   r   r?   r;   )S
__future__r   r   osrf   r   r   urllib.parser   collections.abcr   r   r   typesr   typingr   r	   r
   rD   asyncio.clientr   clientr   r   datastructuresr   r   
exceptionsr   r   r   r   r   extensions.baser   extensions.permessage_deflater   rQ   r   http11r   r   r<   r   r   rl   r   r   r   r    streamsr!   r"   r#   r$   rt   r%   r&   r   r(   utilsr)   __all__intenvironr   r   r,   r*   r+   python_socksr   python_socks.async_.trior   SOCKS5SOCKS4r   r  r   r  r  r   r   rI   rH   <module>r.     s   " " " " " "  				             > > > > > > > > > >       ) ) ) ) ) ) ) ) ) )  . . . . . . , , , , , , , , 1 1 1 1 1 1 1 1              5 4 4 4 4 4 L L L L L L + + + + + + ) ) ) ) ) ) ) ) ( ( ( ( ( ( ( ( J J J J J J J J J J J J " " " " " " 4 4 4 4 4 4 4 4 4 4 ) ) ) ) ) ) ) ) " " " " " "       :
9
9BJNN#=tDDEEX) X) X) X) X)z X) X) X)xr r r r r r r rl < < < < <:4J&&&&&&<<<<<< #"#"	  	 J J J J J1  T T TT T T T T TTf   B %)(,"&% % % % % % % %s   :D- -	D98D9