package Ġu y . ko hes ive . iac . model . aws . proxy Ċ Ċ import Ġjava . util .* Ċ import Ġkotlin . collections . ArrayList Ċ Ċ fun Ġexplode Reference ( str : ĠString ): ĠList < Resource Node > Ġ{ ĊĠĠĠ Ġval Ġstack Ġ= ĠStack < Resource Node >() ĊĊĠĠĠ Ġfun Ġis Within Un resolved Reference () ĊĠĠĠĠĠĠĠ Ġ= Ġstack . filter Ġ{ Ġit . is Reference Node () Ġ}. any Ġ{ Ġit . is Un resolved () Ġ} ĊĊĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠ Ġwhile Ġ( i Ġ< Ġstr . length ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠcurrentNode : ĠResource Node ? Ġ= Ġif Ġ( stack . empty ()) Ġnull Ġelse Ġstack . peek () ĊĠĠĠĠĠĠĠ Ġval Ġnext Ref Start Ġ= Ġstr . indexOf (" {{ ko hes ive :", Ġi ) ĊĠĠĠĠĠĠĠ Ġval Ġnext Ref End ĠĠ Ġ= Ġstr . indexOf (" }} ", Ġi ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠStart Ġnew Ġreference ĊĠĠĠĠĠĠĠ Ġif Ġ( next Ref Start Ġ== Ġi ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġneed Ġto Ġfigure Ġout Ġthe Ġtype Ġof Ġreference ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġref Type Start Ġ= Ġnext Ref Start Ġ+ Ġ"{{ ko hes ive :" . length ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġref Type End ĠĠ Ġ= Ġstr . indexOf (" :", Ġref Type Start ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġref Type Ġ= ĠReference Type . fromString ( str . substring ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartIndex Ġ= Ġref Type Start , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Index ĠĠ Ġ= Ġref Type End ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPush Ġthe Ġnew Ġreference Ġnode Ġto Ġthe Ġstack ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreference Node Ġ= ĠResource Node . for Reference Type ( ref Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstack . push ( reference Node ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġi Ġ= Ġref Type End Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( next Ref End Ġ== Ġi Ġ&& Ġis Within Un resolved Reference ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPop Ġthe Ġarguments Ġ( reference Ġparts ) Ġand Ġassign Ġthem Ġas Ġreference Ġchildren ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreference Arguments Ġ= ĠArrayList < Resource Node >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnode Ġ= Ġstack . peek () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( node . is Reference Node () Ġ&& Ġnode . is Un resolved ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( reference Node Ġin Ġreference Arguments ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode . insert Child ( reference Node ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreference Arguments . add ( stack . pop ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġi Ġ+= Ġ 2 ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( str [ i ] Ġ== Ġ':' Ġ&& Ġis Within Un resolved Reference ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ!= Ġnext Ref Start Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstack . push ( Resource Node . StringLiteral Node ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi ++; Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMust Ġbe Ġa Ġstring Ġliteral ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstring Node Ġ= ĠcurrentNode Ġas ? ĠResource Node . StringLiteral Node Ġ?: ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResource Node . StringLiteral Node (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstack . push ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġstring Node . append ( str [ i ++ ]) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġstack Ċ } Ċ Ċ sealed Ġclass ĠResource Node ( ĊĠĠĠ Ġval Ġar ity : ĠInt Ċ ) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġfor Reference Type ( ref Type : ĠReference Type ) Ġ= Ġwhen Ġ( ref Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠReference Type . Ref ĠĠĠĠĠĠĠĠ Ġ-> ĠRef Node () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠReference Type . Ref Property Ġ-> ĠRef Property Node () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠReference Type . Var ĠĠĠĠĠĠĠĠ Ġ-> ĠVariable Node () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠReference Type . Map ĠĠĠĠĠĠĠĠ Ġ-> ĠMap Node () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠReference Type . Implicit ĠĠĠ Ġ-> ĠImp licit Node () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠString Literal Node Ġ: ĠResource Node ( 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġvalue : ĠStringBuffer Ġ= ĠStringBuffer () ĊĠĠĠĠĠĠĠ Ġfun Ġappend ( c : ĠChar ) Ġ= Ġvalue . append ( c ) ĊĠĠĠĠĠĠĠ Ġfun Ġvalue () Ġ= Ġvalue . toString () ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġ"\" $ value \"" ĊĠĠĠ Ġ} ĊĠĠĠ Ġclass ĠImp licit Node ĠĠĠ Ġ: ĠResource Node ( 1 ) ĊĠĠĠ Ġclass ĠVariable Node ĠĠĠ Ġ: ĠResource Node ( 1 ) ĊĠĠĠ Ġclass ĠRef Node ĠĠĠĠĠĠĠĠ Ġ: ĠResource Node ( 2 ) ĊĠĠĠ Ġclass ĠRef Property Node Ġ: ĠResource Node ( 3 ) ĊĠĠĠ Ġclass ĠMap Node ĠĠĠĠĠĠĠĠ Ġ: ĠResource Node ( 3 ) ĊĊĠĠĠ Ġval Ġchildren Ġ= ĠArrayList < Resource Node >() ĊĊĠĠĠ Ġfun Ġis Reference Node () Ġ= Ġar ity Ġ> Ġ 0 ĊĠĠĠ Ġfun Ġis Un resolved () ĠĠĠ Ġ= Ġchildren . size Ġ< Ġar ity ĊĊĠĠĠ Ġfun Ġinsert Child ( child Node : ĠResource Node , Ġindex : ĠInt Ġ= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( children . size Ġ+ Ġ 1 Ġ> Ġar ity ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Max Ġchildren Ġcount Ġreached Ġfor Ġ${ Ġthis :: class . simple Name Ġ} ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġchildren . add ( index , Ġchild Node ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġ"${ Ġthis :: class . simple Name Ġ}: Ġ(${ children . join ToString (", Ġ") })" Ċ } ĊĊ