@betorigami/game-calculations 4.4.2 → 4.4.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +56 -11
- package/dist/index.mjs +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var Bo=Object.create;var{getPrototypeOf:So,defineProperty:J,getOwnPropertyNames:tt,getOwnPropertyDescriptor:po}=Object,ot=Object.prototype.hasOwnProperty;var G=(r,t,o)=>{o=r!=null?Bo(So(r)):{};let E=t||!r||!r.__esModule?J(o,"default",{value:r,enumerable:!0}):o;for(let A of tt(r))if(!ot.call(E,A))J(E,A,{get:()=>r[A],enumerable:!0});return E},rt=new WeakMap,Co=(r)=>{var t=rt.get(r),o;if(t)return t;if(t=J({},"__esModule",{value:!0}),r&&typeof r==="object"||typeof r==="function")tt(r).map((E)=>!ot.call(t,E)&&J(t,E,{get:()=>r[E],enumerable:!(o=po(r,E))||o.enumerable}));return rt.set(r,t),t};var Zo=(r,t)=>{for(var o in t)J(r,o,{get:t[o],enumerable:!0,configurable:!0,set:(E)=>t[o]=()=>E})};var eo={};Zo(eo,{validateRouletteGameInputs:()=>so,validateAdvancedDiceInputs:()=>Go,rtp99Multipliers:()=>Xt,rtp98Multipliers:()=>It,rtp97Multipliers:()=>jt,rtp96Multipliers:()=>Ht,rtp92Multipliers:()=>nt,plinkoMultipliers:()=>Qr,nCr:()=>pr,kenoMultipliers:()=>zr,isTileCount:()=>$r,hasDiceWon:()=>qt,diamondsMultipliers:()=>Rt,calculateRouletteBetAmount:()=>Wo,calculateDiceWinChance:()=>Jt,calculateBaccaratBetAmount:()=>dt,calculateAdvancedDiceWinChance:()=>Gr,bigMin:()=>qr,bigMax:()=>Jr,advancedDiceIsWithinBoundsInclusive:()=>ct,advancedDiceIsWithinBoundsExclusive:()=>k,advancedDiceGetInclusiveBoundsRange:()=>Ot,advancedDiceGetExclusiveBoundsRange:()=>rr,WheelSegments:()=>$,WheelRiskLevel:()=>R,Wheel:()=>io,WIN_MULTIPLIER:()=>Nt,VALID_SUITS:()=>Bt,VALID_RANKS:()=>St,VALID_EUROPEAN_STREETS:()=>Hr,VALID_EUROPEAN_STRAIGHTS:()=>Cr,VALID_EUROPEAN_SPLITS:()=>Ir,VALID_EUROPEAN_DOUBLE_STREETS:()=>Lr,VALID_EUROPEAN_CORNERS:()=>Wr,VALID_AMERICAN_STREETS:()=>nr,VALID_AMERICAN_STRAIGHTS:()=>Xr,VALID_AMERICAN_SPLITS:()=>jr,VALID_AMERICAN_DOUBLE_STREETS:()=>Kr,VALID_AMERICAN_CORNERS:()=>sr,TOP_COLUMN:()=>et,TILE_COUNTS:()=>Qt,RouletteType:()=>dr,Roulette:()=>kr,RollType:()=>it,RandomValuePool:()=>H,RED_NUMBERS:()=>to,RANDOM_MIN_VALUE:()=>tr,RANDOM_MAX_VALUE:()=>or,PlinkoRiskLevel:()=>mr,Plinko:()=>vt,Parity:()=>U,PUSH_MULTIPLIER:()=>_t,PLINKO_ROW_COUNTS:()=>Yo,PAYOUT_MULTIPLIERS:()=>gt,OrigamiGame:()=>Z,MultiplierCalculator:()=>b,Mines:()=>Lt,MIN_WIN_CHANCE:()=>At,MIDDLE_COLUMN:()=>kt,MAX_WIN_CHANCE:()=>ft,MAX_CARDS_PER_ROUND:()=>cr,Limbo:()=>lt,LOSE_MULTIPLIER:()=>Gt,KenoRiskLevel:()=>Rr,Keno:()=>st,InsuranceOutcome:()=>Ar,INSURANCE_WIN_PAYOUT:()=>br,INSURANCE_BET_SIZE_FACTOR:()=>hr,INSURANCE_BET_MULTIPLIER:()=>Or,Half:()=>a,GameErrorCode:()=>Et,GameError:()=>O,Game:()=>S,FACE_CARD_VALUE:()=>wr,EuropeanRoulette:()=>gr,EUROPEAN_HOUSE_EDGE:()=>Eo,EFFECTIVE_RANGE:()=>Nr,Dozen:()=>Y,DiceDirection:()=>zt,Dice:()=>mt,DiamondsResultType:()=>Ft,Diamonds:()=>$t,DOUBLE_DOWN_BET_SIZE_FACTOR:()=>ur,DICE_EFFECTIVE_RANGE:()=>Yr,DEALER_STAND_VALUE:()=>yr,Column:()=>P,Color:()=>M,CARDS_PER_SUIT:()=>yo,BlackjackOutcome:()=>Er,BlackjackActionType:()=>Tr,Blackjack:()=>Pt,BaccaratOutcome:()=>pt,BaccaratBetType:()=>Ct,Baccarat:()=>Zt,BUST_VALUE:()=>fr,BOTTOM_COLUMN:()=>ro,BLACK_NUMBERS:()=>oo,BLACKJACK_VALUE:()=>q,BLACKJACK_MULTIPLIER:()=>Dt,BASE_PAYOUT_MULTIPLIERS:()=>Vr,AmericanRoulette:()=>er,AdvancedDice:()=>xt,AMERICAN_HOUSE_EDGE:()=>Ao,AMERICAN_BASKET:()=>lr,ACE_SOFT_BONUS:()=>ir});module.exports=Co(eo);var Et;((t)=>t.INPUT_VALIDATION_ERROR="INPUT_VALIDATION_ERROR")(Et||={});class O extends Error{static createValidationError(r){return new O("INPUT_VALIDATION_ERROR",r)}static isGameError(r){return r instanceof O}errorCode;constructor(r,t){super(t);this.errorCode=r}}var Z;((x)=>{x.DICE="DICE";x.MINES="MINES";x.KENO="KENO";x.LIMBO="LIMBO";x.ADVANCED_DICE="ADVANCED_DICE";x.BACCARAT="BACCARAT";x.DIAMONDS="DIAMONDS";x.PLINKO="PLINKO";x.ROULETTE="ROULETTE";x.WHEEL="WHEEL";x.BLACKJACK="BLACKJACK"})(Z||={});class S{gameId;constructor(r){this.gameId=r}getGameResult(r){return this.determineGameResult(r)}}var _r=require("big.js");var g=G(require("big.js"));class b{static withMultiplier(r,t){return new g.default(r).times(new g.default(100-t).div(100))}static withWinChance(r,t){return g.default(100-r).div(t)}}var tr=0,or=1e4,Nr=10001,At=0.01,ft=98,Do=(r)=>{if(r<tr)throw O.createValidationError(`Lower bound ${r} is below minimum allowed value ${tr}`)},No=(r)=>{if(r>or)throw O.createValidationError(`Upper bound ${r} is above maximum allowed value ${or}`)},e=(r)=>{if(Do(r.lower),No(r.upper),r.lower>=r.upper)throw O.createValidationError(`Lower bound ${r.lower} must be less than ${r.upper}`)},_o=(r,t)=>{let[o,E]=r.lower<=t.lower?[r,t]:[t,r];if(o.upper>E.lower)throw O.createValidationError("Bounds must not overlap")},ct=(r,t)=>t>=r.lower&&t<=r.upper,Ot=(r)=>r.upper-r.lower+1,k=(r,t)=>t>r.lower&&t<r.upper,rr=(r)=>r.upper-r.lower-1,it;((E)=>{E.ROLL_BETWEEN="ROLL_BETWEEN";E.ROLL_OUTSIDE="ROLL_OUTSIDE";E.ROLL_BETWEEN_TWO="ROLL_BETWEEN_TWO"})(it||={});var Gr=(r)=>{let o=(()=>{switch(r.mode){case"ROLL_BETWEEN":return e(r.bounds),rr(r.bounds);case"ROLL_OUTSIDE":return e(r.bounds),Nr-Ot(r.bounds);case"ROLL_BETWEEN_TWO":return e(r.firstBounds),e(r.secondBounds),_o(r.firstBounds,r.secondBounds),rr(r.firstBounds)+rr(r.secondBounds)}})(),E=_r.Big(o).div(Nr).mul(100);if(E.lt(At))throw O.createValidationError("Win chance too low");if(E.gt(ft))throw O.createValidationError("Win chance too high");return E},Go=(r)=>{Gr(r)};class xt extends S{constructor(){super("ADVANCED_DICE")}determineGameResult({generator:r,edge:t,gameInputs:o}){let E=Gr(o),A=r.getRandomInt({min:tr,max:or}),f=A.value;return{isFinished:!0,payoutMultiplier:(()=>{switch(o.mode){case"ROLL_BETWEEN":return k(o.bounds,f);case"ROLL_OUTSIDE":return!ct(o.bounds,f);case"ROLL_BETWEEN_TWO":return k(o.firstBounds,f)||k(o.secondBounds,f)}})()?b.withWinChance(t,E):new _r.Big(0),outputs:{result:A.values},randomValues:A}}}var u=G(require("big.js"));var Bt=["Clubs","Diamonds","Hearts","Spades"],St=["Ace","2","3","4","5","6","7","8","9","10","Jack","Queen","King"],pt;((E)=>{E.PLAYER_WIN="PLAYER_WIN";E.TIE="TIE";E.BANKER_WIN="BANKER_WIN"})(pt||={});var Ct;((E)=>{E.PLAYER="PLAYER";E.TIE="TIE";E.BANKER="BANKER"})(Ct||={});var To={["PLAYER_WIN"]:{betType:"PLAYER",multiplier:2},["TIE"]:{betType:"TIE",multiplier:9},["BANKER_WIN"]:{betType:"BANKER",multiplier:1.95}},dt=(r)=>{return new u.default(0).add(r.bets.reduce((o,E)=>o.add(E.amount),new u.default(0)))};class Zt extends S{constructor(){super("BACCARAT")}determineGameResult({generator:r,gameInputs:t,edge:o}){if(o!==1)throw new Error("Baccarat is only available at 1% edge.");this.validateGameInputs(t);let E=r.getRandomIntsWithReplacement({min:0,max:51,count:6}),A=E.values,f=A.slice(0,3),c=A.slice(3,6),i=[],B=0;for(let d of f.slice(0,2)){let N=this.mapRandomValueToCard(d),v=this.mapRandomValueToCardValue(d);i.push(N),B=(B+v)%10}let C=[],p=0;for(let d of c.slice(0,2)){let N=this.mapRandomValueToCard(d),v=this.mapRandomValueToCardValue(d);C.push(N),p=(p+v)%10}if(!this.isNaturalWin(B,p)){let d=this.shouldDrawThirdPlayerCard(B),N=null;if(d)N=this.mapRandomValueToCardValue(f[2]),i.push(this.mapRandomValueToCard(f[2])),B=(B+N)%10;if(this.shouldDrawThirdBankerCard(p,N))C.push(this.mapRandomValueToCard(c[2])),p=(p+this.mapRandomValueToCardValue(c[2]))%10}let x;if(B===p)x="TIE";else x=B>p?"PLAYER_WIN":"BANKER_WIN";let _=dt(t),{betType:K,multiplier:xo}=To[x],z=new u.default(0);if(z=z.add(t.bets.filter((d)=>d.type===K).reduce((d,N)=>d.add(N.amount.mul(xo)),new u.default(0))),x==="TIE")z=z.add(t.bets.filter((d)=>d.type==="PLAYER"||d.type==="BANKER").reduce((d,N)=>d.add(N.amount),new u.default(0)));return{isFinished:!0,payoutMultiplier:_.gt(0)?z.div(_):new u.default(0),outputs:{playerCards:i,playerHandValue:B,bankerCards:C,bankerHandValue:p,gameOutcome:x,result:E.values},randomValues:E}}validateGameInputs(r){if(r.bets.length===0)throw new Error("Must place at least a single bet.");if(!r.bets.every((t)=>t.amount.gte(0)))throw new Error("Invalid bet.")}mapRandomValueToCard(r){let t=Bt[Math.floor(r/13)],o=St[r%13];return{suit:t,rank:o}}isNaturalWin(r,t){let o=[8,9];return o.includes(r)||o.includes(t)}mapRandomValueToCardValue(r){let t=r%13;if(t===0)return 1;if(t>=10)return 10;return t+1}shouldDrawThirdPlayerCard(r){return r<=5}shouldDrawThirdBankerCard(r,t){if(t===null)return r<=5;if(r<=2)return!0;if(r===3)return t!==8;if(r===4)return[2,3,4,5,6,7].includes(t);if(r===5)return[4,5,6,7].includes(t);if(r===6)return[6,7].includes(t);return!1}}var Er;((A)=>{A.WIN="WIN";A.LOSE="LOSE";A.PUSH="PUSH";A.PLAYER_BLACKJACK="PLAYER_BLACKJACK"})(Er||={});var Ar;((o)=>{o.WON="WON";o.LOST="LOST"})(Ar||={});var Tr;((c)=>{c.START="START";c.HIT="BLACKJACK_HIT";c.STAND="BLACKJACK_STAND";c.BUY_INSURANCE="BLACKJACK_BUY_INSURANCE";c.REJECT_INSURANCE="BLACKJACK_REJECT_INSURANCE";c.DOUBLE_DOWN="BLACKJACK_DOUBLE_DOWN"})(Tr||={});var Dt=2.5,Nt=2,_t=1,Gt=0,yr=17,fr=21,q=21,cr=63,Or=1.5,hr=0.5,br=1.5,ur=1,yo=13,ir=10,wr=10,Vr={PLAYER_BLACKJACK:Dt,WIN:Nt,PUSH:_t,LOSE:Gt};var F=require("@betorigami/guard"),at=require("@xstate/store");var Tt=0,yt=51,xr=Array.from({length:52},(r,t)=>t),ht=["Spades","Hearts","Diamonds","Clubs"],Br=["Ace","Two","Three","Four","Five","Six","Seven","Eight","Nine","Ten","Jack","Queen","King"],bt=["Jack","Queen","King"];var ut=require("@betorigami/guard");var Sr=require("@betorigami/guard");class Ur{value;constructor(r){let t=xr[r];Sr.Guard.againstNullOrUndefined(t,`Invalid card value: ${r}`),this.value=t}get suit(){let r=Math.floor(this.value/13),t=ht[r];return Sr.Guard.againstNullOrUndefined(t,`Invalid suit index: ${r}`),t}get rank(){let r=this.value%13,t=Br[r];return Sr.Guard.againstNullOrUndefined(t,`Invalid rank index: ${r}`),t}toDto(){return{rank:this.rank,suit:this.suit,cardValue:this.value}}}class T extends Ur{get numericRank(){if(bt.includes(this.rank))return wr;return Br.indexOf(this.rank)+1}static fromValue(r){return ut.Guard.against(!xr.includes(r),`Invalid card value: ${r}`),new T(r)}}class m{cards;hardHandValue;softHandValue=null;constructor(r){this.cards=r;if(this.hardHandValue=r.reduce((o,E)=>o+E.numericRank,0),r.some((o)=>o.rank==="Ace")&&this.hardHandValue+ir<=fr)this.softHandValue=this.hardHandValue+ir}get cardCount(){return this.cards.length}get hasSoftHandValue(){return this.softHandValue!==null}get isBusted(){return this.hardHandValue>fr}get isBlackjack(){return this.cardCount===2&&this.highestHandValue===q}get highestHandValue(){return this.softHandValue!==null?this.softHandValue:this.hardHandValue}}class Q{cards;value;constructor(r){this.cards=r.map((t)=>T.fromValue(t)),this.value=new m(this.cards)}get isBusted(){return this.value.isBusted}get isBlackjack(){return this.value.isBlackjack}get highestHandValue(){return this.value.highestHandValue}get rawValues(){return this.cards.map((r)=>r.value)}toDto(){return{cards:this.cards.map((r)=>r.toDto()),value:this.highestHandValue}}}class X extends Q{otherCards;upCard;holeCard;constructor(r,t,o=[]){super([r,t,...o]);this.otherCards=o;this.upCard=T.fromValue(r),this.holeCard=T.fromValue(t)}static withInitialDeal(r){return new X(r.upCard,r.holeCard)}addDrawnCards(r){return new X(this.upCard.value,this.holeCard.value,[...this.otherCards,...r])}toDto(r=!1){if(r)return super.toDto();return{cards:[this.upCard.toDto()],value:new m([this.upCard]).highestHandValue}}}class I extends Q{static withInitialDeal(r){return new I(r)}addDrawnCards(r){return new I([...this.rawValues,...r])}}var j=require("@betorigami/guard");class H{source;index=0;constructor(r){this.source=r}static from(r,t){return j.Guard.against(t<=0,`Count must be positive, got ${t}`),j.Guard.against(r.values.length!==t,`Expected ${t} values, got ${r.values.length}`),new H(r)}get consumedValues(){return this.source.values.slice(0,this.index)}toMultipleRandomValues(){return this.source}takeOne(){let r=this.source.values[this.index];return j.Guard.againstUndefined(r,"RandomValuePool exhausted"),this.index+=1,r}take(r){j.Guard.against(this.index+r>this.source.values.length,`RandomValuePool exhausted: requested ${r} but only ${this.source.values.length-this.index} remain`);let t=this.source.values.slice(this.index,this.index+r);return this.index+=r,t}}var wt=require("@betorigami/guard"),Vt=G(require("fast-deep-equal"));class Mr{edge;constructor(r){this.edge=r}play(r,t,o=[]){let E=this.createGameStore(),A=this.generateRandomValues(r),f=A.toMultipleRandomValues();for(let B of o)E.send({...B.playerArgument,randomValuePool:A});let c=o[o.length-1];if(c)wt.Guard.against(!Vt.default(c.state,this.toExternalState(E.getSnapshot().context.state)),"The final state of the game does not match the expected state based on the previous actions");E.send({...t,randomValuePool:A});let i=E.getSnapshot().context;return{playerArgument:i.playerArgument,state:this.toExternalState(i.state),config:i.config,betAmountMultiplier:i.betAmountMultiplier,proof:{proofHash:f.proofHash,proofString:f.proofString}}}}var y=G(require("big.js"));var Ut=(r)=>{let t=r.insuranceOutcome!==void 0,o=y.default(1),E=r.doubledDown?y.default(ur):y.default(0),A=t?y.default(hr):y.default(0),f=o.plus(E).plus(A),c=o.plus(E),i=y.default(Vr[r.outcome]).mul(c),B=r.insuranceOutcome==="WON"?y.default(br):y.default(0);return{payoutMultiplier:i.plus(B).div(f).toNumber(),betAmountMultiplier:f.toNumber()}};var ho={state:{isFinished:!1,phase:"uninitialised",multiplier:1},config:{},playerArgument:{type:"START"}},w=(r)=>T.fromValue(r).value;function ar(r){F.Guard.against(r.phase!=="in-progress","Expected a started, in-progress game state")}function Mt(r){F.Guard.against(r.phase!=="awaiting-insurance","Expected game to be awaiting insurance decision")}var bo=(r,t)=>{let o=t;while(o.highestHandValue<yr)o=o.addDrawnCards([w(r.takeOne())]);return o},uo=(r,t)=>{if(r.isBusted)return"LOSE";if(t.isBusted)return"WIN";let o=r.highestHandValue,E=t.highestHandValue;if(o>E)return"WIN";if(o<E)return"LOSE";return"PUSH"},D=(r)=>{let{payoutMultiplier:t,betAmountMultiplier:o}=Ut({outcome:r.outcome,insuranceOutcome:r.insuranceOutcome,doubledDown:r.actionType==="BLACKJACK_DOUBLE_DOWN"});return{state:{isFinished:!0,phase:"finished",playerHand:r.playerHand,dealerHand:r.dealerHand,outcome:r.outcome,multiplier:t,randomValues:r.randomValuePool.consumedValues,insuranceOutcome:r.insuranceOutcome},config:{},playerArgument:{type:r.actionType},betAmountMultiplier:o}},Pr=(r)=>{let t=bo(r.randomValuePool,r.dealerHand),o=uo(r.playerHand,t);return D({...r,dealerHand:t,outcome:o})};class Pt extends Mr{generateRandomValues(r){return H.from(r.getRandomIntsWithReplacement({min:Tt,max:yt,count:cr}),cr)}toExternalState(r){let t=r.phase;switch(t){case"awaiting-insurance":return{isFinished:!1,phase:"awaiting-insurance",multiplier:r.multiplier,playerHand:r.playerHand.toDto(),dealerHand:r.dealerHand.toDto(!1)};case"in-progress":return{isFinished:!1,phase:"player-turn",multiplier:r.multiplier,betAmountMultiplier:r.betAmountMultiplier,playerHand:r.playerHand.toDto(),dealerHand:r.dealerHand.toDto(!1)};case"finished":return{isFinished:!0,multiplier:r.multiplier,randomValues:r.randomValues,outcome:r.outcome,playerHand:r.playerHand.toDto(),dealerHand:r.dealerHand.toDto(!0),...r.insuranceOutcome!==void 0&&{insuranceOutcome:r.insuranceOutcome}};case"uninitialised":throw new Error("Cannot convert uninitialised state to external state");default:F.Guard.againstNever(t,"Invalid state received")}}createGameStore(){return at.createStore({context:ho,on:{START:(r,t)=>{F.Guard.against(r.state.phase!=="uninitialised","START action requires a fresh game");let o=w(t.randomValuePool.takeOne()),E=w(t.randomValuePool.takeOne()),A=w(t.randomValuePool.takeOne()),f=w(t.randomValuePool.takeOne()),c=I.withInitialDeal([o,E]),i=X.withInitialDeal({upCard:A,holeCard:f});if(i.upCard.rank==="Ace")return{state:{isFinished:!1,phase:"awaiting-insurance",multiplier:1,playerHand:c,dealerHand:i},config:{},playerArgument:{type:"START"}};if(c.isBlackjack&&i.isBlackjack)return D({playerHand:c,dealerHand:i,outcome:"PUSH",randomValuePool:t.randomValuePool,actionType:"START"});if(c.isBlackjack)return D({playerHand:c,dealerHand:i,outcome:"PLAYER_BLACKJACK",randomValuePool:t.randomValuePool,actionType:"START"});if(i.isBlackjack)return D({playerHand:c,dealerHand:i,outcome:"LOSE",randomValuePool:t.randomValuePool,actionType:"START"});return{state:{isFinished:!1,phase:"in-progress",multiplier:1,playerHand:c,dealerHand:i,insuranceBought:!1,betAmountMultiplier:1},config:{},playerArgument:{type:"START"}}},BLACKJACK_BUY_INSURANCE:(r,t)=>{Mt(r.state);let{playerHand:o,dealerHand:E}=r.state,A={randomValuePool:t.randomValuePool,actionType:"BLACKJACK_BUY_INSURANCE",dealerHand:E,playerHand:o};if(o.isBlackjack&&E.isBlackjack)return D({outcome:"PUSH",insuranceOutcome:"WON",...A});if(o.isBlackjack)return D({outcome:"PLAYER_BLACKJACK",insuranceOutcome:"LOST",...A});if(E.isBlackjack)return D({outcome:"LOSE",insuranceOutcome:"WON",...A});return{state:{isFinished:!1,phase:"in-progress",multiplier:1,playerHand:o,dealerHand:E,insuranceBought:!0,betAmountMultiplier:Or},config:{},playerArgument:{type:"BLACKJACK_BUY_INSURANCE"},betAmountMultiplier:Or}},BLACKJACK_REJECT_INSURANCE:(r,t)=>{Mt(r.state);let{playerHand:o,dealerHand:E}=r.state,A={playerHand:o,dealerHand:E,randomValuePool:t.randomValuePool,actionType:"BLACKJACK_REJECT_INSURANCE",doubledDown:!1};if(o.isBlackjack&&E.isBlackjack)return D({outcome:"PUSH",...A});if(o.isBlackjack)return D({outcome:"PLAYER_BLACKJACK",...A});if(E.isBlackjack)return D({outcome:"LOSE",...A});return{state:{isFinished:!1,phase:"in-progress",multiplier:1,playerHand:o,dealerHand:E,insuranceBought:!1,betAmountMultiplier:1},config:{},playerArgument:{type:"BLACKJACK_REJECT_INSURANCE"}}},BLACKJACK_HIT:(r,t)=>{ar(r.state);let{insuranceBought:o,betAmountMultiplier:E}=r.state,A=o?"LOST":void 0,f=r.state.playerHand.addDrawnCards([w(t.randomValuePool.takeOne())]);if(f.isBusted)return D({playerHand:f,dealerHand:r.state.dealerHand,outcome:"LOSE",randomValuePool:t.randomValuePool,actionType:"BLACKJACK_HIT",insuranceOutcome:A});if(f.highestHandValue===q)return Pr({playerHand:f,dealerHand:r.state.dealerHand,randomValuePool:t.randomValuePool,actionType:"BLACKJACK_HIT",insuranceOutcome:A});return{state:{isFinished:!1,phase:"in-progress",multiplier:1,playerHand:f,dealerHand:r.state.dealerHand,insuranceBought:o,betAmountMultiplier:E},config:{},playerArgument:{type:"BLACKJACK_HIT"},betAmountMultiplier:E}},BLACKJACK_STAND:(r,t)=>{ar(r.state);let{insuranceBought:o}=r.state,E=o?"LOST":void 0;return Pr({playerHand:r.state.playerHand,dealerHand:r.state.dealerHand,randomValuePool:t.randomValuePool,actionType:"BLACKJACK_STAND",insuranceOutcome:E})},BLACKJACK_DOUBLE_DOWN:(r,t)=>{ar(r.state),F.Guard.against(r.state.playerHand.cards.length!==2,"Double down is only allowed as the first action");let{insuranceBought:o}=r.state,E=o?"LOST":void 0,A=r.state.playerHand.addDrawnCards([w(t.randomValuePool.takeOne())]);if(A.isBusted)return D({playerHand:A,dealerHand:r.state.dealerHand,outcome:"LOSE",randomValuePool:t.randomValuePool,actionType:"BLACKJACK_DOUBLE_DOWN",insuranceOutcome:E});return Pr({playerHand:A,dealerHand:r.state.dealerHand,randomValuePool:t.randomValuePool,actionType:"BLACKJACK_DOUBLE_DOWN",insuranceOutcome:E})}}})}getValidNextActionTypes(r){if(r.isFinished)return[];if(r.phase==="awaiting-insurance")return["BLACKJACK_BUY_INSURANCE","BLACKJACK_REJECT_INSURANCE"];if(r.playerHand.cards.length===2)return["BLACKJACK_HIT","BLACKJACK_STAND","BLACKJACK_DOUBLE_DOWN"];return["BLACKJACK_HIT","BLACKJACK_STAND"]}}var Yt=G(require("big.js"));class h{multipliers;constructor(r){this.multipliers=r}getMultipliers(r){let t=this.multipliers.get(r);if(t===void 0)throw new Error(`Multipliers for ${r} not found`);return t}getAllMultipliers(){return Array.from(this.multipliers.entries()).map(([r,t])=>({edge:r,multipliers:t}))}}var Ft;((c)=>{c.PAIR="PAIR";c.TWO_PAIR="TWO_PAIR";c.THREE_OF_A_KIND="THREE_OF_A_KIND";c.FULL_HOUSE="FULL_HOUSE";c.FOUR_OF_A_KIND="FOUR_OF_A_KIND";c.FIVE_OF_A_KIND="FIVE_OF_A_KIND"})(Ft||={});var wo={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:4.3,FOUR_OF_A_KIND:5,FIVE_OF_A_KIND:50},Vo={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:4,FOUR_OF_A_KIND:4.8,FIVE_OF_A_KIND:50},Uo={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:3.7,FOUR_OF_A_KIND:4.6,FIVE_OF_A_KIND:50},Mo={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:3.4,FOUR_OF_A_KIND:4.4,FIVE_OF_A_KIND:50},ao={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:2.8,FULL_HOUSE:3.2,FOUR_OF_A_KIND:3.6,FIVE_OF_A_KIND:50},Rt=new h(new Map([[1,wo],[2,Vo],[3,Uo],[4,Mo],[8,ao]])),Po={2:"PAIR",3:"THREE_OF_A_KIND",4:"FOUR_OF_A_KIND",5:"FIVE_OF_A_KIND"};class $t extends S{constructor(){super("DIAMONDS")}determineGameResult({generator:r,edge:t}){let o=r.getRandomIntsWithReplacement({min:0,max:6,count:5}),E=Rt.getMultipliers(t),A=o.values,f=this.calculatePayoutMultiplier(E,A);return{isFinished:!0,payoutMultiplier:Yt.default(f),outputs:{result:o.values},randomValues:o}}calculatePayoutMultiplier(r,t){let o=new Map;for(let f of t){let c=o.get(f)||0;o.set(f,c+1)}let E=[...o.values()].filter((f)=>f>1),A=this.classifyResult(E);return A===null?0:r[A]}classifyResult(r){if(r.length>2)throw new Error(`Unexpected number of repeats ${r.length}`);let[t,o]=r;if(t===void 0)return null;if(o===void 0){let E=Po[t];if(E===void 0)throw new Error(`Unexpected single diamond repeat count: ${t}`);return E}return t===3||o===3?"FULL_HOUSE":"TWO_PAIR"}}var Fr=G(require("big.js"));var zt;((o)=>{o.ABOVE="ABOVE";o.BELOW="BELOW"})(zt||={});var Yr=1e4,Jt=(r)=>{let t=r.direction==="ABOVE"?Yr-r.selectedValue:r.selectedValue;return new Fr.default(t).div(Yr).mul(100)},qt=(r,t)=>r.direction==="ABOVE"?t>r.selectedValue:t<r.selectedValue;class mt extends S{constructor(){super("DICE")}determineGameResult({generator:r,edge:t,gameInputs:o}){let E=r.getRandomInt({min:0,max:1e4}),A=Jt(o);return{isFinished:!0,payoutMultiplier:qt(o,E.value)?b.withWinChance(t,A):new Fr.default(0),outputs:{result:E.values},randomValues:E}}}var Wt=G(require("big.js"));var n=require("@betorigami/guard");var Rr;((A)=>{A.CLASSIC="CLASSIC";A.LOW_RISK="LOW_RISK";A.MEDIUM_RISK="MEDIUM_RISK";A.HIGH_RISK="HIGH_RISK"})(Rr||={});var Qt=[1,2,3,4,5,6,7,8,9,10],$r=(r)=>{return Qt.includes(r)};var Xt={[1]:{CLASSIC:[0,3.96],LOW_RISK:[0.7,1.85],MEDIUM_RISK:[0.4,2.75],HIGH_RISK:[0,3.96]},[2]:{CLASSIC:[0,1.9,4.5],LOW_RISK:[0,2,3.8],MEDIUM_RISK:[0,1.8,5.1],HIGH_RISK:[0,0,17.1]},[3]:{CLASSIC:[0,1,3.1,10.4],LOW_RISK:[0,1.1,1.38,26],MEDIUM_RISK:[0,0,2.8,50],HIGH_RISK:[0,0,0,81.5]},[4]:{CLASSIC:[0,0.8,1.8,5,22.5],LOW_RISK:[0,0,2.2,7.9,90],MEDIUM_RISK:[0,0,1.7,10,100],HIGH_RISK:[0,0,0,10,259]},[5]:{CLASSIC:[0,0.25,1.4,4.1,16.5,36],LOW_RISK:[0,0,1.5,4.2,13,300],MEDIUM_RISK:[0,0,1.4,4,14,390],HIGH_RISK:[0,0,0,4.5,48,450]},[6]:{CLASSIC:[0,0,1,3.68,7,16.5,40],LOW_RISK:[0,0,1.1,2,6.2,100,700],MEDIUM_RISK:[0,0,0,3,9,180,710],HIGH_RISK:[0,0,0,0,11,350,710]},[7]:{CLASSIC:[0,0,0.47,3,4.5,14,31,60],LOW_RISK:[0,0,1.1,1.6,3.5,15,225,700],MEDIUM_RISK:[0,0,0,2,7,30,400,800],HIGH_RISK:[0,0,0,0,7,90,400,800]},[8]:{CLASSIC:[0,0,0,2.2,4,13,22,55,70],LOW_RISK:[0,0,1.1,1.5,2,5.5,39,100,800],MEDIUM_RISK:[0,0,0,2,4,11,67,400,900],HIGH_RISK:[0,0,0,0,5,20,270,600,900]},[9]:{CLASSIC:[0,0,0,1.55,3,8,15,44,60,85],LOW_RISK:[0,0,1.1,1.3,1.7,2.5,7.5,50,250,1000],MEDIUM_RISK:[0,0,0,2,2.5,5,15,100,500,1000],HIGH_RISK:[0,0,0,0,4,11,56,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.4,2.25,4.5,8,17,50,80,100],LOW_RISK:[0,0,1.1,1.2,1.3,1.8,3.5,13,50,250,1000],MEDIUM_RISK:[0,0,0,1.6,2,4,7,26,100,500,1000],HIGH_RISK:[0,0,0,0,3.5,8,13,63,500,800,1000]}},It={[1]:{CLASSIC:[0,3.92],LOW_RISK:[0.7,1.82],MEDIUM_RISK:[0.4,2.72],HIGH_RISK:[0,3.92]},[2]:{CLASSIC:[0,1.9,4.32],LOW_RISK:[0,2,3.65],MEDIUM_RISK:[0,1.8,5],HIGH_RISK:[0,0,17]},[3]:{CLASSIC:[0,1,3,10.7],LOW_RISK:[0,1.1,1.3,26.2],MEDIUM_RISK:[0,0,2.7,50.3],HIGH_RISK:[0,0,0,80.7]},[4]:{CLASSIC:[0,0.8,1.8,4.75,22.5],LOW_RISK:[0,0,2.2,7.65,90],MEDIUM_RISK:[0,0,1.7,9.8,100],HIGH_RISK:[0,0,0,9.75,259]},[5]:{CLASSIC:[0,0.2,1.4,4.25,16.4,36],LOW_RISK:[0,0,1.5,4.1,12.9,300],MEDIUM_RISK:[0,0,1.4,3.9,13.9,390],HIGH_RISK:[0,0,0,4.5,47,450]},[6]:{CLASSIC:[0,0,1,3.6,7,17,40],LOW_RISK:[0,0,1.1,2,5.8,100,700],MEDIUM_RISK:[0,0,0,3,8.6,180,710],HIGH_RISK:[0,0,0,0,10.6,350,710]},[7]:{CLASSIC:[0,0,0.5,3,4.1,13.7,31,60],LOW_RISK:[0,0,1.1,1.6,3.5,13.5,225,700],MEDIUM_RISK:[0,0,0,2,6.9,29.2,400,800],HIGH_RISK:[0,0,0,0,6.9,89.1,400,800]},[8]:{CLASSIC:[0,0,0,2.2,4,12.2,22,55,70],LOW_RISK:[0,0,1.1,1.5,2,4.8,38,100,800],MEDIUM_RISK:[0,0,0,2,4,10.4,66,400,900],HIGH_RISK:[0,0,0,0,4.9,19.8,270,600,900]},[9]:{CLASSIC:[0,0,0,1.5,3,8.1,15,45,60,85],LOW_RISK:[0,0,1.1,1.3,1.7,2.1,7.4,50,250,1000],MEDIUM_RISK:[0,0,0,2,2.5,4.6,15.2,100,500,1000],HIGH_RISK:[0,0,0,0,4,10.7,55.4,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.4,2.2,4.5,7.6,16,50,80,100],LOW_RISK:[0,0,1.1,1.2,1.3,1.6,3.7,13,50,250,1000],MEDIUM_RISK:[0,0,0,1.6,2,3.8,6.8,26,100,500,1000],HIGH_RISK:[0,0,0,0,3.5,7.8,12.8,63,500,800,1000]}},jt={[1]:{CLASSIC:[0,3.88],LOW_RISK:[0.7,1.78],MEDIUM_RISK:[0.4,2.68],HIGH_RISK:[0,3.88]},[2]:{CLASSIC:[0,1.85,4.48],LOW_RISK:[0,2,3.48],MEDIUM_RISK:[0,1.8,4.8],HIGH_RISK:[0,0,16.8]},[3]:{CLASSIC:[0,1,3,9.9],LOW_RISK:[0,1.1,1.2,26.5],MEDIUM_RISK:[0,0,2.65,50],HIGH_RISK:[0,0,0,79.9]},[4]:{CLASSIC:[0,0.8,1.7,5,23],LOW_RISK:[0,0,2.1,7.95,90],MEDIUM_RISK:[0,0,1.7,9.55,100],HIGH_RISK:[0,0,0,9.5,259]},[5]:{CLASSIC:[0,0.2,1.4,4.1,16.6,36],LOW_RISK:[0,0,1.5,4,12.7,300],MEDIUM_RISK:[0,0,1.4,3.8,13.7,390],HIGH_RISK:[0,0,0,4.4,46.9,450]},[6]:{CLASSIC:[0,0,1,3.6,6.6,16.5,40],LOW_RISK:[0,0,1.1,1.9,5.9,100,700],MEDIUM_RISK:[0,0,0,2.9,8.7,180,710],HIGH_RISK:[0,0,0,0,10.8,342,710]},[7]:{CLASSIC:[0,0,0.5,2.9,4.3,13.5,30.4,60],LOW_RISK:[0,0,1.1,1.6,3.1,14.8,225,700],MEDIUM_RISK:[0,0,0,2,6.7,29,400,800],HIGH_RISK:[0,0,0,0,6.8,88.2,400,800]},[8]:{CLASSIC:[0,0,0,2.2,3.8,12.7,21,54,70],LOW_RISK:[0,0,1.1,1.5,1.8,5.2,38,100,800],MEDIUM_RISK:[0,0,0,2,3.8,10.8,66,400,900],HIGH_RISK:[0,0,0,0,4.9,19.5,265,600,900]},[9]:{CLASSIC:[0,0,0,1.5,2.9,8.2,15,43,60,85],LOW_RISK:[0,0,1.1,1.3,1.6,2.1,7.7,49,250,1000],MEDIUM_RISK:[0,0,0,2,2.4,4.7,15,98,500,1000],HIGH_RISK:[0,0,0,0,3.9,10.8,55,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.4,2.2,4.2,8,16.7,50,80,100],LOW_RISK:[0,0,1.1,1.2,1.3,1.5,2.9,12,50,250,1000],MEDIUM_RISK:[0,0,0,1.6,2,3.6,6.6,26,100,500,1000],HIGH_RISK:[0,0,0,0,3.4,7.9,12.9,62,500,800,1000]}},Ht={[1]:{CLASSIC:[0,3.88],LOW_RISK:[0.68,1.84],MEDIUM_RISK:[0.38,2.74],HIGH_RISK:[0,3.88]},[2]:{CLASSIC:[0,1.85,4.48],LOW_RISK:[0,1.96,3.75],MEDIUM_RISK:[0,1.77,5],HIGH_RISK:[0,0,16.82]},[3]:{CLASSIC:[0,1,3.05,9.35],LOW_RISK:[0,1.07,1.37,25.7],MEDIUM_RISK:[0,0,2.74,49],HIGH_RISK:[0,0,0,79.9]},[4]:{CLASSIC:[0,0.8,1.72,4.95,22.3],LOW_RISK:[0,0,2.15,7.86,87],MEDIUM_RISK:[0,0,1.67,9.7,100],HIGH_RISK:[0,0,0,9.7,256]},[5]:{CLASSIC:[0,0.24,1.38,4,16.3,35.5],LOW_RISK:[0,0,1.48,4.1,12.43,300],MEDIUM_RISK:[0,0,1.35,3.96,13.8,389],HIGH_RISK:[0,0,0,4.4,47,444]},[6]:{CLASSIC:[0,0,1,3.57,6.8,16.2,37],LOW_RISK:[0,0,1.06,1.96,6.16,99,700],MEDIUM_RISK:[0,0,0,2.9,8.9,178,709],HIGH_RISK:[0,0,0,0,10.4,347,709]},[7]:{CLASSIC:[0,0,0.45,2.95,4.44,13.85,30,60],LOW_RISK:[0,0,1.07,1.57,3.47,14.57,225,700],MEDIUM_RISK:[0,0,0,1.95,6.8,29.8,400,800],HIGH_RISK:[0,0,0,0,6.8,88.2,400,800]},[8]:{CLASSIC:[0,0,0,2.15,3.9,12.9,21.9,55,70],LOW_RISK:[0,0,1.08,1.45,1.98,5.48,38.8,100,800],MEDIUM_RISK:[0,0,0,1.95,3.96,10.6,66.9,396,896],HIGH_RISK:[0,0,0,0,4.9,19.2,269,599,896]},[9]:{CLASSIC:[0,0,0,1.5,2.95,7.96,14.96,44,60,85],LOW_RISK:[0,0,1.05,1.29,1.69,2.49,7.49,49,250,1000],MEDIUM_RISK:[0,0,0,1.95,2.47,4.9,14.9,99,500,1000],HIGH_RISK:[0,0,0,0,3.96,10.5,55,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.37,2.2,4.45,7.7,16.7,50,80,100],LOW_RISK:[0,0,1.08,1.18,1.28,1.76,3.4,12.9,50,250,1000],MEDIUM_RISK:[0,0,0,1.57,1.95,3.96,6.9,25.5,100,500,1000],HIGH_RISK:[0,0,0,0,3.43,7.9,12.5,60,500,800,1000]}},nt={[1]:{CLASSIC:[0,3.68],LOW_RISK:[0.7,1.58],MEDIUM_RISK:[0.4,2.48],HIGH_RISK:[0,3.68]},[2]:{CLASSIC:[0,1.72,4.48],LOW_RISK:[0,1.9,3.28],MEDIUM_RISK:[0,1.7,4.62],HIGH_RISK:[0,0,15.95]},[3]:{CLASSIC:[0,0.9,2.95,9.9],LOW_RISK:[0,1,1.2,26],MEDIUM_RISK:[0,0,2.29,50],HIGH_RISK:[0,0,0,75.7]},[4]:{CLASSIC:[0,0.8,1.6,4.4,21],LOW_RISK:[0,0,2,7.5,86],MEDIUM_RISK:[0,0,1.5,9.5,98],HIGH_RISK:[0,0,0,9,246]},[5]:{CLASSIC:[0,0.2,1.2,4.2,16.3,37],LOW_RISK:[0,0,1.4,3.8,12,300],MEDIUM_RISK:[0,0,1.3,3.5,14,385],HIGH_RISK:[0,0,0,4,45,450]},[6]:{CLASSIC:[0,0,1,3.3,6.2,15,40],LOW_RISK:[0,0,1.1,1.7,4.9,99,700],MEDIUM_RISK:[0,0,0,2.6,8.5,177,705],HIGH_RISK:[0,0,0,0,10,327,710]},[7]:{CLASSIC:[0,0,0.4,2.8,4.2,14.5,30,60],LOW_RISK:[0,0,1.1,1.4,3,14,210,700],MEDIUM_RISK:[0,0,0,1.8,6.4,29,400,800],HIGH_RISK:[0,0,0,0,6.1,85,400,800]},[8]:{CLASSIC:[0,0,0,2,3.7,13,20,50,70],LOW_RISK:[0,0,1.1,1.4,1.6,4.6,35,90,800],MEDIUM_RISK:[0,0,0,1.9,3.5,10.5,65,400,900],HIGH_RISK:[0,0,0,0,4.5,18,265,600,900]},[9]:{CLASSIC:[0,0,0,1.4,2.6,9,11.5,40,60,85],LOW_RISK:[0,0,1,1.3,1.5,2,7,45,250,1000],MEDIUM_RISK:[0,0,0,2,2.1,4,15,98,500,1000],HIGH_RISK:[0,0,0,0,3.5,10.5,55,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.3,2,4.4,8,16.7,50,80,100],LOW_RISK:[0,0,1,1.2,1.25,1.4,2,10,50,250,1000],MEDIUM_RISK:[0,0,0,1.5,1.9,3.5,6.2,26,100,500,1000],HIGH_RISK:[0,0,0,0,3,8,14,57,500,800,1000]}},zr=new h(new Map([[1,Xt],[2,It],[3,jt],[4,Ht],[8,nt]]));class st extends S{constructor(){super("KENO")}determineGameResult({generator:r,edge:t,gameInputs:o}){n.Guard.againstEmptyArray(o.selectedNumbers,()=>O.createValidationError("No numbers selected")),n.Guard.against(o.selectedNumbers.length>10,()=>O.createValidationError("Maximum of 10 numbers can be selected"));for(let x of o.selectedNumbers)n.Guard.againstNonInteger(x,()=>O.createValidationError("Only integers can be selected")),n.Guard.against(x<0||x>39,()=>O.createValidationError("Invalid number selected"));let E=r.getUniqueRandomInts({min:0,max:39,count:10}),A=o.selectedNumbers.filter((x)=>E.values.includes(x)),f=o.selectedNumbers.length;if(!$r(f))throw new Error(`Invalid tile count: ${f}`);let C=zr.getMultipliers(t)[f][o.riskLevel][A.length];if(C===void 0)throw new Error(`No multiplier found for matching tile count ${A.length}`);return{isFinished:!0,payoutMultiplier:new Wt.default(C),outputs:{result:E.values},randomValues:E}}}var V=G(require("big.js"));var Jr=(r,t)=>{return r.gt(t)?r:t};var qr=(r,t)=>{return r.lt(t)?r:t};class lt extends S{constructor(){super("LIMBO")}determineGameResult({generator:r,edge:t,gameInputs:o}){let E=r.getRandomInt({min:1,max:4294967295}),A=E.max,f=new V.default(16777216),c=new V.default(1),i=new V.default(1e6),B=E.value,C=new V.default(B-1).div(A),p=(100-t)/100,x=f.div(C.mul(f).plus(1)).mul(p),_=Jr(c,qr(x,i));return{isFinished:!0,payoutMultiplier:_.gte(o.targetMultiplier)?new V.default(o.targetMultiplier):new V.default(0),outputs:{randomMultiplier:_,result:E.values},randomValues:E}}}var W=G(require("big.js"));var pr=(r,t)=>{if(t<0||r<0||t>r)throw new Error("Invalid input: ensure 0 ≤ r ≤ n and n ≥ 0.");if(t>r-t)t=r-t;let o=1;for(let E=1;E<=t;E++)o=o*(r-E+1)/E;return o};class Lt extends S{constructor(){super("MINES")}determineGameResult({generator:r,edge:t,gameInputs:o}){if(o.minesCount<=0||o.minesCount>24)throw new Error("Must select between 1 and 24 mines.");if(o.selectedTiles.length>25-o.minesCount)throw new Error("Cannot select more tiles than available safe tiles (total tiles minus mines).");let c=r.getUniqueRandomInts({min:1,max:25,count:o.minesCount}),i=c.values.some((K)=>o.selectedTiles.includes(K)),B=o.hasCashedOut||i,C=(100-t)/100,p=new W.default(pr(25-o.minesCount,o.selectedTiles.length)).div(new W.default(pr(25,o.selectedTiles.length))),_=o.hasCashedOut&&!i?new W.default(C).div(p):new W.default(0);return{isFinished:B,payoutMultiplier:_,outputs:{result:c.values},randomValues:c}}}var Kt=require("big.js");var mr;((E)=>{E.LOW_RISK="LOW_RISK";E.MEDIUM_RISK="MEDIUM_RISK";E.HIGH_RISK="HIGH_RISK"})(mr||={});var Yo=[8,9,10,11,12,13,14,15,16],Fo={LOW_RISK:{8:[6,2.1,1.1,1,0.5,1,1.1,2.1,6],9:[6,2,1.6,1,0.7,0.7,1,1.6,2,6],10:[9,3,1.4,1.1,1,0.5,1,1.1,1.4,3,9],11:[8,3,1.9,1.3,1,0.7,0.7,1,1.3,1.9,3,8],12:[10,3,1.6,1.4,1.1,1,0.5,1,1.1,1.4,1.6,3,10],13:[8,4,3,1.9,1.2,0.9,0.7,0.7,0.9,1.2,1.9,3,4,8],14:[7,4,1.9,1.4,1.3,1.1,1,0.5,1,1.1,1.3,1.4,1.9,4,7],15:[15,8,3,2,1.5,1.1,1,0.7,0.7,1,1.1,1.5,2,3,8,15],16:[16,9,2,1.4,1.4,1.2,1.1,1,0.5,1,1.1,1.2,1.4,1.4,2,9,16]},MEDIUM_RISK:{8:[13,3,1.3,0.7,0.4,0.7,1.3,3,13],9:[18,4,1.7,0.9,0.5,0.5,0.9,1.7,4,18],10:[22,5,2,1.4,0.6,0.4,0.6,1.4,2,5,22],11:[24,6,3,1.8,0.7,0.5,0.5,0.7,1.8,3,6,24],12:[33,11,4,2,1.1,0.6,0.3,0.6,1.1,2,4,11,33],13:[43,13,6,3,1.3,0.7,0.4,0.4,0.7,1.3,3,6,13,43],14:[58,15,7,4,1.9,1,0.5,0.2,0.5,1,1.9,4,7,15,58],15:[88,18,11,5,3,1.3,0.5,0.3,0.3,0.5,1.3,3,5,11,18,88],16:[110,41.1,10,5,3,1.5,1,0.5,0.3,0.5,1,1.5,3,5,10,41.1,110]},HIGH_RISK:{8:[29,4,1.5,0.3,0.2,0.3,1.5,4,29],9:[43,7,2,0.6,0.2,0.2,0.6,2,7,43],10:[76,10,3,0.9,0.3,0.2,0.3,0.9,3,10,76],11:[120,13.9,5.2,1.4,0.4,0.2,0.2,0.4,1.4,5.2,13.9,120],12:[170,23.8,8.1,2,0.7,0.2,0.2,0.2,0.7,2,8.1,23.8,170],13:[260,36.7,11,4,1,0.2,0.2,0.2,0.2,1,4,11,36.7,260],14:[420,56.1,18,5,1.9,0.3,0.2,0.2,0.2,0.3,1.9,5,18,56.1,420],15:[620,82.8,27,8,3,0.5,0.2,0.2,0.2,0.2,0.5,3,8,27,82.8,620],16:[1000,129.9,26.1,9,4,2,0.2,0.2,0.2,0.2,0.2,2,4,9,26.1,129.9,1000]}},Ro={LOW_RISK:{8:[6,1.9,1.1,1,0.5,1,1.1,1.9,6],9:[6,1.7,1.6,1,0.7,0.7,1,1.6,1.7,6],10:[9,2.5,1.4,1.1,1,0.5,1,1.1,1.4,2.5,9],11:[9,2.5,1.8,1.3,1,0.7,0.7,1,1.3,1.8,2.5,9],12:[10,3.2,1.6,1.3,1.1,1,0.5,1,1.1,1.3,1.6,3.2,10],13:[8,3.7,2.9,1.8,1.2,0.9,0.7,0.7,0.9,1.2,1.8,2.9,3.7,8],14:[7,4,1.8,1.2,1.3,1.1,1,0.5,1,1.1,1.3,1.2,1.8,4,7],15:[15,7.6,2.8,2,1.4,1.1,1,0.7,0.7,1,1.1,1.4,2,2.8,7.6,15],16:[16,9,1.7,1.2,1.3,1.2,1.1,1,0.5,1,1.1,1.2,1.3,1.2,1.7,9,16]},MEDIUM_RISK:{8:[13,3.2,1.4,0.6,0.4,0.6,1.4,3.2,13],9:[18,3.7,1.7,0.9,0.5,0.5,0.9,1.7,3.7,18],10:[22,5,1.9,1.4,0.6,0.4,0.6,1.4,1.9,5,22],11:[24,6,2.8,1.8,0.7,0.5,0.5,0.7,1.8,2.8,6,24],12:[33,11.1,4,1.9,1.1,0.6,0.3,0.6,1.1,1.9,4,11.1,33],13:[43,13.7,6.1,2.8,1.3,0.7,0.4,0.4,0.7,1.3,2.8,6.1,13.7,43],14:[58,13.7,6.7,3.9,1.9,1,0.5,0.2,0.5,1,1.9,3.9,6.7,13.7,58],15:[88,17.7,10.8,5,2.9,1.3,0.5,0.3,0.3,0.5,1.3,2.9,5,10.8,17.7,88],16:[110,40.5,9.8,4.8,2.9,1.5,1,0.5,0.3,0.5,1,1.5,2.9,4.8,9.8,40.5,110]},HIGH_RISK:{8:[29,3.8,1.5,0.3,0.2,0.3,1.5,3.8,29],9:[43,7.1,1.9,0.6,0.2,0.2,0.6,1.9,7.1,43],10:[76,9.9,2.9,0.9,0.3,0.2,0.3,0.9,2.9,9.9,76],11:[120,13.4,5.1,1.4,0.4,0.2,0.2,0.4,1.4,5.1,13.4,120],12:[170,23.2,7.9,2,0.7,0.2,0.2,0.2,0.7,2,7.9,23.2,170],13:[260,36.6,10.5,4,1,0.2,0.2,0.2,0.2,1,4,10.5,36.6,260],14:[420,55.5,17.6,4.9,1.9,0.3,0.2,0.2,0.2,0.3,1.9,4.9,17.6,55.5,420],15:[620,82.3,26.8,7.7,3,0.5,0.2,0.2,0.2,0.2,0.5,3,7.7,26.8,82.3,620],16:[1000,129.8,25.2,8.6,4,2,0.2,0.2,0.2,0.2,0.2,2,4,8.6,25.2,129.8,1000]}},$o={LOW_RISK:{8:[6,2.2,1.1,1,0.4,1,1.1,2.2,6],9:[6,1.8,1.5,1,0.7,0.7,1,1.5,1.8,6],10:[9,2.4,1.3,1.1,1,0.5,1,1.1,1.3,2.4,9],11:[8,2.7,1.9,1.2,1,0.7,0.7,1,1.2,1.9,2.7,8],12:[10,3.3,1.6,1.2,1.1,1,0.5,1,1.1,1.2,1.6,3.3,10],13:[8,3.8,2.9,1.9,1.1,0.9,0.7,0.7,0.9,1.1,1.9,2.9,3.8,8],14:[7,3.9,2,1.4,1.3,1.1,1,0.4,1,1.1,1.3,1.4,2,3.9,7],15:[15,7.9,2.5,2,1.3,1.1,1,0.7,0.7,1,1.1,1.3,2,2.5,7.9,15],16:[16,8.9,1.9,1.4,1.4,1.2,1.1,1,0.4,1,1.1,1.2,1.4,1.4,1.9,8.9,16]},MEDIUM_RISK:{8:[13,3.5,1.2,0.7,0.3,0.7,1.2,3.5,13],9:[18,3.8,1.6,0.9,0.5,0.5,0.9,1.6,3.8,18],10:[22,5.2,2,1.3,0.6,0.4,0.6,1.3,2,5.2,22],11:[24,5.6,2.7,1.8,0.7,0.5,0.5,0.7,1.8,2.7,5.6,24],12:[33,11.3,4,1.8,1.1,0.6,0.3,0.6,1.1,1.8,4,11.3,33],13:[43,12.9,5.7,2.8,1.3,0.7,0.4,0.4,0.7,1.3,2.8,5.7,12.9,43],14:[58,13.7,6.9,3.9,1.8,1,0.5,0.2,0.5,1,1.8,3.9,6.9,13.7,58],15:[88,18,10.9,4.9,2.8,1.3,0.5,0.3,0.3,0.5,1.3,2.8,4.9,10.9,18,88],16:[110,39.9,9.9,5,2.9,1.4,1,0.5,0.3,0.5,1,1.4,2.9,5,9.9,39.9,110]},HIGH_RISK:{8:[29,4,1.4,0.3,0.2,0.3,1.4,4,29],9:[43,7.3,2,0.5,0.2,0.2,0.5,2,7.3,43],10:[76,9.8,2.8,0.9,0.3,0.2,0.3,0.9,2.8,9.8,76],11:[120,13.5,4.9,1.4,0.4,0.2,0.2,0.4,1.4,4.9,13.5,120],12:[170,23.3,7.9,1.9,0.7,0.2,0.2,0.2,0.7,1.9,7.9,23.3,170],13:[260,36.2,10.4,3.9,1,0.2,0.2,0.2,0.2,1,3.9,10.4,36.2,260],14:[420,54.8,17.9,4.9,1.8,0.3,0.2,0.2,0.2,0.3,1.8,4.9,17.9,54.8,420],15:[620,81.9,26.6,7.7,2.9,0.5,0.2,0.2,0.2,0.2,0.5,2.9,7.7,26.6,81.9,620],16:[1000,130,24.9,8.4,3.9,2,0.2,0.2,0.2,0.2,0.2,2,3.9,8.4,24.9,130,1000]}},zo={LOW_RISK:{8:[6,2,1.1,1,0.4,1,1.1,2,6],9:[6,1.9,1.4,1,0.7,0.7,1,1.4,1.9,6],10:[9,2.8,1.1,1.1,1,0.5,1,1.1,1.1,2.8,9],11:[8,2.7,1.7,1.2,1,0.7,0.7,1,1.2,1.7,2.7,8],12:[10,2.7,1.4,1.2,1.1,1,0.5,1,1.1,1.2,1.4,2.7,10],13:[8,3.5,2.8,1.9,1.3,0.9,0.6,0.6,0.9,1.3,1.9,2.8,3.5,8],14:[7,3.3,1.6,1.3,1.3,1.1,1,0.4,1,1.1,1.3,1.3,1.6,3.3,7],15:[15,8,2.9,2,1.4,1.2,1,0.6,0.6,1,1.2,1.4,2,2.9,8,15],16:[16,9.1,2.2,1.4,1.2,1.2,1.1,1,0.4,1,1.1,1.2,1.2,1.4,2.2,9.1,16]},MEDIUM_RISK:{8:[13,2.9,1.2,0.7,0.4,0.7,1.2,2.9,13],9:[18,3.5,1.6,0.9,0.5,0.5,0.9,1.6,3.5,18],10:[22,4.7,2,1.3,0.6,0.4,0.6,1.3,2,4.7,22],11:[24,5.7,2.5,1.8,0.7,0.5,0.5,0.7,1.8,2.5,5.7,24],12:[33,10.7,3.8,1.8,1.1,0.6,0.3,0.6,1.1,1.8,3.8,10.7,33],13:[43,12.6,5.6,2.7,1.3,0.7,0.4,0.4,0.7,1.3,2.7,5.6,12.6,43],14:[58,13.7,6.4,3.8,1.8,1,0.5,0.2,0.5,1,1.8,3.8,6.4,13.7,58],15:[88,17.7,10.7,4.9,2.7,1.3,0.5,0.3,0.3,0.5,1.3,2.7,4.9,10.7,17.7,88],16:[110,39.7,9.6,4.8,2.8,1.4,1,0.5,0.3,0.5,1,1.4,2.8,4.8,9.6,39.7,110]},HIGH_RISK:{8:[29,3.9,1.4,0.3,0.2,0.3,1.4,3.9,29],9:[43,6.9,1.8,0.6,0.2,0.2,0.6,1.8,6.9,43],10:[76,9.8,2.7,0.9,0.3,0.2,0.3,0.9,2.7,9.8,76],11:[120,13.1,5.1,1.3,0.4,0.2,0.2,0.4,1.3,5.1,13.1,120],12:[170,22.7,7.7,1.9,0.7,0.2,0.2,0.2,0.7,1.9,7.7,22.7,170],13:[260,35.9,10.3,3.8,1,0.2,0.2,0.2,0.2,1,3.8,10.3,35.9,260],14:[420,54.2,17.5,4.8,1.8,0.3,0.2,0.2,0.2,0.3,1.8,4.8,17.5,54.2,420],15:[620,80.6,26.1,7.8,2.8,0.5,0.2,0.2,0.2,0.2,0.5,2.8,7.8,26.1,80.6,620],16:[1000,129.7,24.7,8.2,3.8,2,0.2,0.2,0.2,0.2,0.2,2,3.8,8.2,24.7,129.7,1000]}},Jo={LOW_RISK:{8:[5,1.8,1,1,0.4,1,1,1.8,5],9:[5,1.7,1.2,1,0.7,0.7,1,1.2,1.7,5],10:[9,2.8,1.2,1,1,0.4,1,1,1.2,2.8,9],11:[8,2.5,1.6,1,1,0.7,0.7,1,1,1.6,2.5,8],12:[10,2.5,1.3,1.3,1,1,0.4,1,1,1.3,1.3,2.5,10],13:[8,4.1,2.8,1.8,1.1,0.9,0.6,0.6,0.9,1.1,1.8,2.8,4.1,8],14:[7,3.3,1.7,1.2,1.2,1,1,0.4,1,1,1.2,1.2,1.7,3.3,7],15:[15,7.3,2.9,1.9,1.4,1,1,0.6,0.6,1,1,1.4,1.9,2.9,7.3,15],16:[16,8.7,2,1.5,1.3,1,1.1,1,0.3,1,1.1,1,1.3,1.5,2,8.7,16]},MEDIUM_RISK:{8:[13,2.6,1.1,0.7,0.4,0.7,1.1,2.6,13],9:[17,3.3,1.4,0.9,0.5,0.5,0.9,1.4,3.3,17],10:[21,4.1,1.7,1.3,0.6,0.4,0.6,1.3,1.7,4.1,21],11:[23,5.6,2.4,1.6,0.7,0.5,0.5,0.7,1.6,2.4,5.6,23],12:[32,10.2,3.7,1.7,1.1,0.6,0.2,0.6,1.1,1.7,3.7,10.2,32],13:[42,11.7,5.3,2.5,1.2,0.7,0.4,0.4,0.7,1.2,2.5,5.3,11.7,42],14:[56,13.2,5.9,3.6,1.6,1,0.5,0.2,0.5,1,1.6,3.6,5.9,13.2,56],15:[86,17.3,10,4.6,2.6,1.2,0.5,0.3,0.3,0.5,1.2,2.6,4.6,10,17.3,86],16:[107,39,9.9,4.5,2.4,1.3,1,0.5,0.3,0.5,1,1.3,2.4,4.5,9.9,39,107]},HIGH_RISK:{8:[28,3.3,1.4,0.3,0.2,0.3,1.4,3.3,28],9:[42,6.7,1.6,0.6,0.2,0.2,0.6,1.6,6.7,42],10:[74,9.6,2.6,0.9,0.3,0.1,0.3,0.9,2.6,9.6,74],11:[116,12.7,4.8,1.2,0.4,0.2,0.2,0.4,1.2,4.8,12.7,116],12:[165,20.9,7.2,1.8,0.7,0.2,0.2,0.2,0.7,1.8,7.2,20.9,165],13:[252,33.9,10.1,3.4,1,0.2,0.2,0.2,0.2,1,3.4,10.1,33.9,252],14:[407,51.9,16.3,4.6,1.7,0.3,0.2,0.2,0.2,0.3,1.7,4.6,16.3,51.9,407],15:[600,76.9,24.9,7.4,2.6,0.5,0.2,0.2,0.2,0.2,0.5,2.6,7.4,24.9,76.9,600],16:[1000,122,24.5,8,3.7,1.8,0.2,0.2,0.2,0.2,0.2,1.8,3.7,8,24.5,122,1000]}},Qr=new h(new Map([[1,Fo],[2,Ro],[3,$o],[4,zo],[8,Jo]]));class vt extends S{constructor(){super("PLINKO")}determineGameResult({generator:r,gameInputs:t,edge:o}){if(t.numberOfRows%1>0)throw new Error("Number of rows must be an integer");if(t.numberOfRows<8||t.numberOfRows>16)throw new Error("Number of rows must be between 8 and 16");let E=t.numberOfRows,c=Qr.getMultipliers(o)[t.riskLevel][E],i=r.getRandomIntsWithReplacement({min:0,max:1,count:t.numberOfRows}),C=i.values.reduce((x,_)=>x+_,0),p=c[C];if(p===void 0)throw new Error(`No payout found for end position ${C}`);return{isFinished:!0,payoutMultiplier:Kt.Big(p),outputs:{result:i.values},randomValues:i}}}var L=require("big.js");var Cr=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36],Xr=[37,...Cr],Ir=[[0,1],[0,2],[0,3],[1,2],[1,4],[2,3],[2,5],[3,6],[4,5],[4,7],[5,6],[5,8],[6,9],[7,8],[7,10],[8,9],[8,11],[9,12],[10,11],[10,13],[11,12],[11,14],[12,15],[13,14],[13,16],[14,15],[14,17],[15,18],[16,17],[16,19],[17,18],[17,20],[18,21],[19,20],[19,22],[20,21],[20,23],[21,24],[22,23],[22,25],[23,24],[23,26],[24,27],[25,26],[25,28],[26,27],[26,29],[27,30],[28,29],[28,31],[29,30],[29,32],[30,33],[31,32],[31,34],[32,33],[32,35],[33,36],[34,35],[35,36]],jr=[[0,1],[0,37],[3,37],[1,2],[1,4],[2,3],[2,5],[3,6],[4,5],[4,7],[5,6],[5,8],[6,9],[7,8],[7,10],[8,9],[8,11],[9,12],[10,11],[10,13],[11,12],[11,14],[12,15],[13,14],[13,16],[14,15],[14,17],[15,18],[16,17],[16,19],[17,18],[17,20],[18,21],[19,20],[19,22],[20,21],[20,23],[21,24],[22,23],[22,25],[23,24],[23,26],[24,27],[25,26],[25,28],[26,27],[26,29],[27,30],[28,29],[28,31],[29,30],[29,32],[30,33],[31,32],[31,34],[32,33],[32,35],[33,36],[34,35],[35,36]],Hr=[[0,1,2],[0,2,3],[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18],[19,20,21],[22,23,24],[25,26,27],[28,29,30],[31,32,33],[34,35,36]],nr=[[0,1,2],[0,2,37],[1,2,3],[2,3,37],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18],[19,20,21],[22,23,24],[25,26,27],[28,29,30],[31,32,33],[34,35,36]],Wr=[[0,1,2,3],[1,2,4,5],[2,3,5,6],[4,5,7,8],[5,6,8,9],[7,8,10,11],[8,9,11,12],[10,11,13,14],[11,12,14,15],[13,14,16,17],[14,15,17,18],[16,17,19,20],[17,18,20,21],[19,20,22,23],[20,21,23,24],[22,23,25,26],[23,24,26,27],[25,26,28,29],[26,27,29,30],[28,29,31,32],[29,30,32,33],[31,32,34,35],[32,33,35,36]],sr=[[1,2,4,5],[2,3,5,6],[4,5,7,8],[5,6,8,9],[7,8,10,11],[8,9,11,12],[10,11,13,14],[11,12,14,15],[13,14,16,17],[14,15,17,18],[16,17,19,20],[17,18,20,21],[19,20,22,23],[20,21,23,24],[22,23,25,26],[23,24,26,27],[25,26,28,29],[26,27,29,30],[28,29,31,32],[29,30,32,33],[31,32,34,35],[32,33,35,36]],lr=[0,1,2,3,37],Lr=[[1,2,3,4,5,6],[4,5,6,7,8,9],[7,8,9,10,11,12],[10,11,12,13,14,15],[13,14,15,16,17,18],[16,17,18,19,20,21],[19,20,21,22,23,24],[22,23,24,25,26,27],[25,26,27,28,29,30],[28,29,30,31,32,33],[31,32,33,34,35,36]],Kr=[[1,2,3,4,5,6],[4,5,6,7,8,9],[7,8,9,10,11,12],[10,11,12,13,14,15],[13,14,15,16,17,18],[16,17,18,19,20,21],[19,20,21,22,23,24],[22,23,24,25,26,27],[25,26,27,28,29,30],[28,29,30,31,32,33],[31,32,33,34,35,36]],U;((o)=>{o.EVEN="EVEN";o.ODD="ODD"})(U||={});var M;((o)=>{o.RED="RED";o.BLACK="BLACK"})(M||={});var a;((o)=>{o.LOW="LOW";o.HIGH="HIGH"})(a||={});var P;((E)=>{E.TOP="TOP";E.MIDDLE="MIDDLE";E.BOTTOM="BOTTOM"})(P||={});var Y;((E)=>{E.FIRST="FIRST";E.SECOND="SECOND";E.THIRD="THIRD"})(Y||={});var dr;((o)=>{o.AMERICAN="AMERICAN";o.EUROPEAN="EUROPEAN"})(dr||={});var Zr=(r)=>{if(r.straightBets.length===0&&r.splitBets.length===0&&r.streetBets.length===0&&r.cornerBets.length===0&&r.doubleStreetBets.length===0&&r.parityBets.length===0&&r.colorBets.length===0&&r.halfBets.length===0&&r.columnBets.length===0&&r.dozenBets.length===0)throw O.createValidationError("Must place at least a single bet.");if(!r.straightBets.every((t)=>t.amount.gte(0)&&s(t.value)))throw O.createValidationError("Invalid straight bet.");if(!r.splitBets.every((t)=>t.amount.gte(0)&&qo(t.values)))throw O.createValidationError("Invalid split bet.");if(!r.streetBets.every((t)=>t.amount.gte(0)&&mo(t.values)))throw O.createValidationError("Invalid street bet.");if(!r.cornerBets.every((t)=>t.amount.gte(0)&&Qo(t.values)))throw O.createValidationError("Invalid corner bet.");if(!r.doubleStreetBets.every((t)=>t.amount.gte(0)&&Xo(t.values)))throw O.createValidationError("Invalid double street bet.");if(!r.parityBets.every((t)=>t.amount.gte(0)&&Object.values(U).includes(t.parity)))throw O.createValidationError("Invalid parity bet.");if(!r.colorBets.every((t)=>t.amount.gte(0)&&Object.values(M).includes(t.color)))throw O.createValidationError("Invalid color bet.");if(!r.halfBets.every((t)=>t.amount.gte(0)&&Object.values(a).includes(t.half)))throw O.createValidationError("Invalid half bet.");if(!r.columnBets.every((t)=>t.amount.gte(0)&&Object.values(P).includes(t.column)))throw O.createValidationError("Invalid column bet.");if(!r.dozenBets.every((t)=>t.amount.gte(0)&&Object.values(Y).includes(t.dozen)))throw O.createValidationError("Invalid dozen bet.")},s=(r)=>{return Cr.includes(r)},qo=(r)=>{if(r.length!==2)return!1;if(!r.every(s))return!1;return Ir.some(([t,o])=>t===r[0]&&o===r[1])},mo=(r)=>{if(r.length!==3)return!1;if(!r.every(s))return!1;return Hr.some(([t,o,E])=>t===r[0]&&o===r[1]&&E===r[2])},Qo=(r)=>{if(r.length!==4)return!1;if(!r.every(s))return!1;return Wr.some(([t,o,E,A])=>t===r[0]&&o===r[1]&&E===r[2]&&A===r[3])},Xo=(r)=>{if(r.length!==6)return!1;if(!r.every(s))return!1;return Lr.some(([t,o,E,A,f,c])=>t===r[0]&&o===r[1]&&E===r[2]&&A===r[3]&&f===r[4]&&c===r[5])};var Dr=(r)=>{if(r.straightBets.length===0&&r.splitBets.length===0&&r.streetBets.length===0&&r.cornerBets.length===0&&r.basketBets.length===0&&r.doubleStreetBets.length===0&&r.parityBets.length===0&&r.colorBets.length===0&&r.halfBets.length===0&&r.columnBets.length===0&&r.dozenBets.length===0)throw O.createValidationError("Must place at least a single bet.");if(!r.straightBets.every((t)=>t.amount.gte(0)&&l(t.value)))throw O.createValidationError("Invalid straight bet.");if(!r.splitBets.every((t)=>t.amount.gte(0)&&Io(t.values)))throw O.createValidationError("Invalid split bet.");if(!r.streetBets.every((t)=>t.amount.gte(0)&&jo(t.values)))throw O.createValidationError("Invalid street bet.");if(!r.cornerBets.every((t)=>t.amount.gte(0)&&Ho(t.values)))throw O.createValidationError("Invalid corner bet.");if(!r.basketBets.every((t)=>t.amount.gte(0)))throw O.createValidationError("Invalid basket bet.");if(!r.doubleStreetBets.every((t)=>t.amount.gte(0)&&no(t.values)))throw O.createValidationError("Invalid double street bet.");if(!r.parityBets.every((t)=>t.amount.gte(0)&&Object.values(U).includes(t.parity)))throw O.createValidationError("Invalid parity bet.");if(!r.colorBets.every((t)=>t.amount.gte(0)&&Object.values(M).includes(t.color)))throw O.createValidationError("Invalid color bet.");if(!r.halfBets.every((t)=>t.amount.gte(0)&&Object.values(a).includes(t.half)))throw O.createValidationError("Invalid half bet.");if(!r.columnBets.every((t)=>t.amount.gte(0)&&Object.values(P).includes(t.column)))throw O.createValidationError("Invalid column bet.");if(!r.dozenBets.every((t)=>t.amount.gte(0)&&Object.values(Y).includes(t.dozen)))throw O.createValidationError("Invalid dozen bet.")},l=(r)=>{return Xr.includes(r)};function Io(r){if(r.length!==2)return!1;if(!r.every(l))return!1;return jr.some(([t,o])=>t===r[0]&&o===r[1])}var jo=(r)=>{if(r.length!==3)return!1;if(!r.every(l))return!1;return nr.some(([t,o,E])=>t===r[0]&&o===r[1]&&E===r[2])},Ho=(r)=>{if(r.length!==4)return!1;if(!r.every(l))return!1;return sr.some(([t,o,E,A])=>t===r[0]&&o===r[1]&&E===r[2]&&A===r[3])},no=(r)=>{if(r.length!==6)return!1;if(!r.every(l))return!1;return Kr.some(([t,o,E,A,f,c])=>t===r[0]&&o===r[1]&&E===r[2]&&A===r[3]&&f===r[4]&&c===r[5])};var gt={straightBets:36,splitBets:18,streetBets:12,cornerBets:9,basketBets:7,doubleStreetBets:6,parityBets:2,colorBets:2,halfBets:2,columnBets:3,dozenBets:3},et=[3,6,9,12,15,18,21,24,27,30,33,36],kt=[2,5,8,11,14,17,20,23,26,29,32,35],ro=[1,4,7,10,13,16,19,22,25,28,31,34],to=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],oo=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35],Eo=2.7,Ao=5.3;class vr extends S{constructor(){super("ROULETTE")}determineGameResult({generator:r,gameInputs:t}){this.validateInputs(t);let o=r.getRandomInt({min:0,max:this.maxNumber}),E=o.value,A=this.determineBetOutcomes(t,E),{payoutMultiplier:f}=this.getPayoutDetails(t,E);return{outputs:{betOutcomes:A,result:o.values},payoutMultiplier:f,isFinished:!0,randomValues:o}}getBetAmount(r){return this.calculateTotalBetAmount(this.getBetTotals(r))}getPayoutDetails(r,t){let o=this.determineBetOutcomes(r,t),E=this.getBetTotals(r),A=this.getBetTotals(o.winningBets),f=this.calculateTotalBetAmount(E),c=this.calculateTotalPayout(A);return{payoutMultiplier:f.gt(0)?c.div(f):new L.Big(0),payoutAmount:c}}determineBetOutcomes(r,t){let o={},E={};for(let A of Object.keys(r)){let f=r[A],c=this.betPredicates[A],{winning:i,losing:B}=this.partitionBets(f,c,t);o[A]=i,E[A]=B}return{winningBets:o,losingBets:E}}calculateTotalAmount(r){return r.reduce((t,o)=>t.plus(o.amount),new L.Big(0))}isWinningStraightBet(r,t){return r.value===t}isWinningSplitBet(r,t){return r.values.some((o)=>o===t)}isWinningStreetBet(r,t){return r.values.some((o)=>o===t)}isWinningCornerBet(r,t){return r.values.some((o)=>o===t)}isWinningDoubleStreetBet(r,t){return r.values.some((o)=>o===t)}isWinningColorBet(r,t){let o=r;return to.includes(t)&&o.color==="RED"||oo.includes(t)&&o.color==="BLACK"}isWinningHalfBet(r,t){let o=r;if(t>0&&t<=18&&o.half==="LOW")return!0;if(t>18&&t<=36&&o.half==="HIGH")return!0;return!1}isWinningColumnBet(r,t){let o=r;return et.includes(t)&&o.column==="TOP"||kt.includes(t)&&o.column==="MIDDLE"||ro.includes(t)&&o.column==="BOTTOM"}isWinningDozenBet(r,t){let o=r;if(t>0&&t<=12&&o.dozen==="FIRST")return!0;if(t>12&&t<=24&&o.dozen==="SECOND")return!0;if(t>24&&t<=36&&o.dozen==="THIRD")return!0;return!1}isWinningParityBet(r,t){let o=r;if(t===0||t===37)return!1;let E=t%2===0?"EVEN":"ODD";return o.parity===E}getBetTotals(r){let t={};for(let o of Object.keys(r))t[o]=this.calculateTotalAmount(r[o]);return t}calculateTotalBetAmount(r){return Object.values(r).reduce((t,o)=>t.plus(o),new L.Big(0))}partitionBets(r,t,o){return{winning:r.filter((E)=>t(E,o)),losing:r.filter((E)=>!t(E,o))}}calculateTotalPayout(r){return Object.entries(r).reduce((t,[o,E])=>{let f=gt[o];return t.plus(E.mul(f||0))},new L.Big(0))}}class gr extends vr{maxNumber=36;betPredicates={straightBets:this.isWinningStraightBet,splitBets:this.isWinningSplitBet,streetBets:this.isWinningStreetBet,cornerBets:this.isWinningCornerBet,doubleStreetBets:this.isWinningDoubleStreetBet,parityBets:this.isWinningParityBet,colorBets:this.isWinningColorBet,halfBets:this.isWinningHalfBet,columnBets:this.isWinningColumnBet,dozenBets:this.isWinningDozenBet};validateInputs(r){Zr(r)}}class er extends vr{maxNumber=37;betPredicates={straightBets:this.isWinningStraightBet,splitBets:this.isWinningSplitBet,streetBets:this.isWinningStreetBet,cornerBets:this.isWinningCornerBet,basketBets:this.isWinningBasketBet,doubleStreetBets:this.isWinningDoubleStreetBet,parityBets:this.isWinningParityBet,colorBets:this.isWinningColorBet,halfBets:this.isWinningHalfBet,columnBets:this.isWinningColumnBet,dozenBets:this.isWinningDozenBet};validateInputs(r){Dr(r)}isWinningBasketBet(r,t){return lr.some((o)=>o===t)}}class kr extends S{europeanGame;americanGame;constructor(){super("ROULETTE");this.europeanGame=new gr,this.americanGame=new er}getBetAmount(r){switch(r.type){case"AMERICAN":return this.americanGame.getBetAmount(r.inputs);case"EUROPEAN":return this.europeanGame.getBetAmount(r.inputs);default:throw new Error("Unhandled roulette type")}}determineGameResult(r){let{gameInputs:t,...o}=r;if(r.edge===Eo&&t.type==="EUROPEAN"){let E=this.europeanGame.determineGameResult({...o,gameInputs:t.inputs}),{betOutcomes:A}=E.outputs;return{...E,outputs:{type:"european",betOutcomes:A,result:E.outputs.result}}}if(r.edge===Ao&&t.type==="AMERICAN"){let E=this.americanGame.determineGameResult({...o,gameInputs:t.inputs}),{betOutcomes:A}=E.outputs;return{...E,outputs:{type:"american",betOutcomes:A,result:E.outputs.result}}}throw O.createValidationError(`Attempted to play ${t.type} roulette on edge ${r.edge}`)}}var Wo=(r)=>{return new kr().getBetAmount(r)};var so=(r)=>{if(r.type==="EUROPEAN")Zr(r.inputs);else Dr(r.inputs)};var Oo=require("big.js");var R;((E)=>{E.LOW_RISK="LOW_RISK";E.MEDIUM_RISK="MEDIUM_RISK";E.HIGH_RISK="HIGH_RISK"})(R||={});var $;((f)=>{f[f.TEN=10]="TEN";f[f.TWENTY=20]="TWENTY";f[f.THIRTY=30]="THIRTY";f[f.FORTY=40]="FORTY";f[f.FIFTY=50]="FIFTY"})($||={});var lo={LOW_RISK:{10:{ZERO:0,A:1.2,B:1.5},20:{ZERO:0,A:1.2,B:1.5},30:{ZERO:0,A:1.2,B:1.5},40:{ZERO:0,A:1.2,B:1.5},50:{ZERO:0,A:1.2,B:1.5}},MEDIUM_RISK:{10:{ZERO:0,A:1.5,B:1.9,C:2,D:3},20:{ZERO:0,A:1.5,B:1.8,C:2,D:3},30:{ZERO:0,A:1.5,B:1.7,C:2,D:3,E:4},40:{ZERO:0,A:1.5,B:1.6,C:2,D:3},50:{ZERO:0,A:1.5,B:2,C:3,D:5}},HIGH_RISK:{10:{ZERO:0,A:9.9},20:{ZERO:0,A:19.8},30:{ZERO:0,A:29.7},40:{ZERO:0,A:39.6},50:{ZERO:0,A:49.5}}},Lo={LOW_RISK:{10:{ZERO:0,A:1.2,B:1.4},20:{ZERO:0,A:1.2,B:1.4},30:{ZERO:0,A:1.2,B:1.4},40:{ZERO:0,A:1.2,B:1.4},50:{ZERO:0,A:1.2,B:1.4}},MEDIUM_RISK:{10:{ZERO:0,A:1.4,B:1.9,C:2,D:3.1},20:{ZERO:0,A:1.5,B:1.8,C:1.9,D:3.4},30:{ZERO:0,A:1.5,B:1.7,C:1.9,D:3,E:4.3},40:{ZERO:0,A:1.5,B:1.6,C:2,D:2.9},50:{ZERO:0,A:1.5,B:2,C:3,D:4.5}},HIGH_RISK:{10:{ZERO:0,A:9.8},20:{ZERO:0,A:19.6},30:{ZERO:0,A:29.4},40:{ZERO:0,A:39.2},50:{ZERO:0,A:49}}},Ko={LOW_RISK:{10:{ZERO:0,A:1.15,B:1.65},20:{ZERO:0,A:1.15,B:1.65},30:{ZERO:0,A:1.15,B:1.65},40:{ZERO:0,A:1.15,B:1.65},50:{ZERO:0,A:1.15,B:1.65}},MEDIUM_RISK:{10:{ZERO:0,A:1.4,B:1.9,C:2,D:3},20:{ZERO:0,A:1.4,B:1.6,C:2,D:3},30:{ZERO:0,A:1.4,B:1.7,C:2,D:3,E:4},40:{ZERO:0,A:1.5,B:1.6,C:2,D:2.8},50:{ZERO:0,A:1.5,B:2,C:2.7,D:4.9}},HIGH_RISK:{10:{ZERO:0,A:9.7},20:{ZERO:0,A:19.4},30:{ZERO:0,A:29.1},40:{ZERO:0,A:38.8},50:{ZERO:0,A:48.5}}},vo={LOW_RISK:{10:{ZERO:0,A:1.15,B:1.55},20:{ZERO:0,A:1.15,B:1.55},30:{ZERO:0,A:1.15,B:1.55},40:{ZERO:0,A:1.15,B:1.55},50:{ZERO:0,A:1.15,B:1.55}},MEDIUM_RISK:{10:{ZERO:0,A:1.4,B:1.8,C:2,D:3},20:{ZERO:0,A:1.3,B:1.5,C:2,D:3},30:{ZERO:0,A:1.4,B:1.6,C:2,D:2.9,E:4},40:{ZERO:0,A:1.5,B:1.6,C:2,D:2.7},50:{ZERO:0,A:1.5,B:2,C:2.6,D:4.8}},HIGH_RISK:{10:{ZERO:0,A:9.6},20:{ZERO:0,A:19.2},30:{ZERO:0,A:28.8},40:{ZERO:0,A:38.4},50:{ZERO:0,A:48}}},go={LOW_RISK:{10:{ZERO:0,A:1.1,B:1.5},20:{ZERO:0,A:1.1,B:1.5},30:{ZERO:0,A:1.1,B:1.45},40:{ZERO:0,A:1.1,B:1.45},50:{ZERO:0,A:1.1,B:1.45}},MEDIUM_RISK:{10:{ZERO:0,A:1.3,B:1.7,C:1.9,D:3},20:{ZERO:0,A:1.3,B:1.4,C:1.9,D:3},30:{ZERO:0,A:1.3,B:1.7,C:1.9,D:2.8,E:3.8},40:{ZERO:0,A:1.4,B:1.8,C:1.9,D:2.6},50:{ZERO:0,A:1.4,B:1.9,C:2.6,D:4.6}},HIGH_RISK:{10:{ZERO:0,A:9.2},20:{ZERO:0,A:18.4},30:{ZERO:0,A:27.6},40:{ZERO:0,A:36.8},50:{ZERO:0,A:46}}},fo=new h(new Map([[1,lo],[2,Lo],[3,Ko],[4,vo],[8,go]]));var co={LOW_RISK:{10:["B","A","A","A","ZERO","A","A","A","A","ZERO"],20:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"],30:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"],40:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"],50:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"]},MEDIUM_RISK:{10:["ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","D"],20:["A","ZERO","C","ZERO","B","ZERO","C","ZERO","C","ZERO","A","ZERO","C","ZERO","C","ZERO","D","ZERO","C","ZERO"],30:["A","ZERO","C","ZERO","A","ZERO","C","ZERO","D","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","C","ZERO","A","ZERO","C","ZERO","E","ZERO","A","ZERO","C","ZERO"],40:["C","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO","C","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO","C","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO"],50:["A","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","B","ZERO","A","ZERO","D","ZERO","A","ZERO","B","ZERO","A","ZERO"]},HIGH_RISK:{10:[...Array(9).fill("ZERO"),"A"],20:[...Array(19).fill("ZERO"),"A"],30:[...Array(29).fill("ZERO"),"A"],40:[...Array(39).fill("ZERO"),"A"],50:[...Array(49).fill("ZERO"),"A"]}};class io extends S{constructor(){super("WHEEL")}determineGameResult({generator:r,gameInputs:t,edge:o}){if(!Object.values($).includes(t.segments))throw new Error("Invalid segments value");if(!Object.values(R).includes(t.riskLevel))throw new Error("Invalid risk level");let A=fo.getMultipliers(o)[t.riskLevel];if(A===void 0)throw new Error(`No multipliers found for risk level ${t.riskLevel}`);let f=A[t.segments];if(f===void 0)throw new Error(`No multipliers found for segment ${t.segments}`);let c=co[t.riskLevel];if(c===void 0)throw new Error(`No patterns found for risk level ${t.riskLevel}`);let i=c[t.segments];if(i===void 0)throw new Error(`No patterns found for segment ${t.segments}`);let B=r.getRandomInt({min:0,max:i.length-1}),C=i[B.value];if(C===void 0)throw new Error(`No pattern found for segment ${t.segments} and value ${B.value}`);let p=f[C];if(p===void 0)throw new Error(`No payout found for picked segment ${C}`);return{isFinished:!0,payoutMultiplier:new Oo.Big(p),outputs:{result:B.values},randomValues:B}}}
|
|
1
|
+
var UA=Object.create;var{getPrototypeOf:GA,defineProperty:H,getOwnPropertyNames:tE,getOwnPropertyDescriptor:MA}=Object,fE=Object.prototype.hasOwnProperty;var h=(r,E,A)=>{A=r!=null?UA(GA(r)):{};let t=E||!r||!r.__esModule?H(A,"default",{value:r,enumerable:!0}):A;for(let f of tE(r))if(!fE.call(t,f))H(t,f,{get:()=>r[f],enumerable:!0});return t},AE=new WeakMap,bA=(r)=>{var E=AE.get(r),A;if(E)return E;if(E=H({},"__esModule",{value:!0}),r&&typeof r==="object"||typeof r==="function")tE(r).map((t)=>!fE.call(E,t)&&H(E,t,{get:()=>r[t],enumerable:!(A=MA(r,t))||A.enumerable}));return AE.set(r,E),E};var wA=(r,E)=>{for(var A in E)H(r,A,{get:E[A],enumerable:!0,configurable:!0,set:(t)=>E[A]=()=>t})};var f1={};wA(f1,{validateRouletteGameInputs:()=>nA,validateAdvancedDiceInputs:()=>YA,rtp99Multipliers:()=>gE,rtp98Multipliers:()=>lE,rtp97Multipliers:()=>kE,rtp96Multipliers:()=>aE,rtp92Multipliers:()=>sE,plinkoMultipliers:()=>Hr,nCr:()=>Ur,kenoMultipliers:()=>Ir,isTileCount:()=>ur,hasDiceWon:()=>LE,diamondsMultipliers:()=>jE,calculateRouletteBetAmount:()=>sA,calculateDiceWinChance:()=>WE,calculateBaccaratBetAmount:()=>TE,calculateAdvancedDiceWinChance:()=>yr,bigMin:()=>ir,bigMax:()=>dr,advancedDiceIsWithinBoundsInclusive:()=>BE,advancedDiceIsWithinBoundsExclusive:()=>tr,advancedDiceGetInclusiveBoundsRange:()=>DE,advancedDiceGetExclusiveBoundsRange:()=>fr,WheelSegments:()=>i,WheelRiskLevel:()=>d,Wheel:()=>CA,WIN_MULTIPLIER:()=>ME,VALID_SUITS:()=>NE,VALID_RANKS:()=>cE,VALID_EUROPEAN_STREETS:()=>Kr,VALID_EUROPEAN_STRAIGHTS:()=>Gr,VALID_EUROPEAN_SPLITS:()=>Wr,VALID_EUROPEAN_DOUBLE_STREETS:()=>ar,VALID_EUROPEAN_CORNERS:()=>gr,VALID_AMERICAN_STREETS:()=>vr,VALID_AMERICAN_STRAIGHTS:()=>mr,VALID_AMERICAN_SPLITS:()=>Lr,VALID_AMERICAN_DOUBLE_STREETS:()=>sr,VALID_AMERICAN_CORNERS:()=>lr,TOP_COLUMN:()=>OA,TILE_COUNTS:()=>vE,SPLIT_BET_SIZE_FACTOR:()=>m,RouletteType:()=>Mr,Roulette:()=>EE,RollType:()=>ZE,RandomValuePool:()=>l,RED_NUMBERS:()=>BA,RANDOM_MIN_VALUE:()=>Or,RANDOM_MAX_VALUE:()=>or,PlinkoRiskLevel:()=>jr,Plinko:()=>tA,Parity:()=>J,PUSH_MULTIPLIER:()=>bE,PLINKO_ROW_COUNTS:()=>IA,PAYOUT_MULTIPLIERS:()=>fA,OrigamiGame:()=>G,MultiplierCalculator:()=>Y,Mines:()=>EA,MIN_WIN_CHANCE:()=>oE,MIDDLE_COLUMN:()=>oA,MAX_WIN_CHANCE:()=>xE,MAX_CARDS_PER_ROUND:()=>Sr,Limbo:()=>rA,LOSE_MULTIPLIER:()=>wE,KenoRiskLevel:()=>Xr,Keno:()=>eE,InsuranceOutcome:()=>Br,INSURANCE_WIN_PAYOUT:()=>zr,INSURANCE_BET_SIZE_FACTOR:()=>I,INSURANCE_BET_MULTIPLIER:()=>pA,Half:()=>q,GameErrorCode:()=>OE,GameError:()=>B,Game:()=>N,FACE_CARD_VALUE:()=>pr,EuropeanRoulette:()=>er,EUROPEAN_HOUSE_EDGE:()=>ZA,EFFECTIVE_RANGE:()=>hr,Dozen:()=>X,DiceDirection:()=>mE,Dice:()=>KE,DiamondsResultType:()=>iE,Diamonds:()=>HE,DOUBLE_DOWN_BET_SIZE_FACTOR:()=>z,DICE_EFFECTIVE_RANGE:()=>qr,DEALER_STAND_VALUE:()=>Yr,Column:()=>Q,Color:()=>R,CARDS_PER_SUIT:()=>$A,BlackjackOutcome:()=>xr,BlackjackActionType:()=>Dr,Blackjack:()=>IE,BaccaratOutcome:()=>_E,BaccaratBetType:()=>CE,Baccarat:()=>UE,BUST_VALUE:()=>Zr,BOTTOM_COLUMN:()=>xA,BLACK_NUMBERS:()=>DA,BLACKJACK_VALUE:()=>$,BLACKJACK_MULTIPLIER:()=>GE,BASE_PAYOUT_MULTIPLIERS:()=>W,AmericanRoulette:()=>rE,AdvancedDice:()=>SE,AMERICAN_HOUSE_EDGE:()=>SA,AMERICAN_BASKET:()=>kr,ACE_SOFT_BONUS:()=>Nr});module.exports=bA(f1);var OE;((E)=>E.INPUT_VALIDATION_ERROR="INPUT_VALIDATION_ERROR")(OE||={});class B extends Error{static createValidationError(r){return new B("INPUT_VALIDATION_ERROR",r)}static isGameError(r){return r instanceof B}errorCode;constructor(r,E){super(E);this.errorCode=r}}var G;((Z)=>{Z.DICE="DICE";Z.MINES="MINES";Z.KENO="KENO";Z.LIMBO="LIMBO";Z.ADVANCED_DICE="ADVANCED_DICE";Z.BACCARAT="BACCARAT";Z.DIAMONDS="DIAMONDS";Z.PLINKO="PLINKO";Z.ROULETTE="ROULETTE";Z.WHEEL="WHEEL";Z.BLACKJACK="BLACKJACK"})(G||={});class N{gameId;constructor(r){this.gameId=r}getGameResult(r){return this.determineGameResult(r)}}var Vr=require("big.js");var Er=h(require("big.js"));class Y{static withMultiplier(r,E){return new Er.default(r).times(new Er.default(100-E).div(100))}static withWinChance(r,E){return Er.default(100-r).div(E)}}var Or=0,or=1e4,hr=10001,oE=0.01,xE=98,hA=(r)=>{if(r<Or)throw B.createValidationError(`Lower bound ${r} is below minimum allowed value ${Or}`)},VA=(r)=>{if(r>or)throw B.createValidationError(`Upper bound ${r} is above maximum allowed value ${or}`)},Ar=(r)=>{if(hA(r.lower),VA(r.upper),r.lower>=r.upper)throw B.createValidationError(`Lower bound ${r.lower} must be less than ${r.upper}`)},yA=(r,E)=>{let[A,t]=r.lower<=E.lower?[r,E]:[E,r];if(A.upper>t.lower)throw B.createValidationError("Bounds must not overlap")},BE=(r,E)=>E>=r.lower&&E<=r.upper,DE=(r)=>r.upper-r.lower+1,tr=(r,E)=>E>r.lower&&E<r.upper,fr=(r)=>r.upper-r.lower-1,ZE;((t)=>{t.ROLL_BETWEEN="ROLL_BETWEEN";t.ROLL_OUTSIDE="ROLL_OUTSIDE";t.ROLL_BETWEEN_TWO="ROLL_BETWEEN_TWO"})(ZE||={});var yr=(r)=>{let A=(()=>{switch(r.mode){case"ROLL_BETWEEN":return Ar(r.bounds),fr(r.bounds);case"ROLL_OUTSIDE":return Ar(r.bounds),hr-DE(r.bounds);case"ROLL_BETWEEN_TWO":return Ar(r.firstBounds),Ar(r.secondBounds),yA(r.firstBounds,r.secondBounds),fr(r.firstBounds)+fr(r.secondBounds)}})(),t=Vr.Big(A).div(hr).mul(100);if(t.lt(oE))throw B.createValidationError("Win chance too low");if(t.gt(xE))throw B.createValidationError("Win chance too high");return t},YA=(r)=>{yr(r)};class SE extends N{constructor(){super("ADVANCED_DICE")}determineGameResult({generator:r,edge:E,gameInputs:A}){let t=yr(A),f=r.getRandomInt({min:Or,max:or}),O=f.value;return{isFinished:!0,payoutMultiplier:(()=>{switch(A.mode){case"ROLL_BETWEEN":return tr(A.bounds,O);case"ROLL_OUTSIDE":return!BE(A.bounds,O);case"ROLL_BETWEEN_TWO":return tr(A.firstBounds,O)||tr(A.secondBounds,O)}})()?Y.withWinChance(E,t):new Vr.Big(0),outputs:{result:f.values},randomValues:f}}}var p=h(require("big.js"));var NE=["Clubs","Diamonds","Hearts","Spades"],cE=["Ace","2","3","4","5","6","7","8","9","10","Jack","Queen","King"],_E;((t)=>{t.PLAYER_WIN="PLAYER_WIN";t.TIE="TIE";t.BANKER_WIN="BANKER_WIN"})(_E||={});var CE;((t)=>{t.PLAYER="PLAYER";t.TIE="TIE";t.BANKER="BANKER"})(CE||={});var zA={["PLAYER_WIN"]:{betType:"PLAYER",multiplier:2},["TIE"]:{betType:"TIE",multiplier:9},["BANKER_WIN"]:{betType:"BANKER",multiplier:1.95}},TE=(r)=>{return new p.default(0).add(r.bets.reduce((A,t)=>A.add(t.amount),new p.default(0)))};class UE extends N{constructor(){super("BACCARAT")}determineGameResult({generator:r,gameInputs:E,edge:A}){if(A!==1)throw new Error("Baccarat is only available at 1% edge.");this.validateGameInputs(E);let t=r.getRandomIntsWithReplacement({min:0,max:51,count:6}),f=t.values,O=f.slice(0,3),o=f.slice(3,6),x=[],D=0;for(let C of O.slice(0,2)){let b=this.mapRandomValueToCard(C),rr=this.mapRandomValueToCardValue(C);x.push(b),D=(D+rr)%10}let c=[],S=0;for(let C of o.slice(0,2)){let b=this.mapRandomValueToCard(C),rr=this.mapRandomValueToCardValue(C);c.push(b),S=(S+rr)%10}if(!this.isNaturalWin(D,S)){let C=this.shouldDrawThirdPlayerCard(D),b=null;if(C)b=this.mapRandomValueToCardValue(O[2]),x.push(this.mapRandomValueToCard(O[2])),D=(D+b)%10;if(this.shouldDrawThirdBankerCard(S,b))c.push(this.mapRandomValueToCard(o[2])),S=(S+this.mapRandomValueToCardValue(o[2]))%10}let Z;if(D===S)Z="TIE";else Z=D>S?"PLAYER_WIN":"BANKER_WIN";let w=TE(E),{betType:u,multiplier:TA}=zA[Z],j=new p.default(0);if(j=j.add(E.bets.filter((C)=>C.type===u).reduce((C,b)=>C.add(b.amount.mul(TA)),new p.default(0))),Z==="TIE")j=j.add(E.bets.filter((C)=>C.type==="PLAYER"||C.type==="BANKER").reduce((C,b)=>C.add(b.amount),new p.default(0)));return{isFinished:!0,payoutMultiplier:w.gt(0)?j.div(w):new p.default(0),outputs:{playerCards:x,playerHandValue:D,bankerCards:c,bankerHandValue:S,gameOutcome:Z,result:t.values},randomValues:t}}validateGameInputs(r){if(r.bets.length===0)throw new Error("Must place at least a single bet.");if(!r.bets.every((E)=>E.amount.gte(0)))throw new Error("Invalid bet.")}mapRandomValueToCard(r){let E=NE[Math.floor(r/13)],A=cE[r%13];return{suit:E,rank:A}}isNaturalWin(r,E){let A=[8,9];return A.includes(r)||A.includes(E)}mapRandomValueToCardValue(r){let E=r%13;if(E===0)return 1;if(E>=10)return 10;return E+1}shouldDrawThirdPlayerCard(r){return r<=5}shouldDrawThirdBankerCard(r,E){if(E===null)return r<=5;if(r<=2)return!0;if(r===3)return E!==8;if(r===4)return[2,3,4,5,6,7].includes(E);if(r===5)return[4,5,6,7].includes(E);if(r===6)return[6,7].includes(E);return!1}}var xr;((f)=>{f.WIN="WIN";f.LOSE="LOSE";f.PUSH="PUSH";f.PLAYER_BLACKJACK="PLAYER_BLACKJACK"})(xr||={});var Br;((A)=>{A.WON="WON";A.LOST="LOST"})(Br||={});var Dr;((x)=>{x.START="START";x.HIT="BLACKJACK_HIT";x.STAND="BLACKJACK_STAND";x.BUY_INSURANCE="BLACKJACK_BUY_INSURANCE";x.REJECT_INSURANCE="BLACKJACK_REJECT_INSURANCE";x.DOUBLE_DOWN="BLACKJACK_DOUBLE_DOWN";x.SPLIT="BLACKJACK_SPLIT"})(Dr||={});var GE=2.5,ME=2,bE=1,wE=0,Yr=17,Zr=21,$=21,Sr=63,pA=1.5,I=0.5,zr=1.5,z=1,m=1,$A=13,Nr=10,pr=10,W={PLAYER_BLACKJACK:GE,WIN:ME,PUSH:bE,LOSE:wE};var _=require("@betorigami/guard"),XE=require("@xstate/store");var hE=0,VE=51,cr=Array.from({length:52},(r,E)=>E),yE=["Spades","Hearts","Diamonds","Clubs"],_r=["Ace","Two","Three","Four","Five","Six","Seven","Eight","Nine","Ten","Jack","Queen","King"],YE=["Jack","Queen","King"];var zE=require("@betorigami/guard");var Cr=require("@betorigami/guard");class $r{value;constructor(r){let E=cr[r];Cr.Guard.againstNullOrUndefined(E,`Invalid card value: ${r}`),this.value=E}get suit(){let r=Math.floor(this.value/13),E=yE[r];return Cr.Guard.againstNullOrUndefined(E,`Invalid suit index: ${r}`),E}get rank(){let r=this.value%13,E=_r[r];return Cr.Guard.againstNullOrUndefined(E,`Invalid rank index: ${r}`),E}toDto(){return{rank:this.rank,suit:this.suit,cardValue:this.value}}}class V extends $r{get numericRank(){if(YE.includes(this.rank))return pr;return _r.indexOf(this.rank)+1}static fromValue(r){return zE.Guard.against(!cr.includes(r),`Invalid card value: ${r}`),new V(r)}}class L{cards;hardHandValue;softHandValue=null;constructor(r){this.cards=r;if(this.hardHandValue=r.reduce((A,t)=>A+t.numericRank,0),r.some((A)=>A.rank==="Ace")&&this.hardHandValue+Nr<=Zr)this.softHandValue=this.hardHandValue+Nr}get cardCount(){return this.cards.length}get hasSoftHandValue(){return this.softHandValue!==null}get isBusted(){return this.hardHandValue>Zr}get isBlackjack(){return this.cardCount===2&&this.highestHandValue===$}get highestHandValue(){return this.softHandValue!==null?this.softHandValue:this.hardHandValue}}class K{cards;value;constructor(r){this.cards=r.map((E)=>V.fromValue(E)),this.value=new L(this.cards)}get isBusted(){return this.value.isBusted}get isBlackjack(){return this.value.isBlackjack}get highestHandValue(){return this.value.highestHandValue}get rawValues(){return this.cards.map((r)=>r.value)}toDto(){return{cards:this.cards.map((r)=>r.toDto()),value:this.highestHandValue}}}class v extends K{otherCards;upCard;holeCard;constructor(r,E,A=[]){super([r,E,...A]);this.otherCards=A;this.upCard=V.fromValue(r),this.holeCard=V.fromValue(E)}static withInitialDeal(r){return new v(r.upCard,r.holeCard)}addDrawnCards(r){return new v(this.upCard.value,this.holeCard.value,[...this.otherCards,...r])}toDto(r=!1){if(r)return super.toDto();return{cards:[this.upCard.toDto()],value:new L([this.upCard]).highestHandValue}}}class F extends K{static withInitialDeal(r){return new F(r)}addDrawnCards(r){return new F([...this.rawValues,...r])}}var g=require("@betorigami/guard");class l{source;index=0;constructor(r){this.source=r}static from(r,E){return g.Guard.against(E<=0,`Count must be positive, got ${E}`),g.Guard.against(r.values.length!==E,`Expected ${E} values, got ${r.values.length}`),new l(r)}get consumedValues(){return this.source.values.slice(0,this.index)}toMultipleRandomValues(){return this.source}takeOne(){let r=this.source.values[this.index];return g.Guard.againstUndefined(r,"RandomValuePool exhausted"),this.index+=1,r}take(r){g.Guard.against(this.index+r>this.source.values.length,`RandomValuePool exhausted: requested ${r} but only ${this.source.values.length-this.index} remain`);let E=this.source.values.slice(this.index,this.index+r);return this.index+=r,E}}var pE=require("@betorigami/guard"),$E=h(require("fast-deep-equal"));class Fr{edge;constructor(r){this.edge=r}play(r,E,A=[]){let t=this.createGameStore(),f=this.generateRandomValues(r),O=f.toMultipleRandomValues();for(let D of A)t.send({...D.playerArgument,randomValuePool:f});let o=A[A.length-1];if(o)pE.Guard.against(!$E.default(o.state,this.toExternalState(t.getSnapshot().context.state)),"The final state of the game does not match the expected state based on the previous actions");t.send({...E,randomValuePool:f});let x=t.getSnapshot().context;return{playerArgument:x.playerArgument,state:this.toExternalState(x.state),config:x.config,betAmountMultiplier:x.betAmountMultiplier,proof:{proofHash:O.proofHash,proofString:O.proofString}}}}var T=h(require("big.js"));var FE={BLACKJACK_DOUBLE_DOWN:z,BLACKJACK_BUY_INSURANCE:I,BLACKJACK_SPLIT:m},PE=(r)=>r==="WON"?T.default(zr):T.default(0),JE=(r)=>r!==void 0?T.default(I):T.default(0),RE=(r)=>{let E=r.actionType==="BLACKJACK_DOUBLE_DOWN",A=T.default(1),t=E?T.default(z):T.default(0),f=JE(r.insuranceOutcome),O=A.plus(t).plus(f),o=A.plus(t),x=T.default(W[r.outcome]).mul(o),D=PE(r.insuranceOutcome);return{payoutMultiplier:x.plus(D).div(O).toNumber(),betAmountMultiplier:FE[r.actionType]}},qE=(r)=>{let E=r.mainHandDoubledDown?T.default(1).plus(z):T.default(1),A=r.splitHandDoubledDown?T.default(1).plus(z):T.default(1),t=JE(r.insuranceOutcome),f=E.plus(A).plus(t),O=T.default(W[r.mainOutcome]).mul(E),o=T.default(W[r.splitOutcome]).mul(A),x=PE(r.insuranceOutcome);return{payoutMultiplier:O.plus(o).plus(x).div(f).toNumber(),betAmountMultiplier:FE[r.actionType]}};var FA={state:{isFinished:!1,phase:"uninitialised",multiplier:1},config:{},playerArgument:{type:"START"}},U=(r)=>V.fromValue(r).value;function PA(r){_.Guard.against(r.phase!=="in-progress","Expected a started, in-progress game state")}function QE(r){_.Guard.against(r.phase!=="awaiting-insurance","Expected game to be awaiting insurance decision")}function Pr(r){_.Guard.against(r.phase!=="in-progress"&&r.phase!=="playing-main-hand"&&r.phase!=="playing-split-hand","Expected a started, in-progress game state")}var uE=(r,E)=>{let A=E;while(A.highestHandValue<Yr)A=A.addDrawnCards([U(r.takeOne())]);return A},Rr=(r,E)=>{if(r.isBusted)return"LOSE";if(E.isBusted)return"WIN";let A=r.highestHandValue,t=E.highestHandValue;if(A>t)return"WIN";if(A<t)return"LOSE";return"PUSH"},M=(r)=>{let{payoutMultiplier:E,betAmountMultiplier:A}=RE({outcome:r.outcome,insuranceOutcome:r.insuranceOutcome,actionType:r.actionType});return{state:{isFinished:!0,phase:"finished",playerHand:r.playerHand,dealerHand:r.dealerHand,outcome:r.outcome,multiplier:E,randomValues:r.randomValuePool.consumedValues,insuranceOutcome:r.insuranceOutcome},config:{},playerArgument:{type:r.actionType},betAmountMultiplier:A}},Jr=(r)=>{let E=uE(r.randomValuePool,r.dealerHand),A=Rr(r.playerHand,E);return M({...r,dealerHand:E,outcome:A})},Tr=(r)=>{let A=r.mainHand.isBusted&&r.splitHand.isBusted?r.dealerHand:uE(r.randomValuePool,r.dealerHand),t=Rr(r.mainHand,A),f=Rr(r.splitHand,A),{payoutMultiplier:O,betAmountMultiplier:o}=qE({hasSplit:!0,mainOutcome:t,splitOutcome:f,insuranceOutcome:r.insuranceOutcome,mainHandDoubledDown:r.mainHandDoubledDown,splitHandDoubledDown:r.splitHandDoubledDown,actionType:r.actionType});return{state:{isFinished:!0,phase:"split-finished",mainHand:r.mainHand,splitHand:r.splitHand,dealerHand:A,mainOutcome:t,splitOutcome:f,multiplier:O,randomValues:r.randomValuePool.consumedValues,insuranceOutcome:r.insuranceOutcome},config:{},playerArgument:{type:r.actionType},betAmountMultiplier:o}};class IE extends Fr{generateRandomValues(r){return l.from(r.getRandomIntsWithReplacement({min:hE,max:VE,count:Sr}),Sr)}toExternalState(r){let E=r.phase;switch(E){case"awaiting-insurance":return{isFinished:!1,phase:"awaiting-insurance",multiplier:r.multiplier,playerHand:r.playerHand.toDto(),dealerHand:r.dealerHand.toDto(!1)};case"in-progress":return{isFinished:!1,phase:"player-turn",multiplier:r.multiplier,playerHand:r.playerHand.toDto(),dealerHand:r.dealerHand.toDto(!1)};case"playing-main-hand":return{isFinished:!1,phase:"playing-main-hand",multiplier:r.multiplier,mainHand:r.mainHand.toDto(),splitHand:r.splitHand.toDto(),dealerHand:r.dealerHand.toDto(!1)};case"playing-split-hand":return{isFinished:!1,phase:"playing-split-hand",multiplier:r.multiplier,mainHand:r.mainHand.toDto(),splitHand:r.splitHand.toDto(),dealerHand:r.dealerHand.toDto(!1)};case"finished":return{isFinished:!0,multiplier:r.multiplier,randomValues:r.randomValues,outcome:r.outcome,playerHand:r.playerHand.toDto(),dealerHand:r.dealerHand.toDto(!0),...r.insuranceOutcome!==void 0&&{insuranceOutcome:r.insuranceOutcome}};case"split-finished":return{isFinished:!0,multiplier:r.multiplier,randomValues:r.randomValues,mainOutcome:r.mainOutcome,splitOutcome:r.splitOutcome,mainHand:r.mainHand.toDto(),splitHand:r.splitHand.toDto(),dealerHand:r.dealerHand.toDto(!0),...r.insuranceOutcome!==void 0&&{insuranceOutcome:r.insuranceOutcome}};case"uninitialised":throw new Error("Cannot convert uninitialised state to external state");default:_.Guard.againstNever(E,"Invalid state received")}}createGameStore(){return XE.createStore({context:FA,on:{START:(r,E)=>{let{state:A}=r;_.Guard.against(A.phase!=="uninitialised","START action requires a fresh game");let t=U(E.randomValuePool.takeOne()),f=U(E.randomValuePool.takeOne()),O=U(E.randomValuePool.takeOne()),o=U(E.randomValuePool.takeOne()),x=F.withInitialDeal([t,f]),D=v.withInitialDeal({upCard:O,holeCard:o});if(D.upCard.rank==="Ace")return{state:{...A,isFinished:!1,phase:"awaiting-insurance",playerHand:x,dealerHand:D},config:{},playerArgument:{type:"START"}};if(x.isBlackjack&&D.isBlackjack)return M({...A,playerHand:x,dealerHand:D,outcome:"PUSH",randomValuePool:E.randomValuePool,actionType:"START"});if(x.isBlackjack)return M({...A,playerHand:x,dealerHand:D,outcome:"PLAYER_BLACKJACK",randomValuePool:E.randomValuePool,actionType:"START"});if(D.isBlackjack)return M({...A,playerHand:x,dealerHand:D,outcome:"LOSE",randomValuePool:E.randomValuePool,actionType:"START"});return{state:{...A,isFinished:!1,phase:"in-progress",playerHand:x,dealerHand:D,insuranceBought:!1},config:{},playerArgument:{type:"START"}}},BLACKJACK_BUY_INSURANCE:(r,E)=>{let{state:A}=r;QE(A);let{playerHand:t,dealerHand:f}=A,O={...A,randomValuePool:E.randomValuePool,actionType:"BLACKJACK_BUY_INSURANCE",dealerHand:f,playerHand:t};if(t.isBlackjack&&f.isBlackjack)return M({...O,outcome:"PUSH",insuranceOutcome:"WON"});if(t.isBlackjack)return M({...O,outcome:"PLAYER_BLACKJACK",insuranceOutcome:"LOST"});if(f.isBlackjack)return M({...O,outcome:"LOSE",insuranceOutcome:"WON"});return{state:{...A,isFinished:!1,phase:"in-progress",playerHand:t,dealerHand:f,insuranceBought:!0},config:{},playerArgument:{type:"BLACKJACK_BUY_INSURANCE"},betAmountMultiplier:I}},BLACKJACK_REJECT_INSURANCE:(r,E)=>{let{state:A}=r;QE(A);let{playerHand:t,dealerHand:f}=A,O={...A,playerHand:t,dealerHand:f,randomValuePool:E.randomValuePool,actionType:"BLACKJACK_REJECT_INSURANCE",doubledDown:!1};if(t.isBlackjack&&f.isBlackjack)return M({...O,outcome:"PUSH"});if(t.isBlackjack)return M({...O,outcome:"PLAYER_BLACKJACK"});if(f.isBlackjack)return M({...O,outcome:"LOSE"});return{state:{...A,isFinished:!1,phase:"in-progress",playerHand:t,dealerHand:f,insuranceBought:!1},config:{},playerArgument:{type:"BLACKJACK_REJECT_INSURANCE"}}},BLACKJACK_HIT:(r,E)=>{let{state:A}=r;switch(Pr(A),A.phase){case"playing-main-hand":{let t=A.mainHand.addDrawnCards([U(E.randomValuePool.takeOne())]);if(t.isBusted||t.highestHandValue===$)return{state:{...A,phase:"playing-split-hand",mainHand:t,splitHandDoubledDown:!1},config:{},playerArgument:{type:"BLACKJACK_HIT"}};return{state:{...A,mainHand:t},config:{},playerArgument:{type:"BLACKJACK_HIT"}}}case"playing-split-hand":{let t=A.splitHand.addDrawnCards([U(E.randomValuePool.takeOne())]),f=A.insuranceBought?"LOST":void 0;if(t.isBusted||t.highestHandValue===$)return Tr({...A,splitHand:t,randomValuePool:E.randomValuePool,actionType:"BLACKJACK_HIT",insuranceOutcome:f});return{state:{...A,splitHand:t},config:{},playerArgument:{type:"BLACKJACK_HIT"}}}case"in-progress":{let{insuranceBought:t}=A,f=t?"LOST":void 0,O=A.playerHand.addDrawnCards([U(E.randomValuePool.takeOne())]);if(O.isBusted)return M({...A,playerHand:O,outcome:"LOSE",randomValuePool:E.randomValuePool,actionType:"BLACKJACK_HIT",insuranceOutcome:f});if(O.highestHandValue===$)return Jr({...A,playerHand:O,randomValuePool:E.randomValuePool,actionType:"BLACKJACK_HIT",insuranceOutcome:f});return{state:{...A,isFinished:!1,phase:"in-progress",playerHand:O,insuranceBought:t},config:{},playerArgument:{type:"BLACKJACK_HIT"}}}default:_.Guard.againstNever(A,"Invalid phase for HIT action")}},BLACKJACK_STAND:(r,E)=>{let{state:A}=r;switch(Pr(A),A.phase){case"playing-main-hand":return{state:{...A,isFinished:!1,phase:"playing-split-hand",splitHandDoubledDown:!1},config:{},playerArgument:{type:"BLACKJACK_STAND"}};case"playing-split-hand":{let t=A.insuranceBought?"LOST":void 0;return Tr({...A,splitHandDoubledDown:A.splitHandDoubledDown,randomValuePool:E.randomValuePool,actionType:"BLACKJACK_STAND",insuranceOutcome:t})}case"in-progress":{let{insuranceBought:t}=A,f=t?"LOST":void 0;return Jr({...A,randomValuePool:E.randomValuePool,actionType:"BLACKJACK_STAND",insuranceOutcome:f})}default:_.Guard.againstNever(A,"Invalid phase for STAND action")}},BLACKJACK_DOUBLE_DOWN:(r,E)=>{let{state:A}=r;switch(Pr(A),A.phase){case"playing-main-hand":{_.Guard.against(A.mainHand.cards.length!==2,"Double down is only allowed as the first action");let t=A.mainHand.addDrawnCards([U(E.randomValuePool.takeOne())]);return{state:{...A,isFinished:!1,phase:"playing-split-hand",mainHand:t,mainHandDoubledDown:!0,splitHandDoubledDown:!1},config:{},playerArgument:{type:"BLACKJACK_DOUBLE_DOWN"},betAmountMultiplier:z}}case"playing-split-hand":{_.Guard.against(A.splitHand.cards.length!==2,"Double down is only allowed as the first action");let t=A.splitHand.addDrawnCards([U(E.randomValuePool.takeOne())]),f=A.insuranceBought?"LOST":void 0;return Tr({...A,splitHand:t,randomValuePool:E.randomValuePool,actionType:"BLACKJACK_DOUBLE_DOWN",insuranceOutcome:f,splitHandDoubledDown:!0})}case"in-progress":{_.Guard.against(A.playerHand.cards.length!==2,"Double down is only allowed as the first action");let{insuranceBought:t}=A,f=t?"LOST":void 0,O=A.playerHand.addDrawnCards([U(E.randomValuePool.takeOne())]);if(O.isBusted)return M({...A,playerHand:O,outcome:"LOSE",randomValuePool:E.randomValuePool,actionType:"BLACKJACK_DOUBLE_DOWN",insuranceOutcome:f});return Jr({...A,playerHand:O,randomValuePool:E.randomValuePool,actionType:"BLACKJACK_DOUBLE_DOWN",insuranceOutcome:f})}default:_.Guard.againstNever(A,"Invalid phase for DOUBLE_DOWN action")}},BLACKJACK_SPLIT:(r,E)=>{let{state:A}=r;PA(A);let{playerHand:t,dealerHand:f,insuranceBought:O}=A;_.Guard.against(t.cards.length!==2,"Split is only allowed with exactly 2 cards");let o=t.cards[0],x=t.cards[1];_.Guard.againstUndefined(o,"First card is missing"),_.Guard.againstUndefined(x,"Second card is missing"),_.Guard.against(o.rank!==x.rank,"Split requires two cards of the same rank");let D=U(E.randomValuePool.takeOne()),c=U(E.randomValuePool.takeOne()),S=F.withInitialDeal([o.value,D]),Z=F.withInitialDeal([x.value,c]);if(o.rank==="Ace"){let u=O?"LOST":void 0;return Tr({...A,mainHand:S,splitHand:Z,dealerHand:f,randomValuePool:E.randomValuePool,actionType:"BLACKJACK_SPLIT",insuranceOutcome:u,mainHandDoubledDown:!1,splitHandDoubledDown:!1})}return{state:{...A,isFinished:!1,phase:"playing-main-hand",multiplier:1,mainHand:S,splitHand:Z,dealerHand:f,insuranceBought:O,mainHandDoubledDown:!1},config:{},playerArgument:{type:"BLACKJACK_SPLIT"},betAmountMultiplier:m}}}})}getValidNextActionTypes(r){if(r.isFinished)return[];switch(r.phase){case"awaiting-insurance":return["BLACKJACK_BUY_INSURANCE","BLACKJACK_REJECT_INSURANCE"];case"playing-main-hand":{let E=["BLACKJACK_HIT","BLACKJACK_STAND"];if(r.mainHand.cards.length===2)E.push("BLACKJACK_DOUBLE_DOWN");return E}case"playing-split-hand":{let E=["BLACKJACK_HIT","BLACKJACK_STAND"];if(r.splitHand.cards.length===2)E.push("BLACKJACK_DOUBLE_DOWN");return E}case"player-turn":{let E=["BLACKJACK_HIT","BLACKJACK_STAND"];if(r.playerHand.cards.length===2){E.push("BLACKJACK_DOUBLE_DOWN");let A=r.playerHand.cards[0],t=r.playerHand.cards[1];if(_.Guard.againstUndefined(A,"First player card is missing"),_.Guard.againstUndefined(t,"Second player card is missing"),A.rank===t.rank)E.push("BLACKJACK_SPLIT")}return E}default:_.Guard.againstNever(r,"Invalid phase for getting valid actions")}}}var dE=h(require("big.js"));class y{multipliers;constructor(r){this.multipliers=r}getMultipliers(r){let E=this.multipliers.get(r);if(E===void 0)throw new Error(`Multipliers for ${r} not found`);return E}getAllMultipliers(){return Array.from(this.multipliers.entries()).map(([r,E])=>({edge:r,multipliers:E}))}}var iE;((o)=>{o.PAIR="PAIR";o.TWO_PAIR="TWO_PAIR";o.THREE_OF_A_KIND="THREE_OF_A_KIND";o.FULL_HOUSE="FULL_HOUSE";o.FOUR_OF_A_KIND="FOUR_OF_A_KIND";o.FIVE_OF_A_KIND="FIVE_OF_A_KIND"})(iE||={});var JA={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:4.3,FOUR_OF_A_KIND:5,FIVE_OF_A_KIND:50},RA={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:4,FOUR_OF_A_KIND:4.8,FIVE_OF_A_KIND:50},qA={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:3.7,FOUR_OF_A_KIND:4.6,FIVE_OF_A_KIND:50},QA={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:3.4,FOUR_OF_A_KIND:4.4,FIVE_OF_A_KIND:50},XA={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:2.8,FULL_HOUSE:3.2,FOUR_OF_A_KIND:3.6,FIVE_OF_A_KIND:50},jE=new y(new Map([[1,JA],[2,RA],[3,qA],[4,QA],[8,XA]])),uA={2:"PAIR",3:"THREE_OF_A_KIND",4:"FOUR_OF_A_KIND",5:"FIVE_OF_A_KIND"};class HE extends N{constructor(){super("DIAMONDS")}determineGameResult({generator:r,edge:E}){let A=r.getRandomIntsWithReplacement({min:0,max:6,count:5}),t=jE.getMultipliers(E),f=A.values,O=this.calculatePayoutMultiplier(t,f);return{isFinished:!0,payoutMultiplier:dE.default(O),outputs:{result:A.values},randomValues:A}}calculatePayoutMultiplier(r,E){let A=new Map;for(let O of E){let o=A.get(O)||0;A.set(O,o+1)}let t=[...A.values()].filter((O)=>O>1),f=this.classifyResult(t);return f===null?0:r[f]}classifyResult(r){if(r.length>2)throw new Error(`Unexpected number of repeats ${r.length}`);let[E,A]=r;if(E===void 0)return null;if(A===void 0){let t=uA[E];if(t===void 0)throw new Error(`Unexpected single diamond repeat count: ${E}`);return t}return E===3||A===3?"FULL_HOUSE":"TWO_PAIR"}}var Qr=h(require("big.js"));var mE;((A)=>{A.ABOVE="ABOVE";A.BELOW="BELOW"})(mE||={});var qr=1e4,WE=(r)=>{let E=r.direction==="ABOVE"?qr-r.selectedValue:r.selectedValue;return new Qr.default(E).div(qr).mul(100)},LE=(r,E)=>r.direction==="ABOVE"?E>r.selectedValue:E<r.selectedValue;class KE extends N{constructor(){super("DICE")}determineGameResult({generator:r,edge:E,gameInputs:A}){let t=r.getRandomInt({min:0,max:1e4}),f=WE(A);return{isFinished:!0,payoutMultiplier:LE(A,t.value)?Y.withWinChance(E,f):new Qr.default(0),outputs:{result:t.values},randomValues:t}}}var nE=h(require("big.js"));var k=require("@betorigami/guard");var Xr;((f)=>{f.CLASSIC="CLASSIC";f.LOW_RISK="LOW_RISK";f.MEDIUM_RISK="MEDIUM_RISK";f.HIGH_RISK="HIGH_RISK"})(Xr||={});var vE=[1,2,3,4,5,6,7,8,9,10],ur=(r)=>{return vE.includes(r)};var gE={[1]:{CLASSIC:[0,3.96],LOW_RISK:[0.7,1.85],MEDIUM_RISK:[0.4,2.75],HIGH_RISK:[0,3.96]},[2]:{CLASSIC:[0,1.9,4.5],LOW_RISK:[0,2,3.8],MEDIUM_RISK:[0,1.8,5.1],HIGH_RISK:[0,0,17.1]},[3]:{CLASSIC:[0,1,3.1,10.4],LOW_RISK:[0,1.1,1.38,26],MEDIUM_RISK:[0,0,2.8,50],HIGH_RISK:[0,0,0,81.5]},[4]:{CLASSIC:[0,0.8,1.8,5,22.5],LOW_RISK:[0,0,2.2,7.9,90],MEDIUM_RISK:[0,0,1.7,10,100],HIGH_RISK:[0,0,0,10,259]},[5]:{CLASSIC:[0,0.25,1.4,4.1,16.5,36],LOW_RISK:[0,0,1.5,4.2,13,300],MEDIUM_RISK:[0,0,1.4,4,14,390],HIGH_RISK:[0,0,0,4.5,48,450]},[6]:{CLASSIC:[0,0,1,3.68,7,16.5,40],LOW_RISK:[0,0,1.1,2,6.2,100,700],MEDIUM_RISK:[0,0,0,3,9,180,710],HIGH_RISK:[0,0,0,0,11,350,710]},[7]:{CLASSIC:[0,0,0.47,3,4.5,14,31,60],LOW_RISK:[0,0,1.1,1.6,3.5,15,225,700],MEDIUM_RISK:[0,0,0,2,7,30,400,800],HIGH_RISK:[0,0,0,0,7,90,400,800]},[8]:{CLASSIC:[0,0,0,2.2,4,13,22,55,70],LOW_RISK:[0,0,1.1,1.5,2,5.5,39,100,800],MEDIUM_RISK:[0,0,0,2,4,11,67,400,900],HIGH_RISK:[0,0,0,0,5,20,270,600,900]},[9]:{CLASSIC:[0,0,0,1.55,3,8,15,44,60,85],LOW_RISK:[0,0,1.1,1.3,1.7,2.5,7.5,50,250,1000],MEDIUM_RISK:[0,0,0,2,2.5,5,15,100,500,1000],HIGH_RISK:[0,0,0,0,4,11,56,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.4,2.25,4.5,8,17,50,80,100],LOW_RISK:[0,0,1.1,1.2,1.3,1.8,3.5,13,50,250,1000],MEDIUM_RISK:[0,0,0,1.6,2,4,7,26,100,500,1000],HIGH_RISK:[0,0,0,0,3.5,8,13,63,500,800,1000]}},lE={[1]:{CLASSIC:[0,3.92],LOW_RISK:[0.7,1.82],MEDIUM_RISK:[0.4,2.72],HIGH_RISK:[0,3.92]},[2]:{CLASSIC:[0,1.9,4.32],LOW_RISK:[0,2,3.65],MEDIUM_RISK:[0,1.8,5],HIGH_RISK:[0,0,17]},[3]:{CLASSIC:[0,1,3,10.7],LOW_RISK:[0,1.1,1.3,26.2],MEDIUM_RISK:[0,0,2.7,50.3],HIGH_RISK:[0,0,0,80.7]},[4]:{CLASSIC:[0,0.8,1.8,4.75,22.5],LOW_RISK:[0,0,2.2,7.65,90],MEDIUM_RISK:[0,0,1.7,9.8,100],HIGH_RISK:[0,0,0,9.75,259]},[5]:{CLASSIC:[0,0.2,1.4,4.25,16.4,36],LOW_RISK:[0,0,1.5,4.1,12.9,300],MEDIUM_RISK:[0,0,1.4,3.9,13.9,390],HIGH_RISK:[0,0,0,4.5,47,450]},[6]:{CLASSIC:[0,0,1,3.6,7,17,40],LOW_RISK:[0,0,1.1,2,5.8,100,700],MEDIUM_RISK:[0,0,0,3,8.6,180,710],HIGH_RISK:[0,0,0,0,10.6,350,710]},[7]:{CLASSIC:[0,0,0.5,3,4.1,13.7,31,60],LOW_RISK:[0,0,1.1,1.6,3.5,13.5,225,700],MEDIUM_RISK:[0,0,0,2,6.9,29.2,400,800],HIGH_RISK:[0,0,0,0,6.9,89.1,400,800]},[8]:{CLASSIC:[0,0,0,2.2,4,12.2,22,55,70],LOW_RISK:[0,0,1.1,1.5,2,4.8,38,100,800],MEDIUM_RISK:[0,0,0,2,4,10.4,66,400,900],HIGH_RISK:[0,0,0,0,4.9,19.8,270,600,900]},[9]:{CLASSIC:[0,0,0,1.5,3,8.1,15,45,60,85],LOW_RISK:[0,0,1.1,1.3,1.7,2.1,7.4,50,250,1000],MEDIUM_RISK:[0,0,0,2,2.5,4.6,15.2,100,500,1000],HIGH_RISK:[0,0,0,0,4,10.7,55.4,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.4,2.2,4.5,7.6,16,50,80,100],LOW_RISK:[0,0,1.1,1.2,1.3,1.6,3.7,13,50,250,1000],MEDIUM_RISK:[0,0,0,1.6,2,3.8,6.8,26,100,500,1000],HIGH_RISK:[0,0,0,0,3.5,7.8,12.8,63,500,800,1000]}},kE={[1]:{CLASSIC:[0,3.88],LOW_RISK:[0.7,1.78],MEDIUM_RISK:[0.4,2.68],HIGH_RISK:[0,3.88]},[2]:{CLASSIC:[0,1.85,4.48],LOW_RISK:[0,2,3.48],MEDIUM_RISK:[0,1.8,4.8],HIGH_RISK:[0,0,16.8]},[3]:{CLASSIC:[0,1,3,9.9],LOW_RISK:[0,1.1,1.2,26.5],MEDIUM_RISK:[0,0,2.65,50],HIGH_RISK:[0,0,0,79.9]},[4]:{CLASSIC:[0,0.8,1.7,5,23],LOW_RISK:[0,0,2.1,7.95,90],MEDIUM_RISK:[0,0,1.7,9.55,100],HIGH_RISK:[0,0,0,9.5,259]},[5]:{CLASSIC:[0,0.2,1.4,4.1,16.6,36],LOW_RISK:[0,0,1.5,4,12.7,300],MEDIUM_RISK:[0,0,1.4,3.8,13.7,390],HIGH_RISK:[0,0,0,4.4,46.9,450]},[6]:{CLASSIC:[0,0,1,3.6,6.6,16.5,40],LOW_RISK:[0,0,1.1,1.9,5.9,100,700],MEDIUM_RISK:[0,0,0,2.9,8.7,180,710],HIGH_RISK:[0,0,0,0,10.8,342,710]},[7]:{CLASSIC:[0,0,0.5,2.9,4.3,13.5,30.4,60],LOW_RISK:[0,0,1.1,1.6,3.1,14.8,225,700],MEDIUM_RISK:[0,0,0,2,6.7,29,400,800],HIGH_RISK:[0,0,0,0,6.8,88.2,400,800]},[8]:{CLASSIC:[0,0,0,2.2,3.8,12.7,21,54,70],LOW_RISK:[0,0,1.1,1.5,1.8,5.2,38,100,800],MEDIUM_RISK:[0,0,0,2,3.8,10.8,66,400,900],HIGH_RISK:[0,0,0,0,4.9,19.5,265,600,900]},[9]:{CLASSIC:[0,0,0,1.5,2.9,8.2,15,43,60,85],LOW_RISK:[0,0,1.1,1.3,1.6,2.1,7.7,49,250,1000],MEDIUM_RISK:[0,0,0,2,2.4,4.7,15,98,500,1000],HIGH_RISK:[0,0,0,0,3.9,10.8,55,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.4,2.2,4.2,8,16.7,50,80,100],LOW_RISK:[0,0,1.1,1.2,1.3,1.5,2.9,12,50,250,1000],MEDIUM_RISK:[0,0,0,1.6,2,3.6,6.6,26,100,500,1000],HIGH_RISK:[0,0,0,0,3.4,7.9,12.9,62,500,800,1000]}},aE={[1]:{CLASSIC:[0,3.88],LOW_RISK:[0.68,1.84],MEDIUM_RISK:[0.38,2.74],HIGH_RISK:[0,3.88]},[2]:{CLASSIC:[0,1.85,4.48],LOW_RISK:[0,1.96,3.75],MEDIUM_RISK:[0,1.77,5],HIGH_RISK:[0,0,16.82]},[3]:{CLASSIC:[0,1,3.05,9.35],LOW_RISK:[0,1.07,1.37,25.7],MEDIUM_RISK:[0,0,2.74,49],HIGH_RISK:[0,0,0,79.9]},[4]:{CLASSIC:[0,0.8,1.72,4.95,22.3],LOW_RISK:[0,0,2.15,7.86,87],MEDIUM_RISK:[0,0,1.67,9.7,100],HIGH_RISK:[0,0,0,9.7,256]},[5]:{CLASSIC:[0,0.24,1.38,4,16.3,35.5],LOW_RISK:[0,0,1.48,4.1,12.43,300],MEDIUM_RISK:[0,0,1.35,3.96,13.8,389],HIGH_RISK:[0,0,0,4.4,47,444]},[6]:{CLASSIC:[0,0,1,3.57,6.8,16.2,37],LOW_RISK:[0,0,1.06,1.96,6.16,99,700],MEDIUM_RISK:[0,0,0,2.9,8.9,178,709],HIGH_RISK:[0,0,0,0,10.4,347,709]},[7]:{CLASSIC:[0,0,0.45,2.95,4.44,13.85,30,60],LOW_RISK:[0,0,1.07,1.57,3.47,14.57,225,700],MEDIUM_RISK:[0,0,0,1.95,6.8,29.8,400,800],HIGH_RISK:[0,0,0,0,6.8,88.2,400,800]},[8]:{CLASSIC:[0,0,0,2.15,3.9,12.9,21.9,55,70],LOW_RISK:[0,0,1.08,1.45,1.98,5.48,38.8,100,800],MEDIUM_RISK:[0,0,0,1.95,3.96,10.6,66.9,396,896],HIGH_RISK:[0,0,0,0,4.9,19.2,269,599,896]},[9]:{CLASSIC:[0,0,0,1.5,2.95,7.96,14.96,44,60,85],LOW_RISK:[0,0,1.05,1.29,1.69,2.49,7.49,49,250,1000],MEDIUM_RISK:[0,0,0,1.95,2.47,4.9,14.9,99,500,1000],HIGH_RISK:[0,0,0,0,3.96,10.5,55,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.37,2.2,4.45,7.7,16.7,50,80,100],LOW_RISK:[0,0,1.08,1.18,1.28,1.76,3.4,12.9,50,250,1000],MEDIUM_RISK:[0,0,0,1.57,1.95,3.96,6.9,25.5,100,500,1000],HIGH_RISK:[0,0,0,0,3.43,7.9,12.5,60,500,800,1000]}},sE={[1]:{CLASSIC:[0,3.68],LOW_RISK:[0.7,1.58],MEDIUM_RISK:[0.4,2.48],HIGH_RISK:[0,3.68]},[2]:{CLASSIC:[0,1.72,4.48],LOW_RISK:[0,1.9,3.28],MEDIUM_RISK:[0,1.7,4.62],HIGH_RISK:[0,0,15.95]},[3]:{CLASSIC:[0,0.9,2.95,9.9],LOW_RISK:[0,1,1.2,26],MEDIUM_RISK:[0,0,2.29,50],HIGH_RISK:[0,0,0,75.7]},[4]:{CLASSIC:[0,0.8,1.6,4.4,21],LOW_RISK:[0,0,2,7.5,86],MEDIUM_RISK:[0,0,1.5,9.5,98],HIGH_RISK:[0,0,0,9,246]},[5]:{CLASSIC:[0,0.2,1.2,4.2,16.3,37],LOW_RISK:[0,0,1.4,3.8,12,300],MEDIUM_RISK:[0,0,1.3,3.5,14,385],HIGH_RISK:[0,0,0,4,45,450]},[6]:{CLASSIC:[0,0,1,3.3,6.2,15,40],LOW_RISK:[0,0,1.1,1.7,4.9,99,700],MEDIUM_RISK:[0,0,0,2.6,8.5,177,705],HIGH_RISK:[0,0,0,0,10,327,710]},[7]:{CLASSIC:[0,0,0.4,2.8,4.2,14.5,30,60],LOW_RISK:[0,0,1.1,1.4,3,14,210,700],MEDIUM_RISK:[0,0,0,1.8,6.4,29,400,800],HIGH_RISK:[0,0,0,0,6.1,85,400,800]},[8]:{CLASSIC:[0,0,0,2,3.7,13,20,50,70],LOW_RISK:[0,0,1.1,1.4,1.6,4.6,35,90,800],MEDIUM_RISK:[0,0,0,1.9,3.5,10.5,65,400,900],HIGH_RISK:[0,0,0,0,4.5,18,265,600,900]},[9]:{CLASSIC:[0,0,0,1.4,2.6,9,11.5,40,60,85],LOW_RISK:[0,0,1,1.3,1.5,2,7,45,250,1000],MEDIUM_RISK:[0,0,0,2,2.1,4,15,98,500,1000],HIGH_RISK:[0,0,0,0,3.5,10.5,55,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.3,2,4.4,8,16.7,50,80,100],LOW_RISK:[0,0,1,1.2,1.25,1.4,2,10,50,250,1000],MEDIUM_RISK:[0,0,0,1.5,1.9,3.5,6.2,26,100,500,1000],HIGH_RISK:[0,0,0,0,3,8,14,57,500,800,1000]}},Ir=new y(new Map([[1,gE],[2,lE],[3,kE],[4,aE],[8,sE]]));class eE extends N{constructor(){super("KENO")}determineGameResult({generator:r,edge:E,gameInputs:A}){k.Guard.againstEmptyArray(A.selectedNumbers,()=>B.createValidationError("No numbers selected")),k.Guard.against(A.selectedNumbers.length>10,()=>B.createValidationError("Maximum of 10 numbers can be selected"));for(let Z of A.selectedNumbers)k.Guard.againstNonInteger(Z,()=>B.createValidationError("Only integers can be selected")),k.Guard.against(Z<0||Z>39,()=>B.createValidationError("Invalid number selected"));let t=r.getUniqueRandomInts({min:0,max:39,count:10}),f=A.selectedNumbers.filter((Z)=>t.values.includes(Z)),O=A.selectedNumbers.length;if(!ur(O))throw new Error(`Invalid tile count: ${O}`);let c=Ir.getMultipliers(E)[O][A.riskLevel][f.length];if(c===void 0)throw new Error(`No multiplier found for matching tile count ${f.length}`);return{isFinished:!0,payoutMultiplier:new nE.default(c),outputs:{result:t.values},randomValues:t}}}var P=h(require("big.js"));var dr=(r,E)=>{return r.gt(E)?r:E};var ir=(r,E)=>{return r.lt(E)?r:E};class rA extends N{constructor(){super("LIMBO")}determineGameResult({generator:r,edge:E,gameInputs:A}){let t=r.getRandomInt({min:1,max:4294967295}),f=t.max,O=new P.default(16777216),o=new P.default(1),x=new P.default(1e6),D=t.value,c=new P.default(D-1).div(f),S=(100-E)/100,Z=O.div(c.mul(O).plus(1)).mul(S),w=dr(o,ir(Z,x));return{isFinished:!0,payoutMultiplier:w.gte(A.targetMultiplier)?new P.default(A.targetMultiplier):new P.default(0),outputs:{randomMultiplier:w,result:t.values},randomValues:t}}}var a=h(require("big.js"));var Ur=(r,E)=>{if(E<0||r<0||E>r)throw new Error("Invalid input: ensure 0 ≤ r ≤ n and n ≥ 0.");if(E>r-E)E=r-E;let A=1;for(let t=1;t<=E;t++)A=A*(r-t+1)/t;return A};class EA extends N{constructor(){super("MINES")}determineGameResult({generator:r,edge:E,gameInputs:A}){if(A.minesCount<=0||A.minesCount>24)throw new Error("Must select between 1 and 24 mines.");if(A.selectedTiles.length>25-A.minesCount)throw new Error("Cannot select more tiles than available safe tiles (total tiles minus mines).");let o=r.getUniqueRandomInts({min:1,max:25,count:A.minesCount}),x=o.values.some((u)=>A.selectedTiles.includes(u)),D=A.hasCashedOut||x,c=(100-E)/100,S=new a.default(Ur(25-A.minesCount,A.selectedTiles.length)).div(new a.default(Ur(25,A.selectedTiles.length))),w=A.hasCashedOut&&!x?new a.default(c).div(S):new a.default(0);return{isFinished:D,payoutMultiplier:w,outputs:{result:o.values},randomValues:o}}}var AA=require("big.js");var jr;((t)=>{t.LOW_RISK="LOW_RISK";t.MEDIUM_RISK="MEDIUM_RISK";t.HIGH_RISK="HIGH_RISK"})(jr||={});var IA=[8,9,10,11,12,13,14,15,16],dA={LOW_RISK:{8:[6,2.1,1.1,1,0.5,1,1.1,2.1,6],9:[6,2,1.6,1,0.7,0.7,1,1.6,2,6],10:[9,3,1.4,1.1,1,0.5,1,1.1,1.4,3,9],11:[8,3,1.9,1.3,1,0.7,0.7,1,1.3,1.9,3,8],12:[10,3,1.6,1.4,1.1,1,0.5,1,1.1,1.4,1.6,3,10],13:[8,4,3,1.9,1.2,0.9,0.7,0.7,0.9,1.2,1.9,3,4,8],14:[7,4,1.9,1.4,1.3,1.1,1,0.5,1,1.1,1.3,1.4,1.9,4,7],15:[15,8,3,2,1.5,1.1,1,0.7,0.7,1,1.1,1.5,2,3,8,15],16:[16,9,2,1.4,1.4,1.2,1.1,1,0.5,1,1.1,1.2,1.4,1.4,2,9,16]},MEDIUM_RISK:{8:[13,3,1.3,0.7,0.4,0.7,1.3,3,13],9:[18,4,1.7,0.9,0.5,0.5,0.9,1.7,4,18],10:[22,5,2,1.4,0.6,0.4,0.6,1.4,2,5,22],11:[24,6,3,1.8,0.7,0.5,0.5,0.7,1.8,3,6,24],12:[33,11,4,2,1.1,0.6,0.3,0.6,1.1,2,4,11,33],13:[43,13,6,3,1.3,0.7,0.4,0.4,0.7,1.3,3,6,13,43],14:[58,15,7,4,1.9,1,0.5,0.2,0.5,1,1.9,4,7,15,58],15:[88,18,11,5,3,1.3,0.5,0.3,0.3,0.5,1.3,3,5,11,18,88],16:[110,41.1,10,5,3,1.5,1,0.5,0.3,0.5,1,1.5,3,5,10,41.1,110]},HIGH_RISK:{8:[29,4,1.5,0.3,0.2,0.3,1.5,4,29],9:[43,7,2,0.6,0.2,0.2,0.6,2,7,43],10:[76,10,3,0.9,0.3,0.2,0.3,0.9,3,10,76],11:[120,13.9,5.2,1.4,0.4,0.2,0.2,0.4,1.4,5.2,13.9,120],12:[170,23.8,8.1,2,0.7,0.2,0.2,0.2,0.7,2,8.1,23.8,170],13:[260,36.7,11,4,1,0.2,0.2,0.2,0.2,1,4,11,36.7,260],14:[420,56.1,18,5,1.9,0.3,0.2,0.2,0.2,0.3,1.9,5,18,56.1,420],15:[620,82.8,27,8,3,0.5,0.2,0.2,0.2,0.2,0.5,3,8,27,82.8,620],16:[1000,129.9,26.1,9,4,2,0.2,0.2,0.2,0.2,0.2,2,4,9,26.1,129.9,1000]}},iA={LOW_RISK:{8:[6,1.9,1.1,1,0.5,1,1.1,1.9,6],9:[6,1.7,1.6,1,0.7,0.7,1,1.6,1.7,6],10:[9,2.5,1.4,1.1,1,0.5,1,1.1,1.4,2.5,9],11:[9,2.5,1.8,1.3,1,0.7,0.7,1,1.3,1.8,2.5,9],12:[10,3.2,1.6,1.3,1.1,1,0.5,1,1.1,1.3,1.6,3.2,10],13:[8,3.7,2.9,1.8,1.2,0.9,0.7,0.7,0.9,1.2,1.8,2.9,3.7,8],14:[7,4,1.8,1.2,1.3,1.1,1,0.5,1,1.1,1.3,1.2,1.8,4,7],15:[15,7.6,2.8,2,1.4,1.1,1,0.7,0.7,1,1.1,1.4,2,2.8,7.6,15],16:[16,9,1.7,1.2,1.3,1.2,1.1,1,0.5,1,1.1,1.2,1.3,1.2,1.7,9,16]},MEDIUM_RISK:{8:[13,3.2,1.4,0.6,0.4,0.6,1.4,3.2,13],9:[18,3.7,1.7,0.9,0.5,0.5,0.9,1.7,3.7,18],10:[22,5,1.9,1.4,0.6,0.4,0.6,1.4,1.9,5,22],11:[24,6,2.8,1.8,0.7,0.5,0.5,0.7,1.8,2.8,6,24],12:[33,11.1,4,1.9,1.1,0.6,0.3,0.6,1.1,1.9,4,11.1,33],13:[43,13.7,6.1,2.8,1.3,0.7,0.4,0.4,0.7,1.3,2.8,6.1,13.7,43],14:[58,13.7,6.7,3.9,1.9,1,0.5,0.2,0.5,1,1.9,3.9,6.7,13.7,58],15:[88,17.7,10.8,5,2.9,1.3,0.5,0.3,0.3,0.5,1.3,2.9,5,10.8,17.7,88],16:[110,40.5,9.8,4.8,2.9,1.5,1,0.5,0.3,0.5,1,1.5,2.9,4.8,9.8,40.5,110]},HIGH_RISK:{8:[29,3.8,1.5,0.3,0.2,0.3,1.5,3.8,29],9:[43,7.1,1.9,0.6,0.2,0.2,0.6,1.9,7.1,43],10:[76,9.9,2.9,0.9,0.3,0.2,0.3,0.9,2.9,9.9,76],11:[120,13.4,5.1,1.4,0.4,0.2,0.2,0.4,1.4,5.1,13.4,120],12:[170,23.2,7.9,2,0.7,0.2,0.2,0.2,0.7,2,7.9,23.2,170],13:[260,36.6,10.5,4,1,0.2,0.2,0.2,0.2,1,4,10.5,36.6,260],14:[420,55.5,17.6,4.9,1.9,0.3,0.2,0.2,0.2,0.3,1.9,4.9,17.6,55.5,420],15:[620,82.3,26.8,7.7,3,0.5,0.2,0.2,0.2,0.2,0.5,3,7.7,26.8,82.3,620],16:[1000,129.8,25.2,8.6,4,2,0.2,0.2,0.2,0.2,0.2,2,4,8.6,25.2,129.8,1000]}},jA={LOW_RISK:{8:[6,2.2,1.1,1,0.4,1,1.1,2.2,6],9:[6,1.8,1.5,1,0.7,0.7,1,1.5,1.8,6],10:[9,2.4,1.3,1.1,1,0.5,1,1.1,1.3,2.4,9],11:[8,2.7,1.9,1.2,1,0.7,0.7,1,1.2,1.9,2.7,8],12:[10,3.3,1.6,1.2,1.1,1,0.5,1,1.1,1.2,1.6,3.3,10],13:[8,3.8,2.9,1.9,1.1,0.9,0.7,0.7,0.9,1.1,1.9,2.9,3.8,8],14:[7,3.9,2,1.4,1.3,1.1,1,0.4,1,1.1,1.3,1.4,2,3.9,7],15:[15,7.9,2.5,2,1.3,1.1,1,0.7,0.7,1,1.1,1.3,2,2.5,7.9,15],16:[16,8.9,1.9,1.4,1.4,1.2,1.1,1,0.4,1,1.1,1.2,1.4,1.4,1.9,8.9,16]},MEDIUM_RISK:{8:[13,3.5,1.2,0.7,0.3,0.7,1.2,3.5,13],9:[18,3.8,1.6,0.9,0.5,0.5,0.9,1.6,3.8,18],10:[22,5.2,2,1.3,0.6,0.4,0.6,1.3,2,5.2,22],11:[24,5.6,2.7,1.8,0.7,0.5,0.5,0.7,1.8,2.7,5.6,24],12:[33,11.3,4,1.8,1.1,0.6,0.3,0.6,1.1,1.8,4,11.3,33],13:[43,12.9,5.7,2.8,1.3,0.7,0.4,0.4,0.7,1.3,2.8,5.7,12.9,43],14:[58,13.7,6.9,3.9,1.8,1,0.5,0.2,0.5,1,1.8,3.9,6.9,13.7,58],15:[88,18,10.9,4.9,2.8,1.3,0.5,0.3,0.3,0.5,1.3,2.8,4.9,10.9,18,88],16:[110,39.9,9.9,5,2.9,1.4,1,0.5,0.3,0.5,1,1.4,2.9,5,9.9,39.9,110]},HIGH_RISK:{8:[29,4,1.4,0.3,0.2,0.3,1.4,4,29],9:[43,7.3,2,0.5,0.2,0.2,0.5,2,7.3,43],10:[76,9.8,2.8,0.9,0.3,0.2,0.3,0.9,2.8,9.8,76],11:[120,13.5,4.9,1.4,0.4,0.2,0.2,0.4,1.4,4.9,13.5,120],12:[170,23.3,7.9,1.9,0.7,0.2,0.2,0.2,0.7,1.9,7.9,23.3,170],13:[260,36.2,10.4,3.9,1,0.2,0.2,0.2,0.2,1,3.9,10.4,36.2,260],14:[420,54.8,17.9,4.9,1.8,0.3,0.2,0.2,0.2,0.3,1.8,4.9,17.9,54.8,420],15:[620,81.9,26.6,7.7,2.9,0.5,0.2,0.2,0.2,0.2,0.5,2.9,7.7,26.6,81.9,620],16:[1000,130,24.9,8.4,3.9,2,0.2,0.2,0.2,0.2,0.2,2,3.9,8.4,24.9,130,1000]}},HA={LOW_RISK:{8:[6,2,1.1,1,0.4,1,1.1,2,6],9:[6,1.9,1.4,1,0.7,0.7,1,1.4,1.9,6],10:[9,2.8,1.1,1.1,1,0.5,1,1.1,1.1,2.8,9],11:[8,2.7,1.7,1.2,1,0.7,0.7,1,1.2,1.7,2.7,8],12:[10,2.7,1.4,1.2,1.1,1,0.5,1,1.1,1.2,1.4,2.7,10],13:[8,3.5,2.8,1.9,1.3,0.9,0.6,0.6,0.9,1.3,1.9,2.8,3.5,8],14:[7,3.3,1.6,1.3,1.3,1.1,1,0.4,1,1.1,1.3,1.3,1.6,3.3,7],15:[15,8,2.9,2,1.4,1.2,1,0.6,0.6,1,1.2,1.4,2,2.9,8,15],16:[16,9.1,2.2,1.4,1.2,1.2,1.1,1,0.4,1,1.1,1.2,1.2,1.4,2.2,9.1,16]},MEDIUM_RISK:{8:[13,2.9,1.2,0.7,0.4,0.7,1.2,2.9,13],9:[18,3.5,1.6,0.9,0.5,0.5,0.9,1.6,3.5,18],10:[22,4.7,2,1.3,0.6,0.4,0.6,1.3,2,4.7,22],11:[24,5.7,2.5,1.8,0.7,0.5,0.5,0.7,1.8,2.5,5.7,24],12:[33,10.7,3.8,1.8,1.1,0.6,0.3,0.6,1.1,1.8,3.8,10.7,33],13:[43,12.6,5.6,2.7,1.3,0.7,0.4,0.4,0.7,1.3,2.7,5.6,12.6,43],14:[58,13.7,6.4,3.8,1.8,1,0.5,0.2,0.5,1,1.8,3.8,6.4,13.7,58],15:[88,17.7,10.7,4.9,2.7,1.3,0.5,0.3,0.3,0.5,1.3,2.7,4.9,10.7,17.7,88],16:[110,39.7,9.6,4.8,2.8,1.4,1,0.5,0.3,0.5,1,1.4,2.8,4.8,9.6,39.7,110]},HIGH_RISK:{8:[29,3.9,1.4,0.3,0.2,0.3,1.4,3.9,29],9:[43,6.9,1.8,0.6,0.2,0.2,0.6,1.8,6.9,43],10:[76,9.8,2.7,0.9,0.3,0.2,0.3,0.9,2.7,9.8,76],11:[120,13.1,5.1,1.3,0.4,0.2,0.2,0.4,1.3,5.1,13.1,120],12:[170,22.7,7.7,1.9,0.7,0.2,0.2,0.2,0.7,1.9,7.7,22.7,170],13:[260,35.9,10.3,3.8,1,0.2,0.2,0.2,0.2,1,3.8,10.3,35.9,260],14:[420,54.2,17.5,4.8,1.8,0.3,0.2,0.2,0.2,0.3,1.8,4.8,17.5,54.2,420],15:[620,80.6,26.1,7.8,2.8,0.5,0.2,0.2,0.2,0.2,0.5,2.8,7.8,26.1,80.6,620],16:[1000,129.7,24.7,8.2,3.8,2,0.2,0.2,0.2,0.2,0.2,2,3.8,8.2,24.7,129.7,1000]}},mA={LOW_RISK:{8:[5,1.8,1,1,0.4,1,1,1.8,5],9:[5,1.7,1.2,1,0.7,0.7,1,1.2,1.7,5],10:[9,2.8,1.2,1,1,0.4,1,1,1.2,2.8,9],11:[8,2.5,1.6,1,1,0.7,0.7,1,1,1.6,2.5,8],12:[10,2.5,1.3,1.3,1,1,0.4,1,1,1.3,1.3,2.5,10],13:[8,4.1,2.8,1.8,1.1,0.9,0.6,0.6,0.9,1.1,1.8,2.8,4.1,8],14:[7,3.3,1.7,1.2,1.2,1,1,0.4,1,1,1.2,1.2,1.7,3.3,7],15:[15,7.3,2.9,1.9,1.4,1,1,0.6,0.6,1,1,1.4,1.9,2.9,7.3,15],16:[16,8.7,2,1.5,1.3,1,1.1,1,0.3,1,1.1,1,1.3,1.5,2,8.7,16]},MEDIUM_RISK:{8:[13,2.6,1.1,0.7,0.4,0.7,1.1,2.6,13],9:[17,3.3,1.4,0.9,0.5,0.5,0.9,1.4,3.3,17],10:[21,4.1,1.7,1.3,0.6,0.4,0.6,1.3,1.7,4.1,21],11:[23,5.6,2.4,1.6,0.7,0.5,0.5,0.7,1.6,2.4,5.6,23],12:[32,10.2,3.7,1.7,1.1,0.6,0.2,0.6,1.1,1.7,3.7,10.2,32],13:[42,11.7,5.3,2.5,1.2,0.7,0.4,0.4,0.7,1.2,2.5,5.3,11.7,42],14:[56,13.2,5.9,3.6,1.6,1,0.5,0.2,0.5,1,1.6,3.6,5.9,13.2,56],15:[86,17.3,10,4.6,2.6,1.2,0.5,0.3,0.3,0.5,1.2,2.6,4.6,10,17.3,86],16:[107,39,9.9,4.5,2.4,1.3,1,0.5,0.3,0.5,1,1.3,2.4,4.5,9.9,39,107]},HIGH_RISK:{8:[28,3.3,1.4,0.3,0.2,0.3,1.4,3.3,28],9:[42,6.7,1.6,0.6,0.2,0.2,0.6,1.6,6.7,42],10:[74,9.6,2.6,0.9,0.3,0.1,0.3,0.9,2.6,9.6,74],11:[116,12.7,4.8,1.2,0.4,0.2,0.2,0.4,1.2,4.8,12.7,116],12:[165,20.9,7.2,1.8,0.7,0.2,0.2,0.2,0.7,1.8,7.2,20.9,165],13:[252,33.9,10.1,3.4,1,0.2,0.2,0.2,0.2,1,3.4,10.1,33.9,252],14:[407,51.9,16.3,4.6,1.7,0.3,0.2,0.2,0.2,0.3,1.7,4.6,16.3,51.9,407],15:[600,76.9,24.9,7.4,2.6,0.5,0.2,0.2,0.2,0.2,0.5,2.6,7.4,24.9,76.9,600],16:[1000,122,24.5,8,3.7,1.8,0.2,0.2,0.2,0.2,0.2,1.8,3.7,8,24.5,122,1000]}},Hr=new y(new Map([[1,dA],[2,iA],[3,jA],[4,HA],[8,mA]]));class tA extends N{constructor(){super("PLINKO")}determineGameResult({generator:r,gameInputs:E,edge:A}){if(E.numberOfRows%1>0)throw new Error("Number of rows must be an integer");if(E.numberOfRows<8||E.numberOfRows>16)throw new Error("Number of rows must be between 8 and 16");let t=E.numberOfRows,o=Hr.getMultipliers(A)[E.riskLevel][t],x=r.getRandomIntsWithReplacement({min:0,max:1,count:E.numberOfRows}),c=x.values.reduce((Z,w)=>Z+w,0),S=o[c];if(S===void 0)throw new Error(`No payout found for end position ${c}`);return{isFinished:!0,payoutMultiplier:AA.Big(S),outputs:{result:x.values},randomValues:x}}}var e=require("big.js");var Gr=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36],mr=[37,...Gr],Wr=[[0,1],[0,2],[0,3],[1,2],[1,4],[2,3],[2,5],[3,6],[4,5],[4,7],[5,6],[5,8],[6,9],[7,8],[7,10],[8,9],[8,11],[9,12],[10,11],[10,13],[11,12],[11,14],[12,15],[13,14],[13,16],[14,15],[14,17],[15,18],[16,17],[16,19],[17,18],[17,20],[18,21],[19,20],[19,22],[20,21],[20,23],[21,24],[22,23],[22,25],[23,24],[23,26],[24,27],[25,26],[25,28],[26,27],[26,29],[27,30],[28,29],[28,31],[29,30],[29,32],[30,33],[31,32],[31,34],[32,33],[32,35],[33,36],[34,35],[35,36]],Lr=[[0,1],[0,37],[3,37],[1,2],[1,4],[2,3],[2,5],[3,6],[4,5],[4,7],[5,6],[5,8],[6,9],[7,8],[7,10],[8,9],[8,11],[9,12],[10,11],[10,13],[11,12],[11,14],[12,15],[13,14],[13,16],[14,15],[14,17],[15,18],[16,17],[16,19],[17,18],[17,20],[18,21],[19,20],[19,22],[20,21],[20,23],[21,24],[22,23],[22,25],[23,24],[23,26],[24,27],[25,26],[25,28],[26,27],[26,29],[27,30],[28,29],[28,31],[29,30],[29,32],[30,33],[31,32],[31,34],[32,33],[32,35],[33,36],[34,35],[35,36]],Kr=[[0,1,2],[0,2,3],[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18],[19,20,21],[22,23,24],[25,26,27],[28,29,30],[31,32,33],[34,35,36]],vr=[[0,1,2],[0,2,37],[1,2,3],[2,3,37],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18],[19,20,21],[22,23,24],[25,26,27],[28,29,30],[31,32,33],[34,35,36]],gr=[[0,1,2,3],[1,2,4,5],[2,3,5,6],[4,5,7,8],[5,6,8,9],[7,8,10,11],[8,9,11,12],[10,11,13,14],[11,12,14,15],[13,14,16,17],[14,15,17,18],[16,17,19,20],[17,18,20,21],[19,20,22,23],[20,21,23,24],[22,23,25,26],[23,24,26,27],[25,26,28,29],[26,27,29,30],[28,29,31,32],[29,30,32,33],[31,32,34,35],[32,33,35,36]],lr=[[1,2,4,5],[2,3,5,6],[4,5,7,8],[5,6,8,9],[7,8,10,11],[8,9,11,12],[10,11,13,14],[11,12,14,15],[13,14,16,17],[14,15,17,18],[16,17,19,20],[17,18,20,21],[19,20,22,23],[20,21,23,24],[22,23,25,26],[23,24,26,27],[25,26,28,29],[26,27,29,30],[28,29,31,32],[29,30,32,33],[31,32,34,35],[32,33,35,36]],kr=[0,1,2,3,37],ar=[[1,2,3,4,5,6],[4,5,6,7,8,9],[7,8,9,10,11,12],[10,11,12,13,14,15],[13,14,15,16,17,18],[16,17,18,19,20,21],[19,20,21,22,23,24],[22,23,24,25,26,27],[25,26,27,28,29,30],[28,29,30,31,32,33],[31,32,33,34,35,36]],sr=[[1,2,3,4,5,6],[4,5,6,7,8,9],[7,8,9,10,11,12],[10,11,12,13,14,15],[13,14,15,16,17,18],[16,17,18,19,20,21],[19,20,21,22,23,24],[22,23,24,25,26,27],[25,26,27,28,29,30],[28,29,30,31,32,33],[31,32,33,34,35,36]],J;((A)=>{A.EVEN="EVEN";A.ODD="ODD"})(J||={});var R;((A)=>{A.RED="RED";A.BLACK="BLACK"})(R||={});var q;((A)=>{A.LOW="LOW";A.HIGH="HIGH"})(q||={});var Q;((t)=>{t.TOP="TOP";t.MIDDLE="MIDDLE";t.BOTTOM="BOTTOM"})(Q||={});var X;((t)=>{t.FIRST="FIRST";t.SECOND="SECOND";t.THIRD="THIRD"})(X||={});var Mr;((A)=>{A.AMERICAN="AMERICAN";A.EUROPEAN="EUROPEAN"})(Mr||={});var br=(r)=>{if(r.straightBets.length===0&&r.splitBets.length===0&&r.streetBets.length===0&&r.cornerBets.length===0&&r.doubleStreetBets.length===0&&r.parityBets.length===0&&r.colorBets.length===0&&r.halfBets.length===0&&r.columnBets.length===0&&r.dozenBets.length===0)throw B.createValidationError("Must place at least a single bet.");if(!r.straightBets.every((E)=>E.amount.gte(0)&&s(E.value)))throw B.createValidationError("Invalid straight bet.");if(!r.splitBets.every((E)=>E.amount.gte(0)&&WA(E.values)))throw B.createValidationError("Invalid split bet.");if(!r.streetBets.every((E)=>E.amount.gte(0)&&LA(E.values)))throw B.createValidationError("Invalid street bet.");if(!r.cornerBets.every((E)=>E.amount.gte(0)&&KA(E.values)))throw B.createValidationError("Invalid corner bet.");if(!r.doubleStreetBets.every((E)=>E.amount.gte(0)&&vA(E.values)))throw B.createValidationError("Invalid double street bet.");if(!r.parityBets.every((E)=>E.amount.gte(0)&&Object.values(J).includes(E.parity)))throw B.createValidationError("Invalid parity bet.");if(!r.colorBets.every((E)=>E.amount.gte(0)&&Object.values(R).includes(E.color)))throw B.createValidationError("Invalid color bet.");if(!r.halfBets.every((E)=>E.amount.gte(0)&&Object.values(q).includes(E.half)))throw B.createValidationError("Invalid half bet.");if(!r.columnBets.every((E)=>E.amount.gte(0)&&Object.values(Q).includes(E.column)))throw B.createValidationError("Invalid column bet.");if(!r.dozenBets.every((E)=>E.amount.gte(0)&&Object.values(X).includes(E.dozen)))throw B.createValidationError("Invalid dozen bet.")},s=(r)=>{return Gr.includes(r)},WA=(r)=>{if(r.length!==2)return!1;if(!r.every(s))return!1;return Wr.some(([E,A])=>E===r[0]&&A===r[1])},LA=(r)=>{if(r.length!==3)return!1;if(!r.every(s))return!1;return Kr.some(([E,A,t])=>E===r[0]&&A===r[1]&&t===r[2])},KA=(r)=>{if(r.length!==4)return!1;if(!r.every(s))return!1;return gr.some(([E,A,t,f])=>E===r[0]&&A===r[1]&&t===r[2]&&f===r[3])},vA=(r)=>{if(r.length!==6)return!1;if(!r.every(s))return!1;return ar.some(([E,A,t,f,O,o])=>E===r[0]&&A===r[1]&&t===r[2]&&f===r[3]&&O===r[4]&&o===r[5])};var wr=(r)=>{if(r.straightBets.length===0&&r.splitBets.length===0&&r.streetBets.length===0&&r.cornerBets.length===0&&r.basketBets.length===0&&r.doubleStreetBets.length===0&&r.parityBets.length===0&&r.colorBets.length===0&&r.halfBets.length===0&&r.columnBets.length===0&&r.dozenBets.length===0)throw B.createValidationError("Must place at least a single bet.");if(!r.straightBets.every((E)=>E.amount.gte(0)&&n(E.value)))throw B.createValidationError("Invalid straight bet.");if(!r.splitBets.every((E)=>E.amount.gte(0)&&gA(E.values)))throw B.createValidationError("Invalid split bet.");if(!r.streetBets.every((E)=>E.amount.gte(0)&&lA(E.values)))throw B.createValidationError("Invalid street bet.");if(!r.cornerBets.every((E)=>E.amount.gte(0)&&kA(E.values)))throw B.createValidationError("Invalid corner bet.");if(!r.basketBets.every((E)=>E.amount.gte(0)))throw B.createValidationError("Invalid basket bet.");if(!r.doubleStreetBets.every((E)=>E.amount.gte(0)&&aA(E.values)))throw B.createValidationError("Invalid double street bet.");if(!r.parityBets.every((E)=>E.amount.gte(0)&&Object.values(J).includes(E.parity)))throw B.createValidationError("Invalid parity bet.");if(!r.colorBets.every((E)=>E.amount.gte(0)&&Object.values(R).includes(E.color)))throw B.createValidationError("Invalid color bet.");if(!r.halfBets.every((E)=>E.amount.gte(0)&&Object.values(q).includes(E.half)))throw B.createValidationError("Invalid half bet.");if(!r.columnBets.every((E)=>E.amount.gte(0)&&Object.values(Q).includes(E.column)))throw B.createValidationError("Invalid column bet.");if(!r.dozenBets.every((E)=>E.amount.gte(0)&&Object.values(X).includes(E.dozen)))throw B.createValidationError("Invalid dozen bet.")},n=(r)=>{return mr.includes(r)};function gA(r){if(r.length!==2)return!1;if(!r.every(n))return!1;return Lr.some(([E,A])=>E===r[0]&&A===r[1])}var lA=(r)=>{if(r.length!==3)return!1;if(!r.every(n))return!1;return vr.some(([E,A,t])=>E===r[0]&&A===r[1]&&t===r[2])},kA=(r)=>{if(r.length!==4)return!1;if(!r.every(n))return!1;return lr.some(([E,A,t,f])=>E===r[0]&&A===r[1]&&t===r[2]&&f===r[3])},aA=(r)=>{if(r.length!==6)return!1;if(!r.every(n))return!1;return sr.some(([E,A,t,f,O,o])=>E===r[0]&&A===r[1]&&t===r[2]&&f===r[3]&&O===r[4]&&o===r[5])};var fA={straightBets:36,splitBets:18,streetBets:12,cornerBets:9,basketBets:7,doubleStreetBets:6,parityBets:2,colorBets:2,halfBets:2,columnBets:3,dozenBets:3},OA=[3,6,9,12,15,18,21,24,27,30,33,36],oA=[2,5,8,11,14,17,20,23,26,29,32,35],xA=[1,4,7,10,13,16,19,22,25,28,31,34],BA=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],DA=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35],ZA=2.7,SA=5.3;class nr extends N{constructor(){super("ROULETTE")}determineGameResult({generator:r,gameInputs:E}){this.validateInputs(E);let A=r.getRandomInt({min:0,max:this.maxNumber}),t=A.value,f=this.determineBetOutcomes(E,t),{payoutMultiplier:O}=this.getPayoutDetails(E,t);return{outputs:{betOutcomes:f,result:A.values},payoutMultiplier:O,isFinished:!0,randomValues:A}}getBetAmount(r){return this.calculateTotalBetAmount(this.getBetTotals(r))}getPayoutDetails(r,E){let A=this.determineBetOutcomes(r,E),t=this.getBetTotals(r),f=this.getBetTotals(A.winningBets),O=this.calculateTotalBetAmount(t),o=this.calculateTotalPayout(f);return{payoutMultiplier:O.gt(0)?o.div(O):new e.Big(0),payoutAmount:o}}determineBetOutcomes(r,E){let A={},t={};for(let f of Object.keys(r)){let O=r[f],o=this.betPredicates[f],{winning:x,losing:D}=this.partitionBets(O,o,E);A[f]=x,t[f]=D}return{winningBets:A,losingBets:t}}calculateTotalAmount(r){return r.reduce((E,A)=>E.plus(A.amount),new e.Big(0))}isWinningStraightBet(r,E){return r.value===E}isWinningSplitBet(r,E){return r.values.some((A)=>A===E)}isWinningStreetBet(r,E){return r.values.some((A)=>A===E)}isWinningCornerBet(r,E){return r.values.some((A)=>A===E)}isWinningDoubleStreetBet(r,E){return r.values.some((A)=>A===E)}isWinningColorBet(r,E){let A=r;return BA.includes(E)&&A.color==="RED"||DA.includes(E)&&A.color==="BLACK"}isWinningHalfBet(r,E){let A=r;if(E>0&&E<=18&&A.half==="LOW")return!0;if(E>18&&E<=36&&A.half==="HIGH")return!0;return!1}isWinningColumnBet(r,E){let A=r;return OA.includes(E)&&A.column==="TOP"||oA.includes(E)&&A.column==="MIDDLE"||xA.includes(E)&&A.column==="BOTTOM"}isWinningDozenBet(r,E){let A=r;if(E>0&&E<=12&&A.dozen==="FIRST")return!0;if(E>12&&E<=24&&A.dozen==="SECOND")return!0;if(E>24&&E<=36&&A.dozen==="THIRD")return!0;return!1}isWinningParityBet(r,E){let A=r;if(E===0||E===37)return!1;let t=E%2===0?"EVEN":"ODD";return A.parity===t}getBetTotals(r){let E={};for(let A of Object.keys(r))E[A]=this.calculateTotalAmount(r[A]);return E}calculateTotalBetAmount(r){return Object.values(r).reduce((E,A)=>E.plus(A),new e.Big(0))}partitionBets(r,E,A){return{winning:r.filter((t)=>E(t,A)),losing:r.filter((t)=>!E(t,A))}}calculateTotalPayout(r){return Object.entries(r).reduce((E,[A,t])=>{let O=fA[A];return E.plus(t.mul(O||0))},new e.Big(0))}}class er extends nr{maxNumber=36;betPredicates={straightBets:this.isWinningStraightBet,splitBets:this.isWinningSplitBet,streetBets:this.isWinningStreetBet,cornerBets:this.isWinningCornerBet,doubleStreetBets:this.isWinningDoubleStreetBet,parityBets:this.isWinningParityBet,colorBets:this.isWinningColorBet,halfBets:this.isWinningHalfBet,columnBets:this.isWinningColumnBet,dozenBets:this.isWinningDozenBet};validateInputs(r){br(r)}}class rE extends nr{maxNumber=37;betPredicates={straightBets:this.isWinningStraightBet,splitBets:this.isWinningSplitBet,streetBets:this.isWinningStreetBet,cornerBets:this.isWinningCornerBet,basketBets:this.isWinningBasketBet,doubleStreetBets:this.isWinningDoubleStreetBet,parityBets:this.isWinningParityBet,colorBets:this.isWinningColorBet,halfBets:this.isWinningHalfBet,columnBets:this.isWinningColumnBet,dozenBets:this.isWinningDozenBet};validateInputs(r){wr(r)}isWinningBasketBet(r,E){return kr.some((A)=>A===E)}}class EE extends N{europeanGame;americanGame;constructor(){super("ROULETTE");this.europeanGame=new er,this.americanGame=new rE}getBetAmount(r){switch(r.type){case"AMERICAN":return this.americanGame.getBetAmount(r.inputs);case"EUROPEAN":return this.europeanGame.getBetAmount(r.inputs);default:throw new Error("Unhandled roulette type")}}determineGameResult(r){let{gameInputs:E,...A}=r;if(r.edge===ZA&&E.type==="EUROPEAN"){let t=this.europeanGame.determineGameResult({...A,gameInputs:E.inputs}),{betOutcomes:f}=t.outputs;return{...t,outputs:{type:"european",betOutcomes:f,result:t.outputs.result}}}if(r.edge===SA&&E.type==="AMERICAN"){let t=this.americanGame.determineGameResult({...A,gameInputs:E.inputs}),{betOutcomes:f}=t.outputs;return{...t,outputs:{type:"american",betOutcomes:f,result:t.outputs.result}}}throw B.createValidationError(`Attempted to play ${E.type} roulette on edge ${r.edge}`)}}var sA=(r)=>{return new EE().getBetAmount(r)};var nA=(r)=>{if(r.type==="EUROPEAN")br(r.inputs);else wr(r.inputs)};var _A=require("big.js");var d;((t)=>{t.LOW_RISK="LOW_RISK";t.MEDIUM_RISK="MEDIUM_RISK";t.HIGH_RISK="HIGH_RISK"})(d||={});var i;((O)=>{O[O.TEN=10]="TEN";O[O.TWENTY=20]="TWENTY";O[O.THIRTY=30]="THIRTY";O[O.FORTY=40]="FORTY";O[O.FIFTY=50]="FIFTY"})(i||={});var eA={LOW_RISK:{10:{ZERO:0,A:1.2,B:1.5},20:{ZERO:0,A:1.2,B:1.5},30:{ZERO:0,A:1.2,B:1.5},40:{ZERO:0,A:1.2,B:1.5},50:{ZERO:0,A:1.2,B:1.5}},MEDIUM_RISK:{10:{ZERO:0,A:1.5,B:1.9,C:2,D:3},20:{ZERO:0,A:1.5,B:1.8,C:2,D:3},30:{ZERO:0,A:1.5,B:1.7,C:2,D:3,E:4},40:{ZERO:0,A:1.5,B:1.6,C:2,D:3},50:{ZERO:0,A:1.5,B:2,C:3,D:5}},HIGH_RISK:{10:{ZERO:0,A:9.9},20:{ZERO:0,A:19.8},30:{ZERO:0,A:29.7},40:{ZERO:0,A:39.6},50:{ZERO:0,A:49.5}}},r1={LOW_RISK:{10:{ZERO:0,A:1.2,B:1.4},20:{ZERO:0,A:1.2,B:1.4},30:{ZERO:0,A:1.2,B:1.4},40:{ZERO:0,A:1.2,B:1.4},50:{ZERO:0,A:1.2,B:1.4}},MEDIUM_RISK:{10:{ZERO:0,A:1.4,B:1.9,C:2,D:3.1},20:{ZERO:0,A:1.5,B:1.8,C:1.9,D:3.4},30:{ZERO:0,A:1.5,B:1.7,C:1.9,D:3,E:4.3},40:{ZERO:0,A:1.5,B:1.6,C:2,D:2.9},50:{ZERO:0,A:1.5,B:2,C:3,D:4.5}},HIGH_RISK:{10:{ZERO:0,A:9.8},20:{ZERO:0,A:19.6},30:{ZERO:0,A:29.4},40:{ZERO:0,A:39.2},50:{ZERO:0,A:49}}},E1={LOW_RISK:{10:{ZERO:0,A:1.15,B:1.65},20:{ZERO:0,A:1.15,B:1.65},30:{ZERO:0,A:1.15,B:1.65},40:{ZERO:0,A:1.15,B:1.65},50:{ZERO:0,A:1.15,B:1.65}},MEDIUM_RISK:{10:{ZERO:0,A:1.4,B:1.9,C:2,D:3},20:{ZERO:0,A:1.4,B:1.6,C:2,D:3},30:{ZERO:0,A:1.4,B:1.7,C:2,D:3,E:4},40:{ZERO:0,A:1.5,B:1.6,C:2,D:2.8},50:{ZERO:0,A:1.5,B:2,C:2.7,D:4.9}},HIGH_RISK:{10:{ZERO:0,A:9.7},20:{ZERO:0,A:19.4},30:{ZERO:0,A:29.1},40:{ZERO:0,A:38.8},50:{ZERO:0,A:48.5}}},A1={LOW_RISK:{10:{ZERO:0,A:1.15,B:1.55},20:{ZERO:0,A:1.15,B:1.55},30:{ZERO:0,A:1.15,B:1.55},40:{ZERO:0,A:1.15,B:1.55},50:{ZERO:0,A:1.15,B:1.55}},MEDIUM_RISK:{10:{ZERO:0,A:1.4,B:1.8,C:2,D:3},20:{ZERO:0,A:1.3,B:1.5,C:2,D:3},30:{ZERO:0,A:1.4,B:1.6,C:2,D:2.9,E:4},40:{ZERO:0,A:1.5,B:1.6,C:2,D:2.7},50:{ZERO:0,A:1.5,B:2,C:2.6,D:4.8}},HIGH_RISK:{10:{ZERO:0,A:9.6},20:{ZERO:0,A:19.2},30:{ZERO:0,A:28.8},40:{ZERO:0,A:38.4},50:{ZERO:0,A:48}}},t1={LOW_RISK:{10:{ZERO:0,A:1.1,B:1.5},20:{ZERO:0,A:1.1,B:1.5},30:{ZERO:0,A:1.1,B:1.45},40:{ZERO:0,A:1.1,B:1.45},50:{ZERO:0,A:1.1,B:1.45}},MEDIUM_RISK:{10:{ZERO:0,A:1.3,B:1.7,C:1.9,D:3},20:{ZERO:0,A:1.3,B:1.4,C:1.9,D:3},30:{ZERO:0,A:1.3,B:1.7,C:1.9,D:2.8,E:3.8},40:{ZERO:0,A:1.4,B:1.8,C:1.9,D:2.6},50:{ZERO:0,A:1.4,B:1.9,C:2.6,D:4.6}},HIGH_RISK:{10:{ZERO:0,A:9.2},20:{ZERO:0,A:18.4},30:{ZERO:0,A:27.6},40:{ZERO:0,A:36.8},50:{ZERO:0,A:46}}},NA=new y(new Map([[1,eA],[2,r1],[3,E1],[4,A1],[8,t1]]));var cA={LOW_RISK:{10:["B","A","A","A","ZERO","A","A","A","A","ZERO"],20:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"],30:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"],40:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"],50:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"]},MEDIUM_RISK:{10:["ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","D"],20:["A","ZERO","C","ZERO","B","ZERO","C","ZERO","C","ZERO","A","ZERO","C","ZERO","C","ZERO","D","ZERO","C","ZERO"],30:["A","ZERO","C","ZERO","A","ZERO","C","ZERO","D","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","C","ZERO","A","ZERO","C","ZERO","E","ZERO","A","ZERO","C","ZERO"],40:["C","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO","C","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO","C","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO"],50:["A","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","B","ZERO","A","ZERO","D","ZERO","A","ZERO","B","ZERO","A","ZERO"]},HIGH_RISK:{10:[...Array(9).fill("ZERO"),"A"],20:[...Array(19).fill("ZERO"),"A"],30:[...Array(29).fill("ZERO"),"A"],40:[...Array(39).fill("ZERO"),"A"],50:[...Array(49).fill("ZERO"),"A"]}};class CA extends N{constructor(){super("WHEEL")}determineGameResult({generator:r,gameInputs:E,edge:A}){if(!Object.values(i).includes(E.segments))throw new Error("Invalid segments value");if(!Object.values(d).includes(E.riskLevel))throw new Error("Invalid risk level");let f=NA.getMultipliers(A)[E.riskLevel];if(f===void 0)throw new Error(`No multipliers found for risk level ${E.riskLevel}`);let O=f[E.segments];if(O===void 0)throw new Error(`No multipliers found for segment ${E.segments}`);let o=cA[E.riskLevel];if(o===void 0)throw new Error(`No patterns found for risk level ${E.riskLevel}`);let x=o[E.segments];if(x===void 0)throw new Error(`No patterns found for segment ${E.segments}`);let D=r.getRandomInt({min:0,max:x.length-1}),c=x[D.value];if(c===void 0)throw new Error(`No pattern found for segment ${E.segments} and value ${D.value}`);let S=O[c];if(S===void 0)throw new Error(`No payout found for picked segment ${c}`);return{isFinished:!0,payoutMultiplier:new _A.Big(S),outputs:{result:D.values},randomValues:D}}}
|
package/dist/index.d.ts
CHANGED
|
@@ -229,7 +229,8 @@ export declare enum BlackjackActionType {
|
|
|
229
229
|
STAND = "BLACKJACK_STAND",
|
|
230
230
|
BUY_INSURANCE = "BLACKJACK_BUY_INSURANCE",
|
|
231
231
|
REJECT_INSURANCE = "BLACKJACK_REJECT_INSURANCE",
|
|
232
|
-
DOUBLE_DOWN = "BLACKJACK_DOUBLE_DOWN"
|
|
232
|
+
DOUBLE_DOWN = "BLACKJACK_DOUBLE_DOWN",
|
|
233
|
+
SPLIT = "BLACKJACK_SPLIT"
|
|
233
234
|
}
|
|
234
235
|
export declare const BLACKJACK_MULTIPLIER = 2.5;
|
|
235
236
|
export declare const WIN_MULTIPLIER = 2;
|
|
@@ -243,6 +244,7 @@ export declare const INSURANCE_BET_MULTIPLIER = 1.5;
|
|
|
243
244
|
export declare const INSURANCE_BET_SIZE_FACTOR = 0.5;
|
|
244
245
|
export declare const INSURANCE_WIN_PAYOUT = 1.5;
|
|
245
246
|
export declare const DOUBLE_DOWN_BET_SIZE_FACTOR = 1;
|
|
247
|
+
export declare const SPLIT_BET_SIZE_FACTOR = 1;
|
|
246
248
|
export declare const CARDS_PER_SUIT = 13;
|
|
247
249
|
export declare const ACE_SOFT_BONUS = 10;
|
|
248
250
|
export declare const FACE_CARD_VALUE = 10;
|
|
@@ -373,23 +375,41 @@ export type BlackjackRejectInsuranceAction = Readonly<{
|
|
|
373
375
|
export type BlackjackDoubleDownAction = Readonly<{
|
|
374
376
|
type: BlackjackActionType.DOUBLE_DOWN;
|
|
375
377
|
}>;
|
|
376
|
-
export type
|
|
377
|
-
|
|
378
|
+
export type BlackjackSplitAction = Readonly<{
|
|
379
|
+
type: BlackjackActionType.SPLIT;
|
|
380
|
+
}>;
|
|
381
|
+
export type BlackjackAction = BlackjackStartAction | BlackjackHitAction | BlackjackStandAction | BlackjackBuyInsuranceAction | BlackjackRejectInsuranceAction | BlackjackDoubleDownAction | BlackjackSplitAction;
|
|
382
|
+
export type BlackjackSingleHandStateBase = Readonly<{
|
|
378
383
|
playerHand: BlackjackHandDto;
|
|
379
384
|
dealerHand: BlackjackHandDto;
|
|
380
385
|
}>;
|
|
381
|
-
export type BlackjackAwaitingInsuranceState = Simplify<
|
|
386
|
+
export type BlackjackAwaitingInsuranceState = Simplify<BlackjackSingleHandStateBase & BaseInProgressState & {
|
|
382
387
|
phase: "awaiting-insurance";
|
|
383
388
|
}>;
|
|
384
|
-
export type BlackjackPlayerTurnState = Simplify<
|
|
389
|
+
export type BlackjackPlayerTurnState = Simplify<BlackjackSingleHandStateBase & BaseInProgressState & {
|
|
385
390
|
phase: "player-turn";
|
|
386
|
-
betAmountMultiplier: number;
|
|
387
391
|
}>;
|
|
388
|
-
export type
|
|
392
|
+
export type BlackjackSplitHandStateBase = Readonly<{
|
|
393
|
+
mainHand: BlackjackHandDto;
|
|
394
|
+
splitHand: BlackjackHandDto;
|
|
395
|
+
dealerHand: BlackjackHandDto;
|
|
396
|
+
}>;
|
|
397
|
+
export type BlackjackPlayingMainHandState = Simplify<BlackjackSplitHandStateBase & BaseInProgressState & {
|
|
398
|
+
phase: "playing-main-hand";
|
|
399
|
+
}>;
|
|
400
|
+
export type BlackjackPlayingSplitHandState = Simplify<BlackjackSplitHandStateBase & BaseInProgressState & {
|
|
401
|
+
phase: "playing-split-hand";
|
|
402
|
+
}>;
|
|
403
|
+
export type BlackjackFinishedState = Simplify<BlackjackSingleHandStateBase & BaseFinishedState & {
|
|
389
404
|
outcome: BlackjackOutcome;
|
|
390
405
|
insuranceOutcome?: InsuranceOutcome;
|
|
391
406
|
}>;
|
|
392
|
-
export type
|
|
407
|
+
export type BlackjackSplitFinishedState = Simplify<BlackjackSplitHandStateBase & BaseFinishedState & {
|
|
408
|
+
mainOutcome: BlackjackOutcome;
|
|
409
|
+
splitOutcome: BlackjackOutcome;
|
|
410
|
+
insuranceOutcome?: InsuranceOutcome;
|
|
411
|
+
}>;
|
|
412
|
+
export type BlackjackState = BlackjackAwaitingInsuranceState | BlackjackPlayerTurnState | BlackjackPlayingMainHandState | BlackjackPlayingSplitHandState | BlackjackFinishedState | BlackjackSplitFinishedState;
|
|
393
413
|
export type BlackjackConfig = Record<string, never>;
|
|
394
414
|
export type BlackjackInternalUninitialisedState = BaseInProgressState & {
|
|
395
415
|
readonly phase: "uninitialised";
|
|
@@ -404,7 +424,23 @@ export type BlackjackInternalInProgressState = BaseInProgressState & {
|
|
|
404
424
|
readonly playerHand: PlayerHand;
|
|
405
425
|
readonly dealerHand: DealerHand;
|
|
406
426
|
readonly insuranceBought: boolean;
|
|
407
|
-
|
|
427
|
+
};
|
|
428
|
+
export type BlackjackInternalPlayingMainHandState = BaseInProgressState & {
|
|
429
|
+
readonly phase: "playing-main-hand";
|
|
430
|
+
readonly mainHand: PlayerHand;
|
|
431
|
+
readonly splitHand: PlayerHand;
|
|
432
|
+
readonly dealerHand: DealerHand;
|
|
433
|
+
readonly insuranceBought: boolean;
|
|
434
|
+
readonly mainHandDoubledDown: boolean;
|
|
435
|
+
};
|
|
436
|
+
export type BlackjackInternalPlayingSplitHandState = BaseInProgressState & {
|
|
437
|
+
readonly phase: "playing-split-hand";
|
|
438
|
+
readonly mainHand: PlayerHand;
|
|
439
|
+
readonly splitHand: PlayerHand;
|
|
440
|
+
readonly dealerHand: DealerHand;
|
|
441
|
+
readonly insuranceBought: boolean;
|
|
442
|
+
readonly mainHandDoubledDown: boolean;
|
|
443
|
+
readonly splitHandDoubledDown: boolean;
|
|
408
444
|
};
|
|
409
445
|
export type BlackjackInternalFinishedState = BaseFinishedState & {
|
|
410
446
|
readonly phase: "finished";
|
|
@@ -413,13 +449,22 @@ export type BlackjackInternalFinishedState = BaseFinishedState & {
|
|
|
413
449
|
readonly outcome: BlackjackOutcome;
|
|
414
450
|
readonly insuranceOutcome?: InsuranceOutcome;
|
|
415
451
|
};
|
|
416
|
-
export type
|
|
452
|
+
export type BlackjackInternalSplitFinishedState = BaseFinishedState & {
|
|
453
|
+
readonly phase: "split-finished";
|
|
454
|
+
readonly mainHand: PlayerHand;
|
|
455
|
+
readonly splitHand: PlayerHand;
|
|
456
|
+
readonly dealerHand: DealerHand;
|
|
457
|
+
readonly mainOutcome: BlackjackOutcome;
|
|
458
|
+
readonly splitOutcome: BlackjackOutcome;
|
|
459
|
+
readonly insuranceOutcome?: InsuranceOutcome;
|
|
460
|
+
};
|
|
461
|
+
export type BlackjackInternalState = BlackjackInternalUninitialisedState | BlackjackInternalAwaitingInsuranceState | BlackjackInternalInProgressState | BlackjackInternalPlayingMainHandState | BlackjackInternalPlayingSplitHandState | BlackjackInternalFinishedState | BlackjackInternalSplitFinishedState;
|
|
417
462
|
export type BlackjackGameContext = GameContext<BlackjackAction, BlackjackState, BlackjackConfig>;
|
|
418
463
|
export declare class Blackjack extends NewGame<BlackjackInternalState, BlackjackState, BlackjackAction, BlackjackConfig> {
|
|
419
464
|
protected generateRandomValues(generator: RandomNumberGenerator): RandomValuePool;
|
|
420
465
|
protected toExternalState(internal: BlackjackInternalState): BlackjackState;
|
|
421
466
|
protected createGameStore(): GameStore<BlackjackInternalState, BlackjackAction, BlackjackConfig>;
|
|
422
|
-
getValidNextActionTypes(state: BlackjackState): readonly
|
|
467
|
+
getValidNextActionTypes(state: BlackjackState): readonly BlackjackActionType[];
|
|
423
468
|
}
|
|
424
469
|
declare class MultiplierContainer<TMultipliers> {
|
|
425
470
|
readonly multipliers: Map<number, TMultipliers>;
|
package/dist/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var Ot;((t)=>t.INPUT_VALIDATION_ERROR="INPUT_VALIDATION_ERROR")(Ot||={});class O extends Error{static createValidationError(r){return new O("INPUT_VALIDATION_ERROR",r)}static isGameError(r){return r instanceof O}errorCode;constructor(r,t){super(t);this.errorCode=r}}var N;((x)=>{x.DICE="DICE";x.MINES="MINES";x.KENO="KENO";x.LIMBO="LIMBO";x.ADVANCED_DICE="ADVANCED_DICE";x.BACCARAT="BACCARAT";x.DIAMONDS="DIAMONDS";x.PLINKO="PLINKO";x.ROULETTE="ROULETTE";x.WHEEL="WHEEL";x.BLACKJACK="BLACKJACK"})(N||={});class S{gameId;constructor(r){this.gameId=r}getGameResult(r){return this.determineGameResult(r)}}import{Big as yr}from"big.js";import rr from"big.js";class h{static withMultiplier(r,t){return new rr(r).times(new rr(100-t).div(100))}static withWinChance(r,t){return rr(100-r).div(t)}}var Er=0,Ar=1e4,Tr=10001,it=0.01,xt=98,Bt=(r)=>{if(r<Er)throw O.createValidationError(`Lower bound ${r} is below minimum allowed value ${Er}`)},St=(r)=>{if(r>Ar)throw O.createValidationError(`Upper bound ${r} is above maximum allowed value ${Ar}`)},H=(r)=>{if(Bt(r.lower),St(r.upper),r.lower>=r.upper)throw O.createValidationError(`Lower bound ${r.lower} must be less than ${r.upper}`)},pt=(r,t)=>{let[o,E]=r.lower<=t.lower?[r,t]:[t,r];if(o.upper>E.lower)throw O.createValidationError("Bounds must not overlap")},Ct=(r,t)=>t>=r.lower&&t<=r.upper,dt=(r)=>r.upper-r.lower+1,tr=(r,t)=>t>r.lower&&t<r.upper,or=(r)=>r.upper-r.lower-1,Zt;((E)=>{E.ROLL_BETWEEN="ROLL_BETWEEN";E.ROLL_OUTSIDE="ROLL_OUTSIDE";E.ROLL_BETWEEN_TWO="ROLL_BETWEEN_TWO"})(Zt||={});var hr=(r)=>{let o=(()=>{switch(r.mode){case"ROLL_BETWEEN":return H(r.bounds),or(r.bounds);case"ROLL_OUTSIDE":return H(r.bounds),Tr-dt(r.bounds);case"ROLL_BETWEEN_TWO":return H(r.firstBounds),H(r.secondBounds),pt(r.firstBounds,r.secondBounds),or(r.firstBounds)+or(r.secondBounds)}})(),E=yr(o).div(Tr).mul(100);if(E.lt(it))throw O.createValidationError("Win chance too low");if(E.gt(xt))throw O.createValidationError("Win chance too high");return E},Lo=(r)=>{hr(r)};class Dt extends S{constructor(){super("ADVANCED_DICE")}determineGameResult({generator:r,edge:t,gameInputs:o}){let E=hr(o),A=r.getRandomInt({min:Er,max:Ar}),f=A.value;return{isFinished:!0,payoutMultiplier:(()=>{switch(o.mode){case"ROLL_BETWEEN":return tr(o.bounds,f);case"ROLL_OUTSIDE":return!Ct(o.bounds,f);case"ROLL_BETWEEN_TWO":return tr(o.firstBounds,f)||tr(o.secondBounds,f)}})()?h.withWinChance(t,E):new yr(0),outputs:{result:A.values},randomValues:A}}}import u from"big.js";var Nt=["Clubs","Diamonds","Hearts","Spades"],_t=["Ace","2","3","4","5","6","7","8","9","10","Jack","Queen","King"],Gt;((E)=>{E.PLAYER_WIN="PLAYER_WIN";E.TIE="TIE";E.BANKER_WIN="BANKER_WIN"})(Gt||={});var Tt;((E)=>{E.PLAYER="PLAYER";E.TIE="TIE";E.BANKER="BANKER"})(Tt||={});var yt={["PLAYER_WIN"]:{betType:"PLAYER",multiplier:2},["TIE"]:{betType:"TIE",multiplier:9},["BANKER_WIN"]:{betType:"BANKER",multiplier:1.95}},ht=(r)=>{return new u(0).add(r.bets.reduce((o,E)=>o.add(E.amount),new u(0)))};class bt extends S{constructor(){super("BACCARAT")}determineGameResult({generator:r,gameInputs:t,edge:o}){if(o!==1)throw new Error("Baccarat is only available at 1% edge.");this.validateGameInputs(t);let E=r.getRandomIntsWithReplacement({min:0,max:51,count:6}),A=E.values,f=A.slice(0,3),c=A.slice(3,6),i=[],B=0;for(let d of f.slice(0,2)){let D=this.mapRandomValueToCard(d),j=this.mapRandomValueToCardValue(d);i.push(D),B=(B+j)%10}let C=[],p=0;for(let d of c.slice(0,2)){let D=this.mapRandomValueToCard(d),j=this.mapRandomValueToCardValue(d);C.push(D),p=(p+j)%10}if(!this.isNaturalWin(B,p)){let d=this.shouldDrawThirdPlayerCard(B),D=null;if(d)D=this.mapRandomValueToCardValue(f[2]),i.push(this.mapRandomValueToCard(f[2])),B=(B+D)%10;if(this.shouldDrawThirdBankerCard(p,D))C.push(this.mapRandomValueToCard(c[2])),p=(p+this.mapRandomValueToCardValue(c[2]))%10}let x;if(B===p)x="TIE";else x=B>p?"PLAYER_WIN":"BANKER_WIN";let _=ht(t),{betType:I,multiplier:ct}=yt[x],Y=new u(0);if(Y=Y.add(t.bets.filter((d)=>d.type===I).reduce((d,D)=>d.add(D.amount.mul(ct)),new u(0))),x==="TIE")Y=Y.add(t.bets.filter((d)=>d.type==="PLAYER"||d.type==="BANKER").reduce((d,D)=>d.add(D.amount),new u(0)));return{isFinished:!0,payoutMultiplier:_.gt(0)?Y.div(_):new u(0),outputs:{playerCards:i,playerHandValue:B,bankerCards:C,bankerHandValue:p,gameOutcome:x,result:E.values},randomValues:E}}validateGameInputs(r){if(r.bets.length===0)throw new Error("Must place at least a single bet.");if(!r.bets.every((t)=>t.amount.gte(0)))throw new Error("Invalid bet.")}mapRandomValueToCard(r){let t=Nt[Math.floor(r/13)],o=_t[r%13];return{suit:t,rank:o}}isNaturalWin(r,t){let o=[8,9];return o.includes(r)||o.includes(t)}mapRandomValueToCardValue(r){let t=r%13;if(t===0)return 1;if(t>=10)return 10;return t+1}shouldDrawThirdPlayerCard(r){return r<=5}shouldDrawThirdBankerCard(r,t){if(t===null)return r<=5;if(r<=2)return!0;if(r===3)return t!==8;if(r===4)return[2,3,4,5,6,7].includes(t);if(r===5)return[4,5,6,7].includes(t);if(r===6)return[6,7].includes(t);return!1}}var fr;((A)=>{A.WIN="WIN";A.LOSE="LOSE";A.PUSH="PUSH";A.PLAYER_BLACKJACK="PLAYER_BLACKJACK"})(fr||={});var cr;((o)=>{o.WON="WON";o.LOST="LOST"})(cr||={});var br;((c)=>{c.START="START";c.HIT="BLACKJACK_HIT";c.STAND="BLACKJACK_STAND";c.BUY_INSURANCE="BLACKJACK_BUY_INSURANCE";c.REJECT_INSURANCE="BLACKJACK_REJECT_INSURANCE";c.DOUBLE_DOWN="BLACKJACK_DOUBLE_DOWN"})(br||={});var ut=2.5,wt=2,Vt=1,Ut=0,ur=17,Or=21,n=21,ir=63,xr=1.5,wr=0.5,Vr=1.5,Ur=1,tE=13,Br=10,Mr=10,ar={PLAYER_BLACKJACK:ut,WIN:wt,PUSH:Vt,LOSE:Ut};import{Guard as J}from"@betorigami/guard";import{createStore as Yt}from"@xstate/store";var Pr=0,Yr=51,W=Array.from({length:52},(r,t)=>t),Fr=["Spades","Hearts","Diamonds","Clubs"],s=["Ace","Two","Three","Four","Five","Six","Seven","Eight","Nine","Ten","Jack","Queen","King"],Rr=["Jack","Queen","King"];import{Guard as Mt}from"@betorigami/guard";import{Guard as Sr}from"@betorigami/guard";class pr{value;constructor(r){let t=W[r];Sr.againstNullOrUndefined(t,`Invalid card value: ${r}`),this.value=t}get suit(){let r=Math.floor(this.value/13),t=Fr[r];return Sr.againstNullOrUndefined(t,`Invalid suit index: ${r}`),t}get rank(){let r=this.value%13,t=s[r];return Sr.againstNullOrUndefined(t,`Invalid rank index: ${r}`),t}toDto(){return{rank:this.rank,suit:this.suit,cardValue:this.value}}}class G extends pr{get numericRank(){if(Rr.includes(this.rank))return Mr;return s.indexOf(this.rank)+1}static fromValue(r){return Mt.against(!W.includes(r),`Invalid card value: ${r}`),new G(r)}}class F{cards;hardHandValue;softHandValue=null;constructor(r){this.cards=r;if(this.hardHandValue=r.reduce((o,E)=>o+E.numericRank,0),r.some((o)=>o.rank==="Ace")&&this.hardHandValue+Br<=Or)this.softHandValue=this.hardHandValue+Br}get cardCount(){return this.cards.length}get hasSoftHandValue(){return this.softHandValue!==null}get isBusted(){return this.hardHandValue>Or}get isBlackjack(){return this.cardCount===2&&this.highestHandValue===n}get highestHandValue(){return this.softHandValue!==null?this.softHandValue:this.hardHandValue}}class R{cards;value;constructor(r){this.cards=r.map((t)=>G.fromValue(t)),this.value=new F(this.cards)}get isBusted(){return this.value.isBusted}get isBlackjack(){return this.value.isBlackjack}get highestHandValue(){return this.value.highestHandValue}get rawValues(){return this.cards.map((r)=>r.value)}toDto(){return{cards:this.cards.map((r)=>r.toDto()),value:this.highestHandValue}}}class $ extends R{otherCards;upCard;holeCard;constructor(r,t,o=[]){super([r,t,...o]);this.otherCards=o;this.upCard=G.fromValue(r),this.holeCard=G.fromValue(t)}static withInitialDeal(r){return new $(r.upCard,r.holeCard)}addDrawnCards(r){return new $(this.upCard.value,this.holeCard.value,[...this.otherCards,...r])}toDto(r=!1){if(r)return super.toDto();return{cards:[this.upCard.toDto()],value:new F([this.upCard]).highestHandValue}}}class z extends R{static withInitialDeal(r){return new z(r)}addDrawnCards(r){return new z([...this.rawValues,...r])}}import{Guard as l}from"@betorigami/guard";class L{source;index=0;constructor(r){this.source=r}static from(r,t){return l.against(t<=0,`Count must be positive, got ${t}`),l.against(r.values.length!==t,`Expected ${t} values, got ${r.values.length}`),new L(r)}get consumedValues(){return this.source.values.slice(0,this.index)}toMultipleRandomValues(){return this.source}takeOne(){let r=this.source.values[this.index];return l.againstUndefined(r,"RandomValuePool exhausted"),this.index+=1,r}take(r){l.against(this.index+r>this.source.values.length,`RandomValuePool exhausted: requested ${r} but only ${this.source.values.length-this.index} remain`);let t=this.source.values.slice(this.index,this.index+r);return this.index+=r,t}}import{Guard as at}from"@betorigami/guard";import Pt from"fast-deep-equal";class Cr{edge;constructor(r){this.edge=r}play(r,t,o=[]){let E=this.createGameStore(),A=this.generateRandomValues(r),f=A.toMultipleRandomValues();for(let B of o)E.send({...B.playerArgument,randomValuePool:A});let c=o[o.length-1];if(c)at.against(!Pt(c.state,this.toExternalState(E.getSnapshot().context.state)),"The final state of the game does not match the expected state based on the previous actions");E.send({...t,randomValuePool:A});let i=E.getSnapshot().context;return{playerArgument:i.playerArgument,state:this.toExternalState(i.state),config:i.config,betAmountMultiplier:i.betAmountMultiplier,proof:{proofHash:f.proofHash,proofString:f.proofString}}}}import y from"big.js";var $r=(r)=>{let t=r.insuranceOutcome!==void 0,o=y(1),E=r.doubledDown?y(Ur):y(0),A=t?y(wr):y(0),f=o.plus(E).plus(A),c=o.plus(E),i=y(ar[r.outcome]).mul(c),B=r.insuranceOutcome==="WON"?y(Vr):y(0);return{payoutMultiplier:i.plus(B).div(f).toNumber(),betAmountMultiplier:f.toNumber()}};var Ft={state:{isFinished:!1,phase:"uninitialised",multiplier:1},config:{},playerArgument:{type:"START"}},b=(r)=>G.fromValue(r).value;function dr(r){J.against(r.phase!=="in-progress","Expected a started, in-progress game state")}function zr(r){J.against(r.phase!=="awaiting-insurance","Expected game to be awaiting insurance decision")}var Rt=(r,t)=>{let o=t;while(o.highestHandValue<ur)o=o.addDrawnCards([b(r.takeOne())]);return o},$t=(r,t)=>{if(r.isBusted)return"LOSE";if(t.isBusted)return"WIN";let o=r.highestHandValue,E=t.highestHandValue;if(o>E)return"WIN";if(o<E)return"LOSE";return"PUSH"},Z=(r)=>{let{payoutMultiplier:t,betAmountMultiplier:o}=$r({outcome:r.outcome,insuranceOutcome:r.insuranceOutcome,doubledDown:r.actionType==="BLACKJACK_DOUBLE_DOWN"});return{state:{isFinished:!0,phase:"finished",playerHand:r.playerHand,dealerHand:r.dealerHand,outcome:r.outcome,multiplier:t,randomValues:r.randomValuePool.consumedValues,insuranceOutcome:r.insuranceOutcome},config:{},playerArgument:{type:r.actionType},betAmountMultiplier:o}},Zr=(r)=>{let t=Rt(r.randomValuePool,r.dealerHand),o=$t(r.playerHand,t);return Z({...r,dealerHand:t,outcome:o})};class zt extends Cr{generateRandomValues(r){return L.from(r.getRandomIntsWithReplacement({min:Pr,max:Yr,count:ir}),ir)}toExternalState(r){let t=r.phase;switch(t){case"awaiting-insurance":return{isFinished:!1,phase:"awaiting-insurance",multiplier:r.multiplier,playerHand:r.playerHand.toDto(),dealerHand:r.dealerHand.toDto(!1)};case"in-progress":return{isFinished:!1,phase:"player-turn",multiplier:r.multiplier,betAmountMultiplier:r.betAmountMultiplier,playerHand:r.playerHand.toDto(),dealerHand:r.dealerHand.toDto(!1)};case"finished":return{isFinished:!0,multiplier:r.multiplier,randomValues:r.randomValues,outcome:r.outcome,playerHand:r.playerHand.toDto(),dealerHand:r.dealerHand.toDto(!0),...r.insuranceOutcome!==void 0&&{insuranceOutcome:r.insuranceOutcome}};case"uninitialised":throw new Error("Cannot convert uninitialised state to external state");default:J.againstNever(t,"Invalid state received")}}createGameStore(){return Yt({context:Ft,on:{START:(r,t)=>{J.against(r.state.phase!=="uninitialised","START action requires a fresh game");let o=b(t.randomValuePool.takeOne()),E=b(t.randomValuePool.takeOne()),A=b(t.randomValuePool.takeOne()),f=b(t.randomValuePool.takeOne()),c=z.withInitialDeal([o,E]),i=$.withInitialDeal({upCard:A,holeCard:f});if(i.upCard.rank==="Ace")return{state:{isFinished:!1,phase:"awaiting-insurance",multiplier:1,playerHand:c,dealerHand:i},config:{},playerArgument:{type:"START"}};if(c.isBlackjack&&i.isBlackjack)return Z({playerHand:c,dealerHand:i,outcome:"PUSH",randomValuePool:t.randomValuePool,actionType:"START"});if(c.isBlackjack)return Z({playerHand:c,dealerHand:i,outcome:"PLAYER_BLACKJACK",randomValuePool:t.randomValuePool,actionType:"START"});if(i.isBlackjack)return Z({playerHand:c,dealerHand:i,outcome:"LOSE",randomValuePool:t.randomValuePool,actionType:"START"});return{state:{isFinished:!1,phase:"in-progress",multiplier:1,playerHand:c,dealerHand:i,insuranceBought:!1,betAmountMultiplier:1},config:{},playerArgument:{type:"START"}}},BLACKJACK_BUY_INSURANCE:(r,t)=>{zr(r.state);let{playerHand:o,dealerHand:E}=r.state,A={randomValuePool:t.randomValuePool,actionType:"BLACKJACK_BUY_INSURANCE",dealerHand:E,playerHand:o};if(o.isBlackjack&&E.isBlackjack)return Z({outcome:"PUSH",insuranceOutcome:"WON",...A});if(o.isBlackjack)return Z({outcome:"PLAYER_BLACKJACK",insuranceOutcome:"LOST",...A});if(E.isBlackjack)return Z({outcome:"LOSE",insuranceOutcome:"WON",...A});return{state:{isFinished:!1,phase:"in-progress",multiplier:1,playerHand:o,dealerHand:E,insuranceBought:!0,betAmountMultiplier:xr},config:{},playerArgument:{type:"BLACKJACK_BUY_INSURANCE"},betAmountMultiplier:xr}},BLACKJACK_REJECT_INSURANCE:(r,t)=>{zr(r.state);let{playerHand:o,dealerHand:E}=r.state,A={playerHand:o,dealerHand:E,randomValuePool:t.randomValuePool,actionType:"BLACKJACK_REJECT_INSURANCE",doubledDown:!1};if(o.isBlackjack&&E.isBlackjack)return Z({outcome:"PUSH",...A});if(o.isBlackjack)return Z({outcome:"PLAYER_BLACKJACK",...A});if(E.isBlackjack)return Z({outcome:"LOSE",...A});return{state:{isFinished:!1,phase:"in-progress",multiplier:1,playerHand:o,dealerHand:E,insuranceBought:!1,betAmountMultiplier:1},config:{},playerArgument:{type:"BLACKJACK_REJECT_INSURANCE"}}},BLACKJACK_HIT:(r,t)=>{dr(r.state);let{insuranceBought:o,betAmountMultiplier:E}=r.state,A=o?"LOST":void 0,f=r.state.playerHand.addDrawnCards([b(t.randomValuePool.takeOne())]);if(f.isBusted)return Z({playerHand:f,dealerHand:r.state.dealerHand,outcome:"LOSE",randomValuePool:t.randomValuePool,actionType:"BLACKJACK_HIT",insuranceOutcome:A});if(f.highestHandValue===n)return Zr({playerHand:f,dealerHand:r.state.dealerHand,randomValuePool:t.randomValuePool,actionType:"BLACKJACK_HIT",insuranceOutcome:A});return{state:{isFinished:!1,phase:"in-progress",multiplier:1,playerHand:f,dealerHand:r.state.dealerHand,insuranceBought:o,betAmountMultiplier:E},config:{},playerArgument:{type:"BLACKJACK_HIT"},betAmountMultiplier:E}},BLACKJACK_STAND:(r,t)=>{dr(r.state);let{insuranceBought:o}=r.state,E=o?"LOST":void 0;return Zr({playerHand:r.state.playerHand,dealerHand:r.state.dealerHand,randomValuePool:t.randomValuePool,actionType:"BLACKJACK_STAND",insuranceOutcome:E})},BLACKJACK_DOUBLE_DOWN:(r,t)=>{dr(r.state),J.against(r.state.playerHand.cards.length!==2,"Double down is only allowed as the first action");let{insuranceBought:o}=r.state,E=o?"LOST":void 0,A=r.state.playerHand.addDrawnCards([b(t.randomValuePool.takeOne())]);if(A.isBusted)return Z({playerHand:A,dealerHand:r.state.dealerHand,outcome:"LOSE",randomValuePool:t.randomValuePool,actionType:"BLACKJACK_DOUBLE_DOWN",insuranceOutcome:E});return Zr({playerHand:A,dealerHand:r.state.dealerHand,randomValuePool:t.randomValuePool,actionType:"BLACKJACK_DOUBLE_DOWN",insuranceOutcome:E})}}})}getValidNextActionTypes(r){if(r.isFinished)return[];if(r.phase==="awaiting-insurance")return["BLACKJACK_BUY_INSURANCE","BLACKJACK_REJECT_INSURANCE"];if(r.playerHand.cards.length===2)return["BLACKJACK_HIT","BLACKJACK_STAND","BLACKJACK_DOUBLE_DOWN"];return["BLACKJACK_HIT","BLACKJACK_STAND"]}}import Jt from"big.js";class T{multipliers;constructor(r){this.multipliers=r}getMultipliers(r){let t=this.multipliers.get(r);if(t===void 0)throw new Error(`Multipliers for ${r} not found`);return t}getAllMultipliers(){return Array.from(this.multipliers.entries()).map(([r,t])=>({edge:r,multipliers:t}))}}var qt;((c)=>{c.PAIR="PAIR";c.TWO_PAIR="TWO_PAIR";c.THREE_OF_A_KIND="THREE_OF_A_KIND";c.FULL_HOUSE="FULL_HOUSE";c.FOUR_OF_A_KIND="FOUR_OF_A_KIND";c.FIVE_OF_A_KIND="FIVE_OF_A_KIND"})(qt||={});var mt={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:4.3,FOUR_OF_A_KIND:5,FIVE_OF_A_KIND:50},Qt={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:4,FOUR_OF_A_KIND:4.8,FIVE_OF_A_KIND:50},Xt={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:3.7,FOUR_OF_A_KIND:4.6,FIVE_OF_A_KIND:50},It={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:3.4,FOUR_OF_A_KIND:4.4,FIVE_OF_A_KIND:50},jt={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:2.8,FULL_HOUSE:3.2,FOUR_OF_A_KIND:3.6,FIVE_OF_A_KIND:50},Ht=new T(new Map([[1,mt],[2,Qt],[3,Xt],[4,It],[8,jt]])),nt={2:"PAIR",3:"THREE_OF_A_KIND",4:"FOUR_OF_A_KIND",5:"FIVE_OF_A_KIND"};class Wt extends S{constructor(){super("DIAMONDS")}determineGameResult({generator:r,edge:t}){let o=r.getRandomIntsWithReplacement({min:0,max:6,count:5}),E=Ht.getMultipliers(t),A=o.values,f=this.calculatePayoutMultiplier(E,A);return{isFinished:!0,payoutMultiplier:Jt(f),outputs:{result:o.values},randomValues:o}}calculatePayoutMultiplier(r,t){let o=new Map;for(let f of t){let c=o.get(f)||0;o.set(f,c+1)}let E=[...o.values()].filter((f)=>f>1),A=this.classifyResult(E);return A===null?0:r[A]}classifyResult(r){if(r.length>2)throw new Error(`Unexpected number of repeats ${r.length}`);let[t,o]=r;if(t===void 0)return null;if(o===void 0){let E=nt[t];if(E===void 0)throw new Error(`Unexpected single diamond repeat count: ${t}`);return E}return t===3||o===3?"FULL_HOUSE":"TWO_PAIR"}}import qr from"big.js";var st;((o)=>{o.ABOVE="ABOVE";o.BELOW="BELOW"})(st||={});var Jr=1e4,lt=(r)=>{let t=r.direction==="ABOVE"?Jr-r.selectedValue:r.selectedValue;return new qr(t).div(Jr).mul(100)},Lt=(r,t)=>r.direction==="ABOVE"?t>r.selectedValue:t<r.selectedValue;class Kt extends S{constructor(){super("DICE")}determineGameResult({generator:r,edge:t,gameInputs:o}){let E=r.getRandomInt({min:0,max:1e4}),A=lt(o);return{isFinished:!0,payoutMultiplier:Lt(o,E.value)?h.withWinChance(t,A):new qr(0),outputs:{result:E.values},randomValues:E}}}import oo from"big.js";import{Guard as K}from"@betorigami/guard";var mr;((A)=>{A.CLASSIC="CLASSIC";A.LOW_RISK="LOW_RISK";A.MEDIUM_RISK="MEDIUM_RISK";A.HIGH_RISK="HIGH_RISK"})(mr||={});var vt=[1,2,3,4,5,6,7,8,9,10],Qr=(r)=>{return vt.includes(r)};var gt={[1]:{CLASSIC:[0,3.96],LOW_RISK:[0.7,1.85],MEDIUM_RISK:[0.4,2.75],HIGH_RISK:[0,3.96]},[2]:{CLASSIC:[0,1.9,4.5],LOW_RISK:[0,2,3.8],MEDIUM_RISK:[0,1.8,5.1],HIGH_RISK:[0,0,17.1]},[3]:{CLASSIC:[0,1,3.1,10.4],LOW_RISK:[0,1.1,1.38,26],MEDIUM_RISK:[0,0,2.8,50],HIGH_RISK:[0,0,0,81.5]},[4]:{CLASSIC:[0,0.8,1.8,5,22.5],LOW_RISK:[0,0,2.2,7.9,90],MEDIUM_RISK:[0,0,1.7,10,100],HIGH_RISK:[0,0,0,10,259]},[5]:{CLASSIC:[0,0.25,1.4,4.1,16.5,36],LOW_RISK:[0,0,1.5,4.2,13,300],MEDIUM_RISK:[0,0,1.4,4,14,390],HIGH_RISK:[0,0,0,4.5,48,450]},[6]:{CLASSIC:[0,0,1,3.68,7,16.5,40],LOW_RISK:[0,0,1.1,2,6.2,100,700],MEDIUM_RISK:[0,0,0,3,9,180,710],HIGH_RISK:[0,0,0,0,11,350,710]},[7]:{CLASSIC:[0,0,0.47,3,4.5,14,31,60],LOW_RISK:[0,0,1.1,1.6,3.5,15,225,700],MEDIUM_RISK:[0,0,0,2,7,30,400,800],HIGH_RISK:[0,0,0,0,7,90,400,800]},[8]:{CLASSIC:[0,0,0,2.2,4,13,22,55,70],LOW_RISK:[0,0,1.1,1.5,2,5.5,39,100,800],MEDIUM_RISK:[0,0,0,2,4,11,67,400,900],HIGH_RISK:[0,0,0,0,5,20,270,600,900]},[9]:{CLASSIC:[0,0,0,1.55,3,8,15,44,60,85],LOW_RISK:[0,0,1.1,1.3,1.7,2.5,7.5,50,250,1000],MEDIUM_RISK:[0,0,0,2,2.5,5,15,100,500,1000],HIGH_RISK:[0,0,0,0,4,11,56,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.4,2.25,4.5,8,17,50,80,100],LOW_RISK:[0,0,1.1,1.2,1.3,1.8,3.5,13,50,250,1000],MEDIUM_RISK:[0,0,0,1.6,2,4,7,26,100,500,1000],HIGH_RISK:[0,0,0,0,3.5,8,13,63,500,800,1000]}},et={[1]:{CLASSIC:[0,3.92],LOW_RISK:[0.7,1.82],MEDIUM_RISK:[0.4,2.72],HIGH_RISK:[0,3.92]},[2]:{CLASSIC:[0,1.9,4.32],LOW_RISK:[0,2,3.65],MEDIUM_RISK:[0,1.8,5],HIGH_RISK:[0,0,17]},[3]:{CLASSIC:[0,1,3,10.7],LOW_RISK:[0,1.1,1.3,26.2],MEDIUM_RISK:[0,0,2.7,50.3],HIGH_RISK:[0,0,0,80.7]},[4]:{CLASSIC:[0,0.8,1.8,4.75,22.5],LOW_RISK:[0,0,2.2,7.65,90],MEDIUM_RISK:[0,0,1.7,9.8,100],HIGH_RISK:[0,0,0,9.75,259]},[5]:{CLASSIC:[0,0.2,1.4,4.25,16.4,36],LOW_RISK:[0,0,1.5,4.1,12.9,300],MEDIUM_RISK:[0,0,1.4,3.9,13.9,390],HIGH_RISK:[0,0,0,4.5,47,450]},[6]:{CLASSIC:[0,0,1,3.6,7,17,40],LOW_RISK:[0,0,1.1,2,5.8,100,700],MEDIUM_RISK:[0,0,0,3,8.6,180,710],HIGH_RISK:[0,0,0,0,10.6,350,710]},[7]:{CLASSIC:[0,0,0.5,3,4.1,13.7,31,60],LOW_RISK:[0,0,1.1,1.6,3.5,13.5,225,700],MEDIUM_RISK:[0,0,0,2,6.9,29.2,400,800],HIGH_RISK:[0,0,0,0,6.9,89.1,400,800]},[8]:{CLASSIC:[0,0,0,2.2,4,12.2,22,55,70],LOW_RISK:[0,0,1.1,1.5,2,4.8,38,100,800],MEDIUM_RISK:[0,0,0,2,4,10.4,66,400,900],HIGH_RISK:[0,0,0,0,4.9,19.8,270,600,900]},[9]:{CLASSIC:[0,0,0,1.5,3,8.1,15,45,60,85],LOW_RISK:[0,0,1.1,1.3,1.7,2.1,7.4,50,250,1000],MEDIUM_RISK:[0,0,0,2,2.5,4.6,15.2,100,500,1000],HIGH_RISK:[0,0,0,0,4,10.7,55.4,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.4,2.2,4.5,7.6,16,50,80,100],LOW_RISK:[0,0,1.1,1.2,1.3,1.6,3.7,13,50,250,1000],MEDIUM_RISK:[0,0,0,1.6,2,3.8,6.8,26,100,500,1000],HIGH_RISK:[0,0,0,0,3.5,7.8,12.8,63,500,800,1000]}},kt={[1]:{CLASSIC:[0,3.88],LOW_RISK:[0.7,1.78],MEDIUM_RISK:[0.4,2.68],HIGH_RISK:[0,3.88]},[2]:{CLASSIC:[0,1.85,4.48],LOW_RISK:[0,2,3.48],MEDIUM_RISK:[0,1.8,4.8],HIGH_RISK:[0,0,16.8]},[3]:{CLASSIC:[0,1,3,9.9],LOW_RISK:[0,1.1,1.2,26.5],MEDIUM_RISK:[0,0,2.65,50],HIGH_RISK:[0,0,0,79.9]},[4]:{CLASSIC:[0,0.8,1.7,5,23],LOW_RISK:[0,0,2.1,7.95,90],MEDIUM_RISK:[0,0,1.7,9.55,100],HIGH_RISK:[0,0,0,9.5,259]},[5]:{CLASSIC:[0,0.2,1.4,4.1,16.6,36],LOW_RISK:[0,0,1.5,4,12.7,300],MEDIUM_RISK:[0,0,1.4,3.8,13.7,390],HIGH_RISK:[0,0,0,4.4,46.9,450]},[6]:{CLASSIC:[0,0,1,3.6,6.6,16.5,40],LOW_RISK:[0,0,1.1,1.9,5.9,100,700],MEDIUM_RISK:[0,0,0,2.9,8.7,180,710],HIGH_RISK:[0,0,0,0,10.8,342,710]},[7]:{CLASSIC:[0,0,0.5,2.9,4.3,13.5,30.4,60],LOW_RISK:[0,0,1.1,1.6,3.1,14.8,225,700],MEDIUM_RISK:[0,0,0,2,6.7,29,400,800],HIGH_RISK:[0,0,0,0,6.8,88.2,400,800]},[8]:{CLASSIC:[0,0,0,2.2,3.8,12.7,21,54,70],LOW_RISK:[0,0,1.1,1.5,1.8,5.2,38,100,800],MEDIUM_RISK:[0,0,0,2,3.8,10.8,66,400,900],HIGH_RISK:[0,0,0,0,4.9,19.5,265,600,900]},[9]:{CLASSIC:[0,0,0,1.5,2.9,8.2,15,43,60,85],LOW_RISK:[0,0,1.1,1.3,1.6,2.1,7.7,49,250,1000],MEDIUM_RISK:[0,0,0,2,2.4,4.7,15,98,500,1000],HIGH_RISK:[0,0,0,0,3.9,10.8,55,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.4,2.2,4.2,8,16.7,50,80,100],LOW_RISK:[0,0,1.1,1.2,1.3,1.5,2.9,12,50,250,1000],MEDIUM_RISK:[0,0,0,1.6,2,3.6,6.6,26,100,500,1000],HIGH_RISK:[0,0,0,0,3.4,7.9,12.9,62,500,800,1000]}},ro={[1]:{CLASSIC:[0,3.88],LOW_RISK:[0.68,1.84],MEDIUM_RISK:[0.38,2.74],HIGH_RISK:[0,3.88]},[2]:{CLASSIC:[0,1.85,4.48],LOW_RISK:[0,1.96,3.75],MEDIUM_RISK:[0,1.77,5],HIGH_RISK:[0,0,16.82]},[3]:{CLASSIC:[0,1,3.05,9.35],LOW_RISK:[0,1.07,1.37,25.7],MEDIUM_RISK:[0,0,2.74,49],HIGH_RISK:[0,0,0,79.9]},[4]:{CLASSIC:[0,0.8,1.72,4.95,22.3],LOW_RISK:[0,0,2.15,7.86,87],MEDIUM_RISK:[0,0,1.67,9.7,100],HIGH_RISK:[0,0,0,9.7,256]},[5]:{CLASSIC:[0,0.24,1.38,4,16.3,35.5],LOW_RISK:[0,0,1.48,4.1,12.43,300],MEDIUM_RISK:[0,0,1.35,3.96,13.8,389],HIGH_RISK:[0,0,0,4.4,47,444]},[6]:{CLASSIC:[0,0,1,3.57,6.8,16.2,37],LOW_RISK:[0,0,1.06,1.96,6.16,99,700],MEDIUM_RISK:[0,0,0,2.9,8.9,178,709],HIGH_RISK:[0,0,0,0,10.4,347,709]},[7]:{CLASSIC:[0,0,0.45,2.95,4.44,13.85,30,60],LOW_RISK:[0,0,1.07,1.57,3.47,14.57,225,700],MEDIUM_RISK:[0,0,0,1.95,6.8,29.8,400,800],HIGH_RISK:[0,0,0,0,6.8,88.2,400,800]},[8]:{CLASSIC:[0,0,0,2.15,3.9,12.9,21.9,55,70],LOW_RISK:[0,0,1.08,1.45,1.98,5.48,38.8,100,800],MEDIUM_RISK:[0,0,0,1.95,3.96,10.6,66.9,396,896],HIGH_RISK:[0,0,0,0,4.9,19.2,269,599,896]},[9]:{CLASSIC:[0,0,0,1.5,2.95,7.96,14.96,44,60,85],LOW_RISK:[0,0,1.05,1.29,1.69,2.49,7.49,49,250,1000],MEDIUM_RISK:[0,0,0,1.95,2.47,4.9,14.9,99,500,1000],HIGH_RISK:[0,0,0,0,3.96,10.5,55,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.37,2.2,4.45,7.7,16.7,50,80,100],LOW_RISK:[0,0,1.08,1.18,1.28,1.76,3.4,12.9,50,250,1000],MEDIUM_RISK:[0,0,0,1.57,1.95,3.96,6.9,25.5,100,500,1000],HIGH_RISK:[0,0,0,0,3.43,7.9,12.5,60,500,800,1000]}},to={[1]:{CLASSIC:[0,3.68],LOW_RISK:[0.7,1.58],MEDIUM_RISK:[0.4,2.48],HIGH_RISK:[0,3.68]},[2]:{CLASSIC:[0,1.72,4.48],LOW_RISK:[0,1.9,3.28],MEDIUM_RISK:[0,1.7,4.62],HIGH_RISK:[0,0,15.95]},[3]:{CLASSIC:[0,0.9,2.95,9.9],LOW_RISK:[0,1,1.2,26],MEDIUM_RISK:[0,0,2.29,50],HIGH_RISK:[0,0,0,75.7]},[4]:{CLASSIC:[0,0.8,1.6,4.4,21],LOW_RISK:[0,0,2,7.5,86],MEDIUM_RISK:[0,0,1.5,9.5,98],HIGH_RISK:[0,0,0,9,246]},[5]:{CLASSIC:[0,0.2,1.2,4.2,16.3,37],LOW_RISK:[0,0,1.4,3.8,12,300],MEDIUM_RISK:[0,0,1.3,3.5,14,385],HIGH_RISK:[0,0,0,4,45,450]},[6]:{CLASSIC:[0,0,1,3.3,6.2,15,40],LOW_RISK:[0,0,1.1,1.7,4.9,99,700],MEDIUM_RISK:[0,0,0,2.6,8.5,177,705],HIGH_RISK:[0,0,0,0,10,327,710]},[7]:{CLASSIC:[0,0,0.4,2.8,4.2,14.5,30,60],LOW_RISK:[0,0,1.1,1.4,3,14,210,700],MEDIUM_RISK:[0,0,0,1.8,6.4,29,400,800],HIGH_RISK:[0,0,0,0,6.1,85,400,800]},[8]:{CLASSIC:[0,0,0,2,3.7,13,20,50,70],LOW_RISK:[0,0,1.1,1.4,1.6,4.6,35,90,800],MEDIUM_RISK:[0,0,0,1.9,3.5,10.5,65,400,900],HIGH_RISK:[0,0,0,0,4.5,18,265,600,900]},[9]:{CLASSIC:[0,0,0,1.4,2.6,9,11.5,40,60,85],LOW_RISK:[0,0,1,1.3,1.5,2,7,45,250,1000],MEDIUM_RISK:[0,0,0,2,2.1,4,15,98,500,1000],HIGH_RISK:[0,0,0,0,3.5,10.5,55,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.3,2,4.4,8,16.7,50,80,100],LOW_RISK:[0,0,1,1.2,1.25,1.4,2,10,50,250,1000],MEDIUM_RISK:[0,0,0,1.5,1.9,3.5,6.2,26,100,500,1000],HIGH_RISK:[0,0,0,0,3,8,14,57,500,800,1000]}},Xr=new T(new Map([[1,gt],[2,et],[3,kt],[4,ro],[8,to]]));class Eo extends S{constructor(){super("KENO")}determineGameResult({generator:r,edge:t,gameInputs:o}){K.againstEmptyArray(o.selectedNumbers,()=>O.createValidationError("No numbers selected")),K.against(o.selectedNumbers.length>10,()=>O.createValidationError("Maximum of 10 numbers can be selected"));for(let x of o.selectedNumbers)K.againstNonInteger(x,()=>O.createValidationError("Only integers can be selected")),K.against(x<0||x>39,()=>O.createValidationError("Invalid number selected"));let E=r.getUniqueRandomInts({min:0,max:39,count:10}),A=o.selectedNumbers.filter((x)=>E.values.includes(x)),f=o.selectedNumbers.length;if(!Qr(f))throw new Error(`Invalid tile count: ${f}`);let C=Xr.getMultipliers(t)[f][o.riskLevel][A.length];if(C===void 0)throw new Error(`No multiplier found for matching tile count ${A.length}`);return{isFinished:!0,payoutMultiplier:new oo(C),outputs:{result:E.values},randomValues:E}}}import w from"big.js";var Ir=(r,t)=>{return r.gt(t)?r:t};var jr=(r,t)=>{return r.lt(t)?r:t};class Ao extends S{constructor(){super("LIMBO")}determineGameResult({generator:r,edge:t,gameInputs:o}){let E=r.getRandomInt({min:1,max:4294967295}),A=E.max,f=new w(16777216),c=new w(1),i=new w(1e6),B=E.value,C=new w(B-1).div(A),p=(100-t)/100,x=f.div(C.mul(f).plus(1)).mul(p),_=Ir(c,jr(x,i));return{isFinished:!0,payoutMultiplier:_.gte(o.targetMultiplier)?new w(o.targetMultiplier):new w(0),outputs:{randomMultiplier:_,result:E.values},randomValues:E}}}import v from"big.js";var Dr=(r,t)=>{if(t<0||r<0||t>r)throw new Error("Invalid input: ensure 0 ≤ r ≤ n and n ≥ 0.");if(t>r-t)t=r-t;let o=1;for(let E=1;E<=t;E++)o=o*(r-E+1)/E;return o};class fo extends S{constructor(){super("MINES")}determineGameResult({generator:r,edge:t,gameInputs:o}){if(o.minesCount<=0||o.minesCount>24)throw new Error("Must select between 1 and 24 mines.");if(o.selectedTiles.length>25-o.minesCount)throw new Error("Cannot select more tiles than available safe tiles (total tiles minus mines).");let c=r.getUniqueRandomInts({min:1,max:25,count:o.minesCount}),i=c.values.some((I)=>o.selectedTiles.includes(I)),B=o.hasCashedOut||i,C=(100-t)/100,p=new v(Dr(25-o.minesCount,o.selectedTiles.length)).div(new v(Dr(25,o.selectedTiles.length))),_=o.hasCashedOut&&!i?new v(C).div(p):new v(0);return{isFinished:B,payoutMultiplier:_,outputs:{result:c.values},randomValues:c}}}import{Big as So}from"big.js";var Hr;((E)=>{E.LOW_RISK="LOW_RISK";E.MEDIUM_RISK="MEDIUM_RISK";E.HIGH_RISK="HIGH_RISK"})(Hr||={});var RA=[8,9,10,11,12,13,14,15,16],co={LOW_RISK:{8:[6,2.1,1.1,1,0.5,1,1.1,2.1,6],9:[6,2,1.6,1,0.7,0.7,1,1.6,2,6],10:[9,3,1.4,1.1,1,0.5,1,1.1,1.4,3,9],11:[8,3,1.9,1.3,1,0.7,0.7,1,1.3,1.9,3,8],12:[10,3,1.6,1.4,1.1,1,0.5,1,1.1,1.4,1.6,3,10],13:[8,4,3,1.9,1.2,0.9,0.7,0.7,0.9,1.2,1.9,3,4,8],14:[7,4,1.9,1.4,1.3,1.1,1,0.5,1,1.1,1.3,1.4,1.9,4,7],15:[15,8,3,2,1.5,1.1,1,0.7,0.7,1,1.1,1.5,2,3,8,15],16:[16,9,2,1.4,1.4,1.2,1.1,1,0.5,1,1.1,1.2,1.4,1.4,2,9,16]},MEDIUM_RISK:{8:[13,3,1.3,0.7,0.4,0.7,1.3,3,13],9:[18,4,1.7,0.9,0.5,0.5,0.9,1.7,4,18],10:[22,5,2,1.4,0.6,0.4,0.6,1.4,2,5,22],11:[24,6,3,1.8,0.7,0.5,0.5,0.7,1.8,3,6,24],12:[33,11,4,2,1.1,0.6,0.3,0.6,1.1,2,4,11,33],13:[43,13,6,3,1.3,0.7,0.4,0.4,0.7,1.3,3,6,13,43],14:[58,15,7,4,1.9,1,0.5,0.2,0.5,1,1.9,4,7,15,58],15:[88,18,11,5,3,1.3,0.5,0.3,0.3,0.5,1.3,3,5,11,18,88],16:[110,41.1,10,5,3,1.5,1,0.5,0.3,0.5,1,1.5,3,5,10,41.1,110]},HIGH_RISK:{8:[29,4,1.5,0.3,0.2,0.3,1.5,4,29],9:[43,7,2,0.6,0.2,0.2,0.6,2,7,43],10:[76,10,3,0.9,0.3,0.2,0.3,0.9,3,10,76],11:[120,13.9,5.2,1.4,0.4,0.2,0.2,0.4,1.4,5.2,13.9,120],12:[170,23.8,8.1,2,0.7,0.2,0.2,0.2,0.7,2,8.1,23.8,170],13:[260,36.7,11,4,1,0.2,0.2,0.2,0.2,1,4,11,36.7,260],14:[420,56.1,18,5,1.9,0.3,0.2,0.2,0.2,0.3,1.9,5,18,56.1,420],15:[620,82.8,27,8,3,0.5,0.2,0.2,0.2,0.2,0.5,3,8,27,82.8,620],16:[1000,129.9,26.1,9,4,2,0.2,0.2,0.2,0.2,0.2,2,4,9,26.1,129.9,1000]}},Oo={LOW_RISK:{8:[6,1.9,1.1,1,0.5,1,1.1,1.9,6],9:[6,1.7,1.6,1,0.7,0.7,1,1.6,1.7,6],10:[9,2.5,1.4,1.1,1,0.5,1,1.1,1.4,2.5,9],11:[9,2.5,1.8,1.3,1,0.7,0.7,1,1.3,1.8,2.5,9],12:[10,3.2,1.6,1.3,1.1,1,0.5,1,1.1,1.3,1.6,3.2,10],13:[8,3.7,2.9,1.8,1.2,0.9,0.7,0.7,0.9,1.2,1.8,2.9,3.7,8],14:[7,4,1.8,1.2,1.3,1.1,1,0.5,1,1.1,1.3,1.2,1.8,4,7],15:[15,7.6,2.8,2,1.4,1.1,1,0.7,0.7,1,1.1,1.4,2,2.8,7.6,15],16:[16,9,1.7,1.2,1.3,1.2,1.1,1,0.5,1,1.1,1.2,1.3,1.2,1.7,9,16]},MEDIUM_RISK:{8:[13,3.2,1.4,0.6,0.4,0.6,1.4,3.2,13],9:[18,3.7,1.7,0.9,0.5,0.5,0.9,1.7,3.7,18],10:[22,5,1.9,1.4,0.6,0.4,0.6,1.4,1.9,5,22],11:[24,6,2.8,1.8,0.7,0.5,0.5,0.7,1.8,2.8,6,24],12:[33,11.1,4,1.9,1.1,0.6,0.3,0.6,1.1,1.9,4,11.1,33],13:[43,13.7,6.1,2.8,1.3,0.7,0.4,0.4,0.7,1.3,2.8,6.1,13.7,43],14:[58,13.7,6.7,3.9,1.9,1,0.5,0.2,0.5,1,1.9,3.9,6.7,13.7,58],15:[88,17.7,10.8,5,2.9,1.3,0.5,0.3,0.3,0.5,1.3,2.9,5,10.8,17.7,88],16:[110,40.5,9.8,4.8,2.9,1.5,1,0.5,0.3,0.5,1,1.5,2.9,4.8,9.8,40.5,110]},HIGH_RISK:{8:[29,3.8,1.5,0.3,0.2,0.3,1.5,3.8,29],9:[43,7.1,1.9,0.6,0.2,0.2,0.6,1.9,7.1,43],10:[76,9.9,2.9,0.9,0.3,0.2,0.3,0.9,2.9,9.9,76],11:[120,13.4,5.1,1.4,0.4,0.2,0.2,0.4,1.4,5.1,13.4,120],12:[170,23.2,7.9,2,0.7,0.2,0.2,0.2,0.7,2,7.9,23.2,170],13:[260,36.6,10.5,4,1,0.2,0.2,0.2,0.2,1,4,10.5,36.6,260],14:[420,55.5,17.6,4.9,1.9,0.3,0.2,0.2,0.2,0.3,1.9,4.9,17.6,55.5,420],15:[620,82.3,26.8,7.7,3,0.5,0.2,0.2,0.2,0.2,0.5,3,7.7,26.8,82.3,620],16:[1000,129.8,25.2,8.6,4,2,0.2,0.2,0.2,0.2,0.2,2,4,8.6,25.2,129.8,1000]}},io={LOW_RISK:{8:[6,2.2,1.1,1,0.4,1,1.1,2.2,6],9:[6,1.8,1.5,1,0.7,0.7,1,1.5,1.8,6],10:[9,2.4,1.3,1.1,1,0.5,1,1.1,1.3,2.4,9],11:[8,2.7,1.9,1.2,1,0.7,0.7,1,1.2,1.9,2.7,8],12:[10,3.3,1.6,1.2,1.1,1,0.5,1,1.1,1.2,1.6,3.3,10],13:[8,3.8,2.9,1.9,1.1,0.9,0.7,0.7,0.9,1.1,1.9,2.9,3.8,8],14:[7,3.9,2,1.4,1.3,1.1,1,0.4,1,1.1,1.3,1.4,2,3.9,7],15:[15,7.9,2.5,2,1.3,1.1,1,0.7,0.7,1,1.1,1.3,2,2.5,7.9,15],16:[16,8.9,1.9,1.4,1.4,1.2,1.1,1,0.4,1,1.1,1.2,1.4,1.4,1.9,8.9,16]},MEDIUM_RISK:{8:[13,3.5,1.2,0.7,0.3,0.7,1.2,3.5,13],9:[18,3.8,1.6,0.9,0.5,0.5,0.9,1.6,3.8,18],10:[22,5.2,2,1.3,0.6,0.4,0.6,1.3,2,5.2,22],11:[24,5.6,2.7,1.8,0.7,0.5,0.5,0.7,1.8,2.7,5.6,24],12:[33,11.3,4,1.8,1.1,0.6,0.3,0.6,1.1,1.8,4,11.3,33],13:[43,12.9,5.7,2.8,1.3,0.7,0.4,0.4,0.7,1.3,2.8,5.7,12.9,43],14:[58,13.7,6.9,3.9,1.8,1,0.5,0.2,0.5,1,1.8,3.9,6.9,13.7,58],15:[88,18,10.9,4.9,2.8,1.3,0.5,0.3,0.3,0.5,1.3,2.8,4.9,10.9,18,88],16:[110,39.9,9.9,5,2.9,1.4,1,0.5,0.3,0.5,1,1.4,2.9,5,9.9,39.9,110]},HIGH_RISK:{8:[29,4,1.4,0.3,0.2,0.3,1.4,4,29],9:[43,7.3,2,0.5,0.2,0.2,0.5,2,7.3,43],10:[76,9.8,2.8,0.9,0.3,0.2,0.3,0.9,2.8,9.8,76],11:[120,13.5,4.9,1.4,0.4,0.2,0.2,0.4,1.4,4.9,13.5,120],12:[170,23.3,7.9,1.9,0.7,0.2,0.2,0.2,0.7,1.9,7.9,23.3,170],13:[260,36.2,10.4,3.9,1,0.2,0.2,0.2,0.2,1,3.9,10.4,36.2,260],14:[420,54.8,17.9,4.9,1.8,0.3,0.2,0.2,0.2,0.3,1.8,4.9,17.9,54.8,420],15:[620,81.9,26.6,7.7,2.9,0.5,0.2,0.2,0.2,0.2,0.5,2.9,7.7,26.6,81.9,620],16:[1000,130,24.9,8.4,3.9,2,0.2,0.2,0.2,0.2,0.2,2,3.9,8.4,24.9,130,1000]}},xo={LOW_RISK:{8:[6,2,1.1,1,0.4,1,1.1,2,6],9:[6,1.9,1.4,1,0.7,0.7,1,1.4,1.9,6],10:[9,2.8,1.1,1.1,1,0.5,1,1.1,1.1,2.8,9],11:[8,2.7,1.7,1.2,1,0.7,0.7,1,1.2,1.7,2.7,8],12:[10,2.7,1.4,1.2,1.1,1,0.5,1,1.1,1.2,1.4,2.7,10],13:[8,3.5,2.8,1.9,1.3,0.9,0.6,0.6,0.9,1.3,1.9,2.8,3.5,8],14:[7,3.3,1.6,1.3,1.3,1.1,1,0.4,1,1.1,1.3,1.3,1.6,3.3,7],15:[15,8,2.9,2,1.4,1.2,1,0.6,0.6,1,1.2,1.4,2,2.9,8,15],16:[16,9.1,2.2,1.4,1.2,1.2,1.1,1,0.4,1,1.1,1.2,1.2,1.4,2.2,9.1,16]},MEDIUM_RISK:{8:[13,2.9,1.2,0.7,0.4,0.7,1.2,2.9,13],9:[18,3.5,1.6,0.9,0.5,0.5,0.9,1.6,3.5,18],10:[22,4.7,2,1.3,0.6,0.4,0.6,1.3,2,4.7,22],11:[24,5.7,2.5,1.8,0.7,0.5,0.5,0.7,1.8,2.5,5.7,24],12:[33,10.7,3.8,1.8,1.1,0.6,0.3,0.6,1.1,1.8,3.8,10.7,33],13:[43,12.6,5.6,2.7,1.3,0.7,0.4,0.4,0.7,1.3,2.7,5.6,12.6,43],14:[58,13.7,6.4,3.8,1.8,1,0.5,0.2,0.5,1,1.8,3.8,6.4,13.7,58],15:[88,17.7,10.7,4.9,2.7,1.3,0.5,0.3,0.3,0.5,1.3,2.7,4.9,10.7,17.7,88],16:[110,39.7,9.6,4.8,2.8,1.4,1,0.5,0.3,0.5,1,1.4,2.8,4.8,9.6,39.7,110]},HIGH_RISK:{8:[29,3.9,1.4,0.3,0.2,0.3,1.4,3.9,29],9:[43,6.9,1.8,0.6,0.2,0.2,0.6,1.8,6.9,43],10:[76,9.8,2.7,0.9,0.3,0.2,0.3,0.9,2.7,9.8,76],11:[120,13.1,5.1,1.3,0.4,0.2,0.2,0.4,1.3,5.1,13.1,120],12:[170,22.7,7.7,1.9,0.7,0.2,0.2,0.2,0.7,1.9,7.7,22.7,170],13:[260,35.9,10.3,3.8,1,0.2,0.2,0.2,0.2,1,3.8,10.3,35.9,260],14:[420,54.2,17.5,4.8,1.8,0.3,0.2,0.2,0.2,0.3,1.8,4.8,17.5,54.2,420],15:[620,80.6,26.1,7.8,2.8,0.5,0.2,0.2,0.2,0.2,0.5,2.8,7.8,26.1,80.6,620],16:[1000,129.7,24.7,8.2,3.8,2,0.2,0.2,0.2,0.2,0.2,2,3.8,8.2,24.7,129.7,1000]}},Bo={LOW_RISK:{8:[5,1.8,1,1,0.4,1,1,1.8,5],9:[5,1.7,1.2,1,0.7,0.7,1,1.2,1.7,5],10:[9,2.8,1.2,1,1,0.4,1,1,1.2,2.8,9],11:[8,2.5,1.6,1,1,0.7,0.7,1,1,1.6,2.5,8],12:[10,2.5,1.3,1.3,1,1,0.4,1,1,1.3,1.3,2.5,10],13:[8,4.1,2.8,1.8,1.1,0.9,0.6,0.6,0.9,1.1,1.8,2.8,4.1,8],14:[7,3.3,1.7,1.2,1.2,1,1,0.4,1,1,1.2,1.2,1.7,3.3,7],15:[15,7.3,2.9,1.9,1.4,1,1,0.6,0.6,1,1,1.4,1.9,2.9,7.3,15],16:[16,8.7,2,1.5,1.3,1,1.1,1,0.3,1,1.1,1,1.3,1.5,2,8.7,16]},MEDIUM_RISK:{8:[13,2.6,1.1,0.7,0.4,0.7,1.1,2.6,13],9:[17,3.3,1.4,0.9,0.5,0.5,0.9,1.4,3.3,17],10:[21,4.1,1.7,1.3,0.6,0.4,0.6,1.3,1.7,4.1,21],11:[23,5.6,2.4,1.6,0.7,0.5,0.5,0.7,1.6,2.4,5.6,23],12:[32,10.2,3.7,1.7,1.1,0.6,0.2,0.6,1.1,1.7,3.7,10.2,32],13:[42,11.7,5.3,2.5,1.2,0.7,0.4,0.4,0.7,1.2,2.5,5.3,11.7,42],14:[56,13.2,5.9,3.6,1.6,1,0.5,0.2,0.5,1,1.6,3.6,5.9,13.2,56],15:[86,17.3,10,4.6,2.6,1.2,0.5,0.3,0.3,0.5,1.2,2.6,4.6,10,17.3,86],16:[107,39,9.9,4.5,2.4,1.3,1,0.5,0.3,0.5,1,1.3,2.4,4.5,9.9,39,107]},HIGH_RISK:{8:[28,3.3,1.4,0.3,0.2,0.3,1.4,3.3,28],9:[42,6.7,1.6,0.6,0.2,0.2,0.6,1.6,6.7,42],10:[74,9.6,2.6,0.9,0.3,0.1,0.3,0.9,2.6,9.6,74],11:[116,12.7,4.8,1.2,0.4,0.2,0.2,0.4,1.2,4.8,12.7,116],12:[165,20.9,7.2,1.8,0.7,0.2,0.2,0.2,0.7,1.8,7.2,20.9,165],13:[252,33.9,10.1,3.4,1,0.2,0.2,0.2,0.2,1,3.4,10.1,33.9,252],14:[407,51.9,16.3,4.6,1.7,0.3,0.2,0.2,0.2,0.3,1.7,4.6,16.3,51.9,407],15:[600,76.9,24.9,7.4,2.6,0.5,0.2,0.2,0.2,0.2,0.5,2.6,7.4,24.9,76.9,600],16:[1000,122,24.5,8,3.7,1.8,0.2,0.2,0.2,0.2,0.2,1.8,3.7,8,24.5,122,1000]}},nr=new T(new Map([[1,co],[2,Oo],[3,io],[4,xo],[8,Bo]]));class po extends S{constructor(){super("PLINKO")}determineGameResult({generator:r,gameInputs:t,edge:o}){if(t.numberOfRows%1>0)throw new Error("Number of rows must be an integer");if(t.numberOfRows<8||t.numberOfRows>16)throw new Error("Number of rows must be between 8 and 16");let E=t.numberOfRows,c=nr.getMultipliers(o)[t.riskLevel][E],i=r.getRandomIntsWithReplacement({min:0,max:1,count:t.numberOfRows}),C=i.values.reduce((x,_)=>x+_,0),p=c[C];if(p===void 0)throw new Error(`No payout found for end position ${C}`);return{isFinished:!0,payoutMultiplier:So(p),outputs:{result:i.values},randomValues:i}}}import{Big as k}from"big.js";var Nr=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36],Wr=[37,...Nr],sr=[[0,1],[0,2],[0,3],[1,2],[1,4],[2,3],[2,5],[3,6],[4,5],[4,7],[5,6],[5,8],[6,9],[7,8],[7,10],[8,9],[8,11],[9,12],[10,11],[10,13],[11,12],[11,14],[12,15],[13,14],[13,16],[14,15],[14,17],[15,18],[16,17],[16,19],[17,18],[17,20],[18,21],[19,20],[19,22],[20,21],[20,23],[21,24],[22,23],[22,25],[23,24],[23,26],[24,27],[25,26],[25,28],[26,27],[26,29],[27,30],[28,29],[28,31],[29,30],[29,32],[30,33],[31,32],[31,34],[32,33],[32,35],[33,36],[34,35],[35,36]],lr=[[0,1],[0,37],[3,37],[1,2],[1,4],[2,3],[2,5],[3,6],[4,5],[4,7],[5,6],[5,8],[6,9],[7,8],[7,10],[8,9],[8,11],[9,12],[10,11],[10,13],[11,12],[11,14],[12,15],[13,14],[13,16],[14,15],[14,17],[15,18],[16,17],[16,19],[17,18],[17,20],[18,21],[19,20],[19,22],[20,21],[20,23],[21,24],[22,23],[22,25],[23,24],[23,26],[24,27],[25,26],[25,28],[26,27],[26,29],[27,30],[28,29],[28,31],[29,30],[29,32],[30,33],[31,32],[31,34],[32,33],[32,35],[33,36],[34,35],[35,36]],Lr=[[0,1,2],[0,2,3],[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18],[19,20,21],[22,23,24],[25,26,27],[28,29,30],[31,32,33],[34,35,36]],Kr=[[0,1,2],[0,2,37],[1,2,3],[2,3,37],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18],[19,20,21],[22,23,24],[25,26,27],[28,29,30],[31,32,33],[34,35,36]],vr=[[0,1,2,3],[1,2,4,5],[2,3,5,6],[4,5,7,8],[5,6,8,9],[7,8,10,11],[8,9,11,12],[10,11,13,14],[11,12,14,15],[13,14,16,17],[14,15,17,18],[16,17,19,20],[17,18,20,21],[19,20,22,23],[20,21,23,24],[22,23,25,26],[23,24,26,27],[25,26,28,29],[26,27,29,30],[28,29,31,32],[29,30,32,33],[31,32,34,35],[32,33,35,36]],gr=[[1,2,4,5],[2,3,5,6],[4,5,7,8],[5,6,8,9],[7,8,10,11],[8,9,11,12],[10,11,13,14],[11,12,14,15],[13,14,16,17],[14,15,17,18],[16,17,19,20],[17,18,20,21],[19,20,22,23],[20,21,23,24],[22,23,25,26],[23,24,26,27],[25,26,28,29],[26,27,29,30],[28,29,31,32],[29,30,32,33],[31,32,34,35],[32,33,35,36]],er=[0,1,2,3,37],kr=[[1,2,3,4,5,6],[4,5,6,7,8,9],[7,8,9,10,11,12],[10,11,12,13,14,15],[13,14,15,16,17,18],[16,17,18,19,20,21],[19,20,21,22,23,24],[22,23,24,25,26,27],[25,26,27,28,29,30],[28,29,30,31,32,33],[31,32,33,34,35,36]],rt=[[1,2,3,4,5,6],[4,5,6,7,8,9],[7,8,9,10,11,12],[10,11,12,13,14,15],[13,14,15,16,17,18],[16,17,18,19,20,21],[19,20,21,22,23,24],[22,23,24,25,26,27],[25,26,27,28,29,30],[28,29,30,31,32,33],[31,32,33,34,35,36]],V;((o)=>{o.EVEN="EVEN";o.ODD="ODD"})(V||={});var U;((o)=>{o.RED="RED";o.BLACK="BLACK"})(U||={});var M;((o)=>{o.LOW="LOW";o.HIGH="HIGH"})(M||={});var a;((E)=>{E.TOP="TOP";E.MIDDLE="MIDDLE";E.BOTTOM="BOTTOM"})(a||={});var P;((E)=>{E.FIRST="FIRST";E.SECOND="SECOND";E.THIRD="THIRD"})(P||={});var _r;((o)=>{o.AMERICAN="AMERICAN";o.EUROPEAN="EUROPEAN"})(_r||={});var g=(r)=>{if(r.straightBets.length===0&&r.splitBets.length===0&&r.streetBets.length===0&&r.cornerBets.length===0&&r.doubleStreetBets.length===0&&r.parityBets.length===0&&r.colorBets.length===0&&r.halfBets.length===0&&r.columnBets.length===0&&r.dozenBets.length===0)throw O.createValidationError("Must place at least a single bet.");if(!r.straightBets.every((t)=>t.amount.gte(0)&&q(t.value)))throw O.createValidationError("Invalid straight bet.");if(!r.splitBets.every((t)=>t.amount.gte(0)&&Co(t.values)))throw O.createValidationError("Invalid split bet.");if(!r.streetBets.every((t)=>t.amount.gte(0)&&Zo(t.values)))throw O.createValidationError("Invalid street bet.");if(!r.cornerBets.every((t)=>t.amount.gte(0)&&Do(t.values)))throw O.createValidationError("Invalid corner bet.");if(!r.doubleStreetBets.every((t)=>t.amount.gte(0)&&No(t.values)))throw O.createValidationError("Invalid double street bet.");if(!r.parityBets.every((t)=>t.amount.gte(0)&&Object.values(V).includes(t.parity)))throw O.createValidationError("Invalid parity bet.");if(!r.colorBets.every((t)=>t.amount.gte(0)&&Object.values(U).includes(t.color)))throw O.createValidationError("Invalid color bet.");if(!r.halfBets.every((t)=>t.amount.gte(0)&&Object.values(M).includes(t.half)))throw O.createValidationError("Invalid half bet.");if(!r.columnBets.every((t)=>t.amount.gte(0)&&Object.values(a).includes(t.column)))throw O.createValidationError("Invalid column bet.");if(!r.dozenBets.every((t)=>t.amount.gte(0)&&Object.values(P).includes(t.dozen)))throw O.createValidationError("Invalid dozen bet.")},q=(r)=>{return Nr.includes(r)},Co=(r)=>{if(r.length!==2)return!1;if(!r.every(q))return!1;return sr.some(([t,o])=>t===r[0]&&o===r[1])},Zo=(r)=>{if(r.length!==3)return!1;if(!r.every(q))return!1;return Lr.some(([t,o,E])=>t===r[0]&&o===r[1]&&E===r[2])},Do=(r)=>{if(r.length!==4)return!1;if(!r.every(q))return!1;return vr.some(([t,o,E,A])=>t===r[0]&&o===r[1]&&E===r[2]&&A===r[3])},No=(r)=>{if(r.length!==6)return!1;if(!r.every(q))return!1;return kr.some(([t,o,E,A,f,c])=>t===r[0]&&o===r[1]&&E===r[2]&&A===r[3]&&f===r[4]&&c===r[5])};var e=(r)=>{if(r.straightBets.length===0&&r.splitBets.length===0&&r.streetBets.length===0&&r.cornerBets.length===0&&r.basketBets.length===0&&r.doubleStreetBets.length===0&&r.parityBets.length===0&&r.colorBets.length===0&&r.halfBets.length===0&&r.columnBets.length===0&&r.dozenBets.length===0)throw O.createValidationError("Must place at least a single bet.");if(!r.straightBets.every((t)=>t.amount.gte(0)&&m(t.value)))throw O.createValidationError("Invalid straight bet.");if(!r.splitBets.every((t)=>t.amount.gte(0)&&_o(t.values)))throw O.createValidationError("Invalid split bet.");if(!r.streetBets.every((t)=>t.amount.gte(0)&&Go(t.values)))throw O.createValidationError("Invalid street bet.");if(!r.cornerBets.every((t)=>t.amount.gte(0)&&To(t.values)))throw O.createValidationError("Invalid corner bet.");if(!r.basketBets.every((t)=>t.amount.gte(0)))throw O.createValidationError("Invalid basket bet.");if(!r.doubleStreetBets.every((t)=>t.amount.gte(0)&&yo(t.values)))throw O.createValidationError("Invalid double street bet.");if(!r.parityBets.every((t)=>t.amount.gte(0)&&Object.values(V).includes(t.parity)))throw O.createValidationError("Invalid parity bet.");if(!r.colorBets.every((t)=>t.amount.gte(0)&&Object.values(U).includes(t.color)))throw O.createValidationError("Invalid color bet.");if(!r.halfBets.every((t)=>t.amount.gte(0)&&Object.values(M).includes(t.half)))throw O.createValidationError("Invalid half bet.");if(!r.columnBets.every((t)=>t.amount.gte(0)&&Object.values(a).includes(t.column)))throw O.createValidationError("Invalid column bet.");if(!r.dozenBets.every((t)=>t.amount.gte(0)&&Object.values(P).includes(t.dozen)))throw O.createValidationError("Invalid dozen bet.")},m=(r)=>{return Wr.includes(r)};function _o(r){if(r.length!==2)return!1;if(!r.every(m))return!1;return lr.some(([t,o])=>t===r[0]&&o===r[1])}var Go=(r)=>{if(r.length!==3)return!1;if(!r.every(m))return!1;return Kr.some(([t,o,E])=>t===r[0]&&o===r[1]&&E===r[2])},To=(r)=>{if(r.length!==4)return!1;if(!r.every(m))return!1;return gr.some(([t,o,E,A])=>t===r[0]&&o===r[1]&&E===r[2]&&A===r[3])},yo=(r)=>{if(r.length!==6)return!1;if(!r.every(m))return!1;return rt.some(([t,o,E,A,f,c])=>t===r[0]&&o===r[1]&&E===r[2]&&A===r[3]&&f===r[4]&&c===r[5])};var ho={straightBets:36,splitBets:18,streetBets:12,cornerBets:9,basketBets:7,doubleStreetBets:6,parityBets:2,colorBets:2,halfBets:2,columnBets:3,dozenBets:3},bo=[3,6,9,12,15,18,21,24,27,30,33,36],uo=[2,5,8,11,14,17,20,23,26,29,32,35],wo=[1,4,7,10,13,16,19,22,25,28,31,34],Vo=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],Uo=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35],Mo=2.7,ao=5.3;class Gr extends S{constructor(){super("ROULETTE")}determineGameResult({generator:r,gameInputs:t}){this.validateInputs(t);let o=r.getRandomInt({min:0,max:this.maxNumber}),E=o.value,A=this.determineBetOutcomes(t,E),{payoutMultiplier:f}=this.getPayoutDetails(t,E);return{outputs:{betOutcomes:A,result:o.values},payoutMultiplier:f,isFinished:!0,randomValues:o}}getBetAmount(r){return this.calculateTotalBetAmount(this.getBetTotals(r))}getPayoutDetails(r,t){let o=this.determineBetOutcomes(r,t),E=this.getBetTotals(r),A=this.getBetTotals(o.winningBets),f=this.calculateTotalBetAmount(E),c=this.calculateTotalPayout(A);return{payoutMultiplier:f.gt(0)?c.div(f):new k(0),payoutAmount:c}}determineBetOutcomes(r,t){let o={},E={};for(let A of Object.keys(r)){let f=r[A],c=this.betPredicates[A],{winning:i,losing:B}=this.partitionBets(f,c,t);o[A]=i,E[A]=B}return{winningBets:o,losingBets:E}}calculateTotalAmount(r){return r.reduce((t,o)=>t.plus(o.amount),new k(0))}isWinningStraightBet(r,t){return r.value===t}isWinningSplitBet(r,t){return r.values.some((o)=>o===t)}isWinningStreetBet(r,t){return r.values.some((o)=>o===t)}isWinningCornerBet(r,t){return r.values.some((o)=>o===t)}isWinningDoubleStreetBet(r,t){return r.values.some((o)=>o===t)}isWinningColorBet(r,t){let o=r;return Vo.includes(t)&&o.color==="RED"||Uo.includes(t)&&o.color==="BLACK"}isWinningHalfBet(r,t){let o=r;if(t>0&&t<=18&&o.half==="LOW")return!0;if(t>18&&t<=36&&o.half==="HIGH")return!0;return!1}isWinningColumnBet(r,t){let o=r;return bo.includes(t)&&o.column==="TOP"||uo.includes(t)&&o.column==="MIDDLE"||wo.includes(t)&&o.column==="BOTTOM"}isWinningDozenBet(r,t){let o=r;if(t>0&&t<=12&&o.dozen==="FIRST")return!0;if(t>12&&t<=24&&o.dozen==="SECOND")return!0;if(t>24&&t<=36&&o.dozen==="THIRD")return!0;return!1}isWinningParityBet(r,t){let o=r;if(t===0||t===37)return!1;let E=t%2===0?"EVEN":"ODD";return o.parity===E}getBetTotals(r){let t={};for(let o of Object.keys(r))t[o]=this.calculateTotalAmount(r[o]);return t}calculateTotalBetAmount(r){return Object.values(r).reduce((t,o)=>t.plus(o),new k(0))}partitionBets(r,t,o){return{winning:r.filter((E)=>t(E,o)),losing:r.filter((E)=>!t(E,o))}}calculateTotalPayout(r){return Object.entries(r).reduce((t,[o,E])=>{let f=ho[o];return t.plus(E.mul(f||0))},new k(0))}}class tt extends Gr{maxNumber=36;betPredicates={straightBets:this.isWinningStraightBet,splitBets:this.isWinningSplitBet,streetBets:this.isWinningStreetBet,cornerBets:this.isWinningCornerBet,doubleStreetBets:this.isWinningDoubleStreetBet,parityBets:this.isWinningParityBet,colorBets:this.isWinningColorBet,halfBets:this.isWinningHalfBet,columnBets:this.isWinningColumnBet,dozenBets:this.isWinningDozenBet};validateInputs(r){g(r)}}class ot extends Gr{maxNumber=37;betPredicates={straightBets:this.isWinningStraightBet,splitBets:this.isWinningSplitBet,streetBets:this.isWinningStreetBet,cornerBets:this.isWinningCornerBet,basketBets:this.isWinningBasketBet,doubleStreetBets:this.isWinningDoubleStreetBet,parityBets:this.isWinningParityBet,colorBets:this.isWinningColorBet,halfBets:this.isWinningHalfBet,columnBets:this.isWinningColumnBet,dozenBets:this.isWinningDozenBet};validateInputs(r){e(r)}isWinningBasketBet(r,t){return er.some((o)=>o===t)}}class Et extends S{europeanGame;americanGame;constructor(){super("ROULETTE");this.europeanGame=new tt,this.americanGame=new ot}getBetAmount(r){switch(r.type){case"AMERICAN":return this.americanGame.getBetAmount(r.inputs);case"EUROPEAN":return this.europeanGame.getBetAmount(r.inputs);default:throw new Error("Unhandled roulette type")}}determineGameResult(r){let{gameInputs:t,...o}=r;if(r.edge===Mo&&t.type==="EUROPEAN"){let E=this.europeanGame.determineGameResult({...o,gameInputs:t.inputs}),{betOutcomes:A}=E.outputs;return{...E,outputs:{type:"european",betOutcomes:A,result:E.outputs.result}}}if(r.edge===ao&&t.type==="AMERICAN"){let E=this.americanGame.determineGameResult({...o,gameInputs:t.inputs}),{betOutcomes:A}=E.outputs;return{...E,outputs:{type:"american",betOutcomes:A,result:E.outputs.result}}}throw O.createValidationError(`Attempted to play ${t.type} roulette on edge ${r.edge}`)}}var o1=(r)=>{return new Et().getBetAmount(r)};var O1=(r)=>{if(r.type==="EUROPEAN")g(r.inputs);else e(r.inputs)};import{Big as zo}from"big.js";var Q;((E)=>{E.LOW_RISK="LOW_RISK";E.MEDIUM_RISK="MEDIUM_RISK";E.HIGH_RISK="HIGH_RISK"})(Q||={});var X;((f)=>{f[f.TEN=10]="TEN";f[f.TWENTY=20]="TWENTY";f[f.THIRTY=30]="THIRTY";f[f.FORTY=40]="FORTY";f[f.FIFTY=50]="FIFTY"})(X||={});var Po={LOW_RISK:{10:{ZERO:0,A:1.2,B:1.5},20:{ZERO:0,A:1.2,B:1.5},30:{ZERO:0,A:1.2,B:1.5},40:{ZERO:0,A:1.2,B:1.5},50:{ZERO:0,A:1.2,B:1.5}},MEDIUM_RISK:{10:{ZERO:0,A:1.5,B:1.9,C:2,D:3},20:{ZERO:0,A:1.5,B:1.8,C:2,D:3},30:{ZERO:0,A:1.5,B:1.7,C:2,D:3,E:4},40:{ZERO:0,A:1.5,B:1.6,C:2,D:3},50:{ZERO:0,A:1.5,B:2,C:3,D:5}},HIGH_RISK:{10:{ZERO:0,A:9.9},20:{ZERO:0,A:19.8},30:{ZERO:0,A:29.7},40:{ZERO:0,A:39.6},50:{ZERO:0,A:49.5}}},Yo={LOW_RISK:{10:{ZERO:0,A:1.2,B:1.4},20:{ZERO:0,A:1.2,B:1.4},30:{ZERO:0,A:1.2,B:1.4},40:{ZERO:0,A:1.2,B:1.4},50:{ZERO:0,A:1.2,B:1.4}},MEDIUM_RISK:{10:{ZERO:0,A:1.4,B:1.9,C:2,D:3.1},20:{ZERO:0,A:1.5,B:1.8,C:1.9,D:3.4},30:{ZERO:0,A:1.5,B:1.7,C:1.9,D:3,E:4.3},40:{ZERO:0,A:1.5,B:1.6,C:2,D:2.9},50:{ZERO:0,A:1.5,B:2,C:3,D:4.5}},HIGH_RISK:{10:{ZERO:0,A:9.8},20:{ZERO:0,A:19.6},30:{ZERO:0,A:29.4},40:{ZERO:0,A:39.2},50:{ZERO:0,A:49}}},Fo={LOW_RISK:{10:{ZERO:0,A:1.15,B:1.65},20:{ZERO:0,A:1.15,B:1.65},30:{ZERO:0,A:1.15,B:1.65},40:{ZERO:0,A:1.15,B:1.65},50:{ZERO:0,A:1.15,B:1.65}},MEDIUM_RISK:{10:{ZERO:0,A:1.4,B:1.9,C:2,D:3},20:{ZERO:0,A:1.4,B:1.6,C:2,D:3},30:{ZERO:0,A:1.4,B:1.7,C:2,D:3,E:4},40:{ZERO:0,A:1.5,B:1.6,C:2,D:2.8},50:{ZERO:0,A:1.5,B:2,C:2.7,D:4.9}},HIGH_RISK:{10:{ZERO:0,A:9.7},20:{ZERO:0,A:19.4},30:{ZERO:0,A:29.1},40:{ZERO:0,A:38.8},50:{ZERO:0,A:48.5}}},Ro={LOW_RISK:{10:{ZERO:0,A:1.15,B:1.55},20:{ZERO:0,A:1.15,B:1.55},30:{ZERO:0,A:1.15,B:1.55},40:{ZERO:0,A:1.15,B:1.55},50:{ZERO:0,A:1.15,B:1.55}},MEDIUM_RISK:{10:{ZERO:0,A:1.4,B:1.8,C:2,D:3},20:{ZERO:0,A:1.3,B:1.5,C:2,D:3},30:{ZERO:0,A:1.4,B:1.6,C:2,D:2.9,E:4},40:{ZERO:0,A:1.5,B:1.6,C:2,D:2.7},50:{ZERO:0,A:1.5,B:2,C:2.6,D:4.8}},HIGH_RISK:{10:{ZERO:0,A:9.6},20:{ZERO:0,A:19.2},30:{ZERO:0,A:28.8},40:{ZERO:0,A:38.4},50:{ZERO:0,A:48}}},$o={LOW_RISK:{10:{ZERO:0,A:1.1,B:1.5},20:{ZERO:0,A:1.1,B:1.5},30:{ZERO:0,A:1.1,B:1.45},40:{ZERO:0,A:1.1,B:1.45},50:{ZERO:0,A:1.1,B:1.45}},MEDIUM_RISK:{10:{ZERO:0,A:1.3,B:1.7,C:1.9,D:3},20:{ZERO:0,A:1.3,B:1.4,C:1.9,D:3},30:{ZERO:0,A:1.3,B:1.7,C:1.9,D:2.8,E:3.8},40:{ZERO:0,A:1.4,B:1.8,C:1.9,D:2.6},50:{ZERO:0,A:1.4,B:1.9,C:2.6,D:4.6}},HIGH_RISK:{10:{ZERO:0,A:9.2},20:{ZERO:0,A:18.4},30:{ZERO:0,A:27.6},40:{ZERO:0,A:36.8},50:{ZERO:0,A:46}}},At=new T(new Map([[1,Po],[2,Yo],[3,Fo],[4,Ro],[8,$o]]));var ft={LOW_RISK:{10:["B","A","A","A","ZERO","A","A","A","A","ZERO"],20:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"],30:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"],40:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"],50:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"]},MEDIUM_RISK:{10:["ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","D"],20:["A","ZERO","C","ZERO","B","ZERO","C","ZERO","C","ZERO","A","ZERO","C","ZERO","C","ZERO","D","ZERO","C","ZERO"],30:["A","ZERO","C","ZERO","A","ZERO","C","ZERO","D","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","C","ZERO","A","ZERO","C","ZERO","E","ZERO","A","ZERO","C","ZERO"],40:["C","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO","C","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO","C","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO"],50:["A","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","B","ZERO","A","ZERO","D","ZERO","A","ZERO","B","ZERO","A","ZERO"]},HIGH_RISK:{10:[...Array(9).fill("ZERO"),"A"],20:[...Array(19).fill("ZERO"),"A"],30:[...Array(29).fill("ZERO"),"A"],40:[...Array(39).fill("ZERO"),"A"],50:[...Array(49).fill("ZERO"),"A"]}};class Jo extends S{constructor(){super("WHEEL")}determineGameResult({generator:r,gameInputs:t,edge:o}){if(!Object.values(X).includes(t.segments))throw new Error("Invalid segments value");if(!Object.values(Q).includes(t.riskLevel))throw new Error("Invalid risk level");let A=At.getMultipliers(o)[t.riskLevel];if(A===void 0)throw new Error(`No multipliers found for risk level ${t.riskLevel}`);let f=A[t.segments];if(f===void 0)throw new Error(`No multipliers found for segment ${t.segments}`);let c=ft[t.riskLevel];if(c===void 0)throw new Error(`No patterns found for risk level ${t.riskLevel}`);let i=c[t.segments];if(i===void 0)throw new Error(`No patterns found for segment ${t.segments}`);let B=r.getRandomInt({min:0,max:i.length-1}),C=i[B.value];if(C===void 0)throw new Error(`No pattern found for segment ${t.segments} and value ${B.value}`);let p=f[C];if(p===void 0)throw new Error(`No payout found for picked segment ${C}`);return{isFinished:!0,payoutMultiplier:new zo(p),outputs:{result:B.values},randomValues:B}}}export{O1 as validateRouletteGameInputs,Lo as validateAdvancedDiceInputs,gt as rtp99Multipliers,et as rtp98Multipliers,kt as rtp97Multipliers,ro as rtp96Multipliers,to as rtp92Multipliers,nr as plinkoMultipliers,Dr as nCr,Xr as kenoMultipliers,Qr as isTileCount,Lt as hasDiceWon,Ht as diamondsMultipliers,o1 as calculateRouletteBetAmount,lt as calculateDiceWinChance,ht as calculateBaccaratBetAmount,hr as calculateAdvancedDiceWinChance,jr as bigMin,Ir as bigMax,Ct as advancedDiceIsWithinBoundsInclusive,tr as advancedDiceIsWithinBoundsExclusive,dt as advancedDiceGetInclusiveBoundsRange,or as advancedDiceGetExclusiveBoundsRange,X as WheelSegments,Q as WheelRiskLevel,Jo as Wheel,wt as WIN_MULTIPLIER,Nt as VALID_SUITS,_t as VALID_RANKS,Lr as VALID_EUROPEAN_STREETS,Nr as VALID_EUROPEAN_STRAIGHTS,sr as VALID_EUROPEAN_SPLITS,kr as VALID_EUROPEAN_DOUBLE_STREETS,vr as VALID_EUROPEAN_CORNERS,Kr as VALID_AMERICAN_STREETS,Wr as VALID_AMERICAN_STRAIGHTS,lr as VALID_AMERICAN_SPLITS,rt as VALID_AMERICAN_DOUBLE_STREETS,gr as VALID_AMERICAN_CORNERS,bo as TOP_COLUMN,vt as TILE_COUNTS,_r as RouletteType,Et as Roulette,Zt as RollType,L as RandomValuePool,Vo as RED_NUMBERS,Er as RANDOM_MIN_VALUE,Ar as RANDOM_MAX_VALUE,Hr as PlinkoRiskLevel,po as Plinko,V as Parity,Vt as PUSH_MULTIPLIER,RA as PLINKO_ROW_COUNTS,ho as PAYOUT_MULTIPLIERS,N as OrigamiGame,h as MultiplierCalculator,fo as Mines,it as MIN_WIN_CHANCE,uo as MIDDLE_COLUMN,xt as MAX_WIN_CHANCE,ir as MAX_CARDS_PER_ROUND,Ao as Limbo,Ut as LOSE_MULTIPLIER,mr as KenoRiskLevel,Eo as Keno,cr as InsuranceOutcome,Vr as INSURANCE_WIN_PAYOUT,wr as INSURANCE_BET_SIZE_FACTOR,xr as INSURANCE_BET_MULTIPLIER,M as Half,Ot as GameErrorCode,O as GameError,S as Game,Mr as FACE_CARD_VALUE,tt as EuropeanRoulette,Mo as EUROPEAN_HOUSE_EDGE,Tr as EFFECTIVE_RANGE,P as Dozen,st as DiceDirection,Kt as Dice,qt as DiamondsResultType,Wt as Diamonds,Ur as DOUBLE_DOWN_BET_SIZE_FACTOR,Jr as DICE_EFFECTIVE_RANGE,ur as DEALER_STAND_VALUE,a as Column,U as Color,tE as CARDS_PER_SUIT,fr as BlackjackOutcome,br as BlackjackActionType,zt as Blackjack,Gt as BaccaratOutcome,Tt as BaccaratBetType,bt as Baccarat,Or as BUST_VALUE,wo as BOTTOM_COLUMN,Uo as BLACK_NUMBERS,n as BLACKJACK_VALUE,ut as BLACKJACK_MULTIPLIER,ar as BASE_PAYOUT_MULTIPLIERS,ot as AmericanRoulette,Dt as AdvancedDice,ao as AMERICAN_HOUSE_EDGE,er as AMERICAN_BASKET,Br as ACE_SOFT_BONUS};
|
|
1
|
+
var _E;((E)=>E.INPUT_VALIDATION_ERROR="INPUT_VALIDATION_ERROR")(_E||={});class B extends Error{static createValidationError(r){return new B("INPUT_VALIDATION_ERROR",r)}static isGameError(r){return r instanceof B}errorCode;constructor(r,E){super(E);this.errorCode=r}}var b;((Z)=>{Z.DICE="DICE";Z.MINES="MINES";Z.KENO="KENO";Z.LIMBO="LIMBO";Z.ADVANCED_DICE="ADVANCED_DICE";Z.BACCARAT="BACCARAT";Z.DIAMONDS="DIAMONDS";Z.PLINKO="PLINKO";Z.ROULETTE="ROULETTE";Z.WHEEL="WHEEL";Z.BLACKJACK="BLACKJACK"})(b||={});class N{gameId;constructor(r){this.gameId=r}getGameResult(r){return this.determineGameResult(r)}}import{Big as pr}from"big.js";import Or from"big.js";class y{static withMultiplier(r,E){return new Or(r).times(new Or(100-E).div(100))}static withWinChance(r,E){return Or(100-r).div(E)}}var Br=0,Dr=1e4,zr=10001,CE=0.01,TE=98,UE=(r)=>{if(r<Br)throw B.createValidationError(`Lower bound ${r} is below minimum allowed value ${Br}`)},GE=(r)=>{if(r>Dr)throw B.createValidationError(`Upper bound ${r} is above maximum allowed value ${Dr}`)},v=(r)=>{if(UE(r.lower),GE(r.upper),r.lower>=r.upper)throw B.createValidationError(`Lower bound ${r.lower} must be less than ${r.upper}`)},ME=(r,E)=>{let[A,t]=r.lower<=E.lower?[r,E]:[E,r];if(A.upper>t.lower)throw B.createValidationError("Bounds must not overlap")},bE=(r,E)=>E>=r.lower&&E<=r.upper,wE=(r)=>r.upper-r.lower+1,or=(r,E)=>E>r.lower&&E<r.upper,xr=(r)=>r.upper-r.lower-1,hE;((t)=>{t.ROLL_BETWEEN="ROLL_BETWEEN";t.ROLL_OUTSIDE="ROLL_OUTSIDE";t.ROLL_BETWEEN_TWO="ROLL_BETWEEN_TWO"})(hE||={});var $r=(r)=>{let A=(()=>{switch(r.mode){case"ROLL_BETWEEN":return v(r.bounds),xr(r.bounds);case"ROLL_OUTSIDE":return v(r.bounds),zr-wE(r.bounds);case"ROLL_BETWEEN_TWO":return v(r.firstBounds),v(r.secondBounds),ME(r.firstBounds,r.secondBounds),xr(r.firstBounds)+xr(r.secondBounds)}})(),t=pr(A).div(zr).mul(100);if(t.lt(CE))throw B.createValidationError("Win chance too low");if(t.gt(TE))throw B.createValidationError("Win chance too high");return t},eA=(r)=>{$r(r)};class VE extends N{constructor(){super("ADVANCED_DICE")}determineGameResult({generator:r,edge:E,gameInputs:A}){let t=$r(A),f=r.getRandomInt({min:Br,max:Dr}),O=f.value;return{isFinished:!0,payoutMultiplier:(()=>{switch(A.mode){case"ROLL_BETWEEN":return or(A.bounds,O);case"ROLL_OUTSIDE":return!bE(A.bounds,O);case"ROLL_BETWEEN_TWO":return or(A.firstBounds,O)||or(A.secondBounds,O)}})()?y.withWinChance(E,t):new pr(0),outputs:{result:f.values},randomValues:f}}}import $ from"big.js";var yE=["Clubs","Diamonds","Hearts","Spades"],YE=["Ace","2","3","4","5","6","7","8","9","10","Jack","Queen","King"],zE;((t)=>{t.PLAYER_WIN="PLAYER_WIN";t.TIE="TIE";t.BANKER_WIN="BANKER_WIN"})(zE||={});var pE;((t)=>{t.PLAYER="PLAYER";t.TIE="TIE";t.BANKER="BANKER"})(pE||={});var $E={["PLAYER_WIN"]:{betType:"PLAYER",multiplier:2},["TIE"]:{betType:"TIE",multiplier:9},["BANKER_WIN"]:{betType:"BANKER",multiplier:1.95}},FE=(r)=>{return new $(0).add(r.bets.reduce((A,t)=>A.add(t.amount),new $(0)))};class PE extends N{constructor(){super("BACCARAT")}determineGameResult({generator:r,gameInputs:E,edge:A}){if(A!==1)throw new Error("Baccarat is only available at 1% edge.");this.validateGameInputs(E);let t=r.getRandomIntsWithReplacement({min:0,max:51,count:6}),f=t.values,O=f.slice(0,3),o=f.slice(3,6),x=[],D=0;for(let C of O.slice(0,2)){let M=this.mapRandomValueToCard(C),K=this.mapRandomValueToCardValue(C);x.push(M),D=(D+K)%10}let c=[],S=0;for(let C of o.slice(0,2)){let M=this.mapRandomValueToCard(C),K=this.mapRandomValueToCardValue(C);c.push(M),S=(S+K)%10}if(!this.isNaturalWin(D,S)){let C=this.shouldDrawThirdPlayerCard(D),M=null;if(C)M=this.mapRandomValueToCardValue(O[2]),x.push(this.mapRandomValueToCard(O[2])),D=(D+M)%10;if(this.shouldDrawThirdBankerCard(S,M))c.push(this.mapRandomValueToCard(o[2])),S=(S+this.mapRandomValueToCardValue(o[2]))%10}let Z;if(D===S)Z="TIE";else Z=D>S?"PLAYER_WIN":"BANKER_WIN";let w=FE(E),{betType:p,multiplier:cE}=$E[Z],u=new $(0);if(u=u.add(E.bets.filter((C)=>C.type===p).reduce((C,M)=>C.add(M.amount.mul(cE)),new $(0))),Z==="TIE")u=u.add(E.bets.filter((C)=>C.type==="PLAYER"||C.type==="BANKER").reduce((C,M)=>C.add(M.amount),new $(0)));return{isFinished:!0,payoutMultiplier:w.gt(0)?u.div(w):new $(0),outputs:{playerCards:x,playerHandValue:D,bankerCards:c,bankerHandValue:S,gameOutcome:Z,result:t.values},randomValues:t}}validateGameInputs(r){if(r.bets.length===0)throw new Error("Must place at least a single bet.");if(!r.bets.every((E)=>E.amount.gte(0)))throw new Error("Invalid bet.")}mapRandomValueToCard(r){let E=yE[Math.floor(r/13)],A=YE[r%13];return{suit:E,rank:A}}isNaturalWin(r,E){let A=[8,9];return A.includes(r)||A.includes(E)}mapRandomValueToCardValue(r){let E=r%13;if(E===0)return 1;if(E>=10)return 10;return E+1}shouldDrawThirdPlayerCard(r){return r<=5}shouldDrawThirdBankerCard(r,E){if(E===null)return r<=5;if(r<=2)return!0;if(r===3)return E!==8;if(r===4)return[2,3,4,5,6,7].includes(E);if(r===5)return[4,5,6,7].includes(E);if(r===6)return[6,7].includes(E);return!1}}var Zr;((f)=>{f.WIN="WIN";f.LOSE="LOSE";f.PUSH="PUSH";f.PLAYER_BLACKJACK="PLAYER_BLACKJACK"})(Zr||={});var Sr;((A)=>{A.WON="WON";A.LOST="LOST"})(Sr||={});var Nr;((x)=>{x.START="START";x.HIT="BLACKJACK_HIT";x.STAND="BLACKJACK_STAND";x.BUY_INSURANCE="BLACKJACK_BUY_INSURANCE";x.REJECT_INSURANCE="BLACKJACK_REJECT_INSURANCE";x.DOUBLE_DOWN="BLACKJACK_DOUBLE_DOWN";x.SPLIT="BLACKJACK_SPLIT"})(Nr||={});var JE=2.5,RE=2,qE=1,QE=0,Fr=17,cr=21,F=21,_r=63,o1=1.5,I=0.5,Pr=1.5,Y=1,g=1,x1=13,Cr=10,Jr=10,l={PLAYER_BLACKJACK:JE,WIN:RE,PUSH:qE,LOSE:QE};import{Guard as _}from"@betorigami/guard";import{createStore as dE}from"@xstate/store";var Rr=0,qr=51,k=Array.from({length:52},(r,E)=>E),Qr=["Spades","Hearts","Diamonds","Clubs"],a=["Ace","Two","Three","Four","Five","Six","Seven","Eight","Nine","Ten","Jack","Queen","King"],Xr=["Jack","Queen","King"];import{Guard as XE}from"@betorigami/guard";import{Guard as Tr}from"@betorigami/guard";class Ur{value;constructor(r){let E=k[r];Tr.againstNullOrUndefined(E,`Invalid card value: ${r}`),this.value=E}get suit(){let r=Math.floor(this.value/13),E=Qr[r];return Tr.againstNullOrUndefined(E,`Invalid suit index: ${r}`),E}get rank(){let r=this.value%13,E=a[r];return Tr.againstNullOrUndefined(E,`Invalid rank index: ${r}`),E}toDto(){return{rank:this.rank,suit:this.suit,cardValue:this.value}}}class h extends Ur{get numericRank(){if(Xr.includes(this.rank))return Jr;return a.indexOf(this.rank)+1}static fromValue(r){return XE.against(!k.includes(r),`Invalid card value: ${r}`),new h(r)}}class d{cards;hardHandValue;softHandValue=null;constructor(r){this.cards=r;if(this.hardHandValue=r.reduce((A,t)=>A+t.numericRank,0),r.some((A)=>A.rank==="Ace")&&this.hardHandValue+Cr<=cr)this.softHandValue=this.hardHandValue+Cr}get cardCount(){return this.cards.length}get hasSoftHandValue(){return this.softHandValue!==null}get isBusted(){return this.hardHandValue>cr}get isBlackjack(){return this.cardCount===2&&this.highestHandValue===F}get highestHandValue(){return this.softHandValue!==null?this.softHandValue:this.hardHandValue}}class i{cards;value;constructor(r){this.cards=r.map((E)=>h.fromValue(E)),this.value=new d(this.cards)}get isBusted(){return this.value.isBusted}get isBlackjack(){return this.value.isBlackjack}get highestHandValue(){return this.value.highestHandValue}get rawValues(){return this.cards.map((r)=>r.value)}toDto(){return{cards:this.cards.map((r)=>r.toDto()),value:this.highestHandValue}}}class j extends i{otherCards;upCard;holeCard;constructor(r,E,A=[]){super([r,E,...A]);this.otherCards=A;this.upCard=h.fromValue(r),this.holeCard=h.fromValue(E)}static withInitialDeal(r){return new j(r.upCard,r.holeCard)}addDrawnCards(r){return new j(this.upCard.value,this.holeCard.value,[...this.otherCards,...r])}toDto(r=!1){if(r)return super.toDto();return{cards:[this.upCard.toDto()],value:new d([this.upCard]).highestHandValue}}}class z extends i{static withInitialDeal(r){return new z(r)}addDrawnCards(r){return new z([...this.rawValues,...r])}}import{Guard as s}from"@betorigami/guard";class n{source;index=0;constructor(r){this.source=r}static from(r,E){return s.against(E<=0,`Count must be positive, got ${E}`),s.against(r.values.length!==E,`Expected ${E} values, got ${r.values.length}`),new n(r)}get consumedValues(){return this.source.values.slice(0,this.index)}toMultipleRandomValues(){return this.source}takeOne(){let r=this.source.values[this.index];return s.againstUndefined(r,"RandomValuePool exhausted"),this.index+=1,r}take(r){s.against(this.index+r>this.source.values.length,`RandomValuePool exhausted: requested ${r} but only ${this.source.values.length-this.index} remain`);let E=this.source.values.slice(this.index,this.index+r);return this.index+=r,E}}import{Guard as uE}from"@betorigami/guard";import IE from"fast-deep-equal";class Gr{edge;constructor(r){this.edge=r}play(r,E,A=[]){let t=this.createGameStore(),f=this.generateRandomValues(r),O=f.toMultipleRandomValues();for(let D of A)t.send({...D.playerArgument,randomValuePool:f});let o=A[A.length-1];if(o)uE.against(!IE(o.state,this.toExternalState(t.getSnapshot().context.state)),"The final state of the game does not match the expected state based on the previous actions");t.send({...E,randomValuePool:f});let x=t.getSnapshot().context;return{playerArgument:x.playerArgument,state:this.toExternalState(x.state),config:x.config,betAmountMultiplier:x.betAmountMultiplier,proof:{proofHash:O.proofHash,proofString:O.proofString}}}}import T from"big.js";var ur={BLACKJACK_DOUBLE_DOWN:Y,BLACKJACK_BUY_INSURANCE:I,BLACKJACK_SPLIT:g},Ir=(r)=>r==="WON"?T(Pr):T(0),dr=(r)=>r!==void 0?T(I):T(0),ir=(r)=>{let E=r.actionType==="BLACKJACK_DOUBLE_DOWN",A=T(1),t=E?T(Y):T(0),f=dr(r.insuranceOutcome),O=A.plus(t).plus(f),o=A.plus(t),x=T(l[r.outcome]).mul(o),D=Ir(r.insuranceOutcome);return{payoutMultiplier:x.plus(D).div(O).toNumber(),betAmountMultiplier:ur[r.actionType]}},jr=(r)=>{let E=r.mainHandDoubledDown?T(1).plus(Y):T(1),A=r.splitHandDoubledDown?T(1).plus(Y):T(1),t=dr(r.insuranceOutcome),f=E.plus(A).plus(t),O=T(l[r.mainOutcome]).mul(E),o=T(l[r.splitOutcome]).mul(A),x=Ir(r.insuranceOutcome);return{payoutMultiplier:O.plus(o).plus(x).div(f).toNumber(),betAmountMultiplier:ur[r.actionType]}};var iE={state:{isFinished:!1,phase:"uninitialised",multiplier:1},config:{},playerArgument:{type:"START"}},U=(r)=>h.fromValue(r).value;function jE(r){_.against(r.phase!=="in-progress","Expected a started, in-progress game state")}function Hr(r){_.against(r.phase!=="awaiting-insurance","Expected game to be awaiting insurance decision")}function Mr(r){_.against(r.phase!=="in-progress"&&r.phase!=="playing-main-hand"&&r.phase!=="playing-split-hand","Expected a started, in-progress game state")}var mr=(r,E)=>{let A=E;while(A.highestHandValue<Fr)A=A.addDrawnCards([U(r.takeOne())]);return A},wr=(r,E)=>{if(r.isBusted)return"LOSE";if(E.isBusted)return"WIN";let A=r.highestHandValue,t=E.highestHandValue;if(A>t)return"WIN";if(A<t)return"LOSE";return"PUSH"},G=(r)=>{let{payoutMultiplier:E,betAmountMultiplier:A}=ir({outcome:r.outcome,insuranceOutcome:r.insuranceOutcome,actionType:r.actionType});return{state:{isFinished:!0,phase:"finished",playerHand:r.playerHand,dealerHand:r.dealerHand,outcome:r.outcome,multiplier:E,randomValues:r.randomValuePool.consumedValues,insuranceOutcome:r.insuranceOutcome},config:{},playerArgument:{type:r.actionType},betAmountMultiplier:A}},br=(r)=>{let E=mr(r.randomValuePool,r.dealerHand),A=wr(r.playerHand,E);return G({...r,dealerHand:E,outcome:A})},e=(r)=>{let A=r.mainHand.isBusted&&r.splitHand.isBusted?r.dealerHand:mr(r.randomValuePool,r.dealerHand),t=wr(r.mainHand,A),f=wr(r.splitHand,A),{payoutMultiplier:O,betAmountMultiplier:o}=jr({hasSplit:!0,mainOutcome:t,splitOutcome:f,insuranceOutcome:r.insuranceOutcome,mainHandDoubledDown:r.mainHandDoubledDown,splitHandDoubledDown:r.splitHandDoubledDown,actionType:r.actionType});return{state:{isFinished:!0,phase:"split-finished",mainHand:r.mainHand,splitHand:r.splitHand,dealerHand:A,mainOutcome:t,splitOutcome:f,multiplier:O,randomValues:r.randomValuePool.consumedValues,insuranceOutcome:r.insuranceOutcome},config:{},playerArgument:{type:r.actionType},betAmountMultiplier:o}};class HE extends Gr{generateRandomValues(r){return n.from(r.getRandomIntsWithReplacement({min:Rr,max:qr,count:_r}),_r)}toExternalState(r){let E=r.phase;switch(E){case"awaiting-insurance":return{isFinished:!1,phase:"awaiting-insurance",multiplier:r.multiplier,playerHand:r.playerHand.toDto(),dealerHand:r.dealerHand.toDto(!1)};case"in-progress":return{isFinished:!1,phase:"player-turn",multiplier:r.multiplier,playerHand:r.playerHand.toDto(),dealerHand:r.dealerHand.toDto(!1)};case"playing-main-hand":return{isFinished:!1,phase:"playing-main-hand",multiplier:r.multiplier,mainHand:r.mainHand.toDto(),splitHand:r.splitHand.toDto(),dealerHand:r.dealerHand.toDto(!1)};case"playing-split-hand":return{isFinished:!1,phase:"playing-split-hand",multiplier:r.multiplier,mainHand:r.mainHand.toDto(),splitHand:r.splitHand.toDto(),dealerHand:r.dealerHand.toDto(!1)};case"finished":return{isFinished:!0,multiplier:r.multiplier,randomValues:r.randomValues,outcome:r.outcome,playerHand:r.playerHand.toDto(),dealerHand:r.dealerHand.toDto(!0),...r.insuranceOutcome!==void 0&&{insuranceOutcome:r.insuranceOutcome}};case"split-finished":return{isFinished:!0,multiplier:r.multiplier,randomValues:r.randomValues,mainOutcome:r.mainOutcome,splitOutcome:r.splitOutcome,mainHand:r.mainHand.toDto(),splitHand:r.splitHand.toDto(),dealerHand:r.dealerHand.toDto(!0),...r.insuranceOutcome!==void 0&&{insuranceOutcome:r.insuranceOutcome}};case"uninitialised":throw new Error("Cannot convert uninitialised state to external state");default:_.againstNever(E,"Invalid state received")}}createGameStore(){return dE({context:iE,on:{START:(r,E)=>{let{state:A}=r;_.against(A.phase!=="uninitialised","START action requires a fresh game");let t=U(E.randomValuePool.takeOne()),f=U(E.randomValuePool.takeOne()),O=U(E.randomValuePool.takeOne()),o=U(E.randomValuePool.takeOne()),x=z.withInitialDeal([t,f]),D=j.withInitialDeal({upCard:O,holeCard:o});if(D.upCard.rank==="Ace")return{state:{...A,isFinished:!1,phase:"awaiting-insurance",playerHand:x,dealerHand:D},config:{},playerArgument:{type:"START"}};if(x.isBlackjack&&D.isBlackjack)return G({...A,playerHand:x,dealerHand:D,outcome:"PUSH",randomValuePool:E.randomValuePool,actionType:"START"});if(x.isBlackjack)return G({...A,playerHand:x,dealerHand:D,outcome:"PLAYER_BLACKJACK",randomValuePool:E.randomValuePool,actionType:"START"});if(D.isBlackjack)return G({...A,playerHand:x,dealerHand:D,outcome:"LOSE",randomValuePool:E.randomValuePool,actionType:"START"});return{state:{...A,isFinished:!1,phase:"in-progress",playerHand:x,dealerHand:D,insuranceBought:!1},config:{},playerArgument:{type:"START"}}},BLACKJACK_BUY_INSURANCE:(r,E)=>{let{state:A}=r;Hr(A);let{playerHand:t,dealerHand:f}=A,O={...A,randomValuePool:E.randomValuePool,actionType:"BLACKJACK_BUY_INSURANCE",dealerHand:f,playerHand:t};if(t.isBlackjack&&f.isBlackjack)return G({...O,outcome:"PUSH",insuranceOutcome:"WON"});if(t.isBlackjack)return G({...O,outcome:"PLAYER_BLACKJACK",insuranceOutcome:"LOST"});if(f.isBlackjack)return G({...O,outcome:"LOSE",insuranceOutcome:"WON"});return{state:{...A,isFinished:!1,phase:"in-progress",playerHand:t,dealerHand:f,insuranceBought:!0},config:{},playerArgument:{type:"BLACKJACK_BUY_INSURANCE"},betAmountMultiplier:I}},BLACKJACK_REJECT_INSURANCE:(r,E)=>{let{state:A}=r;Hr(A);let{playerHand:t,dealerHand:f}=A,O={...A,playerHand:t,dealerHand:f,randomValuePool:E.randomValuePool,actionType:"BLACKJACK_REJECT_INSURANCE",doubledDown:!1};if(t.isBlackjack&&f.isBlackjack)return G({...O,outcome:"PUSH"});if(t.isBlackjack)return G({...O,outcome:"PLAYER_BLACKJACK"});if(f.isBlackjack)return G({...O,outcome:"LOSE"});return{state:{...A,isFinished:!1,phase:"in-progress",playerHand:t,dealerHand:f,insuranceBought:!1},config:{},playerArgument:{type:"BLACKJACK_REJECT_INSURANCE"}}},BLACKJACK_HIT:(r,E)=>{let{state:A}=r;switch(Mr(A),A.phase){case"playing-main-hand":{let t=A.mainHand.addDrawnCards([U(E.randomValuePool.takeOne())]);if(t.isBusted||t.highestHandValue===F)return{state:{...A,phase:"playing-split-hand",mainHand:t,splitHandDoubledDown:!1},config:{},playerArgument:{type:"BLACKJACK_HIT"}};return{state:{...A,mainHand:t},config:{},playerArgument:{type:"BLACKJACK_HIT"}}}case"playing-split-hand":{let t=A.splitHand.addDrawnCards([U(E.randomValuePool.takeOne())]),f=A.insuranceBought?"LOST":void 0;if(t.isBusted||t.highestHandValue===F)return e({...A,splitHand:t,randomValuePool:E.randomValuePool,actionType:"BLACKJACK_HIT",insuranceOutcome:f});return{state:{...A,splitHand:t},config:{},playerArgument:{type:"BLACKJACK_HIT"}}}case"in-progress":{let{insuranceBought:t}=A,f=t?"LOST":void 0,O=A.playerHand.addDrawnCards([U(E.randomValuePool.takeOne())]);if(O.isBusted)return G({...A,playerHand:O,outcome:"LOSE",randomValuePool:E.randomValuePool,actionType:"BLACKJACK_HIT",insuranceOutcome:f});if(O.highestHandValue===F)return br({...A,playerHand:O,randomValuePool:E.randomValuePool,actionType:"BLACKJACK_HIT",insuranceOutcome:f});return{state:{...A,isFinished:!1,phase:"in-progress",playerHand:O,insuranceBought:t},config:{},playerArgument:{type:"BLACKJACK_HIT"}}}default:_.againstNever(A,"Invalid phase for HIT action")}},BLACKJACK_STAND:(r,E)=>{let{state:A}=r;switch(Mr(A),A.phase){case"playing-main-hand":return{state:{...A,isFinished:!1,phase:"playing-split-hand",splitHandDoubledDown:!1},config:{},playerArgument:{type:"BLACKJACK_STAND"}};case"playing-split-hand":{let t=A.insuranceBought?"LOST":void 0;return e({...A,splitHandDoubledDown:A.splitHandDoubledDown,randomValuePool:E.randomValuePool,actionType:"BLACKJACK_STAND",insuranceOutcome:t})}case"in-progress":{let{insuranceBought:t}=A,f=t?"LOST":void 0;return br({...A,randomValuePool:E.randomValuePool,actionType:"BLACKJACK_STAND",insuranceOutcome:f})}default:_.againstNever(A,"Invalid phase for STAND action")}},BLACKJACK_DOUBLE_DOWN:(r,E)=>{let{state:A}=r;switch(Mr(A),A.phase){case"playing-main-hand":{_.against(A.mainHand.cards.length!==2,"Double down is only allowed as the first action");let t=A.mainHand.addDrawnCards([U(E.randomValuePool.takeOne())]);return{state:{...A,isFinished:!1,phase:"playing-split-hand",mainHand:t,mainHandDoubledDown:!0,splitHandDoubledDown:!1},config:{},playerArgument:{type:"BLACKJACK_DOUBLE_DOWN"},betAmountMultiplier:Y}}case"playing-split-hand":{_.against(A.splitHand.cards.length!==2,"Double down is only allowed as the first action");let t=A.splitHand.addDrawnCards([U(E.randomValuePool.takeOne())]),f=A.insuranceBought?"LOST":void 0;return e({...A,splitHand:t,randomValuePool:E.randomValuePool,actionType:"BLACKJACK_DOUBLE_DOWN",insuranceOutcome:f,splitHandDoubledDown:!0})}case"in-progress":{_.against(A.playerHand.cards.length!==2,"Double down is only allowed as the first action");let{insuranceBought:t}=A,f=t?"LOST":void 0,O=A.playerHand.addDrawnCards([U(E.randomValuePool.takeOne())]);if(O.isBusted)return G({...A,playerHand:O,outcome:"LOSE",randomValuePool:E.randomValuePool,actionType:"BLACKJACK_DOUBLE_DOWN",insuranceOutcome:f});return br({...A,playerHand:O,randomValuePool:E.randomValuePool,actionType:"BLACKJACK_DOUBLE_DOWN",insuranceOutcome:f})}default:_.againstNever(A,"Invalid phase for DOUBLE_DOWN action")}},BLACKJACK_SPLIT:(r,E)=>{let{state:A}=r;jE(A);let{playerHand:t,dealerHand:f,insuranceBought:O}=A;_.against(t.cards.length!==2,"Split is only allowed with exactly 2 cards");let o=t.cards[0],x=t.cards[1];_.againstUndefined(o,"First card is missing"),_.againstUndefined(x,"Second card is missing"),_.against(o.rank!==x.rank,"Split requires two cards of the same rank");let D=U(E.randomValuePool.takeOne()),c=U(E.randomValuePool.takeOne()),S=z.withInitialDeal([o.value,D]),Z=z.withInitialDeal([x.value,c]);if(o.rank==="Ace"){let p=O?"LOST":void 0;return e({...A,mainHand:S,splitHand:Z,dealerHand:f,randomValuePool:E.randomValuePool,actionType:"BLACKJACK_SPLIT",insuranceOutcome:p,mainHandDoubledDown:!1,splitHandDoubledDown:!1})}return{state:{...A,isFinished:!1,phase:"playing-main-hand",multiplier:1,mainHand:S,splitHand:Z,dealerHand:f,insuranceBought:O,mainHandDoubledDown:!1},config:{},playerArgument:{type:"BLACKJACK_SPLIT"},betAmountMultiplier:g}}}})}getValidNextActionTypes(r){if(r.isFinished)return[];switch(r.phase){case"awaiting-insurance":return["BLACKJACK_BUY_INSURANCE","BLACKJACK_REJECT_INSURANCE"];case"playing-main-hand":{let E=["BLACKJACK_HIT","BLACKJACK_STAND"];if(r.mainHand.cards.length===2)E.push("BLACKJACK_DOUBLE_DOWN");return E}case"playing-split-hand":{let E=["BLACKJACK_HIT","BLACKJACK_STAND"];if(r.splitHand.cards.length===2)E.push("BLACKJACK_DOUBLE_DOWN");return E}case"player-turn":{let E=["BLACKJACK_HIT","BLACKJACK_STAND"];if(r.playerHand.cards.length===2){E.push("BLACKJACK_DOUBLE_DOWN");let A=r.playerHand.cards[0],t=r.playerHand.cards[1];if(_.againstUndefined(A,"First player card is missing"),_.againstUndefined(t,"Second player card is missing"),A.rank===t.rank)E.push("BLACKJACK_SPLIT")}return E}default:_.againstNever(r,"Invalid phase for getting valid actions")}}}import mE from"big.js";class V{multipliers;constructor(r){this.multipliers=r}getMultipliers(r){let E=this.multipliers.get(r);if(E===void 0)throw new Error(`Multipliers for ${r} not found`);return E}getAllMultipliers(){return Array.from(this.multipliers.entries()).map(([r,E])=>({edge:r,multipliers:E}))}}var WE;((o)=>{o.PAIR="PAIR";o.TWO_PAIR="TWO_PAIR";o.THREE_OF_A_KIND="THREE_OF_A_KIND";o.FULL_HOUSE="FULL_HOUSE";o.FOUR_OF_A_KIND="FOUR_OF_A_KIND";o.FIVE_OF_A_KIND="FIVE_OF_A_KIND"})(WE||={});var LE={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:4.3,FOUR_OF_A_KIND:5,FIVE_OF_A_KIND:50},KE={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:4,FOUR_OF_A_KIND:4.8,FIVE_OF_A_KIND:50},vE={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:3.7,FOUR_OF_A_KIND:4.6,FIVE_OF_A_KIND:50},gE={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:3.4,FOUR_OF_A_KIND:4.4,FIVE_OF_A_KIND:50},lE={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:2.8,FULL_HOUSE:3.2,FOUR_OF_A_KIND:3.6,FIVE_OF_A_KIND:50},kE=new V(new Map([[1,LE],[2,KE],[3,vE],[4,gE],[8,lE]])),aE={2:"PAIR",3:"THREE_OF_A_KIND",4:"FOUR_OF_A_KIND",5:"FIVE_OF_A_KIND"};class sE extends N{constructor(){super("DIAMONDS")}determineGameResult({generator:r,edge:E}){let A=r.getRandomIntsWithReplacement({min:0,max:6,count:5}),t=kE.getMultipliers(E),f=A.values,O=this.calculatePayoutMultiplier(t,f);return{isFinished:!0,payoutMultiplier:mE(O),outputs:{result:A.values},randomValues:A}}calculatePayoutMultiplier(r,E){let A=new Map;for(let O of E){let o=A.get(O)||0;A.set(O,o+1)}let t=[...A.values()].filter((O)=>O>1),f=this.classifyResult(t);return f===null?0:r[f]}classifyResult(r){if(r.length>2)throw new Error(`Unexpected number of repeats ${r.length}`);let[E,A]=r;if(E===void 0)return null;if(A===void 0){let t=aE[E];if(t===void 0)throw new Error(`Unexpected single diamond repeat count: ${E}`);return t}return E===3||A===3?"FULL_HOUSE":"TWO_PAIR"}}import Lr from"big.js";var nE;((A)=>{A.ABOVE="ABOVE";A.BELOW="BELOW"})(nE||={});var Wr=1e4,eE=(r)=>{let E=r.direction==="ABOVE"?Wr-r.selectedValue:r.selectedValue;return new Lr(E).div(Wr).mul(100)},rA=(r,E)=>r.direction==="ABOVE"?E>r.selectedValue:E<r.selectedValue;class EA extends N{constructor(){super("DICE")}determineGameResult({generator:r,edge:E,gameInputs:A}){let t=r.getRandomInt({min:0,max:1e4}),f=eE(A);return{isFinished:!0,payoutMultiplier:rA(A,t.value)?y.withWinChance(E,f):new Lr(0),outputs:{result:t.values},randomValues:t}}}import BA from"big.js";import{Guard as rr}from"@betorigami/guard";var Kr;((f)=>{f.CLASSIC="CLASSIC";f.LOW_RISK="LOW_RISK";f.MEDIUM_RISK="MEDIUM_RISK";f.HIGH_RISK="HIGH_RISK"})(Kr||={});var AA=[1,2,3,4,5,6,7,8,9,10],vr=(r)=>{return AA.includes(r)};var tA={[1]:{CLASSIC:[0,3.96],LOW_RISK:[0.7,1.85],MEDIUM_RISK:[0.4,2.75],HIGH_RISK:[0,3.96]},[2]:{CLASSIC:[0,1.9,4.5],LOW_RISK:[0,2,3.8],MEDIUM_RISK:[0,1.8,5.1],HIGH_RISK:[0,0,17.1]},[3]:{CLASSIC:[0,1,3.1,10.4],LOW_RISK:[0,1.1,1.38,26],MEDIUM_RISK:[0,0,2.8,50],HIGH_RISK:[0,0,0,81.5]},[4]:{CLASSIC:[0,0.8,1.8,5,22.5],LOW_RISK:[0,0,2.2,7.9,90],MEDIUM_RISK:[0,0,1.7,10,100],HIGH_RISK:[0,0,0,10,259]},[5]:{CLASSIC:[0,0.25,1.4,4.1,16.5,36],LOW_RISK:[0,0,1.5,4.2,13,300],MEDIUM_RISK:[0,0,1.4,4,14,390],HIGH_RISK:[0,0,0,4.5,48,450]},[6]:{CLASSIC:[0,0,1,3.68,7,16.5,40],LOW_RISK:[0,0,1.1,2,6.2,100,700],MEDIUM_RISK:[0,0,0,3,9,180,710],HIGH_RISK:[0,0,0,0,11,350,710]},[7]:{CLASSIC:[0,0,0.47,3,4.5,14,31,60],LOW_RISK:[0,0,1.1,1.6,3.5,15,225,700],MEDIUM_RISK:[0,0,0,2,7,30,400,800],HIGH_RISK:[0,0,0,0,7,90,400,800]},[8]:{CLASSIC:[0,0,0,2.2,4,13,22,55,70],LOW_RISK:[0,0,1.1,1.5,2,5.5,39,100,800],MEDIUM_RISK:[0,0,0,2,4,11,67,400,900],HIGH_RISK:[0,0,0,0,5,20,270,600,900]},[9]:{CLASSIC:[0,0,0,1.55,3,8,15,44,60,85],LOW_RISK:[0,0,1.1,1.3,1.7,2.5,7.5,50,250,1000],MEDIUM_RISK:[0,0,0,2,2.5,5,15,100,500,1000],HIGH_RISK:[0,0,0,0,4,11,56,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.4,2.25,4.5,8,17,50,80,100],LOW_RISK:[0,0,1.1,1.2,1.3,1.8,3.5,13,50,250,1000],MEDIUM_RISK:[0,0,0,1.6,2,4,7,26,100,500,1000],HIGH_RISK:[0,0,0,0,3.5,8,13,63,500,800,1000]}},fA={[1]:{CLASSIC:[0,3.92],LOW_RISK:[0.7,1.82],MEDIUM_RISK:[0.4,2.72],HIGH_RISK:[0,3.92]},[2]:{CLASSIC:[0,1.9,4.32],LOW_RISK:[0,2,3.65],MEDIUM_RISK:[0,1.8,5],HIGH_RISK:[0,0,17]},[3]:{CLASSIC:[0,1,3,10.7],LOW_RISK:[0,1.1,1.3,26.2],MEDIUM_RISK:[0,0,2.7,50.3],HIGH_RISK:[0,0,0,80.7]},[4]:{CLASSIC:[0,0.8,1.8,4.75,22.5],LOW_RISK:[0,0,2.2,7.65,90],MEDIUM_RISK:[0,0,1.7,9.8,100],HIGH_RISK:[0,0,0,9.75,259]},[5]:{CLASSIC:[0,0.2,1.4,4.25,16.4,36],LOW_RISK:[0,0,1.5,4.1,12.9,300],MEDIUM_RISK:[0,0,1.4,3.9,13.9,390],HIGH_RISK:[0,0,0,4.5,47,450]},[6]:{CLASSIC:[0,0,1,3.6,7,17,40],LOW_RISK:[0,0,1.1,2,5.8,100,700],MEDIUM_RISK:[0,0,0,3,8.6,180,710],HIGH_RISK:[0,0,0,0,10.6,350,710]},[7]:{CLASSIC:[0,0,0.5,3,4.1,13.7,31,60],LOW_RISK:[0,0,1.1,1.6,3.5,13.5,225,700],MEDIUM_RISK:[0,0,0,2,6.9,29.2,400,800],HIGH_RISK:[0,0,0,0,6.9,89.1,400,800]},[8]:{CLASSIC:[0,0,0,2.2,4,12.2,22,55,70],LOW_RISK:[0,0,1.1,1.5,2,4.8,38,100,800],MEDIUM_RISK:[0,0,0,2,4,10.4,66,400,900],HIGH_RISK:[0,0,0,0,4.9,19.8,270,600,900]},[9]:{CLASSIC:[0,0,0,1.5,3,8.1,15,45,60,85],LOW_RISK:[0,0,1.1,1.3,1.7,2.1,7.4,50,250,1000],MEDIUM_RISK:[0,0,0,2,2.5,4.6,15.2,100,500,1000],HIGH_RISK:[0,0,0,0,4,10.7,55.4,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.4,2.2,4.5,7.6,16,50,80,100],LOW_RISK:[0,0,1.1,1.2,1.3,1.6,3.7,13,50,250,1000],MEDIUM_RISK:[0,0,0,1.6,2,3.8,6.8,26,100,500,1000],HIGH_RISK:[0,0,0,0,3.5,7.8,12.8,63,500,800,1000]}},OA={[1]:{CLASSIC:[0,3.88],LOW_RISK:[0.7,1.78],MEDIUM_RISK:[0.4,2.68],HIGH_RISK:[0,3.88]},[2]:{CLASSIC:[0,1.85,4.48],LOW_RISK:[0,2,3.48],MEDIUM_RISK:[0,1.8,4.8],HIGH_RISK:[0,0,16.8]},[3]:{CLASSIC:[0,1,3,9.9],LOW_RISK:[0,1.1,1.2,26.5],MEDIUM_RISK:[0,0,2.65,50],HIGH_RISK:[0,0,0,79.9]},[4]:{CLASSIC:[0,0.8,1.7,5,23],LOW_RISK:[0,0,2.1,7.95,90],MEDIUM_RISK:[0,0,1.7,9.55,100],HIGH_RISK:[0,0,0,9.5,259]},[5]:{CLASSIC:[0,0.2,1.4,4.1,16.6,36],LOW_RISK:[0,0,1.5,4,12.7,300],MEDIUM_RISK:[0,0,1.4,3.8,13.7,390],HIGH_RISK:[0,0,0,4.4,46.9,450]},[6]:{CLASSIC:[0,0,1,3.6,6.6,16.5,40],LOW_RISK:[0,0,1.1,1.9,5.9,100,700],MEDIUM_RISK:[0,0,0,2.9,8.7,180,710],HIGH_RISK:[0,0,0,0,10.8,342,710]},[7]:{CLASSIC:[0,0,0.5,2.9,4.3,13.5,30.4,60],LOW_RISK:[0,0,1.1,1.6,3.1,14.8,225,700],MEDIUM_RISK:[0,0,0,2,6.7,29,400,800],HIGH_RISK:[0,0,0,0,6.8,88.2,400,800]},[8]:{CLASSIC:[0,0,0,2.2,3.8,12.7,21,54,70],LOW_RISK:[0,0,1.1,1.5,1.8,5.2,38,100,800],MEDIUM_RISK:[0,0,0,2,3.8,10.8,66,400,900],HIGH_RISK:[0,0,0,0,4.9,19.5,265,600,900]},[9]:{CLASSIC:[0,0,0,1.5,2.9,8.2,15,43,60,85],LOW_RISK:[0,0,1.1,1.3,1.6,2.1,7.7,49,250,1000],MEDIUM_RISK:[0,0,0,2,2.4,4.7,15,98,500,1000],HIGH_RISK:[0,0,0,0,3.9,10.8,55,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.4,2.2,4.2,8,16.7,50,80,100],LOW_RISK:[0,0,1.1,1.2,1.3,1.5,2.9,12,50,250,1000],MEDIUM_RISK:[0,0,0,1.6,2,3.6,6.6,26,100,500,1000],HIGH_RISK:[0,0,0,0,3.4,7.9,12.9,62,500,800,1000]}},oA={[1]:{CLASSIC:[0,3.88],LOW_RISK:[0.68,1.84],MEDIUM_RISK:[0.38,2.74],HIGH_RISK:[0,3.88]},[2]:{CLASSIC:[0,1.85,4.48],LOW_RISK:[0,1.96,3.75],MEDIUM_RISK:[0,1.77,5],HIGH_RISK:[0,0,16.82]},[3]:{CLASSIC:[0,1,3.05,9.35],LOW_RISK:[0,1.07,1.37,25.7],MEDIUM_RISK:[0,0,2.74,49],HIGH_RISK:[0,0,0,79.9]},[4]:{CLASSIC:[0,0.8,1.72,4.95,22.3],LOW_RISK:[0,0,2.15,7.86,87],MEDIUM_RISK:[0,0,1.67,9.7,100],HIGH_RISK:[0,0,0,9.7,256]},[5]:{CLASSIC:[0,0.24,1.38,4,16.3,35.5],LOW_RISK:[0,0,1.48,4.1,12.43,300],MEDIUM_RISK:[0,0,1.35,3.96,13.8,389],HIGH_RISK:[0,0,0,4.4,47,444]},[6]:{CLASSIC:[0,0,1,3.57,6.8,16.2,37],LOW_RISK:[0,0,1.06,1.96,6.16,99,700],MEDIUM_RISK:[0,0,0,2.9,8.9,178,709],HIGH_RISK:[0,0,0,0,10.4,347,709]},[7]:{CLASSIC:[0,0,0.45,2.95,4.44,13.85,30,60],LOW_RISK:[0,0,1.07,1.57,3.47,14.57,225,700],MEDIUM_RISK:[0,0,0,1.95,6.8,29.8,400,800],HIGH_RISK:[0,0,0,0,6.8,88.2,400,800]},[8]:{CLASSIC:[0,0,0,2.15,3.9,12.9,21.9,55,70],LOW_RISK:[0,0,1.08,1.45,1.98,5.48,38.8,100,800],MEDIUM_RISK:[0,0,0,1.95,3.96,10.6,66.9,396,896],HIGH_RISK:[0,0,0,0,4.9,19.2,269,599,896]},[9]:{CLASSIC:[0,0,0,1.5,2.95,7.96,14.96,44,60,85],LOW_RISK:[0,0,1.05,1.29,1.69,2.49,7.49,49,250,1000],MEDIUM_RISK:[0,0,0,1.95,2.47,4.9,14.9,99,500,1000],HIGH_RISK:[0,0,0,0,3.96,10.5,55,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.37,2.2,4.45,7.7,16.7,50,80,100],LOW_RISK:[0,0,1.08,1.18,1.28,1.76,3.4,12.9,50,250,1000],MEDIUM_RISK:[0,0,0,1.57,1.95,3.96,6.9,25.5,100,500,1000],HIGH_RISK:[0,0,0,0,3.43,7.9,12.5,60,500,800,1000]}},xA={[1]:{CLASSIC:[0,3.68],LOW_RISK:[0.7,1.58],MEDIUM_RISK:[0.4,2.48],HIGH_RISK:[0,3.68]},[2]:{CLASSIC:[0,1.72,4.48],LOW_RISK:[0,1.9,3.28],MEDIUM_RISK:[0,1.7,4.62],HIGH_RISK:[0,0,15.95]},[3]:{CLASSIC:[0,0.9,2.95,9.9],LOW_RISK:[0,1,1.2,26],MEDIUM_RISK:[0,0,2.29,50],HIGH_RISK:[0,0,0,75.7]},[4]:{CLASSIC:[0,0.8,1.6,4.4,21],LOW_RISK:[0,0,2,7.5,86],MEDIUM_RISK:[0,0,1.5,9.5,98],HIGH_RISK:[0,0,0,9,246]},[5]:{CLASSIC:[0,0.2,1.2,4.2,16.3,37],LOW_RISK:[0,0,1.4,3.8,12,300],MEDIUM_RISK:[0,0,1.3,3.5,14,385],HIGH_RISK:[0,0,0,4,45,450]},[6]:{CLASSIC:[0,0,1,3.3,6.2,15,40],LOW_RISK:[0,0,1.1,1.7,4.9,99,700],MEDIUM_RISK:[0,0,0,2.6,8.5,177,705],HIGH_RISK:[0,0,0,0,10,327,710]},[7]:{CLASSIC:[0,0,0.4,2.8,4.2,14.5,30,60],LOW_RISK:[0,0,1.1,1.4,3,14,210,700],MEDIUM_RISK:[0,0,0,1.8,6.4,29,400,800],HIGH_RISK:[0,0,0,0,6.1,85,400,800]},[8]:{CLASSIC:[0,0,0,2,3.7,13,20,50,70],LOW_RISK:[0,0,1.1,1.4,1.6,4.6,35,90,800],MEDIUM_RISK:[0,0,0,1.9,3.5,10.5,65,400,900],HIGH_RISK:[0,0,0,0,4.5,18,265,600,900]},[9]:{CLASSIC:[0,0,0,1.4,2.6,9,11.5,40,60,85],LOW_RISK:[0,0,1,1.3,1.5,2,7,45,250,1000],MEDIUM_RISK:[0,0,0,2,2.1,4,15,98,500,1000],HIGH_RISK:[0,0,0,0,3.5,10.5,55,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.3,2,4.4,8,16.7,50,80,100],LOW_RISK:[0,0,1,1.2,1.25,1.4,2,10,50,250,1000],MEDIUM_RISK:[0,0,0,1.5,1.9,3.5,6.2,26,100,500,1000],HIGH_RISK:[0,0,0,0,3,8,14,57,500,800,1000]}},gr=new V(new Map([[1,tA],[2,fA],[3,OA],[4,oA],[8,xA]]));class DA extends N{constructor(){super("KENO")}determineGameResult({generator:r,edge:E,gameInputs:A}){rr.againstEmptyArray(A.selectedNumbers,()=>B.createValidationError("No numbers selected")),rr.against(A.selectedNumbers.length>10,()=>B.createValidationError("Maximum of 10 numbers can be selected"));for(let Z of A.selectedNumbers)rr.againstNonInteger(Z,()=>B.createValidationError("Only integers can be selected")),rr.against(Z<0||Z>39,()=>B.createValidationError("Invalid number selected"));let t=r.getUniqueRandomInts({min:0,max:39,count:10}),f=A.selectedNumbers.filter((Z)=>t.values.includes(Z)),O=A.selectedNumbers.length;if(!vr(O))throw new Error(`Invalid tile count: ${O}`);let c=gr.getMultipliers(E)[O][A.riskLevel][f.length];if(c===void 0)throw new Error(`No multiplier found for matching tile count ${f.length}`);return{isFinished:!0,payoutMultiplier:new BA(c),outputs:{result:t.values},randomValues:t}}}import P from"big.js";var lr=(r,E)=>{return r.gt(E)?r:E};var kr=(r,E)=>{return r.lt(E)?r:E};class ZA extends N{constructor(){super("LIMBO")}determineGameResult({generator:r,edge:E,gameInputs:A}){let t=r.getRandomInt({min:1,max:4294967295}),f=t.max,O=new P(16777216),o=new P(1),x=new P(1e6),D=t.value,c=new P(D-1).div(f),S=(100-E)/100,Z=O.div(c.mul(O).plus(1)).mul(S),w=lr(o,kr(Z,x));return{isFinished:!0,payoutMultiplier:w.gte(A.targetMultiplier)?new P(A.targetMultiplier):new P(0),outputs:{randomMultiplier:w,result:t.values},randomValues:t}}}import Er from"big.js";var hr=(r,E)=>{if(E<0||r<0||E>r)throw new Error("Invalid input: ensure 0 ≤ r ≤ n and n ≥ 0.");if(E>r-E)E=r-E;let A=1;for(let t=1;t<=E;t++)A=A*(r-t+1)/t;return A};class SA extends N{constructor(){super("MINES")}determineGameResult({generator:r,edge:E,gameInputs:A}){if(A.minesCount<=0||A.minesCount>24)throw new Error("Must select between 1 and 24 mines.");if(A.selectedTiles.length>25-A.minesCount)throw new Error("Cannot select more tiles than available safe tiles (total tiles minus mines).");let o=r.getUniqueRandomInts({min:1,max:25,count:A.minesCount}),x=o.values.some((p)=>A.selectedTiles.includes(p)),D=A.hasCashedOut||x,c=(100-E)/100,S=new Er(hr(25-A.minesCount,A.selectedTiles.length)).div(new Er(hr(25,A.selectedTiles.length))),w=A.hasCashedOut&&!x?new Er(c).div(S):new Er(0);return{isFinished:D,payoutMultiplier:w,outputs:{result:o.values},randomValues:o}}}import{Big as UA}from"big.js";var ar;((t)=>{t.LOW_RISK="LOW_RISK";t.MEDIUM_RISK="MEDIUM_RISK";t.HIGH_RISK="HIGH_RISK"})(ar||={});var i2=[8,9,10,11,12,13,14,15,16],NA={LOW_RISK:{8:[6,2.1,1.1,1,0.5,1,1.1,2.1,6],9:[6,2,1.6,1,0.7,0.7,1,1.6,2,6],10:[9,3,1.4,1.1,1,0.5,1,1.1,1.4,3,9],11:[8,3,1.9,1.3,1,0.7,0.7,1,1.3,1.9,3,8],12:[10,3,1.6,1.4,1.1,1,0.5,1,1.1,1.4,1.6,3,10],13:[8,4,3,1.9,1.2,0.9,0.7,0.7,0.9,1.2,1.9,3,4,8],14:[7,4,1.9,1.4,1.3,1.1,1,0.5,1,1.1,1.3,1.4,1.9,4,7],15:[15,8,3,2,1.5,1.1,1,0.7,0.7,1,1.1,1.5,2,3,8,15],16:[16,9,2,1.4,1.4,1.2,1.1,1,0.5,1,1.1,1.2,1.4,1.4,2,9,16]},MEDIUM_RISK:{8:[13,3,1.3,0.7,0.4,0.7,1.3,3,13],9:[18,4,1.7,0.9,0.5,0.5,0.9,1.7,4,18],10:[22,5,2,1.4,0.6,0.4,0.6,1.4,2,5,22],11:[24,6,3,1.8,0.7,0.5,0.5,0.7,1.8,3,6,24],12:[33,11,4,2,1.1,0.6,0.3,0.6,1.1,2,4,11,33],13:[43,13,6,3,1.3,0.7,0.4,0.4,0.7,1.3,3,6,13,43],14:[58,15,7,4,1.9,1,0.5,0.2,0.5,1,1.9,4,7,15,58],15:[88,18,11,5,3,1.3,0.5,0.3,0.3,0.5,1.3,3,5,11,18,88],16:[110,41.1,10,5,3,1.5,1,0.5,0.3,0.5,1,1.5,3,5,10,41.1,110]},HIGH_RISK:{8:[29,4,1.5,0.3,0.2,0.3,1.5,4,29],9:[43,7,2,0.6,0.2,0.2,0.6,2,7,43],10:[76,10,3,0.9,0.3,0.2,0.3,0.9,3,10,76],11:[120,13.9,5.2,1.4,0.4,0.2,0.2,0.4,1.4,5.2,13.9,120],12:[170,23.8,8.1,2,0.7,0.2,0.2,0.2,0.7,2,8.1,23.8,170],13:[260,36.7,11,4,1,0.2,0.2,0.2,0.2,1,4,11,36.7,260],14:[420,56.1,18,5,1.9,0.3,0.2,0.2,0.2,0.3,1.9,5,18,56.1,420],15:[620,82.8,27,8,3,0.5,0.2,0.2,0.2,0.2,0.5,3,8,27,82.8,620],16:[1000,129.9,26.1,9,4,2,0.2,0.2,0.2,0.2,0.2,2,4,9,26.1,129.9,1000]}},cA={LOW_RISK:{8:[6,1.9,1.1,1,0.5,1,1.1,1.9,6],9:[6,1.7,1.6,1,0.7,0.7,1,1.6,1.7,6],10:[9,2.5,1.4,1.1,1,0.5,1,1.1,1.4,2.5,9],11:[9,2.5,1.8,1.3,1,0.7,0.7,1,1.3,1.8,2.5,9],12:[10,3.2,1.6,1.3,1.1,1,0.5,1,1.1,1.3,1.6,3.2,10],13:[8,3.7,2.9,1.8,1.2,0.9,0.7,0.7,0.9,1.2,1.8,2.9,3.7,8],14:[7,4,1.8,1.2,1.3,1.1,1,0.5,1,1.1,1.3,1.2,1.8,4,7],15:[15,7.6,2.8,2,1.4,1.1,1,0.7,0.7,1,1.1,1.4,2,2.8,7.6,15],16:[16,9,1.7,1.2,1.3,1.2,1.1,1,0.5,1,1.1,1.2,1.3,1.2,1.7,9,16]},MEDIUM_RISK:{8:[13,3.2,1.4,0.6,0.4,0.6,1.4,3.2,13],9:[18,3.7,1.7,0.9,0.5,0.5,0.9,1.7,3.7,18],10:[22,5,1.9,1.4,0.6,0.4,0.6,1.4,1.9,5,22],11:[24,6,2.8,1.8,0.7,0.5,0.5,0.7,1.8,2.8,6,24],12:[33,11.1,4,1.9,1.1,0.6,0.3,0.6,1.1,1.9,4,11.1,33],13:[43,13.7,6.1,2.8,1.3,0.7,0.4,0.4,0.7,1.3,2.8,6.1,13.7,43],14:[58,13.7,6.7,3.9,1.9,1,0.5,0.2,0.5,1,1.9,3.9,6.7,13.7,58],15:[88,17.7,10.8,5,2.9,1.3,0.5,0.3,0.3,0.5,1.3,2.9,5,10.8,17.7,88],16:[110,40.5,9.8,4.8,2.9,1.5,1,0.5,0.3,0.5,1,1.5,2.9,4.8,9.8,40.5,110]},HIGH_RISK:{8:[29,3.8,1.5,0.3,0.2,0.3,1.5,3.8,29],9:[43,7.1,1.9,0.6,0.2,0.2,0.6,1.9,7.1,43],10:[76,9.9,2.9,0.9,0.3,0.2,0.3,0.9,2.9,9.9,76],11:[120,13.4,5.1,1.4,0.4,0.2,0.2,0.4,1.4,5.1,13.4,120],12:[170,23.2,7.9,2,0.7,0.2,0.2,0.2,0.7,2,7.9,23.2,170],13:[260,36.6,10.5,4,1,0.2,0.2,0.2,0.2,1,4,10.5,36.6,260],14:[420,55.5,17.6,4.9,1.9,0.3,0.2,0.2,0.2,0.3,1.9,4.9,17.6,55.5,420],15:[620,82.3,26.8,7.7,3,0.5,0.2,0.2,0.2,0.2,0.5,3,7.7,26.8,82.3,620],16:[1000,129.8,25.2,8.6,4,2,0.2,0.2,0.2,0.2,0.2,2,4,8.6,25.2,129.8,1000]}},_A={LOW_RISK:{8:[6,2.2,1.1,1,0.4,1,1.1,2.2,6],9:[6,1.8,1.5,1,0.7,0.7,1,1.5,1.8,6],10:[9,2.4,1.3,1.1,1,0.5,1,1.1,1.3,2.4,9],11:[8,2.7,1.9,1.2,1,0.7,0.7,1,1.2,1.9,2.7,8],12:[10,3.3,1.6,1.2,1.1,1,0.5,1,1.1,1.2,1.6,3.3,10],13:[8,3.8,2.9,1.9,1.1,0.9,0.7,0.7,0.9,1.1,1.9,2.9,3.8,8],14:[7,3.9,2,1.4,1.3,1.1,1,0.4,1,1.1,1.3,1.4,2,3.9,7],15:[15,7.9,2.5,2,1.3,1.1,1,0.7,0.7,1,1.1,1.3,2,2.5,7.9,15],16:[16,8.9,1.9,1.4,1.4,1.2,1.1,1,0.4,1,1.1,1.2,1.4,1.4,1.9,8.9,16]},MEDIUM_RISK:{8:[13,3.5,1.2,0.7,0.3,0.7,1.2,3.5,13],9:[18,3.8,1.6,0.9,0.5,0.5,0.9,1.6,3.8,18],10:[22,5.2,2,1.3,0.6,0.4,0.6,1.3,2,5.2,22],11:[24,5.6,2.7,1.8,0.7,0.5,0.5,0.7,1.8,2.7,5.6,24],12:[33,11.3,4,1.8,1.1,0.6,0.3,0.6,1.1,1.8,4,11.3,33],13:[43,12.9,5.7,2.8,1.3,0.7,0.4,0.4,0.7,1.3,2.8,5.7,12.9,43],14:[58,13.7,6.9,3.9,1.8,1,0.5,0.2,0.5,1,1.8,3.9,6.9,13.7,58],15:[88,18,10.9,4.9,2.8,1.3,0.5,0.3,0.3,0.5,1.3,2.8,4.9,10.9,18,88],16:[110,39.9,9.9,5,2.9,1.4,1,0.5,0.3,0.5,1,1.4,2.9,5,9.9,39.9,110]},HIGH_RISK:{8:[29,4,1.4,0.3,0.2,0.3,1.4,4,29],9:[43,7.3,2,0.5,0.2,0.2,0.5,2,7.3,43],10:[76,9.8,2.8,0.9,0.3,0.2,0.3,0.9,2.8,9.8,76],11:[120,13.5,4.9,1.4,0.4,0.2,0.2,0.4,1.4,4.9,13.5,120],12:[170,23.3,7.9,1.9,0.7,0.2,0.2,0.2,0.7,1.9,7.9,23.3,170],13:[260,36.2,10.4,3.9,1,0.2,0.2,0.2,0.2,1,3.9,10.4,36.2,260],14:[420,54.8,17.9,4.9,1.8,0.3,0.2,0.2,0.2,0.3,1.8,4.9,17.9,54.8,420],15:[620,81.9,26.6,7.7,2.9,0.5,0.2,0.2,0.2,0.2,0.5,2.9,7.7,26.6,81.9,620],16:[1000,130,24.9,8.4,3.9,2,0.2,0.2,0.2,0.2,0.2,2,3.9,8.4,24.9,130,1000]}},CA={LOW_RISK:{8:[6,2,1.1,1,0.4,1,1.1,2,6],9:[6,1.9,1.4,1,0.7,0.7,1,1.4,1.9,6],10:[9,2.8,1.1,1.1,1,0.5,1,1.1,1.1,2.8,9],11:[8,2.7,1.7,1.2,1,0.7,0.7,1,1.2,1.7,2.7,8],12:[10,2.7,1.4,1.2,1.1,1,0.5,1,1.1,1.2,1.4,2.7,10],13:[8,3.5,2.8,1.9,1.3,0.9,0.6,0.6,0.9,1.3,1.9,2.8,3.5,8],14:[7,3.3,1.6,1.3,1.3,1.1,1,0.4,1,1.1,1.3,1.3,1.6,3.3,7],15:[15,8,2.9,2,1.4,1.2,1,0.6,0.6,1,1.2,1.4,2,2.9,8,15],16:[16,9.1,2.2,1.4,1.2,1.2,1.1,1,0.4,1,1.1,1.2,1.2,1.4,2.2,9.1,16]},MEDIUM_RISK:{8:[13,2.9,1.2,0.7,0.4,0.7,1.2,2.9,13],9:[18,3.5,1.6,0.9,0.5,0.5,0.9,1.6,3.5,18],10:[22,4.7,2,1.3,0.6,0.4,0.6,1.3,2,4.7,22],11:[24,5.7,2.5,1.8,0.7,0.5,0.5,0.7,1.8,2.5,5.7,24],12:[33,10.7,3.8,1.8,1.1,0.6,0.3,0.6,1.1,1.8,3.8,10.7,33],13:[43,12.6,5.6,2.7,1.3,0.7,0.4,0.4,0.7,1.3,2.7,5.6,12.6,43],14:[58,13.7,6.4,3.8,1.8,1,0.5,0.2,0.5,1,1.8,3.8,6.4,13.7,58],15:[88,17.7,10.7,4.9,2.7,1.3,0.5,0.3,0.3,0.5,1.3,2.7,4.9,10.7,17.7,88],16:[110,39.7,9.6,4.8,2.8,1.4,1,0.5,0.3,0.5,1,1.4,2.8,4.8,9.6,39.7,110]},HIGH_RISK:{8:[29,3.9,1.4,0.3,0.2,0.3,1.4,3.9,29],9:[43,6.9,1.8,0.6,0.2,0.2,0.6,1.8,6.9,43],10:[76,9.8,2.7,0.9,0.3,0.2,0.3,0.9,2.7,9.8,76],11:[120,13.1,5.1,1.3,0.4,0.2,0.2,0.4,1.3,5.1,13.1,120],12:[170,22.7,7.7,1.9,0.7,0.2,0.2,0.2,0.7,1.9,7.7,22.7,170],13:[260,35.9,10.3,3.8,1,0.2,0.2,0.2,0.2,1,3.8,10.3,35.9,260],14:[420,54.2,17.5,4.8,1.8,0.3,0.2,0.2,0.2,0.3,1.8,4.8,17.5,54.2,420],15:[620,80.6,26.1,7.8,2.8,0.5,0.2,0.2,0.2,0.2,0.5,2.8,7.8,26.1,80.6,620],16:[1000,129.7,24.7,8.2,3.8,2,0.2,0.2,0.2,0.2,0.2,2,3.8,8.2,24.7,129.7,1000]}},TA={LOW_RISK:{8:[5,1.8,1,1,0.4,1,1,1.8,5],9:[5,1.7,1.2,1,0.7,0.7,1,1.2,1.7,5],10:[9,2.8,1.2,1,1,0.4,1,1,1.2,2.8,9],11:[8,2.5,1.6,1,1,0.7,0.7,1,1,1.6,2.5,8],12:[10,2.5,1.3,1.3,1,1,0.4,1,1,1.3,1.3,2.5,10],13:[8,4.1,2.8,1.8,1.1,0.9,0.6,0.6,0.9,1.1,1.8,2.8,4.1,8],14:[7,3.3,1.7,1.2,1.2,1,1,0.4,1,1,1.2,1.2,1.7,3.3,7],15:[15,7.3,2.9,1.9,1.4,1,1,0.6,0.6,1,1,1.4,1.9,2.9,7.3,15],16:[16,8.7,2,1.5,1.3,1,1.1,1,0.3,1,1.1,1,1.3,1.5,2,8.7,16]},MEDIUM_RISK:{8:[13,2.6,1.1,0.7,0.4,0.7,1.1,2.6,13],9:[17,3.3,1.4,0.9,0.5,0.5,0.9,1.4,3.3,17],10:[21,4.1,1.7,1.3,0.6,0.4,0.6,1.3,1.7,4.1,21],11:[23,5.6,2.4,1.6,0.7,0.5,0.5,0.7,1.6,2.4,5.6,23],12:[32,10.2,3.7,1.7,1.1,0.6,0.2,0.6,1.1,1.7,3.7,10.2,32],13:[42,11.7,5.3,2.5,1.2,0.7,0.4,0.4,0.7,1.2,2.5,5.3,11.7,42],14:[56,13.2,5.9,3.6,1.6,1,0.5,0.2,0.5,1,1.6,3.6,5.9,13.2,56],15:[86,17.3,10,4.6,2.6,1.2,0.5,0.3,0.3,0.5,1.2,2.6,4.6,10,17.3,86],16:[107,39,9.9,4.5,2.4,1.3,1,0.5,0.3,0.5,1,1.3,2.4,4.5,9.9,39,107]},HIGH_RISK:{8:[28,3.3,1.4,0.3,0.2,0.3,1.4,3.3,28],9:[42,6.7,1.6,0.6,0.2,0.2,0.6,1.6,6.7,42],10:[74,9.6,2.6,0.9,0.3,0.1,0.3,0.9,2.6,9.6,74],11:[116,12.7,4.8,1.2,0.4,0.2,0.2,0.4,1.2,4.8,12.7,116],12:[165,20.9,7.2,1.8,0.7,0.2,0.2,0.2,0.7,1.8,7.2,20.9,165],13:[252,33.9,10.1,3.4,1,0.2,0.2,0.2,0.2,1,3.4,10.1,33.9,252],14:[407,51.9,16.3,4.6,1.7,0.3,0.2,0.2,0.2,0.3,1.7,4.6,16.3,51.9,407],15:[600,76.9,24.9,7.4,2.6,0.5,0.2,0.2,0.2,0.2,0.5,2.6,7.4,24.9,76.9,600],16:[1000,122,24.5,8,3.7,1.8,0.2,0.2,0.2,0.2,0.2,1.8,3.7,8,24.5,122,1000]}},sr=new V(new Map([[1,NA],[2,cA],[3,_A],[4,CA],[8,TA]]));class GA extends N{constructor(){super("PLINKO")}determineGameResult({generator:r,gameInputs:E,edge:A}){if(E.numberOfRows%1>0)throw new Error("Number of rows must be an integer");if(E.numberOfRows<8||E.numberOfRows>16)throw new Error("Number of rows must be between 8 and 16");let t=E.numberOfRows,o=sr.getMultipliers(A)[E.riskLevel][t],x=r.getRandomIntsWithReplacement({min:0,max:1,count:E.numberOfRows}),c=x.values.reduce((Z,w)=>Z+w,0),S=o[c];if(S===void 0)throw new Error(`No payout found for end position ${c}`);return{isFinished:!0,payoutMultiplier:UA(S),outputs:{result:x.values},randomValues:x}}}import{Big as fr}from"big.js";var Vr=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36],nr=[37,...Vr],er=[[0,1],[0,2],[0,3],[1,2],[1,4],[2,3],[2,5],[3,6],[4,5],[4,7],[5,6],[5,8],[6,9],[7,8],[7,10],[8,9],[8,11],[9,12],[10,11],[10,13],[11,12],[11,14],[12,15],[13,14],[13,16],[14,15],[14,17],[15,18],[16,17],[16,19],[17,18],[17,20],[18,21],[19,20],[19,22],[20,21],[20,23],[21,24],[22,23],[22,25],[23,24],[23,26],[24,27],[25,26],[25,28],[26,27],[26,29],[27,30],[28,29],[28,31],[29,30],[29,32],[30,33],[31,32],[31,34],[32,33],[32,35],[33,36],[34,35],[35,36]],rE=[[0,1],[0,37],[3,37],[1,2],[1,4],[2,3],[2,5],[3,6],[4,5],[4,7],[5,6],[5,8],[6,9],[7,8],[7,10],[8,9],[8,11],[9,12],[10,11],[10,13],[11,12],[11,14],[12,15],[13,14],[13,16],[14,15],[14,17],[15,18],[16,17],[16,19],[17,18],[17,20],[18,21],[19,20],[19,22],[20,21],[20,23],[21,24],[22,23],[22,25],[23,24],[23,26],[24,27],[25,26],[25,28],[26,27],[26,29],[27,30],[28,29],[28,31],[29,30],[29,32],[30,33],[31,32],[31,34],[32,33],[32,35],[33,36],[34,35],[35,36]],EE=[[0,1,2],[0,2,3],[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18],[19,20,21],[22,23,24],[25,26,27],[28,29,30],[31,32,33],[34,35,36]],AE=[[0,1,2],[0,2,37],[1,2,3],[2,3,37],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18],[19,20,21],[22,23,24],[25,26,27],[28,29,30],[31,32,33],[34,35,36]],tE=[[0,1,2,3],[1,2,4,5],[2,3,5,6],[4,5,7,8],[5,6,8,9],[7,8,10,11],[8,9,11,12],[10,11,13,14],[11,12,14,15],[13,14,16,17],[14,15,17,18],[16,17,19,20],[17,18,20,21],[19,20,22,23],[20,21,23,24],[22,23,25,26],[23,24,26,27],[25,26,28,29],[26,27,29,30],[28,29,31,32],[29,30,32,33],[31,32,34,35],[32,33,35,36]],fE=[[1,2,4,5],[2,3,5,6],[4,5,7,8],[5,6,8,9],[7,8,10,11],[8,9,11,12],[10,11,13,14],[11,12,14,15],[13,14,16,17],[14,15,17,18],[16,17,19,20],[17,18,20,21],[19,20,22,23],[20,21,23,24],[22,23,25,26],[23,24,26,27],[25,26,28,29],[26,27,29,30],[28,29,31,32],[29,30,32,33],[31,32,34,35],[32,33,35,36]],OE=[0,1,2,3,37],oE=[[1,2,3,4,5,6],[4,5,6,7,8,9],[7,8,9,10,11,12],[10,11,12,13,14,15],[13,14,15,16,17,18],[16,17,18,19,20,21],[19,20,21,22,23,24],[22,23,24,25,26,27],[25,26,27,28,29,30],[28,29,30,31,32,33],[31,32,33,34,35,36]],xE=[[1,2,3,4,5,6],[4,5,6,7,8,9],[7,8,9,10,11,12],[10,11,12,13,14,15],[13,14,15,16,17,18],[16,17,18,19,20,21],[19,20,21,22,23,24],[22,23,24,25,26,27],[25,26,27,28,29,30],[28,29,30,31,32,33],[31,32,33,34,35,36]],J;((A)=>{A.EVEN="EVEN";A.ODD="ODD"})(J||={});var R;((A)=>{A.RED="RED";A.BLACK="BLACK"})(R||={});var q;((A)=>{A.LOW="LOW";A.HIGH="HIGH"})(q||={});var Q;((t)=>{t.TOP="TOP";t.MIDDLE="MIDDLE";t.BOTTOM="BOTTOM"})(Q||={});var X;((t)=>{t.FIRST="FIRST";t.SECOND="SECOND";t.THIRD="THIRD"})(X||={});var yr;((A)=>{A.AMERICAN="AMERICAN";A.EUROPEAN="EUROPEAN"})(yr||={});var Ar=(r)=>{if(r.straightBets.length===0&&r.splitBets.length===0&&r.streetBets.length===0&&r.cornerBets.length===0&&r.doubleStreetBets.length===0&&r.parityBets.length===0&&r.colorBets.length===0&&r.halfBets.length===0&&r.columnBets.length===0&&r.dozenBets.length===0)throw B.createValidationError("Must place at least a single bet.");if(!r.straightBets.every((E)=>E.amount.gte(0)&&H(E.value)))throw B.createValidationError("Invalid straight bet.");if(!r.splitBets.every((E)=>E.amount.gte(0)&&MA(E.values)))throw B.createValidationError("Invalid split bet.");if(!r.streetBets.every((E)=>E.amount.gte(0)&&bA(E.values)))throw B.createValidationError("Invalid street bet.");if(!r.cornerBets.every((E)=>E.amount.gte(0)&&wA(E.values)))throw B.createValidationError("Invalid corner bet.");if(!r.doubleStreetBets.every((E)=>E.amount.gte(0)&&hA(E.values)))throw B.createValidationError("Invalid double street bet.");if(!r.parityBets.every((E)=>E.amount.gte(0)&&Object.values(J).includes(E.parity)))throw B.createValidationError("Invalid parity bet.");if(!r.colorBets.every((E)=>E.amount.gte(0)&&Object.values(R).includes(E.color)))throw B.createValidationError("Invalid color bet.");if(!r.halfBets.every((E)=>E.amount.gte(0)&&Object.values(q).includes(E.half)))throw B.createValidationError("Invalid half bet.");if(!r.columnBets.every((E)=>E.amount.gte(0)&&Object.values(Q).includes(E.column)))throw B.createValidationError("Invalid column bet.");if(!r.dozenBets.every((E)=>E.amount.gte(0)&&Object.values(X).includes(E.dozen)))throw B.createValidationError("Invalid dozen bet.")},H=(r)=>{return Vr.includes(r)},MA=(r)=>{if(r.length!==2)return!1;if(!r.every(H))return!1;return er.some(([E,A])=>E===r[0]&&A===r[1])},bA=(r)=>{if(r.length!==3)return!1;if(!r.every(H))return!1;return EE.some(([E,A,t])=>E===r[0]&&A===r[1]&&t===r[2])},wA=(r)=>{if(r.length!==4)return!1;if(!r.every(H))return!1;return tE.some(([E,A,t,f])=>E===r[0]&&A===r[1]&&t===r[2]&&f===r[3])},hA=(r)=>{if(r.length!==6)return!1;if(!r.every(H))return!1;return oE.some(([E,A,t,f,O,o])=>E===r[0]&&A===r[1]&&t===r[2]&&f===r[3]&&O===r[4]&&o===r[5])};var tr=(r)=>{if(r.straightBets.length===0&&r.splitBets.length===0&&r.streetBets.length===0&&r.cornerBets.length===0&&r.basketBets.length===0&&r.doubleStreetBets.length===0&&r.parityBets.length===0&&r.colorBets.length===0&&r.halfBets.length===0&&r.columnBets.length===0&&r.dozenBets.length===0)throw B.createValidationError("Must place at least a single bet.");if(!r.straightBets.every((E)=>E.amount.gte(0)&&m(E.value)))throw B.createValidationError("Invalid straight bet.");if(!r.splitBets.every((E)=>E.amount.gte(0)&&VA(E.values)))throw B.createValidationError("Invalid split bet.");if(!r.streetBets.every((E)=>E.amount.gte(0)&&yA(E.values)))throw B.createValidationError("Invalid street bet.");if(!r.cornerBets.every((E)=>E.amount.gte(0)&&YA(E.values)))throw B.createValidationError("Invalid corner bet.");if(!r.basketBets.every((E)=>E.amount.gte(0)))throw B.createValidationError("Invalid basket bet.");if(!r.doubleStreetBets.every((E)=>E.amount.gte(0)&&zA(E.values)))throw B.createValidationError("Invalid double street bet.");if(!r.parityBets.every((E)=>E.amount.gte(0)&&Object.values(J).includes(E.parity)))throw B.createValidationError("Invalid parity bet.");if(!r.colorBets.every((E)=>E.amount.gte(0)&&Object.values(R).includes(E.color)))throw B.createValidationError("Invalid color bet.");if(!r.halfBets.every((E)=>E.amount.gte(0)&&Object.values(q).includes(E.half)))throw B.createValidationError("Invalid half bet.");if(!r.columnBets.every((E)=>E.amount.gte(0)&&Object.values(Q).includes(E.column)))throw B.createValidationError("Invalid column bet.");if(!r.dozenBets.every((E)=>E.amount.gte(0)&&Object.values(X).includes(E.dozen)))throw B.createValidationError("Invalid dozen bet.")},m=(r)=>{return nr.includes(r)};function VA(r){if(r.length!==2)return!1;if(!r.every(m))return!1;return rE.some(([E,A])=>E===r[0]&&A===r[1])}var yA=(r)=>{if(r.length!==3)return!1;if(!r.every(m))return!1;return AE.some(([E,A,t])=>E===r[0]&&A===r[1]&&t===r[2])},YA=(r)=>{if(r.length!==4)return!1;if(!r.every(m))return!1;return fE.some(([E,A,t,f])=>E===r[0]&&A===r[1]&&t===r[2]&&f===r[3])},zA=(r)=>{if(r.length!==6)return!1;if(!r.every(m))return!1;return xE.some(([E,A,t,f,O,o])=>E===r[0]&&A===r[1]&&t===r[2]&&f===r[3]&&O===r[4]&&o===r[5])};var pA={straightBets:36,splitBets:18,streetBets:12,cornerBets:9,basketBets:7,doubleStreetBets:6,parityBets:2,colorBets:2,halfBets:2,columnBets:3,dozenBets:3},$A=[3,6,9,12,15,18,21,24,27,30,33,36],FA=[2,5,8,11,14,17,20,23,26,29,32,35],PA=[1,4,7,10,13,16,19,22,25,28,31,34],JA=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],RA=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35],qA=2.7,QA=5.3;class Yr extends N{constructor(){super("ROULETTE")}determineGameResult({generator:r,gameInputs:E}){this.validateInputs(E);let A=r.getRandomInt({min:0,max:this.maxNumber}),t=A.value,f=this.determineBetOutcomes(E,t),{payoutMultiplier:O}=this.getPayoutDetails(E,t);return{outputs:{betOutcomes:f,result:A.values},payoutMultiplier:O,isFinished:!0,randomValues:A}}getBetAmount(r){return this.calculateTotalBetAmount(this.getBetTotals(r))}getPayoutDetails(r,E){let A=this.determineBetOutcomes(r,E),t=this.getBetTotals(r),f=this.getBetTotals(A.winningBets),O=this.calculateTotalBetAmount(t),o=this.calculateTotalPayout(f);return{payoutMultiplier:O.gt(0)?o.div(O):new fr(0),payoutAmount:o}}determineBetOutcomes(r,E){let A={},t={};for(let f of Object.keys(r)){let O=r[f],o=this.betPredicates[f],{winning:x,losing:D}=this.partitionBets(O,o,E);A[f]=x,t[f]=D}return{winningBets:A,losingBets:t}}calculateTotalAmount(r){return r.reduce((E,A)=>E.plus(A.amount),new fr(0))}isWinningStraightBet(r,E){return r.value===E}isWinningSplitBet(r,E){return r.values.some((A)=>A===E)}isWinningStreetBet(r,E){return r.values.some((A)=>A===E)}isWinningCornerBet(r,E){return r.values.some((A)=>A===E)}isWinningDoubleStreetBet(r,E){return r.values.some((A)=>A===E)}isWinningColorBet(r,E){let A=r;return JA.includes(E)&&A.color==="RED"||RA.includes(E)&&A.color==="BLACK"}isWinningHalfBet(r,E){let A=r;if(E>0&&E<=18&&A.half==="LOW")return!0;if(E>18&&E<=36&&A.half==="HIGH")return!0;return!1}isWinningColumnBet(r,E){let A=r;return $A.includes(E)&&A.column==="TOP"||FA.includes(E)&&A.column==="MIDDLE"||PA.includes(E)&&A.column==="BOTTOM"}isWinningDozenBet(r,E){let A=r;if(E>0&&E<=12&&A.dozen==="FIRST")return!0;if(E>12&&E<=24&&A.dozen==="SECOND")return!0;if(E>24&&E<=36&&A.dozen==="THIRD")return!0;return!1}isWinningParityBet(r,E){let A=r;if(E===0||E===37)return!1;let t=E%2===0?"EVEN":"ODD";return A.parity===t}getBetTotals(r){let E={};for(let A of Object.keys(r))E[A]=this.calculateTotalAmount(r[A]);return E}calculateTotalBetAmount(r){return Object.values(r).reduce((E,A)=>E.plus(A),new fr(0))}partitionBets(r,E,A){return{winning:r.filter((t)=>E(t,A)),losing:r.filter((t)=>!E(t,A))}}calculateTotalPayout(r){return Object.entries(r).reduce((E,[A,t])=>{let O=pA[A];return E.plus(t.mul(O||0))},new fr(0))}}class BE extends Yr{maxNumber=36;betPredicates={straightBets:this.isWinningStraightBet,splitBets:this.isWinningSplitBet,streetBets:this.isWinningStreetBet,cornerBets:this.isWinningCornerBet,doubleStreetBets:this.isWinningDoubleStreetBet,parityBets:this.isWinningParityBet,colorBets:this.isWinningColorBet,halfBets:this.isWinningHalfBet,columnBets:this.isWinningColumnBet,dozenBets:this.isWinningDozenBet};validateInputs(r){Ar(r)}}class DE extends Yr{maxNumber=37;betPredicates={straightBets:this.isWinningStraightBet,splitBets:this.isWinningSplitBet,streetBets:this.isWinningStreetBet,cornerBets:this.isWinningCornerBet,basketBets:this.isWinningBasketBet,doubleStreetBets:this.isWinningDoubleStreetBet,parityBets:this.isWinningParityBet,colorBets:this.isWinningColorBet,halfBets:this.isWinningHalfBet,columnBets:this.isWinningColumnBet,dozenBets:this.isWinningDozenBet};validateInputs(r){tr(r)}isWinningBasketBet(r,E){return OE.some((A)=>A===E)}}class ZE extends N{europeanGame;americanGame;constructor(){super("ROULETTE");this.europeanGame=new BE,this.americanGame=new DE}getBetAmount(r){switch(r.type){case"AMERICAN":return this.americanGame.getBetAmount(r.inputs);case"EUROPEAN":return this.europeanGame.getBetAmount(r.inputs);default:throw new Error("Unhandled roulette type")}}determineGameResult(r){let{gameInputs:E,...A}=r;if(r.edge===qA&&E.type==="EUROPEAN"){let t=this.europeanGame.determineGameResult({...A,gameInputs:E.inputs}),{betOutcomes:f}=t.outputs;return{...t,outputs:{type:"european",betOutcomes:f,result:t.outputs.result}}}if(r.edge===QA&&E.type==="AMERICAN"){let t=this.americanGame.determineGameResult({...A,gameInputs:E.inputs}),{betOutcomes:f}=t.outputs;return{...t,outputs:{type:"american",betOutcomes:f,result:t.outputs.result}}}throw B.createValidationError(`Attempted to play ${E.type} roulette on edge ${r.edge}`)}}var Bt=(r)=>{return new ZE().getBetAmount(r)};var ct=(r)=>{if(r.type==="EUROPEAN")Ar(r.inputs);else tr(r.inputs)};import{Big as jA}from"big.js";var W;((t)=>{t.LOW_RISK="LOW_RISK";t.MEDIUM_RISK="MEDIUM_RISK";t.HIGH_RISK="HIGH_RISK"})(W||={});var L;((O)=>{O[O.TEN=10]="TEN";O[O.TWENTY=20]="TWENTY";O[O.THIRTY=30]="THIRTY";O[O.FORTY=40]="FORTY";O[O.FIFTY=50]="FIFTY"})(L||={});var XA={LOW_RISK:{10:{ZERO:0,A:1.2,B:1.5},20:{ZERO:0,A:1.2,B:1.5},30:{ZERO:0,A:1.2,B:1.5},40:{ZERO:0,A:1.2,B:1.5},50:{ZERO:0,A:1.2,B:1.5}},MEDIUM_RISK:{10:{ZERO:0,A:1.5,B:1.9,C:2,D:3},20:{ZERO:0,A:1.5,B:1.8,C:2,D:3},30:{ZERO:0,A:1.5,B:1.7,C:2,D:3,E:4},40:{ZERO:0,A:1.5,B:1.6,C:2,D:3},50:{ZERO:0,A:1.5,B:2,C:3,D:5}},HIGH_RISK:{10:{ZERO:0,A:9.9},20:{ZERO:0,A:19.8},30:{ZERO:0,A:29.7},40:{ZERO:0,A:39.6},50:{ZERO:0,A:49.5}}},uA={LOW_RISK:{10:{ZERO:0,A:1.2,B:1.4},20:{ZERO:0,A:1.2,B:1.4},30:{ZERO:0,A:1.2,B:1.4},40:{ZERO:0,A:1.2,B:1.4},50:{ZERO:0,A:1.2,B:1.4}},MEDIUM_RISK:{10:{ZERO:0,A:1.4,B:1.9,C:2,D:3.1},20:{ZERO:0,A:1.5,B:1.8,C:1.9,D:3.4},30:{ZERO:0,A:1.5,B:1.7,C:1.9,D:3,E:4.3},40:{ZERO:0,A:1.5,B:1.6,C:2,D:2.9},50:{ZERO:0,A:1.5,B:2,C:3,D:4.5}},HIGH_RISK:{10:{ZERO:0,A:9.8},20:{ZERO:0,A:19.6},30:{ZERO:0,A:29.4},40:{ZERO:0,A:39.2},50:{ZERO:0,A:49}}},IA={LOW_RISK:{10:{ZERO:0,A:1.15,B:1.65},20:{ZERO:0,A:1.15,B:1.65},30:{ZERO:0,A:1.15,B:1.65},40:{ZERO:0,A:1.15,B:1.65},50:{ZERO:0,A:1.15,B:1.65}},MEDIUM_RISK:{10:{ZERO:0,A:1.4,B:1.9,C:2,D:3},20:{ZERO:0,A:1.4,B:1.6,C:2,D:3},30:{ZERO:0,A:1.4,B:1.7,C:2,D:3,E:4},40:{ZERO:0,A:1.5,B:1.6,C:2,D:2.8},50:{ZERO:0,A:1.5,B:2,C:2.7,D:4.9}},HIGH_RISK:{10:{ZERO:0,A:9.7},20:{ZERO:0,A:19.4},30:{ZERO:0,A:29.1},40:{ZERO:0,A:38.8},50:{ZERO:0,A:48.5}}},dA={LOW_RISK:{10:{ZERO:0,A:1.15,B:1.55},20:{ZERO:0,A:1.15,B:1.55},30:{ZERO:0,A:1.15,B:1.55},40:{ZERO:0,A:1.15,B:1.55},50:{ZERO:0,A:1.15,B:1.55}},MEDIUM_RISK:{10:{ZERO:0,A:1.4,B:1.8,C:2,D:3},20:{ZERO:0,A:1.3,B:1.5,C:2,D:3},30:{ZERO:0,A:1.4,B:1.6,C:2,D:2.9,E:4},40:{ZERO:0,A:1.5,B:1.6,C:2,D:2.7},50:{ZERO:0,A:1.5,B:2,C:2.6,D:4.8}},HIGH_RISK:{10:{ZERO:0,A:9.6},20:{ZERO:0,A:19.2},30:{ZERO:0,A:28.8},40:{ZERO:0,A:38.4},50:{ZERO:0,A:48}}},iA={LOW_RISK:{10:{ZERO:0,A:1.1,B:1.5},20:{ZERO:0,A:1.1,B:1.5},30:{ZERO:0,A:1.1,B:1.45},40:{ZERO:0,A:1.1,B:1.45},50:{ZERO:0,A:1.1,B:1.45}},MEDIUM_RISK:{10:{ZERO:0,A:1.3,B:1.7,C:1.9,D:3},20:{ZERO:0,A:1.3,B:1.4,C:1.9,D:3},30:{ZERO:0,A:1.3,B:1.7,C:1.9,D:2.8,E:3.8},40:{ZERO:0,A:1.4,B:1.8,C:1.9,D:2.6},50:{ZERO:0,A:1.4,B:1.9,C:2.6,D:4.6}},HIGH_RISK:{10:{ZERO:0,A:9.2},20:{ZERO:0,A:18.4},30:{ZERO:0,A:27.6},40:{ZERO:0,A:36.8},50:{ZERO:0,A:46}}},SE=new V(new Map([[1,XA],[2,uA],[3,IA],[4,dA],[8,iA]]));var NE={LOW_RISK:{10:["B","A","A","A","ZERO","A","A","A","A","ZERO"],20:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"],30:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"],40:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"],50:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"]},MEDIUM_RISK:{10:["ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","D"],20:["A","ZERO","C","ZERO","B","ZERO","C","ZERO","C","ZERO","A","ZERO","C","ZERO","C","ZERO","D","ZERO","C","ZERO"],30:["A","ZERO","C","ZERO","A","ZERO","C","ZERO","D","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","C","ZERO","A","ZERO","C","ZERO","E","ZERO","A","ZERO","C","ZERO"],40:["C","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO","C","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO","C","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO"],50:["A","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","B","ZERO","A","ZERO","D","ZERO","A","ZERO","B","ZERO","A","ZERO"]},HIGH_RISK:{10:[...Array(9).fill("ZERO"),"A"],20:[...Array(19).fill("ZERO"),"A"],30:[...Array(29).fill("ZERO"),"A"],40:[...Array(39).fill("ZERO"),"A"],50:[...Array(49).fill("ZERO"),"A"]}};class HA extends N{constructor(){super("WHEEL")}determineGameResult({generator:r,gameInputs:E,edge:A}){if(!Object.values(L).includes(E.segments))throw new Error("Invalid segments value");if(!Object.values(W).includes(E.riskLevel))throw new Error("Invalid risk level");let f=SE.getMultipliers(A)[E.riskLevel];if(f===void 0)throw new Error(`No multipliers found for risk level ${E.riskLevel}`);let O=f[E.segments];if(O===void 0)throw new Error(`No multipliers found for segment ${E.segments}`);let o=NE[E.riskLevel];if(o===void 0)throw new Error(`No patterns found for risk level ${E.riskLevel}`);let x=o[E.segments];if(x===void 0)throw new Error(`No patterns found for segment ${E.segments}`);let D=r.getRandomInt({min:0,max:x.length-1}),c=x[D.value];if(c===void 0)throw new Error(`No pattern found for segment ${E.segments} and value ${D.value}`);let S=O[c];if(S===void 0)throw new Error(`No payout found for picked segment ${c}`);return{isFinished:!0,payoutMultiplier:new jA(S),outputs:{result:D.values},randomValues:D}}}export{ct as validateRouletteGameInputs,eA as validateAdvancedDiceInputs,tA as rtp99Multipliers,fA as rtp98Multipliers,OA as rtp97Multipliers,oA as rtp96Multipliers,xA as rtp92Multipliers,sr as plinkoMultipliers,hr as nCr,gr as kenoMultipliers,vr as isTileCount,rA as hasDiceWon,kE as diamondsMultipliers,Bt as calculateRouletteBetAmount,eE as calculateDiceWinChance,FE as calculateBaccaratBetAmount,$r as calculateAdvancedDiceWinChance,kr as bigMin,lr as bigMax,bE as advancedDiceIsWithinBoundsInclusive,or as advancedDiceIsWithinBoundsExclusive,wE as advancedDiceGetInclusiveBoundsRange,xr as advancedDiceGetExclusiveBoundsRange,L as WheelSegments,W as WheelRiskLevel,HA as Wheel,RE as WIN_MULTIPLIER,yE as VALID_SUITS,YE as VALID_RANKS,EE as VALID_EUROPEAN_STREETS,Vr as VALID_EUROPEAN_STRAIGHTS,er as VALID_EUROPEAN_SPLITS,oE as VALID_EUROPEAN_DOUBLE_STREETS,tE as VALID_EUROPEAN_CORNERS,AE as VALID_AMERICAN_STREETS,nr as VALID_AMERICAN_STRAIGHTS,rE as VALID_AMERICAN_SPLITS,xE as VALID_AMERICAN_DOUBLE_STREETS,fE as VALID_AMERICAN_CORNERS,$A as TOP_COLUMN,AA as TILE_COUNTS,g as SPLIT_BET_SIZE_FACTOR,yr as RouletteType,ZE as Roulette,hE as RollType,n as RandomValuePool,JA as RED_NUMBERS,Br as RANDOM_MIN_VALUE,Dr as RANDOM_MAX_VALUE,ar as PlinkoRiskLevel,GA as Plinko,J as Parity,qE as PUSH_MULTIPLIER,i2 as PLINKO_ROW_COUNTS,pA as PAYOUT_MULTIPLIERS,b as OrigamiGame,y as MultiplierCalculator,SA as Mines,CE as MIN_WIN_CHANCE,FA as MIDDLE_COLUMN,TE as MAX_WIN_CHANCE,_r as MAX_CARDS_PER_ROUND,ZA as Limbo,QE as LOSE_MULTIPLIER,Kr as KenoRiskLevel,DA as Keno,Sr as InsuranceOutcome,Pr as INSURANCE_WIN_PAYOUT,I as INSURANCE_BET_SIZE_FACTOR,o1 as INSURANCE_BET_MULTIPLIER,q as Half,_E as GameErrorCode,B as GameError,N as Game,Jr as FACE_CARD_VALUE,BE as EuropeanRoulette,qA as EUROPEAN_HOUSE_EDGE,zr as EFFECTIVE_RANGE,X as Dozen,nE as DiceDirection,EA as Dice,WE as DiamondsResultType,sE as Diamonds,Y as DOUBLE_DOWN_BET_SIZE_FACTOR,Wr as DICE_EFFECTIVE_RANGE,Fr as DEALER_STAND_VALUE,Q as Column,R as Color,x1 as CARDS_PER_SUIT,Zr as BlackjackOutcome,Nr as BlackjackActionType,HE as Blackjack,zE as BaccaratOutcome,pE as BaccaratBetType,PE as Baccarat,cr as BUST_VALUE,PA as BOTTOM_COLUMN,RA as BLACK_NUMBERS,F as BLACKJACK_VALUE,JE as BLACKJACK_MULTIPLIER,l as BASE_PAYOUT_MULTIPLIERS,DE as AmericanRoulette,VE as AdvancedDice,QA as AMERICAN_HOUSE_EDGE,OE as AMERICAN_BASKET,Cr as ACE_SOFT_BONUS};
|