
    ii                     z   d Z ddlZddlmZ ddlmZ ddlmZ ddl	m
Z
 ddlmZ ddlmZ dd	l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 erddlmZ  G d de          Z G d de          Z  G d de          Z! G d de          Z" G d de          Z# G d de          Z$ G d de          Z%dS )z;This module contains the Telegram Business related classes.    N)Sequence)TYPE_CHECKING)ZoneInfo)Chat)Location)Sticker)TelegramObject)User)de_json_optionalde_list_optionalparse_sequence_arg)extract_tzinfo_from_defaultsfrom_timestampget_zone_info)JSONDict)Botc            !            e Zd ZdZdZ	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddddedz  dedz  dedz  dedz  d	edz  d
edz  dedz  dedz  dedz  dedz  dedz  dedz  dedz  dedz  dedz  f fdZ xZS )BusinessBotRightsaW  
    This object represents the rights of a business bot.

    Objects of this class are comparable in terms of equality.
    Two objects of this class are considered equal, if all their attributes are equal.

    .. versionadded:: 22.1

    Args:
        can_reply (:obj:`bool`, optional): True, if the bot can send and edit messages in the
            private chats that had incoming messages in the last 24 hours.
        can_read_messages (:obj:`bool`, optional): True, if the bot can mark incoming private
            messages as read.
        can_delete_sent_messages (:obj:`bool`, optional): True, if the bot can delete messages
            sent by the bot.
        can_delete_all_messages (:obj:`bool`, optional): True, if the bot can delete all private
            messages in managed chats.
        can_edit_name (:obj:`bool`, optional): True, if the bot can edit the first and last name
            of the business account.
        can_edit_bio (:obj:`bool`, optional): True, if the bot can edit the bio of the
            business account.
        can_edit_profile_photo (:obj:`bool`, optional): True, if the bot can edit the profile
            photo of the business account.
        can_edit_username (:obj:`bool`, optional): True, if the bot can edit the username of the
            business account.
        can_change_gift_settings (:obj:`bool`, optional): True, if the bot can change the privacy
            settings pertaining to gifts for the business account.
        can_view_gifts_and_stars (:obj:`bool`, optional): True, if the bot can view gifts and the
            amount of Telegram Stars owned by the business account.
        can_convert_gifts_to_stars (:obj:`bool`, optional): True, if the bot can convert regular
            gifts owned by the business account to Telegram Stars.
        can_transfer_and_upgrade_gifts (:obj:`bool`, optional): True, if the bot can transfer and
            upgrade gifts owned by the business account.
        can_transfer_stars (:obj:`bool`, optional): True, if the bot can transfer Telegram Stars
            received by the business account to its own account, or use them to upgrade and
            transfer gifts.
        can_manage_stories (:obj:`bool`, optional): True, if the bot can post, edit and delete
            stories on behalf of the business account.

    Attributes:
        can_reply (:obj:`bool`): Optional. True, if the bot can send and edit messages in the
            private chats that had incoming messages in the last 24 hours.
        can_read_messages (:obj:`bool`): Optional. True, if the bot can mark incoming private
            messages as read.
        can_delete_sent_messages (:obj:`bool`): Optional. True, if the bot can delete messages
            sent by the bot.
        can_delete_all_messages (:obj:`bool`): Optional. True, if the bot can delete all private
            messages in managed chats.
        can_edit_name (:obj:`bool`): Optional. True, if the bot can edit the first and last name
            of the business account.
        can_edit_bio (:obj:`bool`): Optional. True, if the bot can edit the bio of the
            business account.
        can_edit_profile_photo (:obj:`bool`): Optional. True, if the bot can edit the profile
            photo of the business account.
        can_edit_username (:obj:`bool`): Optional. True, if the bot can edit the username of the
            business account.
        can_change_gift_settings (:obj:`bool`): Optional. True, if the bot can change the privacy
            settings pertaining to gifts for the business account.
        can_view_gifts_and_stars (:obj:`bool`): Optional. True, if the bot can view gifts and the
            amount of Telegram Stars owned by the business account.
        can_convert_gifts_to_stars (:obj:`bool`): Optional. True, if the bot can convert regular
            gifts owned by the business account to Telegram Stars.
        can_transfer_and_upgrade_gifts (:obj:`bool`): Optional. True, if the bot can transfer and
            upgrade gifts owned by the business account.
        can_transfer_stars (:obj:`bool`): Optional. True, if the bot can transfer Telegram Stars
            received by the business account to its own account, or use them to upgrade and
            transfer gifts.
        can_manage_stories (:obj:`bool`): Optional. True, if the bot can post, edit and delete
            stories on behalf of the business account.
    )can_change_gift_settingscan_convert_gifts_to_starscan_delete_all_messagescan_delete_sent_messagescan_edit_biocan_edit_namecan_edit_profile_photocan_edit_usernamecan_manage_storiescan_read_messages	can_replycan_transfer_and_upgrade_giftscan_transfer_starscan_view_gifts_and_starsN
api_kwargsr   r   r   r   r   r   r   r   r   r"   r   r    r!   r   r$   c                   t                                          |           || _        || _        || _        || _        || _        || _        || _        || _	        |	| _
        |
| _        || _        || _        || _        || _        | j        | j        | j        | j        | j        | j        | j        | j	        | j
        | j        | j        | j        | j        | j        f| _        |                                  d S Nr#   )super__init__r   r   r   r   r   r   r   r   r   r"   r   r    r!   r   	_id_attrs_freeze)selfr   r   r   r   r   r   r   r   r   r"   r   r    r!   r   r$   	__class__s                   R/Users/shanyulin/my-agent/.venv/lib/python3.11/site-packages/telegram/_business.pyr(   zBusinessBotRights.__init__   s    & 	J///&/.?5M%4K$*7)53I#.?5M%5M%7Q';Y+/A/A N")('"))+/##
" 	    )NNNNNNNNNNNNNN)	__name__
__module____qualname____doc__	__slots__boolr   r(   __classcell__r,   s   @r-   r   r   0   sa       E ENI& "&)-04/3%)$(.2)-0404266:*.*.4" '+#4 4 4$;4  $;4 #'+	4
 "&4 d{4 Tk4 !%t4  $;4 #'+4 #'+4 %)4K4 )-t4 !4K4 !4K4" tO#4 4 4 4 4 4 4 4 4 4r.   r   c                        e Zd ZdZdZ	 ddddeddded	ej        d
e	de
dz  dedz  f fdZeddedddd f fd            Z xZS )BusinessConnectiona  
    Describes the connection of the bot with a business account.

    Objects of this class are comparable in terms of equality. Two objects of this class are
    considered equal if their :attr:`id`, :attr:`user`, :attr:`user_chat_id`, :attr:`date`,
    :attr:`rights`, and :attr:`is_enabled` are equal.

    .. versionadded:: 21.1
    .. versionchanged:: 22.1
        Equality comparison now considers :attr:`rights` instead of ``can_reply``.

    .. versionremoved:: 22.3
       Removed argument and attribute ``can_reply`` deprecated  by API 9.0.

    Args:
        id (:obj:`str`): Unique identifier of the business connection.
        user (:class:`telegram.User`): Business account user that created the business connection.
        user_chat_id (:obj:`int`): Identifier of a private chat with the user who created the
            business connection.
        date (:obj:`datetime.datetime`): Date the connection was established in Unix time.
        is_enabled (:obj:`bool`): True, if the connection is active.
        rights (:class:`BusinessBotRights`, optional): Rights of the business bot.

            .. versionadded:: 22.1

    Attributes:
        id (:obj:`str`): Unique identifier of the business connection.
        user (:class:`telegram.User`): Business account user that created the business connection.
        user_chat_id (:obj:`int`): Identifier of a private chat with the user who created the
            business connection.
        date (:obj:`datetime.datetime`): Date the connection was established in Unix time.
        is_enabled (:obj:`bool`): True, if the connection is active.
        rights (:class:`BusinessBotRights`): Optional. Rights of the business bot.

            .. versionadded:: 22.1
    )dateid
is_enabledrightsuseruser_chat_idNr#   r:   r=   r
   r>   r9   r;   r<   r$   c                   t                                          |           || _        || _        || _        || _        || _        || _        | j        | j        | j        | j        | j        | j        f| _        | 	                                 d S r&   )
r'   r(   r:   r=   r>   r9   r;   r<   r)   r*   )	r+   r:   r=   r>   r9   r;   r<   r$   r,   s	           r-   r(   zBusinessConnection.__init__   s     	J///	!-"&	 *06 GIIKO
 	r.   databot
Bot | Nonereturnc                    |                      |          }t          |          }t          |                    d          |          |d<   t	          |                    d          t
          |          |d<   t	          |                    d          t          |          |d<   t                                          ||          S ),See :meth:`telegram.TelegramObject.de_json`.r9   tzinfor=   r<   r@   rA   )	_parse_datar   r   getr   r
   r   r'   de_json)clsr@   rA   
loc_tzinfor,   s       r-   rK   zBusinessConnection.de_json  s     t$$ 2#66
%dhhv&6&6zJJJV'(8(8$DDV)$((8*<*<>OQTUUXwwDc222r.   N)r/   r0   r1   r2   r3   strintdtmdatetimer4   r   r   r(   classmethodrK   r5   r6   s   @r-   r8   r8      s        # #JI  ,0 '+    	
 l  "D( tO     < 3 38 3, 3BV 3 3 3 3 3 [3 3 3 3 3r.   r8   c            
       z     e Zd ZdZdZdddededee         de	dz  f fd	Z
edd
e	dddd f fd            Z xZS )BusinessMessagesDeleteda  
    This object is received when messages are deleted from a connected business account.

    Objects of this class are comparable in terms of equality. Two objects of this class are
    considered equal if their :attr:`business_connection_id`, :attr:`message_ids`, and
    :attr:`chat` are equal.

    .. versionadded:: 21.1

    Args:
        business_connection_id (:obj:`str`): Unique identifier of the business connection.
        chat (:class:`telegram.Chat`): Information about a chat in the business account. The bot
            may not have access to the chat or the corresponding user.
        message_ids (Sequence[:obj:`int`]): A list of identifiers of the deleted messages in the
            chat of the business account.

    Attributes:
        business_connection_id (:obj:`str`): Unique identifier of the business connection.
        chat (:class:`telegram.Chat`): Information about a chat in the business account. The bot
            may not have access to the chat or the corresponding user.
        message_ids (tuple[:obj:`int`]): A list of identifiers of the deleted messages in the
            chat of the business account.
    )business_connection_idchatmessage_idsNr#   rV   rW   rX   r$   c                    t                                          |           || _        || _        t	          |          | _        | j        | j        | j        f| _        |                                  d S r&   )r'   r(   rV   rW   r   rX   r)   r*   )r+   rV   rW   rX   r$   r,   s        r-   r(   z BusinessMessagesDeleted.__init__;  sn     	J///+A#	,>{,K,K 'I
 	r.   r@   rA   rB   rC   c                     |                      |          }t          |                    d          t          |          |d<   t	                                          ||          S )rE   rW   rH   )rI   r   rJ   r   r'   rK   rL   r@   rA   r,   s      r-   rK   zBusinessMessagesDeleted.de_jsonP  sQ     t$$'(8(8$DDVwwDc222r.   rN   )r/   r0   r1   r2   r3   rO   r   r   rP   r   r(   rS   rK   r5   r6   s   @r-   rU   rU     s         0I '+   #  c]	 tO     * 3 38 3, 3B[ 3 3 3 3 3 [3 3 3 3 3r.   rU   c                        e Zd ZdZdZ	 	 	 ddddedz  dedz  dedz  dedz  f fd	Ze	dd
edddd f fd            Z
 xZS )BusinessIntroa3  
    This object contains information about the start page settings of a Telegram Business account.

    Objects of this class are comparable in terms of equality.
    Two objects of this class are considered equal, if their
    :attr:`title`, :attr:`message` and :attr:`sticker` are equal.

    .. versionadded:: 21.1

    Args:
        title (:obj:`str`, optional): Title text of the business intro.
        message (:obj:`str`, optional): Message text of the business intro.
        sticker (:class:`telegram.Sticker`, optional): Sticker of the business intro.

    Attributes:
        title (:obj:`str`): Optional. Title text of the business intro.
        message (:obj:`str`): Optional. Message text of the business intro.
        sticker (:class:`telegram.Sticker`): Optional. Sticker of the business intro.
    )messagestickertitleNr#   r`   r^   r_   r$   c                    t                                          |           || _        || _        || _        | j        | j        | j        f| _        |                                  d S r&   )r'   r(   r`   r^   r_   r)   r*   )r+   r`   r^   r_   r$   r,   s        r-   r(   zBusinessIntro.__init__u  sZ     	J///!&
#*'.*dlDLAr.   r@   rA   rB   rC   c                     |                      |          }t          |                    d          t          |          |d<   t	                                          ||          S )rE   r_   rH   )rI   r   rJ   r   r'   rK   r[   s      r-   rK   zBusinessIntro.de_json  sQ     t$$*488I+>+>MMYwwDc222r.   )NNNrN   )r/   r0   r1   r2   r3   rO   r   r   r(   rS   rK   r5   r6   s   @r-   r]   r]   Z  s         (I !""&	 '+  Tz t 4	 tO     " 3 38 3, 3/ 3 3 3 3 3 [3 3 3 3 3r.   r]   c            	       n     e Zd ZdZdZ	 ddddedddedz  f fd	Zedd
edddd f fd            Z	 xZ
S )BusinessLocationaD  
    This object contains information about the location of a Telegram Business account.

    Objects of this class are comparable in terms of equality.
    Two objects of this class are considered equal, if their
    :attr:`address` is equal.

    .. versionadded:: 21.1

    Args:
        address (:obj:`str`): Address of the business.
        location (:class:`telegram.Location`, optional): Location of the business.

    Attributes:
        address (:obj:`str`): Address of the business.
        location (:class:`telegram.Location`): Optional. Location of the business.
    )addresslocationNr#   re   rf   zLocation | Noner$   c                    t                                          |           || _        || _        | j        f| _        |                                  d S r&   )r'   r(   re   rf   r)   r*   )r+   re   rf   r$   r,   s       r-   r(   zBusinessLocation.__init__  sJ     	J///#)1,r.   r@   rA   rB   rC   c                     |                      |          }t          |                    d          t          |          |d<   t	                                          ||          S )rE   rf   rH   )rI   r   rJ   r   r'   rK   r[   s      r-   rK   zBusinessLocation.de_json  sR     t$$+DHHZ,@,@(CPPZwwDc222r.   rN   )r/   r0   r1   r2   r3   rO   r   r(   rS   rK   r5   r6   s   @r-   rd   rd     s         $I '+
 '+   $
 tO      3 38 3, 3BT 3 3 3 3 3 [3 3 3 3 3r.   rd   c                        e Zd ZdZdZdddedededz  f fdZd	ed
eeeef         fdZ	e
d
eeeef         fd            Ze
d
eeeef         fd            Z xZS )BusinessOpeningHoursIntervala|  
    This object describes an interval of time during which a business is open.

    Objects of this class are comparable in terms of equality.
    Two objects of this class are considered equal, if their
    :attr:`opening_minute` and :attr:`closing_minute` are equal.

    .. versionadded:: 21.1

    Examples:
        A day has (24 * 60 =) 1440 minutes, a week has (7 * 1440 =) 10080 minutes.
        Starting the minute's sequence from Monday, example values of
        :attr:`opening_minute`, :attr:`closing_minute` will map to the following day times:

        * Monday - 8am to 8:30pm:
            - ``opening_minute = 480`` :guilabel:`8 * 60`
            - ``closing_minute = 1230`` :guilabel:`20 * 60 + 30`
        * Tuesday - 24 hours:
            - ``opening_minute = 1440`` :guilabel:`24 * 60`
            - ``closing_minute = 2879`` :guilabel:`2 * 24 * 60 - 1`
        * Sunday - 12am - 11:58pm:
            - ``opening_minute = 8640`` :guilabel:`6 * 24 * 60`
            - ``closing_minute = 10078`` :guilabel:`7 * 24 * 60 - 2`

    Args:
        opening_minute (:obj:`int`): The minute's sequence number in a week, starting on Monday,
            marking the start of the time interval during which the business is open;
            0 - 7 * 24 * 60.
        closing_minute (:obj:`int`): The minute's
            sequence number in a week, starting on Monday, marking the end of the time interval
            during which the business is open; 0 - 8 * 24 * 60

    Attributes:
        opening_minute (:obj:`int`): The minute's sequence number in a week, starting on Monday,
            marking the start of the time interval during which the business is open;
            0 - 7 * 24 * 60.
        closing_minute (:obj:`int`): The minute's
            sequence number in a week, starting on Monday, marking the end of the time interval
            during which the business is open; 0 - 8 * 24 * 60
    )_closing_time_opening_timeclosing_minuteopening_minuteNr#   rn   rm   r$   c                    t                                          |           || _        || _        d | _        d | _        | j        | j        f| _        |                                  d S r&   )r'   r(   rn   rm   rl   rk   r)   r*   )r+   rn   rm   r$   r,   s       r-   r(   z%BusinessOpeningHoursInterval.__init__  sc     	J///#1#1:>:>-t/BCr.   minuterC   c                 *    |dz  |dz  dz  |dz  dz  fS )N  <    )r+   rp   s     r-   _parse_minutez*BusinessOpeningHoursInterval._parse_minute  s%    $ 3Vd]R5GHHr.   c                 \    | j         |                     | j                  | _         | j         S )aW  Convenience attribute. A :obj:`tuple` parsed from :attr:`opening_minute`. It contains
        the `weekday`, `hour` and `minute` in the same ranges as :attr:`datetime.datetime.weekday`,
        :attr:`datetime.datetime.hour` and :attr:`datetime.datetime.minute`

        Returns:
            tuple[:obj:`int`, :obj:`int`, :obj:`int`]:
        )rl   ru   rn   r+   s    r-   opening_timez)BusinessOpeningHoursInterval.opening_time  /     %!%!3!3D4G!H!HD!!r.   c                 \    | j         |                     | j                  | _         | j         S )aW  Convenience attribute. A :obj:`tuple` parsed from :attr:`closing_minute`. It contains
        the `weekday`, `hour` and `minute` in the same ranges as :attr:`datetime.datetime.weekday`,
        :attr:`datetime.datetime.hour` and :attr:`datetime.datetime.minute`

        Returns:
            tuple[:obj:`int`, :obj:`int`, :obj:`int`]:
        )rk   ru   rm   rw   s    r-   closing_timez)BusinessOpeningHoursInterval.closing_time  ry   r.   )r/   r0   r1   r2   r3   rP   r   r(   tupleru   propertyrx   r{   r5   r6   s   @r-   rj   rj     s       ' 'R WI '+   
 tO     $IC IE#sC-,@ I I I I 
"eCcM2 
" 
" 
" X
" 
"eCcM2 
" 
" 
" X
" 
" 
" 
" 
"r.   rj   c            
           e Zd ZdZdZdddedee         dedz  f fdZ	e
d	efd
            Z	 ddej        dej        ez  dz  d	eeej        ej        f         df         fdZdej        d	efdZeddeddd	d f fd            Z xZS )BusinessOpeningHoursaS  
    This object describes the opening hours of a business.

    Objects of this class are comparable in terms of equality.
    Two objects of this class are considered equal, if their
    :attr:`time_zone_name` and :attr:`opening_hours` are equal.

    .. versionadded:: 21.1

    Args:
        time_zone_name (:obj:`str`): Unique name of the time zone for which the opening
            hours are defined.
        opening_hours (Sequence[:class:`telegram.BusinessOpeningHoursInterval`]): List of
            time intervals describing business opening hours.

    Attributes:
        time_zone_name (:obj:`str`): Unique name of the time zone for which the opening
            hours are defined.
        opening_hours (Sequence[:class:`telegram.BusinessOpeningHoursInterval`]): List of
            time intervals describing business opening hours.
    )_cached_zone_infoopening_hourstime_zone_nameNr#   r   r   r$   c                    t                                          |           || _        t          |          | _        d | _        | j        | j        f| _        |                                  d S r&   )r'   r(   r   r   r   r   r)   r*   )r+   r   r   r$   r,   s       r-   r(   zBusinessOpeningHours.__init__6  sl     	J///#1EWF
 F
 37-t/ABr.   rC   c                 P    | j         t          | j                  | _         | j         S rN   )r   r   r   rw   s    r-   
_zone_infozBusinessOpeningHours._zone_infoI  s'    !)%243F%G%GD"%%r.   r9   	time_zone.c           	      z   |                                 }g }t          |t                    rt          |          }n|| j        }n|}| j        D ]}|j        }|j        }|d         |k    rt          j	        |j
        |j        |j        |d         |d         | j                                      |          }	t          j	        |j
        |j        |j        |d         |d         | j                                      |          }
|                    |	|
f           t          t!          |d                     S )a  Returns the opening hours intervals for a specific day as datetime objects.

        .. versionadded:: 22.5

        Args:
            date (:obj:`datetime.date`): The date to get opening hours for.
            time_zone (:obj:`datetime.tzinfo` | :obj:`str`, optional): Timezone to use for the
                returned datetime objects. If not specified, then :attr:`time_zone_name` be used.

        Returns:
            tuple[tuple[:obj:`datetime.datetime`, :obj:`datetime.datetime`], ...]:
            A tuple of datetime pairs representing opening and closing times for the specified day.
            Each pair consists of ``(opening_time, closing_time)``.
            Returns an empty tuple if there are no opening hours for the given day.
        Nr         )yearmonthdayhourrp   rG   c                     | d         S )Nr   rt   )xs    r-   <lambda>z@BusinessOpeningHours.get_opening_hours_for_day.<locals>.<lambda>  s
    qt r.   )key)weekday
isinstancerO   r   r   r   rx   r{   rQ   rR   r   r   r   
astimezoneappendr|   sorted)r+   r9   r   week_dayres	tz_targetintervalint_open	int_closeresult_int_openresult_int_closes              r-   get_opening_hours_for_dayz.BusinessOpeningHours.get_opening_hours_for_dayO  sS   & <<>>i%% 	"$1)$<$<IIII!I* 	< 	<H,H -I{h&& "lYjHa[{   j##   #|YjHq\ |      j##  JJ)9:;;;; VC^^444555r.   rR   c                     |j         |                    | j                  n|                    | j                  }|                                dz  |j        dz  z   |j        z   }| j        D ]}|j        |cxk    r|j	        k     rn  dS  dS )a  Check if the business is open at the specified datetime.

        .. versionadded:: 22.5

        Args:
            datetime (:obj:`datetime.datetime`): The datetime to check.
                If the object is timezone-naive, it is assumed to be in the
                timezone specified by :attr:`time_zone_name`.

        Returns:
            :obj:`bool`: True if the business is open at the specified time, False otherwise.
        NrF   rr   rs   TF)
rG   replacer   r   r   r   rp   r   rn   rm   )r+   rR   datetime_in_native_tzminute_of_weekr   s        r-   is_openzBusinessOpeningHours.is_open  s     9A8OHDO444U]
*T_
%
% 	 "))++d2#(2-.#*+ 	 * 	 	H&.RRRR8;RRRRRRtt S ur.   r@   rA   rB   c                     |                      |          }t          |                    d          t          |          |d<   t	                                          ||          S )rE   r   rH   )rI   r   rJ   rj   r'   rK   r[   s      r-   rK   zBusinessOpeningHours.de_json  sZ     t$$ 0HH_%%'CS!
 !
_ wwDc222r.   rN   )r/   r0   r1   r2   r3   rO   r   rj   r   r(   r}   r   r   rQ   r9   rG   r|   rR   r   r4   r   rS   rK   r5   r6   s   @r-   r   r     ss        , II '+     <=
 tO     & &H & & & X& DH<6 <6H<6),c)9D)@<6	uS\3</0#5	6<6 <6 <6 <6|     : 3 38 3, 3BX 3 3 3 3 3 [3 3 3 3 3r.   r   )&r2   rR   rQ   collections.abcr   typingr   zoneinfor   telegram._chatr   telegram._files.locationr   telegram._files.stickerr   telegram._telegramobjectr	   telegram._userr
   telegram._utils.argumentparsingr   r   r   telegram._utils.datetimer   r   r   telegram._utils.typesr   telegramr   r   r8   rU   r]   rd   rj   r   rt   r.   r-   <module>r      s  ( B A     $ $ $ $ $ $                         - - - - - - + + + + + + 3 3 3 3 3 3               
         
 + * * * * * M M M M M M M M`Y3 Y3 Y3 Y3 Y3 Y3 Y3 Y3x;3 ;3 ;3 ;3 ;3n ;3 ;3 ;3|33 33 33 33 33N 33 33 33l.3 .3 .3 .3 .3~ .3 .3 .3bY" Y" Y" Y" Y"> Y" Y" Y"xV3 V3 V3 V3 V3> V3 V3 V3 V3 V3r.   