
    Pi]c                       d Z ddlmZ ddlZddlZddlmZ ddlmZm	Z	 ddl
mZ ddlmZmZ ddlmZ erdd	lmZmZ dd
lmZ  ej        d          ZdEdZdEdZdFdZ G d de          Z G d de          Z G d d          Z	 	 	 	 	 dGdHd&Z ej        d'          Z dEd(Z!dIdJd.Z"dKd0Z#	 	 	 	 	 	 	 	 dLdMd;Z$dd1ddddd*d<dNd@Z%dOdDZ&dS )Pz
babel.messages.pofile
~~~~~~~~~~~~~~~~~~~~~

Reading and writing of files in the ``gettext`` PO (portable object)
format.

:copyright: (c) 2013-2026 by the Babel Team.
:license: BSD, see LICENSE for more details.
    )annotationsN)Iterable)TYPE_CHECKINGLiteral)Locale)CatalogMessage)TextWrapper)IOAnyStr)SupportsWritez\\([\\trn"])stringstrreturnc                j    d }d| vr
| dd         S t                               || dd                   S )zReverse `escape` the given string.

    >>> print(unescape('"Say:\\n  \\"hello, world!\\"\\n"'))
    Say:
      "hello, world!"
    <BLANKLINE>

    :param string: the string to unescape
    c                `    |                      d          }|dk    rdS |dk    rdS |dk    rdS |S )N   n
t	r)group)matchms     i/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/babel/messages/pofile.pyreplace_escapesz!unescape.<locals>.replace_escapes+   s@    KKNN884#XX4#XX4    \r   )_unescape_resub)r   r   s     r   unescaper$       sJ    	 	 	 6ad|OVAbD\:::r   c                    d| v r[|                                  }|                     d          r
|dd         }d                    t          t          |                    S t	          |           S )a  Reverse the normalization done by the `normalize` function.

    >>> print(denormalize(r'''""
    ... "Say:\n"
    ... "  \"hello, world!\"\n"'''))
    Say:
      "hello, world!"
    <BLANKLINE>

    >>> print(denormalize(r'''""
    ... "Say:\n"
    ... "  \"Lorem ipsum dolor sit "
    ... "amet, consectetur adipisicing"
    ... " elit, \"\n"'''))
    Say:
      "Lorem ipsum dolor sit amet, consectetur adipisicing elit, "
    <BLANKLINE>

    :param string: the string to denormalize
    r   ""r   N )
splitlines
startswithjoinmapr$   )r   escaped_liness     r   denormalizer-   ;   sl    * v~~))++T"" 	.)!""-Mwws8]33444r   line	list[str]c                   d| vr*d| vr&|                                                                  S g }d}d}| D ]c}|dk    r|rt          d          d}|dk    r|st          d          d}6|dk    r"|r||z  }D|r|                    |           d}^||z  }d|r&|rt          d          |                    |           |S )	zExtract locations from location comments.

    Locations are extracted while properly handling First Strong
    Isolate (U+2068) and Pop Directional Isolate (U+2069), used by
    gettext to enclose filenames with spaces and tabs in their names.
       ⁨   ⁩r'   Fzglocation comment contains more First Strong Isolate characters, than Pop Directional Isolate charactersTzglocation comment contains more Pop Directional Isolate characters, than First Strong Isolate characters )lstripsplit
ValueErrorappend)r.   	locationslocationin_filenamecs        r   _extract_locationsr<   Y   sD    t 4 4{{}}""$$$IHK  '  '==  J   K(]]  G    K#XX A   ***MHH 	'  J   X&&&r   c                  $     e Zd ZdZd fdZ xZS )PoFileErrorzDException thrown by PoParser when an invalid po file is encountered.messager   catalogr   r.   linenointr   Nonec                ~    t                                          | d|            || _        || _        || _        d S )Nz on )super__init__r@   r.   rA   )selfr?   r@   r.   rA   	__class__s        r   rF   zPoFileError.__init__   sB    G1111222	r   )
r?   r   r@   r   r.   r   rA   rB   r   rC   )__name__
__module____qualname____doc__rF   __classcell__rH   s   @r   r>   r>      sC        NN         r   r>   c                  (     e Zd Zd fdZddZ xZS )	_NormalizedStringargsr   r   rC   c                z    t                                          t          t          j        |                     d S N)rE   rF   r+   r   strip)rG   rQ   rH   s     r   rF   z_NormalizedString.__init__   s-    SY--.....r   c                Z    | sdS d                     t          t          |                     S )Nr'   )r*   r+   r$   rG   s    r   r-   z_NormalizedString.denormalize   s+     	2wws8T**+++r   )rQ   r   r   rC   )r   r   )rI   rJ   rK   rF   r-   rM   rN   s   @r   rP   rP      sQ        / / / / / /, , , , , , , ,r   rP   c                  l    e Zd ZdZ	 	 ddd
ZddZddZddZdddZdddZ	ddZ
ddZddZddZdS )PoFileParserzSupport class to  read messages from a ``gettext`` PO (portable object) file
    and add them to a `Catalog`

    See `read_po` for simple cases.
    Fr@   r   ignore_obsoleteboolabort_invalidr   rC   c                t    || _         || _        d| _        d| _        || _        |                                  d S )Nr   )r@   rY   counteroffsetr[   _reset_message_state)rG   r@   rY   r[   s       r   rF   zPoFileParser.__init__   sA     .*!!#####r   c                    g | _         g | _        g | _        g | _        g | _        g | _        d | _        d| _        d| _        d| _	        d| _
        d S )NF)messagestranslationsr8   flagsuser_commentsauto_commentscontextobsoletein_msgid	in_msgstr
in_msgctxtrV   s    r   r_   z!PoFileParser._reset_message_state   sV    
r   c           
        t          | j                  dk    rt          d | j        D                       }d t          | j        j                  D             }t          | j                  D ]I\  }}|| j        j        k    r|                     d| j	        d           2|
                                ||<   Jt          |          }nD| j        d         
                                }| j        d         d         
                                }| j        r| j        
                                nd}t          ||| j        | j        | j        | j        | j	        dz   |          }| j        r0| j        s(|| j        j        | j                            ||          <   n
|| j        |<   | xj        dz  c_        |                                  dS )	z
        Add a message to the catalog based on the current parser state and
        clear the state ready to process the next message.
        r   c              3  >   K   | ]}|                                 V  d S rS   )r-   ).0r   s     r   	<genexpr>z,PoFileParser._add_message.<locals>.<genexpr>   s*      AAa!--//AAAAAAr   c                    g | ]}d S r'    )rm   _s     r   
<listcomp>z-PoFileParser._add_message.<locals>.<listcomp>   s    BBBQbBBBr   r'   z5msg has more translations than num_plurals of catalogr   N)rA   rf   )lenra   tupleranger@   num_pluralssortedrb   _invalid_pofiler^   r-   rf   r	   r8   rc   re   rd   rg   rY   _key_forr]   r_   )rG   msgidr   idxtranslationmsgctxtr?   s          r   _add_messagezPoFileParser._add_message   s   
 t}!!AA4=AAAAAEBB%(@"A"ABBBF$*4+<$=$= 8 8 [$,222((O  
 )5577s6]]FFM!$0022E&q)!,88::F04F$,**,,,$NJ;?	
 	
 	
 = 	*' WOV%dl&;&;E7&K&KL")DL!!#####r   c                   | j         r| j        se|                     d| j        d| j         d                                          d           | j                            dt                      g           |                                  d S d S )Nr'   zmissing msgstr for msgid 'r   ')ra   rb   ry   r^   r-   r7   rP   r   rV   s    r   _finish_current_messagez$PoFileParser._finish_current_message   s    = 	 $ C$$KRq1A1M1M1O1ORRR  
 !((!->-@-@)ABBB	  	 r   c                    |sd S |d         dk    r|                      ||           d S |                     |||           d S )Nr   ")!_process_string_continuation_line_process_keyword_line)rG   rA   r.   rg   s       r   _process_message_linez"PoFileParser._process_message_line   sV     	F7c>>224@@@@@&&vtX>>>>>r   c                   |                     d          \  }}}|dv r|                                  || _        |dk    r|| _        |dv r7d| _        d| _        | j                            t          |                     d S |dk    rd| _        t          |          | _	        d S |dk    s|
                    d	          rd| _        d| _        |                     d
          \  }}}	|rt          |	d d                   nd}
|dk    rt          |          nt                      }| j                            |
|g           d S |                     ||d           d S )Nr3   )r{   r~   r{   )r{   msgid_pluralFTr~   msgstrmsgstr[[r!   r   r&   zUnknown or misformatted keyword)	partitionr   rg   r^   rj   rh   ra   r7   rP   rf   r)   ri   rB   rb   ry   )rG   rA   r.   rg   keywordrr   argkwarghas_bracketidxargr|   ss               r   r   z"PoFileParser._process_keyword_line   s|   ..--C***((***  g DK///#DO DMM  !23!7!7888Fi"DO,S11DLFh'"4"4Y"?"?!DM!DN)0):):3)?)?&E;&18#fSbSk"""qC*-++!#&&&;L;N;NA$$c1X...FT6+LMMMMMr   c                   | j         r| j        d         }nC| j        r| j        d         d         }n(| j        r| j        }n|                     ||d           d S |                    |                                           d S )Nr!   r   z<Got line starting with " but not in msgid, msgstr or msgctxt)	rh   ra   ri   rb   rj   rf   ry   r7   rT   )rG   r.   rA   r   s       r   r   z.PoFileParser._process_string_continuation_line  s    = 	b!AA^ 
	!"%a(AA_ 	AA  O  
 F	r   c                   |                                   |d d         }|dk    rt          |dd                    D ]t}|                    d          \  }}}|r;	 | j                            |t          |          f           H# t          $ r Y Tw xY w| j                            |d f           ud S |dk    rS| j                            d |dd          	                                
                    d          D                        d S |dk    r:|dd                                          }|r| j                            |           d S | j                            |dd                                                     d S )	N   z#::z#,c              3  >   K   | ]}|                                 V  d S rS   )rT   )rm   flags     r   rn   z0PoFileParser._process_comment.<locals>.<genexpr>@  s*      TTtdjjllTTTTTTr   ,z#.r   )r   r<   
rpartitionr8   r7   rB   r6   rc   extendr4   r5   rT   re   rd   )rG   r.   prefixr9   acolonbcomments           r   _process_commentzPoFileParser._process_comment/  s   $$&&&bqbT>>.tABBx88 < <&11#665! <!--q#a&&k::::% ! ! ! ! N))8T*:;;;;FT>>JTTtABBx7H7H7N7Ns7S7STTTTTTFT>>122hnn&&G 3"))'222F 	!!$qrr(.."2"233333s   )B
BBfileobjIO[AnyStr] | Iterable[AnyStr]c           	     n   d}t          |          D ]\  }}|                                }|t          |t                     }|s5|r|                    | j        j                  }|d         dk    r|dd         dk    r3|                     ||dd                                         d           	 | 	                    |           # t          $ r.}|                     ||t          |                     Y d}~d}~ww xY w|                     ||           |                                  | j        sy| j        s| j        s| j        rf| j                            t'                                 | j                            dt'                      g           |                                  dS dS dS )aV  
        Reads from the file-like object (or iterable of string-likes) `fileobj`
        and adds any po file units found in it to the `Catalog`
        supplied to the constructor.

        All of the items in the iterable must be the same type; either `str`
        or `bytes` (decoded with the catalog charset), but not a mixture.
        Nr   #r   z#~T)rg   )	enumeraterT   
isinstancer   decoder@   charsetr   r4   r   r6   ry   r   r]   rc   rd   re   ra   r7   rP   rb   r   )rG   r   needs_decoderA   r.   excs         r   parsezPoFileParser.parseM  s    %g.. 	9 	9LFD::<<D# $.dC#8#88  9{{4<#788Aw#~~8t##..vtABBx7H7HSW.XXXXE--d3333% E E E,,T63s88DDDDDDDDE **648888$$&&& | 	  	 t/A 	 TEW 	 M  !2!4!4555$$a):)<)<%=>>>	  	  	  	 s   6C
D$C??Dc                    t          |t                    sJ | j        rt          || j        ||          t          d|           t          d|dz    d|           d S )NzWARNING:zWARNING: Problem on line r   z: )r   r   r[   r>   r@   print)rG   r.   rA   msgs       r   ry   zPoFileParser._invalid_pofilev  sr    $$$$$$ 	?c4<v>>>j#@&1*@@@@AAAAAr   N)FF)r@   r   rY   rZ   r[   rZ   r   rC   )r   rC   )F)r   r   r   rC   )rI   rJ   rK   rL   rF   r_   r   r   r   r   r   r   r   ry   rq   r   r   rX   rX      s         !&#	$ $ $ $ $       &$ &$ &$ &$P	  	  	  	 ? ? ? ? ?!N !N !N !N !NF   "4 4 4 4<'  '  '  ' RB B B B B Br   rX   Fr   r   localeLocale | str | Nonedomain
str | NonerY   rZ   r   r[   r   c                x    t          |||          }t          |||          }|                    |            |S )a  Read messages from a ``gettext`` PO (portable object) file from the given
    file-like object (or an iterable of lines) and return a `Catalog`.

    >>> from datetime import datetime
    >>> from io import StringIO
    >>> buf = StringIO('''
    ... #: main.py:1
    ... #, fuzzy, python-format
    ... msgid "foo %(name)s"
    ... msgstr "quux %(name)s"
    ...
    ... # A user comment
    ... #. An auto comment
    ... #: main.py:3
    ... msgid "bar"
    ... msgid_plural "baz"
    ... msgstr[0] "bar"
    ... msgstr[1] "baaz"
    ... ''')
    >>> catalog = read_po(buf)
    >>> catalog.revision_date = datetime(2007, 4, 1)

    >>> for message in catalog:
    ...     if message.id:
    ...         print((message.id, message.string))
    ...         print(' ', (message.locations, sorted(list(message.flags))))
    ...         print(' ', (message.user_comments, message.auto_comments))
    ('foo %(name)s', 'quux %(name)s')
      ([('main.py', 1)], ['fuzzy', 'python-format'])
      ([], [])
    (('bar', 'baz'), ('bar', 'baaz'))
      ([('main.py', 3)], [])
      (['A user comment'], ['An auto comment'])

    .. versionadded:: 1.0
       Added support for explicit charset argument.

    :param fileobj: the file-like object (or iterable of lines) to read the PO file from
    :param locale: the locale identifier or `Locale` object, or `None`
                   if the catalog is not bound to a locale (which basically
                   means it's a template)
    :param domain: the message domain
    :param ignore_obsolete: whether to ignore obsolete messages in the input
    :param charset: the character set of the catalog.
    :param abort_invalid: abort read if po file is invalid
    )r   r   r   )r[   )r   rX   r   )r   r   r   rY   r   r[   r@   parsers           r   read_por   ~  sD    l VFGDDDG'?-PPPF
LLNr   zL(\s+|[^\s\w]*\w+[a-zA-Z]-(?=\w+[a-zA-Z])|(?<=[\w\!\"\'\&\.\,\?])-{2,}(?=\w))c                    d|                      dd                               dd                               dd                               dd	                               d
d          z  S )zEscape the given string so that it can be included in double-quoted
    strings in ``PO`` files.

    >>> escape('''Say:
    ...   "hello, world!"
    ... ''')
    '"Say:\\n  \\"hello, world!\\"\\n"'

    :param string: the string to escape
    z"%s"r    z\\r   z\tr   z\rr   z\nr   z\")replace)r   s    r   escaper     sf     FNN40088uEEMM  gdE773../ /r   r'   L   r   widthrB   c                   |rW|dk    rPt                    }g }|                     d          D ]'}t          t          |                    |z   |k    rt                              |          }|                                 |rg }d}|rt          t          |d                             dz
  |z   }	||	z   |k     r-|                    |                                           ||	z  }n*|s'|                    |                                           n||                    d                    |                     ||                    |           )n|                     d          }t          |          dk    rt          |           S |r|d         s|d= |dxx         dz  cc<   dd                    fd	|D                       z   S )
a  Convert a string into a format that is appropriate for .po files.

    >>> print(normalize('''Say:
    ...   "hello, world!"
    ... ''', width=None))
    ""
    "Say:\n"
    "  \"hello, world!\"\n"

    >>> print(normalize('''Say:
    ...   "Lorem ipsum dolor sit amet, consectetur adipisicing elit, "
    ... ''', width=32))
    ""
    "Say:\n"
    "  \"Lorem ipsum dolor sit "
    "amet, consectetur adipisicing"
    " elit, \"\n"

    :param string: the string to normalize
    :param prefix: a string that should be prepended to every line
    :param width: the maximum line width; use `None`, 0, or a negative number
                  to completely disable line wrapping
    r   Tr   r!   r'   r   r   z""
c                4    g | ]}t          |          z   S rq   )r   )rm   r.   r   s     r   rs   znormalize.<locals>.<listcomp>  s$    III4 5IIIr   )	rt   r(   r   WORD_SEPr5   reverser7   popr*   )
r   r   r   	prefixlenlinesr.   chunksbufsizelengths
    `        r   	normalizer     s   0  (KK	%%d++ 	# 	#D6$<<  9,u44!--    /CD  
"!$VF2J%7%7!8!81!<y!H&=500JJvzz||444 FNDD#& 9 !$

6::<< 8 8 8! ! 
" LL...  /  T"""")	#, !!$''
5zzQf~~  U2Y "Ib			T			DIIIIII5IIIJJJJr   filenamec                    d| vrd| vr| S |                      d          sd| z   } |                     d          s| dz  } | S )zEnclose filenames which include white spaces or tabs.

    Do the same as gettext and enclose filenames which contain white
    spaces or tabs with First Strong Isolate (U+2068) and Pop
    Directional Isolate (U+2069).
    r3   r   r1   r2   )r)   endswith)r   s    r   _enclose_filename_if_necessaryr     sc     (t833x(( 'h&X&& HOr   TSupportsWrite[bytes]r@   no_locationomit_headersort_outputsort_by_fileinclude_previousinclude_linenorC   c
           
         d}
|rd}
n|rd}
t          |||	||||
|          D ]G}t          |t                    r|                    |j        d          }|                     |           HdS )a  Write a ``gettext`` PO (portable object) template file for a given
    message catalog to the provided file-like object.

    >>> catalog = Catalog()
    >>> catalog.add('foo %(name)s', locations=[('main.py', 1)],
    ...             flags=('fuzzy',))
    <Message...>
    >>> catalog.add(('bar', 'baz'), locations=[('main.py', 3)])
    <Message...>
    >>> from io import BytesIO
    >>> buf = BytesIO()
    >>> write_po(buf, catalog, omit_header=True)
    >>> print(buf.getvalue().decode("utf8"))
    #: main.py:1
    #, fuzzy, python-format
    msgid "foo %(name)s"
    msgstr ""
    <BLANKLINE>
    #: main.py:3
    msgid "bar"
    msgid_plural "baz"
    msgstr[0] ""
    msgstr[1] ""
    <BLANKLINE>
    <BLANKLINE>

    :param fileobj: the file-like object to write to
    :param catalog: the `Catalog` instance
    :param width: the maximum line width for the generated output; use `None`,
                  0, or a negative number to completely disable line wrapping
    :param no_location: do not emit a location comment for every message
    :param omit_header: do not include the ``msgid ""`` entry at the top of the
                        output
    :param sort_output: whether to sort the messages in the output by msgid
    :param sort_by_file: whether to sort the messages in the output by their
                         locations
    :param ignore_obsolete: whether to ignore obsolete messages and not include
                            them in the output; by default they are included as
                            comments
    :param include_previous: include the old msgid as a comment when
                             updating the catalog
    :param include_lineno: include line number in the location comment
    Nr?   r9   rY   r   r   r   r   sort_byr   backslashreplace)generate_por   r   encoder   write)r   r@   r   r   r   r   r   rY   r   r   r   r.   s               r   write_por   "  s    p G 	 '%)	 	 	   dC   	D;;w0BCCDd r   r   r   %Literal['message', 'location'] | NoneIterable[str]c             #     K   rdk    rnd}t          |d          t          dd          }	dfd	}
d fd		}t           |
          D ]&}|j        s_|r j        }rLdk    rFg }|                                D ]}||	                    |          z  }d                    |          }| dV  |j        D ]} |
|          E d{V  |j        D ]} |
|d          E d{V  |sg }	 t          |j
        d           }n# t          $ r
 |j
        }Y nw xY w|D ]Y\  }}|                    t          j        d          }t          |          }|r
|r| d|d}||vr|                    |           Z |
d                    |          d          E d{V  |j        r0dd                    dgt          |j                             dV  |j        r||rz |
dt'          |j        d                    d          E d{V  t)          |j                  dk    r2t'          |j        d                   } |
d| d          E d{V   ||          E d{V  dV  (|s]t           j                                        |
          D ]6}|j        D ]} |
|          E d{V   ||d          E d{V  dV  5dS dS )zYield text strings representing a ``gettext`` PO (portable object) file.

    See `write_po()` for a more detailed description.
    r   r   F)r   break_long_wordsz# )r   subsequent_indentr   r'   c              3  v   K                        |           D ]}d| d|                                 dV   d S )Nr   r3   r   )wraprT   )r   r   r.   comment_wrappers      r   _format_commentz$generate_po.<locals>._format_comment  sX      #((11 	0 	0D/f//tzz||///////	0 	0r   c           
   3    K   t          | j        t          t          f          r| j        r| dt          | j        |           dV  | dt          | j        d         |           dV  | dt          | j        d         |           dV  t          j                  D ]A}	 | j        |         }n# t          $ r d}Y nw xY w| d	|d
dt          ||           dV  Bd S | j        r| dt          | j        |           dV  | dt          | j        |           dV  | dt          | j        pd|           dV  d S )Nzmsgctxt )r   r   r   msgid r   msgid_plural r   r'   r   dz] zmsgstr )
r   idlistru   rf   r   rv   rw   r   
IndexError)r?   r   r|   r   r@   r   s       r   _format_messagez$generate_po.<locals>._format_message  s     gj4-00 	d dcc7?6Y^)_)_)_cccccc[[9WZ]6QV#W#W#W[[[[[[bb)GJqM&X]*^*^*^bbbbbbW011 c c $^C0FF!      FFF bbbbb6&X]1^1^1^bbbbbbbc c  dcc7?6Y^)_)_)_ccccccXX9WZe#T#T#TXXXXXXccIgn.B6Y^$_$_$_ccccccccs   ,B::C	C	)r   r   N.)r   c                \    | d         t          | d         t                    r| d         pdfS )Nr   r   r!   )r   rB   )xs    r   <lambda>zgenerate_po.<locals>.<lambda>  s+    1Q4AaD#)>)>)G1Q4)M2"N r   key/r   r   r3   r   z, r   )r   |r   r   z#~ rp   )r
   _sort_messagesr   header_commentr(   r   r*   rd   re   rx   r8   	TypeErrorr   ossepr   r7   rc   previous_idr   rt   rg   values)r@   rY   r   r   r   r   r   r   comment_widthheader_wrapperr   r   r?   comment_headerr   r.   r   locsr8   r   rA   r9   norm_previous_idr   s   `      `               @r   r   r   o  s     " #8uqyyEEbM!NNNO uW\]]]N0 0 0 0 0 0d d d d d d d& "'7;;; 5 5z 		( $3N 2*5577 7 7D^00666EE!%5!1!1#'''''', 	0 	0G&w//////////, 	< 	<G&ws;;;;;;;;;;; 	CD."%NN  		  . . .#-			. %. * * &#++BFC889(CC 8n 8"*77V777H4''KK)))&sxx~~cBBBBBBBBBB= 	BAdii <fW]&;&; <==AAAAAA 	[#3 	[&I7#6q#9GGGII          7&''!++#,W-@-C5#Q#Q#Q *?+M;K+M+MVYZZZZZZZZZZ"?7+++++++++



 %##%%
 
 
 	 	G #0 4 4*?73333333333&wu==========JJJJ 	 	s   9DD%$D%ra   Iterable[Message]list[Message]c                    t          |           } |dk    r|                                  n|dk    r|                     d            | S )z
    Sort the given message iterable by the given criteria.

    Always returns a list.

    :param messages: An iterable of Messages.
    :param sort_by: Sort by which criteria? Options are `message` and `location`.
    :return: list[Message]
    r?   r9   c                    | j         S rS   )r8   )r   s    r   r   z _sort_messages.<locals>.<lambda>  s    AK r   r   )r   sort)ra   r   s     r   r   r     sQ     H~~H)	J		//000Or   )r   r   r   r   )r.   r   r   r/   )NNFNF)r   r   r   r   r   r   rY   rZ   r   r   r[   rZ   r   r   )r'   r   )r   r   r   r   r   rB   r   r   )r   r   r   r   )r   FFFFFFT)r   r   r@   r   r   rB   r   rZ   r   rZ   r   rZ   r   rZ   rY   rZ   r   rZ   r   rZ   r   rC   )r@   r   rY   rZ   r   rZ   r   rZ   r   rZ   r   rZ   r   r   r   rB   r   r   )ra   r  r   r   r   r  )'rL   
__future__r   r   recollections.abcr   typingr   r   
babel.corer   babel.messages.catalogr   r	   
babel.utilr
   r   r   	_typeshedr   compiler"   r$   r-   r<   	Exceptionr>   r   rP   rX   r   r   r   r   r   r   r   r   rq   r   r   <module>r     s  	 	 # " " " " " 				 				 $ $ $ $ $ $ ) ) ) ) ) ) ) )       3 3 3 3 3 3 3 3 " " " " " " (!!!!!!!!'''''' rz/**; ; ; ;6       </ / / /d    )   , , , , , , , ,\B \B \B \B \B \B \B \BB #'!9 9 9 9 9x 2: / / / /":K :K :K :K :Kz   ( !"J J J J J` ""59l l l l l l^     r   