
    G˝iM                       U d dl mZ d dl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mZ d dlmZmZmZmZ eZdEd	Z G d
 de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 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% 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*i ejV                  eejV                  eejV                  eejV                  eejV                  eejV                  eejV                  eejV                  ee jV                  e e!jV                  e!e"jV                  e"e#jV                  e#e$jV                  e$e%jV                  e%e&jV                  e&e'jV                  e'e(jV                  e(e)jV                  e)e*jV                  e*iZ,d0e-d1<   dFd2Z.	 	 dG	 	 	 	 	 	 	 	 	 dHd3Z/d4d5d6dId7Z0d4d8dJd9Z1d:d;dKd<Z2d=d>d?dLd@Z3dMdAZ4d:d;	 	 	 	 	 	 	 dNdBZ5d=d>d?	 	 	 	 	 	 	 	 	 dOdCZ6dPdDZ7y)Q    )annotationsN)	GeneratorIterableIterator)AnyClassVar)Self)MessageEntityType)MessageEntityUser)add_surrogateshtml_decorationmarkdown_decorationremove_surrogatesc                <    t        | j                  d            dz  S )Nz	utf-16-le   )lenencode)values    Q/home/leshdev/mybot/venv/lib/python3.12/site-packages/aiogram/utils/formatting.pysizeofr      s    u||K()Q..    c                     e Zd ZU dZdZded<   dZ	 	 	 	 	 	 ddZed d	       Z	d
ddd	 	 	 	 	 	 	 d!dZ
d"dZddddd	 	 	 	 	 	 	 	 	 d#dZddd$dZddd$dZddd$dZddd$dZd%dZd%dZd&dZd'd(dZd)dZd*dZd+dZd,dZy)-Textz
    Simple text element
    NzClassVar[str | None]type_body_paramsc                     || _         || _        y Nr   )selfbodyparamss      r   __init__zText.__init__"   s    
 ,0
'-r   textentitiesc           	     `     | t        t        |      |rt        |d              S g        S )Nc                    | j                   S r    offset)items    r   <lambda>z$Text.from_entities.<locals>.<lambda>/   s
    4;; r   key)r%   r&   )_unparse_entitiesr   sorted)clsr%   r&   s      r   from_entitieszText.from_entities*   sB    #D)KS.FG
 	
 Z\
 	
r   r   T_offset_sort_collect_entitiesc                  d}g }|}| j                   D ]o  }t        |t              st        |      }||z  }|t	        |      z  }2|j                  |d|      \  }}	||z  }|t	        |      z  }|s_|j                  |	       q |r1| j                  r%|j                  | j                  |||z
               |r|r|j                  d        ||fS )zS
        Render elements tree as text with entities list

        :return:
         Fr3   r*   lengthc                    | j                   S r    r)   )entitys    r   r,   zText.render.<locals>.<lambda>X   s
    V]] r   r-   )r   
isinstancer   strr   renderextendr   append_render_entitysort)
r!   r4   r5   r6   r%   r&   r*   node	node_textnode_entitiess
             r   r?   zText.render3   s     JJ 	3DdD)4y&,&+/;;"&7 ,7 ,(	=
 	!&++$OOM2	3  OOD//wvPWGW/XYMM:M;X~r   c               n    | j                   J d       t        d| j                   ||d| j                  S )Nz-Node without type can't be rendered as entity)r   r*   r:    )r   r   r   )r!   r*   r:   s      r   rB   zText._render_entity\   s7    yy$U&UU$Z$))F6ZT\\ZZr   
parse_mode)text_keyentities_keyreplace_parse_modeparse_mode_keyc               F    | j                         \  }}||||i}|rd||<   |S )af  
        Render element tree as keyword arguments for usage in an API call, for example:

        .. code-block:: python

            entities = Text(...)
            await message.answer(**entities.as_kwargs())

        :param text_key:
        :param entities_key:
        :param replace_parse_mode:
        :param parse_mode_key:
        :return:
        N)r?   )r!   rJ   rK   rL   rM   
text_valueentities_valueresults           r   	as_kwargszText.as_kwargs`   s9    , &*[[]"
Nj."
 %)F>"r   )rL   c               *    | j                  dd|      S )af  
        Shortcut for :meth:`as_kwargs` for usage with API calls that take
        ``caption`` as a parameter.

        .. code-block:: python

            entities = Text(...)
            await message.answer_photo(**entities.as_caption_kwargs(), photo=phot)

        :param replace_parse_mode: Will be passed to :meth:`as_kwargs`.
        :return:
        captioncaption_entities)rJ   rK   rL   rR   r!   rL   s     r   as_caption_kwargszText.as_caption_kwargs   s#     ~~+1  
 	
r   c               ,    | j                  ddd|      S )at  
        Shortcut for :meth:`as_kwargs` for usage with
        method :class:`aiogram.methods.send_poll.SendPoll`.

        .. code-block:: python

            entities = Text(...)
            await message.answer_poll(**entities.as_poll_question_kwargs(), options=options)

        :param replace_parse_mode: Will be passed to :meth:`as_kwargs`.
        :return:
        questionquestion_entitiesquestion_parse_moderJ   rK   rM   rL   rV   rW   s     r   as_poll_question_kwargszText.as_poll_question_kwargs   s&     ~~,01	  
 	
r   c               ,    | j                  ddd|      S )a'  
        Shortcut for :meth:`as_kwargs` for usage with
        method :class:`aiogram.methods.send_poll.SendPoll`.

        .. code-block:: python

            question_entities = Text(...)
            explanation_entities = Text(...)
            await message.answer_poll(
                **question_entities.as_poll_question_kwargs(),
                options=options,
                **explanation_entities.as_poll_explanation_kwargs(),
            )

        :param replace_parse_mode: Will be passed to :meth:`as_kwargs`.
        :return:
        explanationexplanation_entitiesexplanation_parse_moder]   rV   rW   s     r   as_poll_explanation_kwargszText.as_poll_explanation_kwargs   s&    $ ~~"/31	  
 	
r   c               ,    | j                  ddd|      S )a{  
        Shortcut for :meth:`as_kwargs` for usage with
        method :class:`aiogram.methods.send_gift.SendGift`.

        .. code-block:: python

            entities = Text(...)
            await bot.send_gift(gift_id=gift_id, user_id=user_id, **entities.as_gift_text_kwargs())

        :param replace_parse_mode: Will be passed to :meth:`as_kwargs`.
        :return:
        r%   text_entitiestext_parse_moder]   rV   rW   s     r   as_gift_text_kwargszText.as_gift_text_kwargs   s&     ~~(,1	  
 	
r   c                T    | j                         \  }}t        j                  ||      S )z5
        Render elements tree as HTML markup
        )r?   r   unparser!   r%   r&   s      r   as_htmlzText.as_html   s&     h&&tX66r   c                T    | j                         \  }}t        j                  ||      S )z;
        Render elements tree as MarkdownV2 markup
        )r?   r   ri   rj   s      r   as_markdownzText.as_markdown   s&     h"**4::r   c                @     t        |       |i i | j                  |S r    )r   r   )r!   argskwargss      r   replacezText.replace   s'    tDz4>#=dll#=f#=>>r   c                   rdnd}|j                  fd| j                  D              }|j                  d | j                  j                         D              }g }|r|j	                  |       |r|j	                  |       |j                  |      }rt        j                  d|z   dz   d      }t        |       j                   d| dS )	Nz,
z, c              3  x   K   | ]1  }t        |t              r|j                         n
t        |       3 yw))indentN)r=   r   as_pretty_stringrepr).0r+   rt   s     r   	<genexpr>z(Text.as_pretty_string.<locals>.<genexpr>   s<      
 5?tT4JD!!!0PTUYPZZ
s   7:c              3  6   K   | ]  \  }}|	| d|  y w)N=rH   )rw   kvs      r   rx   z(Text.as_pretty_string.<locals>.<genexpr>   s"     Y41a1=QCq,Ys   

z    ())	joinr   r   itemsrA   textwraprt   r   __name__)r!   rt   sepr"   r#   ro   args_strs    `     r   ru   zText.as_pretty_string   s    e4xx 



 
 Y4<<3E3E3GYYKKKK88D>th'=vFHt*%%&az33r   c                `   t        |t              rR|j                  | j                  k(  r9| j                  |j                  k(  r  t        |       g | |i | j                  S t        |       t        u r0t        |t              r  t        |       g | |i | j                  S t        | |      S r    )r=   r   r   r   r>   )r!   others     r   __add__zText.__add__   s    eT"uzzTYY'>4<<SXS`S`C`4:<t<e<t||<<:*UC"84:;t;U;dll;;D%  r   c              #  8   K   | j                   E d {    y 7 wr    )r   )r!   s    r   __iter__zText.__iter__   s     ::s   c                B    | j                  d      \  }}t        |      S )NF)r6   )r?   r   )r!   r%   _s      r   __len__zText.__len__  s     +++6ad|r   c                X   t        |t              sd}t        |      |j                  |j                  dk(  r%|j                   | j
                  | j                   S |j                  dn|j                  }|j                  t        |       n|j                  }||k(  r| j                         S g }d}| j                  D ]Z  }t        |      }|}	||z  }||k  r|	|kD  r n;t        d||	z
  f      }
t        |||	z
  f      }||
| }|sJ|j                  |       \  | j
                  | S )NzCan only be slicedr   )r=   slice	TypeErrorstartstoprq   r   r   maxminrA   )r!   r+   msgr   r   nodespositionrD   	node_sizecurrent_positionabnew_nodes                r   __getitem__zText.__getitem__  s2   $&&CC. JJ$**/tyy7H4<<,,ZZ'TZZ II-s4y499D=<<>!JJ 	#DD	I'	!H%$&Q 0012AY'7 789AAayHLL"	# t||U##r   r"   NodeTyper#   r   returnNone)r%   r>   r&   list[MessageEntity]r   r   )r4   intr5   boolr6   r   r   ztuple[str, list[MessageEntity]])r*   r   r:   r   r   r   )
rJ   r>   rK   r>   rL   r   rM   r>   r   dict[str, Any])rL   r   r   r   )r   r>   )r!   r	   ro   r   rp   r   r   r	   )F)rt   r   r   r>   )r   r   r   r   )r   zIterator[NodeType])r   r   )r+   r   r   r   )r   
__module____qualname____doc__r   __annotations__	__slots__r$   classmethodr2   r?   rB   rR   rX   r^   rc   rg   rk   rm   rq   ru   r   r   r   r   rH   r   r   r   r      s)    "&D
%$I.. . 
	. 
 
 "&' ' 	'
  ' 
)'R[ &#'*  	
 !  
> ?C 
& EI 
( HL 
2 AE 
(7;?4&!$r   r   c                  <     e Zd ZdZej
                  Zd fdZ xZS )HashTaga   
    Hashtag element.

    .. warning::

        The value should always start with '#' symbol

    Will be wrapped into :obj:`aiogram.types.message_entity.MessageEntity`
    with type :obj:`aiogram.enums.message_entity_type.MessageEntityType.HASHTAG`
    c                    t        |      dk7  rd}t        |      t        |d   t              sd}t        |      |d   j	                  d      s	d|d   z   f}t        |   |i | y )N   z$Hashtag can contain only one elementr   zHashtag can contain only string#r   
ValueErrorr=   r>   
startswithsuperr$   r!   r"   r#   r   	__class__s       r   r$   zHashTag.__init__3  n    t9>8CS/!$q'3'3CS/!Aw!!#&$q'M#D$)&)r   r   )	r   r   r   r   r
   HASHTAGr   r$   __classcell__r   s   @r   r   r   %      	 $$D	* 	*r   r   c                  <     e Zd ZdZej
                  Zd fdZ xZS )CashTaga   
    Cashtag element.

    .. warning::

        The value should always start with '$' symbol

    Will be wrapped into :obj:`aiogram.types.message_entity.MessageEntity`
    with type :obj:`aiogram.enums.message_entity_type.MessageEntityType.CASHTAG`
    c                    t        |      dk7  rd}t        |      t        |d   t              sd}t        |      |d   j	                  d      s	d|d   z   f}t        |   |i | y )Nr   z$Cashtag can contain only one elementr   zCashtag can contain only string$r   r   s       r   r$   zCashTag.__init__M  r   r   r   )	r   r   r   r   r
   CASHTAGr   r$   r   r   s   @r   r   r   ?  r   r   r   c                  (    e Zd ZdZej
                  Zy)
BotCommanda  
    Bot command element.

    .. warning::

        The value should always start with '/' symbol

    Will be wrapped into :obj:`aiogram.types.message_entity.MessageEntity`
    with type :obj:`aiogram.enums.message_entity_type.MessageEntityType.BOT_COMMAND`
    N)r   r   r   r   r
   BOT_COMMANDr   rH   r   r   r   r   Y  s    	 ((Dr   r   c                  (    e Zd ZdZej
                  Zy)Urlz
    Url element.

    Will be wrapped into :obj:`aiogram.types.message_entity.MessageEntity`
    with type :obj:`aiogram.enums.message_entity_type.MessageEntityType.URL`
    N)r   r   r   r   r
   URLr   rH   r   r   r   r   h  s       Dr   r   c                  (    e Zd ZdZej
                  Zy)Emailz
    Email element.

    Will be wrapped into :obj:`aiogram.types.message_entity.MessageEntity`
    with type :obj:`aiogram.enums.message_entity_type.MessageEntityType.EMAIL`
    N)r   r   r   r   r
   EMAILr   rH   r   r   r   r   s  s     ""Dr   r   c                  (    e Zd ZdZej
                  Zy)PhoneNumberz
    Phone number element.

    Will be wrapped into :obj:`aiogram.types.message_entity.MessageEntity`
    with type :obj:`aiogram.enums.message_entity_type.MessageEntityType.PHONE_NUMBER`
    N)r   r   r   r   r
   PHONE_NUMBERr   rH   r   r   r   r   ~  s     ))Dr   r   c                  (    e Zd ZdZej
                  Zy)Boldz
    Bold element.

    Will be wrapped into :obj:`aiogram.types.message_entity.MessageEntity`
    with type :obj:`aiogram.enums.message_entity_type.MessageEntityType.BOLD`
    N)r   r   r   r   r
   BOLDr   rH   r   r   r   r          !!Dr   r   c                  (    e Zd ZdZej
                  Zy)Italicz
    Italic element.

    Will be wrapped into :obj:`aiogram.types.message_entity.MessageEntity`
    with type :obj:`aiogram.enums.message_entity_type.MessageEntityType.ITALIC`
    N)r   r   r   r   r
   ITALICr   rH   r   r   r   r     s     ##Dr   r   c                  (    e Zd ZdZej
                  Zy)	Underlinez
    Underline element.

    Will be wrapped into :obj:`aiogram.types.message_entity.MessageEntity`
    with type :obj:`aiogram.enums.message_entity_type.MessageEntityType.UNDERLINE`
    N)r   r   r   r   r
   	UNDERLINEr   rH   r   r   r   r     s     &&Dr   r   c                  (    e Zd ZdZej
                  Zy)Strikethroughz
    Strikethrough element.

    Will be wrapped into :obj:`aiogram.types.message_entity.MessageEntity`
    with type :obj:`aiogram.enums.message_entity_type.MessageEntityType.STRIKETHROUGH`
    N)r   r   r   r   r
   STRIKETHROUGHr   rH   r   r   r   r     s     **Dr   r   c                  (    e Zd ZdZej
                  Zy)Spoilerz
    Spoiler element.

    Will be wrapped into :obj:`aiogram.types.message_entity.MessageEntity`
    with type :obj:`aiogram.enums.message_entity_type.MessageEntityType.SPOILER`
    N)r   r   r   r   r
   SPOILERr   rH   r   r   r   r     s     $$Dr   r   c                  (    e Zd ZdZej
                  Zy)Codez
    Code element.

    Will be wrapped into :obj:`aiogram.types.message_entity.MessageEntity`
    with type :obj:`aiogram.enums.message_entity_type.MessageEntityType.CODE`
    N)r   r   r   r   r
   CODEr   rH   r   r   r   r     r   r   r   c                  B     e Zd ZdZej
                  Zddd fdZ xZS )Prez
    Pre element.

    Will be wrapped into :obj:`aiogram.types.message_entity.MessageEntity`
    with type :obj:`aiogram.enums.message_entity_type.MessageEntityType.PRE`
    N)languagec               (    t        |   |d|i| y )Nr   r   r$   )r!   r   r"   r#   r   s       r   r$   zPre.__init__  s    $<<V<r   )r"   r   r   z
str | Noner#   r   r   r   )	r   r   r   r   r
   PREr   r$   r   r   s   @r   r   r     s"       D?C = =r   r   c                  <     e Zd ZdZej
                  Zd fdZ xZS )TextLinkz
    Text link element.

    Will be wrapped into :obj:`aiogram.types.message_entity.MessageEntity`
    with type :obj:`aiogram.enums.message_entity_type.MessageEntityType.TEXT_LINK`
    c               (    t        |   |d|i| y )Nurlr   )r!   r   r"   r#   r   s       r   r$   zTextLink.__init__  s    $2C262r   )r"   r   r   r>   r#   r   r   r   )	r   r   r   r   r
   	TEXT_LINKr   r$   r   r   s   @r   r   r     s     &&D3 3r   r   c                  <     e Zd ZdZej
                  Zd fdZ xZS )TextMentionz
    Text mention element.

    Will be wrapped into :obj:`aiogram.types.message_entity.MessageEntity`
    with type :obj:`aiogram.enums.message_entity_type.MessageEntityType.TEXT_MENTION`
    c               (    t        |   |d|i| y )Nuserr   )r!   r   r"   r#   r   s       r   r$   zTextMention.__init__  s    $4T4V4r   )r"   r   r   r   r#   r   r   r   )	r   r   r   r   r
   TEXT_MENTIONr   r$   r   r   s   @r   r   r     s     ))D5 5r   r   c                  <     e Zd ZdZej
                  Zd fdZ xZS )CustomEmojiz
    Custom emoji element.

    Will be wrapped into :obj:`aiogram.types.message_entity.MessageEntity`
    with type :obj:`aiogram.enums.message_entity_type.MessageEntityType.CUSTOM_EMOJI`
    c               (    t        |   |d|i| y )Ncustom_emoji_idr   )r!   r   r"   r#   r   s       r   r$   zCustomEmoji.__init__  s    $JJ6Jr   )r"   r   r   r>   r#   r   r   r   )	r   r   r   r   r
   CUSTOM_EMOJIr   r$   r   r   s   @r   r   r     s!     ))DK Kr   r   c                  (    e Zd ZdZej
                  Zy)
BlockQuotez
    Block quote element.

    Will be wrapped into :obj:`aiogram.types.message_entity.MessageEntity`
    with type :obj:`aiogram.enums.message_entity_type.MessageEntityType.BLOCKQUOTE`
    N)r   r   r   r   r
   
BLOCKQUOTEr   rH   r   r   r   r     s     ''Dr   r   c                  (    e Zd ZdZej
                  Zy)ExpandableBlockQuotez
    Expandable block quote element.

    Will be wrapped into :obj:`aiogram.types.message_entity.MessageEntity`
    with type :obj:`aiogram.enums.message_entity_type.MessageEntityType.EXPANDABLE_BLOCKQUOTE`
    N)r   r   r   r   r
   EXPANDABLE_BLOCKQUOTEr   rH   r   r   r   r     s     22Dr   r   zdict[str | None, type[Text]]
NODE_TYPESc                    t         j                  | j                  t              } ||i | j	                  h dd      S )zW
    Apply single entity to text

    :param entity:
    :param text:
    :return:
    >   r   r:   r*   F)excludewarnings)r   getr   r   
model_dump)r<   r   	node_types      r   _apply_entityr  0  sA     v{{D1I	


$@5

Q r   c           
   #    K   d|xs t        |       }t        |      D ]  \  }}|j                  dz  k  r|j                  dz  kD  rt        | |j                  dz          |j                  dz  }|j                  dz  |j                  dz  z   t        t        fd||dz   d              }t        |gt        | ||         |k  rt        | |        y y w)Nr   r   c                0    | j                   dz  xs dk  S )Nr   r   r)   )er*   s    r   r,   z#_unparse_entities.<locals>.<lambda>Q  s    QXX\V[q-I r   r   r9   )	r   	enumerater*   r   r:   listfilterr  r/   )r%   r&   r*   r:   indexr<   r   sub_entitiess     `     r   r/   r/   ?  s     ~ s4yF"8, 
v==1v%==1v%#D&--!2C$DEE!"V]]Q%66F#I8TY\]T]T_K`ab
t\%O
 	

 VF 344 s   C'C*r}   r8   )endr   c                    |r=g }|dd D ]  }|j                  ||g        |j                  |d   | g       t        | S g || }t        | S )z
    Wrap multiple nodes into line with :code:`\\n` at the end of line.

    :param items: Text or Any
    :param end: ending of the line, by default is :code:`\\n`
    :param sep: separator between items, by default is empty string
    :return: Text
    N)r@   r   )r  r   r   r   r+   s        r   as_liner  [  sk     #2J 	&DLL$%	&eBi%& < %<r   )r   c                x    g }|dd D ]  }|j                  || g        |j                  |d          t        | S )z^
    Wrap each element to separated lines

    :param items:
    :param sep:
    :return:
    Nr  )r@   rA   r   )r   r   r   r+   s       r   as_listr  n  sH     Ecr
 "dC[!"	LLr<r   z- )markerc                &     t         fd|D         S )z~
    Wrap elements as marked list

    :param items:
    :param marker: line marker, by default is '- '
    :return: Text
    c              3  6   K   | ]  }t        |        y wr    r   )rw   r+   r  s     r   rx   z!as_marked_list.<locals>.<genexpr>  s     :DT&$':s   )r  )r  r   s   ` r   as_marked_listr  }  s     :E:;;r   r   z{}. r   fmtc                :    t        fdt        ||       D         S )z
    Wrap elements as numbered list

    :param items:
    :param start: initial number, by default 1
    :param fmt: number format, by default '{}. '
    :return: Text
    c              3  Z   K   | ]"  \  }}t        j                  |      |       $ y wr    )r   format)rw   r	  r+   r  s      r   rx   z#as_numbered_list.<locals>.<genexpr>  s%     ^{udT#**U+T2^s   (+)r  r  )r   r  r   s    ` r   as_numbered_listr    s     ^iPUW\F]^__r   c                    t        | dg| S )z{
    Wrap elements as simple section, section has title and body

    :param title:
    :param body:
    :return: Text
    r}   r  )titler"   s     r   
as_sectionr    s     t#d##r   c               ,    t        | t        |d|i      S )zw
    Wrap elements as section with marked list

    :param title:
    :param body:
    :param marker:
    :return:
    r  )r  r  )r  r  r"   s      r   as_marked_sectionr     s     e^TA&ABBr   c          	     .    t        | t        |||d      S )z
    Wrap elements as section with numbered list

    :param title:
    :param body:
    :param start:
    :param fmt:
    :return:
    r  )r  r  )r  r   r  r"   s       r   as_numbered_sectionr"    s     e-t5cJKKr   c                0    t        t        | d      d|      S )z
    Wrap elements pair as key-value line. (:code:`<b>{key}:</b> {value}`)

    :param key:
    :param value:
    :return: Text
    : )r   r   )r.   r   s     r   as_key_valuer&    s     S#U++r   )r   r>   r   r   )r<   r   r   r   r   r   )NN)
r%   bytesr&   r   r*   
int | Noner:   r(  r   zGenerator[NodeType, None, None])r   r   r  r>   r   r>   r   r   )r   r   r   r>   r   r   )r   r   r  r>   r   r   )r   r   r   r   r  r>   r   r   )r  r   r"   r   r   r   )r  r   r"   r   r  r>   r   r   )
r  r   r"   r   r   r   r  r>   r   r   )r.   r   r   r   r   r   )8
__future__r   r   collections.abcr   r   r   typingr   r   typing_extensionsr	   aiogram.enumsr
   aiogram.typesr   r   aiogram.utils.text_decorationsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r/   r  r  r  r  r  r   r"  r&  rH   r   r   <module>r0     sK   "  9 9   " + -  /I$8H I$X*d *4*d *4) )!$ !#D #*$ *"4 "$T $' '+D +%d %"4 "=$ =3t 35$ 5K$ K( (34 3,IIt,LL', LL', OOZ	,
 HHc, 
JJ, k, 	IIt, KK, NNI, , LL', 	IIt, HHc, MM8,  k!," k#,$ OOZ3',
( .$ 	5
5!5 5 	5
 %58 *." & *.  48 < 56& 	`$ CCC C 
	C& 	LLL L 
	L
 
L$,r   