o
    ùT·jny  ã                   @  s
  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lDmEZEmFZF ddlGmHZI ddlJmKZL G dd„ dee4 ƒZMG dd„ dee4 ƒZNG dd„ dee4 ƒZOG dd „ d ee4 ƒZPG d!d"„ d"ee4 ƒZQG d#d$„ d$ƒZRd/d)d*„ZSd0d-d.„ZTdS )1é    )Ú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)Ú
ModerationÚChoiceLogprobs)ÚChoice)ÚResponseFormatc                   @  óx   e Zd ZdZd*d
d„Zd+dd„Zd,dd„Zd-dd„Zd.dd„Zd/dd„Z	d0d d!„Z
d-d"d#„Zed1d%d&„ƒZd,d'd(„Zd)S )2Ú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
    Ú
raw_streamúStream[ChatCompletionChunk]Úresponse_formatú2type[ResponseFormatT] | ResponseFormatParam | OmitÚinput_toolsú-Iterable[ChatCompletionToolUnionParam] | OmitÚreturnÚNonec                C  ó*   || _ |j| _|  ¡ | _t||d�| _d S ©N©rC   rE   ©Ú_raw_streamÚresponseÚ	_responseÚ
__stream__Ú	_iteratorÚChatCompletionStreamStateÚ_state©ÚselfrA   rC   rE   © rV   úi/home/dinkstrade/pdmp-scanner/venv/lib/python3.10/site-packages/openai/lib/streaming/chat/_completions.pyÚ__init__7   ó   
zChatCompletionStream.__init__ú*ChatCompletionStreamEvent[ResponseFormatT]c                 C  s
   | j  ¡ S ©N)rQ   Ú__next__©rU   rV   rV   rW   r\   C   s   
zChatCompletionStream.__next__ú4Iterator[ChatCompletionStreamEvent[ResponseFormatT]]c                 c  s   � | j D ]}|V  qd S r[   ©rQ   ©rU   ÚitemrV   rV   rW   Ú__iter__F   s   €
ÿzChatCompletionStream.__iter__r   c                 C  s   | S r[   rV   r]   rV   rV   rW   Ú	__enter__J   s   zChatCompletionStream.__enter__Úexc_typeútype[BaseException] | NoneÚexcúBaseException | NoneÚexc_tbúTracebackType | Nonec                 C  s   |   ¡  d S r[   ©Úclose©rU   rd   rf   rh   rV   rV   rW   Ú__exit__M   s   zChatCompletionStream.__exit__c                 C  s   | j  ¡  dS ©zŠ
        Close the response and release the connection.

        Automatically called if the response body is read to completion.
        N)rO   rk   r]   rV   rV   rW   rk   U   s   zChatCompletionStream.closeú%ParsedChatCompletion[ResponseFormatT]c                 C  s   |   ¡  | 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_donerS   Úget_final_completionr]   rV   rV   rW   rs   ]   s   
z)ChatCompletionStream.get_final_completionc                 C  s   t | ƒ | S )ú*Blocks until the stream has been consumed.)r'   r]   rV   rV   rW   rr   h   s   zChatCompletionStream.until_doner   c                 C  ó   | j jS r[   ©rS   Úcurrent_completion_snapshotr]   rV   rV   rW   rw   m   ó   z0ChatCompletionStream.current_completion_snapshotc                 c  s8   � | j D ]}t|ƒsq| j |¡}|D ]}|V  qqd S r[   ©rM   Ú$_is_valid_chat_completion_chunk_weakrS   Úhandle_chunk©rU   Ú	sse_eventÚevents_to_fireÚeventrV   rV   rW   rP   q   s   €
ÿüzChatCompletionStream.__stream__N)rA   rB   rC   rD   rE   rF   rG   rH   ©rG   rZ   )rG   r^   ©rG   r   ©rd   re   rf   rg   rh   ri   rG   rH   ©rG   rH   ©rG   ro   ©rG   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__rX   r\   rb   rc   rm   rk   rs   rr   Úpropertyrw   rP   rV   rV   rV   rW   r?   .   ó    







r?   c                   @  ó.   e Zd ZdZdd
d„Zddd„Zddd„ZdS )Ú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:
            ...
    ```
    Úapi_requestú)Callable[[], Stream[ChatCompletionChunk]]rC   rD   rE   rF   rG   rH   c                C  ó   d | _ || _|| _|| _d S r[   )Ú$_ChatCompletionStreamManager__streamÚ)_ChatCompletionStreamManager__api_requestÚ-_ChatCompletionStreamManager__response_formatÚ)_ChatCompletionStreamManager__input_tools©rU   rŽ   rC   rE   rV   rV   rW   rX   ˆ   ó   
z$ChatCompletionStreamManager.__init__ú%ChatCompletionStream[ResponseFormatT]c                 C  s"   |   ¡ }t|| j| jd�| _| jS ©N)rA   rC   rE   )r’   r?   r“   r”   r‘   ©rU   rA   rV   rV   rW   rc   ”   s   ýz%ChatCompletionStreamManager.__enter__rd   re   rf   rg   rh   ri   c                 C  s   | j d ur| j  ¡  d S d S r[   )r‘   rk   rl   rV   rV   rW   rm   Ÿ   s   
ÿz$ChatCompletionStreamManager.__exit__N)rŽ   r�   rC   rD   rE   rF   rG   rH   )rG   r—   r‚   )r†   r‡   rˆ   r‰   rX   rc   rm   rV   rV   rV   rW   r�   z   ó
    

r�   c                   @  r>   )2ÚAsyncChatCompletionStreamr@   rA   ú AsyncStream[ChatCompletionChunk]rC   rD   rE   rF   rG   rH   c                C  rI   rJ   rL   rT   rV   rV   rW   rX   ²   rY   z"AsyncChatCompletionStream.__init__rZ   c                 Ã  s   �| j  ¡ I d H S r[   )rQ   Ú	__anext__r]   rV   rV   rW   r�   ¾   s   €z#AsyncChatCompletionStream.__anext__ú9AsyncIterator[ChatCompletionStreamEvent[ResponseFormatT]]c                 C s"   �| j 2 z	3 d H W }|V  q6 d S r[   r_   r`   rV   rV   rW   Ú	__aiter__Á   s   €ÿz#AsyncChatCompletionStream.__aiter__r   c                 Ã  s   �| S r[   rV   r]   rV   rV   rW   Ú
__aenter__Å   s   €z$AsyncChatCompletionStream.__aenter__rd   re   rf   rg   rh   ri   c                 Ã  s   �|   ¡ I d H  d S r[   rj   rl   rV   rV   rW   Ú	__aexit__È   s   €z#AsyncChatCompletionStream.__aexit__c                 Ã  s   �| j  ¡ I dH  dS rn   )rO   Úacloser]   rV   rV   rW   rk   Ð   s   €zAsyncChatCompletionStream.closero   c                 Ã  s   �|   ¡ I dH  | j ¡ S )rp   Nrq   r]   rV   rV   rW   rs   Ø   s   €
z.AsyncChatCompletionStream.get_final_completionc                 Ã  s   �t | ƒI dH  | S )rt   N)r(   r]   rV   rV   rW   rr   ã   s   €z$AsyncChatCompletionStream.until_doner   c                 C  ru   r[   rv   r]   rV   rV   rW   rw   è   rx   z5AsyncChatCompletionStream.current_completion_snapshotc                 C sB   �| j 2 z3 d H W }t|ƒsq| j |¡}|D ]}|V  qq6 d S r[   ry   r|   rV   rV   rW   rP   ì   s   €ÿüz$AsyncChatCompletionStream.__stream__N)rA   rœ   rC   rD   rE   rF   rG   rH   r€   )rG   rž   r�   r‚   rƒ   r„   r…   )r†   r‡   rˆ   r‰   rX   r�   rŸ   r    r¡   rk   rs   rr   rŠ   rw   rP   rV   rV   rV   rW   r›   ©   r‹   r›   c                   @  rŒ   )Ú 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:
            ...
    ```
    rŽ   ú+Awaitable[AsyncStream[ChatCompletionChunk]]rC   rD   rE   rF   rG   rH   c                C  r�   r[   )Ú)_AsyncChatCompletionStreamManager__streamÚ._AsyncChatCompletionStreamManager__api_requestÚ2_AsyncChatCompletionStreamManager__response_formatÚ._AsyncChatCompletionStreamManager__input_toolsr•   rV   rV   rW   rX     r–   z)AsyncChatCompletionStreamManager.__init__ú*AsyncChatCompletionStream[ResponseFormatT]c                 Ã  s(   �| j I d H }t|| j| jd�| _| jS r˜   )r¦   r›   r§   r¨   r¥   r™   rV   rV   rW   r      s   €ýz+AsyncChatCompletionStreamManager.__aenter__rd   re   rf   rg   rh   ri   c                 Ã  s$   �| j d ur| j  ¡ I d H  d S d S r[   )r¥   rk   rl   rV   rV   rW   r¡     s   €
ÿz*AsyncChatCompletionStreamManager.__aexit__N)rŽ   r¤   rC   rD   rE   rF   rG   rH   )rG   r©   r‚   )r†   r‡   rˆ   r‰   rX   r    r¡   rV   rV   rV   rW   r£   õ   rš   r£   c                   @  sb   e Zd ZdZeedœd"d	d
„Zd#dd„Zed$dd„ƒZd%dd„Z	d&dd„Z
d'dd„Zd(dd „Zd!S ))rR   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   rC   rE   rF   rC   rD   rG   rH   c                C  sL   d | _ g | _t|ƒrdd„ |D ƒng | _|| _t |¡r!|| _d S t| _d S )Nc                 S  s   g | ]}|‘qS rV   rV   )Ú.0ÚtoolrV   rV   rW   Ú
<listcomp>B  s    z6ChatCompletionStreamState.__init__.<locals>.<listcomp>)	Ú7_ChatCompletionStreamState__current_completion_snapshotÚ/_ChatCompletionStreamState__choice_event_statesr&   Ú_input_toolsÚ_response_formatÚinspectÚisclassr%   Ú_rich_response_format)rU   rE   rC   rV   rV   rW   rX   9  s
   z"ChatCompletionStreamState.__init__ro   c                 C  s   t | j| j| jd�S )zÉParse 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_completionrC   rE   )r0   rw   r³   r¯   r]   rV   rV   rW   rs   F  s
   ýz.ChatCompletionStreamState.get_final_completionr   c                 C  s   | j d usJ ‚| j S r[   )r­   r]   rV   rV   rW   rw   R  s   z5ChatCompletionStreamState.current_completion_snapshotÚchunkr5   ú4Iterable[ChatCompletionStreamEvent[ResponseFormatT]]c                 C  s   |   |¡| _| j|| jd�S )zTAccumulate a new chunk into the snapshot and returns an iterable of events to yield.)rµ   Úcompletion_snapshot)Ú_accumulate_chunkr­   Ú_build_events)rU   rµ   rV   rV   rW   r{   W  s
   þz&ChatCompletionStreamState.handle_chunkÚchoiceÚChoiceChunkÚChoiceEventStatec                 C  s>   z| j |j W S  ty   t| jd�}| j  |¡ | Y S w )N)rE   )r®   ÚindexÚ
IndexErrorr¼   r¯   Úappend)rU   rº   Úchoice_staterV   rV   rW   Ú_get_choice_state`  s   ýz+ChatCompletionStreamState._get_choice_statec                 C  s.  | j }|d u rt|ƒS |jD �]j}zd|j|j }|jjpg }ttttt	tdt
|jttddd„ t|jjp4g ƒD ƒdœƒd�ƒtd|j ¡ ƒƒd�ƒ|_t|ƒD ]%\}}|jjpWg | }|jdkrm|jdksfJ ‚|jj|j_qNtrst|ƒ qNW n- ty¢   tttti |j
dd	hd
�¥dt	i td|j ¡ ƒƒi¥d�ƒ}|j |¡ Y nw |jrÆ|j|_t| j| jd�rÆ|jdkr¼t|d�‚|jdkrÆt|d�‚|jjræ|jjsæt| j ƒræ|jj !¡ ræt"t#|jjdƒdd�|j_$|jjpëg D ]A}	|jjpóg |	j }
|
jdk�r&t%| j|
jj&d�}|�r%| 'di ¡ 'd¡�r%|
jj(�r%t"t#|
jj(dƒdd�|
j_qìt�r-t|
ƒ qì|j)d u�ry|j)d u �rGt*t+|j)j|j)jd�|_)q|j)j�r`|j)jd u �rWg |j)_|j)j ,|j)j¡ |j)j�ry|j)jd u �rpg |j)_|j)j ,|j)j¡ q|j-|_-|j.|_.|j/d u�r•tt0tt0|j/ ¡ d�ƒ|_/|S )Núdict[object, object]Tc                 S  s   i | ]\}}|d ddii“qS )ÚfunctionÚparsed_argumentsTrV   )rª   ÚidxÚ_rV   rV   rW   Ú
<dictcomp>„  s    ÿÿz?ChatCompletionStreamState._accumulate_chunk.<locals>.<dictcomp>)ÚparsedÚ
tool_calls)Úexclude©Útype_ÚvaluerÃ   Údelta©Úexclude_unsetrÊ   ÚmessagerK   Úlength)Ú
completionÚcontent_filterzutf-8)Úpartial_mode)rE   ÚnameÚstrict)ÚcontentÚrefusal)1r­   Ú$_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¯   r8   r9   rØ   rÙ   r&   r³   Úlstripr   ÚbytesrÈ   r1   rÖ   ÚgetÚ	argumentsÚlogprobsr*   r;   ÚextendÚusageÚsystem_fingerprintÚ
moderationr:   )rU   rµ   r·   rº   Úchoice_snapshotÚprevious_tool_callsÚ
tool_indexÚ	prev_toolÚnew_toolÚtool_call_chunkÚtool_call_snapshotÚ
input_toolrV   rV   rW   r¸   h  sæ   þþýûþëþþ 
€ùÿþþþ
õ



ÿþý
û
þ
ÿÿþý
þ€€
ý

€ÿz+ChatCompletionStreamState._accumulate_chunkr·   ú0list[ChatCompletionStreamEvent[ResponseFormatT]]c          
      C  sÆ  g }|  ttd||d�¡ |jD ]Ð}|  |¡}|j|j }|jjd ur;|jjd ur;|  tt	d|jj|jj|jj
d�¡ |jjd urV|jjd urV|  ttd|jj|jjd�¡ |jjrœ|jj}|d usdJ ‚|jjD ]3}||j }	|	jdkr•|jd us{J ‚|  ttd|	jj|j|	jj|	jj|jjp�d	d
�¡ qhtr›t|	ƒ qh|jd urÔ|jd urÔ|jjr½|jjr½|  ttd|jj|jjd�¡ |jjrÔ|jjrÔ|  ttd|jj|jjd�¡ | |j||| jd�¡ q|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é   rC   )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°   )
rU   rµ   r·   r~   rº   rÀ   ré   rÉ   Útool_call_deltaÚ	tool_callrV   rV   rW   r¹   ñ  s”   ÿ

ûÿ
üÿ	


ùÿ€üÿ	üÿ	ýÿz'ChatCompletionStreamState._build_eventsN)rE   rF   rC   rD   rG   rH   r„   r…   )rµ   r5   rG   r¶   )rº   r»   rG   r¼   ©rµ   r5   rG   r   )rµ   r5   r·   r   rG   rñ   )r†   r‡   rˆ   r‰   r%   rX   rs   rŠ   rw   r{   rÁ   r¸   r¹   rV   rV   rV   rW   rR   $  s    ü


	
 
rR   c                   @  s4   e Zd Zddd„Zddd„Zddd„Zddd„ZdS )r¼   rE   ú"list[ChatCompletionToolUnionParam]rG   rH   c                C  s0   || _ d| _d| _d| _d| _tƒ | _d | _d S )NF)r¯   Ú_content_doneÚ_refusal_doneÚ_logprobs_content_doneÚ_logprobs_refusal_doneÚsetÚ_done_tool_callsÚ*_ChoiceEventState__current_tool_call_index)rU   rE   rV   rV   rW   rX   N  s   
zChoiceEventState.__init__rõ   r»   ré   r   rC   rD   rñ   c                C  s    g }|j r#| | j||d�¡ | jd ur#| j| jvr#| j||| jd� |jjp(g D ]$}| j|jkrI| | j||d�¡ | jd urI| j||| jd� |j| _q)|S )N)ré   rC   )r~   ré   rë   )	rß   rå   Ú_content_done_eventsr  r   Ú_add_tool_done_eventrÎ   rÉ   r½   )rU   rõ   ré   rC   r~   rø   rV   rV   rW   rö   X  s2   ÿ
ýÿ
ý
z ChoiceEventState.get_done_eventsc                C  sü   g }|j jr*| js*d| _t||j d�}||j _| ttdttt	ƒƒd|j j|d�¡ |j j
d urB| jsBd| _| ttd|j j
d�¡ |jd ur_|jjd ur_| js_d| _| ttd|jjd	�¡ |jd ur||jj
d ur|| js|d| _| ttd
|jj
d�¡ |S )NT)rC   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û   r/   rÈ   r¿   r*   r   r   r   rÙ   rü   r   rä   rý   r   rþ   r   )rU   ré   rC   r~   rÈ   rV   rV   rW   r  �  sR   þþöÿÿ
ÿÿ
ÿÿz%ChoiceEventState._content_done_eventsr~   rë   Úintc             
   C  s’   || j v rd S | j  |¡ |jjd usJ ‚|jj| }|jdkr?t| j|jd�}||j_| 	t
td||jj|jj|d�¡ d S trGt|ƒ d S d S )NrÃ   )rE   rÃ   z"tool_calls.function.arguments.done)rÞ   r½   rÖ   rã   rÄ   )r   ÚaddrÑ   rÉ   rÞ   r2   r¯   rÃ   rÄ   r¿   r*   r   rÖ   rã   r   r   )rU   r~   ré   rë   rï   rÄ   rV   rV   rW   r  Á  s.   

ÿúÿ
ÿz%ChoiceEventState._add_tool_done_eventN)rE   rú   rG   rH   )rõ   r»   ré   r   rC   rD   rG   rñ   )ré   r   rC   rD   rG   rñ   )r~   rñ   ré   r   rë   r  rG   rH   )r†   r‡   rˆ   rX   rö   r  r  rV   rV   rV   rW   r¼   M  s
    



)@r¼   rµ   r5   rG   r   c              	   C  s„   |   ¡ }| dd ¡ td|d ƒ}| jD ]}i |jddhd�¥dti td|j  ¡ ƒƒi¥||j< qttt	td	d i|¥d
di¥d�ƒS )NÚobfuscationzlist[object]rÛ   TrÎ   rÏ   rÑ   rÂ   rç   Úobjectzchat.completionrË   )
rÝ   Úpopr   rÛ   r)   r!   rÎ   r½   r   r+   )rµ   ÚdatarÛ   rº   rV   rV   rW   rÚ   è  s*   
ÿþÿþýþþrÚ   r}   Úboolc                 C  s
   | j dkS )Nzchat.completion.chunk)r  )r}   rV   rV   rW   rz      s   
rz   rù   )r}   r5   rG   r
  )UÚ
__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.   r/   r0   r1   r2   Ú
_streamingr3   r4   Ú
types.chatr5   r6   r7   Ú_exceptionsr8   r9   Útypes.chat.chat_completionr:   r;   Ú types.chat.chat_completion_chunkr<   r»   Ú#types.chat.completion_create_paramsr=   ÚResponseFormatParamr?   r�   r›   r£   rR   r¼   rÚ   rz   rV   rV   rV   rW   Ú<module>   s>    (8 L/L/  + 
