package Ġkit to ku . opens stp client . unit Ċ Ċ import Ġkit to ku . opens stp client . DEFAULT _ MR U Ċ import Ġkit to ku . opens stp client . misc . Data Unit Parsing Error Ċ import Ġkit to ku . opens stp client . misc . Incoming Buffer Ċ import Ġkit to ku . opens stp client . misc . generate Resolver Ċ import Ġjava . nio . ByteBuffer Ċ import Ġkotlin . properties . Deleg ates ĊĊ Ċ internal Ġenum Ġclass ĠL cp Code ( val Ġvalue : ĠByte ) Ġ{ ĊĠĠĠ ĠCONFIG URE _ REQUEST ( 1 ), ĊĠĠĠ ĠCONFIG URE _ ACK ( 2 ), ĊĠĠĠ ĠCONFIG URE _ NA K ( 3 ), ĊĠĠĠ ĠCONFIG URE _ RE JECT ( 4 ), ĊĠĠĠ ĠTER MIN ATE _ REQUEST ( 5 ), ĊĠĠĠ ĠTER MIN ATE _ ACK ( 6 ), ĊĠĠĠ ĠCODE _ RE JECT ( 7 ), ĊĠĠĠ ĠPROTO COL _ RE JECT ( 8 ), ĊĠĠĠ ĠE CHO _ REQUEST ( 9 ), ĊĠĠĠ ĠE CHO _ REPLY ( 1 0 ), ĊĠĠĠ ĠDIS CARD _ REQUEST ( 1 1 ); ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġresolve Ġ= Ġgenerate Resolver ( values (), ĠL cp Code :: value ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġenum Ġclass ĠL cp Option Type ( val Ġvalue : ĠByte ) Ġ{ ĊĠĠĠ ĠM RU ( 1 ), ĊĠĠĠ ĠAUTH ( 3 ); ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġresolve Ġ= Ġgenerate Resolver ( values (), ĠL cp Option Type :: value ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġenum Ġclass ĠAuth Protocol ( val Ġvalue : ĠShort ) Ġ{ ĊĠĠĠ ĠP AP ( 0 xC 0 2 3 . to Short ()), ĊĠĠĠ ĠCH AP ( 0 xC 2 2 3 . to Short ()); ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġresolve Ġ= Ġgenerate Resolver ( values (), ĠAuth Protocol :: value ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġenum Ġclass ĠCh ap Algorithm ( val Ġvalue : ĠByte ) Ġ{ ĊĠĠĠ ĠMS CH AP v 2 ( 0 x 8 1 . to Byte ()); ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġresolve Ġ= Ġgenerate Resolver ( values (), ĠCh ap Algorithm :: value ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġabstract Ġclass ĠL cp Option Ġ: ĠByte Length Data Unit () Ġ{ ĊĠĠĠ Ġinternal Ġabstract Ġval Ġtype : ĠByte ĊĊĠĠĠ Ġoverride Ġval Ġvalid Length Range Ġ= Ġ 2 .. Byte . MAX _ VALUE ĊĊĠĠĠ Ġinternal Ġfun Ġwrite Header ( bytes : ĠByteBuffer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbytes . put ( type ) ĊĠĠĠĠĠĠĠ Ġbytes . put ( get Typed Length ()) ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġclass ĠL cp M ru Option Ġ: ĠL cp Option () Ġ{ ĊĠĠĠ Ġoverride Ġval Ġtype Ġ= ĠL cp Option Type . MR U . value ĊĊĠĠĠ Ġoverride Ġval Ġvalid Length Range Ġ= Ġ 4 .. 4 ĊĊĠĠĠ Ġinternal Ġvar Ġunit Size Ġby ĠDeleg ates . observable ( DEFAULT _ MR U ) Ġ{ Ġ_, Ġ_, Ġnew Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( new Ġ< Ġ 0 ) Ġthrow ĠData Unit Parsing Error () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġread ( bytes : ĠIncoming Buffer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġset Typed Length ( bytes . getByte ()) ĊĠĠĠĠĠĠĠ Ġunit Size Ġ= Ġbytes . get Short (). toInt () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġwrite ( bytes : ĠByteBuffer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwrite Header ( bytes ) ĊĠĠĠĠĠĠĠ Ġbytes . put Short ( unit Size . to Short ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġupdate () Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ length Ġ= Ġvalid Length Range . first ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġclass ĠL cp Auth Option Ġ: ĠL cp Option () Ġ{ ĊĠĠĠ Ġoverride Ġval Ġtype Ġ= ĠL cp Option Type . AUTH . value ĊĊĠĠĠ Ġoverride Ġval Ġvalid Length Range Ġ= Ġ 4 .. Byte . MAX _ VALUE ĊĊĠĠĠ Ġinternal Ġvar Ġprotocol : ĠShort Ġ= ĠAuth Protocol . P AP . value ĊĊĠĠĠ Ġinternal Ġvar Ġholder Ġ= ĠByteArray ( 0 ) ĊĊĠĠĠ Ġoverride Ġfun Ġread ( bytes : ĠIncoming Buffer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġset Typed Length ( bytes . getByte ()) ĊĠĠĠĠĠĠĠ Ġprotocol Ġ= Ġbytes . get Short () ĊĠĠĠĠĠĠĠ Ġholder Ġ= ĠByteArray (_ length Ġ- Ġvalid Length Range . first ). also Ġ{ Ġbytes . get ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġwrite ( bytes : ĠByteBuffer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwrite Header ( bytes ) ĊĠĠĠĠĠĠĠ Ġbytes . put Short ( protocol ) ĊĠĠĠĠĠĠĠ Ġbytes . put ( holder ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġupdate () Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ length Ġ= Ġholder . size Ġ+ Ġvalid Length Range . first ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġclass ĠL cp Unknown Option ( unknown Type : ĠByte ) Ġ: ĠL cp Option () Ġ{ ĊĠĠĠ Ġoverride Ġval Ġtype Ġ= Ġunknown Type ĊĊĠĠĠ Ġinternal Ġvar Ġholder Ġ= ĠByteArray ( 0 ) ĊĊĠĠĠ Ġoverride Ġfun Ġread ( bytes : ĠIncoming Buffer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġset Typed Length ( bytes . getByte ()) ĊĠĠĠĠĠĠĠ Ġholder Ġ= ĠByteArray (_ length Ġ- Ġvalid Length Range . first ). also Ġ{ Ġbytes . get ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġwrite ( bytes : ĠByteBuffer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwrite Header ( bytes ) ĊĠĠĠĠĠĠĠ Ġbytes . put ( holder ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġupdate () Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ length Ġ= Ġholder . size Ġ+ Ġvalid Length Range . first ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġabstract Ġclass ĠL cp Frame Ġ: ĠP pp Frame () Ġ{ ĊĠĠĠ Ġoverride Ġval Ġprotocol Ġ= ĠP pp Protocol . L CP . value Ċ } Ċ Ċ internal Ġabstract Ġclass ĠL cp Configure Frame Ġ: ĠL cp Frame () Ġ{ ĊĠĠĠ Ġinternal Ġvar Ġoptions Ġ= Ġmutable ListOf < L cp Option >() ĊĠĠĠ Ġ// Ġcontains Ġall Ġoptions Ġto Ġbe Ġsent Ġor Ġreceived ĊĊĠĠĠ Ġprivate Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠL cp Option > Ġdelegate Option () Ġ= ĊĠĠĠĠĠĠĠ ĠDeleg ates . observable < T ? >( null ) Ġ{ Ġ_, Ġold , Ġnew Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( old Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( new Ġ== Ġnull ) Ġ{ Ġ// Ġerase Ġoption ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġoptions . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( options [ i ] Ġis ĠT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoptions . remove At ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ Ġ// Ġupdate Ġoption ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġoptions . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( options [ i ] Ġis ĠT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoptions [ i ] Ġ= Ġnew ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( new Ġ!= Ġnull ) Ġ{ Ġ// Ġinstall Ġoption ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoptions . add ( new ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġvar Ġoption M ru Ġby Ġdelegate Option < L cp M ru Option >() ĊĠĠĠ Ġinternal Ġvar Ġoption Auth Ġby Ġdelegate Option < L cp Auth Option >() ĊĊĠĠĠ Ġinternal Ġval Ġhas Unknown Option : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoptions . forEach Ġ{ Ġif Ġ( it Ġis ĠL cp Unknown Option ) Ġreturn Ġtrue Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġextract Unknown Option (): ĠMutable List < L cp Option > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġonly Unknown s Ġ= Ġmutable ListOf < L cp Option >() ĊĠĠĠĠĠĠĠ Ġthis . options . forEach Ġ{ Ġif Ġ( it Ġis ĠL cp Unknown Option ) Ġonly Unknown s . add ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġonly Unknown s ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġread ( bytes : ĠIncoming Buffer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoptions . clear () ĊĠĠĠĠĠĠĠ Ġread Header ( bytes ) ĊĠĠĠĠĠĠĠ Ġvar Ġremaining Ġ= Ġ_ length Ġ- Ġvalid Length Range . first ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( remaining ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin ĠInt . MIN _ VALUE .. - 1 Ġ-> Ġthrow ĠData Unit Parsing Error () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġbytes . getByte () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoption : ĠL cp Option Ġ= Ġwhen Ġ( L cp Option Type . resolve ( type )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠL cp Option Type . MR U Ġ-> ĠL cp M ru Option (). also Ġ{ Ġoption M ru Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠL cp Option Type . AUTH Ġ-> ĠL cp Auth Option (). also Ġ{ Ġoption Auth Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠL cp Unknown Option ( type ). also Ġ{ Ġoptions . add ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoption . read ( bytes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremaining Ġ-= Ġoption ._ length ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġwrite ( bytes : ĠByteBuffer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwrite Header ( bytes ) ĊĠĠĠĠĠĠĠ Ġoptions . forEach Ġ{ Ġit . write ( bytes ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġupdate () Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ length Ġ= Ġvalid Length Range . first ĊĠĠĠĠĠĠĠ Ġoptions . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . update () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ length Ġ+= Ġit ._ length ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġclass ĠL cp Configure Request Ġ: ĠL cp Configure Frame () Ġ{ ĊĠĠĠ Ġoverride Ġval Ġcode Ġ= ĠL cp Code . CONFIGURE _ REQUEST . value Ċ } Ċ Ċ internal Ġclass ĠL cp Configure Ack Ġ: ĠL cp Configure Frame () Ġ{ ĊĠĠĠ Ġoverride Ġval Ġcode Ġ= ĠL cp Code . CONFIGURE _ ACK . value Ċ } Ċ Ċ internal Ġclass ĠL cp Configure N ak Ġ: ĠL cp Configure Frame () Ġ{ ĊĠĠĠ Ġoverride Ġval Ġcode Ġ= ĠL cp Code . CONFIGURE _ NA K . value Ċ } Ċ Ċ internal Ġclass ĠL cp Configure Reject Ġ: ĠL cp Configure Frame () Ġ{ ĊĠĠĠ Ġoverride Ġval Ġcode Ġ= ĠL cp Code . CONFIGURE _ RE JECT . value Ċ } Ċ Ċ internal Ġabstract Ġclass ĠL cp Magic Number Frame Ġ: ĠL cp Frame () Ġ{ ĊĠĠĠ Ġinternal Ġvar Ġmagic Number Ġ= Ġ 0 ĊĊĠĠĠ Ġinternal Ġvar Ġholder Ġ= ĠByteArray ( 0 ) ĊĊĠĠĠ Ġoverride Ġval Ġvalid Length Range Ġ= Ġ 8 .. Short . MAX _ VALUE ĊĊĠĠĠ Ġoverride Ġfun Ġread ( bytes : ĠIncoming Buffer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġread Header ( bytes ) ĊĠĠĠĠĠĠĠ Ġmagic Number Ġ= Ġbytes . getInt () ĊĠĠĠĠĠĠĠ Ġholder Ġ= ĠByteArray (_ length Ġ- Ġvalid Length Range . first ). also Ġ{ Ġbytes . get ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġwrite ( bytes : ĠByteBuffer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwrite Header ( bytes ) ĊĠĠĠĠĠĠĠ Ġbytes . put Int ( magic Number ) ĊĠĠĠĠĠĠĠ Ġbytes . put ( holder ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġupdate () Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ length Ġ= Ġvalid Length Range . first Ġ+ Ġholder . size ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġclass ĠL cp Echo Request Ġ: ĠL cp Magic Number Frame () Ġ{ ĊĠĠĠ Ġoverride Ġval Ġcode Ġ= ĠL cp Code . ECHO _ REQUEST . value Ċ } Ċ Ċ internal Ġclass ĠL cp Echo Reply Ġ: ĠL cp Magic Number Frame () Ġ{ ĊĠĠĠ Ġoverride Ġval Ġcode Ġ= ĠL cp Code . ECHO _ REPLY . value Ċ } Ċ