UNPKG

@randsum/dice

Version:

A flexible, type-safe dice roller for tabletop RPGs, game development, and probability simulations

5 lines (3 loc) 40.4 kB
var te=require("node:module");var{defineProperty:N,getOwnPropertyNames:M,getOwnPropertyDescriptor:$}=Object,C=Object.prototype.hasOwnProperty,p=(e,t,r)=>{for(let o of M(t))if(!C.call(e,o)&&o!=="default")N(e,o,{get:()=>t[o],enumerable:!0});if(r){for(let o of M(t))if(!C.call(r,o)&&o!=="default")N(r,o,{get:()=>t[o],enumerable:!0});return r}};var v=new WeakMap,ee=(e)=>{var t=v.get(e),r;if(t)return t;if(t=N({},"__esModule",{value:!0}),e&&typeof e==="object"||typeof e==="function")M(e).map((o)=>!C.call(t,o)&&N(t,o,{get:()=>e[o],enumerable:!(r=$(e,o))||r.enumerable}));return v.set(e,t),t};var g=(e,t)=>{for(var r in t)N(e,r,{get:t[r],enumerable:!0,configurable:!0,set:(o)=>t[r]=()=>o})};var m={};g(m,{roll:()=>b,isNumericResult:()=>S,isMixedResult:()=>q,isD:()=>y,isCustomResult:()=>w,fudgeDice:()=>W,coin:()=>Q,alphaNumDie:()=>X,D8:()=>_,D6:()=>H,D4:()=>B,D20:()=>J,D12:()=>L,D100:()=>K,D10:()=>G,D:()=>u});module.exports=ee(m);var Y={};g(Y,{fudgeDice:()=>W,coin:()=>Q,alphaNumDie:()=>X,D8:()=>_,D6:()=>H,D4:()=>B,D20:()=>J,D12:()=>L,D100:()=>K,D10:()=>G,D:()=>u});var V=require("@randsum/core");var U={};g(U,{roll:()=>b});function c(e,t=0){if(e.every((r)=>typeof r==="number"))return e.reduce((r,o)=>Number(r)+o,t);return e.flat().join(", ")}function x(e){return Math.random()*e|0}function D(e){return Array.from({length:Number(e)},(t,r)=>r+1)}function d(e,t,r){let o=r??D(t),i=new Array(e);for(let n=0;n<e;n++){let P=x(t),s=o[P];if(s)i[n]=s}return i}var l=require("@randsum/core");function y(e){return typeof e==="object"&&e!==null&&"type"in e&&"sides"in e&&"faces"in e&&"isCustom"in e&&"roll"in e&&"rollSpread"in e&&"rollModified"in e&&"toOptions"in e&&(e.type==="numeric"||e.type==="custom")}function h(e){let t=F(e);return{argument:e,options:t,die:oe(e),notation:l.optionsConverter.toNotation(t),description:l.optionsConverter.toDescription(t)}}function F(e){if(y(e))return e.toOptions;if(l.isDiceNotation(e)){let r=(e.match(l.coreNotationPattern)??"")[0],o=e.replace(r,""),[i,n=""]=r.split(/[Dd]/);if(n.includes("{"))return{quantity:Number(i),sides:[...n.replaceAll(/{|}/g,"")]};return{quantity:Number(i),sides:Number(n),...{modifiers:{...l.DropModifier.parse(o),...l.ExplodeModifier.parse(o),...l.UniqueModifier.parse(o),...l.ReplaceModifier.parse(o),...l.RerollModifier.parse(o),...l.CapModifier.parse(o),...l.PlusModifier.parse(o),...l.MinusModifier.parse(o)}}}}if(Array.isArray(e))return{quantity:1,sides:e.map(String)};if(typeof e==="string"||typeof e==="number")return{quantity:1,sides:Number(e)};return e}function oe(e){if(y(e))return e;let t=F(e);if(Array.isArray(t.sides))return u(t.sides);return u(t.sides)}var E=require("@randsum/core"),a=require("@randsum/core");function A(e){return Array.isArray(e.options.sides)}function T(e){return!Array.isArray(e.options.sides)}function I(e){let t=re(e),r=ie(e,t),o=c(t);if(t.every((i)=>typeof i==="number")&&r.rolls.every((i)=>typeof i==="number")&&typeof o==="number"&&T(e))return{parameters:e,rawResult:o,rawRolls:t,modifiedRolls:r,total:r.total,type:"numeric"};if(t.every((i)=>typeof i==="string")&&r.rolls.every((i)=>typeof i==="string")&&typeof o==="string"&&A(e))return{parameters:e,rawResult:o,rawRolls:t,modifiedRolls:r,total:c(r.rolls),type:"custom"};throw new Error("Mixed rolls are not supported yet")}function re({options:e}){let t=e.quantity??1;if(E.isNumericRollOptions(e))return d(t,e.sides);else return d(t,e.sides.length,e.sides)}function ie(e,t){if(A(e)&&t.every((R)=>typeof R==="string"))return{total:c(t),rolls:t};if(!t.every((R)=>typeof R==="number"))throw new Error("Mixed rolls are not supported yet");let{sides:r,quantity:o=1,modifiers:i={}}=e.options;if(Object.keys(i).length===0)return{total:c(t),rolls:t.map((R)=>Number(R))};let n=()=>x(r),s={simpleMathModifier:0,rolls:t.map((R)=>Number(R))};if(i.reroll)s=f("reroll",i,s,{sides:r,quantity:o,rollOne:n});if(i.replace)s=f("replace",i,s,{sides:r,quantity:o,rollOne:n});if(i.cap)s=f("cap",i,s,{sides:r,quantity:o,rollOne:n});if(i.explode)s=f("explode",i,s,{sides:r,quantity:o,rollOne:n});if(i.unique)s=f("unique",i,s,{sides:r,quantity:o,rollOne:n});if(i.drop)s=f("drop",i,s,{sides:r,quantity:o,rollOne:n});if(i.plus)s=f("plus",i,s,{sides:r,quantity:o,rollOne:n});if(i.minus)s=f("minus",i,s,{sides:r,quantity:o,rollOne:n});return{rolls:s.rolls,total:c(s.rolls,s.simpleMathModifier)}}function f(e,t,r,o){let i=t[e];if(i===void 0)return r;switch(e){case"plus":return{...r,simpleMathModifier:Number(i)};case"minus":return{...r,simpleMathModifier:-Number(i)};case"reroll":return new a.RerollModifier(t.reroll).apply(r,void 0,o.rollOne);case"unique":return new a.UniqueModifier(t.unique).apply(r,{sides:o.sides,quantity:o.quantity},o.rollOne);case"replace":return new a.ReplaceModifier(t.replace).apply(r);case"cap":return new a.CapModifier(t.cap).apply(r);case"drop":return new a.DropModifier(t.drop).apply(r);case"explode":return new a.ExplodeModifier(t.explode).apply(r,{sides:o.sides,quantity:o.quantity},o.rollOne);default:throw new Error(`Unknown modifier: ${String(e)}`)}}function j(e){if(e.every((t)=>t.type==="numeric"))return"numeric";if(e.every((t)=>t.type==="custom"))return"custom";return"mixed"}function b(...e){let r=e.map((o)=>h(o)).map((o)=>I(o));return{rolls:r,rawResults:r.map((o)=>o.rawRolls).flat(),total:c(r.map((o)=>o.total)),type:j(r)}}class O{sides;constructor(e){this.sides=e}}class k extends O{type="numeric";faces;isCustom=!1;constructor(e){super(e);this.faces=D(e)}roll(e=1){return this.rollSpread(e).reduce((r,o)=>r+o,0)}rollSpread(e=1){return d(e,this.sides,this.faces)}rollModified(e=1,t={}){let r={...this.toOptions,quantity:e,modifiers:t};return b(r)}get toOptions(){return{quantity:1,sides:this.sides}}}class z extends O{type="custom";faces;isCustom=!0;constructor(e){if(!e.length)throw new V.RandsumError("Custom die must have at least one face","INVALID_DIE_CONFIG",{input:e,expected:"Array with at least one face value"},['Provide at least one face value: ["H", "T"] for a coin',"Use standard dice like D6 if you need numbered faces","Custom faces must be non-empty strings"]);super(e.length);this.faces=[...e]}roll(e=1){return this.rollSpread(e).join(", ")}rollSpread(e=1){return d(e,this.sides,this.faces)}rollModified(e=1,t={}){return b({...this.toOptions,quantity:e,modifiers:t})}get toOptions(){return{quantity:1,sides:[...this.faces]}}}function u(e){if(typeof e==="number")return new k(e);else return new z(e)}var B=u(4),H=u(6),_=u(8),G=u(10),L=u(12),J=u(20),K=u(100),Q=u(["Heads","Tails"]),W=u(["+","+","+","-"," "," "]),le=["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","0","1","2","3","4","5","6","7","8","9"],X=u(le);var Z={};g(Z,{isNumericResult:()=>S,isMixedResult:()=>q,isD:()=>y,isCustomResult:()=>w});function S(e){return e.type==="numeric"}function w(e){return e.type==="custom"}function q(e){return e.type==="mixed"}p(m,require("@randsum/core"),module.exports);p(m,require("@randsum/notation"),module.exports); //# debugId=49C84FA9165912EE64756E2164756E21 //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL0QudHMiLCAiLi4vc3JjL3V0aWxzL2NhbGN1bGF0ZVRvdGFsLnRzIiwgIi4uL3NyYy91dGlscy9jb3JlUmFuZG9tLnRzIiwgIi4uL3NyYy91dGlscy9nZW5lcmF0ZU51bWVyaWNGYWNlcy50cyIsICIuLi9zcmMvdXRpbHMvY29yZVNwcmVhZFJvbGxzLnRzIiwgIi4uL3NyYy91dGlscy9ub3JtYWxpemVBcmd1bWVudC50cyIsICIuLi9zcmMvZ3VhcmRzL2lzRC50cyIsICIuLi9zcmMvdXRpbHMvZ2VuZXJhdGVSb2xsLnRzIiwgIi4uL3NyYy9ndWFyZHMvaXNDdXN0b21Sb2xsUGFyYW1zLnRzIiwgIi4uL3NyYy9ndWFyZHMvaXNOdW1lcmljUm9sbFBhcmFtcy50cyIsICIuLi9zcmMvdXRpbHMvcm9sbFR5cGUudHMiLCAiLi4vc3JjL3JvbGwudHMiLCAiLi4vc3JjL2d1YXJkcy9pc1JvbGxSZXN1bHQudHMiLCAiLi4vc3JjL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgImltcG9ydCB0eXBlIHtcbiAgQ3VzdG9tUm9sbE9wdGlvbnMsXG4gIE1vZGlmaWVyT3B0aW9ucyxcbiAgTnVtZXJpY1JvbGxPcHRpb25zXG59IGZyb20gJ0ByYW5kc3VtL2NvcmUnXG5pbXBvcnQgeyBSYW5kc3VtRXJyb3IgfSBmcm9tICdAcmFuZHN1bS9jb3JlJ1xuaW1wb3J0IHsgcm9sbCB9IGZyb20gJy4vcm9sbCdcbmltcG9ydCB0eXBlIHtcbiAgQmFzZUQsXG4gIEN1c3RvbURpZSxcbiAgQ3VzdG9tUm9sbFJlc3VsdCxcbiAgTnVtZXJpY0RpZSxcbiAgTnVtZXJpY1JvbGxSZXN1bHRcbn0gZnJvbSAnLi90eXBlcydcbmltcG9ydCB7IGNvcmVTcHJlYWRSb2xscyB9IGZyb20gJy4vdXRpbHMvY29yZVNwcmVhZFJvbGxzJ1xuaW1wb3J0IHsgZ2VuZXJhdGVOdW1lcmljRmFjZXMgfSBmcm9tICcuL3V0aWxzL2dlbmVyYXRlTnVtZXJpY0ZhY2VzJ1xuXG5hYnN0cmFjdCBjbGFzcyBEaWVCYXNlIHtcbiAgcHVibGljIHJlYWRvbmx5IHNpZGVzOiBudW1iZXJcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IHR5cGU6ICdudW1lcmljJyB8ICdjdXN0b20nXG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBmYWNlczogbnVtYmVyW10gfCBzdHJpbmdbXVxuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgaXNDdXN0b206IGJvb2xlYW5cblxuICBjb25zdHJ1Y3RvcihzaWRlczogbnVtYmVyKSB7XG4gICAgdGhpcy5zaWRlcyA9IHNpZGVzXG4gIH1cblxuICBwdWJsaWMgYWJzdHJhY3Qgcm9sbChxdWFudGl0eT86IG51bWJlcik6IG51bWJlciB8IHN0cmluZ1xuICBwdWJsaWMgYWJzdHJhY3Qgcm9sbFNwcmVhZChxdWFudGl0eT86IG51bWJlcik6IG51bWJlcltdIHwgc3RyaW5nW11cbiAgcHVibGljIGFic3RyYWN0IHJvbGxNb2RpZmllZChcbiAgICBxdWFudGl0eTogbnVtYmVyLFxuICAgIG1vZGlmaWVycz86IE1vZGlmaWVyT3B0aW9uc1xuICApOiBOdW1lcmljUm9sbFJlc3VsdCB8IEN1c3RvbVJvbGxSZXN1bHRcbiAgcHVibGljIGFic3RyYWN0IGdldCB0b09wdGlvbnMoKTogTnVtZXJpY1JvbGxPcHRpb25zIHwgQ3VzdG9tUm9sbE9wdGlvbnNcbn1cblxuY2xhc3MgTnVtZXJpY0RpZUltcGwgZXh0ZW5kcyBEaWVCYXNlIGltcGxlbWVudHMgTnVtZXJpY0RpZSB7XG4gIHB1YmxpYyByZWFkb25seSB0eXBlID0gJ251bWVyaWMnIGFzIGNvbnN0XG4gIHB1YmxpYyByZWFkb25seSBmYWNlczogbnVtYmVyW11cbiAgcHVibGljIHJlYWRvbmx5IGlzQ3VzdG9tID0gZmFsc2UgYXMgY29uc3RcblxuICBjb25zdHJ1Y3RvcihzaWRlczogbnVtYmVyKSB7XG4gICAgc3VwZXIoc2lkZXMpXG4gICAgdGhpcy5mYWNlcyA9IGdlbmVyYXRlTnVtZXJpY0ZhY2VzKHNpZGVzKVxuICB9XG5cbiAgcHVibGljIHJvbGwocXVhbnRpdHkgPSAxKTogbnVtYmVyIHtcbiAgICBjb25zdCByb2xscyA9IHRoaXMucm9sbFNwcmVhZChxdWFudGl0eSlcbiAgICByZXR1cm4gcm9sbHMucmVkdWNlKChhY2MsIHJvbGwpID0+IGFjYyArIHJvbGwsIDApXG4gIH1cblxuICBwdWJsaWMgcm9sbFNwcmVhZChxdWFudGl0eSA9IDEpOiBudW1iZXJbXSB7XG4gICAgcmV0dXJuIGNvcmVTcHJlYWRSb2xsczxudW1iZXI+KHF1YW50aXR5LCB0aGlzLnNpZGVzLCB0aGlzLmZhY2VzKVxuICB9XG5cbiAgcHVibGljIHJvbGxNb2RpZmllZChcbiAgICBxdWFudGl0eSA9IDEsXG4gICAgbW9kaWZpZXJzOiBNb2RpZmllck9wdGlvbnMgPSB7fVxuICApOiBOdW1lcmljUm9sbFJlc3VsdCB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHsgLi4udGhpcy50b09wdGlvbnMsIHF1YW50aXR5LCBtb2RpZmllcnMgfVxuICAgIHJldHVybiByb2xsKG9wdGlvbnMpXG4gIH1cblxuICBwdWJsaWMgZ2V0IHRvT3B0aW9ucygpOiBOdW1lcmljUm9sbE9wdGlvbnMge1xuICAgIHJldHVybiB7XG4gICAgICBxdWFudGl0eTogMSxcbiAgICAgIHNpZGVzOiB0aGlzLnNpZGVzXG4gICAgfVxuICB9XG59XG5cbmNsYXNzIEN1c3RvbURpZUltcGwgZXh0ZW5kcyBEaWVCYXNlIGltcGxlbWVudHMgQ3VzdG9tRGllIHtcbiAgcHVibGljIHJlYWRvbmx5IHR5cGUgPSAnY3VzdG9tJyBhcyBjb25zdFxuICBwdWJsaWMgcmVhZG9ubHkgZmFjZXM6IHN0cmluZ1tdXG4gIHB1YmxpYyByZWFkb25seSBpc0N1c3RvbSA9IHRydWUgYXMgY29uc3RcblxuICBjb25zdHJ1Y3RvcihmYWNlczogc3RyaW5nW10pIHtcbiAgICBpZiAoIWZhY2VzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IFJhbmRzdW1FcnJvcihcbiAgICAgICAgJ0N1c3RvbSBkaWUgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBmYWNlJyxcbiAgICAgICAgJ0lOVkFMSURfRElFX0NPTkZJRycsXG4gICAgICAgIHtcbiAgICAgICAgICBpbnB1dDogZmFjZXMsXG4gICAgICAgICAgZXhwZWN0ZWQ6ICdBcnJheSB3aXRoIGF0IGxlYXN0IG9uZSBmYWNlIHZhbHVlJ1xuICAgICAgICB9LFxuICAgICAgICBbXG4gICAgICAgICAgJ1Byb3ZpZGUgYXQgbGVhc3Qgb25lIGZhY2UgdmFsdWU6IFtcIkhcIiwgXCJUXCJdIGZvciBhIGNvaW4nLFxuICAgICAgICAgICdVc2Ugc3RhbmRhcmQgZGljZSBsaWtlIEQ2IGlmIHlvdSBuZWVkIG51bWJlcmVkIGZhY2VzJyxcbiAgICAgICAgICAnQ3VzdG9tIGZhY2VzIG11c3QgYmUgbm9uLWVtcHR5IHN0cmluZ3MnXG4gICAgICAgIF1cbiAgICAgIClcbiAgICB9XG4gICAgc3VwZXIoZmFjZXMubGVuZ3RoKVxuICAgIHRoaXMuZmFjZXMgPSBbLi4uZmFjZXNdXG4gIH1cblxuICBwdWJsaWMgcm9sbChxdWFudGl0eSA9IDEpOiBzdHJpbmcge1xuICAgIGNvbnN0IHJvbGxzID0gdGhpcy5yb2xsU3ByZWFkKHF1YW50aXR5KVxuICAgIHJldHVybiByb2xscy5qb2luKCcsICcpXG4gIH1cblxuICBwdWJsaWMgcm9sbFNwcmVhZChxdWFudGl0eSA9IDEpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIGNvcmVTcHJlYWRSb2xsczxzdHJpbmc+KHF1YW50aXR5LCB0aGlzLnNpZGVzLCB0aGlzLmZhY2VzKVxuICB9XG5cbiAgcHVibGljIHJvbGxNb2RpZmllZChcbiAgICBxdWFudGl0eSA9IDEsXG4gICAgbW9kaWZpZXJzOiBNb2RpZmllck9wdGlvbnMgPSB7fVxuICApOiBDdXN0b21Sb2xsUmVzdWx0IHtcbiAgICByZXR1cm4gcm9sbCh7XG4gICAgICAuLi50aGlzLnRvT3B0aW9ucyxcbiAgICAgIHF1YW50aXR5LFxuICAgICAgbW9kaWZpZXJzXG4gICAgfSBhcyBDdXN0b21Sb2xsT3B0aW9ucylcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdG9PcHRpb25zKCk6IEN1c3RvbVJvbGxPcHRpb25zIHtcbiAgICByZXR1cm4ge1xuICAgICAgcXVhbnRpdHk6IDEsXG4gICAgICBzaWRlczogWy4uLnRoaXMuZmFjZXNdXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIEQoc2lkZXM6IG51bWJlcik6IE51bWVyaWNEaWVcblxuZnVuY3Rpb24gRChmYWNlczogc3RyaW5nW10pOiBDdXN0b21EaWVcblxuZnVuY3Rpb24gRChhcmc6IG51bWJlciB8IHN0cmluZ1tdKTogQmFzZUQge1xuICBpZiAodHlwZW9mIGFyZyA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gbmV3IE51bWVyaWNEaWVJbXBsKGFyZylcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbmV3IEN1c3RvbURpZUltcGwoYXJnKVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBENDogTnVtZXJpY0RpZSA9IEQoNClcblxuZXhwb3J0IGNvbnN0IEQ2OiBOdW1lcmljRGllID0gRCg2KVxuXG5leHBvcnQgY29uc3QgRDg6IE51bWVyaWNEaWUgPSBEKDgpXG5cbmV4cG9ydCBjb25zdCBEMTA6IE51bWVyaWNEaWUgPSBEKDEwKVxuXG5leHBvcnQgY29uc3QgRDEyOiBOdW1lcmljRGllID0gRCgxMilcblxuZXhwb3J0IGNvbnN0IEQyMDogTnVtZXJpY0RpZSA9IEQoMjApXG5cbmV4cG9ydCBjb25zdCBEMTAwOiBOdW1lcmljRGllID0gRCgxMDApXG5cbmV4cG9ydCBjb25zdCBjb2luOiBDdXN0b21EaWUgPSBEKFsnSGVhZHMnLCAnVGFpbHMnXSlcblxuZXhwb3J0IGNvbnN0IGZ1ZGdlRGljZTogQ3VzdG9tRGllID0gRChbJysnLCAnKycsICcrJywgJy0nLCAnICcsICcgJ10pXG5cbmNvbnN0IGFscGhhbnVtRmFjZXMgPSBbXG4gICdBJyxcbiAgJ0InLFxuICAnQycsXG4gICdEJyxcbiAgJ0UnLFxuICAnRicsXG4gICdHJyxcbiAgJ0gnLFxuICAnSScsXG4gICdKJyxcbiAgJ0snLFxuICAnTCcsXG4gICdNJyxcbiAgJ04nLFxuICAnTycsXG4gICdQJyxcbiAgJ1EnLFxuICAnUicsXG4gICdTJyxcbiAgJ1QnLFxuICAnVScsXG4gICdWJyxcbiAgJ1cnLFxuICAnWCcsXG4gICdZJyxcbiAgJ1onLFxuICAnYScsXG4gICdiJyxcbiAgJ2MnLFxuICAnZCcsXG4gICdlJyxcbiAgJ2YnLFxuICAnZycsXG4gICdoJyxcbiAgJ2knLFxuICAnaicsXG4gICdrJyxcbiAgJ2wnLFxuICAnbScsXG4gICduJyxcbiAgJ28nLFxuICAncCcsXG4gICdxJyxcbiAgJ3InLFxuICAncycsXG4gICd0JyxcbiAgJ3UnLFxuICAndicsXG4gICd3JyxcbiAgJ3gnLFxuICAneScsXG4gICd6JyxcbiAgJzAnLFxuICAnMScsXG4gICcyJyxcbiAgJzMnLFxuICAnNCcsXG4gICc1JyxcbiAgJzYnLFxuICAnNycsXG4gICc4JyxcbiAgJzknXG5dXG5cbmV4cG9ydCBjb25zdCBhbHBoYU51bURpZTogQ3VzdG9tRGllID0gRChhbHBoYW51bUZhY2VzKVxuXG5leHBvcnQgeyBEIH1cbiIsCiAgICAiZnVuY3Rpb24gY2FsY3VsYXRlVG90YWwoXG4gIHJvbGxzOiAoc3RyaW5nIHwgbnVtYmVyKVtdLFxuICBib251czogc3RyaW5nIHwgbnVtYmVyID0gMFxuKTogc3RyaW5nIHwgbnVtYmVyIHtcbiAgaWYgKHJvbGxzLmV2ZXJ5KChyb2xsKSA9PiB0eXBlb2Ygcm9sbCA9PT0gJ251bWJlcicpKSB7XG4gICAgcmV0dXJuIHJvbGxzLnJlZHVjZSgoYWNjLCBjdXIpID0+IE51bWJlcihhY2MpICsgY3VyLCBib251cylcbiAgfVxuXG4gIHJldHVybiByb2xscy5mbGF0KCkuam9pbignLCAnKVxufVxuXG5leHBvcnQgeyBjYWxjdWxhdGVUb3RhbCB9XG4iLAogICAgImV4cG9ydCBmdW5jdGlvbiBjb3JlUmFuZG9tKG1heDogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIChNYXRoLnJhbmRvbSgpICogbWF4KSB8IDBcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNlZWRlZFJhbmRvbShcbiAgc2VlZDogbnVtYmVyID0gRGF0ZS5ub3coKVxuKTogKG1heDogbnVtYmVyKSA9PiBudW1iZXIge1xuICBsZXQgY3VycmVudFNlZWQgPSBzZWVkXG5cbiAgcmV0dXJuIGZ1bmN0aW9uIHNlZWRlZFJhbmRvbShtYXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgY3VycmVudFNlZWQgXj0gY3VycmVudFNlZWQgPDwgMTNcbiAgICBjdXJyZW50U2VlZCBePSBjdXJyZW50U2VlZCA+PiAxN1xuICAgIGN1cnJlbnRTZWVkIF49IGN1cnJlbnRTZWVkIDw8IDVcblxuICAgIGNvbnN0IHJhbmRvbVZhbHVlID0gTWF0aC5hYnMoY3VycmVudFNlZWQpIC8gMjE0NzQ4MzY0N1xuICAgIHJldHVybiAocmFuZG9tVmFsdWUgKiBtYXgpIHwgMFxuICB9XG59XG4iLAogICAgImV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZU51bWVyaWNGYWNlcyhzaWRlczogbnVtYmVyKTogbnVtYmVyW10ge1xuICByZXR1cm4gQXJyYXkuZnJvbSh7IGxlbmd0aDogTnVtYmVyKHNpZGVzKSB9LCAoXywgaW5kZXgpID0+IGluZGV4ICsgMSlcbn1cbiIsCiAgICAiaW1wb3J0IHsgY29yZVJhbmRvbSB9IGZyb20gJy4vY29yZVJhbmRvbSdcbmltcG9ydCB7IGdlbmVyYXRlTnVtZXJpY0ZhY2VzIH0gZnJvbSAnLi9nZW5lcmF0ZU51bWVyaWNGYWNlcydcblxuZXhwb3J0IGZ1bmN0aW9uIGNvcmVTcHJlYWRSb2xsczxGIGV4dGVuZHMgc3RyaW5nIHwgbnVtYmVyPihcbiAgcXVhbnRpdHk6IG51bWJlcixcbiAgbWF4OiBudW1iZXIsXG4gIGZhY2VzPzogRltdXG4pOiBGW10ge1xuICBjb25zdCBmYWNlc0FyciA9IChmYWNlcyA/PyBnZW5lcmF0ZU51bWVyaWNGYWNlcyhtYXgpKSBhcyBGW11cblxuICBjb25zdCByZXN1bHQgPSBuZXcgQXJyYXk8Rj4ocXVhbnRpdHkpXG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBxdWFudGl0eTsgaSsrKSB7XG4gICAgY29uc3QgcmFuZG9tSW5kZXggPSBjb3JlUmFuZG9tKG1heClcbiAgICBjb25zdCBmYWNlID0gZmFjZXNBcnJbcmFuZG9tSW5kZXhdXG4gICAgaWYgKGZhY2UpIHtcbiAgICAgIHJlc3VsdFtpXSA9IGZhY2VcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0XG59XG4iLAogICAgImltcG9ydCB7XG4gIENhcE1vZGlmaWVyLFxuICBEcm9wTW9kaWZpZXIsXG4gIEV4cGxvZGVNb2RpZmllcixcbiAgTWludXNNb2RpZmllcixcbiAgUGx1c01vZGlmaWVyLFxuICBSZXBsYWNlTW9kaWZpZXIsXG4gIFJlcm9sbE1vZGlmaWVyLFxuICBVbmlxdWVNb2RpZmllcixcbiAgY29yZU5vdGF0aW9uUGF0dGVybixcbiAgaXNEaWNlTm90YXRpb24sXG4gIG9wdGlvbnNDb252ZXJ0ZXJcbn0gZnJvbSAnQHJhbmRzdW0vY29yZSdcbmltcG9ydCB7IEQgfSBmcm9tICcuLi9EJ1xuaW1wb3J0IHsgaXNEIH0gZnJvbSAnLi4vZ3VhcmRzL2lzRCdcbmltcG9ydCB0eXBlIHsgUm9sbEFyZ3VtZW50LCBSb2xsUGFyYW1zIH0gZnJvbSAnLi4vdHlwZXMnXG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVBcmd1bWVudChhcmd1bWVudDogUm9sbEFyZ3VtZW50KTogUm9sbFBhcmFtcyB7XG4gIGNvbnN0IG9wdGlvbnMgPSBvcHRpb25zRnJvbUFyZ3VtZW50KGFyZ3VtZW50KVxuICByZXR1cm4ge1xuICAgIGFyZ3VtZW50LFxuICAgIG9wdGlvbnMsXG4gICAgZGllOiBkaWVGb3JBcmd1bWVudChhcmd1bWVudCksXG4gICAgbm90YXRpb246IG9wdGlvbnNDb252ZXJ0ZXIudG9Ob3RhdGlvbihvcHRpb25zKSxcbiAgICBkZXNjcmlwdGlvbjogb3B0aW9uc0NvbnZlcnRlci50b0Rlc2NyaXB0aW9uKG9wdGlvbnMpXG4gIH0gYXMgUm9sbFBhcmFtc1xufVxuXG5mdW5jdGlvbiBvcHRpb25zRnJvbUFyZ3VtZW50KGFyZ3VtZW50OiBSb2xsQXJndW1lbnQpOiBSb2xsUGFyYW1zWydvcHRpb25zJ10ge1xuICBpZiAoaXNEKGFyZ3VtZW50KSkge1xuICAgIHJldHVybiBhcmd1bWVudC50b09wdGlvbnNcbiAgfVxuXG4gIGlmIChpc0RpY2VOb3RhdGlvbihhcmd1bWVudCkpIHtcbiAgICBjb25zdCBjb3JlTm90YXRpb25NYXRjaCA9IGFyZ3VtZW50Lm1hdGNoKGNvcmVOb3RhdGlvblBhdHRlcm4pID8/ICcnXG5cbiAgICBjb25zdCBjb3JlTWF0Y2ggPSBjb3JlTm90YXRpb25NYXRjaFswXVxuICAgIGNvbnN0IG1vZGlmaWVyc1N0cmluZyA9IGFyZ3VtZW50LnJlcGxhY2UoY29yZU1hdGNoLCAnJylcbiAgICBjb25zdCBbcXVhbnRpdHksIHNpZGVzID0gJyddID0gY29yZU1hdGNoLnNwbGl0KC9bRGRdLylcblxuICAgIGlmIChzaWRlcy5pbmNsdWRlcygneycpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBxdWFudGl0eTogTnVtYmVyKHF1YW50aXR5KSxcbiAgICAgICAgc2lkZXM6IFsuLi5zaWRlcy5yZXBsYWNlQWxsKC97fH0vZywgJycpXVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBxdWFudGl0eTogTnVtYmVyKHF1YW50aXR5KSxcbiAgICAgIHNpZGVzOiBOdW1iZXIoc2lkZXMpLFxuICAgICAgLi4ue1xuICAgICAgICBtb2RpZmllcnM6IHtcbiAgICAgICAgICAuLi5Ecm9wTW9kaWZpZXIucGFyc2UobW9kaWZpZXJzU3RyaW5nKSxcbiAgICAgICAgICAuLi5FeHBsb2RlTW9kaWZpZXIucGFyc2UobW9kaWZpZXJzU3RyaW5nKSxcbiAgICAgICAgICAuLi5VbmlxdWVNb2RpZmllci5wYXJzZShtb2RpZmllcnNTdHJpbmcpLFxuICAgICAgICAgIC4uLlJlcGxhY2VNb2RpZmllci5wYXJzZShtb2RpZmllcnNTdHJpbmcpLFxuICAgICAgICAgIC4uLlJlcm9sbE1vZGlmaWVyLnBhcnNlKG1vZGlmaWVyc1N0cmluZyksXG4gICAgICAgICAgLi4uQ2FwTW9kaWZpZXIucGFyc2UobW9kaWZpZXJzU3RyaW5nKSxcbiAgICAgICAgICAuLi5QbHVzTW9kaWZpZXIucGFyc2UobW9kaWZpZXJzU3RyaW5nKSxcbiAgICAgICAgICAuLi5NaW51c01vZGlmaWVyLnBhcnNlKG1vZGlmaWVyc1N0cmluZylcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KGFyZ3VtZW50KSkge1xuICAgIHJldHVybiB7IHF1YW50aXR5OiAxLCBzaWRlczogYXJndW1lbnQubWFwKFN0cmluZykgfVxuICB9XG5cbiAgaWYgKHR5cGVvZiBhcmd1bWVudCA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGFyZ3VtZW50ID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB7IHF1YW50aXR5OiAxLCBzaWRlczogTnVtYmVyKGFyZ3VtZW50KSB9XG4gIH1cbiAgcmV0dXJuIGFyZ3VtZW50XG59XG5cbmZ1bmN0aW9uIGRpZUZvckFyZ3VtZW50KGFyZ3VtZW50OiBSb2xsQXJndW1lbnQpOiBSb2xsUGFyYW1zWydkaWUnXSB7XG4gIGlmIChpc0QoYXJndW1lbnQpKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50XG4gIH1cbiAgY29uc3Qgb3B0aW9ucyA9IG9wdGlvbnNGcm9tQXJndW1lbnQoYXJndW1lbnQpXG4gIGlmIChBcnJheS5pc0FycmF5KG9wdGlvbnMuc2lkZXMpKSB7XG4gICAgcmV0dXJuIEQob3B0aW9ucy5zaWRlcylcbiAgfVxuICByZXR1cm4gRChvcHRpb25zLnNpZGVzKVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IEJhc2VEIH0gZnJvbSAnLi4vdHlwZXMnXG5cbmV4cG9ydCBmdW5jdGlvbiBpc0QoYXJnOiB1bmtub3duKTogYXJnIGlzIEJhc2VEIHtcbiAgcmV0dXJuIChcbiAgICB0eXBlb2YgYXJnID09PSAnb2JqZWN0JyAmJlxuICAgIGFyZyAhPT0gbnVsbCAmJlxuICAgICd0eXBlJyBpbiBhcmcgJiZcbiAgICAnc2lkZXMnIGluIGFyZyAmJlxuICAgICdmYWNlcycgaW4gYXJnICYmXG4gICAgJ2lzQ3VzdG9tJyBpbiBhcmcgJiZcbiAgICAncm9sbCcgaW4gYXJnICYmXG4gICAgJ3JvbGxTcHJlYWQnIGluIGFyZyAmJlxuICAgICdyb2xsTW9kaWZpZWQnIGluIGFyZyAmJlxuICAgICd0b09wdGlvbnMnIGluIGFyZyAmJlxuICAgIChhcmcudHlwZSA9PT0gJ251bWVyaWMnIHx8IGFyZy50eXBlID09PSAnY3VzdG9tJylcbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNOdW1lcmljRGllKGRpZTogQmFzZUQpOiBkaWUgaXMgaW1wb3J0KCcuLi90eXBlcycpLk51bWVyaWNEaWUge1xuICByZXR1cm4gZGllLnR5cGUgPT09ICdudW1lcmljJ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNDdXN0b21EaWUoZGllOiBCYXNlRCk6IGRpZSBpcyBpbXBvcnQoJy4uL3R5cGVzJykuQ3VzdG9tRGllIHtcbiAgcmV0dXJuIGRpZS50eXBlID09PSAnY3VzdG9tJ1xufVxuIiwKICAgICJpbXBvcnQgeyBpc051bWVyaWNSb2xsT3B0aW9ucyB9IGZyb20gJ0ByYW5kc3VtL2NvcmUnXG5pbXBvcnQgdHlwZSB7XG4gIE51bWVyaWNSb2xsT3B0aW9ucyxcbiAgUm9sbFBhcmFtcyxcbiAgU2luZ2xlQ3VzdG9tUm9sbFJlc3VsdCxcbiAgU2luZ2xlTnVtZXJpY1JvbGxSZXN1bHQsXG4gIFNpbmdsZVJvbGxSZXN1bHRcbn0gZnJvbSAnLi4vdHlwZXMnXG5pbXBvcnQge1xuICBDYXBNb2RpZmllcixcbiAgRHJvcE1vZGlmaWVyLFxuICBFeHBsb2RlTW9kaWZpZXIsXG4gIHR5cGUgTW9kaWZpZXJPcHRpb25zLFxuICB0eXBlIE51bWVyaWNSb2xsQm9udXMsXG4gIFJlcGxhY2VNb2RpZmllcixcbiAgUmVyb2xsTW9kaWZpZXIsXG4gIFVuaXF1ZU1vZGlmaWVyXG59IGZyb20gJ0ByYW5kc3VtL2NvcmUnXG5pbXBvcnQgeyBjb3JlU3ByZWFkUm9sbHMgfSBmcm9tICcuL2NvcmVTcHJlYWRSb2xscydcbmltcG9ydCB7IGlzQ3VzdG9tUm9sbFBhcmFtcyB9IGZyb20gJy4uL2d1YXJkcy9pc0N1c3RvbVJvbGxQYXJhbXMnXG5pbXBvcnQgeyBjYWxjdWxhdGVUb3RhbCB9IGZyb20gJy4vY2FsY3VsYXRlVG90YWwnXG5pbXBvcnQgeyBjb3JlUmFuZG9tIH0gZnJvbSAnLi9jb3JlUmFuZG9tJ1xuaW1wb3J0IHsgaXNOdW1lcmljUm9sbFBhcmFtcyB9IGZyb20gJy4uL2d1YXJkcy9pc051bWVyaWNSb2xsUGFyYW1zJ1xuXG5mdW5jdGlvbiBnZW5lcmF0ZVJvbGwocGFyYW1ldGVyczogUm9sbFBhcmFtcyk6IFNpbmdsZVJvbGxSZXN1bHQge1xuICBjb25zdCByYXdSb2xscyA9IGdlbmVyYXRlUmF3Um9sbHMocGFyYW1ldGVycylcbiAgY29uc3QgbW9kaWZpZWRSb2xscyA9IGdlbmVyYXRlTW9kaWZpZWRSb2xscyhwYXJhbWV0ZXJzLCByYXdSb2xscylcbiAgY29uc3QgcmF3UmVzdWx0ID0gY2FsY3VsYXRlVG90YWwocmF3Um9sbHMpXG4gIGlmIChcbiAgICByYXdSb2xscy5ldmVyeSgobikgPT4gdHlwZW9mIG4gPT09ICdudW1iZXInKSAmJlxuICAgIG1vZGlmaWVkUm9sbHMucm9sbHMuZXZlcnkoKG4pID0+IHR5cGVvZiBuID09PSAnbnVtYmVyJykgJiZcbiAgICB0eXBlb2YgcmF3UmVzdWx0ID09PSAnbnVtYmVyJyAmJlxuICAgIGlzTnVtZXJpY1JvbGxQYXJhbXMocGFyYW1ldGVycylcbiAgKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhcmFtZXRlcnMsXG4gICAgICByYXdSZXN1bHQsXG4gICAgICByYXdSb2xscyxcbiAgICAgIG1vZGlmaWVkUm9sbHMsXG4gICAgICB0b3RhbDogbW9kaWZpZWRSb2xscy50b3RhbCxcbiAgICAgIHR5cGU6ICdudW1lcmljJ1xuICAgIH0gYXMgU2luZ2xlTnVtZXJpY1JvbGxSZXN1bHRcbiAgfVxuICBpZiAoXG4gICAgcmF3Um9sbHMuZXZlcnkoKG4pID0+IHR5cGVvZiBuID09PSAnc3RyaW5nJykgJiZcbiAgICBtb2RpZmllZFJvbGxzLnJvbGxzLmV2ZXJ5KChuKSA9PiB0eXBlb2YgbiA9PT0gJ3N0cmluZycpICYmXG4gICAgdHlwZW9mIHJhd1Jlc3VsdCA9PT0gJ3N0cmluZycgJiZcbiAgICBpc0N1c3RvbVJvbGxQYXJhbXMocGFyYW1ldGVycylcbiAgKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhcmFtZXRlcnMsXG4gICAgICByYXdSZXN1bHQsXG4gICAgICByYXdSb2xscyxcbiAgICAgIG1vZGlmaWVkUm9sbHMsXG4gICAgICB0b3RhbDogY2FsY3VsYXRlVG90YWwobW9kaWZpZWRSb2xscy5yb2xscyksXG4gICAgICB0eXBlOiAnY3VzdG9tJ1xuICAgIH0gYXMgU2luZ2xlQ3VzdG9tUm9sbFJlc3VsdFxuICB9XG4gIHRocm93IG5ldyBFcnJvcignTWl4ZWQgcm9sbHMgYXJlIG5vdCBzdXBwb3J0ZWQgeWV0Jylcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVSYXdSb2xscyh7XG4gIG9wdGlvbnNcbn06IFJvbGxQYXJhbXMpOiBTaW5nbGVSb2xsUmVzdWx0WydyYXdSb2xscyddIHtcbiAgY29uc3QgcXVhbnRpdHkgPSBvcHRpb25zLnF1YW50aXR5ID8/IDFcblxuICBpZiAoaXNOdW1lcmljUm9sbE9wdGlvbnMob3B0aW9ucykpIHtcbiAgICByZXR1cm4gY29yZVNwcmVhZFJvbGxzPG51bWJlcj4ocXVhbnRpdHksIG9wdGlvbnMuc2lkZXMpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGNvcmVTcHJlYWRSb2xscyhxdWFudGl0eSwgb3B0aW9ucy5zaWRlcy5sZW5ndGgsIG9wdGlvbnMuc2lkZXMpXG4gIH1cbn1cblxuZXhwb3J0IHsgZ2VuZXJhdGVSb2xsIH1cblxuZnVuY3Rpb24gZ2VuZXJhdGVNb2RpZmllZFJvbGxzKFxuICBwYXJhbWV0ZXJzOiBSb2xsUGFyYW1zLFxuICByb2xsczogU2luZ2xlUm9sbFJlc3VsdFsncmF3Um9sbHMnXVxuKTogU2luZ2xlUm9sbFJlc3VsdFsnbW9kaWZpZWRSb2xscyddIHtcbiAgaWYgKFxuICAgIGlzQ3VzdG9tUm9sbFBhcmFtcyhwYXJhbWV0ZXJzKSAmJlxuICAgIHJvbGxzLmV2ZXJ5KChuKSA9PiB0eXBlb2YgbiA9PT0gJ3N0cmluZycpXG4gICkge1xuICAgIHJldHVybiB7XG4gICAgICB0b3RhbDogY2FsY3VsYXRlVG90YWwocm9sbHMpLFxuICAgICAgcm9sbHNcbiAgICB9IGFzIFNpbmdsZUN1c3RvbVJvbGxSZXN1bHRbJ21vZGlmaWVkUm9sbHMnXVxuICB9XG5cbiAgaWYgKCFyb2xscy5ldmVyeSgobikgPT4gdHlwZW9mIG4gPT09ICdudW1iZXInKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignTWl4ZWQgcm9sbHMgYXJlIG5vdCBzdXBwb3J0ZWQgeWV0JylcbiAgfVxuXG4gIGNvbnN0IHtcbiAgICBzaWRlcyxcbiAgICBxdWFudGl0eSA9IDEsXG4gICAgbW9kaWZpZXJzID0ge31cbiAgfSA9IHBhcmFtZXRlcnMub3B0aW9ucyBhcyBOdW1lcmljUm9sbE9wdGlvbnNcblxuICBpZiAoT2JqZWN0LmtleXMobW9kaWZpZXJzKS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4ge1xuICAgICAgdG90YWw6IGNhbGN1bGF0ZVRvdGFsKHJvbGxzKSxcbiAgICAgIHJvbGxzOiByb2xscy5tYXAoKG4pID0+IE51bWJlcihuKSlcbiAgICB9IGFzIFNpbmdsZU51bWVyaWNSb2xsUmVzdWx0Wydtb2RpZmllZFJvbGxzJ11cbiAgfVxuXG4gIGNvbnN0IHJvbGxPbmUgPSAoKTogbnVtYmVyID0+IGNvcmVSYW5kb20oc2lkZXMpXG5cbiAgY29uc3QgaW5pdGlhbEJvbnVzZXM6IE51bWVyaWNSb2xsQm9udXMgPSB7XG4gICAgc2ltcGxlTWF0aE1vZGlmaWVyOiAwLFxuICAgIHJvbGxzOiByb2xscy5tYXAoKG4pID0+IE51bWJlcihuKSlcbiAgfVxuXG4gIGxldCBib251c2VzID0gaW5pdGlhbEJvbnVzZXNcblxuICBpZiAobW9kaWZpZXJzLnJlcm9sbCkge1xuICAgIGJvbnVzZXMgPSBhcHBseU1vZGlmaWVyKCdyZXJvbGwnLCBtb2RpZmllcnMsIGJvbnVzZXMsIHtcbiAgICAgIHNpZGVzLFxuICAgICAgcXVhbnRpdHksXG4gICAgICByb2xsT25lXG4gICAgfSlcbiAgfVxuXG4gIGlmIChtb2RpZmllcnMucmVwbGFjZSkge1xuICAgIGJvbnVzZXMgPSBhcHBseU1vZGlmaWVyKCdyZXBsYWNlJywgbW9kaWZpZXJzLCBib251c2VzLCB7XG4gICAgICBzaWRlcyxcbiAgICAgIHF1YW50aXR5LFxuICAgICAgcm9sbE9uZVxuICAgIH0pXG4gIH1cblxuICBpZiAobW9kaWZpZXJzLmNhcCkge1xuICAgIGJvbnVzZXMgPSBhcHBseU1vZGlmaWVyKCdjYXAnLCBtb2RpZmllcnMsIGJvbnVzZXMsIHtcbiAgICAgIHNpZGVzLFxuICAgICAgcXVhbnRpdHksXG4gICAgICByb2xsT25lXG4gICAgfSlcbiAgfVxuXG4gIGlmIChtb2RpZmllcnMuZXhwbG9kZSkge1xuICAgIGJvbnVzZXMgPSBhcHBseU1vZGlmaWVyKCdleHBsb2RlJywgbW9kaWZpZXJzLCBib251c2VzLCB7XG4gICAgICBzaWRlcyxcbiAgICAgIHF1YW50aXR5LFxuICAgICAgcm9sbE9uZVxuICAgIH0pXG4gIH1cblxuICBpZiAobW9kaWZpZXJzLnVuaXF1ZSkge1xuICAgIGJvbnVzZXMgPSBhcHBseU1vZGlmaWVyKCd1bmlxdWUnLCBtb2RpZmllcnMsIGJvbnVzZXMsIHtcbiAgICAgIHNpZGVzLFxuICAgICAgcXVhbnRpdHksXG4gICAgICByb2xsT25lXG4gICAgfSlcbiAgfVxuXG4gIGlmIChtb2RpZmllcnMuZHJvcCkge1xuICAgIGJvbnVzZXMgPSBhcHBseU1vZGlmaWVyKCdkcm9wJywgbW9kaWZpZXJzLCBib251c2VzLCB7XG4gICAgICBzaWRlcyxcbiAgICAgIHF1YW50aXR5LFxuICAgICAgcm9sbE9uZVxuICAgIH0pXG4gIH1cblxuICBpZiAobW9kaWZpZXJzLnBsdXMpIHtcbiAgICBib251c2VzID0gYXBwbHlNb2RpZmllcigncGx1cycsIG1vZGlmaWVycywgYm9udXNlcywge1xuICAgICAgc2lkZXMsXG4gICAgICBxdWFudGl0eSxcbiAgICAgIHJvbGxPbmVcbiAgICB9KVxuICB9XG5cbiAgaWYgKG1vZGlmaWVycy5taW51cykge1xuICAgIGJvbnVzZXMgPSBhcHBseU1vZGlmaWVyKCdtaW51cycsIG1vZGlmaWVycywgYm9udXNlcywge1xuICAgICAgc2lkZXMsXG4gICAgICBxdWFudGl0eSxcbiAgICAgIHJvbGxPbmVcbiAgICB9KVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICByb2xsczogYm9udXNlcy5yb2xscyxcbiAgICB0b3RhbDogY2FsY3VsYXRlVG90YWwoYm9udXNlcy5yb2xscywgYm9udXNlcy5zaW1wbGVNYXRoTW9kaWZpZXIpXG4gIH0gYXMgU2luZ2xlTnVtZXJpY1JvbGxSZXN1bHRbJ21vZGlmaWVkUm9sbHMnXVxufVxuXG5mdW5jdGlvbiBhcHBseU1vZGlmaWVyKFxuICBrZXk6IGtleW9mIE1vZGlmaWVyT3B0aW9ucyxcbiAgbW9kaWZpZXJzOiBNb2RpZmllck9wdGlvbnMsXG4gIGN1cnJlbnRCb251c2VzOiBOdW1lcmljUm9sbEJvbnVzLFxuICByb2xsUGFyYW1zOiB7IHNpZGVzOiBudW1iZXI7IHF1YW50aXR5OiBudW1iZXI7IHJvbGxPbmU6ICgpID0+IG51bWJlciB9XG4pOiBOdW1lcmljUm9sbEJvbnVzIHtcbiAgY29uc3QgbW9kaWZpZXJWYWx1ZSA9IG1vZGlmaWVyc1trZXldXG4gIGlmIChtb2RpZmllclZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gY3VycmVudEJvbnVzZXNcbiAgfVxuXG4gIHN3aXRjaCAoa2V5KSB7XG4gICAgY2FzZSAncGx1cyc6XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5jdXJyZW50Qm9udXNlcyxcbiAgICAgICAgc2ltcGxlTWF0aE1vZGlmaWVyOiBOdW1iZXIobW9kaWZpZXJWYWx1ZSlcbiAgICAgIH1cblxuICAgIGNhc2UgJ21pbnVzJzpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmN1cnJlbnRCb251c2VzLFxuICAgICAgICBzaW1wbGVNYXRoTW9kaWZpZXI6IC1OdW1iZXIobW9kaWZpZXJWYWx1ZSlcbiAgICAgIH1cblxuICAgIGNhc2UgJ3Jlcm9sbCc6XG4gICAgICByZXR1cm4gbmV3IFJlcm9sbE1vZGlmaWVyKG1vZGlmaWVycy5yZXJvbGwpLmFwcGx5KFxuICAgICAgICBjdXJyZW50Qm9udXNlcyxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICByb2xsUGFyYW1zLnJvbGxPbmVcbiAgICAgIClcblxuICAgIGNhc2UgJ3VuaXF1ZSc6XG4gICAgICByZXR1cm4gbmV3IFVuaXF1ZU1vZGlmaWVyKG1vZGlmaWVycy51bmlxdWUpLmFwcGx5KFxuICAgICAgICBjdXJyZW50Qm9udXNlcyxcbiAgICAgICAgeyBzaWRlczogcm9sbFBhcmFtcy5zaWRlcywgcXVhbnRpdHk6IHJvbGxQYXJhbXMucXVhbnRpdHkgfSxcbiAgICAgICAgcm9sbFBhcmFtcy5yb2xsT25lXG4gICAgICApXG5cbiAgICBjYXNlICdyZXBsYWNlJzpcbiAgICAgIHJldHVybiBuZXcgUmVwbGFjZU1vZGlmaWVyKG1vZGlmaWVycy5yZXBsYWNlKS5hcHBseShjdXJyZW50Qm9udXNlcylcblxuICAgIGNhc2UgJ2NhcCc6XG4gICAgICByZXR1cm4gbmV3IENhcE1vZGlmaWVyKG1vZGlmaWVycy5jYXApLmFwcGx5KGN1cnJlbnRCb251c2VzKVxuXG4gICAgY2FzZSAnZHJvcCc6XG4gICAgICByZXR1cm4gbmV3IERyb3BNb2RpZmllcihtb2RpZmllcnMuZHJvcCkuYXBwbHkoY3VycmVudEJvbnVzZXMpXG5cbiAgICBjYXNlICdleHBsb2RlJzpcbiAgICAgIHJldHVybiBuZXcgRXhwbG9kZU1vZGlmaWVyKG1vZGlmaWVycy5leHBsb2RlKS5hcHBseShcbiAgICAgICAgY3VycmVudEJvbnVzZXMsXG4gICAgICAgIHsgc2lkZXM6IHJvbGxQYXJhbXMuc2lkZXMsIHF1YW50aXR5OiByb2xsUGFyYW1zLnF1YW50aXR5IH0sXG4gICAgICAgIHJvbGxQYXJhbXMucm9sbE9uZVxuICAgICAgKVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBtb2RpZmllcjogJHtTdHJpbmcoa2V5KX1gKVxuICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgQ3VzdG9tUm9sbFBhcmFtcywgUm9sbFBhcmFtcyB9IGZyb20gJy4uL3R5cGVzJ1xuXG5leHBvcnQgZnVuY3Rpb24gaXNDdXN0b21Sb2xsUGFyYW1zKFxuICBwb29sUGFyYW1ldGVyczogUm9sbFBhcmFtc1xuKTogcG9vbFBhcmFtZXRlcnMgaXMgQ3VzdG9tUm9sbFBhcmFtcyB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHBvb2xQYXJhbWV0ZXJzLm9wdGlvbnMuc2lkZXMpXG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgTnVtZXJpY1JvbGxQYXJhbXMsIFJvbGxQYXJhbXMgfSBmcm9tICcuLi90eXBlcydcblxuZXhwb3J0IGZ1bmN0aW9uIGlzTnVtZXJpY1JvbGxQYXJhbXMoXG4gIHBvb2xQYXJhbWV0ZXJzOiBSb2xsUGFyYW1zXG4pOiBwb29sUGFyYW1ldGVycyBpcyBOdW1lcmljUm9sbFBhcmFtcyB7XG4gIHJldHVybiAhQXJyYXkuaXNBcnJheShwb29sUGFyYW1ldGVycy5vcHRpb25zLnNpZGVzKVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IFJvbGxSZXN1bHQsIFNpbmdsZVJvbGxSZXN1bHQgfSBmcm9tICcuLi90eXBlcydcblxuZXhwb3J0IGZ1bmN0aW9uIHJvbGxUeXBlKHJvbGxzOiBTaW5nbGVSb2xsUmVzdWx0W10pOiBSb2xsUmVzdWx0Wyd0eXBlJ10ge1xuICBpZiAocm9sbHMuZXZlcnkoKHJvbGwpID0+IHJvbGwudHlwZSA9PT0gJ251bWVyaWMnKSkge1xuICAgIHJldHVybiAnbnVtZXJpYydcbiAgfVxuXG4gIGlmIChyb2xscy5ldmVyeSgocm9sbCkgPT4gcm9sbC50eXBlID09PSAnY3VzdG9tJykpIHtcbiAgICByZXR1cm4gJ2N1c3RvbSdcbiAgfVxuXG4gIHJldHVybiAnbWl4ZWQnXG59XG4iLAogICAgImltcG9ydCB0eXBlIHtcbiAgQ3VzdG9tUm9sbEFyZ3VtZW50LFxuICBDdXN0b21Sb2xsUmVzdWx0LFxuICBOdW1lcmljUm9sbEFyZ3VtZW50LFxuICBOdW1lcmljUm9sbFJlc3VsdCxcbiAgUm9sbEFyZ3VtZW50LFxuICBSb2xsUmVzdWx0XG59IGZyb20gJy4vdHlwZXMnXG5pbXBvcnQgeyBjYWxjdWxhdGVUb3RhbCwgbm9ybWFsaXplQXJndW1lbnQgfSBmcm9tICcuL3V0aWxzJ1xuaW1wb3J0IHsgZ2VuZXJhdGVSb2xsIH0gZnJvbSAnLi91dGlscy9nZW5lcmF0ZVJvbGwnXG5pbXBvcnQgeyByb2xsVHlwZSB9IGZyb20gJy4vdXRpbHMvcm9sbFR5cGUnXG5cbmZ1bmN0aW9uIHJvbGwoLi4uYXJnczogTnVtZXJpY1JvbGxBcmd1bWVudFtdKTogTnVtZXJpY1JvbGxSZXN1bHRcbmZ1bmN0aW9uIHJvbGwoLi4uYXJnczogQ3VzdG9tUm9sbEFyZ3VtZW50W10pOiBDdXN0b21Sb2xsUmVzdWx0XG5mdW5jdGlvbiByb2xsKC4uLmFyZ3M6IChOdW1lcmljUm9sbEFyZ3VtZW50IHwgQ3VzdG9tUm9sbEFyZ3VtZW50KVtdKTogUm9sbFJlc3VsdFxuZnVuY3Rpb24gcm9sbCguLi5hcmdzOiBSb2xsQXJndW1lbnRbXSk6IFJvbGxSZXN1bHQge1xuICBjb25zdCBwYXJhbWV0ZXJzID0gYXJncy5tYXAoKGFyZykgPT4gbm9ybWFsaXplQXJndW1lbnQoYXJnKSlcbiAgY29uc3Qgcm9sbHMgPSBwYXJhbWV0ZXJzLm1hcCgocGFyYW0pID0+IGdlbmVyYXRlUm9sbChwYXJhbSkpXG5cbiAgcmV0dXJuIHtcbiAgICByb2xscyxcbiAgICByYXdSZXN1bHRzOiByb2xscy5tYXAoKHJvbGwpID0+IHJvbGwucmF3Um9sbHMpLmZsYXQoKSxcbiAgICB0b3RhbDogY2FsY3VsYXRlVG90YWwocm9sbHMubWFwKChyb2xsKSA9PiByb2xsLnRvdGFsKSksXG4gICAgdHlwZTogcm9sbFR5cGUocm9sbHMpXG4gIH0gYXMgUm9sbFJlc3VsdFxufVxuXG5leHBvcnQgeyByb2xsIH1cbiIsCiAgICAiaW1wb3J0IHR5cGUge1xuICBDdXN0b21Sb2xsUmVzdWx0LFxuICBNaXhlZFJvbGxSZXN1bHQsXG4gIE51bWVyaWNSb2xsUmVzdWx0LFxuICBSb2xsUmVzdWx0XG59IGZyb20gJy4uL3R5cGVzJ1xuXG5leHBvcnQgZnVuY3Rpb24gaXNOdW1lcmljUmVzdWx0KFxuICByZXN1bHQ6IFJvbGxSZXN1bHRcbik6IHJlc3VsdCBpcyBOdW1lcmljUm9sbFJlc3VsdCB7XG4gIHJldHVybiByZXN1bHQudHlwZSA9PT0gJ251bWVyaWMnXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0N1c3RvbVJlc3VsdChyZXN1bHQ6IFJvbGxSZXN1bHQpOiByZXN1bHQgaXMgQ3VzdG9tUm9sbFJlc3VsdCB7XG4gIHJldHVybiByZXN1bHQudHlwZSA9PT0gJ2N1c3RvbSdcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTWl4ZWRSZXN1bHQocmVzdWx0OiBSb2xsUmVzdWx0KTogcmVzdWx0IGlzIE1peGVkUm9sbFJlc3VsdCB7XG4gIHJldHVybiByZXN1bHQudHlwZSA9PT0gJ21peGVkJ1xufVxuIiwKICAgICJleHBvcnQgKiBmcm9tICcuL0QnXG5cbmV4cG9ydCB7IHJvbGwgfSBmcm9tICcuL3JvbGwnXG5cbmV4cG9ydCAqIGZyb20gJy4vZ3VhcmRzJ1xuXG5leHBvcnQgdHlwZSAqIGZyb20gJy4vdHlwZXMnXG5cbmV4cG9ydCAqIGZyb20gJ0ByYW5kc3VtL2NvcmUnXG5cbmV4cG9ydCAqIGZyb20gJ0ByYW5kc3VtL25vdGF0aW9uJ1xuXG5leHBvcnQgdHlwZSAqIGZyb20gJ0ByYW5kc3VtL2NvcmUnXG5cbmV4cG9ydCB0eXBlICogZnJvbSAnQHJhbmRzdW0vbm90YXRpb24nXG4iCiAgXSwKICAibWFwcGluZ3MiOiAiMGlDQUs2QixJQUE3QixzRENMQSxTQUFTLENBQWMsQ0FDckIsRUFDQSxFQUF5QixFQUNSLENBQ2pCLEdBQUksRUFBTSxNQUFNLENBQUMsSUFBUyxPQUFPLElBQVMsUUFBUSxFQUNoRCxPQUFPLEVBQU0sT0FBTyxDQUFDLEVBQUssSUFBUSxPQUFPLENBQUcsRUFBSSxFQUFLLENBQUssRUFHNUQsT0FBTyxFQUFNLEtBQUssRUFBRSxLQUFLLElBQUksRUNSeEIsU0FBUyxDQUFVLENBQUMsRUFBcUIsQ0FDOUMsT0FBUSxLQUFLLE9BQU8sRUFBSSxFQUFPLEVDRDFCLFNBQVMsQ0FBb0IsQ0FBQyxFQUF5QixDQUM1RCxPQUFPLE1BQU0sS0FBSyxDQUFFLE9BQVEsT0FBTyxDQUFLLENBQUUsRUFBRyxDQUFDLEVBQUcsSUFBVSxFQUFRLENBQUMsRUNFL0QsU0FBUyxDQUEwQyxDQUN4RCxFQUNBLEVBQ0EsRUFDSyxDQUNMLElBQU0sRUFBWSxHQUFTLEVBQXFCLENBQUcsRUFFN0MsRUFBUyxJQUFJLE1BQVMsQ0FBUSxFQUVwQyxRQUFTLEVBQUksRUFBRyxFQUFJLEVBQVUsSUFBSyxDQUNqQyxJQUFNLEVBQWMsRUFBVyxDQUFHLEVBQzVCLEVBQU8sRUFBUyxHQUN0QixHQUFJLEVBQ0YsRUFBTyxHQUFLLEVBSWhCLE9BQU8sRUNSRixJQVpQLDJCQ0VPLFNBQVMsQ0FBRyxDQUFDLEVBQTRCLENBQzlDLE9BQ0UsT0FBTyxJQUFRLFVBQ2YsSUFBUSxNQUNSLFNBQVUsR0FDVixVQUFXLEdBQ1gsVUFBVyxHQUNYLGFBQWMsR0FDZCxTQUFVLEdBQ1YsZUFBZ0IsR0FDaEIsaUJBQWtCLEdBQ2xCLGNBQWUsSUFDZCxFQUFJLE9BQVMsV0FBYSxFQUFJLE9BQVMsVURHckMsU0FBUyxDQUFpQixDQUFDLEVBQW9DLENBQ3BFLElBQU0s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SyxJQUFLLElBQUssSUFBSyxHQUFHLENBQUMsRUFFOUQsR0FBZ0IsQ0FDcEIsSUFDQSxJQUNBLElBQ0EsSUFDQSxJQUNBLElBQ0EsSUFDQSxJQUNBLElBQ0EsSUFDQSxJQUNBLElBQ0EsSUFDQSxJQUNBLElBQ0EsSUFDQSxJQUNBLElBQ0EsSUFDQSxJQUNBLElBQ0EsSUFDQSxJQUNBLElBQ0EsSUFDQSxJQUNBLElBQ0EsSUFDQSxJQUNBLElBQ0EsSUFDQSxJQUNBLElBQ0EsSUFDQSxJQUNBLElBQ0EsSUFDQSxJQUNBLElBQ0EsSUFDQSxJQUNBLElBQ0EsSUFDQSxJQUNBLElBQ0EsSUFDQSxJQUNBLElBQ0EsSUFDQSxJQUNBLElBQ0EsSUFDQSxJQUNBLElBQ0EsSUFDQSxJQUNBLElBQ0EsSUFDQSxJQUNBLElBQ0EsSUFDQSxHQUNGLEVBRWEsRUFBeUIsRUFBRSxFQUFhLDJGWXBOOUMsU0FBUyxDQUFlLENBQzdCLEVBQzZCLENBQzdCLE9BQU8sRUFBTyxPQUFTLFVBR2xCLFNBQVMsQ0FBYyxDQUFDLEVBQWdELENBQzdFLE9BQU8sRUFBTyxPQUFTLFNBR2xCLFNBQVMsQ0FBYSxDQUFDLEVBQStDLENBQzNFLE9BQU8sRUFBTyxPQUFTLFFDVnpCLDZDQUVBIiwKICAiZGVidWdJZCI6ICI0OUM4NEZBOTE2NTkxMkVFNjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==