ɺhodZdZddlZddlmZdZe ZdZdZdZ d Z d Z d Z e exZ xZZe exZZe eejxZZe d xZxZZe d xZxZZe dZdZdZdZdZdZ dZ!dZ"dZ#e"Z$e#Z%dZ&dZ'dZ(dZ)dZ*dZ+e(ej,e%exZ-xZ.Z/e(ej,e$exZ0Z1e)ej,e$eejxZ2Z3e*ej4dZ5e*ej6dZ7e*ej4dZ8e*ej6d Z9e+ej4d!Z:e+ej6d"Z;d#Zd&Z?d'Z@d(ZAd)ZBdS)*aCode for encoding protocol message primitives. Contains the logic for encoding every logical protocol field type into one of the 5 physical wire types. This code is designed to push the Python interpreter's performance to the limits. The basic idea is that at startup time, for every field (i.e. every FieldDescriptor) we construct two functions: a "sizer" and an "encoder". The sizer takes a value of this field's type and computes its byte size. The encoder takes a writer function and a value. It encodes the value into byte strings and invokes the writer function to write those strings. Typically the writer function is the write() method of a BytesIO. We try to do as much work as possible when constructing the writer and the sizer rather than when calling them. In particular: * We copy any needed global functions to local variables, so that we do not need to do costly global table lookups at runtime. * Similarly, we try to do any attribute lookups at startup time if possible. * Every field's tag is encoded to bytes at startup, since it can't change at runtime. * Whatever component of the field size we can compute at startup, we do. * We *avoid* sharing code if doing so would make the code slower and not sharing does not burden us too much. For example, encoders for repeated fields do not just call the encoders for singular fields in a loop because this would add an extra function call overhead for every loop iteration; instead, we manually inline the single-value encoder into the loop. * If a Python function lacks a return statement, Python actually generates instructions to pop the result of the last statement off the stack, push None onto the stack, and then return that. If we really don't care what value is returned, then we can save two instructions by returning the result of the last statement. It looks funny but it helps. * We assume that type and bounds checking has happened at a higher level. z kenton@google.com (Kenton Varda)N) wire_formatgc|dkrdS|dkrdS|dkrdS|dkrdS|d krd S|d krd S|d krdS|dkrdS|dkrdSdS)z#Compute the size of a varint value.? values /builddir/build/BUILD/imunify360-venv-2.5.2/opt/imunify360/venv/lib64/python3.11/site-packages/google/protobuf/internal/encoder.py _VarintSizerPs d]]11 f__QQ hqq i k!! mAA oaa qq     c|dkrdS|dkrdS|dkrdS|dkrdS|d krd S|d krd S|d krdS|dkrdS|dkrdS|dkrdSdS)z*Compute the size of a signed varint value.rrrrrrr r r r r rrrrrrrrrrrs r_SignedVarintSizer^s QYYrr d]]11 f__QQ hqq i k!! mAA oaa qq     rcFttj|dS)zQReturns the number of bytes required to serialize a tag with this field number.r)rrPackTag) field_numbers r_TagSizer#ms [(q99 : ::rcfd}|S)zA sizer which uses the function compute_value_size to compute the size of each value. Typically compute_value_size is _VarintSize.cnt||rtfd}|S|rfd}|Sfd}|S)NcPd}|D]}||z }||zzSNrr)rresultelementcompute_value_sizelocal_VarintSizetag_sizes rPackedFieldSizez<_SimpleSizer..SpecificSizer..PackedFieldSizesK 0 0G &&w// /&&((0008;;rcRt|z}|D]}||z }|SNlen)rr(r)r*r,s rRepeatedFieldSizez>_SimpleSizer..SpecificSizer..RepeatedFieldSizes?CJJ& 0 0G &&w// /&& rc |zSr/r)rr*r,s r FieldSizez6_SimpleSizer..SpecificSizer..FieldSizes,,U3333rr#r) r" is_repeated is_packedr-r2r4r+r,r*s @@r SpecificSizerz#_SimpleSizer..SpecificSizers %%H$<<<<<<<    444444 rr)r*r8s` r _SimpleSizerr9|s$, rcfd}|S)zLike SimpleSizer, but modify_value is invoked on each value before it is passed to compute_value_size. modify_value is typically ZigZagEncode.ctt||rt fd}|S|r  fd}|S fd}|S)Ncbd}|D]}||z }||zzSr'r)rr(r)r*r+ modify_valuer,s rr-z>_ModifiedSizer..SpecificSizer..PackedFieldSizesU > >G &&||G'<'<== =&&((0008;;rcdt|z}|D]}||z }|Sr/r0)rr(r)r*r=r,s rr2z@_ModifiedSizer..SpecificSizer..RepeatedFieldSizesICJJ& > >G &&||G'<'<== =&& rc2|zSr/r)rr*r=r,s rr4z8_ModifiedSizer..SpecificSizer..FieldSizes$,,\\%-@-@AAAArr5) r"r6r7r-r2r4r+r,r*r=s @@rr8z%_ModifiedSizer..SpecificSizers %%H$<<<<<<<<    BBBBBBB rr)r*r=r8s`` r_ModifiedSizerr@s*, rcfd}|S)zWLike _SimpleSizer except for a fixed-size field. The input is the size of one value.c t| |rt fd}|S|r zfd}|S zfd}|S)NcJt|z}||zzSr/r0)rr(r+r, value_sizes rr-z;_FixedSizer..SpecificSizer..PackedFieldSizes/Uj(((0008;;rc(t|zSr/r0)r element_sizes rr2z=_FixedSizer..SpecificSizer..RepeatedFieldSizes5zzL((rcSr/r)r field_sizes rr4z5_FixedSizer..SpecificSizer..FieldSizes rr5) r"r6r7r-r2r4rFrHr+r,rDs @@@@rr8z"_FixedSizer..SpecificSizers %%H$<<<<<<<  (*l))))) (j rr)rDr8s` r _FixedSizerrIs$& rr rrcrt|tt|rJ|r fd}|Sfd}|S)z#Returns a sizer for a string field.ct|z}|D]1}|d}|||zz }2|SNzutf-8)r1encoderr(r)lr+ local_lenr,s rr2z&StringSizer..RepeatedFieldSizes_#e**$f**' IgnnW-- . .""1%%)) mrcb|d}|z|zSrLrMrrOr+rPr,s rr4zStringSizer..FieldSizes: )ELL)) * *a ((++ +a //rr#rr1r"r6r7r2r4r+rPr,s @@@r StringSizerrVl # #( )   0000000 rcrt|tt|rJ|r fd}|Sfd}|S)z"Returns a sizer for a bytes field.cnt|z}|D]}|}|||zz }|Sr/r0rNs rr2z%BytesSizer..RepeatedFieldSizesS#e**$f**' Ig  ""1%%)) mrc<|}|z|zSr/rrSs rr4zBytesSizer..FieldSize s. )E  a ((++ +a //rrTrUs @@@r BytesSizerr[rWrcPt|dz|rJ|rfd}|Sfd}|S)z"Returns a sizer for a group field.rcdt|z}|D]}||z }|Sr/r1ByteSize)rr(r)r,s rr2z%GroupSizer..RepeatedFieldSizes?#e**$f%%''""$$$ mrc2|zSr/r_)rr,s rr4zGroupSizer..FieldSizes (( ((r)r#)r"r6r7r2r4r,s @r GroupSizerrbsjl # #a '(   ))))) rc^t|t|rJ|rfd}|Sfd}|S)z$Returns a sizer for a message field.ct|z}|D]'}|}|||zz }(|Sr/r^)rr(r)rOr+r,s rr2z'MessageSizer..RepeatedFieldSize)sU#e**$f**'     ""1%%)) mrcN|}|z|zSr/ra)rrOr+r,s rr4zMessageSizer..FieldSize1s. ..  a ((++ +a //rr5)r"r6r7r2r4r+r,s @@r MessageSizerrf"sxl # #(    000000 rctddztdzt|ztdztfd}|S)zReturns a sizer for extensions of MessageSet. The message set message looks like this: message MessageSet { repeated group Item = 1 { required int32 type_id = 2; required string message = 3; } } rrr cN|}|z|zSr/ra)rrOr+ static_sizes rr4z&MessageSetItemSizer..FieldSizeJs. A ))!,, ,q 00rr5)r"r4r+ris @@rMessageSetItemSizerrj;sg!q8A;;.\1J1JJ!+ 111111 rcT|jt|jddfd}|S)z Returns a sizer for a map field.Fcd}|D]E}||}||}||z }r|F|S)Nrkeyr)_concrete_classr_) map_valuetotalrnr entry_msgis_message_map message_sizer message_types rr4zMapSizer..FieldSize]sl E  ne ..3e.DDi }}Y'''e   Lr)rurfnumber)field_descriptorrsr4rtrus ` @@rMapSizerrxUsO ".,/6uEE-        rcFtjdjdfd }|S)zBReturn an encoder for a basic varint value (does not include tag).>BNc|dz}|dz}|r#|d|z|dz}|dz}|#||S)Nrrrwriterunused_deterministicbitslocal_int2bytes r EncodeVarintz$_VarintEncoder..EncodeVarintwss 4.EncodeSignedVarints qyy e 4.SpecificEncoder..EncodePackedFields i . .G $$W-- -$$5$ 666 6 6G ,ug} 5 5 5 5 6 6rcB|D]}||||dSr/r)r~rrr)rrs rEncodeRepeatedFieldzD_SimpleEncoder..SpecificEncoder..EncodeRepeatedFieldsC 6 6G %    ,ug} 5 5 5 5 6 6rc4||||Sr/r)r~rrrrs r EncodeFieldz<_SimpleEncoder..SpecificEncoder..EncodeFields' i|E5-888rrrWIRETYPE_LENGTH_DELIMITEDr) r"r6r7rrrrrr*rrs @@rSpecificEncoderz'_SimpleEncoder..SpecificEncoders<)NOOi(66666666  <33i666666! <33i999999rr)rrr*rs``` r_SimpleEncoderrs06 rcfd}|S)zLike SimpleEncoder but additionally invokes modify_value on every value before passing it to encode_value. Usually modify_value is ZigZagEncode.c|r,t|tjt  fd}|S|rt|  fd}|St|  fd}|S)Nc| d}|D]}||z }||||D]}|||dSr'r) r~rrrr)r*rrr=rs rrzD_ModifiedEncoder..SpecificEncoder..EncodePackedFields i < .SpecificEncoder..EncodeRepeatedFieldsQ D DG %    ,ull733] C C C C D DrcF||||Sr/r)r~rrrr=rs rrz>_ModifiedEncoder..SpecificEncoder..EncodeFields1 i|E<<#6#6 FFFrr) r"r6r7rrrrrr*rr=rs @@rrz)_ModifiedEncoder..SpecificEncoders<)NOOi(DDDDDDDDD  <33iDDDDDDD! <33iGGGGGGGrr)rrr*r=rs```` r_ModifiedEncoderrs66 rcBtjfd}|S)zReturn a constructor for an encoder for a fixed-width field. Args: wire_type: The field's wire type, for encoding tags. format: The format string to pass to struct.pack(). ctj|r,t|tjt   fd}|S|rt| d fd }|St| d fd }|S)Nc||t|z||D]}||dSr/r0) r~rrr)formatrlocal_struct_packrrDs rrzF_StructPackEncoder..SpecificEncoder..EncodePackedFieldsm i5#e**z"9=III 4 4G %!!&'22 3 3 3 3 4 4rcR|D]"}|||#dSr/r)r~rrr)rrrs rrzH_StructPackEncoder..SpecificEncoder..EncodeRepeatedFieldsM 4 4G %    %!!&'22 3 3 3 3 4 4rcD|||Sr/r)r~rrrrrs rrz@_StructPackEncoder..SpecificEncoder..EncodeFields1 iu&&vu55666rr/rrrrrr) r"r6r7rrrrrrrrDrs @@@rrz+_StructPackEncoder..SpecificEncoders <)NOOi(444444444   <33i44444444! <33i77777777r)rcalcsize)rrrrDs`` @r_StructPackEncoderrsAv&&*2 rctjdkrdndkrdntdzfd}|S)aqReturn a constructor for an encoder for float fields. This is like StructPackEncoder, but catches errors that may be due to passing non-finite floating-point values to struct.pack, and makes a second attempt to encode those values. Args: wire_type: The field's wire type, for encoding tags. format: The format string to pass to struct.pack(). r c|tkr |ddS|tkr |ddS||kr |ddS)Nsss_POS_INF_NEG_INFr~rs rEncodeNonFiniteOrRaisez5_FloatingPointEncoder..EncodeNonFiniteOrRaise-si (   !""""" H   !""""" E>> !""""" rrc|tkr |ddS|tkr |ddS||kr |ddS)Nsssrrs rrz5_FloatingPointEncoder..EncodeNonFiniteOrRaise8si (   122222 H   122222 E>> 122222 rzGCan't encode floating-point values that are %d bytes long (only 4 or 8)ctj|r-t|tjt   fd}|S|rt| d fd }|St| d fd }|S)Nc||t| z||D]4} ||#t$r||Y1wxYwdSr/)r1 SystemError) r~rrr)rrrrrrDs rrzI_FloatingPointEncoder..SpecificEncoder..EncodePackedFieldJs i5#e**z"9=III 3 3G 3 E##FG44 5 5 5 5 3 3 3 " "5' 2 2 2 2 2 3  3 3sAAAc|D]?}| ||$#t$r||Y.SpecificEncoder..EncodeRepeatedFieldWs 3 3G %    3 E##FG44 5 5 5 5 3 3 3 " "5' 2 2 2 2 2 3  3 3s(AAc| ||dS#t$r||YdSwxYwr/r)r~rrrrrrs rrzC_FloatingPointEncoder..SpecificEncoder..EncodeFieldass i / %!!&%00 1 1 1 1 1 / / /  . . . . . . /s %??r/r) r"r6r7rrrrrrrrrDrs @@@rrz._FloatingPointEncoder..SpecificEncoderEs  <)NOOi( 3 3 3 3 3 3 3 3 3 3 <33i333333333! <33i///////// r)rr ValueError)rrrrrDs`` @@r_FloatingPointEncoderrsv&&*1__    Q 35?@ A AA""""""""H rz.EncodePackedFieldsu eIE M:::'   %     %     rNcZ|D]&}||r ||'dSr/r)r~rrr)rrrs rrz(BoolEncoder..EncodeRepeatedFieldsZ' i   %     %     rcJ||r |S|Sr/r)r~rrrrrs rrz BoolEncoder..EncodeFields; eI  uY U:  rr/)rrrrWIRETYPE_VARINT) r"r6r7rrrrrrrs @@@@r BoolEncoderrs*){'LMMI& {'BCCI {'BCCI rct|tjtt|rJ|r fd}|Sfd}|S)z&Returns an encoder for a string field.c|D]C}|d}||||||DdSrLrR)r~rrr)encodedrrPtags rrz*StringEncoder..EncodeRepeatedFieldsh'..)) c 5))G"4"4mDDD g rc|d}||||||SrLrR)r~rrrrrPrs rrz"StringEncoder..EncodeFieldsN W%%g eCjjj ' 2 2MBBB U7^^rrrrrr1r"r6r7rrrrPrs @@@r StringEncoderrs {DEE#$)   rct|tjtt|rJ|r fd}|Sfd}|S)z%Returns an encoder for a bytes field.cj|D].}||||||/dSr/r)r~rrr)rrPrs rrz)BytesEncoder..EncodeRepeatedFieldsW' c 5))G"4"4mDDD grc\||||||Sr/r)r~rrrrPrs rrz!BytesEncoder..EncodeFields= eCjjj % 0 0-@@@ U5\\rrrs @@@r BytesEncoderrs {DEE#$)    rct|tjt|tj|rJ|rfd}|Sfd}|S)z%Returns an encoder for a group field.cj|D].}|||||/dSr/_InternalSerialize)r~rrr)end_tag start_tags rrz)GroupEncoder..EncodeRepeatedFieldsQ' i""5-888 grc\|||||Sr/r)r~rrrrs rrz!GroupEncoder..EncodeFields7 eI um444 U7^^r)rrWIRETYPE_START_GROUPWIRETYPE_END_GROUP)r"r6r7rrrrs @@r GroupEncoderrs|[%EFF) \;#A B B'    rctt|tjt|rJ|rfd}|Sfd}|S)z'Returns an encoder for a message field.c|D]B}|||||||CdSr/r_r)r~rrr)rrs rrz+MessageEncoder..EncodeRepeatedFieldsc99' c 5'"2"2"4"4mDDD""5-888899rc|||||||Sr/r)r~rrrrs rrz#MessageEncoder..EncodeFieldsE eCjjj 0 0-@@@  % %e] ; ;;rr)r"r6r7rrrrs @@rMessageEncoderrs} {DEE#$  999999 <<<<<< rc 8dtdtjtdtjt |tdtjgtdtjtfd}|S)zEncoder for extensions of MessageSet. The message set message looks like this: message MessageSet { repeated group Item = 1 { required int32 type_id = 2; required string message = 3; } } rrrr c||||||||Sr/r)r~rr end_bytesr start_bytess rrz*MessageSetItemEncoder..EncodeFieldsX E+uenn.. >>> UM222 5  r) rrrrrrrrr)r"rrrrs @@@rMessageSetItemEncoderrsq+233q+-..<  q+788 :;;+ q+899)$ rcP|jt|jddfd}|S)zEncoder for extensions of MessageSet. Maps always have a wire format like this: message MapEntry { key_type key = 1; value_type value = 2; } repeated MapEntry map = N; Fc|r!t|n|}|D],}|||}|||-dS)Nrm)sortedkeysro)r~rr value_keysrnrrencode_messagerus rrzMapEncoder..EncodeField7sn)6A %%%EJ66..3eCj.IIinUI}555566r)rurrv)rwrrrus @@r MapEncoderr(sI".,!"2"95%HH.666666 r)C__doc__ __author__rgoogle.protobuf.internalrrrrrr#r9r@rI Int32Sizer Int64Sizer EnumSizer UInt32Sizer UInt64Sizer ZigZagEncode SInt32Sizer SInt64Sizer Fixed32Sizer SFixed32Sizer FloatSizer Fixed64Sizer SFixed64Sizer DoubleSizer BoolSizerrVr[rbrfrjrxrrr_EncodeSignedVarintrrrrrrr Int32Encoder Int64Encoder EnumEncoder UInt32Encoder UInt64Encoder SInt32Encoder SInt64EncoderWIRETYPE_FIXED32Fixed32EncoderWIRETYPE_FIXED64Fixed64EncoderSFixed32EncoderSFixed64Encoder FloatEncoder DoubleEncoderrrrrrrrrrrrs>""H0 000000  9        ;;;::B'3l3D&E&EE EZ)(L555 k*N{/111 k.9[^^; ;}z-8[^^; ;}{ KNN ,,$24:"(  **,,KKK&&&RD###LJJJd-;N!46G-I-II I|k!/ !=!== !1 0 !! %$[%A4HH$$[%A4HH$$[%A4HH$$[%A4HH'' (DdKK '' (DdKK """J0,*2@r