package Ġpw . jon ak . dice parser . operations Ċ Ċ import Ġpw . jon ak . dice parser .* Ċ import Ġsun . awt . Sun Toolkit Ċ import Ġjava . util .* Ċ Ċ class ĠR er oll ( cp : ĠCompare Point , Ġrer oll Once : ĠBoolean , Ġprivate Ġval Ġrandom : ĠRandom Ġ= ĠRandom ()) Ġ: ĠOperation Ġ{ ĊĠĠĠ Ġprivate Ġval Ġcps : ĠHashMap < Compare Point , ĠBoolean > Ġ= ĠHashMap () ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġcps Ġ+= Ġcp Ġto Ġrer oll Once ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġapply ( sides : ĠInt , Ġres : ĠList < Result >): ĠList < Result >? Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġcurrent Iter Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġres . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġrer ol led Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Iter Ġ> ĠMAX _ ITER ATION ) Ġthrow ĠSun Toolkit . Infinite Loop () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Iter Ġ+= Ġ 1 ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( cp Ġin Ġcps . keys ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . rer oll able Ġ&& Ġcp ( it . roll )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . roll Ġ= Ġrandom . nextInt ( sides ) Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cps [ cp ] Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . rer oll able Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrer ol led Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( rer ol led Ġ&& Ġit . rer oll able ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Compare Point ( cp : ĠCompare Point , Ġrer oll Once : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcps Ġ+= Ġcp Ġto Ġrer oll Once ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġprecedence : ĠInt Ġ= Ġ 3 ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfun Ġparse ( str : ĠString , Ġold R er oll : ĠR er oll ?, Ġrandom : ĠRandom ): ĠPair < R er oll ?, ĠInt > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġrer oll Once Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġdistance Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( str . length Ġ> Ġ 2 Ġ&& Ġstr [ 1 ] Ġ== Ġ' o ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrer oll Once Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdistance Ġ= Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( cp , Ġpast ) Ġ= ĠCompare Point . parse ( str . substring ( distance )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cp Ġ== Ġnull ) Ġreturn ĠPair ( null , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( old R er oll Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold R er oll . add Compare Point ( cp , Ġrer oll Once ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull Ġto Ġpast ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠR er oll ( cp , Ġrer oll Once , Ġrandom ) Ġto Ġdistance Ġ+ Ġpast Ġ- Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }