
    g                        d Z ddlZddlZddlZddlZdZ G d dej                        Zdddd	d
Zddddd
Z	dddZ
d Zd Zd Zd Zd Zd Zd Zd Zd fdZ G d dej                        Z G d d      Z G d  d!      Z G d" d#e      Z G d$ d%e      Z G d& d'e      Z G d( d)e      Z G d* d+e      Z G d, d-e      Z G d. d/e      Z G d0 d1      Zd2 Z G d3 d4      Z d5 Z!d6 Z" G d7 d8      Z# G d9 d:      Z$d; Z%d< Z&d= Z'y)>zImplementation of FlexBuffers binary format.

For more info check https://google.github.io/flatbuffers/flexbuffers.html and
corresponding C++ implementation at
https://github.com/google/flatbuffers/blob/master/include/flatbuffers/flexbuffers.h
    N)TypeBuilderGetRootDumpsLoadsc                   `    e Zd ZdZdZdZdZdZed        Z	ed        Z
ed        Zed	        Zy
)BitWidthzSupported bit widths of value types.

  These are used in the lower 2 bits of a type field to determine the size of
  the elements (and or size field) of the item pointed to (e.g. vector).
  r            c                     | dk\  sJ | dk  rt         j                  S | dk  rt         j                  S | dk  rt         j                  S | dk  rt         j                  S t        d| z        )z@Returns the minimum `BitWidth` to encode unsigned integer value.r      i   l        l            zvalue is too big to encode: %s)r	   W8W16W32W64
ValueErrorvalues    L/var/www/openai/venv/lib/python3.12/site-packages/flatbuffers/flexbuffers.pyUz
BitWidth.U,   si     A::[[	'	\\	'	\\	'	\\7%?@@    c                 N    | dz  } t         j                  | dk\  r|       S |        S )z>Returns the minimum `BitWidth` to encode signed integer value.r   r   )r	   r   r   s    r   Iz
BitWidth.I<   s,     
QJE::uze66v66r   c                     t        j                  dt        j                  d|             d   | k(  rt        j                  S t        j
                  S )z6Returns the `BitWidth` to encode floating point value.z<fr   )structunpackpackr	   r   r   r   s    r   Fz
BitWidth.FK   s;     }}T6;;tU34Q75@\\<<r   c                     t         j                  t         j                  t         j                  t         j                  d|    S )Nr
   r         )r	   r   r   r   r   
byte_widths    r   Bz
BitWidth.BR   s4     ;;<<<<<<	
  r   N)__name__
__module____qualname____doc__r   r   r   r   staticmethodr   r   r   r&    r   r   r	   r	   !   sm    
 	"	#	#	#A A 7 7    r   r	   bhiqr!   r&   Hr   Qfd)r"   r#   c                 R    t        j                  d| t        |         z  |      d   S )N<%sr   )r   r   len)fmtbufs     r   _Unpackr:   a   s%    	us3s8},c	21	55r   c                 Z    t        |      |z  }t        j                  d|| |   fz  |      S Nz<%d%s)r7   r   r   )r8   r9   lengthr%   s       r   _UnpackVectorr>   e   s/    3x6!*	w&#j/!::C	@@r   c                 :    t        j                  d| |   z  |      S )Nr6   )r   r   )r8   r   r%   s      r   _Packr@   j   s    	US_,e	44r   c                 P    t        j                  dt        |      | |   fz  g| S r<   )r   r   r7   )r8   valuesr%   s      r   _PackVectorrC   n   s(    	WFS_==	G	GGr   c                 6    d|z  |k  rt        | ||      |d | yy)Nr
   TF)r@   )r8   r9   r   r%   value_bit_widths        r   _MutaterF   r   s*    ?z)S%4C	r   c                     |  |dz
  z  S Nr
   r,   )buf_sizescalar_sizes     r   _PaddingBytesrK   |   s    
kAo	&&r   c                     || j                   dn| j                   z   }|| j                  |n| j                  z   }t        ||| j                        S Nr   )startstopslicestep)soffsetr=   rN   rO   s        r   _ShiftSlicerT      sE    
Aagg
6%	QVV^6	8$	udAFF	##r   c                     dt        |       }}||z
  }|dkD  r0|}|dz  }||z  } || |   |      r|dz  }|}||dz   z  }n|}|dkD  r0|S )z3Implementation of C++ std::lower_bound() algorithm.r   r   r
   )r7   )rB   r   predfirstlastcountr/   rQ   s           r   _LowerBoundrZ      su    3v;%
,%	AA:DIAF1Iu1faetaxee 		 
,r   c                     | |k  S Nr,   )xys     r   <lambda>r_      s    1q5r   c                 V    t        | ||      }|t        |       k7  r ||| |         s|S y)z5Implementation of C++ std::binary_search() algorithm.)rZ   r7   )rB   r   rV   indexs       r   _BinarySearchrc      s1    
feT
*%
c&k$ufUm"<L	r   c                   "   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZe d        Z!e d        Z"e d         Z#e d!        Z$e d"        Z%e d#        Z&e d$        Z'e d%        Z(e d&        Z)e d)d'       Z*y()*r   zxSupported types of encoded data.

  These are used as the upper 6 bits of a type field to indicate the actual
  type.
  r   r
   r   r   r"            r#   	   
                                                   $   c                 $    t        |       dz  |z  S )Nr   )int)type_	bit_widths     r   Packz	Type.Pack   s    J!Oy((r   c                 .    d| dz  z  t        | dz	        fS )Nr
   r   r   )r   packed_types    r   UnpackzType.Unpack   s!    t#$d;!+;&<<<r   c                 R    | t         j                  k  xs | t         j                  k(  S r\   )r   FLOATBOOLr}   s    r   IsInlinezType.IsInline   s    DJJ4%499"44r   c                     t         j                  | cxk  xr t         j                  k  nc xs | t         j                  k(  S r\   )r   
VECTOR_INTVECTOR_STRING_DEPRECATEDVECTOR_BOOLr   s    r   IsTypedVectorzType.IsTypedVector   s1    ??eDt'D'DD %D$$$%r   c                     t         j                  | cxk  xr t         j                  k  nc xs | t         j                  k(  S r\   )r   INTSTRINGr   r   s    r   IsTypedVectorElementTypezType.IsTypedVectorElementType   s(    88u++Au		/AAr   c                     t         j                  |       st        d      t        | t         j                  z
  t         j                  z         S )Nzmust be typed vector type)r   r   r   r   r   r   s    r   ToTypedVectorElementTypezType.ToTypedVectorElementType   s9    e$233'$((233r   c                 Z    t         j                  | cxk  xr t         j                  k  S c S r\   )r   VECTOR_INT2VECTOR_FLOAT4r   s    r   IsFixedTypedVectorzType.IsFixedTypedVector   s$    u:(:(:::::r   c                 Z    t         j                  | cxk  xr t         j                  k  S c S r\   )r   r   r   r   s    r   IsFixedTypedVectorElementTypez"Type.IsFixedTypedVectorElementType   s     88u*

****r   c                     t         j                  |       st        d      | t         j                  z
  }t        |dz  t         j                  z         |dz  dz   fS )Nzmust be fixed typed vector typer   r   )r   r   r   r   r   )r}   
fixed_types     r   ToFixedTypedVectorElementTypez"Type.ToFixedTypedVectorElementType   sT    ""5)899 )))J
Q)*J!Oa,???r   c                    |dk(  r t         j                  |       s+t        d      t         j                  |       st        d      | t         j                  z
  }|dk(  rt        |t         j
                  z         S |dk(  rt        |t         j                  z         S |dk(  rt        |t         j                  z         S |dk(  rt        |t         j                  z         S t        d|z        )a  Converts element type to corresponding vector type.

    Args:
      element_type: vector element type
      fixed_len: number of elements: 0 for typed vector; 2, 3, or 4 for fixed
        typed vector.

    Returns:
      Typed vector type or fixed typed vector type.
    r   z!must be typed vector element type'must be fixed typed vector element typer   r   r"   zunsupported fixed_len: %s)	r   r   r   r   r   r   r   VECTOR_INT3VECTOR_INT4)element_type	fixed_lenrS   s      r   ToTypedVectorzType.ToTypedVector   s     A~**<8<==//=BCCDHH$FA~&4??*++	a&4+++,,	a&4+++,,	a&4+++,,2Y>??r   Nr   )+r'   r(   r)   r*   NULLr   UINTr   KEYr   INDIRECT_INTINDIRECT_UINTINDIRECT_FLOATMAPVECTORr   VECTOR_UINTVECTOR_FLOAT
VECTOR_KEYr   r   VECTOR_UINT2VECTOR_FLOAT2r   VECTOR_UINT3VECTOR_FLOAT3r   VECTOR_UINT4r   BLOBr   r   r+   r   r   r   r   r   r   r   r   r   r   r,   r   r   r   r      sd   
 
$	#	
$
%	#&,-.	#&*+,*  +,-+,-+,-	$	$+) ) = = 5 5 % % B B 4 4 ; ; + + @ @ @ @r   r   c                   :    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
y	)
BufzHClass to access underlying buffer object starting from the given offset.c                     || _         |dk\  r|nt        |      |z   | _        t        |      | j                  z
  | _        y rM   )_bufr7   _offset_length)selfr9   rS   s      r   __init__zBuf.__init__  s5    DI#q[6c#h.?DLs8dll*DLr   c                     t        |t              r.| j                  t        || j                  | j
                           S t        |t              r| j                  | j                  |z      S t        d      Nzinvalid key type
isinstancerP   r   rT   r   r   r|   	TypeErrorr   keys     r   __getitem__zBuf.__getitem__   sZ    #uYY{3dllCDD	C	YYt||c)**())r   c                     t        |t              r/|| j                  t        || j                  | j
                        <   y t        |t              r|| j                  | j                  |z   <   y t        d      r   r   )r   r   r   s      r   __setitem__zBuf.__setitem__(  sX    #u@EdiiCt||<=	C	&)diis"#())r   c                      d| j                   z  S )Nzbuf[%d:])r   r   s    r   __repr__zBuf.__repr__0  s    $$r   c                 R    | j                   | j                  d j                  |      S )z<Returns the lowest index where the sub subsequence is found.N)r   r   find)r   subs     r   FindzBuf.Find3  s"    99T\\]#((--r   c                 H    t        | j                  | j                  |z         S )z5Returns new `Buf` which starts from the given offset.)r   r   r   )r   rS   s     r   Slicez	Buf.Slice7  s    tyy$,,/00r   c           
      R    | j                  |t        t        | |||z          z
        S )zAReturn new `Buf` based on the encoded offset (indirect encoding).)r   r:   r   )r   rS   r%   s      r   IndirectzBuf.Indirect;  s)    ::fwq$vfz6I*JKKLLr   N)r'   r(   r)   r*   r   r   r   r   r   r   r   r,   r   r   r   r     s)    P+
**%.1Mr   r   c                   *    e Zd ZdZdZd Zed        Zy)Objectz.Base class for all non-trivial data accessors.r   _byte_widthc                      || _         || _        y r\   r   )r   r9   r%   s      r   r   zObject.__init__D  s    DI!Dr   c                     | j                   S r\   )r   r   s    r   	ByteWidthzObject.ByteWidthH  s    r   N)r'   r(   r)   r*   	__slots__r   propertyr   r,   r   r   r   r   @  s#    6#)"  r   r   c                   >     e Zd ZdZdZd fd	Zed        Zd Z xZ	S )SizedzBBase class for all data accessors which need to read encoded size._sizec                 ~    t         |   ||       |dk(  r t        t        | j                        | _        y || _        y rM   )superr   r:   r   	SizeBytesr   )r   r9   r%   size	__class__s       r   r   zSized.__init__Q  s2    	GS*%qy1dnn-djdjr   c                 6    | j                   | j                   d S rM   r   r   s    r   r   zSized.SizeBytesX  s    99d&&&q))r   c                     | j                   S r\   r   r   s    r   __len__zSized.__len__\  s    ::r   r   )
r'   r(   r)   r*   r   r   r   r   r   __classcell__r   s   @r   r   r   M  s)    J) * *r   r   c                   *    e Zd ZdZdZed        Zd Zy)Blobz)Data accessor for the encoded blob bytes.r,   c                 2    | j                   dt        |        S rM   r   r7   r   s    r   Bytesz
Blob.Bytesd      99Qs4y!!r   c                 6    d| j                   t        |       fz  S )NzBlob(%s, size=%d)r   r   s    r   r   zBlob.__repr__h  s    $))SY!777r   N)r'   r(   r)   r*   r   r   r   r   r,   r   r   r   r   `  s!    1)" "8r   r   c                   6    e Zd ZdZdZed        Zd Zd Zd Z	y)Stringz+Data accessor for the encoded string bytes.r,   c                 2    | j                   dt        |        S rM   r   r   s    r   r   zString.Bytesp  r   r   c                 8   |j                  d      }t        |      }|t        |       k  rpt        t        || j                        | j
                  | j                   d || j
                  d| t        t        |       |z
        | j
                  |t        |        yy)a4  Mutates underlying string bytes in place.

    Args:
      value: New string to replace the existing one. New string must have less
        or equal UTF-8-encoded bytes than the existing one to successfully
        mutate underlying byte buffer.

    Returns:
      Whether the value was mutated or not.
    utf-8r   TF)encoder7   r@   r   r   r   	bytearray)r   r   encodedns       r   MutatezString.Mutatet  s     ll7#GGACI~',Q43C3C'Ddii!!!!$dii!n(TQ7dii#d)r   c                 8    | j                   j                  d      S )Nr   r   decoder   s    r   __str__zString.__str__      ::W%%r   c                 6    d| j                   t        |       fz  S )NzString(%s, size=%d)r   r   s    r   r   zString.__repr__  s     DIIs4y#999r   N)
r'   r(   r)   r*   r   r   r   r   r   r   r,   r   r   r   r   l  s+    3)" "(&:r   r   c                   H     e Zd ZdZdZ fdZed        Zd Zd Z	d Z
 xZS )Keyz(Data accessor for the encoded key bytes.r,   c                 4    |dk(  sJ t         |   ||       y rH   )r   r   )r   r9   r%   r   s      r   r   zKey.__init__  s    ??	GS*%r   c                 2    | j                   dt        |        S rM   r   r   s    r   r   z	Key.Bytes  r   r   c                 8    | j                   j                  d      S rM   )r   r   r   s    r   r   zKey.__len__  s    99>>!r   c                 8    | j                   j                  d      S )Nasciir   r   s    r   r   zKey.__str__  r   r   c                 6    d| j                   t        |       fz  S )NzKey(%s, size=%d)r   r   s    r   r   zKey.__repr__      CI 666r   )r'   r(   r)   r*   r   r   r   r   r   r   r   r   r   s   @r   r  r    s3    0)& " "&7r   r  c                   0    e Zd ZdZdZd Zed        Zd Zy)Vectorz+Data accessor for the encoded vector bytes.r,   c                 <   |dk  s|t        |       k\  rt        d|t        |       fz        | j                  t        |       | j                  z  |z      }| j                  j	                  || j                  z        }t
        j                  || j                  |      S )Nr   'vector index %s is out of [0, %d) range)r7   
IndexErrorr   r   r   Ref
PackedType)r   rb   r   r9   s       r   r   zVector.__getitem__  s    qyESY&@#d)
   ))CI(8(885@AK
))//%$"2"22
3C>>#t//==r   c                 @    | D cg c]  }|j                    c}S c c}w )z5Returns the underlying encoded data as a list object.)Valuer   es     r   r  zVector.Value  s      ""TAGGT"""s   c                 N    d| j                   | j                  | j                  fz  S )Nz"Vector(%s, byte_width=%d, size=%d))r   r   r   r   s    r   r   zVector.__repr__  s'    /	D$$djj12 2r   N)	r'   r(   r)   r*   r   r   r   r  r   r,   r   r   r  r    s(    3)> # #2r   r  c                   d     e Zd ZdZdZd	 fd	Zed        Zed        Zd Z	ed        Z
d Z xZS )
TypedVectorzGData accessor for the encoded typed vector or fixed typed vector bytes.)_element_typer   c                 |    t         |   |||       |t        j                  k(  rt        j                  }|| _        y r\   )r   r   r   r   r   r  )r   r9   r%   r   r   r   s        r   r   zTypedVector.__init__  s3    	GS*d+t{{" XXl%Dr   c                 L    | j                   d | j                  t        |       z   S r\   )r   r   r7   r   s    r   r   zTypedVector.Bytes  s#    992d&&T233r   c                     | j                   S r\   )r  r   s    r   ElementTypezTypedVector.ElementType  s    r   c                     |dk  s|t        |       k\  rt        d|t        |       fz        | j                  j                  || j                  z        }t        || j                  d| j                        S )Nr   r  r
   )r7   r  r   r   r   r  r  )r   rb   r9   s      r   r   zTypedVector.__getitem__  sq    qyESY&@#d)
   ))//%$"2"22
3CsD$$a););<<r   c           	         | sg S | j                   t        j                  u r;t        t        | j
                  t        |             D cg c]  }t        |       c}S | j                   t        j                  u r-t        t        t        | j
                  t        |                   S | j                   t        j                  u r-t        t        t        | j
                  t        |                   S | j                   t        j                  u r-t        t        t        | j
                  t        |                   S | j                   t        j                  u r| D cg c]  }|j                   c}S | j                   t        j                   u r| D cg c]  }|j"                   c}S t%        d| j                   z        c c}w c c}w c c}w )z'Returns underlying data as list object.unsupported element_type: %s)r  r   r   r>   r   r   r7   boolr   listr   r   r   r   r   AsKeyr   AsStringr   r  s     r   r  zTypedVector.Value  sO    iTYY&,Q

CIFGF!d1gFGG			txx	'-4::s4y9::			tyy	(-4::s4y9::			tzz	)-4::s4y9::			txx	'#$t!aggt$$			t{{	*"&'$Qajj$''4t7I7IIJJ H %'s   F;G Gc                 d    d| j                   | j                  | j                  | j                  fz  S )Nz8TypedVector(%s, byte_width=%d, element_type=%s, size=%d))r   r   r  r   r   s    r   r   zTypedVector.__repr__  s1    E	D$$d&8&8$**EF Fr   r   )r'   r(   r)   r*   r   r   r   r   r  r   r  r   r   r   s   @r   r  r    sY    O&)& 4 4  = K K(Fr   r  c                   h     e Zd ZdZed        Z fdZed        Zed        Z	ed        Z
d Z xZS )Mapz(Data accessor for the encoded map bytes.c                 |    t        | t              r| j                  } t        |t              r|j                  }| |k  S r\   )r   r  
AsKeyBytesar-   s     r   CompareKeyszMap.CompareKeys  s1    !S
,,a!S
,,aq5Lr   c                     t        |t              rt        |   |      S t	        | j
                  |j                  d      | j                        }|dk7  rt        |   |      S t        |      )Nr  ra   )	r   r|   r   r   rc   Keysr   r+  KeyError)r   r   rb   r   s      r   r   zMap.__getitem__  s_    #sW %%$))SZZ%8$:J:JKE{W ''
3-r   c                    t        t        | j                  d| j                  z  | j                          }| j                  j	                  d| j                  z  | j                        }t        ||t        j                        S )N)r:   r   r   r   r   r  r   r   )r   r%   r9   s      r   r-  zMap.Keys  sg    DIIb4+;+;&;T=M=M<MNOJ
))

R$"2"22D4D4D
ECsJ11r   c                 B    t        | j                  | j                        S r\   )r  r   r   r   s    r   Valuesz
Map.Values  s    $))T--..r   c                     t        | j                  | j                        D ci c]  \  }}|j                  |j                   c}}S c c}}w r\   )zipr-  r3  r  )r   kvs      r   r  z	Map.Value  s<    ),TYY)DE)DAAGGQWW)DEEEs   !A	c                 6    d| j                   t        |       fz  S )NzMap(%s, size=%d)r   r   s    r   r   zMap.__repr__  r	  r   )r'   r(   r)   r*   r+   r+  r   r   r-  r3  r  r   r   r   s   @r   r&  r&    s`    0  2 2
 / / F F7r   r&  c                      e Zd ZdZdZed        Zd Zd Ze	d        Z
d Zd Ze	d	        Ze	d
        Ze	d        Zd Ze	d        Ze	d        Ze	d        Zd Ze	d        Ze	d        Zd Ze	d        Ze	d        Ze	d        Ze	d        Ze	d        Ze	d        Zd Ze	d        Ze	d        Z e	d        Z!e	d        Z"e	d        Z#e	d         Z$e	d!        Z%e	d"        Z&e	d#        Z'e	d$        Z(e	d%        Z)e	d&        Z*y')(r  z)Data accessor for the encoded data bytes.r   _parent_widthr   _typec                 N    t         j                  |      \  }}t        | |||      S r\   )r   r   r  )r9   parent_widthr   r%   r}   s        r   r  zRef.PackedType#  s&    K0JsL*e44r   c                 <    || _         || _        || _        || _        y r\   r:  )r   r9   r>  r%   r}   s        r   r   zRef.__init__(  s     DI%D!DDJr   c                 d    d| j                   | j                  | j                  | j                  fz  S )Nz1Ref(%s, parent_width=%d, byte_width=%d, type_=%s)r:  r   s    r   r   zRef.__repr__.  s1    >YY**D,<,<djjIJ Jr   c                 4    | j                   d | j                   S r\   )r   r;  r   s    r   _Bytesz
Ref._Bytes2  s    99(d(())r   c                 8    t        d| j                  d|      )Nzcannot convert z to )r   r<  )r   target_types     r   _ConvertErrorzRef._ConvertError6  s    
[I
JJr   c                 N    | j                   j                  d| j                        S rM   )r   r   r;  r   s    r   	_IndirectzRef._Indirect9  s    99a!3!344r   c                 :    | j                   t        j                  u S r\   )r<  r   r   r   s    r   IsNullz
Ref.IsNull<      ::""r   c                 :    | j                   t        j                  u S r\   )r<  r   r   r   s    r   IsBoolz
Ref.IsBool@  rJ  r   c                     | j                   t        j                  u r#t        t	        t
        | j                              S | j                  dk7  S rM   )r<  r   r   r   r:   r   rB  AsIntr   s    r   AsBoolz
Ref.AsBoolD  s6    zzTYY'!T[[)**ZZ1_r   c                     | j                   xr5 t        t        | j                  || j                  t
        j                        S )zMutates underlying boolean value bytes in place.

    Args:
      value: New boolean value.

    Returns:
      Whether the value was mutated or not.
    )rL  rF   r   r   r;  r	   r   r   r   s     r   
MutateBoolzRef.MutateBoolK  s5     ;; I1dii(:(:HKKHIr   c                 6    | j                   xs | j                  S r\   )IsIntIsFloatr   s    r   	IsNumericzRef.IsNumericW  s    ::%%r   c                     | j                   t        j                  t        j                  t        j                  t        j
                  fv S r\   )r<  r   r   r   r   r   r   s    r   rT  z	Ref.IsInt[  s5    ::$((D$5$5tyy,,. . .r   c                    | j                   ry| j                  rt        | j                        S | j                  t
        j                  u rt        t        | j                        S | j                  t
        j                  u r+t        t        | j                         d| j                         S | j                  t
        j                  u rt        t        | j                        S | j                  t
        j                  u r+t        t        | j                         d| j                         S | j                   rt#        | j$                        S | j&                  rt#        | j(                        S | j*                  rt#        | j,                        S | j.                  rt#        | j0                        S | j2                  rt#        | j4                        S | j6                  rt#        | j8                        S | j;                  t
        j                        )z+Returns current reference as integer value.r   N)rI  rL  r|   rO  r<  r   r   r:   r   rB  r   rG  r   r   r   r   IsStringr7   r#  IsKeyr"  IsBlobAsBlobIsVectorAsVectorr   AsTypedVectorr   AsFixedTypedVectorrE  r   s    r   rN  z	Ref.AsInt`  sn    {{		txx	Q$$	t((	(Q():$*:*:;<<zzTYYQ$$	t))	)Q():$*:*:;<<		_					##$$		 	 (())txx((r   c           	         | j                   t        j                  u r:t        t        | j
                  || j                  t        j	                  |            S | j                   t        j                  u r>t        t        | j                         || j                  t        j	                  |            S | j                   t        j                  u r:t        t        | j
                  || j                  t        j                  |            S | j                   t        j                  u r>t        t        | j                         || j                  t        j                  |            S y)zMutates underlying integer value bytes in place.

    Args:
      value: New integer value. It must fit to the byte size of the existing
        encoded value.

    Returns:
      Whether the value was mutated or not.
    F)r<  r   r   rF   r   r   r;  r	   r   rG  r   r   r   r   rQ  s     r   	MutateIntzRef.MutateInt~  s     zzTXXQ		5$*<*<hjj>OPP	t((	(Q(%1A1AZZ&( (	tyy	 Q		5$*<*<hjj>OPP	t))	)Q(%1A1AZZ&( ( r   c                 Z    | j                   t        j                  t        j                  fv S r\   )r<  r   r   r   r   s    r   rU  zRef.IsFloat  s     ::$**d&9&9:::r   c                 &   | j                   ry| j                  rt        | j                        S | j                  rt        | j
                        S | j                  t        j                  u rt        t        | j                        S | j                  t        j                  u r+t        t        | j                         d| j                         S | j                  rt        | j                         S | j"                  rt        t%        | j&                              S | j)                         rt        t%        | j*                              S | j-                         rt        t%        | j.                              S | j1                  t        j                        )z2Returns current reference as floating point value.g        N)rI  rL  floatrO  rT  rN  r<  r   r   r:   r   rB  r   rG  r   rY  r#  r]  r7   r^  r   r_  r   FixedTypedVectorrE  r   s    r   AsFloatzRef.AsFloat  s    {{	4;;	4::	tzz	!Q$$	t**	*Q():$*:*:;<<	4==!!	3t}}%&&				3t))*++		 	 	"3t,,-..tzz**r   c           	         | j                   t        j                  u rDt        t        | j
                  || j                  t        j                  | j                              S | j                   t        j                  u rHt        t        | j                         || j                  t        j                  | j                              S y)zMutates underlying floating point value bytes in place.

    Args:
      value: New float value. It must fit to the byte size of the existing
        encoded value.

    Returns:
      Whether the value was mutated or not.
    F)r<  r   r   rF   r   r   r;  r	   r&   r   rG  r   rQ  s     r   MutateFloatzRef.MutateFloat  s     zzTZZQ		5$*<*<ZZ 2 235 5	t**	*Q(%1A1AZZ 0 013 3 r   c                 :    | j                   t        j                  u S r\   )r<  r   r   r   s    r   rZ  z	Ref.IsKey      ::!!r   c                     | j                   r.t        | j                         | j                        j                  S | j                  t        j                        r\   )rZ  r  rG  r   r   rE  r   r   r   s    r   r(  zRef.AsKeyBytes  s>    zz!4#3#34:::txx((r   c                     | j                   r-t        t        | j                         | j                              S | j                  t        j                        r\   )rZ  strr  rG  r   rE  r   r   r   s    r   r"  z	Ref.AsKey  s=    zzT^^%t'7'7899txx((r   c                 :    | j                   t        j                  u S r\   )r<  r   r   r   s    r   rY  zRef.IsString  s    ::$$r   c                     | j                   r.t        | j                         | j                        j                  S | j
                  r| j                  S | j                  t        j                        r\   )
rY  r   rG  r   r   rZ  r(  rE  r   r   r   s    r   AsStringByteszRef.AsStringBytes  sO    }}DNN$d&6&67===	__t{{++r   c                     | j                   r-t        t        | j                         | j                              S | j
                  r| j                  S | j                  t        j                        r\   )
rY  rn  r   rG  r   rZ  r"  rE  r   r   r   s    r   r#  zRef.AsString  sN    }}($*:*:;<<	ZZt{{++r   c                 h    t        | j                         | j                        j                  |      S r\   )r   rG  r   r   rQ  s     r   MutateStringzRef.MutateString  s'    $.."D$4$45<<UCCr   c                 :    | j                   t        j                  u S r\   )r<  r   r   r   s    r   r[  z
Ref.IsBlob  rJ  r   c                     | j                   r.t        | j                         | j                        j                  S | j                  t        j                        r\   )r[  r   rG  r   r   rE  r   r   r   s    r   r\  z
Ref.AsBlob  s>    {{$.."D$4$45;;;tyy))r   c                 Z    | j                   xs | j                  xs | j                         S r\   )r]  r   r   r   s    r   IsAnyVectorzRef.IsAnyVector  s%    ==KD..K$2I2I2KKr   c                 Z    | j                   t        j                  t        j                  fv S r\   )r<  r   r   r   r   s    r   r]  zRef.IsVector  s    ::$++txx000r   c                     | j                   r$t        | j                         | j                        S | j	                  t
        j                        r\   )r]  r  rG  r   rE  r   r   r   s    r   r^  zRef.AsVector  s8    }}DNN$d&6&677t{{++r   c                 @    t         j                  | j                        S r\   )r   r   r<  r   s    r   r   zRef.IsTypedVector	  s    djj))r   c                     | j                   rBt        | j                         | j                  t        j                  | j                              S | j                  d      )NTYPED_VECTOR)r   r  rG  r   r   r   r<  rE  r   s    r   r_  zRef.AsTypedVector  sP    )4+;+;66tzzBD D ~..r   c                 @    t         j                  | j                        S r\   )r   r   r<  r   s    r   r   zRef.IsFixedTypedVector  s    ""4::..r   c                     | j                   rHt        j                  | j                        \  }}t	        | j                         | j                  ||      S | j                  d      )NFIXED_TYPED_VECTOR)r   r   r   r<  r  rG  r   rE  )r   r   r   s      r   r`  zRef.AsFixedTypedVector  sT    ==djjIlD)4+;+;\4PP344r   c                 :    | j                   t        j                  u S r\   )r<  r   r   r   s    r   IsMapz	Ref.IsMap!  rk  r   c                     | j                   r$t        | j                         | j                        S | j	                  t
        j                        r\   )r  r&  rG  r   rE  r   r   r   s    r   AsMapz	Ref.AsMap%  s8    zz!4#3#344txx((r   c                 h   | j                   ry| j                  r| j                  S | j                  r| j                  S | j
                  r| j                  S | j                  r| j                  S | j                  r| j                  S | j                  r| j                  S | j                  r| j                  j                  S | j                   r| j"                  j                  S | j$                  r| j&                  j                  S | j(                  r| j*                  j                  S t-        d| z        )zConverts current reference to value of corresponding type.

    This is equivalent to calling `AsInt` for integer values, `AsFloat` for
    floating point values, etc.

    Returns:
      Value of corresponding type.
    Nzcannot convert %r to value)rI  rL  rO  rT  rN  rU  rg  rY  r#  rZ  r"  r[  r\  r  r  r  r]  r^  r   r_  r   r`  r   r   s    r   r  z	Ref.Value,  s     {{	[[	ZZ	\\	]]	ZZ	[[	ZZ	]]   			%%%		 	 $$***2T9::r   N)+r'   r(   r)   r*   r   r+   r  r   r   r   rB  rE  rG  rI  rL  rO  rR  rV  rT  rN  rb  rU  rg  ri  rZ  r(  r"  rY  rq  r#  rt  r[  r\  rx  r]  r^  r   r_  r   r`  r  r  r  r,   r   r   r  r    sf   1=)5 5J * *K5 # # # #  
I & & . . ) ):. ; ; + +.& " " ) ) ) ) % % , , , ,D # # * * L L 1 1 , , * * / / / / 5 5 " " ) )  ;  ;r   r  c                 :    	 t        |        y# t        $ r Y yw xY w)NTF)iterr   )objs    r   _IsIterabler  P  s#    I	 s    	c                       e Zd ZdZed        Zed        Zed        Zed        Zed        Z	ed        Z
d Zed	        Zed
        Zed        Zej"                  fdZddZej"                  fdZd Zd Zy)r  z;Class to represent given value during the encoding process.c                  T    t        dt        j                  t        j                        S rM   )r  r   r   r	   r   r,   r   r   Nullz
Value.Null[  s    DIIx{{++r   c                 T    t        | t        j                  t        j                        S r\   )r  r   r   r	   r   r   s    r   Boolz
Value.Bool_  s    		8;;//r   c                 8    t        | t        j                  |      S r\   )r  r   r   r   r~   s     r   Intz	Value.Intc  s    ),,r   c                 8    t        | t        j                  |      S r\   )r  r   r   r  s     r   UIntz
Value.UIntg  s    		9--r   c                 8    t        | t        j                  |      S r\   )r  r   r   r  s     r   FloatzValue.Floatk  s    

I..r   c                 T    t        | t        j                  t        j                        S r\   )r  r   r   r	   r   )rS   s    r   r  z	Value.Keyo  s    8;;//r   c                 .    || _         || _        || _        y r\   _valuer<  _min_bit_width)r   r   r}   min_bit_widths       r   r   zValue.__init__s  s    DKDJ (Dr   c                     | j                   S r\   )r  r   s    r   r  zValue.Valuez  s    ;;r   c                     | j                   S r\   )r<  r   s    r   r   z
Value.Type~  s    ::r   c                     | j                   S r\   )r  r   s    r   MinBitWidthzValue.MinBitWidth  s    r   c                 `    t         j                  | j                  | j                  |            S r\   )r   r   r<  StoredWidthr   parent_bit_widths     r   StoredPackedTypezValue.StoredPackedType  s#    99TZZ!1!12B!CDDr   c                    t         j                  | j                        r| j                  S dD ]E  }|t	        ||      z   ||z  z   }t
        j                  || j                  z
        }|d|z  k(  sC|c S  t        d      )Nr!   r
   zrelative offset is too big)	r   r   r<  r  rK   r	   r   r  r   )r   rI   
elem_indexr%   
offset_locr~   s         r   	ElemWidthzValue.ElemWidth  s}    }}TZZ     
mHjAA
*+j**Z$++56i	Y	' ! 1
22r   c                     t         j                  | j                        rt        | j                  |      S | j                  S r\   )r   r   r<  maxr  r  s     r   r  zValue.StoredWidth  s2    }}TZZ $$&677r   c                 V    d| j                   d| j                  d| j                  dS )NzValue(z, )r  r   s    r   r   zValue.__repr__  s    "&++tzz4;N;NOOr   c                 ,    t        | j                        S r\   )rn  r  r   s    r   r   zValue.__str__  s    t{{r   Nr   )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  X  s    C, , 0 0 - - . . / / 0 0(       /7kk E	3 *2 
Pr   r  c                       fd}|S )Nc                     t        |d   t              r$| j                  |d           | g|dd  i | y  | g|i | y )Nr   r
   )r   rn  r  )r   argskwargsfuncs      r   wrapperzInMap.<locals>.wrapper  sK    $q'3
hhtAw
4%$qr(%f%
4!$!&!r   r,   r  r  s   ` r   InMapr    s    " 
.r   c                       fd}|S )Nc                     t        |      dk(  r | |d          y t        |      dk(  r!| j                  |d           | |d          y t        d      )Nr
   r   r   zinvalid number of arguments)r7   r  r   )r   r  r  s     r   r  zInMapForString.<locals>.wrapper  sQ    
4yA~
4a	Ta
hhtAw
4a455r   r,   r  s   ` r   InMapForStringr    s    6 
.r   c                   2    e Zd ZdZd Zd Zd Zed        Zy)PoolzCCollection of (data, offset) pairs sorted by data for quick access.c                     g | _         y r\   _poolr   s    r   r   zPool.__init__  	    DJr   c                     ||f}t        | j                  |d       }|dk7  r| j                  |   \  }}|S | j                  j                  ||       y )Nc                     | d   |d   k  S rM   r,   r)  s     r   r_   z#Pool.FindOrInsert.<locals>.<lambda>  s    qtad{r   ra   )rc   r  insert)r   datarS   dorb   _s         r   FindOrInsertzPool.FindOrInsert  sS    	vB$**b*BCE{**U#iamJJeR r   c                     g | _         y r\   r  r   s    r   Clearz
Pool.Clear  r  r   c                 L    | j                   D cg c]  \  }}|	 c}}S c c}}w r\   r  )r   r  r  s      r   ElementszPool.Elements  s"     $

+
WT1D
+++s    N)	r'   r(   r)   r*   r   r  r  r   r  r,   r   r   r  r    s(    K , ,r   r  c                   J   e Zd ZdZddej
                  fdZd Zed        Z	ed        Z
d Zd	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd/dZd Zed        Zed        Zd Zd/dZed        Zed0d       Zed0d       Zed0d       Z ed0d       Z!ed0d       Z"ed0d       Z#d  Z$d! Z%e&jN                  d/d"       Z(ed#        Z)e&jN                  d/d$       Z*ed/d%       Z+e	 	 d1d&       Z,d' Z-d( Z.e&jN                  d/d)       Z/d* Z0d+ Z1ed,        Z2ed-        Z3ed.        Z4y)2r   z?Helper class to encode structural data into flexbuffers format.FTc                     || _         || _        || _        t               | _        t               | _        d| _        t               | _        g | _	        y NF)
_share_strings_share_keys_force_min_bit_widthr  _string_pool	_key_pool	_finishedr   r   _stack)r   share_strings
share_keysforce_min_bit_widths       r   r   zBuilder.__init__  sF     (D!D 3DDVDNDNDIDKr   c                 ,    t        | j                        S r\   )r7   r   r   s    r   r   zBuilder.__len__  s    tyy>r   c                     | j                   S r\   )r  r   s    r   
StringPoolzBuilder.StringPool  s    r   c                     | j                   S r\   )r  r   s    r   KeyPoolzBuilder.KeyPool  s    >>r   c                     | j                   j                          | j                  j                          d| _        t	               | _        g | _        y r  )r  r  r  r  r   r   r  r   s    r   r  zBuilder.Clear  s;    NNDNDIDKr   c                    | j                   rt        d      t        | j                        dk7  rt        d      | j                  d   }| j	                  |j                  t        | j                                    }| j                  ||       | j                  t        |j                         d       | j                  t        |d       d| _        | j                  S )z8Finishes encoding process and returns underlying buffer.z!builder has been already finishedr
   zinternal stack size must be oner   r$   T)r  RuntimeErrorr7   r  _Alignr  r   	_WriteAny_Writer   r  finished)r   r   r%   s      r   FinishzBuilder.Finish  s    ~~<== 4;;1:;;KKNEU__S^<=JNN5ZN0KK5))+K:KK:!K,DM99r   c                 H    | j                   |d  }|d |j                  d       S rM   )r   r   )r   rS   r   s      r   _ReadKeyzBuilder._ReadKey  s'    
))FG
C|r   c                     d|z  }| j                   j                  dt        t        | j                         |      z         |S )Nr
       )r   extendrK   r7   )r   	alignmentr%   s      r   r  zBuilder._Align  s7    iJIIW}S^ZHHIr   c                 P    | j                   j                  t        |||             y r\   )r   r  r@   )r   r8   r   r%   s       r   r  zBuilder._Write  s    IIU3z23r   c                 P    | j                   j                  t        |||             y r\   )r   r  rC   )r   r8   rB   r%   s       r   _WriteVectorzBuilder._WriteVector  s    II[fj9:r   c                     t        | j                        |z
  }|dk(  s|dd|z  z  k  sJ | j                  t        ||       y )Nr#   r
   )r7   r   r  r   )r   rS   r%   relative_offsets       r   _WriteOffsetzBuilder._WriteOffset  sA    $))nv-O?oq:~1FGGGKK?J/r   c           
      z   t         j                  t        t         j                  t        t         j                  t
        t         j                  t        t         j                  t        ij                  |j                         }|r| j                  ||j                  |       y | j                  |j                  |       y r\   )r   r   r   r   r   r   r   r   r   getr  r  r  )r   r   r%   r8   s       r   r  zBuilder._WriteAny  so    		1diiDHHaAtzz1	c%**o  
kk#u{{J/
Z0r   c                    t         j                  t        |            }| j                  |      }| j	                  t        t        |      |       t        | j
                        }| j
                  j                  |       |r| j
                  j                  d       | j                  j                  t        |||             |S rM   )
r	   r   r7   r  r  r   r  appendr  r  )r   r  append_zeror}   r~   r%   locs          r   
_WriteBlobzBuilder._WriteBlob(  s    

3t9%IY'JKK3t9j)
dii.CIIT
iiqKKuS%34Jr   c                    t         j                  |      }t         j                  t        |            |kD  rt	        d      | j                  |       |s | j                  t        t        |      |       t        | j                        }t        j                  t        t        j                  t        t        j                  t        ij                  |      }|st        d      | j!                  |||       t        j#                  ||rt        |      nd      }| j$                  j'                  t)        |||             |S )z7Writes scalar vector elements to the underlying buffer.z*too many elements for the given byte_widthzunsupported element_typer   )r	   r&   r   r7   r   r  r  r   r   r   r   r   r   r   r  r   r  r   r  r  r  )	r   r   r%   elementsfixedr~   r  r8   r}   s	            r   _WriteScalarVectorzBuilder._WriteScalarVector3  s    

:&I zz#h- 9,CDDKK	
kk!S]J/
dii.C88Q		1djj!
4
8
8
FC011c8Z0|eS]KEKKuS%34Jr   Nc           	      v   t        |      }|r|st        d      t        | j                  t        j                  |            }d}|r3t        ||j                  t        | j                                    }|dz  }t        j                  }t        |      D ]f  \  }	}
t        ||
j                  t        | j                        ||	z               }|s;|	dk(  r|
j                  }M||
j                  k7  s]t        d       |r t        j                  |      st        d      | j                  |      }|r@| j                  |j                  |       | j!                  t
        d|j"                  z  |       |s| j!                  t
        ||       t        | j                        }|D ]  }
| j%                  |
|        |s1|D ],  }
| j                  j'                  |
j)                  |             . |rt        j*                  }n-|rt        j-                  ||r|nd      }nt        j.                  }t        |||      S )z0Writes vector elements to the underlying buffer.zfixed vector must be typedr
   r   r   z.typed vector elements must be of the same typer   )r7   r   r  r  r	   r   r  r   r   r   	enumerater  r   r  r  r  r  r  r  r  r  r   r   r   )r   r  typedr  keysr=   r~   prefix_elemsvector_typer/   r  r%   r  r}   s                 r   _CreateVectorzBuilder._CreateVectorK  s   ]FU344 D--xzz&/ABILiDII!?@ial((K(#1iS^\A=M!NOi	6+AFF"OPP $ T77DBCCY'J


J/
kk!Q$***J7
kk!VZ( dii.C
nnQ
#  !		++I67  hhe	"";%QGeY''r   c                 D   | j                  |      }t        | j                        }t        j                  t
        t        j                  t        t        j                  t        i|   }| j                  |||       | j                  j                  t        |||             y r\   )r  r7   r   r   r   r   r   r   r   r   r  r  r  r  )r   r   r}   r~   r%   r  r8   s          r   _PushIndirectzBuilder._PushIndirect  s|    Y'J
dii.C1AQ 	C
 	KKUJ'KKuS%34r   c                 4   t        | j                        }|j                  d      }| j                  |dt        j
                        }| j                  rC| j                  j                  ||      }|%| j                  |d= |x| j                  d   _
        }|S )zEncodes string value.r   Tr  r}   Nra   )r7   r   r   r  r   r   r  r  r  r  r  )r   r   reset_tor   r  prev_locs         r   r   zBuilder.String  s     499~Hll7#G
//'t4;;/
GC""//=h		IIhi '//BJr   c                 F    | j                  |dt        j                        S )zEncodes binary blob value.

    Args:
      value: A byte/bytearray value to encode

    Returns:
      Offset of the encoded value in underlying the byte buffer.
    Fr  )r  r   r   rQ  s     r   r   zBuilder.Blob  s     ??5e499?EEr   c                    t        |t        t        f      r|}n|j                  d      }d|v rt	        d      t        | j                        }| j                  j                  |       | j                  j                  d       | j                  r/| j                  j                  ||      }|| j                  |d= |}| j                  j                  t        j                  |             |S )a  Encodes key value.

    Args:
      value: A byte/bytearray/str value to encode. Byte object must not contain
        zero bytes. String object must be convertible to ASCII.

    Returns:
      Offset of the encoded value in the underlying byte buffer.
    r  r   zkey contains zero byteN)r   bytesr   r   r   r7   r   r  r  r  r  r  r  r  r  )r   r   r   r  r  s        r   r  zBuilder.Key  s     %%+,gW%gG|/00
dii.CIIWIIQ,,Wc:h		IIcdOKKuyy~&Jr   c                     |r| j                  |       | j                  j                  t        j	                                y)zEncodes None value.N)r  r  r  r  r  r   s     r   r  zBuilder.Null  s(    

hhsmKKuzz|$r   c                 `    | j                   j                  t        j                  |             y)zDEncodes boolean value.

    Args:
      value: A boolean value.
    N)r  r  r  r  rQ  s     r   r  zBuilder.Bool  s     	KKuzz%()r   c                     |dk(  rt         j                  |      nt         j                  |      }| j                  j	                  t
        j                  ||             y)zEncodes signed integer value.

    Args:
      value: A signed integer value.
      byte_width: Number of bytes to use: 1, 2, 4, or 8.
    r   N)r	   r   r&   r  r  r  r  r   r   r%   r~   s       r   r  zBuilder.Int  s@     &01_

5!(**Z:PIKKuyy	23r   c                     |dk(  rt         j                  |      nt         j                  |      }| j                  |t        j
                  |       y)zEncodes signed integer value indirectly.

    Args:
      value: A signed integer value.
      byte_width: Number of bytes to use: 1, 2, 4, or 8.
    r   N)r	   r   r&   r  r   r   r  s       r   IndirectIntzBuilder.IndirectInt  s;     &01_

5!(**Z:PIud//;r   c                     |dk(  rt         j                  |      nt         j                  |      }| j                  j	                  t
        j                  ||             y)zEncodes unsigned integer value.

    Args:
      value: An unsigned integer value.
      byte_width: Number of bytes to use: 1, 2, 4, or 8.
    r   N)r	   r   r&   r  r  r  r  r  s       r   r  zBuilder.UInt  s@     &01_

5!(**Z:PIKKuzz%34r   c                     |dk(  rt         j                  |      nt         j                  |      }| j                  |t        j
                  |       y)zEncodes unsigned integer value indirectly.

    Args:
      value: An unsigned integer value.
      byte_width: Number of bytes to use: 1, 2, 4, or 8.
    r   N)r	   r   r&   r  r   r   r  s       r   IndirectUIntzBuilder.IndirectUInt  s;     &01_

5!(**Z:PIud00)<r   c                     |dk(  rt         j                  |      nt         j                  |      }| j                  j	                  t
        j                  ||             y)zEncodes floating point value.

    Args:
      value: A floating point value.
      byte_width: Number of bytes to use: 4 or 8.
    r   N)r	   r   r&   r  r  r  r  r  s       r   r  zBuilder.Float  s@     &01_

5!(**Z:PIKKu{{5)45r   c                     |dk(  rt         j                  |      nt         j                  |      }| j                  |t        j
                  |       y)zEncodes floating point value indirectly.

    Args:
      value: A floating point value.
      byte_width: Number of bytes to use: 4 or 8.
    r   N)r	   r   r&   r  r   r   r  s       r   IndirectFloatzBuilder.IndirectFloat  s;     &01_

5!(**Z:PIud119=r   c                 ,    t        | j                        S )zStarts vector construction.r7   r  r   s    r   _StartVectorzBuilder._StartVector      t{{r   c                     | j                  | j                  |d ||      }| j                  |d= | j                  j                  |       |j                  S )z6Finishes vector construction by encodung its elements.N)r  r  r  r  )r   rN   r  r  vecs        r   
_EndVectorzBuilder._EndVector  sK    


T[[0%
?CEFKKs99r   c              #      K   |r| j                  |       	 | j                         }|  | j                  |dd       y # | j                  dd       w xY ww)NFr  r  r  r  r  r   r   rN   s      r   r  zBuilder.Vector$  sP     

hhsm7!ej
ooe5o6dooe5o6   AA  A AAc                     | j                         5  |D ]  }| j                  |        	 ddd       y# 1 sw Y   yxY w)zEncodes sequence of any elements as a vector.

    Args:
      elements: sequence of elements, they may have different types.
    N)r  Add)r   r  r  s      r   VectorFromElementszBuilder.VectorFromElements/  s,     
!  
s   4=c              #      K   |r| j                  |       	 | j                         }|  | j                  |dd       y # | j                  dd       w xY ww)NTFr  r   r!  s      r   r  zBuilder.TypedVector:  sP     

hhsm6!ej
ooe4uo5dooe4uo5r"  c                    t        |t        j                        r|j                  dk(  r$| j                  t        j
                  d|d       y
|j                  dk(  r$| j                  t        j
                  d|d       y
|j                  dv r.| j                  t        j                  |j                  |d       y
|j                  dv r.| j                  t        j                  |j                  |d       y
t        d	|j                  z        || j                  n| j                  |      }| j                         5  |D ]
  } ||        	 d
d
d
       y
# 1 sw Y   y
xY w)a%  Encodes sequence of elements of the same type as typed vector.

    Args:
      elements: Sequence of elements, they must be of the same type.
      element_type: Suggested element type. Setting it to None means determining
        correct value automatically based on the given elements.
    r3   r"   Fr  r4   r#   )r-   r.   r/   lr0   )r&   r1   r   Lr2   zunsupported array typecode: %sN)r   arraytypecoder  r   r   r   itemsizer   r   r$  Adderr  )r   r  r   addr  s        r   TypedVectorFromElementszBuilder.TypedVectorFromElementsE  s+    (EKK(			c	!

AxuE#

AxuE 99HHh'' 	  	@ 99IIx(((% 	  	A 9H<M<MMNN$,DHH$**\2JcA
a&  s    EE#c                    dt        |      cxk  rdk  st        d       t        d      |D ch c]  }t        |       }}t        |      dk7  rt        d      |\  }|It        t
        j                  t        t
        j                  ij                  |      }|st        d|z        |dk(  rvt
        j                  t        j                  t
        j                  t        j                  t
        j                  t        j                  i|   dt        fd	|D              z  }| j!                  |||d
       yc c}w )a  Encodes sequence of elements of the same type as fixed typed vector.

    Args:
      elements: Sequence of elements, they must be of the same type. Allowed
        types are `Type.INT`, `Type.UINT`, `Type.FLOAT`. Allowed number of
        elements are 2, 3, or 4.
      element_type: Suggested element type. Setting it to None means determining
        correct value automatically based on the given elements.
      byte_width: Number of bytes to use per element. For `Type.INT` and
        `Type.UINT`: 1, 2, 4, or 8. For `Type.FLOAT`: 4 or 8. Setting it to 0
        means determining correct value automatically based on the given
        elements.
    r   r"   z&only 2, 3, or 4 elements are supportedr
   z%all elements must be of the same typeNr  r   c              3   .   K   | ]  } |        y wr\   r,   ).0r  widths     r   	<genexpr>z7Builder.FixedTypedVectorFromElements.<locals>.<genexpr>  s     7hE!Hhs   Tr(  )r7   r   typer   r|   r   r   re  r   r  r   r	   r   r   r   r  r  )r   r  r   r%   r  typesr}   r4  s          @r   FixedTypedVectorFromElementsz$Builder.FixedTypedVectorFromElementsa  s   $ H""?@@ #?@@&'hT!WhE'
5zQ=>>FE488UDJJ7;;EBl6>??Q
))XZZ
((HJJ
**hjj 		e
 7h777jL*hdK' (s   D>c                 ,    t        | j                        S )zStarts map construction.r  r   s    r   	_StartMapzBuilder._StartMap  r  r   c                      j                   |d }t        |      dz  dk7  rt        d      |ddd   D ]:  }|j                  t        j                  us t        dt        j                  z         t        |ddd   |ddd         }t        | fd      } j                   |d= |D ]  } j                   j                  |         j                   j                   |dd   d	d
      } j                   j                   |dz   dd   d
d
|      } j                   |d=  j                   j                  |       |j                  S )z3Finishes map construction by encodung its elements.Nr   r   z&must be even number of keys and valueszall map keys must be of %s typer
   c                 @    j                  | d   j                        S rM   )r  r  )pairr   s    r   r_   z!Builder._EndMap.<locals>.<lambda>  s    4==a+Gr   )r   TFr  )r  r  r  )r  r7   r  r   r   r5  sortedr  r  r  r  )r   rN   stackr   pairsr=  r  rB   s   `       r   _EndMapzBuilder._EndMap  sE    KKE
5zA~ABBSqSz		!<txxGHH  cc
E!$Q$K(E5GHEEF
kk  dkk%((34uMDEAILqL!e$   HF 	EFKKv<<r   c              #      K   |r| j                  |       	 | j                         }|  | j                  |       y # | j                         w xY wwr\   )r  r:  rA  r!  s      r   r&  zBuilder.Map  sB     

hhsmnnej
ll5dll5s   A= AAAc                     | j                         }|j                         D ]'  \  }}| j                  |       | j                  |       ) | j	                  |       y r\   )r:  itemsr  r$  rA  )r   r  rN   r6  r7  s        r   MapFromElementszBuilder.MapFromElements  sG    NNE 1
hhqk
hhqk ! 	LLr   c                    t         j                  | j                  t         j                  | j                  t         j
                  | j                  t         j                  | j                  t         j                  | j                  t         j                  | j                  t         j                  | j                  t         j                  | j                   t         j"                  | j$                  t         j&                  | j(                  i
|   S r\   )r   r   r  r   r  r   r  r   r  r   r  r   r  r   r  r   r  r   r   r   r   )r   r}   s     r   r.  zBuilder.Adder  s    		499$((4++		499D--

DJJT//$((		499T[[  r   c                 *   || j                          yt        |t              r| j                  |       yt        |t              r| j                  |       yt        |t              r| j                  |       yt        |t              r| j                  |       yt        |t        t        f      r| j                  |       yt        |t              rU| j                         5  |j                         D ]'  \  }}| j!                  |       | j#                  |       ) 	 ddd       yt        |t$        j$                        r| j'                  |       yt)        |      r| j+                  |       yt-        dt/        |      z        # 1 sw Y   yxY w)z$Encodes value of any supported type.Nzunsupported python type: %s)r  r   r   r  r|   r  re  r  rn  r   r
  r   r   dictr&  rD  r  r$  r+  r0  r  r%  r   r6  )r   r   r6  r7  s       r   r$  zBuilder.Add  s    }
iik	E4	 
ii	E3	
hhuo	E5	!
jj	E3	
kk%	EE9-	.
ii	E4	 88:KKMDAq
((1+
((1+ " : 
E5;;	'
""5)	U	
e$3d5kABB :s   $;F		Fc                      | j                   d   S )Nra   )r  r   s    r   	LastValuezBuilder.LastValue  s    ;;r?r   c                 :    | j                   j                  |       y r\   )r  r  rQ  s     r   
ReuseValuezBuilder.ReuseValue  s    KKur   r\   r   rM   )5r'   r(   r)   r*   r	   r   r   r   r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r   r  r  r  r  r  r  r  r  r  r  r  
contextlibcontextmanagerr  r%  r  r0  r8  r:  rA  r&  rE  r.  r$  rJ  rL  r,   r   r   r   r     s4   G ##+;;    *
4;0
1	08(t	5   		F 		F<% 	* 	* 	4 	4 	< 	< 	5 	5 	= 	= 	6 	6 	> 	> 7 7 	 	 6 6 	 	6 	 15./'L 	'LR6   C C4   	 	r   r   c                     t        |       dk  rt        d      | d   }t        j                  t	        | d|z          || d         S )z/Returns root `Ref` object for the given buffer.r   zbuffer is too smallra   r   r0  r   )r7   r   r  r  r   )r9   r%   s     r   r   r     sS    X\
*
++2w*		#Z !:3r7 
 
D Dr   c                 X    t               }|j                  |        |j                         S )z1Returns bytearray with the encoded python object.)r   r$  r  )r  fbbs     r   r   r     s     	#''#,	r   c                 ,    t        |       j                  S )z.Returns python object decoded from the buffer.)r   r  )r9   s    r   r   r     s    			r   )(r*   r+  rM  enumr   __all__IntEnumr	   r   r   r   r:   r>   r@   rC   rF   rK   rT   rZ   rc   r   r   r   r   r   r   r  r  r  r&  r  r  r  r  r  r  r   r   r   r   r,   r   r   <module>rV     s_      
:8t|| 8v 	$$6A
5H'
$$ '9 s@4<< s@l%M %MP
 
F &	85 	8 :U  :F7& 7,2U 2.9F% 9Fx$7& $7Nn; n;b	J JZ	, ,.Y YxDr   