package Ġcom . rim mer . y tt rium . serialize Ċ Ċ import Ġcom . rim mer . y tt rium . ByteString Builder Ċ import Ġcom . rim mer . y tt rium . Invalid StateException Ċ import Ġcom . rim mer . y tt rium . empty String Ċ import Ġcom . rim mer . y tt rium . utf 8 Ċ import Ġio . netty . buffer . Byte Buf Ċ import Ġio . netty . buffer . Un p ooled Ċ import Ġjava . util .* Ċ Ċ /** ĠRepresents Ġa Ġjson Ġtoken Ġwith Ġparsing Ġfunctionality . Ġ*/ Ċ class ĠJson Token ( val Ġbuffer : ĠByte Buf , Ġvar Ġuse ByteString : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠ Ġenum Ġclass ĠType Ġ{ ĊĠĠĠĠĠĠĠ ĠStart Object , ĊĠĠĠĠĠĠĠ ĠEnd Object , ĊĠĠĠĠĠĠĠ ĠStart Array , ĊĠĠĠĠĠĠĠ ĠEnd Array , ĊĠĠĠĠĠĠĠ ĠString Lit , ĊĠĠĠĠĠĠĠ ĠNumber Lit , ĊĠĠĠĠĠĠĠ ĠBool Lit , ĊĠĠĠĠĠĠĠ ĠNull Lit , ĊĠĠĠĠĠĠĠ ĠField Name ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġtype Ġ= ĠType . Start Object ĊĠĠĠ Ġvar Ġbool Payload Ġ= Ġfalse ĊĠĠĠ Ġvar Ġnumber Payload Ġ= Ġ 0 . 0 ĊĠĠĠ Ġvar Ġstring Payload Ġ= Ġ"" ĊĠĠĠ Ġvar Ġbyte String Payload Ġ= Ġempty String ĊĊĠĠĠ Ġval Ġbuffer Payload : ĠByteArray Ġget () Ġ= ĠBase 6 4 . get Decoder (). decode ( string Payload ) ĊĊĠĠĠ Ġfun Ġexpect ( type : ĠType , ĠallowNull : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠ Ġparse () ĊĊĠĠĠĠĠĠĠ Ġif ( this . type Ġ!== Ġtype ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( this . type Ġ=== ĠType . Null Lit Ġ&& ĠallowNull ) Ġreturn ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIt Ġis Ġvery Ġcommon Ġfor Ġjs - pro duced Ġvalues Ġto Ġcontain Ġstrings Ġthat Ġshould Ġbe Ġnumbers . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġadd Ġa Ġconversion Ġhere Ġas Ġa Ġspecial Ġcase . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( type Ġ=== ĠType . Number Lit Ġ&& Ġthis . type Ġ=== ĠType . String Lit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnumber Payload Ġ= Ġjava . lang . Double . parseDouble ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( use ByteString ) Ġbyte String Payload . utf 1 6 () Ġelse Ġstring Payload ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . type Ġ= Ġtype ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch ( e : ĠNumber FormatException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġthis Ġhappens Ġthe Ġtype Ġwill Ġbe Ġwrong Ġand Ġwe Ġthrow Ġan Ġexception Ġlater . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif ( type Ġ=== ĠType . String Lit Ġ&& Ġthis . type Ġ=== ĠType . Number Lit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstring Payload Ġ= Ġnumber Payload . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( use ByteString ) Ġbyte String Payload Ġ= Ġstring Payload . utf 8 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . type Ġ= Ġtype ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif ( type Ġ=== ĠType . Bool Lit Ġ&& Ġthis . type Ġ=== ĠType . String Lit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( bool Payload ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstring Payload Ġ= Ġ" true " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( use ByteString ) Ġbyte String Payload Ġ= Ġstring Payload . utf 8 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif ( allow Null ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . type Ġ= ĠType . Null Lit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstring Payload Ġ= Ġ" false " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( use ByteString ) Ġbyte String Payload Ġ= Ġstring Payload . utf 8 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . type Ġ= Ġtype ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif ( type Ġ=== ĠType . Bool Lit Ġ&& Ġthis . type Ġ=== ĠType . Number Lit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnumber Payload Ġ= Ġif ( bool Payload ) Ġ 1 . 0 Ġelse Ġ 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . type Ġ= Ġtype ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif ( type Ġ=== ĠType . Number Lit Ġ&& Ġthis . type Ġ=== ĠType . Bool Lit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbool Payload Ġ= Ġnumber Payload Ġ!= Ġ 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . type Ġ= Ġtype ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid StateException (" Invalid Ġjson : ĠExpected Ġ$ type ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġparse () Ġ{ ĊĠĠĠĠĠĠĠ Ġskip Whitespace () ĊĠĠĠĠĠĠĠ Ġval Ġb Ġ= Ġbuffer . read Byte (). toInt () ĊĠĠĠĠĠĠĠ Ġwhen Ġ( b ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ'[' . toInt () Ġ-> Ġtype Ġ= ĠType . Start Array ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ'] '. toInt () Ġ-> Ġtype Ġ= ĠType . End Array ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ'{ '. toInt () Ġ-> Ġtype Ġ= ĠType . Start Object ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ' }'. toInt () Ġ-> Ġtype Ġ= ĠType . End Object ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġparse Value ( b . to Char ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġskip Whitespace () ĊĠĠĠĠĠĠĠ Ġif ( buffer . is Readable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc Ġ= Ġbuffer . getByte ( buffer . reader Index ()). to Char () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c Ġ== Ġ', ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer . skip Bytes ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġskip Value () Ġ{ ĊĠĠĠĠĠĠĠ Ġparse () ĊĠĠĠĠĠĠĠ Ġskip Element () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpeek Array End (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġskip Whitespace () ĊĠĠĠĠĠĠĠ Ġreturn Ġbuffer . getByte ( buffer . reader Index ()). to Char () Ġ== Ġ' ]' ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpeek String (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġskip Whitespace () ĊĠĠĠĠĠĠĠ Ġreturn Ġbuffer . getByte ( buffer . reader Index ()). to Char () Ġ== Ġ'"' ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpeek Null (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġskip Whitespace () ĊĠĠĠĠĠĠĠ Ġreturn Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer . readable Bytes () Ġ>= Ġ 4 Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer . getByte ( buffer . reader Index ()). to Char () Ġ== Ġ' n ' Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer . getByte ( buffer . reader Index () Ġ+ Ġ 1 ). to Char () Ġ== Ġ' u ' Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer . getByte ( buffer . reader Index () Ġ+ Ġ 2 ). to Char () Ġ== Ġ' l ' Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer . getByte ( buffer . reader Index () Ġ+ Ġ 3 ). to Char () Ġ== Ġ' l ' ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġskip Null (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( peek Null ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparse () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġskip Element () Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ=== ĠType . Start Object Ġ-> Ġskip Object () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ=== ĠType . Start Array Ġ-> Ġskip Array () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ=== ĠType . End Object Ġ|| Ġtype Ġ=== ĠType . End Array Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid StateException (" Invalid Ġjson : ĠCannot Ġhave Ġ$ type Ġhere .") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġskip Object () Ġ{ ĊĠĠĠĠĠĠĠ Ġwhile ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparse () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ=== ĠType . End Object Ġ-> Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ=== ĠType . FieldName Ġ-> Ġskip Value () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠInvalid StateException (" Invalid Ġjson : ĠExpected Ġfield Ġname , Ġgot Ġ$ type ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġskip Array () Ġ{ ĊĠĠĠĠĠĠĠ Ġwhile ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparse () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( type Ġ=== ĠType . End Array ) Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġskip Element () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġparse Value ( first : ĠChar ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( first Ġ== Ġ'" ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparse String () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġskip Whitespace () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġf Ġ= Ġif ( buffer . is Readable ) Ġbuffer . getByte ( buffer . reader Index ()) Ġelse Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( f . to Char () Ġ== Ġ': ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠType . FieldName ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer . skip Bytes ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠType . String Lit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif ( is Digit ( first ) Ġ|| Ġfirst Ġ== Ġ'-' Ġ|| Ġfirst Ġ== Ġ'+ ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠType . Number Lit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnumber Payload Ġ= ĠparseFloat ( first ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif ( first Ġ== Ġ' t ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect Char (' r ') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect Char (' u ') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect Char (' e ') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠType . Bool Lit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbool Payload Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif ( first Ġ== Ġ' f ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect Char (' a ') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect Char (' l ') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect Char (' s ') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect Char (' e ') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠType . Bool Lit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbool Payload Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif ( first Ġ== Ġ' n ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect Char (' u ') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect Char (' l ') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect Char (' l ') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠType . Null Lit ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid StateException (" Invalid Ġjson : Ġexpected Ġa Ġvalue , Ġgot Ġ'$ first '") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠparseFloat ( first : ĠChar ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġch Ġ= Ġfirst ĊĠĠĠĠĠĠĠ Ġvar Ġout Ġ= Ġ 0 . 0 ĊĊĠĠĠĠĠĠĠ Ġ// ĠCheck Ġsign . ĊĠĠĠĠĠĠĠ Ġvar Ġneg Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġif ( ch Ġ== Ġ'+ ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġch Ġ= Ġbuffer . read Byte (). to Char () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif ( ch Ġ== Ġ'-') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġch Ġ= Ġbuffer . read Byte (). to Char () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġneg Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠCreate Ġpart Ġbefore Ġdecimal Ġpoint . ĊĠĠĠĠĠĠĠ Ġwhile ( is Digit ( ch )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġn Ġ= ĠCharacter . digit ( ch , Ġ 1 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout Ġ*= Ġ 1 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout Ġ+= Ġn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġch Ġ= Ġbuffer . read Byte (). to Char () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠCheck Ġif Ġthere Ġis Ġa Ġfraction al Ġpart . ĊĠĠĠĠĠĠĠ Ġif ( ch Ġ== Ġ'.') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġch Ġ= Ġbuffer . read Byte (). to Char () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġdec Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġd pl Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile ( is Digit ( ch )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġn Ġ= ĠCharacter . digit ( ch , Ġ 1 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdec Ġ*= Ġ 1 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdec Ġ+= Ġn ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġd pl ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġch Ġ= Ġbuffer . read Byte (). to Char () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġneed Ġto Ġuse Ġa Ġfloating Ġpoint Ġpower Ġhere Ġin Ġorder Ġto Ġsupport Ġmore Ġthan Ġ 9 Ġdecimals . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpower Ġ= ĠMath . pow ( 1 0 . 0 , Ġd pl . toDouble ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdec Ġ/= Ġpower ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout Ġ+= Ġdec ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠCheck Ġif Ġthere Ġis Ġan Ġexponent . ĊĠĠĠĠĠĠĠ Ġif ( ch Ġ== Ġ' E ' Ġ|| Ġch Ġ== Ġ' e ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġch Ġ= Ġbuffer . read Byte (). to Char () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġsign . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsign Negative Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( ch Ġ== Ġ'+ ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġch Ġ= Ġbuffer . read Byte (). to Char () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif ( ch Ġ== Ġ'-') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġch Ġ= Ġbuffer . read Byte (). to Char () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsign Negative Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠHas Ġexp . Ġpart ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġexp Ġ= Ġ 0 . 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile ( Character . is Digit ( ch )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġn Ġ= ĠCharacter . digit ( ch , Ġ 1 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexp Ġ*= Ġ 1 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexp Ġ+= Ġn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġch Ġ= Ġbuffer . read Byte (). to Char () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( sign Negative ) Ġexp Ġ= Ġ- exp ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpower Ġ= ĠMath . pow ( 1 0 . 0 , Ġexp ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout Ġ*= Ġpower ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif ( neg ) Ġout Ġ= Ġ- out ĊĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġread Ġone Ġcharacter Ġahead , Ġso Ġrestore Ġit . ĊĠĠĠĠĠĠĠ Ġbuffer . reader Index ( buffer . reader Index () Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġreturn Ġout ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġparse String () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstring Ġ= ĠByte StringBuilder () ĊĠĠĠĠĠĠĠ Ġwhile ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġb Ġ= Ġbuffer . read Byte (). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( b Ġ== Ġ'" '. toInt ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif ( b Ġ== Ġ'\\ '. toInt ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparse Esc aped ( string ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstring . append ( b . to Byte ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif ( use ByteString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbyte String Payload Ġ= Ġstring . string ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstring Payload Ġ= ĠString ( string . buffer , Ġ 0 , Ġstring . length , ĠChar sets . UTF _ 8 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġparse Esc aped ( string : ĠByte StringBuilder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġb Ġ= Ġbuffer . read Byte (). toInt () ĊĠĠĠĠĠĠĠ Ġwhen Ġ( b ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ'" '. toInt () Ġ-> Ġstring . append ('" '. to Byte ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ'\\ '. toInt () Ġ-> Ġstring . append ('\\ '. to Byte ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ'/ '. toInt () Ġ-> Ġstring . append ('/ '. to Byte ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ' b '. toInt () Ġ-> Ġstring . append ('\ b '. to Byte ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ' f '. toInt () Ġ-> Ġstring . append ( 0 x 0 C . to Byte ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ' n '. toInt () Ġ-> Ġstring . append ('\ n '. to Byte ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ' r '. toInt () Ġ-> Ġstring . append ('\ r '. to Byte ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ' t '. toInt () Ġ-> Ġstring . append ('\ t '. to Byte ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ' u '. toInt () Ġ-> Ġparse Unicode ( string ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġparse Unicode ( string : ĠByte StringBuilder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġb 0 Ġ= Ġparse H exit ( buffer . read Byte ()) ĊĠĠĠĠĠĠĠ Ġval Ġb 1 Ġ= Ġparse H exit ( buffer . read Byte ()) ĊĠĠĠĠĠĠĠ Ġval Ġb 2 Ġ= Ġparse H exit ( buffer . read Byte ()) ĊĠĠĠĠĠĠĠ Ġval Ġb 3 Ġ= Ġparse H exit ( buffer . read Byte ()) ĊĠĠĠĠĠĠĠ Ġval Ġchar Ġ= Ġ( b 0 Ġshl Ġ 1 2 ) Ġor Ġ( b 1 Ġshl Ġ 8 ) Ġor Ġ( b 2 Ġshl Ġ 4 ) Ġor Ġb 3 ĊĠĠĠĠĠĠĠ Ġstring . append ("${ char . to Char () }") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġskip Whitespace () Ġ{ ĊĠĠĠĠĠĠĠ Ġwhile ( buffer . is Readable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġb Ġ= Ġbuffer . getByte ( buffer . reader Index ()). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( b Ġ== Ġ 0 x 2 0 Ġ|| Ġb Ġ== Ġ 0 x 0 9 Ġ|| Ġb Ġ== Ġ 0 x 0 A Ġ|| Ġb Ġ== Ġ 0 x 0 D ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer . skip Bytes ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġexpect Char ( c : ĠChar ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġch Ġ= Ġbuffer . read Byte (). to Char () ĊĠĠĠĠĠĠĠ Ġif ( ch Ġ!= Ġc ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid StateException (" Invalid Ġjson : Ġexpected Ġ'$ c '") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠParses Ġthe Ġprovided Ġcharacter Ġas Ġa Ġhex it , Ġto Ġan Ġinteger Ġin Ġthe Ġrange Ġ 0 .. 1 5 . Ċ Ġ* Ġ@ return ĠThe Ġparsed Ġnumber . ĠReturns ĠNothing Ġif Ġthe Ġcharacter Ġis Ġnot Ġa Ġvalid Ġnumber . Ċ Ġ*/ Ċ fun Ġparse H exit ( c : ĠByte ): ĠInt Ġ{ ĊĠĠĠ Ġval Ġindex Ġ= Ġc Ġ- Ġ' 0 '. to Byte () ĊĊĠĠĠ Ġif ( index Ġ< Ġ 0 Ġ|| Ġindex Ġ> Ġ 5 4 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠInvalid StateException (" Invalid Ġjson : Ġexpected Ġunicode Ġsequence , Ġgot Ġ'$ c '") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġres Ġ= Ġparse H exit Lookup [ index ] ĊĠĠĠ Ġif ( res Ġ> Ġ 1 5 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠInvalid StateException (" Invalid Ġjson : Ġexpected Ġunicode Ġsequence , Ġgot Ġ'$ c '") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġres Ċ } Ċ Ċ // ĠWe Ġuse Ġa Ġsmall Ġlookup Ġtable Ġfor Ġparse H exit , Ċ // Ġsince Ġthe Ġnumber Ġof Ġbranches Ġwould Ġbe Ġrid iculo us Ġotherwise . Ċ val Ġparse H exit Lookup Ġ= ĠarrayOf ( ĊĠĠĠĠ 0 , ĠĠ 1 , ĠĠ 2 , ĠĠ 3 , ĠĠ 4 , ĠĠ 5 , ĠĠ 6 , ĠĠ 7 , ĠĠ 8 , ĠĠ 9 , ĉ /* Ġ 0 .. 9 Ġ*/ ĊĠĠĠĠ 2 5 5 , 2 5 5 , 2 5 5 , 2 5 5 , 2 5 5 , 2 5 5 , 2 5 5 , ĉĉ ĉ /* Ġ: .. @ Ġ*/ ĊĠĠĠĠ 1 0 , Ġ 1 1 , Ġ 1 2 , Ġ 1 3 , Ġ 1 4 , Ġ 1 5 , ĉĉĉĉ ĉ /* ĠA .. F Ġ*/ ĊĠĠĠĠ 2 5 5 , 2 5 5 , 2 5 5 , 2 5 5 , 2 5 5 , 2 5 5 , 2 5 5 , ĉĉ ĉ /* ĠG .. ` Ġ*/ ĊĠĠĠĠ 2 5 5 , 2 5 5 , 2 5 5 , 2 5 5 , 2 5 5 , 2 5 5 , 2 5 5 , ĊĠĠĠĠ 2 5 5 , 2 5 5 , 2 5 5 , 2 5 5 , 2 5 5 , 2 5 5 , ĊĠĠĠĠ 2 5 5 , 2 5 5 , 2 5 5 , 2 5 5 , 2 5 5 , 2 5 5 , ĊĠĠĠĠ 1 0 , Ġ 1 1 , Ġ 1 2 , Ġ 1 3 , Ġ 1 4 , Ġ 1 5 ĉĉĉĉ ĉ /* Ġa .. f Ġ*/ Ċ ) Ċ Ċ /** Ċ Ġ* ĠReturns Ġtrue Ġif Ġthis Ġis Ġa Ġdigit . Ċ Ġ*/ Ċ fun Ġis Digit ( c : ĠChar ): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġindex Ġ= Ġc Ġ- Ġ' 0 ' ĊĠĠĠ Ġreturn Ġindex Ġin Ġ 0 .. 9 Ċ } Ċ