
    עiw                    0   d dl mZ d dlZd dlmZ d dlmZmZmZm	Z	m
Z
mZmZm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mZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$ d
dl%m&Z& ddlm'Z'm(Z(m)Z) ddl*m+Z+m,Z,m-Z- ddl.m/Z/ ddl0m1Z1m2Z2 ddl3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9 ddl:m;Z;m<Z< ddl=m>Z>m?Z?m@Z@ ddlAmBZBmCZC ddlDmEZE ddlFmGZH ddlImJZK  G d dee4         ZL G d dee4         ZM G d dee4         ZN G d d ee4         ZO G d! d"ee4         ZP G d# d$      ZQd'd%ZRd(d&ZSy))    )annotationsN)TracebackType)TYPE_CHECKINGAnyGenericCallableIterable	AwaitableAsyncIteratorcast)SelfIteratorassert_never)	from_json   )ParsedChoiceSnapshotParsedChatCompletionSnapshot#ParsedChatCompletionMessageSnapshot)
ChunkEventContentDoneEventRefusalDoneEventContentDeltaEventRefusalDeltaEventLogprobsContentDoneEventLogprobsRefusalDoneEventChatCompletionStreamEventLogprobsContentDeltaEventLogprobsRefusalDeltaEvent"FunctionToolCallArgumentsDoneEvent#FunctionToolCallArgumentsDeltaEvent   )accumulate_delta   )OmitIncExomit)is_givenconsume_sync_iteratorconsume_async_iterator)
model_dump)buildconstruct_type   )ResponseFormatThas_parseable_inputmaybe_parse_contentparse_chat_completionget_input_tool_by_nameparse_function_tool_arguments)StreamAsyncStream)ChatCompletionChunkParsedChatCompletionChatCompletionToolUnionParam)LengthFinishReasonErrorContentFilterFinishReasonError)ChoiceLogprobs)Choice)ResponseFormatc                      e Zd ZdZ	 	 	 	 	 	 	 	 ddZddZddZddZ	 	 	 	 	 	 	 	 ddZddZ	ddZ
dd	Zedd
       ZddZy)ChatCompletionStream+  Wrapper over the Chat Completions streaming API that adds helpful
    events such as `content.done`, supports automatically parsing
    responses & tool calls and accumulates a `ChatCompletion` object
    from each individual chunk.

    https://platform.openai.com/docs/api-reference/streaming
    c                   || _         |j                  | _        | j                         | _        t        ||      | _        y Nresponse_formatinput_tools_raw_streamresponse	_response
__stream__	_iteratorChatCompletionStreamState_stateself
raw_streamrD   rE   s       g/sites/domain-asset-master/.venv/lib/python3.12/site-packages/openai/lib/streaming/chat/_completions.py__init__zChatCompletionStream.__init__7   6     &#,,*/]hi    c                6    | j                   j                         S N)rK   __next__rO   s    rQ   rW   zChatCompletionStream.__next__C   s    ~~&&((rT   c              #  6   K   | j                   D ]  }|  y wrV   rK   rO   items     rQ   __iter__zChatCompletionStream.__iter__F   s     NN 	DJ	s   c                    | S rV    rX   s    rQ   	__enter__zChatCompletionStream.__enter__J   s    rT   c                $    | j                          y rV   closerO   exc_typeexcexc_tbs       rQ   __exit__zChatCompletionStream.__exit__M   s     	

rT   c                8    | j                   j                          yz
        Close the response and release the connection.

        Automatically called if the response body is read to completion.
        N)rI   rc   rX   s    rQ   rc   zChatCompletionStream.closeU   s     	rT   c                V    | j                          | j                  j                         S )V  Waits until the stream has been read to completion and returns
        the accumulated `ParsedChatCompletion` object.

        If you passed a class type to `.stream()`, the `completion.choices[0].message.parsed`
        property will be the content deserialised into that class, if there was any content returned
        by the API.
        
until_donerM   get_final_completionrX   s    rQ   ro   z)ChatCompletionStream.get_final_completion]   s!     	{{//11rT   c                    t        |        | S )*Blocks until the stream has been consumed.)r(   rX   s    rQ   rn   zChatCompletionStream.until_doneh   s    d#rT   c                .    | j                   j                  S rV   rM   current_completion_snapshotrX   s    rQ   rt   z0ChatCompletionStream.current_completion_snapshotm       {{666rT   c              #     K   | j                   D ]4  }t        |      s| j                  j                  |      }|D ]  }|  6 y wrV   rG   $_is_valid_chat_completion_chunk_weakrM   handle_chunkrO   	sse_eventevents_to_fireevents       rQ   rJ   zChatCompletionStream.__stream__q   sN     )) 	I7	B![[55i@N' 		s   AAN)rP   zStream[ChatCompletionChunk]rD   2type[ResponseFormatT] | ResponseFormatParam | OmitrE   -Iterable[ChatCompletionToolUnionParam] | OmitreturnNoner   z*ChatCompletionStreamEvent[ResponseFormatT])r   z4Iterator[ChatCompletionStreamEvent[ResponseFormatT]]r   r   re   ztype[BaseException] | Nonerf   zBaseException | Nonerg   zTracebackType | Noner   r   r   r   r   z%ParsedChatCompletion[ResponseFormatT]r   r   )__name__
__module____qualname____doc__rR   rW   r]   r`   rh   rc   ro   rn   propertyrt   rJ   r_   rT   rQ   r?   r?   .   s    
j 0
j L	
j
 C
j 

j), " %	
 
	2
 7 7rT   r?   c                  H    e Zd ZdZ	 	 	 	 	 	 	 	 ddZddZ	 	 	 	 	 	 	 	 ddZy)	ChatCompletionStreamManageraF  Context manager over a `ChatCompletionStream` that is returned by `.stream()`.

    This context manager ensures the response cannot be leaked if you don't read
    the stream to completion.

    Usage:
    ```py
    with client.chat.completions.stream(...) as stream:
        for event in stream:
            ...
    ```
    c               <    d | _         || _        || _        || _        y rV   )$_ChatCompletionStreamManager__stream)_ChatCompletionStreamManager__api_request-_ChatCompletionStreamManager__response_format)_ChatCompletionStreamManager__input_toolsrO   api_requestrD   rE   s       rQ   rR   z$ChatCompletionStreamManager.__init__   s%     GK(!0(rT   c                    | j                         }t        || j                  | j                        | _        | j                  S N)rP   rD   rE   )r   r?   r   r   r   rO   rP   s     rQ   r`   z%ChatCompletionStreamManager.__enter__   s=    '')
,! 22**
 }}rT   c                R    | j                   | j                   j                          y y rV   )r   rc   rd   s       rQ   rh   z$ChatCompletionStreamManager.__exit__   s#     ==$MM! %rT   N)r   z)Callable[[], Stream[ChatCompletionChunk]]rD   r~   rE   r   r   r   )r   z%ChatCompletionStream[ResponseFormatT]r   )r   r   r   r   rR   r`   rh   r_   rT   rQ   r   r   z   sd    
)>
) L	
)
 C
) 

)	"," "" %	"
 
"rT   r   c                      e Zd ZdZ	 	 	 	 	 	 	 	 ddZddZddZddZ	 	 	 	 	 	 	 	 ddZddZ	ddZ
dd	Zedd
       ZddZy)AsyncChatCompletionStreamr@   c                   || _         |j                  | _        | j                         | _        t        ||      | _        y rB   rF   rN   s       rQ   rR   z"AsyncChatCompletionStream.__init__   rS   rT   c                R   K   | j                   j                          d {   S 7 wrV   )rK   	__anext__rX   s    rQ   r   z#AsyncChatCompletionStream.__anext__   s     ^^--////s   '%'c               H   K   | j                   2 3 d {   }| 7 
6 y wrV   rZ   r[   s     rQ   	__aiter__z#AsyncChatCompletionStream.__aiter__   s&     .. 	 	$J	.s   "  " "c                   K   | S wrV   r_   rX   s    rQ   
__aenter__z$AsyncChatCompletionStream.__aenter__   s     s   c                @   K   | j                          d {    y 7 wrV   rb   rd   s       rQ   	__aexit__z#AsyncChatCompletionStream.__aexit__   s      jjls   c                T   K   | j                   j                          d{    y7 wrj   )rI   acloserX   s    rQ   rc   zAsyncChatCompletionStream.close   s      nn##%%%s   (&(c                r   K   | j                          d{    | j                  j                         S 7 w)rl   Nrm   rX   s    rQ   ro   z.AsyncChatCompletionStream.get_final_completion   s0      oo{{//11 	 s   757c                8   K   t        |        d{    | S 7 w)rq   N)r)   rX   s    rQ   rn   z$AsyncChatCompletionStream.until_done   s     $T*** 	+s   c                .    | j                   j                  S rV   rs   rX   s    rQ   rt   z5AsyncChatCompletionStream.current_completion_snapshot   ru   rT   c                  K   | j                   2 3 d {   }t        |      s| j                  j                  |      }|D ]  }| 	 =7 86 y wrV   rw   rz   s       rQ   rJ   z$AsyncChatCompletionStream.__stream__   sW     #// 	 	)7	B![[55i@N' 		/s%   AAAA5AAAN)rP   z AsyncStream[ChatCompletionChunk]rD   r~   rE   r   r   r   r   )r   z9AsyncIterator[ChatCompletionStreamEvent[ResponseFormatT]]r   r   r   r   r   )r   r   r   r   rR   r   r   r   r   rc   ro   rn   r   rt   rJ   r_   rT   rQ   r   r      s    
j 5
j L	
j
 C
j 

j0, " %	
 
&	2
 7 7rT   r   c                  H    e Zd ZdZ	 	 	 	 	 	 	 	 ddZddZ	 	 	 	 	 	 	 	 ddZy)	 AsyncChatCompletionStreamManageraQ  Context manager over a `AsyncChatCompletionStream` that is returned by `.stream()`.

    This context manager ensures the response cannot be leaked if you don't read
    the stream to completion.

    Usage:
    ```py
    async with client.chat.completions.stream(...) as stream:
        for event in stream:
            ...
    ```
    c               <    d | _         || _        || _        || _        y rV   ))_AsyncChatCompletionStreamManager__stream._AsyncChatCompletionStreamManager__api_request2_AsyncChatCompletionStreamManager__response_format._AsyncChatCompletionStreamManager__input_toolsr   s       rQ   rR   z)AsyncChatCompletionStreamManager.__init__  s%     LP(!0(rT   c                   K   | j                    d {   }t        || j                  | j                        | _        | j                  S 7 7wr   )r   r   r   r   r   r   s     rQ   r   z+AsyncChatCompletionStreamManager.__aenter__  sF     ---
1! 22**
 }} .s   AA
8Ac                n   K   | j                   #| j                   j                          d {    y y 7 wrV   )r   rc   rd   s       rQ   r   z*AsyncChatCompletionStreamManager.__aexit__  s0      ==$--%%''' %'s   *535N)r   z+Awaitable[AsyncStream[ChatCompletionChunk]]rD   r~   rE   r   r   r   )r   z*AsyncChatCompletionStream[ResponseFormatT]r   )r   r   r   r   rR   r   r   r_   rT   rQ   r   r      sd    
)@
) L	
)
 C
) 

)	(,( "( %	(
 
(rT   r   c                  p    e Zd ZdZeed	 	 	 	 	 ddZddZedd       ZddZ	ddZ
ddZ	 	 	 	 	 	 dd	Zy
)rL   aS  Helper class for manually accumulating `ChatCompletionChunk`s into a final `ChatCompletion` object.

    This is useful in cases where you can't always use the `.stream()` method, e.g.

    ```py
    from openai.lib.streaming.chat import ChatCompletionStreamState

    state = ChatCompletionStreamState()

    stream = client.chat.completions.create(..., stream=True)
    for chunk in response:
        state.handle_chunk(chunk)

        # can also access the accumulated `ChatCompletion` mid-stream
        state.current_completion_snapshot

    print(state.get_final_completion())
    ```
    )rE   rD   c                   d | _         g | _        t        |      r|D cg c]  }| c}ng | _        || _        t        j                  |      r|| _        y t        | _        y c c}w rV   )	7_ChatCompletionStreamState__current_completion_snapshot/_ChatCompletionStreamState__choice_event_statesr'   _input_tools_response_formatinspectisclassr&   _rich_response_format)rO   rE   rD   tools       rQ   rR   z"ChatCompletionStreamState.__init__9  s\     SW*=?">F{>Sk:dT:Y[ /EL__UdEe/"ko" ;s   	A!c                Z    t        | j                  | j                  | j                        S )zParse the final completion object.

        Note this does not provide any guarantees that the stream has actually finished, you must
        only call this method when the stream is finished.
        )chat_completionrD   rE   )r1   rt   r   r   rX   s    rQ   ro   z.ChatCompletionStreamState.get_final_completionF  s,     % << 66))
 	
rT   c                6    | j                   J | j                   S rV   )r   rX   s    rQ   rt   z5ChatCompletionStreamState.current_completion_snapshotR  s     11===111rT   c                h    | j                  |      | _        | j                  || j                        S )zTAccumulate a new chunk into the snapshot and returns an iterable of events to yield.)chunkcompletion_snapshot)_accumulate_chunkr   _build_events)rO   r   s     rQ   ry   z&ChatCompletionStreamState.handle_chunkW  s9    -1-C-CE-J*!! $ B B " 
 	
rT   c                    	 | j                   |j                     S # t        $ r6 t        | j                        }| j                   j                  |       |cY S w xY w)N)rE   )r   index
IndexErrorChoiceEventStater   append)rO   choicechoice_states      rQ   _get_choice_statez+ChatCompletionStreamState._get_choice_state`  sU    	 --fll;; 	 +8I8IJL&&--l;	 s    <AAc                T   | j                   }|t        |      S |j                  D ]  }	 |j                  |j                     }|j                  j
                  xs g }t        t        t        t        t        t        dt        |j                  t        t        dt        |j                  j
                  xs g       D ci c]  \  }}|dddii c}}d                  t        d|j                  j                                                 |_        t        |      D ]z  \  }}	|j                  j
                  xs g |   }
|	j                  dk(  r7|
j                  dk(  sJ |	j                   j"                  |
j                   _        it$        spt'        |	       | 	 |j.                  rf|j.                  |_        t1        | j2                  | j4                        r4|j.                  dk(  rt7        |      |j.                  dk(  r
t9               |j                  j:                  r|j                  j<                  sst?        | j@                        r^|j                  j:                  jC                         r:tE        tG        |j                  j:                  d      d      |j                  _$        |j                  j
                  xs g D ]  }|j                  j
                  xs g |j                     }|j                  dk(  rtK        | j4                  |j                   jL                        }|sg|jO                  di       jO                  d      s|j                   jP                  stE        tG        |j                   jP                  d      d      |j                   _        t$        st'        |        |jR                  |jR                  AtU        tV        |jR                  j:                  |jR                  j<                        |_)        |jR                  j:                  r`|jR                  j:                  g |jR                  _        |jR                  j:                  jY                  |jR                  j:                         |jR                  j<                  s}|jR                  j<                  g |jR                  _        |jR                  j<                  jY                  |jR                  j<                          |jZ                  |_-        |j\                  |_.        |S c c}}w # t(        $ rn t        t*        t        t*        i |j                  ddh	      d
|j                  j                         i            }|j                  j-                  |       Y w xY w)Nzdict[object, object]Tfunctionparsed_arguments)parsed
tool_calls)excludetype_valuedeltaexclude_unsetr   messagerC   length)
completioncontent_filterzutf-8)partial_mode)rE   namestrict)contentrefusal)/r   $_convert_initial_chunk_into_snapshotchoicesr   r   r   r   r   r,   r"   r*   r%   	enumerater   to_dicttyper   r   r   r   r   r   r   finish_reasonr/   r   r   r9   r:   r   r   r'   r   lstripr   bytesr   r2   r   get	argumentslogprobsr+   r;   extendusagesystem_fingerprint)rO   r   r   r   choice_snapshotprevious_tool_callsidx_
tool_index	prev_toolnew_tooltool_call_chunktool_call_snapshot
input_tools                 rQ   r   z+ChatCompletionStreamState._accumulate_chunkh  s   "@@&7>>mm x	YF7D"5"="=fll"K&5&=&=&H&H&NB#*.7"A.  6 *$3$;$; -1(-6: ?HH_H_HjHjHpnp>q;.4:C 14jCUW[B\5]0];.)*
-&!"( !!79M9M9OP++'@ .77J-K 0)J	 / 7 7 B B Hb*UH ~~3'}}
:::=F=O=O=`=`)):&$Y/0* ##060D0D-&t7L7LZ^ZkZkl++x7 6ATUU++/??<>>  ''//'//77T778#++33::<1:/11997C!%2''.
 $*<<#:#:#@b 5&5&=&=&H&H&NBP_PePe%f"%**j8!7$($5$5<N<W<W<\<\"J
 #&NN:r:>>xH.77AAGP!"4"="="G"GQ)-H*33D # !34%5( *"++3/4& & 7 7 & 7 70O, ..*33;;C?AO44<'0088??@W@WX..*33;;C?AO44<'0088??@W@WXqx	Yt %*KK!161I1I.""O;..  D"&("2$//dWI/V%v||';';'=	# $++22?CDs,   BT0>T*,CT0T0*T00A3V'&V'c               F   g }|j                  t        t        d||             |j                  D ]l  }| j	                  |      }|j                  |j
                     }|j                  j                  u|j                  j                  _|j                  t        t        d|j                  j                  |j                  j                  |j                  j                               |j                  j                  `|j                  j                  J|j                  t        t        d|j                  j                  |j                  j                               |j                  j                  r|j                  j                  }|J |j                  j                  D ]  }||j
                     }	|	j                  dk(  r|j                  J |j                  t        t         d|	j                  j"                  |j
                  |	j                  j$                  |	j                  j&                  |j                  j$                  xs d	
             t(        st+        |	        |j,                  |j,                  |j,                  j                  r`|j,                  j                  rJ|j                  t        t.        d|j,                  j                  |j,                  j                               |j,                  j                  r`|j,                  j                  rJ|j                  t        t0        d|j,                  j                  |j,                  j                               |j3                  |j5                  ||| j6                               o |S )Nr   )r   r   snapshotzcontent.delta)r   r   r   r   zrefusal.delta)r   r   r   r   z#tool_calls.function.arguments.delta )r   r   r   r   r   arguments_deltazlogprobs.content.delta)r   r   r   zlogprobs.refusal.delta)r   r   r   )choice_chunkr   rD   )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   get_done_eventsr   )
rO   r   r   r|   r   r   r   r   tool_call_delta	tool_calls
             rQ   r   z'ChatCompletionStreamState._build_events  s    LN*7%BUV	
 mm K	F11&9L199&,,GO||##/O4K4K4S4S4_%%),$ll22!0!8!8!@!@.66== ||##/O4K4K4S4S4_%%),$ll22!0!8!8!@!@	 ||&&,44??
!---'-||'>'> 0O *?+@+@ AI ~~3.77CCC&--! C%J%.%7%7%<%<&5&;&;*3*<*<*F*F1:1C1C1T1T0?0H0H0R0R0XVX
 '$Y/#0& */G/G/S??**/G/G/O/O"))5!9$*OO$;$;%4%=%=%E%E	 ??**/G/G/O/O"))5!9$*OO$;$;%4%=%=%E%E	 !!,,!'$3$($9$9 - KK	Z rT   N)rE   r   rD   r~   r   r   r   r   )r   r6   r   z4Iterable[ChatCompletionStreamEvent[ResponseFormatT]])r   ChoiceChunkr   r   r   r6   r   r   )r   r6   r   r   r   0list[ChatCompletionStreamEvent[ResponseFormatT]])r   r   r   r   r&   rR   ro   r   rt   ry   r   r   r   r_   rT   rQ   rL   rL   $  s    . FJNR	p Cp L	p
 
p

 2 2
 C#JY #Y :	Y
 
:YrT   rL   c                  X    e Zd ZddZ	 	 	 	 	 	 	 	 ddZ	 	 	 	 	 	 ddZ	 	 	 	 	 	 	 	 d	dZy)
r   c               v    || _         d| _        d| _        d| _        d| _        t               | _        d | _        y )NF)r   _content_done_refusal_done_logprobs_content_done_logprobs_refusal_doneset_done_tool_calls*_ChoiceEventState__current_tool_call_index)rO   rE   s     rQ   rR   zChoiceEventState.__init__J  s<    '""&+#&+#*-%59&rT   c                  g }|j                   rd|j                  | j                  ||             | j                  6| j                  | j                  vr| j                  ||| j                         |j                  j                  xs g D ]x  }| j                  |j                  k7  rL|j                  | j                  ||             | j                  | j                  ||| j                         |j                  | _        z |S )N)r   rD   )r|   r   r   )	r   r   _content_done_eventsr  r  _add_tool_done_eventr   r   r   )rO   r   r   rD   r|   r  s         rQ   r   z ChoiceEventState.get_done_eventsT  s    LN((!!))/[j)k
 ..:22$:O:OO))#1$3#== *  &++66<" 	=I--@%%--o_n-o 11=--'5(7#'#A#A .  .7__D*	= rT   c                  g }|j                   j                  r| j                  s}d| _        t        ||j                         }||j                   _        |j                  t        t        dt        t        t                    d|j                   j                  |             |j                   j                  H| j                  s<d| _        |j                  t        t        d|j                   j                               |j                  ^|j                  j                  H| j                  s<d| _        |j                  t        t        d|j                  j                  	             |j                  ^|j                  j                  H| j                   s<d| _        |j                  t        t"        d
|j                  j                               |S )NT)rD   r   z'type[ContentDoneEvent[ResponseFormatT]]zcontent.done)r   r   r   zrefusal.done)r   r   zlogprobs.content.done)r   r   zlogprobs.refusal.done)r   r   r  r0   r   r   r+   r   r   r   r   r	  r   r   r
  r   r  r   )rO   r   rD   r|   r   s        rQ   r  z%ChoiceEventState._content_done_events}  s    LN""**43E3E!%D( /'//F .4O##*!! AS"23 (+33;;! ""**6t?Q?Q!%D!!&^_E\E\EdEde
 $$0((00<//*.D'!!.5LVeVnVnVvVvw
 $$0((00<//*.D'!!.5LVeVnVnVvVvw rT   c          
        || j                   v ry | j                   j                  |       |j                  j                  J |j                  j                  |   }|j                  dk(  rt        | j                  |j                        }||j                  _        |j                  t        t        d||j                  j                  |j                  j                  |             y t        rt        |       y y )Nr   )rE   r   z"tool_calls.function.arguments.done)r   r   r   r   r   )r  addr   r   r   r3   r   r   r   r   r+   r   r   r   r   r   )rO   r|   r   r   r   r   s         rQ   r  z%ChoiceEventState._add_tool_done_event  s     ...!!*-&&11===,44??
K""j0< --8J8S8S  <L''8!!6=$+4499099CC%5	 +, rT   N)rE   z"list[ChatCompletionToolUnionParam]r   r   )r   r  r   r   rD   r~   r   r  )r   r   rD   r~   r   r  )r|   r  r   r   r   intr   r   )r   r   r   rR   r   r  r  r_   rT   rQ   r   r   I  s    :' "' .	'
 L' 
:'R> .> L	>
 
:>@$- I$- .	$-
 $- 
$-rT   r   c           	     .   | j                         }t        d|d         }| j                  D ]A  }i |j                  ddh      d|j                  j                         i||j
                  <   C t        t        t        t        dd i|dd	i
            S )Nzlist[object]r   Tr   r   r   r   objectzchat.completionr   )r   r   r   r*   r   r   r   r,   )r   datar   r   s       rQ   r   r     s    ==?D>4	?3G-- 
!
dWIF!
v||++-!

 $.$d +	

 
rT   c                     | j                   dk(  S )Nzchat.completion.chunk)r  )r{   s    rQ   rx   rx     s     666rT   r  )r{   r6   r   bool)T
__future__r   r   typesr   typingr   r   r   r   r	   r
   r   r   typing_extensionsr   r   r   jiterr   _typesr   r   r   _eventsr   r   r   r   r   r   r   r   r   r   r   r    _deltasr"   r$   r%   r&   _utilsr'   r(   r)   _compatr*   _modelsr+   r,   _parsingr.   r/   r0   r1   r2   r3   
_streamingr4   r5   
types.chatr6   r7   r8   _exceptionsr9   r:   types.chat.chat_completionr;    types.chat.chat_completion_chunkr<   r  #types.chat.completion_create_paramsr=   ResponseFormatParamr?   r   r   r   rL   r   r   rx   r_   rT   rQ   <module>r.     s    "   b b b : :  k k    ' ( ( N N " -  / b b S 9 F YI7?3 IX,"'/": ,"^I 8 IX,(w'? ,(^b 8 bJ	X- X-v.7rT   