
    i'                       d dl mZ d dlZd dlmZmZmZ 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 ddlmZmZ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 m!Z! ddl"m#Z#m$Z$m%Z% ddl&m'Z'm(Z( ddl)m*Z* ddl+m,Z, ddl-m.Z. ddl/m0Z0 ddl1m2Z2 ddl3m4Z4 ddl5m6Z6 ddgZ7 G d de          Z8 G d de          Z9 G d d          Z: G d d          Z; G d d          Z< G d  d!          Z=dS )"    )annotationsN)UnionIterableOptional)Literal   )_legacy_response)BodyOmitQueryHeadersNotGivenomit	not_given)path_templatemaybe_transformasync_maybe_transform)cached_property)SyncAPIResourceAsyncAPIResource)to_streamed_response_wrapper"async_to_streamed_response_wrapper)SyncCursorPageAsyncCursorPage)assistant_list_paramsassistant_create_paramsassistant_update_params)AsyncPaginatormake_request_options)	Assistant)	ChatModel)AssistantDeleted)Metadata)ReasoningEffort)AssistantToolParam)"AssistantResponseFormatOptionParam
AssistantsAsyncAssistantsc                     e Zd ZdZed;d            Zed<d            Z ej        d          e	e	e	e	e	e	e	e	e	e	ddde
d	d=d&            Z ej        d          ddde
d'd>d*            Z ej        d          e	e	e	e	e	e	e	e	e	e	e	ddde
d+d?d.            Z ej        d          e	e	e	e	ddde
d/d@d8            Z ej        d          ddde
d'dAd:            ZdS )Br'   4Build Assistants that can call models and use tools.returnAssistantsWithRawResponsec                     t          |           S a  
        This property can be used as a prefix for any HTTP method call to return
        the raw response object instead of the parsed content.

        For more information, see https://www.github.com/openai/openai-python#accessing-raw-response-data-eg-headers
        )r,   selfs    g/home/ubuntu/.hermes/hermes-agent/venv/lib/python3.11/site-packages/openai/resources/beta/assistants.pywith_raw_responsezAssistants.with_raw_response&   s     )...    AssistantsWithStreamingResponsec                     t          |           S z
        An alternative to `.with_raw_response` that doesn't eagerly read the response body.

        For more information, see https://www.github.com/openai/openai-python#with_streaming_response
        )r4   r/   s    r1   with_streaming_responsez"Assistants.with_streaming_response0   s     /t444r3   
deprecatedNdescriptioninstructionsmetadatanamereasoning_effortresponse_formattemperaturetool_resourcestoolstop_pextra_headersextra_query
extra_bodytimeoutmodelUnion[str, ChatModel]r:   Optional[str] | Omitr;   r<   Optional[Metadata] | Omitr=   r>    Optional[ReasoningEffort] | Omitr?   3Optional[AssistantResponseFormatOptionParam] | Omitr@   Optional[float] | OmitrA   6Optional[assistant_create_params.ToolResources] | OmitrB   #Iterable[AssistantToolParam] | OmitrC   rD   Headers | NonerE   Query | NonerF   Body | NonerG   'float | httpx.Timeout | None | NotGivenr    c                   ddi|pi }|                      dt          |||||||||	|
|dt          j                  t	          ||||          t
                    S )  
        Create an assistant with a model and instructions.

        Args:
          model: ID of the model to use. You can use the
              [List models](https://platform.openai.com/docs/api-reference/models/list) API to
              see all of your available models, or see our
              [Model overview](https://platform.openai.com/docs/models) for descriptions of
              them.

          description: The description of the assistant. The maximum length is 512 characters.

          instructions: The system instructions that the assistant uses. The maximum length is 256,000
              characters.

          metadata: Set of 16 key-value pairs that can be attached to an object. This can be useful
              for storing additional information about the object in a structured format, and
              querying for objects via API or the dashboard.

              Keys are strings with a maximum length of 64 characters. Values are strings with
              a maximum length of 512 characters.

          name: The name of the assistant. The maximum length is 256 characters.

          reasoning_effort: Constrains effort on reasoning for
              [reasoning models](https://platform.openai.com/docs/guides/reasoning). Currently
              supported values are `none`, `minimal`, `low`, `medium`, `high`, and `xhigh`.
              Reducing reasoning effort can result in faster responses and fewer tokens used
              on reasoning in a response.

              - `gpt-5.1` defaults to `none`, which does not perform reasoning. The supported
                reasoning values for `gpt-5.1` are `none`, `low`, `medium`, and `high`. Tool
                calls are supported for all reasoning values in gpt-5.1.
              - All models before `gpt-5.1` default to `medium` reasoning effort, and do not
                support `none`.
              - The `gpt-5-pro` model defaults to (and only supports) `high` reasoning effort.
              - `xhigh` is supported for all models after `gpt-5.1-codex-max`.

          response_format: Specifies the format that the model must output. Compatible with
              [GPT-4o](https://platform.openai.com/docs/models#gpt-4o),
              [GPT-4 Turbo](https://platform.openai.com/docs/models#gpt-4-turbo-and-gpt-4),
              and all GPT-3.5 Turbo models since `gpt-3.5-turbo-1106`.

              Setting to `{ "type": "json_schema", "json_schema": {...} }` enables Structured
              Outputs which ensures the model will match your supplied JSON schema. Learn more
              in the
              [Structured Outputs guide](https://platform.openai.com/docs/guides/structured-outputs).

              Setting to `{ "type": "json_object" }` enables JSON mode, which ensures the
              message the model generates is valid JSON.

              **Important:** when using JSON mode, you **must** also instruct the model to
              produce JSON yourself via a system or user message. Without this, the model may
              generate an unending stream of whitespace until the generation reaches the token
              limit, resulting in a long-running and seemingly "stuck" request. Also note that
              the message content may be partially cut off if `finish_reason="length"`, which
              indicates the generation exceeded `max_tokens` or the conversation exceeded the
              max context length.

          temperature: What sampling temperature to use, between 0 and 2. Higher values like 0.8 will
              make the output more random, while lower values like 0.2 will make it more
              focused and deterministic.

          tool_resources: A set of resources that are used by the assistant's tools. The resources are
              specific to the type of tool. For example, the `code_interpreter` tool requires
              a list of file IDs, while the `file_search` tool requires a list of vector store
              IDs.

          tools: A list of tool enabled on the assistant. There can be a maximum of 128 tools per
              assistant. Tools can be of types `code_interpreter`, `file_search`, or
              `function`.

          top_p: An alternative to sampling with temperature, called nucleus sampling, where the
              model considers the results of the tokens with top_p probability mass. So 0.1
              means only the tokens comprising the top 10% probability mass are considered.

              We generally recommend altering this or temperature but not both.

          extra_headers: Send extra headers

          extra_query: Add additional query parameters to the request

          extra_body: Add additional JSON properties to the request

          timeout: Override the client-level default timeout for this request, in seconds
        OpenAI-Betaassistants=v2/assistantsrH   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   bodyoptionscast_to)_postr   r   AssistantCreateParamsr   r    r0   rH   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   s                   r1   createzAssistants.create9   s    X 'QM<ORQzz "#.$0 ( (8'6#.&4""  (=   )+Q[el   +  
 
 	
r3   r[   assistant_idstrc          	         |st          d|          ddi|pi }|                     t          d|          t          ||||          t                    S )K  
        Retrieves an assistant.

        Args:
          extra_headers: Send extra headers

          extra_query: Add additional query parameters to the request

          extra_body: Add additional JSON properties to the request

          timeout: Override the client-level default timeout for this request, in seconds
        ;Expected a non-empty value for `assistant_id` but received rW   rX   /assistants/{assistant_id}rd   r[   r^   r_   
ValueError_getr   r   r    r0   rd   rD   rE   rF   rG   s         r1   retrievezAssistants.retrieve   s    0  	mk[gkklll&QM<ORQyy6\RRR(+Q[el     
 
 	
r3   r:   r;   r<   rH   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   3  Union[str, Literal['gpt-5', 'gpt-5-mini', 'gpt-5-nano', 'gpt-5-2025-08-07', 'gpt-5-mini-2025-08-07', 'gpt-5-nano-2025-08-07', 'gpt-4.1', 'gpt-4.1-mini', 'gpt-4.1-nano', 'gpt-4.1-2025-04-14', 'gpt-4.1-mini-2025-04-14', 'gpt-4.1-nano-2025-04-14', 'o3-mini', 'o3-mini-2025-01-31', 'o1', 'o1-2024-12-17', 'gpt-4o', 'gpt-4o-2024-11-20', 'gpt-4o-2024-08-06', 'gpt-4o-2024-05-13', 'gpt-4o-mini', 'gpt-4o-mini-2024-07-18', 'gpt-4.5-preview', 'gpt-4.5-preview-2025-02-27', 'gpt-4-turbo', 'gpt-4-turbo-2024-04-09', 'gpt-4-0125-preview', 'gpt-4-turbo-preview', 'gpt-4-1106-preview', 'gpt-4-vision-preview', 'gpt-4', 'gpt-4-0314', 'gpt-4-0613', 'gpt-4-32k', 'gpt-4-32k-0314', 'gpt-4-32k-0613', 'gpt-3.5-turbo', 'gpt-3.5-turbo-16k', 'gpt-3.5-turbo-0613', 'gpt-3.5-turbo-1106', 'gpt-3.5-turbo-0125', 'gpt-3.5-turbo-16k-0613']] | Omit6Optional[assistant_update_params.ToolResources] | Omitc                   |st          d|          ddi|pi }|                     t          d|          t          ||||||||	|
||dt          j                  t          ||||          t                    S )	  Modifies an assistant.

        Args:
          description: The description of the assistant.

        The maximum length is 512 characters.

          instructions: The system instructions that the assistant uses. The maximum length is 256,000
              characters.

          metadata: Set of 16 key-value pairs that can be attached to an object. This can be useful
              for storing additional information about the object in a structured format, and
              querying for objects via API or the dashboard.

              Keys are strings with a maximum length of 64 characters. Values are strings with
              a maximum length of 512 characters.

          model: ID of the model to use. You can use the
              [List models](https://platform.openai.com/docs/api-reference/models/list) API to
              see all of your available models, or see our
              [Model overview](https://platform.openai.com/docs/models) for descriptions of
              them.

          name: The name of the assistant. The maximum length is 256 characters.

          reasoning_effort: Constrains effort on reasoning for
              [reasoning models](https://platform.openai.com/docs/guides/reasoning). Currently
              supported values are `none`, `minimal`, `low`, `medium`, `high`, and `xhigh`.
              Reducing reasoning effort can result in faster responses and fewer tokens used
              on reasoning in a response.

              - `gpt-5.1` defaults to `none`, which does not perform reasoning. The supported
                reasoning values for `gpt-5.1` are `none`, `low`, `medium`, and `high`. Tool
                calls are supported for all reasoning values in gpt-5.1.
              - All models before `gpt-5.1` default to `medium` reasoning effort, and do not
                support `none`.
              - The `gpt-5-pro` model defaults to (and only supports) `high` reasoning effort.
              - `xhigh` is supported for all models after `gpt-5.1-codex-max`.

          response_format: Specifies the format that the model must output. Compatible with
              [GPT-4o](https://platform.openai.com/docs/models#gpt-4o),
              [GPT-4 Turbo](https://platform.openai.com/docs/models#gpt-4-turbo-and-gpt-4),
              and all GPT-3.5 Turbo models since `gpt-3.5-turbo-1106`.

              Setting to `{ "type": "json_schema", "json_schema": {...} }` enables Structured
              Outputs which ensures the model will match your supplied JSON schema. Learn more
              in the
              [Structured Outputs guide](https://platform.openai.com/docs/guides/structured-outputs).

              Setting to `{ "type": "json_object" }` enables JSON mode, which ensures the
              message the model generates is valid JSON.

              **Important:** when using JSON mode, you **must** also instruct the model to
              produce JSON yourself via a system or user message. Without this, the model may
              generate an unending stream of whitespace until the generation reaches the token
              limit, resulting in a long-running and seemingly "stuck" request. Also note that
              the message content may be partially cut off if `finish_reason="length"`, which
              indicates the generation exceeded `max_tokens` or the conversation exceeded the
              max context length.

          temperature: What sampling temperature to use, between 0 and 2. Higher values like 0.8 will
              make the output more random, while lower values like 0.2 will make it more
              focused and deterministic.

          tool_resources: A set of resources that are used by the assistant's tools. The resources are
              specific to the type of tool. For example, the `code_interpreter` tool requires
              a list of file IDs, while the `file_search` tool requires a list of vector store
              IDs.

          tools: A list of tool enabled on the assistant. There can be a maximum of 128 tools per
              assistant. Tools can be of types `code_interpreter`, `file_search`, or
              `function`.

          top_p: An alternative to sampling with temperature, called nucleus sampling, where the
              model considers the results of the tokens with top_p probability mass. So 0.1
              means only the tokens comprising the top 10% probability mass are considered.

              We generally recommend altering this or temperature but not both.

          extra_headers: Send extra headers

          extra_query: Add additional query parameters to the request

          extra_body: Add additional JSON properties to the request

          timeout: Override the client-level default timeout for this request, in seconds
        rh   rW   rX   ri   rj   r:   r;   r<   rH   r=   r>   r?   r@   rA   rB   rC   r[   r\   )rm   r`   r   r   r   AssistantUpdateParamsr   r    r0   rd   r:   r;   r<   rH   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   s                    r1   updatezAssistants.update   s    z  	mk[gkklll&QM<ORQzz6\RRR #.$0 (" (8'6#.&4""  (=   )+Q[el   +  
 
 	
r3   afterbeforelimitorderrD   rE   rF   rG   r{   
str | Omitr|   r}   
int | Omitr~   Literal['asc', 'desc'] | OmitSyncCursorPage[Assistant]c                   ddi|pi }|                      dt          t                   t          ||||t	          ||||dt
          j                            t                    S a  Returns a list of assistants.

        Args:
          after: A cursor for use in pagination.

        `after` is an object ID that defines your place
              in the list. For instance, if you make a list request and receive 100 objects,
              ending with obj_foo, your subsequent call can include after=obj_foo in order to
              fetch the next page of the list.

          before: A cursor for use in pagination. `before` is an object ID that defines your place
              in the list. For instance, if you make a list request and receive 100 objects,
              starting with obj_foo, your subsequent call can include before=obj_foo in order
              to fetch the previous page of the list.

          limit: A limit on the number of objects to be returned. Limit can range between 1 and
              100, and the default is 20.

          order: Sort order by the `created_at` timestamp of the objects. `asc` for ascending
              order and `desc` for descending order.

          extra_headers: Send extra headers

          extra_query: Add additional query parameters to the request

          extra_body: Add additional JSON properties to the request

          timeout: Override the client-level default timeout for this request, in seconds
        rW   rX   rY   )r{   r|   r}   r~   )rD   rE   rF   rG   query)pager^   rH   )_get_api_listr   r    r   r   r   AssistantListParams	r0   r{   r|   r}   r~   rD   rE   rF   rG   s	            r1   listzAssistants.list  s    X 'QM<ORQ!!	*(+'%%!&"(!&!&	  *=    % " 
 
 	
r3   r"   c          	         |st          d|          ddi|pi }|                     t          d|          t          ||||          t                    S )H  
        Delete an assistant.

        Args:
          extra_headers: Send extra headers

          extra_query: Add additional query parameters to the request

          extra_body: Add additional JSON properties to the request

          timeout: Override the client-level default timeout for this request, in seconds
        rh   rW   rX   ri   rj   r[   rk   rm   _deleter   r   r"   ro   s         r1   deletezAssistants.delete  s    0  	mk[gkklll&QM<ORQ||6\RRR(+Q[el   %  
 
 	
r3   )r+   r,   )r+   r4    rH   rI   r:   rJ   r;   rJ   r<   rK   r=   rJ   r>   rL   r?   rM   r@   rN   rA   rO   rB   rP   rC   rN   rD   rQ   rE   rR   rF   rS   rG   rT   r+   r    rd   re   rD   rQ   rE   rR   rF   rS   rG   rT   r+   r    "rd   re   r:   rJ   r;   rJ   r<   rK   rH   rr   r=   rJ   r>   rL   r?   rM   r@   rN   rA   rs   rB   rP   rC   rN   rD   rQ   rE   rR   rF   rS   rG   rT   r+   r    )r{   r   r|   r   r}   r   r~   r   rD   rQ   rE   rR   rF   rS   rG   rT   r+   r   rd   re   rD   rQ   rE   rR   rF   rS   rG   rT   r+   r"   __name__
__module____qualname____doc__r   r2   r7   typing_extensionsr8   r   r   rc   rp   ry   r   r    r3   r1   r'   r'   #   s        >>/ / / _/ 5 5 5 _5 "!,//
 -1-1.2%)=AOS.2QU59(, )-$("&;D'B
 B
 B
 B
 B
 0/B
H "!,// )-$("&;D 
  
  
  
  
 0/ 
D "!,//
 -1-1.2` %)=AOS.2QU59(, )-$("&;DGu
 u
 u
 u
 u
 0/u
n "!,// !! /3 )-$("&;D?
 ?
 ?
 ?
 ?
 0/?
B "!,// )-$("&;D 
  
  
  
  
 0/ 
  
  
r3   c                     e Zd ZdZed;d            Zed<d            Z ej        d          e	e	e	e	e	e	e	e	e	e	ddde
d	d=d&            Z ej        d          ddde
d'd>d*            Z ej        d          e	e	e	e	e	e	e	e	e	e	e	ddde
d+d?d.            Z ej        d          e	e	e	e	ddde
d/d@d8            Z ej        d          ddde
d'dAd:            ZdS )Br(   r*   r+   AsyncAssistantsWithRawResponsec                     t          |           S r.   )r   r/   s    r1   r2   z!AsyncAssistants.with_raw_response  s     .d333r3   $AsyncAssistantsWithStreamingResponsec                     t          |           S r6   )r   r/   s    r1   r7   z'AsyncAssistants.with_streaming_response  s     4D999r3   r8   Nr9   rH   rI   r:   rJ   r;   r<   rK   r=   r>   rL   r?   rM   r@   rN   rA   rO   rB   rP   rC   rD   rQ   rE   rR   rF   rS   rG   rT   r    c                  K   ddi|pi }|                      dt          |||||||||	|
|dt          j                   d{V t	          ||||          t
                     d{V S )rV   rW   rX   rY   rZ   Nr[   r\   )r`   r   r   ra   r   r    rb   s                   r1   rc   zAsyncAssistants.create  s      X 'QM<ORQZZ,"#.$0 ( (8'6#.&4""  (=         )+Q[el   +   
 
 
 
 
 
 
 
 	
r3   r[   rd   re   c          	        K   |st          d|          ddi|pi }|                     t          d|          t          ||||          t                     d{V S )	rg   rh   rW   rX   ri   rj   r[   rk   Nrl   ro   s         r1   rp   zAsyncAssistants.retrieve  s      0  	mk[gkklll&QM<ORQYY6\RRR(+Q[el     
 
 
 
 
 
 
 
 	
r3   rq   rr   rs   c                 K   |st          d|          ddi|pi }|                     t          d|          t          ||||||||	|
||dt          j                   d{V t          ||||          t          	           d{V S )
ru   rh   rW   rX   ri   rj   rv   Nr[   r\   )rm   r`   r   r   r   rw   r   r    rx   s                    r1   ry   zAsyncAssistants.update  s
     z  	mk[gkklll&QM<ORQZZ6\RRR,#.$0 (" (8'6#.&4""  (=         )+Q[el   +   
 
 
 
 
 
 
 
 	
r3   rz   r{   r   r|   r}   r   r~   r   5AsyncPaginator[Assistant, AsyncCursorPage[Assistant]]c                   ddi|pi }|                      dt          t                   t          ||||t	          ||||dt
          j                            t                    S r   )r   r   r    r   r   r   r   r   s	            r1   r   zAsyncAssistants.listu  s    X 'QM<ORQ!! +(+'%%!&"(!&!&	  *=    % " 
 
 	
r3   r"   c          	        K   |st          d|          ddi|pi }|                     t          d|          t          ||||          t                     d{V S )	r   rh   rW   rX   ri   rj   r[   rk   Nr   ro   s         r1   r   zAsyncAssistants.delete  s      0  	mk[gkklll&QM<ORQ\\6\RRR(+Q[el   % " 
 
 
 
 
 
 
 
 	
r3   )r+   r   )r+   r   r   r   r   )r{   r   r|   r   r}   r   r~   r   rD   rQ   rE   rR   rF   rS   rG   rT   r+   r   r   r   r   r3   r1   r(   r(     s        >>4 4 4 _4 : : : _: "!,//
 -1-1.2%)=AOS.2QU59(, )-$("&;D'B
 B
 B
 B
 B
 0/B
H "!,// )-$("&;D 
  
  
  
  
 0/ 
D "!,//
 -1-1.2` %)=AOS.2QU59(, )-$("&;DGu
 u
 u
 u
 u
 0/u
n "!,// !! /3 )-$("&;D?
 ?
 ?
 ?
 ?
 0/?
B "!,// )-$("&;D 
  
  
  
  
 0/ 
  
  
r3   c                      e Zd ZddZdS )r,   
assistantsr'   r+   Nonec                @   || _         t          j        |j                  | _        t          j        |j                  | _        t          j        |j                  | _        t          j        |j                  | _        t          j        |j                  | _        d S N)_assistantsr	   to_raw_response_wrapperrc   rp   ry   r   r   r0   r   s     r1   __init__z"AssistantsWithRawResponse.__init__  s    % 4!  	 4#  	 4!  	 4  		 4!  	r3   Nr   r'   r+   r   r   r   r   r   r   r3   r1   r,   r,     (        
 
 
 
 
 
r3   r,   c                      e Zd ZddZdS )r   r   r(   r+   r   c                @   || _         t          j        |j                  | _        t          j        |j                  | _        t          j        |j                  | _        t          j        |j                  | _        t          j        |j                  | _        d S r   )r   r	   async_to_raw_response_wrapperrc   rp   ry   r   r   r   s     r1   r   z'AsyncAssistantsWithRawResponse.__init__  s    % :!  	 :#  	 :!  	 :  		 :!  	r3   Nr   r(   r+   r   r   r   r3   r1   r   r     r   r3   r   c                      e Zd ZddZdS )r4   r   r'   r+   r   c                   || _         t          |j                  | _        t          |j                  | _        t          |j                  | _        t          |j                  | _        t          |j                  | _        d S r   )r   r   rc   rp   ry   r   r   r   s     r1   r   z(AssistantsWithStreamingResponse.__init__  s    % )!  	 )#  	 )!  	 )  		 )!  	r3   Nr   r   r   r3   r1   r4   r4     r   r3   r4   c                      e Zd ZddZdS )r   r   r(   r+   r   c                   || _         t          |j                  | _        t          |j                  | _        t          |j                  | _        t          |j                  | _        t          |j                  | _        d S r   )r   r   rc   rp   ry   r   r   r   s     r1   r   z-AsyncAssistantsWithStreamingResponse.__init__9  s    % /!  	 /#  	 /!  	 /  		 /!  	r3   Nr   r   r   r3   r1   r   r   8  r   r3   r   )>
__future__r   r   typingr   r   r   r   httpx r	   _typesr
   r   r   r   r   r   r   _utilsr   r   r   _compatr   	_resourcer   r   	_responser   r   
paginationr   r   
types.betar   r   r   _base_clientr   r   types.beta.assistantr    types.shared.chat_modelr!   types.beta.assistant_deletedr"   types.shared_params.metadatar#   types.shared.reasoning_effortr$   types.beta.assistant_tool_paramr%   1types.beta.assistant_response_format_option_paramr&   __all__r'   r(   r,   r   r4   r   r   r3   r1   <module>r      s   # " " " " "     , , , , , , , , , , % % % % % %              K K K K K K K K K K K K K K K K K K K K K K K K K K K K & & & & & & : : : : : : : : Y Y Y Y Y Y Y Y 9 9 9 9 9 9 9 9         
 A @ @ @ @ @ @ @ - - - - - - 0 0 0 0 0 0 < < < < < < 4 4 4 4 4 4 < < < < < < A A A A A A c c c c c c*
+Y
 Y
 Y
 Y
 Y
 Y
 Y
 Y
xY
 Y
 Y
 Y
 Y
& Y
 Y
 Y
x
 
 
 
 
 
 
 
>
 
 
 
 
 
 
 
>
 
 
 
 
 
 
 
>
 
 
 
 
 
 
 
 
 
r3   