@betorigami/game-calculations 4.4.5 → 5.0.0

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 CHANGED
@@ -1 +1 @@
1
- var G1=Object.create;var{getPrototypeOf:T1,defineProperty:H,getOwnPropertyNames:tE,getOwnPropertyDescriptor:M1}=Object,fE=Object.prototype.hasOwnProperty;var u=(r,E,A)=>{A=r!=null?G1(T1(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,b1=(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=M1(r,t))||A.enumerable}));return AE.set(r,E),E};var w1=(r,E)=>{for(var A in E)H(r,A,{get:E[A],enumerable:!0,configurable:!0,set:(t)=>E[A]=()=>t})};var f2={};w1(f2,{validateRouletteGameInputs:()=>n1,validateAdvancedDiceInputs:()=>y1,rtp99Multipliers:()=>gE,rtp98Multipliers:()=>lE,rtp97Multipliers:()=>kE,rtp96Multipliers:()=>sE,rtp92Multipliers:()=>aE,plinkoMultipliers:()=>mr,nCr:()=>Gr,kenoMultipliers:()=>Xr,isTileCount:()=>Qr,hasDiceWon:()=>LE,diamondsMultipliers:()=>iE,calculateRouletteBetAmount:()=>a1,calculateDiceWinChance:()=>WE,calculateBaccaratBetAmount:()=>UE,calculateAdvancedDiceWinChance:()=>Vr,bigMin:()=>jr,bigMax:()=>dr,advancedDiceIsWithinBoundsInclusive:()=>BE,advancedDiceIsWithinBoundsExclusive:()=>fr,advancedDiceGetInclusiveBoundsRange:()=>cE,advancedDiceGetExclusiveBoundsRange:()=>Or,WheelSegments:()=>i,WheelRiskLevel:()=>j,Wheel:()=>C1,WIN_MULTIPLIER:()=>ME,VALID_SUITS:()=>SE,VALID_RANKS:()=>NE,VALID_EUROPEAN_STREETS:()=>Kr,VALID_EUROPEAN_STRAIGHTS:()=>Tr,VALID_EUROPEAN_SPLITS:()=>Wr,VALID_EUROPEAN_DOUBLE_STREETS:()=>sr,VALID_EUROPEAN_CORNERS:()=>gr,VALID_AMERICAN_STREETS:()=>vr,VALID_AMERICAN_STRAIGHTS:()=>Hr,VALID_AMERICAN_SPLITS:()=>Lr,VALID_AMERICAN_DOUBLE_STREETS:()=>ar,VALID_AMERICAN_CORNERS:()=>lr,TOP_COLUMN:()=>O1,TILE_COUNTS:()=>vE,SPLIT_BET_SIZE_FACTOR:()=>d,RouletteType:()=>Mr,Roulette:()=>EE,RollType:()=>DE,RandomValuePool:()=>l,RED_NUMBERS:()=>B1,RANDOM_MIN_VALUE:()=>or,RANDOM_MAX_VALUE:()=>xr,PlinkoRiskLevel:()=>ir,Plinko:()=>t1,Parity:()=>J,PUSH_MULTIPLIER:()=>bE,PLINKO_ROW_COUNTS:()=>X1,PAYOUT_MULTIPLIERS:()=>f1,OrigamiGame:()=>T,MultiplierCalculator:()=>Y,Mines:()=>E1,MIN_WIN_CHANCE:()=>oE,MIDDLE_COLUMN:()=>o1,MAX_WIN_CHANCE:()=>xE,MAX_CARDS_PER_ROUND:()=>Sr,Limbo:()=>r1,LOSE_MULTIPLIER:()=>wE,KenoRiskLevel:()=>Ir,Keno:()=>eE,InsuranceOutcome:()=>cr,INSURANCE_WIN_PAYOUT:()=>Yr,INSURANCE_BET_SIZE_FACTOR:()=>X,INSURANCE_BET_MULTIPLIER:()=>z1,Half:()=>q,GameErrorCode:()=>OE,GameError:()=>B,Game:()=>S,FACE_CARD_VALUE:()=>zr,EuropeanRoulette:()=>er,EUROPEAN_HOUSE_EDGE:()=>D1,EFFECTIVE_RANGE:()=>hr,Dozen:()=>Q,DiceDirection:()=>HE,Dice:()=>KE,DiamondsResultType:()=>jE,Diamonds:()=>mE,DOUBLE_DOWN_BET_SIZE_FACTOR:()=>z,DICE_EFFECTIVE_RANGE:()=>Rr,DEALER_STAND_VALUE:()=>yr,Column:()=>I,Color:()=>R,CARDS_PER_SUIT:()=>$1,BlackjackOutcome:()=>Br,BlackjackActionType:()=>Dr,Blackjack:()=>XE,BaccaratOutcome:()=>_E,BaccaratBetType:()=>CE,Baccarat:()=>GE,BUST_VALUE:()=>Zr,BOTTOM_COLUMN:()=>x1,BLACK_NUMBERS:()=>c1,BLACKJACK_VALUE:()=>M,BLACKJACK_MULTIPLIER:()=>TE,BASE_PAYOUT_MULTIPLIERS:()=>W,AmericanRoulette:()=>rE,AdvancedDice:()=>ZE,AMERICAN_HOUSE_EDGE:()=>Z1,AMERICAN_BASKET:()=>kr,ACE_SOFT_BONUS:()=>Nr});module.exports=b1(f2);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 T;((D)=>{D.DICE="DICE";D.MINES="MINES";D.KENO="KENO";D.LIMBO="LIMBO";D.ADVANCED_DICE="ADVANCED_DICE";D.BACCARAT="BACCARAT";D.DIAMONDS="DIAMONDS";D.PLINKO="PLINKO";D.ROULETTE="ROULETTE";D.WHEEL="WHEEL";D.BLACKJACK="BLACKJACK"})(T||={});class S{gameId;constructor(r){this.gameId=r}getGameResult(r){return this.determineGameResult(r)}}var ur=require("big.js");var Ar=u(require("big.js"));class Y{static withMultiplier(r,E){return new Ar.default(r).times(new Ar.default(100-E).div(100))}static withWinChance(r,E){return Ar.default(100-r).div(E)}}var or=0,xr=1e4,hr=10001,oE=0.01,xE=98,h1=(r)=>{if(r<or)throw B.createValidationError(`Lower bound ${r} is below minimum allowed value ${or}`)},u1=(r)=>{if(r>xr)throw B.createValidationError(`Upper bound ${r} is above maximum allowed value ${xr}`)},tr=(r)=>{if(h1(r.lower),u1(r.upper),r.lower>=r.upper)throw B.createValidationError(`Lower bound ${r.lower} must be less than ${r.upper}`)},V1=(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,cE=(r)=>r.upper-r.lower+1,fr=(r,E)=>E>r.lower&&E<r.upper,Or=(r)=>r.upper-r.lower-1,DE;((t)=>{t.ROLL_BETWEEN="ROLL_BETWEEN";t.ROLL_OUTSIDE="ROLL_OUTSIDE";t.ROLL_BETWEEN_TWO="ROLL_BETWEEN_TWO"})(DE||={});var Vr=(r)=>{let A=(()=>{switch(r.mode){case"ROLL_BETWEEN":return tr(r.bounds),Or(r.bounds);case"ROLL_OUTSIDE":return tr(r.bounds),hr-cE(r.bounds);case"ROLL_BETWEEN_TWO":return tr(r.firstBounds),tr(r.secondBounds),V1(r.firstBounds,r.secondBounds),Or(r.firstBounds)+Or(r.secondBounds)}})(),t=ur.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},y1=(r)=>{Vr(r)};class ZE extends S{constructor(){super("ADVANCED_DICE")}determineGameResult({generator:r,edge:E,gameInputs:A}){let t=Vr(A),f=r.getRandomInt({min:or,max:xr}),O=f.value;return{isFinished:!0,payoutMultiplier:(()=>{switch(A.mode){case"ROLL_BETWEEN":return fr(A.bounds,O);case"ROLL_OUTSIDE":return!BE(A.bounds,O);case"ROLL_BETWEEN_TWO":return fr(A.firstBounds,O)||fr(A.secondBounds,O)}})()?Y.withWinChance(E,t):new ur.Big(0),outputs:{result:f.values},randomValues:f}}}var p=u(require("big.js"));var SE=["Clubs","Diamonds","Hearts","Spades"],NE=["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 Y1={["PLAYER_WIN"]:{betType:"PLAYER",multiplier:2},["TIE"]:{betType:"TIE",multiplier:9},["BANKER_WIN"]:{betType:"BANKER",multiplier:1.95}},UE=(r)=>{return new p.default(0).add(r.bets.reduce((A,t)=>A.add(t.amount),new p.default(0)))};class GE extends S{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=[],c=0;for(let C of O.slice(0,2)){let h=this.mapRandomValueToCard(C),Er=this.mapRandomValueToCardValue(C);x.push(h),c=(c+Er)%10}let Z=[],N=0;for(let C of o.slice(0,2)){let h=this.mapRandomValueToCard(C),Er=this.mapRandomValueToCardValue(C);Z.push(h),N=(N+Er)%10}if(!this.isNaturalWin(c,N)){let C=this.shouldDrawThirdPlayerCard(c),h=null;if(C)h=this.mapRandomValueToCardValue(O[2]),x.push(this.mapRandomValueToCard(O[2])),c=(c+h)%10;if(this.shouldDrawThirdBankerCard(N,h))Z.push(this.mapRandomValueToCard(o[2])),N=(N+this.mapRandomValueToCardValue(o[2]))%10}let D;if(c===N)D="TIE";else D=c>N?"PLAYER_WIN":"BANKER_WIN";let w=UE(E),{betType:rr,multiplier:U1}=Y1[D],m=new p.default(0);if(m=m.add(E.bets.filter((C)=>C.type===rr).reduce((C,h)=>C.add(h.amount.mul(U1)),new p.default(0))),D==="TIE")m=m.add(E.bets.filter((C)=>C.type==="PLAYER"||C.type==="BANKER").reduce((C,h)=>C.add(h.amount),new p.default(0)));return{isFinished:!0,payoutMultiplier:w.gt(0)?m.div(w):new p.default(0),outputs:{playerCards:x,playerHandValue:c,bankerCards:Z,bankerHandValue:N,gameOutcome:D,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=SE[Math.floor(r/13)],A=NE[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 Br;((f)=>{f.WIN="WIN";f.LOSE="LOSE";f.PUSH="PUSH";f.PLAYER_BLACKJACK="PLAYER_BLACKJACK"})(Br||={});var cr;((A)=>{A.WON="WON";A.LOST="LOST"})(cr||={});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 TE=2.5,ME=2,bE=1,wE=0,yr=17,Zr=21,M=21,Sr=63,z1=1.5,X=0.5,Yr=1.5,z=1,d=1,$1=13,Nr=10,zr=10,W={PLAYER_BLACKJACK:TE,WIN:ME,PUSH:bE,LOSE:wE};var _=require("@betorigami/guard"),IE=require("@xstate/store");var hE=0,uE=51,_r=Array.from({length:52},(r,E)=>E),VE=["Spades","Hearts","Diamonds","Clubs"],Cr=["Ace","Two","Three","Four","Five","Six","Seven","Eight","Nine","Ten","Jack","Queen","King"],yE=["Jack","Queen","King"];var YE=require("@betorigami/guard");var Ur=require("@betorigami/guard");class $r{value;constructor(r){let E=_r[r];Ur.Guard.againstNullOrUndefined(E,`Invalid card value: ${r}`),this.value=E}get suit(){let r=Math.floor(this.value/13),E=VE[r];return Ur.Guard.againstNullOrUndefined(E,`Invalid suit index: ${r}`),E}get rank(){let r=this.value%13,E=Cr[r];return Ur.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 zr;return Cr.indexOf(this.rank)+1}static fromValue(r){return YE.Guard.against(!_r.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===M}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 P extends K{static withInitialDeal(r){return new P(r)}addDrawnCards(r){return new P([...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 zE=require("@betorigami/guard"),$E=u(require("fast-deep-equal"));class pr{edge;constructor(r){this.edge=r}play(r,E,A=[]){let t=this.createGameStore(),f=this.generateRandomValues(r),O=f.toMultipleRandomValues();for(let c of A)t.send({...c.playerArgument,randomValuePool:f});let o=A[A.length-1];if(o)zE.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 U=u(require("big.js"));var pE={BLACKJACK_DOUBLE_DOWN:z,BLACKJACK_BUY_INSURANCE:X,BLACKJACK_SPLIT:d},PE=(r)=>r==="WON"?U.default(Yr):U.default(0),FE=(r)=>r!==void 0?U.default(X):U.default(0),JE=(r)=>{let E=r.actionType==="BLACKJACK_DOUBLE_DOWN",A=U.default(1),t=E?U.default(z):U.default(0),f=FE(r.insuranceOutcome),O=A.plus(t).plus(f),o=A.plus(t),x=U.default(W[r.outcome]).mul(o),c=PE(r.insuranceOutcome);return{payoutMultiplier:x.plus(c).div(O).toNumber(),betAmountMultiplier:pE[r.actionType]}},RE=(r)=>{let E=r.mainHandDoubledDown?U.default(1).plus(z):U.default(1),A=r.splitHandDoubledDown?U.default(1).plus(z):U.default(1),t=FE(r.insuranceOutcome),f=E.plus(A).plus(t),O=U.default(W[r.mainOutcome]).mul(E),o=U.default(W[r.splitOutcome]).mul(A),x=PE(r.insuranceOutcome);return{payoutMultiplier:O.plus(o).plus(x).div(f).toNumber(),betAmountMultiplier:pE[r.actionType]}};var p1={state:{isFinished:!1,phase:"uninitialised",multiplier:1},config:{},playerArgument:{type:"START"}},G=(r)=>V.fromValue(r).value;function P1(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 QE=(r,E)=>{let A=E;while(A.highestHandValue<yr)A=A.addDrawnCards([G(r.takeOne())]);return A},Jr=(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"},b=(r)=>{let{payoutMultiplier:E,betAmountMultiplier:A}=JE({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}},Fr=(r)=>{let E=QE(r.randomValuePool,r.dealerHand),A=Jr(r.playerHand,E);return b({...r,dealerHand:E,outcome:A})},$=(r)=>{let A=r.mainHand.isBusted&&r.splitHand.isBusted?r.dealerHand:QE(r.randomValuePool,r.dealerHand),t=Jr(r.mainHand,A),f=Jr(r.splitHand,A),{payoutMultiplier:O,betAmountMultiplier:o}=RE({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 XE extends pr{generateRandomValues(r){return l.from(r.getRandomIntsWithReplacement({min:hE,max:uE,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 IE.createStore({context:p1,on:{START:(r,E)=>{let{state:A}=r;_.Guard.against(A.phase!=="uninitialised","START action requires a fresh game");let t=G(E.randomValuePool.takeOne()),f=G(E.randomValuePool.takeOne()),O=G(E.randomValuePool.takeOne()),o=G(E.randomValuePool.takeOne()),x=P.withInitialDeal([t,f]),c=v.withInitialDeal({upCard:O,holeCard:o});if(c.upCard.rank==="Ace")return{state:{...A,isFinished:!1,phase:"awaiting-insurance",playerHand:x,dealerHand:c},config:{},playerArgument:{type:"START"}};if(x.isBlackjack&&c.isBlackjack)return b({...A,playerHand:x,dealerHand:c,outcome:"PUSH",randomValuePool:E.randomValuePool,actionType:"START"});if(x.isBlackjack)return b({...A,playerHand:x,dealerHand:c,outcome:"PLAYER_BLACKJACK",randomValuePool:E.randomValuePool,actionType:"START"});if(c.isBlackjack)return b({...A,playerHand:x,dealerHand:c,outcome:"LOSE",randomValuePool:E.randomValuePool,actionType:"START"});return{state:{...A,isFinished:!1,phase:"in-progress",playerHand:x,dealerHand:c,insuranceOutcome:void 0},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"};if(t.isBlackjack&&f.isBlackjack)return b({...O,outcome:"PUSH",insuranceOutcome:"WON"});if(t.isBlackjack)return b({...O,outcome:"PLAYER_BLACKJACK",insuranceOutcome:"LOST"});if(f.isBlackjack)return b({...O,outcome:"LOSE",insuranceOutcome:"WON"});return{state:{...A,phase:"in-progress",insuranceOutcome:"LOST"},config:{},playerArgument:{type:"BLACKJACK_BUY_INSURANCE"},betAmountMultiplier:X}},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 b({...O,outcome:"PUSH"});if(t.isBlackjack)return b({...O,outcome:"PLAYER_BLACKJACK"});if(f.isBlackjack)return b({...O,outcome:"LOSE"});return{state:{...A,phase:"in-progress",insuranceOutcome:void 0},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([G(E.randomValuePool.takeOne())]);if(t.isBusted||t.highestHandValue===M){if(A.splitHand.highestHandValue===M)return $({...A,mainHand:t,splitHandDoubledDown:!1,randomValuePool:E.randomValuePool,actionType:"BLACKJACK_HIT"});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([G(E.randomValuePool.takeOne())]);if(t.isBusted||t.highestHandValue===M)return $({...A,splitHand:t,randomValuePool:E.randomValuePool,actionType:"BLACKJACK_HIT"});return{state:{...A,splitHand:t},config:{},playerArgument:{type:"BLACKJACK_HIT"}}}case"in-progress":{let t=A.playerHand.addDrawnCards([G(E.randomValuePool.takeOne())]);if(t.isBusted)return b({...A,playerHand:t,outcome:"LOSE",randomValuePool:E.randomValuePool,actionType:"BLACKJACK_HIT"});if(t.highestHandValue===M)return Fr({...A,playerHand:t,randomValuePool:E.randomValuePool,actionType:"BLACKJACK_HIT"});return{state:{...A,phase:"in-progress",playerHand: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":{if(A.splitHand.highestHandValue===M)return $({...A,splitHandDoubledDown:!1,randomValuePool:E.randomValuePool,actionType:"BLACKJACK_STAND"});return{state:{...A,phase:"playing-split-hand",splitHandDoubledDown:!1},config:{},playerArgument:{type:"BLACKJACK_STAND"}}}case"playing-split-hand":return $({...A,splitHandDoubledDown:A.splitHandDoubledDown,randomValuePool:E.randomValuePool,actionType:"BLACKJACK_STAND"});case"in-progress":return Fr({...A,randomValuePool:E.randomValuePool,actionType:"BLACKJACK_STAND"});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([G(E.randomValuePool.takeOne())]);if(A.splitHand.highestHandValue===M)return $({...A,mainHand:t,mainHandDoubledDown:!0,splitHandDoubledDown:!1,randomValuePool:E.randomValuePool,actionType:"BLACKJACK_DOUBLE_DOWN"});return{state:{...A,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([G(E.randomValuePool.takeOne())]);return $({...A,splitHand:t,randomValuePool:E.randomValuePool,actionType:"BLACKJACK_DOUBLE_DOWN",splitHandDoubledDown:!0})}case"in-progress":{_.Guard.against(A.playerHand.cards.length!==2,"Double down is only allowed as the first action");let t=A.playerHand.addDrawnCards([G(E.randomValuePool.takeOne())]);if(t.isBusted)return b({...A,playerHand:t,outcome:"LOSE",randomValuePool:E.randomValuePool,actionType:"BLACKJACK_DOUBLE_DOWN"});return Fr({...A,playerHand:t,randomValuePool:E.randomValuePool,actionType:"BLACKJACK_DOUBLE_DOWN"})}default:_.Guard.againstNever(A,"Invalid phase for DOUBLE_DOWN action")}},BLACKJACK_SPLIT:(r,E)=>{let{state:A}=r;P1(A);let{playerHand:t}=A;_.Guard.against(t.cards.length!==2,"Split is only allowed with exactly 2 cards");let f=t.cards[0],O=t.cards[1];_.Guard.againstUndefined(f,"First card is missing"),_.Guard.againstUndefined(O,"Second card is missing"),_.Guard.against(f.rank!==O.rank,"Split requires two cards of the same rank");let o=G(E.randomValuePool.takeOne()),x=G(E.randomValuePool.takeOne()),c=P.withInitialDeal([f.value,o]),Z=P.withInitialDeal([O.value,x]);if(f.rank==="Ace")return $({...A,mainHand:c,splitHand:Z,randomValuePool:E.randomValuePool,actionType:"BLACKJACK_SPLIT",mainHandDoubledDown:!1,splitHandDoubledDown:!1});let D=c.highestHandValue===M,w=Z.highestHandValue===M;if(D&&w)return $({...A,mainHand:c,splitHand:Z,randomValuePool:E.randomValuePool,actionType:"BLACKJACK_SPLIT",mainHandDoubledDown:!1,splitHandDoubledDown:!1});if(D)return{state:{...A,phase:"playing-split-hand",mainHand:c,splitHand:Z,mainHandDoubledDown:!1,splitHandDoubledDown:!1},config:{},playerArgument:{type:"BLACKJACK_SPLIT"},betAmountMultiplier:d};return{state:{...A,phase:"playing-main-hand",multiplier:1,mainHand:c,splitHand:Z,mainHandDoubledDown:!1},config:{},playerArgument:{type:"BLACKJACK_SPLIT"},betAmountMultiplier:d}}}})}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=u(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 jE;((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"})(jE||={});var F1={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},J1={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},R1={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},q1={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},I1={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},iE=new y(new Map([[1,F1],[2,J1],[3,R1],[4,q1],[8,I1]])),Q1={2:"PAIR",3:"THREE_OF_A_KIND",4:"FOUR_OF_A_KIND",5:"FIVE_OF_A_KIND"};class mE extends S{constructor(){super("DIAMONDS")}determineGameResult({generator:r,edge:E}){let A=r.getRandomIntsWithReplacement({min:0,max:6,count:5}),t=iE.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=Q1[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=u(require("big.js"));var HE;((A)=>{A.ABOVE="ABOVE";A.BELOW="BELOW"})(HE||={});var Rr=1e4,WE=(r)=>{let E=r.direction==="ABOVE"?Rr-r.selectedValue:r.selectedValue;return new qr.default(E).div(Rr).mul(100)},LE=(r,E)=>r.direction==="ABOVE"?E>r.selectedValue:E<r.selectedValue;class KE extends S{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=u(require("big.js"));var k=require("@betorigami/guard");var Ir;((f)=>{f.CLASSIC="CLASSIC";f.LOW_RISK="LOW_RISK";f.MEDIUM_RISK="MEDIUM_RISK";f.HIGH_RISK="HIGH_RISK"})(Ir||={});var vE=[1,2,3,4,5,6,7,8,9,10],Qr=(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]}},sE={[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]}},aE={[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 y(new Map([[1,gE],[2,lE],[3,kE],[4,sE],[8,aE]]));class eE extends S{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 D of A.selectedNumbers)k.Guard.againstNonInteger(D,()=>B.createValidationError("Only integers can be selected")),k.Guard.against(D<0||D>39,()=>B.createValidationError("Invalid number selected"));let t=r.getUniqueRandomInts({min:0,max:39,count:10}),f=A.selectedNumbers.filter((D)=>t.values.includes(D)),O=A.selectedNumbers.length;if(!Qr(O))throw new Error(`Invalid tile count: ${O}`);let Z=Xr.getMultipliers(E)[O][A.riskLevel][f.length];if(Z===void 0)throw new Error(`No multiplier found for matching tile count ${f.length}`);return{isFinished:!0,payoutMultiplier:new nE.default(Z),outputs:{result:t.values},randomValues:t}}}var F=u(require("big.js"));var dr=(r,E)=>{return r.gt(E)?r:E};var jr=(r,E)=>{return r.lt(E)?r:E};class r1 extends S{constructor(){super("LIMBO")}determineGameResult({generator:r,edge:E,gameInputs:A}){let t=r.getRandomInt({min:1,max:4294967295}),f=t.max,O=new F.default(16777216),o=new F.default(1),x=new F.default(1e6),c=t.value,Z=new F.default(c-1).div(f),N=(100-E)/100,D=O.div(Z.mul(O).plus(1)).mul(N),w=dr(o,jr(D,x));return{isFinished:!0,payoutMultiplier:w.gte(A.targetMultiplier)?new F.default(A.targetMultiplier):new F.default(0),outputs:{randomMultiplier:w,result:t.values},randomValues:t}}}var s=u(require("big.js"));var Gr=(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 E1 extends S{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((rr)=>A.selectedTiles.includes(rr)),c=A.hasCashedOut||x,Z=(100-E)/100,N=new s.default(Gr(25-A.minesCount,A.selectedTiles.length)).div(new s.default(Gr(25,A.selectedTiles.length))),w=A.hasCashedOut&&!x?new s.default(Z).div(N):new s.default(0);return{isFinished:c,payoutMultiplier:w,outputs:{result:o.values},randomValues:o}}}var A1=require("big.js");var ir;((t)=>{t.LOW_RISK="LOW_RISK";t.MEDIUM_RISK="MEDIUM_RISK";t.HIGH_RISK="HIGH_RISK"})(ir||={});var X1=[8,9,10,11,12,13,14,15,16],d1={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]}},j1={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]}},i1={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]}},m1={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]}},H1={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]}},mr=new y(new Map([[1,d1],[2,j1],[3,i1],[4,m1],[8,H1]]));class t1 extends S{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=mr.getMultipliers(A)[E.riskLevel][t],x=r.getRandomIntsWithReplacement({min:0,max:1,count:E.numberOfRows}),Z=x.values.reduce((D,w)=>D+w,0),N=o[Z];if(N===void 0)throw new Error(`No payout found for end position ${Z}`);return{isFinished:!0,payoutMultiplier:A1.Big(N),outputs:{result:x.values},randomValues:x}}}var e=require("big.js");var Tr=[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],Hr=[37,...Tr],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],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]],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]],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 I;((t)=>{t.TOP="TOP";t.MIDDLE="MIDDLE";t.BOTTOM="BOTTOM"})(I||={});var Q;((t)=>{t.FIRST="FIRST";t.SECOND="SECOND";t.THIRD="THIRD"})(Q||={});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)&&a(E.value)))throw B.createValidationError("Invalid straight bet.");if(!r.splitBets.every((E)=>E.amount.gte(0)&&W1(E.values)))throw B.createValidationError("Invalid split bet.");if(!r.streetBets.every((E)=>E.amount.gte(0)&&L1(E.values)))throw B.createValidationError("Invalid street bet.");if(!r.cornerBets.every((E)=>E.amount.gte(0)&&K1(E.values)))throw B.createValidationError("Invalid corner bet.");if(!r.doubleStreetBets.every((E)=>E.amount.gte(0)&&v1(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(I).includes(E.column)))throw B.createValidationError("Invalid column bet.");if(!r.dozenBets.every((E)=>E.amount.gte(0)&&Object.values(Q).includes(E.dozen)))throw B.createValidationError("Invalid dozen bet.")},a=(r)=>{return Tr.includes(r)},W1=(r)=>{if(r.length!==2)return!1;if(!r.every(a))return!1;return Wr.some(([E,A])=>E===r[0]&&A===r[1])},L1=(r)=>{if(r.length!==3)return!1;if(!r.every(a))return!1;return Kr.some(([E,A,t])=>E===r[0]&&A===r[1]&&t===r[2])},K1=(r)=>{if(r.length!==4)return!1;if(!r.every(a))return!1;return gr.some(([E,A,t,f])=>E===r[0]&&A===r[1]&&t===r[2]&&f===r[3])},v1=(r)=>{if(r.length!==6)return!1;if(!r.every(a))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 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)&&g1(E.values)))throw B.createValidationError("Invalid split bet.");if(!r.streetBets.every((E)=>E.amount.gte(0)&&l1(E.values)))throw B.createValidationError("Invalid street bet.");if(!r.cornerBets.every((E)=>E.amount.gte(0)&&k1(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)&&s1(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(I).includes(E.column)))throw B.createValidationError("Invalid column bet.");if(!r.dozenBets.every((E)=>E.amount.gte(0)&&Object.values(Q).includes(E.dozen)))throw B.createValidationError("Invalid dozen bet.")},n=(r)=>{return Hr.includes(r)};function g1(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 l1=(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])},k1=(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])},s1=(r)=>{if(r.length!==6)return!1;if(!r.every(n))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 f1={straightBets:36,splitBets:18,streetBets:12,cornerBets:9,basketBets:7,doubleStreetBets:6,parityBets:2,colorBets:2,halfBets:2,columnBets:3,dozenBets:3},O1=[3,6,9,12,15,18,21,24,27,30,33,36],o1=[2,5,8,11,14,17,20,23,26,29,32,35],x1=[1,4,7,10,13,16,19,22,25,28,31,34],B1=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],c1=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35],D1=2.7,Z1=5.3;class nr extends S{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:c}=this.partitionBets(O,o,E);A[f]=x,t[f]=c}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 B1.includes(E)&&A.color==="RED"||c1.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 O1.includes(E)&&A.column==="TOP"||o1.includes(E)&&A.column==="MIDDLE"||x1.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=f1[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 S{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===D1&&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===Z1&&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 a1=(r)=>{return new EE().getBetAmount(r)};var n1=(r)=>{if(r.type==="EUROPEAN")br(r.inputs);else wr(r.inputs)};var _1=require("big.js");var j;((t)=>{t.LOW_RISK="LOW_RISK";t.MEDIUM_RISK="MEDIUM_RISK";t.HIGH_RISK="HIGH_RISK"})(j||={});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 e1={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}}},r2={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}}},E2={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}}},A2={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}}},t2={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}}},S1=new y(new Map([[1,e1],[2,r2],[3,E2],[4,A2],[8,t2]]));var N1={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 C1 extends S{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(j).includes(E.riskLevel))throw new Error("Invalid risk level");let f=S1.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=N1[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 c=r.getRandomInt({min:0,max:x.length-1}),Z=x[c.value];if(Z===void 0)throw new Error(`No pattern found for segment ${E.segments} and value ${c.value}`);let N=O[Z];if(N===void 0)throw new Error(`No payout found for picked segment ${Z}`);return{isFinished:!0,payoutMultiplier:new _1.Big(N),outputs:{result:c.values},randomValues:c}}}
1
+ var br=Object.create;var{getPrototypeOf:jr,defineProperty:$,getOwnPropertyNames:Aa,getOwnPropertyDescriptor:Nr}=Object,Ba=Object.prototype.hasOwnProperty;var H=(t,a,r)=>{r=t!=null?br(jr(t)):{};let e=a||!t||!t.__esModule?$(r,"default",{value:t,enumerable:!0}):r;for(let n of Aa(t))if(!Ba.call(e,n))$(e,n,{get:()=>t[n],enumerable:!0});return e},pa=new WeakMap,Vr=(t)=>{var a=pa.get(t),r;if(a)return a;if(a=$({},"__esModule",{value:!0}),t&&typeof t==="object"||typeof t==="function")Aa(t).map((e)=>!Ba.call(a,e)&&$(a,e,{get:()=>t[e],enumerable:!(r=Nr(t,e))||r.enumerable}));return pa.set(t,a),a};var wr=(t,a)=>{for(var r in a)$(t,r,{get:a[r],enumerable:!0,configurable:!0,set:(e)=>a[r]=()=>e})};var Oe={};wr(Oe,{validateRouletteGameInputs:()=>Be,validateAdvancedDiceInputs:()=>kr,rtp99Multipliers:()=>lr,rtp98Multipliers:()=>dr,rtp97Multipliers:()=>ur,rtp96Multipliers:()=>sr,rtp92Multipliers:()=>pr,plinkoMultipliers:()=>Lt,nCr:()=>Ht,kenoMultipliers:()=>Xt,isTileCount:()=>zt,hasDiceWon:()=>or,diamondsMultipliers:()=>ar,calculateRouletteBetAmount:()=>Ae,calculateDiceWinChance:()=>nr,calculateBaccaratBetAmount:()=>Ta,calculateAdvancedDiceWinChance:()=>jt,bigMin:()=>Qt,bigMax:()=>qt,advancedDiceIsWithinBoundsInclusive:()=>fa,advancedDiceIsWithinBoundsExclusive:()=>it,advancedDiceGetInclusiveBoundsRange:()=>Sa,advancedDiceGetExclusiveBoundsRange:()=>ct,WheelSegments:()=>J,WheelRiskLevel:()=>Y,Wheel:()=>Ir,WIN_MULTIPLIER:()=>_a,VALID_SUITS:()=>Ca,VALID_RANKS:()=>ha,VALID_EUROPEAN_STREETS:()=>aa,VALID_EUROPEAN_STRAIGHTS:()=>xt,VALID_EUROPEAN_SPLITS:()=>vt,VALID_EUROPEAN_DOUBLE_STREETS:()=>ia,VALID_EUROPEAN_CORNERS:()=>ea,VALID_AMERICAN_STREETS:()=>ra,VALID_AMERICAN_STRAIGHTS:()=>Kt,VALID_AMERICAN_SPLITS:()=>ta,VALID_AMERICAN_DOUBLE_STREETS:()=>ca,VALID_AMERICAN_CORNERS:()=>na,ThreeCardBonusType:()=>Bt,TOP_COLUMN:()=>Or,TILE_COUNTS:()=>cr,THREE_CARD_BONUS_PAYOUTS:()=>Ut,SingleActionGame:()=>A,SPLIT_BET_SIZE_FACTOR:()=>j,RouletteType:()=>Tt,Roulette:()=>sa,RollType:()=>Oa,RandomValuePool:()=>L,RED_NUMBERS:()=>hr,RANDOM_MIN_VALUE:()=>lt,RANDOM_MAX_VALUE:()=>dt,PlinkoRiskLevel:()=>Wt,Plinko:()=>fr,Parity:()=>w,PairBonusType:()=>At,PUSH_MULTIPLIER:()=>Ia,PLINKO_ROW_COUNTS:()=>vr,PAYOUT_MULTIPLIERS:()=>Sr,PAIR_BONUS_PAYOUTS:()=>wt,OrigamiGame:()=>f,MultiplierCalculator:()=>T,MultiActionGame:()=>Ct,Mines:()=>yr,MIN_WIN_CHANCE:()=>ya,MIDDLE_COLUMN:()=>Dr,MAX_WIN_CHANCE:()=>Ea,MAX_CARDS_PER_ROUND:()=>yt,Limbo:()=>mr,LOSE_MULTIPLIER:()=>ba,KenoRiskLevel:()=>$t,Keno:()=>Br,InsuranceOutcome:()=>st,INSURANCE_WIN_PAYOUT:()=>Et,INSURANCE_BET_SIZE_FACTOR:()=>M,INSURANCE_BET_MULTIPLIER:()=>Mr,Half:()=>G,GameErrorCode:()=>ma,GameError:()=>d,Game:()=>F,FACE_CARD_VALUE:()=>Vt,EuropeanRoulette:()=>da,EUROPEAN_HOUSE_EDGE:()=>xr,EFFECTIVE_RANGE:()=>It,Dozen:()=>k,DiceDirection:()=>er,Dice:()=>ir,DiamondsResultType:()=>tr,Diamonds:()=>rr,DOUBLE_DOWN_BET_SIZE_FACTOR:()=>R,DICE_EFFECTIVE_RANGE:()=>Jt,DEALER_STAND_VALUE:()=>Nt,Column:()=>Z,Color:()=>U,CARDS_PER_SUIT:()=>Yr,BlackjackOutcome:()=>ut,BlackjackActionType:()=>pt,Blackjack:()=>Ka,BaccaratOutcome:()=>Ha,BaccaratBetType:()=>xa,Baccarat:()=>Ra,BUST_VALUE:()=>mt,BOTTOM_COLUMN:()=>Cr,BLACK_NUMBERS:()=>Hr,BLACKJACK_VALUE:()=>O,BLACKJACK_MULTIPLIER:()=>Pa,BASE_PAYOUT_MULTIPLIERS:()=>z,AmericanRoulette:()=>ua,AdvancedDice:()=>Da,AMERICAN_HOUSE_EDGE:()=>Tr,AMERICAN_BASKET:()=>oa,ACE_SOFT_BONUS:()=>ft});module.exports=Vr(Oe);var ma;((a)=>a.INPUT_VALIDATION_ERROR="INPUT_VALIDATION_ERROR")(ma||={});class d extends Error{static createValidationError(t){return new d("INPUT_VALIDATION_ERROR",t)}static isGameError(t){return t instanceof d}errorCode;constructor(t,a){super(a);this.errorCode=t}}var f;((l)=>{l.DICE="DICE";l.MINES="MINES";l.KENO="KENO";l.LIMBO="LIMBO";l.ADVANCED_DICE="ADVANCED_DICE";l.BACCARAT="BACCARAT";l.DIAMONDS="DIAMONDS";l.PLINKO="PLINKO";l.ROULETTE="ROULETTE";l.WHEEL="WHEEL";l.BLACKJACK="BLACKJACK"})(f||={});class F{gameId;constructor(t){this.gameId=t}}class A extends F{constructor(t){super(t)}getGameResult(t){return this.determineGameResult(t)}}var bt=require("big.js");var nt=H(require("big.js"));class T{static withMultiplier(t,a){return new nt.default(t).times(new nt.default(100-a).div(100))}static withWinChance(t,a){return nt.default(100-t).div(a)}}var lt=0,dt=1e4,It=10001,ya=0.01,Ea=98,Ur=(t)=>{if(t<lt)throw d.createValidationError(`Lower bound ${t} is below minimum allowed value ${lt}`)},Gr=(t)=>{if(t>dt)throw d.createValidationError(`Upper bound ${t} is above maximum allowed value ${dt}`)},ot=(t)=>{if(Ur(t.lower),Gr(t.upper),t.lower>=t.upper)throw d.createValidationError(`Lower bound ${t.lower} must be less than ${t.upper}`)},Zr=(t,a)=>{let[r,e]=t.lower<=a.lower?[t,a]:[a,t];if(r.upper>e.lower)throw d.createValidationError("Bounds must not overlap")},fa=(t,a)=>a>=t.lower&&a<=t.upper,Sa=(t)=>t.upper-t.lower+1,it=(t,a)=>a>t.lower&&a<t.upper,ct=(t)=>t.upper-t.lower-1,Oa;((e)=>{e.ROLL_BETWEEN="ROLL_BETWEEN";e.ROLL_OUTSIDE="ROLL_OUTSIDE";e.ROLL_BETWEEN_TWO="ROLL_BETWEEN_TWO"})(Oa||={});var jt=(t)=>{let r=(()=>{switch(t.mode){case"ROLL_BETWEEN":return ot(t.bounds),ct(t.bounds);case"ROLL_OUTSIDE":return ot(t.bounds),It-Sa(t.bounds);case"ROLL_BETWEEN_TWO":return ot(t.firstBounds),ot(t.secondBounds),Zr(t.firstBounds,t.secondBounds),ct(t.firstBounds)+ct(t.secondBounds)}})(),e=bt.Big(r).div(It).mul(100);if(e.lt(ya))throw d.createValidationError("Win chance too low");if(e.gt(Ea))throw d.createValidationError("Win chance too high");return e},kr=(t)=>{jt(t)};class Da extends A{constructor(){super("ADVANCED_DICE")}determineGameResult({generator:t,edge:a,gameInputs:r}){let e=jt(r),n=t.getRandomInt({min:lt,max:dt}),o=n.value;return{isFinished:!0,payoutMultiplier:(()=>{switch(r.mode){case"ROLL_BETWEEN":return it(r.bounds,o);case"ROLL_OUTSIDE":return!fa(r.bounds,o);case"ROLL_BETWEEN_TWO":return it(r.firstBounds,o)||it(r.secondBounds,o)}})()?T.withWinChance(a,e):new bt.Big(0),outputs:{result:n.values},randomValues:n}}}var b=H(require("big.js"));var Ca=["Clubs","Diamonds","Hearts","Spades"],ha=["Ace","2","3","4","5","6","7","8","9","10","Jack","Queen","King"],Ha;((e)=>{e.PLAYER_WIN="PLAYER_WIN";e.TIE="TIE";e.BANKER_WIN="BANKER_WIN"})(Ha||={});var xa;((e)=>{e.PLAYER="PLAYER";e.TIE="TIE";e.BANKER="BANKER"})(xa||={});var Fr={["PLAYER_WIN"]:{betType:"PLAYER",multiplier:2},["TIE"]:{betType:"TIE",multiplier:9},["BANKER_WIN"]:{betType:"BANKER",multiplier:1.95}},Ta=(t)=>{return new b.default(0).add(t.bets.reduce((r,e)=>r.add(e.amount),new b.default(0)))};class Ra extends A{constructor(){super("BACCARAT")}determineGameResult({generator:t,gameInputs:a,edge:r}){if(r!==1)throw new Error("Baccarat is only available at 1% edge.");this.validateGameInputs(a);let e=t.getRandomIntsWithReplacement({min:0,max:51,count:6}),n=e.values,o=n.slice(0,3),i=n.slice(3,6),c=[],u=0;for(let y of o.slice(0,2)){let h=this.mapRandomValueToCard(y),et=this.mapRandomValueToCardValue(y);c.push(h),u=(u+et)%10}let p=[],s=0;for(let y of i.slice(0,2)){let h=this.mapRandomValueToCard(y),et=this.mapRandomValueToCardValue(y);p.push(h),s=(s+et)%10}if(!this.isNaturalWin(u,s)){let y=this.shouldDrawThirdPlayerCard(u),h=null;if(y)h=this.mapRandomValueToCardValue(o[2]),c.push(this.mapRandomValueToCard(o[2])),u=(u+h)%10;if(this.shouldDrawThirdBankerCard(s,h))p.push(this.mapRandomValueToCard(i[2])),s=(s+this.mapRandomValueToCardValue(i[2]))%10}let l;if(u===s)l="TIE";else l=u>s?"PLAYER_WIN":"BANKER_WIN";let m=Ta(a),{betType:I,multiplier:_t}=Fr[l],g=new b.default(0);if(g=g.add(a.bets.filter((y)=>y.type===I).reduce((y,h)=>y.add(h.amount.mul(_t)),new b.default(0))),l==="TIE")g=g.add(a.bets.filter((y)=>y.type==="PLAYER"||y.type==="BANKER").reduce((y,h)=>y.add(h.amount),new b.default(0)));return{isFinished:!0,payoutMultiplier:m.gt(0)?g.div(m):new b.default(0),outputs:{playerCards:c,playerHandValue:u,bankerCards:p,bankerHandValue:s,gameOutcome:l,result:e.values},randomValues:e}}validateGameInputs(t){if(t.bets.length===0)throw new Error("Must place at least a single bet.");if(!t.bets.every((a)=>a.amount.gte(0)))throw new Error("Invalid bet.")}mapRandomValueToCard(t){let a=Ca[Math.floor(t/13)],r=ha[t%13];return{suit:a,rank:r}}isNaturalWin(t,a){let r=[8,9];return r.includes(t)||r.includes(a)}mapRandomValueToCardValue(t){let a=t%13;if(a===0)return 1;if(a>=10)return 10;return a+1}shouldDrawThirdPlayerCard(t){return t<=5}shouldDrawThirdBankerCard(t,a){if(a===null)return t<=5;if(t<=2)return!0;if(t===3)return a!==8;if(t===4)return[2,3,4,5,6,7].includes(a);if(t===5)return[4,5,6,7].includes(a);if(t===6)return[6,7].includes(a);return!1}}var ut;((n)=>{n.WIN="WIN";n.LOSE="LOSE";n.PUSH="PUSH";n.PLAYER_BLACKJACK="PLAYER_BLACKJACK"})(ut||={});var st;((r)=>{r.WON="WON";r.LOST="LOST"})(st||={});var pt;((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";c.SPLIT="BLACKJACK_SPLIT"})(pt||={});var At;((n)=>{n.EXACT_PAIR="EXACT_PAIR";n.COLORED_PAIR="COLORED_PAIR";n.MIXED_PAIR="MIXED_PAIR";n.LOSS="LOSS"})(At||={});var Bt;((i)=>{i.SUITED_TRIPS="SUITED_TRIPS";i.STRAIGHT_FLUSH="STRAIGHT_FLUSH";i.THREE_OF_A_KIND="THREE_OF_A_KIND";i.STRAIGHT="STRAIGHT";i.FLUSH="FLUSH";i.LOSS="LOSS"})(Bt||={});var Pa=2.5,_a=2,Ia=1,ba=0,Nt=17,mt=21,O=21,yt=63,Mr=1.5,M=0.5,Et=1.5,R=1,j=1,Yr=13,ft=10,Vt=10,z={PLAYER_BLACKJACK:Pa,WIN:_a,PUSH:Ia,LOSE:ba},wt={EXACT_PAIR:26,COLORED_PAIR:11,MIXED_PAIR:7,LOSS:0},Ut={SUITED_TRIPS:101,STRAIGHT_FLUSH:51,THREE_OF_A_KIND:31,STRAIGHT:11,FLUSH:5,LOSS:0};var _=H(require("big.js")),B=require("@betorigami/guard"),Wa=require("@xstate/store");var ja=0,Na=51,St=Array.from({length:52},(t,a)=>a),Va=["Spades","Hearts","Diamonds","Clubs"],Ot=["Ace","Two","Three","Four","Five","Six","Seven","Eight","Nine","Ten","Jack","Queen","King"],wa=["Jack","Queen","King"],Gt={Hearts:"red",Diamonds:"red",Spades:"black",Clubs:"black"};var Ua=require("@betorigami/guard");var Dt=require("@betorigami/guard");class Zt{value;constructor(t){let a=St[t];Dt.Guard.againstNullOrUndefined(a,`Invalid card value: ${t}`),this.value=a}get suit(){let t=Math.floor(this.value/13),a=Va[t];return Dt.Guard.againstNullOrUndefined(a,`Invalid suit index: ${t}`),a}get rank(){let t=this.value%13,a=Ot[t];return Dt.Guard.againstNullOrUndefined(a,`Invalid rank index: ${t}`),a}toDto(){return{rank:this.rank,suit:this.suit,cardValue:this.value}}}class E extends Zt{get numericRank(){if(wa.includes(this.rank))return Vt;return Ot.indexOf(this.rank)+1}static fromValue(t){return Ua.Guard.against(!St.includes(t),`Invalid card value: ${t}`),new E(t)}}class X{cards;hardHandValue;softHandValue=null;constructor(t){this.cards=t;if(this.hardHandValue=t.reduce((r,e)=>r+e.numericRank,0),t.some((r)=>r.rank==="Ace")&&this.hardHandValue+ft<=mt)this.softHandValue=this.hardHandValue+ft}get cardCount(){return this.cards.length}get hasSoftHandValue(){return this.softHandValue!==null}get isBusted(){return this.hardHandValue>mt}get isBlackjack(){return this.cardCount===2&&this.highestHandValue===O}get highestHandValue(){return this.softHandValue!==null?this.softHandValue:this.hardHandValue}}class q{cards;value;constructor(t){this.cards=t.map((a)=>E.fromValue(a)),this.value=new X(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((t)=>t.value)}toDto(){return{cards:this.cards.map((t)=>t.toDto()),value:this.highestHandValue}}}class Q extends q{otherCards;upCard;holeCard;constructor(t,a,r=[]){super([t,a,...r]);this.otherCards=r;this.upCard=E.fromValue(t),this.holeCard=E.fromValue(a)}static withInitialDeal(t){return new Q(t.upCard,t.holeCard)}addDrawnCards(t){return new Q(this.upCard.value,this.holeCard.value,[...this.otherCards,...t])}toDto(t=!1){if(t)return super.toDto();return{cards:[this.upCard.toDto()],value:new X([this.upCard]).highestHandValue}}}class N extends q{static withInitialDeal(t){return new N(t)}addDrawnCards(t){return new N([...this.rawValues,...t])}}var W=require("@betorigami/guard");class L{source;index=0;constructor(t){this.source=t}static from(t,a){return W.Guard.against(a<=0,`Count must be positive, got ${a}`),W.Guard.against(t.values.length!==a,`Expected ${a} values, got ${t.values.length}`),new L(t)}get consumedValues(){return this.source.values.slice(0,this.index)}toMultipleRandomValues(){return this.source}takeOne(){let t=this.source.values[this.index];return W.Guard.againstUndefined(t,"RandomValuePool exhausted"),this.index+=1,t}take(t){W.Guard.against(this.index+t>this.source.values.length,`RandomValuePool exhausted: requested ${t} but only ${this.source.values.length-this.index} remain`);let a=this.source.values.slice(this.index,this.index+t);return this.index+=t,a}}var Ga=require("@betorigami/guard"),Za=H(require("fast-deep-equal"));class Ct extends F{edge;constructor(t,a){super(t);this.edge=a}play(t,a,r=[]){let e=this.createGameStore(),n=this.generateRandomValues(t),o=n.toMultipleRandomValues();for(let u of r)e.send({...u.playerArgument,randomValuePool:n});let i=r[r.length-1];if(i)Ga.Guard.against(!Za.default(i.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({...a,randomValuePool:n});let c=e.getSnapshot().context;return{playerArgument:c.playerArgument,state:this.toExternalState(c.state),config:c.config,additionalBetAmount:c.additionalBetAmount,proof:{proofHash:o.proofHash,proofString:o.proofString}}}}var D=H(require("big.js"));var ht=require("@betorigami/guard");var ka=(t)=>{let a=t.pairBonus!==null?D.default(t.pairBonus.betAmount).mul(t.pairBonus.payoutMultiplier):D.default(0),r=t.threeCardBonus!==null?D.default(t.threeCardBonus.betAmount).mul(t.threeCardBonus.payoutMultiplier):D.default(0);return a.plus(r)},Fa=(t)=>{let a=t.betAmounts.mainBetAmount,e=t.actionType==="BLACKJACK_DOUBLE_DOWN"?a.mul(R):D.default(0),n=t.insuranceOutcome!==void 0?a.mul(M):D.default(0),o=a.plus(e).mul(z[t.outcome]),i=t.insuranceOutcome==="WON"?a.mul(Et):D.default(0),c=ka(t.sideBetResults),u=o.plus(i).plus(c),p=a.plus(n).plus(e).plus(t.betAmounts.pairBonusAmount).plus(t.betAmounts.threeCardBonusAmount);ht.Guard.against(p.eq(0),"Total bet amount cannot be zero");let s=u.div(p);ht.Guard.against(t.actionType==="BLACKJACK_SPLIT","SPLIT action type is not valid for standard multiplier calculation");let l;switch(t.actionType){case"BLACKJACK_DOUBLE_DOWN":l=e;break;case"BLACKJACK_BUY_INSURANCE":l=n;break;case"BLACKJACK_SPLIT":l=a.mul(j);break}return{multiplier:s,additionalBetAmount:l}},Ma=(t)=>{let a=t.betAmounts.mainBetAmount,r=t.mainHandDoubledDown?a.mul(R):D.default(0),e=t.splitHandDoubledDown?a.mul(R):D.default(0),n=t.insuranceOutcome!==void 0?a.mul(M):D.default(0),o=a.plus(r).mul(z[t.mainOutcome]),i=a.plus(e).mul(z[t.splitOutcome]),c=t.insuranceOutcome==="WON"?a.mul(Et):D.default(0),u=ka(t.sideBetResults),p=o.plus(i).plus(c).plus(u),s=a.plus(a).plus(n).plus(r).plus(e).plus(t.betAmounts.pairBonusAmount).plus(t.betAmounts.threeCardBonusAmount);ht.Guard.against(s.eq(0),"Total bet amount cannot be zero");let l=p.div(s),m;switch(t.actionType){case"BLACKJACK_DOUBLE_DOWN":m=a.mul(R);break;case"BLACKJACK_SPLIT":m=a.mul(j);break}return{multiplier:l,additionalBetAmount:m}};var Ja=require("@betorigami/guard"),kt=(t)=>t.every((a)=>a===t[0]),Ya=(t)=>{let a=[...t].sort((r,e)=>r-e);return a.every((r,e)=>{let n=a[e-1];if(e===0)return!0;return Ja.Guard.againstUndefined(n,"Previous value cannot be undefined"),r===n+1})},ga={Ace:1,Two:2,Three:3,Four:4,Five:5,Six:6,Seven:7,Eight:8,Nine:9,Ten:10,Jack:11,Queen:12,King:13},Jr={...ga,Ace:14},gr=(t)=>Ya(t.map((a)=>ga[a]))||Ya(t.map((a)=>Jr[a])),$a=(t,a)=>{let r=E.fromValue(t),e=E.fromValue(a);if(r.rank!==e.rank)return"LOSS";if(t===a)return"EXACT_PAIR";if(Gt[r.suit]===Gt[e.suit])return"COLORED_PAIR";return"MIXED_PAIR"},za=(t,a)=>({betAmount:t,result:a,payoutMultiplier:wt[a]}),Xa=(t,a,r)=>{let e=E.fromValue(t),n=E.fromValue(a),o=E.fromValue(r),i=[e.rank,n.rank,o.rank],c=kt([e.suit,n.suit,o.suit]),u=kt(i),p=gr(i);if(kt([t,a,r]))return"SUITED_TRIPS";if(c&&p)return"STRAIGHT_FLUSH";if(u)return"THREE_OF_A_KIND";if(p)return"STRAIGHT";if(c)return"FLUSH";return"LOSS"},qa=(t,a)=>({betAmount:t,result:a,payoutMultiplier:Ut[a]});var $r={state:{isFinished:!1,phase:"uninitialised",multiplier:_.default(0)},config:{},playerArgument:{type:"START",mainBetAmount:"0",pairBonusAmount:"0",threeCardBonusAmount:"0"}},S=(t)=>E.fromValue(t).value;function zr(t){B.Guard.against(t.phase!=="in-progress","Expected a started, in-progress game state")}function Qa(t){B.Guard.against(t.phase!=="awaiting-insurance","Expected game to be awaiting insurance decision")}function Ft(t){B.Guard.against(t.phase!=="in-progress"&&t.phase!=="playing-main-hand"&&t.phase!=="playing-split-hand","Expected a started, in-progress game state")}var La=(t,a)=>{let r=a;while(r.highestHandValue<Nt)r=r.addDrawnCards([S(t.takeOne())]);return r},Yt=(t,a)=>{if(t.isBusted)return"LOSE";if(a.isBusted)return"WIN";let r=t.highestHandValue,e=a.highestHandValue;if(r>e)return"WIN";if(r<e)return"LOSE";return"PUSH"},C=(t)=>{let{multiplier:a,additionalBetAmount:r}=Fa({outcome:t.outcome,insuranceOutcome:t.insuranceOutcome,actionType:t.playerArgument.type,betAmounts:t.betAmounts,sideBetResults:t.sideBetResults});return{state:{isFinished:!0,phase:"finished",playerHand:t.playerHand,dealerHand:t.dealerHand,outcome:t.outcome,multiplier:a,randomValues:t.randomValuePool.consumedValues,insuranceOutcome:t.insuranceOutcome,sideBetResults:t.sideBetResults},config:{},playerArgument:t.playerArgument,additionalBetAmount:r}},Mt=(t)=>{let a=La(t.randomValuePool,t.dealerHand),r=Yt(t.playerHand,a);return C({...t,dealerHand:a,outcome:r})},P=(t)=>{let r=t.mainHand.isBusted&&t.splitHand.isBusted?t.dealerHand:La(t.randomValuePool,t.dealerHand),e=Yt(t.mainHand,r),n=Yt(t.splitHand,r),{multiplier:o,additionalBetAmount:i}=Ma({hasSplit:!0,mainOutcome:e,splitOutcome:n,insuranceOutcome:t.insuranceOutcome,mainHandDoubledDown:t.mainHandDoubledDown,splitHandDoubledDown:t.splitHandDoubledDown,actionType:t.playerArgument.type,betAmounts:t.betAmounts,sideBetResults:t.sideBetResults});return{state:{isFinished:!0,phase:"split-finished",mainHand:t.mainHand,splitHand:t.splitHand,dealerHand:r,mainOutcome:e,splitOutcome:n,multiplier:o,randomValues:t.randomValuePool.consumedValues,insuranceOutcome:t.insuranceOutcome,sideBetResults:t.sideBetResults},config:{},playerArgument:t.playerArgument,additionalBetAmount:i}};class Ka extends Ct{constructor(t){super("BLACKJACK",t)}generateRandomValues(t){return L.from(t.getRandomIntsWithReplacement({min:ja,max:Na,count:yt}),yt)}toExternalState(t){let a=t.phase;switch(a){case"awaiting-insurance":return{isFinished:!1,phase:"awaiting-insurance",multiplier:t.multiplier,playerHand:t.playerHand.toDto(),dealerHand:t.dealerHand.toDto(!1),sideBetResults:t.sideBetResults};case"in-progress":return{isFinished:!1,phase:"player-turn",multiplier:t.multiplier,playerHand:t.playerHand.toDto(),dealerHand:t.dealerHand.toDto(!1),sideBetResults:t.sideBetResults};case"playing-main-hand":return{isFinished:!1,phase:"playing-main-hand",multiplier:t.multiplier,mainHand:t.mainHand.toDto(),splitHand:t.splitHand.toDto(),dealerHand:t.dealerHand.toDto(!1),sideBetResults:t.sideBetResults};case"playing-split-hand":return{isFinished:!1,phase:"playing-split-hand",multiplier:t.multiplier,mainHand:t.mainHand.toDto(),splitHand:t.splitHand.toDto(),dealerHand:t.dealerHand.toDto(!1),sideBetResults:t.sideBetResults};case"finished":return{isFinished:!0,multiplier:t.multiplier,randomValues:t.randomValues,outcome:t.outcome,playerHand:t.playerHand.toDto(),dealerHand:t.dealerHand.toDto(!0),sideBetResults:t.sideBetResults,...t.insuranceOutcome!==void 0&&{insuranceOutcome:t.insuranceOutcome}};case"split-finished":return{isFinished:!0,multiplier:t.multiplier,randomValues:t.randomValues,mainOutcome:t.mainOutcome,splitOutcome:t.splitOutcome,mainHand:t.mainHand.toDto(),splitHand:t.splitHand.toDto(),dealerHand:t.dealerHand.toDto(!0),sideBetResults:t.sideBetResults,...t.insuranceOutcome!==void 0&&{insuranceOutcome:t.insuranceOutcome}};case"uninitialised":throw new Error("Cannot convert uninitialised state to external state");default:B.Guard.againstNever(a,"Invalid state received")}}createGameStore(){return Wa.createStore({context:$r,on:{START:(t,a)=>{let{state:r}=t;B.Guard.against(r.phase!=="uninitialised","START action requires a fresh game");let e=S(a.randomValuePool.takeOne()),n=S(a.randomValuePool.takeOne()),o=S(a.randomValuePool.takeOne()),i=S(a.randomValuePool.takeOne()),c=N.withInitialDeal([e,n]),u=Q.withInitialDeal({upCard:o,holeCard:i}),p={mainBetAmount:_.default(a.mainBetAmount),pairBonusAmount:_.default(a.pairBonusAmount),threeCardBonusAmount:_.default(a.threeCardBonusAmount)},s={pairBonus:_.default(a.pairBonusAmount).gt(0)?za(a.pairBonusAmount,$a(e,n)):null,threeCardBonus:_.default(a.threeCardBonusAmount).gt(0)?qa(a.threeCardBonusAmount,Xa(e,n,o)):null},l={type:"START",mainBetAmount:a.mainBetAmount,pairBonusAmount:a.pairBonusAmount,threeCardBonusAmount:a.threeCardBonusAmount};if(u.upCard.rank==="Ace")return{state:{...r,isFinished:!1,phase:"awaiting-insurance",playerHand:c,dealerHand:u,betAmounts:p,sideBetResults:s},config:{},playerArgument:l};let m={playerHand:c,dealerHand:u,randomValuePool:a.randomValuePool,playerArgument:l,betAmounts:p,sideBetResults:s};if(c.isBlackjack&&u.isBlackjack)return C({...m,outcome:"PUSH"});if(c.isBlackjack)return C({...m,outcome:"PLAYER_BLACKJACK"});if(u.isBlackjack)return C({...m,outcome:"LOSE"});return{state:{...r,isFinished:!1,phase:"in-progress",playerHand:c,dealerHand:u,insuranceOutcome:void 0,betAmounts:p,sideBetResults:s},config:{},playerArgument:l}},BLACKJACK_BUY_INSURANCE:(t,a)=>{let{state:r}=t;Qa(r);let{playerHand:e,dealerHand:n,betAmounts:o,sideBetResults:i}=r,c={...r,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_BUY_INSURANCE"},betAmounts:o,sideBetResults:i};if(e.isBlackjack&&n.isBlackjack)return C({...c,outcome:"PUSH",insuranceOutcome:"WON"});if(e.isBlackjack)return C({...c,outcome:"PLAYER_BLACKJACK",insuranceOutcome:"LOST"});if(n.isBlackjack)return C({...c,outcome:"LOSE",insuranceOutcome:"WON"});return{state:{...r,phase:"in-progress",insuranceOutcome:"LOST"},config:{},playerArgument:{type:"BLACKJACK_BUY_INSURANCE"},additionalBetAmount:o.mainBetAmount.mul(M)}},BLACKJACK_REJECT_INSURANCE:(t,a)=>{let{state:r}=t;Qa(r);let{playerHand:e,dealerHand:n,betAmounts:o,sideBetResults:i}=r,c={playerHand:e,dealerHand:n,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_REJECT_INSURANCE"},betAmounts:o,sideBetResults:i};if(e.isBlackjack&&n.isBlackjack)return C({...c,outcome:"PUSH"});if(e.isBlackjack)return C({...c,outcome:"PLAYER_BLACKJACK"});if(n.isBlackjack)return C({...c,outcome:"LOSE"});return{state:{...r,phase:"in-progress",insuranceOutcome:void 0},config:{},playerArgument:{type:"BLACKJACK_REJECT_INSURANCE"}}},BLACKJACK_HIT:(t,a)=>{let{state:r}=t;switch(Ft(r),r.phase){case"playing-main-hand":{let e=r.mainHand.addDrawnCards([S(a.randomValuePool.takeOne())]);if(e.isBusted||e.highestHandValue===O){if(r.splitHand.highestHandValue===O)return P({...r,mainHand:e,splitHandDoubledDown:!1,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_HIT"}});return{state:{...r,phase:"playing-split-hand",mainHand:e,splitHandDoubledDown:!1},config:{},playerArgument:{type:"BLACKJACK_HIT"}}}return{state:{...r,mainHand:e},config:{},playerArgument:{type:"BLACKJACK_HIT"}}}case"playing-split-hand":{let e=r.splitHand.addDrawnCards([S(a.randomValuePool.takeOne())]);if(e.isBusted||e.highestHandValue===O)return P({...r,splitHand:e,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_HIT"}});return{state:{...r,splitHand:e},config:{},playerArgument:{type:"BLACKJACK_HIT"}}}case"in-progress":{let e=r.playerHand.addDrawnCards([S(a.randomValuePool.takeOne())]);if(e.isBusted)return C({...r,playerHand:e,outcome:"LOSE",randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_HIT"}});if(e.highestHandValue===O)return Mt({...r,playerHand:e,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_HIT"}});return{state:{...r,phase:"in-progress",playerHand:e},config:{},playerArgument:{type:"BLACKJACK_HIT"}}}default:B.Guard.againstNever(r,"Invalid phase for HIT action")}},BLACKJACK_STAND:(t,a)=>{let{state:r}=t;switch(Ft(r),r.phase){case"playing-main-hand":{if(r.splitHand.highestHandValue===O)return P({...r,splitHandDoubledDown:!1,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_STAND"}});return{state:{...r,phase:"playing-split-hand",splitHandDoubledDown:!1},config:{},playerArgument:{type:"BLACKJACK_STAND"}}}case"playing-split-hand":return P({...r,splitHandDoubledDown:r.splitHandDoubledDown,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_STAND"}});case"in-progress":return Mt({...r,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_STAND"}});default:B.Guard.againstNever(r,"Invalid phase for STAND action")}},BLACKJACK_DOUBLE_DOWN:(t,a)=>{let{state:r}=t;switch(Ft(r),r.phase){case"playing-main-hand":{B.Guard.against(r.mainHand.cards.length!==2,"Double down is only allowed as the first action");let e=r.mainHand.addDrawnCards([S(a.randomValuePool.takeOne())]),{betAmounts:n}=r;if(r.splitHand.highestHandValue===O)return P({...r,mainHand:e,mainHandDoubledDown:!0,splitHandDoubledDown:!1,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_DOUBLE_DOWN"}});return{state:{...r,phase:"playing-split-hand",mainHand:e,mainHandDoubledDown:!0,splitHandDoubledDown:!1},config:{},playerArgument:{type:"BLACKJACK_DOUBLE_DOWN"},additionalBetAmount:n.mainBetAmount.mul(R)}}case"playing-split-hand":{B.Guard.against(r.splitHand.cards.length!==2,"Double down is only allowed as the first action");let e=r.splitHand.addDrawnCards([S(a.randomValuePool.takeOne())]);return P({...r,splitHand:e,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_DOUBLE_DOWN"},splitHandDoubledDown:!0})}case"in-progress":{B.Guard.against(r.playerHand.cards.length!==2,"Double down is only allowed as the first action");let e=r.playerHand.addDrawnCards([S(a.randomValuePool.takeOne())]);if(e.isBusted)return C({...r,playerHand:e,outcome:"LOSE",randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_DOUBLE_DOWN"}});return Mt({...r,playerHand:e,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_DOUBLE_DOWN"}})}default:B.Guard.againstNever(r,"Invalid phase for DOUBLE_DOWN action")}},BLACKJACK_SPLIT:(t,a)=>{let{state:r}=t;zr(r);let{playerHand:e,betAmounts:n,sideBetResults:o}=r;B.Guard.against(e.cards.length!==2,"Split is only allowed with exactly 2 cards");let i=e.cards[0],c=e.cards[1];B.Guard.againstUndefined(i,"First card is missing"),B.Guard.againstUndefined(c,"Second card is missing"),B.Guard.against(i.rank!==c.rank,"Split requires two cards of the same rank");let u=S(a.randomValuePool.takeOne()),p=S(a.randomValuePool.takeOne()),s=N.withInitialDeal([i.value,u]),l=N.withInitialDeal([c.value,p]);if(i.rank==="Ace")return P({...r,mainHand:s,splitHand:l,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_SPLIT"},mainHandDoubledDown:!1,splitHandDoubledDown:!1});let I=s.highestHandValue===O,_t=l.highestHandValue===O;if(I&&_t)return P({mainHand:s,splitHand:l,dealerHand:r.dealerHand,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_SPLIT"},insuranceOutcome:r.insuranceOutcome,mainHandDoubledDown:!1,splitHandDoubledDown:!1,betAmounts:n,sideBetResults:o});if(I)return{state:{...r,phase:"playing-split-hand",mainHand:s,splitHand:l,mainHandDoubledDown:!1,splitHandDoubledDown:!1},config:{},playerArgument:{type:"BLACKJACK_SPLIT"},additionalBetAmount:n.mainBetAmount.mul(j)};return{state:{...r,phase:"playing-main-hand",multiplier:_.default(0),mainHand:s,splitHand:l,mainHandDoubledDown:!1},config:{},playerArgument:{type:"BLACKJACK_SPLIT"},additionalBetAmount:n.mainBetAmount.mul(j)}}}})}getValidNextActionTypes(t){if(t.isFinished)return[];switch(t.phase){case"awaiting-insurance":return["BLACKJACK_BUY_INSURANCE","BLACKJACK_REJECT_INSURANCE"];case"playing-main-hand":{let a=["BLACKJACK_HIT","BLACKJACK_STAND"];if(t.mainHand.cards.length===2)a.push("BLACKJACK_DOUBLE_DOWN");return a}case"playing-split-hand":{let a=["BLACKJACK_HIT","BLACKJACK_STAND"];if(t.splitHand.cards.length===2)a.push("BLACKJACK_DOUBLE_DOWN");return a}case"player-turn":{let a=["BLACKJACK_HIT","BLACKJACK_STAND"];if(t.playerHand.cards.length===2){a.push("BLACKJACK_DOUBLE_DOWN");let r=t.playerHand.cards[0],e=t.playerHand.cards[1];if(B.Guard.againstUndefined(r,"First player card is missing"),B.Guard.againstUndefined(e,"Second player card is missing"),r.rank===e.rank)a.push("BLACKJACK_SPLIT")}return a}default:B.Guard.againstNever(t,"Invalid phase for getting valid actions")}}}var va=H(require("big.js"));class x{multipliers;constructor(t){this.multipliers=t}getMultipliers(t){let a=this.multipliers.get(t);if(a===void 0)throw new Error(`Multipliers for ${t} not found`);return a}getAllMultipliers(){return Array.from(this.multipliers.entries()).map(([t,a])=>({edge:t,multipliers:a}))}}var tr;((i)=>{i.PAIR="PAIR";i.TWO_PAIR="TWO_PAIR";i.THREE_OF_A_KIND="THREE_OF_A_KIND";i.FULL_HOUSE="FULL_HOUSE";i.FOUR_OF_A_KIND="FOUR_OF_A_KIND";i.FIVE_OF_A_KIND="FIVE_OF_A_KIND"})(tr||={});var Xr={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},qr={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},Qr={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},Wr={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},Lr={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},ar=new x(new Map([[1,Xr],[2,qr],[3,Qr],[4,Wr],[8,Lr]])),Kr={2:"PAIR",3:"THREE_OF_A_KIND",4:"FOUR_OF_A_KIND",5:"FIVE_OF_A_KIND"};class rr extends A{constructor(){super("DIAMONDS")}determineGameResult({generator:t,edge:a}){let r=t.getRandomIntsWithReplacement({min:0,max:6,count:5}),e=ar.getMultipliers(a),n=r.values,o=this.calculatePayoutMultiplier(e,n);return{isFinished:!0,payoutMultiplier:va.default(o),outputs:{result:r.values},randomValues:r}}calculatePayoutMultiplier(t,a){let r=new Map;for(let o of a){let i=r.get(o)||0;r.set(o,i+1)}let e=[...r.values()].filter((o)=>o>1),n=this.classifyResult(e);return n===null?0:t[n]}classifyResult(t){if(t.length>2)throw new Error(`Unexpected number of repeats ${t.length}`);let[a,r]=t;if(a===void 0)return null;if(r===void 0){let e=Kr[a];if(e===void 0)throw new Error(`Unexpected single diamond repeat count: ${a}`);return e}return a===3||r===3?"FULL_HOUSE":"TWO_PAIR"}}var gt=H(require("big.js"));var er;((r)=>{r.ABOVE="ABOVE";r.BELOW="BELOW"})(er||={});var Jt=1e4,nr=(t)=>{let a=t.direction==="ABOVE"?Jt-t.selectedValue:t.selectedValue;return new gt.default(a).div(Jt).mul(100)},or=(t,a)=>t.direction==="ABOVE"?a>t.selectedValue:a<t.selectedValue;class ir extends A{constructor(){super("DICE")}determineGameResult({generator:t,edge:a,gameInputs:r}){let e=t.getRandomInt({min:0,max:1e4}),n=nr(r);return{isFinished:!0,payoutMultiplier:or(r,e.value)?T.withWinChance(a,n):new gt.default(0),outputs:{result:e.values},randomValues:e}}}var Ar=H(require("big.js"));var K=require("@betorigami/guard");var $t;((n)=>{n.CLASSIC="CLASSIC";n.LOW_RISK="LOW_RISK";n.MEDIUM_RISK="MEDIUM_RISK";n.HIGH_RISK="HIGH_RISK"})($t||={});var cr=[1,2,3,4,5,6,7,8,9,10],zt=(t)=>{return cr.includes(t)};var lr={[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]}},dr={[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]}},ur={[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]}},sr={[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]}},pr={[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]}},Xt=new x(new Map([[1,lr],[2,dr],[3,ur],[4,sr],[8,pr]]));class Br extends A{constructor(){super("KENO")}determineGameResult({generator:t,edge:a,gameInputs:r}){K.Guard.againstEmptyArray(r.selectedNumbers,()=>d.createValidationError("No numbers selected")),K.Guard.against(r.selectedNumbers.length>10,()=>d.createValidationError("Maximum of 10 numbers can be selected"));for(let l of r.selectedNumbers)K.Guard.againstNonInteger(l,()=>d.createValidationError("Only integers can be selected")),K.Guard.against(l<0||l>39,()=>d.createValidationError("Invalid number selected"));let e=t.getUniqueRandomInts({min:0,max:39,count:10}),n=r.selectedNumbers.filter((l)=>e.values.includes(l)),o=r.selectedNumbers.length;if(!zt(o))throw new Error(`Invalid tile count: ${o}`);let p=Xt.getMultipliers(a)[o][r.riskLevel][n.length];if(p===void 0)throw new Error(`No multiplier found for matching tile count ${n.length}`);return{isFinished:!0,payoutMultiplier:new Ar.default(p),outputs:{result:e.values},randomValues:e}}}var V=H(require("big.js"));var qt=(t,a)=>{return t.gt(a)?t:a};var Qt=(t,a)=>{return t.lt(a)?t:a};class mr extends A{constructor(){super("LIMBO")}determineGameResult({generator:t,edge:a,gameInputs:r}){let e=t.getRandomInt({min:1,max:4294967295}),n=e.max,o=new V.default(16777216),i=new V.default(1),c=new V.default(1e6),u=e.value,p=new V.default(u-1).div(n),s=(100-a)/100,l=o.div(p.mul(o).plus(1)).mul(s),m=qt(i,Qt(l,c));return{isFinished:!0,payoutMultiplier:m.gte(r.targetMultiplier)?new V.default(r.targetMultiplier):new V.default(0),outputs:{randomMultiplier:m,result:e.values},randomValues:e}}}var v=H(require("big.js"));var Ht=(t,a)=>{if(a<0||t<0||a>t)throw new Error("Invalid input: ensure 0 ≤ r ≤ n and n ≥ 0.");if(a>t-a)a=t-a;let r=1;for(let e=1;e<=a;e++)r=r*(t-e+1)/e;return r};class yr extends A{constructor(){super("MINES")}determineGameResult({generator:t,edge:a,gameInputs:r}){if(r.minesCount<=0||r.minesCount>24)throw new Error("Must select between 1 and 24 mines.");if(r.selectedTiles.length>25-r.minesCount)throw new Error("Cannot select more tiles than available safe tiles (total tiles minus mines).");let i=t.getUniqueRandomInts({min:1,max:25,count:r.minesCount}),c=i.values.some((I)=>r.selectedTiles.includes(I)),u=r.hasCashedOut||c,p=(100-a)/100,s=new v.default(Ht(25-r.minesCount,r.selectedTiles.length)).div(new v.default(Ht(25,r.selectedTiles.length))),m=r.hasCashedOut&&!c?new v.default(p).div(s):new v.default(0);return{isFinished:u,payoutMultiplier:m,outputs:{result:i.values},randomValues:i}}}var Er=require("big.js");var Wt;((e)=>{e.LOW_RISK="LOW_RISK";e.MEDIUM_RISK="MEDIUM_RISK";e.HIGH_RISK="HIGH_RISK"})(Wt||={});var vr=[8,9,10,11,12,13,14,15,16],te={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]}},ae={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]}},re={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]}},ee={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]}},ne={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]}},Lt=new x(new Map([[1,te],[2,ae],[3,re],[4,ee],[8,ne]]));class fr extends A{constructor(){super("PLINKO")}determineGameResult({generator:t,gameInputs:a,edge:r}){if(a.numberOfRows%1>0)throw new Error("Number of rows must be an integer");if(a.numberOfRows<8||a.numberOfRows>16)throw new Error("Number of rows must be between 8 and 16");let e=a.numberOfRows,i=Lt.getMultipliers(r)[a.riskLevel][e],c=t.getRandomIntsWithReplacement({min:0,max:1,count:a.numberOfRows}),p=c.values.reduce((l,m)=>l+m,0),s=i[p];if(s===void 0)throw new Error(`No payout found for end position ${p}`);return{isFinished:!0,payoutMultiplier:Er.Big(s),outputs:{result:c.values},randomValues:c}}}var rt=require("big.js");var xt=[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],Kt=[37,...xt],vt=[[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]],ta=[[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]],aa=[[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]],ra=[[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]],ea=[[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]],na=[[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]],oa=[0,1,2,3,37],ia=[[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]],ca=[[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]],w;((r)=>{r.EVEN="EVEN";r.ODD="ODD"})(w||={});var U;((r)=>{r.RED="RED";r.BLACK="BLACK"})(U||={});var G;((r)=>{r.LOW="LOW";r.HIGH="HIGH"})(G||={});var Z;((e)=>{e.TOP="TOP";e.MIDDLE="MIDDLE";e.BOTTOM="BOTTOM"})(Z||={});var k;((e)=>{e.FIRST="FIRST";e.SECOND="SECOND";e.THIRD="THIRD"})(k||={});var Tt;((r)=>{r.AMERICAN="AMERICAN";r.EUROPEAN="EUROPEAN"})(Tt||={});var Rt=(t)=>{if(t.straightBets.length===0&&t.splitBets.length===0&&t.streetBets.length===0&&t.cornerBets.length===0&&t.doubleStreetBets.length===0&&t.parityBets.length===0&&t.colorBets.length===0&&t.halfBets.length===0&&t.columnBets.length===0&&t.dozenBets.length===0)throw d.createValidationError("Must place at least a single bet.");if(!t.straightBets.every((a)=>a.amount.gte(0)&&tt(a.value)))throw d.createValidationError("Invalid straight bet.");if(!t.splitBets.every((a)=>a.amount.gte(0)&&oe(a.values)))throw d.createValidationError("Invalid split bet.");if(!t.streetBets.every((a)=>a.amount.gte(0)&&ie(a.values)))throw d.createValidationError("Invalid street bet.");if(!t.cornerBets.every((a)=>a.amount.gte(0)&&ce(a.values)))throw d.createValidationError("Invalid corner bet.");if(!t.doubleStreetBets.every((a)=>a.amount.gte(0)&&le(a.values)))throw d.createValidationError("Invalid double street bet.");if(!t.parityBets.every((a)=>a.amount.gte(0)&&Object.values(w).includes(a.parity)))throw d.createValidationError("Invalid parity bet.");if(!t.colorBets.every((a)=>a.amount.gte(0)&&Object.values(U).includes(a.color)))throw d.createValidationError("Invalid color bet.");if(!t.halfBets.every((a)=>a.amount.gte(0)&&Object.values(G).includes(a.half)))throw d.createValidationError("Invalid half bet.");if(!t.columnBets.every((a)=>a.amount.gte(0)&&Object.values(Z).includes(a.column)))throw d.createValidationError("Invalid column bet.");if(!t.dozenBets.every((a)=>a.amount.gte(0)&&Object.values(k).includes(a.dozen)))throw d.createValidationError("Invalid dozen bet.")},tt=(t)=>{return xt.includes(t)},oe=(t)=>{if(t.length!==2)return!1;if(!t.every(tt))return!1;return vt.some(([a,r])=>a===t[0]&&r===t[1])},ie=(t)=>{if(t.length!==3)return!1;if(!t.every(tt))return!1;return aa.some(([a,r,e])=>a===t[0]&&r===t[1]&&e===t[2])},ce=(t)=>{if(t.length!==4)return!1;if(!t.every(tt))return!1;return ea.some(([a,r,e,n])=>a===t[0]&&r===t[1]&&e===t[2]&&n===t[3])},le=(t)=>{if(t.length!==6)return!1;if(!t.every(tt))return!1;return ia.some(([a,r,e,n,o,i])=>a===t[0]&&r===t[1]&&e===t[2]&&n===t[3]&&o===t[4]&&i===t[5])};var Pt=(t)=>{if(t.straightBets.length===0&&t.splitBets.length===0&&t.streetBets.length===0&&t.cornerBets.length===0&&t.basketBets.length===0&&t.doubleStreetBets.length===0&&t.parityBets.length===0&&t.colorBets.length===0&&t.halfBets.length===0&&t.columnBets.length===0&&t.dozenBets.length===0)throw d.createValidationError("Must place at least a single bet.");if(!t.straightBets.every((a)=>a.amount.gte(0)&&at(a.value)))throw d.createValidationError("Invalid straight bet.");if(!t.splitBets.every((a)=>a.amount.gte(0)&&de(a.values)))throw d.createValidationError("Invalid split bet.");if(!t.streetBets.every((a)=>a.amount.gte(0)&&ue(a.values)))throw d.createValidationError("Invalid street bet.");if(!t.cornerBets.every((a)=>a.amount.gte(0)&&se(a.values)))throw d.createValidationError("Invalid corner bet.");if(!t.basketBets.every((a)=>a.amount.gte(0)))throw d.createValidationError("Invalid basket bet.");if(!t.doubleStreetBets.every((a)=>a.amount.gte(0)&&pe(a.values)))throw d.createValidationError("Invalid double street bet.");if(!t.parityBets.every((a)=>a.amount.gte(0)&&Object.values(w).includes(a.parity)))throw d.createValidationError("Invalid parity bet.");if(!t.colorBets.every((a)=>a.amount.gte(0)&&Object.values(U).includes(a.color)))throw d.createValidationError("Invalid color bet.");if(!t.halfBets.every((a)=>a.amount.gte(0)&&Object.values(G).includes(a.half)))throw d.createValidationError("Invalid half bet.");if(!t.columnBets.every((a)=>a.amount.gte(0)&&Object.values(Z).includes(a.column)))throw d.createValidationError("Invalid column bet.");if(!t.dozenBets.every((a)=>a.amount.gte(0)&&Object.values(k).includes(a.dozen)))throw d.createValidationError("Invalid dozen bet.")},at=(t)=>{return Kt.includes(t)};function de(t){if(t.length!==2)return!1;if(!t.every(at))return!1;return ta.some(([a,r])=>a===t[0]&&r===t[1])}var ue=(t)=>{if(t.length!==3)return!1;if(!t.every(at))return!1;return ra.some(([a,r,e])=>a===t[0]&&r===t[1]&&e===t[2])},se=(t)=>{if(t.length!==4)return!1;if(!t.every(at))return!1;return na.some(([a,r,e,n])=>a===t[0]&&r===t[1]&&e===t[2]&&n===t[3])},pe=(t)=>{if(t.length!==6)return!1;if(!t.every(at))return!1;return ca.some(([a,r,e,n,o,i])=>a===t[0]&&r===t[1]&&e===t[2]&&n===t[3]&&o===t[4]&&i===t[5])};var Sr={straightBets:36,splitBets:18,streetBets:12,cornerBets:9,basketBets:7,doubleStreetBets:6,parityBets:2,colorBets:2,halfBets:2,columnBets:3,dozenBets:3},Or=[3,6,9,12,15,18,21,24,27,30,33,36],Dr=[2,5,8,11,14,17,20,23,26,29,32,35],Cr=[1,4,7,10,13,16,19,22,25,28,31,34],hr=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],Hr=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35],xr=2.7,Tr=5.3;class la extends A{constructor(){super("ROULETTE")}determineGameResult({generator:t,gameInputs:a}){this.validateInputs(a);let r=t.getRandomInt({min:0,max:this.maxNumber}),e=r.value,n=this.determineBetOutcomes(a,e),{payoutMultiplier:o}=this.getPayoutDetails(a,e);return{outputs:{betOutcomes:n,result:r.values},payoutMultiplier:o,isFinished:!0,randomValues:r}}getBetAmount(t){return this.calculateTotalBetAmount(this.getBetTotals(t))}getPayoutDetails(t,a){let r=this.determineBetOutcomes(t,a),e=this.getBetTotals(t),n=this.getBetTotals(r.winningBets),o=this.calculateTotalBetAmount(e),i=this.calculateTotalPayout(n);return{payoutMultiplier:o.gt(0)?i.div(o):new rt.Big(0),payoutAmount:i}}determineBetOutcomes(t,a){let r={},e={};for(let n of Object.keys(t)){let o=t[n],i=this.betPredicates[n],{winning:c,losing:u}=this.partitionBets(o,i,a);r[n]=c,e[n]=u}return{winningBets:r,losingBets:e}}calculateTotalAmount(t){return t.reduce((a,r)=>a.plus(r.amount),new rt.Big(0))}isWinningStraightBet(t,a){return t.value===a}isWinningSplitBet(t,a){return t.values.some((r)=>r===a)}isWinningStreetBet(t,a){return t.values.some((r)=>r===a)}isWinningCornerBet(t,a){return t.values.some((r)=>r===a)}isWinningDoubleStreetBet(t,a){return t.values.some((r)=>r===a)}isWinningColorBet(t,a){let r=t;return hr.includes(a)&&r.color==="RED"||Hr.includes(a)&&r.color==="BLACK"}isWinningHalfBet(t,a){let r=t;if(a>0&&a<=18&&r.half==="LOW")return!0;if(a>18&&a<=36&&r.half==="HIGH")return!0;return!1}isWinningColumnBet(t,a){let r=t;return Or.includes(a)&&r.column==="TOP"||Dr.includes(a)&&r.column==="MIDDLE"||Cr.includes(a)&&r.column==="BOTTOM"}isWinningDozenBet(t,a){let r=t;if(a>0&&a<=12&&r.dozen==="FIRST")return!0;if(a>12&&a<=24&&r.dozen==="SECOND")return!0;if(a>24&&a<=36&&r.dozen==="THIRD")return!0;return!1}isWinningParityBet(t,a){let r=t;if(a===0||a===37)return!1;let e=a%2===0?"EVEN":"ODD";return r.parity===e}getBetTotals(t){let a={};for(let r of Object.keys(t))a[r]=this.calculateTotalAmount(t[r]);return a}calculateTotalBetAmount(t){return Object.values(t).reduce((a,r)=>a.plus(r),new rt.Big(0))}partitionBets(t,a,r){return{winning:t.filter((e)=>a(e,r)),losing:t.filter((e)=>!a(e,r))}}calculateTotalPayout(t){return Object.entries(t).reduce((a,[r,e])=>{let o=Sr[r];return a.plus(e.mul(o||0))},new rt.Big(0))}}class da extends la{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(t){Rt(t)}}class ua extends la{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(t){Pt(t)}isWinningBasketBet(t,a){return oa.some((r)=>r===a)}}class sa extends A{europeanGame;americanGame;constructor(){super("ROULETTE");this.europeanGame=new da,this.americanGame=new ua}getBetAmount(t){switch(t.type){case"AMERICAN":return this.americanGame.getBetAmount(t.inputs);case"EUROPEAN":return this.europeanGame.getBetAmount(t.inputs);default:throw new Error("Unhandled roulette type")}}determineGameResult(t){let{gameInputs:a,...r}=t;if(t.edge===xr&&a.type==="EUROPEAN"){let e=this.europeanGame.determineGameResult({...r,gameInputs:a.inputs}),{betOutcomes:n}=e.outputs;return{...e,outputs:{type:"european",betOutcomes:n,result:e.outputs.result}}}if(t.edge===Tr&&a.type==="AMERICAN"){let e=this.americanGame.determineGameResult({...r,gameInputs:a.inputs}),{betOutcomes:n}=e.outputs;return{...e,outputs:{type:"american",betOutcomes:n,result:e.outputs.result}}}throw d.createValidationError(`Attempted to play ${a.type} roulette on edge ${t.edge}`)}}var Ae=(t)=>{return new sa().getBetAmount(t)};var Be=(t)=>{if(t.type==="EUROPEAN")Rt(t.inputs);else Pt(t.inputs)};var _r=require("big.js");var Y;((e)=>{e.LOW_RISK="LOW_RISK";e.MEDIUM_RISK="MEDIUM_RISK";e.HIGH_RISK="HIGH_RISK"})(Y||={});var J;((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"})(J||={});var me={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}}},ye={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}}},Ee={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}}},fe={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}}},Se={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}}},Rr=new x(new Map([[1,me],[2,ye],[3,Ee],[4,fe],[8,Se]]));var Pr={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 Ir extends A{constructor(){super("WHEEL")}determineGameResult({generator:t,gameInputs:a,edge:r}){if(!Object.values(J).includes(a.segments))throw new Error("Invalid segments value");if(!Object.values(Y).includes(a.riskLevel))throw new Error("Invalid risk level");let n=Rr.getMultipliers(r)[a.riskLevel];if(n===void 0)throw new Error(`No multipliers found for risk level ${a.riskLevel}`);let o=n[a.segments];if(o===void 0)throw new Error(`No multipliers found for segment ${a.segments}`);let i=Pr[a.riskLevel];if(i===void 0)throw new Error(`No patterns found for risk level ${a.riskLevel}`);let c=i[a.segments];if(c===void 0)throw new Error(`No patterns found for segment ${a.segments}`);let u=t.getRandomInt({min:0,max:c.length-1}),p=c[u.value];if(p===void 0)throw new Error(`No pattern found for segment ${a.segments} and value ${u.value}`);let s=o[p];if(s===void 0)throw new Error(`No payout found for picked segment ${p}`);return{isFinished:!0,payoutMultiplier:new _r.Big(s),outputs:{result:u.values},randomValues:u}}}
package/dist/index.d.ts CHANGED
@@ -13,6 +13,23 @@ export declare class GameError extends Error {
13
13
  errorCode: GameErrorCode;
14
14
  constructor(errorCode: GameErrorCode, message?: string);
15
15
  }
16
+ export declare enum OrigamiGame {
17
+ DICE = "DICE",
18
+ MINES = "MINES",
19
+ KENO = "KENO",
20
+ LIMBO = "LIMBO",
21
+ ADVANCED_DICE = "ADVANCED_DICE",
22
+ BACCARAT = "BACCARAT",
23
+ DIAMONDS = "DIAMONDS",
24
+ PLINKO = "PLINKO",
25
+ ROULETTE = "ROULETTE",
26
+ WHEEL = "WHEEL",
27
+ BLACKJACK = "BLACKJACK"
28
+ }
29
+ export declare abstract class Game {
30
+ readonly gameId: OrigamiGame;
31
+ protected constructor(gameId: OrigamiGame);
32
+ }
16
33
  export type Proof = {
17
34
  proofHash: string;
18
35
  proofString: string;
@@ -46,19 +63,6 @@ export interface RandomNumberGenerator {
46
63
  count: number;
47
64
  }): MultipleRandomValues;
48
65
  }
49
- export declare enum OrigamiGame {
50
- DICE = "DICE",
51
- MINES = "MINES",
52
- KENO = "KENO",
53
- LIMBO = "LIMBO",
54
- ADVANCED_DICE = "ADVANCED_DICE",
55
- BACCARAT = "BACCARAT",
56
- DIAMONDS = "DIAMONDS",
57
- PLINKO = "PLINKO",
58
- ROULETTE = "ROULETTE",
59
- WHEEL = "WHEEL",
60
- BLACKJACK = "BLACKJACK"
61
- }
62
66
  export type EmptyGameOutput = {};
63
67
  export interface GetGameResultRequest<TGameInputs> {
64
68
  generator: RandomNumberGenerator;
@@ -73,8 +77,7 @@ export interface GameResult<TGameOutputs = EmptyGameOutput> {
73
77
  };
74
78
  randomValues: SingleRandomValue | MultipleRandomValues;
75
79
  }
76
- export declare abstract class Game<TGameInputs, TGameOutputs = EmptyGameOutput> {
77
- readonly gameId: OrigamiGame;
80
+ export declare abstract class SingleActionGame<TGameInputs, TGameOutputs = EmptyGameOutput> extends Game {
78
81
  protected constructor(gameId: OrigamiGame);
79
82
  getGameResult(request: GetGameResultRequest<TGameInputs>): GameResult<TGameOutputs>;
80
83
  protected abstract determineGameResult(request: GetGameResultRequest<TGameInputs>): GameResult<TGameOutputs>;
@@ -113,7 +116,7 @@ export type RollBetweenTwo = {
113
116
  export type AdvancedDiceInputs = RollBetween | RollOutside | RollBetweenTwo;
114
117
  export declare const calculateAdvancedDiceWinChance: (gameInputs: AdvancedDiceInputs) => Big$1.Big;
115
118
  export declare const validateAdvancedDiceInputs: (gameInputs: AdvancedDiceInputs) => void;
116
- export declare class AdvancedDice extends Game<AdvancedDiceInputs> {
119
+ export declare class AdvancedDice extends SingleActionGame<AdvancedDiceInputs> {
117
120
  constructor();
118
121
  protected determineGameResult({ generator, edge, gameInputs }: GetGameResultRequest<AdvancedDiceInputs>): GameResult;
119
122
  }
@@ -169,7 +172,7 @@ export interface BaccaratGameOutputs {
169
172
  gameOutcome: BaccaratOutcome;
170
173
  }
171
174
  export declare const calculateBaccaratBetAmount: (gameInputs: BaccaratGameInputs) => Big$1;
172
- export declare class Baccarat extends Game<BaccaratGameInputs, BaccaratGameOutputs> {
175
+ export declare class Baccarat extends SingleActionGame<BaccaratGameInputs, BaccaratGameOutputs> {
173
176
  constructor();
174
177
  protected determineGameResult({ generator, gameInputs, edge }: GetGameResultRequest<BaccaratGameInputs>): GameResult<BaccaratGameOutputs>;
175
178
  private validateGameInputs;
@@ -232,6 +235,39 @@ export declare enum BlackjackActionType {
232
235
  DOUBLE_DOWN = "BLACKJACK_DOUBLE_DOWN",
233
236
  SPLIT = "BLACKJACK_SPLIT"
234
237
  }
238
+ export declare enum PairBonusType {
239
+ EXACT_PAIR = "EXACT_PAIR",
240
+ COLORED_PAIR = "COLORED_PAIR",
241
+ MIXED_PAIR = "MIXED_PAIR",
242
+ LOSS = "LOSS"
243
+ }
244
+ export declare enum ThreeCardBonusType {
245
+ SUITED_TRIPS = "SUITED_TRIPS",
246
+ STRAIGHT_FLUSH = "STRAIGHT_FLUSH",
247
+ THREE_OF_A_KIND = "THREE_OF_A_KIND",
248
+ STRAIGHT = "STRAIGHT",
249
+ FLUSH = "FLUSH",
250
+ LOSS = "LOSS"
251
+ }
252
+ export type BetAmounts = Readonly<{
253
+ mainBetAmount: Big$1;
254
+ pairBonusAmount: Big$1;
255
+ threeCardBonusAmount: Big$1;
256
+ }>;
257
+ export type PairBonusResult = Readonly<{
258
+ betAmount: string;
259
+ payoutMultiplier: number;
260
+ result: PairBonusType;
261
+ }>;
262
+ export type ThreeCardBonusResult = Readonly<{
263
+ betAmount: string;
264
+ payoutMultiplier: number;
265
+ result: ThreeCardBonusType;
266
+ }>;
267
+ export type SideBetResults = Readonly<{
268
+ pairBonus: PairBonusResult | null;
269
+ threeCardBonus: ThreeCardBonusResult | null;
270
+ }>;
235
271
  export declare const BLACKJACK_MULTIPLIER = 2.5;
236
272
  export declare const WIN_MULTIPLIER = 2;
237
273
  export declare const PUSH_MULTIPLIER = 1;
@@ -249,6 +285,8 @@ export declare const CARDS_PER_SUIT = 13;
249
285
  export declare const ACE_SOFT_BONUS = 10;
250
286
  export declare const FACE_CARD_VALUE = 10;
251
287
  export declare const BASE_PAYOUT_MULTIPLIERS: Record<BlackjackOutcome, number>;
288
+ export declare const PAIR_BONUS_PAYOUTS: Record<PairBonusType, number>;
289
+ export declare const THREE_CARD_BONUS_PAYOUTS: Record<ThreeCardBonusType, number>;
252
290
  declare class Card$1 {
253
291
  readonly value: CardValue;
254
292
  constructor(rawValue: number);
@@ -313,11 +351,11 @@ export declare class RandomValuePool {
313
351
  }
314
352
  export type BaseInProgressState = Readonly<{
315
353
  isFinished: false;
316
- multiplier: number;
354
+ multiplier: Big$1;
317
355
  }>;
318
356
  export type BaseFinishedState = Readonly<{
319
357
  isFinished: true;
320
- multiplier: number;
358
+ multiplier: Big$1;
321
359
  randomValues: number[];
322
360
  }>;
323
361
  export type BaseGameState = BaseInProgressState | BaseFinishedState;
@@ -325,7 +363,7 @@ export type GameContext<TAction, TState extends BaseGameState, TConfig> = {
325
363
  readonly playerArgument: TAction;
326
364
  readonly state: TState;
327
365
  readonly config: TConfig;
328
- readonly betAmountMultiplier?: number;
366
+ readonly additionalBetAmount?: Big$1;
329
367
  };
330
368
  export type RandomValuePoolEvent = Readonly<{
331
369
  randomValuePool: RandomValuePool;
@@ -344,11 +382,11 @@ export interface GameStore<TInternalState extends BaseGameState, TAction, TConfi
344
382
  readonly context: GameContext<TAction, TInternalState, TConfig>;
345
383
  };
346
384
  }
347
- declare abstract class NewGame<TInternalState extends BaseGameState, TExternalState extends BaseGameState, TAction extends {
385
+ export declare abstract class MultiActionGame<TInternalState extends BaseGameState, TExternalState extends BaseGameState, TAction extends {
348
386
  readonly type: string;
349
- }, TConfig> {
387
+ }, TConfig> extends Game {
350
388
  readonly edge: number;
351
- constructor(edge: number);
389
+ constructor(gameId: OrigamiGame, edge: number);
352
390
  abstract getValidNextActionTypes(state: TExternalState): ReadonlyArray<TAction["type"]>;
353
391
  protected abstract createGameStore(): GameStore<TInternalState, TAction, TConfig>;
354
392
  protected abstract generateRandomValues(generator: RandomNumberGenerator): RandomValuePool;
@@ -359,6 +397,9 @@ declare abstract class NewGame<TInternalState extends BaseGameState, TExternalSt
359
397
  }
360
398
  export type BlackjackStartAction = Readonly<{
361
399
  type: BlackjackActionType.START;
400
+ mainBetAmount: string;
401
+ pairBonusAmount: string;
402
+ threeCardBonusAmount: string;
362
403
  }>;
363
404
  export type BlackjackHitAction = Readonly<{
364
405
  type: BlackjackActionType.HIT;
@@ -382,6 +423,7 @@ export type BlackjackAction = BlackjackStartAction | BlackjackHitAction | Blackj
382
423
  export type BlackjackSingleHandStateBase = Readonly<{
383
424
  playerHand: BlackjackHandDto;
384
425
  dealerHand: BlackjackHandDto;
426
+ sideBetResults: SideBetResults;
385
427
  }>;
386
428
  export type BlackjackAwaitingInsuranceState = Simplify<BlackjackSingleHandStateBase & BaseInProgressState & {
387
429
  phase: "awaiting-insurance";
@@ -393,6 +435,7 @@ export type BlackjackSplitHandStateBase = Readonly<{
393
435
  mainHand: BlackjackHandDto;
394
436
  splitHand: BlackjackHandDto;
395
437
  dealerHand: BlackjackHandDto;
438
+ sideBetResults: SideBetResults;
396
439
  }>;
397
440
  export type BlackjackPlayingMainHandState = Simplify<BlackjackSplitHandStateBase & BaseInProgressState & {
398
441
  phase: "playing-main-hand";
@@ -418,12 +461,16 @@ export type BlackjackInternalAwaitingInsuranceState = BaseInProgressState & {
418
461
  readonly phase: "awaiting-insurance";
419
462
  readonly playerHand: PlayerHand;
420
463
  readonly dealerHand: DealerHand;
464
+ readonly betAmounts: BetAmounts;
465
+ readonly sideBetResults: SideBetResults;
421
466
  };
422
467
  export type BlackjackInternalInProgressState = BaseInProgressState & {
423
468
  readonly phase: "in-progress";
424
469
  readonly playerHand: PlayerHand;
425
470
  readonly dealerHand: DealerHand;
426
471
  readonly insuranceOutcome: InsuranceOutcome | undefined;
472
+ readonly betAmounts: BetAmounts;
473
+ readonly sideBetResults: SideBetResults;
427
474
  };
428
475
  export type BlackjackInternalPlayingMainHandState = BaseInProgressState & {
429
476
  readonly phase: "playing-main-hand";
@@ -432,6 +479,8 @@ export type BlackjackInternalPlayingMainHandState = BaseInProgressState & {
432
479
  readonly dealerHand: DealerHand;
433
480
  readonly insuranceOutcome: InsuranceOutcome | undefined;
434
481
  readonly mainHandDoubledDown: boolean;
482
+ readonly betAmounts: BetAmounts;
483
+ readonly sideBetResults: SideBetResults;
435
484
  };
436
485
  export type BlackjackInternalPlayingSplitHandState = BaseInProgressState & {
437
486
  readonly phase: "playing-split-hand";
@@ -441,6 +490,8 @@ export type BlackjackInternalPlayingSplitHandState = BaseInProgressState & {
441
490
  readonly insuranceOutcome: InsuranceOutcome | undefined;
442
491
  readonly mainHandDoubledDown: boolean;
443
492
  readonly splitHandDoubledDown: boolean;
493
+ readonly betAmounts: BetAmounts;
494
+ readonly sideBetResults: SideBetResults;
444
495
  };
445
496
  export type BlackjackInternalFinishedState = BaseFinishedState & {
446
497
  readonly phase: "finished";
@@ -448,6 +499,7 @@ export type BlackjackInternalFinishedState = BaseFinishedState & {
448
499
  readonly dealerHand: DealerHand;
449
500
  readonly outcome: BlackjackOutcome;
450
501
  readonly insuranceOutcome?: InsuranceOutcome;
502
+ readonly sideBetResults: SideBetResults;
451
503
  };
452
504
  export type BlackjackInternalSplitFinishedState = BaseFinishedState & {
453
505
  readonly phase: "split-finished";
@@ -457,10 +509,12 @@ export type BlackjackInternalSplitFinishedState = BaseFinishedState & {
457
509
  readonly mainOutcome: BlackjackOutcome;
458
510
  readonly splitOutcome: BlackjackOutcome;
459
511
  readonly insuranceOutcome?: InsuranceOutcome;
512
+ readonly sideBetResults: SideBetResults;
460
513
  };
461
514
  export type BlackjackInternalState = BlackjackInternalUninitialisedState | BlackjackInternalAwaitingInsuranceState | BlackjackInternalInProgressState | BlackjackInternalPlayingMainHandState | BlackjackInternalPlayingSplitHandState | BlackjackInternalFinishedState | BlackjackInternalSplitFinishedState;
462
515
  export type BlackjackGameContext = GameContext<BlackjackAction, BlackjackState, BlackjackConfig>;
463
- export declare class Blackjack extends NewGame<BlackjackInternalState, BlackjackState, BlackjackAction, BlackjackConfig> {
516
+ export declare class Blackjack extends MultiActionGame<BlackjackInternalState, BlackjackState, BlackjackAction, BlackjackConfig> {
517
+ constructor(edge: number);
464
518
  protected generateRandomValues(generator: RandomNumberGenerator): RandomValuePool;
465
519
  protected toExternalState(internal: BlackjackInternalState): BlackjackState;
466
520
  protected createGameStore(): GameStore<BlackjackInternalState, BlackjackAction, BlackjackConfig>;
@@ -487,7 +541,7 @@ export declare enum DiamondsResultType {
487
541
  }
488
542
  export type DiamondsMultipliers = Record<keyof typeof DiamondsResultType, number>;
489
543
  export declare const diamondsMultipliers: MultiplierContainer<DiamondsMultipliers>;
490
- export declare class Diamonds extends Game<DiamondsGameInputs> {
544
+ export declare class Diamonds extends SingleActionGame<DiamondsGameInputs> {
491
545
  constructor();
492
546
  protected determineGameResult({ generator, edge }: GetGameResultRequest<DiamondsGameInputs>): GameResult;
493
547
  private calculatePayoutMultiplier;
@@ -504,7 +558,7 @@ export interface DiceGameInputs {
504
558
  export declare const DICE_EFFECTIVE_RANGE = 10000;
505
559
  export declare const calculateDiceWinChance: (gameInputs: DiceGameInputs) => Big$1;
506
560
  export declare const hasDiceWon: (gameInputs: DiceGameInputs, rolledValue: number) => boolean;
507
- export declare class Dice extends Game<DiceGameInputs> {
561
+ export declare class Dice extends SingleActionGame<DiceGameInputs> {
508
562
  constructor();
509
563
  protected determineGameResult({ generator, edge, gameInputs }: GetGameResultRequest<DiceGameInputs>): GameResult;
510
564
  }
@@ -532,7 +586,7 @@ export interface KenoGameInputs {
532
586
  riskLevel: KenoRiskLevel;
533
587
  selectedNumbers: number[];
534
588
  }
535
- export declare class Keno extends Game<KenoGameInputs> {
589
+ export declare class Keno extends SingleActionGame<KenoGameInputs> {
536
590
  constructor();
537
591
  protected determineGameResult({ generator, edge, gameInputs }: GetGameResultRequest<KenoGameInputs>): GameResult;
538
592
  }
@@ -549,7 +603,7 @@ export interface LimboGameInputs {
549
603
  export interface LimboGameOutputs {
550
604
  randomMultiplier: Big$1;
551
605
  }
552
- export declare class Limbo extends Game<LimboGameInputs, LimboGameOutputs> {
606
+ export declare class Limbo extends SingleActionGame<LimboGameInputs, LimboGameOutputs> {
553
607
  constructor();
554
608
  protected determineGameResult({ generator, edge, gameInputs }: GetGameResultRequest<LimboGameInputs>): GameResult<LimboGameOutputs>;
555
609
  }
@@ -558,7 +612,7 @@ export interface MinesGameInputs {
558
612
  selectedTiles: number[];
559
613
  hasCashedOut: boolean;
560
614
  }
561
- export declare class Mines extends Game<MinesGameInputs> {
615
+ export declare class Mines extends SingleActionGame<MinesGameInputs> {
562
616
  constructor();
563
617
  protected determineGameResult({ generator, edge, gameInputs }: GetGameResultRequest<MinesGameInputs>): GameResult;
564
618
  }
@@ -571,7 +625,7 @@ export interface PlinkoGameInputs {
571
625
  numberOfRows: number;
572
626
  riskLevel: PlinkoRiskLevel;
573
627
  }
574
- export declare class Plinko extends Game<PlinkoGameInputs> {
628
+ export declare class Plinko extends SingleActionGame<PlinkoGameInputs> {
575
629
  constructor();
576
630
  protected determineGameResult({ generator, gameInputs, edge }: GetGameResultRequest<PlinkoGameInputs>): GameResult;
577
631
  }
@@ -1932,7 +1986,7 @@ declare abstract class BaseRoulette<TInputs extends {
1932
1986
  losingBets: TInputs;
1933
1987
  };
1934
1988
  result: number[];
1935
- }> extends Game<TInputs, TOutputs> {
1989
+ }> extends SingleActionGame<TInputs, TOutputs> {
1936
1990
  protected abstract readonly maxNumber: number;
1937
1991
  constructor();
1938
1992
  determineGameResult({ generator, gameInputs }: GetGameResultRequest<TInputs>): GameResult<TOutputs>;
@@ -1976,7 +2030,7 @@ export declare class AmericanRoulette extends BaseRoulette<AmericanRouletteGameI
1976
2030
  protected validateInputs(inputs: AmericanRouletteGameInputs): void;
1977
2031
  protected isWinningBasketBet(_bet: BaseBet, gameResult: number): boolean;
1978
2032
  }
1979
- export declare class Roulette extends Game<RouletteGameInputs, RouletteGameOutputs> {
2033
+ export declare class Roulette extends SingleActionGame<RouletteGameInputs, RouletteGameOutputs> {
1980
2034
  private readonly europeanGame;
1981
2035
  private readonly americanGame;
1982
2036
  constructor();
@@ -2001,7 +2055,7 @@ export interface WheelGameInputs {
2001
2055
  segments: WheelSegments;
2002
2056
  riskLevel: WheelRiskLevel;
2003
2057
  }
2004
- export declare class Wheel extends Game<WheelGameInputs> {
2058
+ export declare class Wheel extends SingleActionGame<WheelGameInputs> {
2005
2059
  constructor();
2006
2060
  protected determineGameResult({ generator, gameInputs, edge }: GetGameResultRequest<WheelGameInputs>): GameResult;
2007
2061
  }
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- var _E;((E)=>E.INPUT_VALIDATION_ERROR="INPUT_VALIDATION_ERROR")(_E||={});class c extends Error{static createValidationError(r){return new c("INPUT_VALIDATION_ERROR",r)}static isGameError(r){return r instanceof c}errorCode;constructor(r,E){super(E);this.errorCode=r}}var w;((D)=>{D.DICE="DICE";D.MINES="MINES";D.KENO="KENO";D.LIMBO="LIMBO";D.ADVANCED_DICE="ADVANCED_DICE";D.BACCARAT="BACCARAT";D.DIAMONDS="DIAMONDS";D.PLINKO="PLINKO";D.ROULETTE="ROULETTE";D.WHEEL="WHEEL";D.BLACKJACK="BLACKJACK"})(w||={});class S{gameId;constructor(r){this.gameId=r}getGameResult(r){return this.determineGameResult(r)}}import{Big as zr}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,cr=1e4,Yr=10001,CE=0.01,UE=98,GE=(r)=>{if(r<Br)throw c.createValidationError(`Lower bound ${r} is below minimum allowed value ${Br}`)},TE=(r)=>{if(r>cr)throw c.createValidationError(`Upper bound ${r} is above maximum allowed value ${cr}`)},l=(r)=>{if(GE(r.lower),TE(r.upper),r.lower>=r.upper)throw c.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 c.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 l(r.bounds),xr(r.bounds);case"ROLL_OUTSIDE":return l(r.bounds),Yr-wE(r.bounds);case"ROLL_BETWEEN_TWO":return l(r.firstBounds),l(r.secondBounds),ME(r.firstBounds,r.secondBounds),xr(r.firstBounds)+xr(r.secondBounds)}})(),t=zr(A).div(Yr).mul(100);if(t.lt(CE))throw c.createValidationError("Win chance too low");if(t.gt(UE))throw c.createValidationError("Win chance too high");return t},e1=(r)=>{$r(r)};class uE extends S{constructor(){super("ADVANCED_DICE")}determineGameResult({generator:r,edge:E,gameInputs:A}){let t=$r(A),f=r.getRandomInt({min:Br,max:cr}),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 zr(0),outputs:{result:f.values},randomValues:f}}}import p from"big.js";var VE=["Clubs","Diamonds","Hearts","Spades"],yE=["Ace","2","3","4","5","6","7","8","9","10","Jack","Queen","King"],YE;((t)=>{t.PLAYER_WIN="PLAYER_WIN";t.TIE="TIE";t.BANKER_WIN="BANKER_WIN"})(YE||={});var zE;((t)=>{t.PLAYER="PLAYER";t.TIE="TIE";t.BANKER="BANKER"})(zE||={});var $E={["PLAYER_WIN"]:{betType:"PLAYER",multiplier:2},["TIE"]:{betType:"TIE",multiplier:9},["BANKER_WIN"]:{betType:"BANKER",multiplier:1.95}},pE=(r)=>{return new p(0).add(r.bets.reduce((A,t)=>A.add(t.amount),new p(0)))};class PE extends S{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=[],B=0;for(let C of O.slice(0,2)){let b=this.mapRandomValueToCard(C),g=this.mapRandomValueToCardValue(C);x.push(b),B=(B+g)%10}let Z=[],N=0;for(let C of o.slice(0,2)){let b=this.mapRandomValueToCard(C),g=this.mapRandomValueToCardValue(C);Z.push(b),N=(N+g)%10}if(!this.isNaturalWin(B,N)){let C=this.shouldDrawThirdPlayerCard(B),b=null;if(C)b=this.mapRandomValueToCardValue(O[2]),x.push(this.mapRandomValueToCard(O[2])),B=(B+b)%10;if(this.shouldDrawThirdBankerCard(N,b))Z.push(this.mapRandomValueToCard(o[2])),N=(N+this.mapRandomValueToCardValue(o[2]))%10}let D;if(B===N)D="TIE";else D=B>N?"PLAYER_WIN":"BANKER_WIN";let M=pE(E),{betType:v,multiplier:NE}=$E[D],Q=new p(0);if(Q=Q.add(E.bets.filter((C)=>C.type===v).reduce((C,b)=>C.add(b.amount.mul(NE)),new p(0))),D==="TIE")Q=Q.add(E.bets.filter((C)=>C.type==="PLAYER"||C.type==="BANKER").reduce((C,b)=>C.add(b.amount),new p(0)));return{isFinished:!0,payoutMultiplier:M.gt(0)?Q.div(M):new p(0),outputs:{playerCards:x,playerHandValue:B,bankerCards:Z,bankerHandValue:N,gameOutcome:D,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=VE[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 Dr;((f)=>{f.WIN="WIN";f.LOSE="LOSE";f.PUSH="PUSH";f.PLAYER_BLACKJACK="PLAYER_BLACKJACK"})(Dr||={});var Zr;((A)=>{A.WON="WON";A.LOST="LOST"})(Zr||={});var Sr;((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"})(Sr||={});var FE=2.5,JE=2,RE=1,qE=0,pr=17,Nr=21,h=21,_r=63,o2=1.5,X=0.5,Pr=1.5,z=1,d=1,x2=13,Cr=10,Fr=10,k={PLAYER_BLACKJACK:FE,WIN:JE,PUSH:RE,LOSE:qE};import{Guard as _}from"@betorigami/guard";import{createStore as dE}from"@xstate/store";var Jr=0,Rr=51,s=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"],Ir=["Jack","Queen","King"];import{Guard as IE}from"@betorigami/guard";import{Guard as Ur}from"@betorigami/guard";class Gr{value;constructor(r){let E=s[r];Ur.againstNullOrUndefined(E,`Invalid card value: ${r}`),this.value=E}get suit(){let r=Math.floor(this.value/13),E=qr[r];return Ur.againstNullOrUndefined(E,`Invalid suit index: ${r}`),E}get rank(){let r=this.value%13,E=a[r];return Ur.againstNullOrUndefined(E,`Invalid rank index: ${r}`),E}toDto(){return{rank:this.rank,suit:this.suit,cardValue:this.value}}}class u extends Gr{get numericRank(){if(Ir.includes(this.rank))return Fr;return a.indexOf(this.rank)+1}static fromValue(r){return IE.against(!s.includes(r),`Invalid card value: ${r}`),new u(r)}}class j{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<=Nr)this.softHandValue=this.hardHandValue+Cr}get cardCount(){return this.cards.length}get hasSoftHandValue(){return this.softHandValue!==null}get isBusted(){return this.hardHandValue>Nr}get isBlackjack(){return this.cardCount===2&&this.highestHandValue===h}get highestHandValue(){return this.softHandValue!==null?this.softHandValue:this.hardHandValue}}class i{cards;value;constructor(r){this.cards=r.map((E)=>u.fromValue(E)),this.value=new j(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 m extends i{otherCards;upCard;holeCard;constructor(r,E,A=[]){super([r,E,...A]);this.otherCards=A;this.upCard=u.fromValue(r),this.holeCard=u.fromValue(E)}static withInitialDeal(r){return new m(r.upCard,r.holeCard)}addDrawnCards(r){return new m(this.upCard.value,this.holeCard.value,[...this.otherCards,...r])}toDto(r=!1){if(r)return super.toDto();return{cards:[this.upCard.toDto()],value:new j([this.upCard]).highestHandValue}}}class $ extends i{static withInitialDeal(r){return new $(r)}addDrawnCards(r){return new $([...this.rawValues,...r])}}import{Guard as n}from"@betorigami/guard";class e{source;index=0;constructor(r){this.source=r}static from(r,E){return n.against(E<=0,`Count must be positive, got ${E}`),n.against(r.values.length!==E,`Expected ${E} values, got ${r.values.length}`),new e(r)}get consumedValues(){return this.source.values.slice(0,this.index)}toMultipleRandomValues(){return this.source}takeOne(){let r=this.source.values[this.index];return n.againstUndefined(r,"RandomValuePool exhausted"),this.index+=1,r}take(r){n.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 QE}from"@betorigami/guard";import XE from"fast-deep-equal";class Tr{edge;constructor(r){this.edge=r}play(r,E,A=[]){let t=this.createGameStore(),f=this.generateRandomValues(r),O=f.toMultipleRandomValues();for(let B of A)t.send({...B.playerArgument,randomValuePool:f});let o=A[A.length-1];if(o)QE.against(!XE(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 U from"big.js";var Qr={BLACKJACK_DOUBLE_DOWN:z,BLACKJACK_BUY_INSURANCE:X,BLACKJACK_SPLIT:d},Xr=(r)=>r==="WON"?U(Pr):U(0),dr=(r)=>r!==void 0?U(X):U(0),jr=(r)=>{let E=r.actionType==="BLACKJACK_DOUBLE_DOWN",A=U(1),t=E?U(z):U(0),f=dr(r.insuranceOutcome),O=A.plus(t).plus(f),o=A.plus(t),x=U(k[r.outcome]).mul(o),B=Xr(r.insuranceOutcome);return{payoutMultiplier:x.plus(B).div(O).toNumber(),betAmountMultiplier:Qr[r.actionType]}},ir=(r)=>{let E=r.mainHandDoubledDown?U(1).plus(z):U(1),A=r.splitHandDoubledDown?U(1).plus(z):U(1),t=dr(r.insuranceOutcome),f=E.plus(A).plus(t),O=U(k[r.mainOutcome]).mul(E),o=U(k[r.splitOutcome]).mul(A),x=Xr(r.insuranceOutcome);return{payoutMultiplier:O.plus(o).plus(x).div(f).toNumber(),betAmountMultiplier:Qr[r.actionType]}};var jE={state:{isFinished:!1,phase:"uninitialised",multiplier:1},config:{},playerArgument:{type:"START"}},G=(r)=>u.fromValue(r).value;function iE(r){_.against(r.phase!=="in-progress","Expected a started, in-progress game state")}function mr(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 Hr=(r,E)=>{let A=E;while(A.highestHandValue<pr)A=A.addDrawnCards([G(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"},T=(r)=>{let{payoutMultiplier:E,betAmountMultiplier:A}=jr({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=Hr(r.randomValuePool,r.dealerHand),A=wr(r.playerHand,E);return T({...r,dealerHand:E,outcome:A})},y=(r)=>{let A=r.mainHand.isBusted&&r.splitHand.isBusted?r.dealerHand:Hr(r.randomValuePool,r.dealerHand),t=wr(r.mainHand,A),f=wr(r.splitHand,A),{payoutMultiplier:O,betAmountMultiplier:o}=ir({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 mE extends Tr{generateRandomValues(r){return e.from(r.getRandomIntsWithReplacement({min:Jr,max:Rr,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:jE,on:{START:(r,E)=>{let{state:A}=r;_.against(A.phase!=="uninitialised","START action requires a fresh game");let t=G(E.randomValuePool.takeOne()),f=G(E.randomValuePool.takeOne()),O=G(E.randomValuePool.takeOne()),o=G(E.randomValuePool.takeOne()),x=$.withInitialDeal([t,f]),B=m.withInitialDeal({upCard:O,holeCard:o});if(B.upCard.rank==="Ace")return{state:{...A,isFinished:!1,phase:"awaiting-insurance",playerHand:x,dealerHand:B},config:{},playerArgument:{type:"START"}};if(x.isBlackjack&&B.isBlackjack)return T({...A,playerHand:x,dealerHand:B,outcome:"PUSH",randomValuePool:E.randomValuePool,actionType:"START"});if(x.isBlackjack)return T({...A,playerHand:x,dealerHand:B,outcome:"PLAYER_BLACKJACK",randomValuePool:E.randomValuePool,actionType:"START"});if(B.isBlackjack)return T({...A,playerHand:x,dealerHand:B,outcome:"LOSE",randomValuePool:E.randomValuePool,actionType:"START"});return{state:{...A,isFinished:!1,phase:"in-progress",playerHand:x,dealerHand:B,insuranceOutcome:void 0},config:{},playerArgument:{type:"START"}}},BLACKJACK_BUY_INSURANCE:(r,E)=>{let{state:A}=r;mr(A);let{playerHand:t,dealerHand:f}=A,O={...A,randomValuePool:E.randomValuePool,actionType:"BLACKJACK_BUY_INSURANCE"};if(t.isBlackjack&&f.isBlackjack)return T({...O,outcome:"PUSH",insuranceOutcome:"WON"});if(t.isBlackjack)return T({...O,outcome:"PLAYER_BLACKJACK",insuranceOutcome:"LOST"});if(f.isBlackjack)return T({...O,outcome:"LOSE",insuranceOutcome:"WON"});return{state:{...A,phase:"in-progress",insuranceOutcome:"LOST"},config:{},playerArgument:{type:"BLACKJACK_BUY_INSURANCE"},betAmountMultiplier:X}},BLACKJACK_REJECT_INSURANCE:(r,E)=>{let{state:A}=r;mr(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 T({...O,outcome:"PUSH"});if(t.isBlackjack)return T({...O,outcome:"PLAYER_BLACKJACK"});if(f.isBlackjack)return T({...O,outcome:"LOSE"});return{state:{...A,phase:"in-progress",insuranceOutcome:void 0},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([G(E.randomValuePool.takeOne())]);if(t.isBusted||t.highestHandValue===h){if(A.splitHand.highestHandValue===h)return y({...A,mainHand:t,splitHandDoubledDown:!1,randomValuePool:E.randomValuePool,actionType:"BLACKJACK_HIT"});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([G(E.randomValuePool.takeOne())]);if(t.isBusted||t.highestHandValue===h)return y({...A,splitHand:t,randomValuePool:E.randomValuePool,actionType:"BLACKJACK_HIT"});return{state:{...A,splitHand:t},config:{},playerArgument:{type:"BLACKJACK_HIT"}}}case"in-progress":{let t=A.playerHand.addDrawnCards([G(E.randomValuePool.takeOne())]);if(t.isBusted)return T({...A,playerHand:t,outcome:"LOSE",randomValuePool:E.randomValuePool,actionType:"BLACKJACK_HIT"});if(t.highestHandValue===h)return br({...A,playerHand:t,randomValuePool:E.randomValuePool,actionType:"BLACKJACK_HIT"});return{state:{...A,phase:"in-progress",playerHand: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":{if(A.splitHand.highestHandValue===h)return y({...A,splitHandDoubledDown:!1,randomValuePool:E.randomValuePool,actionType:"BLACKJACK_STAND"});return{state:{...A,phase:"playing-split-hand",splitHandDoubledDown:!1},config:{},playerArgument:{type:"BLACKJACK_STAND"}}}case"playing-split-hand":return y({...A,splitHandDoubledDown:A.splitHandDoubledDown,randomValuePool:E.randomValuePool,actionType:"BLACKJACK_STAND"});case"in-progress":return br({...A,randomValuePool:E.randomValuePool,actionType:"BLACKJACK_STAND"});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([G(E.randomValuePool.takeOne())]);if(A.splitHand.highestHandValue===h)return y({...A,mainHand:t,mainHandDoubledDown:!0,splitHandDoubledDown:!1,randomValuePool:E.randomValuePool,actionType:"BLACKJACK_DOUBLE_DOWN"});return{state:{...A,phase:"playing-split-hand",mainHand:t,mainHandDoubledDown:!0,splitHandDoubledDown:!1},config:{},playerArgument:{type:"BLACKJACK_DOUBLE_DOWN"},betAmountMultiplier:z}}case"playing-split-hand":{_.against(A.splitHand.cards.length!==2,"Double down is only allowed as the first action");let t=A.splitHand.addDrawnCards([G(E.randomValuePool.takeOne())]);return y({...A,splitHand:t,randomValuePool:E.randomValuePool,actionType:"BLACKJACK_DOUBLE_DOWN",splitHandDoubledDown:!0})}case"in-progress":{_.against(A.playerHand.cards.length!==2,"Double down is only allowed as the first action");let t=A.playerHand.addDrawnCards([G(E.randomValuePool.takeOne())]);if(t.isBusted)return T({...A,playerHand:t,outcome:"LOSE",randomValuePool:E.randomValuePool,actionType:"BLACKJACK_DOUBLE_DOWN"});return br({...A,playerHand:t,randomValuePool:E.randomValuePool,actionType:"BLACKJACK_DOUBLE_DOWN"})}default:_.againstNever(A,"Invalid phase for DOUBLE_DOWN action")}},BLACKJACK_SPLIT:(r,E)=>{let{state:A}=r;iE(A);let{playerHand:t}=A;_.against(t.cards.length!==2,"Split is only allowed with exactly 2 cards");let f=t.cards[0],O=t.cards[1];_.againstUndefined(f,"First card is missing"),_.againstUndefined(O,"Second card is missing"),_.against(f.rank!==O.rank,"Split requires two cards of the same rank");let o=G(E.randomValuePool.takeOne()),x=G(E.randomValuePool.takeOne()),B=$.withInitialDeal([f.value,o]),Z=$.withInitialDeal([O.value,x]);if(f.rank==="Ace")return y({...A,mainHand:B,splitHand:Z,randomValuePool:E.randomValuePool,actionType:"BLACKJACK_SPLIT",mainHandDoubledDown:!1,splitHandDoubledDown:!1});let D=B.highestHandValue===h,M=Z.highestHandValue===h;if(D&&M)return y({...A,mainHand:B,splitHand:Z,randomValuePool:E.randomValuePool,actionType:"BLACKJACK_SPLIT",mainHandDoubledDown:!1,splitHandDoubledDown:!1});if(D)return{state:{...A,phase:"playing-split-hand",mainHand:B,splitHand:Z,mainHandDoubledDown:!1,splitHandDoubledDown:!1},config:{},playerArgument:{type:"BLACKJACK_SPLIT"},betAmountMultiplier:d};return{state:{...A,phase:"playing-main-hand",multiplier:1,mainHand:B,splitHand:Z,mainHandDoubledDown:!1},config:{},playerArgument:{type:"BLACKJACK_SPLIT"},betAmountMultiplier:d}}}})}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 HE 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]])),sE={2:"PAIR",3:"THREE_OF_A_KIND",4:"FOUR_OF_A_KIND",5:"FIVE_OF_A_KIND"};class aE extends S{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:HE(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=sE[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)},r1=(r,E)=>r.direction==="ABOVE"?E>r.selectedValue:E<r.selectedValue;class E1 extends S{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:r1(A,t.value)?Y.withWinChance(E,f):new Lr(0),outputs:{result:t.values},randomValues:t}}}import B1 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 A1=[1,2,3,4,5,6,7,8,9,10],vr=(r)=>{return A1.includes(r)};var t1={[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]}},f1={[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]}},O1={[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]}},o1={[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]}},x1={[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,t1],[2,f1],[3,O1],[4,o1],[8,x1]]));class c1 extends S{constructor(){super("KENO")}determineGameResult({generator:r,edge:E,gameInputs:A}){rr.againstEmptyArray(A.selectedNumbers,()=>c.createValidationError("No numbers selected")),rr.against(A.selectedNumbers.length>10,()=>c.createValidationError("Maximum of 10 numbers can be selected"));for(let D of A.selectedNumbers)rr.againstNonInteger(D,()=>c.createValidationError("Only integers can be selected")),rr.against(D<0||D>39,()=>c.createValidationError("Invalid number selected"));let t=r.getUniqueRandomInts({min:0,max:39,count:10}),f=A.selectedNumbers.filter((D)=>t.values.includes(D)),O=A.selectedNumbers.length;if(!vr(O))throw new Error(`Invalid tile count: ${O}`);let Z=gr.getMultipliers(E)[O][A.riskLevel][f.length];if(Z===void 0)throw new Error(`No multiplier found for matching tile count ${f.length}`);return{isFinished:!0,payoutMultiplier:new B1(Z),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 D1 extends S{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),B=t.value,Z=new P(B-1).div(f),N=(100-E)/100,D=O.div(Z.mul(O).plus(1)).mul(N),M=lr(o,kr(D,x));return{isFinished:!0,payoutMultiplier:M.gte(A.targetMultiplier)?new P(A.targetMultiplier):new P(0),outputs:{randomMultiplier:M,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 Z1 extends S{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((v)=>A.selectedTiles.includes(v)),B=A.hasCashedOut||x,Z=(100-E)/100,N=new Er(hr(25-A.minesCount,A.selectedTiles.length)).div(new Er(hr(25,A.selectedTiles.length))),M=A.hasCashedOut&&!x?new Er(Z).div(N):new Er(0);return{isFinished:B,payoutMultiplier:M,outputs:{result:o.values},randomValues:o}}}import{Big as G1}from"big.js";var sr;((t)=>{t.LOW_RISK="LOW_RISK";t.MEDIUM_RISK="MEDIUM_RISK";t.HIGH_RISK="HIGH_RISK"})(sr||={});var jA=[8,9,10,11,12,13,14,15,16],S1={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]}},N1={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]}},_1={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]}},C1={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]}},U1={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]}},ar=new V(new Map([[1,S1],[2,N1],[3,_1],[4,C1],[8,U1]]));class T1 extends S{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=ar.getMultipliers(A)[E.riskLevel][t],x=r.getRandomIntsWithReplacement({min:0,max:1,count:E.numberOfRows}),Z=x.values.reduce((D,M)=>D+M,0),N=o[Z];if(N===void 0)throw new Error(`No payout found for end position ${Z}`);return{isFinished:!0,payoutMultiplier:G1(N),outputs:{result:x.values},randomValues:x}}}import{Big as fr}from"big.js";var ur=[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,...ur],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]],F;((A)=>{A.EVEN="EVEN";A.ODD="ODD"})(F||={});var J;((A)=>{A.RED="RED";A.BLACK="BLACK"})(J||={});var R;((A)=>{A.LOW="LOW";A.HIGH="HIGH"})(R||={});var q;((t)=>{t.TOP="TOP";t.MIDDLE="MIDDLE";t.BOTTOM="BOTTOM"})(q||={});var I;((t)=>{t.FIRST="FIRST";t.SECOND="SECOND";t.THIRD="THIRD"})(I||={});var Vr;((A)=>{A.AMERICAN="AMERICAN";A.EUROPEAN="EUROPEAN"})(Vr||={});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 c.createValidationError("Must place at least a single bet.");if(!r.straightBets.every((E)=>E.amount.gte(0)&&H(E.value)))throw c.createValidationError("Invalid straight bet.");if(!r.splitBets.every((E)=>E.amount.gte(0)&&M1(E.values)))throw c.createValidationError("Invalid split bet.");if(!r.streetBets.every((E)=>E.amount.gte(0)&&b1(E.values)))throw c.createValidationError("Invalid street bet.");if(!r.cornerBets.every((E)=>E.amount.gte(0)&&w1(E.values)))throw c.createValidationError("Invalid corner bet.");if(!r.doubleStreetBets.every((E)=>E.amount.gte(0)&&h1(E.values)))throw c.createValidationError("Invalid double street bet.");if(!r.parityBets.every((E)=>E.amount.gte(0)&&Object.values(F).includes(E.parity)))throw c.createValidationError("Invalid parity bet.");if(!r.colorBets.every((E)=>E.amount.gte(0)&&Object.values(J).includes(E.color)))throw c.createValidationError("Invalid color bet.");if(!r.halfBets.every((E)=>E.amount.gte(0)&&Object.values(R).includes(E.half)))throw c.createValidationError("Invalid half bet.");if(!r.columnBets.every((E)=>E.amount.gte(0)&&Object.values(q).includes(E.column)))throw c.createValidationError("Invalid column bet.");if(!r.dozenBets.every((E)=>E.amount.gte(0)&&Object.values(I).includes(E.dozen)))throw c.createValidationError("Invalid dozen bet.")},H=(r)=>{return ur.includes(r)},M1=(r)=>{if(r.length!==2)return!1;if(!r.every(H))return!1;return er.some(([E,A])=>E===r[0]&&A===r[1])},b1=(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])},w1=(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])},h1=(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 c.createValidationError("Must place at least a single bet.");if(!r.straightBets.every((E)=>E.amount.gte(0)&&W(E.value)))throw c.createValidationError("Invalid straight bet.");if(!r.splitBets.every((E)=>E.amount.gte(0)&&u1(E.values)))throw c.createValidationError("Invalid split bet.");if(!r.streetBets.every((E)=>E.amount.gte(0)&&V1(E.values)))throw c.createValidationError("Invalid street bet.");if(!r.cornerBets.every((E)=>E.amount.gte(0)&&y1(E.values)))throw c.createValidationError("Invalid corner bet.");if(!r.basketBets.every((E)=>E.amount.gte(0)))throw c.createValidationError("Invalid basket bet.");if(!r.doubleStreetBets.every((E)=>E.amount.gte(0)&&Y1(E.values)))throw c.createValidationError("Invalid double street bet.");if(!r.parityBets.every((E)=>E.amount.gte(0)&&Object.values(F).includes(E.parity)))throw c.createValidationError("Invalid parity bet.");if(!r.colorBets.every((E)=>E.amount.gte(0)&&Object.values(J).includes(E.color)))throw c.createValidationError("Invalid color bet.");if(!r.halfBets.every((E)=>E.amount.gte(0)&&Object.values(R).includes(E.half)))throw c.createValidationError("Invalid half bet.");if(!r.columnBets.every((E)=>E.amount.gte(0)&&Object.values(q).includes(E.column)))throw c.createValidationError("Invalid column bet.");if(!r.dozenBets.every((E)=>E.amount.gte(0)&&Object.values(I).includes(E.dozen)))throw c.createValidationError("Invalid dozen bet.")},W=(r)=>{return nr.includes(r)};function u1(r){if(r.length!==2)return!1;if(!r.every(W))return!1;return rE.some(([E,A])=>E===r[0]&&A===r[1])}var V1=(r)=>{if(r.length!==3)return!1;if(!r.every(W))return!1;return AE.some(([E,A,t])=>E===r[0]&&A===r[1]&&t===r[2])},y1=(r)=>{if(r.length!==4)return!1;if(!r.every(W))return!1;return fE.some(([E,A,t,f])=>E===r[0]&&A===r[1]&&t===r[2]&&f===r[3])},Y1=(r)=>{if(r.length!==6)return!1;if(!r.every(W))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 z1={straightBets:36,splitBets:18,streetBets:12,cornerBets:9,basketBets:7,doubleStreetBets:6,parityBets:2,colorBets:2,halfBets:2,columnBets:3,dozenBets:3},$1=[3,6,9,12,15,18,21,24,27,30,33,36],p1=[2,5,8,11,14,17,20,23,26,29,32,35],P1=[1,4,7,10,13,16,19,22,25,28,31,34],F1=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],J1=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35],R1=2.7,q1=5.3;class yr extends S{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:B}=this.partitionBets(O,o,E);A[f]=x,t[f]=B}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 F1.includes(E)&&A.color==="RED"||J1.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 $1.includes(E)&&A.column==="TOP"||p1.includes(E)&&A.column==="MIDDLE"||P1.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=z1[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 cE 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 DE extends S{europeanGame;americanGame;constructor(){super("ROULETTE");this.europeanGame=new BE,this.americanGame=new cE}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===R1&&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===q1&&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 c.createValidationError(`Attempted to play ${E.type} roulette on edge ${r.edge}`)}}var Bt=(r)=>{return new DE().getBetAmount(r)};var Nt=(r)=>{if(r.type==="EUROPEAN")Ar(r.inputs);else tr(r.inputs)};import{Big as i1}from"big.js";var L;((t)=>{t.LOW_RISK="LOW_RISK";t.MEDIUM_RISK="MEDIUM_RISK";t.HIGH_RISK="HIGH_RISK"})(L||={});var K;((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"})(K||={});var I1={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}}},Q1={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}}},X1={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}}},d1={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}}},j1={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}}},ZE=new V(new Map([[1,I1],[2,Q1],[3,X1],[4,d1],[8,j1]]));var SE={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 m1 extends S{constructor(){super("WHEEL")}determineGameResult({generator:r,gameInputs:E,edge:A}){if(!Object.values(K).includes(E.segments))throw new Error("Invalid segments value");if(!Object.values(L).includes(E.riskLevel))throw new Error("Invalid risk level");let f=ZE.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=SE[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 B=r.getRandomInt({min:0,max:x.length-1}),Z=x[B.value];if(Z===void 0)throw new Error(`No pattern found for segment ${E.segments} and value ${B.value}`);let N=O[Z];if(N===void 0)throw new Error(`No payout found for picked segment ${Z}`);return{isFinished:!0,payoutMultiplier:new i1(N),outputs:{result:B.values},randomValues:B}}}export{Nt as validateRouletteGameInputs,e1 as validateAdvancedDiceInputs,t1 as rtp99Multipliers,f1 as rtp98Multipliers,O1 as rtp97Multipliers,o1 as rtp96Multipliers,x1 as rtp92Multipliers,ar as plinkoMultipliers,hr as nCr,gr as kenoMultipliers,vr as isTileCount,r1 as hasDiceWon,kE as diamondsMultipliers,Bt as calculateRouletteBetAmount,eE as calculateDiceWinChance,pE as calculateBaccaratBetAmount,$r as calculateAdvancedDiceWinChance,kr as bigMin,lr as bigMax,bE as advancedDiceIsWithinBoundsInclusive,or as advancedDiceIsWithinBoundsExclusive,wE as advancedDiceGetInclusiveBoundsRange,xr as advancedDiceGetExclusiveBoundsRange,K as WheelSegments,L as WheelRiskLevel,m1 as Wheel,JE as WIN_MULTIPLIER,VE as VALID_SUITS,yE as VALID_RANKS,EE as VALID_EUROPEAN_STREETS,ur 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,$1 as TOP_COLUMN,A1 as TILE_COUNTS,d as SPLIT_BET_SIZE_FACTOR,Vr as RouletteType,DE as Roulette,hE as RollType,e as RandomValuePool,F1 as RED_NUMBERS,Br as RANDOM_MIN_VALUE,cr as RANDOM_MAX_VALUE,sr as PlinkoRiskLevel,T1 as Plinko,F as Parity,RE as PUSH_MULTIPLIER,jA as PLINKO_ROW_COUNTS,z1 as PAYOUT_MULTIPLIERS,w as OrigamiGame,Y as MultiplierCalculator,Z1 as Mines,CE as MIN_WIN_CHANCE,p1 as MIDDLE_COLUMN,UE as MAX_WIN_CHANCE,_r as MAX_CARDS_PER_ROUND,D1 as Limbo,qE as LOSE_MULTIPLIER,Kr as KenoRiskLevel,c1 as Keno,Zr as InsuranceOutcome,Pr as INSURANCE_WIN_PAYOUT,X as INSURANCE_BET_SIZE_FACTOR,o2 as INSURANCE_BET_MULTIPLIER,R as Half,_E as GameErrorCode,c as GameError,S as Game,Fr as FACE_CARD_VALUE,BE as EuropeanRoulette,R1 as EUROPEAN_HOUSE_EDGE,Yr as EFFECTIVE_RANGE,I as Dozen,nE as DiceDirection,E1 as Dice,WE as DiamondsResultType,aE as Diamonds,z as DOUBLE_DOWN_BET_SIZE_FACTOR,Wr as DICE_EFFECTIVE_RANGE,pr as DEALER_STAND_VALUE,q as Column,J as Color,x2 as CARDS_PER_SUIT,Dr as BlackjackOutcome,Sr as BlackjackActionType,mE as Blackjack,YE as BaccaratOutcome,zE as BaccaratBetType,PE as Baccarat,Nr as BUST_VALUE,P1 as BOTTOM_COLUMN,J1 as BLACK_NUMBERS,h as BLACKJACK_VALUE,FE as BLACKJACK_MULTIPLIER,k as BASE_PAYOUT_MULTIPLIERS,cE as AmericanRoulette,uE as AdvancedDice,q1 as AMERICAN_HOUSE_EDGE,OE as AMERICAN_BASKET,Cr as ACE_SOFT_BONUS};
1
+ var Ra;((a)=>a.INPUT_VALIDATION_ERROR="INPUT_VALIDATION_ERROR")(Ra||={});class d extends Error{static createValidationError(t){return new d("INPUT_VALIDATION_ERROR",t)}static isGameError(t){return t instanceof d}errorCode;constructor(t,a){super(a);this.errorCode=t}}var S;((l)=>{l.DICE="DICE";l.MINES="MINES";l.KENO="KENO";l.LIMBO="LIMBO";l.ADVANCED_DICE="ADVANCED_DICE";l.BACCARAT="BACCARAT";l.DIAMONDS="DIAMONDS";l.PLINKO="PLINKO";l.ROULETTE="ROULETTE";l.WHEEL="WHEEL";l.BLACKJACK="BLACKJACK"})(S||={});class F{gameId;constructor(t){this.gameId=t}}class A extends F{constructor(t){super(t)}getGameResult(t){return this.determineGameResult(t)}}import{Big as Ut}from"big.js";import lt from"big.js";class R{static withMultiplier(t,a){return new lt(t).times(new lt(100-a).div(100))}static withWinChance(t,a){return lt(100-t).div(a)}}var st=0,pt=1e4,wt=10001,Pa=0.01,_a=98,Ia=(t)=>{if(t<st)throw d.createValidationError(`Lower bound ${t} is below minimum allowed value ${st}`)},ba=(t)=>{if(t>pt)throw d.createValidationError(`Upper bound ${t} is above maximum allowed value ${pt}`)},W=(t)=>{if(Ia(t.lower),ba(t.upper),t.lower>=t.upper)throw d.createValidationError(`Lower bound ${t.lower} must be less than ${t.upper}`)},ja=(t,a)=>{let[r,e]=t.lower<=a.lower?[t,a]:[a,t];if(r.upper>e.lower)throw d.createValidationError("Bounds must not overlap")},Na=(t,a)=>a>=t.lower&&a<=t.upper,Va=(t)=>t.upper-t.lower+1,dt=(t,a)=>a>t.lower&&a<t.upper,ut=(t)=>t.upper-t.lower-1,wa;((e)=>{e.ROLL_BETWEEN="ROLL_BETWEEN";e.ROLL_OUTSIDE="ROLL_OUTSIDE";e.ROLL_BETWEEN_TWO="ROLL_BETWEEN_TWO"})(wa||={});var Gt=(t)=>{let r=(()=>{switch(t.mode){case"ROLL_BETWEEN":return W(t.bounds),ut(t.bounds);case"ROLL_OUTSIDE":return W(t.bounds),wt-Va(t.bounds);case"ROLL_BETWEEN_TWO":return W(t.firstBounds),W(t.secondBounds),ja(t.firstBounds,t.secondBounds),ut(t.firstBounds)+ut(t.secondBounds)}})(),e=Ut(r).div(wt).mul(100);if(e.lt(Pa))throw d.createValidationError("Win chance too low");if(e.gt(_a))throw d.createValidationError("Win chance too high");return e},fe=(t)=>{Gt(t)};class Ua extends A{constructor(){super("ADVANCED_DICE")}determineGameResult({generator:t,edge:a,gameInputs:r}){let e=Gt(r),n=t.getRandomInt({min:st,max:pt}),o=n.value;return{isFinished:!0,payoutMultiplier:(()=>{switch(r.mode){case"ROLL_BETWEEN":return dt(r.bounds,o);case"ROLL_OUTSIDE":return!Na(r.bounds,o);case"ROLL_BETWEEN_TWO":return dt(r.firstBounds,o)||dt(r.secondBounds,o)}})()?R.withWinChance(a,e):new Ut(0),outputs:{result:n.values},randomValues:n}}}import b from"big.js";var Ga=["Clubs","Diamonds","Hearts","Spades"],Za=["Ace","2","3","4","5","6","7","8","9","10","Jack","Queen","King"],ka;((e)=>{e.PLAYER_WIN="PLAYER_WIN";e.TIE="TIE";e.BANKER_WIN="BANKER_WIN"})(ka||={});var Fa;((e)=>{e.PLAYER="PLAYER";e.TIE="TIE";e.BANKER="BANKER"})(Fa||={});var Ma={["PLAYER_WIN"]:{betType:"PLAYER",multiplier:2},["TIE"]:{betType:"TIE",multiplier:9},["BANKER_WIN"]:{betType:"BANKER",multiplier:1.95}},Ya=(t)=>{return new b(0).add(t.bets.reduce((r,e)=>r.add(e.amount),new b(0)))};class Ja extends A{constructor(){super("BACCARAT")}determineGameResult({generator:t,gameInputs:a,edge:r}){if(r!==1)throw new Error("Baccarat is only available at 1% edge.");this.validateGameInputs(a);let e=t.getRandomIntsWithReplacement({min:0,max:51,count:6}),n=e.values,o=n.slice(0,3),i=n.slice(3,6),c=[],u=0;for(let y of o.slice(0,2)){let D=this.mapRandomValueToCard(y),Q=this.mapRandomValueToCardValue(y);c.push(D),u=(u+Q)%10}let p=[],s=0;for(let y of i.slice(0,2)){let D=this.mapRandomValueToCard(y),Q=this.mapRandomValueToCardValue(y);p.push(D),s=(s+Q)%10}if(!this.isNaturalWin(u,s)){let y=this.shouldDrawThirdPlayerCard(u),D=null;if(y)D=this.mapRandomValueToCardValue(o[2]),c.push(this.mapRandomValueToCard(o[2])),u=(u+D)%10;if(this.shouldDrawThirdBankerCard(s,D))p.push(this.mapRandomValueToCard(i[2])),s=(s+this.mapRandomValueToCardValue(i[2]))%10}let l;if(u===s)l="TIE";else l=u>s?"PLAYER_WIN":"BANKER_WIN";let B=Ya(a),{betType:T,multiplier:ct}=Ma[l],k=new b(0);if(k=k.add(a.bets.filter((y)=>y.type===T).reduce((y,D)=>y.add(D.amount.mul(ct)),new b(0))),l==="TIE")k=k.add(a.bets.filter((y)=>y.type==="PLAYER"||y.type==="BANKER").reduce((y,D)=>y.add(D.amount),new b(0)));return{isFinished:!0,payoutMultiplier:B.gt(0)?k.div(B):new b(0),outputs:{playerCards:c,playerHandValue:u,bankerCards:p,bankerHandValue:s,gameOutcome:l,result:e.values},randomValues:e}}validateGameInputs(t){if(t.bets.length===0)throw new Error("Must place at least a single bet.");if(!t.bets.every((a)=>a.amount.gte(0)))throw new Error("Invalid bet.")}mapRandomValueToCard(t){let a=Ga[Math.floor(t/13)],r=Za[t%13];return{suit:a,rank:r}}isNaturalWin(t,a){let r=[8,9];return r.includes(t)||r.includes(a)}mapRandomValueToCardValue(t){let a=t%13;if(a===0)return 1;if(a>=10)return 10;return a+1}shouldDrawThirdPlayerCard(t){return t<=5}shouldDrawThirdBankerCard(t,a){if(a===null)return t<=5;if(t<=2)return!0;if(t===3)return a!==8;if(t===4)return[2,3,4,5,6,7].includes(a);if(t===5)return[4,5,6,7].includes(a);if(t===6)return[6,7].includes(a);return!1}}var At;((n)=>{n.WIN="WIN";n.LOSE="LOSE";n.PUSH="PUSH";n.PLAYER_BLACKJACK="PLAYER_BLACKJACK"})(At||={});var Bt;((r)=>{r.WON="WON";r.LOST="LOST"})(Bt||={});var mt;((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";c.SPLIT="BLACKJACK_SPLIT"})(mt||={});var yt;((n)=>{n.EXACT_PAIR="EXACT_PAIR";n.COLORED_PAIR="COLORED_PAIR";n.MIXED_PAIR="MIXED_PAIR";n.LOSS="LOSS"})(yt||={});var Et;((i)=>{i.SUITED_TRIPS="SUITED_TRIPS";i.STRAIGHT_FLUSH="STRAIGHT_FLUSH";i.THREE_OF_A_KIND="THREE_OF_A_KIND";i.STRAIGHT="STRAIGHT";i.FLUSH="FLUSH";i.LOSS="LOSS"})(Et||={});var ga=2.5,$a=2,za=1,Xa=0,Zt=17,ft=21,C=21,St=63,Ie=1.5,M=0.5,Ot=1.5,P=1,j=1,be=13,Dt=10,kt=10,L={PLAYER_BLACKJACK:ga,WIN:$a,PUSH:za,LOSE:Xa},Ft={EXACT_PAIR:26,COLORED_PAIR:11,MIXED_PAIR:7,LOSS:0},Mt={SUITED_TRIPS:101,STRAIGHT_FLUSH:51,THREE_OF_A_KIND:31,STRAIGHT:11,FLUSH:5,LOSS:0};import I from"big.js";import{Guard as m}from"@betorigami/guard";import{createStore as tr}from"@xstate/store";var Yt=0,Jt=51,K=Array.from({length:52},(t,a)=>a),gt=["Spades","Hearts","Diamonds","Clubs"],v=["Ace","Two","Three","Four","Five","Six","Seven","Eight","Nine","Ten","Jack","Queen","King"],$t=["Jack","Queen","King"],Ct={Hearts:"red",Diamonds:"red",Spades:"black",Clubs:"black"};import{Guard as qa}from"@betorigami/guard";import{Guard as ht}from"@betorigami/guard";class Ht{value;constructor(t){let a=K[t];ht.againstNullOrUndefined(a,`Invalid card value: ${t}`),this.value=a}get suit(){let t=Math.floor(this.value/13),a=gt[t];return ht.againstNullOrUndefined(a,`Invalid suit index: ${t}`),a}get rank(){let t=this.value%13,a=v[t];return ht.againstNullOrUndefined(a,`Invalid rank index: ${t}`),a}toDto(){return{rank:this.rank,suit:this.suit,cardValue:this.value}}}class E extends Ht{get numericRank(){if($t.includes(this.rank))return kt;return v.indexOf(this.rank)+1}static fromValue(t){return qa.against(!K.includes(t),`Invalid card value: ${t}`),new E(t)}}class Y{cards;hardHandValue;softHandValue=null;constructor(t){this.cards=t;if(this.hardHandValue=t.reduce((r,e)=>r+e.numericRank,0),t.some((r)=>r.rank==="Ace")&&this.hardHandValue+Dt<=ft)this.softHandValue=this.hardHandValue+Dt}get cardCount(){return this.cards.length}get hasSoftHandValue(){return this.softHandValue!==null}get isBusted(){return this.hardHandValue>ft}get isBlackjack(){return this.cardCount===2&&this.highestHandValue===C}get highestHandValue(){return this.softHandValue!==null?this.softHandValue:this.hardHandValue}}class J{cards;value;constructor(t){this.cards=t.map((a)=>E.fromValue(a)),this.value=new Y(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((t)=>t.value)}toDto(){return{cards:this.cards.map((t)=>t.toDto()),value:this.highestHandValue}}}class g extends J{otherCards;upCard;holeCard;constructor(t,a,r=[]){super([t,a,...r]);this.otherCards=r;this.upCard=E.fromValue(t),this.holeCard=E.fromValue(a)}static withInitialDeal(t){return new g(t.upCard,t.holeCard)}addDrawnCards(t){return new g(this.upCard.value,this.holeCard.value,[...this.otherCards,...t])}toDto(t=!1){if(t)return super.toDto();return{cards:[this.upCard.toDto()],value:new Y([this.upCard]).highestHandValue}}}class _ extends J{static withInitialDeal(t){return new _(t)}addDrawnCards(t){return new _([...this.rawValues,...t])}}import{Guard as tt}from"@betorigami/guard";class at{source;index=0;constructor(t){this.source=t}static from(t,a){return tt.against(a<=0,`Count must be positive, got ${a}`),tt.against(t.values.length!==a,`Expected ${a} values, got ${t.values.length}`),new at(t)}get consumedValues(){return this.source.values.slice(0,this.index)}toMultipleRandomValues(){return this.source}takeOne(){let t=this.source.values[this.index];return tt.againstUndefined(t,"RandomValuePool exhausted"),this.index+=1,t}take(t){tt.against(this.index+t>this.source.values.length,`RandomValuePool exhausted: requested ${t} but only ${this.source.values.length-this.index} remain`);let a=this.source.values.slice(this.index,this.index+t);return this.index+=t,a}}import{Guard as Qa}from"@betorigami/guard";import Wa from"fast-deep-equal";class xt extends F{edge;constructor(t,a){super(t);this.edge=a}play(t,a,r=[]){let e=this.createGameStore(),n=this.generateRandomValues(t),o=n.toMultipleRandomValues();for(let u of r)e.send({...u.playerArgument,randomValuePool:n});let i=r[r.length-1];if(i)Qa.against(!Wa(i.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({...a,randomValuePool:n});let c=e.getSnapshot().context;return{playerArgument:c.playerArgument,state:this.toExternalState(c.state),config:c.config,additionalBetAmount:c.additionalBetAmount,proof:{proofHash:o.proofHash,proofString:o.proofString}}}}import h from"big.js";import{Guard as Tt}from"@betorigami/guard";var zt=(t)=>{let a=t.pairBonus!==null?h(t.pairBonus.betAmount).mul(t.pairBonus.payoutMultiplier):h(0),r=t.threeCardBonus!==null?h(t.threeCardBonus.betAmount).mul(t.threeCardBonus.payoutMultiplier):h(0);return a.plus(r)},Xt=(t)=>{let a=t.betAmounts.mainBetAmount,e=t.actionType==="BLACKJACK_DOUBLE_DOWN"?a.mul(P):h(0),n=t.insuranceOutcome!==void 0?a.mul(M):h(0),o=a.plus(e).mul(L[t.outcome]),i=t.insuranceOutcome==="WON"?a.mul(Ot):h(0),c=zt(t.sideBetResults),u=o.plus(i).plus(c),p=a.plus(n).plus(e).plus(t.betAmounts.pairBonusAmount).plus(t.betAmounts.threeCardBonusAmount);Tt.against(p.eq(0),"Total bet amount cannot be zero");let s=u.div(p);Tt.against(t.actionType==="BLACKJACK_SPLIT","SPLIT action type is not valid for standard multiplier calculation");let l;switch(t.actionType){case"BLACKJACK_DOUBLE_DOWN":l=e;break;case"BLACKJACK_BUY_INSURANCE":l=n;break;case"BLACKJACK_SPLIT":l=a.mul(j);break}return{multiplier:s,additionalBetAmount:l}},qt=(t)=>{let a=t.betAmounts.mainBetAmount,r=t.mainHandDoubledDown?a.mul(P):h(0),e=t.splitHandDoubledDown?a.mul(P):h(0),n=t.insuranceOutcome!==void 0?a.mul(M):h(0),o=a.plus(r).mul(L[t.mainOutcome]),i=a.plus(e).mul(L[t.splitOutcome]),c=t.insuranceOutcome==="WON"?a.mul(Ot):h(0),u=zt(t.sideBetResults),p=o.plus(i).plus(c).plus(u),s=a.plus(a).plus(n).plus(r).plus(e).plus(t.betAmounts.pairBonusAmount).plus(t.betAmounts.threeCardBonusAmount);Tt.against(s.eq(0),"Total bet amount cannot be zero");let l=p.div(s),B;switch(t.actionType){case"BLACKJACK_DOUBLE_DOWN":B=a.mul(P);break;case"BLACKJACK_SPLIT":B=a.mul(j);break}return{multiplier:l,additionalBetAmount:B}};import{Guard as La}from"@betorigami/guard";var Rt=(t)=>t.every((a)=>a===t[0]),Qt=(t)=>{let a=[...t].sort((r,e)=>r-e);return a.every((r,e)=>{let n=a[e-1];if(e===0)return!0;return La.againstUndefined(n,"Previous value cannot be undefined"),r===n+1})},Wt={Ace:1,Two:2,Three:3,Four:4,Five:5,Six:6,Seven:7,Eight:8,Nine:9,Ten:10,Jack:11,Queen:12,King:13},Ka={...Wt,Ace:14},va=(t)=>Qt(t.map((a)=>Wt[a]))||Qt(t.map((a)=>Ka[a])),Lt=(t,a)=>{let r=E.fromValue(t),e=E.fromValue(a);if(r.rank!==e.rank)return"LOSS";if(t===a)return"EXACT_PAIR";if(Ct[r.suit]===Ct[e.suit])return"COLORED_PAIR";return"MIXED_PAIR"},Kt=(t,a)=>({betAmount:t,result:a,payoutMultiplier:Ft[a]}),vt=(t,a,r)=>{let e=E.fromValue(t),n=E.fromValue(a),o=E.fromValue(r),i=[e.rank,n.rank,o.rank],c=Rt([e.suit,n.suit,o.suit]),u=Rt(i),p=va(i);if(Rt([t,a,r]))return"SUITED_TRIPS";if(c&&p)return"STRAIGHT_FLUSH";if(u)return"THREE_OF_A_KIND";if(p)return"STRAIGHT";if(c)return"FLUSH";return"LOSS"},ta=(t,a)=>({betAmount:t,result:a,payoutMultiplier:Mt[a]});var ar={state:{isFinished:!1,phase:"uninitialised",multiplier:I(0)},config:{},playerArgument:{type:"START",mainBetAmount:"0",pairBonusAmount:"0",threeCardBonusAmount:"0"}},f=(t)=>E.fromValue(t).value;function rr(t){m.against(t.phase!=="in-progress","Expected a started, in-progress game state")}function aa(t){m.against(t.phase!=="awaiting-insurance","Expected game to be awaiting insurance decision")}function Pt(t){m.against(t.phase!=="in-progress"&&t.phase!=="playing-main-hand"&&t.phase!=="playing-split-hand","Expected a started, in-progress game state")}var ra=(t,a)=>{let r=a;while(r.highestHandValue<Zt)r=r.addDrawnCards([f(t.takeOne())]);return r},It=(t,a)=>{if(t.isBusted)return"LOSE";if(a.isBusted)return"WIN";let r=t.highestHandValue,e=a.highestHandValue;if(r>e)return"WIN";if(r<e)return"LOSE";return"PUSH"},O=(t)=>{let{multiplier:a,additionalBetAmount:r}=Xt({outcome:t.outcome,insuranceOutcome:t.insuranceOutcome,actionType:t.playerArgument.type,betAmounts:t.betAmounts,sideBetResults:t.sideBetResults});return{state:{isFinished:!0,phase:"finished",playerHand:t.playerHand,dealerHand:t.dealerHand,outcome:t.outcome,multiplier:a,randomValues:t.randomValuePool.consumedValues,insuranceOutcome:t.insuranceOutcome,sideBetResults:t.sideBetResults},config:{},playerArgument:t.playerArgument,additionalBetAmount:r}},_t=(t)=>{let a=ra(t.randomValuePool,t.dealerHand),r=It(t.playerHand,a);return O({...t,dealerHand:a,outcome:r})},x=(t)=>{let r=t.mainHand.isBusted&&t.splitHand.isBusted?t.dealerHand:ra(t.randomValuePool,t.dealerHand),e=It(t.mainHand,r),n=It(t.splitHand,r),{multiplier:o,additionalBetAmount:i}=qt({hasSplit:!0,mainOutcome:e,splitOutcome:n,insuranceOutcome:t.insuranceOutcome,mainHandDoubledDown:t.mainHandDoubledDown,splitHandDoubledDown:t.splitHandDoubledDown,actionType:t.playerArgument.type,betAmounts:t.betAmounts,sideBetResults:t.sideBetResults});return{state:{isFinished:!0,phase:"split-finished",mainHand:t.mainHand,splitHand:t.splitHand,dealerHand:r,mainOutcome:e,splitOutcome:n,multiplier:o,randomValues:t.randomValuePool.consumedValues,insuranceOutcome:t.insuranceOutcome,sideBetResults:t.sideBetResults},config:{},playerArgument:t.playerArgument,additionalBetAmount:i}};class er extends xt{constructor(t){super("BLACKJACK",t)}generateRandomValues(t){return at.from(t.getRandomIntsWithReplacement({min:Yt,max:Jt,count:St}),St)}toExternalState(t){let a=t.phase;switch(a){case"awaiting-insurance":return{isFinished:!1,phase:"awaiting-insurance",multiplier:t.multiplier,playerHand:t.playerHand.toDto(),dealerHand:t.dealerHand.toDto(!1),sideBetResults:t.sideBetResults};case"in-progress":return{isFinished:!1,phase:"player-turn",multiplier:t.multiplier,playerHand:t.playerHand.toDto(),dealerHand:t.dealerHand.toDto(!1),sideBetResults:t.sideBetResults};case"playing-main-hand":return{isFinished:!1,phase:"playing-main-hand",multiplier:t.multiplier,mainHand:t.mainHand.toDto(),splitHand:t.splitHand.toDto(),dealerHand:t.dealerHand.toDto(!1),sideBetResults:t.sideBetResults};case"playing-split-hand":return{isFinished:!1,phase:"playing-split-hand",multiplier:t.multiplier,mainHand:t.mainHand.toDto(),splitHand:t.splitHand.toDto(),dealerHand:t.dealerHand.toDto(!1),sideBetResults:t.sideBetResults};case"finished":return{isFinished:!0,multiplier:t.multiplier,randomValues:t.randomValues,outcome:t.outcome,playerHand:t.playerHand.toDto(),dealerHand:t.dealerHand.toDto(!0),sideBetResults:t.sideBetResults,...t.insuranceOutcome!==void 0&&{insuranceOutcome:t.insuranceOutcome}};case"split-finished":return{isFinished:!0,multiplier:t.multiplier,randomValues:t.randomValues,mainOutcome:t.mainOutcome,splitOutcome:t.splitOutcome,mainHand:t.mainHand.toDto(),splitHand:t.splitHand.toDto(),dealerHand:t.dealerHand.toDto(!0),sideBetResults:t.sideBetResults,...t.insuranceOutcome!==void 0&&{insuranceOutcome:t.insuranceOutcome}};case"uninitialised":throw new Error("Cannot convert uninitialised state to external state");default:m.againstNever(a,"Invalid state received")}}createGameStore(){return tr({context:ar,on:{START:(t,a)=>{let{state:r}=t;m.against(r.phase!=="uninitialised","START action requires a fresh game");let e=f(a.randomValuePool.takeOne()),n=f(a.randomValuePool.takeOne()),o=f(a.randomValuePool.takeOne()),i=f(a.randomValuePool.takeOne()),c=_.withInitialDeal([e,n]),u=g.withInitialDeal({upCard:o,holeCard:i}),p={mainBetAmount:I(a.mainBetAmount),pairBonusAmount:I(a.pairBonusAmount),threeCardBonusAmount:I(a.threeCardBonusAmount)},s={pairBonus:I(a.pairBonusAmount).gt(0)?Kt(a.pairBonusAmount,Lt(e,n)):null,threeCardBonus:I(a.threeCardBonusAmount).gt(0)?ta(a.threeCardBonusAmount,vt(e,n,o)):null},l={type:"START",mainBetAmount:a.mainBetAmount,pairBonusAmount:a.pairBonusAmount,threeCardBonusAmount:a.threeCardBonusAmount};if(u.upCard.rank==="Ace")return{state:{...r,isFinished:!1,phase:"awaiting-insurance",playerHand:c,dealerHand:u,betAmounts:p,sideBetResults:s},config:{},playerArgument:l};let B={playerHand:c,dealerHand:u,randomValuePool:a.randomValuePool,playerArgument:l,betAmounts:p,sideBetResults:s};if(c.isBlackjack&&u.isBlackjack)return O({...B,outcome:"PUSH"});if(c.isBlackjack)return O({...B,outcome:"PLAYER_BLACKJACK"});if(u.isBlackjack)return O({...B,outcome:"LOSE"});return{state:{...r,isFinished:!1,phase:"in-progress",playerHand:c,dealerHand:u,insuranceOutcome:void 0,betAmounts:p,sideBetResults:s},config:{},playerArgument:l}},BLACKJACK_BUY_INSURANCE:(t,a)=>{let{state:r}=t;aa(r);let{playerHand:e,dealerHand:n,betAmounts:o,sideBetResults:i}=r,c={...r,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_BUY_INSURANCE"},betAmounts:o,sideBetResults:i};if(e.isBlackjack&&n.isBlackjack)return O({...c,outcome:"PUSH",insuranceOutcome:"WON"});if(e.isBlackjack)return O({...c,outcome:"PLAYER_BLACKJACK",insuranceOutcome:"LOST"});if(n.isBlackjack)return O({...c,outcome:"LOSE",insuranceOutcome:"WON"});return{state:{...r,phase:"in-progress",insuranceOutcome:"LOST"},config:{},playerArgument:{type:"BLACKJACK_BUY_INSURANCE"},additionalBetAmount:o.mainBetAmount.mul(M)}},BLACKJACK_REJECT_INSURANCE:(t,a)=>{let{state:r}=t;aa(r);let{playerHand:e,dealerHand:n,betAmounts:o,sideBetResults:i}=r,c={playerHand:e,dealerHand:n,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_REJECT_INSURANCE"},betAmounts:o,sideBetResults:i};if(e.isBlackjack&&n.isBlackjack)return O({...c,outcome:"PUSH"});if(e.isBlackjack)return O({...c,outcome:"PLAYER_BLACKJACK"});if(n.isBlackjack)return O({...c,outcome:"LOSE"});return{state:{...r,phase:"in-progress",insuranceOutcome:void 0},config:{},playerArgument:{type:"BLACKJACK_REJECT_INSURANCE"}}},BLACKJACK_HIT:(t,a)=>{let{state:r}=t;switch(Pt(r),r.phase){case"playing-main-hand":{let e=r.mainHand.addDrawnCards([f(a.randomValuePool.takeOne())]);if(e.isBusted||e.highestHandValue===C){if(r.splitHand.highestHandValue===C)return x({...r,mainHand:e,splitHandDoubledDown:!1,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_HIT"}});return{state:{...r,phase:"playing-split-hand",mainHand:e,splitHandDoubledDown:!1},config:{},playerArgument:{type:"BLACKJACK_HIT"}}}return{state:{...r,mainHand:e},config:{},playerArgument:{type:"BLACKJACK_HIT"}}}case"playing-split-hand":{let e=r.splitHand.addDrawnCards([f(a.randomValuePool.takeOne())]);if(e.isBusted||e.highestHandValue===C)return x({...r,splitHand:e,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_HIT"}});return{state:{...r,splitHand:e},config:{},playerArgument:{type:"BLACKJACK_HIT"}}}case"in-progress":{let e=r.playerHand.addDrawnCards([f(a.randomValuePool.takeOne())]);if(e.isBusted)return O({...r,playerHand:e,outcome:"LOSE",randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_HIT"}});if(e.highestHandValue===C)return _t({...r,playerHand:e,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_HIT"}});return{state:{...r,phase:"in-progress",playerHand:e},config:{},playerArgument:{type:"BLACKJACK_HIT"}}}default:m.againstNever(r,"Invalid phase for HIT action")}},BLACKJACK_STAND:(t,a)=>{let{state:r}=t;switch(Pt(r),r.phase){case"playing-main-hand":{if(r.splitHand.highestHandValue===C)return x({...r,splitHandDoubledDown:!1,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_STAND"}});return{state:{...r,phase:"playing-split-hand",splitHandDoubledDown:!1},config:{},playerArgument:{type:"BLACKJACK_STAND"}}}case"playing-split-hand":return x({...r,splitHandDoubledDown:r.splitHandDoubledDown,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_STAND"}});case"in-progress":return _t({...r,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_STAND"}});default:m.againstNever(r,"Invalid phase for STAND action")}},BLACKJACK_DOUBLE_DOWN:(t,a)=>{let{state:r}=t;switch(Pt(r),r.phase){case"playing-main-hand":{m.against(r.mainHand.cards.length!==2,"Double down is only allowed as the first action");let e=r.mainHand.addDrawnCards([f(a.randomValuePool.takeOne())]),{betAmounts:n}=r;if(r.splitHand.highestHandValue===C)return x({...r,mainHand:e,mainHandDoubledDown:!0,splitHandDoubledDown:!1,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_DOUBLE_DOWN"}});return{state:{...r,phase:"playing-split-hand",mainHand:e,mainHandDoubledDown:!0,splitHandDoubledDown:!1},config:{},playerArgument:{type:"BLACKJACK_DOUBLE_DOWN"},additionalBetAmount:n.mainBetAmount.mul(P)}}case"playing-split-hand":{m.against(r.splitHand.cards.length!==2,"Double down is only allowed as the first action");let e=r.splitHand.addDrawnCards([f(a.randomValuePool.takeOne())]);return x({...r,splitHand:e,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_DOUBLE_DOWN"},splitHandDoubledDown:!0})}case"in-progress":{m.against(r.playerHand.cards.length!==2,"Double down is only allowed as the first action");let e=r.playerHand.addDrawnCards([f(a.randomValuePool.takeOne())]);if(e.isBusted)return O({...r,playerHand:e,outcome:"LOSE",randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_DOUBLE_DOWN"}});return _t({...r,playerHand:e,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_DOUBLE_DOWN"}})}default:m.againstNever(r,"Invalid phase for DOUBLE_DOWN action")}},BLACKJACK_SPLIT:(t,a)=>{let{state:r}=t;rr(r);let{playerHand:e,betAmounts:n,sideBetResults:o}=r;m.against(e.cards.length!==2,"Split is only allowed with exactly 2 cards");let i=e.cards[0],c=e.cards[1];m.againstUndefined(i,"First card is missing"),m.againstUndefined(c,"Second card is missing"),m.against(i.rank!==c.rank,"Split requires two cards of the same rank");let u=f(a.randomValuePool.takeOne()),p=f(a.randomValuePool.takeOne()),s=_.withInitialDeal([i.value,u]),l=_.withInitialDeal([c.value,p]);if(i.rank==="Ace")return x({...r,mainHand:s,splitHand:l,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_SPLIT"},mainHandDoubledDown:!1,splitHandDoubledDown:!1});let T=s.highestHandValue===C,ct=l.highestHandValue===C;if(T&&ct)return x({mainHand:s,splitHand:l,dealerHand:r.dealerHand,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_SPLIT"},insuranceOutcome:r.insuranceOutcome,mainHandDoubledDown:!1,splitHandDoubledDown:!1,betAmounts:n,sideBetResults:o});if(T)return{state:{...r,phase:"playing-split-hand",mainHand:s,splitHand:l,mainHandDoubledDown:!1,splitHandDoubledDown:!1},config:{},playerArgument:{type:"BLACKJACK_SPLIT"},additionalBetAmount:n.mainBetAmount.mul(j)};return{state:{...r,phase:"playing-main-hand",multiplier:I(0),mainHand:s,splitHand:l,mainHandDoubledDown:!1},config:{},playerArgument:{type:"BLACKJACK_SPLIT"},additionalBetAmount:n.mainBetAmount.mul(j)}}}})}getValidNextActionTypes(t){if(t.isFinished)return[];switch(t.phase){case"awaiting-insurance":return["BLACKJACK_BUY_INSURANCE","BLACKJACK_REJECT_INSURANCE"];case"playing-main-hand":{let a=["BLACKJACK_HIT","BLACKJACK_STAND"];if(t.mainHand.cards.length===2)a.push("BLACKJACK_DOUBLE_DOWN");return a}case"playing-split-hand":{let a=["BLACKJACK_HIT","BLACKJACK_STAND"];if(t.splitHand.cards.length===2)a.push("BLACKJACK_DOUBLE_DOWN");return a}case"player-turn":{let a=["BLACKJACK_HIT","BLACKJACK_STAND"];if(t.playerHand.cards.length===2){a.push("BLACKJACK_DOUBLE_DOWN");let r=t.playerHand.cards[0],e=t.playerHand.cards[1];if(m.againstUndefined(r,"First player card is missing"),m.againstUndefined(e,"Second player card is missing"),r.rank===e.rank)a.push("BLACKJACK_SPLIT")}return a}default:m.againstNever(t,"Invalid phase for getting valid actions")}}}import nr from"big.js";class H{multipliers;constructor(t){this.multipliers=t}getMultipliers(t){let a=this.multipliers.get(t);if(a===void 0)throw new Error(`Multipliers for ${t} not found`);return a}getAllMultipliers(){return Array.from(this.multipliers.entries()).map(([t,a])=>({edge:t,multipliers:a}))}}var or;((i)=>{i.PAIR="PAIR";i.TWO_PAIR="TWO_PAIR";i.THREE_OF_A_KIND="THREE_OF_A_KIND";i.FULL_HOUSE="FULL_HOUSE";i.FOUR_OF_A_KIND="FOUR_OF_A_KIND";i.FIVE_OF_A_KIND="FIVE_OF_A_KIND"})(or||={});var ir={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},cr={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},lr={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},dr={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},ur={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},sr=new H(new Map([[1,ir],[2,cr],[3,lr],[4,dr],[8,ur]])),pr={2:"PAIR",3:"THREE_OF_A_KIND",4:"FOUR_OF_A_KIND",5:"FIVE_OF_A_KIND"};class Ar extends A{constructor(){super("DIAMONDS")}determineGameResult({generator:t,edge:a}){let r=t.getRandomIntsWithReplacement({min:0,max:6,count:5}),e=sr.getMultipliers(a),n=r.values,o=this.calculatePayoutMultiplier(e,n);return{isFinished:!0,payoutMultiplier:nr(o),outputs:{result:r.values},randomValues:r}}calculatePayoutMultiplier(t,a){let r=new Map;for(let o of a){let i=r.get(o)||0;r.set(o,i+1)}let e=[...r.values()].filter((o)=>o>1),n=this.classifyResult(e);return n===null?0:t[n]}classifyResult(t){if(t.length>2)throw new Error(`Unexpected number of repeats ${t.length}`);let[a,r]=t;if(a===void 0)return null;if(r===void 0){let e=pr[a];if(e===void 0)throw new Error(`Unexpected single diamond repeat count: ${a}`);return e}return a===3||r===3?"FULL_HOUSE":"TWO_PAIR"}}import na from"big.js";var Br;((r)=>{r.ABOVE="ABOVE";r.BELOW="BELOW"})(Br||={});var ea=1e4,mr=(t)=>{let a=t.direction==="ABOVE"?ea-t.selectedValue:t.selectedValue;return new na(a).div(ea).mul(100)},yr=(t,a)=>t.direction==="ABOVE"?a>t.selectedValue:a<t.selectedValue;class Er extends A{constructor(){super("DICE")}determineGameResult({generator:t,edge:a,gameInputs:r}){let e=t.getRandomInt({min:0,max:1e4}),n=mr(r);return{isFinished:!0,payoutMultiplier:yr(r,e.value)?R.withWinChance(a,n):new na(0),outputs:{result:e.values},randomValues:e}}}import Hr from"big.js";import{Guard as rt}from"@betorigami/guard";var oa;((n)=>{n.CLASSIC="CLASSIC";n.LOW_RISK="LOW_RISK";n.MEDIUM_RISK="MEDIUM_RISK";n.HIGH_RISK="HIGH_RISK"})(oa||={});var fr=[1,2,3,4,5,6,7,8,9,10],ia=(t)=>{return fr.includes(t)};var Sr={[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]}},Or={[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]}},Dr={[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]}},Cr={[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]}},hr={[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]}},ca=new H(new Map([[1,Sr],[2,Or],[3,Dr],[4,Cr],[8,hr]]));class xr extends A{constructor(){super("KENO")}determineGameResult({generator:t,edge:a,gameInputs:r}){rt.againstEmptyArray(r.selectedNumbers,()=>d.createValidationError("No numbers selected")),rt.against(r.selectedNumbers.length>10,()=>d.createValidationError("Maximum of 10 numbers can be selected"));for(let l of r.selectedNumbers)rt.againstNonInteger(l,()=>d.createValidationError("Only integers can be selected")),rt.against(l<0||l>39,()=>d.createValidationError("Invalid number selected"));let e=t.getUniqueRandomInts({min:0,max:39,count:10}),n=r.selectedNumbers.filter((l)=>e.values.includes(l)),o=r.selectedNumbers.length;if(!ia(o))throw new Error(`Invalid tile count: ${o}`);let p=ca.getMultipliers(a)[o][r.riskLevel][n.length];if(p===void 0)throw new Error(`No multiplier found for matching tile count ${n.length}`);return{isFinished:!0,payoutMultiplier:new Hr(p),outputs:{result:e.values},randomValues:e}}}import N from"big.js";var la=(t,a)=>{return t.gt(a)?t:a};var da=(t,a)=>{return t.lt(a)?t:a};class Tr extends A{constructor(){super("LIMBO")}determineGameResult({generator:t,edge:a,gameInputs:r}){let e=t.getRandomInt({min:1,max:4294967295}),n=e.max,o=new N(16777216),i=new N(1),c=new N(1e6),u=e.value,p=new N(u-1).div(n),s=(100-a)/100,l=o.div(p.mul(o).plus(1)).mul(s),B=la(i,da(l,c));return{isFinished:!0,payoutMultiplier:B.gte(r.targetMultiplier)?new N(r.targetMultiplier):new N(0),outputs:{randomMultiplier:B,result:e.values},randomValues:e}}}import et from"big.js";var bt=(t,a)=>{if(a<0||t<0||a>t)throw new Error("Invalid input: ensure 0 ≤ r ≤ n and n ≥ 0.");if(a>t-a)a=t-a;let r=1;for(let e=1;e<=a;e++)r=r*(t-e+1)/e;return r};class Rr extends A{constructor(){super("MINES")}determineGameResult({generator:t,edge:a,gameInputs:r}){if(r.minesCount<=0||r.minesCount>24)throw new Error("Must select between 1 and 24 mines.");if(r.selectedTiles.length>25-r.minesCount)throw new Error("Cannot select more tiles than available safe tiles (total tiles minus mines).");let i=t.getUniqueRandomInts({min:1,max:25,count:r.minesCount}),c=i.values.some((T)=>r.selectedTiles.includes(T)),u=r.hasCashedOut||c,p=(100-a)/100,s=new et(bt(25-r.minesCount,r.selectedTiles.length)).div(new et(bt(25,r.selectedTiles.length))),B=r.hasCashedOut&&!c?new et(p).div(s):new et(0);return{isFinished:u,payoutMultiplier:B,outputs:{result:i.values},randomValues:i}}}import{Big as Nr}from"big.js";var ua;((e)=>{e.LOW_RISK="LOW_RISK";e.MEDIUM_RISK="MEDIUM_RISK";e.HIGH_RISK="HIGH_RISK"})(ua||={});var wo=[8,9,10,11,12,13,14,15,16],Pr={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]}},_r={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]}},Ir={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]}},br={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]}},jr={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]}},sa=new H(new Map([[1,Pr],[2,_r],[3,Ir],[4,br],[8,jr]]));class Vr extends A{constructor(){super("PLINKO")}determineGameResult({generator:t,gameInputs:a,edge:r}){if(a.numberOfRows%1>0)throw new Error("Number of rows must be an integer");if(a.numberOfRows<8||a.numberOfRows>16)throw new Error("Number of rows must be between 8 and 16");let e=a.numberOfRows,i=sa.getMultipliers(r)[a.riskLevel][e],c=t.getRandomIntsWithReplacement({min:0,max:1,count:a.numberOfRows}),p=c.values.reduce((l,B)=>l+B,0),s=i[p];if(s===void 0)throw new Error(`No payout found for end position ${p}`);return{isFinished:!0,payoutMultiplier:Nr(s),outputs:{result:c.values},randomValues:c}}}import{Big as it}from"big.js";var jt=[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],pa=[37,...jt],Aa=[[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]],Ba=[[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]],ma=[[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]],ya=[[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]],Ea=[[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]],fa=[[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]],Sa=[0,1,2,3,37],Oa=[[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]],Da=[[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;((r)=>{r.EVEN="EVEN";r.ODD="ODD"})(V||={});var w;((r)=>{r.RED="RED";r.BLACK="BLACK"})(w||={});var U;((r)=>{r.LOW="LOW";r.HIGH="HIGH"})(U||={});var G;((e)=>{e.TOP="TOP";e.MIDDLE="MIDDLE";e.BOTTOM="BOTTOM"})(G||={});var Z;((e)=>{e.FIRST="FIRST";e.SECOND="SECOND";e.THIRD="THIRD"})(Z||={});var Nt;((r)=>{r.AMERICAN="AMERICAN";r.EUROPEAN="EUROPEAN"})(Nt||={});var nt=(t)=>{if(t.straightBets.length===0&&t.splitBets.length===0&&t.streetBets.length===0&&t.cornerBets.length===0&&t.doubleStreetBets.length===0&&t.parityBets.length===0&&t.colorBets.length===0&&t.halfBets.length===0&&t.columnBets.length===0&&t.dozenBets.length===0)throw d.createValidationError("Must place at least a single bet.");if(!t.straightBets.every((a)=>a.amount.gte(0)&&$(a.value)))throw d.createValidationError("Invalid straight bet.");if(!t.splitBets.every((a)=>a.amount.gte(0)&&wr(a.values)))throw d.createValidationError("Invalid split bet.");if(!t.streetBets.every((a)=>a.amount.gte(0)&&Ur(a.values)))throw d.createValidationError("Invalid street bet.");if(!t.cornerBets.every((a)=>a.amount.gte(0)&&Gr(a.values)))throw d.createValidationError("Invalid corner bet.");if(!t.doubleStreetBets.every((a)=>a.amount.gte(0)&&Zr(a.values)))throw d.createValidationError("Invalid double street bet.");if(!t.parityBets.every((a)=>a.amount.gte(0)&&Object.values(V).includes(a.parity)))throw d.createValidationError("Invalid parity bet.");if(!t.colorBets.every((a)=>a.amount.gte(0)&&Object.values(w).includes(a.color)))throw d.createValidationError("Invalid color bet.");if(!t.halfBets.every((a)=>a.amount.gte(0)&&Object.values(U).includes(a.half)))throw d.createValidationError("Invalid half bet.");if(!t.columnBets.every((a)=>a.amount.gte(0)&&Object.values(G).includes(a.column)))throw d.createValidationError("Invalid column bet.");if(!t.dozenBets.every((a)=>a.amount.gte(0)&&Object.values(Z).includes(a.dozen)))throw d.createValidationError("Invalid dozen bet.")},$=(t)=>{return jt.includes(t)},wr=(t)=>{if(t.length!==2)return!1;if(!t.every($))return!1;return Aa.some(([a,r])=>a===t[0]&&r===t[1])},Ur=(t)=>{if(t.length!==3)return!1;if(!t.every($))return!1;return ma.some(([a,r,e])=>a===t[0]&&r===t[1]&&e===t[2])},Gr=(t)=>{if(t.length!==4)return!1;if(!t.every($))return!1;return Ea.some(([a,r,e,n])=>a===t[0]&&r===t[1]&&e===t[2]&&n===t[3])},Zr=(t)=>{if(t.length!==6)return!1;if(!t.every($))return!1;return Oa.some(([a,r,e,n,o,i])=>a===t[0]&&r===t[1]&&e===t[2]&&n===t[3]&&o===t[4]&&i===t[5])};var ot=(t)=>{if(t.straightBets.length===0&&t.splitBets.length===0&&t.streetBets.length===0&&t.cornerBets.length===0&&t.basketBets.length===0&&t.doubleStreetBets.length===0&&t.parityBets.length===0&&t.colorBets.length===0&&t.halfBets.length===0&&t.columnBets.length===0&&t.dozenBets.length===0)throw d.createValidationError("Must place at least a single bet.");if(!t.straightBets.every((a)=>a.amount.gte(0)&&z(a.value)))throw d.createValidationError("Invalid straight bet.");if(!t.splitBets.every((a)=>a.amount.gte(0)&&kr(a.values)))throw d.createValidationError("Invalid split bet.");if(!t.streetBets.every((a)=>a.amount.gte(0)&&Fr(a.values)))throw d.createValidationError("Invalid street bet.");if(!t.cornerBets.every((a)=>a.amount.gte(0)&&Mr(a.values)))throw d.createValidationError("Invalid corner bet.");if(!t.basketBets.every((a)=>a.amount.gte(0)))throw d.createValidationError("Invalid basket bet.");if(!t.doubleStreetBets.every((a)=>a.amount.gte(0)&&Yr(a.values)))throw d.createValidationError("Invalid double street bet.");if(!t.parityBets.every((a)=>a.amount.gte(0)&&Object.values(V).includes(a.parity)))throw d.createValidationError("Invalid parity bet.");if(!t.colorBets.every((a)=>a.amount.gte(0)&&Object.values(w).includes(a.color)))throw d.createValidationError("Invalid color bet.");if(!t.halfBets.every((a)=>a.amount.gte(0)&&Object.values(U).includes(a.half)))throw d.createValidationError("Invalid half bet.");if(!t.columnBets.every((a)=>a.amount.gte(0)&&Object.values(G).includes(a.column)))throw d.createValidationError("Invalid column bet.");if(!t.dozenBets.every((a)=>a.amount.gte(0)&&Object.values(Z).includes(a.dozen)))throw d.createValidationError("Invalid dozen bet.")},z=(t)=>{return pa.includes(t)};function kr(t){if(t.length!==2)return!1;if(!t.every(z))return!1;return Ba.some(([a,r])=>a===t[0]&&r===t[1])}var Fr=(t)=>{if(t.length!==3)return!1;if(!t.every(z))return!1;return ya.some(([a,r,e])=>a===t[0]&&r===t[1]&&e===t[2])},Mr=(t)=>{if(t.length!==4)return!1;if(!t.every(z))return!1;return fa.some(([a,r,e,n])=>a===t[0]&&r===t[1]&&e===t[2]&&n===t[3])},Yr=(t)=>{if(t.length!==6)return!1;if(!t.every(z))return!1;return Da.some(([a,r,e,n,o,i])=>a===t[0]&&r===t[1]&&e===t[2]&&n===t[3]&&o===t[4]&&i===t[5])};var Jr={straightBets:36,splitBets:18,streetBets:12,cornerBets:9,basketBets:7,doubleStreetBets:6,parityBets:2,colorBets:2,halfBets:2,columnBets:3,dozenBets:3},gr=[3,6,9,12,15,18,21,24,27,30,33,36],$r=[2,5,8,11,14,17,20,23,26,29,32,35],zr=[1,4,7,10,13,16,19,22,25,28,31,34],Xr=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],qr=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35],Qr=2.7,Wr=5.3;class Vt extends A{constructor(){super("ROULETTE")}determineGameResult({generator:t,gameInputs:a}){this.validateInputs(a);let r=t.getRandomInt({min:0,max:this.maxNumber}),e=r.value,n=this.determineBetOutcomes(a,e),{payoutMultiplier:o}=this.getPayoutDetails(a,e);return{outputs:{betOutcomes:n,result:r.values},payoutMultiplier:o,isFinished:!0,randomValues:r}}getBetAmount(t){return this.calculateTotalBetAmount(this.getBetTotals(t))}getPayoutDetails(t,a){let r=this.determineBetOutcomes(t,a),e=this.getBetTotals(t),n=this.getBetTotals(r.winningBets),o=this.calculateTotalBetAmount(e),i=this.calculateTotalPayout(n);return{payoutMultiplier:o.gt(0)?i.div(o):new it(0),payoutAmount:i}}determineBetOutcomes(t,a){let r={},e={};for(let n of Object.keys(t)){let o=t[n],i=this.betPredicates[n],{winning:c,losing:u}=this.partitionBets(o,i,a);r[n]=c,e[n]=u}return{winningBets:r,losingBets:e}}calculateTotalAmount(t){return t.reduce((a,r)=>a.plus(r.amount),new it(0))}isWinningStraightBet(t,a){return t.value===a}isWinningSplitBet(t,a){return t.values.some((r)=>r===a)}isWinningStreetBet(t,a){return t.values.some((r)=>r===a)}isWinningCornerBet(t,a){return t.values.some((r)=>r===a)}isWinningDoubleStreetBet(t,a){return t.values.some((r)=>r===a)}isWinningColorBet(t,a){let r=t;return Xr.includes(a)&&r.color==="RED"||qr.includes(a)&&r.color==="BLACK"}isWinningHalfBet(t,a){let r=t;if(a>0&&a<=18&&r.half==="LOW")return!0;if(a>18&&a<=36&&r.half==="HIGH")return!0;return!1}isWinningColumnBet(t,a){let r=t;return gr.includes(a)&&r.column==="TOP"||$r.includes(a)&&r.column==="MIDDLE"||zr.includes(a)&&r.column==="BOTTOM"}isWinningDozenBet(t,a){let r=t;if(a>0&&a<=12&&r.dozen==="FIRST")return!0;if(a>12&&a<=24&&r.dozen==="SECOND")return!0;if(a>24&&a<=36&&r.dozen==="THIRD")return!0;return!1}isWinningParityBet(t,a){let r=t;if(a===0||a===37)return!1;let e=a%2===0?"EVEN":"ODD";return r.parity===e}getBetTotals(t){let a={};for(let r of Object.keys(t))a[r]=this.calculateTotalAmount(t[r]);return a}calculateTotalBetAmount(t){return Object.values(t).reduce((a,r)=>a.plus(r),new it(0))}partitionBets(t,a,r){return{winning:t.filter((e)=>a(e,r)),losing:t.filter((e)=>!a(e,r))}}calculateTotalPayout(t){return Object.entries(t).reduce((a,[r,e])=>{let o=Jr[r];return a.plus(e.mul(o||0))},new it(0))}}class Ca extends Vt{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(t){nt(t)}}class ha extends Vt{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(t){ot(t)}isWinningBasketBet(t,a){return Sa.some((r)=>r===a)}}class Ha extends A{europeanGame;americanGame;constructor(){super("ROULETTE");this.europeanGame=new Ca,this.americanGame=new ha}getBetAmount(t){switch(t.type){case"AMERICAN":return this.americanGame.getBetAmount(t.inputs);case"EUROPEAN":return this.europeanGame.getBetAmount(t.inputs);default:throw new Error("Unhandled roulette type")}}determineGameResult(t){let{gameInputs:a,...r}=t;if(t.edge===Qr&&a.type==="EUROPEAN"){let e=this.europeanGame.determineGameResult({...r,gameInputs:a.inputs}),{betOutcomes:n}=e.outputs;return{...e,outputs:{type:"european",betOutcomes:n,result:e.outputs.result}}}if(t.edge===Wr&&a.type==="AMERICAN"){let e=this.americanGame.determineGameResult({...r,gameInputs:a.inputs}),{betOutcomes:n}=e.outputs;return{...e,outputs:{type:"american",betOutcomes:n,result:e.outputs.result}}}throw d.createValidationError(`Attempted to play ${a.type} roulette on edge ${t.edge}`)}}var ii=(t)=>{return new Ha().getBetAmount(t)};var si=(t)=>{if(t.type==="EUROPEAN")nt(t.inputs);else ot(t.inputs)};import{Big as re}from"big.js";var X;((e)=>{e.LOW_RISK="LOW_RISK";e.MEDIUM_RISK="MEDIUM_RISK";e.HIGH_RISK="HIGH_RISK"})(X||={});var q;((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"})(q||={});var Lr={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}}},Kr={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}}},vr={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}}},te={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}}},ae={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}}},xa=new H(new Map([[1,Lr],[2,Kr],[3,vr],[4,te],[8,ae]]));var Ta={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 ee extends A{constructor(){super("WHEEL")}determineGameResult({generator:t,gameInputs:a,edge:r}){if(!Object.values(q).includes(a.segments))throw new Error("Invalid segments value");if(!Object.values(X).includes(a.riskLevel))throw new Error("Invalid risk level");let n=xa.getMultipliers(r)[a.riskLevel];if(n===void 0)throw new Error(`No multipliers found for risk level ${a.riskLevel}`);let o=n[a.segments];if(o===void 0)throw new Error(`No multipliers found for segment ${a.segments}`);let i=Ta[a.riskLevel];if(i===void 0)throw new Error(`No patterns found for risk level ${a.riskLevel}`);let c=i[a.segments];if(c===void 0)throw new Error(`No patterns found for segment ${a.segments}`);let u=t.getRandomInt({min:0,max:c.length-1}),p=c[u.value];if(p===void 0)throw new Error(`No pattern found for segment ${a.segments} and value ${u.value}`);let s=o[p];if(s===void 0)throw new Error(`No payout found for picked segment ${p}`);return{isFinished:!0,payoutMultiplier:new re(s),outputs:{result:u.values},randomValues:u}}}export{si as validateRouletteGameInputs,fe as validateAdvancedDiceInputs,Sr as rtp99Multipliers,Or as rtp98Multipliers,Dr as rtp97Multipliers,Cr as rtp96Multipliers,hr as rtp92Multipliers,sa as plinkoMultipliers,bt as nCr,ca as kenoMultipliers,ia as isTileCount,yr as hasDiceWon,sr as diamondsMultipliers,ii as calculateRouletteBetAmount,mr as calculateDiceWinChance,Ya as calculateBaccaratBetAmount,Gt as calculateAdvancedDiceWinChance,da as bigMin,la as bigMax,Na as advancedDiceIsWithinBoundsInclusive,dt as advancedDiceIsWithinBoundsExclusive,Va as advancedDiceGetInclusiveBoundsRange,ut as advancedDiceGetExclusiveBoundsRange,q as WheelSegments,X as WheelRiskLevel,ee as Wheel,$a as WIN_MULTIPLIER,Ga as VALID_SUITS,Za as VALID_RANKS,ma as VALID_EUROPEAN_STREETS,jt as VALID_EUROPEAN_STRAIGHTS,Aa as VALID_EUROPEAN_SPLITS,Oa as VALID_EUROPEAN_DOUBLE_STREETS,Ea as VALID_EUROPEAN_CORNERS,ya as VALID_AMERICAN_STREETS,pa as VALID_AMERICAN_STRAIGHTS,Ba as VALID_AMERICAN_SPLITS,Da as VALID_AMERICAN_DOUBLE_STREETS,fa as VALID_AMERICAN_CORNERS,Et as ThreeCardBonusType,gr as TOP_COLUMN,fr as TILE_COUNTS,Mt as THREE_CARD_BONUS_PAYOUTS,A as SingleActionGame,j as SPLIT_BET_SIZE_FACTOR,Nt as RouletteType,Ha as Roulette,wa as RollType,at as RandomValuePool,Xr as RED_NUMBERS,st as RANDOM_MIN_VALUE,pt as RANDOM_MAX_VALUE,ua as PlinkoRiskLevel,Vr as Plinko,V as Parity,yt as PairBonusType,za as PUSH_MULTIPLIER,wo as PLINKO_ROW_COUNTS,Jr as PAYOUT_MULTIPLIERS,Ft as PAIR_BONUS_PAYOUTS,S as OrigamiGame,R as MultiplierCalculator,xt as MultiActionGame,Rr as Mines,Pa as MIN_WIN_CHANCE,$r as MIDDLE_COLUMN,_a as MAX_WIN_CHANCE,St as MAX_CARDS_PER_ROUND,Tr as Limbo,Xa as LOSE_MULTIPLIER,oa as KenoRiskLevel,xr as Keno,Bt as InsuranceOutcome,Ot as INSURANCE_WIN_PAYOUT,M as INSURANCE_BET_SIZE_FACTOR,Ie as INSURANCE_BET_MULTIPLIER,U as Half,Ra as GameErrorCode,d as GameError,F as Game,kt as FACE_CARD_VALUE,Ca as EuropeanRoulette,Qr as EUROPEAN_HOUSE_EDGE,wt as EFFECTIVE_RANGE,Z as Dozen,Br as DiceDirection,Er as Dice,or as DiamondsResultType,Ar as Diamonds,P as DOUBLE_DOWN_BET_SIZE_FACTOR,ea as DICE_EFFECTIVE_RANGE,Zt as DEALER_STAND_VALUE,G as Column,w as Color,be as CARDS_PER_SUIT,At as BlackjackOutcome,mt as BlackjackActionType,er as Blackjack,ka as BaccaratOutcome,Fa as BaccaratBetType,Ja as Baccarat,ft as BUST_VALUE,zr as BOTTOM_COLUMN,qr as BLACK_NUMBERS,C as BLACKJACK_VALUE,ga as BLACKJACK_MULTIPLIER,L as BASE_PAYOUT_MULTIPLIERS,ha as AmericanRoulette,Ua as AdvancedDice,Wr as AMERICAN_HOUSE_EDGE,Sa as AMERICAN_BASKET,Dt as ACE_SOFT_BONUS};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@betorigami/game-calculations",
3
- "version": "4.4.5",
3
+ "version": "5.0.0",
4
4
  "type": "module",
5
5
  "main": "dist/index.cjs",
6
6
  "module": "dist/index.mjs",