
    !i                     b   S r SSKrSSKrSSKrSSKrSSKrSSKrSSKrSSK	r	SSK
JrJr  SSKJrJr  SSKJrJrJrJrJrJr  \R.                  " \5      r\r " S S5      rS rS	 r " S
 S\5      r " S S5      r  " S S\ 5      r! " S S\!5      r" " S S\"5      r# " S S\ 5      r$ " S S\ 5      r% " S S\ 5      r& " S S\&\$5      r' " S S\&\!5      r( " S S\&\%5      r) " S  S!\$5      r* " S" S#\ 5      r+ " S$ S%\ 5      r, " S& S'\+\$5      r- " S( S)\,\%5      r. " S* S+\+\!5      r/\#\"\*\-\/\.S,.r0g)-a  Response parsers for the various protocol types.

The module contains classes that can take an HTTP response, and given
an output shape, parse the response into a dict according to the
rules in the output shape.

There are many similarities amongst the different protocols with regard
to response parsing, and the code is structured in a way to avoid
code duplication when possible.  The diagram below is a diagram
showing the inheritance hierarchy of the response classes.

::


                                +-------------------+
                                |   ResponseParser  |
                                +-------------------+
                                ^    ^    ^   ^   ^
                                |    |    |   |   |
                                |    |    |   |   +--------------------------------------------+
                                |    |    |   +-----------------------------+                  |
                                |    |    |                                 |                  |
           +--------------------+    |    +----------------+                |                  |
           |                         |                     |                |                  |
+----------+----------+       +------+-------+     +-------+------+  +------+-------+   +------+--------+
|BaseXMLResponseParser|       |BaseRestParser|     |BaseJSONParser|  |BaseCBORParser|   |BaseRpcV2Parser|
+---------------------+       +--------------+     +--------------+  +----------+---+   +-+-------------+
          ^         ^          ^           ^        ^        ^                  ^         ^
          |         |          |           |        |        |                  |         |
          |         |          |           |        |        |                  |         |
          |        ++----------+-+       +-+--------+---+    |              +---+---------+-+
          |        |RestXMLParser|       |RestJSONParser|    |              |RpcV2CBORParser|
    +-----+-----+  +-------------+       +--------------+    |              +---+---------+-+
    |QueryParser|                                            |
    +-----------+                                       +----+-----+
                                                        |JSONParser|
                                                        +----------+

The diagram above shows that there is a base class, ``ResponseParser`` that
contains logic that is similar amongst all the different protocols (``query``,
``json``, ``rest-json``, ``rest-xml``, ``smithy-rpc-v2-cbor``).  Amongst the various services
there is shared logic that can be grouped several ways:

* The ``query`` and ``rest-xml`` both have XML bodies that are parsed in the
  same way.
* The ``json`` and ``rest-json`` protocols both have JSON bodies that are
  parsed in the same way.
* The ``rest-json`` and ``rest-xml`` protocols have additional attributes
  besides body parameters that are parsed the same (headers, query string,
  status code).

This is reflected in the class diagram above.  The ``BaseXMLResponseParser``
and the BaseJSONParser contain logic for parsing the XML/JSON body,
and the BaseRestParser contains logic for parsing out attributes that
come from other parts of the HTTP response.  Classes like the
``RestXMLParser`` inherit from the ``BaseXMLResponseParser`` to get the
XML body parsing logic and the ``BaseRestParser`` to get the HTTP
header/status code/query string parsing.

Additionally, there are event stream parsers that are used by the other parsers
to wrap streaming bodies that represent a stream of events. The
BaseEventStreamParser extends from ResponseParser and defines the logic for
parsing values from the headers and payload of a message from the underlying
binary encoding protocol. Currently, event streams support parsing bodies
encoded as JSON and XML through the following hierarchy.


                                  +--------------+
                                  |ResponseParser|
                                  +--------------+
                                    ^    ^    ^
               +--------------------+    |    +------------------+
               |                         |                       |
    +----------+----------+   +----------+----------+    +-------+------+
    |BaseXMLResponseParser|   |BaseEventStreamParser|    |BaseJSONParser|
    +---------------------+   +---------------------+    +--------------+
                     ^                ^        ^                 ^
                     |                |        |                 |
                     |                |        |                 |
                   +-+----------------+-+    +-+-----------------+-+
                   |EventStreamXMLParser|    |EventStreamJSONParser|
                   +--------------------+    +---------------------+

Return Values
=============

Each call to ``parse()`` returns a dict has this form::

    Standard Response

    {
      "ResponseMetadata": {"RequestId": <requestid>}
      <response keys>
    }

    Error response

    {
      "ResponseMetadata": {"RequestId": <requestid>}
      "Error": {
        "Code": <string>,
        "Message": <string>,
        "Type": <string>,
        <additional keys>
      }
    }

    N)ETreeXMLParseError)EventStreamNoInitialResponseError)CachedPropertyensure_booleanis_json_value_headerlowercase_dictmerge_dictsparse_timestampc                   &    \ rS rSrS rS rS rSrg)ResponseParserFactory   c                     0 U l         g N	_defaultsselfs    O/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/botocore/parsers.py__init__ResponseParserFactory.__init__   s	        c                 :    U R                   R                  U5        g)a'  Set default arguments when a parser instance is created.

You can specify any kwargs that are allowed by a ResponseParser
class.  There are currently two arguments:

    * timestamp_parser - A callable that can parse a timestamp string
    * blob_parser - A callable that can parse a blob type

N)r   update)r   kwargss     r   set_parser_defaults)ResponseParserFactory.set_parser_defaults   s     	f%r   c                 8    [         U   nU" S0 U R                  D6$ )N )PROTOCOL_PARSERSr   )r   protocol_name
parser_clss      r   create_parser#ResponseParserFactory.create_parser   s    %m4
+DNN++r   r   N)__name__
__module____qualname____firstlineno__r   r   r$   __static_attributes__r    r   r   r   r      s    
&,r   r   c                 4    [        5       R                  U 5      $ r   )r   r$   )protocols    r   r$   r$      s     "00::r   c                    ^  U 4S jnU$ )Nc                 `   > [        US5      (       a  UR                  nUc  SnOUnT" XU5      $ )Ntext )hasattrr/   )r   shapenode_or_stringr/   funcs       r   _get_text_content(_text_content.<locals>._get_text_content   s:    >6**!&&D| !DD&&r   r    )r4   r5   s   ` r   _text_contentr7      s    
' r   c                       \ rS rSrSrg)ResponseParserError   r    N)r&   r'   r(   r)   r*   r    r   r   r9   r9      s    r   r9   c                       \ rS rSrSrSrSrSrSS jrS r	S r
S	 rS
 rS rS rS rS rS rS rS rS rS rS rS rS rS rSrg)ResponseParser   aS  Base class for response parsing.

This class represents the interface that all ResponseParsers for the
various protocols must implement.

This class will take an HTTP response and a model shape and parse the
HTTP response into a dictionary.

There is a single public method exposed: ``parse``.  See the ``parse``
docstring for more info.

utf-8N)headerheaders
statusCodec                     Uc  [         nXl        Uc  U R                  nX l        S U l        U R
                  b  U R                  X5      U l        g g r   )DEFAULT_TIMESTAMP_PARSER_timestamp_parser_default_blob_parser_blob_parser_event_stream_parserEVENT_STREAM_PARSER_CLS)r   timestamp_parserblob_parsers      r   r   ResponseParser.__init__   sZ    #7!133K'$(!''3(,(D(D )D% 4r   c                 .    [         R                  " U5      $ r   )base64	b64decoder   values     r   rE   #ResponseParser._default_blob_parser   s     &&r   c                 d   [         R                  SUS   5        [         R                  SUS   5        US   S:  ac  U R                  U5      (       a  U R                  U5      nOLU R	                  U5      (       a  U R                  X5      nU$ U R                  X5      nOU R                  X5      nU(       a"  UR                  R                  S5      (       a  U$ [        U[        5      (       aB  UR                  S0 5      nUS   US	'   US   n[        U5      US
'   XCS'   U R                  X5        U$ )a  Parse the HTTP response given a shape.

:param response: The HTTP response dictionary.  This is a dictionary
    that represents the HTTP request.  The dictionary must have the
    following keys, ``body``, ``headers``, and ``status_code``.

:param shape: The model shape describing the expected output.
:return: Returns a dictionary representing the parsed response
    described by the model.  In addition to the shape described from
    the model, each response will also have a ``ResponseMetadata``
    which contains metadata about the response, which contains at least
    two keys containing ``RequestId`` and ``HTTPStatusCode``.  Some
    responses may populate additional keys, but ``RequestId`` will
    always be present.

zResponse headers: %rr@   zResponse body:
%rbodystatus_codei-  eventstreamResponseMetadataHTTPStatusCodeHTTPHeaders)LOGdebug_is_generic_error_response_do_generic_error_parse_is_modeled_error_shape_do_modeled_error_parse_do_error_parse	_do_parseserializationget
isinstancedictr
   _add_checksum_response_metadata)r   responser2   parsedresponse_metadatar@   s         r   parseResponseParser.parse   s(   " 			((9*=>		&(89M"c)..x8855h?--e4455hF--h>^^H4F U((,,];;M fd## &

+=r B2:=2I./ y)G/=g/Fm,):%&00Mr   c                     UR                  S0 5      R                  S0 5      nUR                  S5      nU(       a  XBS'   g g )Ncontextchecksumresponse_algorithmChecksumAlgorithmrb   )r   rf   rh   checksum_context	algorithms        r   re   .ResponseParser._add_checksum_response_metadata  sB    #<<	26:::rJ$(()=>	5>12 r   c                 P    US L=(       a    UR                   R                  SS5      $ )N	exceptionF)metadatarb   )r   r2   s     r   r]   &ResponseParser._is_modeled_error_shape%  s#    D KU^^%7%7U%KKr   c                     US   S:  a?  SU;  d  US   c  gUS   R                  5       nUR                  S5      =(       d    U(       + $ g )NrT   i  rS   Ts   <html>)strip
startswith)r   rf   rS   s      r   r[   )ResponseParser._is_generic_error_response(  sT     M"c)X%&)9)AF#))+D??9-9T9 *r   c                     [         R                  S5        [        US   5      [        R                  R
                  R                  US   S5      S.0 S.$ )NzlReceived a non protocol specific error response from the service, unable to populate error code and message.rT   r0   CodeMessageErrorrV   )rY   rZ   strhttpclient	responsesrb   r   rf   s     r   r\   &ResponseParser._do_generic_error_parse;  s[     			B	
 H]34;;0044]+R !#
 	
r   c                 F    [        U R                  R                   S35      e)Nz
._do_parseNotImplementedError	__class__r&   r   rf   r2   s      r   r`   ResponseParser._do_parseL  s    !T^^%<%<$=Z"HIIr   c                 F    [        U R                  R                   S35      e)Nz._do_error_parser   r   s      r   r_   ResponseParser._do_error_parseO  s     !T^^%<%<$==M"NOOr   c                 F    [        U R                  R                   S35      e)Nz._do_modeled_error_parser   )r   rf   r2   rg   s       r   r^   &ResponseParser._do_modeled_error_parseR  s%    !~~&&''?@
 	
r   c                 Z    [        U SUR                   3U R                  5      nU" X5      $ )N_handle_)getattr	type_name_default_handle)r   r2   nodehandlers       r   _parse_shapeResponseParser._parse_shapeW  s2    HU__-.0D0D
 u##r   c                     / nUR                   nU H9  nUc  UR                  S 5        M  UR                  U R                  XE5      5        M;     U$ r   )memberappendr   )r   r2   r   rg   member_shapeitems         r   _handle_listResponseParser._handle_list]  sM     ||D |d#d//CD  r   c                     U$ r   r    r   r2   rP   s      r   r   ResponseParser._default_handlek  s    r   c                 b    U R                   nUS   R                  S5      n[        US   X#U5      $ )Nrl   operation_namerS   )rG   rb   r   )r   rf   r2   parsernames        r   _create_event_stream#ResponseParser._create_event_streamn  s7    **	"&&'788F+UDAAr   c                     [        U5      S   $ Nr   )listrO   s     r   _get_first_keyResponseParser._get_first_keys  s    E{1~r   c                    UR                   (       a  UR                  5       nUR                  SS 5        UR                  5        VVs0 s H  u  pEUc  M
  XE_M     nnn[	        U5      S:w  a  Sn[        XaR                  -  5      eU R                  U5      nUR                   Vs/ s H,  nUR                  U   R                  R                  SU5      PM.     n	nXy;  a  [        R                  SU5        ggs  snnf s  snf )N__type   CInvalid service response: %s must have one and only one member set.r   zqReceived a tagged union response with member unknown to client: %s. Please upgrade SDK for full response support.TF)is_tagged_unioncopypopitemslenr9   r   r   membersra   rb   rY   info)
r   r2   rP   cleaned_valuekv	error_msgtagr   serialized_member_namess
             r    _has_unknown_tagged_union_member/ResponseParser._has_unknown_tagged_union_memberv  s     !JJLMh-!.!4!4!6!6!!6   =!Q&&  *)jj*@AA%%m4C $mm'+F f%3377G+ $ ' 1D
 +'s   	C6C6$3C<c                     SSU00$ )NSDK_UNKNOWN_MEMBERr   r    )r   r   s     r   #_handle_unknown_tagged_union_member2ResponseParser._handle_unknown_tagged_union_member  s    $vsm44r   c                     US   nUR                  S5      n[        U5      S:X  a!  US   (       a  XS   S'   US   US   S'   US   $ U$ )	z
Error response may contain an x-amzn-query-error header to translate
errors codes from former `query` services into other protocols. We use this
to do our lookup in the errorfactory for modeled errors.
x-amzn-query-error;   r   r   QueryErrorCoder   Type)splitr   )r   coder@   errorquery_errorquery_error_componentss         r    _do_query_compatible_error_parse/ResponseParser._do_query_compatible_error_parse  sf     23!,!2!23!7%&!+0Fq0I/3'N+,%;A%>E'N6")!,,r   )rF   rG   rD   NN)r&   r'   r(   r)   __doc__DEFAULT_ENCODINGrH   KNOWN_LOCATIONSr   rE   ri   re   r]   r[   r\   r`   r_   r^   r   r   r   r   r   r   r   r   r*   r    r   r   r<   r<      s{     "
 :O'/b?L:&
"JP

$B
65r   r<   c                      ^  \ rS rSrSU 4S jjrS rS rU 4S jrS rS r	S r
S	 rS
 rS r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       r\r\r\rSrU =r$ )BaseXMLResponseParseri  c                 Z   > [         TU ]  X5        [        R                  " S5      U l        g )Nz{.*})superr   recompile_namespace_re)r   rI   rJ   r   s      r   r   BaseXMLResponseParser.__init__  s"    )7ZZ/r   c                    0 nUR                   nUR                  nUR                  R                  S5      =(       d    SnUR                  R                  S5      =(       d    SnUR                  R                  S5      (       a  [	        U[
        5      (       d  U/nU H^  nU HP  n	U R                  U	5      n
X:X  a  U R                  XI5      nM,  X:X  a  U R                  XY5      nMD  [        SU
 35      e   WUW'   M`     U$ )Nr   keyrP   	flattenedzUnknown tag: )	r   rP   ra   rb   rc   r   	_node_tagr   r9   )r   r2   r   rg   	key_shapevalue_shapekey_location_namevalue_location_namekeyval_nodesingle_pairtag_namekey_nameval_names                r   _handle_map!BaseXMLResponseParser._handle_map  s    II	kk%3377?H5)77;;FCNw"";//
48N8N6DK*>>+60#00HH4#00JH-hZ.HII  +  (F8   r   c                 N    U R                   R                  SUR                  5      $ Nr0   )r   subr   )r   r   s     r   r   BaseXMLResponseParser._node_tag  s    !!%%b$((33r   c                    > UR                   R                  S5      (       a  [        U[        5      (       d  U/n[        TU ]  X5      $ )Nr   )ra   rb   rc   r   r   r   )r   r2   r   r   s      r   r   "BaseXMLResponseParser._handle_list  s?     "";//
48N8N6Dw#E00r   c                 t   0 nUR                   nUR                  R                  SS5      (       a  U R                  U5      nU R	                  U5      nU R                  X5      (       a"  U R                  U5      nU R                  U5      $ U GH'  nXG   nUR                  R                  S5      n	XR                  ;   d   UR                  R                  S5      (       a  MT  U R                  X5      n
UR                  U
5      nUb  U R                  X5      X7'   M  UR                  R                  S5      (       d  M  0 nUR                  S   nUR                  R                  5        H:  u  pU R                  R                  UR!                  S5      S   S-   U5      nXU'   M<     X;   d  GM!  X   X7'   GM*     U$ )	Nru   FlocationeventheaderxmlAttributer   :r   )r   rv   rb   _get_error_root_build_name_to_xml_noder   r   r   ra   r   _member_key_namer   attribr   r   r   r   )r   r2   r   rg   r   xml_dictr   member_namer   r   xml_namemember_nodeattribslocation_namer   rP   new_keys                    r   _handle_structure'BaseXMLResponseParser._handle_structure  s   -->>k511''-D//500AA%%h/C;;C@@"K"/L#1155jAH000--11-@@ ,,\GH",,x0K&&*&7&7 '# ++//?? , : :6 B"&++"3"3"5JC"0044%++C03c93G (-G$	 #6
 !+*1*@F'3 #4 r   c                 t    U R                  U5      S:X  a"  U H  nU R                  U5      S:X  d  M  Us  $    U$ )NErrorResponser   r   )r   original_rootchilds      r   r   %BaseXMLResponseParser._get_error_root  s;    >>-(O;&>>%(G3 L ' r   c                     UR                   S:X  aJ  UR                  R                  S5      (       a*  UR                  R                  R                  S5      nUb  U$ UR                  R                  S5      nUb  U$ U$ )Nr   r   r   )r   ra   rb   r   )r   r2   r   list_member_serialized_nameserialized_names        r   r   &BaseXMLResponseParser._member_key_name  sz    
 ??f$)<)<)@)@)M)M*/,,*D*D*H*H+' +622--11&9&""r   c                    [        U[        5      (       a  U R                  US   5      $ 0 nU HS  nU R                  U5      nXB;   a6  [        X$   [        5      (       a  X$   R	                  U5        ME  X$   U/X$'   MO  X2U'   MU     U$ r   )rc   r   r   r   r   )r   parent_noder   r   r   s        r   r   -BaseXMLResponseParser._build_name_to_xml_node  s     k4((//A??D..&C
 hmT22M((. &.]D$9HM $   r   c                      [         R                  " [         R                  " 5       U R                  S9nUR	                  U5        UR                  5       nU$ ! [         a  n[        SU SU 35      eS nAff = f)N)targetencodingzUnable to parse response (z6), invalid XML received. Further retries may succeed:
)r   	XMLParserTreeBuilderr   feedcloser   r9   )r   
xml_stringr   rootes        r   _parse_xml_string_to_dom.BaseXMLResponseParser._parse_xml_string_to_dom  s    
	__((*T5J5JF KK
#<<>D   	%,QC 0GGQlT 	s   AA 
A7!A22A7c                     UR                  5        HI  u  p#[        U5      (       a&  U R                  U5      nU R                  U5      X'   M;  UR                  X'   MK     U$ r   )r   r   r   _replace_nodesr/   )r   rg   r   rP   sub_dicts        r   r!  $BaseXMLResponseParser._replace_nodes,  sQ     ,,.JCE{{77>"11(;#jj ) r   c                     US:X  a  gg)NtrueTFr    r   r2   r/   s      r   _handle_boolean%BaseXMLResponseParser._handle_boolean5  s    6>r   c                     [        U5      $ r   floatr&  s      r   _handle_float#BaseXMLResponseParser._handle_float<  s    T{r   c                 $    U R                  U5      $ r   rD   r&  s      r   _handle_timestamp'BaseXMLResponseParser._handle_timestamp@  s    %%d++r   c                     [        U5      $ r   intr&  s      r   _handle_integer%BaseXMLResponseParser._handle_integerD  s    4yr   c                     U$ r   r    r&  s      r   _handle_string$BaseXMLResponseParser._handle_stringH  s    r   c                 $    U R                  U5      $ r   rF   r&  s      r   _handle_blob"BaseXMLResponseParser._handle_blobL  s      &&r   )r   r   )r&   r'   r(   r)   r   r   r   r   r  r   r   r   r  r!  r7   r'  r,  r0  r5  r8  r<  _handle_character_handle_double_handle_longr*   __classcell__r   s   @r   r   r     s    0*41#J .     , ,     ' ' '"N"Lr   r   c                   <    \ rS rSrS rS rS rS
S jrS rS r	Sr
g	)QueryParseriU  c                     US   nU R                  U5      nU R                  U5      nU R                  U5        SU;   a   UR                  UR	                  S5      5        SU;   a  SUR	                  S5      0US'   U$ )NrS   Errors	RequestIdrV   )r  r   r!  r   r   )r   rf   r2   xml_contentsr  rg   s         r   r_   QueryParser._do_error_parseV  s    ',,\:--d3F# vMM&**X./& *5vzz+7N)OF%&r   c                 "    U R                  XSS9$ )NFinject_metadata_parse_body_as_xmlr   s      r   r^   #QueryParser._do_modeled_error_parsef  s    &&x&NNr   c                 "    U R                  XSS9$ )NTrK  rM  r   s      r   r`   QueryParser._do_parsei  s    &&x&MMr   c                     US   nU R                  U5      n0 nUbB  UnSUR                  ;   a  U R                  UR                  S   U5      nU R                  X'5      nU(       a  U R	                  XV5        U$ )NrS   resultWrapper)r  ra   _find_result_wrapped_shaper   _inject_response_metadata)r   rf   r2   rL  rH  r  rg   starts           r   rN  QueryParser._parse_body_as_xmll  s    ',,\:E%"5"5577''8$ &&u4F**48r   c                 ,    U R                  U5      nX1   $ r   )r   )r   element_namexml_root_nodemappings       r   rT  &QueryParser._find_result_wrapped_shape{  s    ..}=$$r   c                     U R                  U5      nUR                  S5      nUb=  U R                  U5      nUR                  5        H  u  pgUR                  XV'   M     XRS'   g g NrV   )r   rb   r   r/   )r   r   inject_intor[  
child_nodesub_mappingr   rP   s           r   rU  %QueryParser._inject_response_metadata  sf    ..t4[[!34
!66zBK)//1
#(::  2.9*+	 "r   r    N)T)r&   r'   r(   r)   r_   r^   r`   rN  rT  rU  r*   r    r   r   rD  rD  U  s"     ON%:r   rD  c                   4   ^  \ rS rSrS rU 4S jrS rSrU =r$ )EC2QueryParseri  c                 r    U R                  U5      nUR                  S5      nUb  SUR                  0US'   g g )N	requestIdrG  rV   )r   rb   r/   )r   r   r_  r[  r`  s        r   rU  (EC2QueryParser._inject_response_metadata  s?    ..t4[[-
!/:JOO.LK*+ "r   c                 ^   > [         TU ]  X5      nSU;   a  SUR                  S5      0US'   U$ )N	RequestIDrG  rV   )r   r_   r   )r   rf   r2   originalr   s       r   r_   EC2QueryParser._do_error_parse  s>     7*8;("X\\+6,H'( r   c                     U H>  nU R                  U5      S:X  d  M  U H  nU R                  U5      S:X  d  M  Us  s  $    M@     U$ )NrF  r   r	  )r   r
  r  errors_childs       r   r   EC2QueryParser._get_error_root  sF    "E~~e$0$)L~~l3w>++ %* #
 r   r    )	r&   r'   r(   r)   rU  r_   r   r*   rA  rB  s   @r   rd  rd    s    M( r   rd  c                   >    \ rS rSrS rS rS rS rS rS r	S r
S	rg
)BaseJSONParseri  c                 r   0 nUR                   (       a  UnU$ UR                  nUc  g 0 nU R                  X5      (       a"  U R                  U5      nU R	                  U5      $ U HO  nXF   nUR
                  R                  SU5      nUR                  U5      n	U	c  M9  U R                  XF   U	5      X6'   MQ     U$ )Nr   )is_document_typer   r   r   r   ra   rb   r   )
r   r2   rP   final_parsedmember_shapesr   r   r   	json_name	raw_values
             r   r   BaseJSONParser._handle_structure  s    !! L( % "MMM} L44UBB))%0??DD,,9(66::6;O	!IIi0	(040A0A%2I1L-  - r   c                     0 nUR                   nUR                  nUR                  5        H+  u  pbU R                  XF5      nU R                  XR5      nXU'   M-     U$ r   )r   rP   r   r   )	r   r2   rP   rg   r   r   r   
actual_keyactual_values	            r   r   BaseJSONParser._handle_map  sZ    II	kk++-JC**9:J,,[@L!-: ( r   c                 $    U R                  U5      $ r   r;  r   s      r   r<  BaseJSONParser._handle_blob  s      ''r   c                 $    U R                  U5      $ r   r/  r   s      r   r0   BaseJSONParser._handle_timestamp  s    %%e,,r   c                    U R                  US   5      nSSS.0 S.nUS   nUR                  SUR                  SS5      5      US   S'   UR                  S	5      nUR                  S
U=(       a    [        U5      5      nUbU  SU;   a  UR                  SS5      S   nSU;   a  UR	                  SS5      S   nSU;   a  U R                  XuU5      nXtS   S'   U R                  XAS   5        U$ )NrS   r0   r   r~   r   r@   messager   r   rT   r   r   r   r   #r   r~   )_parse_body_as_jsonrb   r   r   rsplitr   rU  )r   rf   r2   rS   r   r@   response_coder   s           r   r_   BaseJSONParser._do_error_parse  s   ''(89&("52N9% %)HHtxx	2.%
gy!
 !]3xx-"FC4FG d{zz#q)!,d{{{3*1-#w.<<5 &*'N6"&&uy.ABr   c                 B    SU;   a  US   UR                  S0 5      S'   g g )Nx-amzn-requestidrV   rG  )
setdefault)r   rg   r@   s      r   rU  (BaseJSONParser._inject_response_metadata  s0    (EL"FF0"5kB )r   c                     U(       d  0 $ UR                  U R                  5      n [        R                  " U5      nU$ ! [         a    SU0s $ f = f)Nr  )decoder   jsonloads
ValueError)r   body_contentsrS   original_parseds       r   r  "BaseJSONParser._parse_body_as_json  sU    I##D$9$9:	%"jj.O"" 	% t$$	%s   > AAr    N)r&   r'   r(   r)   r  r   r<  r0  r_   rU  r  r*   r    r   r   rp  rp    s&    2(-"H
%r   rp  c                       \ rS rSrSrSr\S 5       rS rS r	S r
S rS	 rS
 rS rS rS rS rS rS rS rS rS rSrg)BaseCBORParseri        c           	          U R                   U R                  U R                  U R                  U R                  U R
                  U R                  U R                  S.$ )N)r   r   r                  )_parse_unsigned_integer_parse_negative_integer_parse_byte_string_parse_text_string_parse_array
_parse_map
_parse_tag_parse_simple_and_floatr   s    r    major_type_to_parsing_method_map/BaseCBORParser.major_type_to_parsing_method_map  sR     ++++&&&&  ++	
 		
r   c                 V    [         R                  " [         R                  " U5      5      $ r   )ioBufferedReaderBytesIO)r   bytess     r   get_peekable_stream_from_bytes-BaseCBORParser.get_peekable_stream_from_bytes  s      E!233r   c                     U R                  US5      nUS-	  nUS-  nX0R                  ;   a  U R                  U   nU" X5      $ [        SU SU 35      e)Nr   r  r  z8Unsupported inital byte found for data item- Major type:z, Additional info: )_read_bytes_as_intr  r9   )r   streaminitial_byte
major_typeadditional_infomethods         r   parse_data_itemBaseCBORParser.parse_data_item"  sx     ..vq9!Q&
 '3>>>:::FF&22%(\)<"#% r   c                 p    SSSSS.nUS:  a  U$ X#;   a  X2   nU R                  X5      $ [        SU 35      e)Nr   r   r     )            r  zhInvalid CBOR integer returned from the service; unparsable additional info found for major type 0 or 1: )r  r9   )r   r  r  additional_info_to_num_bytes	num_bytess        r   r  &BaseCBORParser._parse_unsigned_integer7  sd    	(
$ R""<4EI**6==%@@O?PR r   c                 *    SU R                  X5      -
  $ )N)r  r   r  r  s      r   r  &BaseCBORParser._parse_negative_integerL  s    D00IIIr   c                 N   X R                   :w  a"  U R                  X5      nU R                  X5      $ / n U R                  U5      (       a  OJU R	                  US5      nUS-  nU R                  X5      nUR                  U R                  X5      5        Ma  SR                  U5      $ )Nr   r  r   )INDEFINITE_ITEM_ADDITIONAL_INFOr  _read_from_stream_handle_break_coder  r   join)r   r  r  lengthchunksr  s         r   r  !BaseCBORParser._parse_byte_stringP  s    BBB11&JF))&99F**622#66vqA".";55fNd44VDE  88F##r   c                 B    U R                  X5      R                  S5      $ )Nr>   )r  r  r  s      r   r  !BaseCBORParser._parse_text_string`  s    &&v?FFwOOr   c                 D   X R                   :w  a;  U R                  X5      n[        U5       Vs/ s H  o@R                  U5      PM     sn$ / nU R	                  U5      (       d8  UR                  U R                  U5      5        U R	                  U5      (       d  M8  U$ s  snf r   )r  r  ranger  r  r   )r   r  r  r  _r   s         r   r  BaseCBORParser._parse_arrayd  s    BBB11&JF:?-H-Q((0-HHE--f55T11&9: --f55L Is   Bc                    0 nX R                   :w  a6  U R                  X5      n[        U5       H  nU R                  X5        M     U$ U R	                  U5      (       d)  U R                  X5        U R	                  U5      (       d  M)  U$ r   )r  r  r  _parse_key_value_pairr  )r   r  r  r   r  r  s         r   r  BaseCBORParser._parse_mapo  s}    BBB11&JF6]**69 #L --f55**69 --f55Lr   c                 X    U R                  U5      nU R                  U5      nUb  XBU'   g g r   )r  )r   r  r   r   rP   s        r   r  $BaseCBORParser._parse_key_value_pair|  s4    ""6*$$V,#J r   c                     U R                  X5      nU R                  U5      nUS:X  a  U R                  U5      $ [        SU 35      e)Nr   z*Found CBOR tag not supported by botocore: )r  r  _parse_datetimer9   )r   r  r  r   rP   s        r   r  BaseCBORParser._parse_tag  sQ    **6C$$V,!8''..%<SEB r   c                 v    [        U[        [        45      (       a  U R                  U5      $ [	        SU 35      e)Nz Unable to parse datetime value: )rc   r4  r+  rD   r9   rO   s     r   r  BaseCBORParser._parse_datetime  s;    ec5\**))%00%25': r   c                     SSS S S.nX#;   a  X2   $ SSSS.nX$;   a.  XB   u  pV[         R                  " XPR                  X5      5      S   $ [        S	U S
35      e)NFT)            )z>er   )z>fr  )z>dr  )r  r  r  r   z0Invalid additional info found for major type 7: zI.  This indicates an unsupported simple type or an indefinite float value)structunpackr  r9   )r   r  r  additional_info_simple_valuesfloat_formatsfloat_formatr  s          r   r  &BaseCBORParser._parse_simple_and_float  s     	)
% ;0AA
 
 +&3&D#L==44VG  ">>O PU V
 	
r   c                     [         R                  UR                  S5      S S S5      U R                  :X  a!  UR	                  S[
        R                  5        gg )Nr   bigT)r4  
from_bytespeek
BREAK_CODEseekosSEEK_CUR)r   r  s     r   r  !BaseCBORParser._handle_break_code  sC    >>&++a.!,e4GKK2;;' Hr   c                 P    U R                  X5      n[        R                  US5      $ )Nr  )r  r4  r  )r   r  r  bytes       r   r  !BaseCBORParser._read_bytes_as_int  s#    %%f8~~dE**r   c                 \    UR                  U5      n[        U5      U:w  a  [        S5      eU$ )NzgEnd of stream reached; this indicates a malformed CBOR response from the server or an issue in botocore)readr   r9   )r   r  r  rP   s       r   r   BaseCBORParser._read_from_stream  s5    I&u:"%$ 
 r   r    N)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    sm    &(#J

 

4**J$ P
D
+r   r  c                   2    \ rS rSrS rS rS rS rS rSr	g)	BaseEventStreamParseri  c                 T   0 nUR                   R                  S5      (       aK  US   R                  S5      nUR                  R                  U5      nU(       a  U R                  X5      X4'   U$ U R	                  XUR                  U5        U R                  XUR                  U5        U$ )NrU   r@   z:event-type)ra   rb   r   r`   _parse_non_payload_attrs_parse_payload)r   rf   r2   rs  
event_typeevent_shapes         r   r`   BaseEventStreamParser._do_parse  s    ""=11!),00?J--++J7K+/>>,( 	 )) Mr   c           	      `   US   R                  S5      nUR                  R                  U5      nUbN  U R                  US   5      nU R                  XE5      nSUUR                  SUR                  SS5      5      S.0nU$ SUS   R                  S	S5      US   R                  S
S5      S.0nU$ )Nr@   z:exception-typerS   r   r   r  r0   r}   z:error-codez:error-message)rb   r   _initial_body_parser   )r   rf   r2   exception_typeexception_shaper  rS   r   s           r   r_   %BaseEventStreamParser._do_error_parse  s    !),001BC--++N;&"66x7GHO$$_FD*#xx	488Ir3JKE  $Y/33M2F'	2667GLE r   c                    UR                   R                  S5      (       a  U H  nX5   nUR                   R                  S5      (       d  M)  US   nUR                  S:X  a  UnONUR                  S:X  a  UR                  U R                  5      nO"U R                  U5      n	U R                  Xi5      nXU'     g    U R                  US   5      n
U R                  X*5      nUR                  U5        g g )NeventeventpayloadrS   blobstring)ra   rb   r   r  r   r   r   r   )r   rf   r2   rt  rs  r   r   rS   parsed_body	raw_parser  body_parseds               r   r  $BaseEventStreamParser._parse_payload  s    ""7++%,2--11.AA#F+D#--7&*%//8;&*kk$2G2G&H$($<$<T$B	&*&7&7(' *5& &  #66x7GHO++ECK,' ,r   c                     US   nU H\  nX6   nUR                   R                  S5      (       d  M)  Xe;   d  M0  XV   nUR                  S:X  a  U R                  US-  5      nXU'   M^     g )Nr@   r   	timestampg     @@)ra   rb   r   rD   )	r   rf   r2   rt  rs  r@   r   r   rP   s	            r   r  .BaseEventStreamParser._parse_non_payload_attrs  so     9%!D(.L))--m<<?#ME#--< !% 6 6uv~ F).& "r   c                     [        S5      eNr   r   r   r  s     r   r   )BaseEventStreamParser._initial_body_parse      
 ""788r   r    N)
r&   r'   r(   r)   r`   r_   r  r  r   r*   r    r   r   r  r    s     *-,/9r   r  c                       \ rS rSrS rSrg)EventStreamJSONParseri"  c                 $    U R                  U5      $ r   r  r  s     r   r   )EventStreamJSONParser._initial_body_parse#      ''66r   r    Nr&   r'   r(   r)   r   r*   r    r   r   r  r  "  s    7r   r  c                       \ rS rSrS rSrg)EventStreamXMLParseri'  c                 ^    U(       d  [         R                  " S5      $ U R                  U5      $ r   r   Elementr  r   r  s     r   r   (EventStreamXMLParser._initial_body_parse(  %    ==$$,,Z88r   r    Nr  r    r   r   r  r  '  s    9r   r  c                       \ rS rSrS rSrg)EventStreamCBORParseri.  c                 R    US:X  a  0 $ U R                  U R                  U5      5      $ Nr   )r  r  r  s     r   r   )EventStreamCBORParser._initial_body_parse/  s0    CI##//>
 	
r   r    Nr  r    r   r   r&  r&  .  s    
r   r&  c                   2    \ rS rSr\r S rS rS rS r	Sr
g)
JSONParseri7  c                     0 nUb;  UR                   nU(       a  U R                  XU5      nOU R                  US   U5      nU R                  X1S   5        U$ )NrS   r@   )event_stream_name_handle_event_stream_handle_json_bodyrU  )r   rf   r2   rg   
event_names        r   r`   JSONParser._do_parse<  s\    00J228JO//0@%H&&v	/BCr   c                 ,    U R                  US   U5      $ NrS   )r/  r   s      r   r^   "JSONParser._do_modeled_error_parseG  s    %%hv&6>>r   c                     UR                   U   nU R                  X5      n UR                  5       nU R                  UR                  U5      nXXU'   U$ ! [         a    Sn[	        U5      ef = fNz,First event was not of type initial-response)r   r   get_initial_responser   r9   r/  payload	r   rf   r2   r0  event_stream_shapeevent_streamr  r   rg   s	            r   r.  JSONParser._handle_event_streamJ  sz    "]]:600N	1 557E ''u=)z & 	1FI%i00	1s   A A,c                 F    U R                  U5      nU R                  X#5      $ r   )r  r   )r   raw_bodyr2   parsed_jsons       r   r/  JSONParser._handle_json_bodyV  s%     ..x8  44r   r    N)r&   r'   r(   r)   r  rH   r`   r^   r.  r/  r*   r    r   r   r+  r+  7  s    32	?
5r   r+  c                   ^   ^  \ rS rSrS rS rS rS rS rS r	S r
S	 rS
 rU 4S jrSrU =r$ )BaseRestParseri^  c                 V    0 nU R                  U5      US'   U R                  XU5        U$ r^  )_populate_response_metadata_add_modeled_parser   rf   r2   rs  s       r   r`   BaseRestParser._do_parse_  s8    +/+K+K,
'( 	>r   c                 n    Uc  U$ UR                   nU R                  XXC5        U R                  XXC5        g r   )r   r  r  )r   rf   r2   rs  rt  s        r   rE  !BaseRestParser._add_modeled_parseg  s;    =%%]	
 	H]Ir   c                 .    0 nU R                  XU5        U$ r   rE  rF  s       r   r^   &BaseRestParser._do_modeled_error_parsep      >r   c                 z    0 nUS   nSU;   a
  US   US'   U$ SU;   a  US   US'   UR                  SS5      US'   U$ )Nr@   r  rG  x-amz-request-id
x-amz-id-2r0   HostIdrp   r   rf   rv   r@   s       r   rD  *BaseRestParser._populate_response_metadatau  sf    9%($+,>$?H[!   7*$+,>$?H[! ")\2!>HXr   c                    SUR                   ;   a  UR                   S   nX5   nUR                   R                  S5      (       a  U R                  X5      nXtU'   g UR                  S;   a:  US   n[	        U[
        5      (       a  UR                  U R                  5      nXtU'   g U R                  US   5      nU R                  Xh5      XE'   g U R                  US   5      nU R                  X(5      n	UR                  U	5        g )Nr8  rU   )r  r  rS   )ra   rb   r   r   rc   r  r  r   r   r   r   )
r   rf   r2   rt  rs  payload_member_name
body_shaperS   r  r  s
             r   r  BaseRestParser._parse_payload  s    +++ #("5"5i"@&;J''++M::00F4801%%);;'dE**;;t'<'<=D4801"&":":8F;K"L484E4E51 #66x7GHO++ECK,r   c                 \   US   nU H  nX6   nUR                   R                  S5      nUc  M'  US:X  a  U R                  XqS   5      XF'   ME  US:X  a  U R                  Xu5      XF'   M`  US:X  d  Mh  UR                   R                  SU5      n	X;   d  M  U R                  XuU	   5      XF'   M     g )Nr@   r   rA   rT   r?   r   )ra   rb   r   _parse_header_map)
r   rf   r2   rt  rs  r@   r   r   r   header_names
             r   r  'BaseRestParser._parse_non_payload_attrs  s     9%!D(.L#1155jAH\)%)%6%6 ="9&" Y&%)%;%; &" X%*88<<VTJ))-):):$k&:*L&! "r   c                     0 nUR                   R                  SS5      R                  5       nU H=  nUR                  5       R                  U5      (       d  M)  U[	        U5      S  nX%   X6'   M?     U$ )Nr   r0   )ra   rb   lowerrz   r   )r   r2   r@   rg   prefixrZ  r   s          r   rY   BaseRestParser._parse_header_map  sq     $$((4::<"K  "--f55 #3v;=1&3 # r   c                     [        S5      er  r  r  s     r   r   "BaseRestParser._initial_body_parse  r  r   c                     Un[        U5      (       aE  [        R                  " U5      R                  U R                  5      n[
        R                  " U5      nU$ r   )r	   rM   rN   r  r   r  r  )r   r2   rP   rg   decodeds        r   r8  BaseRestParser._handle_string  sF    &&&&u-44T5J5JKGZZ(Fr   c                    > UR                   R                  S5      nUS:X  aC  [        U[        5      (       d.  UR	                  S5       Vs/ s H  oDR                  5       PM     nn[        TU ]  X5      $ s  snf )Nr   r?   ,)ra   rb   rc   r   r   ry   r   r   )r   r2   r   r   r  r   s        r   r   BaseRestParser._handle_list  sb    &&**:6x
4(>(>'+zz#7!GGID7w#E00 8s   A5r    )r&   r'   r(   r)   r`   rE  r^   rD  r  r  rY  r   r8  r   r*   rA  rB  s   @r   rB  rB  ^  s;    J
-2091 1r   rB  c                   >    \ rS rSrS rS rS rS rS rS r	S r
S	rg
)BaseRpcV2Parseri  c                     0 nUbN  UR                   nU(       a  U R                  XU5      nO0 nU R                  XU5        U R                  U5      US'   U$ r^  )r-  r.  r  rD  )r   rf   r2   rg   r-  s        r   r`   BaseRpcV2Parser._do_parse  si     % 7 7 22%6 ##HV<)-)I)I*F%& r   c                 2    Uc  U$ U R                  XU5        g r   )r  rF  s       r   rE  "BaseRpcV2Parser._add_modeled_parse  s    =H\:r   c                 .    0 nU R                  XU5        U$ r   rK  rF  s       r   r^   'BaseRpcV2Parser._do_modeled_error_parse  rM  r   c                 0    0 nUS   nSU;   a  US   US'   U$ )Nr@   r  rG  r    rR  s       r   rD  +BaseRpcV2Parser._populate_response_metadata  s.    9%($+,>$?H[!r   c                    0 nUR                   nUR                  (       as  UR                  5       nUR                  SS 5        UR	                  5        VVs0 s H  u  pgUc  M
  Xg_M     nnn[        U5      S:w  a  Sn[        XR                  -  5      eU H0  n	XI   n
UR                  U	5      nUc  M  U R                  X5      X9'   M2     U$ s  snnf )Nr   r   r   )
r   r   r   r   r   r   r9   r   rb   r   )r   r2   r   rg   r   r   r   r   r   r   r   r  s               r   r  !BaseRpcV2Parser._handle_structure  s    --   IIKMh-!.!4!4!6!6!!6   =!Q&&  *)jj*@AA"K"/L((;/K&&*&7&7 '#	 # !s   	C"Cc                 p    U R                  US   5      nU R                  X$5      nUR                  U5        g r3  )r   r   r   )r   rf   r2   rs  r  r  s         r   r  BaseRpcV2Parser._parse_payload  s5    228F3CD''?K(r   c                     [        S5      er  r  r  s     r   r   #BaseRpcV2Parser._initial_body_parse  r  r   r    N)r&   r'   r(   r)   r`   rE  r^   rD  r  r  r   r*   r    r   r   ri  ri    s%     ;

0)
9r   ri  c                   R   ^  \ rS rSr\rS rU 4S jrS rS r	S r
S r\
r\rSrU =r$ )	RestJSONParseri  c                 $    U R                  U5      $ r   r  r  s     r   r   "RestJSONParser._initial_body_parse   r  r   c                 H   > [         TU ]  X5      nU R                  X15        U$ r   )r   r_   _inject_error_code)r   rf   r2   r   r   s       r   r_   RestJSONParser._do_error_parse#  s%    '80r   c                 @   U R                  US   5      nS nSUS   ;   a	  US   S   nO.SU;   d  SU;   a"  UR                  SUR                  SS5      5      nUc  g [        U[        5      (       a(  UR	                  SS5      S	   R                  S
S5      S   nXAS   S'   g )NrS   zx-amzn-errortyper@   r   r~   r0   r   r   r   r  r  r   )r   rb   rc   r   r   r  )r   r   rf   rS   r   s        r   r}  !RestJSONParser._inject_error_code(  s     ''(89)!44I&'9:Dt^v~88FDHHVR$89D<dC  ::c1%a(//Q7;D!%gvr   c                     [        U5      $ r   )r   r   s      r   r'  RestJSONParser._handle_boolean7  s    e$$r   c                     [        U5      $ r   r3  r   s      r   r5  RestJSONParser._handle_integer:  s    5zr   c                     [        U5      $ r   r*  r   s      r   r,  RestJSONParser._handle_float=  s    U|r   r    )r&   r'   r(   r)   r  rH   r   r_   r}  r'  r5  r,  r@  r?  r*   rA  rB  s   @r   ry  ry    s3    37
&% #L"Nr   ry  c                   *    \ rS rSr\rS rS rS rSr	g)RpcV2CBORParseriD  c                 V    US:X  a  U$ U R                  U5      nU R                  U5      $ r(  )r  r  )r   r  body_contents_streams      r   r   #RpcV2CBORParser._initial_body_parseG  s8    C  #BB 
 ##$899r   c                    U R                  US   5      nUR                  SUR                  SS5      5      SS.0 S.nUS   nUR                  S5      nUc  UR                  S	5      nUb  [        U5      nUbU  S
U;   a  UR                  S
S5      S   nSU;   a  UR	                  SS5      S   nSU;   a  U R                  XeU5      nXdS   S'   SU;   a  US   UR                  S0 5      S'   U$ )NrS   r  r   r0   r  r   r@   r   rT   r   r   r   r  r   r   r~   r  rV   rG  )r   rb   r   r   r  r   r  )r   rf   r2   rS   r   r@   r   r  s           r   r_   RpcV2CBORParser._do_error_parseO  s   ''(89  88Itxx	2/FG !#
 9%xx!<$LL7M(=)d{zz#q)!,d{{{3*1-#w.<<5 &*'N6"(DK"EE/4[A r   c                     UR                   U   nU R                  X5      n UR                  5       nU R                  UR                  5      nXXU'   U$ ! [         a    Sn[	        U5      ef = fr6  )r   r   r7  r   r9   r   r8  r9  s	            r   r.  $RpcV2CBORParser._handle_event_streamo  sx    "]]:600N	1 557E ))%--8)z & 	1FI%i00	1s   A A+r    N)
r&   r'   r(   r)   r&  rH   r   r_   r.  r*   r    r   r   r  r  D  s    3:@
r   r  c                   N   ^  \ rS rSr\rS rS rS rS r	\
U 4S j5       rSrU =r$ )RestXMLParseri|  c                 ^    U(       d  [         R                  " S5      $ U R                  U5      $ r   r   r"  s     r   r   !RestXMLParser._initial_body_parse  r$  r   c                     US   (       a   U R                  U5      $ U R	                  U5      $ ! [         a    [        R                  SSS9   N1f = f)NrS   z2Exception caught when parsing error response body:T)exc_info)_parse_error_from_bodyr9   rY   rZ   _parse_error_from_http_statusr   s      r   r_   RestXMLParser._do_error_parse  s]     F228<< 11(;; ' 		H!  s   . AAc                     [        US   5      [        R                  R                  R	                  US   S5      S.US   R	                  SS5      US   R	                  SS5      S.S.$ )	NrT   r0   r}   r@   rO  rP  )rG  rQ  r   )r   r   r   r   rb   r   s     r   r  +RestXMLParser._parse_error_from_http_status  st     H]34;;0044]+R &i0445GL"9-11,C!
 	
r   c                 d   US   nU R                  U5      nU R                  U5      nU R                  U5        UR                  S:X  a9  U R	                  U5      nUR                  SS5        UR                  SS5        XES.$ SU;   a  SUR                  S5      0US'   SSSS.0n[        Xd5        U$ )	NrS   r   rG  r0   rQ  r   rV   r  )r  r   r!  r   rD  r   r   )r   rf   rH  r  rg   rv   defaults          r   r  $RestXMLParser._parse_error_from_body  s    ',,\:--d3F#88w 77AH
 JJ{B'JJx$#BBF"*5vzz+7N)OF%&B78G$r   c                 &   > [         TU ]  X5      nU$ r   )r   r8  )r   r2   r/   r   s      r   r8  RestXMLParser._handle_string  s    w%e2r   r    )r&   r'   r(   r)   r  rH   r   r_   r  r  r7   r8  r*   rA  rB  s   @r   r  r  |  s1    29
<6
.  r   r  )ec2queryr  z	rest-jsonzrest-xmlzsmithy-rpc-v2-cbor)1r   rM   http.clientr   r  r  loggingr  r   r  botocore.compatr   r   botocore.eventstreamr   r   botocore.utilsr   r   r	   r
   r   r   	getLoggerr&   rY   rC   r   r$   r7   	Exceptionr9   r<   r   rD  rd  rp  r  r  r  r  r&  r+  rB  ri  ry  r  r  r!   r    r   r   <module>r     sw  kZ   	   	 	  0 D  !* , ,*;*	) 	\ \~n#N n#b1:' 1:h![ !H^%^ ^%B~^ ~BP9N P9f71> 7
902G 9
1> 
$5 $5Nu1^ u1pD9n D9N$#^^ $#N5o~ 5pKN$9 K^ ) r   