Your IP : 216.73.216.52


Current Path : /snap/certbot/5451/lib/python3.12/site-packages/pycparser/__pycache__/
Upload File :
Current File : //snap/certbot/5451/lib/python3.12/site-packages/pycparser/__pycache__/c_parser.cpython-312.pyc

�

q[�i�^���ddlmZddlmZmZmZmZmZmZm	Z	m
Z
mZddlm
Z
ddlmZmZddlmZmZeGd�d��ZGd	�d
e�ZGd�d�Zhd
�Zidd�dd�dd�dd�dd�dd�dd�dd�dd�dd�dd�dd�d d�d!d"�d#d"�d$d%�d&d%�d'd%i�Zhd(�Zd)d*hZhd+�Zhd,�Zeezezezhd-�zZhd.�Zhd/�Z d0d1hZ!hd2�Z"d3hZ#hd4�Z$ee ze!ze"ze#ze$zZ%hd5�Z&Gd6�d7�Z'Gd8�d9e
�Z(ed:Z)Gd;�d<e
�Z*y=)>�)�	dataclass)	�Any�Dict�List�Literal�NoReturn�Optional�Tuple�	TypedDict�cast�)�c_ast)�CLexer�_Token)�fix_switch_cases�fix_atomic_specifiersc�F�eZdZUdZeed<eed<dZeeed<defd�Z	y)�CoordzkCoordinates of a syntactic element. Consists of:
    - File name
    - Line number
    - Column number
    �file�lineN�column�returnc�x�|j�d|j��}|jr|d|j��z
}|S)N�:�rrr)�self�texts  ��/build/snapcraft-certbot-8ace4148c346cc61c23dfdbf9a13f72e/parts/certbot/install/lib/python3.12/site-packages/pycparser/c_parser.py�__str__z
Coord.__str__'s;���)�)��A�d�i�i�[�)���;�;��a����}�%�%�D���)
�__name__�
__module__�__qualname__�__doc__�str�__annotations__�intrr	r�r rrrs-����I�

�I� �F�H�S�M� ���r rc��eZdZy)�
ParseErrorN)r!r"r#r(r rr*r*.s��r r*c��eZdZdZdedddddfdedeed	ed
ededed
eddfd�Z	d�dededede	jfd�Zd�dede
edefd�Zdedeezdzdefd�Zd�d�Zd�d�Zdede
eddfd�Zdede
eddfd�Zdedefd �Zded!ededdfd"�Zd�d#�Zd�d$�Zdedefd%�Zd&ed'ede	j8fd(�Zd&e	j<e	j>ze	j@zd)e!ede	j<e	j>ze	j@zfd*�Z"	d�d+e
d,d-ed.d/d0edd,f
d1�Z#	d�d2d,d3e!d4d5ede!e	j8fd6�Z$d2d,d&e	j8d7e
e!e	j8d8e	j8de	j8f
d9�Z%d:edefd;�Z&d�d<ede
e'fd=�Z(d�d<ede
efd>�Z)de'fd?�Z*d@ede
e'fdA�Z+d@ede'fdB�Z,defdC�Z-dDeddfdE�Z.dFe'defdG�Z/d�dFe
e'defdH�Z0d�dFe
e'defdI�Z1defdJ�Z2d�dKedefdL�Z3de4e
eeffdM�Z5	d�dNedOede4e
e	j8effdP�Z6de4e
eeffdQ�Z7defdR�Z8defdS�Z9de
e4e	j@ee'ffdT�Z:de	jfdU�Z;de!e	j8fdV�Z<de!e	j8fdW�Z=de!e	j8fdX�Z>de!e	j8fdY�Z?d2d,dZede!e	j8fd[�Z@de!e	j8fd\�ZA	d�d]ede4d,ee
effd^�ZBd�d_�ZCde!efd`�ZDde	j8fda�ZEde	j8fdb�ZF	d�dce
d4dKede!d4fdd�ZGd�dKedd4fde�ZHde	j8fdf�ZIde!e	j8fdg�ZJde
e!e	j8fdh�ZKde!d4fdi�ZLd�dj�ZMde	j8fdk�ZNde	j8fdl�ZOde	j8fdm�ZPde	j8fdn�ZQde	j8fdo�ZRde	j8fdp�ZSde	j8fdq�ZTd.edrede	j8fds�ZU	d�d.edrede	j8fdt�ZVd&e	j8de	j8fdu�ZWdve	j8de	j8fdw�ZX	d�dxe
e	j8de
ede	j8fdy�ZYdve	j8de	j8fdz�ZZde
e	j8fd{�Z[de	j�fd|�Z]de	j�fd}�Z^de	j8fd~�Z_d2d,d&e
e	j8de
ede	j8fd��Z`de
e	j8fd��Zade	j8fd��Zbde	j@fd��Zcde
e	j8fd��Zdde	j8fd��Zede
e	j�fd��Zfde	j8fd��Zgde	j8e!e	j8zfd��Zhde	j8e!e	j8zfd��Zide	j8e!e	j8zfd��Zjde!e	j8fd��Zkde	j8fd��Zlde	j8fd��Zmde	j8fd��Znde	j8fd��Zode	j8fd��Zpde	j8fd��Zqde
e	j8fd��Zrde	j8fd��Zsde	j8fd��Ztde	j8fd��Zu	d�d�ed�e
e	j8de	j8fd��Zvde	j8fd��Zwde	j8fd��Zxde	j8fd��Zyde	j8fd��Zzde	j8fd��Z{de	j8fd��Z|de	j8fd��Z}de	j8fd��Z~de	j8fd��Zde	j8fd��Z�de	j8fd��Z�de	j8fd��Z�de	j8fd��Z�de	j8fd��Z�de	j8fd��Z�de!e	j8fd��Z�de!e	j8fd��Z�de	j8fd��Z�defd��Z�de	j8fd��Z�de!e	j8fd��Z�de!e	j8fd��Z�y)��CParseraFRecursive-descent C parser.

    Usage:
        parser = CParser()
        ast = parser.parse(text, filename)

    The `lexer` parameter lets you inject a lexer class (defaults to CLexer).
    The parameters after `lexer` are accepted for backward compatibility with
    the old PLY-based parser and are otherwise unused.
    Tzpycparser.lextabzpycparser.yacctabF��lex_optimize�lexer�lextab�
yacc_optimize�yacctab�
yacc_debug�taboutputdirrNc���||j|j|j|j��|_t�g|_t|j�|_y)N)�
error_func�on_lbrace_func�on_rbrace_func�type_lookup_func)	�_lex_error_func�_lex_on_lbrace_func�_lex_on_rbrace_func�_lex_type_lookup_func�clex�dict�_scope_stack�_TokenStream�_tokens)rr.r/r0r1r2r3r4s        r�__init__zCParser.__init__>sR��"��+�+��3�3��3�3�!�7�7�	
��	�59�F�8���%1�$�)�)�%<��r r�filename�debugc�2�t�g|_|jj||�t	|j�|_|j
�}|j�}|�.|jd|j��|j|��|S)a-Parses C code and returns an AST.

        text:
            A string containing the C source code

        filename:
            Name of the file being parsed (for meaningful
            error messages)

        debug:
            Deprecated debug flag (unused); for backwards compatibility.
        �before: )r?r@r>�inputrArB� _parse_translation_unit_or_empty�_peek�_parse_error�value�
_tok_coord)rrrDrE�ast�toks      r�parsez
CParser.parseZsy��"�V�H����	�	����h�'�#�D�I�I�.����3�3�5���j�j�l���?���������4�d�o�o�c�6J�K��
r �linenorc�F�t|jj||��S)Nr)rr>rD)rrQrs   r�_coordzCParser._coordvs���$�)�)�,�,�6�&�I�Ir �msg�coordc�"�t|�d|����)Nz: )r*)rrTrUs   rrKzCParser._parse_errorys���E�7�"�S�E�*�+�+r c�J�|jjt��y�N)r@�appendr?�rs r�_push_scopezCParser._push_scope|s����� � ���(r c�l�t|j�dkDsJ�|jj�y)Nr
)�lenr@�poprZs r�
_pop_scopezCParser._pop_scopes-���4�$�$�%��)�)�)������r �namec��|jdj|d�s|jd|�d�|�d|jd|<y)z9Add a new typedef name (ie a TYPEID) to the current scope���TzTypedef z1 previously declared as non-typedef in this scopeN�r@�getrK�rr`rUs   r�_add_typedef_namezCParser._add_typedef_name�sR��� � ��$�(�(��t�4�����4�(�"S�T��
�'+����"��d�#r c��|jdj|d�r|jd|�d�|�d|jd|<y)z`Add a new object, function, or enum member name (ie an ID) to the
        current scope
        rbFzNon-typedef z- previously declared as typedef in this scopeNrcres   r�_add_identifierzCParser._add_identifier�sT�����R� �$�$�T�5�1�����t�h�&S�T��
�',����"��d�#r c�f�t|j�D]}|j|�}|��|cSy)z.Is *name* a typedef-name in the current scope?F)�reversedr@rd)rr`�scope�in_scopes    r�_is_type_in_scopezCParser._is_type_in_scope�s;���d�/�/�0�	 �E��y�y���H��#���	 �r rc�H�|j||j||��yrX)rKrS)rrTrrs    rr:zCParser._lex_error_func�s�����#�t�{�{�4��8�9r c�$�|j�yrX)r[rZs rr;zCParser._lex_on_lbrace_func�s�����r c�$�|j�yrX)r_rZs rr<zCParser._lex_on_rbrace_func�s�����r c�$�|j|�S)z�Looks up types that were previously defined with
        typedef.
        Passed to the lexer for recognizing identifiers that
        are types.
        )rm)rr`s  rr=zCParser._lex_type_lookup_func�s���%�%�d�+�+r �decl�modifierc�|�|}|}|jr|j}|jr�t|tj�r	||_|S|}t|jtj�s1|j}t|jtj�s�1|j|_||_|S)z�Tacks a type modifier on a declarator, and returns
        the modified declarator.

        Note: the declarator and modifier may be modified
        )�type�
isinstancer�TypeDecl)rrrrs�
modifier_head�
modifier_tail�	decl_tails      r�_type_modify_declzCParser._type_modify_decl�s���!�
� �
�� � �)�.�.�M�� � ��d�E�N�N�+�!%�M���O�
�I� �������@�%�N�N�	�!�������@�"+���M��*�I�N��Kr �typenamec��|}t|tj�s'|j}t|tj�s�'|j|_|jdd|_|D]R}t|tj�r�t|�dkDr|jd|j��I||_|cS|sit|jtj�s|jd|j�tjdg|j��|_|Stj|D��cgc]}|jD]}|���c}}|dj��|_|Scc}}w)z#Fixes a declaration. Modifies decl.Nr
z Invalid multiple types specified�Missing type in declarationr'�rUr)
rvrrwru�declnamer`�quals�IdentifierTyper]rKrU�FuncDecl�names)rrrr|�typ�tn�idr`s       r�_fix_decl_name_typezCParser._fix_decl_name_types1�����S�%�.�.�1��(�(�C��S�%�.�.�1��L�L��	��J�J�q�M��	��	 �B��b�%�"6�"6�7��x�=�1�$��%�%�&H�"�(�(�S�!�C�H��K�
	 ���d�i�i����8��!�!�"?����L��+�+�U�G�4�:�:�F�C�H����+�+� (�>�"�R�X�X�>�T��>��>�h�q�k�FW�FW��C�H����?s�?E7
�declspec�	_DeclSpec�newspec�kind�
_DeclSpecKindrYc��|�tggggg��}n|}|r||j|�|S||jd|�|S)z2See _DeclSpec for the specifier dictionary layout.��qual�storageru�function�	alignmentr)r?rY�insert)rr�r�r�rY�specs      r�_add_declaration_specifierz"CParser._add_declaration_specifier(s]����"���"�r�R��D��D����J���g�&���
��J���a��)��r r��decls�	_DeclInfo�typedef_namespacec
���d|dv}g}|djd����|dd��t|d�dksBt|dd	j�d
k7s$|j|dd	jd�s8d}|dD]}t	|d�s�|j
}n|j
d
|�tj|dd	jddd|d|dd	j
��|dd<|dd	=n�t|ddtjtjtjtjf�s�tt|dd�}t|tj�s'|j }t|tj�s�'|j"� |dd	jd|_|dd	=|D�]�}	|	d�J�|r1tj$d|d|d|	d|	dj
��}
nXtj&d|d|d|d|d|	d|	jd�|	jd�|	dj
��	}
t|
j tjtjtjtjf�r|
}n|j)|
|d�}|rO|r'|j+|j,|j
�n&|j/|j,|j
�t1ttj&tj$z|��}|j3|����|S)z�Builds a list of declarations all sharing the given specifiers.
        If typedef_namespace is true, each declared name is added
        to the "typedef namespace", which also includes objects,
        functions, and enum constants.
        �typedefr�r�bitsizeNrrru�rbr
�?rU�Invalid declarationr��r�rur��alignrUr�)r`r�r�rurUr��init�	r`r�r�r��funcspecrur�r�rU)rdr]r�rm�hasattrrUrKrrwrv�Enum�Struct�Unionr�rrrur��Typedef�Declr�rfr`rhrrY)rr�r�r��
is_typedef�declarationsrU�t�decls_0_tailrr�declaration�
fixed_decls            r�_build_declarationszCParser._build_declarations>sJ���$�y�/�1�
�����8�<�<�	�"�*�
�Q�x���'���V��%��)��4��<��+�1�1�2�a�7��1�1�$�v�,�r�2B�2H�2H��2K�L��E�!�&�\�"��"�1�g�.�$%�G�G�E�!�"��%�%�&;�U�C�$)�>�>�!�&�\�"�-�3�3�A�6����{�+��v�,�r�*�0�0�$��a��� ���L��$� ��a��� ����U�\�\�5�;�;��8L�8L�M�� $�C��q��&�)9�:��$�\�5�>�>�B�#/�#4�#4�L�%�\�5�>�>�B��(�(�0�,0��L��,<�,B�,B�1�,E�L�)��V��R�(��*	,�D���<�+�+�+��#�m�m���v�,� ��O��f���v�,�,�,���$�j�j���v�,��{�+� ��O�!�*�-��f�����&�)� �H�H�Y�/��v�,�,�,�
���� � ����U�\�\�5�;�;��8L�8L�M��)�
�!�5�5�k�4��<�P�
�!���*�*�:�?�?�J�<L�<L�M��(�(����*�:J�:J�K�.��U�Z�Z�%�-�-�/��<��J�
���
�+�U*	,�X�r �param_decls�bodyc���d|dvr|jd|j�|j|t|dd��gd��d}t	j
||||j�	�S)
zBuilds a function definition.r�r�zInvalid typedefN�rrr�r�T�r�r�r�r)rrr�r�rU)rKrUr�r?r�FuncDef)rr�rrr�r�r�s      r�_build_function_definitionz"CParser._build_function_definition�sy����Y��'����/����<��.�.���T��d�;�<�"�/�
��	
���}�}��+�D��
�
�
�	
r �tokenc�L�|dk(rtjStjS)z[Given a token (either STRUCT or UNION), selects the
        appropriate AST class.
        �struct)rr�r�)rr�s  r�_select_struct_union_classz"CParser._select_struct_union_class�s ���H���<�<���;�;�r �kc�8�|jj|�S)z:Return the k-th next token without consuming it (1-based).)rB�peek�rr�s  rrJz
CParser._peek�s���|�|� � ��#�#r c�D�|j|�}|�|jSdS)zDReturn the type of the k-th next token, or None if absent (1-based).N)rJru)rr�rOs   r�
_peek_typezCParser._peek_type�s"���j�j��m���?�s�x�x�4��4r c��|jj�}|�'|jd|jj�y|S)NzAt end of input)rB�nextrKr>rD�rrOs  r�_advancezCParser._advance�s9���l�l���!���;����/����1C�1C�D��Jr �
token_typec�f�|j�}|�|j|k(r|j�Sy)z�Conditionally consume next token, only if it's of token_type.

        If it is of the expected type, consume and return it.
        Otherwise, leaves the token intact and returns None.
        N)rJrur��rr�rOs   r�_acceptzCParser._accept�s.���j�j�l���?�s�x�x�:�5��=�=�?�"�r c��|j�}|j|k7r.|jd|j��|j	|��|S)NrG)r�rurKrLrMr�s   r�_expectzCParser._expect�sB���m�m�o���8�8�z�!���������4�d�o�o�c�6J�K��
r c�6�|jj�SrX)rB�markrZs r�_markz
CParser._mark�s���|�|� � �"�"r r�c�:�|jj|�yrX)rB�reset�rr�s  r�_resetzCParser._reset�s�������4� r rOc�N�|j|j|j�SrX)rSrQrr�s  rrMzCParser._tok_coord�s���{�{�3�:�:�s�z�z�2�2r c�T�|xs|j�}|�y|jtvS�NF)rJru�_DECL_STARTr�s  r�_starts_declarationzCParser._starts_declaration�s)���!�T�Z�Z�\���;���x�x�;�&�&r c�T�|xs|j�}|�y|jtvSr�)rJru�_STARTS_EXPRESSIONr�s  r�_starts_expressionzCParser._starts_expression�s*���!�T�Z�Z�\���;���x�x�-�-�-r c�Z�|j�}|�y|tvry|j�S)NFT)r��_STARTS_STATEMENTr��r�tok_types  r�_starts_statementzCParser._starts_statement�s2���?�?�$������(�(���&�&�(�(r �id_onlyc�H�|j�}|�y|dvry|r|dk(S|dvS)NF>�TIMES�LPARENT�ID>r��TYPEID�r�)rr�r�s   r�_starts_declaratorzCParser._starts_declarators=���?�?�$������*�*����t�#�#��+�+�+r c�r�|j�}|j�\}}|j|�||fSrX)r��_scan_declarator_name_infor�)rr�r��	saw_parens    r�_peek_declarator_name_infoz"CParser._peek_declarator_name_infos7���z�z�|��"�=�=�?���)����D����"�"r �allow_abstract�typeid_paren_as_abstractc��|j�\}}|�	|rh|dk(rc|ra|sK|j�}|�|j|�n|jj}|jd|�|j
�}|dfS|dk(r*|r|j�}|dfS|j�}|dfS|j�}|dfS)Nr�zInvalid declaratorFT)
r�rJrMr>rDrK�_parse_abstract_declarator_opt� _parse_typeid_noparen_declarator�_parse_typeid_declarator�_parse_id_declarator)rr�r��	name_typer�rOrUrrs        r�_parse_any_declaratorzCParser._parse_any_declarators��� $�>�>�@��	�9���$��h�)>�9�!��j�j�l��03������,�T�Y�Y�EW�EW���!�!�"6��>��6�6�8�D���;���� �'��<�<�>��
�T�z���4�4�6���T�z���,�,�.�D��T�z�r c��d}|jd�rO|j�tvr'|j�|j�tvr�'|jd�r�O|j	�}|�d|fS|j
dvr|j�|j
|fS|j
dk(r�d}|j�|j
�\}}|rd}d}	|j	�}|�d|fS|j
dk(r|dz
}n/|j
dk(r |dz}|j�|dk(r	||fS�[|j��kd|fS)	NFr�>r�r�r�Tr
�RPARENr)r�r��_TYPE_QUALIFIERr�rJrur�)rr�rOr��nested_paren�depths      rr�z"CParser._scan_declarator_name_info/sK���	��l�l�7�#��/�/�#��6��
�
���/�/�#��6��l�l�7�#��j�j�l���;���?�"��8�8�'�'��M�M�O��8�8�Y�&�&��8�8�x���I��M�M�O�%)�%D�%D�%F�"�H�l�� �	��E���j�j�l���;���?�*��8�8�x�'��Q�J�E��X�X��)��Q�J�E��M�M�O���z���Y�&�&���
�
����Y��r c�&�|j�dvS)N>r��LBRACKETr�rZs r�"_starts_direct_abstract_declaratorz*CParser._starts_direct_abstract_declaratorRs����� �$:�:�:r c�R�|j�}|duxr|jtvSrX)rJru�_ASSIGNMENT_OPSr�s  r�_is_assignment_opzCParser._is_assignment_opUs%���j�j�l���$��>�3�8�8��#>�>r c��|j�}|jd�}|�y|j�s|j|�y|j	�}|jd��|j|�y|||fS)abParse and return a parenthesized type name if present.

        Returns (typ, mark, lparen_tok) when the next tokens look like
        '(' type_name ')', where typ is the parsed type name, mark is the
        token-stream position before parsing, and lparen_tok is the LPAREN
        token. Returns None if no parenthesized type name is present.
        r�Nr�)r�r�r�r��_parse_type_name)rr��
lparen_tokr�s    r�_try_parse_paren_type_namez"CParser._try_parse_paren_type_nameYsz���z�z�|���\�\�(�+�
�����'�'�)��K�K�����#�#�%���<�<��!�)��K�K�����D�*�$�$r c��|j��tjg�Stj|j��SrX)rJr�FileAST�_parse_translation_unitrZs rrIz(CParser._parse_translation_unit_or_emptyts5���:�:�<���=�=��$�$��}�}�T�9�9�;�<�<r c��g}|j��0|j|j��|j���0|SrX)rJ�extend�_parse_external_declaration)r�exts  rrzCParser._parse_translation_unitzs;�����j�j�l�&��J�J�t�7�7�9�:��j�j�l�&��
r c	�r�|j�}|�gS|jdk(r|j�gS|jdvr|j�gS|j	d�rgS|jdk(r|j�S|j
|�s�|j�}d}|j�dk7r|jd|j�tgggtjdg|j��gg�	�}|j||||j��
�}|gS|j!d��\}}}|j#�\}}	|d
k7r%|j%||�}
|j'd�|
S|j�}|j�dk(s|j
�r�d}|j
�r|j)�}|j�dk7r|jd|j�|dstjdg|��g|d<|j||||j��
�}|gSt|dd��}|j	d�r|j+�|d<|j-|��}
|j/||
d��}
|j'd�|
S)N�PPHASH>�_PRAGMA�PPPRAGMA�SEMI�_STATIC_ASSERT�LBRACEzInvalid function definitionr'r)r�r�r�rur�)r�rrr�r�T��
allow_no_typer�rur��EQUALSr�)�firstr�)rJru�_parse_pp_directive�_parse_pppragma_directiver��_parse_static_assertr�r�r�rKrUr?rr�r��_parse_compound_statement�_parse_declaration_specifiersr��_parse_decl_body_with_specr��_parse_declaration_list�_parse_initializer�_parse_init_declarator_listr�)rrOrrr�r��func�saw_type�
spec_coordr��_r��	decl_dicts            rr
z#CParser._parse_external_declaration�s����j�j�l���;��I��8�8�x���$�$�&��I��8�8�.�.��2�2�4�5�5��<�<����I��8�8�'�'��,�,�.�.��'�'��,��,�,�.�D��K���� �H�,��!�!�"?����L�"�����*�*�E�7�$�*�*�E�F���D��2�2���'��3�3�5�	3��D��6�M�&*�%G�%G��&H�&
�"��h�
��6�6�8��	�1�����3�3�D�(�C�E��L�L�� ��L��(�(�*���?�?���(�D�,D�,D�,F��K��'�'�)�"�:�:�<����� �H�,��!�!�"?����L���<� %� 4� 4�e�W�J� O�P��V���2�2���'��3�3�5�	3��D��6�M�!%�4�d�D�!I�	��<�<��!� $� 7� 7� 9�I�f���0�0�y�0�A���(�(�d�%�SW�(�X�����V���r c�H�|j�}|jd�|S�Nr)�_parse_decl_bodyr��rr�s  r�_parse_declarationzCParser._parse_declaration�s!���%�%�'�����V���r c�R�|jd��\}}}|j||�S)NTr)rr)rr�r!r#s    rr'zCParser._parse_decl_body�s/�� �>�>�T�>�R���h���.�.�t�X�>�>r r!c�&�d}|r!|j�r5|j�}n$|jd��r|jd��}|��|d}tjtjtj
f}t
|�dk(rLt|d|�r=tjd|d|d|d|d	|ddd|dj�
�	g}|S|j|tddd��gd��}|S|j||d��}|S)
NT�r�rur
rr�r�r�r�r�r�r�)r�rrr�r�r�r]rvr�rUr�r?)rr�r!r��ty�s_u_or_es      rrz"CParser._parse_decl_body_with_spec�s3������&�&�(��8�8�:���&�&�t�&�4��8�8��8�F���=��f��B����e�k�k�5�:�:�>�H��2�w�!�|�
�2�a�5�(� ;��J�J�!�"�6�l�"�;�/� $�Y��!%�j�!1���U�!� $� ��e�k�k�
���0���0�0���T��d�C�D�&*�1�����	�,�,���$�-��E��r c��g}|j�r0|j|j��|j�r�0|SrX)r�r	r)r(s  rrzCParser._parse_declaration_lists;�����&�&�(��L�L��0�0�2�3��&�&�(��r rc	��d}d}d}	|j�}|��n*|jdk(r7|�|j|�}|j||j	�dd��}�[|jdk(rM|jd�d	k(r9|�|j|�}|j||j
�d
d��}d}��|jtvrB|�|j|�}|j||j�jdd��}��|jtvrB|�|j|�}|j||j�jdd��}��_|jtvrB|�|j|�}|j||j�jd
d��}���|jtvrk|�|j|�}|j�}|j|tj|jg|j|���d
d��}d}��0|jdk(rn|rn�|�|j|�}|j�}|j|tj|jg|j|���d
d��}d}���|jdvr:|�|j|�}|j||j�d
d��}d}���|jdk(r:|�|j|�}|j||j!�d
d��}d}��>	|�&|j#d|j$j&�|s|s|j#d|�|||fS)a�Parse declaration-specifier sequence.

        allow_no_type:
            If True, allow a missing type specifier without error.

        Returns:
            (spec, saw_type, first_coord) where spec is a dict with
            qual/storage/type/function/alignment entries, saw_type is True
            if a type specifier was consumed, and first_coord is the coord
            of the first specifier token (used for diagnostics).
        NFT�_ALIGNASr��rY�_ATOMICr�r�rur�r�r�rr�>�UNION�STRUCT�ENUMr�r~)rJrurMr��_parse_alignment_specifierr��_parse_atomic_specifierr�r�rL�_STORAGE_CLASS�_FUNCTION_SPEC�_TYPE_SPEC_SIMPLErr�� _parse_struct_or_union_specifier�_parse_enum_specifierrKr>rD)rrr�r!�first_coordrOs      rrz%CParser._parse_declaration_specifierss�����������*�*�,�C��{���x�x�:�%��&�"&�/�/�#�"6�K��6�6��$�9�9�;�[�QU�7�����x�x�9�$�����);�x�)G��&�"&�/�/�#�"6�K��6�6��$�6�6�8�&��7��� ����x�x�?�*��&�"&�/�/�#�"6�K��6�6��$�-�-�/�/�/���7�����x�x�>�)��&�"&�/�/�#�"6�K��6�6��$�-�-�/�/�/��4�7�����x�x�>�)��&�"&�/�/�#�"6�K��6�6��$�-�-�/�/�/��D�7�����x�x�,�,��&�"&�/�/�#�"6�K��m�m�o���6�6���(�(�#�)�)��D�O�O�C�<P�Q���	7��� ����x�x�8�#����&�"&�/�/�#�"6�K��m�m�o���6�6���(�(�#�)�)��D�O�O�C�<P�Q���	7��� ����x�x�.�.��&�"&�/�/�#�"6�K��6�6��$�?�?�A�6�RV�7��� ����x�x�6�!��&�"&�/�/�#�"6�K��6�6��$�4�4�6��t�7��� �����<����3�T�Y�Y�5G�5G�H��
����;�[�I��X�{�*�*r c	��d}d}d}d}	|j�}|��n�|jdk(r9|�|j|�}|j||j	�dd��}d}�]|jdk(rM|jd�dk(r9|�|j|�}|j||j
�d	d��}d}��|jtvrB|�|j|�}|j||j�jd
d��}��
|jtvrk|�|j|�}|j�}|j|tj|jg|j|���d	d��}d}���|jdk(rn|rn�|�|j|�}|j�}|j|tj|jg|j|���d	d��}d}��|jd
vr:|�|j|�}|j||j�d	d��}d}��O|jdk(r:|�|j|�}|j||j�d	d��}d}���	|�&|jd|j j"�|s|s|jd|�|j%d��g|d<|j%d��g|d<|S)NFTr1r�r2r3r�r�rur�rr�>r4r5r6zInvalid specifier listr~r�r�)rJrurMr�r7r�r8r�r�rLr;rr�r<r=rKr>rDrd)rr�r!�
saw_alignmentr>rOs      r�_parse_specifier_qualifier_listz'CParser._parse_specifier_qualifier_list�s,�������
�����*�*�,�C��{���x�x�:�%��&�"&�/�/�#�"6�K��6�6��$�9�9�;�[�QU�7���!%�
���x�x�9�$�����);�x�)G��&�"&�/�/�#�"6�K��6�6��$�6�6�8�&��7��� ����x�x�?�*��&�"&�/�/�#�"6�K��6�6��$�-�-�/�/�/���7�����x�x�,�,��&�"&�/�/�#�"6�K��m�m�o���6�6���(�(�#�)�)��D�O�O�C�<P�Q���	7��� ����x�x�8�#����&�"&�/�/�#�"6�K��m�m�o���6�6���(�(�#�)�)��D�O�O�C�<P�Q���	7��� ����x�x�.�.��&�"&�/�/�#�"6�K��6�6��$�?�?�A�6�RV�7��� ����x�x�6�!��&�"&�/�/�#�"6�K��6�6��$�4�4�6��t�7��� �����<����6��	�	�8J�8J�K��
����;�[�I��8�8�I��&� �D��O��8�8�J��'�!�D����r c��g}|j�tvr@|j|j�j�|j�tvr�@|SrX)r�r�rYr�rL)rr�s  r�_parse_type_qualifier_listz"CParser._parse_type_qualifier_list�sD�����o�o��?�2��L�L�����.�.�/��o�o��?�2��r c�~�|jd�}|jd�|j�rF|j�}|jd�tj||j|��S|j
�}|jd�tj||j|��S)Nr1r�r�)r�r�rr�AlignasrM�_parse_constant_expression)rrOr��exprs    rr7z"CParser._parse_alignment_specifiers����l�l�:�&�����X���#�#�%��'�'�)�C��L�L��"��=�=��d�o�o�c�&:�;�;��.�.�0�����X���}�}�T�4�?�?�3�#7�8�8r c���|jd�|jd�|j�}|jd�|jjd�|S)Nr3r�r��_Atomic)r�rr�rY)rr�s  rr8zCParser._parse_atomic_specifiersK�����Y�����X���#�#�%�����X���	�	����#��
r rc��|�|gn|j|��g}|jd�r3|j|j|���|jd�r�3|S)Nr,�COMMA)�_parse_init_declaratorr�rY)rrr�r�s    rrz#CParser._parse_init_declarator_listse��
� ��G��-�-�g�-�>�?�	��l�l�7�#��L�L��4�4�W�4�E�F��l�l�7�#��r c��|r|j�n|j�}d}|jd�r|j�}t	||d��S)Nrr�)r��_parse_declaratorr�rr?)rr�rrr�s    rrLzCParser._parse_init_declarator'sK��.5�t�(�(�*�4�;Q�;Q�;S�����<�<��!��*�*�,�D���D�$�7�7r c�t�|j�}|j|j�}|j�dvr�|j�}|j�dk(r�|j�|j	d�r$||jg|j|���S|j
�}|jd�||j||j|���S||jd|j|���S|j�dk(rv|j�}|j	d�r|dg|j|���S|j
�}|jd�|d||j|���S|jd|j|��y)N>r�r�r�RBRACE)r`r�rUz Invalid struct/union declaration)	r�r�rLr�r�rM�_parse_struct_declaration_listr�rK)rrO�klass�name_tokr��	brace_toks      rr<z(CParser._parse_struct_or_union_specifier3sm���m�m�o���/�/��	�	�:���?�?�� 0�0��}�}��H���� �H�,��
�
���<�<��)� �%�^�^�2�T�_�_�X�=V����;�;�=�����X�&��!���u�D�O�O�H�<U�����^�^�4�t���x�7P��
��?�?���(��
�
��I��|�|�H�%��$�b����	�8R�S�S��7�7�9�E��L�L��"��d�%�t���y�7Q�R�R����<�d�o�o�c�>R�Sr c��g}|j�dvr7|j�}|��%|j|�|j�dvr�7|S�N>NrP)r��_parse_struct_declarationr	)rr��itemss   rrQz&CParser._parse_struct_declaration_listTsR�����o�o��'7�7��2�2�4�E��}���L�L���	�o�o��'7�7�
�r c���|j�dk(r|j�y|j�dvr|j�gS|j�}d|j	dg�vsJ�d}|j�s|j�dk(r|j
�}|�$|jd�|j||��St|d�dk(rk|dd	}t|tj�r|}ntj|�}|jd�|j|t|dd�
�g��S|jd�|j|tddd�
�g��S)Nr>rrr�r��COLON�r�r�rur
rr�)r�r�rrArdr��_parse_struct_declarator_listr�r�r]rvr�Noder�r?)rr�r��node�	decl_types     rrWz!CParser._parse_struct_declaration`sh���?�?���&��M�M�O���?�?�� 7�7��2�2�4�5�5��3�3�5�������B� 7�7�7�7����"�"�$����(9�W�(D��6�6�8�E����L�L�� ��+�+��U�+�C�C��t�F�|���!���<��?�D��$��
�
�+� �	�!�0�0��6�	��L�L�� ��+�+��$�I�D�$�"O�!P�,��
�	
���V���'�'��d��4��F�G�(�
�	
r c��|j�g}|jd�r1|j|j��|jd�r�1|S�NrK)�_parse_struct_declaratorr�rYr(s  rr\z%CParser._parse_struct_declarator_list�sG���.�.�0�1���l�l�7�#��L�L��6�6�8�9��l�l�7�#��r c��|jd�r,|j�}tjdddd�d|d�S|j	�}|jd�r|j�}|d|d�S|ddd�S)NrZr�)r�rFrrwrN)rr�rrs   rrbz CParser._parse_struct_declarator�s����<�<�� ��5�5�7�G����t�T�4��>��"��
��%�%�'���<�<�� ��5�5�7�G� �$�7�C�C��d�t�<�<r c�`�|jd�}|j�dvr�|j�}|j�dk(ra|j�|j�}|jd�t	j
|j||j|��St	j
|jd|j|��S|jd�|j�}|jd�t	j
d||j|��S)Nr6>r�r�rrP)r�r�r��_parse_enumerator_listrr�rLrM)rrOrS�enumss    rr=zCParser._parse_enum_specifier�s����l�l�6�"���?�?�� 0�0��}�}��H���� �H�,��
�
���3�3�5�����X�&��z�z�(�.�.�%�����9M�N�N��:�:�h�n�n�d�D�O�O�C�4H�I�I����X���+�+�-�����X���z�z�$��t���s�';�<�<r c�0�|j�}tj|g|j�}|j	d�rS|j�dk(r	|S|j�}|jj|�|j	d�r�S|S)NrKrP)�_parse_enumeratorr�EnumeratorListrUr�r��enumeratorsrY)r�enum�	enum_lists   rrezCParser._parse_enumerator_list�s����%�%�'���(�(�$�����<�	��l�l�7�#���� �H�,�����)�)�+�D��!�!�(�(��.�	�l�l�7�#�
�r c��|jd�}|jd�r|j�}nd}tj|j
||j
|��}|j|j|j�|S)Nr�r)
r�r�rFr�
EnumeratorrLrMrhr`rU)rrSrLrks    rrhzCParser._parse_enumerator�sm���<�<��%���<�<��!��3�3�5�E��E��������t���x�7P�Q�����T�Y�Y��
�
�3��r c�:�|jdd��\}}|�J�|S)NF�r�r�)r�)rrrr#s   rrNzCParser._parse_declarator�s3���,�,� �5�-�
���a������r c�(�|jdd��S)Nr�T�r��allow_paren��_parse_declarator_kindrZs rr�zCParser._parse_id_declarator�s���*�*��$�*�G�Gr c�(�|jdd��S)N�typeidTrrrtrZs rr�z CParser._parse_typeid_declarator�s���*�*��d�*�K�Kr c�(�|jdd��S)NrwFrrrtrZs rr�z(CParser._parse_typeid_noparen_declarator�s���*�*��e�*�L�Lr rsc��d}|j�dk(r|j�}|j||��}|�|j||�S|S)Nr��rs)r��_parse_pointer�_parse_direct_declaratorr{)rr�rs�ptr�directs     rruzCParser._parse_declarator_kind�sV�����?�?���'��%�%�'�C��.�.�t��.�M���?��)�)�&�#�6�6��
r c	�J�|r6|jd�r%|j|d��}|jd�n[|dk(r|jd�}n|jd�}tj|j
ddd|j
|���}|j|�S)	Nr�Trzr�r�r�r�r�)r�rur�rrwrLrM�_parse_decl_suffixes)rr�rsrrrSs     rr|z CParser._parse_direct_declarator�s����4�<�<��1��.�.�t��.�F�D��L�L��"��t�|��<�<��-���<�<��1���>�>�!�������o�o�h�/��D��(�(��.�.r c���	|j�dk(r"|j||j|��}�6|j�dk(r$|j|�}|j||�}�m	|S)zAParse a chain of array/function suffixes and attach them to decl.r�r�)r�r{�_parse_array_decl�_parse_function_decl)rrrr s   rr�zCParser._parse_decl_suffixes�sp������ �J�.��-�-�d�D�4J�4J�4�4P�Q������ �H�,��0�0��6���-�-�d�D�9�����r �	base_declc�<�|jd|j��S�N)�	base_typerU)�_parse_array_decl_commonrU)rr�s  rr�zCParser._parse_array_decl	s���,�,�t�9�?�?�,�S�Sr r�c�6���|jd�}��|j|����fd�}|jd�rBdg|j�xsgz}|j	�}|jd�|||�S|j�tvr�|j�xsg}|jd�r0|dgz}|j	�}|jd�|||�S|jd�}|rI|jd�tj|j|j|��}|||�Sd}|j�r|j	�}|jd�|||�S|jd�}|rI|jd�tj|j|j|��}||g�Sd}|j�r|j	�}|jd�||g�S)a9Parse an array declarator suffix and return an ArrayDecl node.

        base_type:
            Base declarator node to attach (None for direct-declarator parsing,
            TypeDecl for abstract declarators).

        coord:
            Coordinate to use for the ArrayDecl. If None, uses the '[' token.
        r�Nc�6��tj�||���S)N)ru�dim�	dim_qualsrU)r�	ArrayDecl)r�r�r�rUs  ��r�make_array_declz9CParser._parse_array_decl_common.<locals>.make_array_decls����?�?��C�9�E��
r �STATIC�static�RBRACKETr�)r�rMr�rC�_parse_assignment_expressionr�r�rr�rLr�)rr�rU�
lbrack_tokr�r�r��	times_toks ``     rr�z CParser._parse_array_decl_commons�����\�\�*�-�
��=��O�O�J�/�E�	�
�<�<��!�!�
�d�&E�&E�&G�&M�2�N�I��3�3�5�C��L�L��$�"�3�	�2�2��?�?���/��7�7�9�?�R�I��|�|�H�%�%��
�2�	��7�7�9�����Z�(�&�s�I�6�6����W�-�I�����Z�(��h�h�y������	�0J�K��&�s�I�6�6��C��&�&�(��7�7�9���L�L��$�"�3�	�2�2��L�L��)�	���L�L��$��(�(�9�?�?�D�O�O�I�,F�G�C�"�3��+�+����"�"�$��3�3�5�C����Z� ��s�B�'�'r c��|jd�|jd�rd}nA|j�r|j�n|j	�}|jd�tj|d|j��}|j�dk(rp|j�d|jjD]K}t|t
j�r|St|dd�}|s�0|j||j��M|S)Nr�r���argsrurUrr`)r�r�r��_parse_parameter_type_list�_parse_identifier_list_optrr�rUr�r��paramsrv�
EllipsisParam�getattrrh)rr�r�r �paramr`s      rr�zCParser._parse_function_declFs������X���<�<��!��D��+�+�-��/�/�1��4�4�6�
�

�L�L��"��~�~�4�d�)�/�/�J���?�?���(��y�y�$�!�Y�Y�-�-�@�E�!�%��)<�)<�=��
��	#�5�&�$�7�D���,�,�T�5�;�;�?�@��r c��g}|jd�}|rJ|j�xsg}|j||j|�f�|jd�}|r�J|syd}|D]\}}t	j
|||��}�|S)Nr�)r�rurU)r�rCrYrMr�PtrDecl)r�starsr�r�r}rUs      rr{zCParser._parse_pointer`s������L�L��)�	���3�3�5�;��E��L�L�%�����!;�<�=����W�-�I��
����!�	D�L�E�5��-�-�e�#�U�C�C�	D��
r c�.�|j�}|j�dk(rq|jd�dk(r]|j�|j�}|jj	tj|j|���|S�NrKr��ELLIPSIS)�_parse_parameter_listr�r�r�rYrr�rM)rr��ell_toks   rr�z"CParser._parse_parameter_type_listqsn���+�+�-���?�?���'�D�O�O�A�,>�*�,L��M�M�O��m�m�o�G��M�M� � ��!4�!4�T�_�_�W�5M�!N�O��
r c�x�|j�}tj|g|j�}|j	�dk(ru|j	d�dk7ra|j�|jj|j��|j	�dk(r|j	d�dk7r�a|Sr�)�_parse_parameter_declarationr�	ParamListrUr�r�r�rY�rrr�s   rr�zCParser._parse_parameter_listzs����1�1�3�����%��%�+�+�6���o�o��7�*�t���q�/A�Z�/O��M�M�O��M�M� � ��!B�!B�!D�E��o�o��7�*�t���q�/A�Z�/O��
r c�r�|jd��\}}}|dstjdg|��g|d<|j�rN|j	dd��\}}|r#|j|t
|dd��g��d	S|j|||�S|j�}|j|||�S)
NTrrur'rrpr�r[r)	rrr�r�r�r�r?�_build_parameter_declarationr�)rr�r#r"rr�is_nameds      rr�z$CParser._parse_parameter_declaration�s���"�@�@�t�@�T���a���F�|�!�0�0�%��
�K�L�D��L��"�"�$�!�7�7�#�d�8��N�D�(���/�/��d��4��&N�%O�0������4�4�T�4��L�L��2�2�4���0�0��t�Z�H�Hr r"c��t|d�dkDret|ddj�dk(rG|j|ddjd�r#|j|t	|dd��g��dStjd|dd|xstjdddd�|�	�}|j||d�S)
Nrur
rbrr�r[r-r��r`r�r�rurU)	r]r�rmr�r?r�Typenamerwr�)rr�rrr"s    rr�z$CParser._build_parameter_declaration�s���
��V����!��D��L��$�*�*�+�q�0��&�&�t�F�|�B�'7�'=�'=�a�'@�A��+�+��$�D�t�T�"J�!K�,����
��~�~���v�,���?�����d�D�$�?��
���'�'��d�6�l�;�;r c�J�|j�dk(ry|j�S�Nr�)r��_parse_identifier_listrZs rr�z"CParser._parse_identifier_list_opt�s#���?�?���(���*�*�,�,r c��|j�}tj|g|j�}|j	d�r;|j
j
|j��|j	d�r�;|Sra)�_parse_identifierrr�rUr�r�rYr�s   rr�zCParser._parse_identifier_list�s`���&�&�(�����%��%�+�+�6���l�l�7�#��M�M� � ��!7�!7�!9�:��l�l�7�#��
r c�`�|j�}|j�}d}|�
|j}n|dr|ddj}tjd|dddd|xstj
dddd�|��}t
tj|j||d��S)Nrurr-r�r�)rAr�rUrr�rwrr�)rr�rrrUr|s     rrzCParser._parse_type_name�s����3�3�5���2�2�4�������J�J�E�
�&�\���L��O�)�)�E��>�>���v�,�q�/���?�����d�D�$�?��
���E�N�N�D�$<�$<�X�t�F�|�$T�U�Ur c�(�|j�dk(r_|j�}|j�r|j�}nt	j
dddd�}|�J�|j
||�S|j�r|j�Sy)Nr�)r�r{r��!_parse_direct_abstract_declaratorrrwr{)rr}rrs   rr�z&CParser._parse_abstract_declarator_opt�s����?�?���'��%�%�'�C��6�6�8��=�=�?���~�~�d�D�$��=���?�"�?��)�)�$��4�4��2�2�4��9�9�;�;�r c	�,�|jd�}|r�|j�s|j�dk(r_|j�}|j	d�tj|tjdddd�|j|���}no|j�}|j	d�|�LJ�|j�dk(r|j�}n&|jd|jj�|j�S)Nr�r�r�r�zInvalid abstract declarator)r�r�r��_parse_parameter_type_list_optr�rr�rwrMr��_parse_abstract_array_baserKr>rDr�)rrr�rrs    rr�z)CParser._parse_direct_abstract_declarator�s����\�\�(�+�
���'�'�)�T�_�_�->�(�-J��<�<�>�����X�&��~�~������d�D�$�?��/�/�*�5����:�:�<�����X�&��'�'�'�
�_�_�
�*�
,��2�2�4�D����;�T�Y�Y�=O�=O�P��(�(��.�.r c�J�|j�dk(ry|j�Sr�)r�r�rZs rr�z&CParser._parse_parameter_type_list_opt�s#���?�?���(���.�.�0�0r c�T�|jtjdddd�d��Sr�)r�rrwrZs rr�z"CParser._parse_abstract_array_bases.���,�,��n�n�T�4��t�<�D�-�
�	
r c�\�|j�}|xxdk(rnxdk(rnn|j�Sxdk(r%|jd�dk(r|j�Sxdk(r|j�Sxxdk(rnxdk(rnn|j�Sxxd	k(rnxd
k(rnxdk(rnn|j	�Sxxdk(rnxd
k(rnxdk(rnxdk(rnn|j�Sxxdk(rnxdk(rnn|j
�Sdk(r|j�S	|j�S)N�CASE�DEFAULTr�r�rZr�IF�SWITCH�WHILE�DO�FOR�GOTO�BREAK�CONTINUE�RETURNrrr)	r��_parse_labeled_statementr�_parse_selection_statement�_parse_iteration_statement�_parse_jump_statementrr�_parse_expression_statementr�s  r�_parse_statementzCParser._parse_statement
s����?�?�$���#��)�#��4�4�6�6������+�w�6���4�4�6�6���5�5�7�7� �����6�6�8�8�'��4�%�'��6�6�8�8�9��'�J��9��1�1�3�3�'��i�'��5�5�7�7�!��0�0�2�2���7�7�9�9r c���|j�dvrH|j�}|j�}tj||gz|dj
��S|j�S)N>rrr��block_itemsrU)r��_parse_pppragma_directive_listr�r�CompoundrU)r�pragmas�stmts   r�_parse_pragmacomp_or_statementz&CParser._parse_pragmacomp_or_statement$s_���?�?�� 7�7��9�9�;�G��(�(�*�D��>�>�g���.>�g�a�j�FV�FV�W�W��$�$�&�&r c�b�|j�r|j�S|j�SrX)r�r)r�rZs r�_parse_block_itemzCParser._parse_block_item,s,���#�#�%��*�*�,�,��$�$�&�&r c���g}|j�dvr]|j�}t|t�r|dgk(r�9|j	|�n|j|�|j�dvr�]|SrV)r�r�rv�listr	rY)rrX�items   r�_parse_block_item_listzCParser._parse_block_item_list2sl�����o�o��'7�7��)�)�+�D��$��%��D�6�>�����T�"����T�"��o�o��'7�7��r c� �|jd�}|jd�r&tjd|j	|���S|j�}|jd�tj||j	|���S)NrrPr�)r�r�rr�rMr�)r�
lbrace_tokr�s   rrz!CParser._parse_compound_statement?so���\�\�(�+�
��<�<��!��>�>�d�$�/�/�*�:U�V�V��1�1�3�����X���~�~�#�4�?�?�:�+F�
�	
r c��|j�}|xdk(r�|j�}|jd�|j�r|j	�}n$tj|j|��}tj|j||j|��Sxdk(r�|j�}|j�}|jd�|j�r|j	�}n$tj|j|��}tj||g|j|��Sdk(r�|j�}|jd�|j�r|j	�}n$tj|j|��}tj|g|j|��S	|jd|jj�y)Nr�rZr�r�zInvalid labeled statement)r�r�r�r�r�r�EmptyStatementrM�LabelrLrF�Case�DefaultrKr>rD)rr�rSr��case_tokrG�def_toks       rr�z CParser._parse_labeled_statementLs~���?�?�$�����=�=�?�����W�%��)�)�+��>�>�@�D� �/�/�����0I�J�D��{�{�8�>�>�4�����9R�S�S���=�=�?���6�6�8�����W�%��)�)�+��>�>�@�D� �/�/�����0I�J�D��z�z�$�������0I�J�J���-�-�/�����W�%��)�)�+��>�>�@�D� �/�/�����0H�I�D��}�}�d�V�T�_�_�W�-E�F�F���!�!�"=�t�y�y�?Q�?Q�Rr c	���|j�}|jxdk(r�|jd�|j�}|jd�|j	�}|jd�r7|j	�}t
j||||j|��St
j||d|j|��Sdk(rq|jd�|j�}|jd�|j	�}tt
j|||j|���S	|jd|j|��y)Nr�r�r��ELSEr�zInvalid selection statement)r�rur��_parse_expressionr�r�r�IfrMr�SwitchrK)rrO�cond�	then_stmt�	else_stmtrGr�s       rr�z"CParser._parse_selection_statementms���m�m�o���h�h�����X�&��-�-�/�����X�&� �?�?�A�	��<�<��'� $� C� C� E�I� �8�8�D�)�Y����PS�@T�U�U��x�x��i��t���s�7K�L�L�����X�&��-�-�/�����X�&��:�:�<��'����T�4����QT�AU�(V�W�W���!�!�"?����QT�AU�Vr c	�Z�|j�}|jxdk(ri|jd�|j�}|jd�|j	�}tj|||j|��Sxdk(r�|j	�}|jd�|jd�|j�}|jd�|jd�tj|||j|��Sdk(�rk|jd�|j�r�|j�}tj||j|��}|j�}|jd�|j�}|jd�|j	�}tj|||||j|��S|j�}|jd�|j�}|jd�|j�}|jd�|j	�}tj|||||j|��S	|jd|j|��y)Nr�r�r�r�rr�zInvalid iteration statement)r�rur�r�r�r�WhilerM�DoWhiler�r)�DeclList�_parse_expression_opt�ForrK)rrOr�r�r�r��	next_exprs       rr�z"CParser._parse_iteration_statement�s���m�m�o���h�h�����X�&��-�-�/�����X�&��:�:�<���{�{�4��t���s�/C�D�D���:�:�<�����W�%����X�&��-�-�/�����X�&����V�$��}�}�T�4�����1E�F�F�����X�&��+�+�-� �3�3�5�E� �>�>�%�����1E�F�D��5�5�7�D��L�L��(� $� :� :� <�I��L�L��*��>�>�@�D� �9�9�T�4��D�$�/�/�RU�BV�W�W��1�1�3�����V�$��1�1�3�����V�$� �6�6�8�	����X�&��:�:�<���y�y��t�Y��d�o�o�c�>R�S�S���!�!�"?����QT�AU�Vr c��|j�}|jxdk(rR|jd�}|jd�tj|j
|j
|��Sxdk(r6|jd�tj|j
|��Sxdk(r6|jd�tj|j
|��Sdk(r||jd�r%tjd|j
|��S|j�}|jd�tj||j
|��S	|jd|j
|��y)Nr�r�rr�r�r�zInvalid jump statement)
r�rur�r�GotorLrM�Break�Continuer��Returnr�rK)rrOrSrGs    rr�zCParser._parse_jump_statement�s���m�m�o���h�h���<�<��-�����V�$��z�z�(�.�.�$�/�/�#�2F�G�G�����V�$��{�{�4�?�?�3�#7�8�8�����V�$��~�~�d�o�o�c�&:�;�;���<�<��'� �<�<��d�o�o�c�.B�C�C��-�-�/�����V�$��|�|�D�$�/�/�#�*>�?�?���!�!�":�D�O�O�C�<P�Qr c��|j�}|jd�}|�$tj|j	|��S|Sr&)r�r�rr�rM)rrG�semi_toks   rr�z#CParser._parse_expression_statement�sB���)�)�+���<�<��'���<��'�'�����(A�B�B��r c�D�|j�r|j�SyrX)r�r�rZs rr�zCParser._parse_expression_opt�s ���"�"�$��)�)�+�+�r c�0�|j�}|jd�s|S||j�g}|jd�r1|j|j��|jd�r�1tj||j
�Sra�r�r�rYr�ExprListrU�rrG�exprss   rr�zCParser._parse_expression�sx���0�0�2���|�|�G�$��K��t�8�8�:�;���l�l�7�#��L�L��:�:�<�=��l�l�7�#��~�~�e�T�Z�Z�0�0r c��|j�dk(rG|jd�dk(r3|j�|j�}|jd�|S|j	�}|j�rL|j�j}|j�}tj||||j�S|S)Nr�r�rr�)r�r�rr��_parse_conditional_expressionrrLr�r�
AssignmentrU)r�comprG�op�rhss     rr�z$CParser._parse_assignment_expression�s����?�?���(�T�_�_�Q�-?�8�-K��M�M�O��1�1�3�D��L�L��"��K��1�1�3���!�!�#�����&�&�B��3�3�5�C��#�#�B��c�4�:�:�>�>��r c���|j�}|jd�rS|j�}|jd�|j	�}tj||||j�S|S)N�CONDOPrZ)�_parse_binary_expressionr�r�r�rr�	TernaryOprU)rrG�iftrue�iffalses    rrz%CParser._parse_conditional_expression�sb���,�,�.���<�<��!��+�+�-�F��L�L��!��8�8�:�G��?�?�4���$�*�*�E�E��r �min_prec�lhsc���|�|j�}	|j�}|�|jtvr	|St|j}||kr	|S|j}|j�|j�}	|j�}|�|jtvrn-t|j}||kDr|j
||�}nn�Rtj||||j�}��rX)
�_parse_cast_expressionrJru�_BINARY_PRECEDENCErLr�r
r�BinaryOprU)	rrrrO�precrr�next_tok�	next_precs	         rr
z CParser._parse_binary_expression�s����;��-�-�/�C���*�*�,�C��{�c�h�h�.@�@��*�
�)&�c�h�h�/�D��h���$�
�!���B��M�M�O��-�-�/�C���:�:�<���#�x�}�}�<N�'N��.�x�}�}�=�	��t�#��7�7�	�3�G�C����.�.��S�#�s�y�y�9�C�-r c�&�|j�}|�p|\}}}|j�dk(r!|j|�|j�S|j�}t	j
|||j
|��S|j�S)Nr)rr�r�rr�CastrM�_parse_unary_expression)r�resultr�r�rrGs      rrzCParser._parse_cast_expressions����0�0�2����$*�!�C��z���� �H�,����D�!��+�+�-�-��2�2�4���z�z�#�t�T�_�_�Z�-H�I�I��+�+�-�-r c��|j�}|dvrK|j�}|j�}tj|j
||j�S|dvrK|j�}|j�}tj|j
||j�S|dk(r�|j�}|j�}|�6|\}}}tj|j
||j|��S|j�}tj|j
||j|��S|dk(rr|j�}|jd�|j�}|jd�tj|j
||j|��S|j�S)N>�PLUSPLUS�
MINUSMINUS>�AND�NOT�LNOT�PLUS�MINUSr��SIZEOF�_ALIGNOFr�r�)
r�r�rr�UnaryOprLrUrrrMr�r�_parse_postfix_expression)rr�rOrGrr�r#s       rrzCParser._parse_unary_expression4sp���?�?�$���1�1��-�-�/�C��/�/�1�D��=�=����D�$�*�*�=�=��G�G��-�-�/�C��.�.�0�D��=�=����D�$�*�*�=�=��x���-�-�/�C��4�4�6�F��!�"�	��Q���}�}�S�Y�Y��T�_�_�S�5I�J�J��/�/�1�D��=�=����D�$�/�/�#�2F�G�G��z�!��-�-�/�C��L�L��"��'�'�)�C��L�L��"��=�=����C�����1E�F�F��-�-�/�/r c���|j�}|�p|\}}}|jd�rH|j�}|jd�|jd�t	j
||�S|j
|�|j�}	|jd�rC|j�}|jd�t	j|||j�}�U|jd�ri|j�dk(r|j�d}n!|j�}|jd�t	j|||j�}��|j�dvr�|j�}	|j�}
|
jd	vr!|j!d
|j#|
��t	j$|
j&|j#|
��}t	j(||	j&||j�}���|j�dvr@|j�}t	j*d|j&z||j�}���	|S)
NrrKrPr�r�r�r�>�ARROW�PERIOD>r�r�zInvalid struct reference>rr�p)rr��_parse_initializer_listr�r�CompoundLiteralr��_parse_primary_expressionr��ArrayRefrUr�r��_parse_argument_expression_list�FuncCallrurKrMr�rL�	StructRefr%)
rrr�r�r#r�rG�subr��op_tokrS�fieldrOs
             rr&z!CParser._parse_postfix_expressionTs����0�0�2����!�L�C��q��|�|�H�%��3�3�5�����W�%����X�&��,�,�S�$�7�7����D�!��-�-�/����|�|�J�'��,�,�.�����Z�(��~�~�d�C����<����|�|�H�%��?�?�$��0��M�M�O��D��?�?�A�D��L�L��*��~�~�d�D�$�*�*�=������ �$7�7�������=�=�?���=�=�(8�8��%�%�2�D�O�O�H�4M������������1J�K�����t�V�\�\�5�$�*�*�M������ �$>�>��m�m�o���}�}�S�3�9�9�_�d�D�J�J�G�����r c�B�|j�}|dk(r|j�S|tvs|tvs|tvr|j�S|tvr|j�S|tvr|j�S|dk(r3|j�|j�}|jd�|S|dk(r�|j�}|jd�|j�}|jd�|j�}|jd�|j|�}t!j"t!j$|j&|�t!j(||g|�|�S|j+d|j,j.�y)Nr�r�r��OFFSETOFrKzInvalid expression)r�r��
_INT_CONST�_FLOAT_CONST�_CHAR_CONST�_parse_constant�_STRING_LITERAL�_parse_unified_string_literal�
_WSTR_LITERAL�_parse_unified_wstring_literalr�r�r�r�!_parse_offsetof_member_designatorrMrr0r�rLr�rKr>rD)rr�rG�off_tokr��
designatorrUs       rr-z!CParser._parse_primary_expression�sa���?�?�$���t���)�)�+�+��
�"��<�'��;�&��'�'�)�)���&��5�5�7�7��}�$��6�6�8�8��x���M�M�O��)�)�+�D��L�L��"��K��z�!��m�m�o�G��L�L��"��'�'�)�C��L�L��!��?�?�A�J��L�L��"��O�O�G�,�E��>�>��������.�����Z�0�%�8���
�	
���.��	�	�0B�0B�Cr c�Z�|j�}	|jd�r3|j�}tj|d||j�}�E|jd�rC|j�}|j
d�tj|||j�}��	|S)Nr)�.r�r�)�_parse_identifier_or_typeidr�rr1rUr�r�r.)rr^r4rGs    rr?z)CParser._parse_offsetof_member_designator�s����/�/�1����|�|�H�%��8�8�:�����t�S�%����D����|�|�J�'��-�-�/�����Z�(��~�~�d�D�$�*�*�=�����r c���|j�}|g}|jd�r1|j|j��|jd�r�1tj||j
�Srar�rs   rr/z'CParser._parse_argument_expression_list�s[���0�0�2������l�l�7�#��L�L��:�:�<�=��l�l�7�#��~�~�e�T�Z�Z�0�0r c�"�|j�SrX)rrZs rrFz"CParser._parse_constant_expression�s���1�1�3�3r c��|jd�}tj|j|j	|��S)Nr�)r�rr�rLrMr�s  rr�zCParser._parse_identifier�s.���l�l�4� ���x�x��	�	�4�?�?�3�#7�8�8r c���|j�}|jdvr!|jd|j|��t	j
|j|j|��S)N>r�r�zExpected identifier)r�rurKrMrr�rLr�s  rrDz#CParser._parse_identifier_or_typeid�sR���m�m�o���8�8�+�+����3�T�_�_�S�5I�J��x�x��	�	�4�?�?�3�#7�8�8r c��|j�}|jtvr�d}d}|jddD]}|dvr|dz
}�
|dvs�|dz
}�|dkDrt	d��|dkDrt	d��d	|zd
|zz}tj|dz|j|j|��S|jtvrZ|jdd
vrd}n|jddvrd}nd}tj||j|j|��S|jtvr0tjd|j|j|��S|jd|j|��y)Nr���)�l�Lr
)�u�Uz.Constant cannot have more than one u/U suffix.r�z.Constant cannot have more than two l/L suffix.z	unsigned zlong r'rb)�f�F�floatzlong double�double�charzInvalid constant)r�rur7rL�
ValueErrorr�ConstantrMr8r9rK)rrO�u_count�l_count�ch�prefixr�s       rr:zCParser._parse_constant�s_���m�m�o���8�8�z�!��G��G��i�i���n�
!����#��q�L�G��:�%��q�L�G�	
!�
��{� �!Q�R�R���{� �!Q�R�R� �7�*�W�w�->�>�F��>�>�&�5�.�#�)�)�T�_�_�S�=Q�R�R��8�8�|�#��y�y��}�
�*������2��*�,�!�����>�>�!�S�Y�Y�����0D�E�E��8�8�{�"��>�>�&�#�)�)�T�_�_�S�5I�J�J����,�d�o�o�c�.B�Cr c�>�|jd�}tjd|j|j	|��}|j�dk(rH|j
�}|jdd|jddz|_|j�dk(r�H|S)N�STRING_LITERAL�stringrbr
)r�rrUrLrMr�r��rrOr^�tok2s    rr<z%CParser._parse_unified_string_literal�s����l�l�+�,���~�~�h��	�	�4�?�?�3�3G�H���o�o��#3�3��=�=�?�D����C�R��4�:�:�a�b�>�9�D�J��o�o��#3�3��r c���|j�}|jtvr!|jd|j	|��tjd|j|j	|��}|j�tvrY|j�}|jj�dd|jddz|_|j�tvr�Y|S)NzInvalid string literalr\rbr�)
r�rur=rKrMrrUrLr��rstripr]s    rr>z&CParser._parse_unified_wstring_literal�s����m�m�o���8�8�=�(����6�����8L�M��~�~�h��	�	�4�?�?�3�3G�H���o�o��=�0��=�=�?�D����*�*�,�S�b�1�D�J�J�q�r�N�B�D�J��o�o��=�0��r c��|jd�}|rj|jd�r%tjg|j|��S|j	�}|jd�|jd�|S|j
�S)NrrPrK)r�r�InitListrMr+r�r�)rr��	init_lists   rrzCParser._parse_initializerst���\�\�(�+�
���|�|�H�%��~�~�b�$�/�/�*�*E�F�F��4�4�6�I��L�L��!��L�L��"����0�0�2�2r c��|j�g}|jd�rE|j�dk(rn1|j|j��|jd�r�Et	j
||dj�S)NrKrPr)�_parse_initializer_itemr�r�rYrrbrU)rrXs  rr+zCParser._parse_initializer_listso���-�-�/�0���l�l�7�#���� �H�,���L�L��5�5�7�8��l�l�7�#��~�~�e�U�1�X�^�^�4�4r c��d}|j�dvr|j�}|j�}|�tj||�S|S�N>r)r�)r��_parse_designationrr�NamedInitializer)r�designationr�s   rrezCParser._parse_initializer_item%sQ�����?�?�� 6�6��1�1�3�K��&�&�(���"��)�)�+�t�<�<��r c�H�|j�}|jd�|S)Nr)�_parse_designator_listr��r�designatorss  rrhzCParser._parse_designation/s"���1�1�3�����X���r c��g}|j�dvr2|j|j��|j�dvr�2|Srg)r�rY�_parse_designatorrms  rrlzCParser._parse_designator_list5sF�����o�o��#9�9����t�5�5�7�8��o�o��#9�9��r c��|jd�r#|j�}|jd�|S|jd�r|j�S|j	d|j
j�y)Nr�r�r)zInvalid designator)r�rFr�rDrKr>rD)rrGs  rrpzCParser._parse_designator=sc���<�<�
�#��2�2�4�D��L�L��$��K��<�<��!��3�3�5�5����.��	�	�0B�0B�Cr c�h�|jd�}|jd|j|��y)Nr
zDirectives not supported yet)r�rKrMr�s  rrzCParser._parse_pp_directiveJs*���l�l�8�$�����8�$�/�/�#�:N�Or c�x�|j�dk(r�|j�}|j�dk(r?|j�}tj|j|j|��Stjd|j|��S|j�dk(rg|j�}|j
d�}|j�}|j
d�tj||j|��S|jd|jj�y)Nr�PPPRAGMASTRr-rr�r�zInvalid pragma)r�r�r�PragmarLrMr�r<rKr>rD)rrO�str_tok�lparen�literals     rrz!CParser._parse_pppragma_directivePs����?�?��
�*��-�-�/�C���� �M�1��-�-�/���|�|�G�M�M�4�?�?�7�3K�L�L��<�<��D�O�O�C�$8�9�9��?�?��	�)��-�-�/�C��\�\�(�+�F��8�8�:�G��L�L��"��<�<������)@�A�A����*�D�I�I�,>�,>�?r c��g}|j�dvr2|j|j��|j�dvr�2|S)N>rr)r�rYr)rr�s  rr�z&CParser._parse_pppragma_directive_listbsC�����o�o��#:�:��N�N�4�9�9�;�<��o�o��#:�:��r c��|jd�}|jd�|j�}d}|jd�r|j�}|jd�t	j
|||j
|��gS)Nrr�rKr�)r�rFr�r<r�StaticAssertrM)rrOr�rTs    rrzCParser._parse_static_assertisw���l�l�+�,�����X���.�.�0�����<�<�� ��4�4�6�C����X���"�"�4��d�o�o�c�.B�C�D�Dr )r-FrX)rN)F�r
)FF)rr�r�)rr�)T)rN)�r!r"r#r$r�boolrur%rCrrrPr'r	rrSrrKr[r_rfrhrmr:r;r<r=rr]r{r�r�r�rr�r�r�r�r�rrJr�r�r�r�r�r�rMr�r�r�r�r
r�r�r�r�rrrIrr
r)r'rrrrArCr7r8rrLr<rQrWr\rbr=rerhrNr�r�r�rur|r�r�r�r�r{r�r�r�r�r�r�r�rr�r�r�r�r�r�r�r�rr�r�r�r�r�r�r�r�rr
rrr&r-r?r/rFr�rDr:r<r>rr+rerhrlrprrr�rr(r rr,r,2s��	�"�$�(�"�*� ��=��=��F�|�=��	=�
�=��
=��=��=�
�=�:<A����#&��48��	����8J�S�J�(�3�-�J�5�J�,��,�E�C�K�$�,>�,�8�,�)� �+�c�+�(�5�/�+�d�+�	,�C�	,����	,�D�	,��c��d��:�3�:�c�:�3�:�4�:���,�#�,�$�,�T�c��S��U�Z�Z��X&��j�j�5�=�=�(�5�>�>�9�&��s�)�&�
���e�m�m�	#�e�n�n�	4�	&�Z���;�'�����	�
��
�
�4#(�	e��e��K� �e� �	e�

�e�j�j�	�e�N
��
��j�j�
��d�5�:�:�.�/�	
�
�j�j�
�
���

�*�����$�s�$�8�F�#3�$�5�C�5���
�5�
�&��	�#�	�(�6�*:�	��#��&��#�s�#�!�3�!�4�!�3�f�3��3�'�x��'7�'�4�'�.�h�v�&6�.�$�.�)�4�)�,�$�,�4�,�#�E�(�3�-��2E�,F�#�NS��"��FJ��	�x��
�
�#�T�)�	*��6!�E�(�3�-��2E�,F�!�F;�D�;�?�4�?�%�	�%�����V�3�4�	5�%�6=�%�-�-�=���e�j�j�)9��M�T�%�*�*�-=�M�l�D����$4��?�$�u�z�z�"2�?�'��'�+/�'�	
�e�j�j�	�'�T��e�j�j�)9��%*�v+�!�v+�	�{�D�(�5�/�1�	2�v+�v`�F�D��I��9�E�J�J�9������DI���k�*��<@��	
�k�	��8�d�8�{�8�T�%�*�*�T�B��U�Z�Z�0@��
�8�D����4D�+E�
�D�t�K�/@��=�$=�u�z�z�=�"��
�
���5�:�:���5�:�:��H�e�j�j�H�L�%�*�*�L�M�%�*�*�M��3��T��e�j�j��.2�/��/�&*�/�	���/�*������
�
��T�5�:�:�T�%�*�*�T�IM�7(�!�%�*�*�-�7(�6>�u�o�7(�	���7(�t�e�j�j��U�Z�Z��4����� 4��"�E�O�O���u����I�e�j�j�I�&<��<�'/��
�
�';�<�IQ�RW��<�	���<�,-�H�U�Z�Z�,@�-���
�
��V�%�.�.�V�(
�����0D�
�$/�5�:�:�/�.1�����0I�1�
�E�J�J�
�:�%�*�*�t�E�J�J�/?�"?�:�.'��
�
�T�%�*�*�=M�0M�'�'�5�:�:��U�Z�Z�0@�#@�'�
��U�Z�Z�(8�
�
�5�:�:�
�S�%�*�*�S�BW�E�J�J�W�2&W�E�J�J�&W�TR�u�z�z�R�.�U�Z�Z���x��
�
�';��1�5�:�:�1��e�j�j�� �u�z�z��>B����&.�u�z�z�&:��	����D.��
�
�.�*0����0�@.�5�:�:�.�d!D�5�:�:�!D�J
�5�:�:�
� 1����1�4�E�J�J�4�9�5�:�:�9�
9�U�Z�Z�9�D����D�@�u�z�z����
�
�� 
3�E�J�J�
3�5����5�������D����$4����U�Z�Z�(8��D�5�:�:�D�P�X�P�@�5�:�:�@�$��U�Z�Z�0@��E�d�5�:�:�&6�Er r,>r�OREQUAL�ANDEQUAL�DIVEQUAL�MODEQUAL�XOREQUAL�	PLUSEQUAL�
MINUSEQUAL�
TIMESEQUAL�LSHIFTEQUAL�RSHIFTEQUAL�LOR�LAND�ORr��XOR�r��EQ��NE�GT��GE�LT�LE�RSHIFT��LSHIFTr!�r"r��	�DIVIDE�MOD>�AUTO�EXTERNr��TYPEDEF�REGISTER�
_THREAD_LOCAL�INLINE�	_NORETURN>�CONSTr3�RESTRICT�VOLATILE>�INT�CHAR�LONG�VOID�FLOAT�SHORT�_BOOL�DOUBLE�SIGNED�UNSIGNED�_COMPLEX�__INT128>r6r4r5r�r3r1>
r�rrr r!r"r�r�r#r6rr$r>�
INT_CONST_BIN�
INT_CONST_DEC�
INT_CONST_HEX�
INT_CONST_OCT�INT_CONST_CHAR�FLOAT_CONST�HEX_FLOAT_CONST>�
CHAR_CONST�WCHAR_CONST�U8CHAR_CONST�
U16CHAR_CONST�
U32CHAR_CONSTr[>�WSTRING_LITERAL�U8STRING_LITERAL�U16STRING_LITERAL�U32STRING_LITERAL>r�r�r�r�r�rr�r�rr�r�r�rr�rrc�v�eZdZdZdeddfd�Zddedeefd�Z	deefd�Z
defd	�Zd
eddfd�Zdeddfd
�Z
y)rAz�Wraps a lexer to provide convenient, buffered access to the underlying
    token stream. The lexer is expected to be initialized with the input
    string already.
    r/rNc�.�||_g|_d|_y)Nr)�_lexer�_buffer�_index)rr/s  rrCz_TokenStream.__init__	s�����/1�����r r�c�n�|dkry|j|�|j|j|zdz
S)z�Peek at the k-th next token in the stream, without consuming it.

        Examples:
            k=1 returns the immediate next token.
            k=2 returns the token after that.
        rNr
��_fillr�r�r�s  rr�z_TokenStream.peek
	s5��
��6���
�
�1�
��|�|�D�K�K�!�O�a�/�0�0r c��|jd�|j|j}|xjdz
c_|S)z%Consume a single token and return it.r
r�r�s  rr�z_TokenStream.next	s2���
�
�1�
��l�l�4�;�;�'�����q����
r c��|jSrX�r�rZs rr�z_TokenStream.mark"	s���{�{�r r�c��||_yrXr�r�s  rr�z_TokenStream.reset%	s	����r �nc��t|j�|j|zkr_|jj	�}|jj|�|�yt|j�|j|zkr�^yyrX)r]r�r�r�r�rY)rr�rOs   rr�z_TokenStream._fill(	sb���$�,�,��$�+�+��/�1��+�+�#�#�%�C��L�L����$��{��	�$�,�,��$�+�+��/�1r r|)r!r"r#r$rrCr'r	rr�r�r�r�r�r(r rrArA�su���
�f����

1�c�
1�(�6�"2�
1��h�v�&���c���#��$���s��t�r rAc�^�eZdZUeeed<eeed<eeed<eeed<eeed<y)r�r�r�rur�r�N)r!r"r#rrr&r(r rr�r�6	s2��
�s�)�O�
�#�Y��
�s�)�O��3�i���C�y�r r�r�c�z�eZdZUeej
ed<eej
ed<eej
ed<y)r�rrr�r�N)r!r"r#r	rr]r&r(r rr�r�A	s1��
�5�:�:�
��
�5�:�:�
��
�e�j�j�
!�!r r�N)+�dataclassesr�typingrrrrrr	r
rrr-r�c_lexerrr�ast_transformsrrr�	Exceptionr*r,r�rr9r:r�r;r��_EXPR_STARTr7r8r9r;r=r�r�rAr�r�r�r(r r�<module>r�s.��"�
�
�
��#�C������$	��	� E� E�DB��"�	�1��
�A��	�!��
�1�	�

�1��	�!�
�	�!��	�!��	�!��	�!��	�!��
�a��
�a���A���Q�� �Q�!�"
�a�#�$
�1�%��*V���K�(��>��
�� �������C�	C���� �
��0�1����$�$���
���������	�
�����(.�.�n�	���J�K�
�"�	�"r