§
    šŠtj
‚  ã                  ó  — d dl mZ d dlZd dlZd dl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mZ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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/m0Z0 d dl1m2Z2m3Z3m4Z4 d dl5m6Z6m7Z7m8Z8 d dl9m:Z: d dl;m<Z<m=Z=m>Z> d dl?m@Z@ d dlAmBZB d dlCmDZDmEZEmFZFmGZG d dlHmIZI d dlJmKZKmLZLmMZMmNZNmOZO d dlPmQZQmRZRmSZS  ejT        eU¦  «        ZV	 d)d*d„ZWd+d „ZXd,d#„ZYd-d'„ZZ G d(„ d%e¦  «        Z[dS ).é    )ÚannotationsN)Ú
itemgetter)ÚAnyÚAsyncIteratorÚCallableÚDictÚIteratorÚListÚMappingÚOptionalÚSequenceÚTypeÚUnionÚcast)ÚAsyncCallbackManagerForLLMRunÚCallbackManagerForLLMRun)ÚLanguageModelInput)ÚBaseChatModel)Ú	AIMessageÚAIMessageChunkÚBaseMessageÚBaseMessageChunkÚChatMessageÚChatMessageChunkÚFunctionMessageÚHumanMessageÚHumanMessageChunkÚSystemMessageÚSystemMessageChunkÚToolMessageÚToolMessageChunk)ÚOutputParserLike)ÚJsonOutputKeyToolsParserÚPydanticToolsParserÚmake_invalid_tool_callÚparse_tool_call)ÚChatGenerationÚChatGenerationChunkÚ
ChatResult)ÚRunnableÚRunnableMapÚRunnablePassthrough)ÚBaseTool)Úconvert_to_secret_strÚget_from_dict_or_envÚpre_init©Úconvert_to_openai_tool)Úis_basemodel_subclass)Ú	BaseModelÚ
ConfigDictÚFieldÚ	SecretStr)Ú	HTTPError)Úbefore_sleep_logÚretryÚretry_if_exception_typeÚstop_after_attemptÚwait_exponential)Ú agenerate_with_last_element_markÚcheck_responseÚgenerate_with_last_element_markFÚ_dictúMapping[str, Any]Úis_chunkÚboolÚreturnú$Union[BaseMessage, BaseMessageChunk]c           
     ój  — | d         }| d         }|dk    r"|rt          |¬¦  «        nt          |¬¦  «        S |dk    �ržg }g }d| v �rd| d         i}t          | d         ¦  «        D ]þ\  }}|r‡	 |                     d|¦  «        }	|                     |d                              d	¦  «        |d                              d
¦  «        |                     d¦  «        |	dœ¦  «         Œ~# t
          $ r Y ŒŠw xY w	 t          |d¬¦  «        }
|
r|                     |
¦  «         Œ¸# t          $ r:}|                     t          |t          |¦  «        ¦  «        ¦  «         Y d}~Œ÷d}~ww xY wn;d| v rd| d         i}n,d| v r&t          | d         t          ¦  «        rd| d         i}ni }|r&t          ||||                      d¦  «        ¬¦  «        nt          ||||¬¦  «        S |dk    r"|rt          |¬¦  «        nt          |¬¦  «        S |dk    r…i }d	| v r| d	         |d	<   |r9t!          |                      dd¦  «        |                      d¦  «        |¬¦  «        n8t#          |                      dd¦  «        |                      d¦  «        |¬¦  «        S |rt%          ||¬¦  «        nt'          ||¬¦  «        S )zConvert a dict to a message.ÚroleÚcontentÚuser)rI   Ú	assistantÚ
tool_callsÚindexÚfunctionÚnameÚ	argumentsÚid)rO   ÚargsrQ   rM   T)Ú	return_idNÚreasoning_contentÚpartial)rI   Úadditional_kwargsÚtool_call_chunksrQ   )rI   rV   rL   Úinvalid_tool_callsÚsystemÚtoolÚ Útool_call_id)rI   r\   rV   ©rH   rI   )r   r   Ú	enumerateÚgetÚappendÚKeyErrorr&   Ú	Exceptionr%   ÚstrÚ
isinstancerD   r   r   r   r   r!   r    r   r   )rA   rC   rH   rI   rL   rX   rV   Ú
enum_indexÚtool_call_dataÚ	api_indexÚparsed_toolÚes               úd/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/langchain_community/chat_models/tongyi.pyÚconvert_dict_to_messagerk   U   s¶  € ð �Œ=€DØ�IÔ€GØˆv‚~€~ð ð/Õ gÐ.Ñ.Ô.Ð.å gÐ.Ñ.Ô.ð	
ð
 
�Ò	Ñ	Øˆ
ØÐØ˜5Ð Ñ Ø!-¨u°\Ô/BÐ CÐå.7¸¸lÔ8KÑ.LÔ.Lð ð Ñ*�
˜NØð ðð %3×$6Ò$6°wÀ
Ñ$KÔ$K˜	à"×)Ò)à(6°zÔ(B×(FÒ(FÀvÑ(NÔ(NØ(6°zÔ(B×(FÒ(FÀ{Ñ(SÔ(SØ&4×&8Ò&8¸Ñ&>Ô&>Ø)2ð	ð ñô ð ð øõ $ð ð ð Ø˜ðøøøðÝ&5°nÐPTÐ&UÑ&UÔ&U˜Ø&ð ;Ø&×-Ò-¨kÑ:Ô:Ð:øøÝ$ð ð ð Ø*×1Ò1Ý2°>Å3ÀqÁ6Ä6ÑJÔJñô ð ð ð ð ð ð øøøøðøøøð/ð6 ! EÐ)Ð)Ø!4°eÐ<OÔ6PÐ QÐÐØ˜%ÐÐ¥J¨u°YÔ/?ÅÑ$FÔ$FÐØ!*¨E°)Ô,<Ð =ÐÐà "Ðð ð�NØØ"3Ø!+Ø—9’9˜T‘?”?ð	ñ ô ð õ ØØ"3Ø%Ø#5ð	ñ ô ð	
ð 
�Ò	Ð	ð ð0Õ wÐ/Ñ/Ô/Ð/å wÐ/Ñ/Ô/ð	
ð
 
�ŠˆØÐØ�Uˆ?ˆ?Ø(-¨f¬Ð˜fÑ%ð ð
ÕØŸ	š	 )¨RÑ0Ô0Ø"ŸYšY ~Ñ6Ô6Ø"3ðñ ô ð õ ØŸ	š	 )¨RÑ0Ô0Ø"ŸYšY ~Ñ6Ô6Ø"3ðñ ô ð	
ð  ð9Õ $°Ð8Ñ8Ô8Ð8å $°Ð8Ñ8Ô8ð	
s+   Á0A5C&Ã&
C3Ã2C3Ã7(D Ä 
E$Ä*0EÅE$Úmessage_chunkr   r   c                ó  ‡— t          | t          ¦  «        s| S dgŠt          | t          ¦  «        r‰                     d¦  «          | j        j        d         di ˆfd„| j                             ¦   «         D ¦   «         ¤ŽS )z}Convert a message chunk to a message.

    Args:
        chunk: Message chunk to convert.

    Returns:
        Message.
    ÚtyperW   é   c                ó$   •— i | ]\  }}|‰v¯	||“ŒS © rq   )Ú.0ÚkÚvÚignore_keyss      €rj   ú
<dictcomp>z4convert_message_chunk_to_message.<locals>.<dictcomp>Ç   s)   ø€ Ð
SÐ
SÐ
S‘D�A�q¸aÀ{Ð>RÐ>Rˆ1ˆaÐ>RÐ>RÐ>Ró    rq   )rd   r   r   r`   Ú	__class__Ú__mro__Ú__dict__Úitems)rl   ru   s    @rj   Ú convert_message_chunk_to_messager|   ·   s›   ø€ õ �mÕ%5Ñ6Ô6ð ØÐà�(€KÝ�-¥Ñ0Ô0ð /Ø×ÒÐ-Ñ.Ô.Ð.Ø-ˆ=Ô"Ô*¨1Ô-ð ð Ø
SÐ
SÐ
SÐ
S˜MÔ2×8Ò8Ñ:Ô:Ð
SÑ
SÔ
Sðð ð rw   ÚmessageÚdictc                ót  — t          | t          ¦  «        r| j        | j        dœ}�nt          | t          ¦  «        rd| j        dœ}nñt          | t
          ¦  «        r=d| j        dœ}d| j        v r| j        d         |d<   d| j        v r| j        d         |d<   nŸt          | t          ¦  «        rd| j        dœ}nt          | t          ¦  «        r1d| j	        | j        | j
        p| j                             d¦  «        d	œ}n9t          | t          ¦  «        rdd
| j        | j
        d	œ}nt          d| › �¦  «        ‚|S )zConvert a message to a dict.r]   rJ   rK   rL   rU   rY   rZ   rO   )rH   r\   rI   rO   r[   zGot unknown type )rd   r   rH   rI   r   r   rV   r   r    r\   rO   r_   r   Ú	TypeError)r}   Úmessage_dicts     rj   Úconvert_message_to_dictr‚   Ë   sk  € õ �'�;Ñ'Ô'ð 7Ø '¤¸¼ÐIÐIˆ‰Ý	�G�\Ñ	*Ô	*ð 7Ø &°7´?ÐCÐCˆˆÝ	�G�YÑ	'Ô	'ð 7Ø +¸¼ÐHÐHˆØ˜7Ô4Ð4Ð4Ø)0Ô)BÀ<Ô)PˆL˜Ñ&à˜Ô1Ð1Ð1Ø&-Ô&?À	Ô&JˆL˜Ñ#øÝ	�G�]Ñ	+Ô	+ð 7Ø (°W´_ÐEÐEˆˆÝ	�G�[Ñ	)Ô	)ð 7àØ#Ô0Ø”Ø”LÐI GÔ$=×$AÒ$AÀ&Ñ$IÔ$Ið	
ð 
ˆˆõ 
�G�_Ñ	-Ô	-ð 7àØØ”Ø”Lð	
ð 
ˆˆõ Ð5¨GÐ5Ð5Ñ6Ô6Ð6ØÐrw   ÚllmÚ
ChatTongyiúCallable[[Any], Any]c           
     óÔ   — d}d}t          dt          | j        ¦  «        t          d||¬¦  «        t	          t
          ¦  «        t          t          t          j	        ¦  «        ¬¦  «        S )Nro   é   T)Ú
multiplierÚminÚmax)ÚreraiseÚstopÚwaitr:   Úbefore_sleep)
r:   r<   Úmax_retriesr=   r;   r8   r9   ÚloggerÚloggingÚWARNING)rƒ   Úmin_secondsÚmax_secondss      rj   Ú_create_retry_decoratorr•   ï   sa   € Ø€KØ€Kõ ØÝ ¤Ñ0Ô0Ý¨°ÀÐMÑMÔMÝ&¥yÑ1Ô1Ý%¥f­g¬oÑ>Ô>ðñ ô ð rw   c                  óô  ‡ — e Zd ZU dZedOd„¦   «         ZdZded<    edd	¬
¦  «        Z	ded<   	  ee
¬¦  «        Zded<   dZded<   	  edd¬¦  «        Zded<   	 dZded<   	 dZded<   	  ed¬¦  «        ZedPd„¦   «         ZedQd"„¦   «         ZedRd#„¦   «         ZdSd%„ZdSd&„ZdTd)„ZdSd*„Z	 	 dUdVd2„Z	 	 dUdWd4„Z	 	 dUdXd6„Z	 	 dUdYd8„ZdZd9„Zd[d=„Ze 	 d\d]d@„¦   «         Z!e d^dD„¦   «         Z"d_ˆ fdH„Z#ddIœd`dN„Z$ˆ xZ%S )ar„   ui  Alibaba Tongyi Qwen chat model integration.

    Setup:
        Install ``dashscope`` and set environment variables ``DASHSCOPE_API_KEY``.

        .. code-block:: bash

            pip install dashscope
            export DASHSCOPE_API_KEY="your-api-key"

    Key init args â€” completion params:
        model: str
            Name of Qianfan model to use.
        top_p: float
            Total probability mass of tokens to consider at each step.
        streaming: bool
            Whether to stream the results or not.

    Key init args â€” client params:
        api_key: Optional[str]
            Dashscope API KEY. If not passed in will be read from env var DASHSCOPE_API_KEY.
        max_retries: int
            Maximum number of retries to make when generating.

    See full list of supported init args and their descriptions in the params section.

    Instantiate:
        .. code-block:: python

            from langchain_community.chat_models import ChatTongyi

            tongyi_chat = ChatTongyi(
                model="qwen-max",
                # top_p="...",
                # api_key="...",
                # other params...
            )

    Invoke:
        .. code-block:: python

            messages = [
                ("system", "ä½ æ˜¯ä¸€å��ä¸“ä¸šçš„ç¿»è¯‘å®¶ï¼Œå�¯ä»¥å°†ç”¨æˆ·çš„ä¸­æ–‡ç¿»è¯‘ä¸ºè‹±æ–‡ã€‚"),
                ("human", "æˆ‘å–œæ¬¢ç¼–ç¨‹ã€‚"),
            ]
            tongyi_chat.invoke(messages)

        .. code-block:: python

            AIMessage(
                content='I enjoy programming.',
                response_metadata={
                    'model_name': 'qwen-max',
                    'finish_reason': 'stop',
                    'request_id': '0bd14853-4abc-9593-8642-8dbb915bd4df',
                    'token_usage': {
                        'input_tokens': 30,
                        'output_tokens': 4,
                        'total_tokens': 34
                    }
                },
                id='run-533b3688-d12b-40c6-a2f7-52f291f8fa0a-0'
            )

    Stream:
        .. code-block:: python

            for chunk in tongyi_chat.stream(messages):
                print(chunk)

        .. code-block:: python

            content='I' id='run-8fbcce63-42fc-4208-9399-da46ac40c967'
            content=' enjoy' id='run-8fbcce63-42fc-4208-9399-da46ac40c967'
            content=' programming' id='run-8fbcce63-42fc-4208-9399-da46ac40c967'
            content='.' response_metadata={'finish_reason': 'stop', 'request_id': '67aec2b5-72bf-96a4-ae29-5bfebd2e7305', 'token_usage': {'input_tokens': 30, 'output_tokens': 4, 'total_tokens': 34}} id='run-8fbcce63-42fc-4208-9399-da46ac40c967'

    Async:
        .. code-block:: python

            await tongyi_chat.ainvoke(messages)

            # stream:
            # async for chunk in tongyi_chat.astream(messages):
            #    print(chunk)

            # batch:
            # await tongyi_chat.abatch([messages])

        .. code-block:: python

            AIMessage(
                content='I enjoy programming.',
                response_metadata={
                    'model_name': 'qwen-max',
                    'finish_reason': 'stop',
                    'request_id': 'a55a2d6c-a876-9789-9dd9-7b52bf8adde0',
                    'token_usage': {
                        'input_tokens': 30,
                        'output_tokens': 4,
                        'total_tokens': 34
                    }
                },
                id='run-3bffa3ec-e8d9-4043-b57d-348e047d64de-0'
            )

    Tool calling:
        .. code-block:: python

            from pydantic import BaseModel, Field


            class GetWeather(BaseModel):
                '''Get the current weather in a given location'''

                location: str = Field(
                    ..., description="The city and state, e.g. San Francisco, CA"
                )


            class GetPopulation(BaseModel):
                '''Get the current population in a given location'''

                location: str = Field(
                    ..., description="The city and state, e.g. San Francisco, CA"
                )

            chat_with_tools = tongyi_chat.bind_tools([GetWeather, GetPopulation])
            ai_msg = chat_with_tools.invoke(
                "Which city is hotter today and which is bigger: LA or NY?"
            )
            ai_msg.tool_calls

        .. code-block:: python
            [
                {
                    'name': 'GetWeather',
                    'args': {'location': 'Los Angeles, CA'},
                    'id': ''
                }
            ]

    Structured output:
        .. code-block:: python

            from typing import Optional

            from pydantic import BaseModel, Field


            class Joke(BaseModel):
                '''Joke to tell user.'''

                setup: str = Field(description="The setup of the joke")
                punchline: str = Field(description="The punchline to the joke")
                rating: Optional[int] = Field(description="How funny the joke is, from 1 to 10")


            structured_chat = tongyi_chat.with_structured_output(Joke)
            structured_chat.invoke("Tell me a joke about cats")

        .. code-block:: python

            Joke(
                setup='Why did the cat join the band?',
                punchline='Because it wanted to be a solo purr-sonality!',
                rating=None
            )

    Response metadata
        .. code-block:: python

            ai_msg = tongyi_chat.invoke(messages)
            ai_msg.response_metadata

        .. code-block:: python

            {
                'model_name': 'qwen-max',
                'finish_reason': 'stop',
                'request_id': '32a13e4c-370e-99cb-8f9b-4c999d98c57d',
                'token_usage': {
                    'input_tokens': 30,
                    'output_tokens': 4,
                    'total_tokens': 34
                }
            }

    rE   úDict[str, str]c                ó
   — ddiS )NÚdashscope_api_keyÚDASHSCOPE_API_KEYrq   ©Úselfs    rj   Ú
lc_secretszChatTongyi.lc_secrets¼  s   € à#Ð%8Ð9Ð9rw   Nr   Úclientz
qwen-turboÚmodel)ÚdefaultÚaliasrc   Ú
model_name)Údefault_factoryúDict[str, Any]Úmodel_kwargsgš™™™™™é?ÚfloatÚtop_pÚapi_key)r¡   zOptional[SecretStr]r™   FrD   Ú	streamingé
   Úintr�   T)Úpopulate_by_namec                ó   — dS )zReturn type of llm.Útongyirq   r›   s    rj   Ú	_llm_typezChatTongyi._llm_typeÜ  s	   € ð ˆxrw   Úvaluesr   c                ób  — t          t          |dd¦  «        ¦  «        |d<   	 ddl}n# t          $ r t          d¦  «        ‚w xY wg d¢}|d         |v s
d|d         v r)	 |j        |d	<   nF# t
          $ r t          d
¦  «        ‚w xY w	 |j        |d	<   n# t
          $ r t          d¦  «        ‚w xY w|S )z?Validate that api key and python package exists in environment.r™   rš   r   NzdCould not import dashscope python package. Please install it with `pip install dashscope --upgrade`.)zqwen-audio-turbozqwen-audio-turbo-latestzqwen-vl-pluszqwen-vl-plus-latestzqwen-vl-maxzqwen-vl-max-latestr¢   Úvlrž   z®`dashscope` has no `MultiModalConversation` attribute, this is likely due to an old version of the dashscope package. Try upgrading it with `pip install --upgrade dashscope`.z¢`dashscope` has no `Generation` attribute, this is likely due to an old version of the dashscope package. Try upgrading it with `pip install --upgrade dashscope`.)r.   r/   Ú	dashscopeÚImportErrorÚMultiModalConversationÚAttributeErrorÚ
ValueErrorÚ
Generation)Úclsr°   r³   Údashscope_multimodal_modelss       rj   Úvalidate_environmentzChatTongyi.validate_environmentá  s<  € õ '<Ý  Ð)<Ð>QÑRÔRñ'
ô '
ˆÐ"Ñ#ð	ØÐÐÐÐøÝð 	ð 	ð 	ÝðLñô ð ð	øøøð
'
ð '
ð '
Ð#ð �<Ô Ð$?Ð?Ð?Ø�v˜lÔ+Ð+Ð+ðØ#,Ô#C��xÑ Ð øÝ!ð ð ð Ý ðKñô ð ðøøøðØ#,Ô#7��xÑ Ð øÝ!ð ð ð Ý ð>ñô ð ðøøøð ˆs!   £( ¨AÁ
A) Á)BÂ
B ÂB,c                ó†   — | j         | j        t          t          | j        ¦  «                             ¦   «         ddœ| j        ¥S )z7Get the default parameters for calling Tongyi Qwen API.r}   )rŸ   r§   r¨   Úresult_format)r¢   r§   r   r7   r™   Úget_secret_valuer¥   r›   s    rj   Ú_default_paramszChatTongyi._default_params  sI   € ð ”_Ø”ZÝ�I tÔ'=Ñ>Ô>×OÒOÑQÔQØ&ð	
ð 
ð
 Ôð
ð 	
rw   Úkwargsc                óN   ‡ — t          ‰ ¦  «        }|dˆ fd„¦   «         } |di |¤ŽS )ú*Use tenacity to retry the completion call.Ú_kwargsr   rE   c                 óF   •—  ‰j         j        di | ¤Ž}t          |¦  «        S )Nrq   )rž   Úcallr?   )rÃ   Úresprœ   s     €rj   Ú_completion_with_retryz@ChatTongyi.completion_with_retry.<locals>._completion_with_retry  s+   ø€ à#�4”;Ô#Ð.Ð. gÐ.Ð.ˆDÝ! $Ñ'Ô'Ð'rw   ©rÃ   r   rE   r   rq   ©r•   )rœ   rÀ   Úretry_decoratorrÇ   s   `   rj   Úcompletion_with_retryz ChatTongyi.completion_with_retry  sQ   ø€ å1°$Ñ7Ô7ˆà	ð	(ð 	(ð 	(ð 	(ð 	(ñ 
Œð	(ð &Ð%Ð/Ð/¨Ð/Ð/Ð/rw   c                óN   ‡ — t          ‰ ¦  «        }|dˆ fd„¦   «         } |di |¤ŽS )rÂ   rÃ   r   rE   c               ;  ó¨  •K  —  ‰	j         j        di | ¤Ž}d }|D �]6}|                      d¦  «        �r|                      dd¦  «        söt          j        t          j        |¦  «        ¦  «        }|                     d¦  «        r‹|d                              d¦  «        rp|d         d         d         }|d         }t          |                     d¦  «        t          ¦  «        r*d	                     d
„ |d         D ¦   «         ¦  «        }||d<   |}|€|}n‰	 	                    ||¦  «        }|}t          |¦  «        V — �Œ%t          |¦  «        V — �Œ8d S )NÚstreamÚincremental_outputFÚoutputÚchoicesr   r}   rI   r[   c              3  ól   K  — | ]/}t          |t          ¦  «        ¯|                     d d¦  «        V — Œ0dS )Útextr[   N)rd   r~   r_   )rr   Úitems     rj   ú	<genexpr>zaChatTongyi.stream_completion_with_retry.<locals>._stream_completion_with_retry.<locals>.<genexpr>8  sT   è è € ð 3ð 3à$(Ý#-¨dµDÑ#9Ô#9ð3Ø $§¢¨°Ñ 4Ô 4ð3ð 3ð 3ð 3ð 3ð 3rw   rq   )rž   rÅ   r_   ÚjsonÚloadsÚdumpsrd   ÚlistÚjoinÚsubtract_client_responser?   )
rÃ   Ú	responsesÚ	prev_resprÆ   Ú	resp_copyÚchoicer}   Úcontent_textÚ
delta_resprœ   s
            €rj   Ú_stream_completion_with_retryzNChatTongyi.stream_completion_with_retry.<locals>._stream_completion_with_retry'  sŽ  øè è € à(˜œÔ(Ð3Ð3¨7Ð3Ð3ˆIØˆIà!ð /ñ /�ð —;’;˜xÑ(Ô(ñ /°·²Ø(¨%ñ2ô 2ð /õ !%¤
­4¬:°dÑ+;Ô+;Ñ <Ô <�IØ —}’} XÑ.Ô.ð 
)°9¸XÔ3F×3JÒ3JÈ9Ñ3UÔ3Uð 
)Ø!*¨8Ô!4°YÔ!?ÀÔ!B˜Ø"(¨Ô"3˜Ý% g§k¢k°)Ñ&<Ô&<½dÑCÔCð >Ø+-¯7ª7ð 3ð 3à,3°IÔ,>ð3ñ 3ô 3ñ ,ô ,˜Lð
 2>˜G IÑ.Ø(˜Ø Ð(Ø%)˜
˜
à%)×%BÒ%BÀ4ÈÑ%SÔ%S˜
Ø $�IÝ(¨Ñ4Ô4Ð4Ð4Ð4Ñ4å(¨Ñ.Ô.Ð.Ð.Ð.Ñ.ð5/ð /rw   rÈ   rq   rÉ   )rœ   rÀ   rÊ   râ   s   `   rj   Ústream_completion_with_retryz'ChatTongyi.stream_completion_with_retry#  sR   ø€ å1°$Ñ7Ô7ˆà	ð	/ð 	/ð 	/ð 	/ð 	/ñ 
Œð	/ð@ -Ð,Ð6Ð6¨vÐ6Ð6Ð6rw   rÆ   rÝ   c                ó¾  — t          j        t          j        |¦  «        ¦  «        }|d         d         d         }|d         }t          j        t          j        |¦  «        ¦  «        }|d         d         d         }|d         }|d                              |d         d¦  «        |d<   |                     d¦  «        ržt          |d         ¦  «        D ]ˆ\  }	}
|
d         }|                     d¦  «        rf|d         |	         d         }d	|v r%|d	                              |d	         d¦  «        |d	<   d
|v r%|d
                              |d
         d¦  «        |d
<   Œ‰|S )zvSubtract prev response from curr response.

        Useful when streaming without `incremental_output = True`
        rÐ   rÑ   r   r}   rI   r[   rL   rN   rO   rP   )rÖ   r×   rØ   Úreplacer_   r^   )rœ   rÆ   rÝ   rÞ   rß   r}   Úprev_resp_copyÚprev_choiceÚprev_messagerM   Ú	tool_callrN   Úprev_functions                rj   rÛ   z#ChatTongyi.subtract_client_responseJ  ss  € õ ”J�tœz¨$Ñ/Ô/Ñ0Ô0ˆ	Ø˜8Ô$ YÔ/°Ô2ˆØ˜Ô#ˆåœ¥D¤J¨yÑ$9Ô$9Ñ:Ô:ˆØ$ XÔ.¨yÔ9¸!Ô<ˆØ" 9Ô-ˆà$ YÔ/×7Ò7¸ÀYÔ8OÐQSÑTÔTˆ�	Ñà�;Š;�|Ñ$Ô$ð 	Ý$-¨g°lÔ.CÑ$DÔ$Dð ð Ñ ��yØ$ ZÔ0�à×#Ò# LÑ1Ô1ð 
Ø$0°Ô$>¸uÔ$EÀjÔ$Q�Mà Ð)Ð)Ø+3°FÔ+;×+CÒ+CØ)¨&Ô1°2ñ,ô ,˜ Ñ(ð # hÐ.Ð.Ø08¸Ô0E×0MÒ0MØ)¨+Ô6¸ñ1ô 1˜ Ñ-øð Ðrw   c               ón   K  —  G d„ d¦  «        } | | j         di |¤Ž¬¦  «        2 3 d{V —†}|W V — Œ6 dS )z}Because the dashscope SDK doesn't provide an async API,
        we wrap `stream_generate_with_retry` with an async generator.c                  ó.   — e Zd Zd
d„Zdd„Zdd„Zdd„Zd	S )úEChatTongyi.astream_completion_with_retry.<locals>._AioTongyiGeneratorÚ	generatorr   c                ó   — || _         d S ©N©rî   )rœ   rî   s     rj   Ú__init__zNChatTongyi.astream_completion_with_retry.<locals>._AioTongyiGenerator.__init__q  s   € Ø!*�”��rw   rE   úAsyncIterator[Any]c                ó   — | S rð   rq   r›   s    rj   Ú	__aiter__zOChatTongyi.astream_completion_with_retry.<locals>._AioTongyiGenerator.__aiter__t  s   € Ø�rw   c              “  ó€   K  — t          j        ¦   «                              d | j        ¦  «        ƒ d {V —†}|�|S t          ‚rð   )ÚasyncioÚget_running_loopÚrun_in_executorÚ
_safe_nextÚStopAsyncIteration)rœ   Úvalues     rj   Ú	__anext__zOChatTongyi.astream_completion_with_retry.<locals>._AioTongyiGenerator.__anext__w  s\   è è € Ý%Ô6Ñ8Ô8×HÒHØ˜$œ/ñô ð ð ð ð ð ð �ð Ð$Ø �Lå,Ð,rw   c                óN   — 	 t          | j        ¦  «        S # t          $ r Y d S w xY wrð   )Únextrî   ÚStopIterationr›   s    rj   rú   zPChatTongyi.astream_completion_with_retry.<locals>._AioTongyiGenerator._safe_next€  s9   € ð Ý ¤Ñ/Ô/Ð/øÝ$ð  ð  ð  Ø˜4˜4ð øøøs   ‚ –
$£$N)rî   r   )rE   ró   )rE   r   )Ú__name__Ú
__module__Ú__qualname__rò   rõ   rý   rú   rq   rw   rj   Ú_AioTongyiGeneratorrí   p  sd   € € € € € ð+ð +ð +ð +ðð ð ð ð-ð -ð -ð -ð ð  ð  ð  ð  ð  rw   r  rñ   Nrq   )rã   )rœ   rÀ   r  Úchunks       rj   Úastream_completion_with_retryz(ChatTongyi.astream_completion_with_retryl  sž   è è € ð	 ð 	 ð 	 ð 	 ð 	 ñ 	 ô 	 ð 	 ð, /Ð.Ø7�dÔ7ÐAÐA¸&ÐAÐAð
ñ 
ô 
ð 	ð 	ð 	ð 	ð 	ð 	ð 	�%ð ˆKˆKˆKˆKˆKð
ð 
ð 
s   §4ÚmessagesúList[BaseMessage]rŒ   úOptional[List[str]]Úrun_managerú"Optional[CallbackManagerForLLMRun]r)   c           	     ó|  — g }| j         rMd } | j        |f||dœ|¤ŽD ]}|€|}Œ||z  }Œ|€J ‚|                     |                      |¦  «        ¦  «         nO | j        d||dœ|¤Ž} | j        di |¤Ž}	|                     t          di |                      |	¦  «        ¤Ž¦  «         t          |d| j	        i¬¦  «        S ©N)rŒ   r
  )r  rŒ   r¢   )ÚgenerationsÚ
llm_outputrq   )
r©   Ú_streamr`   Ú_chunk_to_generationÚ_invocation_paramsrË   r'   Ú_chat_generation_from_qwen_respr)   r¢   )
rœ   r  rŒ   r
  rÀ   r  Úgeneration_chunkr  ÚparamsrÆ   s
             rj   Ú	_generatezChatTongyi._generate‹  sE  € ð ˆØŒ>ð 	Ø>BÐØ%˜œØðØ#°ðð Ø@Fðð ð .ð .�ð $Ð+Ø',Ð$Ð$à$¨Ñ-Ð$Ð$Ø#Ð/Ð/Ð/Ø×Ò˜t×8Ò8Ð9IÑJÔJÑKÔKÐKÐKà%< TÔ%<ð &Ø!¨ð&ð &Ø06ð&ð &ˆFð .�4Ô-Ð7Ð7°Ð7Ð7ˆDØ×ÒÝÐLÐL ×!EÒ!EÀdÑ!KÔ!KÐLÐLñô ð õ Ø#à˜dœoðð
ñ 
ô 
ð 	
rw   ú'Optional[AsyncCallbackManagerForLLMRun]c           	   ‹  óö  K  — g }| j         rSd } | j        |f||dœ|¤Ž2 3 d {V —†}|€|}Œ||z  }Œ6 |€J ‚|                     |                      |¦  «        ¦  «         n„ | j        d||dœ|¤Ž}t          j        ¦   «                              d t          j	        | j
        fi |¤Ž¦  «        ƒ d {V —†}	|                     t          di |                      |	¦  «        ¤Ž¦  «         t          |d| j        i¬¦  «        S r  )r©   Ú_astreamr`   r  r  r÷   rø   rù   Ú	functoolsrU   rË   r'   r  r)   r¢   )
rœ   r  rŒ   r
  rÀ   r  Ú
generationr  r  rÆ   s
             rj   Ú
_ageneratezChatTongyi._agenerate­  s¥  è è € ð ˆØŒ>ð 	Ø8<ˆJØ,˜tœ}Øð Ø#°ð ð  Ø@Fð ð  ð (ð (ð (ð (ð (ð (ð (�eð Ð%Ø!&�J�Jà %Ñ'�J�Jð ð Ð)Ð)Ð)Ø×Ò˜t×8Ò8¸ÑDÔDÑEÔEÐEÐEà%< TÔ%<ð &Ø!¨ð&ð &Ø06ð&ð &ˆFõ !Ô1Ñ3Ô3×CÒCØÝÔ! $Ô"<ÐGÐGÀÐGÐGñô ð ð ð ð ð ð ˆDð ×ÒÝÐLÐL ×!EÒ!EÀdÑ!KÔ!KÐLÐLñô ð õ Ø#à˜dœoðð
ñ 
ô 
ð 	
s   Ÿ1úIterator[ChatGenerationChunk]c           
   +  óš  K  —  | j         d||ddœ|¤Ž}t           | j        di |¤Ž¦  «        D ]œ\  }}|d         d         d         }|d         }	|d         dk    r+|	d	         d
k    r|	                     dd
¦  «        d
k    rd|	vrŒXt	          di |                      |d|¬¦  «        ¤Ž}
|r|                     |
j        |
¬¦  «         |
V — Œ�d S )NT©r  rŒ   rÎ   rÐ   rÑ   r   r}   Úfinish_reasonÚnullrI   r[   rT   rL   ©rC   Úis_last_chunk©r  rq   )r  r@   rã   r_   r(   r  Úon_llm_new_tokenrÓ   )rœ   r  rŒ   r
  rÀ   r  Ústream_respr#  rß   r}   r  s              rj   r  zChatTongyi._streamÒ  sG  è è € ð "9 Ô!8ð "
Ø D°ð"
ð "
Ø9?ð"
ð "
ˆõ +JØ-ˆDÔ-Ð7Ð7°Ð7Ð7ñ+
ô +
ð 	ð 	Ñ&ˆK˜ð ! Ô*¨9Ô5°aÔ8ˆFØ˜YÔ'ˆGà�Ô'¨6Ò1Ð1Ø˜IÔ&¨"Ò,Ð,Ø—K’KÐ 3°RÑ8Ô8¸BÒ>Ð>Ø ¨Ð/Ð/àå'ð ð Ø×6Ò6Ø¨$¸mð 7ñ ô ðð ˆEð
 ð FØ×,Ò,¨U¬Z¸uÐ,ÑEÔEÐEØˆKˆKˆKˆKð)	ð 	rw   ú"AsyncIterator[ChatGenerationChunk]c           
    ó  K  —  | j         d||ddœ|¤Ž}t           | j        di |¤Ž¦  «        2 3 d {V —†\  }}t          di |                      |d|¬¦  «        ¤Ž}|r"|                     |j        |¬¦  «        ƒ d {V —† |W V — ŒV6 d S )NTr  r"  r$  rq   )r  r>   r  r(   r  r%  rÓ   )	rœ   r  rŒ   r
  rÀ   r  r&  r#  r  s	            rj   r  zChatTongyi._astreamó  s  è è € ð "9 Ô!8ð "
Ø D°ð"
ð "
Ø9?ð"
ð "
ˆõ 1QØ.ˆDÔ.Ð8Ð8°Ð8Ð8ñ1
ô 1
ð 
	ð 
	ð 
	ð 
	ð 
	ð 
	ð 
	Ñ,�+˜}õ (ð ð Ø×6Ò6Ø¨$¸mð 7ñ ô ðð ˆEð
 ð LØ!×2Ò2°5´:ÀUÐ2ÑKÔKÐKÐKÐKÐKÐKÐKÐKØˆKˆKˆKˆKˆKð1
ð 1
ð 1
s   ®Bc                ó8  — i | j         ¥|¥}|�||d<   |                     d¦  «        r|                     d¦  «        sd|d<   d„ |D ¦   «         }d„ t          |¦  «        D ¦   «         }t          |¦  «        dk    r|d	         d	k    rt	          d
¦  «        ‚||d<   |S )NrŒ   rÎ   ÚtoolsTrÏ   c                ó,   — g | ]}t          |¦  «        ‘ŒS rq   )r‚   )rr   Úms     rj   ú
<listcomp>z1ChatTongyi._invocation_params.<locals>.<listcomp>  s!   € ÐFÐFÐF¸Õ0°Ñ3Ô3ÐFÐFÐFrw   c                ó0   — g | ]\  }}|d          dk    ¯|‘ŒS )rH   rY   rq   )rr   Úir,  s      rj   r-  z1ChatTongyi._invocation_params.<locals>.<listcomp>  s1   € ð "
ð "
ð "
Ù�!�Q°a¸´iÀ8Ò6KÐ6KˆAÐ6KÐ6KÐ6Krw   ro   r   z-System message can only be the first message.r  )r¿   r_   r^   Úlenr·   )rœ   r  rŒ   rÀ   r  Úmessage_dictsÚsystem_message_indicess          rj   r  zChatTongyi._invocation_params	  s×   € ð 4�DÔ(Ð3¨FÐ3ˆØÐØ!ˆF�6‰Nð �:Š:�hÑÔð 	0¨¯
ª
°7Ñ(;Ô(;ð 	0Ø+/ˆFÐ'Ñ(àFÐF¸XÐFÑFÔFˆð"
ð "
Ý# MÑ2Ô2ð"
ñ "
ô "
Ðõ Ð%Ñ&Ô&¨!Ò+Ð+Ð0FÀqÔ0IÈQÒ0NÐ0NÝÐLÑMÔMÐMà*ˆˆzÑàˆrw   Úllm_outputsúList[Optional[dict]]r~   c                ó&   — |d         €i S |d         S )Nr   rq   )rœ   r3  s     rj   Ú_combine_llm_outputszChatTongyi._combine_llm_outputs!  s   € Ø�qŒ>Ð!ØˆIØ˜1Œ~Ðrw   rC   r#  c                óü   — | d         d         d         }t          |d         |¬¦  «        }|r@t          |t          |d         | d         t          | d         ¦  «        ¬	¦  «        ¬
¦  «        S t          |¬¦  «        S )NrÐ   rÑ   r   r}   )rC   r   Ú
request_idÚusage)r   r8  Útoken_usage©r}   Úgeneration_info)r}   )rk   r~   )rÆ   rC   r#  rß   r}   s        rj   r  z*ChatTongyi._chat_generation_from_qwen_resp&  s”   € ð �h” 	Ô*¨1Ô-ˆÝ)¨&°Ô*;ÀhÐOÑOÔOˆØð 
	)ÝØÝ $Ø"(¨Ô"9Ø# LÔ1Ý $ T¨'¤]Ñ 3Ô 3ð!ñ !ô !ðñ ô ð õ  Ð(Ñ(Ô(Ð(rw   r  r(   r'   c                óR   — t          t          | j        ¦  «        | j        ¬¦  «        S )Nr;  )r'   r|   r}   r<  r$  s    rj   r  zChatTongyi._chunk_to_generation?  s,   € åÝ4°U´]ÑCÔCØ!Ô1ð
ñ 
ô 
ð 	
rw   r*  úDSequence[Union[Dict[str, Any], Type[BaseModel], Callable, BaseTool]]ú'Runnable[LanguageModelInput, AIMessage]c                óR   •— d„ |D ¦   «         } t          ¦   «         j        dd|i|¤ŽS )að  Bind tool-like objects to this chat model.

        Args:
            tools: A list of tool definitions to bind to this chat model.
                Can be  a dictionary, pydantic model, callable, or BaseTool. Pydantic
                models, callables, and BaseTools will be automatically converted to
                their schema dictionary representation.
            **kwargs: Any additional parameters to pass to the
                :class:`~langchain.runnable.Runnable` constructor.
        c                ó,   — g | ]}t          |¦  «        ‘ŒS rq   r1   )rr   rZ   s     rj   r-  z)ChatTongyi.bind_tools.<locals>.<listcomp>V  s!   € ÐJÐJÐJ¸DÕ1°$Ñ7Ô7ÐJÐJÐJrw   r*  rq   )ÚsuperÚbind)rœ   r*  rÀ   Úformatted_toolsrx   s       €rj   Ú
bind_toolszChatTongyi.bind_toolsF  s:   ø€ ð  KÐJÀEÐJÑJÔJˆØ�u‰wŒwŒ|Ð<Ð< /Ð<°VÐ<Ð<Ð<rw   )Úinclude_rawÚschemaúUnion[Dict, Type[BaseModel]]rF  ú4Runnable[LanguageModelInput, Union[Dict, BaseModel]]c               óþ  — |rt          d|› �¦  «        ‚t          |t          ¦  «        ot          |¦  «        }|                      |g¦  «        }|rt          |gd¬¦  «        }n,t          |¦  «        d         d         }t          |d¬¦  «        }|rht          j	        t          d¦  «        |z  d„ ¬	¦  «        }t          j	        d
„ ¬¦  «        }	|                     |	gd¬¦  «        }
t          |¬¦  «        |
z  S ||z  S )a÷  Model wrapper that returns outputs formatted to match the given schema.

        Args:
            schema: The output schema as a dict or a Pydantic class. If a Pydantic class
                then the model output will be an object of that class. If a dict then
                the model output will be a dict. With a Pydantic class the returned
                attributes will be validated, whereas with a dict they will not be. If
                `method` is "function_calling" and `schema` is a dict, then the dict
                must match the OpenAI function-calling spec.
            include_raw:
                If `False` then only the parsed structured output is returned.

                If an error occurs during model output parsing it will be raised.

                If `True` then both the raw model response (a `BaseMessage`) and the
                parsed model response will be returned.

                If an error occurs during output parsing it will be caught and returned
                as well.

                The final output is always a `dict` with keys `'raw'`, `'parsed'`, and
                `'parsing_error'`.

        Returns:
            A Runnable that takes any ChatModel input and returns as output:

                If include_raw is True then a dict with keys:
                    raw: BaseMessage
                    parsed: Optional[_DictOrPydantic]
                    parsing_error: Optional[BaseException]

                If include_raw is False then just _DictOrPydantic is returned,
                where _DictOrPydantic depends on the schema:

                If schema is a Pydantic class then _DictOrPydantic is the Pydantic
                    class.

                If schema is a dict then _DictOrPydantic is a dict.

        zReceived unsupported arguments T)r*  Úfirst_tool_onlyrN   rO   )Úkey_namerK  Úrawc                ó   — d S rð   rq   ©Ú_s    rj   ú<lambda>z3ChatTongyi.with_structured_output.<locals>.<lambda>™  s   € ÐRV€ rw   )ÚparsedÚparsing_errorc                ó   — d S rð   rq   rO  s    rj   rQ  z3ChatTongyi.with_structured_output.<locals>.<lambda>›  s   € Àd€ rw   )rR  rS  )Úexception_key)rM  )r·   rd   rn   r3   rE  r$   r2   r#   r,   Úassignr   Úwith_fallbacksr+   )rœ   rG  rF  rÀ   Úis_pydantic_schemarƒ   Úoutput_parserrL  Úparser_assignÚparser_noneÚparser_with_fallbacks              rj   Úwith_structured_outputz!ChatTongyi.with_structured_outputY  sB  € ð^ ð 	IÝÐG¸vÐGÐGÑHÔHÐHÝ'¨µÑ5Ô5ÐWÕ:OÐPVÑ:WÔ:WÐØ�oŠo˜v˜hÑ'Ô'ˆØð 		Ý.AØ�hØ $ð/ñ /ô /ˆMˆMõ
 .¨fÑ5Ô5°jÔAÀ&ÔIˆHÝ4Ø!°4ðñ ô ˆMð ð 
	'Ý/Ô6Ý! %Ñ(Ô(¨=Ñ8ÈÈðñ ô ˆMõ .Ô4¸N¸NÐKÑKÔKˆKØ#0×#?Ò#?Ø�¨_ð $@ñ $ô $Ð õ  3Ð'Ñ'Ô'Ð*>Ñ>Ð>à˜Ñ&Ð&rw   )rE   r—   )rE   rc   )r°   r   rE   r   )rE   r¤   )rÀ   r   rE   r   )rÆ   r   rÝ   r   rE   r   )NN)
r  r  rŒ   r	  r
  r  rÀ   r   rE   r)   )
r  r  rŒ   r	  r
  r  rÀ   r   rE   r)   )
r  r  rŒ   r	  r
  r  rÀ   r   rE   r  )
r  r  rŒ   r	  r
  r  rÀ   r   rE   r'  )r  r  rŒ   r   rÀ   r   rE   r¤   )r3  r4  rE   r~   )FT)rÆ   r   rC   rD   r#  rD   rE   r¤   )r  r(   rE   r'   )r*  r>  rÀ   r   rE   r?  )rG  rH  rF  rD   rÀ   r   rE   rI  )&r  r  r  Ú__doc__Úpropertyr�   rž   Ú__annotations__r6   r¢   r~   r¥   r§   r™   r©   r�   r5   Úmodel_configr¯   r0   r»   r¿   rË   rã   rÛ   r  r  r  r  r  r  r6  Ústaticmethodr  r  rE  r]  Ú__classcell__)rx   s   @rj   r„   r„   ý   s  ø€ € € € € € ð|ð |ð| ð:ð :ð :ñ „Xð:ð €FÐÐÐÑØ�e L¸Ð@Ñ@Ô@€JÐ@Ð@Ð@Ñ@ðð $) 5¸Ð#>Ñ#>Ô#>€LÐ>Ð>Ð>Ñ>à€EÐÐÐÑØDà-2¨U°4¸yÐ-IÑ-IÔ-IÐÐIÐIÐIÑIØ5à€IÐÐÐÑØ/à€KÐÐÐÑØ<à�:Øðñ ô €Lð ðð ð ñ „Xðð ð)ð )ð )ñ „Xð)ðV ð
ð 
ð 
ñ „Xð
ð	0ð 	0ð 	0ð 	0ð%7ð %7ð %7ð %7ðN ð  ð  ð  ðDð ð ð ðD %)Ø:>ð	 
ð  
ð  
ð  
ð  
ðJ %)Ø?Cð	#
ð #
ð #
ð #
ð #
ðP %)Ø:>ð	ð ð ð ð ðH %)Ø?Cð	ð ð ð ð ð,ð ð ð ð0ð ð ð ð
 àAEð)ð )ð )ð )ñ „\ð)ð0 ð
ð 
ð 
ñ „\ð
ð=ð =ð =ð =ð =ð =ð. "ð	H'ð H'ð H'ð H'ð H'ð H'ð H'ð H'ð H'ð H'rw   )F)rA   rB   rC   rD   rE   rF   )rl   r   rE   r   )r}   r   rE   r~   )rƒ   r„   rE   r…   )\Ú
__future__r   r÷   r  rÖ   r‘   Úoperatorr   Útypingr   r   r   r   r	   r
   r   r   r   r   r   r   Úlangchain_core.callbacksr   r   Úlangchain_core.language_modelsr   Ú*langchain_core.language_models.chat_modelsr   Úlangchain_core.messagesr   r   r   r   r   r   r   r   r   r   r   r    r!   Ú"langchain_core.output_parsers.baser"   Ú*langchain_core.output_parsers.openai_toolsr#   r$   r%   r&   Úlangchain_core.outputsr'   r(   r)   Úlangchain_core.runnablesr*   r+   r,   Úlangchain_core.toolsr-   Úlangchain_core.utilsr.   r/   r0   Ú%langchain_core.utils.function_callingr2   Úlangchain_core.utils.pydanticr3   Úpydanticr4   r5   r6   r7   Úrequests.exceptionsr8   Útenacityr9   r:   r;   r<   r=   Úlangchain_community.llms.tongyir>   r?   r@   Ú	getLoggerr  r�   rk   r|   r‚   r•   r„   rq   rw   rj   ú<module>rx     s3  ðØ "Ð "Ð "Ð "Ð "Ð "à €€€Ø Ð Ð Ð Ø €€€Ø €€€Ø Ð Ð Ð Ð Ð ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ðð ð ð ð ð ð ð ð >Ð =Ð =Ð =Ð =Ð =Ø DÐ DÐ DÐ DÐ DÐ Dðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð @Ð ?Ð ?Ð ?Ð ?Ð ?ðð ð ð ð ð ð ð ð ð ð ð ðð ð ð ð ð ð ð ð ð ð
 PÐ OÐ OÐ OÐ OÐ OÐ OÐ OÐ OÐ OØ )Ð )Ð )Ð )Ð )Ð )Ø VÐ VÐ VÐ VÐ VÐ VÐ VÐ VÐ VÐ VØ HÐ HÐ HÐ HÐ HÐ HØ ?Ð ?Ð ?Ð ?Ð ?Ð ?ðð ð ð ð ð ð ð ð ð ð ð ð *Ð )Ð )Ð )Ð )Ð )ðð ð ð ð ð ð ð ð ð ð ð ð ð ðð ð ð ð ð ð ð ð ð ð 
ˆÔ	˜8Ñ	$Ô	$€ð 05ð_
ð _
ð _
ð _
ð _
ðDð ð ð ð(!ð !ð !ð !ðHð ð ð ðd
'ð d
'ð d
'ð d
'ð d
'�ñ d
'ô d
'ð d
'ð d
'ð d
'rw   