package Ġcom . hand truth . mc . p aket Ċ Ċ import Ġcom . hand truth . mc . p aket . util . P aket Decoder Ċ import Ġcom . hand truth . mc . p aket . util . P aket Encoder Ċ import Ġkotlinx . io . ByteArray Input Ċ import Ġkotlinx . io . ByteArray Output Ċ import Ġkotlinx . io . Input Ċ import Ġkotlinx . io . Output Ċ import Ġkotlinx . serialization . Binary Format Ċ import Ġkotlinx . serialization . Deserialization Strategy Ċ import Ġkotlinx . serialization . Serialization Strategy Ċ import Ġkotlinx . serialization . modules . Empty Module Ċ Ċ abstract Ġclass ĠP aket Ġ{ ĊĠĠĠ Ġabstract Ġval Ġid : ĠEnum < *> ĊĊĠĠĠ Ġprivate Ġval Ġmutable Fields Ġ= Ġmutable ListOf < Field <* >>() ĊĠĠĠ Ġval Ġfields : ĠList < Field <* >> Ġget () Ġ= Ġmutable Fields ĊĊĠĠĠ Ġval Ġsize Ġget () Ġ= Ġsize Var Int ( id . ordinal ) Ġ+ Ġmutable Fields . sum By Ġ{ Ġit . size Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( other Ġis ĠP aket Ġ&& Ġid Ġ== Ġother . id Ġ&& Ġmutable Fields . size Ġ== Ġother . mutable Fields . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġmutable Fields . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( mutable Fields [ i ] Ġ!= Ġother . mutable Fields [ i ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġfun ĠhashCode () Ġ= Ġid . hashCode () Ġ+ Ġmutable Fields . hashCode () ĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠStringBuilder ( id . toString ()). append (" :{ Ġ") ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġmutable Fields . size Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ( mutable Fields [ i ]. toString ()). append ("; Ġ") ĊĠĠĠĠĠĠĠ Ġif Ġ( mutable Fields . isNotEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ( mutable Fields . last (). toString ()). append (' Ġ') ĊĠĠĠĠĠĠĠ Ġbuilder . append (' }') ĊĠĠĠĠĠĠĠ Ġreturn Ġbuilder . toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< F > Ġfield ( field : ĠField < F >): ĠField < F > Ġ{ ĊĠĠĠĠĠĠĠ Ġmutable Fields Ġ+= Ġfield ĊĠĠĠĠĠĠĠ Ġreturn Ġfield ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġwrite ( output : ĠOutput ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwrite Var Int ( output , Ġid . ordinal ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( field Ġin Ġfields ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield . write ( output ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġread ( input : ĠInput ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġother Id Ġ= Ġread Var Int ( input ) ĊĠĠĠĠĠĠĠ Ġvalidate ( id . ordinal Ġ== Ġother Id ) Ġ{ Ġ" Wrong Ġp aket Ġid Ġ(${ id . ordinal } Ġexpected , Ġgot Ġ$ other Id )" Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( field Ġin Ġfields ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield . read ( input ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġclear () Ġ{} ĊĊĠĠĠ Ġprivate Ġvar Ġpool : ĠP aket Pool < in ĠP aket >? Ġ= Ġnull ĊĊĠĠĠ Ġfun Ġattach To Pool ( pool : ĠP aket Pool < in ĠP aket >) Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck ( this . pool Ġ== Ġnull ) Ġ{ Ġ" P aket Ġpool Ġalready Ġspecified Ġfor Ġthis Ġp aket " Ġ} ĊĠĠĠĠĠĠĠ Ġthis . pool Ġ= Ġpool ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġre cycle () Ġ{ ĊĠĠĠĠĠĠĠ Ġpool ?. recycle ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠEmpty < E Ġ: ĠEnum < E >>( override Ġval Ġid : ĠE ) Ġ: ĠP aket () Ġ{ ĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinline Ġoperator Ġfun Ġ< re ified ĠE Ġ: ĠEnum < E >> Ġinvoke (): ĠEmpty < E > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠEmpty ( enum Values < E >() [ 0 ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ: ĠBinary Format Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġcontext Ġ= ĠEmpty Module ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġ< T > Ġdump ( serializer : ĠSerialization Strategy < T >, Ġvalue : ĠT ): ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= ĠByteArray Output () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġencoder Ġ= ĠP aket Encoder ( output ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġserializer . serialize ( encoder , Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġoutput . toByteArray () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġ< T > Ġload ( de serializer : ĠDeserial ization Strategy < T >, Ġbytes : ĠByteArray ): ĠT Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Ġ= ĠByteArray Input ( bytes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdecoder Ġ= ĠP aket Decoder ( input ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġde serializer . deserialize ( decoder ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ