@yipe/dice 0.10.0 → 0.12.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.
Files changed (67) hide show
  1. package/README.md +278 -8
  2. package/dist/builder/ac.d.ts +44 -1
  3. package/dist/builder/ac.d.ts.map +1 -1
  4. package/dist/builder/arguments.d.ts +6 -0
  5. package/dist/builder/arguments.d.ts.map +1 -0
  6. package/dist/builder/ast.d.ts +36 -7
  7. package/dist/builder/ast.d.ts.map +1 -1
  8. package/dist/builder/attack.d.ts +104 -2
  9. package/dist/builder/attack.d.ts.map +1 -1
  10. package/dist/builder/dc.d.ts +13 -0
  11. package/dist/builder/dc.d.ts.map +1 -1
  12. package/dist/builder/example.d.ts +11 -15
  13. package/dist/builder/example.d.ts.map +1 -1
  14. package/dist/builder/expression.d.ts +72 -0
  15. package/dist/builder/expression.d.ts.map +1 -0
  16. package/dist/builder/factory.d.ts +2 -3
  17. package/dist/builder/factory.d.ts.map +1 -1
  18. package/dist/builder/index.cjs +3844 -1273
  19. package/dist/builder/index.cjs.map +1 -1
  20. package/dist/builder/index.js +3836 -1274
  21. package/dist/builder/index.js.map +1 -1
  22. package/dist/builder/nodes.d.ts +8 -1
  23. package/dist/builder/nodes.d.ts.map +1 -1
  24. package/dist/builder/prob.d.ts +9 -0
  25. package/dist/builder/prob.d.ts.map +1 -1
  26. package/dist/builder/roll.d.ts +157 -19
  27. package/dist/builder/roll.d.ts.map +1 -1
  28. package/dist/builder/save.d.ts +6 -1
  29. package/dist/builder/save.d.ts.map +1 -1
  30. package/dist/builder/types.d.ts +19 -0
  31. package/dist/builder/types.d.ts.map +1 -1
  32. package/dist/common/bounce.d.ts +63 -5
  33. package/dist/common/bounce.d.ts.map +1 -1
  34. package/dist/common/lru-cache.d.ts +29 -1
  35. package/dist/common/lru-cache.d.ts.map +1 -1
  36. package/dist/common/types.d.ts +33 -0
  37. package/dist/common/types.d.ts.map +1 -1
  38. package/dist/index.cjs +1288 -388
  39. package/dist/index.cjs.map +1 -1
  40. package/dist/index.js +1285 -389
  41. package/dist/index.js.map +1 -1
  42. package/dist/parser/dice.d.ts +52 -16
  43. package/dist/parser/dice.d.ts.map +1 -1
  44. package/dist/parser/parser.d.ts +1 -5
  45. package/dist/parser/parser.d.ts.map +1 -1
  46. package/dist/parser/rollType.d.ts +4 -4
  47. package/dist/parser/scaleDice.d.ts +14 -0
  48. package/dist/parser/scaleDice.d.ts.map +1 -0
  49. package/dist/pmf/mixture.d.ts +17 -3
  50. package/dist/pmf/mixture.d.ts.map +1 -1
  51. package/dist/pmf/pmf.d.ts +130 -33
  52. package/dist/pmf/pmf.d.ts.map +1 -1
  53. package/dist/pmf/query.d.ts +25 -12
  54. package/dist/pmf/query.d.ts.map +1 -1
  55. package/dist/turn/effects.d.ts +114 -0
  56. package/dist/turn/effects.d.ts.map +1 -0
  57. package/dist/turn/index.d.ts +3 -1
  58. package/dist/turn/index.d.ts.map +1 -1
  59. package/dist/turn/plan.d.ts +115 -12
  60. package/dist/turn/plan.d.ts.map +1 -1
  61. package/dist/turn/state.d.ts +22 -8
  62. package/dist/turn/state.d.ts.map +1 -1
  63. package/dist/turn/turn.d.ts +162 -26
  64. package/dist/turn/turn.d.ts.map +1 -1
  65. package/dist/turn/types.d.ts +180 -21
  66. package/dist/turn/types.d.ts.map +1 -1
  67. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/common/lru-cache.ts","../../src/common/types.ts","../../src/pmf/query.ts","../../src/pmf/pmf.ts","../../src/pmf/mixture.ts","../../src/common/errors.ts","../../src/parser/dice.ts","../../src/parser/parser.ts","../../src/builder/prob.ts","../../src/builder/d20.ts","../../src/builder/roll.ts","../../src/builder/factory.ts","../../src/builder/ast.ts","../../src/builder/attack.ts","../../src/builder/ac.ts","../../src/builder/save.ts","../../src/builder/dc.ts","../../src/turn/types.ts","../../src/turn/plan.ts","../../src/turn/state.ts","../../src/turn/turn.ts"],"names":["d","cumulativeSum","result","dfs","arr","d20","ac","staticMod","bonusDicePMFs","bonusPMF","pcrit","pmiss","critPMF"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Simple LRU cache implementation\n */\n\nexport class LRUCache<K, V> {\n private cache = new Map<K, V>();\n\n constructor(private readonly maxSize = 1000) {}\n\n get(key: K): V | undefined {\n const value = this.cache.get(key);\n if (value === undefined) return undefined;\n\n this.cache.delete(key);\n this.cache.set(key, value);\n return value;\n }\n\n delete(key: K): void {\n this.cache.delete(key);\n }\n\n set(key: K, value: V): this {\n if (this.cache.size >= this.maxSize && !this.cache.has(key)) {\n const oldestKey = this.cache.keys().next().value;\n this.cache.delete(oldestKey as K);\n }\n this.cache.delete(key);\n this.cache.set(key, value);\n return this;\n }\n\n clear(): void {\n this.cache.clear();\n }\n\n get size(): number {\n return this.cache.size;\n }\n\n has(key: K): boolean {\n return this.cache.has(key);\n }\n\n keys(): IterableIterator<K> {\n return this.cache.keys();\n }\n\n values(): IterableIterator<V> {\n return this.cache.values();\n }\n}\n","/** Mapping from outcome label to probability mass or damage attribution. */\nexport type OutcomeLabelMap = Partial<Record<string, number>>;\n\n/** Computational epsilon for pruning negligible probabilities. */\nexport const EPS = 1e-12;\n\n/** A probability bin for a specific damage value. */\nexport interface Bin {\n /** Total probability mass at this damage value. */\n p: number;\n /** Per-outcome probability mass contributions at this damage. */\n count: OutcomeLabelMap;\n /** Optional per-outcome damage attribution at this damage. */\n attr?: OutcomeLabelMap;\n}\n\nexport interface CritConfig {\n critThreshold: number;\n}\n\n/** Simple mapping from damage value to probability. */\nexport type DamageDistribution = Record<number, number>;\n/** Canonical outcome labels supported by the query helpers. */\nexport type OutcomeType =\n | \"crit\"\n | \"hit\"\n | \"missNone\"\n | \"missDamage\"\n | \"saveHalf\"\n | \"saveFail\"\n | \"pc\";\n\nexport type Rounding = \"none\" | \"floor\" | \"round\" | \"ceil\";\n\n/** How a d20 attack roll resolves: single die, keep-highest of 2/3, or keep-lowest of 2. */\nexport type RollType = \"flat\" | \"advantage\" | \"disadvantage\" | \"elven accuracy\";\n\n/**\n * P(critical hit) for the given crit window and d20 {@link RollType}.\n *\n * `critRange` is the number of top faces that crit (1 for a natural 20, 2 for\n * 19–20, …), so a single die crits with probability `critRange / 20`. Advantage\n * rolls two d20s / elven accuracy three, keeping the best; disadvantage keeps\n * the worst of two.\n */\nexport function critProbability(critRange: number, rollType: RollType = \"flat\"): number {\n const base = critRange / 20;\n switch (rollType) {\n case \"advantage\":\n return 1 - (1 - base) ** 2;\n case \"elven accuracy\":\n return 1 - (1 - base) ** 3;\n case \"disadvantage\":\n return base ** 2;\n case \"flat\":\n default:\n return base;\n }\n}\n\n/**\n * The canonical \"clean miss\" outcome — a point of zero damage with no rider.\n * This is the {@link OutcomeType} that attribution charts and outcome stats key\n * on, and is distinct from the builder's attack-resolution `miss` weight label.\n */\nexport const MISS_NONE_OUTCOME: OutcomeType = \"missNone\";\n\n/**\n * All outcome types in canonical severity order — clean miss → crit. This is\n * also the natural stacking order for attribution charts (least- to\n * most-impactful, bottom → top). Enumerates every {@link OutcomeType} exactly\n * once; use it instead of hand-maintained per-consumer outcome tables.\n */\nexport const ALL_OUTCOME_TYPES: OutcomeType[] = [\n \"missNone\",\n \"missDamage\",\n \"saveFail\",\n \"saveHalf\",\n \"pc\",\n \"hit\",\n \"crit\",\n];\n\n/**\n * Outcome types in display order for stats / breakdown rows — most prominent\n * first (crit, hit, …) down to the clean miss.\n */\nexport const OUTCOME_DISPLAY_ORDER: OutcomeType[] = [\n \"crit\",\n \"hit\",\n \"missDamage\",\n \"saveHalf\",\n \"saveFail\",\n \"pc\",\n \"missNone\",\n];\n\n/**\n * Sort outcome labels by a canonical order (defaults to {@link ALL_OUTCOME_TYPES}).\n * Labels not present in `order` sort after known ones, alphabetically — so\n * ad-hoc/test labels outside the {@link OutcomeType} union stay stable.\n */\nexport function sortOutcomes<T extends string>(\n outcomes: Iterable<T>,\n order: readonly string[] = ALL_OUTCOME_TYPES\n): T[] {\n const rank = new Map(order.map((o, i) => [o, i]));\n return [...outcomes].sort((a, b) => {\n const ra = rank.get(a);\n const rb = rank.get(b);\n if (ra !== undefined && rb !== undefined) return ra - rb;\n if (ra !== undefined) return -1;\n if (rb !== undefined) return 1;\n return a.localeCompare(b);\n });\n}\n\nexport const onAnyHit: OutcomeType[] = [\"hit\", \"crit\"];\nexport const onCritOnly: OutcomeType[] = [\"crit\"];\nexport const onHitOnly: OutcomeType[] = [\"hit\"];\nexport const onMissOnly: OutcomeType[] = [\"missNone\", \"missDamage\"];\nexport const onMissDamageOnly: OutcomeType[] = [\"missDamage\"];\nexport const onSaveHalfOnly: OutcomeType[] = [\"saveHalf\"];\nexport const onSaveFailOnly: OutcomeType[] = [\"saveFail\"];\nexport const onPotentCantripOnly: OutcomeType[] = [\"pc\"];\n","import type { OutcomeType } from \"../common/types\";\nimport { ALL_OUTCOME_TYPES, EPS } from \"../common/types\";\nimport { PMF } from \"./pmf\";\nimport type { DamageAttributionChartModel } from \"./pmf\";\n\n/**\n * Query interface for analyzing dice roll probability distributions.\n *\n * Combines multiple attack PMFs and provides statistical analysis methods for:\n * - Basic statistics (mean, variance, min/max, percentiles)\n * - Probability queries (hit chances, success rates, exact counts)\n * - Damage analysis (ranges by outcome type, expected values)\n * - Data export (charts, tables, visualizations)\n *\n */\n\nexport class DiceQuery {\n public readonly singles: PMF[];\n private readonly _eps: number;\n private readonly _combinedProvided: boolean;\n private _combined?: PMF;\n private _combinedWithAttr?: PMF;\n\n constructor(singles: PMF | PMF[], combined?: PMF, eps = EPS) {\n this.singles = Array.isArray(singles) ? singles : [singles];\n if (this.singles.some((s) => s === undefined)) {\n throw new Error(\"DiceQuery contains undefined singles\");\n }\n this._eps = eps;\n // When the caller supplies an explicit combined distribution that may not\n // equal convolve(singles), the additive closed-form moments would describe\n // a different distribution than cdf/percentiles. Track this so mean()/\n // variance() can fall back to the provided combined and stay consistent.\n this._combinedProvided = combined !== undefined;\n if (combined !== undefined) {\n this._combined =\n Math.abs(combined.mass() - 1) <= eps ? combined : combined.normalize();\n }\n }\n\n /**\n * The combined damage distribution of all single PMFs (their convolution),\n * normalized to total probability 1.\n *\n * Computed lazily on first access and cached. Queries that only need\n * additive statistics — {@link DiceQuery.mean}, {@link DiceQuery.variance},\n * {@link DiceQuery.stddev} — never trigger this convolution.\n */\n get combined(): PMF {\n if (this._combined === undefined) {\n const c = PMF.convolveMany(this.singles);\n this._combined =\n Math.abs(c.mass() - 1) <= this._eps ? c : c.normalize();\n }\n return this._combined;\n }\n\n private static readonly DEFAULT_OUTCOMES: readonly OutcomeType[] = [\n \"hit\",\n \"crit\",\n \"missNone\",\n ] as const;\n\n /**\n * Returns a new PMF with damage attribution metadata populated.\n *\n * This method computes attribution on-demand for builder-generated PMFs,\n * enabling them to work with damage attribution charts. The `attr` field\n * tracks how much damage each outcome type contributes at each damage value.\n *\n * For each bin at damage D: sum(attr.values()) ≈ D × P(damage = D)\n *\n * Performance: Cached after first call. Adds minimal overhead vs `combined`.\n *\n * @returns PMF with attr field populated for damage attribution charts\n *\n * @example\n * const attack = d20.plus(5).ac(15).onHit(d(2,6).plus(3)).onCrit(d(2,6))\n * const query = attack.toQuery()\n * const pmf = query.combinedWithAttribution()\n * // Now pmf can be used with attributionByValue() / damageAttributionChartModel()\n */\n combinedWithAttribution(): PMF {\n if (this._combinedWithAttr) {\n return this._combinedWithAttr;\n }\n\n // An explicitly provided `combined` is NOT the convolution of `singles` —\n // a Turn's exact joint distribution, for instance, is narrower than the\n // independent product because riders correlate with their sources.\n // Re-convolving would silently discard it (and drop the riders' damage\n // entirely), so attribute the provided distribution itself.\n if (this._combinedProvided) {\n this._combinedWithAttr = this.combined.withAttribution();\n return this._combinedWithAttr;\n }\n\n // Fast path: if every single already carries attribution (as parser-\n // generated PMFs do), the attributed convolution is bit-for-bit identical\n // to `combined` — reuse it instead of convolving a second time.\n if (this.singles.every((pmf) => pmf.hasAttribution())) {\n this._combinedWithAttr = this.combined;\n return this._combinedWithAttr;\n }\n\n // Otherwise (e.g. builder-generated PMFs that only carry `count`), add\n // attribution to each single PMF, then convolve.\n const singlesWithAttr = this.singles.map((pmf) => pmf.withAttribution());\n const combined = PMF.convolveMany(singlesWithAttr, this.combined.epsilon);\n\n // Normalize if needed\n const normalized =\n Math.abs(combined.mass() - 1) <= this.combined.epsilon\n ? combined\n : combined.normalize();\n\n this._combinedWithAttr = normalized;\n return normalized;\n }\n\n /**\n * Per-label `damage value → probability mass` series for the combined,\n * attribution-carrying distribution — the provenance core of the stacked\n * damage-attribution chart. Convenience for\n * `combinedWithAttribution().attributionByValue()`; see\n * {@link PMF.attributionByValue}.\n */\n attributionByValue(): Map<string, Map<number, number>> {\n return this.combinedWithAttribution().attributionByValue();\n }\n\n /**\n * Full numeric model for the stacked damage-attribution chart. Convenience for\n * `combinedWithAttribution().damageAttributionChartModel(options)`; see\n * {@link PMF.damageAttributionChartModel}.\n */\n damageAttributionChartModel(options?: {\n maxBuckets?: number;\n stackOrder?: readonly string[];\n epsilon?: number;\n }): DamageAttributionChartModel {\n return this.combinedWithAttribution().damageAttributionChartModel(options);\n }\n\n /**\n * How many of the independent single PMFs can produce the given outcome\n * label. Useful for \"all of them succeeded\" style probabilities where the\n * exponent is the number of contributing attacks (see\n * {@link DiceQuery.probExactlyK}).\n */\n countSinglesWith(label: string): number {\n let count = 0;\n for (const single of this.singles) {\n if (single.hasOutcome(label)) count++;\n }\n return count;\n }\n\n /**\n * Returns the expected damage across all possible outcomes.\n *\n * Example: `query.mean()` → 12.5\n * Use case: \"What's my average damage per round?\"\n */\n mean(): number {\n // If the caller supplied a combined distribution that may diverge from\n // convolve(singles), report its mean so mean() stays consistent with\n // cdf/percentiles/min/max (which all read `combined`).\n if (this._combinedProvided) {\n let m = 0;\n for (const [damageValue, bin] of this.combined) m += damageValue * bin.p;\n return m;\n }\n // Expectation is additive over independent attacks: E[Σ Xᵢ] = Σ E[Xᵢ].\n // Computing it directly from the singles avoids building `combined`.\n let totalMean = 0;\n for (const single of this.singles) {\n const mass = single.mass();\n if (mass <= 0) continue;\n // Match `combined`'s semantics: only divide by mass when it is not\n // already 1 (within eps), so an already-normalized single is bit-exact.\n totalMean +=\n Math.abs(mass - 1) <= this._eps ? single.mean() : single.mean() / mass;\n }\n return totalMean;\n }\n\n /**\n * Returns the variance of the damage distribution.\n *\n * Example: `query.variance()` → 45.2\n * Use case: \"How much does my damage vary from the average?\"\n * High variance means higher risk/reward. Lower variance means more consistent damage.\n */\n variance(): number {\n // Consistent with mean(): if a (possibly divergent) combined was provided,\n // compute the variance of that distribution directly.\n if (this._combinedProvided) {\n const mu = this.mean();\n let v = 0;\n for (const [damageValue, bin] of this.combined) {\n const dev = damageValue - mu;\n v += dev * dev * bin.p;\n }\n return v;\n }\n // Variance is additive over independent attacks: Var[Σ Xᵢ] = Σ Var[Xᵢ].\n // Use the centered form per single (E[(X−μ)²]) rather than E[X²]−μ², which\n // suffers catastrophic cancellation when damage has a large constant offset.\n let totalVariance = 0;\n for (const single of this.singles) {\n const mass = single.mass();\n if (mass <= 0) continue;\n if (Math.abs(mass - 1) <= this._eps) {\n // PMF.variance() is the centered, cached, mass-1 variance.\n totalVariance += single.variance();\n } else {\n // Normalized centered variance of a non-unit-mass single.\n let mu = 0;\n for (const [d, b] of single) mu += d * (b.p / mass);\n let v = 0;\n for (const [d, b] of single) {\n const dev = d - mu;\n v += dev * dev * (b.p / mass);\n }\n totalVariance += v;\n }\n }\n return totalVariance;\n }\n\n /**\n * Returns the standard deviation of the damage distribution.\n *\n * Example: `query.stdev()` → 6.7\n * Use case: \"What's the typical spread around my average damage?\"\n * Used to determine how consistent the damage is.\n */\n stddev(): number {\n return Math.sqrt(this.variance());\n }\n\n /** Alias of {@link DiceQuery.stddev}, matching {@link PMF.stdev}. */\n stdev(): number {\n return this.stddev();\n }\n\n /**\n * Returns the Cumulative Distribution Function.\n */\n cdf(x: number): number {\n return this.probTotalAtMost(x);\n }\n\n /**\n * Returns the probability of dealing X damage or less.\n * In statistics, this is called the cumulative distribution function (CDF).\n * Example: `query.cdf(20)` → 0.75\n * Use case: \"What's the chance I deal 20 damage or less?\"\n */\n probTotalAtMost(x: number): number {\n let cumulativeProbability = 0;\n for (const [damageValue, probabilityBin] of this.combined) {\n if (damageValue <= x) {\n cumulativeProbability += probabilityBin.p;\n }\n }\n return cumulativeProbability;\n }\n\n /**\n * Returns the Complementary Cumulative Distribution Function.\n */\n ccdf(x: number): number {\n return this.probTotalAtLeast(x);\n }\n\n /**\n * Returns the probability of dealing at least X damage.\n *\n * Example: `query.probTotalAtLeast(25)` → 0.35\n * Use case: \"What's the chance I deal at least 25 damage to finish the enemy?\"\n */\n probTotalAtLeast(threshold: number): number {\n let probabilitySum = 0;\n for (const [damageValue, probabilityBin] of this.combined) {\n if (damageValue >= threshold) {\n probabilitySum += probabilityBin.p;\n }\n }\n return probabilitySum;\n }\n\n /**\n * Returns damage values at specific percentiles.\n *\n * Example: `query.percentiles([0.25, 0.5, 0.75])` → [8, 12, 18]\n * Use case: \"What are my 25th, 50th, and 75th percentile damage values?\"\n */\n percentiles(percentileValues: number[]): number[] {\n const sortedDamageValues = this.combined.support();\n if (sortedDamageValues.length === 0) return percentileValues.map(() => 0);\n\n const cumulativeProbabilities: number[] = [];\n let runningProbabilitySum = 0;\n for (const damageValue of sortedDamageValues) {\n runningProbabilitySum += this.combined.map.get(damageValue)!.p;\n cumulativeProbabilities.push(runningProbabilitySum);\n }\n\n return percentileValues.map((targetPercentile) => {\n // Binary search for efficiency\n let leftBound = 0;\n let rightBound = cumulativeProbabilities.length - 1;\n\n while (leftBound <= rightBound) {\n const middleIndex = Math.floor((leftBound + rightBound) / 2);\n if (cumulativeProbabilities[middleIndex] >= targetPercentile) {\n rightBound = middleIndex - 1;\n } else {\n leftBound = middleIndex + 1;\n }\n }\n\n return leftBound < sortedDamageValues.length\n ? sortedDamageValues[leftBound]\n : sortedDamageValues[sortedDamageValues.length - 1];\n });\n }\n\n /**\n * Returns the minimum possible damage.\n *\n * Example: `query.min()` → 0\n * Use case: \"What's the worst-case damage if everything misses?\"\n */\n min(): number {\n return this.combined.min();\n }\n\n /**\n * Returns the maximum possible damage.\n *\n * Example: `query.max()` → 56\n * Use case: \"What's the best-case damage if everything crits and rolls max?\"\n */\n max(): number {\n return this.combined.max();\n }\n\n private singleProb(diceIndex: number, label: OutcomeType): number {\n const single = this.singles[diceIndex];\n let probabilitySum = 0;\n for (const [, probabilityBin] of single) {\n probabilitySum += probabilityBin.count[label] || 0;\n }\n // Return the conditional per-event probability. Dividing by the single's\n // mass keeps the result in [0,1] for a non-normalized single (e.g. one that\n // has been scaled), so probAtLeastOne / the binomial DP stay mass-invariant.\n const mass = single.mass();\n return mass > 0 ? probabilitySum / mass : 0;\n }\n\n /**\n * Full count distribution [P(0), P(1), …, P(n)] for \"an attack succeeds if it\n * carries ANY of `labels`\", over the n independent singles.\n *\n * Each single's per-event success probability is the Poisson-binomial\n * marginal P(≥1 of labels) from {@link probabilityOf} (i.e. probAtLeastOne),\n * computed exactly once. The binomial DP then runs once to produce the whole\n * distribution, so the array-label paths of probExactlyK / probAtLeastK /\n * probAtMostK can slice or sum from it instead of rebuilding a DiceQuery and\n * re-running the DP per requested k.\n */\n private countDistribution(labels: OutcomeType[]): number[] {\n const n = this.singles.length;\n const successProbabilities = this.singles.map((single) =>\n new DiceQuery([single]).probabilityOf(labels)\n );\n\n const dist = new Array(n + 1).fill(0);\n dist[0] = 1;\n for (const successProb of successProbabilities) {\n for (let outcomeCount = n; outcomeCount >= 1; outcomeCount--) {\n dist[outcomeCount] =\n dist[outcomeCount] * (1 - successProb) +\n dist[outcomeCount - 1] * successProb;\n }\n dist[0] *= 1 - successProb;\n }\n return dist;\n }\n\n probAtLeastK(labels: OutcomeType | OutcomeType[], k: number): number {\n const L = Array.isArray(labels) ? [...new Set(labels)] : [labels];\n const n = this.singles.length;\n\n if (k <= 0) return 1;\n if (k > n) return 0;\n\n // Sum the upper tail of the single, shared count distribution rather than\n // calling probExactlyK (which rebuilt the distribution) once per i.\n const dist = this.countDistribution(L);\n let tail = 0;\n for (let i = k; i <= n; i++) {\n tail += dist[i];\n }\n\n if (tail < 0) return 0;\n if (tail > 1) return 1;\n return tail;\n }\n\n /**\n * Returns the probability that at least one attack has the specified outcome(s).\n * - This is the complement of probAtMostK(labels, 0)\n *\n * Examples:\n * - `query.probAtLeastOne('hit')` → 0.88 (88% chance at least one attack hits)\n * - `query.probAtLeastOne(['hit', 'crit'])` → 0.96 (96% chance at least one succeeds)\n *\n * Use cases:\n * - \"What's the chance at least one of my attacks connects?\"\n *\n * Note:\n *\n * - You have to pass in an array of labels to avoid double-counting if you are\n * using multiple labels. You cannot just add them.\n */\n probAtLeastOne(labels: OutcomeType | OutcomeType[]): number {\n // Handle single label case (backward compatibility)\n if (typeof labels === \"string\") {\n labels = [labels];\n }\n\n let productOfNonOccurrence = 1;\n for (let diceIndex = 0; diceIndex < this.singles.length; diceIndex++) {\n // Calculate total probability of any of the specified labels occurring.\n // Clamp to [0,1] so floating-point drift in the per-attack sum cannot push\n // the complement out of range.\n let combinedProbability = 0;\n for (const label of labels) {\n combinedProbability += this.singleProb(diceIndex, label);\n }\n if (combinedProbability < 0) combinedProbability = 0;\n else if (combinedProbability > 1) combinedProbability = 1;\n productOfNonOccurrence *= 1 - combinedProbability;\n }\n const result = 1 - productOfNonOccurrence;\n return result < 0 ? 0 : result > 1 ? 1 : result;\n }\n\n /**\n * Computes binomial probabilities for exactly 0, 1, 2, ..., maxK occurrences of a label.\n *\n * Uses dynamic programming to efficiently calculate the probability distribution\n * of how many attacks will have the specified outcome, accounting for different\n * success probabilities across individual attacks.\n *\n * Example: For 3 attacks with 50% hit chance each, returns:\n * [0.125, 0.375, 0.375, 0.125] = [P(0 hits), P(1 hit), P(2 hits), P(3 hits)]\n *\n * @param label - The outcome type to count\n * @param maxK - Maximum number of occurrences to calculate (usually number of attacks)\n * @returns Array where index K contains P(exactly K attacks have the label)\n */\n private computeBinomialProbabilities(\n label: OutcomeType,\n maxK: number\n ): number[] {\n const individualProbabilities = this.singles.map((_, diceIndex) =>\n this.singleProb(diceIndex, label)\n );\n const binomialProbs = new Array(maxK + 1).fill(0);\n binomialProbs[0] = 1;\n\n for (const singleProbability of individualProbabilities) {\n for (let outcomeCount = maxK; outcomeCount >= 1; outcomeCount--) {\n binomialProbs[outcomeCount] =\n binomialProbs[outcomeCount] * (1 - singleProbability) +\n binomialProbs[outcomeCount - 1] * singleProbability;\n }\n binomialProbs[0] *= 1 - singleProbability;\n }\n\n return binomialProbs;\n }\n\n /**\n * Returns the probability that exactly K attacks result in the specified outcome(s).\n *\n * Single label examples:\n * - probExactlyK('hit', 2) = probability exactly 2 attacks hit\n * - probExactlyK('crit', 1) = probability exactly 1 attack crits\n * - probExactlyK('crit', 0) = probability no attacks crit\n *\n * Array examples:\n * - probExactlyK(['hit', 'crit'], 2) = probability exactly 2 attacks succeed\n * - probExactlyK(['hit', 'crit'], 1) = probability exactly 1 attack succeeds\n * - probExactlyK(['missDamage', 'missNone'], 0) = probability no attacks miss\n *\n * Use cases:\n * - \"What's the chance exactly one of my attacks hits?\"\n * - \"How likely am I to get exactly 2 successes out of 3 attacks?\"\n * - \"What's the probability that exactly half my attacks succeed?\"\n *\n * Note: For arrays, an attack counts as a \"success\" if it has any of the specified labels.\n * This is different from probAtMostK, which counts an attack as a \"success\" if it has ALL of the specified labels.\n */\n probExactlyK(labels: OutcomeType | OutcomeType[], k: number): number {\n // Handle single label case (backward compatibility)\n if (typeof labels === \"string\") {\n const probabilityArray = this.computeBinomialProbabilities(labels, k);\n return probabilityArray[k];\n }\n\n // For multiple labels, derive P(exactly k) from the single shared count\n // distribution. (k > n is impossible, so index out of range reads as 0.)\n const dist = this.countDistribution(labels);\n return k >= 0 && k < dist.length ? dist[k] : 0;\n }\n\n /**\n * Returns the probability that AT MOST K attacks result in the specified outcome(s).\n *\n * Single label examples:\n * - probAtMostK('hit', 1) = probability 0 or 1 attacks hit (at most 1)\n * - probAtMostK('crit', 0) = probability no attacks crit\n * - probAtMostK('missDamage', 2) = probability at most 2 attacks miss\n *\n * Array examples:\n * - probAtMostK(['hit', 'crit'], 1) = probability at most 1 attack succeeds\n * - probAtMostK(['hit', 'crit'], 0) = probability no attacks succeed (all miss)\n *\n * Use cases:\n * - \"What's the chance that at most one attack hits?\" (rest miss)\n * - \"How likely am I to have mostly failures?\" (at most 1 success)\n * - \"What's the probability of a really bad turn?\" (at most 0 successes)\n *\n */\n probAtMostK(labels: OutcomeType | OutcomeType[], k: number): number {\n // Handle single label case (backward compatibility)\n if (typeof labels === \"string\") {\n const probabilityArray = this.computeBinomialProbabilities(labels, k);\n let cumulativeSum = 0;\n for (let outcomeCount = 0; outcomeCount <= k; outcomeCount++) {\n cumulativeSum += probabilityArray[outcomeCount];\n }\n return cumulativeSum;\n }\n\n // For multiple labels, sum the lower tail of the single shared count\n // distribution rather than recomputing it per outcomeCount.\n const dist = this.countDistribution(labels);\n const upper = Math.min(k, dist.length - 1);\n let cumulativeSum = 0;\n for (let outcomeCount = 0; outcomeCount <= upper; outcomeCount++) {\n cumulativeSum += dist[outcomeCount];\n }\n return cumulativeSum;\n }\n\n /**\n * Returns the expected damage attributed to specific outcome types.\n *\n * Single label examples:\n * - expectedDamageFrom('hit') = expected damage from hit components\n * - expectedDamageFrom('crit') = expected damage from crit components\n *\n * Array examples:\n * - expectedDamageFrom(['hit', 'crit']) = expected damage from any success\n * - expectedDamageFrom(['missDamage', 'missNone']) = expected damage from misses\n *\n * Use cases:\n * - \"How much damage do I expect from successful attacks?\"\n * - \"What's the damage contribution from critical hits specifically?\"\n * - \"How much damage comes from miss effects (like save-for-half spells)?\"\n */\n expectedDamageFrom(labels: OutcomeType | OutcomeType[]): number {\n const wanted = Array.isArray(labels) ? labels : [labels];\n\n let total = 0;\n // By linearity of expectation, we can sum the expected damages from each individual PMF. This avoids issues with the `count` aggregation during\n for (const single of this.singles) {\n for (const [dmg, bin] of single) {\n let p = 0;\n for (const label of wanted) p += bin.count[label] ?? 0;\n total += dmg * p;\n }\n }\n return total;\n }\n\n /**\n * Returns damage statistics for scenarios where AT LEAST ONE attack results in\n * the specified outcome(s).\n *\n * This method answers \"What happens when things go reasonably well?\" rather than\n * \"What's the theoretical maximum?\" It includes mixed scenarios which are more\n * common and tactically relevant than pure scenarios.\n *\n * Single label examples:\n * - damageStatsFrom('hit') = damage range when at least one attack hits\n * - damageStatsFrom('crit') = damage range when at least one attack crits\n *\n * Array examples:\n * - damageStatsFrom(['hit', 'crit']) = damage range when at least one attack succeeds\n * - damageStatsFrom(['missDamage', 'missNone']) = damage range when at least one attack misses\n *\n * Tactical Use Cases:\n * - \"Given that I don't completely whiff (99% of turns), what damage should I expect?\"\n * - \"When planning to kill a 60 HP enemy, what's my damage range on successful turns?\"\n * - \"Should I use this risky spell if it has good damage when it works?\"\n * - \"What's my damage potential when something goes right?\" (vs pure failure)\n *\n * Combat Planning Examples:\n * - 4 attacks with 90% hit chance: \"96% of the time you'll do 25-150 damage, avg 52\"\n * (Much more useful than \"You average 50 damage including complete misses\")\n * - Risk assessment: \"80% of successful turns do 40-80 damage, but 20% do 80-150\"\n * - Resource management: \"If I hit anything, I'll likely finish this enemy\"\n *\n * Statistical Note:\n * This includes mixed scenarios (2 hits + 1 crit, 3 hits + 1 miss, etc.) which\n * occur far more frequently than pure scenarios. For pure scenarios, use combinedDamageStats.\n *\n * KNOWN LIMITATION (multi-attack, single label): the returned `count` is an\n * EXPECTED COUNT (E[#label], so > 1 for N≥2 attacks, not a probability), and\n * `avg` is the size-biased conditional mean E[dmg·#label]/E[#label] rather than\n * E[dmg | the label occurs]. For a single attack both are the plain\n * conditional figures. Use {@link probAtLeastOne} for the scenario probability.\n *\n * @example\n * // High-level tactical planning\n * const successStats = query.damageStatsFrom('hit')\n * const successChance = query.probAtLeastOne('hit')\n * console.log(`${(successChance*100).toFixed(1)}% chance to do ${successStats.min}-${successStats.max} damage`)\n */\n damageStatsFrom(labels: OutcomeType | OutcomeType[]): {\n min: number;\n max: number;\n avg: number;\n count: number;\n } {\n // Normalize input to array for uniform handling\n const labelArray = typeof labels === \"string\" ? [labels] : labels;\n\n let minDamage = Infinity;\n let maxDamage = -Infinity;\n let totalDamage = 0;\n let totalCount = 0;\n\n for (const [damage, probabilityBin] of this.combined) {\n // Check if this bin has any of the specified labels\n let binHasAnyLabel = false;\n let binContribution = 0;\n\n for (const label of labelArray) {\n const count = probabilityBin.count[label] as number;\n if (count && count > 0) {\n binHasAnyLabel = true;\n binContribution += count;\n }\n }\n\n if (damage > 0 && binHasAnyLabel) {\n minDamage = Math.min(minDamage, damage);\n maxDamage = Math.max(maxDamage, damage);\n\n // For single labels, use the specific count; for multiple labels, use total probability\n const weightToUse =\n labelArray.length === 1 ? binContribution : probabilityBin.p;\n totalDamage += damage * weightToUse;\n totalCount += weightToUse;\n }\n }\n\n return {\n min: minDamage === Infinity ? 0 : minDamage,\n max: maxDamage === -Infinity ? 0 : maxDamage,\n avg: totalCount > 0 ? totalDamage / totalCount : 0,\n count: totalCount,\n };\n }\n\n /**\n * Returns damage statistics for scenarios where ALL attacks result in the specified\n * outcome, calculated by leveraging the pure partition of singles.\n *\n * This method answers \"What's the theoretical best/worst case?\" and \"What are the\n * clean mathematical boundaries?\" It provides pure scenarios without mixing outcomes.\n *\n * Examples:\n * - combinedDamageStats('hit') = damage range when all attacks hit (none crit, none miss)\n * - combinedDamageStats('crit') = damage range when all attacks crit (none just hit)\n *\n * UI and Display Use Cases:\n * - Statistics panels showing \"MAX Hit Damage\" (users expect pure hits, not mixed)\n * - \"Best case scenario\" vs \"worst case scenario\" analysis\n * - Mathematical verification: \"Does our hit damage calculation match manual math?\"\n * - Clean damage type attribution: \"How much comes from base hits vs crits?\"\n *\n * Design and Balance Use Cases:\n * - Game designers: \"What's the damage ceiling if someone gets lucky?\"\n * - Character optimization: \"What's my absolute maximum potential?\"\n * - Ability comparison: \"Which build has higher crit ceiling?\"\n * - Minimum guaranteed damage: \"What's the worst I can do if everything hits?\"\n *\n * Mathematical Use Cases:\n * - Validating complex calculations against simple manual math\n * - Understanding damage component contributions in isolation\n * - Separating luck (crit variance) from consistency (hit variance)\n * - Building intuition about damage sources\n *\n * When to Use This vs damageStatsFrom():\n * - Use THIS for: UI max/min displays, theoretical limits, clean comparisons\n * - Use damageStatsFrom() for: tactical planning, realistic expectations, mixed scenarios\n *\n * Statistical Note:\n * Pure scenarios (all hits, all crits) are rare but represent clear mathematical\n * boundaries. These stats help understand the \"shape\" of your damage potential.\n *\n * @example\n * // UI display logic\n * const pureHitMax = query.combinedDamageStats('hit').max // Clean \"MAX Hit Damage: 90\"\n * const pureCritMax = query.combinedDamageStats('crit').max // Clean \"MAX Crit Damage: 168\"\n *\n * // vs tactical planning (use damageStatsFrom instead)\n * const realisticRange = query.damageStatsFrom('hit') // Includes mixed scenarios\n */\n combinedDamageStats(targetLabel: OutcomeType): {\n min: number;\n max: number;\n avg: number;\n count: number;\n } {\n // Get pure statistics from each single attack (singles are already pure partitions)\n const singleStats = this.singles.map((single) =>\n new DiceQuery([single]).damageStatsFrom(targetLabel)\n );\n\n // If any single attack has no outcomes of this type, return zeros\n if (singleStats.some((stats) => stats.count === 0)) {\n return { min: 0, max: 0, avg: 0, count: 0 };\n }\n\n // Calculate combined statistics for N attacks all of target type\n const combinedMin = singleStats.reduce((sum, stats) => sum + stats.min, 0);\n const combinedMax = singleStats.reduce((sum, stats) => sum + stats.max, 0);\n const combinedAvg = singleStats.reduce((sum, stats) => sum + stats.avg, 0);\n const combinedProb = singleStats.reduce(\n (product, stats) => product * stats.count,\n 1\n );\n\n return {\n min: combinedMin,\n max: combinedMax,\n avg: combinedAvg,\n count: combinedProb,\n };\n }\n\n /**\n * Returns the probability that at least one attack carries ANY of the\n * specified labels (the marginal P(≥1) across the independent attacks).\n *\n * Examples:\n * - `query.probabilityOf('hit')` → 0.88 (probability at least one hit occurs)\n * - `query.probabilityOf(['hit', 'crit'])` → 0.96 (probability of any success)\n *\n * Use cases:\n * - \"What's the chance my resolution includes a success label?\"\n * - \"How likely am I to get any hits or crits across all attacks?\"\n *\n * Note: this must NOT be computed by summing `combined` bin probabilities. A\n * single combined damage total is reachable by many outcome combinations and\n * a bin can hold several labels at once, so summing `bin.p` over bins that\n * contain a label over-counts. The correct marginal is the Poisson-binomial\n * complement over the per-attack probabilities, i.e. {@link probAtLeastOne}.\n */\n probabilityOf(labels: OutcomeType | OutcomeType[]): number {\n return this.probAtLeastOne(labels);\n }\n\n /**\n * Returns the probability of missing (any type of miss).\n *\n * Example: `query.missChance()` → 0.04\n * Use case: \"What's the chance I miss completely this turn?\"\n */\n missChance(): number {\n // Miss can be either explicit misses with damage or zero-damage misses\n return this.probabilityOf([\"missDamage\", \"missNone\"]);\n }\n\n /**\n * Returns data formatted for plotting damage probability distribution.\n *\n * Example: `query.toChartSeries()` → [{x: 0, y: 0.04}, {x: 6, y: 0.1}, ...]\n * Use case: \"I want to visualize my damage distribution in a chart.\"\n */\n toChartSeries(): Array<{ x: number; y: number }> {\n return this.combined.support().map((damageValue) => ({\n x: damageValue,\n y: this.combined.map.get(damageValue)!.p,\n }));\n }\n\n /**\n * Returns tabular data showing damage values and their probability breakdowns.\n *\n * Example: `query.toLabeledTable(['hit', 'crit'])` →\n * [{damage: 6, total: 0.01, hit: 0.008, crit: 0}, ...]\n *\n * Use case: \"I want to see exactly how hit/crit probabilities contribute to each damage value.\"\n */\n toLabeledTable(\n labels: OutcomeType[] = []\n ): Array<{ damage: number; total: number } & Record<string, number>> {\n return this.combined.support().map((damageValue) => {\n const probabilityBin = this.combined.map.get(damageValue)!;\n const tableRow: { damage: number; total: number } & Record<\n string,\n number\n > = {\n damage: damageValue,\n total: probabilityBin.p,\n };\n for (const outcomeLabel of labels) {\n tableRow[outcomeLabel] = probabilityBin.count[outcomeLabel] || 0;\n }\n return tableRow;\n });\n }\n\n /**\n * Returns data for stacked charts with unconditional per-label probability mass per damage.\n *\n * - Each dataset value equals the unconditional probability mass for that label at that damage\n * (i.e., `bin.count[label]`).\n * - Column sums may be less than the total probability `bin.p` when you omit labels or when\n * there is unlabeled mass. Include all relevant outcome labels if you need the sum to match.\n * - This behavior matches tests that expect raw per-label mass (not proportional scaling).\n * - NOTE: This implementation may break dprcalc.com chart binning at large n, need to test it more.\n *\n * @example\n * query.toStackedChartData(['hit', 'crit'])\n * // → {labels: [0, 6, 12, ...], datasets: [{label: 'hit', data: [0, 0.03, ...]}, ...]}\n */\n toStackedChartData(\n labels: OutcomeType[] = [],\n epsilon = EPS\n ): { labels: number[]; datasets: Array<{ label: string; data: number[] }> } {\n const damageValues = this.combined.support();\n\n const datasets = labels.map((outcomeLabel) => ({\n label: outcomeLabel,\n data: damageValues.map((dmg) => {\n const bin = this.combined.map.get(dmg);\n const v = bin ? (bin.count[outcomeLabel] as number) || 0 : 0;\n return v <= epsilon ? 0 : v;\n }),\n }));\n\n return { labels: damageValues, datasets };\n }\n\n /**\n * Returns pure mathematical data for cumulative distribution function (CDF).\n * Shows P(X ≤ x) - the probability of getting at most x damage.\n *\n * @param asPercentages Whether to return percentages (0-100) or probabilities (0-1)\n * @returns Pure data structure with support and cumulative probabilities\n *\n * @example\n * query.toCDFSeries()\n * // → {support: [0, 6, 12], data: [5.2, 18.3, 45.1]}\n */\n toCDFSeries(asPercentages: boolean = true): {\n support: number[];\n data: number[];\n } {\n const originalSupport = this.combined.support();\n if (originalSupport.length === 0) {\n return { support: [], data: [] };\n }\n\n // Create complete integer range from min to max\n const minDamage = Math.min(...originalSupport);\n const maxDamage = Math.max(...originalSupport);\n const support = Array.from(\n { length: maxDamage - minDamage + 1 },\n (_, i) => minDamage + i\n );\n\n let cumulativeProbability = 0;\n const cdfData: number[] = [];\n\n for (const damage of support) {\n const bin = this.combined.map.get(damage);\n if (bin) {\n cumulativeProbability += bin.p;\n }\n cdfData.push(\n asPercentages ? cumulativeProbability * 100 : cumulativeProbability\n );\n }\n\n return {\n support,\n data: cdfData,\n };\n }\n\n /**\n * Returns pure mathematical data for complementary cumulative distribution function (CCDF).\n * Shows P(X ≥ x) - the probability of getting at least x damage.\n *\n * @param asPercentages Whether to return percentages (0-100) or probabilities (0-1)\n * @returns Pure data structure with support and complementary cumulative probabilities\n *\n * @example\n * query.toCCDFSeries()\n * // → {support: [0, 6, 12], data: [100, 94.8, 81.7]}\n */\n toCCDFSeries(asPercentages: boolean = true): {\n support: number[];\n data: number[];\n } {\n const originalSupport = this.combined.support();\n if (originalSupport.length === 0) {\n return { support: [], data: [] };\n }\n\n // Create complete integer range from min to max\n const minDamage = Math.min(...originalSupport);\n const maxDamage = Math.max(...originalSupport);\n const support = Array.from(\n { length: maxDamage - minDamage + 1 },\n (_, i) => minDamage + i\n );\n\n // Calculate CCDF: P(X ≥ x) = 1 - P(X < x)\n let cumulativeProbability = 0;\n const ccdfData: number[] = [];\n\n for (const damage of support) {\n // For CCDF at point x, we want P(X ≥ x) = 1 - P(X < x)\n // which is the total probability minus cumulative up to (but not including) x\n const ccdf = 1 - cumulativeProbability;\n ccdfData.push(asPercentages ? ccdf * 100 : ccdf);\n\n // Now add current probability for next iteration\n const bin = this.combined.map.get(damage);\n if (bin) {\n cumulativeProbability += bin.p;\n }\n }\n\n return {\n support,\n data: ccdfData,\n };\n }\n\n /*\n Statistics snapshot of the query.\n */\n\n /** Probability of doing strictly more than threshold damage (default >0). */\n probDamageGreaterThan(threshold = 0): number {\n let acc = 0;\n for (const [x, bin] of this.combined.map) if (x > threshold) acc += bin.p;\n return acc;\n }\n\n /** All outcome keys actually present (typed & ordered if you pass an order). */\n outcomeKeys(order?: OutcomeType[]): OutcomeType[] {\n const found = new Set<string>();\n for (const [, bin] of this.combined.map) {\n for (const k in bin.count)\n if (bin.count[k] && (bin.count[k] as number) > 0) found.add(k);\n }\n if (found.size === 0)\n [\"hit\", \"crit\", \"missNone\"].forEach((k) => found.add(k));\n const keys = Array.from(found).filter(\n (k) => order?.includes(k as OutcomeType) ?? true\n ) as OutcomeType[];\n if (order && order.length)\n keys.sort((a, b) => order.indexOf(a) + 999 - (order.indexOf(b) + 999));\n return keys;\n }\n\n /** Total probability per outcome across the PMF. */\n outcomeTotals(\n outcomes: OutcomeType[] = this.outcomeKeys()\n ): Map<OutcomeType, number> {\n const totals = new Map<OutcomeType, number>();\n outcomes.forEach((o) => totals.set(o, 0));\n for (const [, row] of this.combined.map) {\n for (const o of outcomes) {\n const p = (row.count[o] as number) || 0; // if your bins store per-outcome p; else derive via toLabeledTable\n totals.set(o, (totals.get(o) || 0) + p);\n }\n }\n return totals;\n }\n\n /** Conditional damage range per outcome (min/avg/max of X | outcome). */\n outcomeDamageRanges(\n outcomes: OutcomeType[] = this.outcomeKeys()\n ): Map<OutcomeType, { min: number; avg: number; max: number }> {\n // Use toLabeledTable to stay consistent with your existing attribution\n const table = this.toLabeledTable(outcomes);\n const ranges = new Map<\n OutcomeType,\n { min?: number; max?: number; sum: number; mass: number }\n >();\n outcomes.forEach((o) => ranges.set(o, { sum: 0, mass: 0 }));\n\n for (const row of table) {\n const dmg = row.damage as number;\n for (const o of outcomes) {\n const p = (row[o] as number) || 0; // joint mass at (damage, outcome)\n if (p > 0) {\n const r = ranges.get(o)!;\n r.sum += dmg * p;\n r.mass += p;\n if (r.min === undefined || dmg < r.min) r.min = dmg;\n if (r.max === undefined || dmg > r.max) r.max = dmg;\n }\n }\n }\n\n const out = new Map<\n OutcomeType,\n { min: number; avg: number; max: number }\n >();\n for (const o of outcomes) {\n const r = ranges.get(o)!;\n const avg = r.mass > 0 ? r.sum / r.mass : 0;\n out.set(o, { min: r.min ?? 0, avg, max: r.max ?? 0 });\n }\n return out;\n }\n\n /**\n * Per-outcome probabilities and damage ranges, aggregated over the individual\n * singles rather than read off the combined distribution.\n *\n * `damageRange` is the sum, over every single that can produce the outcome, of\n * that single's own conditional damage range: \"what this outcome contributes\n * across the whole turn when every attack that can produce it does\". Linear in\n * the number of attacks by construction.\n *\n * Prefer this over {@link DiceQuery.snapshot} for a multi-attack query.\n * `snapshot` reads `damageRange` off the combined PMF's `count`, which the\n * convolution accumulates as an expected count, so its `avg` is size-biased\n * for N≥2 (its own doc comment says so). The two agree for a single attack.\n *\n * Only outcomes that actually occur appear in the result.\n *\n * Like every `singles`-based helper on this class, it describes the singles\n * and not an explicitly provided `combined`. `Turn.toQuery()` supplies one whose\n * distribution also contains rider attacks that are absent from `singles`\n * (an `otherwise([unarmed, unarmed])` flurry, say), so those attacks do not\n * appear here. For rider-inclusive figures read the combined distribution\n * directly: {@link DiceQuery.outcomeTotals}, {@link DiceQuery.outcomeDamageRanges}.\n *\n * @param outcomes Which outcomes to consider; defaults to every canonical one.\n */\n outcomeStats(\n outcomes: readonly OutcomeType[] = ALL_OUTCOME_TYPES\n ): Map<OutcomeType, OutcomeSnapshot> {\n const stats = new Map<OutcomeType, OutcomeSnapshot>();\n const perSingle = this.singles.map((pmf) => new DiceQuery([pmf], undefined, this._eps));\n\n for (const outcome of outcomes) {\n const atLeastOneProbability = this.probAtLeastOne(outcome);\n if (atLeastOneProbability <= 0) continue;\n\n const damageRange = { min: 0, avg: 0, max: 0 };\n let contributors = 0;\n for (const single of perSingle) {\n if (single.probAtLeastOne(outcome) <= 0) continue;\n contributors++;\n const stat = single.damageStatsFrom(outcome);\n damageRange.min += stat.min;\n damageRange.avg += stat.avg;\n damageRange.max += stat.max;\n }\n\n stats.set(outcome, {\n atLeastOneProbability,\n allProbability:\n contributors > 0 ? this.probExactlyK(outcome, contributors) : 0,\n damageRange,\n });\n }\n\n return stats;\n }\n\n /**\n * Snapshot of the distribution in the exact shape the UI consumes.\n * - outcome probabilities are \"at least one\" (and equal to \"all\" for a single PMF)\n * - damageRange is conditional on the outcome occurring\n *\n * The outcome probabilities use the correct Poisson-binomial marginals\n * (`atLeastOneProbability` = P(≥1 attack has it), `allProbability` = P(all do)),\n * so they are always valid probabilities in [0,1].\n *\n * KNOWN LIMITATION (multi-attack): `damageRange.avg` is still aggregated from\n * the combined PMF's `count`, which the convolution accumulates as an EXPECTED\n * COUNT, so for N≥2 attacks it is the size-biased mean E[dmg·#label]/E[#label]\n * rather than a clean conditional expectation. It is correct for a single\n * attack.\n */\n snapshot(order?: readonly OutcomeType[]): Snapshot {\n // 1) Discover which outcomes actually appear in this PMF\n const discovered = new Set<string>();\n for (const [, bin] of this.combined.map) {\n for (const k in bin.count) {\n if (bin.count[k] && (bin.count[k] as number) > 0) discovered.add(k);\n }\n }\n if (discovered.size === 0) {\n for (const k of DiceQuery.DEFAULT_OUTCOMES) discovered.add(k);\n }\n\n let outcomes = Array.from(discovered);\n\n // Optional filtering + ordering if a preferred order was provided\n if (order && order.length) {\n const inOrder = new Set(order);\n outcomes = outcomes.filter((k) => inOrder.has(k as OutcomeType));\n const rank = new Map(order.map((k, i) => [k, i]));\n outcomes.sort(\n (a, b) =>\n (rank.get(a as OutcomeType) ?? 999) -\n (rank.get(b as OutcomeType) ?? 999)\n );\n }\n\n // 2) Aggregate per-outcome mass and conditional damage ranges via labeled table\n const rows = this.toLabeledTable(outcomes as OutcomeType[]);\n\n const rangeAcc = new Map<\n OutcomeType,\n { min?: number; max?: number; sum: number; mass: number }\n >();\n for (const ot of outcomes) {\n rangeAcc.set(ot as OutcomeType, { sum: 0, mass: 0 });\n }\n\n for (const row of rows) {\n const dmg = row.damage as number;\n for (const ot of outcomes) {\n const p = (row[ot] as number) || 0;\n if (p <= 0) continue;\n\n const r = rangeAcc.get(ot as OutcomeType)!;\n r.sum += dmg * p;\n r.mass += p;\n if (r.min === undefined || dmg < r.min) r.min = dmg;\n if (r.max === undefined || dmg > r.max) r.max = dmg;\n }\n }\n\n const n = this.singles.length;\n const outcomeMap = new Map<OutcomeType, OutcomeSnapshot>();\n for (const ot of outcomes) {\n const r = rangeAcc.get(ot as OutcomeType)!;\n const avg = r.mass > 0 ? r.sum / r.mass : 0;\n // Use the correct per-attack marginals (Poisson-binomial) so these are\n // always valid probabilities in [0,1]. For a single attack both reduce to\n // P(outcome); the previous `total` was an expected count and could exceed 1.\n outcomeMap.set(ot as OutcomeType, {\n atLeastOneProbability: this.probAtLeastOne(ot as OutcomeType),\n allProbability: this.probAtLeastK(ot as OutcomeType, n),\n damageRange: { min: r.min ?? 0, avg, max: r.max ?? 0 },\n });\n }\n\n // 3) Scalars: mean, damageChance, and percentiles from the dense CDF\n const averageDPR = this.mean();\n\n let damageChance = 0; // P(total damage > 0)\n for (const [x, bin] of this.combined.map) if (x > 0) damageChance += bin.p;\n\n const { support, data } = this.toCDFSeries(false); // P(X ≤ x) in 0..1\n const quantile = (p: number) => {\n if (support.length === 0) return 0;\n for (let i = 0; i < support.length; i++)\n if (data[i] >= p) return support[i];\n return support[support.length - 1];\n };\n const percentiles = {\n p25: quantile(0.25),\n p50: quantile(0.5),\n p75: quantile(0.75),\n };\n\n return { averageDPR, damageChance, percentiles, outcomes: outcomeMap };\n }\n\n /**\n * PMF Transformation Methods\n *\n * These methods provide a fluent API for transforming dice queries by wrapping\n * the underlying PMF transformation methods. All operations work on the combined\n * PMF and return new DiceQuery instances.\n */\n\n /**\n * Returns a new DiceQuery with normalized probabilities (ensuring they sum to 1.0).\n *\n * @returns New DiceQuery with normalized combined PMF\n */\n normalize(): DiceQuery {\n return new DiceQuery([this.combined.normalize()]);\n }\n\n /**\n * Returns a new DiceQuery with low-probability outcomes removed.\n *\n * @param eps Minimum probability threshold (defaults to PMF epsilon)\n * @param keepFinalBin Whether to keep the highest damage bin regardless of probability\n * @returns New DiceQuery with compacted combined PMF\n */\n compact(eps?: number, keepFinalBin?: boolean): DiceQuery {\n return new DiceQuery([this.combined.compact(eps, keepFinalBin)]);\n }\n\n /**\n * Returns a new DiceQuery with an additional scaled branch added.\n * Useful for conditional outcomes like \"30% chance of opportunity attack\".\n *\n * @param branch DiceQuery to add as a scaled branch\n * @param probability Probability of the branch occurring (0-1)\n * @returns New DiceQuery combining this query with the scaled branch\n *\n * @example\n * const baseAttack = parse(\"(d20 + 5 AC 15) * (2d6 + 3)\");\n * const opportunityAttack = parse(\"(d20 + 5 AC 15) * (1d8 + 3)\");\n * const withOpportunity = baseAttack.addScaled(opportunityAttack, 0.3);\n */\n addScaled(branch: DiceQuery, probability: number): DiceQuery {\n return new DiceQuery([\n this.combined.addScaled(branch.combined, probability),\n ]);\n }\n\n /**\n * Returns a new DiceQuery with all probabilities scaled by a factor.\n * Used for conditional scenarios where the entire outcome has reduced probability.\n *\n * @param factor Scaling factor for probabilities\n * @returns New DiceQuery with scaled probabilities\n *\n * @example\n * const fullAttack = parse(\"(d20 + 5 AC 15) * (2d6 + 3)\");\n * const conditionalAttack = fullAttack.scaleMass(0.3); // 30% chance scenario\n */\n scaleMass(factor: number): DiceQuery {\n return new DiceQuery([this.combined.scaleMass(factor)]);\n }\n\n totalMass(): number {\n return this.combined.mass();\n }\n\n /**\n * Returns a new DiceQuery with damage values transformed by a function.\n * Useful for applying modifiers, resistances, or other damage transformations.\n *\n * @param damageTransformFunction Function to transform each damage value\n * @returns New DiceQuery with transformed damage values\n *\n * @example\n * const baseAttack = parse(\"2d6 + 3\");\n * const withResistance = baseAttack.mapDamage(dmg => Math.floor(dmg / 2)); // Half damage\n * const withBonus = baseAttack.mapDamage(dmg => dmg + 5); // +5 damage\n */\n mapDamage(\n damageTransformFunction: (damageValue: number) => number\n ): DiceQuery {\n return new DiceQuery([this.combined.mapDamage(damageTransformFunction)]);\n }\n\n /**\n * Returns a new DiceQuery with damage values scaled by a factor.\n * Convenient wrapper around mapDamage for multiplicative scaling.\n *\n * @param factor Scaling factor for damage values\n * @param rounding Rounding method: \"floor\" (default), \"round\", or \"ceil\"\n * @returns New DiceQuery with scaled damage values\n *\n * @example\n * const baseAttack = parse(\"2d6 + 3\");\n * const doubled = baseAttack.scaleDamage(2); // Double damage\n * const halfDamage = baseAttack.scaleDamage(0.5, \"round\"); // Half damage, rounded\n */\n scaleDamage(\n factor: number,\n rounding: \"floor\" | \"round\" | \"ceil\" = \"floor\"\n ): DiceQuery {\n return new DiceQuery([this.combined.scaleDamage(factor, rounding)]);\n }\n\n /**\n * Returns a new DiceQuery combining this query with another via convolution.\n * Equivalent to rolling both queries independently and adding results.\n * It is important to use this rather than combing()ing the PMFs directly!\n * This method maintains the provenance of the PMFs which is needed for damage attribution.\n * Combining the .combined PMFs directly is still valid for DPR calculations but\n * is not statistically sound for queries.\n *\n * @param other DiceQuery to combine with\n * @param eps Optional epsilon for precision control\n * @returns New DiceQuery representing the combined outcome\n *\n * @example\n * const mainAttack = parse(\"(d20 + 5 AC 15) * (2d6 + 3)\");\n * const bonusAttack = parse(\"(d20 + 3 AC 15) * (1d6 + 1)\");\n * const bothAttacks = mainAttack.convolve(bonusAttack);\n */\n convolve(other: DiceQuery): DiceQuery {\n const singles = [...this.singles, ...other.singles];\n return new DiceQuery(singles);\n }\n\n /**\n * First-success split over an ordered list of DISTINCT single-swing PMFs.\n * Each PMF may have different success/subset probabilities (from labels).\n *\n * successOutcome: e.g., [\"success\"] or [\"hit\", \"crit\"]\n * subsetOutcome: e.g., [\"subset\"] or [\"crit\"] where subset ⊆ success\n *\n * Returns tuple: [pFirstNonSubset, pFirstSubset, pAnySuccess, pNone]\n */\n public firstSuccessSplit(\n successOutcome: OutcomeType | OutcomeType[],\n subsetOutcome: OutcomeType | OutcomeType[],\n eps = EPS\n ): readonly [pSuccess: number, pSubset: number, pAny: number, pNone: number] {\n const pmfs = this.singles;\n if (!pmfs.length) {\n throw new Error(\"firstSuccessSplitFromPMFs: pmfs must be non-empty\");\n }\n\n const toArr = (x: OutcomeType | OutcomeType[]): OutcomeType[] =>\n Array.isArray(x) ? x : [x];\n const clamp01 = (x: number) => Math.max(0, Math.min(1, x));\n const tol = Math.max(eps, 8 * Number.EPSILON);\n\n // Per-event probabilities from each PMF via DiceQuery([pmf])\n const per = pmfs.map((pmf) => {\n const dq = new DiceQuery([pmf]);\n const pS = dq.probAtLeastOne(toArr(successOutcome));\n const pB = dq.probAtLeastOne(toArr(subsetOutcome));\n if (pB - pS > eps) {\n throw new Error(\n \"firstSuccessSplitFromPMFs: P(subset) > P(success) for an event. Ensure subset ⊆ success.\"\n );\n }\n return { pS, pB };\n });\n\n // Aggregate with running miss prefix\n let missSoFar = 1;\n let pFirstSubset = 0;\n let pFirstNonSubset = 0;\n let pNone = 1;\n\n for (const { pS, pB } of per) {\n pFirstSubset += missSoFar * pB;\n pFirstNonSubset += missSoFar * (pS - pB);\n const miss = 1 - pS;\n missSoFar *= miss;\n pNone *= miss;\n }\n\n const pAny = 1 - pNone;\n\n // Clamp and sanity check\n const a = clamp01(pFirstNonSubset);\n const b = clamp01(pFirstSubset);\n const any = clamp01(pAny);\n const none = clamp01(pNone);\n\n if (Math.abs(a + b - any) > tol * Math.max(1, any)) {\n throw new Error(\n `firstSuccessSplitFromPMFs: parts do not sum to pAny. got a+b=${\n a + b\n }, pAny=${any}`\n );\n }\n\n return [a, b, any, none] as const;\n }\n}\n// Make sure these types are exported in your public index, or inline them here.\nexport type OutcomeSnapshot = {\n atLeastOneProbability: number; // P(outcome occurs at least once)\n allProbability: number; // equal to atLeastOneProbability for a single aggregated PMF\n damageRange: { min: number; avg: number; max: number }; // conditional on the outcome occurring\n};\n\nexport type Snapshot = {\n averageDPR: number;\n damageChance: number; // P(total damage > 0)\n percentiles: { p25: number; p50: number; p75: number };\n outcomes: Map<OutcomeType, OutcomeSnapshot>;\n};\n","import { LRUCache } from \"../common/lru-cache\";\nimport type { Bin, OutcomeLabelMap, Rounding } from \"../common/types\";\nimport {\n ALL_OUTCOME_TYPES,\n EPS,\n MISS_NONE_OUTCOME,\n sortOutcomes,\n} from \"../common/types\";\nimport { DiceQuery } from \"./query\";\n\nconst cacheEnabled = true;\n\nexport const pmfCache = new LRUCache<string, PMF>(1000);\n\n/**\n * Complete numeric model for the stacked damage-attribution chart, produced by\n * {@link PMF.damageAttributionChartModel}. Carries every dice-and-probability\n * value the chart needs; a renderer only maps these numbers into its own format\n * (colors, human labels, axis units, dataset objects).\n */\nexport interface DamageAttributionChartModel {\n /** Bucket-start value for each column. Numeric; the caller stringifies for labels. */\n labels: number[];\n /** Present only when the distribution was coarsened; [start,end] inclusive, per bucket. */\n binRanges?: { start: number; end: number }[];\n /** Discovered outcome labels in stack order. Empty for pure (unattributed) distributions. */\n outcomes: string[];\n /** outcome → per-bucket probability mass (fraction 0..1). Bar heights. Σ over outcomes ≈ totals[i]. */\n series: Map<string, number[]>;\n /**\n * outcome → per-bucket conditional share (fraction 0..1) of that bucket's total.\n * Tooltip signal. 0 where the bucket total is below `epsilon`; otherwise Σ over\n * outcomes ≈ 1.\n */\n shares: Map<string, number[]>;\n /** Per-bucket total probability mass (fraction 0..1). The only signal for pure distributions. */\n totals: number[];\n /** Reversed-convention CCDF markers: damage at which P(X ≥ x) crosses 80/50/20%. */\n percentiles: { p80: number; p50: number; p20: number };\n /** Distribution mean, `this.mean()`. */\n mean: number;\n}\n\n/**\n * Probability Mass Function for discrete damage distributions.\n */\nexport class PMF {\n // Unique ID generator for anonymous PMFs to avoid cache key collisions\n private static __anonIdCounter = 1;\n\n // Cached computed values\n private _support?: number[];\n private _min?: number;\n private _max?: number;\n private _totalMass?: number;\n private _mean?: number;\n private _variance?: number;\n private _stdev?: number;\n private _fingerprint?: string;\n\n constructor(\n public readonly map: Map<number, Bin> = new Map(),\n public readonly epsilon = EPS,\n public readonly normalized = false,\n public readonly identifier: string = `anon#${PMF.__anonIdCounter++}`,\n private _preservedProvenance = true\n ) {}\n\n static empty(epsilon = EPS, identifier = \"empty\") {\n return new PMF(new Map(), epsilon, false, identifier);\n }\n\n // This has a single bin at value 0, mass of 1\n static zero(epsilon = EPS): PMF {\n const m = new Map();\n m.set(0, { p: 1, count: { miss: 1 }, attr: {} });\n return new PMF(m, epsilon, false, \"zero\");\n }\n\n static delta(value: number, epsilon = EPS): PMF {\n return PMF.fromMap(new Map([[value, 1]]), epsilon);\n }\n\n /**\n * Point mass at damage 0 tagged with the canonical `missNone` outcome.\n *\n * Differs from {@link PMF.zero}, which labels its zero bin `miss` — the\n * builder's attack-resolution vocabulary. This uses the `missNone`\n * {@link OutcomeType} that the attribution charts and outcome stats key on,\n * so it is the correct \"clean miss / no damage\" delta for provenance-aware\n * mixtures feeding those consumers.\n */\n static missNone(epsilon = EPS): PMF {\n const m = new Map<number, Bin>();\n m.set(0, { p: 1, count: { [MISS_NONE_OUTCOME]: 1 }, attr: {} });\n return new PMF(m, epsilon, false, \"missNone\");\n }\n\n // This creates a single bin at value 0, but with weight 0.\n static emptyMass(): PMF {\n return PMF.zero().scaleMass(0);\n }\n\n // Makes PMF iterable over [damage, bin] pairs.\n [Symbol.iterator](): IterableIterator<[number, Bin]> {\n return this.map[Symbol.iterator]();\n }\n\n static clearCache() {\n pmfCache.clear();\n }\n\n /**\n * Creates a conditional PMF from two branches (success and failure) and a probability.\n * This is the core logic for modeling any probabilistic event where there are two\n * distinct outcomes.\n */\n static branch(\n successPMF: PMF,\n failurePMF: PMF,\n successProbability: number\n ): PMF {\n let p = successProbability;\n if (!Number.isFinite(p)) p = 0;\n if (p < 0) p = 0;\n if (p > 1) p = 1;\n\n const q = 1 - p;\n\n // Fast paths. scaleMass(1) returns the same instance, so these hand back the\n // branch PMF unchanged. That is safe because PMFs are treated as immutable\n // (compact() and the other transforms now clone bins rather than mutate).\n if (p === 0) return failurePMF.scaleMass(1);\n if (p === 1) return successPMF.scaleMass(1);\n\n // Choose epsilon. You can also pick Math.min for a tighter threshold.\n const eps = successPMF.epsilon ?? failurePMF.epsilon;\n const id = `branch(${failurePMF.identifier}*${q.toFixed(6)} + ${\n successPMF.identifier\n }*${p.toFixed(6)})`;\n\n // Proper Bernoulli mixture: q·failure ⊕ p·success, assembled in a single\n // pass. The previous `empty().addScaled(failure,q).addScaled(success,p)`\n // chain copied failurePMF's bins twice (into the intermediate, then again\n // when the intermediate was copied by the second addScaled). Merging both\n // scaled branches directly into one fresh map keeps the same accumulation\n // order — q·failure first, then p·success — so the result is bit-identical.\n const resultMap = new Map<number, Bin>();\n for (const [damageValue, bin] of failurePMF.map) {\n PMF.mergeInto(resultMap, damageValue, PMF.scaleBin(bin, q));\n }\n for (const [damageValue, bin] of successPMF.map) {\n PMF.mergeInto(resultMap, damageValue, PMF.scaleBin(bin, p));\n }\n\n return new PMF(resultMap, eps, false, id);\n }\n\n /**\n * withProbability()\n *\n * A convenience wrapper around branch() for the common case where the \"failure\" branch is always zero().\n *\n * Think of this as a shortcut for:\n * pmf.gate(p, PMF.zero())\n *\n * Use this to model a *single* Bernoulli event — an outcome that either happens or doesn't,\n * like an opportunity attack that occurs with probability p, or a single attack that either hits or misses.\n *\n * This is **not** for combining multiple independent attacks or mutually exclusive multi-outcome scenarios.\n * - For multiple independent swings, use DiceQuery with separate PMFs for each attack.\n * - For modeling \"first success\" logic across multiple attacks (like Sneak Attack or Smite)\n * use query.firstSuccessSplit() to get the exact probabilities.\n * - For scenarios with several mutually exclusive outcomes (like crit vs hit vs none), use PMF.exclusive().\n *\n */\n static withProbability(successPMF: PMF, probability: number): PMF {\n return PMF.branch(successPMF, PMF.zero(), probability);\n }\n\n /**\n * gate()\n *\n * A conditional wrapper around branch() that applies this PMF with probability `p`,\n * and applies a provided fallback PMF otherwise.\n *\n * This is useful for modeling a binary choice between two outcomes:\n * - The \"success\" outcome (this PMF) happens with probability `p`.\n * - The \"failure\" outcome (fallback PMF) happens with probability `1 - p`.\n *\n * Examples:\n * - 25% chance to include an opportunity attack, otherwise nothing:\n * attackPMF.gate(0.25, PMF.zero())\n *\n * - 50% chance to deal fireball damage, otherwise cone of cold damage:\n * fireballPMF.gate(0.5, coneOfColdPMF)\n *\n * Relationship to other helpers:\n * - **withProbability()** is a shortcut for the common case where the fallback is `PMF.zero()`.\n * - **exclusive()** is for three or more mutually exclusive outcomes (e.g., crit vs hit vs none).\n *\n * @param p Probability of applying this PMF (between 0 and 1).\n * @param fallback PMF to apply when this PMF is *not* selected.\n * @returns A new PMF representing the weighted mixture of this PMF and the fallback.\n */\n gate(p: number, fallback: PMF) {\n return PMF.branch(this, fallback, p);\n }\n\n /**\n * PMF.exclusive()\n *\n * Builds a single PMF from a set of mutually exclusive weighted outcomes.\n * Exactly one of the provided options will occur.\n *\n * Each option has:\n * - A PMF representing its outcome (e.g., damage dice).\n * - A weight representing its probability of being selected.\n *\n * Notes:\n * - If total weight < 1 (within eps), leftover mass is assumed to be PMF.zero()\n *\n * @param options Array of `{ pmf, weight }` or `[PMF, number]`.\n * @param eps Optional tolerance for floating point rounding.\n */\n static exclusive(\n options: Array<{ pmf: PMF; weight: number } | [PMF, number]>,\n eps = EPS\n ): PMF {\n const items = options.map((o) =>\n Array.isArray(o) ? { pmf: o[0], weight: o[1] } : o\n );\n\n // Validate weights\n for (const { weight } of items) {\n if (!Number.isFinite(weight) || weight < -eps) {\n throw new Error(`PMF.exclusive: invalid weight ${weight}.`);\n }\n }\n\n // Sum and check\n let totalWeight = items.reduce((s, { weight }) => s + weight, 0);\n\n // Normalize tiny negatives to 0 and tiny overshoot to 1 when within eps\n if (Math.abs(totalWeight) <= eps) totalWeight = 0;\n if (Math.abs(1 - totalWeight) <= eps) totalWeight = 1;\n\n if (totalWeight > 1 + EPS) {\n throw new Error(\n `PMF.exclusive: total weight ${totalWeight} exceeds 1. (epsilon: ${eps})`\n );\n }\n\n // Accumulate scaled components, skipping near-zero weights\n let out = PMF.empty(eps);\n for (const { pmf, weight } of items) {\n if (weight > eps) out = out.addScaled(pmf, weight);\n }\n\n // Add leftover mass at zero outcome\n const leftover = Math.max(0, 1 - totalWeight);\n if (leftover > eps) {\n out = out.addScaled(PMF.zero(), leftover);\n }\n\n return out;\n }\n\n /**\n * PMF.mix()\n *\n * Builds a PMF as a linear combination of input PMFs with the given weights.\n * Unlike `exclusive`, this does NOT:\n * - enforce that weights sum to 1\n * - add leftover probability to δ0 (PMF.zero())\n *\n * Use when outcomes are not mutually exclusive, or for interpolation/blending.\n *\n * @param options Array of `{ pmf, weight }` or `[PMF, number]`.\n * @param eps Optional tolerance for skipping tiny weights.\n */\n static mix(\n options: Array<{ pmf: PMF; weight: number } | [PMF, number]>,\n eps = EPS\n ): PMF {\n const items = options.map((o) =>\n Array.isArray(o) ? { pmf: o[0], weight: o[1] } : o\n );\n\n // Validate weights, but do not constrain their sum.\n for (const { weight } of items) {\n if (!Number.isFinite(weight)) {\n throw new Error(`PMF.mix: invalid weight ${weight}.`);\n }\n }\n\n let out = PMF.empty(eps);\n for (const { pmf, weight } of items) {\n if (Math.abs(weight) <= eps) continue; // ignore crumbs\n out = out.addScaled(pmf, weight);\n }\n return out;\n }\n /**\n * Adds damage attribution metadata to this PMF based on existing count metadata.\n * For each bin, sets attr[outcome] = damage × count[outcome].\n *\n * This enables damage attribution charts to work with builder-generated PMFs.\n * The parser generates attr automatically, but builder PMFs only have count.\n *\n * @returns New PMF with attr field populated in each bin\n */\n /**\n * Returns true if this PMF already carries damage attribution metadata.\n *\n * Only the first positive-damage bin is inspected (parser-generated PMFs\n * populate `attr` uniformly), so this is O(1) in practice.\n */\n hasAttribution(): boolean {\n for (const [damage, bin] of this.map) {\n if (damage !== 0 && bin.attr && Object.keys(bin.attr).length > 0) {\n return true;\n }\n // Only check the first non-zero bin for performance\n if (damage > 0) break;\n }\n return false;\n }\n\n withAttribution(): PMF {\n // Fast path: if attr already exists, return this PMF unchanged\n if (this.hasAttribution()) return this;\n\n const newMap = new Map<number, Bin>();\n\n for (const [damage, bin] of this.map) {\n const attr: OutcomeLabelMap = {};\n\n // For each outcome type in count, compute its damage contribution\n for (const outcome in bin.count) {\n const probability = bin.count[outcome] as number;\n if (probability > 0) {\n attr[outcome] = damage * probability;\n }\n }\n\n // Create new bin with attribution\n newMap.set(damage, {\n p: bin.p,\n count: { ...bin.count },\n attr: Object.keys(attr).length > 0 ? attr : undefined,\n });\n }\n\n // Use a different identifier to avoid cache collisions with non-attributed version\n return new PMF(\n newMap,\n this.epsilon,\n this.normalized,\n `${this.identifier}~attr`\n );\n }\n\n /**\n * General-purpose N-way mixture.\n * weights: Array of [weight, PMF].\n *\n * Example: PMF.mixN([\n * [pMiss, zero],\n * [pHit, hitPMF],\n * [pCrit, critPMF],\n * ]);\n */\n static mixN(weights: [number, PMF][], eps = EPS): PMF {\n // Treat tiny/negative as zero; keep performance clean\n const filtered = weights.filter(([w]) => w > eps);\n\n if (filtered.length === 0) {\n return PMF.emptyMass(); // not PMF.zero(): we want \"no mass\" mixture\n }\n\n // No need to normalize up front; we accumulate and blend by relative weight\n let acc: PMF | null = null;\n let sum = 0;\n\n for (const [w, pmf] of filtered) {\n if (acc === null) {\n acc = pmf;\n sum = w;\n } else {\n const q = w / (sum + w); // relative weight of the new component\n acc = PMF.branch(pmf, acc, q); // success=new pmf, failure=acc\n sum += w;\n }\n }\n\n // If everything got filtered out (all ~0), return empty mass\n return acc ?? PMF.emptyMass();\n }\n\n // This is a convenience method for when we use power\n // TODO: It can be smarter in the future, and we can also add it to query\n // That way statistics operations on invalid PMFs can throw an error\n // TODO… how can we detect if manually merging two queries' combined PMFs, as that loses provenance?\n private setPreservedProvenance(preserved: boolean) {\n if (!this._preservedProvenance && preserved) {\n throw new Error(\n \"Preserved provenance is already set to false, cannot fix that\"\n );\n }\n this._preservedProvenance = preserved;\n }\n\n public preservedProvenance(): boolean {\n return this._preservedProvenance;\n }\n\n private getPowerCacheKey(n: number, eps: number): string {\n // Includes fingerprint() (per-bin probability/count/attr content), matching convolve()'s\n // cache key: the identifier alone is not content-unique. `mapDamage`/`scaleDamage`,\n // `normalize()`, and `compact()` all keep the PARENT's identifier while producing a\n // numerically different PMF\n // (e.g. `X.mapDamage(f).power(2)` and `X.mapDamage(g).power(2)` would otherwise collide on\n // the same key `map(X)+map(X)@eps` and silently return each other's cached result).\n const id = this.identifier;\n let key = `${id}`;\n for (let i = 1; i < n; i++) key += `+${id}`;\n return `${key}@${eps}|${this.fingerprint()}`;\n }\n\n /**\n * Efficiently computes this PMF convolved with itself `n` times.\n * Uses exponentiation by squaring to reduce total convolutions.\n * n must be a positive integer.\n * *\n * * NOTE: This folds multiple independent attacks into a single PMF.\n * As a result, The power() method causes a loss of data provenance.\n * This is ONLY SAFE if you are trying to calculate masses.\n * If you want to query any atLeast probabilities, you should use the DiceQuery class instead without power().\n */\n power(n: number, eps = this.epsilon): PMF {\n if (!Number.isInteger(n) || n <= 0) {\n throw new Error(\"power(n): n must be a positive integer\");\n }\n if (n === 1) return this;\n\n const epsilon = eps ?? this.epsilon;\n\n const key = this.getPowerCacheKey(n, epsilon);\n if (cacheEnabled) {\n const cached = pmfCache?.get(key);\n if (cached) return cached;\n }\n\n // Start from the base PMF and accumulate n-1 additional powers\n let base: PMF = this.normalized ? this : this.normalize();\n let result: PMF = base;\n let exp = n - 1;\n\n while (exp > 0) {\n if (exp & 1) {\n result = result.convolve(base, epsilon);\n }\n exp >>= 1;\n if (exp > 0) {\n base = base.convolve(base, epsilon);\n }\n }\n\n result.setPreservedProvenance(false);\n if (cacheEnabled) {\n pmfCache?.set(key, result);\n }\n return result;\n }\n\n /*\n * Helper for chaining multiple identical attacks\n */\n replicate(n: number): PMF[] {\n if (!Number.isInteger(n) || n <= 0) {\n throw new Error(\"replicate(n): n must be a positive integer\");\n }\n if (n === 1) return [this];\n return Array.from({ length: n }, () => this);\n }\n\n mass(): number {\n if (this._totalMass === undefined) {\n let totalProbabilityMass = 0;\n for (const { p } of this.map.values()) {\n totalProbabilityMass += p;\n }\n this._totalMass = totalProbabilityMass;\n }\n return this._totalMass;\n }\n\n outcomeMass(outcome: string): number {\n let totalProbabilityMass = 0;\n for (const { p, count } of this.map.values()) {\n totalProbabilityMass += p * ((count[outcome] as number) ?? 0);\n }\n return totalProbabilityMass;\n }\n\n // Helper for testing\n faceTotal(): number {\n return [...this.map.keys()].reduce((sum, key) => sum + key, 0);\n }\n\n normalize(): PMF {\n if (this.normalized) return this;\n const normalizationFactor = this.mass();\n if (normalizationFactor === 0) return this;\n\n // Note: this divides by normalizationFactor rather than multiplying by its\n // reciprocal, to keep results bit-identical to direct division.\n const normalizedMap = new Map<number, Bin>();\n for (const [damageValue, probabilityBin] of this.map) {\n const normalizedCount: OutcomeLabelMap = {};\n for (const labelKey in probabilityBin.count) {\n normalizedCount[labelKey] =\n (probabilityBin.count[labelKey] as number) / normalizationFactor;\n }\n\n let normalizedAttributes: OutcomeLabelMap | undefined;\n if (probabilityBin.attr) {\n normalizedAttributes = {};\n for (const labelKey in probabilityBin.attr) {\n normalizedAttributes[labelKey] =\n (probabilityBin.attr[labelKey] as number) / normalizationFactor;\n }\n }\n\n normalizedMap.set(damageValue, {\n p: probabilityBin.p / normalizationFactor,\n count: normalizedCount,\n attr: normalizedAttributes,\n });\n }\n return new PMF(normalizedMap, this.epsilon, true, this.identifier);\n }\n\n /**\n * Returns a copy with negligible probabilities removed (p < eps).\n * If keepFinalBin is true, the bin with the largest key is always kept,\n * even if its probability is below eps. count/attr submaps are still cleaned.\n */\n compact(eps = this.epsilon, keepFinalBin = false): PMF {\n let maxKey = -Infinity;\n if (keepFinalBin) {\n for (const key of this.map.keys()) {\n if (key > maxKey) maxKey = key;\n }\n }\n\n const compactedMap = new Map<number, Bin>();\n\n for (const [damageValue, probabilityBin] of this.map) {\n const shouldKeep =\n probabilityBin.p >= eps || (keepFinalBin && damageValue === maxKey);\n\n if (!shouldKeep) continue;\n\n // Build a fresh Bin rather than mutating the source. Bins are shared by\n // reference across PMFs (e.g. branch()/addScaled()/scaleMass() fast paths\n // can carry another PMF's bin objects), so deleting sub-eps entries in\n // place would silently corrupt the source PMF's count/attr.\n const cleanedBin = PMF.cloneBin(probabilityBin);\n\n for (const labelKey in cleanedBin.count) {\n if (Math.abs(cleanedBin.count[labelKey] || 0) < eps) {\n delete cleanedBin.count[labelKey];\n }\n }\n\n if (cleanedBin.attr) {\n for (const labelKey in cleanedBin.attr) {\n if (Math.abs(cleanedBin.attr[labelKey] || 0) < eps) {\n delete cleanedBin.attr[labelKey];\n }\n }\n if (Object.keys(cleanedBin.attr).length === 0) {\n cleanedBin.attr = undefined;\n }\n }\n\n compactedMap.set(damageValue, cleanedBin);\n }\n\n return new PMF(compactedMap, eps, this.normalized, this.identifier);\n }\n\n // Note: The \"support\" of a PMF is the set of all non-zero probability outcomes.\n // This returns all damage values with non-zero probability, sorted ascending.\n support(): number[] {\n if (this._support === undefined) {\n this._support = [...this.map.keys()].sort((a, b) => a - b);\n }\n return this._support!;\n }\n\n // Minimum possible damage value.\n min(): number {\n if (this._min === undefined) {\n const support = this.support();\n this._min = support.length > 0 ? support[0] : 0;\n }\n return this._min;\n }\n\n // Maximum possible damage value.\n max(): number {\n if (this._max === undefined) {\n const support = this.support();\n this._max = support.length > 0 ? support[support.length - 1] : 0;\n }\n return this._max;\n }\n\n /**\n * Returns the expected (mean) damage value.\n * Cached for performance since this requires iterating through all bins.\n */\n mean(): number {\n if (this._mean === undefined) {\n let totalSum = 0;\n for (const [damageValue, probabilityBin] of this.map) {\n totalSum += damageValue * probabilityBin.p;\n }\n this._mean = totalSum;\n }\n return this._mean;\n }\n\n /**\n * Returns the variance of the damage distribution.\n * Cached for performance since this requires mean calculation plus iteration.\n */\n variance(): number {\n if (this._variance === undefined) {\n const meanValue = this.mean();\n let varianceSum = 0;\n for (const [damageValue, probabilityBin] of this.map) {\n const deviationFromMean = damageValue - meanValue;\n varianceSum += deviationFromMean * deviationFromMean * probabilityBin.p;\n }\n this._variance = varianceSum;\n }\n return this._variance;\n }\n\n /**\n * Returns the standard deviation of the damage distribution.\n */\n stdev(): number {\n if (this._stdev === undefined) {\n this._stdev = Math.sqrt(this.variance());\n }\n return this._stdev;\n }\n\n /** Deep-copies a Bin, cloning its count and (optional) attr maps. */\n private static cloneBin(bin: Bin): Bin {\n return {\n p: bin.p,\n count: { ...bin.count },\n attr: bin.attr ? { ...bin.attr } : undefined,\n };\n }\n\n /** Returns a new Bin with p, count, and attr all multiplied by `factor`. */\n private static scaleBin(bin: Bin, factor: number): Bin {\n const count: OutcomeLabelMap = {};\n for (const k in bin.count) {\n count[k] = (bin.count[k] as number) * factor;\n }\n\n let attr: OutcomeLabelMap | undefined;\n if (bin.attr) {\n attr = {};\n for (const k in bin.attr) {\n attr[k] = (bin.attr[k] as number) * factor;\n }\n }\n\n return { p: bin.p * factor, count, attr };\n }\n\n private static mergeInto(\n destinationMap: Map<number, Bin>,\n damageValue: number,\n binToAdd: Bin\n ) {\n const existingBin = destinationMap.get(damageValue);\n if (!existingBin) {\n destinationMap.set(damageValue, PMF.cloneBin(binToAdd));\n return;\n }\n\n existingBin.p += binToAdd.p;\n\n for (const labelKey in binToAdd.count) {\n existingBin.count[labelKey] =\n (existingBin.count[labelKey] || 0) +\n (binToAdd.count[labelKey] as number);\n }\n\n if (binToAdd.attr) {\n if (!existingBin.attr) {\n existingBin.attr = {};\n }\n for (const labelKey in binToAdd.attr) {\n existingBin.attr[labelKey] =\n (existingBin.attr[labelKey] || 0) +\n (binToAdd.attr[labelKey] as number);\n }\n }\n }\n\n // Convenience method\n add(other: PMF): PMF {\n return this.addScaled(other, 1);\n }\n\n /**\n * Returns a new PMF with a scaled branch added to this one.\n * The branch PMF is scaled by the given probability before merging\n * This will be very useful for conditional effects and for being\n * able to model \"I can probably have this opportunity attack 40% of rounds\"\n * Example: `pmf.addScaled(critBranch, 0.05)` → PMF including 5% crit outcomes\n */\n addScaled(branch: PMF, probability: number): PMF {\n if (probability === 0) return this;\n\n const resultMap = new Map<number, Bin>();\n for (const [dmg, bin] of this.map) {\n resultMap.set(dmg, PMF.cloneBin(bin));\n }\n\n for (const [damageValue, probabilityBin] of branch.map) {\n PMF.mergeInto(\n resultMap,\n damageValue,\n PMF.scaleBin(probabilityBin, probability)\n );\n }\n\n return new PMF(\n resultMap,\n this.epsilon,\n false,\n `${this.identifier}+scaled(${branch.identifier},${probability})`\n );\n }\n\n /**\n * Redistributes probability mass to model an effect that only occurs with\n * probability `frequency` — a conditional attack, an on-hit rider, or a\n * sub-one AoE target fraction.\n *\n * Every hit outcome (damage > 0) is scaled by `frequency` — probability mass,\n * per-label `count`, AND per-label `attr` — and the freed mass is moved into\n * the miss bin at damage 0, tagged with the canonical `missNone` outcome.\n * Total probability mass is preserved.\n *\n * Unlike a bare {@link scaleMass} or {@link mapDamage}, this keeps damage\n * attribution (`attr`) intact, so a frequency-scaled PMF still renders\n * correctly in the damage-attribution charts.\n *\n * `frequency >= 1` (or non-finite) returns this PMF unchanged; `frequency <= 0`\n * collapses all mass into the miss bin. The miss outcome is assumed to be\n * encoded at damage value 0.\n *\n * @param frequency Probability in [0, 1] that the effect occurs.\n */\n applyHitFrequency(frequency: number): PMF {\n if (!Number.isFinite(frequency) || frequency >= 1) return this;\n const freq = Math.max(0, frequency);\n\n const pMiss = this.pAt(0);\n const pHit = 1 - pMiss;\n const newMissMass = pMiss + (1 - freq) * pHit;\n\n const newMap = new Map<number, Bin>();\n newMap.set(0, {\n p: newMissMass,\n count: { [MISS_NONE_OUTCOME]: newMissMass },\n attr: {},\n });\n\n for (const [damage, bin] of this.map) {\n if (damage <= 0) continue;\n newMap.set(damage, PMF.scaleBin(bin, freq));\n }\n\n return new PMF(\n newMap,\n this.epsilon,\n false,\n `freq(${this.identifier},${freq})`\n );\n }\n\n scaleMass(factor: number): PMF {\n if (factor === 1) return this;\n\n const scaledMap = new Map<number, Bin>();\n for (const [damageValue, probabilityBin] of this.map) {\n scaledMap.set(damageValue, PMF.scaleBin(probabilityBin, factor));\n }\n return new PMF(\n scaledMap,\n this.epsilon,\n false,\n `scale(${this.identifier},${factor})`\n );\n }\n\n mapDamage(damageTransformFunction: (damageValue: number) => number): PMF {\n const transformedMap = new Map<number, Bin>();\n for (const [originalDamage, probabilityBin] of this.map) {\n const transformedDamage = damageTransformFunction(originalDamage);\n PMF.mergeInto(\n transformedMap,\n transformedDamage,\n PMF.cloneBin(probabilityBin)\n );\n }\n return new PMF(\n transformedMap,\n this.epsilon,\n this.normalized,\n `map(${this.identifier})`\n );\n }\n\n scaleDamage(\n factor: number,\n rounding: \"floor\" | \"round\" | \"ceil\" = \"floor\"\n ): PMF {\n const roundFunction =\n rounding === \"round\"\n ? Math.round\n : rounding === \"ceil\"\n ? Math.ceil\n : Math.floor;\n return this.mapDamage((damageValue) => roundFunction(damageValue * factor));\n }\n\n private getPMFCombineCacheKey(\n p1: PMF,\n p2: PMF,\n eps: number,\n raw: boolean\n ): string {\n const [id1, id2] = [p1.identifier, p2.identifier].sort();\n\n return `v4:${raw ? \"RAW\" : \"N\"}:${id1}+${id2}@${eps}|${p1.fingerprint()}|${p2.fingerprint()}`;\n }\n\n /**\n * A content fingerprint of every bin (probability, per-label `count`, per-label `attr`) plus\n * the `normalized` flag, so convolution/power cache keys change whenever the underlying\n * numbers do. Mass/bin-count/face-sum alone are not content-unique: `mapDamage` variants can\n * keep the same identifier, support, mass, and face sum while differing in per-bin\n * probabilities or in the `count`/`attr` channels `convolve()`/`power()` actually propagate --\n * that previously let `power()` return one PMF's cached result for a different PMF. Memoized\n * because a PMF is immutable once constructed -- this avoids re-deriving the key on every\n * convolve()/power() call (including cache hits). Bin order is sorted by damage value (and\n * label keys sorted within each bin) so two equal-content PMFs built via different code paths\n * fingerprint identically regardless of Map insertion order.\n */\n fingerprint(): string {\n if (this._fingerprint === undefined) {\n const bins = [...this.map.entries()].sort((a, b) => a[0] - b[0]);\n const parts: string[] = [];\n for (const [damageValue, bin] of bins) {\n const countStr = Object.keys(bin.count)\n .sort()\n .map((k) => `${k}:${bin.count[k]}`)\n .join(\",\");\n const attrStr = bin.attr\n ? Object.keys(bin.attr)\n .sort()\n .map((k) => `${k}:${(bin.attr as OutcomeLabelMap)[k]}`)\n .join(\",\")\n : \"\";\n parts.push(`${damageValue}:${bin.p}[${countStr}]{${attrStr}}`);\n }\n this._fingerprint = `${this.normalized ? 1 : 0}|${parts.join(\";\")}`;\n }\n return this._fingerprint;\n }\n\n convolve(other: PMF, eps?: number, raw = false): PMF {\n const epsilon = eps ?? this.epsilon;\n\n // Normalize-by-value on non-raw path\n const norm = (x: PMF) =>\n raw ? x : Math.abs(x.mass() - 1) <= epsilon ? x : x.normalize();\n const A0 = norm(this);\n const B0 = norm(other);\n\n const [A, B] = A0.identifier <= B0.identifier ? [A0, B0] : [B0, A0];\n const cacheKey = this.getPMFCombineCacheKey(A, B, epsilon, raw);\n const cached = pmfCache?.get(cacheKey);\n if (cached) return cached;\n\n // Accumulate directly into each destination bin instead of building a\n // temporary Bin per (a,b) pair and merging it. The probability channel\n // (`dest.p += ap*bp`) accumulates in the same order as before, so it is\n // bit-identical; only the per-label `count`/`attr` sums re-associate, which\n // shifts them by at most a few ULP (far below the eps pruning threshold).\n const combinedMap = new Map<number, Bin>();\n for (const [aVal, aBin] of A.map) {\n const ap = aBin.p;\n const aCount = aBin.count;\n const aAttr = aBin.attr;\n for (const [bVal, bBin] of B.map) {\n const bp = bBin.p;\n const dmg = aVal + bVal;\n\n let dest = combinedMap.get(dmg);\n if (dest === undefined) {\n dest = { p: 0, count: {} };\n combinedMap.set(dmg, dest);\n }\n\n dest.p += ap * bp;\n\n const dc = dest.count;\n for (const k in aCount) dc[k] = (dc[k] || 0) + (aCount[k] as number) * bp;\n for (const k in bBin.count)\n dc[k] = (dc[k] || 0) + (bBin.count[k] as number) * ap;\n\n if (aAttr || bBin.attr) {\n let da = dest.attr;\n if (da === undefined) {\n da = {};\n dest.attr = da;\n }\n if (aAttr)\n for (const k in aAttr) da[k] = (da[k] || 0) + (aAttr[k] as number) * bp;\n if (bBin.attr)\n for (const k in bBin.attr)\n da[k] = (da[k] || 0) + (bBin.attr[k] as number) * ap;\n }\n }\n }\n\n let result = new PMF(\n combinedMap,\n epsilon,\n !raw,\n `${A.identifier}${raw ? \"*\" : \"+\"}${B.identifier}`\n );\n\n // Enforce mass invariant: mass(out) = (raw? A.mass():1) * (raw? B.mass():1)\n const mExp = (raw ? A.mass() : 1) * (raw ? B.mass() : 1);\n const mGot = result.mass();\n // Guard mGot !== 0: a zero-mass operand convolves to the zero measure\n // (mass 0). Without this guard the non-raw path would scaleMass(mExp/0) =\n // scaleMass(Infinity), poisoning every bin to 0*Infinity = NaN.\n if (mExp !== 0 && mGot !== 0 && Math.abs(mGot - mExp) > epsilon) {\n result = result.scaleMass(mExp / mGot);\n }\n if (!raw && mGot !== 0 && Math.abs(result.mass() - 1) > epsilon)\n result = result.normalize();\n\n pmfCache?.set(cacheKey, result);\n return result;\n }\n\n // 3) Nice wrapper so you can call pmf.combineRaw(other)\n combineRaw(other: PMF, eps?: number): PMF {\n return this.convolve(other, eps, true);\n }\n\n // Reduce a list of PMFs by left-folding convolve() with the given eps\n private static reduceConvolveLeft(pmfList: PMF[], eps: number): PMF {\n let result = pmfList[0];\n for (let i = 1; i < pmfList.length; i++) {\n result = result.convolve(pmfList[i], eps);\n }\n return result;\n }\n\n /**\n * Convolves multiple PMFs using linear convolution with automatic caching.\n * Uses a left-to-right accumulation approach for maximum cache reuse.\n * Each convolve() call automatically uses the convolution cache for performance.\n *\n * This linear approach provides better cache hits than pairwise because:\n * - Intermediate results are more predictable and stable\n * - Similar PMF lists share common prefixes (A+B, (A+B)+C, etc.)\n * - Order-independent cache keys work better with consistent build patterns\n */\n static convolveMany(pmfList: PMF[], eps = EPS): PMF {\n if (pmfList.length === 0) return PMF.empty(eps);\n if (pmfList.length === 1) return pmfList[0];\n\n // Linear combination with automatic intermediate caching: each prefix\n // (A+B, (A+B)+C, ...) is a stable cache key, maximizing reuse.\n return PMF.reduceConvolveLeft(pmfList, eps);\n }\n\n /**\n * Returns a plain, JSON-serializable representation of this PMF.\n *\n * Follows the standard `toJSON` contract, so `JSON.stringify(pmf)` produces\n * the expected output (no double-encoding). Use {@link PMF.fromJSON} to\n * reconstruct, or {@link PMF.toJSONString} if you need the string directly.\n */\n toJSON(): {\n bins: Array<[number, Bin]>;\n normalized: boolean;\n identifier: string;\n } {\n return {\n bins: [...this.map.entries()],\n normalized: this.normalized,\n identifier: this.identifier,\n };\n }\n\n /** Serializes this PMF to a JSON string (equivalent to `JSON.stringify(pmf)`). */\n toJSONString(): string {\n return JSON.stringify(this);\n }\n\n static fromJSON(jsonData: {\n bins: Array<[number, Bin]>;\n normalized?: boolean;\n identifier?: string;\n }) {\n return new PMF(\n new Map(jsonData.bins),\n EPS,\n !!jsonData.normalized,\n jsonData.identifier || \"fromJSON\"\n );\n }\n\n /**\n * Relative pruning with optional top-K floor.\n * Keeps bins with p >= epsRel * peak, always keeps min and max damage,\n * optionally guarantees at least `minBins` survivors by adding top-K.\n * Returns a new, non-normalized PMF.\n */\n prune(epsRel: number, minBins = 0): PMF {\n const size = this.map.size;\n if (size === 0) return this;\n\n // One pass: peak, min, max\n let peak = 0;\n let minDamage = Number.POSITIVE_INFINITY;\n let maxDamage = Number.NEGATIVE_INFINITY;\n for (const [dmg, bin] of this.map) {\n if (bin.p > peak) peak = bin.p;\n if (dmg < minDamage) minDamage = dmg;\n if (dmg > maxDamage) maxDamage = dmg;\n }\n if (peak === 0)\n return new PMF(new Map(this.map), epsRel, false, this.identifier);\n\n const thresh = epsRel * peak;\n const entries = [...this.map.entries()];\n\n // Protect endpoints\n const survivorsByDmg = new Map<number, Bin>();\n const protect = (d: number) => {\n const b = this.map.get(d);\n if (b) survivorsByDmg.set(d, b);\n };\n protect(minDamage);\n if (maxDamage !== minDamage) protect(maxDamage);\n\n // Relative survivors\n for (const [dmg, bin] of entries) {\n if (bin.p >= thresh) survivorsByDmg.set(dmg, bin);\n }\n\n // Enforce minBins via top-K if requested\n if (minBins > 0 && survivorsByDmg.size < minBins) {\n // Sort all entries by probability desc (or replace with Quickselect for O(n))\n entries.sort((a, b) => b[1].p - a[1].p);\n for (const [dmg, bin] of entries) {\n if (!survivorsByDmg.has(dmg)) {\n survivorsByDmg.set(dmg, bin);\n if (survivorsByDmg.size >= minBins) break;\n }\n }\n }\n\n // Rebuild map, pruning tiny count/attr entries with the same threshold\n const prunedMap = new Map<number, Bin>();\n for (const [dmg, bin] of survivorsByDmg) {\n const newCount: OutcomeLabelMap = {};\n for (const k in bin.count) {\n const v = bin.count[k] as number;\n if (Math.abs(v) >= thresh) newCount[k] = v;\n }\n let newAttr: OutcomeLabelMap | undefined;\n if (bin.attr) {\n for (const k in bin.attr) {\n const v = bin.attr[k] as number;\n if (Math.abs(v) >= thresh) {\n if (!newAttr) newAttr = {};\n newAttr[k] = v;\n }\n }\n }\n prunedMap.set(dmg, { p: bin.p, count: newCount, attr: newAttr });\n }\n\n // Return non-normalized PMF\n return new PMF(prunedMap, epsRel, false, `prune(${this.identifier})`);\n }\n\n /** Probability mass at exactly x. */\n pAt(x: number): number {\n return this.map.get(x)?.p ?? 0;\n }\n\n /**\n * P(any damage) — the mass on all non-zero outcomes, i.e. `1 - P(0)`.\n * Assumes a miss is encoded as the damage-0 bin (the convention used across\n * attack/save PMFs). The dual of {@link missProbability}.\n */\n hitProbability(): number {\n return 1 - this.pAt(0);\n }\n\n /** P(no damage) — the mass at damage 0. The dual of {@link hitProbability}. */\n missProbability(): number {\n return this.pAt(0);\n }\n\n /**\n * Coarsen the distribution into at most `maxBuckets` contiguous, equal-width\n * damage buckets, aggregating probability mass (and `count`/`attr`\n * provenance) into each bucket's start value. Returns this PMF unchanged when\n * its integer support already fits within `maxBuckets`.\n *\n * This is a lossy display/downsampling transform (bucket start replaces the\n * exact damage value) — use it for charting wide distributions, not for DPR\n * math.\n */\n rebin(maxBuckets: number): PMF {\n if (!(maxBuckets > 0)) return this;\n const support = this.support();\n if (support.length === 0) return this;\n const min = support[0];\n const max = support[support.length - 1];\n const range = max - min;\n if (range + 1 <= maxBuckets) return this;\n const binSize = Math.ceil((range + 1) / maxBuckets);\n return this.mapDamage((d) => min + Math.floor((d - min) / binSize) * binSize);\n }\n\n /** Dense integer support from min..max (inclusive).\n * Useful for showing empty bars in charts.\n */\n denseSupport(): number[] {\n const s = this.support();\n if (s.length === 0) return [];\n const lo = Math.min(...s),\n hi = Math.max(...s);\n return Array.from({ length: hi - lo + 1 }, (_, i) => lo + i).sort(\n (a, b) => a - b\n );\n }\n\n /** CDF at x: P(X ≤ x). */\n cdfAt(x: number): number {\n let acc = 0;\n for (const [val, bin] of this.map) if (val <= x) acc += bin.p;\n return acc;\n }\n\n /** Quantile / inverse CDF for p in [0,1]. Returns smallest x with CDF ≥ p. */\n quantile(p: number): number {\n if (this.map.size === 0) return 0;\n const totalMass = this.mass();\n if (totalMass <= 0) return 0;\n const s = this.support().sort((a, b) => a - b);\n let acc = 0;\n for (const x of s) {\n acc += this.pAt(x);\n if (acc / totalMass >= p) return x;\n }\n return s[s.length - 1];\n }\n\n /** Get outcome probability at specific damage value. */\n outcomeAt(damage: number, outcome: string): number {\n return (this.map.get(damage)?.count[outcome] as number) ?? 0;\n }\n\n /** Get all outcome types present in this PMF. */\n outcomes(): string[] {\n const outcomeSet = new Set<string>();\n for (const [, bin] of this.map) {\n for (const outcome in bin.count) {\n if ((bin.count[outcome] as number) > 0) {\n outcomeSet.add(outcome);\n }\n }\n }\n return Array.from(outcomeSet).sort();\n }\n\n /** Get total probability of an outcome across all damage values. */\n outcomeProbability(outcome: string): number {\n let total = 0;\n for (const [, bin] of this.map) {\n total += (bin.count[outcome] as number) ?? 0;\n }\n return total;\n }\n\n /** Get damage attribution for an outcome at specific damage value. */\n outcomeAttributionAt(damage: number, outcome: string): number {\n return (this.map.get(damage)?.attr?.[outcome] as number) ?? 0;\n }\n\n /** Get all outcome data at specific damage value. */\n binAt(damage: number): {\n p: number;\n count: Record<string, number>;\n attr?: Record<string, number>;\n } | null {\n const bin = this.map.get(damage);\n if (!bin) return null;\n\n return {\n p: bin.p,\n count: { ...bin.count } as Record<string, number>,\n attr: bin.attr ? ({ ...bin.attr } as Record<string, number>) : undefined,\n };\n }\n\n /** Check if outcome exists in this PMF. */\n hasOutcome(outcome: string): boolean {\n for (const [, bin] of this.map) {\n if (((bin.count[outcome] as number) ?? 0) > 0) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Split each damage value's probability mass across outcome labels, returning\n * per-label maps of `damage value → probability mass attributable to that\n * label`. Summing over labels at a given value recovers that value's `p`.\n *\n * Damage-bearing bins are split by `attr` weight (the share of damage each\n * outcome contributed); the clean-miss bin at 0 is split by `count` weight\n * (there is no damage to attribute). Attribution is computed on demand via\n * {@link withAttribution} when absent, so builder-generated PMFs work too.\n *\n * This is the provenance core of the stacked damage-attribution chart — the\n * caller only maps these series into its rendering format (colors, binning,\n * axis labels).\n */\n attributionByValue(): Map<string, Map<number, number>> {\n const src = this.hasAttribution() ? this : this.withAttribution();\n const result = new Map<string, Map<number, number>>();\n\n const add = (label: string, damage: number, mass: number): void => {\n if (!(mass > 0)) return;\n let series = result.get(label);\n if (!series) {\n series = new Map<number, number>();\n result.set(label, series);\n }\n series.set(damage, (series.get(damage) ?? 0) + mass);\n };\n\n for (const [damage, bin] of src.map) {\n const p = bin.p || 0;\n if (p <= 0) continue;\n const isMissBin = damage === 0;\n\n // Damage-0 (clean miss): split by count, crediting the missNone label.\n if (isMissBin) {\n let totalCount = 0;\n for (const k in bin.count) totalCount += (bin.count[k] as number) || 0;\n if (totalCount > 0) {\n const c = (bin.count[MISS_NONE_OUTCOME] as number) || 0;\n add(MISS_NONE_OUTCOME, damage, (c / totalCount) * p);\n }\n continue;\n }\n\n // Damage-bearing bin: split by attribution weight.\n let totalAttr = 0;\n if (bin.attr) for (const k in bin.attr) totalAttr += (bin.attr[k] as number) || 0;\n if (bin.attr && totalAttr > 0) {\n for (const k in bin.attr) {\n if (k === MISS_NONE_OUTCOME) continue;\n add(k, damage, (((bin.attr[k] as number) || 0) / totalAttr) * p);\n }\n }\n }\n\n return result;\n }\n\n /**\n * Reversed-convention CCDF percentile markers used by the attribution chart:\n * for each target probability t, the largest damage x still reached with\n * P(X ≥ x) > t%, falling back to the smallest/largest support value at the\n * edges. Ported verbatim from the app so `p80/p50/p20` keep their intentional\n * reversed meaning (p80 is the low-damage end). Computed on the full, un-binned\n * support. Assumes a non-empty map.\n */\n private attributionPercentiles(): { p80: number; p50: number; p20: number } {\n const sortedKeys = [...this.map.keys()].sort((a, b) => a - b);\n const sparseCCDF: { x: number; y: number }[] = [];\n let cumulativeP = 0;\n for (let i = sortedKeys.length - 1; i >= 0; i--) {\n const key = sortedKeys[i];\n const bin = this.map.get(key);\n if (!bin) continue;\n cumulativeP += bin.p;\n sparseCCDF.unshift({ x: key, y: cumulativeP * 100 });\n }\n const findDamageAtProbability = (targetProb: number): number => {\n for (let i = 0; i < sparseCCDF.length; i++) {\n if (sparseCCDF[i].y <= targetProb) {\n return i > 0 ? sparseCCDF[i - 1].x : sparseCCDF[i].x;\n }\n }\n return sparseCCDF[sparseCCDF.length - 1].x;\n };\n return {\n p80: findDamageAtProbability(80),\n p50: findDamageAtProbability(50),\n p20: findDamageAtProbability(20),\n };\n }\n\n /**\n * Full numeric model for the stacked damage-attribution chart — bar-height\n * masses, tooltip shares, bucket labels/ranges, percentile markers, and the\n * mean. The caller only maps these into a rendering format (colors, labels,\n * axis units); all of the dice-and-probability logic lives here.\n *\n * Built split-first-then-bin: the attribution split ({@link attributionByValue})\n * runs on the un-binned distribution, then the resulting series are coarsened.\n * {@link rebin} is deliberately *not* used — rebinning first would fold any\n * sub-`binSize` damage into the damage-0 bucket, which the split then mistakes\n * for a clean miss and drops.\n *\n * @param options.maxBuckets Coarsen to at most this many equal-width buckets\n * when the integer support is wider (`range > maxBuckets`); omit for a dense,\n * per-integer model.\n * @param options.stackOrder Preferred outcome order (defaults to\n * {@link ALL_OUTCOME_TYPES}); labels outside it sort alphabetically after.\n * @param options.epsilon Bucket-total floor below which a `shares` entry is 0\n * (divide-by-~0 guard). Defaults to 1e-9.\n */\n damageAttributionChartModel(\n options: {\n maxBuckets?: number;\n stackOrder?: readonly string[];\n epsilon?: number;\n } = {}\n ): DamageAttributionChartModel {\n const { maxBuckets, stackOrder = ALL_OUTCOME_TYPES, epsilon = 1e-9 } = options;\n\n const empty: DamageAttributionChartModel = {\n labels: [],\n outcomes: [],\n series: new Map(),\n shares: new Map(),\n totals: [],\n percentiles: { p80: 0, p50: 0, p20: 0 },\n mean: 0,\n };\n if (this.map.size === 0) return empty;\n\n // Split on the un-binned distribution: outcome → (damage → probability mass).\n const split = this.attributionByValue();\n\n // Discover outcomes across BOTH count and attr keys so any all-zero legend\n // entries survive (matches the app's discovery), then order for stacking.\n const discovered = new Set<string>();\n for (const [, bin] of this.map) {\n for (const k in bin.count) discovered.add(k);\n if (bin.attr) for (const k in bin.attr) discovered.add(k);\n }\n const outcomes = sortOutcomes([...discovered], stackOrder);\n const hasAttribution = outcomes.length > 0;\n\n // Support window over values carrying positive mass (the app's allDamageValues):\n // from the split for attributed PMFs, from positive-p bins for pure ones.\n let min = Infinity;\n let max = -Infinity;\n const widen = (d: number): void => {\n if (d < min) min = d;\n if (d > max) max = d;\n };\n if (hasAttribution) {\n for (const s of split.values())\n for (const [d, m] of s) if (m > 0) widen(d);\n } else {\n for (const [d, bin] of this.map) if ((bin.p || 0) > 0) widen(d);\n }\n if (max < min) return empty; // nothing carried positive mass\n const range = max - min;\n\n // Binning geometry — dense (per-integer) unless range > maxBuckets.\n const binned =\n maxBuckets !== undefined && maxBuckets > 0 && range > maxBuckets;\n const binSize = binned ? Math.ceil((range + 1) / maxBuckets!) : 1;\n const numBins = binned ? Math.ceil((range + 1) / binSize) : range + 1;\n const bucketOf = (d: number): number => Math.floor((d - min) / binSize);\n\n const labels: number[] = [];\n const binRanges: { start: number; end: number }[] | undefined = binned\n ? []\n : undefined;\n for (let i = 0; i < numBins; i++) {\n const start = min + i * binSize;\n labels.push(start);\n if (binRanges)\n binRanges.push({ start, end: Math.min(start + binSize - 1, max) });\n }\n\n // Aggregate per-outcome masses into buckets.\n const series = new Map<string, number[]>();\n for (const outcome of outcomes) {\n const arr = new Array<number>(numBins).fill(0);\n const s = split.get(outcome);\n if (s) {\n for (const [d, m] of s) {\n const b = bucketOf(d);\n if (b >= 0 && b < numBins) arr[b] += m;\n }\n }\n series.set(outcome, arr);\n }\n\n // Per-bucket totals: sum of the attributed series, or (pure) of raw p.\n const totals = new Array<number>(numBins).fill(0);\n if (hasAttribution) {\n for (const arr of series.values())\n for (let i = 0; i < numBins; i++) totals[i] += arr[i];\n } else {\n for (const [d, bin] of this.map) {\n const p = bin.p || 0;\n if (p <= 0) continue;\n const b = bucketOf(d);\n if (b >= 0 && b < numBins) totals[b] += p;\n }\n }\n\n // Conditional shares for tooltips (guarded against a ~zero bucket total).\n const shares = new Map<string, number[]>();\n for (const outcome of outcomes) {\n const arr = series.get(outcome)!;\n const sh = new Array<number>(numBins).fill(0);\n for (let i = 0; i < numBins; i++) {\n sh[i] = totals[i] > epsilon ? arr[i] / totals[i] : 0;\n }\n shares.set(outcome, sh);\n }\n\n return {\n labels,\n binRanges,\n outcomes,\n series,\n shares,\n totals,\n percentiles: this.attributionPercentiles(),\n mean: this.mean(),\n };\n }\n\n tailProbGE(t: number): number {\n let s = 0;\n for (const [x, bin] of this) {\n if (bin.p > 0 && x >= t) s += bin.p;\n }\n return s;\n }\n\n tailProbGT(t: number): number {\n let s = 0;\n for (const [x, rec] of this) {\n if (x > t) s += rec.p;\n }\n return s;\n }\n\n /**\n * Returns a new PMF containing only bins where the specified outcome has non-zero probability.\n * This creates a marginal distribution for the given outcome type, with probabilities\n * scaled to represent the unconditional mass attributable to that outcome.\n */\n filterOutcome(outcome: string): PMF {\n const filteredMap = new Map<number, Bin>();\n\n for (const [damageValue, bin] of this.map) {\n const outcomeCount = (bin.count[outcome] as number) ?? 0;\n\n // total paths that reached this bin (sum across labels)\n const totalCount = Object.values(bin.count ?? {}).reduce(\n (a, b) => (a ?? 0) + ((b as number) ?? 0),\n 0\n );\n\n if (outcomeCount > 0 && totalCount !== undefined && totalCount > 0) {\n // proportion of this bin's mass attributable to the outcome\n const proportion = outcomeCount / totalCount;\n\n // downweight p to the unconditional mass from the outcome only\n const newP = bin.p * proportion;\n\n const newCount: OutcomeLabelMap = { [outcome]: outcomeCount };\n\n let newAttr: OutcomeLabelMap | undefined;\n if (bin.attr && bin.attr[outcome] !== undefined) {\n // If attr is a count-like accumulator, scale it too.\n // If attr is already per-outcome only, you can just carry it over.\n newAttr = { [outcome]: (bin.attr[outcome] as number) * proportion };\n }\n\n filteredMap.set(damageValue, {\n p: newP,\n count: newCount,\n attr: newAttr,\n });\n }\n }\n\n return new PMF(\n filteredMap,\n this.epsilon,\n false, // don't normalize by default\n `filter(${this.identifier},${outcome})`\n );\n }\n /**\n * Calculates probabilities for first-success outcomes across n independent attempts.\n *\n * @param pSuccess - Total probability of any success on a single attempt.\n * @param pSpecial - Probability of a specific subset of successes (e.g., critical success).\n * @param n - Number of independent attempts.\n *\n * Returns:\n * - pSpecificSuccess: Probability that the first success was of the \"special\" type\n * - pGeneralSuccess: Probability that the first success was of the non-special type\n * - pNone: Probability that no successes occurred\n * - pAny: Probability that at least one success occurred\n */\n public static firstSuccessWeights(\n pSuccess: number,\n pSpecial: number,\n n: number\n ) {\n // Preconditions: the \"special\" successes are a subset of all successes, so\n // 0 <= pSpecial <= pSuccess <= 1. Without this guard, violating inputs\n // silently produce probabilities outside [0,1].\n if (\n !Number.isFinite(pSuccess) ||\n !Number.isFinite(pSpecial) ||\n pSuccess < 0 ||\n pSuccess > 1 ||\n pSpecial < 0 ||\n pSpecial - pSuccess > EPS\n ) {\n throw new Error(\n `firstSuccessWeights: require 0 <= pSpecial <= pSuccess <= 1 (got pSuccess=${pSuccess}, pSpecial=${pSpecial})`\n );\n }\n\n const pFail = 1 - pSuccess;\n const pFailAll = Math.pow(pFail, n);\n\n // Probability of at least one success\n const pAny = 1 - pFailAll;\n\n // Avoid divide-by-zero if pSuccess is 0\n const denom = pSuccess === 0 ? 1 : pSuccess;\n\n // Breakdown of first success type\n const pSpecificSuccess = (pSpecial * pAny) / denom;\n const pGeneralSuccess = ((pSuccess - pSpecial) * pAny) / denom;\n\n const pNone = 1 - pSpecificSuccess - pGeneralSuccess; // Should equal pFailAll\n\n return { pSpecificSuccess, pGeneralSuccess, pNone, pAny };\n }\n\n mapValues(\n f: (v: number) => number,\n eps: number = EPS,\n opts?: { rounding?: Rounding; preserveCounts?: boolean }\n ): PMF {\n const rounding = opts?.rounding ?? \"none\";\n const preserveCounts = opts?.preserveCounts ?? true;\n\n const round = (x: number) =>\n rounding === \"floor\"\n ? Math.floor(x)\n : rounding === \"ceil\"\n ? Math.ceil(x)\n : rounding === \"round\"\n ? Math.round(x)\n : x;\n\n // Accumulate probs and merged counts\n const probs = new Map<number, number>();\n const counts = new Map<number, Record<string, number>>();\n\n for (const [v, bin] of this) {\n if (Math.abs(bin.p) < eps) continue;\n const u = round(f(v));\n probs.set(u, (probs.get(u) ?? 0) + bin.p);\n\n if (preserveCounts) {\n // Merge counts if present\n const src = bin.count;\n if (src) {\n const dest = counts.get(u) ?? {};\n for (const k in src) {\n dest[k] = (dest[k] ?? 0) + (src[k] as number);\n }\n counts.set(u, dest);\n }\n }\n }\n\n // Build PMF with merged counts, then normalize\n const internal = new Map<number, Bin>();\n for (const [u, p] of probs) {\n internal.set(u, { p, count: counts.get(u) ?? {} });\n }\n // Normalize via pmfFromMap to keep one source of truth\n return PMF.fromMap(\n new Map(Array.from(internal, ([u, b]) => [u, b.p] as [number, number])),\n eps\n );\n }\n\n static fromMap(\n m: Map<number, number>,\n eps: number = EPS,\n { requireIntegerValues = true }: { requireIntegerValues?: boolean } = {}\n ): PMF {\n const filtered: Array<[number, number]> = [];\n for (const [v, p] of m) {\n if (!Number.isFinite(v) || !Number.isFinite(p)) continue;\n if (p <= 0 || Math.abs(p) < eps) continue;\n if (requireIntegerValues && !Number.isInteger(v)) {\n throw new Error(`fromMap: non-integer outcome ${v}`);\n }\n filtered.push([v, p]);\n }\n\n if (filtered.length === 0) {\n throw new Error(\"fromMap: empty or invalid input map\");\n }\n\n // Kahan sum for stability\n let sum = 0;\n let c = 0;\n for (const [, p] of filtered) {\n const y = p - c;\n const t = sum + y;\n c = t - sum - y;\n sum = t;\n }\n if (sum <= 0) throw new Error(\"pmfFromMap: probabilities sum to 0\");\n\n filtered.sort((a, b) => a[0] - b[0]);\n\n const internal = new Map<number, Bin>();\n for (const [v, p] of filtered) {\n internal.set(v, { p: p / sum, count: {} }); // keep count object present for consistency\n }\n return new PMF(internal, eps);\n }\n\n query(): DiceQuery {\n return new DiceQuery(this);\n }\n}\n","import type { Bin } from \"../common/types\";\nimport { EPS } from \"../common/types\";\nimport { PMF } from \"./pmf\";\n\n/** A labeled mixture builder that preserves provenance in Bin.count. */\nexport class Mixture<L extends string = string> {\n private readonly totals = new Map<number, number>(); // raw mass per outcome (pre-normalization)\n private readonly labelMass = new Map<number, Record<L, number>>(); // raw mass per outcome per label\n private readonly eps: number;\n\n constructor(eps: number = EPS) {\n this.eps = Number.isFinite(eps) ? eps : EPS;\n }\n\n /** Remove all accumulated state. */\n clear(): this {\n this.totals.clear();\n this.labelMass.clear();\n return this;\n }\n\n /** Number of distinct outcome values currently accumulated. */\n size(): number {\n return this.totals.size;\n }\n\n /** Whether a label was ever added. */\n hasLabel(label: L): boolean {\n for (const bag of this.labelMass.values()) if (bag[label]) return true;\n return false;\n }\n\n /**\n * Add a labeled component with a mixture weight.\n * Weight can be any positive finite number. Very small contributions are pruned by eps.\n */\n add(label: L, pmf: PMF, weight = 1): this {\n if (!Number.isFinite(weight) || weight <= 0) return this;\n\n // Stream probabilities from each [value, Bin] pair.\n for (const [v, bin] of pmf) {\n const p = bin.p;\n if (p <= 0) continue;\n\n const add = weight * p;\n if (!Number.isFinite(add) || Math.abs(add) < this.eps) continue;\n\n this.totals.set(v, (this.totals.get(v) ?? 0) + add);\n const bag = this.labelMass.get(v) ?? ({} as Record<L, number>);\n bag[label] = (bag[label] ?? 0) + add;\n this.labelMass.set(v, bag);\n }\n\n return this;\n }\n\n buildPMF(eps: number = EPS): PMF {\n // Kahan sum for robustness.\n let grand = 0;\n let c = 0;\n for (const m of this.totals.values()) {\n const y = m - c;\n const t = grand + y;\n c = t - grand - y;\n grand = t;\n }\n if (!(grand > 0)) throw new Error(\"Mixture: zero total mass\");\n\n const internal = new Map<number, Bin>();\n for (const [v, m] of this.totals) {\n if (m <= 0 || Math.abs(m) < this.eps) continue;\n const count = this.labelMass.get(v) ?? {};\n internal.set(v, { p: m / grand, count });\n }\n return new PMF(internal, eps);\n }\n\n /**\n * Produce normalized *per-label* PMFs (labels independent).\n * These are unlabeled PMFs built from the raw mass of that label alone.\n */\n byOutcome(): Record<L, PMF> {\n // Collect the set of labels present.\n const labels = new Set<L>();\n for (const bag of this.labelMass.values()) {\n for (const k of Object.keys(bag) as L[]) labels.add(k);\n }\n\n const out = {} as Record<L, PMF>;\n for (const label of labels) {\n const m = new Map<number, number>();\n for (const [v, bag] of this.labelMass) {\n const w = bag[label];\n if (w && Math.abs(w) >= this.eps) m.set(v, w);\n }\n if (m.size > 0) out[label] = PMF.fromMap(m, this.eps);\n }\n return out;\n }\n\n /**\n * Mixture weights per label, normalized to sum to 1 over labels that appeared.\n * Uses raw mass before per-outcome normalization.\n */\n weights(): Record<L, number> {\n const res = {} as Record<L, number>;\n for (const [, bag] of this.labelMass) {\n for (const [lab, w] of Object.entries(bag) as [L, number][]) {\n if (!Number.isFinite(w) || w <= 0) continue;\n res[lab] = (res[lab] ?? 0) + w;\n }\n }\n // Normalize\n let total = 0;\n let c = 0;\n for (const v of Object.values(res)) {\n const y = (v as number) - c;\n const t = total + y;\n c = t - total - y;\n total = t;\n }\n if (total > 0) {\n for (const k in res) res[k as L] = res[k as L] / total;\n }\n return res;\n }\n\n toJSON(): {\n totals: Array<[number, number]>;\n labels: Array<[number, Record<L, number>]>;\n eps: number;\n } {\n return {\n totals: Array.from(this.totals.entries()).sort((a, b) => a[0] - b[0]),\n labels: Array.from(this.labelMass.entries()).sort((a, b) => a[0] - b[0]),\n eps: this.eps,\n };\n }\n\n static mix<L extends string = string>(\n items: Array<[label: L, pmf: PMF, weight: number]>,\n eps: number = EPS\n ): PMF {\n const mix = new Mixture<L>(eps);\n for (const [lab, pmf, w] of items) mix.add(lab, pmf, w);\n return mix.buildPMF();\n }\n}\n","/**\n * Error thrown when a dice expression cannot be parsed.\n *\n * Extends the built-in {@link Error}, so existing `catch (e)` / message checks\n * continue to work, while callers can now narrow with `instanceof DiceParseError`.\n *\n * @example\n * try {\n * parse(\"d6@3\");\n * } catch (e) {\n * if (e instanceof DiceParseError) {\n * // e.expression === \"d6@3\"\n * }\n * }\n */\nexport class DiceParseError extends Error {\n /** The original expression that failed to parse, when available. */\n readonly expression?: string;\n\n /** The underlying error that triggered this one, when available. */\n readonly cause?: unknown;\n\n constructor(\n message: string,\n options?: { expression?: string; cause?: unknown }\n ) {\n super(message);\n this.name = \"DiceParseError\";\n this.expression = options?.expression;\n this.cause = options?.cause;\n // Restore the prototype chain for reliable `instanceof` across targets.\n Object.setPrototypeOf(this, DiceParseError.prototype);\n }\n}\n","// dice.ts (internal)\n\nimport { DiceParseError } from \"../common/errors\";\nimport type {\n Bin,\n DamageDistribution,\n OutcomeLabelMap,\n OutcomeType,\n} from \"../common/types\";\nimport { EPS } from \"../common/types\";\nimport { PMF } from \"../pmf/pmf\";\n\n/**\n * Work budget for a single dice×dice operation. binaryOp is O(faces₁ × faces₂),\n * so two individually-legal large dice (e.g. `d100000 + d100000`) would otherwise\n * enumerate ~10^10 face pairs and hang. The parser's per-die / per-count caps\n * bound each operand but not their product, so this bounds the operation itself.\n * Generous enough for any realistic expression; only pathological blow-ups trip\n * it. (Chosen so expressions well beyond normal use still parse; tune if needed.)\n */\nconst MAX_BINARY_OUTCOMES = 100_000_000;\n\n/** Internal bookkeeping attached to a {@link Dice} during parsing. */\nexport interface DicePrivateData {\n /** Marks a DC (saving-throw) check so outcomes are attributed correctly. */\n isDCCheck?: boolean;\n /** The \"other\" distribution recorded by {@link Dice.combine}. */\n except?: Dice | Record<string, never>;\n /** Keep-highest/lowest selector applied when a die is multiplied out. */\n keep?: (values: number[]) => number;\n /** Set on a freshly parsed flat `dN`/`hdN` atom: its own face count and whether it rerolls a\n * natural 1 once (Halfling Luck). Read by {@link parseExpression} in parser.ts to recover a\n * base check die's natural-max identity after it has been convolved with bonus to-hit dice\n * and modifiers, for a correct plain-`crit` probability. See parser.ts's \"Track a flat ...\n * base check die\" comment. */\n checkDie?: { sides: number; rerollOne: boolean };\n /** Set on the result of a tracked AC gate (see parser.ts): the exact \"natural max, any bonus\n * roll\" sub-distribution, already isolated from the rest of the to-hit total. A plain `crit`\n * clause reads this directly instead of peeling the combined expression's single highest\n * face, which is wrong whenever bonus dice are present. */\n natMaxCritSlice?: Dice;\n}\n\n/**\n * @internal\n */\nexport class Dice {\n private readonly faces: DamageDistribution = {};\n public privateData: DicePrivateData = {};\n // Partial: the object starts empty and gains keys as outcomes are recorded,\n // so the type must not claim every OutcomeType is present. (Previously typed\n // as a full Record via an `as` cast, which lied about missing keys.)\n private outcomeData: Partial<Record<OutcomeType, DamageDistribution>> = {};\n private hasHitDistributionCalculated = false;\n public identifier?: string;\n\n constructor(x: number = 0) {\n if (x <= 0) return;\n for (let i = 1; i <= x; i++) {\n this.faces[i] = 1;\n }\n }\n\n getOutcomeDistribution(key: OutcomeType): DamageDistribution | undefined {\n if (key === \"hit\") {\n this.ensureHitDistribution();\n }\n\n const distribution = this.outcomeData[key];\n if (distribution === undefined) return undefined;\n\n return { ...distribution };\n }\n\n getFullOutcomeDistribution(): Partial<\n Record<OutcomeType, DamageDistribution>\n > {\n return { ...this.outcomeData };\n }\n\n setOutcomeDistribution(\n key: OutcomeType,\n data: DamageDistribution | undefined\n ): void {\n if (data) {\n this.outcomeData[key] = data;\n } else {\n delete this.outcomeData[key];\n }\n }\n\n hasOutcomeData(key: OutcomeType): boolean {\n if (key === \"hit\") {\n this.ensureHitDistribution();\n }\n const data = this.outcomeData[key];\n return data !== undefined && Object.keys(data).length > 0;\n }\n\n getOutcomeCount(key: OutcomeType, face: number): number {\n return this.outcomeData[key]?.[face] ?? 0;\n }\n\n getAverage(key: OutcomeType): number {\n const distribution = this.getOutcomeDistribution(key);\n if (!distribution) return 0;\n // TODO caching opportunity\n\n const totalCount = Object.values(distribution).reduce(\n (sum, count) => sum + count,\n 0\n );\n const expectedDamage = Object.entries(distribution).reduce(\n (sum, [damage, count]) => sum + Number(damage) * count,\n 0\n );\n if (totalCount === 0) return 0;\n return expectedDamage / totalCount;\n }\n\n // TODO this can be private later if we change how testing works\n calculateHitDistribution(): DamageDistribution {\n const hitValues: DamageDistribution = {};\n\n // Hoist the per-outcome distributions out of the face loop: they are\n // constant across faces, so fetching (and previously cloning) them once is\n // O(faces + outcomes) instead of O(faces × outcomes). The stored maps are\n // only read here, never mutated, so reading them directly is safe and\n // produces identical counts.\n const subtractedOutcomes: (DamageDistribution | undefined)[] = [\n this.outcomeData.crit,\n this.outcomeData.missNone,\n this.outcomeData.missDamage,\n this.outcomeData.saveHalf,\n this.outcomeData.saveFail,\n this.outcomeData.pc,\n ];\n\n for (const [face, totalCount] of Object.entries(this.faces)) {\n const numFace = Number(face);\n let hitCount = totalCount;\n\n for (const distribution of subtractedOutcomes) {\n const outcomeCount = distribution?.[numFace];\n if (outcomeCount) {\n hitCount -= outcomeCount;\n }\n }\n\n // Zero damage should not be counted as hits - they represent misses\n if (numFace === 0) {\n hitCount = 0;\n }\n\n // Defensive clamp: guards against negative hit counts from older\n // inclusion-exclusion logic. Should never trigger in practice.\n if (hitCount < 0) {\n hitCount = 0;\n }\n hitValues[numFace] = hitCount;\n }\n\n return hitValues;\n }\n\n private ensureHitDistribution(): void {\n if (!this.hasHitDistributionCalculated) {\n const hitValues = this.calculateHitDistribution();\n this.setOutcomeDistribution(\"hit\", hitValues);\n this.hasHitDistributionCalculated = true;\n }\n }\n\n // PRIVATE FUNCTIONS\n\n private binaryOp(\n other: Dice | number,\n op: (a: number, b: number) => number,\n diceConstructor?: () => Dice\n ): Dice {\n const result = diceConstructor ? diceConstructor() : new Dice();\n\n const isScalar = typeof other === \"number\";\n const keys1 = this.keys();\n // Hoist the inner die's faces out of the outer loop: they are constant\n // across key1, so computing them once avoids re-allocating the array on\n // every outer iteration.\n const keys2 = isScalar ? [] : (other as Dice).keys();\n\n // Guard the O(faces₁ × faces₂) work before running it: a binary op between\n // two large (but individually legal) dice would otherwise blow up.\n if (!isScalar && keys1.length * keys2.length > MAX_BINARY_OUTCOMES) {\n throw new DiceParseError(\n `Dice operation over ${keys1.length}×${keys2.length} face pairs exceeds the maximum of ${MAX_BINARY_OUTCOMES}`\n );\n }\n\n for (const key1 of keys1) {\n const value1 = this.faces[key1]!;\n\n if (isScalar) {\n const resultKey = op(key1, other as number);\n result.increment(resultKey, value1);\n } else {\n for (const key2 of keys2) {\n const value2 = other.faces[key2]!;\n const resultKey = op(key1, key2);\n result.increment(resultKey, value1 * value2);\n }\n }\n }\n\n return result;\n }\n\n private removeFaces(facesToRemove: number[]): Dice {\n const result = new Dice();\n\n for (const [key, value] of Object.entries(this.faces)) {\n const numKey = Number(key);\n if (!facesToRemove.includes(numKey)) {\n result.faces[numKey] = value;\n }\n }\n\n result.privateData = { ...this.privateData };\n result.outcomeData = { ...this.outcomeData };\n return result;\n }\n\n // PUBLIC FUNCTIONS\n\n getFaceEntries(): [number, number][] {\n return Object.entries(this.faces).map(([k, v]) => [Number(k), v]);\n }\n\n getFaceMap(): DamageDistribution {\n return { ...this.faces };\n }\n\n get(face: number): number {\n return this.faces[face] ?? 0;\n }\n\n keys(): number[] {\n return Object.keys(this.faces).map(Number);\n }\n\n values(): number[] {\n return Object.values(this.faces);\n }\n\n total(): number {\n return Object.values(this.faces).reduce((sum, value) => sum + value, 0);\n }\n\n public setFace(key: number, value: number): void {\n this.faces[key] = value;\n }\n\n public static scalar(value: number): Dice {\n const result = new Dice();\n result.increment(value, 1);\n return result;\n }\n\n public maxFace(): number {\n const numericKeys = this.keys();\n\n if (numericKeys.length === 0) {\n throw new Error(\"No numeric faces found\");\n }\n\n return Math.max(...numericKeys);\n }\n\n public minFace(): number {\n const numericKeys = this.keys();\n\n if (numericKeys.length === 0) {\n throw new Error(\"No numeric faces found\");\n }\n\n return Math.min(...numericKeys);\n }\n\n public increment(face: number, count: number): void {\n const current = this.faces[face] || 0;\n this.faces[face] = current + count;\n }\n\n public normalize(scalar: number): Dice {\n const result = new Dice();\n\n for (const [face, count] of Object.entries(this.faces)) {\n result.faces[Number(face)] = count * scalar;\n }\n\n result.privateData = { ...this.privateData };\n result.outcomeData = { ...this.outcomeData };\n return result;\n }\n\n // OPERATIONS\n\n public add(other: Dice | number): Dice {\n return this.binaryOp(other, (a, b) => a + b);\n }\n\n public subtract(other: Dice | number): Dice {\n return this.binaryOp(other, (a, b) => a - b);\n }\n\n public conditionalApply(other: Dice | number): Dice {\n return this.binaryOp(other, (a, b) => (a === 0 ? 0 : 1) * b);\n }\n\n public multiply(other: Dice | number): Dice {\n return this.binaryOp(other, (a, b) => a * b);\n }\n\n public addNonZero(other: Dice | number): Dice {\n return this.binaryOp(other, (a, b) => (a !== 0 ? a + b : a));\n }\n\n public eq(other: Dice | number): Dice {\n return this.binaryOp(other, (a, b) => (a === b ? 1 : 0));\n }\n\n public max(other: Dice | number): Dice {\n return this.binaryOp(other, (a, b) => Math.max(a, b));\n }\n\n public min(other: Dice | number): Dice {\n return this.binaryOp(other, (a, b) => Math.min(a, b));\n }\n\n public advantage(): Dice {\n return this.max(this);\n }\n\n public ge(other: Dice | number): Dice {\n return this.binaryOp(other, (a, b) => (a >= b ? 0 : 1));\n }\n\n public divide(other: Dice | number): Dice {\n return this.binaryOp(other, (a, b) => a / b);\n }\n\n public divideRoundUp(other: Dice | number): Dice {\n return this.binaryOp(other, (a, b) => Math.ceil(a / b));\n }\n\n public divideRoundDown(other: Dice | number): Dice {\n return this.binaryOp(other, (a, b) => Math.floor(a / b));\n }\n\n public and(other: Dice | number): Dice {\n return this.binaryOp(other, (a, b) => (a && b ? 1 : 0));\n }\n\n private checkTarget(\n other: Dice | number,\n comparisonLogic: (roll: number, target: number) => number\n ): Dice {\n const createResult = () => {\n const result = new Dice();\n result.increment(0, 0); // Success\n result.increment(1, 0); // Failure\n return result;\n };\n\n return this.binaryOp(other, comparisonLogic, createResult);\n }\n\n public dc(other: Dice | number): Dice {\n const dcCheck = (a: number, b: number) => (a >= b ? 0 : 1);\n const result = this.checkTarget(other, dcCheck);\n // Mark this as a DC check (save mechanic) for proper attribute assignment\n result.privateData.isDCCheck = true;\n return result;\n }\n\n public ac(other: Dice | number): Dice {\n const acCheck = (a: number, b: number) => (a >= b ? a : 0);\n return this.checkTarget(other, acCheck);\n }\n\n public deleteFace(face: number): Dice {\n const result = new Dice();\n\n for (const [key, value] of Object.entries(this.faces)) {\n const numKey = Number(key);\n if (numKey !== face) {\n result.increment(numKey, value);\n }\n }\n\n result.privateData = { ...this.privateData };\n result.outcomeData = { ...this.outcomeData };\n return result;\n }\n\n public reroll(toReroll: Dice | number): Dice {\n const rerollDice =\n typeof toReroll === \"number\" ? Dice.scalar(toReroll) : toReroll;\n\n const rerollKeys = rerollDice.keys();\n const rerollSet = new Set(rerollKeys);\n const removed = this.removeFaces(rerollKeys);\n let result = new Dice();\n\n for (const face of this.keys()) {\n const wasRerolled = rerollSet.has(face);\n result = result.combine(removed);\n if (wasRerolled) {\n result = result.combine(this);\n }\n }\n\n return result;\n }\n\n // This is not addition and not rolling two dice at once.\n // Instead, it’s mixing two distributions into a single weighted die.\n public combine(other: Dice | number): Dice {\n if (typeof other === \"number\") {\n other = Dice.scalar(other);\n }\n\n // Start by copying \"other\" into a new Dice object\n const result = new Dice();\n for (const [key, value] of Object.entries(other.faces)) {\n result.faces[Number(key)] = value;\n }\n\n // Build the \"except\" dice and add faces from `this` to result\n const except = new Dice();\n for (const [key, value] of Object.entries(this.faces)) {\n const numKey = Number(key);\n result.increment(numKey, value);\n\n // If the key did not already exist in `other`, we remove it from `except`\n if (!(numKey in other.faces)) {\n except.increment(numKey, value); // still tracked in except\n }\n }\n\n result.privateData = { ...this.privateData, except: other };\n result.outcomeData = { ...this.outcomeData };\n return result;\n }\n\n public combineInPlace(other: Dice): void {\n for (const [key, value] of Object.entries(other.faces)) {\n const numKey = Number(key);\n const current = this.faces[numKey] || 0;\n this.faces[numKey] = current + value;\n }\n }\n\n public percent(): DamageDistribution {\n const total = this.total();\n const result: DamageDistribution = {};\n\n for (const [face, count] of Object.entries(this.faces)) {\n result[Number(face)] = count / total;\n }\n\n return result;\n }\n\n public average(): number {\n const total = this.total();\n if (total === 0) return 0;\n\n let sum = 0;\n for (const [key, value] of Object.entries(this.faces)) {\n sum += Number(key) * value;\n }\n\n return sum / total;\n }\n\n /*\n * Convert dice to PMF using OutcomeType labels directly from damage distribution.\n * This is much cleaner than the original complex distribution conversion.\n */\n public toPMF(numEpsilon: number = EPS): PMF {\n const total = this.total();\n if (total === 0) return PMF.empty(numEpsilon);\n\n // Ensure hit distribution is calculated before using it\n this.ensureHitDistribution();\n\n const map = new Map<number, Bin>();\n\n // Outcome distributions (counts, not probabilities)\n const hitDistro = this.getOutcomeDistribution(\"hit\") || {};\n const critDistro = this.getOutcomeDistribution(\"crit\") || {};\n const missDistro = this.getOutcomeDistribution(\"missDamage\") || {};\n const saveDistro = this.getOutcomeDistribution(\"saveHalf\") || {};\n const pcDistro = this.getOutcomeDistribution(\"pc\") || {};\n\n // A non-empty save distribution means the \"save\" mechanic was used (e.g.\n // \"save half\"): its success mass is a saveHalf outcome and the remaining\n // (full-damage) mass is a saveFail. The previous heuristic — \"isSaveHalf iff\n // 2×(a half value) appears in the hit distribution\" — false-negatived on odd\n // or constant damage, mislabeling saveHalf as saveFail and saveFail as hit.\n const isSaveHalf = Object.keys(saveDistro).length > 0;\n\n const isDCCheck = this.privateData.isDCCheck === true;\n\n const clampNonNeg = (x: number) => (x < 0 && x > -1e-15 ? 0 : x);\n\n // Process each face value (iterate the internal map directly; this loop\n // only reads it, so the defensive clone from getFaceMap() is unnecessary)\n for (const [faceStr, faceCountRaw] of Object.entries(this.faces)) {\n const face = Number(faceStr);\n const faceCount = Number(faceCountRaw);\n\n // Skip structurally present but empty bins early\n if (faceCount <= 0) continue;\n\n let p = faceCount / total;\n p = clampNonNeg(p);\n\n // Always drop exact zeros to keep PMF semantics clean\n if (!(p > 0)) continue;\n\n // Optional pruning only when epsilon is enabled\n if (numEpsilon >= 0 && p < numEpsilon) continue;\n\n const count: OutcomeLabelMap = {};\n const attr: OutcomeLabelMap = {};\n\n // Add distribution counts and attributions\n if (hitDistro[face]) {\n const c = clampNonNeg(hitDistro[face] / total);\n if (c > 0) {\n if (isSaveHalf || isDCCheck) {\n count.saveFail = c; // full damage on failed save\n attr.saveFail = clampNonNeg((face * hitDistro[face]) / total);\n } else {\n count.hit = c;\n attr.hit = clampNonNeg((face * hitDistro[face]) / total);\n }\n }\n }\n\n if (critDistro[face]) {\n const c = clampNonNeg(critDistro[face] / total);\n if (c > 0) {\n count.crit = c;\n attr.crit = clampNonNeg((face * critDistro[face]) / total);\n }\n }\n\n if (missDistro[face]) {\n const c = clampNonNeg(missDistro[face] / total);\n if (c > 0) {\n count.missDamage = c;\n attr.missDamage = clampNonNeg((face * missDistro[face]) / total);\n }\n }\n\n if (saveDistro[face]) {\n const c = clampNonNeg(saveDistro[face] / total);\n if (c > 0) {\n if (isSaveHalf) {\n count.saveHalf = c; // half damage on successful save\n attr.saveHalf = clampNonNeg((face * saveDistro[face]) / total);\n } else {\n count.saveFail = (count.saveFail ?? 0) + c; // regular fail\n attr.saveFail = clampNonNeg(\n (attr.saveFail ?? 0) + (face * saveDistro[face]) / total\n );\n }\n }\n }\n\n if (pcDistro[face]) {\n const c = clampNonNeg(pcDistro[face] / total);\n if (c > 0) {\n count.pc = c;\n attr.pc = clampNonNeg((face * pcDistro[face]) / total);\n }\n }\n\n // Handle faces with no specific distribution (missNone) for non-save and non-DC checks\n if (!isSaveHalf && !isDCCheck) {\n const distroCountRaw =\n (hitDistro[face] || 0) +\n (critDistro[face] || 0) +\n (missDistro[face] || 0) +\n (saveDistro[face] || 0) +\n (pcDistro[face] || 0);\n\n const unaccountedCount = clampNonNeg(faceCount - distroCountRaw);\n if (unaccountedCount > 0) {\n const frac = clampNonNeg(unaccountedCount / total);\n if (frac > 0) {\n count.missNone = (count.missNone ?? 0) + frac;\n // missNone does 0 damage, so no attr contribution\n }\n }\n }\n\n const bin: Bin = { p, count };\n if (Object.keys(attr).length > 0) {\n bin.attr = attr;\n }\n\n map.set(face, bin);\n }\n\n // Fall back to a sentinel identifier if none was assigned. This indicates\n // a Dice constructed outside the normal parse/build flow.\n const identifier = this.identifier || \"ERROR\";\n\n // Normalize, drop zeros again if any snuck in, then compaction and pruning\n return new PMF(map, numEpsilon, true, identifier).compact(numEpsilon, true);\n }\n}\n\nexport type _DiceInternal = never;\n","import { DiceParseError } from \"../common/errors\";\nimport { LRUCache } from \"../common/lru-cache\";\nimport type { OutcomeType } from \"../common/types\";\nimport type { PMF } from \"../pmf/pmf\";\nimport { Dice } from \"./dice\";\n\ntype DiceOperation = ((this: Dice, other: Dice | number) => Dice) & {\n unary?: boolean;\n};\n\n/**\n * Resource-exhaustion guards. Adversarial expressions (a huge die, a huge dice\n * count, or a keep over a large enumerated pool) can otherwise blow up memory\n * and CPU. These caps are deliberately generous so every legitimate expression\n * the suite exercises (e.g. d100000) still parses.\n */\n// Must stay >= 100000: the suite asserts d100000 (100k faces) parses.\nconst MAX_DIE_SIDES = 1_000_000;\nconst MAX_DICE_COUNT = 10_000;\n// multiplyDiceByDice enumerates faces^count outcomes when a keep is applied.\nconst MAX_KEEP_OUTCOMES = 1_000_000;\n\n/**\n * Internal parse cache for PMFs produced from string expressions.\n * Keyed by cleaned expression (spaces stripped, lowercased) and optional `n` value.\n */\nconst parseCache = new LRUCache<string, PMF>(1000);\n\nlet cachingEnabled = true;\n\n/** Enable or disable the internal parse cache. */\nexport function setCachingEnabled(enabled: boolean): void {\n cachingEnabled = enabled;\n if (!enabled) clearParserCache();\n}\n\n/** Returns whether the internal parse cache is currently enabled. */\nexport function getCachingEnabled(): boolean {\n return cachingEnabled;\n}\n\n/** Clears the internal parse cache. */\nexport function clearParserCache(): void {\n parseCache.clear();\n}\n\n/**\n * Parse a dice expression into a PMF.\n *\n * - Expression is case-insensitive and ignores spaces.\n */\nexport function parse(expression: string, n: number = 0): PMF {\n // Check cache first if enabled\n const cleaned = expression.replace(/ /g, \"\").toLowerCase();\n\n if (cachingEnabled) {\n const cacheKey = `${cleaned}:${n}`;\n const cached = parseCache.get(cacheKey);\n if (cached) return cached;\n }\n\n const chars = [...cleaned];\n\n let result: Dice;\n try {\n result = parseExpression(chars, n);\n } catch (error) {\n throw new DiceParseError(\n `Cannot parse dice expression [${expression}]: ${error}`,\n { expression, cause: error }\n );\n }\n\n result.privateData = result.privateData || {};\n result.identifier = cleaned;\n\n if (chars.length > 0) {\n throw new DiceParseError(\n `Unexpected token: '${chars[0]}' from expression: '${expression}'`,\n { expression }\n );\n }\n\n // When creating the PMF, do not epsilon prune\n const resultPMF = result.toPMF(-1);\n if (cachingEnabled) {\n // store using the same cleaned key we used for lookup\n const cacheKey = `${cleaned}:${n}`;\n parseCache.set(cacheKey, resultPMF);\n }\n\n return resultPMF;\n}\n\nfunction combineDiceWithNormalization(\n dice: Dice,\n normValue: number,\n outcomeType: OutcomeType,\n currentNorm: number,\n finalResult: Dice\n): { newNorm: number; updatedResult: Dice } {\n dice = dice.normalize(currentNorm);\n finalResult = finalResult.normalize(normValue);\n finalResult.setOutcomeDistribution(outcomeType, dice.getFaceMap());\n finalResult = finalResult.combine(dice);\n return { newNorm: currentNorm * normValue, updatedResult: finalResult };\n}\n\n/**\n * Face-wise histogram difference. NOT the same as {@link Dice.subtract}, which convolves VALUES\n * (`a - b` as numbers); this subtracts raw face COUNTS, used to isolate \"everything except this\n * natural-die-value's contribution\" out of an already-convolved to-hit total.\n */\nfunction subtractCounts(a: Dice, b: Dice): Dice {\n const result = new Dice();\n for (const [key, value] of a.getFaceEntries()) result.increment(key, value);\n for (const [key, value] of b.getFaceEntries()) result.increment(key, -value);\n return result;\n}\n\nfunction parseExpression(arr: string[], n: number): Dice {\n const result = (() => {\n const res = parseArgument(arr, n);\n return typeof res === \"number\" ? Dice.scalar(res) : res;\n })();\n\n let op = parseOperation(arr);\n let finalResult = result;\n\n // Track a flat (no advantage/disadvantage/reroll) base check die's natural-max face\n // separately from whatever bonus-to-hit dice and modifiers get added to it, so a later plain\n // `crit` clause -- possibly in an OUTER parseExpression call, once this AC-checked\n // sub-expression has already collapsed to one Dice -- can recover the exact \"natural max, any\n // bonus roll\" slice instead of peeling the combined expression's single highest TOTAL, which\n // undercounts crit mass whenever bonus dice are present (e.g. Bless: \"d20 + 5 + 1d4\" reported\n // a crit probability of 1/(20*4) instead of 1/20).\n //\n // Scoped narrowly and deliberately: only a bare flat `dN` base die with no reroll, combined\n // solely via `+`/`-`, terminated by a numeric `AC`/`DC` target. Anything else --\n // advantage/disadvantage/elven accuracy on the base die, halfling reroll, a dynamic\n // (dice-valued) AC target, or `xcrit` (an expanded crit RANGE, which needs its own AC check\n // per natural face) -- invalidates tracking and falls back to the legacy peel-based behavior,\n // which remains correct with no bonus dice and is the same known-imperfect approximation\n // otherwise. See CHANGELOG.\n let baseDieMeta =\n result.privateData?.checkDie && !result.privateData.checkDie.rerollOne\n ? result.privateData.checkDie\n : undefined;\n let bonusOnly = Dice.scalar(0);\n\n while (op != null) {\n const arg = !op.unary ? parseArgument(arr, n) : finalResult;\n\n let acAlreadyApplied = false;\n if (baseDieMeta) {\n if (op === Dice.prototype.addNonZero) {\n bonusOnly = bonusOnly.add(arg);\n } else if (op === Dice.prototype.subtract) {\n bonusOnly = bonusOnly.subtract(arg);\n } else if (op === Dice.prototype.ac && typeof arg === \"number\") {\n // Isolate the natural-max face's contribution BEFORE gating, so the crit clause can use\n // it directly (see below) -- but AC-gate it exactly like every other natural value (no\n // RAW \"natural 20 always hits\" exception here: that would change this checked total's\n // hit/miss math, not just crit attribution, and several tests pin the parser's existing\n // \"AC is a pure numeric threshold, no natural-face exceptions\" behavior, e.g. an\n // unreachably high AC yields zero mass even on a natural max). Splitting into two pieces\n // and re-gating each is mathematically identical to gating the whole, since `.ac()` acts\n // per-face independently.\n const natMaxSlice = bonusOnly.add(baseDieMeta.sides);\n const restSlice = subtractCounts(finalResult, natMaxSlice);\n const gatedNatMaxSlice = natMaxSlice.ac(arg);\n finalResult = restSlice.ac(arg).combine(gatedNatMaxSlice);\n finalResult.privateData.checkDie = baseDieMeta;\n finalResult.privateData.natMaxCritSlice = gatedNatMaxSlice;\n acAlreadyApplied = true;\n baseDieMeta = undefined;\n } else {\n baseDieMeta = undefined;\n }\n }\n\n // Handle crit (e.g. xcrit, crit)\n let crit: Dice | undefined;\n let critNorm = 1;\n if (arr[0] === \"x\" || arr[0] === \"c\") {\n const isXcrit = arr[0] === \"x\";\n if (isXcrit) assertToken(arr, \"x\");\n assertToken(arr, \"c\");\n assertToken(arr, \"r\");\n assertToken(arr, \"i\");\n assertToken(arr, \"t\");\n\n const count = isXcrit ? parseNumber(arr, n) : 1;\n const trackedCritSlice = finalResult.privateData?.natMaxCritSlice;\n\n if (count === 1 && trackedCritSlice) {\n // Exact path: trackedCritSlice already isolates \"natural max, any bonus roll\" (see the\n // AC-tracking block above), independent of how many bonus-to-hit dice sides would\n // otherwise smear that mass across several total values.\n crit = trackedCritSlice;\n finalResult = subtractCounts(finalResult, trackedCritSlice);\n } else {\n // KNOWN LIMITATION (xcrit, or no tracked base die -- advantage/disadvantage/elven\n // accuracy, halfling reroll, or bonus dice mixed into a non-flat check): peels the\n // maximum FACE of the already-convolved to-hit distribution. Correct only when the\n // to-hit has no bonus dice, since bonus dice otherwise smear a natural-max roll's mass\n // across several total values that also contain non-crit mass. Use the builder API\n // (d20.plus(...).plus(bonusDie).ac(...).onCrit(...)) for a correct crit probability with\n // bonus to-hit dice in these cases. See CHANGELOG.\n crit = new Dice();\n for (let i = 0; i < count; i++) {\n const max = finalResult.maxFace();\n crit.setFace(max, finalResult.get(max));\n finalResult = finalResult.deleteFace(max);\n }\n }\n\n critNorm = crit.total();\n crit = op.call(crit, parseBinaryArgument(arg, arr, n));\n\n critNorm = crit && critNorm ? crit.total() / critNorm : 1;\n }\n\n // Handle save\n let save: Dice | undefined;\n let saveNorm = 1;\n if (arr[0] === \"s\") {\n assertToken(arr, \"s\");\n assertToken(arr, \"a\");\n assertToken(arr, \"v\");\n assertToken(arr, \"e\");\n\n save = new Dice();\n const min = finalResult.minFace();\n save.increment(min > 0 ? min : 1, finalResult.get(min));\n\n saveNorm = save.total();\n finalResult = finalResult.deleteFace(min);\n save = op.call(save, parseBinaryArgument(arg, arr, n));\n saveNorm = save && saveNorm ? save.total() / saveNorm : 1;\n }\n\n // Handle half damage on hit (potent cantrip)\n let pc: Dice | undefined;\n let pcNorm = 1;\n\n if (arr.length >= 2 && arr[0] === \"p\" && arr[1] === \"c\") {\n assertToken(arr, \"p\");\n assertToken(arr, \"c\");\n\n pc = new Dice();\n const min = finalResult.minFace();\n pc.increment(min > 0 ? min : 1, finalResult.get(min));\n\n const missBefore = pc.total();\n finalResult = finalResult.deleteFace(min);\n\n pc = op.call(pc, parseBinaryArgument(arg, arr, n)).divideRoundDown(2); // parse the damage\n\n const missAfter = pc ? pc.total() : 0;\n pcNorm = missBefore ? missAfter / missBefore : 1;\n }\n\n // Handle miss\n let miss: Dice | undefined;\n let missNorm = 1;\n\n if (arr[0] === \"m\") {\n assertToken(arr, \"m\");\n assertToken(arr, \"i\");\n assertToken(arr, \"s\");\n assertToken(arr, \"s\");\n\n miss = new Dice();\n const min = finalResult.minFace();\n miss.increment(min > 0 ? min : 1, finalResult.get(min));\n\n missNorm = miss.total();\n finalResult = finalResult.deleteFace(min);\n\n miss = op.call(miss, parseBinaryArgument(arg, arr, n));\n missNorm = miss && missNorm ? miss.total() / missNorm : 1;\n }\n\n let norm = finalResult.total();\n\n if (!acAlreadyApplied) {\n finalResult = op.call(finalResult, arg);\n }\n norm = norm ? finalResult.total() / norm : 1;\n\n // Combine dice with normalization\n if (crit) {\n const result = combineDiceWithNormalization(\n crit,\n critNorm,\n \"crit\",\n norm,\n finalResult\n );\n norm = result.newNorm;\n finalResult = result.updatedResult;\n }\n\n if (save) {\n const result = combineDiceWithNormalization(\n save,\n saveNorm,\n \"saveHalf\",\n norm,\n finalResult\n );\n norm = result.newNorm;\n finalResult = result.updatedResult;\n }\n\n if (miss) {\n const result = combineDiceWithNormalization(\n miss,\n missNorm,\n \"missDamage\",\n norm,\n finalResult\n );\n norm = result.newNorm;\n finalResult = result.updatedResult;\n }\n\n if (pc) {\n const result = combineDiceWithNormalization(\n pc,\n pcNorm,\n \"pc\",\n norm,\n finalResult\n );\n norm = result.newNorm;\n finalResult = result.updatedResult;\n }\n\n op = parseOperation(arr);\n }\n\n return finalResult;\n}\n\nfunction parseArgument(s: string[], n: number): Dice | number {\n let result = parseArgumentInternal(s, n);\n\n while (true) {\n const next = parseArgumentInternal(s, n);\n if (next === undefined) break;\n\n result = multiplyDiceByDice(result as Dice | number, next);\n }\n\n return result as Dice | number;\n}\n\nfunction multiplyDiceByDice(d1: Dice | number, d2: Dice | number): Dice {\n if (typeof d1 === \"number\") d1 = Dice.scalar(d1);\n if (typeof d2 === \"number\") d2 = Dice.scalar(d2);\n\n const result = new Dice();\n // Keyed by face value. A Map avoids the number→string→parseFloat round-trip of\n // an object and preserves insertion order, which matches d1.keys() ascending\n // order — so the combine order below is identical to the previous version.\n const faces = new Map<number, Dice>();\n let normalizationFactor = 1;\n\n for (const key of d1.keys()) {\n let face: Dice;\n\n if (typeof key !== \"number\") {\n continue; // Skip invalid scalar\n }\n\n if (d2.privateData.keep) {\n // Repeat dice2 \"key\" times and apply keep. opDice enumerates the full\n // faces^count outcome space, so guard against a combinatorial blow-up.\n const faceCount = d2.keys().length;\n if (Math.pow(faceCount, key) > MAX_KEEP_OUTCOMES) {\n throw new DiceParseError(\n `Keep enumeration of ${faceCount}^${key} outcomes exceeds the maximum of ${MAX_KEEP_OUTCOMES}`\n );\n }\n const repeat: Dice[] = Array(key).fill(d2);\n face = opDice(repeat, d2.privateData.keep);\n } else {\n face = multiplyDice(key, d2);\n }\n\n normalizationFactor *= face.total();\n faces.set(key, face);\n }\n\n for (const [k, face] of faces) {\n const count = d1.get(k);\n result.combineInPlace(\n face.normalize((count * normalizationFactor) / face.total())\n );\n }\n\n result.privateData.except = {};\n return result;\n}\n\nfunction multiplyDice(n: number, d: Dice): Dice {\n if (n > MAX_DICE_COUNT) {\n throw new DiceParseError(\n `Dice count ${n} exceeds the maximum of ${MAX_DICE_COUNT}`\n );\n }\n if (n === 0) return new Dice(0);\n if (n === 1) return d;\n\n const half = Math.floor(n / 2);\n let result = multiplyDice(half, d);\n result = result.add(result);\n\n if (n % 2 === 1) {\n result = result.add(d);\n }\n\n return result;\n}\n\nfunction opDice(diceList: Dice[], keepFn: (values: number[]) => number): Dice {\n return opDiceInternal(diceList, new Dice(), 0, [], 1, keepFn);\n}\n\nfunction opDiceInternal(\n diceList: Dice[],\n result: Dice,\n index: number,\n values: number[],\n weight: number,\n combineFn: (values: number[]) => number\n): Dice {\n if (index === diceList.length) {\n return result.combine(Dice.scalar(combineFn(values)).normalize(weight));\n }\n\n const currentDice = diceList[index];\n for (const face of currentDice.keys()) {\n values.push(face as number);\n result = opDiceInternal(\n diceList,\n result,\n index + 1,\n values,\n weight * currentDice.get(face),\n combineFn\n );\n values.pop();\n }\n\n return result;\n}\n\nfunction parseArgumentInternal(\n s: string[],\n n: number\n): Dice | number | undefined {\n if (s.length === 0) return;\n\n const c = s[0];\n\n switch (c) {\n case \"(\":\n s.shift();\n return assertToken(s, \")\", parseExpression(s, n));\n\n case \"h\":\n case \"d\":\n return parseDice(s, n);\n\n case \"k\":\n assertToken(s, \"k\");\n return parseKeep(s, n);\n\n case \"n\":\n return parseNumber(s, n);\n\n default:\n if (isDigit(c)) return parseNumber(s, n);\n return;\n }\n}\n\nfunction parseBinaryArgument(\n arg: Dice | number,\n arr: string[],\n n: number\n): Dice {\n if (arr.length >= 4 && arr[0] === \"h\" && peek(arr, \"half\")) {\n assertToken(arr, \"half\");\n\n const diceArg = typeof arg === \"number\" ? Dice.scalar(arg) : arg;\n return diceArg.divideRoundDown(2);\n }\n\n const parsed = parseArgument(arr, n);\n return typeof parsed === \"number\" ? Dice.scalar(parsed) : parsed;\n}\n\nfunction assertToken<T>(s: string[], expected: string, ret?: T): T | undefined {\n for (const ch of expected) {\n const found = s.shift();\n if (found !== ch) {\n throw new Error(`Expected character '${ch}', found '${found}'`);\n }\n }\n return ret;\n}\n\nfunction parseDice(s: string[], n: number): Dice | undefined {\n let rerollOne = false;\n\n if (peek(s, \"hd\") && peekIsNumber(s, 2)) {\n assertToken(s, \"h\");\n assertToken(s, \"d\");\n rerollOne = true;\n } else if (peek(s, \"d\") && peekIsNumber(s, 1)) {\n assertToken(s, \"d\");\n } else {\n return;\n }\n\n const sides = parseNumber(s, n);\n if (sides > MAX_DIE_SIDES) {\n throw new DiceParseError(\n `Die size ${sides} exceeds the maximum of ${MAX_DIE_SIDES}`\n );\n }\n let result = new Dice(sides);\n\n if (rerollOne) {\n // Reroll a rolled 1 exactly once, keeping the second roll (e.g. halfling\n // luck). This is the same semantics as the `reroll 1` operator; the previous\n // deleteFace(1).combine(result) computed a weighted union (P(1)=1/(2s−1)),\n // not a reroll (correct P(1)=1/s²).\n result = result.reroll(1);\n }\n\n result.privateData.checkDie = { sides, rerollOne };\n return result;\n}\n\nfunction peek(arr: string[], expected: string): boolean {\n if (expected.length > arr.length) return false;\n\n for (let i = 0; i < expected.length; i++) {\n if (arr[i] !== expected.charAt(i)) return false;\n }\n\n return true;\n}\n\nfunction peekIsNumber(arr: string[], index: number): boolean {\n if (index >= arr.length) return false;\n return isDigit(arr[index]) || arr[index] === \"n\";\n}\n\nfunction parseNumber(s: string[], n: number): number {\n let ret = \"\";\n\n while (s.length > 0 && (isDigit(s[0]) || s[0] === \"n\")) {\n const ch = s.shift()!;\n ret += ch === \"n\" ? n.toString() : ch;\n }\n\n if (ret.length === 0) {\n throw new Error(`Expected number, found: '${s[0]}'`);\n }\n\n return parseInt(ret, 10);\n}\n\nfunction isDigit(c: string): boolean {\n return c >= \"0\" && c <= \"9\";\n}\n\nfunction parseKeep(s: string[], n: number): Dice | undefined {\n let keepLowest = false;\n\n if (peek(s, \"l\")) {\n assertToken(s, \"l\");\n keepLowest = true;\n } else if (peek(s, \"h\")) {\n assertToken(s, \"h\");\n keepLowest = false;\n } else {\n return;\n }\n\n const keepCount = parseNumber(s, n);\n const result = parseArgumentInternal(s, n);\n\n if (result instanceof Dice) {\n result.privateData.keep = keepN(keepCount, keepLowest);\n return result;\n }\n\n throw new Error(\"Expected Dice after keep modifier\");\n}\n\nfunction keepN(n: number, low: boolean): (values: number[]) => number {\n return (values: number[]): number => {\n const sorted = [...values].sort((a, b) => (low ? a - b : b - a));\n return sorted.slice(0, n).reduce((sum, val) => sum + val, 0);\n };\n}\n\nfunction parseOperation(s: string[]): DiceOperation | undefined {\n switch (s[0]) {\n case \")\":\n return;\n\n case \"a\":\n assertToken(s, \"ac\");\n return Dice.prototype.ac;\n\n case \"d\":\n assertToken(s, \"dc\");\n return Dice.prototype.dc;\n\n case \"!\":\n assertToken(s, \"!\");\n const adv = Dice.prototype.advantage as DiceOperation;\n adv.unary = true;\n return adv;\n\n case \">\":\n assertToken(s, \">\");\n return Dice.prototype.max;\n\n case \"<\":\n assertToken(s, \"<\");\n return Dice.prototype.min;\n\n case \"+\":\n assertToken(s, \"+\");\n return Dice.prototype.addNonZero;\n\n case \"~\":\n assertToken(s, \"~\");\n assertToken(s, \"+\");\n return Dice.prototype.add;\n\n case \"-\":\n assertToken(s, \"-\");\n return Dice.prototype.subtract;\n\n case \"&\":\n assertToken(s, \"&\");\n return Dice.prototype.combine;\n\n case \"r\":\n assertToken(s, \"reroll\");\n return Dice.prototype.reroll;\n\n case \"*\":\n assertToken(s, \"*\");\n\n if (peek(s, \"*\")) {\n assertToken(s, \"*\");\n return Dice.prototype.multiply;\n }\n\n return Dice.prototype.conditionalApply;\n\n case \"/\":\n assertToken(s, \"/\");\n if (s[0] === \"/\") {\n assertToken(s, \"/\");\n return Dice.prototype.divideRoundDown;\n }\n return Dice.prototype.divideRoundUp;\n\n case \"=\":\n assertToken(s, \"=\");\n return Dice.prototype.eq;\n }\n\n return;\n}\n","import { EPS, PMF } from \"../\";\n\nexport function d20PmfFromCdf(\n cdfPow: (k: number) => number,\n eps: number = EPS\n): PMF {\n const out = new Map<number, number>();\n let prev = 0;\n for (let k = 1; k <= 20; k++) {\n const cur = cdfPow(k);\n const pk = cur - prev;\n if (pk > 0) {\n out.set(k, pk);\n }\n prev = cur;\n }\n\n return PMF.fromMap(out, eps);\n}\n","import { EPS, PMF, pmfCache } from \"../\";\nimport { d20PmfFromCdf } from \"./prob\";\nimport type { RollType } from \"./types\";\n\nconst cacheKeyMap: Record<string, string> = {\n \"flat-flat\": \"d20\",\n \"flat-reroll\": \"hd20\",\n \"advantage-flat\": \"d20 > d20\",\n \"advantage-reroll\": \"hd20 > hd20\",\n \"disadvantage-flat\": \"d20 < d20\",\n \"disadvantage-reroll\": \"hd20 < hd20\",\n \"elven accuracy-flat\": \"d20 > d20 > d20\",\n \"elven accuracy-reroll\": \"hd20 > hd20 > hd20\",\n};\n\n/** Lift a single d20 PMF into advantage, disadvantage, or elven (triple-advantage). */\nexport function d20RollPMF(\n rollType: RollType | undefined,\n rerollOne: boolean = false\n): PMF {\n rollType = rollType || \"flat\";\n const cacheKeyLookup = `${rollType}-${rerollOne ? \"reroll\" : \"flat\"}`;\n const cacheKey = cacheKeyMap[cacheKeyLookup];\n if (!cacheKey) {\n throw new Error(`Invalid roll type: ${rollType}`);\n }\n\n const cached = pmfCache.get(cacheKey);\n if (cached) return cached;\n\n const base = d20PMF(rerollOne);\n if (!rollType || rollType === \"flat\") {\n pmfCache.set(cacheKey, base);\n return base;\n }\n\n const p: number[] = new Array(21).fill(0); // indices 1..20\n for (const [r, rec] of base) {\n const pr = typeof rec === \"number\" ? rec : rec.p;\n if (r >= 1 && r <= 20) p[r] = pr;\n }\n const F: number[] = new Array(21).fill(0);\n for (let k = 1; k <= 20; k++) F[k] = F[k - 1] + p[k];\n\n const eps = 0;\n let result = base;\n if (rollType === \"advantage\") {\n result = d20PmfFromCdf((k) => Math.pow(F[k], 2), eps);\n } else if (rollType === \"elven accuracy\") {\n result = d20PmfFromCdf((k) => Math.pow(F[k], 3), eps);\n } else if (rollType === \"disadvantage\") {\n result = d20PmfFromCdf((k) => 1 - Math.pow(1 - F[k], 2), eps);\n }\n\n pmfCache.set(cacheKey, result);\n return result;\n}\n\nexport function d20PMF(rerollOne: boolean): PMF {\n const cacheKey = `flat-${rerollOne ? \"reroll\" : \"flat\"}`;\n const cached = pmfCache.get(cacheKey);\n if (cached) return cached;\n\n const m = new Map<number, number>();\n const base = 1 / 20;\n const rerollShare = base * base;\n if (!rerollOne) {\n for (let r = 1; r <= 20; r++) {\n m.set(r, base);\n }\n } else {\n for (let r = 1; r <= 20; r++) {\n m.set(r, (r === 1 ? 0 : base) + rerollShare);\n }\n }\n const result = PMF.fromMap(m, EPS);\n pmfCache.set(cacheKey, result);\n return result;\n}\n","import type { ACBuilder } from \"./ac\";\nimport type { CritConfig } from \"../common/types\";\nimport type { DCBuilder } from \"./dc\";\nimport { LRUCache } from \"../common/lru-cache\";\nimport { parse } from \"../parser/parser\";\nimport type { PMF } from \"../pmf/pmf\";\nimport type { DiceQuery } from \"../pmf/query\";\nimport { astFromRollConfigs, pmfFromRollBuilder, resolveRootD20 } from \"./ast\";\nimport { AttackBuilder } from \"./attack\";\nimport type { ExpressionNode, KeepNode, SumNode } from \"./nodes\";\nimport type { RollConfig, RollType } from \"./types\";\n\n/** Validates a `scaleDice`/`doubleDice` multiplier: must be a positive integer. Shared by\n * `RollBuilder.scaleDice` and every wrapper subclass's override (Half/Scale/MaxOf/Composite). */\nfunction validateScaleInt(scale: number): number {\n const scaleInt = Math.floor(scale);\n if (scaleInt !== scale) throw new Error(\"Scale must be an integer\");\n if (scaleInt <= 0) throw new Error(\"Scale must be > 0\");\n return scaleInt;\n}\n\n/**\n * Plain-roll PMF cache, the sibling of {@link attackPMFCache}. `toPMF()` re-runs the whole AST convolution\n * every call, and a DPR sweep rebuilds the SAME damage roll thousands of times — a Paladin's smite damage,\n * a Wizard's Fireball. Keyed by {@link RollBuilder.cacheKey} plus `eps`; a `null` key (half/scale/max/parsed/\n * pooled/composite, whose PMF is not captured by `subRollConfigs`) resolves uncached, because a conservative\n * miss is always safe and a wrong key would corrupt DPR.\n *\n * Subclasses that override `toPMF` (Half/Scale/MaxOf/Composite) never reach this — and all of them return a\n * `null` key anyway, so they are uncacheable by the same rule either way.\n */\nconst rollPMFCache = new LRUCache<string, PMF>(4000);\n\n/** Clears the plain-roll PMF cache (test/bench seam; mirrors {@link clearAttackCache}). */\nexport function clearRollCache(): void {\n rollPMFCache.clear();\n}\n\nexport const defaultConfig: RollConfig = {\n count: 1,\n sides: 0,\n modifier: 0,\n reroll: 0,\n explode: 0,\n minimum: 0,\n bestOf: 0,\n keep: undefined,\n rollType: \"flat\",\n};\n\nconst rollConfigsEqual = (a: RollConfig, b: RollConfig) => {\n return (\n a.count === b.count &&\n a.sides === b.sides &&\n a.modifier === b.modifier &&\n a.reroll === b.reroll &&\n a.explode === b.explode &&\n a.minimum === b.minimum &&\n a.bestOf === b.bestOf &&\n a.keep === b.keep &&\n a.rollType === b.rollType\n );\n};\n\nconst configComplexityScore = (config: RollConfig) => {\n return (\n (config.reroll > 0 ? 1 : 0) +\n (config.explode > 0 ? 1 : 0) +\n (config.minimum > 0 ? 1 : 0) +\n (config.bestOf > 0 ? 1 : 0) +\n (config.keep !== undefined ? 1 : 0) +\n (config.rollType !== \"flat\" ? 1 : 0)\n );\n};\n\n// Fluent builder for dice to create PMFs with an AST\nexport class RollBuilder {\n protected readonly subRollConfigs: readonly RollConfig[];\n\n constructor(countOrConfigs: number | readonly RollConfig[] = 1) {\n if (typeof countOrConfigs === \"number\") {\n const count = countOrConfigs;\n if (isNaN(count)) throw new Error(\"Invalid NaN value for count\");\n this.subRollConfigs = [\n { ...defaultConfig, count, isSubtraction: count < 0 },\n ];\n } else {\n this.subRollConfigs = countOrConfigs.map((c) => ({ ...c }));\n }\n }\n\n protected create(configs: readonly RollConfig[]): RollBuilder {\n return new RollBuilder(configs);\n }\n\n protected get lastConfig() {\n return this.subRollConfigs[this.subRollConfigs.length - 1];\n }\n\n hasHiddenState(): boolean {\n return false;\n }\n\n getSubRollConfigs(): readonly RollConfig[] {\n return this.subRollConfigs.map((c: RollConfig) => ({ ...c }));\n }\n\n /**\n * A cheap, stable string that FULLY identifies this builder's PMF — used by {@link AttackBuilder.toPMF}\n * to cache resolved attack PMFs across rebuilds without walking the AST via {@link toExpression}. A plain\n * roll is fully determined by its {@link RollConfig} array (count/sides/modifier/reroll/explode/minimum/\n * bestOf/keep/rollType/isSubtraction), so serializing that is sound. Subclasses whose PMF depends on\n * hidden state NOT captured by `subRollConfigs` (half/scale/max/parsed/pooled/composite transforms) return\n * `null` to opt OUT of caching — a conservative miss is always safe; a wrong key would corrupt DPR.\n */\n cacheKey(): string | null {\n return JSON.stringify(this.subRollConfigs);\n }\n\n // for testing\n static fromConfig(config: Partial<RollConfig>): RollBuilder {\n return new RollBuilder([{ ...defaultConfig, ...config }]);\n }\n\n static fromConfigs(configs: Partial<RollConfig>[]): RollBuilder {\n return new RollBuilder(\n configs.map((config) => ({ ...defaultConfig, ...config }))\n );\n }\n\n static fromArgs(...args: any[]): RollBuilder {\n if (args.length === 1) {\n const arg = args[0];\n if (typeof arg === \"number\") {\n if (isNaN(arg)) throw new Error(\"Invalid NaN value for argument\");\n return new RollBuilder(0).plus(arg);\n }\n if (typeof arg === \"string\") {\n return new ParsedRollBuilder(arg);\n }\n if (arg instanceof RollBuilder) {\n return arg;\n }\n }\n\n if (args.length === 2 || args.length === 3) {\n const [count, sidesOrDie, modifier] = args;\n\n if (typeof count !== \"number\") {\n throw new Error(\"First argument must be a number for multi-arg call\");\n }\n if (isNaN(count)) throw new Error(\"Invalid NaN value for count argument\");\n\n if (sidesOrDie instanceof RollBuilder) {\n if (sidesOrDie.hasHiddenState()) {\n throw new Error(\n \"Cannot use a roll with hidden state (like a pooled roll) as a die type.\"\n );\n }\n const subRollConfigs = sidesOrDie.getSubRollConfigs();\n if (subRollConfigs.length === 0) {\n const result = new RollBuilder(0);\n return modifier !== undefined ? result.plus(modifier) : result;\n }\n\n const absCount = Math.abs(count);\n\n const newConfigs = subRollConfigs.map((config) => ({\n ...config,\n count: config.count * absCount,\n modifier: config.modifier * absCount,\n }));\n\n let resultBuilder = new RollBuilder(newConfigs);\n\n if (count < 0) {\n const negatedConfigs = resultBuilder\n .getSubRollConfigs()\n .map((c) => ({ ...c, isSubtraction: !c.isSubtraction }));\n resultBuilder = new RollBuilder(negatedConfigs);\n }\n\n return modifier !== undefined\n ? resultBuilder.plus(modifier)\n : resultBuilder;\n } else if (typeof sidesOrDie === \"number\" || sidesOrDie === undefined) {\n if (typeof sidesOrDie === \"number\" && isNaN(sidesOrDie))\n throw new Error(\"Invalid NaN value for sides argument\");\n let builder = new RollBuilder(count);\n if (sidesOrDie && sidesOrDie > 0) {\n builder = builder.d(sidesOrDie);\n }\n return modifier !== undefined ? builder.plus(modifier) : builder;\n }\n }\n\n throw new Error(`Invalid arguments passed: ${args.join(\", \")}`);\n }\n\n // --- Core Dice Methods ---\n d(sides: number | undefined): RollBuilder {\n if (sides !== undefined && isNaN(sides))\n throw new Error(\"Invalid NaN value for sides\");\n if (sides === undefined) return this;\n if (this.lastConfig.sides && this.lastConfig.sides > 0) {\n throw new Error(\"Cannot add a die after adding a die\");\n }\n if (sides === 0) return this;\n const newConfigs = this.getSubRollConfigs();\n newConfigs[newConfigs.length - 1].sides = sides;\n return this.create(newConfigs);\n }\n\n plus(modOrRoll: number | RollBuilder | undefined): RollBuilder;\n plus(count: number, die: RollBuilder): RollBuilder;\n plus(\n modOrRoll: number | RollBuilder | undefined,\n die?: RollBuilder\n ): RollBuilder {\n if (typeof modOrRoll === \"number\" && isNaN(modOrRoll))\n throw new Error(\"Invalid NaN value for modOrRoll\");\n if (die instanceof RollBuilder && typeof modOrRoll === \"number\") {\n if (die.hasHiddenState()) {\n throw new Error(\n \"Cannot use a roll with hidden state (like a pooled roll) as a die type.\"\n );\n }\n const count = modOrRoll;\n const subRollConfigs = die.getSubRollConfigs();\n if (subRollConfigs.length === 0) return this;\n\n const absCount = Math.abs(count);\n\n const newConfigs = subRollConfigs.map((config) => ({\n ...config,\n count: config.count * absCount,\n modifier: config.modifier * absCount,\n }));\n\n let rollToAdd = new RollBuilder(newConfigs);\n\n if (count < 0) {\n const negatedConfigs = rollToAdd\n .getSubRollConfigs()\n .map((c) => ({ ...c, isSubtraction: !c.isSubtraction }));\n rollToAdd = new RollBuilder(negatedConfigs);\n }\n return this.add(rollToAdd);\n }\n\n if (die !== undefined) {\n throw new Error(\"Invalid arguments to plus()\");\n }\n\n if (modOrRoll === undefined) return this;\n if (typeof modOrRoll === \"number\") {\n if (modOrRoll === 0) return this;\n const newConfigs = this.getSubRollConfigs();\n newConfigs[newConfigs.length - 1].modifier += modOrRoll;\n return this.create(newConfigs);\n }\n return this.add(modOrRoll as RollBuilder);\n }\n\n minus(modOrRoll: number | RollBuilder | undefined): RollBuilder;\n minus(count: number, die: RollBuilder): RollBuilder;\n minus(\n modOrRoll: number | RollBuilder | undefined,\n die?: RollBuilder\n ): RollBuilder {\n const isNumber = typeof modOrRoll === \"number\";\n const dieIsRoll = die instanceof RollBuilder;\n if (dieIsRoll && isNumber) return this.plus(-modOrRoll, die);\n\n if (die !== undefined) throw new Error(\"Invalid arguments to minus()\");\n if (modOrRoll === undefined) return this;\n\n return isNumber\n ? this.plus(-modOrRoll)\n : this.plus(-1, modOrRoll as RollBuilder);\n }\n\n /** Apply one-pass reroll threshold (k): reroll faces 1..k once, must keep. */\n reroll(value: number): RollBuilder {\n if (isNaN(value)) throw new Error(\"Invalid NaN value for reroll\");\n if (value === this.lastConfig.reroll) return this;\n\n const newConfigs = this.getSubRollConfigs();\n\n newConfigs[newConfigs.length - 1].reroll = value;\n return this.create(newConfigs);\n }\n\n /** Set finite explode count for max-face explosions (Infinity allowed). */\n explode(count: number | undefined = Infinity): RollBuilder {\n if (count !== undefined && isNaN(count))\n throw new Error(\"Invalid NaN value for explode count\");\n if (count === undefined) return this;\n if (count === 0) return this;\n if (count < 0) throw new Error(\"Explode count must be >= 0\");\n\n const newConfigs = this.getSubRollConfigs();\n newConfigs[newConfigs.length - 1].explode = count;\n return this.create(newConfigs);\n }\n\n /** Apply per-die minimum value (floors each die roll at `val`, e.g. `minimum(3)` treats a 1 or\n * 2 as a 3 -- the 2024 Great Weapon Fighting style). */\n minimum(val: number | undefined): RollBuilder {\n if (val !== undefined && isNaN(val))\n throw new Error(\"Invalid NaN value for minimum\");\n if (val === undefined) return this;\n if (val === 0) return this;\n if (val < 0) throw new Error(\"Minimum value must be >= 0\");\n\n const newConfigs = this.getSubRollConfigs();\n newConfigs[newConfigs.length - 1].minimum = val;\n return this.create(newConfigs);\n }\n\n bestOf(count: number | undefined): RollBuilder {\n if (count !== undefined && isNaN(count))\n throw new Error(\"Invalid NaN value for bestOf count\");\n if (count === undefined) return this;\n if (count <= 0) throw new Error(\"Best of count must be > 0\");\n\n const newConfigs = this.getSubRollConfigs();\n newConfigs[newConfigs.length - 1].bestOf = count;\n return this.create(newConfigs);\n }\n\n keepHighest(total: number, count: number): RollBuilder {\n if (isNaN(total) || isNaN(count))\n throw new Error(\"Invalid NaN value for keepHighest\");\n const newConfigs = this.getSubRollConfigs();\n newConfigs[newConfigs.length - 1].keep = { total, count, mode: \"highest\" };\n return this.create(newConfigs);\n }\n\n keepLowest(total: number, count: number): RollBuilder {\n if (isNaN(total) || isNaN(count))\n throw new Error(\"Invalid NaN value for keepLowest\");\n const newConfigs = this.getSubRollConfigs();\n newConfigs[newConfigs.length - 1].keep = { total, count, mode: \"lowest\" };\n return this.create(newConfigs);\n }\n\n keepHighestAll(total: number, count: number): PooledRollBuilder {\n if (isNaN(total) || isNaN(count))\n throw new Error(\"Invalid NaN value for keepHighestAll\");\n const currentAST = this.toAST();\n // Wrap in SumNode to represent trials, then KeepNode\n const trialPool: SumNode = {\n type: \"sum\",\n count: total,\n child: currentAST,\n };\n const keepNode: KeepNode = {\n type: \"keep\",\n mode: \"highest\",\n count,\n child: trialPool,\n };\n const currentExpr = this.toExpression();\n const expression = `${total}kh${count}(${currentExpr})`;\n return new PooledRollBuilder(keepNode, expression);\n }\n\n keepLowestAll(total: number, count: number): PooledRollBuilder {\n if (isNaN(total) || isNaN(count))\n throw new Error(\"Invalid NaN value for keepLowestAll\");\n const currentAST = this.toAST();\n const trialPool: SumNode = {\n type: \"sum\",\n count: total,\n child: currentAST,\n };\n const keepNode: KeepNode = {\n type: \"keep\",\n mode: \"lowest\",\n count,\n child: trialPool,\n };\n const currentExpr = this.toExpression();\n const expression = `${total}kl${count}(${currentExpr})`;\n return new PooledRollBuilder(keepNode, expression);\n }\n\n withAdvantage(): RollBuilder {\n const newConfigs = this.getSubRollConfigs();\n newConfigs[newConfigs.length - 1].rollType = \"advantage\";\n return this.create(newConfigs);\n }\n\n withDisadvantage(): RollBuilder {\n const configs = this.getSubRollConfigs();\n configs[configs.length - 1].rollType = \"disadvantage\";\n return this.create(configs);\n }\n\n add(anotherRoll: RollBuilder | undefined): RollBuilder {\n if (anotherRoll === undefined) return this;\n if (anotherRoll.hasHiddenState()) {\n throw new Error(\n \"Cannot add a roll with hidden state (like a pooled roll) to a standard roll. Try adding the standard roll to the pooled roll instead: pool.plus(roll).\"\n );\n }\n const configs = [...this.subRollConfigs, ...anotherRoll.subRollConfigs];\n return this.create(configs);\n }\n\n withBonus(anotherRoll: RollBuilder): RollBuilder {\n const configs = [...this.subRollConfigs, ...anotherRoll.subRollConfigs];\n return this.create(configs);\n }\n\n addRoll(count: number = 1): RollBuilder {\n if (isNaN(count)) throw new Error(\"Invalid NaN value for count\");\n const configs = [\n ...this.subRollConfigs,\n {\n ...defaultConfig,\n count,\n isSubtraction: count < 0,\n },\n ];\n return this.create(configs);\n }\n\n scaleDice(scale: number): RollBuilder {\n const scaleInt = validateScaleInt(scale);\n\n const newConfigs = this.getSubRollConfigs().map((config) => {\n if (!config.sides || config.sides <= 0) return config;\n return { ...config, count: config.count * scaleInt };\n });\n return this.create(newConfigs);\n }\n\n doubleDice(): RollBuilder {\n return this.scaleDice(2);\n }\n\n alwaysHits() {\n return new AlwaysHitBuilder(this);\n }\n\n alwaysCrits() {\n return new AlwaysCritBuilder(this);\n }\n\n copy(): RollBuilder {\n return this.create(this.getSubRollConfigs());\n }\n\n // --- Dice Shortcut Methods ---\n d4 = () => this.d(4);\n d6 = () => this.d(6);\n d8 = () => this.d(8);\n d10 = () => this.d(10);\n d12 = () => this.d(12);\n d20 = () => this.d(20);\n d100 = () => this.d(100);\n\n withElvenAccuracy() {\n const newConfigs = this.getSubRollConfigs();\n newConfigs[newConfigs.length - 1].rollType = \"elven accuracy\";\n return this.create(newConfigs);\n }\n\n toExpression(): string {\n const originalDiceConfigs = this.subRollConfigs.filter(\n (config) => config.sides && config.sides > 0\n );\n\n type Group = { config: RollConfig; totalCount: number };\n const configGroups = new Map<string, Group>();\n\n for (const config of originalDiceConfigs) {\n const keyConfig: Partial<RollConfig> = { ...config };\n delete keyConfig.count;\n delete keyConfig.modifier;\n const key = JSON.stringify(keyConfig);\n\n const existingGroup = configGroups.get(key);\n if (existingGroup) {\n existingGroup.totalCount += config.count;\n } else {\n configGroups.set(key, { config, totalCount: config.count });\n }\n }\n\n const rootConfig = this.getRootDieConfig();\n const groupedConfigs = Array.from(configGroups.values());\n let rootD20Group: Group | undefined;\n\n if (rootConfig && rootConfig.sides === 20) {\n const rootIndex = groupedConfigs.findIndex(\n ({ config }) =>\n rollConfigsEqual(config, rootConfig) &&\n JSON.stringify(config.keep) === JSON.stringify(rootConfig.keep)\n );\n\n if (rootIndex !== -1) {\n rootD20Group = groupedConfigs.splice(rootIndex, 1)[0];\n }\n }\n\n const sortedDiceConfigs = groupedConfigs\n .map(({ config, totalCount }) => ({\n ...config,\n count: totalCount,\n }))\n .sort((a, b) => {\n const aHasPriority = a.reroll > 0 || a.minimum > 0;\n const bHasPriority = b.reroll > 0 || b.minimum > 0;\n if (aHasPriority !== bHasPriority) return aHasPriority ? -1 : 1;\n if (b.sides !== a.sides) return b.sides - a.sides;\n return configComplexityScore(b) - configComplexityScore(a);\n });\n\n const diceConfigs = rootD20Group\n ? [\n { ...rootD20Group.config, count: rootD20Group.totalCount },\n ...sortedDiceConfigs,\n ]\n : sortedDiceConfigs;\n\n const totalModifier = this.subRollConfigs.reduce(\n (sum, config) => sum + config.modifier,\n 0\n );\n if (diceConfigs.length === 0) return totalModifier.toString();\n\n const rootDieConfig = this.getRootDieConfig();\n const newRootConfig = rootDieConfig\n ? diceConfigs.find((c) => rollConfigsEqual(c, rootDieConfig))\n : undefined;\n\n // Generate dice expressions without individual modifiers\n const diceExpressions = diceConfigs.map((config) =>\n this.configToSingleExpressionWithoutModifier(\n config,\n config === newRootConfig\n )\n );\n\n // Join dice expressions with appropriate operators based on their count\n let result = \"\";\n for (let i = 0; i < diceExpressions.length; i++) {\n const config = diceConfigs[i];\n const expression = diceExpressions[i];\n\n if (i === 0) {\n result = (config.isSubtraction ? \"-\" : \"\") + expression;\n\n // Add constants right after the root d20 die (if it's a d20)\n if (config.sides === 20 && totalModifier !== 0) {\n if (totalModifier > 0) result += ` + ${totalModifier}`;\n else result += ` - ${Math.abs(totalModifier)}`;\n }\n } else {\n // Use minus sign for negative subtraction, plus sign otherwise\n const operator = config.isSubtraction ? \" - \" : \" + \";\n result += operator + expression;\n }\n }\n\n // If constants weren't added after d20, add them at the end\n if (diceConfigs.length === 0 || diceConfigs[0].sides !== 20) {\n if (totalModifier > 0) result += ` + ${totalModifier}`;\n else if (totalModifier < 0) result += ` - ${Math.abs(totalModifier)}`;\n }\n\n return result.replace(/\\+ -/g, \"-\");\n }\n\n // Main AST entry point. Cached by the cheap config key across identical rebuilds; see `rollPMFCache`.\n toPMF(eps: number = 0): PMF {\n const key = this.cacheKey();\n if (key === null) return pmfFromRollBuilder(this, eps);\n const fullKey = `${key}*e${eps}`;\n const cached = rollPMFCache.get(fullKey);\n if (cached) return cached;\n const pmf = pmfFromRollBuilder(this, eps);\n rollPMFCache.set(fullKey, pmf);\n return pmf;\n }\n\n get pmf() {\n return this.toPMF();\n }\n\n toQuery(eps: number = 0): DiceQuery {\n return this.toPMF(eps).query();\n }\n\n toAST(): ExpressionNode {\n const configs = this.getSubRollConfigs();\n return (\n astFromRollConfigs(configs) ||\n ({ type: \"constant\", value: 0 } as ExpressionNode)\n );\n }\n\n private configToSingleExpressionWithoutModifier(\n config: RollConfig,\n isRootDie: boolean\n ): string {\n if (!config.sides || config.sides <= 0) return \"\";\n\n // The string grammar has no explode token at all (see parser.ts/dice.ts) -- there is no\n // representable syntax that round-trips an exploding die's distribution. Silently rendering\n // a plain (non-exploding) die here would re-parse to a materially different, WRONG\n // distribution with no indication anything was lost. Fail loudly instead.\n if (config.explode && Number.isFinite(config.explode) && config.explode > 0) {\n throw new Error(\n `toExpression() cannot represent an exploding die (d${config.sides} explode(${config.explode})): the string grammar has no explode syntax. Use the builder's own PMF (.toPMF()/.pmf) instead of round-tripping through toExpression()/parse().`\n );\n }\n\n let baseDie = `d${config.sides}`;\n\n // A reroll(k) config means \"reroll faces 1..k once, must keep\" (see resolveSingleDie) — a\n // THRESHOLD, not a literal face value. The parser's `reroll <n>` for a bare number n rerolls\n // ONLY face value n (matches k=1, where the threshold and the literal face coincide); for\n // k>=2 the threshold must be expressed as `reroll d{k}`, using a k-sided die's face SET\n // {1..k} as the reroll operator's argument — chaining `reroll 1 reroll 2 ... reroll k` as\n // separate clauses re-parses as k SEQUENTIAL reroll passes, a different (and wrong)\n // distribution. `rerollClause` is shared by every placement below (with/without minimum,\n // with/without explode) since the clause's own content never depends on where it sits.\n const rerollClause = config.reroll > 0 ? (config.reroll === 1 ? \" reroll 1\" : ` reroll d${config.reroll}`) : \"\";\n\n if (config.reroll > 0) {\n if (config.minimum > 0 && config.explode > 0) {\n // Complex single roll case: minimum + explode + reroll\n // Apply reroll after minimum is applied\n } else {\n baseDie += rerollClause;\n }\n }\n\n if (config.minimum > 0) {\n if (config.reroll > 0 && !config.explode) {\n baseDie = `${config.minimum}>(${baseDie})`;\n } else {\n baseDie = `${config.minimum}>${baseDie}`;\n }\n if (config.reroll > 0 && config.explode > 0) {\n baseDie += rerollClause;\n }\n }\n\n // Check for hd20 shorthand AFTER adding explode\n if (baseDie === \"d20 reroll 1\" && config.minimum <= 1) baseDie = \"hd20\";\n\n let mainExpression = \"\";\n switch (config.rollType) {\n case \"advantage\":\n mainExpression = `${baseDie} > ${baseDie}`;\n break;\n case \"disadvantage\":\n mainExpression = `${baseDie} < ${baseDie}`;\n break;\n case \"elven accuracy\":\n mainExpression = `${baseDie} > ${baseDie} > ${baseDie}`;\n break;\n case \"flat\":\n if (config.keep) {\n const mode = config.keep.mode === \"highest\" ? \"kh\" : \"kl\";\n\n // The inner expression must match astFromRollConfigs' own per-trial shape (see\n // resolve()'s \"keep\" case, which reads it back out as `node.child.child`), not just\n // echo `config.count`. astFromRollConfigs collapses to \"N individual dice, keep top K\"\n // (a bare per-trial die) exactly when the die count equals the trial count (`baseCount\n // === trials`) -- UNLESS it's the kh1 case (count 1, highest), which always keeps its\n // per-trial die multiplied by baseCount even when baseCount happens to equal trials\n // (`3kh1` on 3d6-per-trial means \"max of three 3d6 sums\", not \"max of 3 individual\n // d6\"). Getting this wrong previously serialized `roll(4,d6).keepHighest(4,3)` as\n // `4kh3(4d6)` (\"keep 3 of four 4d6 sums\") instead of the correct `4kh3(1d6)` (\"keep 3\n // of four individual d6 rolls\") -- a ~3.7x overstatement on re-parse.\n const baseCount = Math.max(1, Math.floor(Math.abs(config.count || 1)));\n const trials = Math.max(1, Math.floor(config.keep.total));\n const isMaxOfShape = config.keep.count === 1 && config.keep.mode === \"highest\";\n const innerCount = trials === baseCount && !isMaxOfShape ? 1 : baseCount;\n\n const baseDieExpression =\n this.configToSingleExpressionWithoutModifier(\n {\n ...config,\n count: innerCount,\n modifier: 0,\n rollType: \"flat\",\n keep: undefined,\n },\n false\n );\n mainExpression = `${config.keep.total}${mode}${config.keep.count}(${baseDieExpression})`;\n } else {\n const isComplex = baseDie.length > `d${config.sides}`.length;\n const isHalflingShorthand = baseDie === \"hd20\";\n const isD20Shorthand = baseDie === \"d20\" && isRootDie;\n const hasMinimum = config.minimum > 0;\n const hasReroll = config.reroll > 0;\n // For negative subtraction, use absolute value for display\n // For negative counts from factory function, treat as 1 (legacy behavior)\n const effectiveCount = config.isSubtraction\n ? Math.abs(config.count)\n : config.count < 0\n ? 1\n : Math.abs(config.count);\n\n if (effectiveCount > 1) {\n const shouldAddParentheses = isComplex;\n mainExpression = shouldAddParentheses\n ? `${effectiveCount}(${baseDie})`\n : `${effectiveCount}${baseDie}`;\n } else if (effectiveCount === 1) {\n const needsParens = hasReroll && hasMinimum;\n if (config.isSubtraction) {\n mainExpression = needsParens ? `1(${baseDie})` : `1${baseDie}`;\n } else if (\n isComplex ||\n isHalflingShorthand ||\n isD20Shorthand ||\n config.count < 0\n ) {\n mainExpression = needsParens ? `1(${baseDie})` : baseDie;\n } else {\n mainExpression = needsParens ? `1(${baseDie})` : `1${baseDie}`;\n }\n } else {\n mainExpression = baseDie;\n }\n }\n if (config.bestOf && config.count && config.bestOf < config.count) {\n const pool = Math.max(1, Math.floor(Math.abs(config.count)));\n const baseDieExpression = this.configToSingleExpressionWithoutModifier(\n {\n ...config,\n count: 1,\n modifier: 0,\n bestOf: 0,\n keep: undefined,\n rollType: \"flat\",\n },\n false\n );\n mainExpression = `${pool}kh${Math.floor(config.bestOf)}(${baseDieExpression})`;\n }\n break;\n }\n\n return mainExpression;\n }\n\n getRootDieConfig(): RollConfig | undefined {\n const configs = this.subRollConfigs;\n return configs.find((config) => config.sides > 0) || configs[0];\n }\n\n getAllDieConfigs(): readonly RollConfig[] {\n return this.getSubRollConfigs();\n }\n\n getBonusDiceConfigs(): RollConfig[] {\n const allConfigs = this.subRollConfigs;\n const rootConfig =\n allConfigs.find((config) => config.sides > 0) || allConfigs[0];\n if (!rootConfig) return [];\n return allConfigs\n .filter((config) => config.sides > 0)\n .filter((config) => config !== rootConfig);\n }\n\n getBonusDicePMFs(check: RollBuilder, eps: number = 0): PMF[] {\n return check\n .getBonusDiceConfigs()\n .map((config) =>\n pmfFromRollBuilder(RollBuilder.fromConfigs([config]), eps)\n );\n }\n\n get modifier(): number {\n return this.subRollConfigs.reduce(\n (sum, config) => sum + config.modifier,\n 0\n );\n }\n\n get rollType(): RollType {\n const rootConfig = this.getRootDieConfig();\n return rootConfig?.rollType || \"flat\";\n }\n\n get baseReroll(): number {\n const rootConfig = this.getRootDieConfig();\n return rootConfig?.reroll || 0;\n }\n\n half(): HalfRollBuilder {\n return new HalfRollBuilder(this);\n }\n\n /**\n * Scale this roll's result by `numerator / denominator`, rounding each outcome.\n * A general, composable form of {@link half} — used to model damage-type resistance\n * (`scaleResult(1, 2)` → `(expr) // 2`) and vulnerability (`scaleResult(2)` → `2 * (expr)`).\n * Compose several of these (and plain rolls) into one payload with {@link sumRolls}.\n */\n scaleResult(\n numerator: number,\n denominator: number = 1,\n rounding: \"floor\" | \"round\" | \"ceil\" = \"floor\"\n ): ScaleRollBuilder {\n return new ScaleRollBuilder(this, numerator, denominator, rounding);\n }\n\n // Create a \"max of N rolls\" version of this roll for crit damage with keep operations\n maxOf(count: number): MaxOfRollBuilder {\n return new MaxOfRollBuilder(this, count);\n }\n\n // These methods are implemented via prototype augmentation in ac.ts and dc.ts\n // They are declared here to provide proper TypeScript types\n ac(_targetAC: number): ACBuilder {\n throw new Error(\"ac() should be implemented via prototype augmentation\");\n }\n\n dc(_saveDC: number): DCBuilder {\n throw new Error(\"dc() should be implemented via prototype augmentation\");\n }\n}\n\nexport class HalfRollBuilder extends RollBuilder {\n constructor(private readonly innerRoll: RollBuilder) {\n super(0); // dummy, we override methods\n }\n\n override hasHiddenState(): boolean {\n return this.innerRoll.hasHiddenState();\n }\n\n override cacheKey(): string | null {\n return null; // half-of transform not captured by subRollConfigs\n }\n\n // No need to override create if we don't expose RollBuilder methods that use it,\n // but HalfRollBuilder extends RollBuilder so it does.\n // However, HalfRollBuilder seems to just wrap another roll.\n // If we call .plus() on HalfRollBuilder, it returns a HalfRollBuilder?\n // No, RollBuilder.plus returns RollBuilder.\n // The inheritance here is a bit tricky.\n // Existing code for HalfRollBuilder doesn't seem to implement plus/etc.\n // So .plus() on a HalfRollBuilder would return a RollBuilder (base class).\n // Which is fine.\n // The only issue is if we want it to return HalfRollBuilder, but it doesn't seem designed for that.\n\n override get lastConfig(): RollConfig {\n // `lastConfig` is protected on the base class; reach it on the wrapped\n // instance via a typed view rather than `any`.\n return (this.innerRoll as unknown as { lastConfig: RollConfig }).lastConfig;\n }\n\n getSubRollConfigs(): readonly RollConfig[] {\n return this.innerRoll.getSubRollConfigs();\n }\n\n toExpression(): string {\n const innerExpression = this.innerRoll.toExpression();\n return `(${innerExpression}) // 2`;\n }\n\n toAST(): ExpressionNode {\n return {\n type: \"half\",\n child: this.innerRoll.toAST(),\n };\n }\n\n toPMF(eps: number = 0): PMF {\n return pmfFromRollBuilder(this, eps);\n }\n\n // Scale the dice, keep the same // 2 (half) transform applied on top -- delegating to the\n // base class's `create()`-based scaleDice would drop the halving entirely, e.g. a doubled-dice\n // crit on a resisted hit payload silently losing the resistance.\n override scaleDice(scale: number): RollBuilder {\n return new HalfRollBuilder(this.innerRoll.scaleDice(scale));\n }\n\n copy(): HalfRollBuilder {\n return new HalfRollBuilder(this.innerRoll.copy());\n }\n}\n\n/**\n * A roll whose result is scaled by `numerator / denominator` and rounded — the composable\n * generalization of {@link HalfRollBuilder}. Renders as `N * (inner)`, `(inner) // D`, or\n * `(inner) * N // D`. Terminal (like `half`): use {@link sumRolls} to combine with other rolls.\n */\nexport class ScaleRollBuilder extends RollBuilder {\n constructor(\n private readonly innerRoll: RollBuilder,\n private readonly numerator: number,\n private readonly denominator: number = 1,\n private readonly rounding: \"floor\" | \"round\" | \"ceil\" = \"floor\"\n ) {\n super(0); // dummy, we override methods\n }\n\n override hasHiddenState(): boolean {\n return this.innerRoll.hasHiddenState();\n }\n\n override cacheKey(): string | null {\n return null; // scale transform not captured by subRollConfigs\n }\n\n override get lastConfig(): RollConfig {\n return (this.innerRoll as unknown as { lastConfig: RollConfig }).lastConfig;\n }\n\n getSubRollConfigs(): readonly RollConfig[] {\n return this.innerRoll.getSubRollConfigs();\n }\n\n toExpression(): string {\n const inner = this.innerRoll.toExpression();\n const denominator = this.denominator === 0 ? 1 : this.denominator;\n if (denominator === 1) return `${this.numerator} ** (${inner})`;\n // The grammar has only floor (`//`) and ceil (`/`) division; there is no round-half token.\n if (this.rounding === \"round\") {\n throw new Error(\n `toExpression() cannot represent scaleResult(${this.numerator}, ${this.denominator}, \"round\"): the string grammar has only floor (//) and ceil (/) division. Use the builder's own PMF (.toPMF()/.pmf) instead.`\n );\n }\n const div = this.rounding === \"ceil\" ? \"/\" : \"//\";\n // `*` in this grammar is `conditionalApply` (an attack-gate operator: \"if the left side is\n // nonzero, take the right side\"), NOT multiplication -- `**` is. A scale of e.g. `2/1`\n // (vulnerability) previously rendered as `2 * (inner)`, which re-parsed as \"if 2 (always\n // nonzero) then take `inner`\", silently dropping the multiplier entirely on round-trip.\n if (this.numerator === 1) return `(${inner}) ${div} ${denominator}`;\n return `(${inner}) ** ${this.numerator} ${div} ${denominator}`;\n }\n\n toAST(): ExpressionNode {\n return {\n type: \"scale\",\n numerator: this.numerator,\n denominator: this.denominator,\n rounding: this.rounding,\n child: this.innerRoll.toAST(),\n };\n }\n\n toPMF(eps: number = 0): PMF {\n return pmfFromRollBuilder(this, eps);\n }\n\n // Scale the dice, keep the same numerator/denominator/rounding transform applied on top --\n // delegating to the base class's `create()`-based scaleDice would drop the scale entirely,\n // e.g. a doubled-dice crit on a vulnerable hit payload silently losing the vulnerability.\n override scaleDice(scale: number): RollBuilder {\n return new ScaleRollBuilder(\n this.innerRoll.scaleDice(scale),\n this.numerator,\n this.denominator,\n this.rounding\n );\n }\n\n copy(): ScaleRollBuilder {\n return new ScaleRollBuilder(\n this.innerRoll.copy(),\n this.numerator,\n this.denominator,\n this.rounding\n );\n }\n}\n\nexport class MaxOfRollBuilder extends RollBuilder {\n constructor(\n private readonly innerRoll: RollBuilder,\n private readonly count: number,\n private readonly diceCount?: number,\n private readonly diceSides?: number\n ) {\n super(0); // dummy, we override methods\n }\n\n override hasHiddenState(): boolean {\n return this.innerRoll.hasHiddenState();\n }\n\n override cacheKey(): string | null {\n return null; // max-of transform not captured by subRollConfigs\n }\n\n override get lastConfig(): RollConfig {\n // `lastConfig` is protected on the base class; reach it on the wrapped\n // instance via a typed view rather than `any`.\n return (this.innerRoll as unknown as { lastConfig: RollConfig }).lastConfig;\n }\n\n getSubRollConfigs(): readonly RollConfig[] {\n return this.innerRoll.getSubRollConfigs();\n }\n\n toExpression(): string {\n // Use the stored dice info to create the expression directly\n if (this.diceCount && this.diceSides) {\n return `max${this.count}(${this.diceCount}d${this.diceSides})`;\n }\n\n // If no stored dice info, fallback to simple max expression\n return `max${this.count}(?d?)`;\n }\n\n toAST(): ExpressionNode {\n // Use the stored dice info if available\n if (this.diceCount && this.diceSides) {\n const sumChild: ExpressionNode = {\n type: \"sum\",\n count: this.diceCount,\n child: { type: \"die\", sides: this.diceSides },\n };\n return {\n type: \"maxOf\",\n count: this.count,\n child: sumChild,\n };\n }\n\n // Fallback: try to get from innerRoll\n try {\n const configs = this.innerRoll.getSubRollConfigs();\n if (configs.length === 1 && configs[0].sides) {\n const config = configs[0];\n const sumChild: ExpressionNode = {\n type: \"sum\",\n count: config.count,\n child: { type: \"die\", sides: config.sides },\n };\n return {\n type: \"maxOf\",\n count: this.count,\n child: sumChild,\n };\n }\n } catch {\n // Last resort: try parsing the expression (though this shouldn't work with current RollBuilder)\n }\n\n // Fallback - this shouldn't happen in normal usage\n throw new Error(\n `MaxOfRollBuilder.toAST(): Unsupported innerRoll configuration`\n );\n }\n\n toPMF(eps: number = 0): PMF {\n return pmfFromRollBuilder(this, eps);\n }\n\n // Scale the dice INSIDE each trial (e.g. maxOf(2, 1d12) -> maxOf(2, 2d12)), keeping the same\n // trial count -- delegating to the base class's `create()`-based scaleDice would collapse\n // straight to plain dice, losing the \"take the highest of N trials\" semantics entirely.\n override scaleDice(scale: number): RollBuilder {\n const scaleInt = validateScaleInt(scale);\n return new MaxOfRollBuilder(\n this.innerRoll.scaleDice(scaleInt),\n this.count,\n this.diceCount ? this.diceCount * scaleInt : undefined,\n this.diceSides\n );\n }\n\n copy(): MaxOfRollBuilder {\n return new MaxOfRollBuilder(this.innerRoll.copy(), this.count);\n }\n}\n\nexport class AlwaysHitBuilder extends RollBuilder {\n readonly attackConfig: CritConfig;\n\n constructor(baseRoll: RollBuilder, attackConfig?: CritConfig) {\n if (baseRoll.hasHiddenState()) {\n throw new Error(\n \"Cannot create AlwaysHitBuilder from a roll with hidden state.\"\n );\n }\n super(baseRoll.getSubRollConfigs());\n\n if (attackConfig) {\n this.attackConfig = { ...attackConfig };\n } else {\n this.attackConfig = { critThreshold: 20 };\n }\n }\n\n protected create(configs: readonly RollConfig[]): RollBuilder {\n return new RollBuilder(configs);\n }\n\n onHit(val: number): AttackBuilder;\n onHit(val: string): AttackBuilder;\n onHit(val: RollBuilder): AttackBuilder;\n onHit(count: number, die: RollBuilder): AttackBuilder;\n onHit(count: number, sides: number): AttackBuilder;\n onHit(count: number, die: RollBuilder, modifier: number): AttackBuilder;\n onHit(count: number, sides: number, modifier: number): AttackBuilder;\n onHit(...args: any[]): AttackBuilder {\n const damageRoll = RollBuilder.fromArgs(...args);\n return new AttackBuilder(this, damageRoll);\n }\n\n get critThreshold(): number {\n return this.attackConfig.critThreshold;\n }\n\n override cacheKey(): string | null {\n const base = super.cacheKey();\n return base === null ? null : `H|${this.attackConfig.critThreshold}|${base}`;\n }\n\n // TODO - move this to AC Builder… or if we create a DC builder that has critOn, throw an error?\n critOn(critThreshold: number): AlwaysHitBuilder {\n const newConfig = { critThreshold };\n return new AlwaysHitBuilder(this, newConfig);\n }\n\n alwaysCrits(): AlwaysCritBuilder {\n return new AlwaysCritBuilder(this, undefined, true);\n }\n\n // Legacy expressions\n override toExpression(): string {\n const configs = this.getSubRollConfigs();\n return new RollBuilder(configs).toExpression();\n }\n\n override toPMF(): PMF {\n return resolveRootD20(this);\n }\n\n override copy(): AlwaysHitBuilder {\n const baseCopy = new RollBuilder(this.getSubRollConfigs());\n const critThreshold = this.critThreshold;\n const newConfig = { critThreshold };\n return new AlwaysHitBuilder(baseCopy, newConfig);\n }\n}\n\nexport class AlwaysCritBuilder extends RollBuilder {\n readonly attackConfig: CritConfig & { ac?: number };\n readonly fromAlwaysHit: boolean;\n\n constructor(\n baseRoll: RollBuilder,\n attackConfig?: CritConfig & { ac?: number },\n fromAlwaysHit: boolean = false\n ) {\n if (baseRoll.hasHiddenState()) {\n throw new Error(\n \"Cannot create AlwaysCritBuilder from a roll with hidden state.\"\n );\n }\n super(baseRoll.getSubRollConfigs());\n\n if (attackConfig) {\n this.attackConfig = { ...attackConfig };\n } else {\n this.attackConfig = { critThreshold: 20 };\n }\n this.fromAlwaysHit = fromAlwaysHit || baseRoll instanceof AlwaysHitBuilder;\n }\n\n protected create(configs: readonly RollConfig[]): RollBuilder {\n return new RollBuilder(configs);\n }\n\n onHit(val: number): AttackBuilder;\n onHit(val: string): AttackBuilder;\n onHit(val: RollBuilder): AttackBuilder;\n onHit(count: number, die: RollBuilder): AttackBuilder;\n onHit(count: number, sides: number): AttackBuilder;\n onHit(count: number, die: RollBuilder, modifier: number): AttackBuilder;\n onHit(count: number, sides: number, modifier: number): AttackBuilder;\n onHit(...args: any[]): AttackBuilder {\n const damageRoll = RollBuilder.fromArgs(...args);\n return new AttackBuilder(this, damageRoll);\n }\n\n get critThreshold(): number {\n return this.attackConfig.critThreshold;\n }\n\n override cacheKey(): string | null {\n const base = super.cacheKey();\n return base === null ? null : `C|${this.fromAlwaysHit ? 1 : 0}|${this.attackConfig.critThreshold}|${this.attackConfig.ac ?? \"\"}|${base}`;\n }\n\n critOn(critThreshold: number): AlwaysCritBuilder {\n const newConfig = { critThreshold, ac: this.attackConfig.ac };\n return new AlwaysCritBuilder(this, newConfig, this.fromAlwaysHit);\n }\n\n // Legacy expressions\n override toExpression(): string {\n const configs = this.getSubRollConfigs();\n return new RollBuilder(configs).toExpression();\n }\n\n override toPMF(): PMF {\n return resolveRootD20(this);\n }\n\n override copy(): AlwaysCritBuilder {\n const baseCopy = new RollBuilder(this.getSubRollConfigs());\n const critThreshold = this.critThreshold;\n const newConfig = { critThreshold, ac: this.attackConfig.ac };\n return new AlwaysCritBuilder(baseCopy, newConfig, this.fromAlwaysHit);\n }\n}\n\nexport class ParsedRollBuilder extends RollBuilder {\n private readonly cachedPMF: PMF;\n private readonly originalExpression: string;\n\n constructor(expression: string) {\n super([]); // Empty configs since we're bypassing the normal builder flow\n this.originalExpression = expression;\n this.cachedPMF = parse(expression, 0);\n }\n\n override hasHiddenState(): boolean {\n return true;\n }\n\n override cacheKey(): string | null {\n return null; // parsed expression not captured by subRollConfigs\n }\n\n protected create(configs: readonly RollConfig[]): RollBuilder {\n return new RollBuilder(configs);\n }\n\n override toPMF(_eps: number = 0): PMF {\n // Return the pre-computed PMF, ignoring epsilon for now\n // The parse() function was already called with eps=0\n return this.cachedPMF;\n }\n\n override toExpression(): string {\n return this.originalExpression;\n }\n\n override toAST(): ExpressionNode {\n // Since we don't have the actual AST structure, return a constant node\n // This is a limitation but shouldn't matter for terminal damage expressions\n throw new Error(\n \"ParsedRollBuilder does not support AST conversion. Use the builder API instead.\"\n );\n }\n\n override copy(): ParsedRollBuilder {\n return new ParsedRollBuilder(this.originalExpression);\n }\n\n override doubleDice(): ParsedRollBuilder {\n throw new Error(\n \"ParsedRollBuilder does not support doubleDice(). Use explicit onCrit() with the crit damage expression instead.\"\n );\n }\n}\n\nexport class PooledRollBuilder extends RollBuilder {\n constructor(\n private readonly baseAST: ExpressionNode,\n private readonly baseExpression: string,\n configs: readonly RollConfig[] = []\n ) {\n // Initialize with empty config if none provided\n super(configs.length > 0 ? configs : 0);\n }\n\n protected create(configs: readonly RollConfig[]): PooledRollBuilder {\n // This is the key fix: we preserve the baseAST and baseExpression\n // and only update the configs\n return new PooledRollBuilder(this.baseAST, this.baseExpression, configs);\n }\n\n override hasHiddenState(): boolean {\n return true;\n }\n\n override cacheKey(): string | null {\n return null; // pooled keep-highest not captured by subRollConfigs\n }\n\n override d(_sides: number | undefined): RollBuilder {\n throw new Error(\"Cannot add dice to a pooled roll. The pool is finalized.\");\n }\n\n override reroll(_value: number): RollBuilder {\n throw new Error(\"Cannot set reroll on a pooled roll.\");\n }\n\n override explode(_count: number | undefined = Infinity): RollBuilder {\n throw new Error(\"Cannot set explode on a pooled roll.\");\n }\n\n override minimum(_val: number | undefined): RollBuilder {\n throw new Error(\"Cannot set minimum on a pooled roll.\");\n }\n\n override bestOf(_count: number | undefined): RollBuilder {\n throw new Error(\"Cannot set bestOf on a pooled roll.\");\n }\n\n override keepHighest(_total: number, _count: number): RollBuilder {\n throw new Error(\n \"Cannot use keepHighest on a pooled roll. Use keepHighestAll again if you want nested pooling.\"\n );\n }\n\n override keepLowest(_total: number, _count: number): RollBuilder {\n throw new Error(\n \"Cannot use keepLowest on a pooled roll. Use keepLowestAll again if you want nested pooling.\"\n );\n }\n\n override withAdvantage(): RollBuilder {\n throw new Error(\"Cannot set advantage on a pooled roll.\");\n }\n\n override withDisadvantage(): RollBuilder {\n throw new Error(\"Cannot set disadvantage on a pooled roll.\");\n }\n\n override withElvenAccuracy(): RollBuilder {\n throw new Error(\"Cannot set elven accuracy on a pooled roll.\");\n }\n\n override toAST(): ExpressionNode {\n const configsAST = super.toAST();\n\n // Check if configsAST is effectively zero/empty\n const isZero = configsAST.type === \"constant\" && configsAST.value === 0;\n\n if (isZero) {\n return this.baseAST;\n }\n\n const children: { node: ExpressionNode; sign: 1 | -1 }[] = [\n { node: this.baseAST, sign: 1 },\n { node: configsAST, sign: 1 },\n ];\n\n return { type: \"add\", children };\n }\n\n override toExpression(): string {\n const configsExpression = super.toExpression();\n\n // If no configs added, just return base expression\n if (configsExpression === \"0\") {\n return this.baseExpression;\n }\n\n // Clean up the join\n if (configsExpression.startsWith(\"-\")) {\n // If it's a negative number/expression, format as \" - value\"\n // configsExpression is like \"-2\" or \"-1d6\"\n return `${this.baseExpression} - ${configsExpression.substring(1)}`;\n }\n return `${this.baseExpression} + ${configsExpression}`;\n }\n\n override copy(): PooledRollBuilder {\n return new PooledRollBuilder(\n this.baseAST,\n this.baseExpression,\n this.getSubRollConfigs()\n );\n }\n\n override scaleDice(scale: number): RollBuilder {\n const scaleInt = Math.floor(scale);\n if (scaleInt !== scale) throw new Error(\"Scale must be an integer\");\n if (scaleInt <= 0) throw new Error(\"Scale must be > 0\");\n\n // Scale the base pool (treat it as a die/unit)\n // We wrap the base AST in a SumNode\n const newBaseAST: SumNode = {\n type: \"sum\",\n count: scaleInt,\n child: this.baseAST,\n };\n const newBaseExpr =\n scaleInt === 1\n ? this.baseExpression\n : `${scaleInt}(${this.baseExpression})`;\n\n // We preserve the existing modifiers (subRollConfigs) without scaling them,\n // because scaleDice() generally only scales \"dice\", not flat modifiers.\n // Since we forbid adding dice to PooledRollBuilder, subRollConfigs are only modifiers.\n return new PooledRollBuilder(\n newBaseAST,\n newBaseExpr,\n this.getSubRollConfigs()\n );\n }\n\n times(count: number): PooledRollBuilder {\n if (isNaN(count)) throw new Error(\"Invalid NaN value for times\");\n if (Math.floor(count) !== count)\n throw new Error(\"times() requires an integer\");\n if (count < 0) throw new Error(\"times() requires a non-negative integer\");\n\n // We wrap the current state (base + modifiers) into a new pool repeated N times\n const currentAST = this.toAST();\n const currentExpr = this.toExpression();\n\n const sumNode: SumNode = {\n type: \"sum\",\n count,\n child: currentAST,\n };\n\n const newExpr = count === 1 ? currentExpr : `${count}(${currentExpr})`;\n\n return new PooledRollBuilder(sumNode, newExpr);\n }\n}\n\n/**\n * An additive composite of independent rolls that preserves each part's AST — the piece\n * that lets a scaled/halved sub-roll (which the flat `.plus()` merge would otherwise drop)\n * sit beside plain rolls in one damage payload. Its PMF convolves the parts; its expression\n * joins them with ` + `. Built via {@link sumRolls}; terminal (used as an onHit/onCrit/\n * onSaveFailure payload), so it reports hidden state to reject accidental flat merges.\n */\nclass CompositeSumRollBuilder extends RollBuilder {\n constructor(private readonly parts: readonly RollBuilder[]) {\n super(0); // dummy, we override methods\n }\n\n override hasHiddenState(): boolean {\n return true;\n }\n\n override cacheKey(): string | null {\n return null; // composite sum not captured by subRollConfigs\n }\n\n override getSubRollConfigs(): readonly RollConfig[] {\n return [];\n }\n\n override toAST(): ExpressionNode {\n return {\n type: \"add\",\n children: this.parts.map((p) => ({\n node: p.toAST(),\n sign: 1 as const,\n })),\n };\n }\n\n override toExpression(): string {\n const exprs = this.parts\n .map((p) => p.toExpression())\n .filter((e) => e && e !== \"0\");\n if (exprs.length === 0) return \"0\";\n let result = exprs[0];\n for (let i = 1; i < exprs.length; i++) {\n const e = exprs[i];\n result += e.startsWith(\"-\") ? ` - ${e.substring(1)}` : ` + ${e}`;\n }\n return result.replace(/\\+ -/g, \"-\");\n }\n\n override toPMF(eps: number = 0): PMF {\n return pmfFromRollBuilder(this, eps);\n }\n\n // Scaling a composite (mixed damage types, e.g. base + resisted) must scale each PART's own\n // dice while preserving its own half/scale wrapper -- delegating to the base class's\n // `create()`-based scaleDice would lose every part's transform, collapsing straight to plain\n // dice. This is what auto-crit doubling (attack.ts's `hitEffect.copy().doubleDice()`) relies\n // on for a mixed-resistance hit payload.\n override scaleDice(scale: number): RollBuilder {\n validateScaleInt(scale);\n return new CompositeSumRollBuilder(\n this.parts.map((p) => p.scaleDice(scale))\n );\n }\n\n override copy(): CompositeSumRollBuilder {\n return new CompositeSumRollBuilder(this.parts.map((p) => p.copy()));\n }\n}\n\n/**\n * Combine several rolls into one additive payload whose PMF is their convolution and whose\n * expression is them joined with ` + `. Unlike `a.plus(b)`, this preserves parts that carry\n * hidden state (e.g. `roll.scaleResult(1, 2)` / `roll.half()`), so per-damage-type resistance\n * and vulnerability survive into both the distribution and the rendered expression.\n * Empty parts collapse to `0`; a single part is returned unwrapped.\n */\nexport function sumRolls(parts: readonly RollBuilder[]): RollBuilder {\n const meaningful = parts.filter((p): p is RollBuilder => p !== undefined);\n if (meaningful.length === 0) return new RollBuilder(0);\n if (meaningful.length === 1) return meaningful[0];\n return new CompositeSumRollBuilder(meaningful);\n}\n","import { LRUCache } from \"../common/lru-cache\";\nimport type { PMF } from \"../pmf/pmf\";\nimport { RollBuilder } from \"./roll\";\nimport type { RollFactory } from \"./types\";\n\nconst rollFn = (\n count: number,\n sidesOrDie?: number | RollBuilder,\n modifier?: number\n): RollBuilder => {\n if (sidesOrDie instanceof RollBuilder) {\n if (sidesOrDie.hasHiddenState()) {\n throw new Error(\n \"Cannot use a roll with hidden state (like a pooled roll) as a die type.\"\n );\n }\n // roll(2, d6, 5)\n // Create a new config, using the base die's config but overriding the count\n const subRollConfigs = sidesOrDie.getSubRollConfigs();\n if (subRollConfigs.length === 0) return new RollBuilder(0).plus(modifier);\n\n const absCount = Math.abs(count);\n\n const newConfigs = subRollConfigs.map((config) => ({\n ...config,\n count: config.count * absCount,\n modifier: config.modifier * absCount,\n }));\n\n let resultBuilder = new RollBuilder(newConfigs);\n\n if (count < 0) {\n const negatedConfigs = resultBuilder\n .getSubRollConfigs()\n .map((c) => ({ ...c, isSubtraction: !c.isSubtraction }));\n resultBuilder = new RollBuilder(negatedConfigs);\n }\n\n return resultBuilder.plus(modifier);\n } else {\n // roll(2, 6, 5)\n let builder = new RollBuilder(count);\n if (sidesOrDie && sidesOrDie > 0) {\n builder = builder.d(sidesOrDie);\n }\n return builder.plus(modifier);\n }\n};\n\nrollFn.d = (sides: number | string): RollBuilder => {\n if (typeof sides === \"string\") {\n return RollBuilder.fromArgs(sides);\n }\n return new RollBuilder(1).d(sides);\n};\nrollFn.hd20 = (): RollBuilder => new RollBuilder(1).d20().reroll(1);\nrollFn.d4 = (): RollBuilder => new RollBuilder(1).d4();\nrollFn.d6 = (): RollBuilder => new RollBuilder(1).d6();\nrollFn.d8 = (): RollBuilder => new RollBuilder(1).d8();\nrollFn.d10 = (): RollBuilder => new RollBuilder(1).d10();\nrollFn.d12 = (): RollBuilder => new RollBuilder(1).d12();\nrollFn.d20 = (): RollBuilder => new RollBuilder(1).d20();\nrollFn.d100 = (): RollBuilder => new RollBuilder(1).d100();\nrollFn.flat = (n: number): RollBuilder => new RollBuilder(0).plus(n);\n\nexport function d(sides: number | string): RollBuilder {\n if (typeof sides === \"string\") {\n return RollBuilder.fromArgs(sides);\n }\n return new RollBuilder(1).d(sides);\n}\n\nexport const d4 = new RollBuilder(1).d4();\nexport const d6 = new RollBuilder(1).d6();\nexport const d8 = new RollBuilder(1).d8();\nexport const d10 = new RollBuilder(1).d10();\nexport const d12 = new RollBuilder(1).d12();\nexport const d20 = new RollBuilder(1).d20();\nexport const hd20 = new RollBuilder(1).d20().reroll(1);\nexport const d100 = new RollBuilder(1).d100();\nexport const flat = (n: number) => new RollBuilder(0).plus(n);\n\nexport const roll: RollFactory = rollFn as RollFactory;\n\nexport const builderPMFCache = new LRUCache<string, PMF>(1000);\n","import { LRUCache, PMF } from \"../\";\nimport { d20RollPMF } from \"./d20\";\nimport { builderPMFCache } from \"./factory\";\nimport type {\n AddNode,\n ConstantNode,\n D20RollNode,\n DieNode,\n ExpressionNode,\n KeepNode,\n MaxOfNode,\n SumNode,\n} from \"./nodes\";\nimport type { RollBuilder } from \"./roll\";\nimport type { RollConfig, RollType } from \"./types\";\n\n// For now, default to 0 epsilon. Later we can tighten to EPS.\nconst defaultEps = 0;\n\nconst singleDiePMFCache = new LRUCache<string, PMF>(1000);\n\nexport function dieNodeFromConfig(cfg: RollConfig): DieNode {\n return {\n type: \"die\",\n sides: cfg.sides,\n reroll: cfg.reroll > 0 ? cfg.reroll : undefined,\n minimum: cfg.minimum > 0 ? cfg.minimum : undefined,\n explode:\n cfg.explode && Number.isFinite(cfg.explode) && cfg.explode > 0\n ? cfg.explode\n : undefined,\n };\n}\n\nexport function astFromRollConfigs(\n configs: readonly RollConfig[]\n): ExpressionNode | undefined {\n // TODO add cache for this\n if (!configs || configs.length === 0) return undefined;\n\n const children: { node: ExpressionNode; sign: 1 | -1 }[] = [];\n let constantSum = 0;\n\n for (const cfg of configs) {\n const sign: 1 | -1 = cfg.isSubtraction || cfg.count < 0 ? -1 : 1;\n const count = Math.abs(cfg.count || 0);\n\n constantSum += cfg.modifier || 0;\n\n if ((cfg.sides || 0) <= 0) continue;\n\n // `bestOf(k)` (\"roll N, keep the highest k\") is exactly `keep = {total: N, count: k, mode:\n // \"highest\"}` over the same die -- fold it into an equivalent synthetic `keep` up front so it\n // reuses the keep-DP branch below instead of being silently ignored (the die count alone,\n // with no keep applied, previously determined the PMF -- e.g. `5d10.bestOf(3)` resolved as\n // plain 5d10 despite `toExpression()` correctly rendering \"5d10kh3\").\n const isSynthesizedBestOf =\n !cfg.keep && cfg.bestOf > 0 && cfg.bestOf < count;\n const effectiveKeep = isSynthesizedBestOf\n ? { total: count, count: Math.floor(cfg.bestOf), mode: \"highest\" as const }\n : cfg.keep;\n\n const die: DieNode = dieNodeFromConfig(cfg);\n\n let node: ExpressionNode = die;\n\n let appliedRollType = false;\n if (cfg.rollType && cfg.rollType !== \"flat\") {\n if (cfg.sides === 20) {\n node = {\n type: \"d20Roll\",\n rollType: cfg.rollType,\n child: node,\n } as D20RollNode;\n } else {\n const n = cfg.rollType === \"elven accuracy\" ? 3 : 2;\n const mode = cfg.rollType === \"disadvantage\" ? \"lowest\" : \"highest\";\n const base: SumNode = { type: \"sum\", count: n, child: node };\n node = { type: \"keep\", mode, count: 1, child: base } as KeepNode;\n }\n appliedRollType = true;\n }\n\n if (cfg.rollType === \"flat\" && effectiveKeep && effectiveKeep.total > 0) {\n const baseCount = Math.max(1, Math.floor(Math.abs(count || 1)));\n const trials = Math.max(1, Math.floor(effectiveKeep.total));\n const k = Math.max(0, Math.floor(effectiveKeep.count));\n\n // For keep-highest of 1, always treat as trials-of-sums: max over trial sums\n // A synthesized `bestOf` trial is a SINGLE die, never `baseCount` dice, so it must not\n // take the maxOf-of-sums shape.\n if (k === 1 && effectiveKeep.mode === \"highest\" && !isSynthesizedBestOf) {\n const perTrial: SumNode = {\n type: \"sum\",\n count: baseCount,\n child: node,\n };\n if (trials === 1) {\n node = perTrial;\n } else {\n node = {\n type: \"maxOf\",\n count: trials,\n child: perTrial,\n } as MaxOfNode;\n }\n } else if (trials === baseCount) {\n // Classic pool: keep K of N faces from N iid dice\n const base: SumNode = { type: \"sum\", count: trials, child: node };\n node = {\n type: \"keep\",\n mode: effectiveKeep.mode,\n count: k,\n child: base,\n } as KeepNode;\n } else {\n // General trials-of-sums: trials of (baseCount dice sum), keep K trial sums\n const perTrial: SumNode = {\n type: \"sum\",\n count: baseCount,\n child: node,\n };\n if (trials === 1) {\n node = perTrial;\n } else {\n const trialPool: SumNode = {\n type: \"sum\",\n count: trials,\n child: perTrial,\n };\n node = {\n type: \"keep\",\n mode: effectiveKeep.mode,\n count: k,\n child: trialPool,\n } as KeepNode;\n }\n }\n } else {\n const c = appliedRollType ? 1 : Math.max(1, count || 1);\n node = { type: \"sum\", count: c, child: node } as SumNode;\n }\n\n children.push({ node, sign });\n }\n\n if (children.length === 0) {\n return { type: \"constant\", value: constantSum } as ConstantNode;\n }\n\n const add: AddNode = { type: \"add\", children };\n if (constantSum !== 0)\n add.children.push({\n node: { type: \"constant\", value: constantSum },\n sign: 1,\n });\n return add;\n}\n\nexport function resolve(node: ExpressionNode, eps: number = defaultEps): PMF {\n const signature = getASTSignature(node);\n const cacheKey = `${signature}_${eps}`;\n\n const cached = builderPMFCache.get(cacheKey);\n if (cached) return cached;\n\n const result = ((): PMF => {\n switch (node.type) {\n case \"constant\":\n return PMF.delta(node.value, eps);\n\n case \"die\": {\n return resolveSingleDie(node, eps);\n }\n\n case \"sum\": {\n const base = resolve(node.child, eps);\n const n = Math.max(0, Math.floor(node.count));\n if (n === 0) return PMF.delta(0, eps);\n if (n === 1) return base;\n return base.power(n, eps);\n }\n\n case \"add\": {\n let shift = 0;\n const parts: PMF[] = [];\n for (const c of node.children) {\n if (c.node.type === \"constant\") {\n shift += c.sign * c.node.value;\n } else {\n const p = resolve(c.node, eps);\n parts.push(c.sign === 1 ? p : p.mapDamage((v) => -v));\n }\n }\n if (parts.length === 0) return PMF.delta(shift, eps);\n let res = parts.length === 1 ? parts[0] : PMF.convolveMany(parts, eps);\n if (shift !== 0) res = res.mapDamage((v) => v + shift);\n return res;\n }\n\n case \"keep\": {\n const totalTrials = getTotalCount(node);\n const keepCount = Math.max(0, Math.min(node.count, totalTrials));\n if (keepCount === 0 || totalTrials === 0) return PMF.delta(0, eps);\n\n // Resolve the per-trial PMF (the child of the Sum inside Keep)\n const perTrialNode = node.child.child; // Sum(child: perTrial)\n const perTrialPMF = resolve(perTrialNode, eps);\n\n return keepSumPMF(\n perTrialPMF,\n totalTrials,\n keepCount,\n node.mode === \"highest\",\n eps\n );\n }\n\n case \"d20Roll\": {\n const childDie = findDie(node.child);\n if (!childDie) return d20RollPMF(node.rollType, false);\n return resolveD20Roll(childDie, node.rollType);\n }\n\n case \"half\": {\n const childPMF = resolve(node.child, eps);\n return childPMF.scaleDamage(0.5, \"floor\");\n }\n\n case \"maxOf\": {\n const childPMF = resolve(node.child, eps);\n const count = Math.max(1, Math.floor(node.count));\n if (count === 1) return childPMF;\n\n // Compute the maximum of count independent rolls of childPMF\n return computeMaxOfPMF(childPMF, count, eps);\n }\n\n case \"scale\": {\n const childPMF = resolve(node.child, eps);\n const denom = node.denominator === 0 ? 1 : node.denominator;\n return childPMF.scaleDamage(node.numerator / denom, node.rounding);\n }\n }\n })();\n\n builderPMFCache.set(cacheKey, result);\n return result;\n}\n\nexport function pmfFromRollBuilder(\n rb: RollBuilder,\n eps: number = defaultEps\n): PMF {\n const ast = rb.toAST();\n return resolve(ast, eps);\n}\n\nconst d20RollLiftCache = new LRUCache<string, PMF>(500);\n\n/**\n * Resolve a d20-shaped die (honoring reroll/minimum/explode via {@link resolveSingleDie}) then\n * lift it into advantage/disadvantage/elven accuracy. Each of the 2 or 3 rolls compared is an\n * independent draw from that SAME resolved marginal — so a Halfling Lucky reroll or a\n * Trance-of-Order floor applies per-die, matching RAW (you reroll/floor each d20 you roll, not\n * just a single \"representative\" one). This generalizes {@link d20RollPMF}, which only ever\n * modeled the plain-uniform-plus-reroll-1 case; callers that resolve a die with no minimum/\n * explode/deeper reroll get bit-identical results to `d20RollPMF` (verified: the reroll-only\n * formula below reduces to the same closed form).\n *\n * Deliberately ignores any caller-facing output-precision `eps` (matching `d20RollPMF`'s own\n * contract): this builds the FOUNDATIONAL check-die distribution, where every face carries real\n * probability mass (e.g. 1/20 per face on a flat d20) — pruning it against an output-rounding\n * epsilon (some callers request eps as coarse as 0.1 purely to round the FINAL hit/miss/crit\n * mixture) would silently delete real faces instead of real noise. Always resolves at the\n * library's near-zero {@link defaultEps} internally; only the mixture built on top of this\n * result should be pruned against the caller's requested eps.\n */\nexport function resolveD20Roll(die: DieNode, rollType: RollType | undefined): PMF {\n const base = resolveSingleDie(die, defaultEps);\n const type = rollType || \"flat\";\n if (type === \"flat\") return base;\n\n const cacheKey = `${getASTSignature(die)}|${type}`;\n const cached = d20RollLiftCache.get(cacheKey);\n if (cached) return cached;\n\n const support = [...base.support()].sort((a, b) => a - b);\n const out = new Map<number, number>();\n let cum = 0;\n let prevLifted = 0;\n for (const k of support) {\n cum += base.pAt(k);\n // advantage: best of 2 (F^2); elven accuracy: best of 3 (F^3); disadvantage: worst of 2\n // (1-(1-F)^2). `type` can't be \"flat\" here — that returns above before the cache lookup.\n const curLifted =\n type === \"advantage\"\n ? cum * cum\n : type === \"elven accuracy\"\n ? cum * cum * cum\n : 1 - (1 - cum) * (1 - cum);\n const pk = curLifted - prevLifted;\n if (pk > 0) out.set(k, pk);\n prevLifted = curLifted;\n }\n const result = PMF.fromMap(out, defaultEps);\n d20RollLiftCache.set(cacheKey, result);\n return result;\n}\n\n/**\n * Resolve a check builder's root die (the to-hit/save d20, or whatever die it wraps), honoring\n * that die's reroll/minimum/explode, then lift by its `rollType`. The single entry point every\n * attack/save check builder ({@link ACBuilder}, {@link AttackBuilder}, {@link AlwaysHitBuilder},\n * {@link AlwaysCritBuilder}, `DCBuilder`, save `resolveProbabilities`) should use instead of\n * reaching for `d20RollPMF(rollType, baseReroll > 0)` directly — that 2-argument summary silently\n * drops `minimum`/`explode` on the root config.\n */\nexport function resolveRootD20(check: RollBuilder): PMF {\n const rootConfig = check.getRootDieConfig();\n const rollType = check.rollType;\n if (!rootConfig || !(rootConfig.sides > 0)) {\n return d20RollPMF(rollType, check.baseReroll > 0);\n }\n return resolveD20Roll(dieNodeFromConfig(rootConfig), rollType);\n}\n\nexport function resolveSingleDie(die: DieNode, eps: number = defaultEps): PMF {\n const signature = getASTSignature(die);\n const cacheKey = `${signature}_${eps}`;\n\n const cached = singleDiePMFCache.get(cacheKey);\n if (cached) return cached;\n\n const s = Math.max(0, Math.floor(die.sides));\n if (s <= 0) return PMF.delta(0, eps);\n\n let probs = new Map<number, number>();\n for (let v = 1; v <= s; v++) probs.set(v, 1 / s);\n\n // TODO - check if this is correct. Sequential reroll passes? Or at once?\n const r = Math.max(0, Math.floor(die.reroll || 0));\n if (r > 0) {\n const k = Math.min(r, s);\n const rerollMass = k / s; // total probability rerolled once\n const uniformReroll = rerollMass / s; // mass added to each face from reroll\n const next = new Map<number, number>();\n for (let v = 1; v <= s; v++) {\n const keep = v <= k ? 0 : 1 / s;\n next.set(v, keep + uniformReroll);\n }\n probs = next;\n }\n\n let pmf = PMF.fromMap(new Map(probs), eps);\n\n // Minimum per die\n const minV = Math.max(0, Math.floor(die.minimum || 0));\n if (minV > 0) pmf = pmf.mapDamage((v) => Math.max(v, minV));\n\n // Exploding dice (finite, capped at `times` additional dice) on max face only.\n const explode = die.explode;\n if (explode && Number.isFinite(explode) && explode > 0) {\n const times = Math.floor(explode);\n const maxFace = s;\n\n // Split pmf into a max-face slice and a non-max slice. `PMF.fromMap` always normalizes to\n // mass 1 (divides by its own sum), so `nonMaxPMF` is already the correct conditional \"given\n // the roll wasn't max, what was it\" distribution — exactly the shape `PMF.branch` requires\n // for its failure argument. It must NOT be rescaled again afterward: `PMF.branch` weights\n // each branch's bins by (p, 1-p) directly, so a `nonMaxPMF` still holding raw mass (1-pMax)\n // would contribute (1-pMax)^2 instead of (1-pMax) to the result — the source of the\n // previously measured 0.861 total mass on `d6.explode(1)`.\n const nonMax = new Map<number, number>();\n const pMax = pmf.pAt(maxFace);\n for (const v of pmf.support()) {\n if (v !== maxFace) nonMax.set(v, pmf.pAt(v));\n }\n const nonMaxPMF = PMF.fromMap(nonMax, eps);\n\n // Capped geometric chain, built bottom-up. `chain` holds the distribution of \"one more die\n // roll, with `remaining` further explosions still allowed if THAT roll is also max\" for\n // `remaining` running from 0 (a final roll that can't chain further, however it lands) up to\n // `times - 1`. Each step wraps the previous chain in one more branch: on a max roll (prob\n // pMax) add another maxFace and recurse into the shorter chain; otherwise stop at a non-max\n // value. This reduces to exactly `explode(1)`'s \"maxFace + one more untouched die\" for\n // `times === 1`, and never lets more than `times` extra dice enter the total.\n let chain = pmf; // remaining = 0: an unconstrained extra die, chains no further either way\n for (let remaining = 1; remaining <= times - 1; remaining++) {\n chain = PMF.branch(chain.mapDamage((v) => v + maxFace), nonMaxPMF, pMax);\n }\n const exploded = PMF.branch(chain.mapDamage((v) => v + maxFace), nonMaxPMF, pMax);\n pmf = exploded;\n }\n\n singleDiePMFCache.set(cacheKey, pmf);\n return pmf;\n}\n\n// Getters\n\nfunction findDie(node: ExpressionNode): DieNode | undefined {\n switch (node.type) {\n case \"die\":\n return node;\n case \"constant\":\n return undefined;\n case \"sum\":\n case \"d20Roll\":\n case \"half\":\n case \"maxOf\":\n case \"scale\":\n return findDie(node.child);\n case \"keep\":\n return findDie(node.child.child);\n case \"add\":\n for (const c of node.children) {\n const d = findDie(c.node);\n if (d) return d;\n }\n return undefined;\n }\n}\n\nfunction getTotalCount(node: KeepNode): number {\n // The total dice count is encoded in the nearest SumNode under child\n let cur = node.child;\n while (cur.type === \"keep\") cur = cur.child;\n return cur.type === \"sum\" ? Math.max(0, Math.floor(cur.count)) : 0;\n}\n\nfunction computeMaxOfPMF(\n pmf: PMF,\n count: number,\n eps: number = defaultEps\n): PMF {\n // Compute the maximum of 'count' independent rolls of the given PMF\n if (count <= 1) return pmf;\n\n const support = pmf.support();\n const out = new Map<number, number>();\n\n // For small counts, we can enumerate all outcomes\n if (count <= 6 && support.length <= 20) {\n function dfs(\n rollsLeft: number,\n currentMax: number,\n probability: number\n ): void {\n if (rollsLeft === 0) {\n out.set(currentMax, (out.get(currentMax) || 0) + probability);\n return;\n }\n\n for (const value of support) {\n const p = pmf.pAt(value);\n if (p > 0) {\n const newMax = Math.max(currentMax, value);\n dfs(rollsLeft - 1, newMax, probability * p);\n }\n }\n }\n\n dfs(count, -Infinity, 1);\n } else {\n // For larger cases, use the CDF method. Walk the sorted support once while\n // accumulating a running CDF, so each P(max = v) costs O(1) instead of a\n // full-map cdfAt() scan (previously O(N) per value → O(N²) overall).\n // Between two consecutive support points there is no probability mass, so\n // the running CDF up to (but not including) v equals cdfAt(v - 1).\n const sortedSupport = [...support].sort((a, b) => a - b);\n let runningCdf = 0;\n for (const value of sortedSupport) {\n const prevCdf = runningCdf;\n runningCdf += pmf.pAt(value);\n\n // P(max = value) = P(all rolls <= value) - P(all rolls <= value-1)\n const probMax = Math.pow(runningCdf, count) - Math.pow(prevCdf, count);\n if (probMax > eps) {\n out.set(value, probMax);\n }\n }\n }\n\n return PMF.fromMap(out, eps);\n}\n\nfunction keepSumPMF(\n single: PMF,\n total: number,\n keep: number,\n highest: boolean,\n eps: number = defaultEps\n): PMF {\n // Trivial/fast paths\n if (keep >= total) return single.power(total, eps);\n if (keep <= 0) return PMF.delta(0, eps);\n\n const sortedSupport = [...single.support()].sort((a, b) => a - b);\n const pmfSig = sortedSupport\n .map((val) => `${val}:${single.pAt(val).toPrecision(6)}`)\n .join(\",\");\n const cacheKey = `keep|${pmfSig}|t:${total}|k:${keep}|h:${\n highest ? 1 : 0\n }|e:${eps}`;\n\n const cached = builderPMFCache.get(cacheKey);\n if (cached) return cached;\n\n // kh1/kl1 fast paths using max-of machinery\n if (keep === 1) {\n if (highest) {\n return computeMaxOfPMF(single, total, eps);\n } else {\n // min of n i.i.d. == -max of n of negated variable\n const neg = single.mapDamage((v) => -v);\n const minPMF = computeMaxOfPMF(neg, total, eps).mapDamage((v) => -v);\n builderPMFCache.set(cacheKey, minPMF);\n return minPMF;\n }\n }\n\n // DP over descending values; state = (used, remainingTrials) → map(sum -> prob)\n // Transition by drawing X occurrences at current value v from remainingTrials r: X ~ Binom(r, p)\n // Select t = min(X, keep - used) into the sum (highest picks first), then continue with r - X.\n\n type SumMap = Map<number, number>;\n let state: Map<number, SumMap> = new Map();\n // Pack the (used, remainingTrials) state into a single integer key instead of\n // a \"used|r\" string. r ∈ [0, total], so a stride of (total + 1) is collision\n // free, and decoding is plain integer math — no split()/parseInt() per\n // transition in the hot loop. Behavior is identical (same states, same order).\n const stride = total + 1;\n const keyOf = (used: number, r: number) => used * stride + r;\n\n state.set(keyOf(0, total), new Map([[0, 1]]));\n\n const valuesDesc = highest\n ? [...sortedSupport].sort((a, b) => b - a)\n : [...sortedSupport].sort((a, b) => a - b);\n\n const binomPMF = (r: number, p: number): number[] => {\n if (r <= 0) return [1];\n if (p <= eps) {\n const arr = new Array(r + 1).fill(0);\n arr[0] = 1;\n return arr;\n }\n if (1 - p <= eps) {\n const arr = new Array(r + 1).fill(0);\n arr[r] = 1;\n return arr;\n }\n const q = 1 - p;\n const arr = new Array(r + 1).fill(0);\n\n // stable recurrence from k=0\n arr[0] = Math.pow(q, r);\n const ratio = p / q;\n for (let x = 1; x <= r; x++)\n arr[x] = ((arr[x - 1] * (r - x + 1)) / x) * ratio;\n\n // Normalize minor drift\n let s = 0;\n for (let x = 0; x <= r; x++) s += arr[x];\n if (Math.abs(1 - s) > 1e-12) for (let x = 0; x <= r; x++) arr[x] /= s;\n\n return arr;\n };\n\n const pruneMap = (m: SumMap, threshold: number): SumMap => {\n if (threshold <= 0) return m;\n const out = new Map<number, number>();\n for (const [sum, pr] of m) if (pr >= threshold) out.set(sum, pr);\n return out.size === m.size ? m : out;\n };\n\n const pruneState = (st: Map<number, SumMap>, threshold: number) => {\n if (threshold <= 0) return st;\n const out = new Map<number, SumMap>();\n for (const [k, m] of st) {\n const mm = pruneMap(m, threshold);\n if (mm.size > 0) out.set(k, mm);\n }\n return out;\n };\n\n let processedMass = 0;\n for (const v of valuesDesc) {\n const p = single.pAt(v);\n if (p <= 0) continue;\n const q = Math.max(eps, 1 - processedMass);\n const pCond = Math.min(1, p / q);\n const next: Map<number, SumMap> = new Map();\n\n for (const [k, m] of state) {\n const used = Math.floor(k / stride);\n const r = k - used * stride;\n if (r === 0) {\n // No trials left; carry state forward unchanged\n const destKey = keyOf(used, 0);\n const dest = next.get(destKey) ?? new Map<number, number>();\n for (const [sum, pr] of m) dest.set(sum, (dest.get(sum) || 0) + pr);\n next.set(destKey, dest);\n continue;\n }\n\n const bin = binomPMF(r, pCond);\n const remainingCapacity = keep - used;\n\n for (let x = 0; x <= r; x++) {\n const px = bin[x];\n if (px <= eps) continue;\n const t = Math.min(x, remainingCapacity);\n const used2 = used + t;\n const r2 = r - x;\n const add = t * v;\n\n const destKey = keyOf(used2, r2);\n const dest = next.get(destKey) ?? new Map<number, number>();\n for (const [sum, pr] of m) {\n const s2 = sum + add;\n const prob = pr * px;\n const cur = dest.get(s2) || 0;\n const nv = cur + prob;\n if (nv >= eps) dest.set(s2, nv);\n }\n if (dest.size > 0) next.set(destKey, dest);\n }\n }\n\n // Light pruning proportional to eps\n state = pruneState(next, eps * 1e-6);\n processedMass += p;\n }\n\n // Collect results where all trials assigned and exactly keep were used\n const finalKey = keyOf(keep, 0);\n const dist = state.get(finalKey) ?? new Map<number, number>();\n\n if (dist.size === 0) {\n // Fallback safety: return empty mass (should not happen)\n return PMF.emptyMass();\n }\n\n const result = PMF.fromMap(dist, eps);\n builderPMFCache.set(cacheKey, result);\n return result;\n}\n\nexport function getASTSignature(node: ExpressionNode): string {\n switch (node.type) {\n case \"constant\":\n return `c:${node.value}`;\n case \"die\": {\n // Use a fixed order for properties to ensure a stable signature.\n const parts: string[] = [];\n parts.push(`s:${node.sides}`);\n if (node.reroll) parts.push(`r:${node.reroll}`);\n if (node.minimum) parts.push(`m:${node.minimum}`);\n if (node.explode) parts.push(`e:${node.explode}`);\n return `d{${parts.join(\",\")}}`;\n }\n case \"sum\":\n return `sum{c:${node.count},ch:${getASTSignature(node.child)}}`;\n case \"d20Roll\":\n return `d20{t:${node.rollType},ch:${getASTSignature(node.child)}}`;\n case \"keep\":\n return `keep{c:${node.count},m:${node.mode},ch:${getASTSignature(\n node.child\n )}}`;\n case \"half\":\n return `half{ch:${getASTSignature(node.child)}}`;\n case \"maxOf\":\n return `maxOf{c:${node.count},ch:${getASTSignature(node.child)}}`;\n case \"scale\":\n return `scale{n:${node.numerator},d:${node.denominator},r:${\n node.rounding\n },ch:${getASTSignature(node.child)}}`;\n case \"add\": {\n let constantValue = 0;\n const otherChildrenSigs: string[] = [];\n for (const c of node.children) {\n if (c.node.type === \"constant\") {\n constantValue += c.sign * c.node.value;\n } else {\n otherChildrenSigs.push(\n `${c.sign === -1 ? \"-\" : \"+\"}${getASTSignature(c.node)}`\n );\n }\n }\n\n if (constantValue !== 0) {\n otherChildrenSigs.push(\n constantValue > 0 ? `+c:${constantValue}` : `-c:${-constantValue}`\n );\n }\n\n // Sort to handle commutative nature of addition.\n otherChildrenSigs.sort();\n\n return `add[${otherChildrenSigs.join(\"\")}]`;\n }\n }\n}\n","import type { OutcomeType } from \"../common/types\";\nimport { EPS } from \"../common/types\";\nimport { LRUCache } from \"../common/lru-cache\";\nimport { Mixture } from \"../pmf/mixture\";\nimport { PMF } from \"../pmf/pmf\";\nimport type { DiceQuery } from \"../pmf/query\";\nimport type { ACBuilder } from \"./ac\";\nimport { pmfFromRollBuilder, resolveRootD20 } from \"./ast\";\nimport {\n AlwaysCritBuilder,\n AlwaysHitBuilder,\n ParsedRollBuilder,\n RollBuilder,\n} from \"./roll\";\nimport type { AttackResolution, CheckBuilder } from \"./types\";\n\ntype ActionEffect = RollBuilder;\n\n/**\n * Resolved-attack PMF cache. `resolve()`/`toPMF()` re-runs the damage convolution + hit/crit/miss mixture\n * every call; a DPR sweep resolves the SAME attack thousands of times (dprcalc measured ~99.9% repeats).\n * Keyed by {@link AttackBuilder.cacheKey} — a cheap serialization of the check + effect {@link RollConfig}s\n * (NOT the AST-walking `toExpression`), which fully determines the PMF. `null` key ⇒ an effect opted out\n * (parsed/pooled/half/scale/max/composite) ⇒ resolve uncached. Cached PMFs are immutable (every PMF op\n * returns a new instance), so sharing is safe.\n */\nconst attackPMFCache = new LRUCache<string, PMF>(4000);\n\n/** Clears the resolved-attack PMF cache (test/bench seam; mirrors {@link clearParserCache}). */\nexport function clearAttackCache(): void {\n attackPMFCache.clear();\n}\n\nexport class AttackBuilder implements CheckBuilder {\n constructor(\n readonly check: ACBuilder | AlwaysHitBuilder | AlwaysCritBuilder,\n private readonly hitEffect?: ActionEffect,\n private readonly critEffect?: ActionEffect | null,\n private readonly missEffect?: ActionEffect\n ) {}\n\n onCrit(val: number): AttackBuilder;\n onCrit(val: string): AttackBuilder;\n onCrit(val: RollBuilder): AttackBuilder;\n onCrit(count: number, die: RollBuilder): AttackBuilder;\n onCrit(count: number, sides: number): AttackBuilder;\n onCrit(count: number, die: RollBuilder, modifier: number): AttackBuilder;\n onCrit(count: number, sides: number, modifier: number): AttackBuilder;\n onCrit(...args: any[]): AttackBuilder {\n const damageRoll = RollBuilder.fromArgs(...args);\n return new AttackBuilder(\n this.check,\n this.hitEffect,\n damageRoll,\n this.missEffect\n );\n }\n\n onMiss(val: number): AttackBuilder;\n onMiss(val: string): AttackBuilder;\n onMiss(val: RollBuilder): AttackBuilder;\n onMiss(count: number, die: RollBuilder): AttackBuilder;\n onMiss(count: number, sides: number): AttackBuilder;\n onMiss(count: number, die: RollBuilder, modifier: number): AttackBuilder;\n onMiss(count: number, sides: number, modifier: number): AttackBuilder;\n onMiss(...args: any[]): AttackBuilder {\n const damageRoll = RollBuilder.fromArgs(...args);\n return new AttackBuilder(\n this.check,\n this.hitEffect,\n this.critEffect,\n damageRoll\n );\n }\n\n noCrit(): AttackBuilder {\n return new AttackBuilder(this.check, this.hitEffect, null, this.missEffect);\n }\n\n // Legacy expressions\n toExpression(): string {\n const checkPart = this.check.toExpression();\n\n let effectPart = \"\";\n\n if (this.hitEffect) {\n effectPart = `(${this.hitEffect.toExpression()})`;\n if (this.critEffect !== null) {\n let crit: RollBuilder;\n if (this.critEffect) {\n crit = this.critEffect;\n } else {\n // For ParsedRollBuilder, we can't double dice, so skip the crit expression\n if (this.hitEffect instanceof ParsedRollBuilder) {\n // Don't try to double ParsedRollBuilder - leave it out of expression\n crit = RollBuilder.fromArgs(0);\n } else {\n crit =\n this.hitEffect?.copy().doubleDice() ?? RollBuilder.fromArgs(0);\n }\n }\n\n const critThreshold = this.check.critThreshold;\n if (critThreshold < 1 || critThreshold > 20) {\n throw new Error(\n `Invalid crit threshold: ${critThreshold}. Must be between 1 and 20.`\n );\n }\n\n // Only include crit expression if crit is not zero\n const critExpression = crit.toExpression();\n if (critExpression !== \"0\") {\n if (critThreshold === 20) {\n effectPart += ` crit (${critExpression})`;\n } else {\n const xcritNumber = 21 - critThreshold;\n effectPart += ` xcrit${xcritNumber} (${critExpression})`;\n }\n }\n }\n\n if (this.missEffect) {\n effectPart += ` miss (${this.missEffect.toExpression()})`;\n }\n }\n\n return `${checkPart} * ${effectPart}`;\n }\n\n resolveProbabilities(\n check: ACBuilder | AlwaysHitBuilder | AlwaysCritBuilder,\n eps: number = 0\n ): { pSuccess: number; pHit: number; pCrit: number; pMiss: number } {\n const critThreshold = check.critThreshold;\n const d20 = resolveRootD20(check);\n\n if (check instanceof AlwaysCritBuilder) {\n // If fromAlwaysHit is true, everything is a crit (no misses)\n if (check.fromAlwaysHit) {\n return { pSuccess: 1, pHit: 0, pCrit: 1, pMiss: 0 };\n }\n\n // If fromAlwaysHit is false (came from ACBuilder), we need to check AC\n // Natural 1s always miss, everything else that would hit becomes a crit\n const ac = check.attackConfig.ac ?? 0;\n const staticMod = this.check.modifier;\n const bonusDicePMFs = this.check.getBonusDicePMFs(this.check, eps);\n const bonusPMF = bonusDicePMFs.length\n ? PMF.convolveMany(bonusDicePMFs, eps)\n : PMF.delta(0, eps);\n\n let pcrit = 0;\n let pmiss = 0;\n\n for (const [r, bin] of d20) {\n const pr = bin.p;\n if (pr <= 0) continue;\n\n // Natural 1 always misses\n if (r === 1) {\n pmiss += pr;\n continue;\n }\n\n // Check if this roll would hit the AC\n const need = ac - staticMod - r;\n const pBonusHit = bonusPMF.tailProbGE(need);\n\n // Everything that hits becomes a crit\n pcrit += pr * pBonusHit;\n pmiss += pr * (1 - pBonusHit);\n }\n\n return { pSuccess: pcrit, pHit: 0, pCrit: pcrit, pMiss: pmiss };\n }\n\n if (check instanceof AlwaysHitBuilder) {\n // Preserve rollType for crit odds\n let pCrit = 0;\n for (const [r, bin] of d20) {\n const pr = bin.p;\n if (pr <= 0) continue;\n if (r >= critThreshold) pCrit += pr;\n }\n const pHit = 1 - pCrit;\n const pMiss = 0;\n\n return { pSuccess: 1, pHit, pCrit, pMiss };\n }\n\n const ac = check.attackConfig.ac;\n const staticMod = this.check.modifier;\n\n const bonusDicePMFs = this.check.getBonusDicePMFs(this.check, eps);\n const bonusPMF = bonusDicePMFs.length\n ? PMF.convolveMany(bonusDicePMFs, eps)\n : PMF.delta(0, eps);\n\n let pcrit = 0;\n let phit = 0;\n let pmiss = 0;\n\n for (const [r, bin] of d20) {\n const pr = bin.p;\n if (pr <= 0) continue;\n\n // Handle auto-miss\n if (r === 1) {\n pmiss += pr;\n continue;\n }\n\n // A natural 20 always hits and always crits (RAW), independent of AC or critThreshold.\n if (r === 20) {\n pcrit += pr;\n continue;\n }\n\n // Handle normal hit/miss, and an expanded crit range (critThreshold < 20): a non-natural-20\n // roll in the crit range still has to beat AC to hit at all -- it is not an auto-hit.\n const need = ac - staticMod - r;\n const pBonusHit = bonusPMF.tailProbGE(need);\n\n if (r >= critThreshold) {\n pcrit += pr * pBonusHit;\n } else {\n phit += pr * pBonusHit;\n }\n pmiss += pr * (1 - pBonusHit);\n }\n\n const psuccess = phit + pcrit;\n return { pSuccess: psuccess, pHit: phit, pCrit: pcrit, pMiss: pmiss };\n }\n\n resolve(eps: number = EPS): AttackResolution {\n const {\n pHit,\n pCrit,\n pMiss: pmiss,\n } = this.resolveProbabilities(this.check, eps);\n const hitPMF = this.hitEffect\n ? this.hitEffect instanceof ParsedRollBuilder\n ? this.hitEffect.toPMF(eps)\n : pmfFromRollBuilder(this.hitEffect, eps)\n : PMF.delta(0, eps);\n\n let critPMF: PMF | null = null;\n let phit = pHit;\n let pcrit = pCrit;\n\n if (this.critEffect === null) {\n critPMF = null;\n phit += pcrit;\n pcrit = 0;\n } else {\n let critBuilder: RollBuilder | undefined;\n \n if (this.critEffect) {\n critBuilder = this.critEffect;\n } else if (this.hitEffect instanceof ParsedRollBuilder) {\n // For ParsedRollBuilder, we can't automatically double dice\n // So treat it as noCrit() - roll crit probability into hit\n critPMF = null;\n phit += pcrit;\n pcrit = 0;\n critBuilder = undefined;\n } else {\n critBuilder = this.hitEffect?.copy().doubleDice();\n }\n\n if (critBuilder) {\n critPMF = critBuilder instanceof ParsedRollBuilder\n ? critBuilder.toPMF(eps)\n : pmfFromRollBuilder(critBuilder, eps);\n }\n }\n const missPMF = this.missEffect\n ? this.missEffect instanceof ParsedRollBuilder\n ? this.missEffect.toPMF(eps)\n : pmfFromRollBuilder(this.missEffect, eps)\n : PMF.delta(0, eps);\n\n // Mix them up\n const mix = new Mixture<OutcomeType>(eps);\n if (phit > 0) mix.add(\"hit\", hitPMF, phit);\n if (critPMF && pcrit > 0) mix.add(\"crit\", critPMF, pcrit);\n if (pmiss > 0)\n mix.add(this.missEffect ? \"missDamage\" : \"missNone\", missPMF, pmiss);\n\n return {\n pmf: mix.buildPMF(eps) ?? PMF.delta(0, eps),\n check: this.check.toPMF(eps) ?? PMF.delta(0, eps),\n hit: hitPMF ?? PMF.delta(0, eps),\n crit: critPMF ?? PMF.delta(0, eps),\n miss: missPMF ?? PMF.delta(0, eps),\n weights: { hit: phit, crit: pcrit, miss: pmiss },\n };\n }\n\n /**\n * A cheap, complete key for this attack's resolved PMF, or `null` when it can't be cached soundly (an\n * effect whose PMF isn't captured by its {@link RollConfig}s — see {@link RollBuilder.cacheKey}). Composed\n * from the check + hit/crit/miss effect keys + `eps`. `critEffect === null` (noCrit) and `undefined`\n * (auto-double the hit dice) are distinct crit states, encoded separately.\n */\n private cacheKey(eps: number): string | null {\n const checkKey = this.check.cacheKey();\n if (checkKey === null) return null;\n\n let hitKey = \"\";\n if (this.hitEffect) {\n const k = this.hitEffect.cacheKey();\n if (k === null) return null;\n hitKey = k;\n }\n\n let critKey: string;\n if (this.critEffect === null) critKey = \"n\";\n else if (this.critEffect === undefined) critKey = \"a\";\n else {\n const k = this.critEffect.cacheKey();\n if (k === null) return null;\n critKey = k;\n }\n\n let missKey = \"\";\n if (this.missEffect) {\n const k = this.missEffect.cacheKey();\n if (k === null) return null;\n missKey = k;\n }\n\n return `${checkKey}*H${hitKey}*C${critKey}*M${missKey}*e${eps}`;\n }\n\n // By default, create PMF with no pruning. Cached by the cheap config key across identical rebuilds.\n toPMF(eps: number = 0): PMF {\n const key = this.cacheKey(eps);\n if (key === null) return this.resolve(eps).pmf;\n const cached = attackPMFCache.get(key);\n if (cached) return cached;\n const pmf = this.resolve(eps).pmf;\n attackPMFCache.set(key, pmf);\n return pmf;\n }\n\n get pmf() {\n return this.toPMF();\n }\n\n // By default, create query on PMF with no pruning\n toQuery(eps: number = 0): DiceQuery {\n return this.toPMF(eps).query();\n }\n}\n","import { PMF } from \"../pmf/pmf\";\nimport { AttackBuilder } from \"./attack\";\nimport { resolveRootD20 } from \"./ast\";\nimport { AlwaysCritBuilder, RollBuilder } from \"./roll\";\n\nexport interface AttackConfig {\n ac: number;\n critThreshold: number;\n}\nexport class ACBuilder extends RollBuilder {\n readonly attackConfig: AttackConfig;\n\n constructor(baseRoll: RollBuilder, ac: number, attackConfig?: AttackConfig) {\n super(baseRoll.getSubRollConfigs());\n\n if (attackConfig) {\n this.attackConfig = { ...attackConfig, ac };\n } else {\n this.attackConfig = { ac, critThreshold: 20 };\n }\n }\n\n // onHit(effect: RollBuilder): AttackBuilder {\n // return new AttackBuilder(this).onHit(effect)\n // }\n\n onHit(val: number): AttackBuilder;\n onHit(val: string): AttackBuilder;\n onHit(val: RollBuilder): AttackBuilder;\n onHit(count: number, die: RollBuilder): AttackBuilder;\n onHit(count: number, sides: number): AttackBuilder;\n onHit(count: number, die: RollBuilder, modifier: number): AttackBuilder;\n onHit(count: number, sides: number, modifier: number): AttackBuilder;\n onHit(...args: any[]): AttackBuilder {\n const damageRoll = RollBuilder.fromArgs(...args);\n return new AttackBuilder(this, damageRoll);\n }\n\n get critThreshold(): number {\n return this.attackConfig.critThreshold;\n }\n\n override cacheKey(): string | null {\n const base = super.cacheKey();\n return base === null ? null : `A|${this.attackConfig.ac}|${this.attackConfig.critThreshold}|${base}`;\n }\n\n // TODO - move this to AC Builder… or if we create a DC builder that has critOn, throw an error?\n critOn(threshold: number): ACBuilder {\n const newConfig: AttackConfig = {\n ...this.attackConfig,\n critThreshold: threshold,\n };\n return new ACBuilder(this, this.attackConfig.ac, newConfig);\n }\n\n alwaysCrits(): AlwaysCritBuilder {\n return new AlwaysCritBuilder(\n this,\n {\n critThreshold: this.attackConfig.critThreshold,\n ac: this.attackConfig.ac,\n },\n false\n );\n }\n\n // Legacy expressions\n override toExpression(): string {\n const configs = this.getSubRollConfigs(); // This already includes bonus dice, no need to add them again\n const expression = new RollBuilder(configs).toExpression();\n return this.attackConfig.ac\n ? `(${expression} AC ${this.attackConfig.ac})`\n : expression;\n }\n\n override toPMF(eps: number = 0): PMF {\n const ac = this.attackConfig.ac;\n const d20 = resolveRootD20(this);\n const staticMod = this.modifier;\n const bonusPMFs = this.getBonusDicePMFs(this, eps);\n\n // Build total to-hit value distribution attackRollPMF = d20 ⊕ bonusDice, then shift by staticMod\n const parts = [d20, ...bonusPMFs];\n let attackRollPMF = parts.length === 1 ? d20 : PMF.convolveMany(parts, eps);\n if (staticMod !== 0)\n attackRollPMF = attackRollPMF.mapDamage(\n (rollValue) => rollValue + staticMod\n );\n\n // Map to 0 when below AC\n const out = new Map<number, number>();\n for (const rollValue of attackRollPMF.support()) {\n const p = attackRollPMF.pAt(rollValue);\n const key = rollValue >= ac ? rollValue : 0;\n out.set(key, (out.get(key) || 0) + p);\n }\n return PMF.fromMap(out, eps);\n }\n\n override copy(): ACBuilder {\n const baseCopy = new RollBuilder(this.getSubRollConfigs());\n const newConfig = {\n ac: this.attackConfig.ac,\n critThreshold: this.attackConfig.critThreshold,\n };\n return new ACBuilder(baseCopy, newConfig.ac, newConfig);\n }\n}\n\n// Augment the RollBuilder prototype to implement the ac method\nRollBuilder.prototype.ac = function (targetAC: number): ACBuilder {\n if (isNaN(targetAC)) throw new Error(\"Invalid NaN value for targetAC\");\n return new ACBuilder(this, targetAC);\n};\n","import type { OutcomeType } from \"../common/types\";\nimport { EPS } from \"../common/types\";\nimport { LRUCache } from \"../common/lru-cache\";\nimport { Mixture } from \"../pmf/mixture\";\nimport { PMF } from \"../pmf/pmf\";\nimport type { DiceQuery } from \"../pmf/query\";\nimport { pmfFromRollBuilder, resolveRootD20 } from \"./ast\";\nimport type { DCBuilder } from \"./dc\";\nimport { ParsedRollBuilder, type RollBuilder } from \"./roll\";\nimport type { CheckBuilder, SaveResolution } from \"./types\";\n\nexport type SaveOutcome = \"normal\" | \"half\";\n\n/**\n * Resolved-save PMF cache, the save-side sibling of {@link attackPMFCache}. `resolve()` re-runs the failure\n * PMF, the half-damage scale and the success/fail mixture on every call; a save-based DPR sweep (a caster's\n * Fireball, a Paladin's smite) resolves the SAME save thousands of times. Keyed by\n * {@link SaveBuilder.cacheKey}; a `null` key resolves uncached.\n */\nconst savePMFCache = new LRUCache<string, PMF>(4000);\n\n/** Clears the resolved-save PMF cache (test/bench seam; mirrors {@link clearAttackCache}). */\nexport function clearSaveCache(): void {\n savePMFCache.clear();\n}\n\nexport class SaveBuilder implements CheckBuilder {\n constructor(\n readonly check: DCBuilder,\n private readonly failureEffect?: RollBuilder,\n private readonly saveOutcome: SaveOutcome = \"normal\"\n ) {}\n\n saveHalf(): SaveBuilder {\n return new SaveBuilder(this.check, this.failureEffect, \"half\");\n }\n\n toExpression(): string {\n const checkPart = this.check.toExpression();\n if (!this.failureEffect) return checkPart;\n\n const failureEffectPart = this.failureEffect.toExpression();\n const result = `${checkPart} * (${failureEffectPart})`;\n return this.saveOutcome === \"half\" ? `${result} save half` : result;\n }\n\n resolve(eps: number = EPS): SaveResolution {\n const { pSuccess: psuccess = 0, pFail: pfail = 1 } = resolveProbabilities(\n this.check\n );\n const failPMF = this.failureEffect\n ? this.failureEffect instanceof ParsedRollBuilder\n ? this.failureEffect.toPMF(eps)\n : pmfFromRollBuilder(this.failureEffect)\n : PMF.delta(0);\n const onSuccess = this.saveOutcome ?? \"half\";\n\n let successPMF: PMF = PMF.delta(0, eps);\n if (onSuccess === \"half\") successPMF = failPMF.scaleDamage(0.5, \"floor\");\n\n const successLabel: OutcomeType =\n onSuccess === \"normal\" ? \"missNone\" : \"saveHalf\";\n const failLabel: OutcomeType = \"saveFail\";\n const baseMix = new Mixture<OutcomeType>(eps);\n const mixture = baseMix\n .add(successLabel, successPMF, psuccess)\n .add(failLabel, failPMF, pfail);\n\n return {\n pmf: mixture.buildPMF(eps) ?? PMF.delta(0, eps),\n check:\n PMF.exclusive([[PMF.delta(1), psuccess]], eps) ?? PMF.delta(0, eps),\n saveFail: failPMF ?? PMF.delta(0, eps),\n saveSuccess: successPMF ?? PMF.delta(0, eps),\n weights: { success: psuccess, fail: pfail },\n };\n }\n\n /**\n * A cheap, complete key for this save's resolved PMF, or `null` when it can't be cached soundly.\n * {@link resolve} reads exactly three things: the DC check (via `resolveProbabilities`), the failure\n * effect's PMF, and the save outcome — so composing their keys pins it. A `ParsedRollBuilder` failure\n * effect returns `null`, which correctly forces this uncached.\n */\n private cacheKey(eps: number): string | null {\n const checkKey = this.check.cacheKey();\n if (checkKey === null) return null;\n\n let failKey = \"\";\n if (this.failureEffect) {\n const k = this.failureEffect.cacheKey();\n if (k === null) return null;\n failKey = k;\n }\n\n return `${checkKey}*F${failKey}*O${this.saveOutcome}*e${eps}`;\n }\n\n // By default, create PMF with no pruning. Cached by the cheap config key across identical rebuilds.\n toPMF(eps: number = 0): PMF {\n const key = this.cacheKey(eps);\n if (key === null) return this.resolve(eps).pmf;\n const cached = savePMFCache.get(key);\n if (cached) return cached;\n const pmf = this.resolve(eps).pmf;\n savePMFCache.set(key, pmf);\n return pmf;\n }\n\n get pmf() {\n return this.toPMF();\n }\n\n // By default, create query on PMF with no pruning\n toQuery(eps: number = 0): DiceQuery {\n return this.toPMF(eps).query();\n }\n}\n\nfunction resolveProbabilities(check: DCBuilder): {\n pSuccess: number;\n pFail: number;\n} {\n const saveBonus = check.modifier;\n const dc = check.saveDC;\n const eps = 0;\n\n const die = resolveRootD20(check);\n const faceP = new Map<number, number>();\n for (const [r, bin] of die) {\n const pr = bin.p;\n if (pr > 0) faceP.set(r, pr);\n }\n\n // Now add bonus dice to the PMF (bless, bane, bardic, etc)\n const bonusDicePMFs = check.getBonusDicePMFs(check, eps);\n const bonusPMF =\n bonusDicePMFs.length > 0\n ? PMF.convolveMany(bonusDicePMFs, eps)\n : PMF.zero(eps);\n\n let pSuccess = 0;\n for (const [r, pr] of faceP) {\n const need = dc - saveBonus - r;\n pSuccess += pr * bonusPMF.tailProbGE(need);\n }\n\n const pFail = Math.max(0, 1 - pSuccess);\n return { pSuccess, pFail: pFail };\n}\n","import { LRUCache } from \"../common/lru-cache\";\nimport { PMF } from \"../pmf/pmf\";\nimport { pmfFromRollBuilder, resolveRootD20 } from \"./ast\";\nimport { RollBuilder } from \"./roll\";\nimport { SaveBuilder } from \"./save\";\n\ninterface SaveConfig {\n dc: number;\n}\n\n/**\n * DC-check PMF cache. The two-outcome success/fail PMF is re-derived on every `toPMF()`, and a save-based\n * DPR sweep asks for the SAME check thousands of times. Keyed by {@link DCBuilder.cacheKey} + `eps`.\n */\nconst dcPMFCache = new LRUCache<string, PMF>(4000);\n\n/** Clears the DC-check PMF cache (test/bench seam). */\nexport function clearDCCache(): void {\n dcPMFCache.clear();\n}\n\nexport class DCBuilder extends RollBuilder {\n private readonly saveConfig: SaveConfig;\n\n constructor(baseRoll: RollBuilder, saveConfig?: SaveConfig) {\n super(baseRoll.getSubRollConfigs());\n this.saveConfig = saveConfig ? { ...saveConfig } : { dc: 10 };\n }\n\n override dc(saveDC: number): DCBuilder {\n if (this.rollType && this.rollType === \"elven accuracy\") {\n throw new Error(\n \"Cannot use dc() on an AttackRollBuilder. Use ac() for attack rolls instead.\"\n );\n }\n return new DCBuilder(this, { dc: saveDC });\n }\n\n get saveDC(): number {\n return this.saveConfig.dc;\n }\n\n override add(anotherRoll: RollBuilder): DCBuilder {\n const newBuilder = super.add(anotherRoll);\n return new DCBuilder(newBuilder, this.saveConfig);\n }\n\n override addRoll(count?: number): DCBuilder {\n const newBuilder = super.addRoll(count);\n return new DCBuilder(newBuilder, this.saveConfig);\n }\n\n onSaveFailure(val: number): SaveBuilder;\n onSaveFailure(val: string): SaveBuilder;\n onSaveFailure(val: RollBuilder): SaveBuilder;\n onSaveFailure(count: number, die: RollBuilder): SaveBuilder;\n onSaveFailure(count: number, sides: number): SaveBuilder;\n onSaveFailure(count: number, die: RollBuilder, modifier: number): SaveBuilder;\n onSaveFailure(count: number, sides: number, modifier: number): SaveBuilder;\n onSaveFailure(...args: any[]): SaveBuilder {\n const damageRoll = RollBuilder.fromArgs(...args);\n return new SaveBuilder(this, damageRoll);\n }\n\n override withElvenAccuracy(): never {\n throw new Error(\n \"Elven Accuracy cannot be used with saving throws (DC checks). It is only valid for attack rolls (AC checks).\"\n );\n }\n\n // Legacy expressions\n override toExpression(): string {\n const subConfigs = this.getSubRollConfigs();\n const allConfigs = [...subConfigs];\n const expression = new RollBuilder(allConfigs).toExpression();\n return `(${expression} DC ${this.saveConfig.dc})`;\n }\n\n /**\n * The DC check's PMF is fully determined by the save DC plus everything `toPMF` below reads off the roll\n * configs (`rollType`, `baseReroll`, `modifier`, bonus dice) — all of which `super.cacheKey()` already\n * serializes. So extend the base key with the DC, mirroring {@link AlwaysHitBuilder.cacheKey}.\n */\n override cacheKey(): string | null {\n const base = super.cacheKey();\n return base === null ? null : `DC|${this.saveConfig.dc}|${base}`;\n }\n\n override toPMF(eps: number = 0): PMF {\n const key = this.cacheKey();\n const fullKey = key === null ? null : `${key}*e${eps}`;\n if (fullKey !== null) {\n const cached = dcPMFCache.get(fullKey);\n if (cached) return cached;\n }\n\n const saveDC = this.saveDC;\n const d20 = resolveRootD20(this);\n const staticMod = this.modifier;\n const bonusDicePMFs = this.getBonusDiceConfigs().map((cfg) =>\n pmfFromRollBuilder(RollBuilder.fromConfigs([cfg]), eps)\n );\n const bonusPMF = bonusDicePMFs.length\n ? PMF.convolveMany(bonusDicePMFs, eps)\n : PMF.delta(0, eps);\n\n let psuccess = 0;\n for (const [r, bin] of d20) {\n const pr = bin.p;\n if (pr <= 0) continue;\n const need = saveDC - staticMod - r;\n psuccess += pr * bonusPMF.tailProbGE(need);\n }\n\n const pfail = Math.max(0, 1 - psuccess);\n const m = new Map<number, number>([\n [0, psuccess > 0 ? psuccess : 0],\n [1, pfail > 0 ? pfail : 0],\n ]);\n const pmf = PMF.fromMap(m, eps);\n if (fullKey !== null) dcPMFCache.set(fullKey, pmf);\n return pmf;\n }\n}\n\n// Augment the RollBuilder prototype to implement the dc method\nRollBuilder.prototype.dc = function (saveDC: number): DCBuilder {\n if (isNaN(saveDC)) throw new Error(\"Invalid NaN value for saveDC\");\n return new DCBuilder(this).dc(saveDC);\n};\n","import type { PMF } from \"../pmf/pmf\";\n\n/**\n * Triggers that read the outcomes of source attacks, as opposed to `not-fired`,\n * which reads another rider. Includes `any-miss`, so this is not \"hit triggers\".\n */\nexport type AttackTriggerOn =\n | \"first-hit\"\n | \"any-crit\"\n | \"any-miss\"\n | \"every-hit\";\n\n/**\n * When a rider fires. JSON-safe, so a consumer can persist this verbatim and hand\n * it straight back in a {@link TurnSpec}.\n *\n * - `first-hit` — the first source that lands. Fires in that source's mode, so a\n * crit on the *first* landing attack doubles the rider's dice (Sneak Attack).\n * - `any-crit` — at least one source crit. Always fires in crit mode (Divine Smite).\n * - `any-miss` — at least one source missed. The reroll gate (Unerring Accuracy, Lucky).\n * - `every-hit` — once per landing source, in that hit's mode (Hunter's Mark, Hex, Rage).\n * - `not-fired` — the named rider did **not** fire (\"flurry of blows if I didn't smite\").\n *\n * For the attack triggers `of` is a list of attack ids and defaults to every\n * declared attack, which is what most riders mean. For `not-fired` it is the\n * single required id of the rider being negated — negating a set of riders has\n * no unambiguous meaning, so the type does not offer it.\n */\nexport type Trigger =\n | { on: AttackTriggerOn; of?: readonly string[] }\n | { on: \"not-fired\"; of: string };\n\n/** Anything that can produce a PMF: `RollBuilder`, `AttackBuilder`, `SaveBuilder`, or a `PMF`. */\nexport interface ToPMF {\n toPMF(eps?: number): PMF;\n}\n\n/**\n * Rider or attack damage. Strings are not accepted: a parsed expression cannot\n * have its dice doubled, so a string rider would deal single dice on a crit. Call\n * `parse()` yourself if that is what you want.\n */\nexport type Damage = PMF | ToPMF;\n\n/**\n * Same shape as {@link Damage}, named separately because the requirement is\n * stronger: a source must resolve to an *outcome-labelled* PMF carrying\n * hit/crit/miss, which no type can express. Supplying one that does not is a\n * `not-an-attack` {@link TurnSpecError} at build time, not a compile error.\n */\nexport type Source = Damage;\n\n/** One payload, or several to convolve: Flurry of Blows is `[flurry, flurry]`. */\nexport type RiderDamage = Damage | readonly Damage[];\n\n/** Everything about a rider except what it does and when — see `Turn.onFirstHit`. */\nexport interface RiderOptions {\n /** Required only if another rider names this one in `of`. */\n id?: string;\n /** Which attacks to watch. Defaults to every declared attack. */\n of?: readonly string[];\n /** Defaults to `damage` with dice doubled when that is possible, else `damage`. */\n critDamage?: RiderDamage;\n}\n\nexport type Rider = Trigger & {\n id?: string;\n damage: RiderDamage;\n critDamage?: RiderDamage;\n};\n\n/**\n * A bare source gets the id `attack 1`, `attack 2`, … in declaration order.\n *\n * Unlike {@link Rider}, the id lives in a wrapper rather than on the value\n * itself: an attack's value is a builder or PMF that this module does not own,\n * so there is nowhere to hang a field.\n */\nexport type Attack = Source | { id: string; source: Source };\n\nexport interface TurnSpec {\n attacks: readonly Attack[];\n riders?: readonly Rider[];\n}\n\nexport type TurnSpecErrorCode =\n | \"unknown-id\"\n | \"duplicate-id\"\n | \"self-reference\"\n | \"cycle\"\n | \"not-an-attack\"\n | \"unused-crit-damage\"\n | \"too-many-groups\";\n\n/**\n * A malformed turn. `code` is a stable contract: consumer UIs map it to their own\n * states (greyed dropdown option, \"trigger missing\" row error, …) instead of\n * re-implementing validation.\n */\nexport class TurnSpecError extends Error {\n constructor(\n readonly code: TurnSpecErrorCode,\n readonly id: string,\n message: string\n ) {\n super(message);\n this.name = \"TurnSpecError\";\n }\n}\n\n/**\n * How many distinct `of` sets a single turn may track.\n *\n * Each group multiplies the state space, so the cap is a cost ceiling rather\n * than a modelling limit. Measured on four attacks with two riders per group:\n * 2.1ms for one group, 3.1 for two, 5.9 for three, 23.5 for four — roughly 4x\n * per group. Real builds use one or two (the goliath rogue/monk/paladin uses\n * one), so four leaves plenty of room while keeping an AC sweep viable.\n */\nexport const MAX_TRIGGER_GROUPS = 4;\n","import { EPS } from \"../common/types\";\nimport { PMF } from \"../pmf/pmf\";\nimport type {\n Attack,\n Damage,\n Rider,\n ToPMF,\n Trigger,\n TurnSpec,\n TurnSpecErrorCode,\n} from \"./types\";\nimport { MAX_TRIGGER_GROUPS, TurnSpecError } from \"./types\";\n\n/**\n * A resolved, validated turn: the ordered steps to walk, plus the trigger\n * groups it tracks. Building this is where every {@link TurnSpecError} is raised,\n * so the walk itself can assume a well-formed plan.\n */\nexport interface TurnPlan {\n steps: readonly Step[];\n /** One entry per distinct `of` set; each holds the step indices that update it. */\n groupCount: number;\n /** Declared attacks only, in order — what `DiceQuery.singles` gets. */\n attackPMFs: readonly PMF[];\n /** Every attack id, in declaration order. */\n attackIds: readonly string[];\n /** Every rider id, in declaration order, including `every-hit` riders. */\n riderIds: readonly string[];\n /** Rider id → step index, for `fireProbability` and `not-fired`. */\n riderSteps: ReadonlyMap<string, number>;\n /**\n * `every-hit` rider id → the group index whose \"something landed\" bit answers\n * P(it fired at least once). Such riders are folded into their sources' slices\n * rather than becoming steps, so they have no step index.\n */\n perHitGroups: ReadonlyMap<string, number>;\n}\n\n/**\n * One step of the turn. `slices` non-null ⇒ the step rolls its own attack and\n * advances the groups listed in `updates`; null ⇒ it is pure damage whose amount\n * depends only on the mode it fires in.\n */\nexport interface Step {\n id: string;\n /** Declared attacks always fire; riders consult their trigger. */\n trigger: Trigger | null;\n /** Outcome-labelled sub-mass PMFs, masses summing to 1. */\n slices: { hit: PMF; crit: PMF; miss: PMF } | null;\n /** Pure-damage payloads, mass 1 each. */\n damage: { hit: PMF; crit: PMF } | null;\n /** Group indices this step's outcome advances. */\n updates: readonly number[];\n /** Group index this step's trigger reads, or -1 for `not-fired` / always-fires. */\n reads: number;\n /** For `not-fired`: the step index of the rider being negated. */\n negates: number;\n}\n\nconst IS_HIT_TRIGGER: Record<string, true> = {\n \"first-hit\": true,\n \"any-crit\": true,\n \"any-miss\": true,\n \"every-hit\": true,\n};\n\nfunction toPMF(\n damage: Damage | readonly Damage[],\n eps: number,\n id = \"\"\n): PMF {\n const parts = Array.isArray(damage) ? damage : [damage as Damage];\n if (parts.length === 0) return PMF.delta(0, eps);\n const pmfs = parts.map((part) => {\n if (part instanceof PMF) return part;\n // `Damage` rules this out, but a consumer deserializing UI state reaches\n // here untyped. Reporting it as a spec error beats a bare TypeError from\n // calling a method that isn't there.\n if (typeof (part as Partial<ToPMF>).toPMF !== \"function\") {\n throw new TurnSpecError(\n \"not-an-attack\",\n id,\n `\"${id}\" is neither a PMF nor a builder with toPMF().`\n );\n }\n // Also checked on the way out: a callable `toPMF` that returns something\n // else would otherwise reach PMF.convolveMany and fail deep inside it.\n const resolved = part.toPMF(eps);\n if (!(resolved instanceof PMF)) {\n throw new TurnSpecError(\n \"not-an-attack\",\n id,\n `\"${id}\" has a toPMF() that did not return a PMF.`\n );\n }\n return resolved;\n });\n return PMF.convolveMany(pmfs, eps);\n}\n\n/**\n * Crit payload for a rider: an explicit `critDamage` wins; otherwise double the\n * dice if the builder supports it. `ParsedRollBuilder.doubleDice()` throws (a\n * parsed expression has no AST to scale) and a raw `PMF` has no dice to double,\n * so both fall back to the base damage — the same rule `AttackBuilder.resolve`\n * already applies to `onHit` without an `onCrit`.\n */\nfunction critPMF(rider: Rider, base: PMF, eps: number): PMF {\n if (rider.critDamage !== undefined) return toPMF(rider.critDamage, eps);\n\n const parts = Array.isArray(rider.damage)\n ? rider.damage\n : [rider.damage as Damage];\n const doubled: PMF[] = [];\n for (const part of parts) {\n const doublable = part as { doubleDice?: () => Damage };\n if (part instanceof PMF || typeof doublable.doubleDice !== \"function\") {\n return base;\n }\n try {\n doubled.push(toPMF(doublable.doubleDice(), eps));\n } catch {\n return base;\n }\n }\n if (doubled.length === 0) return base;\n return PMF.convolveMany(doubled, eps);\n}\n\n/**\n * Split a source into hit / crit / miss sub-mass PMFs, or return null when the\n * PMF carries no outcome labels (a plain damage roll is not an attack).\n */\nfunction sliceSource(pmf: PMF): { hit: PMF; crit: PMF; miss: PMF } | null {\n const labels = pmf.outcomes();\n if (!labels.includes(\"hit\") && !labels.includes(\"crit\")) return null;\n\n const missParts = [\"missNone\", \"missDamage\"]\n .filter((label) => labels.includes(label))\n .map((label) => pmf.filterOutcome(label));\n\n return {\n hit: labels.includes(\"hit\") ? pmf.filterOutcome(\"hit\") : PMF.emptyMass(),\n crit: labels.includes(\"crit\") ? pmf.filterOutcome(\"crit\") : PMF.emptyMass(),\n miss: missParts.length\n ? missParts.reduce((all, part) => all.add(part))\n : PMF.emptyMass(),\n };\n}\n\nexport function buildPlan(spec: TurnSpec, eps: number = EPS): TurnPlan {\n const fail = (code: TurnSpecErrorCode, id: string, message: string): never => {\n throw new TurnSpecError(code, id, message);\n };\n\n // --- attacks -------------------------------------------------------------\n const attackIds: string[] = [];\n const attackPMFs: PMF[] = [];\n const attackSlices: ({ hit: PMF; crit: PMF; miss: PMF } | null)[] = [];\n\n spec.attacks.forEach((entry: Attack, index) => {\n const named = entry as { id?: string; source?: Damage };\n const hasWrapper =\n typeof named.id === \"string\" && named.source !== undefined;\n const id = hasWrapper ? (named.id as string) : `attack ${index + 1}`;\n const source = hasWrapper ? (named.source as Damage) : (entry as Damage);\n const pmf = toPMF(source, eps, id);\n\n attackIds.push(id);\n attackPMFs.push(pmf);\n attackSlices.push(sliceSource(pmf));\n });\n\n const riders = spec.riders ?? [];\n\n // --- ids -----------------------------------------------------------------\n const riderIds = riders.map((rider, index) => rider.id ?? `rider ${index + 1}`);\n const seen = new Set<string>();\n for (const id of [...attackIds, ...riderIds]) {\n if (seen.has(id)) fail(\"duplicate-id\", id, `Duplicate id \"${id}\".`);\n seen.add(id);\n }\n\n const attackIndexById = new Map(attackIds.map((id, index) => [id, index]));\n const riderIndexById = new Map(riderIds.map((id, index) => [id, index]));\n\n // --- references ----------------------------------------------------------\n // `of` lists for hit triggers, defaulted to every declared attack.\n const sourceIdsByRider: string[][] = riders.map((rider, index) => {\n const id = riderIds[index];\n\n if (rider.on === \"not-fired\") {\n const target = rider.of;\n if (target === id) {\n fail(\"self-reference\", id, `Rider \"${id}\" cannot depend on itself.`);\n }\n const targetIndex = riderIndexById.get(target);\n if (targetIndex === undefined) {\n fail(\n \"unknown-id\",\n target,\n `Rider \"${id}\" negates \"${target}\", which is not a rider in this turn.`\n );\n }\n if (riders[targetIndex as number].on === \"every-hit\") {\n fail(\n \"not-an-attack\",\n target,\n `Rider \"${id}\" negates \"${target}\", an every-hit rider, which can fire more than once and so has no single \"did not fire\" branch.`\n );\n }\n return [target];\n }\n\n // Deduplicated, so `of: [\"a\", \"a\"]` shares a trigger group with `of: [\"a\"]`\n // instead of consuming a second slot and tripping `too-many-groups` on a\n // turn that is really tracking one source set. Repeats are otherwise\n // harmless: advancing a group twice for one outcome is idempotent.\n const of = [...new Set(rider.of ?? attackIds)];\n if (of.length === 0) {\n fail(\"unknown-id\", id, `Rider \"${id}\" has no sources.`);\n }\n for (const sourceId of of) {\n if (sourceId === id) {\n fail(\"self-reference\", id, `Rider \"${id}\" cannot depend on itself.`);\n }\n const riderIndex = riderIndexById.get(sourceId);\n const isAttack = attackIndexById.has(sourceId);\n if (!isAttack && riderIndex === undefined) {\n fail(\n \"unknown-id\",\n sourceId,\n `Rider \"${id}\" depends on \"${sourceId}\", which is not in this turn.`\n );\n }\n if (riderIndex !== undefined && riders[riderIndex].on === \"every-hit\") {\n fail(\n \"not-an-attack\",\n sourceId,\n `Rider \"${id}\" triggers on \"${sourceId}\", an every-hit rider. Those are folded into their own sources rather than resolved separately, so they cannot be triggered on — point at the attacks instead.`\n );\n }\n const slices = isAttack\n ? attackSlices[attackIndexById.get(sourceId) as number]\n : sliceSource(\n toPMF(riders[riderIndex as number].damage, eps, sourceId)\n );\n if (!slices) {\n fail(\n \"not-an-attack\",\n sourceId,\n `Rider \"${id}\" triggers on \"${sourceId}\", which has no hit/crit outcomes.`\n );\n }\n }\n return [...of];\n });\n\n // --- ordering ------------------------------------------------------------\n // Riders may only reference riders that resolve before them.\n const order: number[] = [];\n const visiting = new Set<number>();\n const done = new Set<number>();\n\n const visit = (index: number): void => {\n if (done.has(index)) return;\n const id = riderIds[index];\n if (visiting.has(index)) {\n fail(\"cycle\", id, `Rider \"${id}\" is part of a dependency cycle.`);\n }\n visiting.add(index);\n for (const sourceId of sourceIdsByRider[index]) {\n const dependency = riderIndexById.get(sourceId);\n if (dependency !== undefined) visit(dependency);\n }\n visiting.delete(index);\n done.add(index);\n order.push(index);\n };\n riders.forEach((_, index) => visit(index));\n\n // --- groups --------------------------------------------------------------\n // One group per distinct source set. Sharing matters: sneak attack and Fire's\n // Burn over the same two daggers are ONE group, so they resolve jointly.\n const groupIndexByKey = new Map<string, number>();\n const groupSources: string[][] = [];\n const groupOf = (sourceIds: readonly string[]): number => {\n // JSON, not a delimiter join: an id is consumer-supplied, and a delimiter\n // that can appear inside one makes the encoding non-injective, so two\n // distinct source sets could share a group.\n const key = JSON.stringify([...sourceIds].sort());\n const existing = groupIndexByKey.get(key);\n if (existing !== undefined) return existing;\n if (groupSources.length >= MAX_TRIGGER_GROUPS) {\n fail(\n \"too-many-groups\",\n key,\n `A turn may track at most ${MAX_TRIGGER_GROUPS} distinct trigger source sets.`\n );\n }\n const index = groupSources.length;\n groupIndexByKey.set(key, index);\n groupSources.push([...sourceIds]);\n return index;\n };\n\n const readsByRider = new Map<number, number>();\n const perHitGroups = new Map<string, number>();\n for (const index of order) {\n const rider = riders[index];\n if (!IS_HIT_TRIGGER[rider.on]) continue;\n const group = groupOf(sourceIdsByRider[index]);\n readsByRider.set(index, group);\n if (rider.on === \"every-hit\") perHitGroups.set(riderIds[index], group);\n }\n\n // --- steps ---------------------------------------------------------------\n // `every-hit` riders are not steps: they are convolved into each source's own\n // hit/crit slices, so one hit means one application with no extra state.\n const perHitBySource = new Map<string, { hit: PMF; crit: PMF }[]>();\n for (const index of order) {\n const rider = riders[index];\n if (rider.on !== \"every-hit\") continue;\n const hit = toPMF(rider.damage, eps, riderIds[index]);\n const payload = { hit, crit: critPMF(rider, hit, eps) };\n for (const sourceId of sourceIdsByRider[index]) {\n const existing = perHitBySource.get(sourceId);\n if (existing) existing.push(payload);\n else perHitBySource.set(sourceId, [payload]);\n }\n }\n\n const updatesById = new Map<string, number[]>();\n groupSources.forEach((sourceIds, groupIndex) => {\n for (const sourceId of sourceIds) {\n const existing = updatesById.get(sourceId);\n if (existing) existing.push(groupIndex);\n else updatesById.set(sourceId, [groupIndex]);\n }\n });\n\n const withPerHit = (\n slices: { hit: PMF; crit: PMF; miss: PMF },\n id: string\n ): { hit: PMF; crit: PMF; miss: PMF } => {\n const payloads = perHitBySource.get(id);\n if (!payloads) return slices;\n let hit = slices.hit;\n let crit = slices.crit;\n for (const payload of payloads) {\n hit = hit.convolve(payload.hit, eps, true);\n crit = crit.convolve(payload.crit, eps, true);\n }\n return { hit, crit, miss: slices.miss };\n };\n\n const steps: Step[] = attackIds.map((id, index) => ({\n id,\n trigger: null,\n slices: withPerHit(\n attackSlices[index] ?? {\n hit: attackPMFs[index],\n crit: PMF.emptyMass(),\n miss: PMF.emptyMass(),\n },\n id\n ),\n damage: null,\n updates: updatesById.get(id) ?? [],\n reads: -1,\n negates: -1,\n }));\n\n const stepIndexByRider = new Map<number, number>();\n const riderSteps = new Map<string, number>();\n\n for (const index of order) {\n const rider = riders[index];\n if (rider.on === \"every-hit\") continue;\n\n const id = riderIds[index];\n const hit = toPMF(rider.damage, eps, id);\n const slices = sliceSource(hit);\n if (slices && rider.critDamage !== undefined) {\n // An attack-shaped rider rolls its own d20 and crits on its own terms —\n // a bonus attack triggered by a crit does not deal doubled dice — so\n // there is nothing for `critDamage` to mean. Silently dropping it would\n // hide a real misunderstanding.\n fail(\n \"unused-crit-damage\",\n id,\n `Rider \"${id}\" rolls its own attack, so its critDamage would never be used. Remove it, or pass plain damage dice instead.`\n );\n }\n const negatedRider =\n rider.on === \"not-fired\"\n ? (riderIndexById.get(rider.of) as number)\n : undefined;\n\n const step: Step = {\n id,\n trigger: rider,\n slices: slices ? withPerHit(slices, id) : null,\n damage: slices ? null : { hit, crit: critPMF(rider, hit, eps) },\n updates: updatesById.get(id) ?? [],\n reads: readsByRider.get(index) ?? -1,\n negates:\n negatedRider === undefined\n ? -1\n : (stepIndexByRider.get(negatedRider) as number),\n };\n steps.push(step);\n\n stepIndexByRider.set(index, steps.length - 1);\n riderSteps.set(id, steps.length - 1);\n }\n\n return {\n steps,\n groupCount: groupSources.length,\n attackPMFs,\n attackIds,\n riderIds,\n riderSteps,\n perHitGroups,\n };\n}\n","/**\n * Per-group trigger state, packed into one byte.\n *\n * A \"group\" is one distinct set of source ids referenced by a trigger. Everything\n * any trigger needs to know about a group is which outcome landed *first*, whether\n * anything crit, and whether anything missed — so the whole turn state is one byte\n * per group and the state space stays small (12 codes per group, ~10 reachable).\n *\n * Layout: `first << 2 | anyCrit << 1 | anyMiss`, where `first` is one of\n * {@link FIRST_NONE} / {@link FIRST_HIT} / {@link FIRST_CRIT}. Readers decode with\n * `code >> 2`, `code & CRIT_BIT`, `code & MISS_BIT`.\n */\nexport const FIRST_NONE = 0;\nexport const FIRST_HIT = 1;\nexport const FIRST_CRIT = 2;\n\nexport const CRIT_BIT = 2;\nexport const MISS_BIT = 1;\n\n/** A group that has seen nothing yet: no first landing, no crit, no miss. */\nexport const START_CODE = FIRST_NONE << 2;\n\nexport type StepOutcome = \"hit\" | \"crit\" | \"miss\";\n\n/** Fold one source outcome into a group's state. */\nexport function advance(code: number, outcome: StepOutcome): number {\n if (outcome === \"miss\") return code | MISS_BIT;\n\n const first = code >> 2;\n const withCrit = outcome === \"crit\" ? code | CRIT_BIT : code;\n if (first !== FIRST_NONE) return withCrit;\n\n const nextFirst = outcome === \"crit\" ? FIRST_CRIT : FIRST_HIT;\n return (nextFirst << 2) | (withCrit & (CRIT_BIT | MISS_BIT));\n}\n","import { EPS } from \"../common/types\";\nimport { PMF } from \"../pmf/pmf\";\nimport { DiceQuery } from \"../pmf/query\";\nimport type { Step, TurnPlan } from \"./plan\";\nimport { buildPlan } from \"./plan\";\nimport type { StepOutcome } from \"./state\";\nimport {\n advance,\n CRIT_BIT,\n FIRST_CRIT,\n FIRST_NONE,\n MISS_BIT,\n START_CODE,\n} from \"./state\";\nimport type {\n Attack,\n Rider,\n RiderDamage,\n RiderOptions,\n Source,\n TurnSpec,\n} from \"./types\";\nimport { TurnSpecError } from \"./types\";\n\n/** Which payload a rider uses when it fires, or `null` when it doesn't fire. */\ntype FireMode = \"hit\" | \"crit\" | null;\n\nconst OUTCOMES: readonly StepOutcome[] = [\"hit\", \"crit\", \"miss\"];\n\n/**\n * Decide whether `step` fires in state `codes`, and in which mode.\n *\n * Every group a trigger reads is fully determined before its own step runs\n * (sources always precede dependents), so a trigger can be evaluated once, at\n * its step, and again at the end for {@link Turn.fireProbability} — both give the\n * same answer.\n */\nfunction fireMode(\n step: Step,\n codes: readonly number[],\n firedByStep: readonly FireMode[]\n): FireMode {\n const trigger = step.trigger;\n if (!trigger) return \"hit\";\n\n if (trigger.on === \"not-fired\") {\n return firedByStep[step.negates] === null ? \"hit\" : null;\n }\n\n const code = codes[step.reads];\n const first = code >> 2;\n\n switch (trigger.on) {\n case \"first-hit\":\n if (first === FIRST_NONE) return null;\n return first === FIRST_CRIT ? \"crit\" : \"hit\";\n case \"any-crit\":\n return (code & CRIT_BIT) !== 0 ? \"crit\" : null;\n case \"any-miss\":\n return (code & MISS_BIT) !== 0 ? \"hit\" : null;\n default:\n // `every-hit` never becomes a step — it is folded into its sources' slices.\n return null;\n }\n}\n\n/**\n * A turn of attacks plus conditional damage riders, resolved to one **exact**\n * joint distribution.\n *\n * Riders are correlated with the attacks that trigger them, so a rider cannot be\n * a separate `DiceQuery` single convolved in afterwards: that preserves the mean\n * but corrupts the distribution (two daggers + Sneak Attack report P(0 damage) of\n * 0.015 instead of the true 0.1225). `Turn` owns the sources and enumerates the\n * joint outcome space instead, carrying one byte of state per trigger group.\n *\n * @example\n * const dagger = d20.plus(8).ac(16).onHit(d4.plus(4));\n * const rogue = turn([dagger, dagger]).rider({ damage: roll(3, d6), on: \"first-hit\" });\n * rogue.mean(); // 18.6225\n */\nexport class Turn {\n private readonly eps: number;\n private readonly declaredAttacks: readonly Attack[];\n private readonly riders: readonly Rider[];\n private readonly plan: TurnPlan;\n private resolved?: { pmf: PMF; fireMass: ReadonlyMap<string, number> };\n\n private constructor(\n attacks: readonly Attack[],\n riders: readonly Rider[],\n eps: number\n ) {\n // Copied, because a caller can hand in an array they still hold and keep\n // mutating it. Shallow is the right depth: the entries are builders and\n // PMFs this module does not own and which are immutable by convention\n // throughout this library.\n this.declaredAttacks = [...attacks];\n this.riders = [...riders];\n this.eps = eps;\n // Built here, not on first use, so every way of constructing a Turn\n // validates at the same moment: the call that introduced the mistake.\n this.plan = buildPlan({ attacks: this.declaredAttacks, riders: this.riders }, eps);\n }\n\n /**\n * Builds a turn from plain data, throwing {@link TurnSpecError} if it is\n * malformed. Use this from a UI, where `error.code` maps to the field state to\n * show.\n */\n static from(spec: TurnSpec, eps: number = EPS): Turn {\n return new Turn(spec.attacks, spec.riders ?? [], eps);\n }\n\n /**\n * Appends an attack, throwing {@link TurnSpecError} if that makes the turn\n * invalid.\n *\n * A rider with no explicit `of` watches every declared attack *including ones\n * appended after it*, because `of` is resolved when the plan is built rather\n * than when the rider is added. Pass an explicit `of` to pin a rider to the\n * attacks it already saw. One attack must exist before a rider with a default\n * `of` is added, or the build fails `unknown-id`.\n */\n attack(source: Source, id?: string): Turn {\n const entry: Attack = id === undefined ? source : { id, source };\n return new Turn([...this.declaredAttacks, entry], this.riders, this.eps);\n }\n\n /**\n * Appends `count` copies of the same attack — the Extra Attack case, which is\n * most of 5e. Argument order mirrors `roll(count, die)`.\n *\n * ```ts\n * turn().attacks(4, greatsword).onEveryHit(d6); // fighter 20 + hunter's mark\n * ```\n *\n * @throws {RangeError} if `count` is not a positive integer.\n */\n attacks(count: number, source: Source): Turn {\n if (!Number.isInteger(count) || count < 1) {\n throw new RangeError(\n `attacks(count) needs a positive integer, got ${count}.`\n );\n }\n const added: Attack[] = new Array<Attack>(count).fill(source);\n return new Turn([...this.declaredAttacks, ...added], this.riders, this.eps);\n }\n\n /**\n * Appends a rider, throwing {@link TurnSpecError} if that makes the turn\n * invalid. The `onX` methods below are the readable way to call this.\n */\n rider(rider: Rider): Turn {\n return new Turn(this.declaredAttacks, [...this.riders, rider], this.eps);\n }\n\n /**\n * Fires once, on the first source that lands, in that source's mode — so a\n * crit on the first landing attack doubles the rider's dice. Sneak Attack.\n */\n onFirstHit(damage: RiderDamage, options: RiderOptions = {}): Turn {\n return this.rider({ ...options, damage, on: \"first-hit\" });\n }\n\n /**\n * Fires once if any source crit, always in crit mode. Divine Smite: nothing is\n * lost by holding it for a crit, so this is \"any\", not \"first\".\n */\n onAnyCrit(damage: RiderDamage, options: RiderOptions = {}): Turn {\n return this.rider({ ...options, damage, on: \"any-crit\" });\n }\n\n /**\n * Fires once if any source missed. The reroll gate: a reroll is a fresh attack,\n * so pass one as the damage. Kensei's Unerring Accuracy, Lucky.\n */\n onAnyMiss(damage: RiderDamage, options: RiderOptions = {}): Turn {\n return this.rider({ ...options, damage, on: \"any-miss\" });\n }\n\n /**\n * Fires once per source that lands, in that hit's mode — so it can fire several\n * times in a turn. Hunter's Mark, Hex, Rage.\n */\n onEveryHit(damage: RiderDamage, options: RiderOptions = {}): Turn {\n return this.rider({ ...options, damage, on: \"every-hit\" });\n }\n\n /**\n * Damage for the turns where the rider added just before this one did *not*\n * fire: \"flurry of blows if I didn't smite\".\n *\n * ```ts\n * turn([dagger, dagger])\n * .onAnyCrit(roll(2, d8)) // smite\n * .otherwise([flurry, flurry]) // ... or two more attacks\n * ```\n *\n * Always binds to the *immediately* preceding rider, so the two are branches of\n * one decision and can never both land. Note that chaining it therefore\n * alternates rather than laddering: `a.otherwise(b).otherwise(c)` makes `c`\n * fire whenever `b` did not, which is exactly when `a` did. For a genuine\n * three-way priority chain, name the riders and use explicit `not-fired`\n * triggers against the right one.\n */\n otherwise(\n damage: RiderDamage,\n options: Omit<RiderOptions, \"of\"> = {}\n ): Turn {\n const index = this.riders.length - 1;\n if (index < 0) {\n throw new TurnSpecError(\n \"unknown-id\",\n \"\",\n \"otherwise() needs a preceding rider to negate.\"\n );\n }\n const previous = this.riders[index];\n if (previous.on === \"every-hit\") {\n throw new TurnSpecError(\n \"not-an-attack\",\n previous.id ?? `rider ${index + 1}`,\n \"otherwise() cannot negate an every-hit rider: it can fire more than once.\"\n );\n }\n\n // `of` must name the previous rider, so give it the id `buildPlan` would.\n const target = previous.id ?? `rider ${index + 1}`;\n const riders: Rider[] = [...this.riders];\n riders[index] = { ...previous, id: target };\n riders.push({ ...options, damage, on: \"not-fired\", of: target });\n return new Turn(this.declaredAttacks, riders, this.eps);\n }\n\n /**\n * The exact joint distribution: mass 1, outcome-labelled. Resolved once and\n * cached.\n *\n * There is no `toPMF(eps)` to match the builders: a turn's epsilon is fixed\n * when it is constructed, because the plan is validated and its sources are\n * resolved at that point.\n */\n get pmf(): PMF {\n return this.resolve().pmf;\n }\n\n /** Mean damage for the turn. */\n mean(): number {\n return this.pmf.mean();\n }\n\n /**\n * A query whose `singles` are the **declared attacks** and whose combined\n * distribution is the exact turn PMF.\n *\n * Riders are inside the combined PMF, not in `singles`, so singles-based\n * helpers (`probAtLeastOne`, `countSinglesWith`, `outcomeStats`) describe the\n * attacks only. Read rider-inclusive statistics off the combined PMF —\n * `outcomeTotals`, `outcomeDamageRanges`, `damageAttributionChartModel`.\n */\n toQuery(): DiceQuery {\n return new DiceQuery([...this.plan.attackPMFs], this.pmf, this.eps);\n }\n\n /**\n * Attack ids in declaration order, including the `attack 1`, `attack 2`, …\n * defaults given to bare sources. These are the names `of` accepts.\n */\n get attackIds(): readonly string[] {\n return this.plan.attackIds;\n }\n\n /**\n * Rider ids in declaration order, including the `rider 1`, `rider 2`, …\n * defaults. These are the names {@link Turn.fireProbability} accepts.\n */\n get riderIds(): readonly string[] {\n return this.plan.riderIds;\n }\n\n /**\n * P(this rider fired). For an `every-hit` rider it is P(at least one source\n * hit), since that rider can fire more than once in a turn.\n *\n * @throws {TurnSpecError} `unknown-id` if `id` is not a rider — attack ids\n * included, since attacks always happen and have no firing probability.\n */\n fireProbability(id: string): number {\n const mass = this.resolve().fireMass.get(id);\n if (mass === undefined) {\n throw new TurnSpecError(\n \"unknown-id\",\n id,\n `\"${id}\" is not a rider in this turn. Riders: ${this.plan.riderIds\n .map((each) => `\"${each}\"`)\n .join(\", \")}.`\n );\n }\n return mass;\n }\n\n private resolve(): { pmf: PMF; fireMass: ReadonlyMap<string, number> } {\n if (this.resolved) return this.resolved;\n\n const plan = this.plan;\n const eps = this.eps;\n const width = plan.groupCount;\n\n // state key -> { codes, accumulated sub-mass damage, per-step firing }\n type State = {\n codes: number[];\n pmf: PMF;\n fired: FireMode[];\n };\n\n const start: State = {\n codes: new Array<number>(width).fill(START_CODE),\n pmf: PMF.delta(0, eps),\n fired: new Array<FireMode>(plan.steps.length).fill(null),\n };\n let states = new Map<string, State>([[String.fromCharCode(), start]]);\n\n plan.steps.forEach((step, stepIndex) => {\n const next = new Map<string, State>();\n\n const merge = (state: State): void => {\n // Whether each rider fired is part of the state: two paths that agree on\n // group codes but disagree on a rider's firing must not merge, or a\n // `not-fired` rider downstream would see an ill-defined predicate.\n //\n // Only the fired/not-fired bit belongs in the key, though — nothing\n // reads the mode back, and keying on it would split otherwise identical\n // states and multiply the convolutions for no change in the result.\n const key =\n String.fromCharCode(...state.codes) +\n \"\\u0001\" +\n state.fired.map((mode) => (mode === null ? \"-\" : \"+\")).join(\"\");\n const existing = next.get(key);\n if (existing) existing.pmf = existing.pmf.add(state.pmf);\n else next.set(key, state);\n };\n\n for (const state of states.values()) {\n const mode = fireMode(step, state.codes, state.fired);\n const fired = [...state.fired];\n fired[stepIndex] = mode;\n\n if (mode === null) {\n merge({ codes: state.codes, pmf: state.pmf, fired });\n continue;\n }\n\n if (!step.slices) {\n const payload = step.damage as { hit: PMF; crit: PMF };\n merge({\n codes: state.codes,\n pmf: state.pmf.convolve(\n mode === \"crit\" ? payload.crit : payload.hit,\n eps,\n true\n ),\n fired,\n });\n continue;\n }\n\n for (const outcome of OUTCOMES) {\n const slice = step.slices[outcome];\n const sliceMass = slice.mass();\n if (sliceMass <= eps) continue;\n\n const codes = [...state.codes];\n for (const group of step.updates) {\n codes[group] = advance(codes[group], outcome);\n }\n merge({\n codes,\n pmf: state.pmf.convolve(slice, eps, true),\n fired,\n });\n }\n }\n\n states = next;\n });\n\n // Collapse: sum every terminal state, and tally per-rider firing mass.\n const fireMass = new Map<string, number>();\n for (const id of plan.riderSteps.keys()) fireMass.set(id, 0);\n for (const id of plan.perHitGroups.keys()) fireMass.set(id, 0);\n\n let total: PMF | undefined;\n for (const state of states.values()) {\n total = total ? total.add(state.pmf) : state.pmf;\n const mass = state.pmf.mass();\n for (const [id, stepIndex] of plan.riderSteps) {\n if (state.fired[stepIndex] !== null) {\n fireMass.set(id, (fireMass.get(id) as number) + mass);\n }\n }\n // `every-hit` riders have no step: they fired iff something landed.\n for (const [id, group] of plan.perHitGroups) {\n if (state.codes[group] >> 2 !== FIRST_NONE) {\n fireMass.set(id, (fireMass.get(id) as number) + mass);\n }\n }\n }\n\n const pmf = total ?? PMF.delta(0, eps);\n const totalMass = pmf.mass();\n const needsNormalizing = Math.abs(totalMass - 1) > eps && totalMass > 0;\n\n // Firing masses are accumulated in the same unnormalized units as the\n // terminal states, so they have to follow the distribution through\n // normalization or `fireProbability` stops agreeing with `pmf`. Reachable\n // whenever a caller supplies a source PMF whose own mass is not 1.\n if (needsNormalizing) {\n for (const [id, mass] of fireMass) fireMass.set(id, mass / totalMass);\n }\n\n this.resolved = {\n pmf: needsNormalizing ? pmf.normalize() : pmf,\n fireMass,\n };\n return this.resolved;\n }\n}\n\n/**\n * Starts a {@link Turn}. Takes one attack or a list of them, so the two common\n * shapes both read straight:\n *\n * ```ts\n * turn(greatsword).onAnyCrit(roll(4, d8)); // one attack\n * turn([dagger, dagger]).onFirstHit(roll(3, d6)); // two\n * turn().attacks(4, greatsword); // four\n * ```\n */\nexport function turn(\n attacks: Attack | readonly Attack[] = [],\n eps: number = EPS\n): Turn {\n return Turn.from(\n { attacks: Array.isArray(attacks) ? attacks : [attacks as Attack] },\n eps\n );\n}\n"]}
1
+ {"version":3,"sources":["../../src/common/lru-cache.ts","../../src/common/types.ts","../../src/pmf/query.ts","../../src/pmf/pmf.ts","../../src/common/bounce.ts","../../src/pmf/mixture.ts","../../src/parser/scaleDice.ts","../../src/common/errors.ts","../../src/parser/dice.ts","../../src/parser/parser.ts","../../src/builder/prob.ts","../../src/builder/d20.ts","../../src/builder/arguments.ts","../../src/builder/expression.ts","../../src/builder/roll.ts","../../src/builder/factory.ts","../../src/builder/ast.ts","../../src/builder/attack.ts","../../src/builder/ac.ts","../../src/builder/save.ts","../../src/builder/dc.ts","../../src/turn/types.ts","../../src/turn/effects.ts","../../src/turn/state.ts","../../src/turn/plan.ts","../../src/turn/turn.ts"],"names":["d","cumulativeSum","atom","advantage","flat","copies","dfs","arr","critOnHit","critPMF","d20","mode","pmf"],"mappings":";AAIA,IAAI,cAAA,GAAiB,IAAA;AAMrB,IAAI,eAAA,GAAkB,CAAA;AA4Bf,IAAM,WAAN,MAAqB;AAAA;AAAA;AAAA;AAAA;AAAA,EAU1B,WAAA,CACmB,OAAA,GAAU,GAAA,EAC3B,OAAA,GAA8B,EAAC,EAC/B;AAFiB,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAVnB,IAAA,IAAA,CAAQ,KAAA,uBAAY,GAAA,EAAU;AAG9B,IAAA,IAAA,CAAQ,UAAA,GAAa,eAAA;AAUnB,IAAA,IAAA,CAAK,WAAW,OAAA,CAAQ,QAAA;AACxB,IAAA,IAAA,CAAK,oBAAA,GAAuB,QAAQ,oBAAA,IAAwB,KAAA;AAAA,EAC9D;AAAA;AAAA,EAGQ,IAAA,GAAa;AACnB,IAAA,IAAI,IAAA,CAAK,oBAAA,IAAwB,IAAA,CAAK,UAAA,KAAe,eAAA,EAAiB;AACpE,MAAA,IAAA,CAAK,MAAM,KAAA,EAAM;AACjB,MAAA,IAAA,CAAK,UAAA,GAAa,eAAA;AAAA,IACpB;AAAA,EACF;AAAA,EAEA,IAAY,OAAA,GAAmB;AAC7B,IAAA,IAAA,CAAK,IAAA,EAAK;AACV,IAAA,OAAO,IAAA,CAAK,OAAA,GAAU,CAAA,KAAM,cAAwB,CAAA;AAAA,EACtD;AAAA,EAEA,IAAI,GAAA,EAAuB;AACzB,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,EAAS,OAAO,MAAA;AAC1B,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAChC,IAAA,IAAI,KAAA,KAAU,QAAW,OAAO,MAAA;AAEhC,IAAA,IAAA,CAAK,KAAA,CAAM,OAAO,GAAG,CAAA;AACrB,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AACzB,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,OAAO,GAAA,EAAc;AACnB,IAAA,IAAA,CAAK,KAAA,CAAM,OAAO,GAAG,CAAA;AAAA,EACvB;AAAA,EAEA,GAAA,CAAI,KAAQ,KAAA,EAAgB;AAC1B,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,EAAS,OAAO,IAAA;AAC1B,IAAA,IAAA,CAAK,WAAW,KAAK,CAAA;AACrB,IAAA,IAAA,CAAK,KAAA,CAAM,OAAO,GAAG,CAAA;AACrB,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,IAAA,IAAQ,IAAA,CAAK,OAAA,EAAS;AACnC,MAAA,MAAM,YAAY,IAAA,CAAK,KAAA,CAAM,IAAA,EAAK,CAAE,MAAK,CAAE,KAAA;AAC3C,MAAA,IAAA,CAAK,KAAA,CAAM,OAAO,SAAc,CAAA;AAAA,IAClC;AACA,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AACzB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,MAAM,KAAA,EAAM;AAAA,EACnB;AAAA,EAEA,IAAI,IAAA,GAAe;AACjB,IAAA,IAAA,CAAK,IAAA,EAAK;AACV,IAAA,OAAO,KAAK,KAAA,CAAM,IAAA;AAAA,EACpB;AAAA,EAEA,IAAI,GAAA,EAAiB;AACnB,IAAA,OAAO,IAAA,CAAK,OAAA,IAAW,IAAA,CAAK,KAAA,CAAM,IAAI,GAAG,CAAA;AAAA,EAC3C;AAAA,EAEA,IAAA,GAA4B;AAC1B,IAAA,IAAA,CAAK,IAAA,EAAK;AACV,IAAA,OAAO,IAAA,CAAK,MAAM,IAAA,EAAK;AAAA,EACzB;AAAA,EAEA,MAAA,GAA8B;AAC5B,IAAA,IAAA,CAAK,IAAA,EAAK;AACV,IAAA,OAAO,IAAA,CAAK,MAAM,MAAA,EAAO;AAAA,EAC3B;AACF,CAAA;;;ACjHO,IAAM,GAAA,GAAM,KAAA;AA8FZ,IAAM,iBAAA,GAAiC,UAAA;AAQvC,IAAM,iBAAA,GAAmC;AAAA,EAC9C,UAAA;AAAA,EACA,YAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA;AAqBO,SAAS,YAAA,CACd,QAAA,EACA,KAAA,GAA2B,iBAAA,EACtB;AACL,EAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM,CAAC,CAAA,EAAG,CAAC,CAAC,CAAC,CAAA;AAChD,EAAA,OAAO,CAAC,GAAG,QAAQ,EAAE,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM;AAClC,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA;AACrB,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA;AACrB,IAAA,IAAI,EAAA,KAAO,MAAA,IAAa,EAAA,KAAO,MAAA,SAAkB,EAAA,GAAK,EAAA;AACtD,IAAA,IAAI,EAAA,KAAO,QAAW,OAAO,EAAA;AAC7B,IAAA,IAAI,EAAA,KAAO,QAAW,OAAO,CAAA;AAC7B,IAAA,OAAO,CAAA,CAAE,cAAc,CAAC,CAAA;AAAA,EAC1B,CAAC,CAAA;AACH;;;ACpIO,IAAM,UAAA,GAAN,MAAM,UAAA,CAAU;AAAA,EAOrB,WAAA,CAAY,OAAA,EAAsB,QAAA,EAAgB,GAAA,GAAM,GAAA,EAAK;AAC3D,IAAA,IAAA,CAAK,UAAU,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,GAAI,OAAA,GAAU,CAAC,OAAO,CAAA;AAC1D,IAAA,IAAI,KAAK,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,KAAM,MAAS,CAAA,EAAG;AAC7C,MAAA,MAAM,IAAI,MAAM,sCAAsC,CAAA;AAAA,IACxD;AACA,IAAA,IAAA,CAAK,IAAA,GAAO,GAAA;AAKZ,IAAA,IAAA,CAAK,oBAAoB,QAAA,KAAa,MAAA;AACtC,IAAA,IAAI,aAAa,MAAA,EAAW;AAC1B,MAAA,IAAA,CAAK,SAAA,GACH,IAAA,CAAK,GAAA,CAAI,QAAA,CAAS,IAAA,EAAK,GAAI,CAAC,CAAA,IAAK,GAAA,GAAM,QAAA,GAAW,QAAA,CAAS,SAAA,EAAU;AAAA,IACzE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,IAAI,QAAA,GAAgB;AAClB,IAAA,IAAI,IAAA,CAAK,cAAc,MAAA,EAAW;AAChC,MAAA,MAAM,CAAA,GAAI,GAAA,CAAI,YAAA,CAAa,IAAA,CAAK,OAAO,CAAA;AACvC,MAAA,IAAA,CAAK,SAAA,GACH,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,IAAA,EAAK,GAAI,CAAC,CAAA,IAAK,IAAA,CAAK,IAAA,GAAO,CAAA,GAAI,CAAA,CAAE,SAAA,EAAU;AAAA,IAC1D;AACA,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA2BA,uBAAA,GAA+B;AAC7B,IAAA,IAAI,KAAK,iBAAA,EAAmB;AAC1B,MAAA,OAAO,IAAA,CAAK,iBAAA;AAAA,IACd;AAOA,IAAA,IAAI,KAAK,iBAAA,EAAmB;AAC1B,MAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA,CAAK,QAAA,CAAS,eAAA,EAAgB;AACvD,MAAA,OAAO,IAAA,CAAK,iBAAA;AAAA,IACd;AAKA,IAAA,IAAI,IAAA,CAAK,QAAQ,KAAA,CAAM,CAAC,QAAQ,GAAA,CAAI,cAAA,EAAgB,CAAA,EAAG;AACrD,MAAA,IAAA,CAAK,oBAAoB,IAAA,CAAK,QAAA;AAC9B,MAAA,OAAO,IAAA,CAAK,iBAAA;AAAA,IACd;AAIA,IAAA,MAAM,eAAA,GAAkB,KAAK,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,KAAQ,GAAA,CAAI,iBAAiB,CAAA;AACvE,IAAA,MAAM,WAAW,GAAA,CAAI,YAAA,CAAa,eAAA,EAAiB,IAAA,CAAK,SAAS,OAAO,CAAA;AAGxE,IAAA,MAAM,UAAA,GACJ,IAAA,CAAK,GAAA,CAAI,QAAA,CAAS,IAAA,EAAK,GAAI,CAAC,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,OAAA,GAC3C,QAAA,GACA,SAAS,SAAA,EAAU;AAEzB,IAAA,IAAA,CAAK,iBAAA,GAAoB,UAAA;AACzB,IAAA,OAAO,UAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,kBAAA,GAAuD;AACrD,IAAA,OAAO,IAAA,CAAK,uBAAA,EAAwB,CAAE,kBAAA,EAAmB;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,4BAA4B,OAAA,EAII;AAC9B,IAAA,OAAO,IAAA,CAAK,uBAAA,EAAwB,CAAE,2BAAA,CAA4B,OAAO,CAAA;AAAA,EAC3E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,iBAAiB,KAAA,EAAuB;AACtC,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,KAAA,MAAW,MAAA,IAAU,KAAK,OAAA,EAAS;AACjC,MAAA,IAAI,MAAA,CAAO,UAAA,CAAW,KAAK,CAAA,EAAG,KAAA,EAAA;AAAA,IAChC;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAA,GAAe;AAIb,IAAA,IAAI,KAAK,iBAAA,EAAmB;AAC1B,MAAA,IAAI,CAAA,GAAI,CAAA;AACR,MAAA,KAAA,MAAW,CAAC,aAAa,GAAG,CAAA,IAAK,KAAK,QAAA,EAAU,CAAA,IAAK,cAAc,GAAA,CAAI,CAAA;AACvE,MAAA,OAAO,CAAA;AAAA,IACT;AAGA,IAAA,IAAI,SAAA,GAAY,CAAA;AAChB,IAAA,KAAA,MAAW,MAAA,IAAU,KAAK,OAAA,EAAS;AACjC,MAAA,MAAM,IAAA,GAAO,OAAO,IAAA,EAAK;AACzB,MAAA,IAAI,QAAQ,CAAA,EAAG;AAGf,MAAA,SAAA,IACE,IAAA,CAAK,GAAA,CAAI,IAAA,GAAO,CAAC,CAAA,IAAK,IAAA,CAAK,IAAA,GAAO,MAAA,CAAO,IAAA,EAAK,GAAI,MAAA,CAAO,IAAA,EAAK,GAAI,IAAA;AAAA,IACtE;AACA,IAAA,OAAO,SAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,QAAA,GAAmB;AAGjB,IAAA,IAAI,KAAK,iBAAA,EAAmB;AAC1B,MAAA,MAAM,EAAA,GAAK,KAAK,IAAA,EAAK;AACrB,MAAA,IAAI,CAAA,GAAI,CAAA;AACR,MAAA,KAAA,MAAW,CAAC,WAAA,EAAa,GAAG,CAAA,IAAK,KAAK,QAAA,EAAU;AAC9C,QAAA,MAAM,MAAM,WAAA,GAAc,EAAA;AAC1B,QAAA,CAAA,IAAK,GAAA,GAAM,MAAM,GAAA,CAAI,CAAA;AAAA,MACvB;AACA,MAAA,OAAO,CAAA;AAAA,IACT;AAIA,IAAA,IAAI,aAAA,GAAgB,CAAA;AACpB,IAAA,KAAA,MAAW,MAAA,IAAU,KAAK,OAAA,EAAS;AACjC,MAAA,MAAM,IAAA,GAAO,OAAO,IAAA,EAAK;AACzB,MAAA,IAAI,QAAQ,CAAA,EAAG;AACf,MAAA,IAAI,KAAK,GAAA,CAAI,IAAA,GAAO,CAAC,CAAA,IAAK,KAAK,IAAA,EAAM;AAEnC,QAAA,aAAA,IAAiB,OAAO,QAAA,EAAS;AAAA,MACnC,CAAA,MAAO;AAEL,QAAA,IAAI,EAAA,GAAK,CAAA;AACT,QAAA,KAAA,MAAW,CAACA,IAAG,CAAC,CAAA,IAAK,QAAQ,EAAA,IAAMA,EAAAA,IAAK,EAAE,CAAA,GAAI,IAAA,CAAA;AAC9C,QAAA,IAAI,CAAA,GAAI,CAAA;AACR,QAAA,KAAA,MAAW,CAACA,EAAAA,EAAG,CAAC,CAAA,IAAK,MAAA,EAAQ;AAC3B,UAAA,MAAM,MAAMA,EAAAA,GAAI,EAAA;AAChB,UAAA,CAAA,IAAK,GAAA,GAAM,GAAA,IAAO,CAAA,CAAE,CAAA,GAAI,IAAA,CAAA;AAAA,QAC1B;AACA,QAAA,aAAA,IAAiB,CAAA;AAAA,MACnB;AAAA,IACF;AACA,IAAA,OAAO,aAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAA,GAAiB;AACf,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,QAAA,EAAU,CAAA;AAAA,EAClC;AAAA;AAAA,EAGA,KAAA,GAAgB;AACd,IAAA,OAAO,KAAK,MAAA,EAAO;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,CAAA,EAAmB;AACrB,IAAA,OAAO,IAAA,CAAK,gBAAgB,CAAC,CAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,gBAAgB,CAAA,EAAmB;AACjC,IAAA,IAAI,qBAAA,GAAwB,CAAA;AAC5B,IAAA,KAAA,MAAW,CAAC,WAAA,EAAa,cAAc,CAAA,IAAK,KAAK,QAAA,EAAU;AACzD,MAAA,IAAI,eAAe,CAAA,EAAG;AACpB,QAAA,qBAAA,IAAyB,cAAA,CAAe,CAAA;AAAA,MAC1C;AAAA,IACF;AACA,IAAA,OAAO,qBAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,KAAK,CAAA,EAAmB;AACtB,IAAA,OAAO,IAAA,CAAK,iBAAiB,CAAC,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,iBAAiB,SAAA,EAA2B;AAC1C,IAAA,IAAI,cAAA,GAAiB,CAAA;AACrB,IAAA,KAAA,MAAW,CAAC,WAAA,EAAa,cAAc,CAAA,IAAK,KAAK,QAAA,EAAU;AACzD,MAAA,IAAI,eAAe,SAAA,EAAW;AAC5B,QAAA,cAAA,IAAkB,cAAA,CAAe,CAAA;AAAA,MACnC;AAAA,IACF;AACA,IAAA,OAAO,cAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,YAAY,gBAAA,EAAsC;AAChD,IAAA,OAAO,gBAAA,CAAiB,IAAI,CAAC,CAAA,KAAM,KAAK,QAAA,CAAS,QAAA,CAAS,CAAC,CAAC,CAAA;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,GAAA,GAAc;AACZ,IAAA,OAAO,IAAA,CAAK,SAAS,GAAA,EAAI;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,GAAA,GAAc;AACZ,IAAA,OAAO,IAAA,CAAK,SAAS,GAAA,EAAI;AAAA,EAC3B;AAAA,EAEQ,UAAA,CAAW,WAAmB,KAAA,EAA4B;AAChE,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAA;AACrC,IAAA,IAAI,cAAA,GAAiB,CAAA;AACrB,IAAA,KAAA,MAAW,GAAG,cAAc,CAAA,IAAK,MAAA,EAAQ;AACvC,MAAA,cAAA,IAAkB,cAAA,CAAe,KAAA,CAAM,KAAK,CAAA,IAAK,CAAA;AAAA,IACnD;AAIA,IAAA,MAAM,IAAA,GAAO,OAAO,IAAA,EAAK;AACzB,IAAA,OAAO,IAAA,GAAO,CAAA,GAAI,cAAA,GAAiB,IAAA,GAAO,CAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaQ,kBAAkB,MAAA,EAAiC;AACzD,IAAA,MAAM,CAAA,GAAI,KAAK,OAAA,CAAQ,MAAA;AACvB,IAAA,MAAM,oBAAA,GAAuB,KAAK,OAAA,CAAQ,GAAA;AAAA,MAAI,CAAC,WAC7C,IAAI,UAAA,CAAU,CAAC,MAAM,CAAC,CAAA,CAAE,aAAA,CAAc,MAAM;AAAA,KAC9C;AAEA,IAAA,MAAM,OAAO,IAAI,KAAA,CAAM,IAAI,CAAC,CAAA,CAAE,KAAK,CAAC,CAAA;AACpC,IAAA,IAAA,CAAK,CAAC,CAAA,GAAI,CAAA;AACV,IAAA,KAAA,MAAW,eAAe,oBAAA,EAAsB;AAC9C,MAAA,KAAA,IAAS,YAAA,GAAe,CAAA,EAAG,YAAA,IAAgB,CAAA,EAAG,YAAA,EAAA,EAAgB;AAC5D,QAAA,IAAA,CAAK,YAAY,CAAA,GACf,IAAA,CAAK,YAAY,CAAA,IAAK,IAAI,WAAA,CAAA,GAC1B,IAAA,CAAK,YAAA,GAAe,CAAC,CAAA,GAAI,WAAA;AAAA,MAC7B;AACA,MAAA,IAAA,CAAK,CAAC,KAAK,CAAA,GAAI,WAAA;AAAA,IACjB;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,YAAA,CAAa,QAAqC,CAAA,EAAmB;AACnE,IAAA,MAAM,CAAA,GAAI,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,GAAI,CAAC,GAAG,IAAI,GAAA,CAAI,MAAM,CAAC,CAAA,GAAI,CAAC,MAAM,CAAA;AAChE,IAAA,MAAM,CAAA,GAAI,KAAK,OAAA,CAAQ,MAAA;AAEvB,IAAA,IAAI,CAAA,IAAK,GAAG,OAAO,CAAA;AACnB,IAAA,IAAI,CAAA,GAAI,GAAG,OAAO,CAAA;AAIlB,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,iBAAA,CAAkB,CAAC,CAAA;AACrC,IAAA,IAAI,IAAA,GAAO,CAAA;AACX,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,CAAA,EAAG,CAAA,EAAA,EAAK;AAC3B,MAAA,IAAA,IAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAEA,IAAA,IAAI,IAAA,GAAO,GAAG,OAAO,CAAA;AACrB,IAAA,IAAI,IAAA,GAAO,GAAG,OAAO,CAAA;AACrB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,eAAe,MAAA,EAA6C;AAC1D,IAAA,MAAM,cAAA,GAAiB,OAAO,MAAA,KAAW,QAAA,GAAW,CAAC,MAAM,CAAA,GAAI,CAAC,GAAG,IAAI,GAAA,CAAI,MAAM,CAAC,CAAA;AAElF,IAAA,IAAI,sBAAA,GAAyB,CAAA;AAC7B,IAAA,KAAA,IAAS,YAAY,CAAA,EAAG,SAAA,GAAY,IAAA,CAAK,OAAA,CAAQ,QAAQ,SAAA,EAAA,EAAa;AAIpE,MAAA,IAAI,mBAAA,GAAsB,CAAA;AAC1B,MAAA,KAAA,MAAW,SAAS,cAAA,EAAgB;AAClC,QAAA,mBAAA,IAAuB,IAAA,CAAK,UAAA,CAAW,SAAA,EAAW,KAAK,CAAA;AAAA,MACzD;AACA,MAAA,IAAI,mBAAA,GAAsB,GAAG,mBAAA,GAAsB,CAAA;AAAA,WAAA,IAC1C,mBAAA,GAAsB,GAAG,mBAAA,GAAsB,CAAA;AACxD,MAAA,sBAAA,IAA0B,CAAA,GAAI,mBAAA;AAAA,IAChC;AACA,IAAA,MAAM,SAAS,CAAA,GAAI,sBAAA;AACnB,IAAA,OAAO,MAAA,GAAS,CAAA,GAAI,CAAA,GAAI,MAAA,GAAS,IAAI,CAAA,GAAI,MAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBQ,4BAAA,CACN,OACA,IAAA,EACU;AACV,IAAA,MAAM,uBAAA,GAA0B,KAAK,OAAA,CAAQ,GAAA;AAAA,MAAI,CAAC,CAAA,EAAG,SAAA,KACnD,IAAA,CAAK,UAAA,CAAW,WAAW,KAAK;AAAA,KAClC;AACA,IAAA,MAAM,gBAAgB,IAAI,KAAA,CAAM,OAAO,CAAC,CAAA,CAAE,KAAK,CAAC,CAAA;AAChD,IAAA,aAAA,CAAc,CAAC,CAAA,GAAI,CAAA;AAEnB,IAAA,KAAA,MAAW,qBAAqB,uBAAA,EAAyB;AACvD,MAAA,KAAA,IAAS,YAAA,GAAe,IAAA,EAAM,YAAA,IAAgB,CAAA,EAAG,YAAA,EAAA,EAAgB;AAC/D,QAAA,aAAA,CAAc,YAAY,CAAA,GACxB,aAAA,CAAc,YAAY,CAAA,IAAK,IAAI,iBAAA,CAAA,GACnC,aAAA,CAAc,YAAA,GAAe,CAAC,CAAA,GAAI,iBAAA;AAAA,MACtC;AACA,MAAA,aAAA,CAAc,CAAC,KAAK,CAAA,GAAI,iBAAA;AAAA,IAC1B;AAEA,IAAA,OAAO,aAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuBA,YAAA,CAAa,QAAqC,CAAA,EAAmB;AACnE,IAAA,IAAI,CAAA,GAAI,GAAG,OAAO,CAAA;AAElB,IAAA,IAAI,OAAO,WAAW,QAAA,EAAU;AAC9B,MAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,4BAAA,CAA6B,MAAA,EAAQ,CAAC,CAAA;AACpE,MAAA,OAAO,iBAAiB,CAAC,CAAA;AAAA,IAC3B;AAIA,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,iBAAA,CAAkB,MAAM,CAAA;AAC1C,IAAA,OAAO,KAAK,CAAA,IAAK,CAAA,GAAI,KAAK,MAAA,GAAS,IAAA,CAAK,CAAC,CAAA,GAAI,CAAA;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBA,WAAA,CAAY,QAAqC,CAAA,EAAmB;AAElE,IAAA,IAAI,OAAO,WAAW,QAAA,EAAU;AAC9B,MAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,4BAAA,CAA6B,MAAA,EAAQ,CAAC,CAAA;AACpE,MAAA,IAAIC,cAAAA,GAAgB,CAAA;AACpB,MAAA,KAAA,IAAS,YAAA,GAAe,CAAA,EAAG,YAAA,IAAgB,CAAA,EAAG,YAAA,EAAA,EAAgB;AAC5D,QAAAA,cAAAA,IAAiB,iBAAiB,YAAY,CAAA;AAAA,MAChD;AACA,MAAA,OAAOA,cAAAA;AAAA,IACT;AAIA,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,iBAAA,CAAkB,MAAM,CAAA;AAC1C,IAAA,MAAM,QAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,SAAS,CAAC,CAAA;AACzC,IAAA,IAAI,aAAA,GAAgB,CAAA;AACpB,IAAA,KAAA,IAAS,YAAA,GAAe,CAAA,EAAG,YAAA,IAAgB,KAAA,EAAO,YAAA,EAAA,EAAgB;AAChE,MAAA,aAAA,IAAiB,KAAK,YAAY,CAAA;AAAA,IACpC;AACA,IAAA,OAAO,aAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBA,mBAAmB,MAAA,EAA6C;AAC9D,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,GAAI,CAAC,GAAG,IAAI,GAAA,CAAI,MAAM,CAAC,CAAA,GAAI,CAAC,MAAM,CAAA;AAErE,IAAA,IAAI,KAAA,GAAQ,CAAA;AAGZ,IAAA,KAAA,MAAW,MAAA,IAAU,KAAK,OAAA,EAAS;AACjC,MAAA,MAAM,IAAA,GAAO,OAAO,IAAA,EAAK;AACzB,MAAA,IAAI,QAAQ,CAAA,EAAG;AACf,MAAA,IAAI,YAAA,GAAe,CAAA;AACnB,MAAA,KAAA,MAAW,CAAC,GAAA,EAAK,GAAG,CAAA,IAAK,MAAA,EAAQ;AAC/B,QAAA,IAAI,CAAA,GAAI,CAAA;AACR,QAAA,KAAA,MAAW,SAAS,MAAA,EAAQ,CAAA,IAAK,GAAA,CAAI,KAAA,CAAM,KAAK,CAAA,IAAK,CAAA;AACrD,QAAA,YAAA,IAAgB,GAAA,GAAM,CAAA;AAAA,MACxB;AACA,MAAA,KAAA,IAAS,IAAA,CAAK,IAAI,IAAA,GAAO,CAAC,KAAK,IAAA,CAAK,IAAA,GAAO,eAAe,YAAA,GAAe,IAAA;AAAA,IAC3E;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA8CA,gBAAgB,MAAA,EAKd;AAEA,IAAA,MAAM,aAAa,OAAO,MAAA,KAAW,QAAA,GAAW,CAAC,MAAM,CAAA,GAAI,MAAA;AAE3D,IAAA,IAAI,SAAA,GAAY,QAAA;AAChB,IAAA,IAAI,SAAA,GAAY,CAAA,QAAA;AAChB,IAAA,IAAI,WAAA,GAAc,CAAA;AAClB,IAAA,IAAI,UAAA,GAAa,CAAA;AAEjB,IAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,cAAc,CAAA,IAAK,KAAK,QAAA,EAAU;AAEpD,MAAA,IAAI,cAAA,GAAiB,KAAA;AACrB,MAAA,IAAI,eAAA,GAAkB,CAAA;AAEtB,MAAA,KAAA,MAAW,SAAS,UAAA,EAAY;AAC9B,QAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,KAAA,CAAM,KAAK,CAAA;AACxC,QAAA,IAAI,KAAA,IAAS,QAAQ,CAAA,EAAG;AACtB,UAAA,cAAA,GAAiB,IAAA;AACjB,UAAA,eAAA,IAAmB,KAAA;AAAA,QACrB;AAAA,MACF;AAEA,MAAA,IAAI,MAAA,GAAS,KAAK,cAAA,EAAgB;AAChC,QAAA,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,SAAA,EAAW,MAAM,CAAA;AACtC,QAAA,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,SAAA,EAAW,MAAM,CAAA;AAGtC,QAAA,MAAM,WAAA,GACJ,UAAA,CAAW,MAAA,KAAW,CAAA,GAAI,kBAAkB,cAAA,CAAe,CAAA;AAC7D,QAAA,WAAA,IAAe,MAAA,GAAS,WAAA;AACxB,QAAA,UAAA,IAAc,WAAA;AAAA,MAChB;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,GAAA,EAAK,SAAA,KAAc,QAAA,GAAW,CAAA,GAAI,SAAA;AAAA,MAClC,GAAA,EAAK,SAAA,KAAc,CAAA,QAAA,GAAY,CAAA,GAAI,SAAA;AAAA,MACnC,GAAA,EAAK,UAAA,GAAa,CAAA,GAAI,WAAA,GAAc,UAAA,GAAa,CAAA;AAAA,MACjD,KAAA,EAAO;AAAA,KACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA+CA,oBAAoB,WAAA,EAKlB;AAEA,IAAA,MAAM,WAAA,GAAc,KAAK,OAAA,CAAQ,GAAA;AAAA,MAAI,CAAC,WACpC,IAAI,UAAA,CAAU,CAAC,MAAM,CAAC,CAAA,CAAE,eAAA,CAAgB,WAAW;AAAA,KACrD;AAGA,IAAA,IAAI,YAAY,IAAA,CAAK,CAAC,UAAU,KAAA,CAAM,KAAA,KAAU,CAAC,CAAA,EAAG;AAClD,MAAA,OAAO,EAAE,KAAK,CAAA,EAAG,GAAA,EAAK,GAAG,GAAA,EAAK,CAAA,EAAG,OAAO,CAAA,EAAE;AAAA,IAC5C;AAGA,IAAA,MAAM,WAAA,GAAc,YAAY,MAAA,CAAO,CAAC,KAAK,KAAA,KAAU,GAAA,GAAM,KAAA,CAAM,GAAA,EAAK,CAAC,CAAA;AACzE,IAAA,MAAM,WAAA,GAAc,YAAY,MAAA,CAAO,CAAC,KAAK,KAAA,KAAU,GAAA,GAAM,KAAA,CAAM,GAAA,EAAK,CAAC,CAAA;AACzE,IAAA,MAAM,WAAA,GAAc,YAAY,MAAA,CAAO,CAAC,KAAK,KAAA,KAAU,GAAA,GAAM,KAAA,CAAM,GAAA,EAAK,CAAC,CAAA;AACzE,IAAA,MAAM,eAAe,WAAA,CAAY,MAAA;AAAA,MAC/B,CAAC,OAAA,EAAS,KAAA,KAAU,OAAA,GAAU,KAAA,CAAM,KAAA;AAAA,MACpC;AAAA,KACF;AAEA,IAAA,OAAO;AAAA,MACL,GAAA,EAAK,WAAA;AAAA,MACL,GAAA,EAAK,WAAA;AAAA,MACL,GAAA,EAAK,WAAA;AAAA,MACL,KAAA,EAAO;AAAA,KACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBA,cAAc,MAAA,EAA6C;AACzD,IAAA,OAAO,IAAA,CAAK,eAAe,MAAM,CAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,UAAA,GAAqB;AAEnB,IAAA,OAAO,IAAA,CAAK,aAAA,CAAc,CAAC,YAAA,EAAc,UAAU,CAAC,CAAA;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,aAAA,GAAiD;AAC/C,IAAA,OAAO,KAAK,QAAA,CAAS,OAAA,EAAQ,CAAE,GAAA,CAAI,CAAC,WAAA,MAAiB;AAAA,MACnD,CAAA,EAAG,WAAA;AAAA,MACH,GAAG,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,GAAA,CAAI,WAAW,CAAA,CAAG;AAAA,KACzC,CAAE,CAAA;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,cAAA,CACE,MAAA,GAAwB,EAAC,EAC0C;AACnE,IAAA,OAAO,KAAK,QAAA,CAAS,OAAA,EAAQ,CAAE,GAAA,CAAI,CAAC,WAAA,KAAgB;AAClD,MAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,IAAI,WAAW,CAAA;AACxD,MAAA,MAAM,QAAA,GAGF;AAAA,QACF,MAAA,EAAQ,WAAA;AAAA,QACR,OAAO,cAAA,CAAe;AAAA,OACxB;AACA,MAAA,KAAA,MAAW,gBAAgB,MAAA,EAAQ;AACjC,QAAA,QAAA,CAAS,YAAY,CAAA,GAAI,cAAA,CAAe,KAAA,CAAM,YAAY,CAAA,IAAK,CAAA;AAAA,MACjE;AACA,MAAA,OAAO,QAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,kBAAA,CACE,MAAA,GAAwB,EAAC,EACzB,UAAU,GAAA,EACgE;AAC1E,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,QAAA,CAAS,OAAA,EAAQ;AAE3C,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,GAAA,CAAI,CAAC,YAAA,MAAkB;AAAA,MAC7C,KAAA,EAAO,YAAA;AAAA,MACP,IAAA,EAAM,YAAA,CAAa,GAAA,CAAI,CAAC,GAAA,KAAQ;AAC9B,QAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,IAAI,GAAG,CAAA;AACrC,QAAA,MAAM,IAAI,GAAA,GAAO,GAAA,CAAI,KAAA,CAAM,YAAY,KAAgB,CAAA,GAAI,CAAA;AAC3D,QAAA,OAAO,CAAA,IAAK,UAAU,CAAA,GAAI,CAAA;AAAA,MAC5B,CAAC;AAAA,KACH,CAAE,CAAA;AAEF,IAAA,OAAO,EAAE,MAAA,EAAQ,YAAA,EAAc,QAAA,EAAS;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,WAAA,CAAY,gBAAyB,IAAA,EAGnC;AACA,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,QAAA,CAAS,OAAA,EAAQ;AAC9C,IAAA,IAAI,eAAA,CAAgB,WAAW,CAAA,EAAG;AAChC,MAAA,OAAO,EAAE,OAAA,EAAS,EAAC,EAAG,IAAA,EAAM,EAAC,EAAE;AAAA,IACjC;AAGA,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,GAAG,eAAe,CAAA;AAC7C,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,GAAG,eAAe,CAAA;AAC7C,IAAA,MAAM,UAAU,KAAA,CAAM,IAAA;AAAA,MACpB,EAAE,MAAA,EAAQ,SAAA,GAAY,SAAA,GAAY,CAAA,EAAE;AAAA,MACpC,CAAC,CAAA,EAAG,CAAA,KAAM,SAAA,GAAY;AAAA,KACxB;AAEA,IAAA,IAAI,qBAAA,GAAwB,CAAA;AAC5B,IAAA,MAAM,UAAoB,EAAC;AAE3B,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,IAAI,MAAM,CAAA;AACxC,MAAA,IAAI,GAAA,EAAK;AACP,QAAA,qBAAA,IAAyB,GAAA,CAAI,CAAA;AAAA,MAC/B;AACA,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN,aAAA,GAAgB,wBAAwB,GAAA,GAAM;AAAA,OAChD;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,OAAA;AAAA,MACA,IAAA,EAAM;AAAA,KACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,YAAA,CAAa,gBAAyB,IAAA,EAGpC;AACA,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,QAAA,CAAS,OAAA,EAAQ;AAC9C,IAAA,IAAI,eAAA,CAAgB,WAAW,CAAA,EAAG;AAChC,MAAA,OAAO,EAAE,OAAA,EAAS,EAAC,EAAG,IAAA,EAAM,EAAC,EAAE;AAAA,IACjC;AAGA,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,GAAG,eAAe,CAAA;AAC7C,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,GAAG,eAAe,CAAA;AAC7C,IAAA,MAAM,UAAU,KAAA,CAAM,IAAA;AAAA,MACpB,EAAE,MAAA,EAAQ,SAAA,GAAY,SAAA,GAAY,CAAA,EAAE;AAAA,MACpC,CAAC,CAAA,EAAG,CAAA,KAAM,SAAA,GAAY;AAAA,KACxB;AAGA,IAAA,IAAI,qBAAA,GAAwB,CAAA;AAC5B,IAAA,MAAM,WAAqB,EAAC;AAE5B,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAE5B,MAAA,MAAM,OAAO,CAAA,GAAI,qBAAA;AACjB,MAAA,QAAA,CAAS,IAAA,CAAK,aAAA,GAAgB,IAAA,GAAO,GAAA,GAAM,IAAI,CAAA;AAG/C,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,IAAI,MAAM,CAAA;AACxC,MAAA,IAAI,GAAA,EAAK;AACP,QAAA,qBAAA,IAAyB,GAAA,CAAI,CAAA;AAAA,MAC/B;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,OAAA;AAAA,MACA,IAAA,EAAM;AAAA,KACR;AAAA,EACF;AAAA;AAAA,EAGA,qBAAA,CAAsB,YAAY,CAAA,EAAW;AAC3C,IAAA,IAAI,GAAA,GAAM,CAAA;AACV,IAAA,KAAA,MAAW,CAAC,CAAA,EAAG,GAAG,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,GAAA,EAAK,IAAI,CAAA,GAAI,SAAA,EAAW,GAAA,IAAO,GAAA,CAAI,CAAA;AACxE,IAAA,OAAO,GAAA;AAAA,EACT;AAAA;AAAA,EAGA,YAAY,KAAA,EAAsC;AAChD,IAAA,MAAM,KAAA,uBAAY,GAAA,EAAY;AAC9B,IAAA,KAAA,MAAW,GAAG,GAAG,CAAA,IAAK,IAAA,CAAK,SAAS,GAAA,EAAK;AACvC,MAAA,KAAA,MAAW,KAAK,GAAA,CAAI,KAAA;AAClB,QAAA,IAAI,GAAA,CAAI,KAAA,CAAM,CAAC,CAAA,IAAM,GAAA,CAAI,KAAA,CAAM,CAAC,CAAA,GAAe,CAAA,EAAG,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA;AAAA,IACjE;AACA,IAAA,IAAI,MAAM,IAAA,KAAS,CAAA;AACjB,MAAA,CAAC,KAAA,EAAO,MAAA,EAAQ,UAAU,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,KAAM,KAAA,CAAM,GAAA,CAAI,CAAC,CAAC,CAAA;AACzD,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA,CAAE,MAAA;AAAA,MAC7B,CAAC,CAAA,KAAM,KAAA,EAAO,QAAA,CAAS,CAAgB,CAAA,IAAK;AAAA,KAC9C;AACA,IAAA,IAAI,SAAS,KAAA,CAAM,MAAA;AACjB,MAAA,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,GAAI,GAAA,IAAO,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAI,GAAA,CAAI,CAAA;AACvE,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,aAAA,CACE,QAAA,GAA0B,IAAA,CAAK,WAAA,EAAY,EACjB;AAC1B,IAAA,MAAM,MAAA,uBAAa,GAAA,EAAyB;AAC5C,IAAA,QAAA,CAAS,QAAQ,CAAC,CAAA,KAAM,OAAO,GAAA,CAAI,CAAA,EAAG,CAAC,CAAC,CAAA;AACxC,IAAA,KAAA,MAAW,GAAG,GAAG,CAAA,IAAK,IAAA,CAAK,SAAS,GAAA,EAAK;AACvC,MAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,QAAA,MAAM,CAAA,GAAK,GAAA,CAAI,KAAA,CAAM,CAAC,CAAA,IAAgB,CAAA;AACtC,QAAA,MAAA,CAAO,IAAI,CAAA,EAAA,CAAI,MAAA,CAAO,IAAI,CAAC,CAAA,IAAK,KAAK,CAAC,CAAA;AAAA,MACxC;AAAA,IACF;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA,EAGA,mBAAA,CACE,QAAA,GAA0B,IAAA,CAAK,WAAA,EAAY,EACkB;AAE7D,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,cAAA,CAAe,QAAQ,CAAA;AAC1C,IAAA,MAAM,MAAA,uBAAa,GAAA,EAGjB;AACF,IAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAA,KAAM,MAAA,CAAO,GAAA,CAAI,CAAA,EAAG,EAAE,GAAA,EAAK,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,CAAC,CAAA;AAE1D,IAAA,KAAA,MAAW,OAAO,KAAA,EAAO;AACvB,MAAA,MAAM,MAAM,GAAA,CAAI,MAAA;AAChB,MAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,QAAA,MAAM,CAAA,GAAK,GAAA,CAAI,CAAC,CAAA,IAAgB,CAAA;AAChC,QAAA,IAAI,IAAI,CAAA,EAAG;AACT,UAAA,MAAM,CAAA,GAAI,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA;AACtB,UAAA,CAAA,CAAE,OAAO,GAAA,GAAM,CAAA;AACf,UAAA,CAAA,CAAE,IAAA,IAAQ,CAAA;AACV,UAAA,IAAI,EAAE,GAAA,KAAQ,MAAA,IAAa,MAAM,CAAA,CAAE,GAAA,IAAO,GAAA,GAAM,GAAA;AAChD,UAAA,IAAI,EAAE,GAAA,KAAQ,MAAA,IAAa,MAAM,CAAA,CAAE,GAAA,IAAO,GAAA,GAAM,GAAA;AAAA,QAClD;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAM,GAAA,uBAAU,GAAA,EAGd;AACF,IAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,MAAA,MAAM,CAAA,GAAI,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA;AACtB,MAAA,MAAM,MAAM,CAAA,CAAE,IAAA,GAAO,IAAI,CAAA,CAAE,GAAA,GAAM,EAAE,IAAA,GAAO,CAAA;AAC1C,MAAA,GAAA,CAAI,GAAA,CAAI,CAAA,EAAG,EAAE,GAAA,EAAK,CAAA,CAAE,GAAA,IAAO,CAAA,EAAG,GAAA,EAAK,GAAA,EAAK,CAAA,CAAE,GAAA,IAAO,CAAA,EAAG,CAAA;AAAA,IACtD;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA2BA,YAAA,CACE,WAAmC,iBAAA,EACA;AACnC,IAAA,MAAM,KAAA,uBAAY,GAAA,EAAkC;AACpD,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,KAAQ,IAAI,UAAA,CAAU,CAAC,GAAG,CAAA,EAAG,MAAA,EAAW,IAAA,CAAK,IAAI,CAAC,CAAA;AAEtF,IAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,MAAA,MAAM,qBAAA,GAAwB,IAAA,CAAK,cAAA,CAAe,OAAO,CAAA;AACzD,MAAA,IAAI,yBAAyB,CAAA,EAAG;AAEhC,MAAA,MAAM,cAAc,EAAE,GAAA,EAAK,GAAG,GAAA,EAAK,CAAA,EAAG,KAAK,CAAA,EAAE;AAC7C,MAAA,IAAI,YAAA,GAAe,CAAA;AACnB,MAAA,KAAA,MAAW,UAAU,SAAA,EAAW;AAC9B,QAAA,IAAI,MAAA,CAAO,cAAA,CAAe,OAAO,CAAA,IAAK,CAAA,EAAG;AACzC,QAAA,YAAA,EAAA;AACA,QAAA,MAAM,IAAA,GAAO,MAAA,CAAO,eAAA,CAAgB,OAAO,CAAA;AAC3C,QAAA,WAAA,CAAY,OAAO,IAAA,CAAK,GAAA;AACxB,QAAA,WAAA,CAAY,OAAO,IAAA,CAAK,GAAA;AACxB,QAAA,WAAA,CAAY,OAAO,IAAA,CAAK,GAAA;AAAA,MAC1B;AAEA,MAAA,KAAA,CAAM,IAAI,OAAA,EAAS;AAAA,QACjB,qBAAA;AAAA,QACA,gBACE,YAAA,GAAe,CAAA,GAAI,KAAK,YAAA,CAAa,OAAA,EAAS,YAAY,CAAA,GAAI,CAAA;AAAA,QAChE;AAAA,OACD,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,SAAS,KAAA,EAA0C;AAEjD,IAAA,MAAM,UAAA,uBAAiB,GAAA,EAAY;AACnC,IAAA,KAAA,MAAW,GAAG,GAAG,CAAA,IAAK,IAAA,CAAK,SAAS,GAAA,EAAK;AACvC,MAAA,KAAA,MAAW,CAAA,IAAK,IAAI,KAAA,EAAO;AACzB,QAAA,IAAI,GAAA,CAAI,KAAA,CAAM,CAAC,CAAA,IAAM,GAAA,CAAI,KAAA,CAAM,CAAC,CAAA,GAAe,CAAA,EAAG,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA;AAAA,MACpE;AAAA,IACF;AACA,IAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,MAAA,KAAA,MAAW,CAAA,IAAK,UAAA,CAAU,gBAAA,EAAkB,UAAA,CAAW,IAAI,CAAC,CAAA;AAAA,IAC9D;AAEA,IAAA,IAAI,QAAA,GAAW,KAAA,CAAM,IAAA,CAAK,UAAU,CAAA;AAGpC,IAAA,IAAI,KAAA,IAAS,MAAM,MAAA,EAAQ;AACzB,MAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,KAAK,CAAA;AAC7B,MAAA,QAAA,GAAW,SAAS,MAAA,CAAO,CAAC,MAAM,OAAA,CAAQ,GAAA,CAAI,CAAgB,CAAC,CAAA;AAC/D,MAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM,CAAC,CAAA,EAAG,CAAC,CAAC,CAAC,CAAA;AAChD,MAAA,QAAA,CAAS,IAAA;AAAA,QACP,CAAC,CAAA,EAAG,CAAA,KAAA,CACD,IAAA,CAAK,GAAA,CAAI,CAAgB,CAAA,IAAK,GAAA,KAC9B,IAAA,CAAK,GAAA,CAAI,CAAgB,CAAA,IAAK,GAAA;AAAA,OACnC;AAAA,IACF;AAGA,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,cAAA,CAAe,QAAyB,CAAA;AAE1D,IAAA,MAAM,QAAA,uBAAe,GAAA,EAGnB;AACF,IAAA,KAAA,MAAW,MAAM,QAAA,EAAU;AACzB,MAAA,QAAA,CAAS,IAAI,EAAA,EAAmB,EAAE,KAAK,CAAA,EAAG,IAAA,EAAM,GAAG,CAAA;AAAA,IACrD;AAEA,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,MAAM,MAAM,GAAA,CAAI,MAAA;AAChB,MAAA,KAAA,MAAW,MAAM,QAAA,EAAU;AACzB,QAAA,MAAM,CAAA,GAAK,GAAA,CAAI,EAAE,CAAA,IAAgB,CAAA;AACjC,QAAA,IAAI,KAAK,CAAA,EAAG;AAEZ,QAAA,MAAM,CAAA,GAAI,QAAA,CAAS,GAAA,CAAI,EAAiB,CAAA;AACxC,QAAA,CAAA,CAAE,OAAO,GAAA,GAAM,CAAA;AACf,QAAA,CAAA,CAAE,IAAA,IAAQ,CAAA;AACV,QAAA,IAAI,EAAE,GAAA,KAAQ,MAAA,IAAa,MAAM,CAAA,CAAE,GAAA,IAAO,GAAA,GAAM,GAAA;AAChD,QAAA,IAAI,EAAE,GAAA,KAAQ,MAAA,IAAa,MAAM,CAAA,CAAE,GAAA,IAAO,GAAA,GAAM,GAAA;AAAA,MAClD;AAAA,IACF;AAEA,IAAA,MAAM,CAAA,GAAI,KAAK,OAAA,CAAQ,MAAA;AACvB,IAAA,MAAM,UAAA,uBAAiB,GAAA,EAAkC;AACzD,IAAA,KAAA,MAAW,MAAM,QAAA,EAAU;AACzB,MAAA,MAAM,CAAA,GAAI,QAAA,CAAS,GAAA,CAAI,EAAiB,CAAA;AACxC,MAAA,MAAM,MAAM,CAAA,CAAE,IAAA,GAAO,IAAI,CAAA,CAAE,GAAA,GAAM,EAAE,IAAA,GAAO,CAAA;AAI1C,MAAA,UAAA,CAAW,IAAI,EAAA,EAAmB;AAAA,QAChC,qBAAA,EAAuB,IAAA,CAAK,cAAA,CAAe,EAAiB,CAAA;AAAA,QAC5D,cAAA,EAAgB,IAAA,CAAK,YAAA,CAAa,EAAA,EAAmB,CAAC,CAAA;AAAA,QACtD,WAAA,EAAa,EAAE,GAAA,EAAK,CAAA,CAAE,GAAA,IAAO,GAAG,GAAA,EAAK,GAAA,EAAK,CAAA,CAAE,GAAA,IAAO,CAAA;AAAE,OACtD,CAAA;AAAA,IACH;AAGA,IAAA,MAAM,UAAA,GAAa,KAAK,IAAA,EAAK;AAE7B,IAAA,IAAI,YAAA,GAAe,CAAA;AACnB,IAAA,KAAA,MAAW,CAAC,CAAA,EAAG,GAAG,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,GAAA,EAAK,IAAI,CAAA,GAAI,CAAA,EAAG,YAAA,IAAgB,GAAA,CAAI,CAAA;AAEzE,IAAA,MAAM,WAAA,GAAc;AAAA,MAClB,GAAA,EAAK,IAAA,CAAK,QAAA,CAAS,QAAA,CAAS,IAAI,CAAA;AAAA,MAChC,GAAA,EAAK,IAAA,CAAK,QAAA,CAAS,QAAA,CAAS,GAAG,CAAA;AAAA,MAC/B,GAAA,EAAK,IAAA,CAAK,QAAA,CAAS,QAAA,CAAS,IAAI;AAAA,KAClC;AAEA,IAAA,OAAO,EAAE,UAAA,EAAY,YAAA,EAAc,WAAA,EAAa,UAAU,UAAA,EAAW;AAAA,EACvE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,SAAA,GAAuB;AACrB,IAAA,OAAO,IAAI,UAAA,CAAU,CAAC,KAAK,QAAA,CAAS,SAAA,EAAW,CAAC,CAAA;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAA,CAAQ,KAAc,YAAA,EAAmC;AACvD,IAAA,OAAO,IAAI,WAAU,CAAC,IAAA,CAAK,SAAS,OAAA,CAAQ,GAAA,EAAK,YAAY,CAAC,CAAC,CAAA;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,SAAA,CAAU,QAAmB,WAAA,EAAgC;AAC3D,IAAA,OAAO,IAAI,UAAA,CAAU;AAAA,MACnB,IAAA,CAAK,QAAA,CAAS,SAAA,CAAU,MAAA,CAAO,UAAU,WAAW;AAAA,KACrD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,UAAU,MAAA,EAA2B;AACnC,IAAA,OAAO,IAAI,WAAU,CAAC,IAAA,CAAK,SAAS,SAAA,CAAU,MAAM,CAAC,CAAC,CAAA;AAAA,EACxD;AAAA,EAEA,SAAA,GAAoB;AAClB,IAAA,OAAO,IAAA,CAAK,SAAS,IAAA,EAAK;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,UACE,uBAAA,EACW;AACX,IAAA,OAAO,IAAI,WAAU,CAAC,IAAA,CAAK,SAAS,SAAA,CAAU,uBAAuB,CAAC,CAAC,CAAA;AAAA,EACzE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,WAAA,CACE,MAAA,EACA,QAAA,GAAuC,OAAA,EACvC,cAAc,CAAA,EACH;AACX,IAAA,OAAO,IAAI,UAAA,CAAU,CAAC,IAAA,CAAK,QAAA,CAAS,YAAY,MAAA,EAAQ,QAAA,EAAU,WAAW,CAAC,CAAC,CAAA;AAAA,EACjF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,SAAS,KAAA,EAA6B;AACpC,IAAA,MAAM,UAAU,CAAC,GAAG,KAAK,OAAA,EAAS,GAAG,MAAM,OAAO,CAAA;AAClD,IAAA,OAAO,IAAI,WAAU,OAAO,CAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWO,iBAAA,CACL,cAAA,EACA,aAAA,EACA,GAAA,GAAM,GAAA,EACqE;AAC3E,IAAA,MAAM,OAAO,IAAA,CAAK,OAAA;AAClB,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,MAAM,IAAI,MAAM,mDAAmD,CAAA;AAAA,IACrE;AAEA,IAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KACb,KAAA,CAAM,QAAQ,CAAC,CAAA,GAAI,CAAA,GAAI,CAAC,CAAC,CAAA;AAC3B,IAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAAc,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAC,CAAC,CAAA;AACzD,IAAA,MAAM,MAAM,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,CAAA,GAAI,OAAO,OAAO,CAAA;AAG5C,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ;AAC5B,MAAA,MAAM,EAAA,GAAK,IAAI,UAAA,CAAU,CAAC,GAAG,CAAC,CAAA;AAC9B,MAAA,MAAM,EAAA,GAAK,EAAA,CAAG,cAAA,CAAe,KAAA,CAAM,cAAc,CAAC,CAAA;AAClD,MAAA,MAAM,EAAA,GAAK,EAAA,CAAG,cAAA,CAAe,KAAA,CAAM,aAAa,CAAC,CAAA;AACjD,MAAA,IAAI,EAAA,GAAK,KAAK,GAAA,EAAK;AACjB,QAAA,MAAM,IAAI,KAAA;AAAA,UACR;AAAA,SACF;AAAA,MACF;AACA,MAAA,OAAO,EAAE,IAAI,EAAA,EAAG;AAAA,IAClB,CAAC,CAAA;AAGD,IAAA,IAAI,SAAA,GAAY,CAAA;AAChB,IAAA,IAAI,YAAA,GAAe,CAAA;AACnB,IAAA,IAAI,eAAA,GAAkB,CAAA;AACtB,IAAA,IAAI,KAAA,GAAQ,CAAA;AAEZ,IAAA,KAAA,MAAW,EAAE,EAAA,EAAI,EAAA,EAAG,IAAK,GAAA,EAAK;AAC5B,MAAA,YAAA,IAAgB,SAAA,GAAY,EAAA;AAC5B,MAAA,eAAA,IAAmB,aAAa,EAAA,GAAK,EAAA,CAAA;AACrC,MAAA,MAAM,OAAO,CAAA,GAAI,EAAA;AACjB,MAAA,SAAA,IAAa,IAAA;AACb,MAAA,KAAA,IAAS,IAAA;AAAA,IACX;AAEA,IAAA,MAAM,OAAO,CAAA,GAAI,KAAA;AAGjB,IAAA,MAAM,CAAA,GAAI,QAAQ,eAAe,CAAA;AACjC,IAAA,MAAM,CAAA,GAAI,QAAQ,YAAY,CAAA;AAC9B,IAAA,MAAM,GAAA,GAAM,QAAQ,IAAI,CAAA;AACxB,IAAA,MAAM,IAAA,GAAO,QAAQ,KAAK,CAAA;AAE1B,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,CAAA,GAAI,GAAG,CAAA,GAAI,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAG,CAAA,EAAG;AAClD,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,6DAAA,EACE,CAAA,GAAI,CACN,CAAA,OAAA,EAAU,GAAG,CAAA;AAAA,OACf;AAAA,IACF;AAEA,IAAA,OAAO,CAAC,CAAA,EAAG,CAAA,EAAG,GAAA,EAAK,IAAI,CAAA;AAAA,EACzB;AACF,CAAA;AAn1Ca,UAAA,CAyCa,gBAAA,GAA2C;AAAA,EACjE,KAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA;AA7CK,IAAM,SAAA,GAAN,UAAA;;;ACJP,IAAM,qBAAA,GAA8C;AAAA,EAClD,QAAA,EAAU,CAAC,GAAA,KAAQ,GAAA,CAAI,MAAA,EAAO;AAAA,EAC9B,oBAAA,EAAsB;AACxB,CAAA;AAEO,IAAM,QAAA,GAAW,IAAI,QAAA,CAAsB,GAAA,EAAM,qBAAqB,CAAA;AAM7E,IAAM,uBAAA,GAA0B,KAAA;AAOhC,IAAM,YAAA,GAAN,cAA2B,GAAA,CAAiB;AAAA,EAC1C,YAAY,MAAA,EAAkC;AAC5C,IAAA,KAAA,EAAM;AACN,IAAA,KAAA,MAAW,CAAC,OAAO,GAAG,CAAA,IAAK,QAAQ,KAAA,CAAM,GAAA,CAAI,OAAO,GAAG,CAAA;AAAA,EACzD;AAAA,EAES,IAAI,KAAA,EAAsB;AACjC,IAAA,MAAM,IAAI,SAAA,CAAU,CAAA,wBAAA,EAA2B,KAAK,CAAA,6CAAA,CAA+C,CAAA;AAAA,EACrG;AAAA,EAES,OAAO,KAAA,EAAsB;AACpC,IAAA,MAAM,IAAI,SAAA,CAAU,CAAA,2BAAA,EAA8B,KAAK,CAAA,6CAAA,CAA+C,CAAA;AAAA,EACxG;AAAA,EAES,KAAA,GAAe;AACtB,IAAA,MAAM,IAAI,UAAU,mEAAmE,CAAA;AAAA,EACzF;AACF,CAAA;AAkCO,IAAM,IAAA,GAAN,MAAM,IAAA,CAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqBf,WAAA,CACkB,GAAA,mBAAgC,IAAI,GAAA,IACpC,OAAA,GAAU,GAAA,EACV,UAAA,GAAa,KAAA,EACb,aAAqB,CAAA,KAAA,EAAQ,IAAA,CAAI,eAAA,EAAiB,CAAA,CAAA,EACjD,uBAAuB,IAAA,EACxC;AALgB,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AACA,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AACC,IAAA,IAAA,CAAA,oBAAA,GAAA,oBAAA;AAZnB,IAAA,IAAA,CAAQ,OAAA,GAAU,KAAA;AAAA,EAaf;AAAA;AAAA;AAAA;AAAA;AAAA,EAMH,OAAO,YAAY,OAAA,EAAwC;AACzD,IAAA,OAAO,IAAI,QAAA,CAAsB,OAAA,EAAS,qBAAqB,CAAA;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAA,GAAe;AACb,IAAA,IAAI,IAAA,CAAK,SAAS,OAAO,IAAA;AACzB,IAAA,MAAM,GAAA,GAAM,IAAI,YAAA,CAAa,IAAA,CAAK,GAAG,CAAA;AACrC,IAAA,KAAA,MAAW,GAAA,IAAO,GAAA,CAAI,MAAA,EAAO,EAAG;AAC9B,MAAA,MAAA,CAAO,MAAA,CAAO,IAAI,KAAK,CAAA;AACvB,MAAA,IAAI,GAAA,CAAI,IAAA,EAAM,MAAA,CAAO,MAAA,CAAO,IAAI,IAAI,CAAA;AACpC,MAAA,MAAA,CAAO,OAAO,GAAG,CAAA;AAAA,IACnB;AAEA,IAAA,MAAA,CAAO,OAAO,GAAG,CAAA;AAEjB,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAgB,KAAA,EAAO,EAAE,KAAA,EAAO,GAAA,EAAK,QAAA,EAAU,KAAA,EAAO,UAAA,EAAY,IAAA,EAAM,YAAA,EAAc,KAAA,EAAO,CAAA;AACnH,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,OAAO,KAAA,CAAM,OAAA,GAAU,GAAA,EAAK,aAAa,OAAA,EAAS;AAChD,IAAA,OAAO,IAAI,IAAA,iBAAI,IAAI,KAAI,EAAG,OAAA,EAAS,OAAO,UAAU,CAAA;AAAA,EACtD;AAAA;AAAA,EAGA,OAAO,IAAA,CAAK,OAAA,GAAU,GAAA,EAAU;AAC9B,IAAA,MAAM,CAAA,uBAAQ,GAAA,EAAI;AAClB,IAAA,CAAA,CAAE,GAAA,CAAI,CAAA,EAAG,EAAE,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,EAAE,IAAA,EAAM,CAAA,EAAE,EAAG,IAAA,EAAM,IAAI,CAAA;AAC/C,IAAA,OAAO,IAAI,IAAA,CAAI,CAAA,EAAG,OAAA,EAAS,OAAO,MAAM,CAAA;AAAA,EAC1C;AAAA,EAEA,OAAO,KAAA,CAAM,KAAA,EAAe,OAAA,GAAU,GAAA,EAAU;AAC9C,IAAA,OAAO,IAAA,CAAI,OAAA,iBAAQ,IAAI,GAAA,CAAI,CAAC,CAAC,KAAA,EAAO,CAAC,CAAC,CAAC,CAAA,EAAG,OAAO,CAAA;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,OAAO,QAAA,CAAS,OAAA,GAAU,GAAA,EAAU;AAClC,IAAA,MAAM,CAAA,uBAAQ,GAAA,EAAiB;AAC/B,IAAA,CAAA,CAAE,GAAA,CAAI,CAAA,EAAG,EAAE,CAAA,EAAG,GAAG,KAAA,EAAO,EAAE,CAAC,iBAAiB,GAAG,CAAA,EAAE,EAAG,IAAA,EAAM,IAAI,CAAA;AAC9D,IAAA,OAAO,IAAI,IAAA,CAAI,CAAA,EAAG,OAAA,EAAS,OAAO,UAAU,CAAA;AAAA,EAC9C;AAAA;AAAA,EAGA,OAAO,SAAA,GAAiB;AACtB,IAAA,OAAO,IAAA,CAAI,IAAA,EAAK,CAAE,SAAA,CAAU,CAAC,CAAA;AAAA,EAC/B;AAAA;AAAA,EAGA,CAAC,MAAA,CAAO,QAAQ,CAAA,GAAqC;AACnD,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,QAAQ,CAAA,EAAE;AAAA,EACnC;AAAA,EAEA,OAAO,UAAA,GAAa;AAClB,IAAA,QAAA,CAAS,KAAA,EAAM;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,MAAA,CACL,UAAA,EACA,UAAA,EACA,kBAAA,EACK;AACL,IAAA,IAAI,CAAA,GAAI,kBAAA;AACR,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,CAAC,GAAG,CAAA,GAAI,CAAA;AAC7B,IAAA,IAAI,CAAA,GAAI,GAAG,CAAA,GAAI,CAAA;AACf,IAAA,IAAI,CAAA,GAAI,GAAG,CAAA,GAAI,CAAA;AAEf,IAAA,MAAM,IAAI,CAAA,GAAI,CAAA;AAKd,IAAA,IAAI,CAAA,KAAM,CAAA,EAAG,OAAO,UAAA,CAAW,UAAU,CAAC,CAAA;AAC1C,IAAA,IAAI,CAAA,KAAM,CAAA,EAAG,OAAO,UAAA,CAAW,UAAU,CAAC,CAAA;AAG1C,IAAA,MAAM,GAAA,GAAM,UAAA,CAAW,OAAA,IAAW,UAAA,CAAW,OAAA;AAC7C,IAAA,MAAM,KAAK,CAAA,OAAA,EAAU,UAAA,CAAW,UAAU,CAAA,CAAA,EAAI,EAAE,OAAA,CAAQ,CAAC,CAAC,CAAA,GAAA,EACxD,WAAW,UACb,CAAA,CAAA,EAAI,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AAQhB,IAAA,MAAM,SAAA,uBAAgB,GAAA,EAAiB;AACvC,IAAA,KAAA,MAAW,CAAC,WAAA,EAAa,GAAG,CAAA,IAAK,WAAW,GAAA,EAAK;AAC/C,MAAA,IAAA,CAAI,UAAU,SAAA,EAAW,WAAA,EAAa,KAAI,QAAA,CAAS,GAAA,EAAK,CAAC,CAAC,CAAA;AAAA,IAC5D;AACA,IAAA,KAAA,MAAW,CAAC,WAAA,EAAa,GAAG,CAAA,IAAK,WAAW,GAAA,EAAK;AAC/C,MAAA,IAAA,CAAI,UAAU,SAAA,EAAW,WAAA,EAAa,KAAI,QAAA,CAAS,GAAA,EAAK,CAAC,CAAC,CAAA;AAAA,IAC5D;AAEA,IAAA,OAAO,IAAI,IAAA,CAAI,SAAA,EAAW,GAAA,EAAK,OAAO,EAAE,CAAA;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBA,OAAO,eAAA,CAAgB,UAAA,EAAiB,WAAA,EAA0B;AAChE,IAAA,OAAO,KAAI,MAAA,CAAO,UAAA,EAAY,IAAA,CAAI,IAAA,IAAQ,WAAW,CAAA;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA2BA,IAAA,CAAK,GAAW,QAAA,EAAe;AAC7B,IAAA,OAAO,IAAA,CAAI,MAAA,CAAO,IAAA,EAAM,QAAA,EAAU,CAAC,CAAA;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,OAAO,SAAA,CACL,OAAA,EACA,GAAA,GAAM,GAAA,EACD;AACL,IAAA,MAAM,QAAQ,OAAA,CAAQ,GAAA;AAAA,MAAI,CAAC,CAAA,KACzB,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,GAAI,EAAE,GAAA,EAAK,CAAA,CAAE,CAAC,CAAA,EAAG,MAAA,EAAQ,CAAA,CAAE,CAAC,GAAE,GAAI;AAAA,KACnD;AAGA,IAAA,KAAA,MAAW,EAAE,MAAA,EAAO,IAAK,KAAA,EAAO;AAC9B,MAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,IAAK,MAAA,GAAS,CAAC,GAAA,EAAK;AAC7C,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,8BAAA,EAAiC,MAAM,CAAA,CAAA,CAAG,CAAA;AAAA,MAC5D;AAAA,IACF;AAGA,IAAA,IAAI,WAAA,GAAc,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,EAAG,EAAE,MAAA,EAAO,KAAM,CAAA,GAAI,MAAA,EAAQ,CAAC,CAAA;AAG/D,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,WAAW,CAAA,IAAK,KAAK,WAAA,GAAc,CAAA;AAChD,IAAA,IAAI,KAAK,GAAA,CAAI,CAAA,GAAI,WAAW,CAAA,IAAK,KAAK,WAAA,GAAc,CAAA;AAEpD,IAAA,IAAI,WAAA,GAAc,IAAI,GAAA,EAAK;AACzB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,4BAAA,EAA+B,WAAW,CAAA,sBAAA,EAAyB,GAAG,CAAA,CAAA;AAAA,OACxE;AAAA,IACF;AAGA,IAAA,IAAI,GAAA,GAAM,IAAA,CAAI,KAAA,CAAM,GAAG,CAAA;AACvB,IAAA,KAAA,MAAW,EAAE,GAAA,EAAK,MAAA,EAAO,IAAK,KAAA,EAAO;AACnC,MAAA,IAAI,SAAS,GAAA,EAAK,GAAA,GAAM,GAAA,CAAI,SAAA,CAAU,KAAK,MAAM,CAAA;AAAA,IACnD;AAGA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAI,WAAW,CAAA;AAC5C,IAAA,IAAI,WAAW,GAAA,EAAK;AAClB,MAAA,GAAA,GAAM,GAAA,CAAI,SAAA,CAAU,IAAA,CAAI,IAAA,IAAQ,QAAQ,CAAA;AAAA,IAC1C;AAEA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,OAAO,GAAA,CACL,OAAA,EACA,GAAA,GAAM,GAAA,EACD;AACL,IAAA,MAAM,QAAQ,OAAA,CAAQ,GAAA;AAAA,MAAI,CAAC,CAAA,KACzB,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,GAAI,EAAE,GAAA,EAAK,CAAA,CAAE,CAAC,CAAA,EAAG,MAAA,EAAQ,CAAA,CAAE,CAAC,GAAE,GAAI;AAAA,KACnD;AAGA,IAAA,KAAA,MAAW,EAAE,MAAA,EAAO,IAAK,KAAA,EAAO;AAC9B,MAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,EAAG;AAC5B,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,wBAAA,EAA2B,MAAM,CAAA,CAAA,CAAG,CAAA;AAAA,MACtD;AAAA,IACF;AAEA,IAAA,IAAI,GAAA,GAAM,IAAA,CAAI,KAAA,CAAM,GAAG,CAAA;AACvB,IAAA,KAAA,MAAW,EAAE,GAAA,EAAK,MAAA,EAAO,IAAK,KAAA,EAAO;AACnC,MAAA,IAAI,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA,IAAK,GAAA,EAAK;AAC7B,MAAA,GAAA,GAAM,GAAA,CAAI,SAAA,CAAU,GAAA,EAAK,MAAM,CAAA;AAAA,IACjC;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,cAAA,GAA0B;AACxB,IAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,GAAG,CAAA,IAAK,KAAK,GAAA,EAAK;AACpC,MAAA,IAAI,MAAA,KAAW,CAAA,IAAK,GAAA,CAAI,IAAA,IAAQ,MAAA,CAAO,KAAK,GAAA,CAAI,IAAI,CAAA,CAAE,MAAA,GAAS,CAAA,EAAG;AAChE,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,IAAI,SAAS,CAAA,EAAG;AAAA,IAClB;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,eAAA,GAAuB;AAErB,IAAA,IAAI,IAAA,CAAK,cAAA,EAAe,EAAG,OAAO,IAAA;AAElC,IAAA,MAAM,MAAA,uBAAa,GAAA,EAAiB;AAEpC,IAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,GAAG,CAAA,IAAK,KAAK,GAAA,EAAK;AACpC,MAAA,MAAM,OAAwB,EAAC;AAG/B,MAAA,KAAA,MAAW,OAAA,IAAW,IAAI,KAAA,EAAO;AAC/B,QAAA,MAAM,WAAA,GAAc,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA;AACrC,QAAA,IAAI,cAAc,CAAA,EAAG;AACnB,UAAA,IAAA,CAAK,OAAO,IAAI,MAAA,GAAS,WAAA;AAAA,QAC3B;AAAA,MACF;AAGA,MAAA,MAAA,CAAO,IAAI,MAAA,EAAQ;AAAA,QACjB,GAAG,GAAA,CAAI,CAAA;AAAA,QACP,KAAA,EAAO,EAAE,GAAG,GAAA,CAAI,KAAA,EAAM;AAAA,QACtB,MAAM,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,CAAE,MAAA,GAAS,IAAI,IAAA,GAAO;AAAA,OAC7C,CAAA;AAAA,IACH;AAGA,IAAA,OAAO,IAAI,IAAA;AAAA,MACT,MAAA;AAAA,MACA,IAAA,CAAK,OAAA;AAAA,MACL,IAAA,CAAK,UAAA;AAAA,MACL,CAAA,EAAG,KAAK,UAAU,CAAA,KAAA;AAAA,KACpB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,OAAO,IAAA,CAAK,OAAA,EAA0B,GAAA,GAAM,GAAA,EAAU;AAEpD,IAAA,MAAM,QAAA,GAAW,QAAQ,MAAA,CAAO,CAAC,CAAC,CAAC,CAAA,KAAM,IAAI,GAAG,CAAA;AAEhD,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,MAAA,OAAO,KAAI,SAAA,EAAU;AAAA,IACvB;AAGA,IAAA,IAAI,GAAA,GAAkB,IAAA;AACtB,IAAA,IAAI,GAAA,GAAM,CAAA;AAEV,IAAA,KAAA,MAAW,CAAC,CAAA,EAAG,GAAG,CAAA,IAAK,QAAA,EAAU;AAC/B,MAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,QAAA,GAAA,GAAM,GAAA;AACN,QAAA,GAAA,GAAM,CAAA;AAAA,MACR,CAAA,MAAO;AACL,QAAA,MAAM,CAAA,GAAI,KAAK,GAAA,GAAM,CAAA,CAAA;AACrB,QAAA,GAAA,GAAM,IAAA,CAAI,MAAA,CAAO,GAAA,EAAK,GAAA,EAAK,CAAC,CAAA;AAC5B,QAAA,GAAA,IAAO,CAAA;AAAA,MACT;AAAA,IACF;AAGA,IAAA,OAAO,GAAA,IAAO,KAAI,SAAA,EAAU;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,mBAAA,GAA+B;AACpC,IAAA,OAAO,IAAA,CAAK,oBAAA;AAAA,EACd;AAAA,EAEQ,gBAAA,CAAiB,GAAW,GAAA,EAAqB;AAOvD,IAAA,MAAM,KAAK,IAAA,CAAK,UAAA;AAChB,IAAA,IAAI,GAAA,GAAM,GAAG,EAAE,CAAA,CAAA;AACf,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,GAAG,CAAA,EAAA,EAAK,GAAA,IAAO,IAAI,EAAE,CAAA,CAAA;AACzC,IAAA,OAAO,GAAG,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,IAAA,CAAK,aAAa,CAAA,CAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,KAAA,CAAM,CAAA,EAAW,GAAA,GAAM,IAAA,CAAK,OAAA,EAAc;AACxC,IAAA,IAAI,CAAC,MAAA,CAAO,SAAA,CAAU,CAAC,CAAA,IAAK,KAAK,CAAA,EAAG;AAClC,MAAA,MAAM,IAAI,MAAM,wCAAwC,CAAA;AAAA,IAC1D;AACA,IAAA,IAAI,CAAA,KAAM,GAAG,OAAO,IAAA;AAEpB,IAAA,MAAM,OAAA,GAAU,OAAO,IAAA,CAAK,OAAA;AAE5B,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,gBAAA,CAAiB,CAAA,EAAG,OAAO,CAAA;AAC5C,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA;AAC/B,IAAA,IAAI,QAAQ,OAAO,MAAA;AAGnB,IAAA,IAAI,IAAA,GAAY,IAAA,CAAK,UAAA,GAAa,IAAA,GAAO,KAAK,SAAA,EAAU;AACxD,IAAA,IAAI,MAAA,GAAc,IAAA;AAClB,IAAA,IAAI,MAAM,CAAA,GAAI,CAAA;AAEd,IAAA,OAAO,MAAM,CAAA,EAAG;AACd,MAAA,IAAI,MAAM,CAAA,EAAG;AACX,QAAA,MAAA,GAAS,MAAA,CAAO,QAAA,CAAS,IAAA,EAAM,OAAO,CAAA;AAAA,MACxC;AACA,MAAA,GAAA,KAAQ,CAAA;AACR,MAAA,IAAI,MAAM,CAAA,EAAG;AACX,QAAA,IAAA,GAAO,IAAA,CAAK,QAAA,CAAS,IAAA,EAAM,OAAO,CAAA;AAAA,MACpC;AAAA,IACF;AAGA,IAAA,MAAM,SAAS,IAAI,IAAA;AAAA,MACjB,MAAA,CAAO,GAAA;AAAA,MACP,MAAA,CAAO,OAAA;AAAA,MACP,MAAA,CAAO,UAAA;AAAA,MACP,MAAA,CAAO,UAAA;AAAA,MACP;AAAA,KACF;AACA,IAAA,QAAA,CAAS,GAAA,CAAI,KAAK,MAAM,CAAA;AACxB,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,CAAA,EAAkB;AAC1B,IAAA,IAAI,CAAC,MAAA,CAAO,SAAA,CAAU,CAAC,CAAA,IAAK,KAAK,CAAA,EAAG;AAClC,MAAA,MAAM,IAAI,MAAM,4CAA4C,CAAA;AAAA,IAC9D;AACA,IAAA,IAAI,CAAA,KAAM,CAAA,EAAG,OAAO,CAAC,IAAI,CAAA;AACzB,IAAA,OAAO,MAAM,IAAA,CAAK,EAAE,QAAQ,CAAA,EAAE,EAAG,MAAM,IAAI,CAAA;AAAA,EAC7C;AAAA,EAEA,IAAA,GAAe;AACb,IAAA,IAAI,IAAA,CAAK,eAAe,MAAA,EAAW;AACjC,MAAA,IAAI,oBAAA,GAAuB,CAAA;AAC3B,MAAA,KAAA,MAAW,EAAE,CAAA,EAAE,IAAK,IAAA,CAAK,GAAA,CAAI,QAAO,EAAG;AACrC,QAAA,oBAAA,IAAwB,CAAA;AAAA,MAC1B;AACA,MAAA,IAAA,CAAK,UAAA,GAAa,oBAAA;AAAA,IACpB;AACA,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EACd;AAAA,EAEA,YAAY,OAAA,EAAyB;AACnC,IAAA,IAAI,oBAAA,GAAuB,CAAA;AAC3B,IAAA,KAAA,MAAW,EAAE,CAAA,EAAG,KAAA,MAAW,IAAA,CAAK,GAAA,CAAI,QAAO,EAAG;AAC5C,MAAA,oBAAA,IAAwB,CAAA,IAAM,KAAA,CAAM,OAAO,CAAA,IAAgB,CAAA,CAAA;AAAA,IAC7D;AACA,IAAA,OAAO,oBAAA;AAAA,EACT;AAAA;AAAA,EAGA,SAAA,GAAoB;AAClB,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,CAAC,GAAA,EAAK,GAAA,KAAQ,GAAA,GAAM,KAAK,CAAC,CAAA;AAAA,EAC/D;AAAA,EAEA,SAAA,GAAiB;AACf,IAAA,IAAI,IAAA,CAAK,YAAY,OAAO,IAAA;AAC5B,IAAA,MAAM,mBAAA,GAAsB,KAAK,IAAA,EAAK;AACtC,IAAA,IAAI,mBAAA,KAAwB,GAAG,OAAO,IAAA;AAItC,IAAA,MAAM,aAAA,uBAAoB,GAAA,EAAiB;AAC3C,IAAA,KAAA,MAAW,CAAC,WAAA,EAAa,cAAc,CAAA,IAAK,KAAK,GAAA,EAAK;AACpD,MAAA,MAAM,kBAAmC,EAAC;AAC1C,MAAA,KAAA,MAAW,QAAA,IAAY,eAAe,KAAA,EAAO;AAC3C,QAAA,eAAA,CAAgB,QAAQ,CAAA,GACrB,cAAA,CAAe,KAAA,CAAM,QAAQ,CAAA,GAAe,mBAAA;AAAA,MACjD;AAEA,MAAA,IAAI,oBAAA;AACJ,MAAA,IAAI,eAAe,IAAA,EAAM;AACvB,QAAA,oBAAA,GAAuB,EAAC;AACxB,QAAA,KAAA,MAAW,QAAA,IAAY,eAAe,IAAA,EAAM;AAC1C,UAAA,oBAAA,CAAqB,QAAQ,CAAA,GAC1B,cAAA,CAAe,IAAA,CAAK,QAAQ,CAAA,GAAe,mBAAA;AAAA,QAChD;AAAA,MACF;AAEA,MAAA,aAAA,CAAc,IAAI,WAAA,EAAa;AAAA,QAC7B,CAAA,EAAG,eAAe,CAAA,GAAI,mBAAA;AAAA,QACtB,KAAA,EAAO,eAAA;AAAA,QACP,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,IACH;AACA,IAAA,OAAO,IAAI,IAAA,CAAI,aAAA,EAAe,KAAK,OAAA,EAAS,IAAA,EAAM,KAAK,UAAU,CAAA;AAAA,EACnE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAA,CAAQ,GAAA,GAAM,IAAA,CAAK,OAAA,EAAS,eAAe,KAAA,EAAY;AACrD,IAAA,IAAI,MAAA,GAAS,CAAA,QAAA;AACb,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,KAAA,MAAW,GAAA,IAAO,IAAA,CAAK,GAAA,CAAI,IAAA,EAAK,EAAG;AACjC,QAAA,IAAI,GAAA,GAAM,QAAQ,MAAA,GAAS,GAAA;AAAA,MAC7B;AAAA,IACF;AAEA,IAAA,MAAM,YAAA,uBAAmB,GAAA,EAAiB;AAE1C,IAAA,KAAA,MAAW,CAAC,WAAA,EAAa,cAAc,CAAA,IAAK,KAAK,GAAA,EAAK;AACpD,MAAA,MAAM,UAAA,GACJ,cAAA,CAAe,CAAA,IAAK,GAAA,IAAQ,gBAAgB,WAAA,KAAgB,MAAA;AAE9D,MAAA,IAAI,CAAC,UAAA,EAAY;AAMjB,MAAA,MAAM,UAAA,GAAa,IAAA,CAAI,QAAA,CAAS,cAAc,CAAA;AAE9C,MAAA,KAAA,MAAW,QAAA,IAAY,WAAW,KAAA,EAAO;AACvC,QAAA,IAAI,IAAA,CAAK,IAAI,UAAA,CAAW,KAAA,CAAM,QAAQ,CAAA,IAAK,CAAC,IAAI,GAAA,EAAK;AACnD,UAAA,OAAO,UAAA,CAAW,MAAM,QAAQ,CAAA;AAAA,QAClC;AAAA,MACF;AAEA,MAAA,IAAI,WAAW,IAAA,EAAM;AACnB,QAAA,KAAA,MAAW,QAAA,IAAY,WAAW,IAAA,EAAM;AACtC,UAAA,IAAI,IAAA,CAAK,IAAI,UAAA,CAAW,IAAA,CAAK,QAAQ,CAAA,IAAK,CAAC,IAAI,GAAA,EAAK;AAClD,YAAA,OAAO,UAAA,CAAW,KAAK,QAAQ,CAAA;AAAA,UACjC;AAAA,QACF;AACA,QAAA,IAAI,OAAO,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA,CAAE,WAAW,CAAA,EAAG;AAC7C,UAAA,UAAA,CAAW,IAAA,GAAO,MAAA;AAAA,QACpB;AAAA,MACF;AAEA,MAAA,YAAA,CAAa,GAAA,CAAI,aAAa,UAAU,CAAA;AAAA,IAC1C;AAEA,IAAA,OAAO,IAAI,IAAA,CAAI,YAAA,EAAc,KAAK,IAAA,CAAK,UAAA,EAAY,KAAK,UAAU,CAAA;AAAA,EACpE;AAAA;AAAA;AAAA,EAIA,OAAA,GAAoB;AAClB,IAAA,IAAI,IAAA,CAAK,aAAa,MAAA,EAAW;AAC/B,MAAA,IAAA,CAAK,QAAA,GAAW,CAAC,GAAG,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,CAAC,CAAA;AAAA,IAC3D;AACA,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACd;AAAA;AAAA,EAGA,GAAA,GAAc;AACZ,IAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAW;AAC3B,MAAA,MAAM,OAAA,GAAU,KAAK,OAAA,EAAQ;AAC7B,MAAA,IAAA,CAAK,OAAO,OAAA,CAAQ,MAAA,GAAS,CAAA,GAAI,OAAA,CAAQ,CAAC,CAAA,GAAI,CAAA;AAAA,IAChD;AACA,IAAA,OAAO,IAAA,CAAK,IAAA;AAAA,EACd;AAAA;AAAA,EAGA,GAAA,GAAc;AACZ,IAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAW;AAC3B,MAAA,MAAM,OAAA,GAAU,KAAK,OAAA,EAAQ;AAC7B,MAAA,IAAA,CAAK,IAAA,GAAO,QAAQ,MAAA,GAAS,CAAA,GAAI,QAAQ,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA,GAAI,CAAA;AAAA,IACjE;AACA,IAAA,OAAO,IAAA,CAAK,IAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,IAAA,GAAe;AACb,IAAA,IAAI,IAAA,CAAK,UAAU,MAAA,EAAW;AAC5B,MAAA,IAAI,QAAA,GAAW,CAAA;AACf,MAAA,KAAA,MAAW,CAAC,WAAA,EAAa,cAAc,CAAA,IAAK,KAAK,GAAA,EAAK;AACpD,QAAA,QAAA,IAAY,cAAc,cAAA,CAAe,CAAA;AAAA,MAC3C;AACA,MAAA,IAAA,CAAK,KAAA,GAAQ,QAAA;AAAA,IACf;AACA,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,QAAA,GAAmB;AACjB,IAAA,IAAI,IAAA,CAAK,cAAc,MAAA,EAAW;AAChC,MAAA,MAAM,IAAA,GAAO,KAAK,IAAA,EAAK;AACvB,MAAA,MAAM,cAAc,IAAA,GAAO,CAAA,IAAK,KAAK,GAAA,CAAI,IAAA,GAAO,CAAC,CAAA,GAAI,GAAA;AACrD,MAAA,MAAM,YAAY,WAAA,GAAc,IAAA,CAAK,MAAK,GAAI,IAAA,GAAO,KAAK,IAAA,EAAK;AAC/D,MAAA,IAAI,WAAA,GAAc,CAAA;AAClB,MAAA,KAAA,MAAW,CAAC,WAAA,EAAa,cAAc,CAAA,IAAK,KAAK,GAAA,EAAK;AACpD,QAAA,MAAM,oBAAoB,WAAA,GAAc,SAAA;AACxC,QAAA,WAAA,IAAe,iBAAA,GAAoB,oBAAoB,cAAA,CAAe,CAAA;AAAA,MACxE;AACA,MAAA,IAAA,CAAK,SAAA,GAAY,WAAA,GAAc,WAAA,GAAc,IAAA,GAAO,WAAA;AAAA,IACtD;AACA,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAgB;AACd,IAAA,IAAI,IAAA,CAAK,WAAW,MAAA,EAAW;AAC7B,MAAA,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,UAAU,CAAA;AAAA,IACzC;AACA,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA;AAAA,EAGA,OAAe,SAAS,GAAA,EAAe;AACrC,IAAA,OAAO;AAAA,MACL,GAAG,GAAA,CAAI,CAAA;AAAA,MACP,KAAA,EAAO,EAAE,GAAG,GAAA,CAAI,KAAA,EAAM;AAAA,MACtB,MAAM,GAAA,CAAI,IAAA,GAAO,EAAE,GAAG,GAAA,CAAI,MAAK,GAAI;AAAA,KACrC;AAAA,EACF;AAAA;AAAA,EAGA,OAAe,QAAA,CAAS,GAAA,EAAU,MAAA,EAAqB;AACrD,IAAA,MAAM,QAAyB,EAAC;AAChC,IAAA,KAAA,MAAW,CAAA,IAAK,IAAI,KAAA,EAAO;AACzB,MAAA,KAAA,CAAM,CAAC,CAAA,GAAK,GAAA,CAAI,KAAA,CAAM,CAAC,CAAA,GAAe,MAAA;AAAA,IACxC;AAEA,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI,IAAI,IAAA,EAAM;AACZ,MAAA,IAAA,GAAO,EAAC;AACR,MAAA,KAAA,MAAW,CAAA,IAAK,IAAI,IAAA,EAAM;AACxB,QAAA,IAAA,CAAK,CAAC,CAAA,GAAK,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA,GAAe,MAAA;AAAA,MACtC;AAAA,IACF;AAEA,IAAA,OAAO,EAAE,CAAA,EAAG,GAAA,CAAI,CAAA,GAAI,MAAA,EAAQ,OAAO,IAAA,EAAK;AAAA,EAC1C;AAAA,EAEA,OAAe,SAAA,CACb,cAAA,EACA,WAAA,EACA,QAAA,EACA;AACA,IAAA,MAAM,WAAA,GAAc,cAAA,CAAe,GAAA,CAAI,WAAW,CAAA;AAClD,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,cAAA,CAAe,GAAA,CAAI,WAAA,EAAa,IAAA,CAAI,QAAA,CAAS,QAAQ,CAAC,CAAA;AACtD,MAAA;AAAA,IACF;AAEA,IAAA,WAAA,CAAY,KAAK,QAAA,CAAS,CAAA;AAE1B,IAAA,KAAA,MAAW,QAAA,IAAY,SAAS,KAAA,EAAO;AACrC,MAAA,WAAA,CAAY,KAAA,CAAM,QAAQ,CAAA,GAAA,CACvB,WAAA,CAAY,KAAA,CAAM,QAAQ,CAAA,IAAK,CAAA,IAC/B,QAAA,CAAS,KAAA,CAAM,QAAQ,CAAA;AAAA,IAC5B;AAEA,IAAA,IAAI,SAAS,IAAA,EAAM;AACjB,MAAA,IAAI,CAAC,YAAY,IAAA,EAAM;AACrB,QAAA,WAAA,CAAY,OAAO,EAAC;AAAA,MACtB;AACA,MAAA,KAAA,MAAW,QAAA,IAAY,SAAS,IAAA,EAAM;AACpC,QAAA,WAAA,CAAY,IAAA,CAAK,QAAQ,CAAA,GAAA,CACtB,WAAA,CAAY,IAAA,CAAK,QAAQ,CAAA,IAAK,CAAA,IAC9B,QAAA,CAAS,IAAA,CAAK,QAAQ,CAAA;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,IAAI,KAAA,EAAiB;AACnB,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,CAAC,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAA,CAAU,QAAa,WAAA,EAA0B;AAC/C,IAAA,IAAI,WAAA,KAAgB,GAAG,OAAO,IAAA;AAE9B,IAAA,MAAM,SAAA,uBAAgB,GAAA,EAAiB;AACvC,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,GAAG,CAAA,IAAK,KAAK,GAAA,EAAK;AACjC,MAAA,SAAA,CAAU,GAAA,CAAI,GAAA,EAAK,IAAA,CAAI,QAAA,CAAS,GAAG,CAAC,CAAA;AAAA,IACtC;AAEA,IAAA,KAAA,MAAW,CAAC,WAAA,EAAa,cAAc,CAAA,IAAK,OAAO,GAAA,EAAK;AACtD,MAAA,IAAA,CAAI,SAAA;AAAA,QACF,SAAA;AAAA,QACA,WAAA;AAAA,QACA,IAAA,CAAI,QAAA,CAAS,cAAA,EAAgB,WAAW;AAAA,OAC1C;AAAA,IACF;AAEA,IAAA,OAAO,IAAI,IAAA;AAAA,MACT,SAAA;AAAA,MACA,IAAA,CAAK,OAAA;AAAA,MACL,KAAA;AAAA,MACA,GAAG,IAAA,CAAK,UAAU,WAAW,MAAA,CAAO,UAAU,IAAI,WAAW,CAAA,CAAA;AAAA,KAC/D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuBA,kBAAkB,SAAA,EAAwB;AACxC,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,SAAS,CAAA,IAAK,SAAA,IAAa,GAAG,OAAO,IAAA;AAC1D,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,SAAS,CAAA;AAClC,IAAA,MAAM,SAAA,GAAA,CAAa,CAAA,GAAI,IAAA,IAAQ,IAAA,CAAK,IAAA,EAAK;AAEzC,IAAA,MAAM,MAAA,uBAAa,GAAA,EAAiB;AACpC,IAAA,IAAI,OAAO,CAAA,EAAG;AACZ,MAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,GAAG,CAAA,IAAK,KAAK,GAAA,EAAK;AACpC,QAAA,MAAA,CAAO,IAAI,MAAA,EAAQ,IAAA,CAAI,QAAA,CAAS,GAAA,EAAK,IAAI,CAAC,CAAA;AAAA,MAC5C;AAAA,IACF;AACA,IAAA,IAAI,YAAY,CAAA,EAAG;AACjB,MAAA,IAAA,CAAI,SAAA,CAAU,QAAQ,CAAA,EAAG;AAAA,QACvB,CAAA,EAAG,SAAA;AAAA,QACH,KAAA,EAAO,EAAE,CAAC,iBAAiB,GAAG,SAAA,EAAU;AAAA,QACxC,MAAM;AAAC,OACR,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,IAAI,IAAA;AAAA,MACT,MAAA;AAAA,MACA,IAAA,CAAK,OAAA;AAAA,MACL,KAAA;AAAA,MACA,CAAA,KAAA,EAAQ,IAAA,CAAK,UAAU,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AAAA,KACjC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,cAAc,MAAA,EAAgD;AAC5D,IAAA,MAAM,CAAA,uBAAQ,GAAA,EAAiB;AAC/B,IAAA,MAAM,CAAA,uBAAQ,GAAA,EAAiB;AAC/B,IAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,GAAG,CAAA,IAAK,KAAK,GAAA,EAAK;AACpC,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,EAAG,MAAA,CAAO,MAAM,CAAC,CAAC,CAAA;AACjD,MAAA,IAAI,CAAA,GAAI,GAAG,CAAA,CAAE,GAAA,CAAI,QAAQ,IAAA,CAAI,QAAA,CAAS,GAAA,EAAK,CAAC,CAAC,CAAA;AAC7C,MAAA,IAAI,CAAA,GAAI,CAAA,EAAG,CAAA,CAAE,GAAA,CAAI,MAAA,EAAQ,KAAI,QAAA,CAAS,GAAA,EAAK,CAAA,GAAI,CAAC,CAAC,CAAA;AAAA,IACnD;AACA,IAAA,OAAO;AAAA,MACL,IAAI,KAAI,CAAA,EAAG,IAAA,CAAK,SAAS,KAAA,EAAO,CAAA,OAAA,EAAU,IAAA,CAAK,UAAU,CAAA,CAAA,CAAG,CAAA;AAAA,MAC5D,IAAI,KAAI,CAAA,EAAG,IAAA,CAAK,SAAS,KAAA,EAAO,CAAA,OAAA,EAAU,IAAA,CAAK,UAAU,CAAA,CAAA,CAAG;AAAA,KAC9D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuBA,QAAA,GAAgB;AACd,IAAA,MAAM,SAAA,GAAY,KAAK,IAAA,EAAK;AAC5B,IAAA,IAAI,SAAA,IAAa,GAAG,OAAO,IAAA;AAE3B,IAAA,MAAM,SAAA,uBAAgB,GAAA,EAAiB;AACvC,IAAA,IAAI,GAAA,GAAM,CAAA;AAEV,IAAA,KAAA,MAAW,MAAA,IAAU,IAAA,CAAK,OAAA,EAAQ,EAAG;AACnC,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,MAAM,CAAA;AAC/B,MAAA,MAAM,WAAA,GAAc,IAAI,CAAA,GAAI,SAAA;AAC5B,MAAA,IAAI,eAAe,CAAA,EAAG;AAEtB,MAAA,MAAM,OAAA,GAAU,GAAA;AAChB,MAAA,GAAA,IAAO,WAAA;AAQP,MAAA,SAAA,CAAU,IAAI,MAAA,EAAQ,IAAA,CAAI,SAAS,GAAA,EAAK,GAAA,GAAM,OAAO,CAAC,CAAA;AAAA,IACxD;AAEA,IAAA,OAAO,IAAI,IAAA;AAAA,MACT,SAAA;AAAA,MACA,IAAA,CAAK,OAAA;AAAA,MACL,IAAA,CAAK,UAAA;AAAA,MACL,CAAA,SAAA,EAAY,KAAK,UAAU,CAAA,CAAA;AAAA,KAC7B;AAAA,EACF;AAAA,EAEA,UAAU,MAAA,EAAqB;AAC7B,IAAA,IAAI,MAAA,KAAW,GAAG,OAAO,IAAA;AAEzB,IAAA,MAAM,SAAA,uBAAgB,GAAA,EAAiB;AACvC,IAAA,KAAA,MAAW,CAAC,WAAA,EAAa,cAAc,CAAA,IAAK,KAAK,GAAA,EAAK;AACpD,MAAA,SAAA,CAAU,IAAI,WAAA,EAAa,IAAA,CAAI,QAAA,CAAS,cAAA,EAAgB,MAAM,CAAC,CAAA;AAAA,IACjE;AACA,IAAA,OAAO,IAAI,IAAA;AAAA,MACT,SAAA;AAAA,MACA,IAAA,CAAK,OAAA;AAAA,MACL,KAAA;AAAA,MACA,CAAA,MAAA,EAAS,IAAA,CAAK,UAAU,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AAAA,KACpC;AAAA,EACF;AAAA,EAEA,UAAU,uBAAA,EAA+D;AACvE,IAAA,MAAM,cAAA,uBAAqB,GAAA,EAAiB;AAC5C,IAAA,KAAA,MAAW,CAAC,cAAA,EAAgB,cAAc,CAAA,IAAK,KAAK,GAAA,EAAK;AACvD,MAAA,MAAM,iBAAA,GAAoB,wBAAwB,cAAc,CAAA;AAChE,MAAA,IAAA,CAAI,SAAA;AAAA,QACF,cAAA;AAAA,QACA,iBAAA;AAAA,QACA,IAAA,CAAI,SAAS,cAAc;AAAA,OAC7B;AAAA,IACF;AACA,IAAA,OAAO,IAAI,IAAA;AAAA,MACT,cAAA;AAAA,MACA,IAAA,CAAK,OAAA;AAAA,MACL,IAAA,CAAK,UAAA;AAAA,MACL,CAAA,IAAA,EAAO,KAAK,UAAU,CAAA,CAAA;AAAA,KACxB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,WAAA,CACE,MAAA,EACA,QAAA,GAAuC,OAAA,EACvC,cAAc,CAAA,EACT;AACL,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,EAAG;AAC5B,MAAA,MAAM,IAAI,UAAA,CAAW,CAAA,yCAAA,EAA4C,MAAM,CAAA,CAAE,CAAA;AAAA,IAC3E;AACA,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,WAAW,CAAA,IAAK,gBAAgB,CAAA,EAAG;AACtD,MAAA,MAAM,IAAI,UAAA,CAAW,CAAA,2DAAA,EAA8D,WAAW,CAAA,CAAE,CAAA;AAAA,IAClG;AACA,IAAA,MAAM,QAAQ,MAAA,CAAO,SAAA,CAAU,MAAM,CAAA,IAAK,MAAA,CAAO,UAAU,WAAW,CAAA;AACtE,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,CAAC,WAAA,KAAgB;AACrC,MAAA,IAAI,KAAA,IAAS,MAAA,CAAO,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1C,QAAA,MAAM,YAAY,WAAA,GAAc,MAAA;AAChC,QAAA,IAAI,aAAa,OAAA,EAAS;AACxB,UAAA,OAAO,KAAK,KAAA,CAAA,CAAO,CAAA,GAAI,SAAA,GAAY,WAAA,KAAgB,IAAI,WAAA,CAAY,CAAA;AAAA,QACrE;AACA,QAAA,MAAM,WAAW,SAAA,GAAY,WAAA;AAC7B,QAAA,OAAO,QAAA,KAAa,SAAS,IAAA,CAAK,IAAA,CAAK,QAAQ,CAAA,GAAI,IAAA,CAAK,MAAM,QAAQ,CAAA;AAAA,MACxE;AACA,MAAA,MAAM,MAAA,GAAU,cAAc,MAAA,GAAU,WAAA;AACxC,MAAA,OAAO,QAAA,KAAa,OAAA,GAChB,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA,GACjB,QAAA,KAAa,MAAA,GACb,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA,GAChB,IAAA,CAAK,MAAM,MAAM,CAAA;AAAA,IACvB,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,qBAAA,CACN,EAAA,EACA,EAAA,EACA,GAAA,EACA,GAAA,EACQ;AACR,IAAA,MAAM,CAAC,GAAA,EAAK,GAAG,CAAA,GAAI,CAAC,GAAG,UAAA,EAAY,EAAA,CAAG,UAAU,CAAA,CAAE,IAAA,EAAK;AAEvD,IAAA,OAAO,MAAM,GAAA,GAAM,KAAA,GAAQ,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,GAAG,IAAI,EAAA,CAAG,WAAA,EAAa,CAAA,CAAA,EAAI,EAAA,CAAG,aAAa,CAAA,CAAA;AAAA,EAC7F;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,WAAA,GAAsB;AACpB,IAAA,IAAI,IAAA,CAAK,iBAAiB,MAAA,EAAW;AACnC,MAAA,MAAM,MAAA,GAAS,CAAC,CAAA,KACd,CAAA,KAAM,MAAA,GACF,EAAA,GACA,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,CACV,IAAA,EAAK,CACL,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,EAAG,IAAA,CAAK,SAAA,CAAU,CAAC,CAAC,CAAA,CAAA,EAAI,CAAA,CAAE,CAAC,CAAC,CAAA,CAAE,CAAA,CACzC,IAAA,CAAK,GAAG,CAAA;AACjB,MAAA,MAAM,OAAO,CAAC,GAAG,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA,CAAE,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAC,CAAA;AAC/D,MAAA,MAAM,QAAkB,EAAC;AACzB,MAAA,KAAA,MAAW,CAAC,WAAA,EAAa,GAAG,CAAA,IAAK,IAAA,EAAM;AACrC,QAAA,KAAA,CAAM,KAAK,CAAA,EAAG,WAAW,CAAA,CAAA,EAAI,GAAA,CAAI,CAAC,CAAA,CAAA,EAAI,MAAA,CAAO,GAAA,CAAI,KAAK,CAAC,CAAA,EAAA,EAAK,MAAA,CAAO,GAAA,CAAI,IAAI,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,MACjF;AACA,MAAA,IAAA,CAAK,YAAA,GAAe,CAAA,EAAG,IAAA,CAAK,UAAA,GAAa,CAAA,GAAI,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AAAA,IACnE;AACA,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AAAA,EAEA,QAAA,CAAS,KAAA,EAAY,GAAA,EAAc,GAAA,GAAM,KAAA,EAAY;AACnD,IAAA,MAAM,OAAA,GAAU,OAAO,IAAA,CAAK,OAAA;AAG5B,IAAA,MAAM,IAAA,GAAO,CAAC,CAAA,KACZ,GAAA,GAAM,IAAI,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,IAAA,KAAS,CAAC,CAAA,IAAK,OAAA,GAAU,CAAA,GAAI,EAAE,SAAA,EAAU;AAChE,IAAA,MAAM,EAAA,GAAK,KAAK,IAAI,CAAA;AACpB,IAAA,MAAM,EAAA,GAAK,KAAK,KAAK,CAAA;AAErB,IAAA,MAAM,CAAC,CAAA,EAAG,CAAC,CAAA,GAAI,GAAG,UAAA,IAAc,EAAA,CAAG,UAAA,GAAa,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,CAAC,IAAI,EAAE,CAAA;AAClE,IAAA,MAAM,WAAW,IAAA,CAAK,qBAAA,CAAsB,CAAA,EAAG,CAAA,EAAG,SAAS,GAAG,CAAA;AAC9D,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,GAAA,CAAI,QAAQ,CAAA;AACpC,IAAA,IAAI,QAAQ,OAAO,MAAA;AASnB,IAAA,MAAM,YAAA,GAAe,CAAC,CAAA,KACpB,CAAA,KAAM,SAAY,MAAA,GAAa,MAAA,CAAO,QAAQ,CAAC,CAAA;AACjD,IAAA,MAAM,QAAA,GAAW,CAAC,GAAG,CAAA,CAAE,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,IAAA,EAAM,IAAI,CAAA,MAAO;AAAA,MACjD,IAAA;AAAA,MACA,IAAI,IAAA,CAAK,CAAA;AAAA,MACT,KAAA,EAAO,YAAA,CAAa,IAAA,CAAK,KAAK,CAAA;AAAA,MAC9B,IAAA,EAAM,YAAA,CAAa,IAAA,CAAK,IAAI;AAAA,KAC9B,CAAE,CAAA;AACF,IAAA,MAAM,WAAA,uBAAkB,GAAA,EAAiB;AACzC,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,IAAI,CAAA,IAAK,EAAE,GAAA,EAAK;AAChC,MAAA,MAAM,KAAK,IAAA,CAAK,CAAA;AAChB,MAAA,MAAM,MAAA,GAAS,YAAA,CAAa,IAAA,CAAK,KAAK,CAAA;AACtC,MAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,IAAA,CAAK,IAAI,CAAA;AACpC,MAAA,KAAA,MAAW,EAAE,MAAM,EAAA,EAAI,KAAA,EAAO,QAAQ,IAAA,EAAM,KAAA,MAAW,QAAA,EAAU;AAC/D,QAAA,MAAM,MAAM,IAAA,GAAO,IAAA;AAEnB,QAAA,IAAI,IAAA,GAAO,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA;AAC9B,QAAA,IAAI,SAAS,MAAA,EAAW;AACtB,UAAA,IAAA,GAAO,EAAE,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,EAAC,EAAE;AACzB,UAAA,WAAA,CAAY,GAAA,CAAI,KAAK,IAAI,CAAA;AAAA,QAC3B;AAEA,QAAA,IAAA,CAAK,KAAK,EAAA,GAAK,EAAA;AAEf,QAAA,MAAM,KAAK,IAAA,CAAK,KAAA;AAChB,QAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,CAAA,IAAK,MAAA,EAAQ,EAAA,CAAG,CAAC,CAAA,GAAA,CAAK,EAAA,CAAG,CAAC,CAAA,IAAK,CAAA,IAAK,CAAA,GAAI,EAAA;AACxD,QAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,CAAA,IAAK,MAAA,EAAQ,EAAA,CAAG,CAAC,CAAA,GAAA,CAAK,EAAA,CAAG,CAAC,CAAA,IAAK,CAAA,IAAK,CAAA,GAAI,EAAA;AAExD,QAAA,IAAI,SAAS,KAAA,EAAO;AAClB,UAAA,IAAI,KAAK,IAAA,CAAK,IAAA;AACd,UAAA,IAAI,OAAO,MAAA,EAAW;AACpB,YAAA,EAAA,GAAK,EAAC;AACN,YAAA,IAAA,CAAK,IAAA,GAAO,EAAA;AAAA,UACd;AACA,UAAA,IAAI,KAAA,EAAO,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,CAAA,IAAK,KAAA,EAAO,EAAA,CAAG,CAAC,CAAA,GAAA,CAAK,EAAA,CAAG,CAAC,CAAA,IAAK,KAAK,CAAA,GAAI,EAAA;AAClE,UAAA,IAAI,KAAA,EAAO,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,CAAA,IAAK,KAAA,EAAO,EAAA,CAAG,CAAC,CAAA,GAAA,CAAK,EAAA,CAAG,CAAC,CAAA,IAAK,KAAK,CAAA,GAAI,EAAA;AAAA,QACpE;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,SAAS,IAAI,IAAA;AAAA,MACf,WAAA;AAAA,MACA,OAAA;AAAA,MACA,CAAC,GAAA;AAAA,MACD,CAAA,EAAG,EAAE,UAAU,CAAA,EAAG,MAAM,GAAA,GAAM,GAAG,CAAA,EAAG,CAAA,CAAE,UAAU,CAAA;AAAA,KAClD;AAGA,IAAA,MAAM,IAAA,GAAA,CAAQ,MAAM,CAAA,CAAE,IAAA,KAAS,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,IAAA,EAAK,GAAI,CAAA,CAAA;AACtD,IAAA,MAAM,IAAA,GAAO,OAAO,IAAA,EAAK;AAIzB,IAAA,IAAI,IAAA,KAAS,KAAK,IAAA,KAAS,CAAA,IAAK,KAAK,GAAA,CAAI,IAAA,GAAO,IAAI,CAAA,GAAI,OAAA,EAAS;AAC/D,MAAA,MAAA,GAAS,MAAA,CAAO,SAAA,CAAU,IAAA,GAAO,IAAI,CAAA;AAAA,IACvC;AACA,IAAA,IAAI,CAAC,GAAA,IAAO,IAAA,KAAS,CAAA,IAAK,IAAA,CAAK,IAAI,MAAA,CAAO,IAAA,EAAK,GAAI,CAAC,CAAA,GAAI,OAAA;AACtD,MAAA,MAAA,GAAS,OAAO,SAAA,EAAU;AAE5B,IAAA,QAAA,CAAS,GAAA,CAAI,UAAU,MAAM,CAAA;AAC7B,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA,EAGA,UAAA,CAAW,OAAY,GAAA,EAAmB;AACxC,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,KAAA,EAAO,GAAA,EAAK,IAAI,CAAA;AAAA,EACvC;AAAA;AAAA,EAGA,OAAe,kBAAA,CAAmB,OAAA,EAAgB,GAAA,EAAkB;AAClE,IAAA,IAAI,MAAA,GAAS,QAAQ,CAAC,CAAA;AACtB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AACvC,MAAA,MAAA,GAAS,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,CAAC,GAAG,GAAG,CAAA;AAAA,IAC1C;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,OAAO,YAAA,CAAa,OAAA,EAAgB,GAAA,GAAM,GAAA,EAAU;AAClD,IAAA,IAAI,QAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA,CAAI,MAAM,GAAG,CAAA;AAC9C,IAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,QAAQ,CAAC,CAAA;AAI1C,IAAA,OAAO,IAAA,CAAI,kBAAA,CAAmB,OAAA,EAAS,GAAG,CAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAA,GAIE;AACA,IAAA,OAAO;AAAA,MACL,MAAM,CAAC,GAAG,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA;AAAA,MAC5B,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,YAAY,IAAA,CAAK;AAAA,KACnB;AAAA,EACF;AAAA;AAAA,EAGA,YAAA,GAAuB;AACrB,IAAA,OAAO,IAAA,CAAK,UAAU,IAAI,CAAA;AAAA,EAC5B;AAAA,EAEA,OAAO,SAAS,QAAA,EAIb;AACD,IAAA,OAAO,IAAI,IAAA;AAAA,MACT,IAAI,GAAA,CAAI,QAAA,CAAS,IAAI,CAAA;AAAA,MACrB,GAAA;AAAA,MACA,CAAC,CAAC,QAAA,CAAS,UAAA;AAAA,MACX,SAAS,UAAA,IAAc;AAAA,KACzB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,KAAA,CAAM,MAAA,EAAgB,OAAA,GAAU,CAAA,EAAQ;AACtC,IAAA,MAAM,IAAA,GAAO,KAAK,GAAA,CAAI,IAAA;AACtB,IAAA,IAAI,IAAA,KAAS,GAAG,OAAO,IAAA;AAGvB,IAAA,IAAI,IAAA,GAAO,CAAA;AACX,IAAA,IAAI,YAAY,MAAA,CAAO,iBAAA;AACvB,IAAA,IAAI,YAAY,MAAA,CAAO,iBAAA;AACvB,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,GAAG,CAAA,IAAK,KAAK,GAAA,EAAK;AACjC,MAAA,IAAI,GAAA,CAAI,CAAA,GAAI,IAAA,EAAM,IAAA,GAAO,GAAA,CAAI,CAAA;AAC7B,MAAA,IAAI,GAAA,GAAM,WAAW,SAAA,GAAY,GAAA;AACjC,MAAA,IAAI,GAAA,GAAM,WAAW,SAAA,GAAY,GAAA;AAAA,IACnC;AACA,IAAA,IAAI,IAAA,KAAS,CAAA;AACX,MAAA,OAAO,IAAI,IAAA,CAAI,IAAI,GAAA,CAAI,IAAA,CAAK,GAAG,CAAA,EAAG,MAAA,EAAQ,KAAA,EAAO,IAAA,CAAK,UAAU,CAAA;AAElE,IAAA,MAAM,SAAS,MAAA,GAAS,IAAA;AACxB,IAAA,MAAM,UAAU,CAAC,GAAG,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA;AAGtC,IAAA,MAAM,cAAA,uBAAqB,GAAA,EAAiB;AAC5C,IAAA,MAAM,OAAA,GAAU,CAACD,EAAAA,KAAc;AAC7B,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,GAAA,CAAIA,EAAC,CAAA;AACxB,MAAA,IAAI,CAAA,EAAG,cAAA,CAAe,GAAA,CAAIA,EAAAA,EAAG,CAAC,CAAA;AAAA,IAChC,CAAA;AACA,IAAA,OAAA,CAAQ,SAAS,CAAA;AACjB,IAAA,IAAI,SAAA,KAAc,SAAA,EAAW,OAAA,CAAQ,SAAS,CAAA;AAG9C,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,GAAG,CAAA,IAAK,OAAA,EAAS;AAChC,MAAA,IAAI,IAAI,CAAA,IAAK,MAAA,EAAQ,cAAA,CAAe,GAAA,CAAI,KAAK,GAAG,CAAA;AAAA,IAClD;AAGA,IAAA,IAAI,OAAA,GAAU,CAAA,IAAK,cAAA,CAAe,IAAA,GAAO,OAAA,EAAS;AAEhD,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,CAAC,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,CAAE,CAAC,CAAA;AACtC,MAAA,KAAA,MAAW,CAAC,GAAA,EAAK,GAAG,CAAA,IAAK,OAAA,EAAS;AAChC,QAAA,IAAI,CAAC,cAAA,CAAe,GAAA,CAAI,GAAG,CAAA,EAAG;AAC5B,UAAA,cAAA,CAAe,GAAA,CAAI,KAAK,GAAG,CAAA;AAC3B,UAAA,IAAI,cAAA,CAAe,QAAQ,OAAA,EAAS;AAAA,QACtC;AAAA,MACF;AAAA,IACF;AAGA,IAAA,MAAM,SAAA,uBAAgB,GAAA,EAAiB;AACvC,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,GAAG,CAAA,IAAK,cAAA,EAAgB;AACvC,MAAA,MAAM,WAA4B,EAAC;AACnC,MAAA,KAAA,MAAW,CAAA,IAAK,IAAI,KAAA,EAAO;AACzB,QAAA,MAAM,CAAA,GAAI,GAAA,CAAI,KAAA,CAAM,CAAC,CAAA;AACrB,QAAA,IAAI,KAAK,GAAA,CAAI,CAAC,KAAK,MAAA,EAAQ,QAAA,CAAS,CAAC,CAAA,GAAI,CAAA;AAAA,MAC3C;AACA,MAAA,IAAI,OAAA;AACJ,MAAA,IAAI,IAAI,IAAA,EAAM;AACZ,QAAA,KAAA,MAAW,CAAA,IAAK,IAAI,IAAA,EAAM;AACxB,UAAA,MAAM,CAAA,GAAI,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA;AACpB,UAAA,IAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,IAAK,MAAA,EAAQ;AACzB,YAAA,IAAI,CAAC,OAAA,EAAS,OAAA,GAAU,EAAC;AACzB,YAAA,OAAA,CAAQ,CAAC,CAAA,GAAI,CAAA;AAAA,UACf;AAAA,QACF;AAAA,MACF;AACA,MAAA,SAAA,CAAU,GAAA,CAAI,GAAA,EAAK,EAAE,CAAA,EAAG,GAAA,CAAI,GAAG,KAAA,EAAO,QAAA,EAAU,IAAA,EAAM,OAAA,EAAS,CAAA;AAAA,IACjE;AAGA,IAAA,OAAO,IAAI,KAAI,SAAA,EAAW,MAAA,EAAQ,OAAO,CAAA,MAAA,EAAS,IAAA,CAAK,UAAU,CAAA,CAAA,CAAG,CAAA;AAAA,EACtE;AAAA;AAAA,EAGA,IAAI,CAAA,EAAmB;AACrB,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,CAAC,GAAG,CAAA,IAAK,CAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,cAAA,GAAyB;AACvB,IAAA,OAAO,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA;AAAA,EACvB;AAAA;AAAA,EAGA,eAAA,GAA0B;AACxB,IAAA,OAAO,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,UAAA,EAAyB;AAC7B,IAAA,IAAI,EAAE,UAAA,GAAa,CAAA,CAAA,EAAI,OAAO,IAAA;AAC9B,IAAA,MAAM,OAAA,GAAU,KAAK,OAAA,EAAQ;AAC7B,IAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AACjC,IAAA,MAAM,GAAA,GAAM,QAAQ,CAAC,CAAA;AACrB,IAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA;AACtC,IAAA,MAAM,QAAQ,GAAA,GAAM,GAAA;AACpB,IAAA,IAAI,KAAA,GAAQ,CAAA,IAAK,UAAA,EAAY,OAAO,IAAA;AACpC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,IAAA,CAAA,CAAM,KAAA,GAAQ,KAAK,UAAU,CAAA;AAClD,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,CAACA,EAAAA,KAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAA,CAAOA,EAAAA,GAAI,GAAA,IAAO,OAAO,CAAA,GAAI,OAAO,CAAA;AAAA,EAC9E;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,GAAyB;AACvB,IAAA,MAAM,CAAA,GAAI,KAAK,OAAA,EAAQ;AACvB,IAAA,IAAI,CAAA,CAAE,MAAA,KAAW,CAAA,EAAG,OAAO,EAAC;AAC5B,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,GAAG,CAAC,GACtB,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,GAAG,CAAC,CAAA;AACpB,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,EAAA,GAAK,EAAA,GAAK,CAAA,EAAE,EAAG,CAAC,CAAA,EAAG,CAAA,KAAM,EAAA,GAAK,CAAC,CAAA,CAAE,IAAA;AAAA,MAC3D,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI;AAAA,KAChB;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,CAAA,EAAmB;AACvB,IAAA,IAAI,GAAA,GAAM,CAAA;AACV,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,GAAG,CAAA,IAAK,IAAA,CAAK,KAAK,IAAI,GAAA,IAAO,CAAA,EAAG,GAAA,IAAO,GAAA,CAAI,CAAA;AAC5D,IAAA,OAAO,GAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,SAAS,CAAA,EAAmB;AAC1B,IAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAO,KAAA,EAAM,GAAI,KAAK,UAAA,EAAW;AACjD,IAAA,MAAM,IAAI,MAAA,CAAO,MAAA;AACjB,IAAA,IAAI,CAAA,KAAM,GAAG,OAAO,CAAA;AACpB,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA;AACzB,IAAA,IAAI,EAAE,KAAA,GAAQ,CAAA,CAAA,EAAI,OAAO,CAAA;AACzB,IAAA,IAAI,CAAA,IAAK,CAAA,EAAG,OAAO,MAAA,CAAO,CAAC,CAAA;AAC3B,IAAA,IAAI,CAAA,IAAK,CAAA,EAAG,OAAO,MAAA,CAAO,IAAI,CAAC,CAAA;AAE/B,IAAA,MAAM,QAAQ,IAAA,CAAK,GAAA,CAAI,yBAAyB,CAAA,GAAI,CAAA,GAAI,OAAO,OAAO,CAAA;AACtE,IAAA,MAAM,SAAA,GAAY,CAAA,GAAI,KAAA,IAAS,CAAA,GAAI,KAAA,CAAA;AACnC,IAAA,MAAM,UAAA,GAAA,CAAc,CAAA,GAAI,CAAA,IAAK,KAAA,IAAS,CAAA,GAAI,KAAA,CAAA;AAC1C,IAAA,MAAM,UAAU,CAAA,IAAK,GAAA;AAGrB,IAAA,IAAI,EAAA,GAAK,CAAA;AACT,IAAA,IAAI,EAAA,GAAK,CAAA;AACT,IAAA,OAAO,KAAK,EAAA,EAAI;AACd,MAAA,MAAM,GAAA,GAAO,KAAK,EAAA,KAAQ,CAAA;AAC1B,MAAA,MAAM,OAAA,GAAU,UAAU,KAAA,CAAM,GAAG,KAAK,SAAA,GAAY,KAAA,CAAM,GAAG,CAAA,IAAK,UAAA;AAClE,MAAA,IAAI,SAAS,EAAA,GAAK,GAAA;AAAA,gBACR,GAAA,GAAM,CAAA;AAAA,IAClB;AACA,IAAA,OAAO,OAAO,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,CAAA,GAAI,CAAC,CAAC,CAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,UAAA,GAAqE;AAC3E,IAAA,IAAI,IAAA,CAAK,gBAAgB,MAAA,EAAW;AAClC,MAAA,MAAM,MAAA,GAAS,KAAK,OAAA,EAAQ;AAC5B,MAAA,MAAM,IAAI,MAAA,CAAO,MAAA;AACjB,MAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAc,CAAC,CAAA;AACjC,MAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAc,CAAC,CAAA;AACjC,MAAA,IAAI,GAAA,GAAM,CAAA;AACV,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,QAAA,GAAA,IAAQ,KAAK,GAAA,CAAI,GAAA,CAAI,MAAA,CAAO,CAAC,CAAC,CAAA,CAAU,CAAA;AACxC,QAAA,KAAA,CAAM,CAAC,CAAA,GAAI,GAAA;AAAA,MACb;AACA,MAAA,GAAA,GAAM,CAAA;AACN,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAC/B,QAAA,KAAA,CAAM,CAAC,CAAA,GAAI,GAAA;AACX,QAAA,GAAA,IAAQ,KAAK,GAAA,CAAI,GAAA,CAAI,MAAA,CAAO,CAAC,CAAC,CAAA,CAAU,CAAA;AAAA,MAC1C;AACA,MAAA,IAAA,CAAK,WAAA,GAAc,EAAE,MAAA,EAAQ,KAAA,EAAO,KAAA,EAAM;AAAA,IAC5C;AACA,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EACd;AAAA;AAAA,EAGA,SAAA,CAAU,QAAgB,OAAA,EAAyB;AACjD,IAAA,OAAQ,KAAK,GAAA,CAAI,GAAA,CAAI,MAAM,CAAA,EAAG,KAAA,CAAM,OAAO,CAAA,IAAgB,CAAA;AAAA,EAC7D;AAAA;AAAA,EAGA,QAAA,GAAqB;AACnB,IAAA,MAAM,UAAA,uBAAiB,GAAA,EAAY;AACnC,IAAA,KAAA,MAAW,GAAG,GAAG,CAAA,IAAK,KAAK,GAAA,EAAK;AAC9B,MAAA,KAAA,MAAW,OAAA,IAAW,IAAI,KAAA,EAAO;AAC/B,QAAA,IAAK,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA,GAAe,CAAA,EAAG;AACtC,UAAA,UAAA,CAAW,IAAI,OAAO,CAAA;AAAA,QACxB;AAAA,MACF;AAAA,IACF;AACA,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,UAAU,CAAA,CAAE,IAAA,EAAK;AAAA,EACrC;AAAA;AAAA,EAGA,mBAAmB,OAAA,EAAyB;AAC1C,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,KAAA,MAAW,GAAG,GAAG,CAAA,IAAK,KAAK,GAAA,EAAK;AAC9B,MAAA,KAAA,IAAU,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA,IAAgB,CAAA;AAAA,IAC7C;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA,EAGA,oBAAA,CAAqB,QAAgB,OAAA,EAAyB;AAC5D,IAAA,OAAQ,KAAK,GAAA,CAAI,GAAA,CAAI,MAAM,CAAA,EAAG,IAAA,GAAO,OAAO,CAAA,IAAgB,CAAA;AAAA,EAC9D;AAAA;AAAA,EAGA,MAAM,MAAA,EAIG;AACP,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,MAAM,CAAA;AAC/B,IAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AAEjB,IAAA,OAAO;AAAA,MACL,GAAG,GAAA,CAAI,CAAA;AAAA,MACP,KAAA,EAAO,EAAE,GAAG,GAAA,CAAI,KAAA,EAAM;AAAA,MACtB,MAAM,GAAA,CAAI,IAAA,GAAQ,EAAE,GAAG,GAAA,CAAI,MAAK,GAA+B;AAAA,KACjE;AAAA,EACF;AAAA;AAAA,EAGA,WAAW,OAAA,EAA0B;AACnC,IAAA,KAAA,MAAW,GAAG,GAAG,CAAA,IAAK,KAAK,GAAA,EAAK;AAC9B,MAAA,IAAA,CAAM,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA,IAAgB,KAAK,CAAA,EAAG;AAC7C,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,kBAAA,GAAuD;AACrD,IAAA,MAAM,MAAM,IAAA,CAAK,cAAA,EAAe,GAAI,IAAA,GAAO,KAAK,eAAA,EAAgB;AAChE,IAAA,MAAM,MAAA,uBAAa,GAAA,EAAiC;AAEpD,IAAA,MAAM,GAAA,GAAM,CAAC,KAAA,EAAe,MAAA,EAAgB,IAAA,KAAuB;AACjE,MAAA,IAAI,EAAE,OAAO,CAAA,CAAA,EAAI;AACjB,MAAA,IAAI,MAAA,GAAS,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA;AAC7B,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,MAAA,uBAAa,GAAA,EAAoB;AACjC,QAAA,MAAA,CAAO,GAAA,CAAI,OAAO,MAAM,CAAA;AAAA,MAC1B;AACA,MAAA,MAAA,CAAO,IAAI,MAAA,EAAA,CAAS,MAAA,CAAO,IAAI,MAAM,CAAA,IAAK,KAAK,IAAI,CAAA;AAAA,IACrD,CAAA;AAEA,IAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,GAAG,CAAA,IAAK,IAAI,GAAA,EAAK;AACnC,MAAA,MAAM,CAAA,GAAI,IAAI,CAAA,IAAK,CAAA;AACnB,MAAA,IAAI,KAAK,CAAA,EAAG;AACZ,MAAA,MAAM,YAAY,MAAA,KAAW,CAAA;AAG7B,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,IAAI,UAAA,GAAa,CAAA;AACjB,QAAA,KAAA,MAAW,KAAK,GAAA,CAAI,KAAA,gBAAsB,GAAA,CAAI,KAAA,CAAM,CAAC,CAAA,IAAgB,CAAA;AACrE,QAAA,IAAI,aAAa,CAAA,EAAG;AAClB,UAAA,MAAM,CAAA,GAAK,GAAA,CAAI,KAAA,CAAM,iBAAiB,CAAA,IAAgB,CAAA;AACtD,UAAA,GAAA,CAAI,iBAAA,EAAmB,MAAA,EAAS,CAAA,GAAI,UAAA,GAAc,CAAC,CAAA;AAAA,QACrD;AACA,QAAA;AAAA,MACF;AAGA,MAAA,IAAI,SAAA,GAAY,CAAA;AAChB,MAAA,IAAI,GAAA,CAAI,IAAA,EAAM,KAAA,MAAW,CAAA,IAAK,GAAA,CAAI,MAAM,SAAA,IAAc,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA,IAAgB,CAAA;AAChF,MAAA,IAAI,GAAA,CAAI,IAAA,IAAQ,SAAA,GAAY,CAAA,EAAG;AAC7B,QAAA,KAAA,MAAW,CAAA,IAAK,IAAI,IAAA,EAAM;AACxB,UAAA,IAAI,MAAM,iBAAA,EAAmB;AAC7B,UAAA,GAAA,CAAI,CAAA,EAAG,SAAW,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA,IAAgB,CAAA,IAAK,YAAa,CAAC,CAAA;AAAA,QACjE;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUQ,sBAAA,GAAoE;AAC1E,IAAA,MAAM,UAAA,GAAa,CAAC,GAAG,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,CAAC,CAAA;AAC5D,IAAA,MAAM,aAAyC,EAAC;AAChD,IAAA,IAAI,WAAA,GAAc,CAAA;AAClB,IAAA,KAAA,IAAS,IAAI,UAAA,CAAW,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAC/C,MAAA,MAAM,GAAA,GAAM,WAAW,CAAC,CAAA;AACxB,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,GAAG,CAAA;AAC5B,MAAA,IAAI,CAAC,GAAA,EAAK;AACV,MAAA,WAAA,IAAe,GAAA,CAAI,CAAA;AACnB,MAAA,UAAA,CAAW,QAAQ,EAAE,CAAA,EAAG,KAAK,CAAA,EAAG,WAAA,GAAc,KAAK,CAAA;AAAA,IACrD;AACA,IAAA,MAAM,uBAAA,GAA0B,CAAC,UAAA,KAA+B;AAC9D,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,UAAA,CAAW,QAAQ,CAAA,EAAA,EAAK;AAC1C,QAAA,IAAI,UAAA,CAAW,CAAC,CAAA,CAAE,CAAA,IAAK,UAAA,EAAY;AACjC,UAAA,OAAO,CAAA,GAAI,IAAI,UAAA,CAAW,CAAA,GAAI,CAAC,CAAA,CAAE,CAAA,GAAI,UAAA,CAAW,CAAC,CAAA,CAAE,CAAA;AAAA,QACrD;AAAA,MACF;AACA,MAAA,OAAO,UAAA,CAAW,UAAA,CAAW,MAAA,GAAS,CAAC,CAAA,CAAE,CAAA;AAAA,IAC3C,CAAA;AACA,IAAA,OAAO;AAAA,MACL,GAAA,EAAK,wBAAwB,EAAE,CAAA;AAAA,MAC/B,GAAA,EAAK,wBAAwB,EAAE,CAAA;AAAA,MAC/B,GAAA,EAAK,wBAAwB,EAAE;AAAA,KACjC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBA,2BAAA,CACE,OAAA,GAII,EAAC,EACwB;AAC7B,IAAA,MAAM,EAAE,UAAA,EAAY,UAAA,GAAa,iBAAA,EAAmB,OAAA,GAAU,MAAK,GAAI,OAAA;AAEvE,IAAA,MAAM,KAAA,GAAqC;AAAA,MACzC,QAAQ,EAAC;AAAA,MACT,UAAU,EAAC;AAAA,MACX,MAAA,sBAAY,GAAA,EAAI;AAAA,MAChB,MAAA,sBAAY,GAAA,EAAI;AAAA,MAChB,QAAQ,EAAC;AAAA,MACT,aAAa,EAAE,GAAA,EAAK,GAAG,GAAA,EAAK,CAAA,EAAG,KAAK,CAAA,EAAE;AAAA,MACtC,IAAA,EAAM;AAAA,KACR;AACA,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,IAAA,KAAS,CAAA,EAAG,OAAO,KAAA;AAGhC,IAAA,MAAM,KAAA,GAAQ,KAAK,kBAAA,EAAmB;AAItC,IAAA,MAAM,UAAA,uBAAiB,GAAA,EAAY;AACnC,IAAA,KAAA,MAAW,GAAG,GAAG,CAAA,IAAK,KAAK,GAAA,EAAK;AAC9B,MAAA,KAAA,MAAW,CAAA,IAAK,GAAA,CAAI,KAAA,EAAO,UAAA,CAAW,IAAI,CAAC,CAAA;AAC3C,MAAA,IAAI,GAAA,CAAI,MAAM,KAAA,MAAW,CAAA,IAAK,IAAI,IAAA,EAAM,UAAA,CAAW,IAAI,CAAC,CAAA;AAAA,IAC1D;AACA,IAAA,MAAM,WAAW,YAAA,CAAa,CAAC,GAAG,UAAU,GAAG,UAAU,CAAA;AACzD,IAAA,MAAM,cAAA,GAAiB,SAAS,MAAA,GAAS,CAAA;AAIzC,IAAA,IAAI,GAAA,GAAM,QAAA;AACV,IAAA,IAAI,GAAA,GAAM,CAAA,QAAA;AACV,IAAA,MAAM,KAAA,GAAQ,CAACA,EAAAA,KAAoB;AACjC,MAAA,IAAIA,EAAAA,GAAI,KAAK,GAAA,GAAMA,EAAAA;AACnB,MAAA,IAAIA,EAAAA,GAAI,KAAK,GAAA,GAAMA,EAAAA;AAAA,IACrB,CAAA;AACA,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,KAAA,MAAW,CAAA,IAAK,MAAM,MAAA,EAAO;AAC3B,QAAA,KAAA,MAAW,CAACA,IAAG,CAAC,CAAA,IAAK,GAAG,IAAI,CAAA,GAAI,CAAA,EAAG,KAAA,CAAMA,EAAC,CAAA;AAAA,IAC9C,CAAA,MAAO;AACL,MAAA,KAAA,MAAW,CAACA,EAAAA,EAAG,GAAG,CAAA,IAAK,IAAA,CAAK,GAAA,EAAK,IAAA,CAAK,GAAA,CAAI,CAAA,IAAK,CAAA,IAAK,CAAA,EAAG,KAAA,CAAMA,EAAC,CAAA;AAAA,IAChE;AACA,IAAA,IAAI,GAAA,GAAM,KAAK,OAAO,KAAA;AACtB,IAAA,MAAM,QAAQ,GAAA,GAAM,GAAA;AAGpB,IAAA,MAAM,MAAA,GACJ,UAAA,KAAe,MAAA,IAAa,UAAA,GAAa,KAAK,KAAA,GAAQ,UAAA;AACxD,IAAA,MAAM,UAAU,MAAA,GAAS,IAAA,CAAK,MAAM,KAAA,GAAQ,CAAA,IAAK,UAAW,CAAA,GAAI,CAAA;AAChE,IAAA,MAAM,OAAA,GAAU,SAAS,IAAA,CAAK,IAAA,CAAA,CAAM,QAAQ,CAAA,IAAK,OAAO,IAAI,KAAA,GAAQ,CAAA;AACpE,IAAA,MAAM,WAAW,CAACA,EAAAA,KAAsB,KAAK,KAAA,CAAA,CAAOA,EAAAA,GAAI,OAAO,OAAO,CAAA;AAEtE,IAAA,MAAM,SAAmB,EAAC;AAC1B,IAAA,MAAM,SAAA,GAA0D,MAAA,GAC5D,EAAC,GACD,MAAA;AACJ,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,EAAS,CAAA,EAAA,EAAK;AAChC,MAAA,MAAM,KAAA,GAAQ,MAAM,CAAA,GAAI,OAAA;AACxB,MAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AACjB,MAAA,IAAI,SAAA;AACF,QAAA,SAAA,CAAU,IAAA,CAAK,EAAE,KAAA,EAAO,GAAA,EAAK,IAAA,CAAK,GAAA,CAAI,KAAA,GAAQ,OAAA,GAAU,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA;AAAA,IACrE;AAGA,IAAA,MAAM,MAAA,uBAAa,GAAA,EAAsB;AACzC,IAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,MAAA,MAAM,MAAM,IAAI,KAAA,CAAc,OAAO,CAAA,CAAE,KAAK,CAAC,CAAA;AAC7C,MAAA,MAAM,CAAA,GAAI,KAAA,CAAM,GAAA,CAAI,OAAO,CAAA;AAC3B,MAAA,IAAI,CAAA,EAAG;AACL,QAAA,KAAA,MAAW,CAACA,EAAAA,EAAG,CAAC,CAAA,IAAK,CAAA,EAAG;AACtB,UAAA,MAAM,CAAA,GAAI,SAASA,EAAC,CAAA;AACpB,UAAA,IAAI,KAAK,CAAA,IAAK,CAAA,GAAI,OAAA,EAAS,GAAA,CAAI,CAAC,CAAA,IAAK,CAAA;AAAA,QACvC;AAAA,MACF;AACA,MAAA,MAAA,CAAO,GAAA,CAAI,SAAS,GAAG,CAAA;AAAA,IACzB;AAGA,IAAA,MAAM,SAAS,IAAI,KAAA,CAAc,OAAO,CAAA,CAAE,KAAK,CAAC,CAAA;AAChD,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,KAAA,MAAW,GAAA,IAAO,OAAO,MAAA,EAAO;AAC9B,QAAA,KAAA,IAAS,CAAA,GAAI,GAAG,CAAA,GAAI,OAAA,EAAS,KAAK,MAAA,CAAO,CAAC,CAAA,IAAK,GAAA,CAAI,CAAC,CAAA;AAAA,IACxD,CAAA,MAAO;AACL,MAAA,KAAA,MAAW,CAACA,EAAAA,EAAG,GAAG,CAAA,IAAK,KAAK,GAAA,EAAK;AAC/B,QAAA,MAAM,CAAA,GAAI,IAAI,CAAA,IAAK,CAAA;AACnB,QAAA,IAAI,KAAK,CAAA,EAAG;AACZ,QAAA,MAAM,CAAA,GAAI,SAASA,EAAC,CAAA;AACpB,QAAA,IAAI,KAAK,CAAA,IAAK,CAAA,GAAI,OAAA,EAAS,MAAA,CAAO,CAAC,CAAA,IAAK,CAAA;AAAA,MAC1C;AAAA,IACF;AAGA,IAAA,MAAM,MAAA,uBAAa,GAAA,EAAsB;AACzC,IAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,MAAA,MAAM,GAAA,GAAM,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA;AAC9B,MAAA,MAAM,KAAK,IAAI,KAAA,CAAc,OAAO,CAAA,CAAE,KAAK,CAAC,CAAA;AAC5C,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,EAAS,CAAA,EAAA,EAAK;AAChC,QAAA,EAAA,CAAG,CAAC,CAAA,GAAI,MAAA,CAAO,CAAC,CAAA,GAAI,OAAA,GAAU,GAAA,CAAI,CAAC,CAAA,GAAI,MAAA,CAAO,CAAC,CAAA,GAAI,CAAA;AAAA,MACrD;AACA,MAAA,MAAA,CAAO,GAAA,CAAI,SAAS,EAAE,CAAA;AAAA,IACxB;AAEA,IAAA,OAAO;AAAA,MACL,MAAA;AAAA,MACA,SAAA;AAAA,MACA,QAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAA;AAAA,MACA,WAAA,EAAa,KAAK,sBAAA,EAAuB;AAAA,MACzC,IAAA,EAAM,KAAK,IAAA;AAAK,KAClB;AAAA,EACF;AAAA,EAEA,WAAW,CAAA,EAAmB;AAC5B,IAAA,IAAI,CAAA,GAAI,CAAA;AACR,IAAA,KAAA,MAAW,CAAC,CAAA,EAAG,GAAG,CAAA,IAAK,IAAA,EAAM;AAC3B,MAAA,IAAI,IAAI,CAAA,GAAI,CAAA,IAAK,CAAA,IAAK,CAAA,OAAQ,GAAA,CAAI,CAAA;AAAA,IACpC;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AAAA,EAEA,WAAW,CAAA,EAAmB;AAC5B,IAAA,IAAI,CAAA,GAAI,CAAA;AACR,IAAA,KAAA,MAAW,CAAC,CAAA,EAAG,GAAG,CAAA,IAAK,IAAA,EAAM;AAC3B,MAAA,IAAI,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,GAAA,CAAI,CAAA;AAAA,IACtB;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,cAAc,OAAA,EAAsB;AAClC,IAAA,MAAM,WAAA,uBAAkB,GAAA,EAAiB;AAEzC,IAAA,KAAA,MAAW,CAAC,WAAA,EAAa,GAAG,CAAA,IAAK,KAAK,GAAA,EAAK;AACzC,MAAA,MAAM,YAAA,GAAgB,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA,IAAgB,CAAA;AAGvD,MAAA,MAAM,aAAa,MAAA,CAAO,MAAA,CAAO,IAAI,KAAA,IAAS,EAAE,CAAA,CAAE,MAAA;AAAA,QAChD,CAAC,CAAA,EAAG,CAAA,KAAA,CAAO,CAAA,IAAK,MAAO,CAAA,IAAgB,CAAA,CAAA;AAAA,QACvC;AAAA,OACF;AAEA,MAAA,IAAI,YAAA,GAAe,CAAA,IAAK,UAAA,KAAe,MAAA,IAAa,aAAa,CAAA,EAAG;AAElE,QAAA,MAAM,aAAa,YAAA,GAAe,UAAA;AAGlC,QAAA,MAAM,IAAA,GAAO,IAAI,CAAA,GAAI,UAAA;AAErB,QAAA,MAAM,QAAA,GAA4B,EAAE,CAAC,OAAO,GAAG,YAAA,EAAa;AAE5D,QAAA,IAAI,OAAA;AACJ,QAAA,IAAI,IAAI,IAAA,IAAQ,GAAA,CAAI,IAAA,CAAK,OAAO,MAAM,MAAA,EAAW;AAG/C,UAAA,OAAA,GAAU,EAAE,CAAC,OAAO,GAAI,IAAI,IAAA,CAAK,OAAO,IAAe,UAAA,EAAW;AAAA,QACpE;AAEA,QAAA,WAAA,CAAY,IAAI,WAAA,EAAa;AAAA,UAC3B,CAAA,EAAG,IAAA;AAAA,UACH,KAAA,EAAO,QAAA;AAAA,UACP,IAAA,EAAM;AAAA,SACP,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,OAAO,IAAI,IAAA;AAAA,MACT,WAAA;AAAA,MACA,IAAA,CAAK,OAAA;AAAA,MACL,KAAA;AAAA;AAAA,MACA,CAAA,OAAA,EAAU,IAAA,CAAK,UAAU,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA;AAAA,KACtC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,OAAc,mBAAA,CACZ,QAAA,EACA,QAAA,EACA,CAAA,EACA;AAIA,IAAA,IACE,CAAC,MAAA,CAAO,QAAA,CAAS,QAAQ,CAAA,IACzB,CAAC,OAAO,QAAA,CAAS,QAAQ,CAAA,IACzB,QAAA,GAAW,KACX,QAAA,GAAW,CAAA,IACX,WAAW,CAAA,IACX,QAAA,GAAW,WAAW,GAAA,EACtB;AACA,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,0EAAA,EAA6E,QAAQ,CAAA,WAAA,EAAc,QAAQ,CAAA,CAAA;AAAA,OAC7G;AAAA,IACF;AAEA,IAAA,MAAM,QAAQ,CAAA,GAAI,QAAA;AAClB,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,CAAC,CAAA;AAGlC,IAAA,MAAM,OAAO,CAAA,GAAI,QAAA;AAGjB,IAAA,MAAM,KAAA,GAAQ,QAAA,KAAa,CAAA,GAAI,CAAA,GAAI,QAAA;AAGnC,IAAA,MAAM,gBAAA,GAAoB,WAAW,IAAA,GAAQ,KAAA;AAC7C,IAAA,MAAM,eAAA,GAAA,CAAoB,QAAA,GAAW,QAAA,IAAY,IAAA,GAAQ,KAAA;AAEzD,IAAA,MAAM,KAAA,GAAQ,IAAI,gBAAA,GAAmB,eAAA;AAErC,IAAA,OAAO,EAAE,gBAAA,EAAkB,eAAA,EAAiB,KAAA,EAAO,IAAA,EAAK;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,SAAA,CACE,CAAA,EACA,GAAA,GAAc,GAAA,EACd,IAAA,EACK;AACL,IAAA,MAAM,QAAA,GAAW,MAAM,QAAA,IAAY,MAAA;AACnC,IAAA,MAAM,cAAA,GAAiB,MAAM,cAAA,IAAkB,IAAA;AAE/C,IAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KACb,QAAA,KAAa,UACT,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,GACZ,QAAA,KAAa,SACb,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,GACX,QAAA,KAAa,UACb,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,GACZ,CAAA;AAEN,IAAA,MAAM,MAAA,uBAAa,GAAA,EAAiB;AACpC,IAAA,KAAA,MAAW,CAAC,CAAA,EAAG,GAAG,CAAA,IAAK,IAAA,EAAM;AAC3B,MAAA,IAAI,GAAA,CAAI,MAAM,CAAA,EAAG;AACjB,MAAA,MAAM,CAAA,GAAI,KAAA,CAAM,CAAA,CAAE,CAAC,CAAC,CAAA;AACpB,MAAA,IAAI,CAAC,MAAA,CAAO,SAAA,CAAU,CAAC,CAAA,EAAG;AACxB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,WAAA,EAAc,CAAC,CAAA,SAAA,EAAY,CAAC,CAAA,sBAAA,CAAwB,CAAA;AAAA,MACtE;AACA,MAAA,IAAA,CAAI,SAAA,CAAU,QAAQ,CAAA,EAAG;AAAA,QACvB,GAAG,GAAA,CAAI,CAAA;AAAA,QACP,KAAA,EAAO,cAAA,GAAiB,GAAA,CAAI,KAAA,GAAQ;AAAC,OACtC,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,SAAS,IAAI,GAAA,CAAI,CAAC,GAAG,MAAA,CAAO,SAAS,CAAA,CAAE,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,CAAC,IAAI,CAAA,CAAE,CAAC,CAAC,CAAC,CAAA;AACxE,IAAA,OAAO,IAAI,KAAI,MAAA,EAAQ,GAAA,EAAK,KAAK,UAAA,EAAY,CAAA,UAAA,EAAa,IAAA,CAAK,UAAU,CAAA,CAAA,CAAG,CAAA;AAAA,EAC9E;AAAA,EAEA,OAAO,OAAA,CACL,CAAA,EACA,GAAA,GAAc,GAAA,EACd,EAAE,oBAAA,GAAuB,IAAA,EAAK,GAAwC,EAAC,EAClE;AACL,IAAA,MAAM,WAAoC,EAAC;AAC3C,IAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,CAAA,IAAK,CAAA,EAAG;AACtB,MAAA,IAAI,CAAC,OAAO,QAAA,CAAS,CAAC,KAAK,CAAC,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,EAAG;AAChD,MAAA,IAAI,KAAK,CAAA,IAAK,IAAA,CAAK,GAAA,CAAI,CAAC,IAAI,GAAA,EAAK;AACjC,MAAA,IAAI,oBAAA,IAAwB,CAAC,MAAA,CAAO,SAAA,CAAU,CAAC,CAAA,EAAG;AAChD,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,6BAAA,EAAgC,CAAC,CAAA,CAAE,CAAA;AAAA,MACrD;AACA,MAAA,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,IACtB;AAEA,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,MAAA,MAAM,IAAI,MAAM,qCAAqC,CAAA;AAAA,IACvD;AAGA,IAAA,IAAI,GAAA,GAAM,CAAA;AACV,IAAA,IAAI,CAAA,GAAI,CAAA;AACR,IAAA,KAAA,MAAW,GAAG,CAAC,CAAA,IAAK,QAAA,EAAU;AAC5B,MAAA,MAAM,IAAI,CAAA,GAAI,CAAA;AACd,MAAA,MAAM,IAAI,GAAA,GAAM,CAAA;AAChB,MAAA,CAAA,GAAI,IAAI,GAAA,GAAM,CAAA;AACd,MAAA,GAAA,GAAM,CAAA;AAAA,IACR;AACA,IAAA,IAAI,GAAA,IAAO,CAAA,EAAG,MAAM,IAAI,MAAM,oCAAoC,CAAA;AAElE,IAAA,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,EAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAC,CAAA;AAEnC,IAAA,MAAM,QAAA,uBAAe,GAAA,EAAiB;AACtC,IAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,CAAA,IAAK,QAAA,EAAU;AAC7B,MAAA,QAAA,CAAS,GAAA,CAAI,GAAG,EAAE,CAAA,EAAG,IAAI,GAAA,EAAK,KAAA,EAAO,EAAC,EAAG,CAAA;AAAA,IAC3C;AACA,IAAA,OAAO,IAAI,IAAA,CAAI,QAAA,EAAU,GAAG,CAAA;AAAA,EAC9B;AAAA,EAEA,KAAA,GAAmB;AACjB,IAAA,OAAO,IAAI,UAAU,IAAI,CAAA;AAAA,EAC3B;AACF,CAAA;AAAA;AA1yDa,IAAA,CAEI,eAAA,GAAkB,CAAA;AAF5B,IAAM,GAAA,GAAN,IAAA;;;AC5CA,SAAS,WAAA,CAAY,KAAA,EAAe,OAAA,GAAU,CAAA,EAAG,SAAS,CAAA,EAAa;AAC5E,EAAA,MAAM,IAAI,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,KAAA,CAAM,KAAK,CAAC,CAAA;AACvC,EAAA,IAAI,CAAA,IAAK,CAAA,EAAG,OAAO,EAAC;AAEpB,EAAA,IAAI,UAAU,IAAI,KAAA,CAAc,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAE7C,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA,EAAG,CAAC,CAAC,CAAA;AACrD,EAAA,IAAI,IAAI,CAAA,EAAG;AACT,IAAA,MAAM,aAAa,CAAA,GAAI,CAAA;AACvB,IAAA,MAAM,gBAAgB,UAAA,GAAa,CAAA;AACnC,IAAA,OAAA,GAAU,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAA,CAAO,IAAI,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAA,IAAK,aAAa,CAAA;AAAA,EACrE;AAEA,EAAA,MAAM,OAAO,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,KAAA,CAAM,OAAO,CAAC,CAAA;AAC5C,EAAA,IAAI,OAAO,CAAA,EAAG;AACZ,IAAA,MAAM,YAAY,IAAI,KAAA,CAAc,CAAC,CAAA,CAAE,KAAK,CAAC,CAAA;AAC7C,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,CAAA,EAAG,CAAA,EAAA,EAAK;AAC3B,MAAA,MAAM,MAAA,GAAS,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,IAAI,CAAC,CAAA;AAC5C,MAAA,SAAA,CAAU,MAAA,GAAS,CAAC,CAAA,IAAK,OAAA,CAAQ,IAAI,CAAC,CAAA;AAAA,IACxC;AACA,IAAA,OAAA,GAAU,SAAA;AAAA,EACZ;AAEA,EAAA,OAAO,OAAA;AACT;AAqIO,SAAS,mBAAA,CAAoB,MAAc,OAAA,EAAiD;AACjG,EAAA,IAAI,IAAA,uBAAW,GAAA,CAAoB,CAAC,CAAC,CAAA,EAAG,CAAC,CAAC,CAAC,CAAA;AAC3C,EAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,IAAA,EAAM,GAAA,EAAA,EAAO;AACnC,IAAA,MAAM,IAAA,uBAAW,GAAA,EAAoB;AACrC,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,IAAI,CAAA,IAAK,IAAA,EAAM;AAC9B,MAAA,KAAA,IAAS,IAAA,GAAO,CAAA,EAAG,IAAA,IAAQ,OAAA,CAAQ,QAAQ,IAAA,EAAA,EAAQ;AACjD,QAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,IAAA,GAAO,CAAC,CAAA,IAAK,CAAA;AAC/B,QAAA,IAAI,KAAK,CAAA,EAAG;AACZ,QAAA,MAAM,IAAI,GAAA,GAAM,IAAA;AAChB,QAAA,IAAA,CAAK,GAAA,CAAI,IAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,IAAK,CAAA,IAAK,OAAO,CAAC,CAAA;AAAA,MAC3C;AAAA,IACF;AACA,IAAA,IAAA,GAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAA;AACT;AASA,SAAS,0BAAA,CAA2B,MAAc,OAAA,EAAiD;AACjG,EAAA,MAAM,YAAY,OAAA,CAAQ,MAAA;AAC1B,EAAA,IAAI,qBAAK,IAAI,GAAA,CAAiC,CAAC,CAAC,mBAAG,IAAI,GAAA,CAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAEtE,EAAA,KAAA,IAAS,IAAA,GAAO,CAAA,EAAG,IAAA,IAAQ,SAAA,EAAW,IAAA,EAAA,EAAQ;AAC5C,IAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,IAAA,GAAO,CAAC,CAAA,IAAK,CAAA;AAC/B,IAAA,MAAM,IAAA,uBAAW,GAAA,EAAiC;AAClD,IAAA,KAAA,MAAW,CAAC,KAAA,EAAO,MAAM,CAAA,IAAK,EAAA,EAAI,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,IAAI,GAAA,CAAI,MAAM,CAAC,CAAA;AAEjE,IAAA,IAAI,IAAI,CAAA,EAAG;AACT,MAAA,KAAA,MAAW,CAAC,KAAA,EAAO,MAAM,CAAA,IAAK,EAAA,EAAI;AAChC,QAAA,MAAM,YAAY,KAAA,GAAQ,CAAA;AAC1B,QAAA,IAAI,YAAY,IAAA,EAAM;AACtB,QAAA,MAAM,SAAS,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA,wBAAS,GAAA,EAAoB;AAC9D,QAAA,KAAA,MAAW,CAAC,GAAA,EAAK,IAAI,CAAA,IAAK,MAAA,EAAQ;AAChC,UAAA,MAAM,IAAI,GAAA,GAAM,IAAA;AAChB,UAAA,MAAA,CAAO,GAAA,CAAI,IAAI,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,IAAK,CAAA,IAAK,OAAO,CAAC,CAAA;AAAA,QAC/C;AACA,QAAA,IAAA,CAAK,GAAA,CAAI,WAAW,MAAM,CAAA;AAAA,MAC5B;AAAA,IACF;AACA,IAAA,EAAA,GAAK,IAAA;AAAA,EACP;AAEA,EAAA,IAAI,SAAA,GAAY,CAAA;AAChB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,IAAA,EAAM,KAAK,SAAA,IAAa,CAAA;AAE7C,EAAA,MAAM,SAAS,EAAA,CAAG,GAAA,CAAI,IAAI,CAAA,wBAAS,GAAA,EAAoB;AACvD,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAoB;AACvC,EAAA,KAAA,MAAW,CAAC,KAAK,IAAI,CAAA,IAAK,QAAQ,MAAA,CAAO,GAAA,CAAI,GAAA,EAAK,IAAA,GAAO,SAAS,CAAA;AAClE,EAAA,OAAO,MAAA;AACT;AAOO,SAAS,gBAAA,CAAiB,MAAc,OAAA,EAAiD;AAC9F,EAAA,IAAI,IAAA,IAAQ,CAAA,EAAG,uBAAO,IAAI,GAAA,EAAI;AAE9B,EAAA,MAAM,KAAA,GAAQ,mBAAA,CAAoB,IAAA,EAAM,OAAO,CAAA;AAC/C,EAAA,MAAM,QAAA,GAAW,0BAAA,CAA2B,IAAA,EAAM,OAAO,CAAA;AAKzD,EAAA,MAAM,IAAA,GAAO,mBAAA,CAAoB,IAAA,GAAO,CAAA,EAAG,OAAO,CAAA;AAClD,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAY;AAClC,EAAA,OAAA,CAAQ,OAAA,CAAQ,CAAC,MAAA,EAAQ,KAAA,KAAU;AACjC,IAAA,IAAI,UAAU,CAAA,EAAG;AACjB,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,IAAA,EAAK,YAAa,GAAA,CAAI,CAAA,IAAK,KAAA,GAAQ,CAAA,CAAA,GAAK,GAAG,CAAA;AAAA,EACpE,CAAC,CAAA;AAED,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAoB;AACvC,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,IAAI,CAAA,IAAK,KAAA,EAAO;AAC/B,IAAA,IAAI,CAAC,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA,EAAG;AACzB,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,CAAI,CAAA,EAAG,QAAQ,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA,IAAK,CAAA,CAAE,CAAA;AAC7D,IAAA,IAAI,SAAA,GAAY,CAAA,EAAG,MAAA,CAAO,GAAA,CAAI,KAAK,SAAS,CAAA;AAAA,EAC9C;AACA,EAAA,OAAO,MAAA;AACT;;;AC5QO,IAAM,OAAA,GAAN,MAAM,QAAA,CAAmC;AAAA,EAK9C,WAAA,CAAY,MAAc,GAAA,EAAK;AAJ/B,IAAA,IAAA,CAAiB,MAAA,uBAAa,GAAA,EAAoB;AAClD;AAAA,IAAA,IAAA,CAAiB,SAAA,uBAAgB,GAAA,EAA+B;AAI9D,IAAA,IAAA,CAAK,GAAA,GAAM,MAAA,CAAO,QAAA,CAAS,GAAG,IAAI,GAAA,GAAM,GAAA;AAAA,EAC1C;AAAA;AAAA,EAGA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,OAAO,KAAA,EAAM;AAClB,IAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AACrB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,IAAA,GAAe;AACb,IAAA,OAAO,KAAK,MAAA,CAAO,IAAA;AAAA,EACrB;AAAA;AAAA,EAGA,SAAS,KAAA,EAAmB;AAC1B,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,SAAA,CAAU,MAAA,IAAU,IAAI,GAAA,CAAI,KAAK,CAAA,EAAG,OAAO,IAAA;AAClE,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,GAAA,CAAI,KAAA,EAAU,GAAA,EAAU,MAAA,GAAS,CAAA,EAAS;AACxC,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,IAAK,MAAA,IAAU,GAAG,OAAO,IAAA;AAGpD,IAAA,KAAA,MAAW,CAAC,CAAA,EAAG,GAAG,CAAA,IAAK,GAAA,EAAK;AAC1B,MAAA,MAAM,IAAI,GAAA,CAAI,CAAA;AACd,MAAA,IAAI,KAAK,CAAA,EAAG;AAEZ,MAAA,MAAM,MAAM,MAAA,GAAS,CAAA;AACrB,MAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,GAAG,CAAA,IAAK,OAAO,CAAA,EAAG;AAEvC,MAAA,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA,EAAA,CAAI,IAAA,CAAK,OAAO,GAAA,CAAI,CAAC,CAAA,IAAK,CAAA,IAAK,GAAG,CAAA;AAClD,MAAA,MAAM,MAAM,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,CAAC,KAAM,EAAC;AACvC,MAAA,GAAA,CAAI,KAAK,CAAA,GAAA,CAAK,GAAA,CAAI,KAAK,KAAK,CAAA,IAAK,GAAA;AACjC,MAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,CAAA,EAAG,GAAG,CAAA;AAAA,IAC3B;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,QAAA,CAAS,MAAc,GAAA,EAAU;AAC/B,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA;AAC3C,IAAA,IAAI,EAAE,KAAA,GAAQ,CAAA,CAAA,EAAI,MAAM,IAAI,MAAM,0BAA0B,CAAA;AAE5D,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,GAAM,KAAA;AAC7B,IAAA,MAAM,IAAA,GAAO,CAAC,GAAG,IAAA,CAAK,MAAM,CAAA,CAAE,MAAA,CAAO,CAAC,GAAG,CAAC,CAAA,KAAM,CAAA,GAAI,CAAA,IAAK,KAAK,SAAS,CAAA;AACvE,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,wBAAA,EAA2B,IAAA,CAAK,GAAG,CAAA,sBAAA,CAAwB,CAAA;AAAA,IAC7E;AACA,IAAA,MAAM,YACJ,IAAA,CAAK,MAAA,KAAW,IAAA,CAAK,MAAA,CAAO,OAAO,KAAA,GAAQ,QAAA,CAAS,IAAA,CAAK,GAAA,CAAI,CAAC,GAAG,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA;AAE5E,IAAA,MAAM,QAAA,uBAAe,GAAA,EAAiB;AACtC,IAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,CAAA,IAAK,IAAA,EAAM;AACzB,MAAA,MAAM,QAAgC,EAAC;AACvC,MAAA,MAAM,MAAM,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,CAAC,KAAM,EAAC;AACvC,MAAA,KAAA,MAAW,SAAS,GAAA,EAAK,KAAA,CAAM,KAAK,CAAA,GAAI,GAAA,CAAI,KAAK,CAAA,GAAI,SAAA;AACrD,MAAA,QAAA,CAAS,IAAI,CAAA,EAAG,EAAE,GAAG,CAAA,GAAI,SAAA,EAAW,OAAO,CAAA;AAAA,IAC7C;AACA,IAAA,OAAO,IAAI,GAAA,CAAI,QAAA,EAAU,GAAG,CAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAA,GAA4B;AAE1B,IAAA,MAAM,MAAA,uBAAa,GAAA,EAAO;AAC1B,IAAA,KAAA,MAAW,GAAA,IAAO,IAAA,CAAK,SAAA,CAAU,MAAA,EAAO,EAAG;AACzC,MAAA,KAAA,MAAW,KAAK,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,EAAU,MAAA,CAAO,IAAI,CAAC,CAAA;AAAA,IACvD;AAEA,IAAA,MAAM,MAAM,EAAC;AACb,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,MAAM,UAAA,GAAa,QAAA;AAAA,QACjB,CAAC,GAAG,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,CAAA,CAAE,GAAA,CAAI,CAAC,GAAA,KAAQ,GAAA,CAAI,KAAK,KAAK,CAAC;AAAA,OAC3D;AACA,MAAA,IAAI,EAAE,aAAa,CAAA,CAAA,EAAI;AACvB,MAAA,MAAM,CAAA,uBAAQ,GAAA,EAAoB;AAClC,MAAA,KAAA,MAAW,CAAC,CAAA,EAAG,GAAG,CAAA,IAAK,KAAK,SAAA,EAAW;AACrC,QAAA,MAAM,CAAA,GAAI,IAAI,KAAK,CAAA;AACnB,QAAA,IAAI,CAAA,EAAG,CAAA,CAAE,GAAA,CAAI,CAAA,EAAG,IAAI,UAAU,CAAA;AAAA,MAChC;AACA,MAAA,GAAA,CAAI,KAAK,CAAA,GAAI,GAAA,CAAI,OAAA,CAAQ,CAAA,EAAG,KAAK,GAAG,CAAA;AAAA,IACtC;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAA,GAA6B;AAC3B,IAAA,MAAM,MAAM,EAAC;AACb,IAAA,KAAA,MAAW,GAAG,GAAG,CAAA,IAAK,KAAK,SAAA,EAAW;AACpC,MAAA,KAAA,MAAW,CAAC,GAAA,EAAK,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,EAAoB;AAC3D,QAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,IAAK,KAAK,CAAA,EAAG;AACnC,QAAA,GAAA,CAAI,GAAG,CAAA,GAAA,CAAK,GAAA,CAAI,GAAG,KAAK,CAAA,IAAK,CAAA;AAAA,MAC/B;AAAA,IACF;AACA,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,MAAA,CAAO,MAAA,CAAO,GAAG,CAAa,CAAA;AACrD,IAAA,IAAI,QAAQ,CAAA,EAAG;AACb,MAAA,KAAA,MAAW,KAAK,GAAA,EAAK,GAAA,CAAI,CAAM,CAAA,GAAI,GAAA,CAAI,CAAM,CAAA,GAAI,KAAA;AAAA,IACnD;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEA,MAAA,GAIE;AACA,IAAA,OAAO;AAAA,MACL,QAAQ,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA,CAAE,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAC,CAAA;AAAA,MACpE,QAAQ,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,SAAS,CAAA,CAAE,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAC,CAAA;AAAA,MACvE,KAAK,IAAA,CAAK;AAAA,KACZ;AAAA,EACF;AAAA,EAEA,OAAO,GAAA,CACL,KAAA,EACA,GAAA,GAAc,GAAA,EACT;AACL,IAAA,MAAM,GAAA,GAAM,IAAI,QAAA,CAAW,GAAG,CAAA;AAC9B,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,GAAA,EAAK,CAAC,CAAA,IAAK,OAAO,GAAA,CAAI,GAAA,CAAI,GAAA,EAAK,GAAA,EAAK,CAAC,CAAA;AACtD,IAAA,OAAO,GAAA,CAAI,SAAS,GAAG,CAAA;AAAA,EACzB;AACF,CAAA;AAGA,SAAS,SAAS,MAAA,EAAkC;AAClD,EAAA,IAAI,GAAA,GAAM,CAAA;AACV,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,IAAA,MAAM,IAAI,CAAA,GAAI,CAAA;AACd,IAAA,MAAM,IAAI,GAAA,GAAM,CAAA;AAChB,IAAA,CAAA,GAAI,IAAI,GAAA,GAAM,CAAA;AACd,IAAA,GAAA,GAAM,CAAA;AAAA,EACR;AACA,EAAA,OAAO,GAAA;AACT;;;AC9IA,IAAM,UAAA,GAAa,CAAC,CAAA,KAClB,CAAA,KAAM,WAAe,CAAA,IAAK,GAAA,IAAO,CAAA,IAAK,GAAA,IAAQ,CAAA,KAAM,GAAA,CAAA;AAGtD,IAAM,UAAA,GAAa,CAAC,EAAA,KAClB,EAAA,KAAO,YAAY,EAAA,KAAO,GAAA,IAAO,EAAA,KAAO,GAAA,IAAO,EAAA,KAAO,GAAA;AAGjD,IAAM,2BAAA,GAAN,cAA0C,KAAA,CAAM;AAAC,CAAA;AAQjD,IAAM,0BAAA,GAAN,cAAyC,KAAA,CAAM;AAAC,CAAA;AAGvD,IAAM,iBAAN,MAAqB;AAAA,EAGnB,WAAA,CACmB,GACA,UAAA,EACjB;AAFiB,IAAA,IAAA,CAAA,CAAA,GAAA,CAAA;AACA,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AAJnB,IAAA,IAAA,CAAQ,GAAA,GAAM,CAAA;AAAA,EAKX;AAAA,EAEH,IAAA,GAAiB;AACf,IAAA,MAAM,IAAA,GAAO,KAAK,IAAA,EAAK;AACvB,IAAA,IAAI,IAAA,CAAK,GAAA,KAAQ,IAAA,CAAK,CAAA,CAAE,MAAA,EAAQ,IAAA,CAAK,IAAA,CAAK,CAAA,YAAA,EAAe,IAAA,CAAK,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAG,CAAA;AAC5E,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,KAAK,MAAA,EAAuB;AAClC,IAAA,MAAM,IAAI,2BAAA,CAA4B,CAAA,2BAAA,EAA8B,KAAK,UAAU,CAAA,GAAA,EAAM,MAAM,CAAA,CAAA,CAAG,CAAA;AAAA,EACpG;AAAA,EAEQ,IAAA,GAAiB;AACvB,IAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,EAAM;AACzB,IAAA,MAAM,OAAiB,EAAC;AACxB,IAAA,KAAA,IAAS,EAAA,GAAK,KAAK,SAAA,EAAU,EAAG,OAAO,MAAA,EAAW,EAAA,GAAK,IAAA,CAAK,SAAA,EAAU,EAAG;AACvE,MAAA,IAAI,OAAO,IAAA,EAAM;AACf,QAAA,IAAA,CAAK,KAAK,0FAA0F,CAAA;AAAA,MACtG;AACA,MAAA,IAAI,OAAO,IAAA,EAAM;AACf,QAAA,IAAA,CAAK,KAAK,8FAA8F,CAAA;AAAA,MAC1G;AACA,MAAA,MAAM,GAAA,GAAM,EAAA,KAAO,GAAA,GAAM,MAAA,GAAY,KAAK,KAAA,EAAM;AAChD,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AACzB,MAAA,IAAI,CAAA,KAAM,GAAA,IAAO,CAAA,KAAM,GAAA,IAAO,MAAM,GAAA,IAAO,CAAA,KAAM,GAAA,IAAO,IAAA,CAAK,CAAA,CAAE,UAAA,CAAW,IAAA,EAAM,IAAA,CAAK,GAAG,CAAA,EAAG;AACzF,QAAA,IAAA,CAAK,KAAK,0FAA0F,CAAA;AAAA,MACtG;AACA,MAAA,IAAA,CAAK,KAAK,EAAE,EAAA,EAAI,KAAK,GAAA,EAAK,IAAA,CAAK,KAAK,CAAA;AAAA,IACtC;AACA,IAAA,OAAO,EAAE,OAAO,IAAA,EAAK;AAAA,EACvB;AAAA,EAEQ,KAAA,GAAmB;AACzB,IAAA,MAAM,QAAQ,IAAA,CAAK,GAAA;AACnB,IAAA,MAAM,QAAoB,EAAC;AAC3B,IAAA,KAAA,IAASE,KAAAA,GAAO,IAAA,CAAK,IAAA,EAAK,EAAGA,KAAAA,KAAS,MAAA,EAAWA,KAAAA,GAAO,IAAA,CAAK,IAAA,EAAK,EAAG,KAAA,CAAM,IAAA,CAAKA,KAAI,CAAA;AACpF,IAAA,OAAO,EAAE,OAAO,KAAA,EAAM;AAAA,EACxB;AAAA,EAEQ,IAAA,GAA6B;AACnC,IAAA,MAAM,QAAQ,IAAA,CAAK,GAAA;AACnB,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,CAAA,CAAE,KAAK,CAAA;AACtB,IAAA,IAAI,MAAM,GAAA,EAAK;AACb,MAAA,IAAA,CAAK,GAAA,EAAA;AACL,MAAA,MAAM,IAAA,GAAO,KAAK,IAAA,EAAK;AACvB,MAAA,IAAI,IAAA,CAAK,EAAE,IAAA,CAAK,GAAG,MAAM,GAAA,EAAK,IAAA,CAAK,KAAK,wBAAwB,CAAA;AAChE,MAAA,IAAA,CAAK,GAAA,EAAA;AACL,MAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,OAAO,GAAA,EAAK,IAAA,CAAK,KAAK,IAAA,EAAK;AAAA,IACrD;AACA,IAAA,IAAI,CAAA,KAAM,GAAA,IAAO,IAAA,CAAK,CAAA,CAAE,QAAQ,CAAC,CAAA,KAAM,GAAA,IAAO,UAAA,CAAW,IAAA,CAAK,CAAA,CAAE,KAAA,GAAQ,CAAC,CAAC,CAAA,EAAG;AAC3E,MAAA,IAAA,CAAK,GAAA,IAAO,CAAA;AACZ,MAAA,IAAA,CAAK,MAAA,EAAO;AACZ,MAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,GAAA,EAAK,KAAK,GAAA,EAAI;AAAA,IAC7C;AACA,IAAA,IAAI,CAAA,KAAM,OAAO,UAAA,CAAW,IAAA,CAAK,EAAE,KAAA,GAAQ,CAAC,CAAC,CAAA,EAAG;AAC9C,MAAA,IAAA,CAAK,GAAA,IAAO,CAAA;AACZ,MAAA,IAAA,CAAK,MAAA,EAAO;AACZ,MAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,GAAA,EAAK,KAAK,GAAA,EAAI;AAAA,IAC7C;AACA,IAAA,IAAI,MAAM,GAAA,EAAK;AACb,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,CAAA,CAAE,KAAA,GAAQ,CAAC,CAAA;AAC7B,MAAA,IAAI,SAAS,GAAA,IAAO,IAAA,KAAS,GAAA,EAAK,IAAA,CAAK,KAAK,oCAAoC,CAAA;AAChF,MAAA,IAAA,CAAK,GAAA,IAAO,CAAA;AACZ,MAAA,MAAM,IAAA,GAAO,KAAK,MAAA,EAAO;AACzB,MAAA,MAAM,KAAA,GAAQ,KAAK,IAAA,EAAK;AACxB,MAAA,IAAI,KAAA,KAAU,MAAA,EAAW,IAAA,CAAK,IAAA,CAAK,4BAA4B,CAAA;AAC/D,MAAA,OAAO,EAAE,MAAM,MAAA,EAAQ,KAAA,EAAO,KAAK,IAAA,CAAK,GAAA,EAAK,KAAA,EAAO,IAAA,EAAM,IAAA,EAAK;AAAA,IACjE;AACA,IAAA,IAAI,UAAA,CAAW,CAAC,CAAA,EAAG;AACjB,MAAA,MAAM,KAAA,GAAQ,KAAK,MAAA,EAAO;AAC1B,MAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,OAAO,GAAA,EAAK,IAAA,CAAK,KAAK,KAAA,EAAM;AAAA,IACvD;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEQ,MAAA,GAAiB;AACvB,IAAA,IAAI,MAAA,GAAS,EAAA;AACb,IAAA,OAAO,WAAW,IAAA,CAAK,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA,EAAG;AACnC,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,CAAA,CAAE,IAAA,CAAK,GAAA,EAAK,CAAA;AAC5B,MAAA,MAAA,IAAU,EAAA,KAAO,MAAM,GAAA,GAAM,EAAA;AAAA,IAC/B;AACA,IAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,IAAA,CAAK,IAAA,CAAK,CAAA,sBAAA,EAAyB,IAAA,CAAK,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAG,CAAA;AAC/E,IAAA,OAAO,QAAA,CAAS,QAAQ,EAAE,CAAA;AAAA,EAC5B;AAAA,EAEQ,SAAA,GAAgC;AACtC,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,CAAA,CAAE,KAAA,CAAM,KAAK,GAAG,CAAA;AAClC,IAAA,MAAM,KAAK,CAAC,QAAA,EAAU,IAAA,EAAM,IAAA,EAAM,MAAM,IAAA,EAAM,IAAA,EAAM,GAAA,EAAK,GAAA,EAAK,KAAK,GAAA,EAAK,GAAA,EAAK,KAAK,GAAA,EAAK,GAAA,EAAK,GAAG,CAAA,CAAE,IAAA;AAAA,MAC/F,CAAC,KAAA,KAAU,IAAA,CAAK,UAAA,CAAW,KAAK;AAAA,KAClC;AACA,IAAA,IAAI,EAAA,KAAO,MAAA,EAAW,IAAA,CAAK,GAAA,IAAO,EAAA,CAAG,MAAA;AACrC,IAAA,OAAO,EAAA;AAAA,EACT;AACF,CAAA;AAEA,SAAS,YAAYA,KAAAA,EAAyB;AAC5C,EAAA,QAAQA,MAAK,IAAA;AAAM,IACjB,KAAK,KAAA;AACH,MAAA,OAAO,IAAA;AAAA,IACT,KAAK,QAAA;AACH,MAAA,OAAO,KAAA;AAAA,IACT,KAAK,MAAA;AACH,MAAA,OAAO,WAAA,CAAYA,MAAK,KAAK,CAAA;AAAA,IAC/B,KAAK,OAAA;AAEH,MAAA,OACE,YAAA,CAAaA,MAAK,IAAA,CAAK,KAAK,KAC5BA,KAAAA,CAAK,IAAA,CAAK,KAAK,IAAA,CAAK,CAAC,EAAE,EAAA,EAAI,GAAA,OAAU,EAAA,KAAO,QAAA,IAAY,QAAQ,MAAA,IAAa,YAAA,CAAa,GAAG,CAAC,CAAA;AAAA;AAGtG;AAEA,IAAM,eAAe,CAAC,KAAA,KAA8B,KAAA,CAAM,KAAA,CAAM,KAAK,WAAW,CAAA;AAEhF,IAAM,eAAA,GAAkB,CAACA,KAAAA,KACvBA,KAAAA,CAAK,SAAS,KAAA,IAAUA,KAAAA,CAAK,IAAA,KAAS,OAAA,IAAW,gBAAgBA,KAAAA,CAAK,IAAA,EAAMA,KAAAA,CAAK,IAAA,CAAK,KAAK,MAAM,CAAA;AAGnG,SAAS,eAAA,CAAgB,MAAgB,OAAA,EAA0B;AACjE,EAAA,MAAM,QAAA,GAAW,CAAC,IAAA,CAAK,KAAK,CAAA;AAC5B,EAAA,KAAA,MAAW,EAAE,IAAI,GAAA,EAAI,IAAK,KAAK,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,OAAO,CAAA,EAAG;AACrD,IAAA,IAAI,CAAC,UAAA,CAAW,EAAE,CAAA,EAAG,OAAO,KAAA;AAC5B,IAAA,IAAI,OAAO,QAAA,IAAY,GAAA,KAAQ,MAAA,EAAW,QAAA,CAAS,KAAK,GAAG,CAAA;AAAA,EAC7D;AACA,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,KAAA,MAAW,SAAS,QAAA,EAAU;AAC5B,IAAA,IAAI,KAAA,CAAM,MAAM,MAAA,KAAW,CAAA,IAAK,gBAAgB,KAAA,CAAM,KAAA,CAAM,CAAC,CAAC,CAAA,EAAG,IAAA,EAAA;AAAA,SAAA,IACxD,YAAA,CAAa,KAAK,CAAA,EAAG,OAAO,KAAA;AAAA,EACvC;AACA,EAAA,OAAO,IAAA,KAAS,CAAA;AAClB;AAGO,SAAS,eAAA,CAAgB,YAAoB,KAAA,EAAuB;AAGzE,EAAA,IAAI,OAAA,GAAU,EAAA;AACd,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,UAAA,CAAW,QAAQ,CAAA,EAAA,EAAK;AAC1C,IAAA,IAAI,UAAA,CAAW,CAAC,CAAA,KAAM,GAAA,EAAK;AAC3B,IAAA,OAAA,IAAW,UAAA,CAAW,CAAC,CAAA,CAAE,WAAA,EAAY;AACrC,IAAA,QAAA,CAAS,KAAK,CAAC,CAAA;AAAA,EACjB;AACA,EAAA,MAAM,OAAO,IAAI,cAAA,CAAe,OAAA,EAAS,UAAU,EAAE,IAAA,EAAK;AAE1D,EAAA,MAAM,QAAsD,EAAC;AAE7D,EAAA,MAAM,IAAA,GAAO,CAAC,KAAA,EAAe,GAAA,MAAiB,EAAE,IAAA,EAAM,QAAA,CAAS,KAAK,CAAA,EAAG,EAAA,EAAI,QAAA,CAAS,GAAA,GAAM,CAAC,IAAI,CAAA,EAAE,CAAA;AACjG,EAAA,MAAM,IAAA,GAAO,CAAC,KAAA,EAAe,GAAA,EAAa,IAAA,KAAiB;AACzD,IAAA,MAAM,EAAE,IAAA,EAAM,EAAA,EAAG,GAAI,IAAA,CAAK,OAAO,GAAG,CAAA;AACpC,IAAA,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,EAAA,EAAI,MAAM,IAAA,EAAM,IAAA,EAAK,EAAG,EAAE,IAAA,EAAM,EAAA,EAAI,EAAA,EAAI,IAAA,EAAM,KAAK,CAAA;AAAA,EACxE,CAAA;AACA,EAAA,MAAM,MAAA,GAAS,CAAC,KAAA,EAAe,GAAA,KAAgB;AAC7C,IAAA,MAAM,EAAE,IAAA,EAAM,EAAA,EAAG,GAAI,IAAA,CAAK,OAAO,GAAG,CAAA;AACpC,IAAA,OAAO,UAAA,CAAW,KAAA,CAAM,IAAA,EAAM,EAAE,CAAA;AAAA,EAClC,CAAA;AAIA,EAAA,MAAM,YAAsB,EAAC;AAC7B,EAAA,MAAM,WAAA,GACJ,8HAAA;AACF,EAAA,MAAM,QAAA,GAAW,CAAC,IAAA,EAA2C,MAAA,KAA4B;AAEvF,IAAA,IAAK,IAAA,CAAK,IAAA,KAAS,GAAA,IAAO,IAAA,CAAK,IAAA,KAAS,KAAM,CAAC,WAAA,CAAY,IAAA,CAAK,KAAK,CAAA,EAAG;AACxE,IAAA,SAAA,CAAU,KAAK,CAAA,WAAA,EAAc,MAAA,CAAO,MAAA,EAAQ,IAAA,KAAS,WAAW,MAAA,CAAO,KAAA,GAAQ,IAAA,CAAK,KAAA,EAAO,KAAK,KAAA,CAAM,KAAK,CAAC,CAAA,GAAA,EAAM,WAAW,CAAA,CAAE,CAAA;AAAA,EACjI,CAAA;AAIA,EAAA,MAAM,SAAA,GAAY,CAAC,KAAA,KAA0B;AAC3C,IAAA,IAAI,eAAA,CAAgB,KAAK,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,OAAO,KAAA,CAAM,GAAA,EAAK,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE,CAAA;AAAA,SAAA,IAC3D,KAAA,CAAM,IAAA,KAAS,OAAA,EAAS,SAAA,CAAU,MAAM,IAAI,CAAA;AAAA,SAAA,IAC5C,KAAA,CAAM,SAAS,MAAA,EAAQ;AAC9B,MAAA,QAAA,CAAS,KAAK,CAAA;AACd,MAAA,SAAA,CAAU,MAAM,KAAK,CAAA;AAAA,IACvB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,UAAA,GAAa,CAAC,KAAA,KAA2B;AAC7C,IAAA,MAAM,EAAE,OAAM,GAAI,KAAA;AAClB,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACxB,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA;AACnC,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAChC,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,WAAW,CAAA,EAAG;AAC5B,MAAA,MAAM,IAAI,2BAAA;AAAA,QACR,8BAA8B,UAAU,CAAA,4EAAA;AAAA,OAC1C;AAAA,IACF;AACA,IAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AACxB,MAAA,QAAA,CAAS,IAAA,EAAM,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAC,CAAC,CAAA;AACxC,MAAA,SAAA,CAAU,KAAK,KAAK,CAAA;AAAA,IACtB,CAAA,MAAA,IAAW,eAAA,CAAgB,IAAI,CAAA,EAAG;AAChC,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA;AACtC,MAAA,IAAI,KAAA,EAAO,SAAS,QAAA,EAAU;AAC5B,QAAA,KAAA,CAAM,IAAA,CAAK,EAAE,GAAG,IAAA,CAAK,MAAM,KAAA,EAAO,KAAA,CAAM,GAAG,CAAA,EAAG,MAAM,MAAA,CAAO,KAAA,CAAM,KAAA,GAAQ,KAAK,GAAG,CAAA;AAAA,MACnF,CAAA,MAAO;AACL,QAAA,MAAM,EAAA,GAAK,QAAA,CAAS,IAAA,CAAK,KAAK,CAAA;AAC9B,QAAA,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,EAAA,EAAI,EAAA,EAAI,IAAI,IAAA,EAAM,MAAA,CAAO,KAAK,CAAA,EAAG,CAAA;AAAA,MACtD;AAAA,IACF,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,OAAA,EAAS;AAChC,MAAA,SAAA,CAAU,KAAK,IAAI,CAAA;AAAA,IACrB;AAAA,EACF,CAAA;AAEA,EAAA,SAAS,UAAU,IAAA,EAAsB;AAEvC,IAAA,IAAI,OAAA,GAAU,CAAA;AACd,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,IAAA,CAAK,KAAK,MAAA,IAAU,UAAA,CAAW,IAAA,CAAK,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA,CAAE,EAAE,GAAG,CAAA,EAAA,EAAK;AAC7E,MAAA,IAAI,eAAA,CAAgB,IAAA,EAAM,CAAC,CAAA,EAAG,OAAA,GAAU,CAAA;AAAA,IAC1C;AACA,IAAA,IAAI,OAAA,GAAU,CAAA,EAAG,IAAA,CAAK,IAAA,CAAK,MAAM,KAAA,EAAO,IAAA,CAAK,IAAA,CAAK,OAAA,GAAU,CAAC,CAAA,CAAE,GAAA,EAAK,CAAA,EAAG,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,SAC1E,UAAA,CAAW,KAAK,KAAK,CAAA;AAC1B,IAAA,IAAI,WAAA,GAAc,OAAA,GAAU,CAAA,IAAK,YAAA,CAAa,KAAK,KAAK,CAAA;AACxD,IAAA,KAAA,MAAW,EAAE,IAAI,GAAA,EAAK,GAAA,MAAS,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA,EAAG;AACvD,MAAA,IAAI,EAAA,KAAO,QAAA,IAAY,GAAA,KAAQ,MAAA,EAAW;AAC1C,MAAA,MAAM,UAAA,GAAa,aAAa,GAAG,CAAA;AAEnC,MAAA,IAAI,EAAA,KAAO,GAAA,IAAO,WAAA,IAAe,UAAA,EAAY;AAC3C,QAAA,SAAA,CAAU,IAAA,CAAK,CAAA,8BAAA,EAAiC,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,OAAO,GAAG,CAAC,CAAA,GAAA,EAAM,WAAW,CAAA,CAAE,CAAA;AAAA,MAClG;AAEA,MAAA,IAAI,EAAA,KAAO,GAAA,KAAQ,WAAA,IAAe,UAAA,CAAA,EAAa;AAC7C,QAAA,SAAA,CAAU,IAAA;AAAA,UACR,aAAa,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO,GAAG,CAAC,CAAA,mJAAA;AAAA,SAE5C;AAAA,MACF;AACA,MAAA,WAAA,KAAA,WAAA,GAAgB,UAAA,CAAA;AAChB,MAAA,UAAA,CAAW,GAAG,CAAA;AAAA,IAChB;AAAA,EACF;AAEA,EAAA,SAAA,CAAU,IAAI,CAAA;AACd,EAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,IAAA,MAAM,IAAI,0BAAA;AAAA,MACR,CAAA,2BAAA,EAA8B,UAAU,CAAA,aAAA,EAAgB,SAAA,CAAU,CAAC,CAAC,CAAA,oGAAA;AAAA,KAEtE;AAAA,EACF;AAEA,EAAA,IAAI,MAAA,GAAS,UAAA;AACb,EAAA,KAAA,MAAW,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,MAAU,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,IAAA,GAAO,CAAA,CAAE,IAAI,CAAA,EAAG;AACtE,IAAA,MAAA,GAAS,MAAA,CAAO,MAAM,CAAA,EAAG,IAAI,IAAI,IAAA,GAAO,MAAA,CAAO,MAAM,EAAE,CAAA;AAAA,EACzD;AACA,EAAA,OAAO,MAAA;AACT;;;AC7RO,IAAM,cAAA,GAAN,MAAM,eAAA,SAAuB,KAAA,CAAM;AAAA,EAOxC,WAAA,CACE,SACA,OAAA,EACA;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,gBAAA;AACZ,IAAA,IAAA,CAAK,aAAa,OAAA,EAAS,UAAA;AAC3B,IAAA,IAAA,CAAK,QAAQ,OAAA,EAAS,KAAA;AAEtB,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,eAAA,CAAe,SAAS,CAAA;AAAA,EACtD;AACF,CAAA;;;ACbA,IAAM,mBAAA,GAAsB,GAAA;AAsDrB,IAAM,IAAA,GAAN,MAAM,KAAA,CAAK;AAAA,EAUhB,WAAA,CAAY,IAAY,CAAA,EAAG;AAT3B,IAAA,IAAA,CAAiB,QAA4B,EAAC;AAC9C,IAAA,IAAA,CAAO,cAA+B,EAAC;AAIvC;AAAA;AAAA;AAAA,IAAA,IAAA,CAAQ,cAAgE,EAAC;AACzE,IAAA,IAAA,CAAQ,4BAAA,GAA+B,KAAA;AAIrC,IAAA,IAAI,KAAK,CAAA,EAAG;AACZ,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,CAAA,EAAG,CAAA,EAAA,EAAK;AAC3B,MAAA,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,GAAI,CAAA;AAAA,IAClB;AAAA,EACF;AAAA,EAEA,uBAAuB,GAAA,EAAkD;AACvE,IAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,MAAA,IAAA,CAAK,qBAAA,EAAsB;AAAA,IAC7B;AAEA,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,WAAA,CAAY,GAAG,CAAA;AACzC,IAAA,IAAI,YAAA,KAAiB,QAAW,OAAO,MAAA;AAEvC,IAAA,OAAO,EAAE,GAAG,YAAA,EAAa;AAAA,EAC3B;AAAA,EAEA,0BAAA,GAEE;AACA,IAAA,OAAO,EAAE,GAAG,IAAA,CAAK,WAAA,EAAY;AAAA,EAC/B;AAAA,EAEA,sBAAA,CACE,KACA,IAAA,EACM;AACN,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,IAAA,CAAK,WAAA,CAAY,GAAG,CAAA,GAAI,IAAA;AAAA,IAC1B,CAAA,MAAO;AACL,MAAA,OAAO,IAAA,CAAK,YAAY,GAAG,CAAA;AAAA,IAC7B;AAAA,EACF;AAAA,EAEA,eAAe,GAAA,EAA2B;AACxC,IAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,MAAA,IAAA,CAAK,qBAAA,EAAsB;AAAA,IAC7B;AACA,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,WAAA,CAAY,GAAG,CAAA;AACjC,IAAA,OAAO,SAAS,MAAA,IAAa,MAAA,CAAO,IAAA,CAAK,IAAI,EAAE,MAAA,GAAS,CAAA;AAAA,EAC1D;AAAA,EAEA,eAAA,CAAgB,KAAkB,IAAA,EAAsB;AACtD,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,GAAG,CAAA,GAAI,IAAI,CAAA,IAAK,CAAA;AAAA,EAC1C;AAAA,EAEA,WAAW,GAAA,EAA0B;AACnC,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,sBAAA,CAAuB,GAAG,CAAA;AACpD,IAAA,IAAI,CAAC,cAAc,OAAO,CAAA;AAE1B,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,MAAA,CAAO,YAAY,CAAA,CAAE,MAAA;AAAA,MAC7C,CAAC,GAAA,EAAK,KAAA,KAAU,GAAA,GAAM,KAAA;AAAA,MACtB;AAAA,KACF;AACA,IAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,OAAA,CAAQ,YAAY,CAAA,CAAE,MAAA;AAAA,MAClD,CAAC,KAAK,CAAC,MAAA,EAAQ,KAAK,CAAA,KAAM,GAAA,GAAM,MAAA,CAAO,MAAM,CAAA,GAAI,KAAA;AAAA,MACjD;AAAA,KACF;AACA,IAAA,IAAI,UAAA,KAAe,GAAG,OAAO,CAAA;AAC7B,IAAA,OAAO,cAAA,GAAiB,UAAA;AAAA,EAC1B;AAAA;AAAA,EAGA,wBAAA,GAA+C;AAC7C,IAAA,MAAM,YAAgC,EAAC;AAOvC,IAAA,MAAM,kBAAA,GAAyD;AAAA,MAC7D,KAAK,WAAA,CAAY,IAAA;AAAA,MACjB,KAAK,WAAA,CAAY,QAAA;AAAA,MACjB,KAAK,WAAA,CAAY,UAAA;AAAA,MACjB,KAAK,WAAA,CAAY,QAAA;AAAA,MACjB,KAAK,WAAA,CAAY,QAAA;AAAA,MACjB,KAAK,WAAA,CAAY;AAAA,KACnB;AAEA,IAAA,KAAA,MAAW,CAAC,MAAM,UAAU,CAAA,IAAK,OAAO,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA,EAAG;AAC3D,MAAA,MAAM,OAAA,GAAU,OAAO,IAAI,CAAA;AAC3B,MAAA,IAAI,QAAA,GAAW,UAAA;AAEf,MAAA,KAAA,MAAW,gBAAgB,kBAAA,EAAoB;AAC7C,QAAA,MAAM,YAAA,GAAe,eAAe,OAAO,CAAA;AAC3C,QAAA,IAAI,YAAA,EAAc;AAChB,UAAA,QAAA,IAAY,YAAA;AAAA,QACd;AAAA,MACF;AAIA,MAAA,IAAI,YAAY,CAAA,EAAG;AACjB,QAAA,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,GAAA,GAAM,CAAC,CAAA,IAAK,CAAA;AAAA,MAC1C;AAIA,MAAA,IAAI,WAAW,CAAA,EAAG;AAChB,QAAA,QAAA,GAAW,CAAA;AAAA,MACb;AACA,MAAA,SAAA,CAAU,OAAO,CAAA,GAAI,QAAA;AAAA,IACvB;AAEA,IAAA,OAAO,SAAA;AAAA,EACT;AAAA,EAEQ,qBAAA,GAA8B;AACpC,IAAA,IAAI,CAAC,KAAK,4BAAA,EAA8B;AACtC,MAAA,MAAM,SAAA,GAAY,KAAK,wBAAA,EAAyB;AAChD,MAAA,IAAA,CAAK,sBAAA,CAAuB,OAAO,SAAS,CAAA;AAC5C,MAAA,IAAA,CAAK,4BAAA,GAA+B,IAAA;AAAA,IACtC;AAAA,EACF;AAAA;AAAA,EAIQ,QAAA,CACN,KAAA,EACA,EAAA,EACA,eAAA,EACM;AACN,IAAA,MAAM,MAAA,GAAS,eAAA,GAAkB,eAAA,EAAgB,GAAI,IAAI,KAAA,EAAK;AAE9D,IAAA,MAAM,QAAA,GAAW,OAAO,KAAA,KAAU,QAAA;AAClC,IAAA,MAAM,KAAA,GAAQ,KAAK,IAAA,EAAK;AAIxB,IAAA,MAAM,KAAA,GAAQ,QAAA,GAAW,EAAC,GAAK,MAAe,IAAA,EAAK;AAInD,IAAA,IAAI,CAAC,QAAA,IAAY,KAAA,CAAM,MAAA,GAAS,KAAA,CAAM,SAAS,mBAAA,EAAqB;AAClE,MAAA,MAAM,IAAI,cAAA;AAAA,QACR,uBAAuB,KAAA,CAAM,MAAM,OAAI,KAAA,CAAM,MAAM,sCAAsC,mBAAmB,CAAA;AAAA,OAC9G;AAAA,IACF;AAEA,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAE9B,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,MAAM,SAAA,GAAY,EAAA,CAAG,IAAA,EAAM,KAAe,CAAA;AAC1C,QAAA,MAAA,CAAO,SAAA,CAAU,WAAW,MAAM,CAAA;AAAA,MACpC,CAAA,MAAO;AACL,QAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,UAAA,MAAM,MAAA,GAAS,KAAA,CAAM,KAAA,CAAM,IAAI,CAAA;AAC/B,UAAA,MAAM,SAAA,GAAY,EAAA,CAAG,IAAA,EAAM,IAAI,CAAA;AAC/B,UAAA,MAAA,CAAO,SAAA,CAAU,SAAA,EAAW,MAAA,GAAS,MAAM,CAAA;AAAA,QAC7C;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA,EAIA,cAAA,GAAqC;AACnC,IAAA,OAAO,OAAO,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA,CAAE,IAAI,CAAC,CAAC,CAAA,EAAG,CAAC,MAAM,CAAC,MAAA,CAAO,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,EAClE;AAAA,EAEA,UAAA,GAAiC;AAC/B,IAAA,OAAO,EAAE,GAAG,IAAA,CAAK,KAAA,EAAM;AAAA,EACzB;AAAA,EAEA,IAAI,IAAA,EAAsB;AACxB,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,IAAK,CAAA;AAAA,EAC7B;AAAA,EAEA,IAAA,GAAiB;AACf,IAAA,OAAO,OAAO,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA,CAAE,IAAI,MAAM,CAAA;AAAA,EAC3C;AAAA,EAEA,MAAA,GAAmB;AACjB,IAAA,OAAO,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA;AAAA,EACjC;AAAA,EAEA,KAAA,GAAgB;AACd,IAAA,OAAO,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAAE,MAAA,CAAO,CAAC,GAAA,EAAK,KAAA,KAAU,GAAA,GAAM,KAAA,EAAO,CAAC,CAAA;AAAA,EACxE;AAAA,EAEO,OAAA,CAAQ,KAAa,KAAA,EAAqB;AAC/C,IAAA,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,GAAI,KAAA;AAAA,EACpB;AAAA,EAEA,OAAc,OAAO,KAAA,EAAqB;AACxC,IAAA,MAAM,MAAA,GAAS,IAAI,KAAA,EAAK;AACxB,IAAA,MAAA,CAAO,SAAA,CAAU,OAAO,CAAC,CAAA;AACzB,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEO,OAAA,GAAkB;AACvB,IAAA,MAAM,WAAA,GAAc,KAAK,IAAA,EAAK;AAE9B,IAAA,IAAI,WAAA,CAAY,WAAW,CAAA,EAAG;AAC5B,MAAA,MAAM,IAAI,MAAM,wBAAwB,CAAA;AAAA,IAC1C;AAEA,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,GAAG,WAAW,CAAA;AAAA,EAChC;AAAA,EAEO,OAAA,GAAkB;AACvB,IAAA,MAAM,WAAA,GAAc,KAAK,IAAA,EAAK;AAE9B,IAAA,IAAI,WAAA,CAAY,WAAW,CAAA,EAAG;AAC5B,MAAA,MAAM,IAAI,MAAM,wBAAwB,CAAA;AAAA,IAC1C;AAEA,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,GAAG,WAAW,CAAA;AAAA,EAChC;AAAA,EAEO,SAAA,CAAU,MAAc,KAAA,EAAqB;AAClD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,IAAK,CAAA;AACpC,IAAA,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,GAAI,OAAA,GAAU,KAAA;AAAA,EAC/B;AAAA;AAAA,EAGO,UAAU,MAAA,EAAsB;AACrC,IAAA,MAAM,MAAA,GAAS,IAAI,KAAA,EAAK;AAExB,IAAA,KAAA,MAAW,CAAC,MAAM,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA,EAAG;AACtD,MAAA,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,IAAI,CAAC,IAAI,KAAA,GAAQ,MAAA;AAAA,IACvC;AAEA,IAAA,MAAA,CAAO,WAAA,GAAc,EAAE,GAAG,IAAA,CAAK,WAAA,EAAY;AAC3C,IAAA,KAAA,MAAW,CAAC,KAAK,YAAY,CAAA,IAAK,OAAO,OAAA,CAAQ,IAAA,CAAK,WAAW,CAAA,EAAG;AAClE,MAAA,MAAM,SAA6B,EAAC;AACpC,MAAA,KAAA,MAAW,CAAC,IAAA,EAAM,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,YAAY,CAAA,EAAG;AACxD,QAAA,MAAA,CAAO,MAAA,CAAO,IAAI,CAAC,CAAA,GAAI,KAAA,GAAQ,MAAA;AAAA,MACjC;AACA,MAAA,MAAA,CAAO,WAAA,CAAY,GAAkB,CAAA,GAAI,MAAA;AAAA,IAC3C;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA,EAIO,IAAI,KAAA,EAA4B;AACrC,IAAA,OAAO,KAAK,QAAA,CAAS,KAAA,EAAO,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,CAAC,CAAA;AAAA,EAC7C;AAAA,EAEO,SAAS,KAAA,EAA4B;AAC1C,IAAA,OAAO,KAAK,QAAA,CAAS,KAAA,EAAO,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,CAAC,CAAA;AAAA,EAC7C;AAAA,EAEO,iBAAiB,KAAA,EAA4B;AAClD,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,KAAA,EAAO,CAAC,CAAA,EAAG,OAAO,CAAA,KAAM,CAAA,GAAI,CAAA,GAAI,CAAA,IAAK,CAAC,CAAA;AAAA,EAC7D;AAAA,EAEO,SAAS,KAAA,EAA4B;AAC1C,IAAA,OAAO,KAAK,QAAA,CAAS,KAAA,EAAO,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,CAAC,CAAA;AAAA,EAC7C;AAAA,EAEO,WAAW,KAAA,EAA4B;AAC5C,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,KAAA,EAAO,CAAC,CAAA,EAAG,MAAO,CAAA,KAAM,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAE,CAAA;AAAA,EAC7D;AAAA,EAEO,GAAG,KAAA,EAA4B;AACpC,IAAA,OAAO,IAAA,CAAK,SAAS,KAAA,EAAO,CAAC,GAAG,CAAA,KAAO,CAAA,KAAM,CAAA,GAAI,CAAA,GAAI,CAAE,CAAA;AAAA,EACzD;AAAA,EAEO,IAAI,KAAA,EAA4B;AACrC,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,KAAA,EAAO,CAAC,CAAA,EAAG,MAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,EACtD;AAAA,EAEO,IAAI,KAAA,EAA4B;AACrC,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,KAAA,EAAO,CAAC,CAAA,EAAG,MAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,EACtD;AAAA,EAEO,SAAA,GAAkB;AACvB,IAAA,OAAO,IAAA,CAAK,IAAI,IAAI,CAAA;AAAA,EACtB;AAAA,EAEO,GAAG,KAAA,EAA4B;AACpC,IAAA,OAAO,IAAA,CAAK,SAAS,KAAA,EAAO,CAAC,GAAG,CAAA,KAAO,CAAA,IAAK,CAAA,GAAI,CAAA,GAAI,CAAE,CAAA;AAAA,EACxD;AAAA,EAEO,OAAO,KAAA,EAA4B;AACxC,IAAA,OAAO,KAAK,QAAA,CAAS,KAAA,EAAO,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,CAAC,CAAA;AAAA,EAC7C;AAAA,EAEO,cAAc,KAAA,EAA4B;AAC/C,IAAA,IAAA,CAAK,qBAAqB,KAAK,CAAA;AAC/B,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,KAAA,EAAO,CAAC,CAAA,EAAG,CAAA,KAAO,CAAA,KAAM,CAAA,GAAI,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,CAAA,GAAI,CAAC,CAAE,CAAA;AAAA,EACxE;AAAA,EAEO,gBAAgB,KAAA,EAA4B;AACjD,IAAA,IAAA,CAAK,qBAAqB,KAAK,CAAA;AAC/B,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,KAAA,EAAO,CAAC,CAAA,EAAG,CAAA,KAAO,CAAA,KAAM,CAAA,GAAI,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,CAAC,CAAE,CAAA;AAAA,EACzE;AAAA;AAAA,EAGQ,qBAAqB,KAAA,EAA4B;AACvD,IAAA,IAAI,OAAO,UAAU,QAAA,GAAW,KAAA,KAAU,IAAI,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,GAAI,CAAA,EAAG;AAC9D,MAAA,MAAM,IAAI,eAAe,wCAAwC,CAAA;AAAA,IACnE;AAAA,EACF;AAAA,EAEO,IAAI,KAAA,EAA4B;AACrC,IAAA,OAAO,IAAA,CAAK,SAAS,KAAA,EAAO,CAAC,GAAG,CAAA,KAAO,CAAA,IAAK,CAAA,GAAI,CAAA,GAAI,CAAE,CAAA;AAAA,EACxD;AAAA,EAEQ,WAAA,CACN,OACA,eAAA,EACM;AACN,IAAA,MAAM,eAAe,MAAM;AACzB,MAAA,MAAM,MAAA,GAAS,IAAI,KAAA,EAAK;AACxB,MAAA,MAAA,CAAO,SAAA,CAAU,GAAG,CAAC,CAAA;AACrB,MAAA,MAAA,CAAO,SAAA,CAAU,GAAG,CAAC,CAAA;AACrB,MAAA,OAAO,MAAA;AAAA,IACT,CAAA;AAEA,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,KAAA,EAAO,eAAA,EAAiB,YAAY,CAAA;AAAA,EAC3D;AAAA,EAEO,GAAG,KAAA,EAA4B;AACpC,IAAA,MAAM,UAAU,CAAC,CAAA,EAAW,CAAA,KAAe,CAAA,IAAK,IAAI,CAAA,GAAI,CAAA;AACxD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,WAAA,CAAY,KAAA,EAAO,OAAO,CAAA;AAE9C,IAAA,MAAA,CAAO,YAAY,SAAA,GAAY,IAAA;AAC/B,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEO,GAAG,KAAA,EAA4B;AACpC,IAAA,MAAM,UAAU,CAAC,CAAA,EAAW,CAAA,KAAe,CAAA,IAAK,IAAI,CAAA,GAAI,CAAA;AACxD,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,KAAA,EAAO,OAAO,CAAA;AAAA,EACxC;AAAA,EAEO,WAAW,IAAA,EAAoB;AACpC,IAAA,MAAM,MAAA,GAAS,IAAI,KAAA,EAAK;AAExB,IAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA,EAAG;AACrD,MAAA,MAAM,MAAA,GAAS,OAAO,GAAG,CAAA;AACzB,MAAA,IAAI,WAAW,IAAA,EAAM;AACnB,QAAA,MAAA,CAAO,SAAA,CAAU,QAAQ,KAAK,CAAA;AAAA,MAChC;AAAA,IACF;AAEA,IAAA,MAAA,CAAO,WAAA,GAAc,EAAE,GAAG,IAAA,CAAK,WAAA,EAAY;AAC3C,IAAA,MAAA,CAAO,WAAA,GAAc,EAAE,GAAG,IAAA,CAAK,WAAA,EAAY;AAC3C,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,OAAO,QAAA,EAA+B;AAC3C,IAAA,MAAM,QAAA,GAAW,IAAI,GAAA,CAAI,OAAO,QAAA,KAAa,QAAA,GAAW,CAAC,QAAQ,CAAA,GAAI,QAAA,CAAS,IAAA,EAAM,CAAA;AACpF,IAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,EAAM;AACzB,IAAA,IAAI,aAAA,GAAgB,CAAA;AACpB,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,KAAK,CAAA,IAAK,IAAA,CAAK,cAAA,EAAe,EAAG,IAAI,QAAA,CAAS,GAAA,CAAI,IAAI,CAAA,EAAG,aAAA,IAAiB,KAAA;AAE5F,IAAA,MAAM,MAAA,GAAS,IAAI,KAAA,EAAK;AACxB,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,KAAK,CAAA,IAAK,IAAA,CAAK,gBAAe,EAAG;AACjD,MAAA,MAAA,CAAO,SAAA,CAAU,MAAM,KAAA,IAAA,CAAU,QAAA,CAAS,IAAI,IAAI,CAAA,GAAI,CAAA,GAAI,KAAA,IAAS,aAAA,CAAc,CAAA;AAAA,IACnF;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA,EAIO,QAAQ,KAAA,EAA4B;AACzC,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,MAAA,KAAA,GAAQ,KAAA,CAAK,OAAO,KAAK,CAAA;AAAA,IAC3B;AAGA,IAAA,MAAM,MAAA,GAAS,IAAI,KAAA,EAAK;AACxB,IAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,KAAA,CAAM,KAAK,CAAA,EAAG;AACtD,MAAA,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAA,GAAI,KAAA;AAAA,IAC9B;AAGA,IAAA,MAAM,MAAA,GAAS,IAAI,KAAA,EAAK;AACxB,IAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA,EAAG;AACrD,MAAA,MAAM,MAAA,GAAS,OAAO,GAAG,CAAA;AACzB,MAAA,MAAA,CAAO,SAAA,CAAU,QAAQ,KAAK,CAAA;AAG9B,MAAA,IAAI,EAAE,MAAA,IAAU,KAAA,CAAM,KAAA,CAAA,EAAQ;AAC5B,QAAA,MAAA,CAAO,SAAA,CAAU,QAAQ,KAAK,CAAA;AAAA,MAChC;AAAA,IACF;AAEA,IAAA,MAAA,CAAO,cAAc,EAAE,GAAG,IAAA,CAAK,WAAA,EAAa,QAAQ,KAAA,EAAM;AAC1D,IAAA,MAAA,CAAO,WAAA,GAAc,EAAE,GAAG,IAAA,CAAK,WAAA,EAAY;AAC3C,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEO,eAAe,KAAA,EAAmB;AACvC,IAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,KAAA,CAAM,KAAK,CAAA,EAAG;AACtD,MAAA,MAAM,MAAA,GAAS,OAAO,GAAG,CAAA;AACzB,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA,IAAK,CAAA;AACtC,MAAA,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA,GAAI,OAAA,GAAU,KAAA;AAAA,IACjC;AAAA,EACF;AAAA,EAEO,OAAA,GAA8B;AACnC,IAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,EAAM;AACzB,IAAA,MAAM,SAA6B,EAAC;AAEpC,IAAA,KAAA,MAAW,CAAC,MAAM,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA,EAAG;AACtD,MAAA,MAAA,CAAO,MAAA,CAAO,IAAI,CAAC,CAAA,GAAI,KAAA,GAAQ,KAAA;AAAA,IACjC;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEO,OAAA,GAAkB;AACvB,IAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,EAAM;AACzB,IAAA,IAAI,KAAA,KAAU,GAAG,OAAO,CAAA;AAExB,IAAA,IAAI,GAAA,GAAM,CAAA;AACV,IAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA,EAAG;AACrD,MAAA,GAAA,IAAO,MAAA,CAAO,GAAG,CAAA,GAAI,KAAA;AAAA,IACvB;AAEA,IAAA,OAAO,GAAA,GAAM,KAAA;AAAA,EACf;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,KAAA,CAAM,aAAqB,GAAA,EAAU;AAC1C,IAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,EAAM;AACzB,IAAA,IAAI,KAAA,KAAU,CAAA,EAAG,OAAO,GAAA,CAAI,MAAM,UAAU,CAAA;AAG5C,IAAA,IAAA,CAAK,qBAAA,EAAsB;AAE3B,IAAA,MAAM,GAAA,uBAAU,GAAA,EAAiB;AAGjC,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,sBAAA,CAAuB,KAAK,KAAK,EAAC;AACzD,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,sBAAA,CAAuB,MAAM,KAAK,EAAC;AAC3D,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,sBAAA,CAAuB,YAAY,KAAK,EAAC;AACjE,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,sBAAA,CAAuB,UAAU,KAAK,EAAC;AAC/D,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,sBAAA,CAAuB,UAAU,KAAK,EAAC;AACnE,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,sBAAA,CAAuB,IAAI,KAAK,EAAC;AAKvD,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,IAAA,CAAK,UAAU,EAAE,MAAA,GAAS,CAAA;AAEpD,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,WAAA,CAAY,SAAA,KAAc,IAAA;AAEjD,IAAA,MAAM,cAAc,CAAC,CAAA,KAAe,IAAI,CAAA,IAAK,CAAA,GAAI,SAAS,CAAA,GAAI,CAAA;AAI9D,IAAA,KAAA,MAAW,CAAC,SAAS,YAAY,CAAA,IAAK,OAAO,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA,EAAG;AAChE,MAAA,MAAM,IAAA,GAAO,OAAO,OAAO,CAAA;AAC3B,MAAA,MAAM,SAAA,GAAY,OAAO,YAAY,CAAA;AAGrC,MAAA,IAAI,aAAa,CAAA,EAAG;AAEpB,MAAA,IAAI,IAAI,SAAA,GAAY,KAAA;AACpB,MAAA,CAAA,GAAI,YAAY,CAAC,CAAA;AAGjB,MAAA,IAAI,EAAE,IAAI,CAAA,CAAA,EAAI;AAGd,MAAA,IAAI,UAAA,IAAc,CAAA,IAAK,CAAA,GAAI,UAAA,EAAY;AAEvC,MAAA,MAAM,QAAyB,EAAC;AAChC,MAAA,MAAM,OAAwB,EAAC;AAG/B,MAAA,IAAI,SAAA,CAAU,IAAI,CAAA,EAAG;AACnB,QAAA,MAAM,CAAA,GAAI,WAAA,CAAY,SAAA,CAAU,IAAI,IAAI,KAAK,CAAA;AAC7C,QAAA,IAAI,IAAI,CAAA,EAAG;AACT,UAAA,IAAI,cAAc,SAAA,EAAW;AAC3B,YAAA,KAAA,CAAM,QAAA,GAAW,CAAA;AACjB,YAAA,IAAA,CAAK,WAAW,WAAA,CAAa,IAAA,GAAO,SAAA,CAAU,IAAI,IAAK,KAAK,CAAA;AAAA,UAC9D,CAAA,MAAO;AACL,YAAA,KAAA,CAAM,GAAA,GAAM,CAAA;AACZ,YAAA,IAAA,CAAK,MAAM,WAAA,CAAa,IAAA,GAAO,SAAA,CAAU,IAAI,IAAK,KAAK,CAAA;AAAA,UACzD;AAAA,QACF;AAAA,MACF;AAEA,MAAA,IAAI,UAAA,CAAW,IAAI,CAAA,EAAG;AACpB,QAAA,MAAM,CAAA,GAAI,WAAA,CAAY,UAAA,CAAW,IAAI,IAAI,KAAK,CAAA;AAC9C,QAAA,IAAI,IAAI,CAAA,EAAG;AACT,UAAA,KAAA,CAAM,IAAA,GAAO,CAAA;AACb,UAAA,IAAA,CAAK,OAAO,WAAA,CAAa,IAAA,GAAO,UAAA,CAAW,IAAI,IAAK,KAAK,CAAA;AAAA,QAC3D;AAAA,MACF;AAEA,MAAA,IAAI,UAAA,CAAW,IAAI,CAAA,EAAG;AACpB,QAAA,MAAM,CAAA,GAAI,WAAA,CAAY,UAAA,CAAW,IAAI,IAAI,KAAK,CAAA;AAC9C,QAAA,IAAI,IAAI,CAAA,EAAG;AACT,UAAA,KAAA,CAAM,UAAA,GAAa,CAAA;AACnB,UAAA,IAAA,CAAK,aAAa,WAAA,CAAa,IAAA,GAAO,UAAA,CAAW,IAAI,IAAK,KAAK,CAAA;AAAA,QACjE;AAAA,MACF;AAEA,MAAA,IAAI,UAAA,CAAW,IAAI,CAAA,EAAG;AACpB,QAAA,MAAM,CAAA,GAAI,WAAA,CAAY,UAAA,CAAW,IAAI,IAAI,KAAK,CAAA;AAC9C,QAAA,IAAI,IAAI,CAAA,EAAG;AACT,UAAA,KAAA,CAAM,QAAA,GAAW,CAAA;AACjB,UAAA,IAAA,CAAK,WAAW,WAAA,CAAa,IAAA,GAAO,UAAA,CAAW,IAAI,IAAK,KAAK,CAAA;AAAA,QAC/D;AAAA,MACF;AAEA,MAAA,IAAI,cAAA,CAAe,IAAI,CAAA,EAAG;AACxB,QAAA,MAAM,CAAA,GAAI,WAAA,CAAY,cAAA,CAAe,IAAI,IAAI,KAAK,CAAA;AAClD,QAAA,IAAI,IAAI,CAAA,EAAG;AACT,UAAA,KAAA,CAAM,QAAA,GAAA,CAAY,KAAA,CAAM,QAAA,IAAY,CAAA,IAAK,CAAA;AACzC,UAAA,IAAA,CAAK,QAAA,GAAW,aAAa,IAAA,CAAK,QAAA,IAAY,KAAM,IAAA,GAAO,cAAA,CAAe,IAAI,CAAA,GAAK,KAAK,CAAA;AAAA,QAC1F;AAAA,MACF;AAEA,MAAA,IAAI,QAAA,CAAS,IAAI,CAAA,EAAG;AAClB,QAAA,MAAM,CAAA,GAAI,WAAA,CAAY,QAAA,CAAS,IAAI,IAAI,KAAK,CAAA;AAC5C,QAAA,IAAI,IAAI,CAAA,EAAG;AACT,UAAA,KAAA,CAAM,EAAA,GAAK,CAAA;AACX,UAAA,IAAA,CAAK,KAAK,WAAA,CAAa,IAAA,GAAO,QAAA,CAAS,IAAI,IAAK,KAAK,CAAA;AAAA,QACvD;AAAA,MACF;AAGA,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,MAAM,cAAA,GAAA,CACH,UAAU,IAAI,CAAA,IAAK,MACnB,UAAA,CAAW,IAAI,CAAA,IAAK,CAAA,CAAA,IACpB,UAAA,CAAW,IAAI,KAAK,CAAA,CAAA,IACpB,UAAA,CAAW,IAAI,CAAA,IAAK,CAAA,CAAA,IACpB,cAAA,CAAe,IAAI,CAAA,IAAK,CAAA,CAAA,IACxB,QAAA,CAAS,IAAI,CAAA,IAAK,CAAA,CAAA;AAErB,QAAA,MAAM,gBAAA,GAAmB,WAAA,CAAY,SAAA,GAAY,cAAc,CAAA;AAC/D,QAAA,IAAI,mBAAmB,CAAA,EAAG;AACxB,UAAA,MAAM,IAAA,GAAO,WAAA,CAAY,gBAAA,GAAmB,KAAK,CAAA;AACjD,UAAA,IAAI,OAAO,CAAA,EAAG;AACZ,YAAA,KAAA,CAAM,QAAA,GAAA,CAAY,KAAA,CAAM,QAAA,IAAY,CAAA,IAAK,IAAA;AAAA,UAE3C;AAAA,QACF;AAAA,MACF;AAEA,MAAA,MAAM,GAAA,GAAW,EAAE,CAAA,EAAG,KAAA,EAAM;AAC5B,MAAA,IAAI,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,CAAE,SAAS,CAAA,EAAG;AAChC,QAAA,GAAA,CAAI,IAAA,GAAO,IAAA;AAAA,MACb;AAEA,MAAA,GAAA,CAAI,GAAA,CAAI,MAAM,GAAG,CAAA;AAAA,IACnB;AAIA,IAAA,MAAM,UAAA,GAAa,KAAK,UAAA,IAAc,OAAA;AAGtC,IAAA,OAAO,IAAI,IAAI,GAAA,EAAK,UAAA,EAAY,MAAM,UAAU,CAAA,CAAE,OAAA,CAAQ,UAAA,EAAY,IAAI,CAAA;AAAA,EAC5E;AACF,CAAA;;;ACxnBA,IAAM,aAAA,GAAgB,GAAA;AACtB,IAAM,cAAA,GAAiB,GAAA;AAEvB,IAAM,aAAA,GAAgB,GAAA;AAEtB,IAAM,kBAAkB,MAAA,CAAO,gBAAA;AAM/B,IAAM,UAAA,GAAa,GAAA,CAAI,WAAA,CAAY,GAAI,CAAA;AAYhC,SAAS,KAAA,CAAM,UAAA,EAAoB,CAAA,GAAY,CAAA,EAAQ;AAE5D,EAAA,MAAM,UAAU,UAAA,CAAW,OAAA,CAAQ,IAAA,EAAM,EAAE,EAAE,WAAA,EAAY;AAEzD,EAAyB;AACvB,IAAA,MAAM,QAAA,GAAW,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA;AAChC,IAAA,MAAM,MAAA,GAAS,UAAA,CAAW,GAAA,CAAI,QAAQ,CAAA;AACtC,IAAA,IAAI,QAAQ,OAAO,MAAA;AAAA,EACrB;AAEA,EAAA,MAAM,KAAA,GAAQ,CAAC,GAAG,OAAO,CAAA;AAEzB,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,eAAA,CAAgB,OAAO,CAAC,CAAA;AAAA,EACnC,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,IAAI,cAAA;AAAA,MACR,CAAA,8BAAA,EAAiC,UAAU,CAAA,GAAA,EAAM,KAAK,CAAA,CAAA;AAAA,MACtD,EAAE,UAAA,EAAY,KAAA,EAAO,KAAA;AAAM,KAC7B;AAAA,EACF;AAEA,EAAA,MAAA,CAAO,WAAA,GAAc,MAAA,CAAO,WAAA,IAAe,EAAC;AAC5C,EAAA,MAAA,CAAO,UAAA,GAAa,OAAA;AAEpB,EAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,IAAA,MAAM,IAAI,cAAA;AAAA,MACR,CAAA,mBAAA,EAAsB,KAAA,CAAM,CAAC,CAAC,uBAAuB,UAAU,CAAA,CAAA,CAAA;AAAA,MAC/D,EAAE,UAAA;AAAW,KACf;AAAA,EACF;AAEA,EAAA,MAAM,KAAA,GAAQ,OAAO,KAAA,EAAM;AAC3B,EAAA,IAAI,UAAU,CAAA,EAAG;AACf,IAAA,MAAM,IAAI,cAAA;AAAA,MACR,iCAAiC,UAAU,CAAA,uFAAA,CAAA;AAAA,MAC3C,EAAE,UAAA;AAAW,KACf;AAAA,EACF;AACA,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG;AAC3B,IAAA,MAAM,IAAI,cAAA;AAAA,MACR,iCAAiC,UAAU,CAAA,wEAAA,CAAA;AAAA,MAC3C,EAAE,UAAA;AAAW,KACf;AAAA,EACF;AAGA,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,KAAA,CAAM,EAAE,CAAA;AACjC,EAAyB;AAEvB,IAAA,MAAM,QAAA,GAAW,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA;AAChC,IAAA,UAAA,CAAW,GAAA,CAAI,UAAU,SAAS,CAAA;AAAA,EACpC;AAEA,EAAA,OAAO,SAAA;AACT;AAEA,SAAS,4BAAA,CACP,IAAA,EACA,SAAA,EACA,WAAA,EACA,aACA,WAAA,EAC0C;AAC1C,EAAA,IAAA,GAAO,IAAA,CAAK,UAAU,WAAW,CAAA;AACjC,EAAA,WAAA,GAAc,WAAA,CAAY,UAAU,SAAS,CAAA;AAC7C,EAAA,WAAA,CAAY,sBAAA,CAAuB,WAAA,EAAa,IAAA,CAAK,UAAA,EAAY,CAAA;AACjE,EAAA,WAAA,GAAc,WAAA,CAAY,QAAQ,IAAI,CAAA;AACtC,EAAA,OAAO,EAAE,OAAA,EAAS,WAAA,GAAc,SAAA,EAAW,eAAe,WAAA,EAAY;AACxE;AAOA,SAAS,cAAA,CAAe,GAAS,CAAA,EAAe;AAC9C,EAAA,MAAM,MAAA,GAAS,IAAI,IAAA,EAAK;AACxB,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,CAAA,CAAE,gBAAe,EAAG,MAAA,CAAO,SAAA,CAAU,GAAA,EAAK,KAAK,CAAA;AAC1E,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,CAAA,CAAE,cAAA,EAAe,EAAG,MAAA,CAAO,SAAA,CAAU,GAAA,EAAK,CAAC,KAAK,CAAA;AAC3E,EAAA,OAAO,MAAA;AACT;AAOA,IAAM,YAAA,uBAA+C,GAAA,CAAmB;AAAA,EACtE,KAAK,SAAA,CAAU,UAAA;AAAA,EACf,KAAK,SAAA,CAAU,gBAAA;AAAA,EACf,KAAK,SAAA,CAAU,QAAA;AAAA,EACf,KAAK,SAAA,CAAU,aAAA;AAAA,EACf,KAAK,SAAA,CAAU;AACjB,CAAC,CAAA;AAGD,IAAM,QAAA,mBAAuC,IAAI,GAAA,CAAmB,CAAC,IAAA,CAAK,UAAU,EAAA,EAAI,IAAA,CAAK,SAAA,CAAU,EAAE,CAAC,CAAA;AAM1G,SAAS,WAAW,GAAA,EAA4C;AAC9D,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,EAAA;AACJ,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,MAAA,GAAS,GAAG,CAAA,EAAA,EAAK;AACvC,IAAA,MAAM,CAAA,GAAI,IAAI,CAAC,CAAA;AACf,IAAA,IAAI,MAAM,GAAA,EAAK,KAAA,EAAA;AAAA,SAAA,IACN,MAAM,GAAA,EAAK;AAClB,MAAA,IAAI,UAAU,CAAA,EAAG;AACjB,MAAA,KAAA,EAAA;AAAA,IACF,CAAA,MAAA,IAAW,KAAA,KAAU,CAAA,KAAM,CAAA,KAAM,GAAA,IAAO,CAAA,KAAM,GAAA,CAAA,IAAQ,GAAA,CAAI,CAAA,GAAI,CAAC,CAAA,KAAM,GAAA,EAAK;AACxE,MAAA,EAAA,GAAK,IAAI,MAAA,GAAS,CAAA;AAAA,IACpB;AAAA,EACF;AACA,EAAA,OAAO,EAAA;AACT;AAKA,SAAS,eAAA,CAAgB,GAAA,EAAe,CAAA,EAAW,OAAA,GAAU,KAAA,EAAa;AACxE,EAAA,MAAM,IAAA,GAAO,WAAW,GAAG,CAAA;AAC3B,EAAA,MAAM,cAAc,MAAe,OAAA,IAAY,IAAA,KAAS,MAAA,IAAa,IAAI,MAAA,GAAS,IAAA;AAGlF,EAAA,MAAM,gBAAgB,MAAiC;AACrD,IAAA,MAAM,YAAY,WAAA,EAAY;AAC9B,IAAA,MAAM,MAAA,GAAS,eAAe,GAAG,CAAA;AACjC,IAAA,OAAO,WAAW,IAAA,CAAK,SAAA,CAAU,cAAc,SAAA,GAAY,IAAA,CAAK,UAAU,GAAA,GAAM,MAAA;AAAA,EAClF,CAAA;AAEA,EAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,GAAA,EAAK,CAAA,EAAG,aAAa,CAAA;AACjD,EAAA,IAAI,cAAc,OAAO,KAAA,KAAU,WAAW,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA,GAAI,KAAA;AACnE,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,WAAA,CAAY,YAAY,KAAA,GAAQ,IAAA;AAI/D,EAAA,IAAI,SAAS,WAAA,CAAY,WAAA,CAAY,eAAe,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,GAAI,MAAA;AACnE,EAAA,IAAI,KAAK,aAAA,EAAc;AAEvB,EAAA,OAAO,MAAM,IAAA,EAAM;AAGjB,IAAA,MAAM,OAAA,GACJ,EAAA,KAAO,IAAA,CAAK,SAAA,CAAU,gBAAA,IAAoB,WAAA,CAAY,WAAA,CAAY,SAAA,GAAY,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,GAAI,MAAA;AAC/F,IAAA,MAAM,GAAA,GAAM,CAAC,EAAA,CAAG,KAAA,GAAQ,cAAc,GAAA,EAAK,CAAA,EAAG,WAAA,EAAa,CAAA,GAAI,WAAA;AAC/D,IAAA,MAAM,UAAU,OAAA,EAAS,KAAA,CAAM,GAAG,OAAA,CAAQ,MAAA,GAAS,IAAI,MAAM,CAAA;AAC7D,IAAA,MAAM,WAAW,MAAA,EAAQ,KAAA,CAAM,GAAG,MAAA,CAAO,MAAA,GAAS,IAAI,MAAM,CAAA;AAC5D,IAAA,MAAM,MAAA,GAAS,WAAA;AACf,IAAA,IAAI,OAAO,IAAA,CAAK,SAAA,CAAU,SAAS,aAAA,CAAc,MAAA,EAAQ,KAAK,GAAG,CAAA;AAMjE,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI,QAAA,GAAW,CAAA;AACf,IAAA,MAAM,aAAa,GAAA,CAAI,CAAC,MAAM,GAAA,IAAO,GAAA,CAAI,CAAC,CAAA,KAAM,GAAA;AAChD,IAAA,MAAM,eAAe,CAAC,UAAA,IAAc,YAAY,MAAA,IAAa,CAAC,YAAY,WAAA,CAAY,KAAA;AACtF,IAAA,IAAI,cAAc,YAAA,EAAc;AAC9B,MAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,MAAM,OAAA,GAAU,GAAA,CAAI,CAAC,CAAA,KAAM,GAAA;AAC3B,QAAA,IAAI,OAAA,EAAS,WAAA,CAAY,GAAA,EAAK,GAAG,CAAA;AACjC,QAAA,WAAA,CAAY,KAAK,GAAG,CAAA;AACpB,QAAA,WAAA,CAAY,KAAK,GAAG,CAAA;AACpB,QAAA,WAAA,CAAY,KAAK,GAAG,CAAA;AACpB,QAAA,WAAA,CAAY,KAAK,GAAG,CAAA;AACpB,QAAA,IAAI,OAAA,EAAS,KAAA,GAAQ,WAAA,CAAY,GAAA,EAAK,CAAC,CAAA;AAAA,MACzC;AAEA,MAAA,IAAI,WAAA,CAAY,YAAY,KAAA,EAAO;AACjC,QAAA,mBAAA,CAAoB,GAAA,EAAK,KAAK,CAAC,CAAA;AAAA,MACjC,CAAA,MAAO;AACL,QAAA,CAAC,EAAE,IAAA,EAAM,IAAA,EAAM,aAAY,GAAI,SAAA,CAAU,aAAa,KAAK,CAAA;AAE3D,QAAA,QAAA,GAAW,KAAK,KAAA,EAAM;AACtB,QAAA,IAAA,GAAO,EAAA,CAAG,IAAA,CAAK,IAAA,EAAM,UAAA,GAAa,mBAAA,CAAoB,GAAA,EAAK,GAAA,EAAK,CAAC,CAAA,GAAI,WAAA,CAAY,OAAA,EAAU,CAAC,CAAC,CAAA;AAE7F,QAAA,QAAA,GAAW,IAAA,IAAQ,QAAA,GAAW,IAAA,CAAK,KAAA,KAAU,QAAA,GAAW,CAAA;AAAA,MAC1D;AAAA,IACF;AAGA,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI,QAAA,GAAW,CAAA;AACf,IAAA,IAAI,GAAA,CAAI,CAAC,CAAA,KAAM,GAAA,EAAK;AAClB,MAAA,WAAA,CAAY,KAAK,GAAG,CAAA;AACpB,MAAA,WAAA,CAAY,KAAK,GAAG,CAAA;AACpB,MAAA,WAAA,CAAY,KAAK,GAAG,CAAA;AACpB,MAAA,WAAA,CAAY,KAAK,GAAG,CAAA;AAEpB,MAAA,IAAA,GAAO,IAAI,IAAA,EAAK;AAChB,MAAA,MAAM,GAAA,GAAM,YAAY,OAAA,EAAQ;AAChC,MAAA,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA,GAAI,GAAA,GAAM,GAAG,WAAA,CAAY,GAAA,CAAI,GAAG,CAAC,CAAA;AAEtD,MAAA,QAAA,GAAW,KAAK,KAAA,EAAM;AACtB,MAAA,WAAA,GAAc,WAAA,CAAY,WAAW,GAAG,CAAA;AACxC,MAAA,IAAA,GAAO,GAAG,IAAA,CAAK,IAAA,EAAM,oBAAoB,GAAA,EAAK,GAAA,EAAK,CAAC,CAAC,CAAA;AACrD,MAAA,QAAA,GAAW,IAAA,IAAQ,QAAA,GAAW,IAAA,CAAK,KAAA,KAAU,QAAA,GAAW,CAAA;AAAA,IAC1D;AAGA,IAAA,IAAI,EAAA;AACJ,IAAA,IAAI,MAAA,GAAS,CAAA;AAEb,IAAA,IAAI,GAAA,CAAI,MAAA,IAAU,CAAA,IAAK,GAAA,CAAI,CAAC,MAAM,GAAA,IAAO,GAAA,CAAI,CAAC,CAAA,KAAM,GAAA,EAAK;AACvD,MAAA,WAAA,CAAY,KAAK,GAAG,CAAA;AACpB,MAAA,WAAA,CAAY,KAAK,GAAG,CAAA;AAEpB,MAAA,EAAA,GAAK,IAAI,IAAA,EAAK;AACd,MAAA,MAAM,GAAA,GAAM,YAAY,OAAA,EAAQ;AAChC,MAAA,EAAA,CAAG,SAAA,CAAU,MAAM,CAAA,GAAI,GAAA,GAAM,GAAG,WAAA,CAAY,GAAA,CAAI,GAAG,CAAC,CAAA;AAEpD,MAAA,MAAM,UAAA,GAAa,GAAG,KAAA,EAAM;AAC5B,MAAA,WAAA,GAAc,WAAA,CAAY,WAAW,GAAG,CAAA;AAExC,MAAA,EAAA,GAAK,EAAA,CAAG,IAAA,CAAK,EAAA,EAAI,mBAAA,CAAoB,GAAA,EAAK,KAAK,CAAC,CAAC,CAAA,CAAE,eAAA,CAAgB,CAAC,CAAA;AAEpE,MAAA,MAAM,SAAA,GAAY,EAAA,GAAK,EAAA,CAAG,KAAA,EAAM,GAAI,CAAA;AACpC,MAAA,MAAA,GAAS,UAAA,GAAa,YAAY,UAAA,GAAa,CAAA;AAAA,IACjD;AAGA,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI,QAAA,GAAW,CAAA;AAEf,IAAA,IAAI,GAAA,CAAI,CAAC,CAAA,KAAM,GAAA,EAAK;AAClB,MAAA,WAAA,CAAY,KAAK,GAAG,CAAA;AACpB,MAAA,WAAA,CAAY,KAAK,GAAG,CAAA;AACpB,MAAA,WAAA,CAAY,KAAK,GAAG,CAAA;AACpB,MAAA,WAAA,CAAY,KAAK,GAAG,CAAA;AAEpB,MAAA,IAAA,GAAO,IAAI,IAAA,EAAK;AAChB,MAAA,MAAM,GAAA,GAAM,YAAY,OAAA,EAAQ;AAChC,MAAA,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA,GAAI,GAAA,GAAM,GAAG,WAAA,CAAY,GAAA,CAAI,GAAG,CAAC,CAAA;AAEtD,MAAA,QAAA,GAAW,KAAK,KAAA,EAAM;AACtB,MAAA,WAAA,GAAc,WAAA,CAAY,WAAW,GAAG,CAAA;AAExC,MAAA,IAAA,GAAO,GAAG,IAAA,CAAK,IAAA,EAAM,oBAAoB,GAAA,EAAK,GAAA,EAAK,CAAC,CAAC,CAAA;AACrD,MAAA,QAAA,GAAW,IAAA,IAAQ,QAAA,GAAW,IAAA,CAAK,KAAA,KAAU,QAAA,GAAW,CAAA;AAAA,IAC1D;AAEA,IAAA,IAAI,IAAA,GAAO,YAAY,KAAA,EAAM;AAE7B,IAAA,MAAM,SAAS,IAAA,KAAS,MAAA,IAAa,SAAS,MAAA,IAAa,EAAA,KAAO,UAAa,IAAA,KAAS,MAAA;AACxF,IAAA,MAAM,QAAA,GAAW,iBAAiB,WAAW,CAAA;AAC7C,IAAA,MAAM,OAAA,GAAU,WAAA;AAChB,IAAA,IAAI,CAAC,MAAA,IAAU,QAAA,IAAY,YAAA,CAAa,GAAA,CAAI,EAAE,CAAA,EAAG;AAC/C,MAAA,WAAA,GAAc,cAAA,CAAe,WAAA,EAAa,EAAA,EAAI,GAAA,EAAK,UAAU,CAAC,CAAA;AAAA,IAChE,CAAA,MAAO;AACL,MAAA,WAAA,GAAc,EAAA,CAAG,IAAA,CAAK,WAAA,EAAa,GAAG,CAAA;AAAA,IACxC;AAEA,IAAA,IAAI,QAAQ,WAAA,CAAY,SAAA,IAAa,YAAA,CAAa,GAAA,CAAI,EAAE,CAAA,EAAG;AACzD,MAAA,WAAA,CAAY,sBAAA,CAAuB,UAAA,EAAY,EAAA,CAAG,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,CAAC,CAAA,EAAG,GAAG,CAAA,CAAE,UAAA,EAAY,CAAA;AAAA,IACjG;AAGA,IAAA,IAAI,CAAC,OAAA,CAAQ,WAAA,CAAY,SAAA,IAAa,YAAA,CAAa,GAAA,CAAI,EAAE,CAAA,KAAM,OAAA,KAAY,MAAA,IAAa,OAAA,CAAQ,WAAA,CAAY,aAAA,CAAA,EAAgB;AAC1H,MAAA,WAAA,CAAY,YAAY,aAAA,GAAgB,IAAA;AACxC,MAAA,MAAM,MAAA,GAAS,gBAAA,CAAiB,OAAA,EAAS,EAAA,EAAI,GAAG,CAAA;AAChD,MAAA,IAAI,MAAA,GAAS,GAAG,WAAA,CAAY,sBAAA,CAAuB,OAAO,EAAE,CAAA,EAAG,QAAQ,CAAA;AAAA,IACzE,CAAA,MAAA,IAAW,EAAA,KAAO,IAAA,CAAK,SAAA,CAAU,OAAA,IAAW,OAAO,GAAA,KAAQ,QAAA,IAAY,GAAA,CAAI,WAAA,CAAY,aAAA,EAAe;AAEpG,MAAA,WAAA,CAAY,YAAY,aAAA,GAAgB,IAAA;AACxC,MAAA,MAAM,MAAA,GAAS,QAAQ,eAAA,CAAgB,KAAA,EAAO,CAAC,CAAA,GAAI,GAAA,CAAI,eAAA,CAAgB,KAAA,EAAO,CAAC,CAAA;AAC/E,MAAA,IAAI,MAAA,GAAS,GAAG,WAAA,CAAY,sBAAA,CAAuB,OAAO,EAAE,CAAA,EAAG,QAAQ,CAAA;AAAA,IACzE;AAEA,IAAA,MAAM,KAAA,GAAQ,OAAO,IAAA,CAAK,SAAA,CAAU,WAAW,OAAO,GAAA,KAAQ,QAAA,IAAY,GAAA,CAAI,WAAA,CAAY,SAAA;AAC1F,IAAA,IAAI,OAAO,IAAA,CAAK,SAAA,CAAU,MAAM,KAAA,EAAO,WAAA,CAAY,YAAY,SAAA,GAAY,IAAA;AAC3E,IAAA,iBAAA,CAAkB,MAAA,EAAQ,EAAA,EAAI,GAAA,EAAK,WAAA,EAAa,MAAM,CAAA;AACtD,IAAA,IAAA,GAAO,IAAA,GAAO,WAAA,CAAY,KAAA,EAAM,GAAI,IAAA,GAAO,CAAA;AAG3C,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,MAAM,MAAA,GAAS,4BAAA;AAAA,QACb,IAAA;AAAA,QACA,QAAA;AAAA,QACA,MAAA;AAAA,QACA,IAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,IAAA,GAAO,MAAA,CAAO,OAAA;AACd,MAAA,WAAA,GAAc,MAAA,CAAO,aAAA;AAAA,IACvB;AAEA,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,MAAM,MAAA,GAAS,4BAAA;AAAA,QACb,IAAA;AAAA,QACA,QAAA;AAAA,QACA,UAAA;AAAA,QACA,IAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,IAAA,GAAO,MAAA,CAAO,OAAA;AACd,MAAA,WAAA,GAAc,MAAA,CAAO,aAAA;AAAA,IACvB;AAEA,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,MAAM,MAAA,GAAS,4BAAA;AAAA,QACb,IAAA;AAAA,QACA,QAAA;AAAA,QACA,YAAA;AAAA,QACA,IAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,IAAA,GAAO,MAAA,CAAO,OAAA;AACd,MAAA,WAAA,GAAc,MAAA,CAAO,aAAA;AAAA,IACvB;AAEA,IAAA,IAAI,EAAA,EAAI;AACN,MAAA,MAAM,MAAA,GAAS,4BAAA;AAAA,QACb,EAAA;AAAA,QACA,MAAA;AAAA,QACA,IAAA;AAAA,QACA,IAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,IAAA,GAAO,MAAA,CAAO,OAAA;AACd,MAAA,WAAA,GAAc,MAAA,CAAO,aAAA;AAAA,IACvB;AAEA,IAAA,IAAI,cAAc,WAAA,CAAY,WAAA,CAAY,YAAA,GAAe,EAAE,SAAS,OAAA,EAAS;AAC7E,IAAA,MAAA,GAAS,YAAY,WAAA,CAAY,YAAA,GAAe,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,GAAI,MAAA;AAC/D,IAAA,EAAA,GAAK,aAAA,EAAc;AAAA,EACrB;AAEA,EAAA,OAAO,WAAA;AACT;AAGA,SAAS,aAAa,KAAA,EAA8B;AAClD,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,CAAA;AACtC,EAAA,MAAM,EAAE,SAAA,EAAW,cAAA,EAAe,GAAI,KAAA,CAAM,WAAA;AAC5C,EAAA,OAAO,SAAA,GAAY,SAAA,CAAU,KAAA,GAAS,cAAA,IAAkB,CAAA;AAC1D;AAOA,SAAS,QAAA,CAAS,OAAe,KAAA,EAAwB;AACvD,EAAA,IAAI,KAAA,KAAU,OAAO,OAAO,KAAA;AAC5B,EAAA,IAAI,KAAA,KAAU,EAAA,IAAM,KAAA,KAAU,EAAA,SAAW,KAAA,KAAU,EAAA;AACnD,EAAA,OAAO,KAAA,GAAQ,KAAA;AACjB;AAGA,SAAS,UAAU,GAAA,EAAsB;AACvC,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,IAAI,OAAA,EAAQ;AAAA,IACnB,IAAA,EAAM,IAAA;AAAA,IACN,KAAA,EAAO,CAAC,IAAA,KAAS;AACf,MAAA,MAAM,KAAA,GAAQ,IAAI,IAAA,EAAK;AACvB,MAAA,MAAM,MAAA,GAAS,GAAA,CAAI,GAAA,CAAI,IAAI,CAAA;AAC3B,MAAA,IAAI,MAAA,EAAQ,KAAA,CAAM,OAAA,CAAQ,IAAA,EAAM,MAAM,CAAA;AACtC,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,GACF;AACF;AAGA,SAAS,QAAQ,KAAA,EAA4B;AAC3C,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AACtC,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA;AAChC,EAAA,MAAA,CAAO,YAAY,KAAA,GAAQ,IAAA;AAC3B,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,WAAW,KAAA,EAAuC;AACzD,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,CAAC,OAAA,CAAQ,KAAK,CAAC,CAAA,GAAK,KAAA,CAAM,WAAA,CAAY,QAAA,IAAY,CAAC,KAAK,CAAA;AAC7F;AAEA,IAAM,mBAAmB,CAAC,KAAA,KACxB,OAAO,KAAA,KAAU,YAAY,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,0BAAA,EAA4B,CAAA,CAAE,IAAA,CAAK,CAAC,KAAA,KAAU,UAAU,KAAK,CAAA;AAE9G,IAAM,MAAA,GAAS,CAAC,KAAA,KAAkC,OAAO,UAAU,QAAA,IAAY,KAAA,CAAM,YAAY,SAAA,KAAc,IAAA;AAS/G,SAAS,aAAA,CAAc,IAAA,EAAY,KAAA,EAAsB,IAAA,EAA+B;AACtF,EAAA,IAAI,gBAAA,CAAiB,IAAI,CAAA,IAAK,gBAAA,CAAiB,KAAK,CAAA,EAAG;AACrD,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KAEF;AAAA,EACF;AACA,EAAA,IAAI,MAAA,CAAO,IAAI,CAAA,KAAM,MAAA,CAAO,KAAK,CAAA,EAAG;AAClC,IAAA,MAAM,IAAI,MAAM,wGAAwG,CAAA;AAAA,EAC1H;AACA,EAAA,MAAM,CAAC,IAAA,EAAM,KAAK,CAAA,GAAI,IAAA;AACtB,EAAA,IAAI,IAAA,KAAS,GAAA,IAAO,IAAA,KAAS,GAAA,IAAO,IAAA,KAAS,GAAA,IAAO,IAAA,KAAS,GAAA,IAAQ,IAAA,KAAS,GAAA,IAAO,KAAA,KAAU,GAAA,EAAM;AACnG,IAAA,MAAM,IAAI,MAAM,qGAAqG,CAAA;AAAA,EACvH;AACF;AAoBA,SAAS,iBAAA,CAAkB,MAAA,EAAc,EAAA,EAAmB,GAAA,EAAoB,OAAa,MAAA,EAAuB;AAClH,EAAA,MAAM,OAAO,KAAA,CAAM,WAAA;AACnB,EAAA,OAAO,IAAA,CAAK,SAAA;AACZ,EAAA,OAAO,IAAA,CAAK,cAAA;AACZ,EAAA,OAAO,IAAA,CAAK,KAAA;AACZ,EAAA,OAAO,IAAA,CAAK,QAAA;AACZ,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA;AAC5B,EAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,WAAA,CAAY,KAAA,KAAU,IAAA,IAAQ,OAAO,GAAA,KAAQ,QAAA,IAAY,GAAA,CAAI,WAAA,CAAY,KAAA,CAAA,EAAQ;AACrG,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AAAA,EACf;AAEA,EAAA,MAAM,KAAA,GACJ,MAAA,CAAO,WAAA,CAAY,QAAA,KAAa,MAAA,IAC/B,CAAC,IAAA,IAAQ,OAAO,GAAA,KAAQ,QAAA,IAAY,GAAA,CAAI,WAAA,CAAY,QAAA,KAAa,MAAA;AACpE,EAAA,IAAI,CAAC,MAAA,IAAU,EAAA,KAAO,IAAA,CAAK,UAAU,OAAA,EAAS;AAC5C,IAAA,IAAA,CAAK,QAAA,GAAW,CAAC,GAAG,UAAA,CAAW,MAAM,CAAA,EAAG,GAAG,UAAA,CAAW,GAAG,CAAC,CAAA;AAAA,EAC5D,WAAW,CAAC,MAAA,IAAU,SAAS,EAAA,KAAO,IAAA,CAAK,UAAU,MAAA,EAAQ;AAE3D,IAAA,MAAMC,UAAAA,GAAY,EAAA,KAAO,IAAA,CAAK,SAAA,CAAU,SAAA;AACxC,IAAA,MAAM,MAAA,GAASA,UAAAA,GAAY,IAAA,CAAK,SAAA,CAAU,GAAA,GAAM,EAAA;AAChD,IAAA,MAAM,KAAA,GAAQ,WAAW,MAAM,CAAA;AAC/B,IAAA,MAAM,MAAA,GAASA,UAAAA,GAAY,KAAA,GAAQ,IAAA,GAAO,CAAC,QAAQ,GAAG,CAAC,CAAA,GAAI,UAAA,CAAW,GAAG,CAAA;AACzE,IAAA,IAAA,CAAK,WAAW,KAAA,CAAM,OAAA;AAAA,MAAQ,CAAC,IAAA,KAC7B,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,KAAU;AACpB,QAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA;AACpC,QAAA,iBAAA,CAAkB,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,KAAK,CAAA;AAClD,QAAA,OAAO,IAAA;AAAA,MACT,CAAC;AAAA,KACH;AAAA,EACF;AACA,EAAA,IAAI,KAAK,QAAA,EAAU;AACjB,IAAA,eAAA,CAAgB,KAAA,EAAO,KAAK,QAAQ,CAAA;AACpC,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,KAAA,GAAQ,OAAO,WAAA,CAAY,SAAA;AACjC,EAAA,MAAM,WAAW,OAAO,GAAA,KAAQ,YAAY,IAAA,GAAO,MAAA,GAAY,IAAI,WAAA,CAAY,SAAA;AAC/E,EAAA,MAAM,KAAA,GAAQ,aAAa,MAAM,CAAA;AACjC,EAAA,MAAM,QAAA,GAAW,IAAA,GAAO,CAAA,GAAI,YAAA,CAAa,GAAG,CAAA;AAC5C,EAAA,MAAM,WAAW,EAAA,KAAO,IAAA,CAAK,UAAU,GAAA,IAAO,EAAA,KAAO,KAAK,SAAA,CAAU,GAAA;AACpE,EAAA,MAAM,GAAA,GAAM,KAAA,KAAU,MAAA,IAAa,QAAA,CAAS,OAAO,QAAQ,CAAA;AAC3D,EAAA,MAAM,QAAA,GAAW,MAAM,KAAA,GAAQ,QAAA,IAAY,SAAS,QAAA,EAAU,KAAK,IAAI,QAAA,GAAW,MAAA;AAElF,EAAA,IAAI,MAAA,EAAQ,CAEZ,MAAA,IAAW,OAAO,IAAA,CAAK,SAAA,CAAU,aAAa,EAAA,KAAO,IAAA,CAAK,UAAU,MAAA,EAAQ;AAC1E,IAAA,IAAI,KAAA,EAAO,IAAA,EAAM,IAAA,CAAK,SAAA,GAAY,UAAU,KAAK,CAAA;AAAA,EACnD,WAAW,QAAA,IAAY,KAAA,EAAO,QAAQ,QAAA,EAAU,IAAA,IAAQ,UAAU,QAAA,EAAU;AAC1E,IAAA,IAAA,CAAK,SAAA,GAAY,UAAU,KAAK,CAAA;AAAA,EAClC,WAAW,QAAA,EAAU;AACnB,IAAA,MAAM,KAAA,GAAQ,GAAA,GAAM,CAAC,KAAA,KAAgB,GAAG,IAAA,CAAK,KAAA,EAAO,GAAG,CAAA,GAAI,CAAC,KAAA,KAAgB,EAAA,CAAG,IAAA,CAAK,QAAQ,KAAK,CAAA;AACjG,IAAA,MAAM,OAAO,QAAA,GAAW,CAAC,UAAgB,QAAA,CAAS,KAAA,EAAO,KAAK,CAAA,GAAI,KAAA;AAClE,IAAA,IAAA,CAAK,SAAA,GAAY,EAAE,KAAA,EAAO,QAAA,CAAS,OAAO,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,CAAC,SAAS,IAAA,CAAK,QAAA,CAAS,KAAA,CAAM,IAAI,CAAC,CAAA,EAAE;AAAA,EACrG;AACA,EAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,QAAA,EAAU,KAAK,IAAI,QAAA,GAAW,KAAA;AACnD,IAAA,IAAI,GAAA,GAAM,CAAA,EAAG,IAAA,CAAK,cAAA,GAAiB,GAAA;AAAA,EACrC;AACF;AAOA,SAAS,eAAA,CAAgB,OAAa,QAAA,EAAiC;AACrE,EAAA,MAAM,QAAQ,QAAA,CAAS,MAAA,CAAO,CAAC,GAAA,EAAK,WAAY,QAAA,CAAS,YAAA,CAAa,MAAM,CAAA,EAAG,GAAG,CAAA,GAAI,YAAA,CAAa,MAAM,CAAA,GAAI,KAAM,CAAC,CAAA;AACpH,EAAA,IAAI,UAAU,CAAA,EAAG;AACjB,EAAA,MAAM,SAAsB,EAAC;AAC7B,EAAA,KAAA,MAAW,UAAU,QAAA,EAAU;AAC7B,IAAA,IAAI,YAAA,CAAa,MAAM,CAAA,KAAM,KAAA,EAAO;AACpC,IAAA,MAAM,KAAA,GAAQ,OAAO,WAAA,CAAY,SAAA;AACjC,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,KAAA,CAAM,YAAY,cAAA,GAAiB,KAAA;AACnC,MAAA;AAAA,IACF;AACA,IAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,EACnB;AACA,EAAA,KAAA,CAAM,YAAY,SAAA,GAAY;AAAA,IAC5B,KAAA;AAAA,IACA,IAAA,EAAM,MAAA,CAAO,MAAA,KAAW,QAAA,CAAS,MAAA,IAAU,OAAO,KAAA,CAAM,CAAC,KAAA,KAAU,KAAA,CAAM,IAAI,CAAA;AAAA,IAC7E,KAAA,EAAO,CAAC,IAAA,KAAS;AACf,MAAA,MAAM,KAAA,GAAQ,IAAI,IAAA,EAAK;AACvB,MAAA,KAAA,MAAW,SAAS,MAAA,EAAQ,KAAA,CAAM,eAAe,KAAA,CAAM,KAAA,CAAM,IAAI,CAAC,CAAA;AAClE,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,GACF;AACF;AAMA,SAAS,QAAA,CAAS,OAAa,KAAA,EAAmC;AAChE,EAAA,MAAM,MAAA,GAAS,IAAI,IAAA,EAAK;AACxB,EAAA,KAAA,MAAW,CAAC,KAAA,EAAO,KAAK,CAAA,IAAK,KAAA,CAAM,gBAAe,EAAG;AACnD,IAAA,MAAM,IAAA,GAAO,IAAI,IAAA,EAAK;AACtB,IAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,KAAK,CAAA;AACzB,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAI,CAAA,CAAE,IAAI,KAAK,CAAA;AAClC,IAAA,IAAI,IAAA,EAAM,MAAA,CAAO,SAAA,CAAU,KAAA,EAAO,IAAI,CAAA;AAAA,EACxC;AACA,EAAA,OAAO,MAAA;AACT;AAYA,SAAS,SAAA,CAAU,OAAa,KAAA,EAA2C;AACzE,EAAA,IAAI,UAAU,CAAA,EAAG;AACf,IAAA,MAAM,IAAA,GAAO,IAAI,IAAA,EAAK;AACtB,IAAA,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,MAAM,cAAA,CAAe,KAAA,EAAO,IAAI,CAAA,EAAE;AAAA,EACzD;AACA,EAAA,MAAM,KAAA,GAAQ,MAAM,WAAA,CAAY,SAAA;AAChC,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KAGF;AAAA,EACF;AACA,EAAA,MAAM,EAAE,OAAM,GAAI,KAAA;AAClB,EAAA,IAAI,QAAQ,KAAA,EAAO;AAEjB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,KAAA,EAAQ,KAAK,CAAA,oBAAA,EAAuB,KAAK,CAAA,+BAAA,CAAiC,CAAA;AAAA,EAC5F;AACA,EAAA,IAAI,IAAA,GAAO,IAAI,IAAA,EAAK;AACpB,EAAA,KAAA,IAAS,IAAA,GAAO,KAAA,EAAO,IAAA,GAAO,KAAA,GAAQ,KAAA,EAAO,IAAA,EAAA,EAAQ,IAAA,CAAK,cAAA,CAAe,KAAA,CAAM,KAAA,CAAM,IAAI,CAAC,CAAA;AAC1F,EAAA,MAAM,IAAA,GAAO,cAAA,CAAe,KAAA,EAAO,IAAI,CAAA;AACvC,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA;AACzB,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,IAAA,GAAO,IAAA,CAAK,WAAW,CAAC,CAAA;AACxB,IAAA,IAAA,CAAK,SAAA,CAAU,GAAG,MAAM,CAAA;AAAA,EAC1B;AACA,EAAA,OAAO,EAAE,MAAM,IAAA,EAAK;AACtB;AASA,SAAS,WAAA,CAAY,MAAc,CAAA,EAAiB;AAClD,EAAA,IAAI,OAAA,GAAU,IAAA;AACd,EAAA,IAAI;AAEF,IAAA,OAAA,GAAU,eAAA,CAAgB,KAAK,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAC,CAAC,GAAG,CAAC,CAAA;AAAA,EAC5D,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,EAAE,KAAA,YAAiB,2BAAA,CAAA,EAA8B,MAAM,KAAA;AAAA,EAC7D;AACA,EAAA,MAAM,KAAA,GAAQ,CAAC,GAAG,OAAO,CAAA;AACzB,EAAA,MAAM,OAAA,GAAU,eAAA,CAAgB,KAAA,EAAO,CAAC,CAAA;AACxC,EAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,IAAA,MAAM,IAAI,MAAM,CAAA,kBAAA,EAAqB,KAAA,CAAM,CAAC,CAAC,CAAA,uBAAA,EAA0B,OAAO,CAAA,CAAA,CAAG,CAAA;AAAA,EACnF;AACA,EAAA,OAAO,OAAA;AACT;AAQA,SAAS,cAAA,CACP,QAAA,EACA,EAAA,EACA,GAAA,EACA,UACA,CAAA,EACM;AACN,EAAA,MAAM,QAAA,GAAW,SAAS,WAAA,CAAY,YAAA;AACtC,EAAA,MAAM,WAAW,OAAO,GAAA,KAAQ,QAAA,GAAW,CAAA,GAAI,IAAI,KAAA,EAAM;AACzD,EAAA,MAAM,MAAA,GAAS,IAAI,IAAA,EAAK;AACxB,EAAA,IAAI,IAAA,GAAO,QAAA;AACX,EAAA,IAAI,OAAA;AACJ,EAAA,KAAA,MAAW,CAAC,OAAO,YAAY,CAAA,IAAK,OAAO,OAAA,CAAQ,QAAA,CAAS,0BAAA,EAA4B,CAAA,EAAG;AACzF,IAAA,IAAI,KAAA,KAAU,KAAA,IAAS,YAAA,KAAiB,MAAA,EAAW;AACnD,IAAA,MAAM,IAAA,GAAO,IAAI,IAAA,EAAK;AACtB,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,KAAK,CAAA,IAAK,MAAA,CAAO,OAAA,CAAQ,YAAY,CAAA,EAAG,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,IAAI,GAAG,KAAK,CAAA;AAC5F,IAAA,IAAA,GAAO,cAAA,CAAe,MAAM,IAAI,CAAA;AAChC,IAAA,IAAI,OAAA;AACJ,IAAA,IAAI,KAAA,KAAU,MAAA,IAAU,QAAA,IAAY,QAAA,KAAa,MAAA,EAAW;AAC1D,MAAA,OAAA,GAAU,SAAS,OAAA,GAAU,QAAA;AAC7B,MAAA,MAAM,OAAA,GAAU,WAAA,CAAY,OAAA,EAAS,CAAC,CAAA;AAEtC,MAAA,OAAA,GAAU,OAAA,CAAQ,UAAW,IAAA,CAAK,KAAA,KAAU,QAAA,GAAY,OAAA,CAAQ,OAAO,CAAA;AAAA,IACzE,CAAA,MAAO;AACL,MAAA,OAAA,GAAU,EAAA,CAAG,IAAA,CAAK,IAAA,EAAM,GAAG,CAAA;AAAA,IAC7B;AACA,IAAA,MAAA,CAAO,eAAe,OAAO,CAAA;AAC7B,IAAA,MAAA,CAAO,sBAAA,CAAuB,KAAA,EAAsB,OAAA,CAAQ,UAAA,EAAY,CAAA;AAAA,EAC1E;AACA,EAAA,MAAA,CAAO,cAAA,CAAe,EAAA,CAAG,IAAA,CAAK,IAAA,EAAM,GAAG,CAAC,CAAA;AACxC,EAAA,IAAI,QAAA,CAAS,WAAA,CAAY,SAAA,EAAW,MAAA,CAAO,YAAY,SAAA,GAAY,IAAA;AACnE,EAAA,IAAI,YAAY,MAAA,EAAW,MAAA,CAAO,WAAA,CAAY,YAAA,GAAe,EAAE,OAAA,EAAQ;AACvE,EAAA,OAAO,MAAA;AACT;AAMA,SAAS,gBAAA,CAAiB,OAAA,EAAe,EAAA,EAAmB,GAAA,EAA4B;AACtF,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,KAAA,MAAW,CAAC,MAAM,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,OAAA,CAAQ,wBAAA,EAA0B,CAAA,EAAG;AAC9E,IAAA,IAAI,EAAE,QAAQ,CAAA,CAAA,EAAI;AAClB,IAAA,MAAM,GAAA,GAAM,IAAI,IAAA,EAAK;AACrB,IAAA,GAAA,CAAI,OAAA,CAAQ,MAAA,CAAO,IAAI,CAAA,EAAG,KAAK,CAAA;AAC/B,IAAA,MAAA,IAAU,GAAG,IAAA,CAAK,GAAA,EAAK,GAAG,CAAA,CAAE,IAAI,CAAC,CAAA;AAAA,EACnC;AACA,EAAA,OAAO,MAAA;AACT;AAMA,SAAS,aAAA,CAAc,CAAA,EAAa,CAAA,EAAW,OAAA,GAAU,KAAA,EAAsB;AAC7E,EAAA,IAAI,CAAA,CAAE,CAAC,CAAA,KAAM,GAAA,EAAK;AAChB,IAAA,CAAA,CAAE,KAAA,EAAM;AACR,IAAA,MAAM,OAAA,GAAU,aAAA,CAAc,CAAA,EAAG,CAAA,EAAG,OAAO,CAAA;AAC3C,IAAA,IAAI,OAAO,OAAA,KAAY,QAAA,EAAU,OAAO,CAAA,GAAI,OAAA;AAC5C,IAAA,MAAM,IAAA,GAAO,QAAQ,CAAC,CAAA;AACtB,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA;AACrC,IAAA,iBAAA,CAAkB,MAAM,IAAA,CAAK,SAAA,CAAU,QAAA,EAAU,OAAA,EAAS,SAAS,KAAK,CAAA;AACxE,IAAA,OAAO,OAAA;AAAA,EACT;AAEA,EAAA,IAAI,MAAA,GAAS,qBAAA,CAAsB,CAAA,EAAG,CAAA,EAAG,OAAO,CAAA;AAChD,EAAA,IAAI,WAAW,MAAA,EAAW;AACxB,IAAA,MAAM,EAAA,GAAK,CAAA,CAAE,MAAA,KAAW,CAAA,GAAI,2BAAA,GAA8B,CAAA,CAAA,EAAI,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC,CAAA,CAAA,CAAA;AACrF,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2CAAA,EAA8C,EAAE,CAAA,CAAE,CAAA;AAAA,EACpE;AAEA,EAAA,KAAA,IAAS,IAAA,GAAO,qBAAA,CAAsB,CAAA,EAAG,CAAA,EAAG,OAAO,CAAA,EAAG,IAAA,KAAS,MAAA,EAAW,IAAA,GAAO,qBAAA,CAAsB,CAAA,EAAG,CAAA,EAAG,OAAO,CAAA,EAAG;AACrH,IAAA,MAAA,GAAS,kBAAA,CAAmB,QAAQ,IAAI,CAAA;AAAA,EAC1C;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,kBAAA,CAAmB,IAAmB,EAAA,EAAyB;AAEtE,EAAA,MAAM,KAAA,GAAA,CACH,OAAO,EAAA,KAAO,QAAA,IAAY,EAAA,CAAG,WAAA,CAAY,KAAA,MAAW,OAAO,EAAA,KAAO,QAAA,IAAY,EAAA,CAAG,WAAA,CAAY,KAAA,CAAA;AAChG,EAAA,IAAI,OAAO,EAAA,KAAO,QAAA,EAAU,EAAA,GAAK,IAAA,CAAK,OAAO,EAAE,CAAA;AAC/C,EAAA,IAAI,OAAO,EAAA,KAAO,QAAA,EAAU,EAAA,GAAK,IAAA,CAAK,OAAO,EAAE,CAAA;AAE/C,EAAA,MAAM,MAAA,GAAS,IAAI,IAAA,EAAK;AAIxB,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAkB;AACpC,EAAA,IAAI,MAAA,GAAS,CAAA;AAEb,EAAA,MAAM,EAAE,IAAA,EAAK,GAAI,EAAA,CAAG,WAAA;AACpB,EAAA,KAAA,MAAW,GAAA,IAAO,EAAA,CAAG,IAAA,EAAK,EAAG;AAC3B,IAAA,MAAM,IAAA,GAAO,OAAO,QAAA,CAAS,EAAA,EAAI,KAAK,IAAI,CAAA,GAAI,YAAA,CAAa,GAAA,EAAK,EAAE,CAAA;AAElE,IAAA,MAAA,IAAU,KAAK,KAAA,EAAM;AACrB,IAAA,KAAA,CAAM,GAAA,CAAI,KAAK,IAAI,CAAA;AAAA,EACrB;AAIA,EAAA,MAAM,QAAQ,MAAA,IAAU,eAAA;AACxB,EAAA,KAAA,MAAW,CAAC,CAAA,EAAG,IAAI,CAAA,IAAK,KAAA,EAAO;AAC7B,IAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,GAAA,CAAI,CAAC,CAAA;AACtB,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,CAAK,SAAA,CAAA,CAAY,KAAA,GAAQ,MAAA,GAAS,KAAK,KAAA,GAAS,IAAA,CAAK,KAAA,EAAO,CAAC,CAAA;AAAA,EACrF;AAEA,EAAA,MAAA,CAAO,WAAA,CAAY,SAAS,EAAC;AAI7B,EAAA,MAAM,CAAC,IAAA,EAAM,GAAG,IAAI,CAAA,GAAI,GAAG,IAAA,EAAK;AAChC,EAAA,MAAM,EAAE,SAAA,EAAU,GAAI,EAAA,CAAG,WAAA;AACzB,EAAA,MAAM,KAAA,GAAQ,SAAS,MAAA,GAAY,IAAA,GAAO,KAAK,GAAA,CAAI,IAAA,EAAM,KAAK,IAAI,CAAA;AAClE,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,YAAA,CAAa,EAAE,CAAA,EAAG,YAAA,CAAa,EAAE,CAAC,CAAA,GAAI,YAAA,CAAa,EAAE,CAAA,GAAI,aAAa,EAAE,CAAA;AAC/F,EAAA,IAAI,UAAU,CAAA,IAAK,IAAA,CAAK,MAAA,KAAW,CAAA,IAAK,WAAW,IAAA,EAAM;AACvD,IAAA,MAAA,CAAO,WAAA,CAAY,SAAA,GAAY,SAAA,CAAU,MAAM,CAAA;AAAA,EACjD,CAAA,MAAA,IAAW,QAAQ,CAAA,EAAG;AACpB,IAAA,MAAA,CAAO,YAAY,cAAA,GAAiB,KAAA;AAAA,EACtC;AACA,EAAA,IAAI,KAAA,EAAO,MAAA,CAAO,WAAA,CAAY,KAAA,GAAQ,IAAA;AACtC,EAAA,OAAO,MAAA;AACT;AAGA,SAAS,kBAAkB,CAAA,EAAiB;AAC1C,EAAA,IAAI,CAAC,MAAA,CAAO,SAAA,CAAU,CAAC,CAAA,IAAK,IAAI,CAAA,EAAG;AACjC,IAAA,MAAM,IAAI,cAAA,CAAe,CAAA,oEAAA,EAAuE,CAAC,CAAA,CAAE,CAAA;AAAA,EACrG;AACA,EAAA,IAAI,IAAI,cAAA,EAAgB;AACtB,IAAA,MAAM,IAAI,cAAA;AAAA,MACR,CAAA,WAAA,EAAc,CAAC,CAAA,wBAAA,EAA2B,cAAc,CAAA;AAAA,KAC1D;AAAA,EACF;AACF;AAEA,SAAS,YAAA,CAAa,GAAWH,EAAAA,EAAe;AAC9C,EAAA,iBAAA,CAAkB,CAAC,CAAA;AACnB,EAAA,IAAI,CAAA,KAAM,CAAA,EAAG,OAAO,IAAA,CAAK,OAAO,CAAC,CAAA;AACjC,EAAA,IAAI,CAAA,KAAM,GAAG,OAAOA,EAAAA;AAEpB,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA;AAC7B,EAAA,IAAI,MAAA,GAAS,YAAA,CAAa,IAAA,EAAMA,EAAC,CAAA;AACjC,EAAA,MAAA,GAAS,MAAA,CAAO,IAAI,MAAM,CAAA;AAE1B,EAAA,IAAI,CAAA,GAAI,MAAM,CAAA,EAAG;AACf,IAAA,MAAA,GAAS,MAAA,CAAO,IAAIA,EAAC,CAAA;AAAA,EACvB;AAIA,EAAA,MAAM,KAAA,GAAQ,OAAO,KAAA,EAAM;AAC3B,EAAA,OAAO,QAAQ,eAAA,GAAkB,MAAA,CAAO,SAAA,CAAU,CAAA,GAAI,KAAK,CAAA,GAAI,MAAA;AACjE;AASA,SAAS,SAAS,GAAA,EAAW,KAAA,EAAe,EAAE,IAAA,EAAM,QAAO,EAA4C;AACrG,EAAA,iBAAA,CAAkB,KAAK,CAAA;AACvB,EAAA,IAAI,IAAA,IAAQ,KAAA,EAAO,OAAO,YAAA,CAAa,OAAO,GAAG,CAAA;AACjD,EAAA,IAAI,IAAA,IAAQ,CAAA,EAAG,OAAO,IAAA,CAAK,OAAO,CAAC,CAAA;AAEnC,EAAA,MAAM,KAAA,GAAQ,GAAA,CACX,cAAA,EAAe,CACf,MAAA,CAAO,CAAC,GAAG,MAAM,CAAA,KAAM,MAAA,GAAS,CAAC,EACjC,IAAA,CAAK,CAAC,CAAC,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA,KAAO,MAAA,GAAS,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAE,CAAA;AAC9C,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,IAAI,IAAA,EAAK;AACxC,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,MAAM,MAAA,GAAS,CAAC,CAAA,CAAE,CAAC,CAAA,GAAI,KAAA,CAAM,CAAC,CAAA,CAAE,CAAC,CAAC,CAAA;AAC9D,EAAA,MAAM,OAAO,KAAA,CAAM,MAAA,GAAS,IAAA,GAAO,IAAA,IAAQ,OAAO,IAAA,GAAO,CAAA,CAAA;AACzD,EAAA,IAAI,OAAO,aAAA,EAAe;AACxB,IAAA,MAAM,IAAI,cAAA;AAAA,MACR,CAAA,QAAA,EAAW,IAAI,CAAA,IAAA,EAAO,KAAK,gBAAgB,KAAA,CAAM,MAAM,0CAA0C,aAAa,CAAA;AAAA,KAChH;AAAA,EACF;AAGA,EAAA,MAAM,KAAA,GAAkB,IAAI,KAAA,CAAM,KAAA,CAAM,MAAM,CAAA;AAC9C,EAAA,KAAA,IAAS,IAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,IAAA,GAAO,GAAG,CAAA,IAAK,CAAA,EAAG,CAAA,EAAA,EAAK,KAAA,CAAM,CAAC,CAAA,GAAI,IAAA,IAAQ,KAAA,CAAM,CAAC,EAAE,CAAC,CAAA;AAEnF,EAAA,MAAM,KAAA,GAAQ,CAAC,GAAA,EAA0B,GAAA,EAAa,CAAA,KAAoB;AACxE,IAAA,GAAA,CAAI,IAAI,GAAA,EAAA,CAAM,GAAA,CAAI,IAAI,GAAG,CAAA,IAAK,KAAK,CAAC,CAAA;AAAA,EACtC,CAAA;AAEA,EAAA,IAAI,MAAA,GAAS,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,MAAK,EAAG,sBAAM,IAAI,GAAA,EAAqB,CAAA;AACzE,EAAA,MAAA,CAAO,CAAC,CAAA,CAAE,GAAA,CAAI,CAAA,EAAG,CAAC,CAAA;AAClB,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAoB;AAErC,EAAA,KAAA,CAAM,QAAQ,CAAC,CAAC,KAAA,EAAO,MAAM,GAAG,CAAA,KAAM;AACpC,IAAA,MAAM,CAAA,GAAI,MAAA,GAAS,KAAA,CAAM,CAAC,CAAA;AAC1B,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,MAAK,EAAG,sBAAM,IAAI,GAAA,EAAqB,CAAA;AACzE,IAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,IAAA,EAAM,MAAA,KAAW;AAC/B,MAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AACrB,MAAA,MAAM,OAAO,KAAA,GAAQ,MAAA;AACrB,MAAA,MAAM,OAAO,IAAA,GAAO,MAAA;AAEpB,MAAA,MAAM,MAAgB,EAAC;AACvB,MAAA,IAAI,SAAA,GAAY,CAAA;AAChB,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,QAAA,IAAI,CAAA,GAAI,GAAG,SAAA,IAAa,IAAA,CAAK,KAAK,IAAA,GAAO,CAAA,GAAI,KAAK,CAAC,CAAA;AACnD,QAAA,GAAA,CAAI,KAAK,CAAA,IAAK,CAAA,GAAI,IAAI,IAAA,CAAK,GAAA,CAAI,YAAY,CAAA,GAAI,IAAA,CAAK,IAAI,CAAC,CAAA,GAAA,CAAK,OAAO,CAAA,IAAK,IAAA,CAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;AAAA,MAC3F;AACA,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,MAAA,CAAO,CAAC,KAAA,EAAO,CAAA,KAAM,KAAA,GAAQ,CAAA,EAAG,CAAC,CAAC,CAAA;AACrE,MAAA,KAAA,MAAW,CAAC,GAAA,EAAK,CAAC,CAAA,IAAK,IAAA,EAAM;AAC3B,QAAA,GAAA,CAAI,OAAA,CAAQ,CAAC,EAAA,EAAI,CAAA,KAAM;AACrB,UAAA,IAAI,EAAA,GAAK,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA,EAAG,GAAA,GAAM,CAAA,GAAI,KAAA,EAAO,CAAA,GAAI,EAAE,CAAA;AAAA,QAC7D,CAAC,CAAA;AACD,QAAA,IAAI,MAAA,GAAS,GAAG,KAAA,CAAM,IAAA,EAAM,MAAM,IAAA,GAAO,KAAA,EAAO,IAAI,MAAM,CAAA;AAAA,MAC5D;AAAA,IACF,CAAC,CAAA;AACD,IAAA,MAAA,GAAS,IAAA;AAAA,EACX,CAAC,CAAA;AAED,EAAA,MAAM,MAAA,GAAS,IAAI,IAAA,EAAK;AACxB,EAAA,KAAA,MAAW,CAAC,KAAK,CAAC,CAAA,IAAK,MAAM,MAAA,CAAO,SAAA,CAAU,KAAK,CAAC,CAAA;AACpD,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,qBAAA,CACP,CAAA,EACA,CAAA,EACA,OAAA,GAAU,KAAA,EACiB;AAC3B,EAAA,IAAI,CAAA,CAAE,WAAW,CAAA,EAAG;AAEpB,EAAA,MAAM,CAAA,GAAI,EAAE,CAAC,CAAA;AAEb,EAAA,QAAQ,CAAA;AAAG,IACT,KAAK,GAAA;AACH,MAAA,CAAA,CAAE,KAAA,EAAM;AACR,MAAA,OAAO,YAAY,CAAA,EAAG,GAAA,EAAK,gBAAgB,CAAA,EAAG,CAAA,EAAG,OAAO,CAAC,CAAA;AAAA,IAE3D,KAAK,GAAA;AAAA,IACL,KAAK,GAAA;AACH,MAAA,OAAO,SAAA,CAAU,GAAG,CAAC,CAAA;AAAA,IAEvB,KAAK,GAAA;AACH,MAAA,WAAA,CAAY,GAAG,GAAG,CAAA;AAClB,MAAA,OAAO,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,OAAO,CAAA;AAAA,IAEhC,KAAK,GAAA;AACH,MAAA,OAAO,WAAA,CAAY,GAAG,CAAC,CAAA;AAAA,IAEzB;AACE,MAAA,IAAI,QAAQ,CAAC,CAAA,EAAG,OAAO,WAAA,CAAY,GAAG,CAAC,CAAA;AACvC,MAAA;AAAA;AAEN;AAEA,SAAS,mBAAA,CACP,GAAA,EACA,GAAA,EACA,CAAA,EACM;AACN,EAAA,IAAI,GAAA,CAAI,MAAA,IAAU,CAAA,IAAK,GAAA,CAAI,CAAC,MAAM,GAAA,IAAO,IAAA,CAAK,GAAA,EAAK,MAAM,CAAA,EAAG;AAC1D,IAAA,WAAA,CAAY,KAAK,MAAM,CAAA;AAEvB,IAAA,MAAM,UAAU,OAAO,GAAA,KAAQ,WAAW,IAAA,CAAK,MAAA,CAAO,GAAG,CAAA,GAAI,GAAA;AAC7D,IAAA,OAAO,OAAA,CAAQ,gBAAgB,CAAC,CAAA;AAAA,EAClC;AAEA,EAAA,MAAM,MAAA,GAAS,aAAA,CAAc,GAAA,EAAK,CAAC,CAAA;AACnC,EAAA,OAAO,OAAO,MAAA,KAAW,QAAA,GAAW,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,GAAI,MAAA;AAC5D;AAEA,SAAS,WAAA,CAAe,CAAA,EAAa,QAAA,EAAkB,GAAA,EAAwB;AAC7E,EAAA,KAAA,MAAW,MAAM,QAAA,EAAU;AACzB,IAAA,MAAM,KAAA,GAAQ,EAAE,KAAA,EAAM;AACtB,IAAA,IAAI,UAAU,EAAA,EAAI;AAChB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,EAAE,CAAA,UAAA,EAAa,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,IAChE;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,SAAA,CAAU,GAAa,CAAA,EAA6B;AAC3D,EAAA,IAAI,SAAA,GAAY,KAAA;AAEhB,EAAA,IAAI,KAAK,CAAA,EAAG,IAAI,KAAK,YAAA,CAAa,CAAA,EAAG,CAAC,CAAA,EAAG;AACvC,IAAA,WAAA,CAAY,GAAG,GAAG,CAAA;AAClB,IAAA,WAAA,CAAY,GAAG,GAAG,CAAA;AAClB,IAAA,SAAA,GAAY,IAAA;AAAA,EACd,CAAA,MAAA,IAAW,KAAK,CAAA,EAAG,GAAG,KAAK,YAAA,CAAa,CAAA,EAAG,CAAC,CAAA,EAAG;AAC7C,IAAA,WAAA,CAAY,GAAG,GAAG,CAAA;AAAA,EACpB,CAAA,MAAO;AACL,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,CAAA,EAAG,CAAC,CAAA;AAC9B,EAAA,IAAI,QAAQ,aAAA,EAAe;AACzB,IAAA,MAAM,IAAI,cAAA;AAAA,MACR,CAAA,SAAA,EAAY,KAAK,CAAA,wBAAA,EAA2B,aAAa,CAAA;AAAA,KAC3D;AAAA,EACF;AACA,EAAA,IAAI,MAAA,GAAS,IAAI,IAAA,CAAK,KAAK,CAAA;AAE3B,EAAA,IAAI,KAAA,KAAU,GAAG,OAAO,MAAA;AAExB,EAAA,IAAI,SAAA,EAAW;AAKb,IAAA,MAAA,GAAS,MAAA,CAAO,OAAO,CAAC,CAAA;AAAA,EAC1B;AAEA,EAAA,MAAA,CAAO,WAAA,CAAY,SAAA,GAAY,SAAA,CAAU,MAAM,CAAA;AAC/C,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,IAAA,CAAK,KAAe,QAAA,EAA2B;AACtD,EAAA,IAAI,QAAA,CAAS,MAAA,GAAS,GAAA,CAAI,MAAA,EAAQ,OAAO,KAAA;AAEzC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AACxC,IAAA,IAAI,IAAI,CAAC,CAAA,KAAM,SAAS,MAAA,CAAO,CAAC,GAAG,OAAO,KAAA;AAAA,EAC5C;AAEA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,YAAA,CAAa,KAAe,KAAA,EAAwB;AAC3D,EAAA,IAAI,KAAA,IAAS,GAAA,CAAI,MAAA,EAAQ,OAAO,KAAA;AAChC,EAAA,OAAO,QAAQ,GAAA,CAAI,KAAK,CAAC,CAAA,IAAK,GAAA,CAAI,KAAK,CAAA,KAAM,GAAA;AAC/C;AAEA,SAAS,WAAA,CAAY,GAAa,CAAA,EAAmB;AACnD,EAAA,IAAI,GAAA,GAAM,EAAA;AAEV,EAAA,OAAO,CAAA,CAAE,MAAA,GAAS,CAAA,KAAM,OAAA,CAAQ,CAAA,CAAE,CAAC,CAAC,CAAA,IAAK,CAAA,CAAE,CAAC,CAAA,KAAM,GAAA,CAAA,EAAM;AACtD,IAAA,MAAM,EAAA,GAAK,EAAE,KAAA,EAAM;AACnB,IAAA,GAAA,IAAO,EAAA,KAAO,GAAA,GAAM,CAAA,CAAE,QAAA,EAAS,GAAI,EAAA;AAAA,EACrC;AAEA,EAAA,IAAI,GAAA,CAAI,WAAW,CAAA,EAAG;AACpB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,yBAAA,EAA4B,CAAA,CAAE,CAAC,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,EACrD;AAEA,EAAA,OAAO,QAAA,CAAS,KAAK,EAAE,CAAA;AACzB;AAEA,SAAS,QAAQ,CAAA,EAAoB;AACnC,EAAA,OAAO,CAAA,IAAK,OAAO,CAAA,IAAK,GAAA;AAC1B;AAEA,SAAS,SAAA,CAAU,CAAA,EAAa,CAAA,EAAW,OAAA,EAAoC;AAC7E,EAAA,IAAI,MAAA,GAAS,KAAA;AAEb,EAAA,IAAI,IAAA,CAAK,CAAA,EAAG,GAAG,CAAA,EAAG;AAChB,IAAA,WAAA,CAAY,GAAG,GAAG,CAAA;AAClB,IAAA,MAAA,GAAS,IAAA;AAAA,EACX,CAAA,MAAA,IAAW,IAAA,CAAK,CAAA,EAAG,GAAG,CAAA,EAAG;AACvB,IAAA,WAAA,CAAY,GAAG,GAAG,CAAA;AAAA,EACpB,CAAA,MAAO;AACL,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,IAAA,GAAO,WAAA,CAAY,CAAA,EAAG,CAAC,CAAA;AAC7B,EAAA,MAAM,MAAA,GAAS,qBAAA,CAAsB,CAAA,EAAG,CAAA,EAAG,OAAO,CAAA;AAElD,EAAA,IAAI,kBAAkB,IAAA,EAAM;AAC1B,IAAA,MAAA,CAAO,WAAA,CAAY,IAAA,GAAO,EAAE,IAAA,EAAM,MAAA,EAAO;AACzC,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AACrD;AAEA,SAAS,eAAe,CAAA,EAAwC;AAC9D,EAAA,QAAQ,CAAA,CAAE,CAAC,CAAA;AAAG,IACZ,KAAK,GAAA;AACH,MAAA;AAAA,IAEF,KAAK,GAAA;AACH,MAAA,WAAA,CAAY,GAAG,IAAI,CAAA;AACnB,MAAA,OAAO,KAAK,SAAA,CAAU,EAAA;AAAA,IAExB,KAAK,GAAA;AACH,MAAA,WAAA,CAAY,GAAG,IAAI,CAAA;AACnB,MAAA,OAAO,KAAK,SAAA,CAAU,EAAA;AAAA,IAExB,KAAK,GAAA;AACH,MAAA,WAAA,CAAY,GAAG,GAAG,CAAA;AAClB,MAAA,MAAM,GAAA,GAAM,KAAK,SAAA,CAAU,SAAA;AAC3B,MAAA,GAAA,CAAI,KAAA,GAAQ,IAAA;AACZ,MAAA,OAAO,GAAA;AAAA,IAET,KAAK,GAAA;AACH,MAAA,WAAA,CAAY,GAAG,GAAG,CAAA;AAClB,MAAA,OAAO,KAAK,SAAA,CAAU,GAAA;AAAA,IAExB,KAAK,GAAA;AACH,MAAA,WAAA,CAAY,GAAG,GAAG,CAAA;AAClB,MAAA,OAAO,KAAK,SAAA,CAAU,GAAA;AAAA,IAExB,KAAK,GAAA;AACH,MAAA,WAAA,CAAY,GAAG,GAAG,CAAA;AAClB,MAAA,OAAO,KAAK,SAAA,CAAU,UAAA;AAAA,IAExB,KAAK,GAAA;AACH,MAAA,WAAA,CAAY,GAAG,GAAG,CAAA;AAClB,MAAA,WAAA,CAAY,GAAG,GAAG,CAAA;AAClB,MAAA,OAAO,KAAK,SAAA,CAAU,GAAA;AAAA,IAExB,KAAK,GAAA;AACH,MAAA,WAAA,CAAY,GAAG,GAAG,CAAA;AAClB,MAAA,OAAO,KAAK,SAAA,CAAU,QAAA;AAAA,IAExB,KAAK,GAAA;AACH,MAAA,WAAA,CAAY,GAAG,GAAG,CAAA;AAClB,MAAA,OAAO,KAAK,SAAA,CAAU,OAAA;AAAA,IAExB,KAAK,GAAA;AACH,MAAA,WAAA,CAAY,GAAG,QAAQ,CAAA;AACvB,MAAA,OAAO,KAAK,SAAA,CAAU,MAAA;AAAA,IAExB,KAAK,GAAA;AACH,MAAA,WAAA,CAAY,GAAG,GAAG,CAAA;AAElB,MAAA,IAAI,IAAA,CAAK,CAAA,EAAG,GAAG,CAAA,EAAG;AAChB,QAAA,WAAA,CAAY,GAAG,GAAG,CAAA;AAClB,QAAA,OAAO,KAAK,SAAA,CAAU,QAAA;AAAA,MACxB;AAEA,MAAA,OAAO,KAAK,SAAA,CAAU,gBAAA;AAAA,IAExB,KAAK,GAAA;AACH,MAAA,WAAA,CAAY,GAAG,GAAG,CAAA;AAClB,MAAA,IAAI,CAAA,CAAE,CAAC,CAAA,KAAM,GAAA,EAAK;AAChB,QAAA,WAAA,CAAY,GAAG,GAAG,CAAA;AAClB,QAAA,OAAO,KAAK,SAAA,CAAU,eAAA;AAAA,MACxB;AACA,MAAA,OAAO,KAAK,SAAA,CAAU,aAAA;AAAA,IAExB,KAAK,GAAA;AACH,MAAA,WAAA,CAAY,GAAG,GAAG,CAAA;AAClB,MAAA,OAAO,KAAK,SAAA,CAAU,EAAA;AAAA;AAG1B,EAAA;AACF;;;ACzjCO,SAAS,aAAA,CACd,MAAA,EACA,GAAA,GAAc,GAAA,EACT;AACL,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAoB;AACpC,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,EAAA,EAAI,CAAA,EAAA,EAAK;AAC5B,IAAA,MAAM,GAAA,GAAM,OAAO,CAAC,CAAA;AACpB,IAAA,MAAM,KAAK,GAAA,GAAM,IAAA;AACjB,IAAA,IAAI,KAAK,CAAA,EAAG;AACV,MAAA,GAAA,CAAI,GAAA,CAAI,GAAG,EAAE,CAAA;AAAA,IACf;AACA,IAAA,IAAA,GAAO,GAAA;AAAA,EACT;AAEA,EAAA,OAAO,GAAA,CAAI,OAAA,CAAQ,GAAA,EAAK,GAAG,CAAA;AAC7B;AAOO,SAAS,gBAAA,CAAiB,KAAU,CAAA,EAA+C;AACxF,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,KAAA,MAAW,CAAC,CAAA,EAAG,GAAG,CAAA,IAAK,GAAA,EAAK;AAC1B,IAAA,IAAI,CAAA,IAAK,CAAA,EAAG,OAAA,IAAW,GAAA,CAAI,CAAA;AAAA,kBACb,GAAA,CAAI,CAAA;AAAA,EACpB;AACA,EAAA,OAAO,EAAE,SAAS,KAAA,EAAM;AAC1B;;;AC7BA,IAAM,WAAA,GAAsC;AAAA,EAC1C,WAAA,EAAa,KAAA;AAAA,EACb,aAAA,EAAe,MAAA;AAAA,EACf,gBAAA,EAAkB,WAAA;AAAA,EAClB,kBAAA,EAAoB,aAAA;AAAA,EACpB,mBAAA,EAAqB,WAAA;AAAA,EACrB,qBAAA,EAAuB,aAAA;AAAA,EACvB,qBAAA,EAAuB,iBAAA;AAAA,EACvB,uBAAA,EAAyB;AAC3B,CAAA;AAGO,SAAS,UAAA,CACd,QAAA,EACA,SAAA,GAAqB,KAAA,EAChB;AACL,EAAA,QAAA,GAAW,QAAA,IAAY,MAAA;AACvB,EAAA,MAAM,iBAAiB,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,SAAA,GAAY,WAAW,MAAM,CAAA,CAAA;AACnE,EAAA,MAAM,QAAA,GAAW,YAAY,cAAc,CAAA;AAC3C,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,mBAAA,EAAsB,QAAQ,CAAA,CAAE,CAAA;AAAA,EAClD;AAEA,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,GAAA,CAAI,QAAQ,CAAA;AACpC,EAAA,IAAI,QAAQ,OAAO,MAAA;AAEnB,EAAA,MAAM,IAAA,GAAO,OAAO,SAAS,CAAA;AAC7B,EAAA,IAAI,CAAC,QAAA,IAAY,QAAA,KAAa,MAAA,EAAQ;AACpC,IAAA,QAAA,CAAS,GAAA,CAAI,UAAU,IAAI,CAAA;AAC3B,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,IAAc,IAAI,KAAA,CAAM,EAAE,CAAA,CAAE,KAAK,CAAC,CAAA;AACxC,EAAA,KAAA,MAAW,CAAC,CAAA,EAAG,GAAG,CAAA,IAAK,IAAA,EAAM;AAC3B,IAAA,MAAM,EAAA,GAAK,OAAO,GAAA,KAAQ,QAAA,GAAW,MAAM,GAAA,CAAI,CAAA;AAC/C,IAAA,IAAI,KAAK,CAAA,IAAK,CAAA,IAAK,EAAA,EAAI,CAAA,CAAE,CAAC,CAAA,GAAI,EAAA;AAAA,EAChC;AACA,EAAA,MAAM,IAAc,IAAI,KAAA,CAAM,EAAE,CAAA,CAAE,KAAK,CAAC,CAAA;AACxC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,EAAA,EAAI,CAAA,EAAA,EAAK,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,CAAC,CAAA,GAAI,EAAE,CAAC,CAAA;AAEnD,EAAA,MAAM,GAAA,GAAM,CAAA;AACZ,EAAA,IAAI,MAAA,GAAS,IAAA;AACb,EAAA,IAAI,aAAa,WAAA,EAAa;AAC5B,IAAA,MAAA,GAAS,aAAA,CAAc,CAAC,CAAA,KAAM,IAAA,CAAK,GAAA,CAAI,EAAE,CAAC,CAAA,EAAG,CAAC,CAAA,EAAG,GAAG,CAAA;AAAA,EACtD,CAAA,MAAA,IAAW,aAAa,gBAAA,EAAkB;AACxC,IAAA,MAAA,GAAS,aAAA,CAAc,CAAC,CAAA,KAAM,IAAA,CAAK,GAAA,CAAI,EAAE,CAAC,CAAA,EAAG,CAAC,CAAA,EAAG,GAAG,CAAA;AAAA,EACtD,CAAA,MAAA,IAAW,aAAa,cAAA,EAAgB;AACtC,IAAA,MAAA,GAAS,aAAA,CAAc,CAAC,CAAA,KAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,EAAG,CAAC,CAAA,EAAG,GAAG,CAAA;AAAA,EAC9D;AAEA,EAAA,QAAA,CAAS,GAAA,CAAI,UAAU,MAAM,CAAA;AAC7B,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,OAAO,SAAA,EAAyB;AAC9C,EAAA,MAAM,QAAA,GAAW,CAAA,KAAA,EAAQ,SAAA,GAAY,QAAA,GAAW,MAAM,CAAA,CAAA;AACtD,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,GAAA,CAAI,QAAQ,CAAA;AACpC,EAAA,IAAI,QAAQ,OAAO,MAAA;AAEnB,EAAA,MAAM,CAAA,uBAAQ,GAAA,EAAoB;AAClC,EAAA,MAAM,OAAO,CAAA,GAAI,EAAA;AACjB,EAAA,MAAM,cAAc,IAAA,GAAO,IAAA;AAC3B,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,EAAA,EAAI,CAAA,EAAA,EAAK;AAC5B,MAAA,CAAA,CAAE,GAAA,CAAI,GAAG,IAAI,CAAA;AAAA,IACf;AAAA,EACF,CAAA,MAAO;AACL,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,EAAA,EAAI,CAAA,EAAA,EAAK;AAC5B,MAAA,CAAA,CAAE,IAAI,CAAA,EAAA,CAAI,CAAA,KAAM,CAAA,GAAI,CAAA,GAAI,QAAQ,WAAW,CAAA;AAAA,IAC7C;AAAA,EACF;AACA,EAAA,MAAM,MAAA,GAAS,GAAA,CAAI,OAAA,CAAQ,CAAA,EAAG,GAAG,CAAA;AACjC,EAAA,QAAA,CAAS,GAAA,CAAI,UAAU,MAAM,CAAA;AAC7B,EAAA,OAAO,MAAA;AACT;;;AC1EO,SAAS,aAAA,CAAc,OAAe,IAAA,EAAoB;AAC/D,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,IAAI,CAAA,qBAAA,EAAwB,KAAK,CAAA,CAAE,CAAA;AACrF;;;AC2BA,SAAS,UAAU,IAAA,EAAuC;AACxD,EAAA,OAAO,IAAA,CAAK,IAAA,KAAS,KAAA,IAAS,EAAE,IAAA,CAAK,MAAA,GAAU,CAAA,CAAA,IAAM,EAAE,IAAA,CAAK,OAAA,GAAW,CAAA,CAAA,IAAM,EAAE,KAAK,OAAA,GAAW,CAAA,CAAA;AACjG;AAMA,SAAS,aAAa,IAAA,EAAuB;AAC3C,EAAA,IAAI,eAAA,CAAgB,KAAK,IAAI,CAAA,IAAK,yBAAyB,IAAA,CAAK,IAAI,GAAG,OAAO,IAAA;AAC9E,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AAC7B,EAAA,IAAI,OAAO,CAAA,IAAK,CAAC,KAAK,QAAA,CAAS,GAAG,GAAG,OAAO,KAAA;AAC5C,EAAA,IAAI,CAAC,sCAAsC,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA,EAAG,IAAI,CAAC,CAAA,EAAG,OAAO,KAAA;AAC7E,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,KAAA,IAAS,CAAA,GAAI,IAAA,EAAM,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACvC,IAAA,IAAI,IAAA,CAAK,CAAC,CAAA,KAAM,GAAA,EAAK,KAAA,EAAA;AAAA,SAAA,IACZ,IAAA,CAAK,CAAC,CAAA,KAAM,GAAA,IAAO,EAAE,UAAU,CAAA,EAAG,OAAO,CAAA,KAAM,IAAA,CAAK,MAAA,GAAS,CAAA;AAAA,EACxE;AACA,EAAA,OAAO,KAAA;AACT;AAGO,SAAS,KAAK,IAAA,EAAsB;AACzC,EAAA,OAAO,YAAA,CAAa,IAAI,CAAA,GAAI,IAAA,GAAO,IAAI,IAAI,CAAA,CAAA,CAAA;AAC7C;AAGO,SAAS,WAAW,KAAA,EAAuB;AAChD,EAAA,OAAO,QAAQ,CAAA,GAAI,CAAA,KAAA,EAAQ,CAAC,KAAK,CAAA,CAAA,CAAA,GAAM,GAAG,KAAK,CAAA,CAAA;AACjD;AAOO,SAAS,UAAU,KAAA,EAA0C;AAClE,EAAA,MAAM,OAAO,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,SAAS,GAAG,CAAA;AACrD,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,GAAA;AAC9B,EAAA,MAAM,OAAO,IAAA,CAAK,SAAA,CAAU,CAAC,IAAA,KAAS,IAAA,CAAK,OAAO,CAAC,CAAA;AACnD,EAAA,IAAI,IAAA,GAAO,GAAG,IAAA,CAAK,OAAA,CAAQ,GAAG,IAAA,CAAK,MAAA,CAAO,IAAA,EAAM,CAAC,CAAC,CAAA;AAElD,EAAA,IAAI,IAAA,GAAO,EAAA;AACX,EAAA,IAAI,KAAA,GAAQ,IAAA;AACZ,EAAA,IAAI,EAAA,GAAK,CAAA;AACT,EAAA,IAAI,EAAA,GAAK,CAAA;AACT,EAAA,IAAA,CAAK,OAAA,CAAQ,CAAC,IAAA,EAAM,CAAA,KAAM;AACxB,IAAA,IAAI,MAAM,CAAA,EAAG;AACX,MAAA,IAAA,GAAO,IAAA,CAAK,OAAO,CAAA,GAAI,IAAA,CAAK,OAAO,CAAA,IAAA,EAAO,IAAA,CAAK,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,IAC3D,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,GAAO,CAAA,EAAG;AACxB,MAAA,IAAA,IAAQ,CAAA,GAAA,EAAM,IAAA,CAAK,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,IAC/B,CAAA,MAAO;AACL,MAAA,MAAM,SAAA,GAAY,KAAA,KAAU,EAAA,GAAK,CAAA,IAAK,EAAA,GAAK,CAAA,CAAA;AAC3C,MAAA,IAAA,IAAQ,CAAA,EAAG,YAAY,KAAA,GAAQ,MAAM,GAAG,IAAA,CAAK,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,IACzD;AACA,IAAA,IAAI,KAAA,IAAS,KAAK,KAAA,EAAO;AACvB,MAAA,MAAM,CAAC,CAAA,EAAG,CAAC,CAAA,GAAI,IAAA,CAAK,KAAA;AACpB,MAAA,IAAI,IAAA,CAAK,OAAO,CAAA,EAAG;AACjB,QAAA,EAAA,IAAM,CAAA;AACN,QAAA,EAAA,IAAM,CAAA;AAAA,MACR,CAAA,MAAO;AACL,QAAA,EAAA,IAAM,CAAA;AACN,QAAA,EAAA,IAAM,CAAA;AAAA,MACR;AAAA,IACF,CAAA,MAAO;AACL,MAAA,KAAA,GAAQ,KAAA;AAAA,IACV;AAAA,EACF,CAAC,CAAA;AACD,EAAA,OAAO,IAAA;AACT;AAMA,SAAS,SAAS,GAAA,EAAsB;AACtC,EAAA,IAAI,GAAA,CAAI,UAAW,CAAA,EAAG;AACpB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,mDAAA,EAAsD,GAAA,CAAI,KAAK,CAAA,SAAA,EAAY,IAAI,OAAO,CAAA,iJAAA;AAAA,KACxF;AAAA,EACF;AACA,EAAA,MAAM,MAAA,GAAS,IAAI,MAAA,IAAU,CAAA;AAC7B,EAAA,MAAM,OAAA,GAAU,IAAI,OAAA,IAAW,CAAA;AAC/B,EAAA,IAAI,IAAI,KAAA,KAAU,EAAA,IAAM,WAAW,CAAA,IAAK,OAAA,IAAW,GAAG,OAAO,MAAA;AAC7D,EAAA,IAAI,IAAA,GAAO,CAAA,CAAA,EAAI,GAAA,CAAI,KAAK,CAAA,CAAA;AACxB,EAAA,IAAI,SAAS,CAAA,EAAG,IAAA,IAAQ,WAAW,CAAA,GAAI,WAAA,GAAc,YAAY,MAAM,CAAA,CAAA;AACvE,EAAA,IAAI,OAAA,GAAU,GAAG,IAAA,GAAO,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAChD,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,SAAA,CAAU,MAAgB,OAAA,EAA+B;AAChE,EAAA,MAAM,OAAO,IAAA,CAAK,KAAA;AAClB,EAAA,IAAI,KAAK,IAAA,KAAS,KAAA,EAAO,MAAM,IAAI,MAAM,mDAAmD,CAAA;AAC5F,EAAA,MAAM,MAAA,GAAS,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,IAAA,CAAK,KAAK,CAAC,CAAA;AACjD,EAAA,IAAI,MAAA,KAAW,KAAK,IAAA,CAAK,GAAA,CAAI,KAAK,KAAA,EAAO,MAAM,CAAA,IAAK,CAAA,EAAG,OAAO,GAAA;AAC9D,EAAA,IAAI,OAAA,CAAQ,iBAAiB,IAAA,CAAK,KAAA,KAAU,MAAM,MAAA,KAAW,CAAA,IAAK,WAAW,CAAA,CAAA,EAAI;AAC/E,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,KAAK,CAAC,CAAA;AAC1C,IAAA,OAAO,KAAA,CAAM,MAAM,CAAA,CAAE,IAAA,CAAK,OAAO,CAAA,CAAE,IAAA,CAAK,IAAA,CAAK,IAAA,KAAS,SAAA,GAAY,KAAA,GAAQ,KAAK,CAAA;AAAA,EACjF;AACA,EAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,IAAA,CAAK,KAAK,CAAA,GAAI,CAAA,EAAA,EAAK,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA,CAAA,GAAK,SAAA,CAAU,IAAA,CAAK,KAAK,CAAA;AACpF,EAAA,OAAO,CAAA,EAAG,IAAA,CAAK,KAAK,CAAA,CAAA,EAAI,IAAA,CAAK,IAAA,KAAS,SAAA,GAAY,GAAA,GAAM,GAAG,CAAA,EAAG,IAAA,CAAK,KAAK,IAAI,KAAK,CAAA,CAAA,CAAA;AACnF;AAOO,SAAS,UAAA,CACd,KAAA,EACA,SAAA,EACA,WAAA,EACA,QAAA,EACQ;AACR,EAAA,MAAM,GAAA,GAAM,WAAA,KAAgB,CAAA,GAAI,CAAA,GAAI,WAAA;AACpC,EAAA,IAAI,CAAC,OAAO,SAAA,CAAU,SAAS,KAAK,CAAC,MAAA,CAAO,SAAA,CAAU,GAAG,CAAA,EAAG;AAC1D,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,4CAAA,EAA+C,SAAS,CAAA,EAAA,EAAK,WAAW,CAAA,gGAAA;AAAA,KAC1E;AAAA,EACF;AACA,EAAA,IAAI,GAAA,KAAQ,GAAG,OAAO,CAAA,EAAG,WAAW,SAAS,CAAC,QAAQ,KAAK,CAAA,CAAA,CAAA;AAC3D,EAAA,IAAI,aAAa,OAAA,EAAS;AACxB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,4CAAA,EAA+C,SAAS,CAAA,EAAA,EAAK,WAAW,CAAA,4HAAA;AAAA,KAC1E;AAAA,EACF;AACA,EAAA,MAAM,GAAA,GAAM,QAAA,KAAa,MAAA,GAAS,GAAA,GAAM,IAAA;AACxC,EAAA,IAAI,SAAA,KAAc,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,KAAK,KAAK,GAAG,CAAA,CAAA,EAAI,UAAA,CAAW,GAAG,CAAC,CAAA,CAAA;AAChE,EAAA,OAAO,CAAA,CAAA,EAAI,KAAK,CAAA,KAAA,EAAQ,UAAA,CAAW,SAAS,CAAC,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,UAAA,CAAW,GAAG,CAAC,CAAA,CAAA;AACzE;AAGO,SAAS,SAAA,CAAU,IAAA,EAAsB,OAAA,GAAwB,EAAC,EAAW;AAClF,EAAA,QAAQ,KAAK,IAAA;AAAM,IACjB,KAAK,UAAA;AACH,MAAA,OAAO,IAAA,CAAK,KAAA,GAAQ,CAAA,GAAI,CAAA,IAAA,EAAO,CAAC,KAAK,KAAK,CAAA,CAAA,GAAK,CAAA,EAAG,IAAA,CAAK,KAAK,CAAA,CAAA;AAAA,IAC9D,KAAK,KAAA;AACH,MAAA,OAAO,SAAS,IAAI,CAAA;AAAA,IACtB,KAAK,KAAA,EAAO;AACV,MAAA,IAAI,IAAA,CAAK,oBAAqB,CAAA,EAAG;AAC/B,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,oEAAA,EAAuE,IAAA,CAAK,KAAA,CAAM,IAAA,KAAS,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,CAAC,CAAA,aAAA,EAAgB,IAAA,CAAK,iBAAiB,CAAA,iJAAA;AAAA,SAC/J;AAAA,MACF;AACA,MAAA,IAAI,KAAK,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA,IAAK,GAAG,OAAO,GAAA;AACxC,MAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,MAAA,IAAI,SAAA,CAAU,KAAK,CAAA,EAAG;AACpB,QAAA,IAAI,IAAA,CAAK,UAAU,CAAA,EAAG,OAAO,GAAG,IAAA,CAAK,KAAK,CAAA,CAAA,EAAI,KAAA,CAAM,KAAK,CAAA,CAAA;AACzD,QAAA,OAAO,OAAA,CAAQ,gBAAgB,KAAA,CAAM,KAAA,KAAU,KAAK,KAAA,GAAQ,CAAA,EAAA,EAAK,MAAM,KAAK,CAAA,CAAA;AAAA,MAC9E;AACA,MAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,KAAA,EAAO,OAAO,CAAA;AACtC,MAAA,OAAO,IAAA,CAAK,UAAU,CAAA,GAAI,KAAA,GAAQ,GAAG,IAAA,CAAK,KAAK,IAAI,KAAK,CAAA,CAAA,CAAA;AAAA,IAC1D;AAAA,IACA,KAAK,MAAA;AACH,MAAA,OAAO,SAAA,CAAU,MAAM,OAAO,CAAA;AAAA,IAChC,KAAK,SAAA,EAAW;AACd,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,KAAK,CAAC,CAAA;AAC1C,MAAA,IAAI,KAAK,QAAA,KAAa,WAAA,SAAoB,CAAA,EAAG,OAAO,MAAM,OAAO,CAAA,CAAA;AACjE,MAAA,IAAI,KAAK,QAAA,KAAa,cAAA,SAAuB,CAAA,EAAG,OAAO,MAAM,OAAO,CAAA,CAAA;AACpE,MAAA,OAAO,CAAA,EAAG,OAAO,CAAA,GAAA,EAAM,OAAO,MAAM,OAAO,CAAA,CAAA;AAAA,IAC7C;AAAA,IACA,KAAK,OAAA,EAAS;AACZ,MAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,IAAA,CAAK,KAAK,CAAC,CAAA;AAChD,MAAA,IAAI,KAAA,KAAU,CAAA,EAAG,OAAO,SAAA,CAAU,KAAK,KAAK,CAAA;AAC5C,MAAA,OAAO,CAAA,EAAG,KAAK,CAAA,IAAA,EAAO,SAAA,CAAU,KAAK,KAAK,CAAA,GAAI,CAAA,EAAA,EAAK,IAAA,CAAK,MAAM,KAAK,CAAA,CAAA,GAAK,SAAA,CAAU,IAAA,CAAK,KAAK,CAAC,CAAA,CAAA,CAAA;AAAA,IAC/F;AAAA,IACA,KAAK,MAAA;AACH,MAAA,OAAO,CAAA,CAAA,EAAI,SAAA,CAAU,IAAA,CAAK,KAAK,CAAC,CAAA,MAAA,CAAA;AAAA,IAClC,KAAK,OAAA;AACH,MAAA,OAAO,UAAA,CAAW,SAAA,CAAU,IAAA,CAAK,KAAK,CAAA,EAAG,KAAK,SAAA,EAAW,IAAA,CAAK,WAAA,EAAa,IAAA,CAAK,QAAQ,CAAA;AAAA,IAC1F,KAAK,KAAA;AACH,MAAA,OAAO,SAAA;AAAA,QACL,KAAK,QAAA,CAAS,GAAA;AAAA,UAAI,CAAC,EAAE,IAAA,EAAM,KAAA,EAAO,MAAK,KACrC,KAAA,CAAM,IAAA,KAAS,UAAA,GACX,YAAA,CAAa,IAAA,GAAO,MAAM,KAAK,CAAA,GAC/B,EAAE,IAAA,EAAM,SAAA,CAAU,KAAK,GAAG,IAAA,EAAM,KAAA,EAAO,SAAA,CAAU,KAAK,CAAA;AAAE;AAC9D,OACF;AAAA,IACF;AACE,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sCAAA,EAA0C,IAAA,CAA0B,IAAI,CAAA,MAAA,CAAQ,CAAA;AAAA;AAEtG;AAGO,SAAS,UAAU,IAAA,EAAwC;AAChE,EAAA,QAAQ,KAAK,IAAA;AAAM,IACjB,KAAK,UAAA;AACH,MAAA,OAAO,CAAC,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,KAAK,CAAA;AAAA,IAChC,KAAK,KAAA,EAAO;AACV,MAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,IAAA,CAAK,KAAK,CAAC,CAAA;AAChD,MAAA,IAAI,KAAA,KAAU,CAAA,EAAG,OAAO,CAAC,GAAG,CAAC,CAAA;AAC7B,MAAA,MAAM,OAAA,GAAU,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,IAAA,CAAK,OAAA,IAAW,CAAC,CAAC,CAAA;AACzD,MAAA,MAAM,EAAA,GAAK,KAAK,OAAA,GAAW,CAAA,GAAI,WAAW,IAAA,CAAK,GAAA,CAAI,OAAO,OAAO,CAAA;AACjE,MAAA,OAAO,CAAC,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAO,GAAG,EAAE,CAAA;AAAA,IAClC;AAAA,IACA,KAAK,KAAA,EAAO;AACV,MAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,IAAA,CAAK,KAAK,CAAC,CAAA;AAChD,MAAA,IAAI,KAAA,KAAU,CAAA,EAAG,OAAO,CAAC,GAAG,CAAC,CAAA;AAC7B,MAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,SAAA,CAAU,KAAK,KAAK,CAAA;AACrC,MAAA,OAAO,CAAC,QAAQ,EAAA,EAAI,IAAA,CAAK,oBAAqB,CAAA,GAAI,QAAA,GAAW,QAAQ,EAAE,CAAA;AAAA,IACzE;AAAA,IACA,KAAK,MAAA,EAAQ;AACX,MAAA,IAAI,OAAuB,IAAA,CAAK,KAAA;AAChC,MAAA,OAAO,IAAA,CAAK,IAAA,KAAS,MAAA,EAAQ,IAAA,GAAO,IAAA,CAAK,KAAA;AACzC,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,IAAA,KAAS,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,KAAK,CAAC,CAAA,GAAI,CAAA;AAC3E,MAAA,MAAM,IAAA,GAAO,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,IAAA,CAAK,KAAA,EAAO,MAAM,CAAC,CAAA;AACrD,MAAA,IAAI,IAAA,KAAS,KAAK,IAAA,CAAK,IAAA,KAAS,OAAO,OAAO,CAAC,GAAG,CAAC,CAAA;AACnD,MAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,SAAA,CAAU,KAAK,KAAK,CAAA;AACrC,MAAA,OAAO,CAAC,IAAA,GAAO,EAAA,EAAI,IAAA,GAAO,EAAE,CAAA;AAAA,IAC9B;AAAA,IACA,KAAK,SAAA;AAAA,IACL,KAAK,OAAA;AACH,MAAA,OAAO,SAAA,CAAU,KAAK,KAAK,CAAA;AAAA,IAC7B,KAAK,MAAA,EAAQ;AACX,MAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,SAAA,CAAU,KAAK,KAAK,CAAA;AACrC,MAAA,OAAO,CAAC,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,CAAC,GAAG,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,CAAC,CAAC,CAAA;AAAA,IAChD;AAAA,IACA,KAAK,OAAA,EAAS;AACZ,MAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,SAAA,CAAU,KAAK,KAAK,CAAA;AAErC,MAAA,MAAM,SAAS,IAAA,CAAK,SAAA,IAAa,KAAK,WAAA,KAAgB,CAAA,GAAI,IAAI,IAAA,CAAK,WAAA,CAAA;AACnE,MAAA,MAAM,CAAC,GAAG,CAAC,CAAA,GAAI,CAAC,EAAA,GAAK,MAAA,EAAQ,KAAK,MAAM,CAAA;AACxC,MAAA,OAAO,CAAC,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,GAAG,CAAC,CAAC,CAAA,EAAG,IAAA,CAAK,KAAK,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAC,CAAC,CAAC,CAAA;AAAA,IAC/D;AAAA,IACA,KAAK,KAAA;AACH,MAAA,OAAO,KAAK,QAAA,CAAS,MAAA;AAAA,QACnB,CAAC,CAAC,EAAA,EAAI,EAAE,GAAG,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAK,KAAM;AACnC,UAAA,MAAM,CAAC,CAAA,EAAG,CAAC,CAAA,GAAI,UAAU,KAAK,CAAA;AAC9B,UAAA,OAAO,IAAA,GAAO,CAAA,GAAI,CAAC,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,CAAC,CAAA,GAAI,CAAC,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,CAAC,CAAA;AAAA,QACtD,CAAA;AAAA,QACA,CAAC,GAAG,CAAC;AAAA,OACP;AAAA,IACF;AACE,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAA0B,IAAA,CAA0B,IAAI,CAAA,MAAA,CAAQ,CAAA;AAAA;AAEtF;AAEA,SAAS,aAAa,KAAA,EAA+B;AACnD,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA;AAChC,EAAA,OAAO,EAAE,IAAA,EAAM,CAAA,EAAG,SAAS,IAAI,IAAA,EAAM,KAAA,GAAQ,CAAA,GAAI,EAAA,GAAK,CAAA,EAAG,KAAA,EAAO,CAAC,SAAA,EAAW,SAAS,CAAA,EAAE;AACzF;AAEA,IAAM,aAAa,CAAC,MAAA,KAAA,CACjB,MAAA,CAAO,MAAA,GAAS,IAAI,CAAA,GAAI,CAAA,KACxB,MAAA,CAAO,OAAA,GAAU,IAAI,CAAA,GAAI,CAAA,CAAA,IACzB,MAAA,CAAO,iBAAA,GAAoB,IAAI,CAAA,GAAI,CAAA,CAAA,IACnC,MAAA,CAAO,OAAA,GAAU,IAAI,CAAA,GAAI,CAAA,CAAA,IACzB,MAAA,CAAO,MAAA,GAAS,IAAI,CAAA,GAAI,CAAA,CAAA,IACxB,MAAA,CAAO,IAAA,KAAS,SAAY,CAAA,GAAI,CAAA,CAAA,IAChC,MAAA,CAAO,QAAA,KAAa,SAAS,CAAA,GAAI,CAAA,CAAA;AASpC,SAAS,UAAU,MAAA,EAA6B;AAC9C,EAAA,OACE,MAAA,CAAO,IAAA,KAAS,MAAA,IAChB,EAAE,OAAO,MAAA,GAAS,CAAA,CAAA,IAClB,MAAA,CAAO,QAAA,KAAa,UACpB,EAAE,MAAA,CAAO,iBAAA,GAAoB,CAAA,CAAA,IAC7B,OAAO,KAAA,KAAU,CAAA;AAErB;AAEA,SAAS,UAAA,CAAW,SAAgC,IAAA,EAA2C;AAC7F,EAAA,MAAM,SAAsB,EAAC;AAC7B,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAuB;AACzC,EAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,IAAA,IAAI,EAAE,MAAA,CAAO,KAAA,GAAQ,CAAA,CAAA,EAAI;AACzB,IAAA,MAAM,WAAW,OAAA,CAAQ,MAAA,CAAO,aAAa,CAAA,IAAK,OAAO,KAAA,GAAQ,CAAA;AACjE,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,KAAK,CAAA;AACnC,IAAA,MAAM,SAAS,MAAA,KAAW,IAAA;AAC1B,IAAA,IAAI,CAAC,SAAA,CAAU,MAAM,CAAA,EAAG;AACtB,MAAA,MAAA,CAAO,KAAK,EAAE,MAAA,EAAQ,OAAO,QAAA,EAAU,IAAA,EAAM,QAAQ,CAAA;AACrD,MAAA;AAAA,IACF;AACA,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,SAAA,CAAU,EAAE,GAAG,MAAA,EAAQ,KAAA,EAAO,CAAA,EAAG,QAAA,EAAU,CAAA,EAAG,aAAA,EAAe,QAAA,EAAU,CAAA;AACxF,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAC9B,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,QAAA,CAAS,KAAA,IAAS,KAAA;AAClB,MAAA,QAAA,CAAS,IAAA,KAAT,SAAS,IAAA,GAAS,MAAA,CAAA;AAAA,IACpB,CAAA,MAAO;AACL,MAAA,MAAM,QAAQ,EAAE,MAAA,EAAQ,KAAA,EAAO,QAAA,EAAU,MAAM,MAAA,EAAO;AACtD,MAAA,KAAA,CAAM,GAAA,CAAI,KAAK,KAAK,CAAA;AACpB,MAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,IACnB;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAGA,SAAS,YAAA,CAAa,GAAc,CAAA,EAAsB;AACxD,EAAA,MAAM,SAAS,CAAA,CAAE,MAAA,CAAO,SAAS,CAAA,IAAK,CAAA,CAAE,OAAO,OAAA,GAAU,CAAA;AACzD,EAAA,MAAM,SAAS,CAAA,CAAE,MAAA,CAAO,SAAS,CAAA,IAAK,CAAA,CAAE,OAAO,OAAA,GAAU,CAAA;AACzD,EAAA,IAAI,MAAA,KAAW,MAAA,EAAQ,OAAO,MAAA,GAAS,EAAA,GAAK,CAAA;AAC5C,EAAA,IAAI,CAAA,CAAE,MAAA,CAAO,KAAA,KAAU,CAAA,CAAE,MAAA,CAAO,KAAA,EAAO,OAAO,CAAA,CAAE,MAAA,CAAO,KAAA,GAAQ,CAAA,CAAE,MAAA,CAAO,KAAA;AACxE,EAAA,OAAO,WAAW,CAAA,CAAE,MAAM,CAAA,GAAI,UAAA,CAAW,EAAE,MAAM,CAAA;AACnD;AAEA,SAAS,WAAW,KAAA,EAAoC;AACtD,EAAA,MAAM,MAAA,GAAqB;AAAA,IACzB,GAAG,KAAA,CAAM,MAAA;AAAA,IACT,OAAO,KAAA,CAAM,KAAA;AAAA,IACb,QAAA,EAAU,CAAA;AAAA,IACV,eAAe,KAAA,CAAM;AAAA,GACvB;AACA,EAAA,MAAM,GAAA,GAAM,kBAAA,CAAmB,CAAC,MAAM,CAAC,CAAA;AACvC,EAAA,IAAI,CAAC,GAAA,IAAO,GAAA,CAAI,IAAA,KAAS,KAAA,SAAc,EAAC;AACxC,EAAA,MAAM,OAAA,GAAwB;AAAA,IAC5B,cAAc,KAAA,CAAM,IAAA;AAAA,IACpB,aAAA,EAAe,OAAO,QAAA,KAAa;AAAA,GACrC;AACA,EAAA,OAAO,GAAA,CAAI,QAAA,CACR,MAAA,CAAO,CAAC,EAAE,IAAA,EAAK,KAAM,IAAA,CAAK,IAAA,KAAS,UAAU,CAAA,CAC7C,GAAA,CAAI,CAAC,EAAE,IAAA,EAAM,IAAA,EAAK,MAAO,EAAE,IAAA,EAAM,SAAA,CAAU,IAAA,EAAM,OAAO,CAAA,EAAG,IAAA,EAAM,KAAA,EAAO,SAAA,CAAU,IAAI,CAAA,EAAE,CAAE,CAAA;AAC/F;AAMA,SAAS,YAAA,CAAa,MAAA,EAAqB,OAAA,EAAgC,QAAA,EAAoC;AAC7G,EAAA,MAAM,UAAU,CAAC,GAAI,UAAU,CAAC,OAAO,IAAI,EAAC,EAAI,GAAG,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,KAAM,OAAO,CAAA,CAAE,IAAA,CAAK,YAAY,CAAC,CAAA;AACzG,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,GAAA,CAAI,UAAU,CAAA;AACpC,EAAA,MAAMI,KAAAA,GAAO,aAAa,CAAA,GAAI,KAAK,CAAC,YAAA,CAAa,QAAQ,CAAC,CAAA;AAC1D,EAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,IAAK,OAAA,CAAQ,CAAC,CAAA,CAAE,MAAA,CAAO,UAAU,EAAA,EAAI;AACxD,IAAA,OAAO,CAAC,GAAG,KAAA,CAAM,CAAC,CAAA,EAAG,GAAGA,KAAAA,EAAM,GAAG,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA,CAAE,MAAM,CAAA;AAAA,EACxD;AACA,EAAA,OAAO,CAAC,GAAG,KAAA,CAAM,IAAA,EAAK,EAAG,GAAGA,KAAI,CAAA;AAClC;AAMO,SAAS,WAAA,CAAY,SAAgC,IAAA,EAAgD;AAC1G,EAAA,MAAM,MAAA,GAAS,UAAA,CAAW,OAAA,EAAS,IAAI,CAAA;AACvC,EAAA,MAAM,YAAY,MAAA,CAAO,IAAA,CAAK,CAAC,KAAA,KAAU,MAAM,IAAI,CAAA;AACnD,EAAA,MAAM,QAAA,GAAW,QAAQ,MAAA,CAAO,CAAC,KAAK,MAAA,KAAW,GAAA,GAAM,MAAA,CAAO,QAAA,EAAU,CAAC,CAAA;AACzE,EAAA,OAAO,YAAA,CAAa,QAAQ,SAAA,IAAa,SAAA,CAAU,OAAO,KAAA,KAAU,EAAA,GAAK,SAAA,GAAY,MAAA,EAAW,QAAQ,CAAA;AAC1G;AAcO,SAAS,kBAAkB,KAAA,EAAsC;AACtE,EAAA,MAAM,IAAA,GAAO,MAAM,gBAAA,EAAiB;AACpC,EAAA,IAAI,CAAC,IAAA,IAAQ,EAAE,IAAA,CAAK,KAAA,GAAQ,IAAI,OAAO,MAAA;AACvC,EAAA,MAAM,GAAA,GAAM,kBAAkB,IAAI,CAAA;AAClC,EAAA,MAAM,IAAA,GAAuB,IAAA,CAAK,QAAA,KAAa,MAAA,GAAS,GAAA,GAAM,EAAE,IAAA,EAAM,SAAA,EAAW,QAAA,EAAU,IAAA,CAAK,QAAA,EAAU,KAAA,EAAO,GAAA,EAAI;AACrH,EAAA,OAAO,UAAU,IAAI,CAAA;AACvB;AAMO,SAAS,gBAAgB,KAAA,EAA0B;AACxD,EAAA,MAAM,QAAA,GAAW,kBAAkB,KAAK,CAAA;AACxC,EAAA,MAAM,MAAA,GAAS,UAAA,CAAW,KAAA,CAAM,mBAAA,IAAuB,MAAS,CAAA;AAChE,EAAA,IAAI,QAAA,KAAa,QAAW,OAAO,SAAA,CAAU,aAAa,MAAA,EAAQ,MAAA,EAAW,KAAA,CAAM,QAAQ,CAAC,CAAA;AAC5F,EAAA,MAAM,IAAA,GAAO,MAAM,gBAAA,EAAiB;AACpC,EAAA,MAAM,QAAA,GAA2B;AAAA,IAC/B,IAAA,EAAM,QAAA;AAAA,IACN,IAAA,EAAM,CAAA;AAAA,IACN,KAAA,EAAO,SAAA,CAAU,iBAAA,CAAkB,IAAI,CAAC;AAAA,GAC1C;AACA,EAAA,MAAMA,KAAAA,GAAO,KAAA,CAAM,QAAA,KAAa,CAAA,GAAI,KAAK,CAAC,YAAA,CAAa,KAAA,CAAM,QAAQ,CAAC,CAAA;AACtE,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,MAAA,EAAQ,MAAA,EAAW,CAAC,CAAA;AAC/C,EAAA,OAAO,UAAU,IAAA,CAAK,KAAA,KAAU,EAAA,GAAK,CAAC,UAAU,GAAGA,KAAAA,EAAM,GAAG,KAAK,IAAI,CAAC,QAAA,EAAU,GAAG,KAAA,EAAO,GAAGA,KAAI,CAAC,CAAA;AACpG;;;ACrYO,IAAM,gBAAA,GAAN,MAAM,iBAAA,SAAyB,KAAA,CAAM;AAAA,EAC1C,WAAA,CAAqB,YAAoB,IAAA,EAAmB;AAC1D,IAAA,MAAM,OAAA,GAAU,IAAA,KAAS,IAAA,GAAO,oBAAA,GAAuB,oBAAA;AACvD,IAAA,MAAM,IAAA,GAAO,IAAA,KAAS,IAAA,GAAO,yBAAA,GAA4B,mCAAA;AACzD,IAAA,KAAA;AAAA,MACE,iCAAiC,UAAU,CAAA,mBAAA,EAAsB,IAAI,CAAA,wGAAA,EACW,OAAO,6CAC7C,IAAI,CAAA,GAAA;AAAA,KAChD;AAPmB,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AAQnB,IAAA,IAAA,CAAK,IAAA,GAAO,kBAAA;AACZ,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,iBAAA,CAAiB,SAAS,CAAA;AAAA,EACxD;AACF;AAGA,SAAS,cAAc,MAAA,EAA6B;AAClD,EAAA,OAAO,OAAO,IAAA,KAAS,MAAA,IAAa,OAAO,MAAA,GAAS,CAAA,IAAK,OAAO,iBAAA,GAAoB,CAAA;AACtF;AAIA,SAAS,iBAAiB,KAAA,EAAuB;AAC/C,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AACjC,EAAA,IAAI,QAAA,KAAa,KAAA,EAAO,MAAM,IAAI,MAAM,0BAA0B,CAAA;AAClE,EAAA,IAAI,QAAA,IAAY,CAAA,EAAG,MAAM,IAAI,MAAM,mBAAmB,CAAA;AACtD,EAAA,OAAO,QAAA;AACT;AAUA,SAAS,gBAAA,CAAiB,QAAoB,KAAA,EAAmC;AAC/E,EAAA,MAAM,GAAA,GAAM,CAAA,CAAA,EAAI,MAAA,CAAO,KAAK,CAAA,CAAA;AAC5B,EAAA,IAAI,MAAA,CAAO,aAAa,MAAA,EAAQ;AAC9B,IAAA,OACE,CAAA,EAAA,EAAK,GAAG,CAAA,aAAA,EAAgB,MAAA,CAAO,QAAQ,uEACC,MAAA,CAAO,QAAQ,CAAA,KAAA,EAAQ,MAAA,CAAO,QAAQ,CAAA,sBAAA,CAAA;AAAA,EAElF;AACA,EAAA,IAAI,OAAO,IAAA,EAAM;AACf,IAAA,MAAM,EAAE,KAAA,EAAO,KAAA,EAAO,IAAA,KAAS,MAAA,CAAO,IAAA;AACtC,IAAA,IAAI,KAAA,KAAU,CAAA,IAAK,IAAA,KAAS,SAAA,EAAW,OAAO,MAAA;AAC9C,IAAA,OACE,CAAA,mBAAA,EAAsB,KAAK,CAAA,EAAG,IAAA,KAAS,SAAA,GAAY,OAAO,IAAI,CAAA,EAAG,KAAK,CAAA,MAAA,EAAS,GAAG,CAAA,6HAAA,CAAA;AAAA,EAGtF;AACA,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,KAAK,CAAA;AAClC,EAAA,IAAI,OAAO,MAAA,GAAS,CAAA,IAAK,MAAA,CAAO,MAAA,GAAS,OAAO,KAAA,EAAO;AACrD,IAAA,OAAO,UAAU,MAAA,CAAO,MAAM,CAAA,KAAA,EAAQ,IAAI,GAAG,GAAG,CAAA,gFAAA,CAAA;AAAA,EAClD;AACA,EAAA,OAAO,MAAA;AACT;AAYA,IAAM,YAAA,GAAe,GAAA,CAAI,WAAA,CAAY,GAAI,CAAA;AAGlC,SAAS,cAAA,GAAuB;AACrC,EAAA,YAAA,CAAa,KAAA,EAAM;AACnB,EAAA,cAAA,EAAe;AACjB;AAEO,IAAM,aAAA,GAA4B;AAAA,EACvC,KAAA,EAAO,CAAA;AAAA,EACP,KAAA,EAAO,CAAA;AAAA,EACP,QAAA,EAAU,CAAA;AAAA,EACV,MAAA,EAAQ,CAAA;AAAA,EACR,OAAA,EAAS,CAAA;AAAA,EACT,iBAAA,EAAmB,CAAA;AAAA,EACnB,OAAA,EAAS,CAAA;AAAA,EACT,MAAA,EAAQ,CAAA;AAAA,EACR,IAAA,EAAM,MAAA;AAAA,EACN,QAAA,EAAU;AACZ;AASO,SAAS,iBAAiB,OAAA,EAAwC;AACvE,EAAA,IAAI,IAAA,GAAO,EAAA;AACX,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AACvC,IAAA,MAAM,EAAE,KAAA,EAAO,KAAA,EAAO,aAAA,EAAc,GAAI,QAAQ,CAAC,CAAA;AACjD,IAAA,IAAI,EAAE,KAAA,GAAQ,CAAA,CAAA,IAAM,EAAE,KAAA,GAAQ,MAAM,aAAA,EAAe;AACnD,IAAA,IAAI,SAAS,EAAA,EAAI;AACf,MAAA,IAAA,GAAO,CAAA;AACP,MAAA;AAAA,IACF;AACA,IAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,IAAI,CAAA,CAAE,KAAA;AAC1B,IAAA,IAAI,QAAQ,EAAA,KAAO,KAAA,KAAU,EAAA,IAAM,KAAA,GAAQ,MAAM,IAAA,GAAO,CAAA;AAAA,EAC1D;AACA,EAAA,OAAO,IAAA;AACT;AAGO,IAAM,WAAA,GAAN,MAAM,YAAA,CAAY;AAAA,EAGvB,WAAA,CAAY,iBAAiD,CAAA,EAAG;AAodhE;AAAA,IAAA,IAAA,CAAA,EAAA,GAAK,MAAM,IAAA,CAAK,CAAA,CAAE,CAAC,CAAA;AACnB,IAAA,IAAA,CAAA,EAAA,GAAK,MAAM,IAAA,CAAK,CAAA,CAAE,CAAC,CAAA;AACnB,IAAA,IAAA,CAAA,EAAA,GAAK,MAAM,IAAA,CAAK,CAAA,CAAE,CAAC,CAAA;AACnB,IAAA,IAAA,CAAA,GAAA,GAAM,MAAM,IAAA,CAAK,CAAA,CAAE,EAAE,CAAA;AACrB,IAAA,IAAA,CAAA,GAAA,GAAM,MAAM,IAAA,CAAK,CAAA,CAAE,EAAE,CAAA;AACrB,IAAA,IAAA,CAAA,GAAA,GAAM,MAAM,IAAA,CAAK,CAAA,CAAE,EAAE,CAAA;AACrB,IAAA,IAAA,CAAA,IAAA,GAAO,MAAM,IAAA,CAAK,CAAA,CAAE,GAAG,CAAA;AAzdrB,IAAA,IAAI,OAAO,mBAAmB,QAAA,EAAU;AACtC,MAAA,MAAM,KAAA,GAAQ,cAAA;AACd,MAAA,IAAI,MAAM,KAAK,CAAA,EAAG,MAAM,IAAI,MAAM,6BAA6B,CAAA;AAC/D,MAAA,aAAA,CAAc,OAAO,OAAO,CAAA;AAC5B,MAAA,IAAA,CAAK,cAAA,GAAiB;AAAA,QACpB,EAAE,GAAG,aAAA,EAAe,KAAA,EAAO,aAAA,EAAe,QAAQ,CAAA;AAAE,OACtD;AAAA,IACF,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,cAAA,GAAiB,eAAe,GAAA,CAAI,CAAC,OAAO,EAAE,GAAG,GAAE,CAAE,CAAA;AAAA,IAC5D;AAAA,EACF;AAAA,EAEU,OAAO,OAAA,EAA6C;AAC5D,IAAA,OAAO,IAAI,aAAY,OAAO,CAAA;AAAA,EAChC;AAAA,EAEA,IAAc,UAAA,GAAa;AACzB,IAAA,OAAO,IAAA,CAAK,cAAA,CAAe,IAAA,CAAK,cAAA,CAAe,SAAS,CAAC,CAAA;AAAA,EAC3D;AAAA,EAEA,cAAA,GAA0B;AACxB,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,iBAAA,GAA2C;AACzC,IAAA,OAAO,IAAA,CAAK,eAAe,GAAA,CAAI,CAAC,OAAmB,EAAE,GAAG,GAAE,CAAE,CAAA;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,QAAA,GAA0B;AAExB,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,MAAU,IAAA,CAAK,cAAA;AAAA,MAAgB,CAAC,IAAA,EAAM,KAAA,KAChD,OAAO,KAAA,KAAU,QAAA,IAAY,CAAC,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,GAAI,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,GAAK;AAAA,KACvE;AAAA,EACF;AAAA;AAAA,EAGA,OAAO,WAAW,MAAA,EAA0C;AAC1D,IAAA,OAAO,IAAI,aAAY,CAAC,EAAE,GAAG,aAAA,EAAe,GAAG,MAAA,EAAQ,CAAC,CAAA;AAAA,EAC1D;AAAA,EAEA,OAAO,YAAY,OAAA,EAA6C;AAC9D,IAAA,OAAO,IAAI,YAAA;AAAA,MACT,OAAA,CAAQ,IAAI,CAAC,MAAA,MAAY,EAAE,GAAG,aAAA,EAAe,GAAG,MAAA,EAAO,CAAE;AAAA,KAC3D;AAAA,EACF;AAAA,EAEA,OAAO,YAAY,IAAA,EAA0B;AAC3C,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,MAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,MAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAC3B,QAAA,IAAI,MAAM,GAAG,CAAA,EAAG,MAAM,IAAI,MAAM,gCAAgC,CAAA;AAChE,QAAA,OAAO,IAAI,YAAA,CAAY,CAAC,CAAA,CAAE,KAAK,GAAG,CAAA;AAAA,MACpC;AACA,MAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAC3B,QAAA,OAAO,IAAI,kBAAkB,GAAG,CAAA;AAAA,MAClC;AACA,MAAA,IAAI,eAAe,YAAA,EAAa;AAC9B,QAAA,OAAO,GAAA;AAAA,MACT;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,IAAK,IAAA,CAAK,WAAW,CAAA,EAAG;AAC1C,MAAA,MAAM,CAAC,KAAA,EAAO,UAAA,EAAY,QAAQ,CAAA,GAAI,IAAA;AAEtC,MAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,QAAA,MAAM,IAAI,MAAM,oDAAoD,CAAA;AAAA,MACtE;AACA,MAAA,IAAI,MAAM,KAAK,CAAA,EAAG,MAAM,IAAI,MAAM,sCAAsC,CAAA;AAExE,MAAA,IAAI,sBAAsB,YAAA,EAAa;AACrC,QAAA,MAAM,QAAA,GAAW,YAAA,CAAY,QAAA,CAAS,UAAA,EAAY,KAAK,CAAA;AACvD,QAAA,OAAO,QAAA,KAAa,MAAA,GAAY,QAAA,CAAS,IAAA,CAAK,QAAQ,CAAA,GAAI,QAAA;AAAA,MAC5D,CAAA,MAAA,IAAW,OAAO,UAAA,KAAe,QAAA,IAAY,eAAe,MAAA,EAAW;AACrE,QAAA,IAAI,OAAO,UAAA,KAAe,QAAA,IAAY,KAAA,CAAM,UAAU,CAAA;AACpD,UAAA,MAAM,IAAI,MAAM,sCAAsC,CAAA;AACxD,QAAA,MAAM,UAAU,IAAI,YAAA,CAAY,KAAK,CAAA,CAAE,EAAE,UAAU,CAAA;AACnD,QAAA,OAAO,QAAA,KAAa,MAAA,GAAY,OAAA,CAAQ,IAAA,CAAK,QAAQ,CAAA,GAAI,OAAA;AAAA,MAC3D;AAAA,IACF;AAEA,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,KAAK,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAiB,QAAA,CAAS,GAAA,EAAkB,KAAA,EAA4B;AACtE,IAAA,IAAI,eAAe,sBAAA,EAAwB;AACzC,MAAA,MAAMC,UAAS,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,KAAK,CAAC,CAAA;AACzC,MAAA,IAAIA,OAAAA,KAAW,CAAA,EAAG,OAAO,IAAI,aAAY,CAAC,CAAA;AAC1C,MAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,IAAA,CAAK,EAAE,QAAQA,OAAAA,EAAO,EAAG,MAAM,GAAG,CAAC,CAAA;AAChE,MAAA,OAAO,QAAQ,CAAA,GAAI,IAAI,gBAAA,CAAiB,KAAA,EAAO,EAAE,CAAA,GAAI,KAAA;AAAA,IACvD;AACA,IAAA,IAAI,GAAA,CAAI,gBAAe,EAAG;AACxB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AACA,IAAA,MAAM,OAAA,GAAU,IAAI,iBAAA,EAAkB;AACtC,IAAA,IAAI,QAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,IAAI,aAAY,CAAC,CAAA;AAGlD,IAAA,MAAM,SAAS,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,KAAK,CAAC,CAAA;AACzC,IAAA,MAAM,SAAS,KAAA,GAAQ,CAAA;AACvB,IAAA,MAAM,kBAAgC,EAAC;AACvC,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,MAAM,iBAAiB,MAAA,CAAO,aAAA,KAAkB,IAAA,IAAQ,MAAA,CAAO,QAAQ,CAAA,MAAO,MAAA;AAC9E,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,KAAK,CAAA;AAClC,MAAA,MAAM,QAAA,GAAA,CAAY,MAAA,GAAS,EAAA,GAAK,CAAA,IAAK,OAAO,QAAA,GAAW,MAAA;AACvD,MAAA,IAAI,MAAA,GAAS,CAAA,IAAK,aAAA,CAAc,MAAM,CAAA,EAAG;AACvC,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,EAAQ,CAAA,EAAA,EAAK;AAC/B,UAAA,eAAA,CAAgB,IAAA,CAAK,EAAE,GAAG,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,aAAA,EAAe,QAAA,EAAU,CAAA,KAAM,CAAA,GAAI,QAAA,GAAW,CAAA,EAAG,CAAA;AAAA,QAClG;AAAA,MACF,CAAA,MAAO;AACL,QAAA,eAAA,CAAgB,IAAA,CAAK,EAAE,GAAG,MAAA,EAAQ,OAAO,IAAA,GAAO,MAAA,EAAQ,aAAA,EAAe,QAAA,EAAU,CAAA;AAAA,MACnF;AAAA,IACF;AACA,IAAA,OAAO,IAAI,aAAY,eAAe,CAAA;AAAA,EACxC;AAAA;AAAA,EAGA,EAAE,KAAA,EAAwC;AACxC,IAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,CAAM,KAAK,CAAA;AACpC,MAAA,MAAM,IAAI,MAAM,6BAA6B,CAAA;AAC/C,IAAA,IAAI,KAAA,KAAU,QAAW,OAAO,IAAA;AAChC,IAAA,aAAA,CAAc,OAAO,OAAO,CAAA;AAC5B,IAAA,IAAI,QAAQ,CAAA,EAAG,MAAM,IAAI,KAAA,CAAM,CAAA,gCAAA,EAAmC,KAAK,CAAA,CAAE,CAAA;AACzE,IAAA,IAAI,KAAK,UAAA,CAAW,KAAA,IAAS,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,EAAG;AACtD,MAAA,MAAM,IAAI,MAAM,qCAAqC,CAAA;AAAA,IACvD;AACA,IAAA,IAAI,KAAA,KAAU,GAAG,OAAO,IAAA;AACxB,IAAA,MAAM,UAAA,GAAa,KAAK,iBAAA,EAAkB;AAC1C,IAAA,UAAA,CAAW,UAAA,CAAW,MAAA,GAAS,CAAC,CAAA,CAAE,KAAA,GAAQ,KAAA;AAC1C,IAAA,OAAO,IAAA,CAAK,OAAO,UAAU,CAAA;AAAA,EAC/B;AAAA,EAIA,IAAA,CACE,WACA,GAAA,EACa;AACb,IAAA,IAAI,OAAO,SAAA,KAAc,QAAA,IAAY,KAAA,CAAM,SAAS,CAAA;AAClD,MAAA,MAAM,IAAI,MAAM,iCAAiC,CAAA;AACnD,IAAA,IAAI,OAAO,SAAA,KAAc,QAAA,EAAU,aAAA,CAAc,WAAW,yBAAyB,CAAA;AACrF,IAAA,IAAI,GAAA,YAAe,YAAA,IAAe,OAAO,SAAA,KAAc,QAAA,EAAU;AAC/D,MAAA,OAAO,KAAK,GAAA,CAAI,YAAA,CAAY,QAAA,CAAS,GAAA,EAAK,SAAS,CAAC,CAAA;AAAA,IACtD;AAEA,IAAA,IAAI,QAAQ,MAAA,EAAW;AACrB,MAAA,MAAM,IAAI,MAAM,6BAA6B,CAAA;AAAA,IAC/C;AAEA,IAAA,IAAI,SAAA,KAAc,QAAW,OAAO,IAAA;AACpC,IAAA,IAAI,OAAO,cAAc,QAAA,EAAU;AACjC,MAAA,IAAI,SAAA,KAAc,GAAG,OAAO,IAAA;AAC5B,MAAA,MAAM,UAAA,GAAa,KAAK,iBAAA,EAAkB;AAC1C,MAAA,UAAA,CAAW,UAAA,CAAW,MAAA,GAAS,CAAC,CAAA,CAAE,QAAA,IAAY,SAAA;AAC9C,MAAA,OAAO,IAAA,CAAK,OAAO,UAAU,CAAA;AAAA,IAC/B;AACA,IAAA,OAAO,IAAA,CAAK,IAAI,SAAwB,CAAA;AAAA,EAC1C;AAAA,EAIA,KAAA,CACE,WACA,GAAA,EACa;AACb,IAAA,MAAM,QAAA,GAAW,OAAO,SAAA,KAAc,QAAA;AACtC,IAAA,MAAM,YAAY,GAAA,YAAe,YAAA;AACjC,IAAA,IAAI,aAAa,QAAA,EAAU,OAAO,KAAK,IAAA,CAAK,CAAC,WAAW,GAAG,CAAA;AAE3D,IAAA,IAAI,GAAA,KAAQ,MAAA,EAAW,MAAM,IAAI,MAAM,8BAA8B,CAAA;AACrE,IAAA,IAAI,SAAA,KAAc,QAAW,OAAO,IAAA;AAEpC,IAAA,OAAO,QAAA,GACH,KAAK,IAAA,CAAK,CAAC,SAAS,CAAA,GACpB,IAAA,CAAK,IAAA,CAAK,EAAA,EAAI,SAAwB,CAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,KAAA,EAA4B;AACjC,IAAA,IAAI,MAAM,KAAK,CAAA,EAAG,MAAM,IAAI,MAAM,8BAA8B,CAAA;AAChE,IAAA,aAAA,CAAc,OAAO,UAAU,CAAA;AAC/B,IAAA,IAAI,KAAA,KAAU,IAAA,CAAK,UAAA,CAAW,MAAA,EAAQ,OAAO,IAAA;AAE7C,IAAA,MAAM,UAAA,GAAa,KAAK,iBAAA,EAAkB;AAE1C,IAAA,UAAA,CAAW,UAAA,CAAW,MAAA,GAAS,CAAC,CAAA,CAAE,MAAA,GAAS,KAAA;AAC3C,IAAA,OAAO,IAAA,CAAK,OAAO,UAAU,CAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,QAAQ,KAAA,EAA4B;AAClC,IAAA,IAAI,UAAU,MAAA,EAAW;AACvB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AACA,IAAA,IAAI,MAAM,KAAK,CAAA,EAAG,MAAM,IAAI,MAAM,qCAAqC,CAAA;AACvE,IAAA,aAAA,CAAc,OAAO,eAAe,CAAA;AACpC,IAAA,IAAI,KAAA,KAAU,GAAG,OAAO,IAAA;AACxB,IAAA,IAAI,KAAA,GAAQ,CAAA,EAAG,MAAM,IAAI,MAAM,4BAA4B,CAAA;AAC3D,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,iBAAA,GAAoB,CAAA,EAAG;AACzC,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAAa,KAAK,iBAAA,EAAkB;AAC1C,IAAA,UAAA,CAAW,UAAA,CAAW,MAAA,GAAS,CAAC,CAAA,CAAE,OAAA,GAAU,KAAA;AAC5C,IAAA,OAAO,IAAA,CAAK,OAAO,UAAU,CAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAY,MAAA,EAA6B;AACvC,IAAA,IAAI,MAAM,MAAM,CAAA,EAAG,MAAM,IAAI,MAAM,0CAA0C,CAAA;AAC7E,IAAA,IAAI,CAAC,OAAO,QAAA,CAAS,MAAM,GAAG,MAAM,IAAI,MAAM,mCAAmC,CAAA;AACjF,IAAA,IAAI,MAAA,GAAS,CAAA,EAAG,MAAM,IAAI,MAAM,iCAAiC,CAAA;AACjE,IAAA,IAAI,MAAA,KAAW,GAAG,OAAO,IAAA;AACzB,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,OAAA,GAAU,CAAA,EAAG;AAC/B,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAAa,KAAK,iBAAA,EAAkB;AAC1C,IAAA,UAAA,CAAW,WAAW,MAAA,GAAS,CAAC,EAAE,iBAAA,GAAoB,IAAA,CAAK,MAAM,MAAM,CAAA;AACvE,IAAA,OAAO,IAAA,CAAK,OAAO,UAAU,CAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,QAAQ,GAAA,EAAsC;AAC5C,IAAA,IAAI,GAAA,KAAQ,MAAA,IAAa,KAAA,CAAM,GAAG,CAAA;AAChC,MAAA,MAAM,IAAI,MAAM,+BAA+B,CAAA;AACjD,IAAA,IAAI,GAAA,KAAQ,QAAW,OAAO,IAAA;AAC9B,IAAA,aAAA,CAAc,KAAK,WAAW,CAAA;AAC9B,IAAA,IAAI,GAAA,KAAQ,GAAG,OAAO,IAAA;AACtB,IAAA,IAAI,GAAA,GAAM,CAAA,EAAG,MAAM,IAAI,MAAM,4BAA4B,CAAA;AAEzD,IAAA,MAAM,UAAA,GAAa,KAAK,iBAAA,EAAkB;AAC1C,IAAA,UAAA,CAAW,UAAA,CAAW,MAAA,GAAS,CAAC,CAAA,CAAE,OAAA,GAAU,GAAA;AAC5C,IAAA,OAAO,IAAA,CAAK,OAAO,UAAU,CAAA;AAAA,EAC/B;AAAA,EAEA,OAAO,KAAA,EAAwC;AAC7C,IAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,CAAM,KAAK,CAAA;AACpC,MAAA,MAAM,IAAI,MAAM,oCAAoC,CAAA;AACtD,IAAA,IAAI,KAAA,KAAU,QAAW,OAAO,IAAA;AAChC,IAAA,aAAA,CAAc,OAAO,UAAU,CAAA;AAC/B,IAAA,IAAI,KAAA,IAAS,CAAA,EAAG,MAAM,IAAI,MAAM,2BAA2B,CAAA;AAE3D,IAAA,MAAM,UAAA,GAAa,KAAK,iBAAA,EAAkB;AAC1C,IAAA,UAAA,CAAW,UAAA,CAAW,MAAA,GAAS,CAAC,CAAA,CAAE,MAAA,GAAS,KAAA;AAC3C,IAAA,OAAO,IAAA,CAAK,OAAO,UAAU,CAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,WAAA,CAAY,OAAe,KAAA,EAA4B;AACrD,IAAA,IAAI,KAAA,CAAM,KAAK,CAAA,IAAK,KAAA,CAAM,KAAK,CAAA;AAC7B,MAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AACrD,IAAA,OAAO,KAAK,QAAA,CAAS,EAAE,OAAO,KAAA,EAAO,IAAA,EAAM,WAAW,CAAA;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,UAAA,CAAW,OAAe,KAAA,EAA4B;AACpD,IAAA,IAAI,KAAA,CAAM,KAAK,CAAA,IAAK,KAAA,CAAM,KAAK,CAAA;AAC7B,MAAA,MAAM,IAAI,MAAM,kCAAkC,CAAA;AACpD,IAAA,OAAO,KAAK,QAAA,CAAS,EAAE,OAAO,KAAA,EAAO,IAAA,EAAM,UAAU,CAAA;AAAA,EACvD;AAAA,EAEQ,SAAS,IAAA,EAAoD;AACnE,IAAA,aAAA,CAAc,IAAA,CAAK,OAAO,YAAY,CAAA;AACtC,IAAA,aAAA,CAAc,IAAA,CAAK,OAAO,YAAY,CAAA;AACtC,IAAA,MAAM,UAAA,GAAa,KAAK,iBAAA,EAAkB;AAC1C,IAAA,MAAM,IAAA,GAAO,UAAA,CAAW,UAAA,CAAW,MAAA,GAAS,CAAC,CAAA;AAC7C,IAAA,IAAI,IAAA,CAAK,KAAA,GAAQ,CAAA,IAAK,IAAA,CAAK,QAAA,KAAa,MAAA,EAAQ,iBAAA,CAAkB,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,IAAI,CAAA;AAC9F,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,OAAO,IAAA,CAAK,OAAO,UAAU,CAAA;AAAA,EAC/B;AAAA,EAEA,cAAA,CAAe,OAAe,KAAA,EAAkC;AAC9D,IAAA,IAAI,KAAA,CAAM,KAAK,CAAA,IAAK,KAAA,CAAM,KAAK,CAAA;AAC7B,MAAA,MAAM,IAAI,MAAM,sCAAsC,CAAA;AACxD,IAAA,aAAA,CAAc,OAAO,wBAAwB,CAAA;AAC7C,IAAA,aAAA,CAAc,OAAO,wBAAwB,CAAA;AAC7C,IAAA,MAAM,UAAA,GAAa,KAAK,KAAA,EAAM;AAE9B,IAAA,MAAM,SAAA,GAAqB;AAAA,MACzB,IAAA,EAAM,KAAA;AAAA,MACN,KAAA,EAAO,KAAA;AAAA,MACP,KAAA,EAAO;AAAA,KACT;AACA,IAAA,MAAM,QAAA,GAAqB;AAAA,MACzB,IAAA,EAAM,MAAA;AAAA,MACN,IAAA,EAAM,SAAA;AAAA,MACN,KAAA;AAAA,MACA,KAAA,EAAO;AAAA,KACT;AACA,IAAA,OAAO,IAAI,iBAAA;AAAA,MACT,QAAA;AAAA,MACA,MAAO,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA,IAAK,KAAK,KAAA,IAAS,CAAA,GAAI,GAAA,GAAM,CAAA,EAAG,KAAK,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,EAAI,IAAA,CAAK,cAAc,CAAA,CAAA,CAAA;AAAA,MAC7F,EAAC;AAAA,MACD,CAAC,UAAU,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,CAAE,cAAA,CAAe,OAAO,KAAK;AAAA,KAC9D;AAAA,EACF;AAAA,EAEA,aAAA,CAAc,OAAe,KAAA,EAAkC;AAC7D,IAAA,IAAI,KAAA,CAAM,KAAK,CAAA,IAAK,KAAA,CAAM,KAAK,CAAA;AAC7B,MAAA,MAAM,IAAI,MAAM,qCAAqC,CAAA;AACvD,IAAA,aAAA,CAAc,OAAO,uBAAuB,CAAA;AAC5C,IAAA,aAAA,CAAc,OAAO,uBAAuB,CAAA;AAC5C,IAAA,MAAM,UAAA,GAAa,KAAK,KAAA,EAAM;AAC9B,IAAA,MAAM,SAAA,GAAqB;AAAA,MACzB,IAAA,EAAM,KAAA;AAAA,MACN,KAAA,EAAO,KAAA;AAAA,MACP,KAAA,EAAO;AAAA,KACT;AACA,IAAA,MAAM,QAAA,GAAqB;AAAA,MACzB,IAAA,EAAM,MAAA;AAAA,MACN,IAAA,EAAM,QAAA;AAAA,MACN,KAAA;AAAA,MACA,KAAA,EAAO;AAAA,KACT;AACA,IAAA,OAAO,IAAI,iBAAA;AAAA,MACT,QAAA;AAAA,MACA,MAAO,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA,IAAK,KAAK,KAAA,IAAS,CAAA,GAAI,GAAA,GAAM,CAAA,EAAG,KAAK,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,EAAI,IAAA,CAAK,cAAc,CAAA,CAAA,CAAA;AAAA,MAC7F,EAAC;AAAA,MACD,CAAC,UAAU,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,CAAE,aAAA,CAAc,OAAO,KAAK;AAAA,KAC7D;AAAA,EACF;AAAA,EAEA,aAAA,GAA6B;AAC3B,IAAA,OAAO,IAAA,CAAK,aAAa,WAAW,CAAA;AAAA,EACtC;AAAA,EAEA,gBAAA,GAAgC;AAC9B,IAAA,OAAO,IAAA,CAAK,aAAa,cAAc,CAAA;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,aAAa,QAAA,EAAiC;AACpD,IAAA,MAAM,OAAA,GAAU,KAAK,iBAAA,EAAkB;AACvC,IAAA,MAAM,OAAA,GAAU,iBAAiB,OAAO,CAAA;AACxC,IAAA,MAAM,GAAA,GAAM,OAAA,KAAY,EAAA,IAAM,OAAA,CAAQ,OAAO,EAAE,KAAA,KAAU,EAAA,GAAK,OAAA,GAAU,OAAA,CAAQ,MAAA,GAAS,CAAA;AACzF,IAAA,OAAA,CAAQ,GAAG,EAAE,QAAA,GAAW,QAAA;AACxB,IAAA,OAAO,IAAA,CAAK,OAAO,OAAO,CAAA;AAAA,EAC5B;AAAA,EAEA,IAAI,WAAA,EAAmD;AACrD,IAAA,IAAI,WAAA,KAAgB,QAAW,OAAO,IAAA;AACtC,IAAA,IAAI,uBAAuB,sBAAA,EAAwB,OAAO,SAAS,CAAC,IAAA,EAAM,WAAW,CAAC,CAAA;AACtF,IAAA,IAAI,WAAA,CAAY,gBAAe,EAAG;AAChC,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AACA,IAAA,MAAM,UAAU,CAAC,GAAG,KAAK,cAAA,EAAgB,GAAG,YAAY,cAAc,CAAA;AACtE,IAAA,OAAO,IAAA,CAAK,OAAO,OAAO,CAAA;AAAA,EAC5B;AAAA,EAEA,UAAU,WAAA,EAAuC;AAC/C,IAAA,MAAM,UAAU,CAAC,GAAG,KAAK,cAAA,EAAgB,GAAG,YAAY,cAAc,CAAA;AACtE,IAAA,OAAO,IAAA,CAAK,OAAO,OAAO,CAAA;AAAA,EAC5B;AAAA,EAEA,OAAA,CAAQ,QAAgB,CAAA,EAAgB;AACtC,IAAA,IAAI,MAAM,KAAK,CAAA,EAAG,MAAM,IAAI,MAAM,6BAA6B,CAAA;AAC/D,IAAA,MAAM,OAAA,GAAU;AAAA,MACd,GAAG,IAAA,CAAK,cAAA;AAAA,MACR;AAAA,QACE,GAAG,aAAA;AAAA,QACH,KAAA;AAAA,QACA,eAAe,KAAA,GAAQ;AAAA;AACzB,KACF;AACA,IAAA,OAAO,IAAA,CAAK,OAAO,OAAO,CAAA;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,UAAU,KAAA,EAA4B;AACpC,IAAA,MAAM,QAAA,GAAW,iBAAiB,KAAK,CAAA;AAEvC,IAAA,MAAM,aAAa,IAAA,CAAK,iBAAA,EAAkB,CAAE,GAAA,CAAI,CAAC,MAAA,KAAW;AAC1D,MAAA,IAAI,CAAC,MAAA,CAAO,KAAA,IAAS,MAAA,CAAO,KAAA,IAAS,GAAG,OAAO,MAAA;AAC/C,MAAA,MAAM,SAAA,GAAY,gBAAA,CAAiB,MAAA,EAAQ,QAAQ,CAAA;AACnD,MAAA,IAAI,cAAc,MAAA,EAAW;AAE3B,QAAA,IAAI,KAAA,GAAQ,WAAA;AACZ,QAAA,IAAI;AACF,UAAA,KAAA,GAAQ,CAAA,CAAA,EAAI,IAAA,CAAK,YAAA,EAAc,CAAA,CAAA,CAAA;AAAA,QACjC,CAAA,CAAA,MAAQ;AAAA,QAER;AACA,QAAA,MAAM,IAAI,0BAAA;AAAA,UACR,CAAA,0BAAA,EAA6B,KAAK,CAAA,YAAA,EAAe,SAAS,CAAA,yFAAA;AAAA,SAE5D;AAAA,MACF;AACA,MAAA,OAAO,EAAE,GAAG,MAAA,EAAQ,KAAA,EAAO,MAAA,CAAO,QAAQ,QAAA,EAAS;AAAA,IACrD,CAAC,CAAA;AACD,IAAA,OAAO,IAAA,CAAK,OAAO,UAAU,CAAA;AAAA,EAC/B;AAAA,EAEA,UAAA,GAA0B;AACxB,IAAA,OAAO,IAAA,CAAK,UAAU,CAAC,CAAA;AAAA,EACzB;AAAA,EAEA,UAAA,GAAa;AACX,IAAA,OAAO,IAAI,iBAAiB,IAAI,CAAA;AAAA,EAClC;AAAA,EAEA,WAAA,GAAc;AACZ,IAAA,OAAO,IAAI,kBAAkB,IAAI,CAAA;AAAA,EACnC;AAAA,EAEA,IAAA,GAAoB;AAClB,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,iBAAA,EAAmB,CAAA;AAAA,EAC7C;AAAA,EAWA,iBAAA,GAAoB;AAClB,IAAA,OAAO,IAAA,CAAK,aAAa,gBAAgB,CAAA;AAAA,EAC3C;AAAA,EAEA,YAAA,GAAuB;AACrB,IAAA,OAAO,UAAU,WAAA,CAAY,IAAA,CAAK,gBAAgB,IAAA,CAAK,gBAAA,EAAkB,CAAC,CAAA;AAAA,EAC5E;AAAA;AAAA,EAGA,KAAA,CAAM,MAAc,CAAA,EAAQ;AAC1B,IAAA,MAAM,GAAA,GAAM,KAAK,QAAA,EAAS;AAC1B,IAAA,IAAI,GAAA,KAAQ,IAAA,EAAM,OAAO,kBAAA,CAAmB,MAAM,GAAG,CAAA;AACrD,IAAA,MAAM,OAAA,GAAU,CAAA,EAAG,GAAG,CAAA,EAAA,EAAK,GAAG,CAAA,CAAA;AAC9B,IAAA,MAAM,MAAA,GAAS,YAAA,CAAa,GAAA,CAAI,OAAO,CAAA;AACvC,IAAA,IAAI,QAAQ,OAAO,MAAA;AACnB,IAAA,MAAM,GAAA,GAAM,kBAAA,CAAmB,IAAA,EAAM,GAAG,CAAA;AACxC,IAAA,YAAA,CAAa,GAAA,CAAI,SAAS,GAAG,CAAA;AAC7B,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEA,IAAI,GAAA,GAAM;AACR,IAAA,OAAO,KAAK,KAAA,EAAM;AAAA,EACpB;AAAA,EAEA,OAAA,CAAQ,MAAc,CAAA,EAAc;AAClC,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,KAAA,EAAM;AAAA,EAC/B;AAAA,EAEA,KAAA,GAAwB;AACtB,IAAA,MAAM,OAAA,GAAU,KAAK,iBAAA,EAAkB;AACvC,IAAA,OACE,mBAAmB,OAAO,CAAA,IACzB,EAAE,IAAA,EAAM,UAAA,EAAY,OAAO,CAAA,EAAE;AAAA,EAElC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,gBAAA,GAA2C;AACzC,IAAA,MAAM,UAAU,IAAA,CAAK,cAAA;AACrB,IAAA,MAAM,GAAA,GAAM,iBAAiB,OAAO,CAAA;AACpC,IAAA,OAAO,QAAQ,EAAA,GAAK,OAAA,CAAQ,CAAC,CAAA,GAAI,QAAQ,GAAG,CAAA;AAAA,EAC9C;AAAA,EAEA,gBAAA,GAA0C;AACxC,IAAA,OAAO,KAAK,iBAAA,EAAkB;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,mBAAA,GAAoC;AAClC,IAAA,MAAM,aAAa,IAAA,CAAK,cAAA;AACxB,IAAA,MAAM,OAAA,GAAU,iBAAiB,UAAU,CAAA;AAC3C,IAAA,OAAO,WACJ,MAAA,CAAO,CAAC,QAAQ,CAAA,KAAM,MAAA,CAAO,QAAQ,CAAA,IAAK,CAAA,KAAM,OAAO,CAAA,CACvD,GAAA,CAAI,CAAC,MAAA,MAAY,EAAE,GAAG,MAAA,EAAQ,QAAA,EAAU,GAAE,CAAE,CAAA;AAAA,EACjD;AAAA,EAEA,gBAAA,CAAiB,KAAA,EAAoB,GAAA,GAAc,CAAA,EAAU;AAC3D,IAAA,OAAO,KAAA,CACJ,qBAAoB,CACpB,GAAA;AAAA,MAAI,CAAC,WACJ,kBAAA,CAAmB,YAAA,CAAY,YAAY,CAAC,MAAM,CAAC,CAAA,EAAG,GAAG;AAAA,KAC3D;AAAA,EACJ;AAAA,EAEA,IAAI,QAAA,GAAmB;AACrB,IAAA,OAAO,KAAK,cAAA,CAAe,MAAA;AAAA,MACzB,CAAC,GAAA,EAAK,MAAA,KAAW,GAAA,GAAM,MAAA,CAAO,QAAA;AAAA,MAC9B;AAAA,KACF;AAAA,EACF;AAAA,EAEA,IAAI,QAAA,GAAqB;AACvB,IAAA,MAAM,UAAA,GAAa,KAAK,gBAAA,EAAiB;AACzC,IAAA,OAAO,YAAY,QAAA,IAAY,MAAA;AAAA,EACjC;AAAA,EAEA,IAAI,UAAA,GAAqB;AACvB,IAAA,MAAM,UAAA,GAAa,KAAK,gBAAA,EAAiB;AACzC,IAAA,OAAO,YAAY,MAAA,IAAU,CAAA;AAAA,EAC/B;AAAA,EAEA,IAAA,GAAwB;AACtB,IAAA,OAAO,IAAI,gBAAgB,IAAI,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,WAAA,CACE,SAAA,EACA,WAAA,GAAsB,CAAA,EACtB,WAAuC,OAAA,EACrB;AAClB,IAAA,OAAO,IAAI,gBAAA,CAAiB,IAAA,EAAM,SAAA,EAAW,aAAa,QAAQ,CAAA;AAAA,EACpE;AAAA,EASA,MAAM,YAAA,EAAiD;AACrD,IAAA,IAAI,YAAA,YAAwB,cAAa,OAAO,IAAI,kBAAkB,CAAC,IAAA,EAAM,YAAY,CAAC,CAAA;AAC1F,IAAA,IAAI,MAAM,YAAY,CAAA,EAAG,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAC5E,IAAA,aAAA,CAAc,cAAc,eAAe,CAAA;AAC3C,IAAA,OAAO,IAAI,gBAAA,CAAiB,IAAA,EAAM,YAAY,CAAA;AAAA,EAChD;AAAA;AAAA;AAAA,EAIA,GAAG,SAAA,EAA8B;AAC/B,IAAA,MAAM,IAAI,MAAM,uDAAuD,CAAA;AAAA,EACzE;AAAA,EAEA,GAAG,OAAA,EAA4B;AAC7B,IAAA,MAAM,IAAI,MAAM,uDAAuD,CAAA;AAAA,EACzE;AACF;AASA,IAAe,sBAAA,GAAf,cAA8C,WAAA,CAAY;AAAA,EAIrC,OAAO,QAAA,EAA8C;AACtE,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,4BAAA,EAA+B,KAAK,IAAI,CAAA,2BAAA,EAA8B,KAAK,IAAI,CAAA,iFAAA,EACL,KAAK,IAAI,CAAA,CAAA;AAAA,KACrF;AAAA,EACF;AAAA,EAIS,IAAA,CAAK,WAA6C,GAAA,EAAgC;AACzF,IAAA,IAAI,OAAO,SAAA,KAAc,QAAA,IAAY,KAAA,CAAM,SAAS,CAAA;AAClD,MAAA,MAAM,IAAI,MAAM,iCAAiC,CAAA;AACnD,IAAA,IAAI,OAAO,SAAA,KAAc,QAAA,EAAU,aAAA,CAAc,WAAW,yBAAyB,CAAA;AACrF,IAAA,IAAI,GAAA,YAAe,WAAA,IAAe,OAAO,SAAA,KAAc,QAAA,EAAU;AAC/D,MAAA,OAAO,KAAK,GAAA,CAAI,WAAA,CAAY,QAAA,CAAS,GAAA,EAAK,SAAS,CAAC,CAAA;AAAA,IACtD;AACA,IAAA,IAAI,GAAA,KAAQ,MAAA,EAAW,MAAM,IAAI,MAAM,6BAA6B,CAAA;AACpE,IAAA,IAAI,SAAA,KAAc,MAAA,IAAa,SAAA,KAAc,CAAA,EAAG,OAAO,IAAA;AACvD,IAAA,IAAI,OAAO,SAAA,KAAc,QAAA,EAAU,OAAO,SAAS,CAAC,IAAA,EAAM,IAAI,WAAA,CAAY,CAAC,CAAA,CAAE,IAAA,CAAK,SAAS,CAAC,CAAC,CAAA;AAC7F,IAAA,OAAO,IAAA,CAAK,IAAI,SAAS,CAAA;AAAA,EAC3B;AAAA,EAES,IAAI,WAAA,EAAmD;AAC9D,IAAA,OAAO,gBAAgB,MAAA,GAAY,IAAA,GAAO,SAAS,CAAC,IAAA,EAAM,WAAW,CAAC,CAAA;AAAA,EACxE;AACF,CAAA;AAEO,IAAM,eAAA,GAAN,MAAM,gBAAA,SAAwB,sBAAA,CAAuB;AAAA,EAG1D,YAA6B,SAAA,EAAwB;AACnD,IAAA,KAAA,CAAM,CAAC,CAAA;AADoB,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAF7B,IAAA,IAAA,CAAmB,IAAA,GAAO,QAAA;AAAA,EAI1B;AAAA,EAES,cAAA,GAA0B;AACjC,IAAA,OAAO,IAAA,CAAK,UAAU,cAAA,EAAe;AAAA,EACvC;AAAA,EAES,QAAA,GAA0B;AACjC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,IAAa,UAAA,GAAyB;AAGpC,IAAA,OAAQ,KAAK,SAAA,CAAoD,UAAA;AAAA,EACnE;AAAA,EAEA,iBAAA,GAA2C;AACzC,IAAA,OAAO,IAAA,CAAK,UAAU,iBAAA,EAAkB;AAAA,EAC1C;AAAA,EAEA,YAAA,GAAuB;AACrB,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,SAAA,CAAU,YAAA,EAAa;AACpD,IAAA,OAAO,IAAI,eAAe,CAAA,MAAA,CAAA;AAAA,EAC5B;AAAA,EAEA,KAAA,GAAwB;AACtB,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,MAAA;AAAA,MACN,KAAA,EAAO,IAAA,CAAK,SAAA,CAAU,KAAA;AAAM,KAC9B;AAAA,EACF;AAAA,EAEA,KAAA,CAAM,MAAc,CAAA,EAAQ;AAC1B,IAAA,OAAO,kBAAA,CAAmB,MAAM,GAAG,CAAA;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKS,UAAU,KAAA,EAA4B;AAC7C,IAAA,OAAO,IAAI,gBAAA,CAAgB,IAAA,CAAK,SAAA,CAAU,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,EAC5D;AAAA,EAEA,IAAA,GAAwB;AACtB,IAAA,OAAO,IAAI,gBAAA,CAAgB,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA;AAAA,EAClD;AACF;AAOO,IAAM,gBAAA,GAAN,MAAM,iBAAA,SAAyB,sBAAA,CAAuB;AAAA,EAG3D,YACmB,SAAA,EACA,SAAA,EACA,WAAA,GAAsB,CAAA,EACtB,WAAuC,OAAA,EACxD;AACA,IAAA,KAAA,CAAM,CAAC,CAAA;AALU,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AACA,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AACA,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AANnB,IAAA,IAAA,CAAmB,IAAA,GAAO,eAAA;AASxB,IAAA,aAAA,CAAc,WAAW,yBAAyB,CAAA;AAClD,IAAA,aAAA,CAAc,aAAa,2BAA2B,CAAA;AACtD,IAAA,IAAI,WAAA,KAAgB,CAAA,EAAG,MAAM,IAAI,MAAM,yCAAyC,CAAA;AAAA,EAClF;AAAA,EAES,cAAA,GAA0B;AACjC,IAAA,OAAO,IAAA,CAAK,UAAU,cAAA,EAAe;AAAA,EACvC;AAAA,EAES,QAAA,GAA0B;AACjC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,IAAa,UAAA,GAAyB;AACpC,IAAA,OAAQ,KAAK,SAAA,CAAoD,UAAA;AAAA,EACnE;AAAA,EAEA,iBAAA,GAA2C;AACzC,IAAA,OAAO,IAAA,CAAK,UAAU,iBAAA,EAAkB;AAAA,EAC1C;AAAA,EAEA,YAAA,GAAuB;AACrB,IAAA,OAAO,UAAA,CAAW,IAAA,CAAK,SAAA,CAAU,YAAA,EAAa,EAAG,KAAK,SAAA,EAAW,IAAA,CAAK,WAAA,EAAa,IAAA,CAAK,QAAQ,CAAA;AAAA,EAClG;AAAA,EAEA,KAAA,GAAwB;AACtB,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,OAAA;AAAA,MACN,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,KAAA,EAAO,IAAA,CAAK,SAAA,CAAU,KAAA;AAAM,KAC9B;AAAA,EACF;AAAA,EAEA,KAAA,CAAM,MAAc,CAAA,EAAQ;AAC1B,IAAA,OAAO,kBAAA,CAAmB,MAAM,GAAG,CAAA;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKS,UAAU,KAAA,EAA4B;AAC7C,IAAA,OAAO,IAAI,iBAAA;AAAA,MACT,IAAA,CAAK,SAAA,CAAU,SAAA,CAAU,KAAK,CAAA;AAAA,MAC9B,IAAA,CAAK,SAAA;AAAA,MACL,IAAA,CAAK,WAAA;AAAA,MACL,IAAA,CAAK;AAAA,KACP;AAAA,EACF;AAAA,EAEA,IAAA,GAAyB;AACvB,IAAA,OAAO,IAAI,iBAAA;AAAA,MACT,IAAA,CAAK,UAAU,IAAA,EAAK;AAAA,MACpB,IAAA,CAAK,SAAA;AAAA,MACL,IAAA,CAAK,WAAA;AAAA,MACL,IAAA,CAAK;AAAA,KACP;AAAA,EACF;AACF;AAEO,IAAM,gBAAA,GAAN,MAAM,iBAAA,SAAyB,sBAAA,CAAuB;AAAA,EAG3D,WAAA,CACmB,SAAA,EACA,KAAA,EACA,SAAA,EACA,SAAA,EACjB;AACA,IAAA,KAAA,CAAM,CAAC,CAAA;AALU,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACA,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AACA,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AANnB,IAAA,IAAA,CAAmB,IAAA,GAAO,SAAA;AAAA,EAS1B;AAAA,EAES,cAAA,GAA0B;AACjC,IAAA,OAAO,IAAA,CAAK,UAAU,cAAA,EAAe;AAAA,EACvC;AAAA,EAES,QAAA,GAA0B;AACjC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,IAAa,UAAA,GAAyB;AAGpC,IAAA,OAAQ,KAAK,SAAA,CAAoD,UAAA;AAAA,EACnE;AAAA,EAEA,iBAAA,GAA2C;AACzC,IAAA,OAAO,IAAA,CAAK,UAAU,iBAAA,EAAkB;AAAA,EAC1C;AAAA;AAAA,EAGA,YAAA,GAAuB;AACrB,IAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,IAAA,CAAK,KAAK,CAAC,CAAA;AAChD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,SAAA,CAAU,YAAA,EAAa;AAC1C,IAAA,OAAO,UAAU,CAAA,GAAI,KAAA,GAAQ,CAAA,EAAG,KAAK,OAAO,KAAK,CAAA,CAAA,CAAA;AAAA,EACnD;AAAA,EAEA,KAAA,GAAwB;AACtB,IAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,IAAA,CAAK,OAAO,KAAA,EAAO,IAAA,CAAK,SAAA,CAAU,KAAA,EAAM,EAAE;AAAA,EAC3E;AAAA,EAEA,KAAA,CAAM,MAAc,CAAA,EAAQ;AAC1B,IAAA,OAAO,kBAAA,CAAmB,MAAM,GAAG,CAAA;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKS,UAAU,KAAA,EAA4B;AAC7C,IAAA,MAAM,QAAA,GAAW,iBAAiB,KAAK,CAAA;AACvC,IAAA,OAAO,IAAI,iBAAA;AAAA,MACT,IAAA,CAAK,SAAA,CAAU,SAAA,CAAU,QAAQ,CAAA;AAAA,MACjC,IAAA,CAAK,KAAA;AAAA,MACL,IAAA,CAAK,SAAA,GAAY,IAAA,CAAK,SAAA,GAAY,QAAA,GAAW,MAAA;AAAA,MAC7C,IAAA,CAAK;AAAA,KACP;AAAA,EACF;AAAA,EAEA,IAAA,GAAyB;AACvB,IAAA,OAAO,IAAI,iBAAA,CAAiB,IAAA,CAAK,UAAU,IAAA,EAAK,EAAG,KAAK,KAAK,CAAA;AAAA,EAC/D;AACF;AAEO,IAAM,gBAAA,GAAN,MAAM,iBAAA,SAAyB,WAAA,CAAY;AAAA,EAGhD,WAAA,CAAY,UAAuB,YAAA,EAA2B;AAC5D,IAAA,IAAI,QAAA,CAAS,gBAAe,EAAG;AAC7B,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AACA,IAAA,KAAA,CAAM,QAAA,CAAS,mBAAmB,CAAA;AAElC,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,IAAA,CAAK,YAAA,GAAe,EAAE,GAAG,YAAA,EAAa;AAAA,IACxC,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,YAAA,GAAe,EAAE,aAAA,EAAe,EAAA,EAAG;AAAA,IAC1C;AAAA,EACF;AAAA,EAEU,OAAO,OAAA,EAA6C;AAC5D,IAAA,OAAO,IAAI,YAAY,OAAO,CAAA;AAAA,EAChC;AAAA,EASA,SAAS,IAAA,EAA4B;AACnC,IAAA,MAAM,UAAA,GAAa,WAAA,CAAY,QAAA,CAAS,GAAG,IAAI,CAAA;AAC/C,IAAA,OAAO,IAAI,aAAA,CAAc,IAAA,EAAM,UAAU,CAAA;AAAA,EAC3C;AAAA,EAEA,IAAI,aAAA,GAAwB;AAC1B,IAAA,OAAO,KAAK,YAAA,CAAa,aAAA;AAAA,EAC3B;AAAA,EAES,QAAA,GAA0B;AACjC,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,EAAS;AAC5B,IAAA,OAAO,IAAA,KAAS,OAAO,IAAA,GAAO,CAAA,EAAA,EAAK,KAAK,YAAA,CAAa,aAAa,IAAI,IAAI,CAAA,CAAA;AAAA,EAC5E;AAAA;AAAA,EAGA,OAAO,aAAA,EAAyC;AAC9C,IAAA,aAAA,CAAc,eAAe,oBAAoB,CAAA;AACjD,IAAA,MAAM,SAAA,GAAY,EAAE,aAAA,EAAc;AAClC,IAAA,OAAO,IAAI,iBAAA,CAAiB,IAAA,EAAM,SAAS,CAAA;AAAA,EAC7C;AAAA,EAEA,WAAA,GAAiC;AAC/B,IAAA,OAAO,IAAI,iBAAA,CAAkB,IAAA,EAAM,MAAA,EAAW,IAAI,CAAA;AAAA,EACpD;AAAA;AAAA,EAGS,YAAA,GAAuB;AAC9B,IAAA,OAAO,iBAAA,CAAkB,IAAI,CAAA,IAAK,KAAA,CAAM,YAAA,EAAa;AAAA,EACvD;AAAA,EAES,KAAA,GAAa;AACpB,IAAA,OAAO,eAAe,IAAI,CAAA;AAAA,EAC5B;AAAA,EAES,IAAA,GAAyB;AAChC,IAAA,MAAM,QAAA,GAAW,IAAI,WAAA,CAAY,IAAA,CAAK,mBAAmB,CAAA;AACzD,IAAA,MAAM,gBAAgB,IAAA,CAAK,aAAA;AAC3B,IAAA,MAAM,SAAA,GAAY,EAAE,aAAA,EAAc;AAClC,IAAA,OAAO,IAAI,iBAAA,CAAiB,QAAA,EAAU,SAAS,CAAA;AAAA,EACjD;AACF;AAEO,IAAM,iBAAA,GAAN,MAAM,kBAAA,SAA0B,WAAA,CAAY;AAAA,EAIjD,WAAA,CACE,QAAA,EACA,YAAA,EACA,aAAA,GAAyB,KAAA,EACzB;AACA,IAAA,IAAI,QAAA,CAAS,gBAAe,EAAG;AAC7B,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AACA,IAAA,KAAA,CAAM,QAAA,CAAS,mBAAmB,CAAA;AAElC,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,IAAA,CAAK,YAAA,GAAe,EAAE,GAAG,YAAA,EAAa;AAAA,IACxC,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,YAAA,GAAe,EAAE,aAAA,EAAe,EAAA,EAAG;AAAA,IAC1C;AACA,IAAA,IAAA,CAAK,aAAA,GAAgB,iBAAiB,QAAA,YAAoB,gBAAA;AAAA,EAC5D;AAAA,EAEU,OAAO,OAAA,EAA6C;AAC5D,IAAA,OAAO,IAAI,YAAY,OAAO,CAAA;AAAA,EAChC;AAAA,EASA,SAAS,IAAA,EAA4B;AACnC,IAAA,MAAM,UAAA,GAAa,WAAA,CAAY,QAAA,CAAS,GAAG,IAAI,CAAA;AAC/C,IAAA,OAAO,IAAI,aAAA,CAAc,IAAA,EAAM,UAAU,CAAA;AAAA,EAC3C;AAAA,EAEA,IAAI,aAAA,GAAwB;AAC1B,IAAA,OAAO,KAAK,YAAA,CAAa,aAAA;AAAA,EAC3B;AAAA,EAES,QAAA,GAA0B;AACjC,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,EAAS;AAC5B,IAAA,OAAO,SAAS,IAAA,GAAO,IAAA,GAAO,KAAK,IAAA,CAAK,aAAA,GAAgB,IAAI,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,YAAA,CAAa,aAAa,CAAA,CAAA,EAAI,IAAA,CAAK,aAAa,EAAA,IAAM,EAAE,IAAI,IAAI,CAAA,CAAA;AAAA,EACxI;AAAA,EAEA,OAAO,aAAA,EAA0C;AAC/C,IAAA,aAAA,CAAc,eAAe,oBAAoB,CAAA;AACjD,IAAA,MAAM,YAAY,EAAE,aAAA,EAAe,EAAA,EAAI,IAAA,CAAK,aAAa,EAAA,EAAG;AAC5D,IAAA,OAAO,IAAI,kBAAA,CAAkB,IAAA,EAAM,SAAA,EAAW,KAAK,aAAa,CAAA;AAAA,EAClE;AAAA;AAAA,EAGS,YAAA,GAAuB;AAC9B,IAAA,OAAO,iBAAA,CAAkB,IAAI,CAAA,IAAK,KAAA,CAAM,YAAA,EAAa;AAAA,EACvD;AAAA,EAES,KAAA,GAAa;AACpB,IAAA,OAAO,eAAe,IAAI,CAAA;AAAA,EAC5B;AAAA,EAES,IAAA,GAA0B;AACjC,IAAA,MAAM,QAAA,GAAW,IAAI,WAAA,CAAY,IAAA,CAAK,mBAAmB,CAAA;AACzD,IAAA,MAAM,gBAAgB,IAAA,CAAK,aAAA;AAC3B,IAAA,MAAM,YAAY,EAAE,aAAA,EAAe,EAAA,EAAI,IAAA,CAAK,aAAa,EAAA,EAAG;AAC5D,IAAA,OAAO,IAAI,kBAAA,CAAkB,QAAA,EAAU,SAAA,EAAW,KAAK,aAAa,CAAA;AAAA,EACtE;AACF;AAEO,IAAM,iBAAA,GAAN,MAAM,kBAAA,SAA0B,WAAA,CAAY;AAAA,EAIjD,YAAY,UAAA,EAAoB;AAC9B,IAAA,KAAA,CAAM,EAAE,CAAA;AACR,IAAA,IAAA,CAAK,kBAAA,GAAqB,UAAA;AAC1B,IAAA,IAAA,CAAK,SAAA,GAAY,KAAA,CAAM,UAAA,EAAY,CAAC,CAAA;AAAA,EACtC;AAAA,EAES,cAAA,GAA0B;AACjC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAES,QAAA,GAA0B;AACjC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEU,OAAO,OAAA,EAA6C;AAC5D,IAAA,OAAO,IAAI,YAAY,OAAO,CAAA;AAAA,EAChC;AAAA,EAES,KAAA,CAAM,OAAe,CAAA,EAAQ;AAEpC,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EACd;AAAA,EAES,YAAA,GAAuB;AAC9B,IAAA,OAAO,IAAA,CAAK,kBAAA;AAAA,EACd;AAAA;AAAA,EAGS,GAAG,SAAA,EAA8B;AACxC,IAAA,MAAM,IAAI,gBAAA,CAAiB,IAAA,CAAK,kBAAA,EAAoB,IAAI,CAAA;AAAA,EAC1D;AAAA;AAAA,EAGS,GAAG,OAAA,EAA4B;AACtC,IAAA,MAAM,IAAI,gBAAA,CAAiB,IAAA,CAAK,kBAAA,EAAoB,IAAI,CAAA;AAAA,EAC1D;AAAA,EAES,KAAA,GAAwB;AAG/B,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AAAA,EAES,IAAA,GAA0B;AACjC,IAAA,OAAO,IAAI,kBAAA,CAAkB,IAAA,CAAK,kBAAkB,CAAA;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,aAAA,GAAyB;AACvB,IAAA,IAAI;AACF,MAAA,eAAA,CAAgB,IAAA,CAAK,oBAAoB,CAAC,CAAA;AAC1C,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,KAAA,YAAiB,6BAA6B,OAAO,KAAA;AACzD,MAAA,IAAI,KAAA,YAAiB,4BAA4B,OAAO,IAAA;AACxD,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMS,UAAA,GAAgC;AACvC,IAAA,OAAO,IAAA,CAAK,UAAU,CAAC,CAAA;AAAA,EACzB;AAAA,EAES,UAAU,KAAA,EAAkC;AACnD,IAAA,OAAO,IAAI,mBAAkB,eAAA,CAAgB,IAAA,CAAK,oBAAoB,gBAAA,CAAiB,KAAK,CAAC,CAAC,CAAA;AAAA,EAChG;AACF;AASO,IAAM,iBAAA,GAAN,MAAM,kBAAA,SAA0B,WAAA,CAAY;AAAA,EACjD,YACmB,OAAA,EAEA,cAAA,EACjB,OAAA,GAAiC,IAChB,YAAA,EACjB;AAEA,IAAA,KAAA,CAAM,OAAA,CAAQ,MAAA,GAAS,CAAA,GAAI,OAAA,GAAU,CAAC,CAAA;AAPrB,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAEA,IAAA,IAAA,CAAA,cAAA,GAAA,cAAA;AAEA,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AAAA,EAInB;AAAA,EAEU,OAAO,OAAA,EAAmD;AAElE,IAAA,OAAO,IAAI,mBAAkB,IAAA,CAAK,OAAA,EAAS,KAAK,cAAA,EAAgB,OAAA,EAAS,KAAK,YAAY,CAAA;AAAA,EAC5F;AAAA,EAES,cAAA,GAA0B;AACjC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAES,QAAA,GAA0B;AACjC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAES,EAAE,MAAA,EAAyC;AAClD,IAAA,MAAM,IAAI,MAAM,0DAA0D,CAAA;AAAA,EAC5E;AAAA,EAES,OAAO,MAAA,EAA6B;AAC3C,IAAA,MAAM,IAAI,MAAM,qCAAqC,CAAA;AAAA,EACvD;AAAA,EAES,QAAQ,MAAA,EAA6B;AAC5C,IAAA,MAAM,IAAI,MAAM,sCAAsC,CAAA;AAAA,EACxD;AAAA,EAES,YAAY,OAAA,EAA8B;AACjD,IAAA,MAAM,IAAI,MAAM,0CAA0C,CAAA;AAAA,EAC5D;AAAA,EAES,QAAQ,IAAA,EAAuC;AACtD,IAAA,MAAM,IAAI,MAAM,sCAAsC,CAAA;AAAA,EACxD;AAAA,EAES,OAAO,MAAA,EAAyC;AACvD,IAAA,MAAM,IAAI,MAAM,qCAAqC,CAAA;AAAA,EACvD;AAAA,EAES,WAAA,CAAY,QAAgB,MAAA,EAA6B;AAChE,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AAAA,EAES,UAAA,CAAW,QAAgB,MAAA,EAA6B;AAC/D,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AAAA,EAES,aAAA,GAA6B;AACpC,IAAA,MAAM,IAAI,MAAM,wCAAwC,CAAA;AAAA,EAC1D;AAAA,EAES,gBAAA,GAAgC;AACvC,IAAA,MAAM,IAAI,MAAM,2CAA2C,CAAA;AAAA,EAC7D;AAAA,EAES,iBAAA,GAAiC;AACxC,IAAA,MAAM,IAAI,MAAM,6CAA6C,CAAA;AAAA,EAC/D;AAAA,EAES,KAAA,GAAwB;AAC/B,IAAA,MAAM,UAAA,GAAa,MAAM,KAAA,EAAM;AAG/B,IAAA,MAAM,MAAA,GAAS,UAAA,CAAW,IAAA,KAAS,UAAA,IAAc,WAAW,KAAA,KAAU,CAAA;AAEtE,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,OAAO,IAAA,CAAK,OAAA;AAAA,IACd;AAEA,IAAA,MAAM,QAAA,GAAqD;AAAA,MACzD,EAAE,IAAA,EAAM,IAAA,CAAK,OAAA,EAAS,MAAM,CAAA,EAAE;AAAA,MAC9B,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,CAAA;AAAE,KAC9B;AAEA,IAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,QAAA,EAAS;AAAA,EACjC;AAAA,EAES,YAAA,GAAuB;AAC9B,IAAA,MAAM,IAAA,GAAuB,EAAE,IAAA,EAAM,IAAA,CAAK,cAAA,EAAe,EAAG,IAAA,EAAM,CAAA,EAAG,KAAA,EAAO,SAAA,CAAU,IAAA,CAAK,OAAO,CAAA,EAAE;AACpG,IAAA,OAAO,SAAA,CAAU,CAAC,IAAA,EAAM,GAAG,WAAA,CAAY,IAAA,CAAK,cAAA,EAAgB,IAAA,CAAK,gBAAA,EAAkB,CAAC,CAAC,CAAA;AAAA,EACvF;AAAA,EAES,IAAA,GAA0B;AACjC,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,iBAAA,EAAmB,CAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOS,UAAU,KAAA,EAAkC;AACnD,IAAA,MAAM,QAAA,GAAW,iBAAiB,KAAK,CAAA;AACvC,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACtB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AACA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,YAAA,CAAa,QAAQ,CAAA;AAC3C,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,SAAA,CAAU,QAAQ,EAAE,iBAAA,EAAkB;AAC5D,IAAA,OAAO,IAAI,mBAAkB,QAAA,CAAS,OAAA,EAAS,SAAS,cAAA,EAAgB,OAAA,EAAS,SAAS,YAAY,CAAA;AAAA,EACxG;AAAA,EAEA,MAAM,KAAA,EAAkC;AACtC,IAAA,IAAI,MAAM,KAAK,CAAA,EAAG,MAAM,IAAI,MAAM,6BAA6B,CAAA;AAC/D,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA,KAAM,KAAA;AACxB,MAAA,MAAM,IAAI,MAAM,6BAA6B,CAAA;AAC/C,IAAA,IAAI,KAAA,GAAQ,CAAA,EAAG,MAAM,IAAI,MAAM,yCAAyC,CAAA;AAGxE,IAAA,MAAM,OAAA,GAAmB;AAAA,MACvB,IAAA,EAAM,KAAA;AAAA,MACN,KAAA;AAAA,MACA,KAAA,EAAO,KAAK,KAAA;AAAM,KACpB;AACA,IAAA,MAAM,UAAA,GAAa,MACjB,KAAA,KAAU,CAAA,GAAI,MAAM,KAAA,KAAU,CAAA,GAAI,IAAA,CAAK,YAAA,KAAiB,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,IAAA,CAAK,cAAc,CAAA,CAAA,CAAA;AAEzF,IAAA,OAAO,IAAI,kBAAA,CAAkB,OAAA,EAAS,UAAA,EAAY,EAAC,EAAG,CAAC,KAAA,KAAU,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,CAAE,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,EACrG;AACF;AASA,IAAM,uBAAA,GAAN,MAAM,wBAAA,SAAgC,sBAAA,CAAuB;AAAA,EAG3D,YAAqB,KAAA,EAA+B;AAClD,IAAA,KAAA,CAAM,CAAC,CAAA;AADY,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAFrB,IAAA,IAAA,CAAmB,IAAA,GAAO,YAAA;AAAA,EAI1B;AAAA,EAES,cAAA,GAA0B;AACjC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAES,QAAA,GAA0B;AACjC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAES,iBAAA,GAA2C;AAClD,IAAA,OAAO,EAAC;AAAA,EACV;AAAA,EAES,KAAA,GAAwB;AAC/B,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,KAAA;AAAA,MACN,QAAA,EAAU,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,QAC/B,IAAA,EAAM,EAAE,KAAA,EAAM;AAAA,QACd,IAAA,EAAM;AAAA,OACR,CAAE;AAAA,KACJ;AAAA,EACF;AAAA,EAES,YAAA,GAAuB;AAC9B,IAAA,OAAO,SAAA;AAAA,MACL,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AACvB,QAAA,IAAI,KAAA;AACJ,QAAA,IAAI;AACF,UAAA,KAAA,GAAQ,SAAA,CAAU,IAAA,CAAK,KAAA,EAAO,CAAA;AAAA,QAChC,CAAA,CAAA,MAAQ;AAAA,QAER;AACA,QAAA,OAAO,EAAE,IAAA,EAAM,IAAA,CAAK,cAAa,EAAG,IAAA,EAAM,GAAG,KAAA,EAAM;AAAA,MACrD,CAAC;AAAA,KACH;AAAA,EACF;AAAA,EAES,KAAA,CAAM,MAAc,CAAA,EAAQ;AACnC,IAAA,OAAO,kBAAA,CAAmB,MAAM,GAAG,CAAA;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOS,UAAU,KAAA,EAA4B;AAC7C,IAAA,gBAAA,CAAiB,KAAK,CAAA;AACtB,IAAA,OAAO,IAAI,wBAAA;AAAA,MACT,IAAA,CAAK,MAAM,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,SAAA,CAAU,KAAK,CAAC;AAAA,KAC1C;AAAA,EACF;AAAA,EAES,IAAA,GAAgC;AACvC,IAAA,OAAO,IAAI,wBAAA,CAAwB,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAC,CAAA;AAAA,EACpE;AACF,CAAA;AAGA,IAAM,iBAAA,GAAN,MAAM,kBAAA,SAA0B,sBAAA,CAAuB;AAAA,EAGrD,YAA6B,KAAA,EAA+B;AAC1D,IAAA,KAAA,CAAM,CAAC,CAAA;AADoB,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAF7B,IAAA,IAAA,CAAmB,IAAA,GAAO,SAAA;AAAA,EAI1B;AAAA,EAES,cAAA,GAA0B;AACjC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAES,QAAA,GAA0B;AACjC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAES,iBAAA,GAA2C;AAClD,IAAA,OAAO,EAAC;AAAA,EACV;AAAA,EAES,KAAA,GAAwB;AAC/B,IAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,QAAA,EAAU,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,EAAO,CAAA,EAAE;AAAA,EACnE;AAAA,EAES,YAAA,GAAuB;AAC9B,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAA,EAAI,CAAA,CAAE,YAAA,EAAc,CAAA,CAAA,CAAG,CAAA,CAAE,IAAA,CAAK,KAAK,CAAA;AAAA,EAClE;AAAA,EAES,KAAA,CAAM,MAAc,CAAA,EAAQ;AACnC,IAAA,OAAO,kBAAA,CAAmB,MAAM,GAAG,CAAA;AAAA,EACrC;AAAA;AAAA,EAGS,UAAU,KAAA,EAA4B;AAC7C,IAAA,gBAAA,CAAiB,KAAK,CAAA;AACtB,IAAA,OAAO,IAAI,kBAAA,CAAkB,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,SAAA,CAAU,KAAK,CAAC,CAAC,CAAA;AAAA,EACxE;AAAA,EAES,IAAA,GAA0B;AACjC,IAAA,OAAO,IAAI,kBAAA,CAAkB,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAC,CAAA;AAAA,EAC9D;AACF,CAAA;AASO,SAAS,SAAS,KAAA,EAA4C;AACnE,EAAA,MAAM,aAAa,KAAA,CAChB,MAAA,CAAO,CAAC,CAAA,KAAwB,MAAM,MAAS,CAAA,CAC/C,OAAA,CAAQ,CAAC,MAAO,CAAA,YAAa,uBAAA,GAA0B,EAAE,KAAA,GAAQ,CAAC,CAAC,CAAE,CAAA;AACxE,EAAA,IAAI,WAAW,MAAA,KAAW,CAAA,EAAG,OAAO,IAAI,YAAY,CAAC,CAAA;AACrD,EAAA,IAAI,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG,OAAO,WAAW,CAAC,CAAA;AAChD,EAAA,OAAO,IAAI,wBAAwB,UAAU,CAAA;AAC/C;;;ACr8CA,IAAM,MAAA,GAAS,CACb,KAAA,EACA,UAAA,EACA,aACgB,WAAA,CAAY,QAAA,CAAS,KAAA,EAAO,UAAA,EAAY,QAAQ,CAAA;AAElE,MAAA,CAAO,CAAA,GAAI,CAAC,KAAA,KAAwC;AAClD,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,WAAA,CAAY,SAAS,KAAK,CAAA;AAAA,EACnC;AACA,EAAA,OAAO,IAAI,WAAA,CAAY,CAAC,CAAA,CAAE,EAAE,KAAK,CAAA;AACnC,CAAA;AACA,MAAA,CAAO,IAAA,GAAO,MAAmB,IAAI,WAAA,CAAY,CAAC,CAAA,CAAE,GAAA,EAAI,CAAE,MAAA,CAAO,CAAC,CAAA;AAClE,MAAA,CAAO,KAAK,MAAmB,IAAI,WAAA,CAAY,CAAC,EAAE,EAAA,EAAG;AACrD,MAAA,CAAO,KAAK,MAAmB,IAAI,WAAA,CAAY,CAAC,EAAE,EAAA,EAAG;AACrD,MAAA,CAAO,KAAK,MAAmB,IAAI,WAAA,CAAY,CAAC,EAAE,EAAA,EAAG;AACrD,MAAA,CAAO,MAAM,MAAmB,IAAI,WAAA,CAAY,CAAC,EAAE,GAAA,EAAI;AACvD,MAAA,CAAO,MAAM,MAAmB,IAAI,WAAA,CAAY,CAAC,EAAE,GAAA,EAAI;AACvD,MAAA,CAAO,MAAM,MAAmB,IAAI,WAAA,CAAY,CAAC,EAAE,GAAA,EAAI;AACvD,MAAA,CAAO,OAAO,MAAmB,IAAI,WAAA,CAAY,CAAC,EAAE,IAAA,EAAK;AACzD,MAAA,CAAO,IAAA,GAAO,CAAC,CAAA,KAA2B,IAAI,YAAY,CAAC,CAAA,CAAE,KAAK,CAAC,CAAA;AAE5D,SAAS,EAAE,KAAA,EAAqC;AACrD,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,WAAA,CAAY,SAAS,KAAK,CAAA;AAAA,EACnC;AACA,EAAA,OAAO,IAAI,WAAA,CAAY,CAAC,CAAA,CAAE,EAAE,KAAK,CAAA;AACnC;AAEO,IAAM,EAAA,GAAK,IAAI,WAAA,CAAY,CAAC,EAAE,EAAA;AAC9B,IAAM,EAAA,GAAK,IAAI,WAAA,CAAY,CAAC,EAAE,EAAA;AAC9B,IAAM,EAAA,GAAK,IAAI,WAAA,CAAY,CAAC,EAAE,EAAA;AAC9B,IAAM,GAAA,GAAM,IAAI,WAAA,CAAY,CAAC,EAAE,GAAA;AAC/B,IAAM,GAAA,GAAM,IAAI,WAAA,CAAY,CAAC,EAAE,GAAA;AAC/B,IAAM,GAAA,GAAM,IAAI,WAAA,CAAY,CAAC,EAAE,GAAA;AAC/B,IAAM,IAAA,GAAO,IAAI,WAAA,CAAY,CAAC,EAAE,GAAA,EAAI,CAAE,OAAO,CAAC;AAC9C,IAAM,IAAA,GAAO,IAAI,WAAA,CAAY,CAAC,EAAE,IAAA;AAChC,IAAM,IAAA,GAAO,CAAC,CAAA,KAAc,IAAI,YAAY,CAAC,CAAA,CAAE,KAAK,CAAC;AAErD,IAAM,IAAA,GAAoB;AAE1B,IAAM,eAAA,GAAkB,GAAA,CAAI,WAAA,CAAY,GAAI;;;AC5BnD,IAAM,UAAA,GAAa,CAAA;AAEnB,IAAM,iBAAA,GAAoB,GAAA,CAAI,WAAA,CAAY,GAAI,CAAA;AAGvC,SAAS,cAAA,GAAuB;AACrC,EAAA,iBAAA,CAAkB,KAAA,EAAM;AACxB,EAAA,gBAAA,CAAiB,KAAA,EAAM;AACzB;AAEO,SAAS,kBAAkB,GAAA,EAA0B;AAC1D,EAAA,IAAI,GAAA,CAAI,YAAY,MAAA,IAAa,CAAC,OAAO,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA,EAAG;AAC9D,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,cAAA,EAAiB,GAAA,CAAI,KAAK,CAAA,iCAAA,EAAoC,IAAI,OAAO,CAAA,kDAAA;AAAA,KAC3E;AAAA,EACF;AACA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,KAAA;AAAA,IACN,OAAO,GAAA,CAAI,KAAA;AAAA,IACX,MAAA,EAAQ,GAAA,CAAI,MAAA,GAAS,CAAA,GAAI,IAAI,MAAA,GAAS,MAAA;AAAA,IACtC,OAAA,EAAS,GAAA,CAAI,OAAA,GAAU,CAAA,GAAI,IAAI,OAAA,GAAU,MAAA;AAAA,IACzC,OAAA,EAAS,GAAA,CAAI,OAAA,GAAU,CAAA,GAAI,IAAI,OAAA,GAAU;AAAA,GAC3C;AACF;AAOO,IAAM,kBAAA,GAAN,MAAM,mBAAA,SAA2B,KAAA,CAAM;AAAA,EAC5C,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,oBAAA;AACZ,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,mBAAA,CAAmB,SAAS,CAAA;AAAA,EAC1D;AACF;AAgBO,SAAS,iBAAA,CACd,KAAA,EACA,KAAA,EACA,IAAA,EACA,oBAAoB,KAAA,EACD;AACnB,EAAA,MAAM,IAAI,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,KAAK,CAAC,CAAA;AACpC,EAAA,IAAI,CAAA,IAAK,CAAA,IAAK,iBAAA,EAAmB,OAAO,MAAA;AACxC,EAAA,MAAM,MAAA,GAAS,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,IAAA,CAAK,KAAK,CAAC,CAAA;AACjD,EAAA,MAAM,CAAA,GAAI,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,IAAA,CAAK,KAAK,CAAC,CAAA;AAC5C,EAAA,IAAI,CAAA,KAAM,GAAG,OAAO,MAAA;AACpB,EAAA,IAAI,MAAM,CAAA,KAAM,IAAA,CAAK,SAAS,SAAA,IAAa,MAAA,KAAW,IAAI,OAAO,QAAA;AACjE,EAAA,IAAI,CAAA,IAAK,CAAA,IAAK,MAAA,KAAW,CAAA,EAAG,OAAO,MAAA;AACnC,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,KAAS,SAAA,GAAY,aAAA,GAAgB,YAAA;AACvD,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,IAAA,KAAS,SAAA,GAAY,SAAA,GAAY,QAAA;AACpD,EAAA,MAAM,IAAI,kBAAA;AAAA,IACR,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,IAAA,CAAK,KAAK,CAAA,EAAA,EAAK,IAAA,CAAK,KAAK,CAAA,KAAA,EAAQ,CAAC,IAAI,KAAK,CAAA,oCAAA,EAAuC,KAAK,CAAA,CAAA,EAC7F,CAAC,OAAO,MAAM,CAAA,oBAAA,EAAuB,CAAC,CAAA,CAAA,EAAI,KAAK,CAAA,WAAA,EAAc,CAAC,CAAA,GAAA,EAAM,KAAK,KAAK,IAAI,CAAA,IAAA,EAAO,MAAM,CAAA,EAAA,EAAK,CAAC,CAAA,WAAA,EAC7F,KAAK,CAAA,CAAA,EAAI,CAAC,OAAO,MAAM,CAAA,SAAA,EAAY,KAAK,CAAA,eAAA,EAAkB,KAAK,KAAK,IAAI,CAAA,CAAA,EAAI,MAAM,CAAA,EAAA,EAAK,CAAC,CAAA,uDAAA;AAAA,GAEvG;AACF;AAEO,SAAS,mBACd,OAAA,EAC4B;AAC5B,EAAA,IAAI,CAAC,OAAA,IAAW,OAAA,CAAQ,MAAA,KAAW,GAAG,OAAO,MAAA;AAE7C,EAAA,MAAM,WAAqD,EAAC;AAC5D,EAAA,IAAI,WAAA,GAAc,CAAA;AAElB,EAAA,KAAA,MAAW,OAAO,OAAA,EAAS;AACzB,IAAA,MAAM,OAAe,GAAA,CAAI,aAAA,IAAiB,GAAA,CAAI,KAAA,GAAQ,IAAI,EAAA,GAAK,CAAA;AAC/D,IAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,CAAM,IAAA,CAAK,IAAI,GAAA,CAAI,KAAA,IAAS,CAAC,CAAC,CAAA;AAEjD,IAAA,WAAA,IAAe,IAAI,QAAA,IAAY,CAAA;AAG/B,IAAA,IAAA,CAAK,GAAA,CAAI,KAAA,IAAS,CAAA,KAAM,CAAA,IAAK,UAAU,CAAA,EAAG;AAI1C,IAAA,MAAM,mBAAA,GACJ,CAAC,GAAA,CAAI,IAAA,IAAQ,IAAI,MAAA,GAAS,CAAA,IAAK,IAAI,MAAA,GAAS,KAAA;AAC9C,IAAA,MAAM,aAAA,GAAgB,mBAAA,GAClB,EAAE,KAAA,EAAO,OAAO,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,MAAM,CAAA,EAAG,IAAA,EAAM,SAAA,KACrD,GAAA,CAAI,IAAA;AAER,IAAA,MAAM,GAAA,GAAe,kBAAkB,GAAG,CAAA;AAE1C,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI,GAAA,CAAI,QAAA,IAAY,GAAA,CAAI,QAAA,KAAa,MAAA,EAAQ;AAC3C,MAAA,IAAI,GAAA,CAAI,oBAAoB,CAAA,EAAG;AAC7B,QAAA,MAAM,IAAI,KAAA;AAAA,UACR;AAAA,SACF;AAAA,MACF;AAGA,MAAA,IAAI,MAAA;AACJ,MAAA,IAAI,GAAA,CAAI,UAAU,EAAA,EAAI;AACpB,QAAA,MAAA,GAAS,EAAE,IAAA,EAAM,SAAA,EAAW,UAAU,GAAA,CAAI,QAAA,EAAU,OAAO,GAAA,EAAI;AAAA,MACjE,CAAA,MAAO;AACL,QAAA,MAAM,CAAA,GAAI,GAAA,CAAI,QAAA,KAAa,gBAAA,GAAmB,CAAA,GAAI,CAAA;AAClD,QAAA,MAAM,IAAA,GAAO,GAAA,CAAI,QAAA,KAAa,cAAA,GAAiB,QAAA,GAAW,SAAA;AAC1D,QAAA,MAAM,OAAgB,EAAE,IAAA,EAAM,OAAO,KAAA,EAAO,CAAA,EAAG,OAAO,GAAA,EAAI;AAC1D,QAAA,MAAA,GAAS,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,KAAA,EAAO,CAAA,EAAG,OAAO,IAAA,EAAK;AAAA,MACvD;AACA,MAAA,IAAA,GAAO,EAAE,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,OAAO,MAAA,EAAO;AAAA,IAC7C,CAAA,MAAA,IAAW,aAAA,IAAiB,aAAA,CAAc,KAAA,GAAQ,CAAA,EAAG;AACnD,MAAA,IAAI,GAAA,CAAI,oBAAoB,CAAA,EAAG;AAC7B,QAAA,MAAM,IAAI,KAAA;AAAA,UACR;AAAA,SACF;AAAA,MACF;AACA,MAAA,MAAM,UAAU,iBAAA,CAAkB,KAAA,EAAO,GAAA,CAAI,KAAA,EAAO,eAAe,mBAAmB,CAAA;AACtF,MAAA,MAAM,MAAA,GAAS,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,aAAA,CAAc,KAAK,CAAC,CAAA;AAC1D,MAAA,MAAM,CAAA,GAAI,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,aAAA,CAAc,KAAK,CAAC,CAAA;AACrD,MAAA,MAAM,QAAA,GACJ,YAAY,MAAA,GAAS,GAAA,GAAO,EAAE,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,GAAA,EAAI;AAC/D,MAAA,IAAI,MAAA,KAAW,CAAA,IAAK,CAAA,IAAK,CAAA,EAAG;AAC1B,QAAA,IAAA,GAAO,QAAA;AAAA,MACT,CAAA,MAAA,IAAW,CAAA,KAAM,CAAA,IAAK,aAAA,CAAc,SAAS,SAAA,EAAW;AACtD,QAAA,IAAA,GAAO,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,MAAA,EAAQ,OAAO,QAAA,EAAS;AAAA,MACzD,CAAA,MAAO;AACL,QAAA,MAAM,YAAqB,EAAE,IAAA,EAAM,OAAO,KAAA,EAAO,MAAA,EAAQ,OAAO,QAAA,EAAS;AACzE,QAAA,IAAA,GAAO,EAAE,MAAM,MAAA,EAAQ,IAAA,EAAM,cAAc,IAAA,EAAM,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,SAAA,EAAU;AAAA,MAC9E;AAAA,IACF,CAAA,MAAO;AACL,MAAA,IAAA,GAAO;AAAA,QACL,IAAA,EAAM,KAAA;AAAA,QACN,KAAA;AAAA,QACA,KAAA,EAAO,GAAA;AAAA,QACP,iBAAA,EAAmB,GAAA,CAAI,iBAAA,GAAoB,CAAA,GAAI,IAAI,iBAAA,GAAoB;AAAA,OACzE;AAAA,IACF;AAEA,IAAA,QAAA,CAAS,IAAA,CAAK,EAAE,IAAA,EAAM,IAAA,EAAM,CAAA;AAAA,EAC9B;AAEA,EAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,IAAA,OAAO,EAAE,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,WAAA,EAAY;AAAA,EAChD;AAEA,EAAA,MAAM,GAAA,GAAe,EAAE,IAAA,EAAM,KAAA,EAAO,QAAA,EAAS;AAC7C,EAAA,IAAI,WAAA,KAAgB,CAAA;AAClB,IAAA,GAAA,CAAI,SAAS,IAAA,CAAK;AAAA,MAChB,IAAA,EAAM,EAAE,IAAA,EAAM,UAAA,EAAY,OAAO,WAAA,EAAY;AAAA,MAC7C,IAAA,EAAM;AAAA,KACP,CAAA;AACH,EAAA,OAAO,GAAA;AACT;AAEO,SAAS,OAAA,CAAQ,IAAA,EAAsB,GAAA,GAAc,UAAA,EAAiB;AAC3E,EAAA,MAAM,SAAA,GAAY,gBAAgB,IAAI,CAAA;AACtC,EAAA,MAAM,QAAA,GAAW,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA;AAEpC,EAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,GAAA,CAAI,QAAQ,CAAA;AAC3C,EAAA,IAAI,QAAQ,OAAO,MAAA;AAEnB,EAAA,MAAM,UAAU,MAAW;AACzB,IAAA,QAAQ,KAAK,IAAA;AAAM,MACjB,KAAK,UAAA;AACH,QAAA,OAAO,GAAA,CAAI,KAAA,CAAM,IAAA,CAAK,KAAA,EAAO,GAAG,CAAA;AAAA,MAElC,KAAK,KAAA,EAAO;AACV,QAAA,OAAO,gBAAA,CAAiB,MAAM,GAAG,CAAA;AAAA,MACnC;AAAA,MAEA,KAAK,KAAA,EAAO;AACV,QAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,IAAA,CAAK,KAAA,EAAO,GAAG,CAAA;AACpC,QAAA,MAAM,CAAA,GAAI,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,IAAA,CAAK,KAAK,CAAC,CAAA;AAC5C,QAAA,IAAI,MAAM,CAAA,EAAG,OAAO,GAAA,CAAI,KAAA,CAAM,GAAG,GAAG,CAAA;AACpC,QAAA,IAAI,IAAA,CAAK,qBAAqB,MAAA,CAAO,QAAA,CAAS,KAAK,iBAAiB,CAAA,IAAK,IAAA,CAAK,iBAAA,GAAoB,CAAA,EAAG;AACnG,UAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA;AAC9B,UAAA,IAAI,CAAC,GAAA,EAAK;AACR,YAAA,MAAM,IAAI,MAAM,4DAA4D,CAAA;AAAA,UAC9E;AACA,UAAA,OAAO,oBAAA,CAAqB,IAAA,EAAM,GAAA,CAAI,KAAA,EAAO,CAAA,EAAG,KAAK,KAAA,CAAM,IAAA,CAAK,iBAAiB,CAAA,EAAG,GAAG,CAAA;AAAA,QACzF;AACA,QAAA,IAAI,CAAA,KAAM,GAAG,OAAO,IAAA;AACpB,QAAA,OAAO,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA;AAAA,MAC1B;AAAA,MAEA,KAAK,KAAA,EAAO;AACV,QAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,QAAA,MAAM,QAAe,EAAC;AACtB,QAAA,KAAA,MAAW,CAAA,IAAK,KAAK,QAAA,EAAU;AAC7B,UAAA,IAAI,CAAA,CAAE,IAAA,CAAK,IAAA,KAAS,UAAA,EAAY;AAC9B,YAAA,KAAA,IAAS,CAAA,CAAE,IAAA,GAAO,CAAA,CAAE,IAAA,CAAK,KAAA;AAAA,UAC3B,CAAA,MAAO;AACL,YAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,CAAA,CAAE,IAAA,EAAM,GAAG,CAAA;AAC7B,YAAA,KAAA,CAAM,IAAA,CAAK,CAAA,CAAE,IAAA,KAAS,CAAA,GAAI,CAAA,GAAI,CAAA,CAAE,SAAA,CAAU,CAAC,CAAA,KAAM,CAAC,CAAC,CAAC,CAAA;AAAA,UACtD;AAAA,QACF;AACA,QAAA,IAAI,MAAM,MAAA,KAAW,CAAA,SAAU,GAAA,CAAI,KAAA,CAAM,OAAO,GAAG,CAAA;AACnD,QAAA,IAAI,GAAA,GAAM,KAAA,CAAM,MAAA,KAAW,CAAA,GAAI,KAAA,CAAM,CAAC,CAAA,GAAI,GAAA,CAAI,YAAA,CAAa,KAAA,EAAO,GAAG,CAAA;AACrE,QAAA,IAAI,KAAA,KAAU,GAAG,GAAA,GAAM,GAAA,CAAI,UAAU,CAAC,CAAA,KAAM,IAAI,KAAK,CAAA;AACrD,QAAA,OAAO,GAAA;AAAA,MACT;AAAA,MAEA,KAAK,MAAA,EAAQ;AACX,QAAA,MAAM,WAAA,GAAc,cAAc,IAAI,CAAA;AACtC,QAAA,MAAM,SAAA,GAAY,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,IAAA,CAAK,KAAA,EAAO,WAAW,CAAC,CAAA;AAC/D,QAAA,IAAI,SAAA,KAAc,KAAK,WAAA,KAAgB,CAAA,SAAU,GAAA,CAAI,KAAA,CAAM,GAAG,GAAG,CAAA;AAGjE,QAAA,MAAM,YAAA,GAAe,KAAK,KAAA,CAAM,KAAA;AAChC,QAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,YAAA,EAAc,GAAG,CAAA;AAE7C,QAAA,OAAO,UAAA;AAAA,UACL,WAAA;AAAA,UACA,WAAA;AAAA,UACA,SAAA;AAAA,UACA,KAAK,IAAA,KAAS,SAAA;AAAA,UACd;AAAA,SACF;AAAA,MACF;AAAA,MAEA,KAAK,SAAA,EAAW;AACd,QAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA;AACnC,QAAA,IAAI,CAAC,QAAA,EAAU,OAAO,UAAA,CAAW,IAAA,CAAK,UAAU,KAAK,CAAA;AACrD,QAAA,OAAO,cAAA,CAAe,QAAA,EAAU,IAAA,CAAK,QAAQ,CAAA;AAAA,MAC/C;AAAA,MAEA,KAAK,MAAA,EAAQ;AACX,QAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,IAAA,CAAK,KAAA,EAAO,GAAG,CAAA;AACxC,QAAA,OAAO,QAAA,CAAS,WAAA,CAAY,GAAA,EAAK,OAAO,CAAA;AAAA,MAC1C;AAAA,MAEA,KAAK,OAAA,EAAS;AACZ,QAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,IAAA,CAAK,KAAA,EAAO,GAAG,CAAA;AACxC,QAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,IAAA,CAAK,KAAK,CAAC,CAAA;AAChD,QAAA,IAAI,KAAA,KAAU,GAAG,OAAO,QAAA;AAGxB,QAAA,OAAO,eAAA,CAAgB,QAAA,EAAU,KAAA,EAAO,GAAG,CAAA;AAAA,MAC7C;AAAA,MAEA,KAAK,KAAA;AACH,QAAA,OAAO,gBAAA,CAAiB,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,CAAC,KAAA,KAAU,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAC,CAAA,EAAG,GAAG,CAAA;AAAA,MAEhF,KAAK,OAAA,EAAS;AACZ,QAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,IAAA,CAAK,KAAA,EAAO,GAAG,CAAA;AACxC,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,WAAA,KAAgB,CAAA,GAAI,IAAI,IAAA,CAAK,WAAA;AAChD,QAAA,OAAO,SAAS,WAAA,CAAY,IAAA,CAAK,SAAA,EAAW,IAAA,CAAK,UAAU,KAAK,CAAA;AAAA,MAClE;AAAA;AACF,EACF,CAAA,GAAG;AAEH,EAAA,eAAA,CAAgB,GAAA,CAAI,UAAU,MAAM,CAAA;AACpC,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,kBAAA,CACd,EAAA,EACA,GAAA,GAAc,UAAA,EACT;AACL,EAAA,MAAM,GAAA,GAAM,GAAG,KAAA,EAAM;AACrB,EAAA,OAAO,OAAA,CAAQ,KAAK,GAAG,CAAA;AACzB;AAEA,IAAM,gBAAA,GAAmB,GAAA,CAAI,WAAA,CAAY,GAAG,CAAA;AAoBrC,SAAS,cAAA,CAAe,KAAc,QAAA,EAAqC;AAChF,EAAA,MAAM,IAAA,GAAO,gBAAA,CAAiB,GAAA,EAAK,UAAU,CAAA;AAC7C,EAAA,MAAM,OAAO,QAAA,IAAY,MAAA;AACzB,EAAA,IAAI,IAAA,KAAS,QAAQ,OAAO,IAAA;AAE5B,EAAA,MAAM,WAAW,CAAA,EAAG,eAAA,CAAgB,GAAG,CAAC,IAAI,IAAI,CAAA,CAAA;AAChD,EAAA,MAAM,MAAA,GAAS,gBAAA,CAAiB,GAAA,CAAI,QAAQ,CAAA;AAC5C,EAAA,IAAI,QAAQ,OAAO,MAAA;AAEnB,EAAA,MAAM,OAAA,GAAU,CAAC,GAAG,IAAA,CAAK,OAAA,EAAS,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AACxD,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAoB;AACpC,EAAA,IAAI,GAAA,GAAM,CAAA;AACV,EAAA,IAAI,UAAA,GAAa,CAAA;AACjB,EAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,IAAA,GAAA,IAAO,IAAA,CAAK,IAAI,CAAC,CAAA;AAGjB,IAAA,MAAM,SAAA,GACJ,IAAA,KAAS,WAAA,GACL,GAAA,GAAM,GAAA,GACN,IAAA,KAAS,gBAAA,GACP,GAAA,GAAM,GAAA,GAAM,GAAA,GACZ,CAAA,GAAA,CAAK,CAAA,GAAI,QAAQ,CAAA,GAAI,GAAA,CAAA;AAC7B,IAAA,MAAM,KAAK,SAAA,GAAY,UAAA;AACvB,IAAA,IAAI,EAAA,GAAK,CAAA,EAAG,GAAA,CAAI,GAAA,CAAI,GAAG,EAAE,CAAA;AACzB,IAAA,UAAA,GAAa,SAAA;AAAA,EACf;AACA,EAAA,MAAM,MAAA,GAAS,GAAA,CAAI,OAAA,CAAQ,GAAA,EAAK,UAAU,CAAA;AAC1C,EAAA,gBAAA,CAAiB,GAAA,CAAI,UAAU,MAAM,CAAA;AACrC,EAAA,OAAO,MAAA;AACT;AAcO,SAAS,eAAe,KAAA,EAAyB;AACtD,EAAA,MAAM,OAAA,GAAU,MAAM,iBAAA,EAAkB;AACxC,EAAA,MAAM,OAAA,GAAU,iBAAiB,OAAO,CAAA;AACxC,EAAA,IAAI,OAAA,KAAY,EAAA,EAAI,OAAO,GAAA,CAAI,MAAM,CAAC,CAAA;AACtC,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,gBAAA,EAAiB,IAAK,QAAQ,OAAO,CAAA;AAC9D,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,OAAO,CAAA,CAAE,KAAA;AAC/B,EAAA,MAAM,OAAO,OAAA,CAAQ,IAAA;AAAA,IACnB,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,KAAM,OAAA,IAAW,CAAA,CAAE,KAAA,KAAU,KAAA,IAAS,CAAA,CAAE,KAAA,GAAQ,CAAA,IAAK,CAAC,CAAA,CAAE;AAAA,GACpE;AACA,EAAA,IAAI,UAAA,CAAW,KAAA,KAAU,CAAA,IAAK,IAAA,EAAM;AAClC,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,wEAAwE,KAAK,CAAA,6EAAA;AAAA,KAE/E;AAAA,EACF;AACA,EAAA,OAAO,cAAA,CAAe,iBAAA,CAAkB,UAAU,CAAA,EAAG,MAAM,QAAQ,CAAA;AACrE;AAEO,SAAS,gBAAA,CAAiB,GAAA,EAAc,GAAA,GAAc,UAAA,EAAiB;AAC5E,EAAA,MAAM,SAAA,GAAY,gBAAgB,GAAG,CAAA;AACrC,EAAA,MAAM,QAAA,GAAW,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA;AAEpC,EAAA,MAAM,MAAA,GAAS,iBAAA,CAAkB,GAAA,CAAI,QAAQ,CAAA;AAC7C,EAAA,IAAI,QAAQ,OAAO,MAAA;AAEnB,EAAA,MAAM,CAAA,GAAI,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,GAAA,CAAI,KAAK,CAAC,CAAA;AAC3C,EAAA,IAAI,KAAK,CAAA,EAAG,OAAO,GAAA,CAAI,KAAA,CAAM,GAAG,GAAG,CAAA;AAEnC,EAAA,IAAI,KAAA,uBAAY,GAAA,EAAoB;AACpC,EAAA,KAAA,IAAS,CAAA,GAAI,GAAG,CAAA,IAAK,CAAA,EAAG,KAAK,KAAA,CAAM,GAAA,CAAI,CAAA,EAAG,CAAA,GAAI,CAAC,CAAA;AAG/C,EAAA,MAAM,CAAA,GAAI,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,GAAA,CAAI,MAAA,IAAU,CAAC,CAAC,CAAA;AACjD,EAAA,IAAI,IAAI,CAAA,EAAG;AACT,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAC,CAAA;AACvB,IAAA,MAAM,aAAa,CAAA,GAAI,CAAA;AACvB,IAAA,MAAM,gBAAgB,UAAA,GAAa,CAAA;AACnC,IAAA,MAAM,IAAA,uBAAW,GAAA,EAAoB;AACrC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,CAAA,EAAG,CAAA,EAAA,EAAK;AAC3B,MAAA,MAAM,IAAA,GAAO,CAAA,IAAK,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAA;AAC9B,MAAA,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,GAAO,aAAa,CAAA;AAAA,IAClC;AACA,IAAA,KAAA,GAAQ,IAAA;AAAA,EACV;AAEA,EAAA,IAAI,MAAM,GAAA,CAAI,OAAA,CAAQ,IAAI,GAAA,CAAI,KAAK,GAAG,GAAG,CAAA;AAGzC,EAAA,MAAM,IAAA,GAAO,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,GAAA,CAAI,OAAA,IAAW,CAAC,CAAC,CAAA;AACrD,EAAA,IAAI,IAAA,GAAO,CAAA,EAAG,GAAA,GAAM,GAAA,CAAI,SAAA,CAAU,CAAC,CAAA,KAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAI,CAAC,CAAA;AAG1D,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,WAAW,CAAC,CAAA;AACzC,EAAA,IAAI,QAAQ,CAAA,EAAG;AACb,IAAA,MAAM,OAAA,GAAU,CAAA;AAShB,IAAA,MAAM,MAAA,uBAAa,GAAA,EAAoB;AACvC,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,GAAA,CAAI,OAAO,CAAA;AAC5B,IAAA,KAAA,MAAW,CAAA,IAAK,GAAA,CAAI,OAAA,EAAQ,EAAG;AAC7B,MAAA,IAAI,CAAA,KAAM,SAAS,MAAA,CAAO,GAAA,CAAI,GAAG,GAAA,CAAI,GAAA,CAAI,CAAC,CAAC,CAAA;AAAA,IAC7C;AAEA,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AAGrB,MAAA,GAAA,GAAM,GAAA,CAAI,KAAA,CAAA,CAAO,KAAA,GAAQ,CAAA,IAAK,SAAS,GAAG,CAAA;AAAA,IAC5C,CAAA,MAAO;AACL,MAAA,MAAM,SAAA,GAAY,GAAA,CAAI,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA;AASzC,MAAA,IAAI,KAAA,GAAQ,GAAA;AACZ,MAAA,KAAA,IAAS,SAAA,GAAY,CAAA,EAAG,SAAA,IAAa,KAAA,GAAQ,GAAG,SAAA,EAAA,EAAa;AAC3D,QAAA,KAAA,GAAQ,GAAA,CAAI,MAAA,CAAO,KAAA,CAAM,SAAA,CAAU,CAAC,MAAM,CAAA,GAAI,OAAO,CAAA,EAAG,SAAA,EAAW,IAAI,CAAA;AAAA,MACzE;AACA,MAAA,GAAA,GAAM,GAAA,CAAI,MAAA,CAAO,KAAA,CAAM,SAAA,CAAU,CAAC,MAAM,CAAA,GAAI,OAAO,CAAA,EAAG,SAAA,EAAW,IAAI,CAAA;AAAA,IACvE;AAAA,EACF;AAEA,EAAA,iBAAA,CAAkB,GAAA,CAAI,UAAU,GAAG,CAAA;AACnC,EAAA,OAAO,GAAA;AACT;AAiBA,SAAS,oBAAA,CACP,MAAA,EACA,OAAA,EACA,KAAA,EACA,QACA,GAAA,EACK;AACL,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA;AAC/B,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAoB;AACvC,EAAA,KAAA,MAAW,CAAA,IAAK,MAAA,CAAO,OAAA,EAAQ,EAAG;AAChC,IAAA,IAAI,CAAA,KAAM,SAAS,MAAA,CAAO,GAAA,CAAI,GAAG,MAAA,CAAO,GAAA,CAAI,CAAC,CAAC,CAAA;AAAA,EAChD;AAKA,EAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,IAAA,OAAO,GAAA,CAAI,KAAA,CAAA,CAAO,KAAA,GAAQ,MAAA,IAAU,SAAS,GAAG,CAAA;AAAA,EAClD;AACA,EAAA,MAAM,SAAA,GAAY,GAAA,CAAI,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA;AAEzC,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAiB;AAClC,EAAA,MAAM,CAAA,GAAI,CAAC,CAAA,EAAW,CAAA,KAAmB;AACvC,IAAA,IAAI,MAAM,CAAA,EAAG,OAAO,GAAA,CAAI,KAAA,CAAM,GAAG,GAAG,CAAA;AACpC,IAAA,IAAI,MAAM,CAAA,EAAG,OAAO,MAAA,CAAO,KAAA,CAAM,GAAG,GAAG,CAAA;AAEvC,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA;AACrB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA;AAC3B,IAAA,IAAI,QAAQ,OAAO,MAAA;AAEnB,IAAA,MAAM,SAAA,GAAY,CAAA,CAAE,CAAA,EAAG,CAAA,GAAI,CAAC,EAAE,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,GAAI,OAAO,CAAA;AAC1D,IAAA,MAAM,YAAA,GAAe,UAAU,QAAA,CAAS,CAAA,CAAE,IAAI,CAAA,EAAG,CAAC,GAAG,GAAG,CAAA;AACxD,IAAA,MAAM,MAAA,GAAS,GAAA,CAAI,MAAA,CAAO,SAAA,EAAW,cAAc,IAAI,CAAA;AAEvD,IAAA,IAAA,CAAK,GAAA,CAAI,KAAK,MAAM,CAAA;AACpB,IAAA,OAAO,MAAA;AAAA,EACT,CAAA;AAEA,EAAA,OAAO,CAAA,CAAE,OAAO,MAAM,CAAA;AACxB;AAIA,SAAS,QAAQ,IAAA,EAA2C;AAC1D,EAAA,QAAQ,KAAK,IAAA;AAAM,IACjB,KAAK,KAAA;AACH,MAAA,OAAO,IAAA;AAAA,IACT,KAAK,UAAA;AACH,MAAA,OAAO,MAAA;AAAA,IACT,KAAK,KAAA;AAAA,IACL,KAAK,SAAA;AAAA,IACL,KAAK,MAAA;AAAA,IACL,KAAK,OAAA;AAAA,IACL,KAAK,OAAA;AACH,MAAA,OAAO,OAAA,CAAQ,KAAK,KAAK,CAAA;AAAA,IAC3B,KAAK,MAAA;AACH,MAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAAA,IACjC,KAAK,KAAA;AACH,MAAA,KAAA,MAAW,CAAA,IAAK,KAAK,QAAA,EAAU;AAC7B,QAAA,MAAML,EAAAA,GAAI,OAAA,CAAQ,CAAA,CAAE,IAAI,CAAA;AACxB,QAAA,IAAIA,IAAG,OAAOA,EAAAA;AAAA,MAChB;AACA,MAAA,OAAO,MAAA;AAAA,IACT,KAAK,KAAA;AACH,MAAA,KAAA,MAAW,KAAA,IAAS,KAAK,QAAA,EAAU;AACjC,QAAA,MAAMA,EAAAA,GAAI,QAAQ,KAAK,CAAA;AACvB,QAAA,IAAIA,IAAG,OAAOA,EAAAA;AAAA,MAChB;AACA,MAAA,OAAO,MAAA;AAAA;AAEb;AAGA,SAAS,gBAAA,CAAiB,OAAuB,GAAA,EAAkB;AACjE,EAAA,MAAM,OAAA,GAAU,CAAC,GAAG,IAAI,IAAI,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,KAAS,IAAA,CAAK,SAAS,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,CAAC,CAAA;AAC1F,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,GAAA,CAAI,MAAM,CAAC,CAAA;AACpC,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAoB;AACpC,EAAA,IAAI,QAAA,GAAW,CAAA;AACf,EAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,IAAA,IAAI,GAAA,GAAM,CAAA;AACV,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,MAAA,UAAA,CAAW,CAAC,CAAA,IAAK,KAAA,CAAM,CAAC,CAAA,CAAE,IAAI,KAAK,CAAA;AACnC,MAAA,GAAA,IAAO,WAAW,CAAC,CAAA;AAAA,IACrB;AACA,IAAA,IAAI,MAAM,QAAA,EAAU,GAAA,CAAI,GAAA,CAAI,KAAA,EAAO,MAAM,QAAQ,CAAA;AACjD,IAAA,QAAA,GAAW,GAAA;AAAA,EACb;AACA,EAAA,OAAO,GAAA,CAAI,OAAA,CAAQ,GAAA,EAAK,GAAG,CAAA;AAC7B;AAEA,SAAS,cAAc,IAAA,EAAwB;AAE7C,EAAA,IAAI,MAAM,IAAA,CAAK,KAAA;AACf,EAAA,OAAO,GAAA,CAAI,IAAA,KAAS,MAAA,EAAQ,GAAA,GAAM,GAAA,CAAI,KAAA;AACtC,EAAA,OAAO,GAAA,CAAI,IAAA,KAAS,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,KAAK,CAAC,CAAA,GAAI,CAAA;AACnE;AAEA,SAAS,eAAA,CACP,GAAA,EACA,KAAA,EACA,GAAA,GAAc,UAAA,EACT;AAEL,EAAA,IAAI,KAAA,IAAS,GAAG,OAAO,GAAA;AAEvB,EAAA,MAAM,OAAA,GAAU,IAAI,OAAA,EAAQ;AAC5B,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAoB;AAGpC,EAAA,IAAI,KAAA,IAAS,CAAA,IAAK,OAAA,CAAQ,MAAA,IAAU,EAAA,EAAI;AACtC,IAAA,IAASM,IAAAA,GAAT,SACE,SAAA,EACA,UAAA,EACA,WAAA,EACM;AACN,MAAA,IAAI,cAAc,CAAA,EAAG;AACnB,QAAA,GAAA,CAAI,IAAI,UAAA,EAAA,CAAa,GAAA,CAAI,IAAI,UAAU,CAAA,IAAK,KAAK,WAAW,CAAA;AAC5D,QAAA;AAAA,MACF;AAEA,MAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,QAAA,MAAM,CAAA,GAAI,GAAA,CAAI,GAAA,CAAI,KAAK,CAAA;AACvB,QAAA,IAAI,IAAI,CAAA,EAAG;AACT,UAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,UAAA,EAAY,KAAK,CAAA;AACzC,UAAAA,IAAAA,CAAI,SAAA,GAAY,CAAA,EAAG,MAAA,EAAQ,cAAc,CAAC,CAAA;AAAA,QAC5C;AAAA,MACF;AAAA,IACF,CAAA;AAEA,IAAAA,IAAAA,CAAI,KAAA,EAAO,CAAA,QAAA,EAAW,CAAC,CAAA;AAAA,EACzB,CAAA,MAAO;AAML,IAAA,MAAM,aAAA,GAAgB,CAAC,GAAG,OAAO,CAAA,CAAE,KAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AACvD,IAAA,IAAI,UAAA,GAAa,CAAA;AACjB,IAAA,KAAA,MAAW,SAAS,aAAA,EAAe;AACjC,MAAA,MAAM,OAAA,GAAU,UAAA;AAChB,MAAA,UAAA,IAAc,GAAA,CAAI,IAAI,KAAK,CAAA;AAG3B,MAAA,MAAM,OAAA,GAAU,KAAK,GAAA,CAAI,UAAA,EAAY,KAAK,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,KAAK,CAAA;AACrE,MAAA,IAAI,UAAU,GAAA,EAAK;AACjB,QAAA,GAAA,CAAI,GAAA,CAAI,OAAO,OAAO,CAAA;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,GAAA,CAAI,OAAA,CAAQ,GAAA,EAAK,GAAG,CAAA;AAC7B;AAEA,SAAS,WACP,MAAA,EACA,KAAA,EACA,IAAA,EACA,OAAA,EACA,MAAc,UAAA,EACT;AAEL,EAAA,IAAI,QAAQ,KAAA,EAAO,OAAO,MAAA,CAAO,KAAA,CAAM,OAAO,GAAG,CAAA;AACjD,EAAA,IAAI,QAAQ,CAAA,EAAG,OAAO,GAAA,CAAI,KAAA,CAAM,GAAG,GAAG,CAAA;AAItC,EAAA,MAAM,aAAA,GAAgB,CAAC,GAAG,MAAA,CAAO,OAAA,EAAS,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AAChE,EAAA,MAAM,MAAA,GAAS,aAAA,CAAc,GAAA,CAAI,CAAC,QAAQ,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,MAAA,CAAO,IAAI,GAAG,CAAC,CAAA,CAAE,CAAA,CAAE,KAAK,GAAG,CAAA;AAC/E,EAAA,MAAM,QAAA,GAAW,CAAA,KAAA,EAAQ,MAAM,CAAA,GAAA,EAAM,KAAK,CAAA,GAAA,EAAM,IAAI,CAAA,GAAA,EAClD,OAAA,GAAU,CAAA,GAAI,CAChB,CAAA,GAAA,EAAM,GAAG,CAAA,CAAA;AAET,EAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,GAAA,CAAI,QAAQ,CAAA;AAC3C,EAAA,IAAI,QAAQ,OAAO,MAAA;AAGnB,EAAA,IAAI,SAAS,CAAA,EAAG;AACd,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAO,eAAA,CAAgB,MAAA,EAAQ,KAAA,EAAO,GAAG,CAAA;AAAA,IAC3C,CAAA,MAAO;AAEL,MAAA,MAAM,MAAM,MAAA,CAAO,SAAA,CAAU,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA;AACtC,MAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,GAAA,EAAK,KAAA,EAAO,GAAG,EAAE,SAAA,CAAU,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA;AACnE,MAAA,eAAA,CAAgB,GAAA,CAAI,UAAU,MAAM,CAAA;AACpC,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF;AAOA,EAAA,IAAI,KAAA,uBAAiC,GAAA,EAAI;AAKzC,EAAA,MAAM,SAAS,KAAA,GAAQ,CAAA;AACvB,EAAA,MAAM,KAAA,GAAQ,CAAC,IAAA,EAAc,CAAA,KAAc,OAAO,MAAA,GAAS,CAAA;AAE3D,EAAA,KAAA,CAAM,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA,kBAAG,IAAI,GAAA,CAAI,CAAC,CAAC,CAAA,EAAG,CAAC,CAAC,CAAC,CAAC,CAAA;AAE5C,EAAA,MAAM,UAAA,GAAa,UACf,CAAC,GAAG,aAAa,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA,GACvC,CAAC,GAAG,aAAa,CAAA,CAAE,KAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AAE3C,EAAA,MAAM,QAAA,GAAW,CAAC,CAAA,EAAW,CAAA,KAAwB;AACnD,IAAA,IAAI,CAAA,IAAK,CAAA,EAAG,OAAO,CAAC,CAAC,CAAA;AACrB,IAAA,IAAI,KAAK,GAAA,EAAK;AACZ,MAAA,MAAMC,OAAM,IAAI,KAAA,CAAM,IAAI,CAAC,CAAA,CAAE,KAAK,CAAC,CAAA;AACnC,MAAAA,IAAAA,CAAI,CAAC,CAAA,GAAI,CAAA;AACT,MAAA,OAAOA,IAAAA;AAAA,IACT;AACA,IAAA,IAAI,CAAA,GAAI,KAAK,GAAA,EAAK;AAChB,MAAA,MAAMA,OAAM,IAAI,KAAA,CAAM,IAAI,CAAC,CAAA,CAAE,KAAK,CAAC,CAAA;AACnC,MAAAA,IAAAA,CAAI,CAAC,CAAA,GAAI,CAAA;AACT,MAAA,OAAOA,IAAAA;AAAA,IACT;AACA,IAAA,MAAM,IAAI,CAAA,GAAI,CAAA;AACd,IAAA,MAAM,MAAM,IAAI,KAAA,CAAM,IAAI,CAAC,CAAA,CAAE,KAAK,CAAC,CAAA;AAGnC,IAAA,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,GAAG,CAAC,CAAA;AACtB,IAAA,MAAM,QAAQ,CAAA,GAAI,CAAA;AAClB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,CAAA,EAAG,CAAA,EAAA;AACtB,MAAA,GAAA,CAAI,CAAC,IAAM,GAAA,CAAI,CAAA,GAAI,CAAC,CAAA,IAAK,CAAA,GAAI,CAAA,GAAI,CAAA,CAAA,GAAM,CAAA,GAAK,KAAA;AAG9C,IAAA,IAAI,CAAA,GAAI,CAAA;AACR,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK,CAAA,IAAK,IAAI,CAAC,CAAA;AACvC,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,CAAC,IAAI,KAAA,EAAO,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,CAAA,EAAG,CAAA,EAAA,EAAK,GAAA,CAAI,CAAC,CAAA,IAAK,CAAA;AAEpE,IAAA,OAAO,GAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,QAAA,GAAW,CAAC,CAAA,EAAW,SAAA,KAA8B;AACzD,IAAA,IAAI,SAAA,IAAa,GAAG,OAAO,CAAA;AAC3B,IAAA,MAAM,GAAA,uBAAU,GAAA,EAAoB;AACpC,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,EAAE,CAAA,IAAK,CAAA,EAAG,IAAI,EAAA,IAAM,SAAA,EAAW,GAAA,CAAI,GAAA,CAAI,GAAA,EAAK,EAAE,CAAA;AAC/D,IAAA,OAAO,GAAA,CAAI,IAAA,KAAS,CAAA,CAAE,IAAA,GAAO,CAAA,GAAI,GAAA;AAAA,EACnC,CAAA;AAEA,EAAA,MAAM,UAAA,GAAa,CAAC,EAAA,EAAyB,SAAA,KAAsB;AACjE,IAAA,IAAI,SAAA,IAAa,GAAG,OAAO,EAAA;AAC3B,IAAA,MAAM,GAAA,uBAAU,GAAA,EAAoB;AACpC,IAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,CAAA,IAAK,EAAA,EAAI;AACvB,MAAA,MAAM,EAAA,GAAK,QAAA,CAAS,CAAA,EAAG,SAAS,CAAA;AAChC,MAAA,IAAI,GAAG,IAAA,GAAO,CAAA,EAAG,GAAA,CAAI,GAAA,CAAI,GAAG,EAAE,CAAA;AAAA,IAChC;AACA,IAAA,OAAO,GAAA;AAAA,EACT,CAAA;AAEA,EAAA,IAAI,aAAA,GAAgB,CAAA;AACpB,EAAA,KAAA,MAAW,KAAK,UAAA,EAAY;AAC1B,IAAA,MAAM,CAAA,GAAI,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA;AACtB,IAAA,IAAI,KAAK,CAAA,EAAG;AACZ,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,IAAI,aAAa,CAAA;AACzC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAI,CAAC,CAAA;AAC/B,IAAA,MAAM,IAAA,uBAAgC,GAAA,EAAI;AAE1C,IAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,CAAA,IAAK,KAAA,EAAO;AAC1B,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,MAAM,CAAA;AAClC,MAAA,MAAM,CAAA,GAAI,IAAI,IAAA,GAAO,MAAA;AACrB,MAAA,IAAI,MAAM,CAAA,EAAG;AAEX,QAAA,MAAM,OAAA,GAAU,KAAA,CAAM,IAAA,EAAM,CAAC,CAAA;AAC7B,QAAA,MAAM,OAAO,IAAA,CAAK,GAAA,CAAI,OAAO,CAAA,wBAAS,GAAA,EAAoB;AAC1D,QAAA,KAAA,MAAW,CAAC,GAAA,EAAK,EAAE,CAAA,IAAK,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,GAAA,EAAA,CAAM,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,IAAK,KAAK,EAAE,CAAA;AAClE,QAAA,IAAA,CAAK,GAAA,CAAI,SAAS,IAAI,CAAA;AACtB,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,GAAA,GAAM,QAAA,CAAS,CAAA,EAAG,KAAK,CAAA;AAC7B,MAAA,MAAM,oBAAoB,IAAA,GAAO,IAAA;AAEjC,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,CAAA,EAAG,CAAA,EAAA,EAAK;AAC3B,QAAA,MAAM,EAAA,GAAK,IAAI,CAAC,CAAA;AAChB,QAAA,IAAI,MAAM,GAAA,EAAK;AACf,QAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,iBAAiB,CAAA;AACvC,QAAA,MAAM,QAAQ,IAAA,GAAO,CAAA;AACrB,QAAA,MAAM,KAAK,CAAA,GAAI,CAAA;AACf,QAAA,MAAM,MAAM,CAAA,GAAI,CAAA;AAEhB,QAAA,MAAM,OAAA,GAAU,KAAA,CAAM,KAAA,EAAO,EAAE,CAAA;AAC/B,QAAA,MAAM,OAAO,IAAA,CAAK,GAAA,CAAI,OAAO,CAAA,wBAAS,GAAA,EAAoB;AAC1D,QAAA,KAAA,MAAW,CAAC,GAAA,EAAK,EAAE,CAAA,IAAK,CAAA,EAAG;AACzB,UAAA,MAAM,KAAK,GAAA,GAAM,GAAA;AACjB,UAAA,MAAM,OAAO,EAAA,GAAK,EAAA;AAClB,UAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,IAAK,CAAA;AAC5B,UAAA,MAAM,KAAK,GAAA,GAAM,IAAA;AACjB,UAAA,IAAI,EAAA,IAAM,GAAA,EAAK,IAAA,CAAK,GAAA,CAAI,IAAI,EAAE,CAAA;AAAA,QAChC;AACA,QAAA,IAAI,KAAK,IAAA,GAAO,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,SAAS,IAAI,CAAA;AAAA,MAC3C;AAAA,IACF;AAGA,IAAA,KAAA,GAAQ,UAAA,CAAW,IAAA,EAAM,GAAA,GAAM,IAAI,CAAA;AACnC,IAAA,aAAA,IAAiB,CAAA;AAAA,EACnB;AAGA,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,IAAA,EAAM,CAAC,CAAA;AAC9B,EAAA,MAAM,OAAO,KAAA,CAAM,GAAA,CAAI,QAAQ,CAAA,wBAAS,GAAA,EAAoB;AAE5D,EAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AAEnB,IAAA,OAAO,IAAI,SAAA,EAAU;AAAA,EACvB;AAEA,EAAA,MAAM,MAAA,GAAS,GAAA,CAAI,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAA;AACpC,EAAA,eAAA,CAAgB,GAAA,CAAI,UAAU,MAAM,CAAA;AACpC,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,gBAAgB,IAAA,EAA8B;AAC5D,EAAA,QAAQ,KAAK,IAAA;AAAM,IACjB,KAAK,UAAA;AACH,MAAA,OAAO,CAAA,EAAA,EAAK,KAAK,KAAK,CAAA,CAAA;AAAA,IACxB,KAAK,KAAA,EAAO;AAEV,MAAA,MAAM,QAAkB,EAAC;AACzB,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,IAAA,CAAK,KAAK,CAAA,CAAE,CAAA;AAC5B,MAAA,IAAI,KAAK,MAAA,EAAQ,KAAA,CAAM,KAAK,CAAA,EAAA,EAAK,IAAA,CAAK,MAAM,CAAA,CAAE,CAAA;AAC9C,MAAA,IAAI,KAAK,OAAA,EAAS,KAAA,CAAM,KAAK,CAAA,EAAA,EAAK,IAAA,CAAK,OAAO,CAAA,CAAE,CAAA;AAChD,MAAA,IAAI,KAAK,OAAA,EAAS,KAAA,CAAM,KAAK,CAAA,EAAA,EAAK,IAAA,CAAK,OAAO,CAAA,CAAE,CAAA;AAChD,MAAA,OAAO,CAAA,EAAA,EAAK,KAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAA;AAAA,IAC7B;AAAA,IACA,KAAK,KAAA;AACH,MAAA,OAAO,CAAA,MAAA,EAAS,IAAA,CAAK,KAAK,CAAA,GAAA,EAAM,IAAA,CAAK,iBAAA,IAAqB,CAAC,CAAA,IAAA,EAAO,eAAA,CAAgB,IAAA,CAAK,KAAK,CAAC,CAAA,CAAA,CAAA;AAAA,IAC/F,KAAK,SAAA;AACH,MAAA,OAAO,SAAS,IAAA,CAAK,QAAQ,OAAO,eAAA,CAAgB,IAAA,CAAK,KAAK,CAAC,CAAA,CAAA,CAAA;AAAA,IACjE,KAAK,MAAA;AACH,MAAA,OAAO,UAAU,IAAA,CAAK,KAAK,CAAA,GAAA,EAAM,IAAA,CAAK,IAAI,CAAA,IAAA,EAAO,eAAA;AAAA,QAC/C,IAAA,CAAK;AAAA,OACN,CAAA,CAAA,CAAA;AAAA,IACH,KAAK,MAAA;AACH,MAAA,OAAO,CAAA,QAAA,EAAW,eAAA,CAAgB,IAAA,CAAK,KAAK,CAAC,CAAA,CAAA,CAAA;AAAA,IAC/C,KAAK,OAAA;AACH,MAAA,OAAO,WAAW,IAAA,CAAK,KAAK,OAAO,eAAA,CAAgB,IAAA,CAAK,KAAK,CAAC,CAAA,CAAA,CAAA;AAAA,IAChE,KAAK,OAAA;AACH,MAAA,OAAO,CAAA,QAAA,EAAW,IAAA,CAAK,SAAS,CAAA,GAAA,EAAM,IAAA,CAAK,WAAW,CAAA,GAAA,EACpD,IAAA,CAAK,QACP,CAAA,IAAA,EAAO,eAAA,CAAgB,IAAA,CAAK,KAAK,CAAC,CAAA,CAAA,CAAA;AAAA,IACpC,KAAK,KAAA;AACH,MAAA,OAAO,CAAA,IAAA,EAAO,KAAK,QAAA,CAAS,GAAA,CAAI,eAAe,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAA;AAAA,IAC5D,KAAK,KAAA,EAAO;AACV,MAAA,IAAI,aAAA,GAAgB,CAAA;AACpB,MAAA,MAAM,oBAA8B,EAAC;AACrC,MAAA,KAAA,MAAW,CAAA,IAAK,KAAK,QAAA,EAAU;AAC7B,QAAA,IAAI,CAAA,CAAE,IAAA,CAAK,IAAA,KAAS,UAAA,EAAY;AAC9B,UAAA,aAAA,IAAiB,CAAA,CAAE,IAAA,GAAO,CAAA,CAAE,IAAA,CAAK,KAAA;AAAA,QACnC,CAAA,MAAO;AACL,UAAA,iBAAA,CAAkB,IAAA;AAAA,YAChB,CAAA,EAAG,CAAA,CAAE,IAAA,KAAS,EAAA,GAAK,GAAA,GAAM,GAAG,CAAA,EAAG,eAAA,CAAgB,CAAA,CAAE,IAAI,CAAC,CAAA;AAAA,WACxD;AAAA,QACF;AAAA,MACF;AAEA,MAAA,IAAI,kBAAkB,CAAA,EAAG;AACvB,QAAA,iBAAA,CAAkB,IAAA;AAAA,UAChB,gBAAgB,CAAA,GAAI,CAAA,GAAA,EAAM,aAAa,CAAA,CAAA,GAAK,CAAA,GAAA,EAAM,CAAC,aAAa,CAAA;AAAA,SAClE;AAAA,MACF;AAGA,MAAA,iBAAA,CAAkB,IAAA,EAAK;AAEvB,MAAA,OAAO,CAAA,IAAA,EAAO,iBAAA,CAAkB,IAAA,CAAK,EAAE,CAAC,CAAA,CAAA,CAAA;AAAA,IAC1C;AAAA;AAEJ;;;ACtyBA,IAAM,cAAA,GAAiB,GAAA,CAAI,WAAA,CAAY,GAAI,CAAA;AAGpC,SAAS,gBAAA,GAAyB;AACvC,EAAA,cAAA,CAAe,KAAA,EAAM;AACvB;AAEO,IAAM,aAAA,GAAN,MAAM,cAAA,CAAsC;AAAA,EACjD,WAAA,CACW,KAAA,EACQ,SAAA,EACA,UAAA,EACA,UAAA,EAIA,cAAA,GAAyC,EAAC,EAI1C,eAAA,EACA,eAAA,EACA,cAAA,GAA0B,KAAA,EAC3C;AAdS,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACQ,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AACA,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AACA,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AAIA,IAAA,IAAA,CAAA,cAAA,GAAA,cAAA;AAIA,IAAA,IAAA,CAAA,eAAA,GAAA,eAAA;AACA,IAAA,IAAA,CAAA,eAAA,GAAA,eAAA;AACA,IAAA,IAAA,CAAA,cAAA,GAAA,cAAA;AAAA,EAChB;AAAA,EASH,UAAU,IAAA,EAA4B;AAGpC,IAAA,MAAM,aAAa,IAAA,CAAK,wBAAA,CAAyB,YAAY,QAAA,CAAS,GAAG,IAAI,CAAC,CAAA;AAC9E,IAAA,OAAO,IAAI,cAAA;AAAA,MACT,IAAA,CAAK,KAAA;AAAA,MACL,IAAA,CAAK,SAAA;AAAA,MACL,UAAA;AAAA,MACA,IAAA,CAAK,UAAA;AAAA,MACL,IAAA,CAAK,cAAA;AAAA,MACL,IAAA,CAAK,eAAA;AAAA,MACL,IAAA,CAAK,eAAA;AAAA,MACL,IAAA,CAAK;AAAA,KACP;AAAA,EACF;AAAA,EASA,UAAU,IAAA,EAA4B;AACpC,IAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AACA,IAAA,MAAM,UAAA,GAAa,WAAA,CAAY,QAAA,CAAS,GAAG,IAAI,CAAA;AAC/C,IAAA,OAAO,IAAI,cAAA;AAAA,MACT,IAAA,CAAK,KAAA;AAAA,MACL,IAAA,CAAK,SAAA;AAAA,MACL,IAAA,CAAK,UAAA;AAAA,MACL,UAAA;AAAA,MACA,IAAA,CAAK,cAAA;AAAA,MACL,IAAA,CAAK,eAAA;AAAA,MACL,IAAA,CAAK,eAAA;AAAA,MACL,IAAA,CAAK;AAAA,KACP;AAAA,EACF;AAAA,EAEA,MAAA,GAAwB;AACtB,IAAA,OAAO,IAAI,cAAA;AAAA,MACT,IAAA,CAAK,KAAA;AAAA,MACL,IAAA,CAAK,SAAA;AAAA,MACL,IAAA;AAAA,MACA,IAAA,CAAK,UAAA;AAAA,MACL,IAAA,CAAK,cAAA;AAAA,MACL,IAAA,CAAK,eAAA;AAAA,MACL,IAAA,CAAK,eAAA;AAAA,MACL,IAAA,CAAK;AAAA,KACP;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,mBAAmB,MAAA,EAAoC;AACrD,IAAA,OAAO,IAAI,cAAA;AAAA,MACT,IAAA,CAAK,KAAA;AAAA,MACL,IAAA,CAAK,SAAA;AAAA,MACL,IAAA,CAAK,UAAA;AAAA,MACL,IAAA,CAAK,UAAA;AAAA,MACL,CAAC,GAAG,IAAA,CAAK,cAAA,EAAgB,MAAM,CAAA;AAAA,MAC/B,IAAA,CAAK,eAAA;AAAA,MACL,IAAA,CAAK,eAAA;AAAA,MACL,IAAA,CAAK;AAAA,KACP;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,aAAa,SAAA,EAAkC;AAC7C,IAAA,IAAI,MAAM,SAAS,CAAA,EAAG,MAAM,IAAI,MAAM,8CAA8C,CAAA;AACpF,IAAA,aAAA,CAAc,WAAW,0BAA0B,CAAA;AACnD,IAAA,IAAI,IAAA,CAAK,oBAAoB,MAAA,EAAW;AACtC,MAAA,IAAI,SAAA,KAAc,IAAA,CAAK,eAAA,EAAiB,OAAO,IAAA;AAC/C,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,qDAAA,EAAwD,IAAA,CAAK,eAAe,CAAA,mBAAA,EAAsB,SAAS,CAAA,sCAAA;AAAA,OAC7G;AAAA,IACF;AACA,IAAA,MAAM,SAAA,GAAY,cAAA,CAAc,aAAA,CAAc,SAAA,EAAW,KAAK,eAAe,CAAA;AAC7E,IAAA,OAAO,IAAI,cAAA;AAAA,MACT,IAAA,CAAK,KAAA;AAAA,MACL,IAAA,CAAK,YACD,cAAA,CAAc,gBAAA,CAAiB,KAAK,SAAA,EAAW,cAAA,EAAgB,SAAS,CAAA,GACxE,IAAA,CAAK,SAAA;AAAA,MACT,IAAA,CAAK,aACD,cAAA,CAAc,gBAAA,CAAiB,KAAK,UAAA,EAAY,cAAA,EAAgB,SAAS,CAAA,GACzE,IAAA,CAAK,UAAA;AAAA,MACT,IAAA,CAAK,UAAA;AAAA,MACL,IAAA,CAAK,cAAA;AAAA,MACL,SAAA;AAAA,MACA,IAAA,CAAK,eAAA;AAAA,MACL,IAAA,CAAK;AAAA,KACP;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,iBAAiB,OAAA,EAAgC;AAC/C,IAAA,IAAI,MAAM,OAAO,CAAA,EAAG,MAAM,IAAI,MAAM,wCAAwC,CAAA;AAC5E,IAAA,aAAA,CAAc,SAAS,oBAAoB,CAAA;AAC3C,IAAA,IAAI,IAAA,CAAK,oBAAoB,MAAA,EAAW;AACtC,MAAA,IAAI,OAAA,KAAY,IAAA,CAAK,eAAA,EAAiB,OAAO,IAAA;AAC7C,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,qDAAA,EAAwD,IAAA,CAAK,eAAe,CAAA,mBAAA,EAAsB,OAAO,CAAA,sCAAA;AAAA,OAC3G;AAAA,IACF;AACA,IAAA,MAAM,SAAA,GAAY,cAAA,CAAc,aAAA,CAAc,IAAA,CAAK,iBAAiB,OAAO,CAAA;AAC3E,IAAA,OAAO,IAAI,cAAA;AAAA,MACT,IAAA,CAAK,KAAA;AAAA,MACL,IAAA,CAAK,YACD,cAAA,CAAc,gBAAA,CAAiB,KAAK,SAAA,EAAW,kBAAA,EAAoB,SAAS,CAAA,GAC5E,IAAA,CAAK,SAAA;AAAA,MACT,IAAA,CAAK,aACD,cAAA,CAAc,gBAAA,CAAiB,KAAK,UAAA,EAAY,kBAAA,EAAoB,SAAS,CAAA,GAC7E,IAAA,CAAK,UAAA;AAAA,MACT,IAAA,CAAK,UAAA;AAAA,MACL,IAAA,CAAK,cAAA;AAAA,MACL,IAAA,CAAK,eAAA;AAAA,MACL,OAAA;AAAA,MACA,IAAA,CAAK;AAAA,KACP;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,UAAA,GAA4B;AAC1B,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AACA,IAAA,IAAI,IAAA,CAAK,gBAAgB,OAAO,IAAA;AAChC,IAAA,OAAO,IAAI,cAAA;AAAA,MACT,IAAA,CAAK,KAAA;AAAA,MACL,IAAA,CAAK,SAAA;AAAA,MACL,IAAA,CAAK,UAAA;AAAA,MACL,IAAA,CAAK,UAAA;AAAA,MACL,IAAA,CAAK,cAAA;AAAA,MACL,IAAA,CAAK,eAAA;AAAA,MACL,IAAA,CAAK,eAAA;AAAA,MACL;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,UAAU,EAAA,EAA4C;AACpD,IAAA,MAAM,IAAA,GAAO,EAAA,CAAG,IAAA,CAAK,OAAA,EAAS,CAAA;AAC9B,IAAA,OAAO,IAAI,cAAA;AAAA,MACT,cAAA,CAAc,WAAW,IAAI,CAAA;AAAA,MAC7B,IAAA,CAAK,SAAA;AAAA,MACL,IAAA,CAAK,UAAA;AAAA,MACL,IAAA,CAAK,UAAA;AAAA,MACL,IAAA,CAAK,cAAA;AAAA,MACL,IAAA,CAAK,eAAA;AAAA,MACL,IAAA,CAAK,eAAA;AAAA,MACL,IAAA,CAAK;AAAA,KACP;AAAA,EACF;AAAA,EAEQ,OAAA,GAAiB;AACvB,IAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,IAAA,IAAI,iBAAiB,gBAAA,EAAkB;AACrC,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AACA,IAAA,MAAM,EAAA,GAAK,MAAM,YAAA,CAAa,EAAA;AAC9B,IAAA,IAAI,OAAO,MAAA,EAAW;AACpB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAKA,IAAA,MAAM,eAAe,KAAA,CAAM,YAAA;AAC3B,IAAA,MAAM,UAAA,GAAa,MAAM,gBAAA,EAAiB;AAC1C,IAAA,MAAM,WAAA,GAAwB,YAAY,QAAA,IAAY,MAAA;AACtD,IAAA,MAAM,oBAAoB,WAAA,KAAgB,gBAAA;AAC1C,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,IAAI,WAAA,CAAY,KAAA,CAAM,mBAAmB,CAAA;AAAA,MAC/C,EAAA;AAAA,MACA,eAAe,KAAA,CAAM,aAAA;AAAA,MACrB,QAAA,EAAU,oBAAoB,WAAA,GAAc,WAAA;AAAA,MAC5C,eAAe,iBAAA,GACX,CAAA,GACA,eAAA,IAAmB,YAAA,GACjB,aAAa,aAAA,GACb,CAAA;AAAA,MACN,WAAW,KAAA,YAAiB;AAAA,KAC9B;AAAA,EACF;AAAA,EAEA,OAAe,WAAW,IAAA,EAA4C;AACpE,IAAA,IAAI,MAAM,IAAA,CAAK,EAAE,GAAG,MAAM,IAAI,MAAM,yCAAyC,CAAA;AAC7E,IAAA,aAAA,CAAc,IAAA,CAAK,IAAI,mBAAmB,CAAA;AAC1C,IAAA,aAAA,CAAc,IAAA,CAAK,eAAe,+BAA+B,CAAA;AACjE,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,IAAA,CAAK,iBAAA,EAAkB;AAC5C,IAAA,IAAI,SAAA,GAAmC,OAAA;AACvC,IAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,MAAA,MAAM,OAAA,GAAU,iBAAiB,OAAO,CAAA;AACxC,MAAA,MAAM,GAAA,GAAM,OAAA,KAAY,EAAA,GAAK,CAAA,GAAI,OAAA;AACjC,MAAA,MAAM,OAAA,GAAU,CAAC,GAAG,OAAO,CAAA;AAC3B,MAAA,OAAA,CAAQ,GAAG,IAAI,EAAE,GAAG,QAAQ,GAAG,CAAA,EAAG,QAAA,EAAU,IAAA,CAAK,QAAA,EAAS;AAC1D,MAAA,SAAA,GAAY,OAAA;AAAA,IACd;AAIA,IAAA,IAAI,EAAA,GAAK,IAAI,WAAA,CAAY,SAAS,CAAA,CAAE,EAAA,CAAG,IAAA,CAAK,EAAE,CAAA,CAAE,MAAA,CAAO,IAAA,CAAK,aAAa,CAAA;AACzE,IAAA,IAAI,IAAA,CAAK,aAAA,KAAkB,CAAA,EAAG,EAAA,GAAK,GAAG,kBAAA,EAAmB;AACzD,IAAA,OAAO,IAAA,CAAK,SAAA,GAAY,EAAA,CAAG,WAAA,EAAY,GAAI,EAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAe,aAAA,CACb,SAAA,EACA,OAAA,EACoC;AACpC,IAAA,OAAO,CAAC,MAAA,KAAW;AACjB,MAAA,MAAM,KAAA,GAAQ,YAAY,MAAA,GAAY,MAAA,CAAO,UAAU,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,OAAA,EAAS,OAAO,CAAA;AACvF,MAAA,IAAI,cAAc,MAAA,EAAW,OAAO,EAAE,GAAG,MAAA,EAAQ,SAAS,KAAA,EAAM;AAGhE,MAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,MAAA,CAAO,KAAA,EAAO,KAAK,KAAA,IAAS,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,CAAA;AAClE,MAAA,IAAI,GAAA,GAAM,CAAA;AACV,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,MAAA,CAAO,OAAO,CAAA,EAAA,EAAK;AACtC,QAAA,IAAI,IAAA,CAAK,IAAI,CAAA,EAAG,KAAK,IAAI,MAAA,CAAO,KAAA,GAAQ,OAAO,GAAA,GAAM,CAAA;AAAA,MACvD;AACA,MAAA,OAAO,EAAE,GAAG,MAAA,EAAQ,OAAA,EAAS,OAAO,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,QAAQ,IAAA,CAAK,GAAA,CAAI,SAAA,EAAW,GAAG,CAAC,CAAA,EAAE;AAAA,IAChG,CAAA;AAAA,EACF;AAAA;AAAA,EAGQ,yBAAyB,MAAA,EAAoC;AACnE,IAAA,IAAI,KAAK,eAAA,KAAoB,MAAA,IAAa,IAAA,CAAK,eAAA,KAAoB,QAAW,OAAO,MAAA;AACrF,IAAA,OAAO,cAAA,CAAc,gBAAA;AAAA,MACnB,MAAA;AAAA,MACA,IAAA,CAAK,eAAA,KAAoB,MAAA,GAAY,cAAA,GAAiB,kBAAA;AAAA,MACtD,cAAA,CAAc,aAAA,CAAc,IAAA,CAAK,eAAA,EAAiB,KAAK,eAAe;AAAA,KACxE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAe,gBAAA,CACb,MAAA,EACA,UAAA,EACA,SAAA,EACc;AACd,IAAA,IAAI,MAAA,CAAO,QAAA,EAAS,KAAM,IAAA,EAAM;AAC9B,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,GAAG,UAAU,CAAA,uGAAA;AAAA,OACf;AAAA,IACF;AACA,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,iBAAA,EAAkB,CAAE,GAAA,CAAI,CAAC,CAAA,KAAO,CAAA,CAAE,KAAA,GAAQ,CAAA,GAAI,SAAA,CAAU,CAAC,IAAI,CAAE,CAAA;AACtF,IAAA,OAAO,IAAI,YAAY,OAAO,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,YAAA,GAAuB;AAGrB,IAAA,IAAI,IAAA,CAAK,cAAA,CAAe,MAAA,GAAS,CAAA,IAAK,KAAK,cAAA,EAAgB;AACzD,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AACA,IAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,IAAA,MAAM,WAAA,GAAc,kBAAkB,KAAK,CAAA;AAC3C,IAAA,IAAI,SAAA;AACJ,IAAA,IAAI,KAAA,YAAiB,iBAAA,IAAqB,CAAC,KAAA,CAAM,aAAA,EAAe;AAC9D,MAAA,SAAA,GAAY,CAAA,CAAA,EAAI,gBAAgB,KAAK,CAAC,OAAO,KAAA,CAAM,YAAA,CAAa,MAAM,CAAC,CAAA,CAAA,CAAA;AAAA,IACzE,CAAA,MAAA,IAAW,KAAA,YAAiB,gBAAA,IAAoB,KAAA,YAAiB,iBAAA,EAAmB;AAClF,MAAA,SAAA,GAAY,WAAA,IAAe,MAAM,YAAA,EAAa;AAAA,IAChD,CAAA,MAAO;AACL,MAAA,SAAA,GAAY,MAAM,YAAA,EAAa;AAAA,IACjC;AAEA,IAAA,IAAI,UAAA,GAAa,EAAA;AAEjB,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,SAAA,CAAU,YAAA,EAAa;AAClD,MAAA,UAAA,GAAa,IAAI,aAAa,CAAA,CAAA,CAAA;AAC9B,MAAA,IAAI,IAAA,CAAK,eAAe,IAAA,EAAM;AAC5B,QAAA,UAAA,IAAc,YAAY,aAAa,CAAA,CAAA,CAAA;AAAA,MACzC,CAAA,MAAO;AAEL,QAAA,MAAM,cAAA,GAAA,CAAkB,KAAK,UAAA,IAAc,IAAA,CAAK,UAAU,IAAA,EAAK,CAAE,UAAA,EAAW,EAAG,YAAA,EAAa;AAC5F,QAAA,MAAM,gBAAgB,KAAA,CAAM,aAAA;AAC5B,QAAA,IAAI,aAAA,GAAgB,CAAA,IAAK,aAAA,GAAgB,EAAA,EAAI;AAC3C,UAAA,MAAM,IAAI,KAAA;AAAA,YACR,2BAA2B,aAAa,CAAA,2BAAA;AAAA,WAC1C;AAAA,QACF;AACA,QAAA,IAAI,KAAA,YAAiB,iBAAA,IAAqB,WAAA,KAAgB,MAAA,EAAW;AACnE,UAAA,UAAA,IAAc,SAAS,KAAA,CAAM,gBAAA,EAAiB,CAAG,KAAK,KAAK,cAAc,CAAA,CAAA,CAAA;AAAA,QAC3E,CAAA,MAAA,IAAW,kBAAkB,EAAA,EAAI;AAC/B,UAAA,UAAA,IAAc,UAAU,cAAc,CAAA,CAAA,CAAA;AAAA,QACxC,CAAA,MAAO;AACL,UAAA,UAAA,IAAc,CAAA,MAAA,EAAS,EAAA,GAAK,aAAa,CAAA,EAAA,EAAK,cAAc,CAAA,CAAA,CAAA;AAAA,QAC9D;AAAA,MACF;AAEA,MAAA,IAAI,KAAK,UAAA,EAAY;AACnB,QAAA,UAAA,IAAc,CAAA,OAAA,EAAU,IAAA,CAAK,UAAA,CAAW,YAAA,EAAc,CAAA,CAAA,CAAA;AAAA,MACxD;AAAA,IACF;AAEA,IAAA,OAAO,CAAA,EAAG,SAAS,CAAA,GAAA,EAAM,UAAU,CAAA,CAAA;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,oBAAA,CACE,KAAA,EACA,GAAA,GAAc,CAAA,EACoD;AAClE,IAAA,MAAM,gBAAgB,KAAA,CAAM,aAAA;AAC5B,IAAA,MAAM,OAAA,GAAU,eAAe,KAAK,CAAA;AAEpC,IAAA,MAAM,cAAc,CAAC,CAAA,KAAuB,MAAM,EAAA,IAAO,CAAA,IAAK,KAAK,CAAA,IAAK,aAAA;AAExE,IAAA,IAAI,KAAA,YAAiB,iBAAA,IAAqB,KAAA,CAAM,aAAA,EAAe;AAC7D,MAAA,OAAO,EAAE,UAAU,CAAA,EAAG,IAAA,EAAM,GAAG,KAAA,EAAO,CAAA,EAAG,OAAO,CAAA,EAAE;AAAA,IACpD;AAEA,IAAA,IAAI,iBAAiB,gBAAA,EAAkB;AACrC,MAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,MAAA,IAAI,IAAA,GAAO,CAAA;AACX,MAAA,KAAA,MAAW,CAAC,CAAA,EAAG,GAAG,CAAA,IAAK,OAAA,EAAS;AAC9B,QAAA,IAAI,WAAA,CAAY,CAAC,CAAA,EAAG,KAAA,IAAS,GAAA,CAAI,CAAA;AAAA,qBACpB,GAAA,CAAI,CAAA;AAAA,MACnB;AACA,MAAA,OAAO,EAAE,QAAA,EAAU,CAAA,EAAG,IAAA,EAAM,KAAA,EAAO,OAAO,CAAA,EAAE;AAAA,IAC9C;AAGA,IAAA,MAAMC,aAAY,KAAA,YAAiB,iBAAA;AACnC,IAAA,MAAM,EAAA,GAAK,KAAA,CAAM,YAAA,CAAa,EAAA,IAAM,CAAA;AACpC,IAAA,MAAM,YAAY,KAAA,CAAM,QAAA;AACxB,IAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,gBAAA,CAAiB,KAAA,EAAO,GAAG,CAAA;AACvD,IAAA,MAAM,QAAA,GAAW,aAAA,CAAc,MAAA,GAC3B,GAAA,CAAI,YAAA,CAAa,aAAA,EAAe,GAAG,CAAA,GACnC,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA;AAEpB,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,IAAI,IAAA,GAAO,CAAA;AACX,IAAA,IAAI,KAAA,GAAQ,CAAA;AAEZ,IAAA,KAAA,MAAW,CAAC,CAAA,EAAG,GAAG,CAAA,IAAK,OAAA,EAAS;AAC9B,MAAA,MAAM,KAAK,GAAA,CAAI,CAAA;AACf,MAAA,IAAI,MAAM,CAAA,EAAG;AAEb,MAAA,IAAI,MAAM,CAAA,EAAG;AACX,QAAA,KAAA,IAAS,EAAA;AACT,QAAA;AAAA,MACF;AACA,MAAA,IAAI,MAAM,EAAA,EAAI;AACZ,QAAA,KAAA,IAAS,EAAA;AACT,QAAA;AAAA,MACF;AAGA,MAAA,MAAM,EAAE,SAAS,KAAA,EAAM,GAAI,iBAAiB,QAAA,EAAU,EAAA,GAAK,YAAY,CAAC,CAAA;AACxE,MAAA,IAAIA,UAAAA,IAAa,WAAA,CAAY,CAAC,CAAA,EAAG;AAC/B,QAAA,KAAA,IAAS,EAAA,GAAK,OAAA;AAAA,MAChB,CAAA,MAAO;AACL,QAAA,IAAA,IAAQ,EAAA,GAAK,OAAA;AAAA,MACf;AACA,MAAA,KAAA,IAAS,EAAA,GAAK,KAAA;AAAA,IAChB;AAEA,IAAA,OAAO,EAAE,UAAU,IAAA,GAAO,KAAA,EAAO,MAAM,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA,EAAM;AAAA,EAC1E;AAAA;AAAA,EAGA,OAAA,CAAQ,MAAc,CAAA,EAAqB;AACzC,IAAA,MAAM;AAAA,MACJ,IAAA;AAAA,MACA,KAAA;AAAA,MACA,KAAA,EAAO;AAAA,KACT,GAAI,IAAA,CAAK,oBAAA,CAAqB,IAAA,CAAK,OAAO,GAAG,CAAA;AAE7C,IAAA,MAAM,WAAA,GAAc,CAAC,MAAA,KACnB,MAAA,YAAkB,iBAAA,GACd,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA,GAChB,kBAAA,CAAmB,MAAA,EAAQ,GAAG,CAAA;AAEpC,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,SAAA,GAAY,WAAA,CAAY,IAAA,CAAK,SAAS,CAAA,GAAI,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA;AAElF,IAAA,IAAI,WAAA,GAA0B,IAAA;AAC9B,IAAA,IAAI,IAAA,GAAO,IAAA;AACX,IAAA,IAAI,KAAA,GAAQ,KAAA;AAEZ,IAAA,IAAI,IAAA,CAAK,eAAe,IAAA,EAAM;AAC5B,MAAA,WAAA,GAAc,IAAA;AACd,MAAA,IAAA,IAAQ,KAAA;AACR,MAAA,KAAA,GAAQ,CAAA;AAAA,IACV,CAAA,MAAO;AAIL,MAAA,MAAM,cAAc,IAAA,CAAK,UAAA,IAAc,KAAK,SAAA,EAAW,IAAA,GAAO,UAAA,EAAW;AAEzE,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,WAAA,GAAc,YAAY,WAAW,CAAA;AAAA,MACvC;AAAA,IACF;AASA,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,cAAA,CAAe,MAAA,GAAS,CAAA;AACjD,IAAA,MAAM,cAAA,GAAiB,WAAA,GACnB,GAAA,CAAI,YAAA,CAAa,KAAK,cAAA,CAAe,GAAA,CAAI,CAAC,CAAA,KAAM,WAAA,CAAY,CAAC,CAAC,CAAA,EAAG,GAAG,CAAA,GACpE,IAAA;AACJ,IAAA,IAAI,eAAA,GAA8B,IAAA;AAClC,IAAA,IAAIC,QAAAA,GAAsB,WAAA;AAC1B,IAAA,IAAI,WAAA,KAAgB,QAAQ,WAAA,EAAa;AACvC,MAAA,IAAI;AACF,QAAA,eAAA,GAAkB,GAAA,CAAI,YAAA;AAAA,UACpB,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,CAAC,CAAA,KAAM,WAAA,CAAY,CAAA,CAAE,IAAA,EAAK,CAAE,UAAA,EAAY,CAAC,CAAA;AAAA,UACjE;AAAA,SACF;AACA,QAAAA,WAAU,GAAA,CAAI,YAAA,CAAa,CAAC,WAAA,EAAa,eAAe,GAAG,GAAG,CAAA;AAAA,MAChE,SAAS,KAAA,EAAO;AACd,QAAA,IAAI,KAAA,GAAQ,CAAA,IAAK,EAAE,KAAA,YAAiB,6BAA6B,MAAM,KAAA;AACvE,QAAAA,QAAAA,GAAU,IAAA;AAAA,MACZ;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,iBACX,GAAA,CAAI,YAAA,CAAa,CAAC,UAAA,EAAY,cAAc,CAAA,EAAG,GAAG,CAAA,GAClD,UAAA;AAEJ,IAAA,IAAI,OAAA;AACJ,IAAA,IAAI,YAAA;AACJ,IAAA,IAAI,KAAK,cAAA,EAAgB;AAGvB,MAAA,OAAA,GAAU,MAAA,CAAO,WAAA,CAAY,GAAA,EAAK,OAAO,CAAA;AACzC,MAAA,YAAA,GAAe,IAAA;AAAA,IACjB,CAAA,MAAA,IAAW,KAAK,UAAA,EAAY;AAC1B,MAAA,OAAA,GAAU,WAAA,CAAY,KAAK,UAAU,CAAA;AACrC,MAAA,YAAA,GAAe,IAAA;AAAA,IACjB,CAAA,MAAO;AACL,MAAA,OAAA,GAAU,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA;AAC1B,MAAA,YAAA,GAAe,KAAA;AAAA,IACjB;AAGA,IAAA,MAAM,GAAA,GAAM,IAAI,OAAA,CAAqB,GAAG,CAAA;AACxC,IAAA,IAAI,OAAO,CAAA,EAAG,GAAA,CAAI,GAAA,CAAI,KAAA,EAAO,QAAQ,IAAI,CAAA;AACzC,IAAA,IAAIA,YAAW,KAAA,GAAQ,CAAA,MAAO,GAAA,CAAI,MAAA,EAAQA,UAAS,KAAK,CAAA;AACxD,IAAA,IAAI,KAAA,GAAQ,GAAG,GAAA,CAAI,GAAA,CAAI,eAAe,YAAA,GAAe,UAAA,EAAY,SAAS,KAAK,CAAA;AAE/E,IAAA,OAAO;AAAA,MACL,GAAA,EAAK,IAAI,QAAA,CAAS,GAAG,KAAK,GAAA,CAAI,KAAA,CAAM,GAAG,GAAG,CAAA;AAAA,MAC1C,KAAA,EAAO,KAAK,KAAA,CAAM,KAAA,CAAM,GAAG,CAAA,IAAK,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA;AAAA,MAChD,GAAA,EAAK,MAAA,IAAU,GAAA,CAAI,KAAA,CAAM,GAAG,GAAG,CAAA;AAAA,MAC/B,IAAA,EAAMA,QAAAA,IAAW,GAAA,CAAI,KAAA,CAAM,GAAG,GAAG,CAAA;AAAA,MACjC,IAAA,EAAM,OAAA,IAAW,GAAA,CAAI,KAAA,CAAM,GAAG,GAAG,CAAA;AAAA,MACjC,SAAS,EAAE,GAAA,EAAK,MAAM,IAAA,EAAM,KAAA,EAAO,MAAM,KAAA,EAAM;AAAA,MAC/C,OAAA,EAAS,UAAA;AAAA,MACT,QAAA,EAAU,WAAA,IAAe,GAAA,CAAI,KAAA,CAAM,GAAG,GAAG,CAAA;AAAA,MACzC,WAAA,EAAa,cAAA,IAAkB,GAAA,CAAI,KAAA,CAAM,GAAG,GAAG,CAAA;AAAA,MAC/C,YAAA,EAAc,eAAA,IAAmB,GAAA,CAAI,KAAA,CAAM,GAAG,GAAG;AAAA,KACnD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBA,aAAA,CAAc,OAAe,GAAA,EAAgE;AAC3F,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,kBAAA,CAAmB,IAAA,CAAK,SAAS,CAAA;AAElD,IAAA,IAAI,UAAA;AACJ,IAAA,IAAI,IAAA,CAAK,eAAe,IAAA,EAAM;AAC5B,MAAA,UAAA,GAAa,MAAA;AAAA,IACf,CAAA,MAAA,IAAW,KAAK,UAAA,EAAY;AAC1B,MAAA,UAAA,GAAa,IAAA,CAAK,UAAA;AAAA,IACpB,CAAA,MAAA,IAAW,IAAA,CAAK,SAAA,YAAqB,iBAAA,EAAmB;AACtD,MAAA,UAAA,GAAa,MAAA;AAAA,IACf,CAAA,MAAO;AACL,MAAA,IAAI;AACF,QAAA,UAAA,GAAa,IAAA,CAAK,SAAA,EAAW,IAAA,EAAK,CAAE,UAAA,EAAW;AAAA,MACjD,SAAS,KAAA,EAAO;AAEd,QAAA,IAAI,EAAE,KAAA,YAAiB,0BAAA,CAAA,EAA6B,MAAM,KAAA;AAAA,MAC5D;AAAA,IACF;AACA,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,kBAAA,CAAmB,UAAU,CAAA;AAE/C,IAAA,OAAO,EAAE,KAAK,IAAA,EAAK;AAAA,EACrB;AAAA,EAEQ,mBAAmB,MAAA,EAAuD;AAChF,IAAA,IAAI,CAAC,MAAA,IAAU,MAAA,YAAkB,iBAAA,EAAmB,OAAO,IAAA;AAI3D,IAAA,IAAI,MAAA,CAAO,QAAA,EAAS,KAAM,IAAA,EAAM,OAAO,IAAA;AAEvC,IAAA,MAAM,WAAA,GAAc,OAAO,iBAAA,EAAkB,CAAE,OAAO,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,GAAQ,CAAC,CAAA;AACxE,IAAA,IAAI,WAAA,CAAY,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AACrC,IAAA,MAAM,MAAA,GAAS,YAAY,CAAC,CAAA;AAC5B,IAAA,IAAI,MAAA,CAAO,IAAA,IAAQ,MAAA,CAAO,MAAA,GAAS,GAAG,OAAO,IAAA;AAC7C,IAAA,IAAI,OAAO,OAAA,GAAU,CAAA,IAAK,MAAA,CAAO,iBAAA,GAAoB,GAAG,OAAO,IAAA;AAC/D,IAAA,IAAI,MAAA,CAAO,QAAA,KAAa,MAAA,EAAQ,OAAO,IAAA;AACvC,IAAA,IAAI,MAAA,CAAO,aAAA,IAAiB,MAAA,CAAO,KAAA,GAAQ,GAAG,OAAO,IAAA;AAOrD,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG,OAAO,EAAE,wBAAA,kBAA0B,IAAI,KAAI,EAAE;AAEpE,IAAA,MAAM,UAAU,WAAA,CAAY,MAAA,CAAO,OAAO,MAAA,CAAO,OAAA,EAAS,OAAO,MAAM,CAAA;AACvE,IAAA,MAAM,SAAA,GAAY,mBAAA,CAAoB,MAAA,CAAO,KAAA,EAAO,OAAO,CAAA;AAC3D,IAAA,MAAM,KAAA,GAAQ,gBAAA,CAAiB,MAAA,CAAO,KAAA,EAAO,OAAO,CAAA;AACpD,IAAA,MAAM,WAAW,MAAA,CAAO,QAAA;AAExB,IAAA,MAAM,wBAAA,uBAA+B,GAAA,EAAoB;AACzD,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,SAAS,CAAA,IAAK,SAAA,EAAW;AACxC,MAAA,IAAI,aAAa,CAAA,EAAG;AACpB,MAAA,MAAM,SAAA,GAAY,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA,IAAK,CAAA;AACpC,MAAA,wBAAA,CAAyB,GAAA,CAAI,GAAA,GAAM,QAAA,EAAU,SAAA,GAAY,SAAS,CAAA;AAAA,IACpE;AAEA,IAAA,OAAO,EAAE,wBAAA,EAAyB;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,SAAS,GAAA,EAA4B;AAC3C,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,QAAA,EAAS;AACrC,IAAA,IAAI,QAAA,KAAa,MAAM,OAAO,IAAA;AAE9B,IAAA,IAAI,MAAA,GAAS,EAAA;AACb,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,SAAA,CAAU,QAAA,EAAS;AAClC,MAAA,IAAI,CAAA,KAAM,MAAM,OAAO,IAAA;AACvB,MAAA,MAAA,GAAS,CAAA;AAAA,IACX;AAEA,IAAA,IAAI,OAAA;AACJ,IAAA,IAAI,IAAA,CAAK,UAAA,KAAe,IAAA,EAAM,OAAA,GAAU,GAAA;AAAA,SAAA,IAC/B,IAAA,CAAK,UAAA,KAAe,MAAA,EAAW,OAAA,GAAU,GAAA;AAAA,SAC7C;AACH,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,UAAA,CAAW,QAAA,EAAS;AACnC,MAAA,IAAI,CAAA,KAAM,MAAM,OAAO,IAAA;AACvB,MAAA,OAAA,GAAU,CAAA;AAAA,IACZ;AAEA,IAAA,IAAI,OAAA,GAAU,EAAA;AACd,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,UAAA,CAAW,QAAA,EAAS;AACnC,MAAA,IAAI,CAAA,KAAM,MAAM,OAAO,IAAA;AACvB,MAAA,OAAA,GAAU,CAAA;AAAA,IACZ;AAEA,IAAA,IAAI,WAAA,GAAc,EAAA;AAClB,IAAA,KAAA,MAAW,CAAA,IAAK,KAAK,cAAA,EAAgB;AACnC,MAAA,MAAM,CAAA,GAAI,EAAE,QAAA,EAAS;AACrB,MAAA,IAAI,CAAA,KAAM,MAAM,OAAO,IAAA;AACvB,MAAA,WAAA,IAAe,IAAI,CAAC,CAAA,CAAA;AAAA,IACtB;AAEA,IAAA,OAAO,GAAG,QAAQ,CAAA,EAAA,EAAK,MAAM,CAAA,EAAA,EAAK,OAAO,CAAA,EAAA,EAAK,OAAO,CAAA,EAAA,EAAK,WAAW,QACnE,IAAA,CAAK,cAAA,GAAiB,CAAA,GAAI,CAC5B,KAAK,GAAG,CAAA,CAAA;AAAA,EACV;AAAA;AAAA,EAGA,KAAA,CAAM,MAAc,CAAA,EAAQ;AAC1B,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA;AAC7B,IAAA,IAAI,QAAQ,IAAA,EAAM,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA,CAAE,GAAA;AAC3C,IAAA,MAAM,MAAA,GAAS,cAAA,CAAe,GAAA,CAAI,GAAG,CAAA;AACrC,IAAA,IAAI,QAAQ,OAAO,MAAA;AACnB,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA,CAAE,GAAA;AAC9B,IAAA,cAAA,CAAe,GAAA,CAAI,KAAK,GAAG,CAAA;AAC3B,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEA,IAAI,GAAA,GAAM;AACR,IAAA,OAAO,KAAK,KAAA,EAAM;AAAA,EACpB;AAAA;AAAA,EAGA,OAAA,CAAQ,MAAc,CAAA,EAAc;AAClC,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,KAAA,EAAM;AAAA,EAC/B;AACF;;;ACpsBO,SAAS,OAAA,CACd,QAAA,EACA,aAAA,EACA,KAAA,EACsC;AACtC,EAAA,MAAM,YAAA,GAAe,QAAA,KAAa,WAAA,IAAe,QAAA,KAAa,gBAAA;AAC9D,EAAA,MAAM,kBAAkB,QAAA,KAAa,cAAA;AACrC,EAAA,MAAM,YAAA,GAAe,gBAAgB,KAAA,CAAM,SAAA;AAC3C,EAAA,MAAM,eAAA,GAAkB,mBAAmB,KAAA,CAAM,YAAA;AAEjD,EAAA,IAAI,gBAAgB,eAAA,EAAiB,OAAO,EAAE,QAAA,EAAU,MAAA,EAAQ,MAAM,CAAA,EAAE;AACxE,EAAA,IAAI,YAAA,SAAqB,EAAE,QAAA,EAAU,aAAa,IAAA,EAAM,QAAA,KAAa,gBAAA,GAAmB,CAAA,GAAI,aAAA,EAAc;AAC1G,EAAA,IAAI,iBAAiB,OAAO,EAAE,QAAA,EAAU,cAAA,EAAgB,MAAM,CAAA,EAAE;AAChE,EAAA,OAAO,EAAE,QAAA,EAAU,MAAA,EAAQ,IAAA,EAAM,CAAA,EAAE;AACrC;AAEO,IAAM,SAAA,GAAN,MAAM,UAAA,SAAkB,WAAA,CAAY;AAAA,EAGzC,WAAA,CAAY,QAAA,EAAuB,EAAA,EAAY,YAAA,EAA6B;AAC1E,IAAA,KAAA,CAAM,QAAA,CAAS,mBAAmB,CAAA;AAElC,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,IAAA,CAAK,YAAA,GAAe,EAAE,GAAG,YAAA,EAAc,EAAA,EAAG;AAAA,IAC5C,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,eAAe,EAAE,EAAA,EAAI,aAAA,EAAe,EAAA,EAAI,eAAe,CAAA,EAAE;AAAA,IAChE;AAAA,EACF;AAAA,EASA,SAAS,IAAA,EAA4B;AACnC,IAAA,MAAM,UAAA,GAAa,WAAA,CAAY,QAAA,CAAS,GAAG,IAAI,CAAA;AAC/C,IAAA,OAAO,IAAI,aAAA,CAAc,IAAA,EAAM,UAAU,CAAA;AAAA,EAC3C;AAAA,EAEA,IAAI,aAAA,GAAwB;AAC1B,IAAA,OAAO,KAAK,YAAA,CAAa,aAAA;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,kBAAA,GAAgC;AAC9B,IAAA,IAAI,IAAA,CAAK,YAAA,CAAa,aAAA,KAAkB,CAAA,EAAG,OAAO,IAAA;AAClD,IAAA,OAAO,IAAI,UAAA,CAAU,IAAA,EAAM,IAAA,CAAK,aAAa,EAAA,EAAI;AAAA,MAC/C,GAAG,IAAA,CAAK,YAAA;AAAA,MACR,aAAA,EAAe;AAAA,KAChB,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,eAAA,GAAyC;AAC/C,IAAA,MAAM,OAAA,GAAU,KAAK,iBAAA,EAAkB;AACvC,IAAA,MAAM,GAAA,GAAM,iBAAiB,OAAO,CAAA;AACpC,IAAA,IAAI,GAAA,KAAQ,IAAI,OAAO,OAAA;AAIvB,IAAA,MAAM,IAAA,GACJ,OAAA,CAAQ,GAAG,CAAA,CAAE,QAAA,KAAa,WAAA,IAAe,IAAA,CAAK,YAAA,CAAa,aAAA,KAAkB,CAAA,GACzE,gBAAA,GACA,OAAA,CAAQ,GAAG,CAAA,CAAE,QAAA;AACnB,IAAA,IAAI,IAAA,KAAS,OAAA,CAAQ,GAAG,CAAA,CAAE,UAAU,OAAO,OAAA;AAC3C,IAAA,MAAM,OAAA,GAAU,CAAC,GAAG,OAAO,CAAA;AAC3B,IAAA,OAAA,CAAQ,GAAG,IAAI,EAAE,GAAG,QAAQ,GAAG,CAAA,EAAG,UAAU,IAAA,EAAK;AACjD,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAES,gBAAA,GAA2C;AAClD,IAAA,MAAM,OAAA,GAAU,KAAK,eAAA,EAAgB;AACrC,IAAA,MAAM,GAAA,GAAM,iBAAiB,OAAO,CAAA;AACpC,IAAA,OAAO,QAAQ,EAAA,GAAK,OAAA,CAAQ,CAAC,CAAA,GAAI,QAAQ,GAAG,CAAA;AAAA,EAC9C;AAAA,EAES,QAAA,GAA0B;AACjC,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,EAAS;AAC5B,IAAA,OAAO,SAAS,IAAA,GACZ,IAAA,GACA,CAAA,EAAA,EAAK,IAAA,CAAK,aAAa,EAAE,CAAA,CAAA,EAAI,IAAA,CAAK,YAAA,CAAa,aAAa,CAAA,CAAA,EAAI,IAAA,CAAK,YAAA,CAAa,aAAa,IAAI,IAAI,CAAA,CAAA;AAAA,EAC7G;AAAA;AAAA,EAGA,OAAO,SAAA,EAA8B;AACnC,IAAA,aAAA,CAAc,WAAW,oBAAoB,CAAA;AAC7C,IAAA,MAAM,SAAA,GAA0B;AAAA,MAC9B,GAAG,IAAA,CAAK,YAAA;AAAA,MACR,aAAA,EAAe;AAAA,KACjB;AACA,IAAA,OAAO,IAAI,UAAA,CAAU,IAAA,EAAM,IAAA,CAAK,YAAA,CAAa,IAAI,SAAS,CAAA;AAAA,EAC5D;AAAA,EAEA,WAAA,GAAiC;AAC/B,IAAA,MAAM,YAAA,GAAe,IAAI,WAAA,CAAY,IAAA,CAAK,iBAAiB,CAAA;AAC3D,IAAA,OAAO,IAAI,iBAAA;AAAA,MACT,YAAA;AAAA,MACA;AAAA,QACE,aAAA,EAAe,KAAK,YAAA,CAAa,aAAA;AAAA,QACjC,EAAA,EAAI,KAAK,YAAA,CAAa;AAAA,OACxB;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOS,YAAA,GAAuB;AAC9B,IAAA,OAAO,IAAI,eAAA,CAAgB,IAAI,CAAC,CAAA,IAAA,EAAO,IAAA,CAAK,aAAa,EAAE,CAAA,CAAA,CAAA;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQS,KAAA,CAAM,MAAc,CAAA,EAAQ;AACnC,IAAA,MAAM,EAAA,GAAK,KAAK,YAAA,CAAa,EAAA;AAC7B,IAAA,MAAMC,IAAAA,GAAM,eAAe,IAAI,CAAA;AAC/B,IAAA,MAAM,YAAY,IAAA,CAAK,QAAA;AACvB,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,gBAAA,CAAiB,IAAA,EAAM,GAAG,CAAA;AAGjD,IAAA,MAAM,KAAA,GAAQ,CAACA,IAAAA,EAAK,GAAG,SAAS,CAAA;AAChC,IAAA,IAAI,aAAA,GAAgB,MAAM,MAAA,KAAW,CAAA,GAAIA,OAAM,GAAA,CAAI,YAAA,CAAa,OAAO,GAAG,CAAA;AAC1E,IAAA,IAAI,SAAA,KAAc,CAAA;AAChB,MAAA,aAAA,GAAgB,aAAA,CAAc,SAAA;AAAA,QAC5B,CAAC,cAAc,SAAA,GAAY;AAAA,OAC7B;AAGF,IAAA,MAAM,GAAA,uBAAU,GAAA,EAAoB;AACpC,IAAA,KAAA,MAAW,SAAA,IAAa,aAAA,CAAc,OAAA,EAAQ,EAAG;AAC/C,MAAA,MAAM,CAAA,GAAI,aAAA,CAAc,GAAA,CAAI,SAAS,CAAA;AACrC,MAAA,MAAM,GAAA,GAAM,SAAA,IAAa,EAAA,GAAK,SAAA,GAAY,CAAA;AAC1C,MAAA,GAAA,CAAI,IAAI,GAAA,EAAA,CAAM,GAAA,CAAI,IAAI,GAAG,CAAA,IAAK,KAAK,CAAC,CAAA;AAAA,IACtC;AACA,IAAA,OAAO,GAAA,CAAI,OAAA,CAAQ,GAAA,EAAK,GAAG,CAAA;AAAA,EAC7B;AAAA;AAAA,EAGS,KAAK,EAAA,EAAwB;AACpC,IAAA,MAAM,QAAA,GAAW,IAAI,WAAA,CAAY,IAAA,CAAK,mBAAmB,CAAA;AACzD,IAAA,MAAM,SAAA,GAA0B;AAAA,MAC9B,EAAA,EAAI,EAAA,IAAM,IAAA,CAAK,YAAA,CAAa,EAAA;AAAA,MAC5B,aAAA,EAAe,KAAK,YAAA,CAAa,aAAA;AAAA,MACjC,aAAA,EAAe,KAAK,YAAA,CAAa;AAAA,KACnC;AACA,IAAA,OAAO,IAAI,UAAA,CAAU,QAAA,EAAU,SAAA,CAAU,IAAI,SAAS,CAAA;AAAA,EACxD;AACF;AAGA,WAAA,CAAY,SAAA,CAAU,EAAA,GAAK,SAAU,QAAA,EAA6B;AAChE,EAAA,IAAI,MAAM,QAAQ,CAAA,EAAG,MAAM,IAAI,MAAM,gCAAgC,CAAA;AACrE,EAAA,aAAA,CAAc,UAAU,MAAM,CAAA;AAC9B,EAAA,OAAO,IAAI,SAAA,CAAU,IAAA,EAAM,QAAQ,CAAA;AACrC,CAAA;;;AClLA,IAAM,YAAA,GAAe,GAAA,CAAI,WAAA,CAAY,GAAI,CAAA;AAGlC,SAAS,cAAA,GAAuB;AACrC,EAAA,YAAA,CAAa,KAAA,EAAM;AACrB;AAEO,IAAM,WAAA,GAAN,MAAM,YAAA,CAAoC;AAAA,EAC/C,WAAA,CACW,KAAA,EACQ,aAAA,EACA,WAAA,GAA2B,QAAA,EAC5C;AAHS,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACQ,IAAA,IAAA,CAAA,aAAA,GAAA,aAAA;AACA,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AAAA,EAChB;AAAA,EAEH,QAAA,GAAwB;AACtB,IAAA,OAAO,IAAI,YAAA,CAAY,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,eAAe,MAAM,CAAA;AAAA,EAC/D;AAAA,EAEA,YAAA,GAAuB;AACrB,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,YAAA,EAAa;AAC1C,IAAA,IAAI,CAAC,IAAA,CAAK,aAAA,EAAe,OAAO,SAAA;AAEhC,IAAA,MAAM,iBAAA,GAAoB,IAAA,CAAK,aAAA,CAAc,YAAA,EAAa;AAC1D,IAAA,MAAM,MAAA,GAAS,CAAA,EAAG,SAAS,CAAA,IAAA,EAAO,iBAAiB,CAAA,CAAA,CAAA;AACnD,IAAA,OAAO,IAAA,CAAK,WAAA,KAAgB,MAAA,GAAS,CAAA,EAAG,MAAM,CAAA,UAAA,CAAA,GAAe,MAAA;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAA,CAAQ,MAAc,GAAA,EAAqB;AACzC,IAAA,MAAM,EAAE,UAAU,QAAA,EAAU,KAAA,EAAO,OAAM,GAAI,IAAA,CAAK,MAAM,iBAAA,EAAkB;AAC1E,IAAA,MAAM,UAAU,IAAA,CAAK,aAAA,GACjB,IAAA,CAAK,aAAA,YAAyB,oBAC5B,IAAA,CAAK,aAAA,CAAc,KAAA,CAAM,GAAG,IAC5B,kBAAA,CAAmB,IAAA,CAAK,aAAa,CAAA,GACvC,GAAA,CAAI,MAAM,CAAC,CAAA;AACf,IAAA,MAAM,SAAA,GAAY,KAAK,WAAA,IAAe,MAAA;AAEtC,IAAA,IAAI,UAAA,GAAkB,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA;AACtC,IAAA,IAAI,cAAc,MAAA,EAAQ,UAAA,GAAa,OAAA,CAAQ,WAAA,CAAY,KAAK,OAAO,CAAA;AAEvE,IAAA,MAAM,YAAA,GACJ,SAAA,KAAc,QAAA,GAAW,UAAA,GAAa,UAAA;AACxC,IAAA,MAAM,SAAA,GAAyB,UAAA;AAC/B,IAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAqB,GAAG,CAAA;AAC5C,IAAA,MAAM,OAAA,GAAU,OAAA,CACb,GAAA,CAAI,YAAA,EAAc,UAAA,EAAY,QAAQ,CAAA,CACtC,GAAA,CAAI,SAAA,EAAW,OAAA,EAAS,KAAK,CAAA;AAEhC,IAAA,OAAO;AAAA,MACL,GAAA,EAAK,QAAQ,QAAA,CAAS,GAAG,KAAK,GAAA,CAAI,KAAA,CAAM,GAAG,GAAG,CAAA;AAAA,MAC9C,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,GAAG,CAAA;AAAA,MAC3B,QAAA,EAAU,OAAA,IAAW,GAAA,CAAI,KAAA,CAAM,GAAG,GAAG,CAAA;AAAA,MACrC,WAAA,EAAa,UAAA,IAAc,GAAA,CAAI,KAAA,CAAM,GAAG,GAAG,CAAA;AAAA,MAC3C,OAAA,EAAS,EAAE,OAAA,EAAS,QAAA,EAAU,MAAM,KAAA;AAAM,KAC5C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,SAAS,GAAA,EAA4B;AAC3C,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,QAAA,EAAS;AACrC,IAAA,IAAI,QAAA,KAAa,MAAM,OAAO,IAAA;AAE9B,IAAA,IAAI,OAAA,GAAU,EAAA;AACd,IAAA,IAAI,KAAK,aAAA,EAAe;AACtB,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,aAAA,CAAc,QAAA,EAAS;AACtC,MAAA,IAAI,CAAA,KAAM,MAAM,OAAO,IAAA;AACvB,MAAA,OAAA,GAAU,CAAA;AAAA,IACZ;AAEA,IAAA,OAAO,CAAA,EAAG,QAAQ,CAAA,EAAA,EAAK,OAAO,KAAK,IAAA,CAAK,WAAW,KAAK,GAAG,CAAA,CAAA;AAAA,EAC7D;AAAA;AAAA,EAGA,KAAA,CAAM,MAAc,CAAA,EAAQ;AAC1B,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA;AAC7B,IAAA,IAAI,QAAQ,IAAA,EAAM,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA,CAAE,GAAA;AAC3C,IAAA,MAAM,MAAA,GAAS,YAAA,CAAa,GAAA,CAAI,GAAG,CAAA;AACnC,IAAA,IAAI,QAAQ,OAAO,MAAA;AACnB,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA,CAAE,GAAA;AAC9B,IAAA,YAAA,CAAa,GAAA,CAAI,KAAK,GAAG,CAAA;AACzB,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEA,IAAI,GAAA,GAAM;AACR,IAAA,OAAO,KAAK,KAAA,EAAM;AAAA,EACpB;AAAA;AAAA,EAGA,OAAA,CAAQ,MAAc,CAAA,EAAc;AAClC,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,KAAA,EAAM;AAAA,EAC/B;AACF;;;ACvGA,IAAM,UAAA,GAAa,GAAA,CAAI,WAAA,CAAY,GAAI,CAAA;AAGhC,SAAS,YAAA,GAAqB;AACnC,EAAA,UAAA,CAAW,KAAA,EAAM;AACnB;AAEO,IAAM,SAAA,GAAN,MAAM,UAAA,SAAkB,WAAA,CAAY;AAAA,EAGzC,WAAA,CAAY,UAAuB,UAAA,EAAyB;AAC1D,IAAA,KAAA,CAAM,QAAA,CAAS,mBAAmB,CAAA;AAClC,IAAA,IAAA,CAAK,UAAA,GAAa,aAAa,EAAE,GAAG,YAAW,GAAI,EAAE,IAAI,EAAA,EAAG;AAAA,EAC9D;AAAA,EAES,GAAG,MAAA,EAA2B;AACrC,IAAA,IAAI,MAAM,MAAM,CAAA,EAAG,MAAM,IAAI,MAAM,8BAA8B,CAAA;AACjE,IAAA,aAAA,CAAc,QAAQ,MAAM,CAAA;AAC5B,IAAA,IAAI,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,QAAA,KAAa,gBAAA,EAAkB;AACvD,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AACA,IAAA,OAAO,IAAI,UAAA,CAAU,IAAA,EAAM,EAAE,EAAA,EAAI,QAAQ,CAAA;AAAA,EAC3C;AAAA,EAEA,IAAI,MAAA,GAAiB;AACnB,IAAA,OAAO,KAAK,UAAA,CAAW,EAAA;AAAA,EACzB;AAAA,EAES,IAAI,WAAA,EAAqC;AAChD,IAAA,MAAM,UAAA,GAAa,KAAA,CAAM,GAAA,CAAI,WAAW,CAAA;AACxC,IAAA,OAAO,IAAI,UAAA,CAAU,UAAA,EAAY,IAAA,CAAK,UAAU,CAAA;AAAA,EAClD;AAAA,EAES,QAAQ,KAAA,EAA2B;AAC1C,IAAA,MAAM,UAAA,GAAa,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA;AACtC,IAAA,OAAO,IAAI,UAAA,CAAU,UAAA,EAAY,IAAA,CAAK,UAAU,CAAA;AAAA,EAClD;AAAA,EASA,iBAAiB,IAAA,EAA0B;AACzC,IAAA,MAAM,UAAA,GAAa,WAAA,CAAY,QAAA,CAAS,GAAG,IAAI,CAAA;AAC/C,IAAA,OAAO,IAAI,WAAA,CAAY,IAAA,EAAM,UAAU,CAAA;AAAA,EACzC;AAAA,EAES,iBAAA,GAA2B;AAClC,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AAAA;AAAA,EAGS,YAAA,GAAuB;AAC9B,IAAA,MAAM,UAAA,GAAa,KAAK,iBAAA,EAAkB;AAC1C,IAAA,MAAM,UAAA,GAAa,CAAC,GAAG,UAAU,CAAA;AACjC,IAAA,MAAM,UAAA,GAAa,IAAI,WAAA,CAAY,UAAU,EAAE,YAAA,EAAa;AAC5D,IAAA,OAAO,CAAA,CAAA,EAAI,UAAU,CAAA,IAAA,EAAO,IAAA,CAAK,WAAW,EAAE,CAAA,CAAA,CAAA;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOS,QAAA,GAA0B;AACjC,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,EAAS;AAC5B,IAAA,OAAO,IAAA,KAAS,OAAO,IAAA,GAAO,CAAA,GAAA,EAAM,KAAK,UAAA,CAAW,EAAE,IAAI,IAAI,CAAA,CAAA;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,iBAAA,GAAyD;AACvD,IAAA,MAAM,OAAA,GAAU,eAAe,IAAI,CAAA;AACnC,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,gBAAA,CAAiB,IAAA,EAAM,CAAC,CAAA;AACnD,IAAA,MAAM,QAAA,GAAW,aAAA,CAAc,MAAA,GAAS,GAAA,CAAI,YAAA,CAAa,aAAA,EAAe,CAAC,CAAA,GAAI,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AAC3F,IAAA,IAAI,QAAA,GAAW,CAAA;AACf,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,KAAA,MAAW,CAAC,CAAA,EAAG,GAAG,CAAA,IAAK,OAAA,EAAS;AAC9B,MAAA,MAAM,EAAE,OAAA,EAAS,KAAA,EAAM,GAAI,gBAAA,CAAiB,UAAU,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,QAAA,GAAW,CAAC,CAAA;AACrF,MAAA,QAAA,IAAY,IAAI,CAAA,GAAI,OAAA;AACpB,MAAA,KAAA,IAAS,IAAI,CAAA,GAAI,KAAA;AAAA,IACnB;AACA,IAAA,OAAO,EAAE,UAAU,KAAA,EAAM;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMS,KAAA,CAAM,MAAc,CAAA,EAAQ;AACnC,IAAA,MAAM,GAAA,GAAM,KAAK,QAAA,EAAS;AAC1B,IAAA,MAAM,UAAU,GAAA,KAAQ,IAAA,GAAO,OAAO,CAAA,EAAG,GAAG,KAAK,GAAG,CAAA,CAAA;AACpD,IAAA,IAAI,YAAY,IAAA,EAAM;AACpB,MAAA,MAAM,MAAA,GAAS,UAAA,CAAW,GAAA,CAAI,OAAO,CAAA;AACrC,MAAA,IAAI,QAAQ,OAAO,MAAA;AAAA,IACrB;AAEA,IAAA,MAAM,EAAE,QAAA,EAAU,KAAA,EAAM,GAAI,KAAK,iBAAA,EAAkB;AACnD,IAAA,MAAM,CAAA,uBAAQ,GAAA,EAAoB;AAClC,IAAA,IAAI,QAAA,GAAW,CAAA,EAAG,CAAA,CAAE,GAAA,CAAI,GAAG,QAAQ,CAAA;AACnC,IAAA,IAAI,KAAA,GAAQ,CAAA,EAAG,CAAA,CAAE,GAAA,CAAI,GAAG,KAAK,CAAA;AAC7B,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,OAAA,CAAQ,CAAA,EAAG,GAAG,CAAA;AAC9B,IAAA,IAAI,OAAA,KAAY,IAAA,EAAM,UAAA,CAAW,GAAA,CAAI,SAAS,GAAG,CAAA;AACjD,IAAA,OAAO,GAAA;AAAA,EACT;AACF;AAGA,WAAA,CAAY,SAAA,CAAU,EAAA,GAAK,SAAU,MAAA,EAA2B;AAC9D,EAAA,OAAO,IAAI,SAAA,CAAU,IAAI,CAAA,CAAE,GAAG,MAAM,CAAA;AACtC,CAAA;;;ACyHO,IAAM,aAAA,GAAN,cAA4B,KAAA,CAAM;AAAA,EACvC,WAAA,CACW,IAAA,EACA,EAAA,EACT,OAAA,EACA;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AAJJ,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AAIT,IAAA,IAAA,CAAK,IAAA,GAAO,eAAA;AAAA,EACd;AACF;AAqBO,IAAM,kBAAA,GAAqB;;;AC/PlC,IAAM,mBAAA,GAAN,MAAM,oBAAA,CAAyC;AAAA,EAG7C,WAAA,CACW,YACA,MAAA,EACT;AAFS,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAJX,IAAA,IAAA,CAAS,IAAA,GAAO,WAAA;AAAA,EAKb;AAAA,EAEH,QAAQ,SAAA,EAA8D;AACpE,IAAA,MAAM,EAAE,GAAA,EAAK,IAAA,EAAK,GAChB,OAAO,SAAA,KAAc,QAAA,GAAW,EAAE,GAAA,EAAK,SAAA,EAAW,IAAA,EAAM,SAAA,EAAU,GAAI,SAAA;AACxE,IAAA,IAAI,OAAO,KAAA,CAAM,GAAG,KAAK,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA,EAAG;AAC3C,MAAA,MAAM,IAAI,WAAW,8CAA8C,CAAA;AAAA,IACrE;AACA,IAAA,OAAO,IAAI,qBAAoB,IAAA,CAAK,UAAA,EAAY,EAAE,IAAA,EAAM,OAAA,EAAS,GAAA,EAAK,IAAA,EAAM,CAAA;AAAA,EAC9E;AAAA,EAEA,SAAA,GAAuB;AACrB,IAAA,MAAM,IAAI,aAAA;AAAA,MACR,oBAAA;AAAA,MACA,EAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF,CAAA;AA2BO,SAAS,cAAA,GAA4B;AAC1C,EAAA,OAAO,IAAI,mBAAA,CAAoB,oBAAA,EAAsB,EAAE,IAAA,EAAM,UAAU,CAAA;AACzE;AAGO,SAAS,YAAY,KAAA,EAAoC;AAC9D,EAAA,OAAO,KAAA,YAAiB,mBAAA;AAC1B;AAGO,SAAS,iBACd,SAAA,EAC+C;AAC/C,EAAA,MAAM,EAAE,UAAA,EAAY,MAAA,EAAO,GAAI,SAAA;AAC/B,EAAA,OAAO,MAAA,CAAO,SAAS,QAAA,GAAW,EAAE,YAAW,GAAI,EAAE,YAAY,MAAA,EAAO;AAC1E;AAoCA,IAAM,WAAA,GAAN,MAAM,YAAA,CAAiC;AAAA,EACrC,YAA6B,GAAA,EAAgD;AAAhD,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AAAA,EAAiD;AAAA,EAE9E,SAAA,GAAuB;AACrB,IAAA,OAAO,IAAI,aAAY,EAAE,GAAG,KAAK,GAAA,EAAK,SAAA,EAAW,MAAM,CAAA;AAAA,EACzD;AAAA,EAEA,YAAA,GAA0B;AACxB,IAAA,OAAO,IAAI,aAAY,EAAE,GAAG,KAAK,GAAA,EAAK,YAAA,EAAc,MAAM,CAAA;AAAA,EAC5D;AAAA,EAEA,SAAA,GAAuB;AACrB,IAAA,OAAO,IAAI,aAAY,EAAE,GAAG,KAAK,GAAA,EAAK,SAAA,EAAW,MAAM,CAAA;AAAA,EACzD;AAAA,EAEA,eAAA,GAAyB;AACvB,IAAA,OAAO,IAAI,WAAW,EAAE,GAAG,KAAK,GAAA,EAAK,KAAA,EAAO,eAAe,CAAA;AAAA,EAC7D;AAAA,EAEA,cAAA,GAAwB;AACtB,IAAA,OAAO,IAAI,WAAW,EAAE,GAAG,KAAK,GAAA,EAAK,KAAA,EAAO,eAAe,CAAA;AAAA,EAC7D;AACF,CAAA;AAEA,IAAM,UAAA,GAAN,MAAM,WAAA,CAA4B;AAAA,EAGhC,YAAqB,IAAA,EAAiB;AAAjB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAFrB,IAAA,IAAA,CAAS,IAAA,GAAO,OAAA;AAAA,EAEuB;AAAA,EAEvC,MAAM,OAAA,EAAmC;AACvC,IAAA,OAAO,IAAI,WAAA,CAAW,EAAE,GAAG,IAAA,CAAK,IAAA,EAAM,EAAA,EAAI,CAAC,GAAG,OAAO,CAAA,EAAG,CAAA;AAAA,EAC1D;AACF,CAAA;AAGO,SAAS,SAAA,GAAuB;AACrC,EAAA,OAAO,IAAI,WAAA,CAAY,EAAE,SAAA,EAAW,MAAM,CAAA;AAC5C;AAGO,SAAS,YAAA,GAA0B;AACxC,EAAA,OAAO,IAAI,WAAA,CAAY,EAAE,YAAA,EAAc,MAAM,CAAA;AAC/C;AAGO,SAAS,SAAA,GAAuB;AACrC,EAAA,OAAO,IAAI,WAAA,CAAY,EAAE,SAAA,EAAW,MAAM,CAAA;AAC5C;AAGO,SAAS,QAAQ,KAAA,EAAgC;AACtD,EAAA,OAAO,KAAA,YAAiB,UAAA;AAC1B;AAGO,SAAS,UAAU,KAAA,EAAyB;AACjD,EAAA,OAAQ,KAAA,CAAqB,IAAA;AAC/B;;;ACjLO,IAAM,UAAA,GAAa,CAAA;AACnB,IAAM,SAAA,GAAY,CAAA;AAClB,IAAM,UAAA,GAAa,CAAA;AAEnB,IAAM,QAAA,GAAW,CAAA;AACjB,IAAM,QAAA,GAAW,CAAA;AAKjB,IAAM,SAAA,GAAY,EAAA;AAOlB,IAAM,cAAA,GAAiB,EAAA;AAGvB,IAAM,aAAa,UAAA,IAAc,CAAA;AAMjC,SAAS,OAAA,CAAQ,IAAA,EAAc,OAAA,EAAsB,OAAA,GAAU,KAAA,EAAe;AACnF,EAAA,IAAI,OAAA,KAAY,MAAA,EAAQ,OAAO,IAAA,GAAO,QAAA;AAEtC,EAAA,MAAM,KAAA,GAAS,QAAQ,CAAA,GAAK,CAAA;AAC5B,EAAA,MAAM,QAAA,GAAW,OAAA,KAAY,MAAA,GAAS,IAAA,GAAO,QAAA,GAAW,IAAA;AACxD,EAAA,MAAM,YAAY,OAAA,GAAW,OAAA,KAAY,MAAA,GAAS,SAAA,GAAY,iBAAiB,SAAA,GAAa,CAAA;AAC5F,EAAA,MAAM,YAAY,QAAA,GAAW,SAAA;AAC7B,EAAA,IAAI,KAAA,KAAU,YAAY,OAAO,SAAA;AAEjC,EAAA,MAAM,SAAA,GAAY,OAAA,KAAY,MAAA,GAAS,UAAA,GAAa,SAAA;AACpD,EAAA,OAAQ,SAAA,IAAa,CAAA,GAAM,SAAA,IAAa,cAAA,GAAiB,YAAY,QAAA,GAAW,QAAA,CAAA;AAClF;;;ACXA,IAAM,cAAA,GAAiB,CAAA;AAyGvB,SAAS,WAAW,KAAA,EAAgC;AAClD,EAAA,MAAM,SAAiB,EAAC;AACxB,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,QAAQ,MAAA,CAAO,SAAA;AAAA,MACnB,CAAC,KAAA,KACC,KAAA,CAAM,OAAA,KAAY,IAAA,CAAK,OAAA,IACvB,KAAA,CAAM,OAAA,KAAY,IAAA,CAAK,OAAA,IACvB,KAAA,CAAM,MAAA,KAAW,IAAA,CAAK;AAAA,KAC1B;AACA,IAAA,IAAI,KAAA,KAAU,EAAA,EAAI,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA;AAAA,gBACtB,KAAK,CAAA,GAAI,EAAE,GAAG,OAAO,KAAK,CAAA,EAAG,KAAA,EAAO,MAAA,CAAO,KAAK,CAAA,CAAE,KAAA,CAAM,GAAA,CAAI,IAAA,CAAK,KAAK,CAAA,EAAE;AAAA,EACtF;AACA,EAAA,OAAO,MAAA;AACT;AAGA,SAAS,QAAA,CACP,KAAA,EACA,OAAA,EACA,OAAA,EACA,OAAA,EACU;AACV,EAAA,MAAM,IAAA,GAAO,CAAC,GAAG,KAAK,CAAA;AACtB,EAAA,KAAA,MAAW,KAAA,IAAS,OAAA,EAAS,IAAA,CAAK,KAAK,CAAA,GAAI,QAAQ,IAAA,CAAK,KAAK,CAAA,EAAG,OAAA,EAAS,OAAO,CAAA;AAChF,EAAA,OAAO,IAAA;AACT;AAyBO,SAAS,YAAA,CACd,GAAA,EACA,OAAA,EACA,KAAA,EACS;AACT,EAAA,QAAQ,IAAI,EAAA;AAAI,IACd,KAAK,WAAA;AACH,MAAA,OAAO,OAAA,KAAY,MAAA;AAAA,IACrB,KAAK,WAAA;AACH,MAAA,OAAO,YAAY,MAAA,IAAA,CAAY,KAAA,CAAM,IAAI,KAAK,CAAA,IAAK,IAAK,CAAA,MAAU,UAAA;AAAA,IACpE,KAAK,UAAA;AACH,MAAA,OAAO,OAAA,KAAY,MAAA;AAAA,IACrB,KAAK,UAAA;AACH,MAAA,OAAO,OAAA,KAAY,MAAA;AAAA,IACrB,KAAK,YAAA;AACH,MAAA,OAAO,YAAY,MAAA,IAAA,CAAW,KAAA,CAAM,GAAA,CAAI,KAAK,IAAI,QAAA,MAAc,CAAA;AAAA;AAErE;AA2CA,IAAM,WAAA,GAAoC;AAAA,EACxC,WAAA,EAAa,IAAA;AAAA,EACb,UAAA,EAAY,IAAA;AAAA,EACZ,UAAA,EAAY,IAAA;AAAA,EACZ,YAAA,EAAc,IAAA;AAAA,EACd,WAAA,EAAa,IAAA;AAAA,EACb,YAAA,EAAc;AAChB,CAAA;AAMA,IAAM,cAAA,GAA0D;AAAA,EAC9D,WAAA,EAAa,EAAE,UAAA,EAAY,KAAA,EAAM;AAAA,EACjC,WAAA,EAAa,EAAE,UAAA,EAAY,IAAA,EAAK;AAAA,EAChC,UAAA,EAAY,EAAE,UAAA,EAAY,KAAA,EAAM;AAAA,EAChC,UAAA,EAAY,EAAE,UAAA,EAAY,KAAA,EAAM;AAAA,EAChC,YAAA,EAAc,EAAE,UAAA,EAAY,IAAA;AAC9B,CAAA;AAGA,IAAM,aAAA,GAAgB,CAAA;AACtB,IAAM,gBAAA,GAAmB,CAAA;AACzB,IAAM,eAAA,GAAkB,CAAA;AAyBjB,SAAS,QAAA,CACd,IAAA,EACA,KAAA,EACA,KAAA,EACU;AACV,EAAA,MAAM,UAAU,IAAA,CAAK,OAAA;AACrB,EAAA,IAAI,CAAC,SAAS,OAAO,KAAA;AAErB,EAAA,IAAI,OAAA,CAAQ,OAAO,WAAA,EAAa;AAC9B,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,OAAO,CAAA,KAAM,OAAO,KAAA,GAAQ,IAAA;AAAA,EAChD;AAEA,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA;AAC7B,EAAA,MAAM,KAAA,GAAS,QAAQ,CAAA,GAAK,CAAA;AAE5B,EAAA,QAAQ,QAAQ,EAAA;AAAI,IAClB,KAAK,WAAA;AACH,MAAA,IAAI,KAAA,KAAU,YAAY,OAAO,IAAA;AACjC,MAAA,OAAO,KAAA,KAAU,aAAa,MAAA,GAAS,KAAA;AAAA,IACzC,KAAK,UAAA;AACH,MAAA,OAAA,CAAQ,IAAA,GAAO,QAAA,MAAc,CAAA,GAAI,MAAA,GAAS,IAAA;AAAA,IAC5C,KAAK,UAAA;AACH,MAAA,OAAA,CAAQ,IAAA,GAAO,QAAA,MAAc,CAAA,GAAI,KAAA,GAAQ,IAAA;AAAA,IAC3C,KAAK,YAAA;AAGH,MAAA,OAAA,CAAQ,IAAA,GAAO,cAAc,CAAA,IAAK,KAAA,CAAM,KAAK,IAAI,CAAA,KAAM,OAAO,KAAA,GAAQ,IAAA;AAAA,IACxE,KAAK,YAAA;AAIH,MAAA,IAAA,CAAK,IAAA,GAAO,SAAA,MAAe,CAAA,EAAG,OAAO,IAAA;AACrC,MAAA,OAAA,CAAQ,IAAA,GAAO,cAAA,MAAoB,CAAA,GAAI,MAAA,GAAS,KAAA;AAAA,IAClD;AAEE,MAAA,OAAO,IAAA;AAAA;AAEb;AAEA,SAAS,KAAA,CACP,MAAA,EACA,GAAA,EACA,EAAA,GAAK,EAAA,EACA;AACL,EAAA,MAAM,QAAQ,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,GAAI,MAAA,GAAS,CAAC,MAAgB,CAAA;AAChE,EAAA,IAAI,MAAM,MAAA,KAAW,CAAA,SAAU,GAAA,CAAI,KAAA,CAAM,GAAG,GAAG,CAAA;AAC/C,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AAC/B,IAAA,IAAI,IAAA,YAAgB,KAAK,OAAO,IAAA;AAIhC,IAAA,IAAI,OAAQ,IAAA,CAAwB,KAAA,KAAU,UAAA,EAAY;AACxD,MAAA,MAAM,IAAI,aAAA;AAAA,QACR,eAAA;AAAA,QACA,EAAA;AAAA,QACA,IAAI,EAAE,CAAA,8CAAA;AAAA,OACR;AAAA,IACF;AAGA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC/B,IAAA,IAAI,EAAE,oBAAoB,GAAA,CAAA,EAAM;AAC9B,MAAA,MAAM,IAAI,aAAA;AAAA,QACR,eAAA;AAAA,QACA,EAAA;AAAA,QACA,IAAI,EAAE,CAAA,0CAAA;AAAA,OACR;AAAA,IACF;AACA,IAAA,OAAO,QAAA;AAAA,EACT,CAAC,CAAA;AACD,EAAA,OAAO,GAAA,CAAI,YAAA,CAAa,IAAA,EAAM,GAAG,CAAA;AACnC;AASA,SAAS,OAAA,CAAQ,KAAA,EAAc,IAAA,EAAW,GAAA,EAAkB;AAC1D,EAAA,IAAI,MAAM,UAAA,KAAe,MAAA,SAAkB,KAAA,CAAM,KAAA,CAAM,YAAY,GAAG,CAAA;AAEtE,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,MAAM,IACpC,KAAA,CAAM,MAAA,GACN,CAAC,KAAA,CAAM,MAAgB,CAAA;AAC3B,EAAA,IAAI,CAAC,KAAA,CAAM,IAAA,CAAK,aAAa,GAAG,OAAO,IAAA;AACvC,EAAA,OAAO,GAAA,CAAI,YAAA;AAAA,IACT,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS,KAAA,CAAM,aAAA,CAAc,IAAI,CAAA,GAAI,IAAA,CAAK,UAAA,EAAW,GAAI,IAAA,EAAM,GAAG,CAAC,CAAA;AAAA,IAC9E;AAAA,GACF;AACF;AAGA,SAAS,cAAc,IAAA,EAAyD;AAC9E,EAAA,IAAI,IAAA,YAAgB,iBAAA,EAAmB,OAAO,IAAA,CAAK,aAAA,EAAc;AACjE,EAAA,OAAO,YAAA,IAAgB,IAAA,IAAQ,OAAO,IAAA,CAAK,UAAA,KAAe,UAAA;AAC5D;AAKA,SAAS,eAAA,CACP,QACA,GAAA,EAC2D;AAC3D,EAAA,MAAM,OAAA,GAAU,MAAA;AAChB,EAAA,IAAI,OAAO,OAAA,CAAQ,aAAA,KAAkB,UAAA,EAAY;AAC/C,IAAA,OAAO,OAAA,CAAQ,cAAc,GAAG,CAAA;AAAA,EAClC;AACA,EAAA,OAAO,EAAE,GAAA,EAAK,IAAA,EAAM,IAAA,EAAM,IAAA,EAAK;AACjC;AAMA,SAAS,eAAA,CAAgB,MAAA,EAA2B,GAAA,EAAa,EAAA,GAAK,EAAA,EAAY;AAChF,EAAA,OAAO,MAAA,CAAO,MAAA,CAAO,CAAC,IAAA,KAAS;AAC7B,IAAA,IAAI,IAAA,YAAgB,iBAAA,IAAqB,IAAA,CAAK,aAAA,IAAiB,OAAO,KAAA;AACtE,IAAA,MAAM,SAAS,KAAA,CAAM,IAAA,EAAM,GAAA,EAAK,EAAE,EAAE,QAAA,EAAS;AAC7C,IAAA,OAAO,OAAO,QAAA,CAAS,KAAK,CAAA,IAAK,MAAA,CAAO,SAAS,MAAM,CAAA;AAAA,EACzD,CAAC,CAAA,CAAE,MAAA;AACL;AAkBA,SAAS,WAAA,CACP,GAAA,EACA,MAAA,EACA,GAAA,GAAc,GAAA,EACO;AACrB,EAAA,MAAM,MAAA,GAAS,IAAI,QAAA,EAAS;AAC5B,EAAA,IAAI,WAAA,GAAc,MAAA;AAClB,EAAA,IAAI,WAAW,MAAA,EAAW;AACxB,IAAA,MAAM,QAAQ,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,GAAI,MAAA,GAAS,CAAC,MAAgB,CAAA;AAChE,IAAA,IAAI,KAAA,CAAM,QAAQ,MAAM,CAAA,IAAK,gBAAgB,KAAA,EAAO,GAAG,CAAA,GAAI,CAAA,EAAG,OAAO,IAAA;AACrE,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS,EAAE,IAAA,YAAgB,iBAAA,IAAqB,IAAA,CAAK,aAAA,EAAc,CAAE,CAAA;AAClG,IAAA,IAAI,MAAA,CAAO,MAAA,GAAS,KAAA,CAAM,MAAA,EAAQ;AAChC,MAAA,WAAA,GAAc,MAAA,CAAO,WAAW,CAAA,GAAI,KAAK,KAAA,CAAM,MAAA,EAAQ,GAAG,CAAA,CAAE,QAAA,EAAS;AAAA,IACvE;AAAA,EACF;AACA,EAAA,IAAI,CAAC,WAAA,CAAY,QAAA,CAAS,KAAK,CAAA,IAAK,CAAC,WAAA,CAAY,QAAA,CAAS,MAAM,CAAA,EAAG,OAAO,IAAA;AAE1E,EAAA,MAAM,YAAY,CAAC,UAAA,EAAY,YAAY,CAAA,CACxC,MAAA,CAAO,CAAC,KAAA,KAAU,MAAA,CAAO,SAAS,KAAK,CAAC,EACxC,GAAA,CAAI,CAAC,UAAU,GAAA,CAAI,aAAA,CAAc,KAAK,CAAC,CAAA;AAE1C,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,GAAI,IAAI,aAAA,CAAc,KAAK,CAAA,GAAI,GAAA,CAAI,SAAA,EAAU;AAC9E,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,GAAI,IAAI,aAAA,CAAc,MAAM,CAAA,GAAI,GAAA,CAAI,SAAA,EAAU;AACjF,EAAA,MAAM,IAAA,GAAO,SAAA,CAAU,MAAA,GACnB,SAAA,CAAU,OAAO,CAAC,GAAA,EAAK,IAAA,KAAS,GAAA,CAAI,GAAA,CAAI,IAAI,CAAC,CAAA,GAC7C,IAAI,SAAA,EAAU;AAElB,EAAA,OAAO,EAAE,GAAA,EAAK,IAAA,EAAM,IAAA,EAAK;AAC3B;AAiBA,SAAS,aAAA,CAAc,QAAoC,GAAA,EAA0B;AACnF,EAAA,MAAM,UAAA,GAAa,MAAA;AACnB,EAAA,IAAI,MAAM,OAAA,CAAQ,MAAM,KAAK,OAAO,UAAA,CAAW,YAAY,UAAA,EAAY;AACrE,IAAA,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,QAAA,EAAU,IAAA,EAAK;AAAA,EACtC;AAEA,EAAA,MAAM,EAAE,KAAK,OAAA,EAAS,QAAA,EAAU,aAAa,YAAA,EAAa,GAAI,UAAA,CAAW,OAAA,CAAQ,GAAG,CAAA;AAEpF,EAAA,IAAI,EAAE,OAAA,YAAmB,GAAA,CAAA,IAAQ,OAAA,KAAY,GAAA,SAAY,EAAE,IAAA,EAAM,IAAA,EAAM,QAAA,EAAU,IAAA,EAAK;AACtF,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,EAAE,GAAA,EAAK,OAAA,EAAS,MAAM,QAAA,EAAgB;AAAA,IAC5C,QAAA,EAAU,EAAE,GAAA,EAAK,WAAA,EAAoB,MAAM,YAAA;AAAoB,GACjE;AACF;AAYA,SAAS,iBAAA,CAAkB,OAAY,IAAA,EAAuC;AAC5E,EAAA,MAAM,QAAA,GAAW,KAAK,IAAA,EAAK;AAC3B,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAoB;AACpC,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAoB;AAC3C,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,IAAI,YAAA,GAAe,CAAA;AACnB,EAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,OAAA,EAAQ,EAAG;AAClC,IAAA,UAAA,CAAW,GAAA,CAAI,OAAO,YAAY,CAAA;AAClC,IAAA,OAAA,IAAW,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,GAAI,QAAA;AAC7B,IAAA,YAAA,IAAgB,KAAA,CAAM,IAAI,KAAK,CAAA;AAC/B,IAAA,GAAA,CAAI,GAAA,CAAI,OAAO,OAAO,CAAA;AAAA,EACxB;AACA,EAAA,MAAM,CAAC,IAAI,CAAA,GAAI,KAAA,CAAM,aAAA,CAAc,CAAC,KAAA,KAAU,GAAA,CAAI,GAAA,CAAI,KAAK,CAAA,IAAK,CAAC,CAAA;AACjE,EAAA,MAAM,CAAC,MAAM,CAAA,GAAI,IAAA,CAAK,aAAA,CAAc,CAAC,KAAA,KAAA,CAAW,UAAA,CAAW,GAAA,CAAI,KAAK,CAAA,IAAK,CAAA,IAAK,QAAQ,CAAA;AACtF,EAAA,OAAO,EAAE,MAAM,MAAA,EAAO;AACxB;AAGA,SAAS,WAAA,CAAY,OAAe,KAAA,EAA6D;AAC/F,EAAA,MAAM,EAAA,GAAK,CAAA,OAAA,EAAU,KAAA,GAAQ,CAAC,CAAA,CAAA;AAG9B,EAAA,IAAI,EAAE,QAAA,IAAY,KAAA,CAAA,IAAU,KAAA,CAAM,MAAA,KAAW,QAAW,OAAO,EAAE,EAAA,EAAI,MAAA,EAAQ,KAAA,EAAgB;AAC7F,EAAA,OAAO,EAAE,EAAA,EAAI,KAAA,CAAM,EAAA,IAAM,EAAA,EAAI,KAAK,KAAA,CAAM,GAAA,EAAK,MAAA,EAAQ,KAAA,CAAM,MAAA,EAAO;AACpE;AAEO,SAAS,SAAA,CAAU,IAAA,EAAgB,GAAA,GAAc,GAAA,EAAe;AACrE,EAAA,MAAM,IAAA,GAAO,CAAC,IAAA,EAAyB,EAAA,EAAY,OAAA,KAA2B;AAC5E,IAAA,MAAM,IAAI,aAAA,CAAc,IAAA,EAAM,EAAA,EAAI,OAAO,CAAA;AAAA,EAC3C,CAAA;AAEA,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,IAAU,EAAC;AAC/B,EAAA,MAAM,WAAA,GAAyC,IAAA,CAAK,WAAA,IAAe,EAAC;AACpE,EAAA,MAAM,UAAA,GAAuC,IAAA,CAAK,UAAA,IAAc,EAAC;AAGjE,EAAA,MAAM,YAAsB,EAAC;AAC7B,EAAA,MAAM,gBAA0B,EAAC;AACjC,EAAA,MAAM,aAAoB,EAAC;AAC3B,EAAA,MAAM,eAAwC,EAAC;AAC/C,EAAA,MAAM,cAAA,uBAAqB,GAAA,EAAsB;AAEjD,EAAA,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,CAAC,KAAA,EAAO,KAAA,KAAU;AACrC,IAAA,MAAM,EAAE,EAAA,EAAI,GAAA,EAAK,QAAO,GAAI,WAAA,CAAY,OAAO,KAAK,CAAA;AACpD,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,MAAA,EAAQ,GAAA,EAAK,EAAE,CAAA;AACjC,IAAA,SAAA,CAAU,KAAK,EAAE,CAAA;AACjB,IAAA,aAAA,CAAc,KAAK,MAAM,CAAA;AACzB,IAAA,UAAA,CAAW,KAAK,GAAG,CAAA;AACnB,IAAA,YAAA,CAAa,IAAA,CAAK,WAAA,CAAY,GAAG,CAAC,CAAA;AAClC,IAAA,IAAI,QAAQ,MAAA,EAAW;AACrB,MAAA,MAAM,MAAA,GAAS,cAAA,CAAe,GAAA,CAAI,GAAG,CAAA;AACrC,MAAA,IAAI,MAAA,EAAQ,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA;AAAA,WACrB,cAAA,CAAe,GAAA,CAAI,GAAA,EAAK,CAAC,EAAE,CAAC,CAAA;AAAA,IACnC;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,EAAO,KAAA,KAAU,KAAA,CAAM,EAAA,IAAM,CAAA,MAAA,EAAS,KAAA,GAAQ,CAAC,CAAA,CAAE,CAAA;AAC9E,EAAA,MAAM,gBAAgB,WAAA,CAAY,GAAA;AAAA,IAChC,CAAC,UAAA,EAAY,KAAA,KAAU,WAAW,EAAA,IAAM,CAAA,WAAA,EAAc,QAAQ,CAAC,CAAA;AAAA,GACjE;AACA,EAAA,MAAM,YAAA,GAAe,UAAA,CAAW,GAAA,CAAI,CAAC,SAAA,EAAW,KAAA,KAAU,SAAA,CAAU,EAAA,IAAM,CAAA,UAAA,EAAa,KAAA,GAAQ,CAAC,CAAA,CAAE,CAAA;AAClG,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,KAAA,MAAW,EAAA,IAAM,CAAC,GAAG,SAAA,EAAW,GAAG,UAAU,GAAG,aAAA,EAAe,GAAG,YAAY,CAAA,EAAG;AAC/E,IAAA,IAAI,IAAA,CAAK,IAAI,EAAE,CAAA,OAAQ,cAAA,EAAgB,EAAA,EAAI,CAAA,cAAA,EAAiB,EAAE,CAAA,EAAA,CAAI,CAAA;AAClE,IAAA,IAAA,CAAK,IAAI,EAAE,CAAA;AAAA,EACb;AAEA,EAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,EAAO,KAAA,KAAU;AAG/B,IAAA,IAAI,KAAA,CAAM,EAAA,KAAO,WAAA,IAAe,CAAC,MAAA,CAAO,SAAA,CAAU,cAAA,CAAe,IAAA,CAAK,WAAA,EAAa,KAAA,CAAM,EAAE,CAAA,EAAG;AAC5F,MAAA,IAAA;AAAA,QACE,qBAAA;AAAA,QACA,SAAS,KAAK,CAAA;AAAA,QACd,CAAA,OAAA,EAAU,SAAS,KAAK,CAAC,kBAAkB,MAAA,CAAO,KAAA,CAAM,EAAE,CAAC,CAAA,6GAAA;AAAA,OAC7D;AAAA,IACF;AACA,IAAA,IAAI,WAAA,CAAY,KAAA,CAAM,MAAM,CAAA,EAAG;AAC7B,MAAA,IAAA;AAAA,QACE,qBAAA;AAAA,QACA,SAAS,KAAK,CAAA;AAAA,QACd,UAAU,QAAA,CAAS,KAAK,CAAC,CAAA,0BAAA,EAA6B,MAAM,EAAE,CAAA,8CAAA;AAAA,OAChE;AAAA,IACF;AACA,IAAA,MAAM,KAAA,GAA4B,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,MAAM,IAAI,KAAA,CAAM,MAAA,GAAS,CAAC,KAAA,CAAM,MAAM,CAAA;AAC5F,IAAA,IAAI,KAAA,CAAM,IAAA,CAAK,OAAO,CAAA,EAAG;AACvB,MAAA,IAAA;AAAA,QACE,qBAAA;AAAA,QACA,SAAS,KAAK,CAAA;AAAA,QACd,UAAU,QAAA,CAAS,KAAK,CAAC,CAAA,sBAAA,EAAyB,MAAM,EAAE,CAAA,oEAAA;AAAA,OAC5D;AAAA,IACF;AAAA,EACF,CAAC,CAAA;AACD,EAAA,UAAA,CAAW,OAAA,CAAQ,CAAC,SAAA,EAAW,KAAA,KAAU;AACvC,IAAA,MAAM,EAAA,GAAK,aAAa,KAAK,CAAA;AAC7B,IAAA,IAAI,CAAC,cAAA,CAAe,SAAA,CAAU,EAAE,CAAA,EAAG;AACjC,MAAA,IAAA;AAAA,QACE,qBAAA;AAAA,QACA,EAAA;AAAA,QACA,CAAA,WAAA,EAAc,EAAE,CAAA,eAAA,EAAkB,SAAA,CAAU,EAAE,CAAA,4EAAA;AAAA,OAChD;AAAA,IACF;AACA,IAAA,MAAM,EAAE,QAAO,GAAI,SAAA;AACnB,IAAA,IAAI,WAAW,MAAA,IAAa,EAAE,MAAA,IAAU,CAAA,IAAK,UAAU,CAAA,CAAA,EAAI;AACzD,MAAA,MAAM,IAAI,UAAA,CAAW,CAAA,WAAA,EAAc,EAAE,CAAA,gCAAA,EAAmC,MAAM,CAAA,CAAA,CAAG,CAAA;AAAA,IACnF;AACA,IAAA,IAAI,SAAA,CAAU,MAAA,KAAW,MAAA,IAAa,MAAA,KAAW,MAAA,EAAW;AAC1D,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,cAAc,EAAE,CAAA,qFAAA;AAAA,OAClB;AAAA,IACF;AACA,IAAA,KAAA,MAAW,KAAA,IAAS,CAAC,GAAG,SAAA,CAAU,MAAA,EAAQ,GAAI,SAAA,CAAU,MAAA,IAAU,EAAG,CAAA,EAAG;AACtE,MAAA,IAAI,CAAC,MAAM,SAAA,IAAa,CAAC,MAAM,YAAA,IAAgB,CAAC,MAAM,SAAA,EAAW;AAC/D,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,WAAA,EAAc,EAAE,CAAA,oCAAA,CAAsC,CAAA;AAAA,MACxE;AACA,MAAA,IAAI,KAAA,CAAM,KAAA,KAAU,aAAA,IAAiB,KAAA,CAAM,UAAU,aAAA,EAAe;AAClE,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,cAAc,EAAE,CAAA,uBAAA,EAA0B,MAAA,CAAO,KAAA,CAAM,KAAK,CAAC,CAAA,sCAAA;AAAA,SAC/D;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC,CAAA;AACD,EAAA,WAAA,CAAY,OAAA,CAAQ,CAAC,UAAA,EAAY,KAAA,KAAU;AACzC,IAAA,MAAM,EAAA,GAAK,cAAc,KAAK,CAAA;AAC9B,IAAA,IAAI,UAAA,CAAW,EAAA,KAAO,WAAA,IAAe,UAAA,CAAW,eAAe,oBAAA,EAAsB;AACnF,MAAA,IAAA;AAAA,QACE,qBAAA;AAAA,QACA,EAAA;AAAA,QACA,eAAe,EAAE,CAAA,gEAAA;AAAA,OACnB;AAAA,IACF;AACA,IAAA,IAAI,UAAA,CAAW,MAAA,EAAQ,IAAA,KAAS,SAAA,EAAW;AACzC,MAAA,IAAA;AAAA,QACE,oBAAA;AAAA,QACA,EAAA;AAAA,QACA,eAAe,EAAE,CAAA,mEAAA;AAAA,OACnB;AAAA,IACF;AAAA,EACF,CAAC,CAAA;AAED,EAAA,MAAM,eAAA,GAAkB,IAAI,GAAA,CAAI,SAAA,CAAU,GAAA,CAAI,CAAC,EAAA,EAAI,KAAA,KAAU,CAAC,EAAA,EAAI,KAAK,CAAC,CAAC,CAAA;AACzE,EAAA,MAAM,cAAA,GAAiB,IAAI,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,CAAC,EAAA,EAAI,KAAA,KAAU,CAAC,EAAA,EAAI,KAAK,CAAC,CAAC,CAAA;AACvE,EAAA,MAAM,mBAAA,GAAsB,IAAI,GAAA,CAAI,aAAA,CAAc,GAAA,CAAI,CAAC,EAAA,EAAI,KAAA,KAAU,CAAC,EAAA,EAAI,KAAK,CAAC,CAAC,CAAA;AACjF,EAAA,MAAM,cAAA,GAAiB,IAAI,GAAA,CAAI,YAAY,CAAA;AAI3C,EAAA,MAAM,YAAiC,EAAC;AACxC,EAAA,MAAM,cAAmD,EAAC;AAC1D,EAAA,MAAM,QAAA,GAAW,CAAC,KAAA,KAAuB;AACvC,IAAA,SAAA,CAAA,KAAA,CAAA,KAAA,SAAA,CAAA,KAAA,CAAA,GAAqB,KAAA,CAAM,OAAO,KAAK,CAAA,CAAE,QAAQ,GAAA,EAAK,QAAA,CAAS,KAAK,CAAC,CAAA,CAAA;AACrE,IAAA,OAAO,UAAU,KAAK,CAAA;AAAA,EACxB,CAAA;AACA,EAAA,MAAM,QAAA,GAAW,CAAC,QAAA,KAA0C;AAC1D,IAAA,MAAM,WAAA,GAAc,eAAA,CAAgB,GAAA,CAAI,QAAQ,CAAA;AAChD,IAAA,IAAI,WAAA,KAAgB,MAAA,EAAW,OAAO,YAAA,CAAa,WAAW,CAAA;AAC9D,IAAA,MAAM,UAAA,GAAa,cAAA,CAAe,GAAA,CAAI,QAAQ,CAAA;AAC9C,IAAA,IAAI,WAAA,CAAY,UAAU,CAAA,KAAM,MAAA,EAAW;AACzC,MAAA,WAAA,CAAY,UAAU,CAAA,GAAI,WAAA,CAAY,QAAA,CAAS,UAAU,GAAG,MAAA,CAAO,UAAU,CAAA,CAAE,MAAA,EAAQ,GAAG,CAAA;AAAA,IAC5F;AACA,IAAA,OAAO,YAAY,UAAU,CAAA;AAAA,EAC/B,CAAA;AAMA,EAAA,MAAM,cAAc,MAAA,CAAO,GAAA;AAAA,IACzB,CAAC,KAAA,EAAO,KAAA,KACN,KAAA,CAAM,QAAQ,KAAA,CAAM,MAAM,CAAA,IAAK,eAAA,CAAgB,MAAM,MAAA,EAAQ,GAAA,EAAK,QAAA,CAAS,KAAK,CAAC,CAAA,GAAI;AAAA,GACzF;AAEA,EAAA,MAAM,QAAA,GAAW,CAAC,QAAA,KAAiD;AACjE,IAAA,MAAM,WAAA,GAAc,eAAA,CAAgB,GAAA,CAAI,QAAQ,CAAA;AAChD,IAAA,IAAI,WAAA,KAAgB,MAAA,EAAW,OAAO,aAAA,CAAc,WAAW,CAAA;AAC/D,IAAA,OAAO,MAAA,CAAO,cAAA,CAAe,GAAA,CAAI,QAAQ,CAAW,CAAA,CAAE,MAAA;AAAA,EACxD,CAAA;AACA,EAAA,MAAM,WAAA,GAAc,CAClB,QAAA,KAC8D;AAC9D,IAAA,MAAM,MAAA,GAAS,SAAS,QAAQ,CAAA;AAChC,IAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,GACvB,EAAE,GAAA,EAAK,IAAA,EAAM,IAAA,EAAM,IAAA,EAAK,GACxB,eAAA,CAAgB,MAAA,EAAkB,GAAG,CAAA;AAAA,EAC3C,CAAA;AAQA,EAAA,MAAM,cAAA,GAAiB,CACrB,OAAA,EACA,EAAA,EACA,WAAA,KACa;AACb,IAAA,MAAM,YAAsB,EAAC;AAC7B,IAAA,KAAA,MAAW,SAAS,EAAA,EAAI;AACtB,MAAA,IAAI,gBAAgB,GAAA,CAAI,KAAK,KAAK,cAAA,CAAe,GAAA,CAAI,KAAK,CAAA,EAAG;AAC3D,QAAA,SAAA,CAAU,KAAK,KAAK,CAAA;AAAA,MACtB,CAAA,MAAA,IAAW,oBAAoB,GAAA,CAAI,KAAK,KAAK,cAAA,CAAe,GAAA,CAAI,KAAK,CAAA,EAAG;AACtE,QAAA,MAAM,IAAA,GAAO,mBAAA,CAAoB,GAAA,CAAI,KAAK,IAAI,YAAA,GAAe,WAAA;AAC7D,QAAA,IAAA;AAAA,UACE,eAAA;AAAA,UACA,KAAA;AAAA,UACA,CAAA,CAAA,EAAI,OAAO,CAAA,WAAA,EAAc,KAAK,CAAA,KAAA,EAAQ,IAAI,CAAA,IAAA,EAAO,IAAI,CAAA,SAAA,EAAY,IAAA,KAAS,YAAA,GAAe,QAAA,GAAW,oBAAoB,CAAA,8BAAA;AAAA,SAC1H;AAAA,MACF,CAAA,MAAA,IAAW,cAAA,CAAe,GAAA,CAAI,KAAK,CAAA,EAAG;AACpC,QAAA,SAAA,CAAU,IAAA,CAAK,GAAI,cAAA,CAAe,GAAA,CAAI,KAAK,CAAc,CAAA;AAAA,MAC3D,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,cAAc,KAAA,EAAO,CAAA,CAAA,EAAI,OAAO,CAAA,cAAA,EAAiB,KAAK,CAAA,6BAAA,CAA+B,CAAA;AAAA,MAC5F;AAAA,IACF;AAKA,IAAA,MAAM,SAAS,CAAC,GAAG,IAAI,GAAA,CAAI,SAAS,CAAC,CAAA;AACrC,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,MAAA,IAAA,CAAK,YAAA,EAAc,OAAA,EAAS,CAAA,CAAA,EAAI,OAAO,CAAA,iBAAA,CAAmB,CAAA;AAAA,IAC5D;AACA,IAAA,KAAA,MAAW,YAAY,MAAA,EAAQ;AAC7B,MAAA,IAAI,aAAa,OAAA,EAAS;AACxB,QAAA,IAAA,CAAK,gBAAA,EAAkB,OAAA,EAAS,CAAA,CAAA,EAAI,OAAO,CAAA,0BAAA,CAA4B,CAAA;AAAA,MACzE;AACA,MAAA,MAAM,UAAA,GAAa,cAAA,CAAe,GAAA,CAAI,QAAQ,CAAA;AAC9C,MAAA,IAAI,eAAe,MAAA,IAAa,MAAA,CAAO,UAAU,CAAA,CAAE,OAAO,WAAA,EAAa;AACrE,QAAA,IAAA;AAAA,UACE,eAAA;AAAA,UACA,QAAA;AAAA,UACA,CAAA,CAAA,EAAI,OAAO,CAAA,eAAA,EAAkB,QAAQ,CAAA,mKAAA;AAAA,SACvC;AAAA,MACF;AACA,MAAA,IAAI,UAAA,KAAe,MAAA,IAAa,WAAA,CAAY,UAAU,CAAA,EAAG;AACvD,QAAA,IAAA;AAAA,UACE,eAAA;AAAA,UACA,QAAA;AAAA,UACA,CAAA,CAAA,EAAI,OAAO,CAAA,WAAA,EAAc,QAAQ,CAAA,iMAAA;AAAA,SACnC;AAAA,MACF;AACA,MAAA,MAAM,MAAA,GAAS,SAAS,QAAQ,CAAA;AAChC,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,IAAA;AAAA,UACE,eAAA;AAAA,UACA,QAAA;AAAA,UACA,CAAA,CAAA,EAAI,OAAO,CAAA,eAAA,EAAkB,QAAQ,CAAA,kCAAA;AAAA,SACvC;AAAA,MACF,WAAW,WAAA,EAAa;AACtB,QAAA,MAAM,IAAA,GAAO,YAAY,QAAQ,CAAA;AACjC,QAAA,MAAM,aAAa,MAAA,CAAO,GAAA,CAAI,MAAK,GAAI,CAAA,IAAK,KAAK,GAAA,KAAQ,IAAA;AACzD,QAAA,MAAM,cAAc,MAAA,CAAO,IAAA,CAAK,MAAK,GAAI,CAAA,IAAK,KAAK,IAAA,KAAS,IAAA;AAC5D,QAAA,IAAI,cAAc,WAAA,EAAa;AAC7B,UAAA,IAAA;AAAA,YACE,oBAAA;AAAA,YACA,QAAA;AAAA,YACA,CAAA,OAAA,EAAU,OAAO,CAAA,SAAA,EAAY,QAAQ,4BAA4B,QAAQ,CAAA,gLAAA;AAAA,WAC3E;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,IAAA,OAAO,MAAA;AAAA,EACT,CAAA;AAIA,EAAA,MAAM,WAAW,MAAA,CAAO,GAAA;AAAA,IACtB,CAAC,KAAA,EAAO,KAAA,KAAA,CACL,KAAA,CAAM,EAAA,KAAO,UAAA,IAAc,KAAA,CAAM,EAAA,KAAO,YAAA,KAAiB,QAAA,CAAS,QAAA,CAAS,KAAK,CAAC,CAAA,KAAM;AAAA,GAC5F;AACA,EAAA,MAAM,SAAA,GAAY,SAAS,MAAA,CAAO,CAAC,GAAG,KAAA,KAAU,QAAA,CAAS,KAAK,CAAC,CAAA;AAK/D,EAAA,MAAM,SAAA,GAAY,CAAC,MAAA,KAA6B;AAAA,IAC9C,GAAG,SAAA;AAAA,IACH,GAAG,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,EAAG,UAAU,KAAA,GAAQ,MAAA,IAAU,QAAA,CAAS,KAAK,CAAC;AAAA,GACpE;AAGA,EAAA,MAAM,aAAa,MAAA,CAAO,MAAA;AAC1B,EAAA,MAAM,OAAA,GAAU,CAAC,GAAG,QAAA,EAAU,GAAG,aAAa,CAAA;AAC9C,EAAA,MAAM,aAAA,GAAgB,IAAI,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,CAAC,EAAA,EAAI,KAAA,KAAU,CAAC,EAAA,EAAI,KAAK,CAAC,CAAC,CAAA;AAIrE,EAAA,MAAM,eAAA,GAA8B;AAAA,IAClC,GAAG,MAAA,CAAO,GAAA,CAAI,CAAC,OAAO,KAAA,KAAU;AAC9B,MAAA,MAAM,EAAA,GAAK,SAAS,KAAK,CAAA;AACzB,MAAA,IAAI,KAAA,CAAM,OAAO,WAAA,EAAa;AAC5B,QAAA,OAAO,cAAA,CAAe,IAAI,KAAA,CAAM,EAAA,IAAM,UAAU,KAAK,CAAA,EAAG,KAAA,CAAM,EAAA,KAAO,YAAY,CAAA;AAAA,MACnF;AACA,MAAA,MAAM,SAAS,KAAA,CAAM,EAAA;AACrB,MAAA,IAAI,WAAW,EAAA,EAAI;AACjB,QAAA,IAAA,CAAK,gBAAA,EAAkB,EAAA,EAAI,CAAA,OAAA,EAAU,EAAE,CAAA,0BAAA,CAA4B,CAAA;AAAA,MACrE;AACA,MAAA,MAAM,WAAA,GAAc,aAAA,CAAc,GAAA,CAAI,MAAM,CAAA;AAC5C,MAAA,IAAI,gBAAgB,MAAA,EAAW;AAC7B,QAAA,IAAA;AAAA,UACE,YAAA;AAAA,UACA,MAAA;AAAA,UACA,CAAA,OAAA,EAAU,EAAE,CAAA,WAAA,EAAc,MAAM,CAAA,mDAAA;AAAA,SAClC;AAAA,MACF;AACA,MAAA,IAAI,cAAe,UAAA,IAAc,MAAA,CAAO,WAAY,CAAA,CAAE,OAAO,WAAA,EAAa;AACxE,QAAA,IAAA;AAAA,UACE,eAAA;AAAA,UACA,MAAA;AAAA,UACA,CAAA,OAAA,EAAU,EAAE,CAAA,WAAA,EAAc,MAAM,CAAA,gGAAA;AAAA,SAClC;AAAA,MACF;AACA,MAAA,OAAO,CAAC,MAAM,CAAA;AAAA,IAChB,CAAC,CAAA;AAAA,IACD,GAAG,WAAA,CAAY,GAAA;AAAA,MAAI,CAAC,UAAA,EAAY,KAAA,KAC9B,cAAA,CAAe,aAAA,CAAc,KAAK,CAAA,EAAG,UAAA,CAAW,EAAA,IAAM,SAAA,CAAU,UAAU,CAAA,EAAG,KAAK;AAAA;AACpF,GACF;AAEA,EAAA,MAAM,mBAAmB,UAAA,CAAW,GAAA;AAAA,IAAI,CAAC,SAAA,EAAW,KAAA,KAClD,cAAA,CAAe,YAAA,CAAa,KAAK,CAAA,EAAG,SAAA,CAAU,EAAA,IAAM,SAAA,CAAU,UAAU,CAAA,EAAG,KAAK;AAAA,GAClF;AAIA,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAY;AACjC,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAE7B,EAAA,MAAM,KAAA,GAAQ,CAAC,IAAA,KAAuB;AACpC,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,EAAG;AACpB,IAAA,MAAM,EAAA,GAAK,QAAQ,IAAI,CAAA;AACvB,IAAA,IAAI,QAAA,CAAS,GAAA,CAAI,IAAI,CAAA,EAAG;AACtB,MAAA,IAAA,CAAK,OAAA,EAAS,EAAA,EAAI,CAAA,CAAA,EAAI,EAAE,CAAA,gCAAA,CAAkC,CAAA;AAAA,IAC5D;AACA,IAAA,QAAA,CAAS,IAAI,IAAI,CAAA;AACjB,IAAA,KAAA,MAAW,QAAA,IAAY,eAAA,CAAgB,IAAI,CAAA,EAAG;AAC5C,MAAA,MAAM,UAAA,GAAa,aAAA,CAAc,GAAA,CAAI,QAAQ,CAAA;AAC7C,MAAA,IAAI,UAAA,KAAe,MAAA,EAAW,KAAA,CAAM,UAAU,CAAA;AAAA,IAChD;AACA,IAAA,QAAA,CAAS,OAAO,IAAI,CAAA;AACpB,IAAA,IAAA,CAAK,IAAI,IAAI,CAAA;AACb,IAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACjB,CAAA;AACA,EAAA,OAAA,CAAQ,QAAQ,CAAC,CAAA,EAAG,IAAA,KAAS,KAAA,CAAM,IAAI,CAAC,CAAA;AAKxC,EAAA,MAAM,kBAAA,uBAAyB,GAAA,EAAoB;AACnD,EAAA,WAAA,CAAY,OAAA,CAAQ,CAAC,CAAA,EAAG,KAAA,KAAU;AAChC,IAAA,KAAA,MAAW,QAAA,IAAY,eAAA,CAAgB,UAAA,GAAa,KAAK,CAAA,EAAG;AAC1D,MAAA,MAAM,KAAA,GAAQ,kBAAA,CAAmB,GAAA,CAAI,QAAQ,CAAA;AAC7C,MAAA,IAAI,UAAU,MAAA,EAAW;AACvB,QAAA,IAAA;AAAA,UACE,sBAAA;AAAA,UACA,cAAc,KAAK,CAAA;AAAA,UACnB,CAAA,aAAA,EAAgB,cAAc,KAAK,CAAC,UAAU,aAAA,CAAc,KAAK,CAAC,CAAA,cAAA,EAAiB,QAAQ,CAAA,iEAAA;AAAA,SAC7F;AAAA,MACF;AACA,MAAA,kBAAA,CAAmB,GAAA,CAAI,UAAU,KAAK,CAAA;AAAA,IACxC;AAAA,EACF,CAAC,CAAA;AAMD,EAAA,MAAM,eAAA,uBAAsB,GAAA,EAAoB;AAChD,EAAA,MAAM,eAA2B,EAAC;AAClC,EAAA,MAAM,OAAA,GAAU,CAAC,SAAA,KAAyC;AAIxD,IAAA,MAAM,GAAA,GAAM,KAAK,SAAA,CAAU,CAAC,GAAG,SAAS,CAAA,CAAE,MAAM,CAAA;AAChD,IAAA,MAAM,QAAA,GAAW,eAAA,CAAgB,GAAA,CAAI,GAAG,CAAA;AACxC,IAAA,IAAI,QAAA,KAAa,QAAW,OAAO,QAAA;AACnC,IAAA,IAAI,YAAA,CAAa,UAAU,kBAAA,EAAoB;AAC7C,MAAA,IAAA;AAAA,QACE,iBAAA;AAAA,QACA,GAAA;AAAA,QACA,4BAA4B,kBAAkB,CAAA,8BAAA;AAAA,OAChD;AAAA,IACF;AACA,IAAA,MAAM,QAAQ,YAAA,CAAa,MAAA;AAC3B,IAAA,eAAA,CAAgB,GAAA,CAAI,KAAK,KAAK,CAAA;AAC9B,IAAA,YAAA,CAAa,IAAA,CAAK,CAAC,GAAG,SAAS,CAAC,CAAA;AAChC,IAAA,OAAO,KAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,YAAA,uBAAmB,GAAA,EAAoB;AAC7C,EAAA,MAAM,YAAA,uBAAmB,GAAA,EAAoB;AAC7C,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,QAAQ,UAAA,EAAY;AACxB,IAAA,MAAM,KAAA,GAAQ,OAAO,IAAI,CAAA;AACzB,IAAA,IAAI,CAAC,WAAA,CAAY,KAAA,CAAM,EAAE,CAAA,EAAG;AAC5B,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,eAAA,CAAgB,IAAI,CAAC,CAAA;AAC3C,IAAA,YAAA,CAAa,GAAA,CAAI,MAAM,KAAK,CAAA;AAC5B,IAAA,IAAI,KAAA,CAAM,OAAO,WAAA,EAAa,YAAA,CAAa,IAAI,QAAA,CAAS,IAAI,GAAG,KAAK,CAAA;AAAA,EACtE;AAGA,EAAA,MAAM,kBAAkB,UAAA,CAAW,GAAA;AAAA,IAAI,CAAC,SAAA,EAAW,KAAA,KACjD,cAAA,CAAe,SAAA,CAAU,EAAE,CAAA,CAAE,UAAA,GAAa,OAAA,CAAQ,gBAAA,CAAiB,KAAK,CAAC,CAAA,GAAI;AAAA,GAC/E;AAGA,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAoB;AAC1C,EAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,EAAO,KAAA,KAAU;AAC/B,IAAA,IAAI,KAAA,CAAM,OAAO,WAAA,EAAa,SAAA,CAAU,IAAI,QAAA,CAAS,KAAK,CAAA,EAAG,SAAA,CAAU,IAAI,CAAA;AAAA,EAC7E,CAAC,CAAA;AACD,EAAA,KAAA,MAAW,MAAM,aAAA,EAAe,SAAA,CAAU,GAAA,CAAI,EAAA,EAAI,UAAU,IAAI,CAAA;AAOhE,EAAA,MAAM,QAAA,GAAoB,SAAA,CAAU,GAAA,CAAI,CAAC,EAAA,EAAI,KAAA,MAAW,EAAE,EAAA,EAAI,MAAA,EAAQ,KAAA,EAAO,KAAA,EAAO,EAAA,EAAG,CAAE,CAAA;AACzF,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,QAAQ,UAAA,EAAY;AACxB,IAAA,MAAM,KAAA,GAAQ,OAAO,IAAI,CAAA;AACzB,IAAA,IAAI,KAAA,CAAM,EAAA,KAAO,WAAA,IAAe,KAAA,CAAM,OAAO,YAAA,EAAc;AAC3D,IAAA,QAAA,CAAS,IAAA,CAAK,EAAE,EAAA,EAAI,QAAA,CAAS,IAAI,GAAG,MAAA,EAAQ,EAAA,EAAI,KAAA,EAAO,IAAA,EAAM,CAAA;AAAA,EAC/D;AACA,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,QAAQ,UAAA,IAAc,MAAA,CAAO,IAAI,CAAA,CAAE,OAAO,YAAA,EAAc;AAC5D,IAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,eAAA,CAAgB,IAAI,CAAC,CAAA;AAC7C,IAAA,MAAM,IAAA,GAAc,EAAE,EAAA,EAAI,QAAA,CAAS,IAAI,CAAA,EAAG,MAAA,EAAQ,EAAA,EAAI,KAAA,EAAO,IAAA,EAAK;AAClE,IAAA,KAAA,IAAS,WAAW,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG,QAAA,IAAY,GAAG,QAAA,EAAA,EAAY;AAClE,MAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,SAAS,QAAQ,CAAA,CAAE,EAAE,CAAA,EAAG;AAEzC,MAAA,IAAI,QAAQ,QAAA,GAAW,CAAA;AACvB,MAAA,OAAO,KAAA,GAAQ,QAAA,CAAS,MAAA,IAAU,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,CAAE,KAAK,CAAA,EAAG,EAAA,KAAO,YAAA,EAAc,KAAA,EAAA;AACtF,MAAA,QAAA,CAAS,MAAA,CAAO,KAAA,EAAO,CAAA,EAAG,IAAI,CAAA;AAAA,IAChC;AAAA,EACF;AAQA,EAAA,MAAM,cAAc,QAAA,CAAS,GAAA;AAAA,IAAI,CAAC,KAAA,KAChC,KAAA,CAAM,MAAA,KAAW,EAAA,GACb,aAAa,KAAA,CAAM,MAAM,CAAA,KAAM,IAAA,GAC/B,SAAS,KAAA,CAAM,EAAE,MAAM,IAAA,IAAQ,WAAA,CAAY,MAAM,KAAK;AAAA,GAC5D;AACA,EAAA,MAAM,cAAA,GAAiB,UAAA,CAAW,GAAA,CAAI,CAAC,WAAW,KAAA,KAAU;AAC1D,IAAA,MAAM,EAAA,GAAK,aAAa,KAAK,CAAA;AAC7B,IAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,gBAAA,CAAiB,KAAK,CAAC,CAAA;AAC/C,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,OAAA,CAAQ,CAAC,OAAO,QAAA,KAAc,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,EAAE,CAAA,GAAI,CAAC,QAAQ,CAAA,GAAI,EAAG,CAAA;AAC/F,IAAA,MAAM,MAAA,GAAS,CAAC,KAAA,EAAkB,KAAA,KAAwB;AACxD,MAAA,MAAM,OAAA,GAAU,KAAA,CAAM,EAAA,KAAO,MAAA,GAAY,IAAA,GAAO,IAAI,GAAA,CAAI,cAAA,CAAe,EAAA,EAAI,KAAA,CAAM,EAAA,EAAI,KAAK,CAAC,CAAA;AAE3F,MAAA,MAAM,UAAU,QAAA,CAAS,OAAA;AAAA,QAAQ,CAAC,OAAO,QAAA,KACvC,QAAA,GAAW,QAAQ,CAAC,CAAA,IAAK,YAAY,QAAQ,CAAA,KAAM,YAAY,IAAA,IAAQ,OAAA,CAAQ,IAAI,KAAA,CAAM,EAAE,KACvF,CAAC,QAAQ,IACT;AAAC,OACP;AACA,MAAA,IAAI,OAAA,KAAY,IAAA,IAAQ,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG;AAC5C,QAAA,IAAA;AAAA,UACE,YAAA;AAAA,UACA,EAAA;AAAA,UACA,CAAA,WAAA,EAAc,EAAE,CAAA,IAAA,EAAO,KAAK,eAAe,KAAA,CAAM,EAAA,EAAI,GAAA,CAAI,CAAC,EAAA,KAAO,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,CAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,uCAAA,EAA0C,SAAS,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAE,EAAE,CAAA,EAAA;AAAA,SACzJ;AAAA,MACF;AACA,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,CAAA,CAAA,EAAI,EAAE,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA;AAAA,QACtB,SAAA,EAAW,EAAA;AAAA,QACX,KAAA;AAAA,QACA,OAAA;AAAA,QACA,UAAU,OAAA,CAAQ,MAAA,GAAS,QAAQ,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA,GAAI,EAAA;AAAA,QACzD,GAAA,EAAK;AAAA,OACP;AAAA,IACF,CAAA;AACA,IAAA,MAAM,IAAA,GAAO,SAAA,CAAU,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,EAAO,UAAA,KAAe,MAAA,CAAO,KAAA,EAAO,CAAA,MAAA,EAAS,UAAA,GAAa,CAAC,EAAE,CAAC,CAAA;AACjG,IAAA,MAAM,MAAA,GAAA,CAAU,SAAA,CAAU,MAAA,IAAU,EAAC,EAAG,GAAA;AAAA,MAAI,CAAC,OAAO,UAAA,KAClD,MAAA,CAAO,OAAO,CAAA,aAAA,EAAgB,UAAA,GAAa,CAAC,CAAA,CAAE;AAAA,KAChD;AAGA,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,MAAA,GAAS,CAAA,IAAK,IAAA,CAAK,KAAA,CAAM,CAAC,IAAA,KAAS,IAAA,CAAK,KAAA,CAAM,KAAA,KAAU,aAAa,CAAA;AAC9F,IAAA,IAAI,WAAA,IAAe,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AACpC,MAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,EAAM,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,QAAA,EAAU,OAAA,CAAQ,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAC,CAAA;AAAA,IAC9F;AACA,IAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,WAAA,EAAa,OAAA,EAAQ;AAAA,EAC9C,CAAC,CAAA;AAED,EAAA,MAAM,YAAY,cAAA,CAAe,OAAA;AAAA,IAAQ,CAAC,EAAE,IAAA,EAAM,MAAA,EAAO,KACvD,CAAC,GAAG,IAAA,EAAM,GAAG,MAAM,EAAE,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,aAAa,EAAE;AAAA,GAC5D;AACA,EAAA,IAAI,SAAA,CAAU,SAAS,cAAA,EAAgB;AACrC,IAAA,IAAA;AAAA,MACE,gBAAA;AAAA,MACA,SAAA,CAAU,cAAc,CAAA,CAAE,SAAA;AAAA,MAC1B,CAAA,yBAAA,EAA4B,cAAc,CAAA,2DAAA,EAA8D,SAAA,CAAU,MAAM,CAAA,EAAA,EAAK,SAAA,CAAU,GAAA,CAAI,CAAC,SAAS,IAAA,CAAK,IAAI,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,KAC5K;AAAA,EACF;AACA,EAAA,SAAA,CAAU,OAAA,CAAQ,CAAC,IAAA,EAAM,GAAA,KAAQ;AAC/B,IAAA,IAAA,CAAK,GAAA,GAAM,GAAA;AAAA,EACb,CAAC,CAAA;AACD,EAAA,MAAM,SAAS,CAAC,KAAA,KACd,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,EAAM,IAAA,KAAU,IAAA,CAAK,GAAA,KAAQ,KAAK,IAAA,GAAO,IAAA,GAAQ,CAAA,IAAK,IAAA,CAAK,KAAO,CAAC,CAAA;AACnF,EAAA,MAAM,iBAAiB,SAAA,CAAU,GAAA;AAAA,IAC/B,CAAC,EAAE,KAAA,EAAM,KAAA,CACN,MAAM,SAAA,GAAY,aAAA,GAAgB,CAAA,KAClC,KAAA,CAAM,YAAA,GAAe,gBAAA,GAAmB,CAAA,CAAA,IACxC,KAAA,CAAM,YAAY,eAAA,GAAkB,CAAA;AAAA,GACzC;AACA,EAAA,MAAM,aAAa,IAAI,KAAA,CAAc,SAAS,MAAM,CAAA,CAAE,KAAK,CAAC,CAAA;AAC5D,EAAA,MAAM,aAAa,IAAI,KAAA,CAAc,SAAS,MAAM,CAAA,CAAE,KAAK,CAAC,CAAA;AAC5D,EAAA,KAAA,MAAW,QAAQ,SAAA,EAAW;AAC5B,IAAA,KAAA,MAAW,MAAA,IAAU,KAAK,OAAA,EAAS;AACjC,MAAA,UAAA,CAAW,MAAM,CAAA,IAAK,CAAA,IAAK,IAAA,CAAK,GAAA;AAChC,MAAA,IAAI,IAAA,CAAK,MAAM,KAAA,KAAU,aAAA,aAA0B,MAAM,CAAA,IAAK,KAAK,IAAA,CAAK,GAAA;AAAA,IAC1E;AAAA,EACF;AACA,EAAA,MAAM,QAAA,GAAiC,QAAA,CAAS,GAAA,CAAI,MAAM,EAAE,CAAA;AAC5D,EAAA,UAAA,CAAW,OAAA,CAAQ,CAAC,SAAA,EAAW,KAAA,KAAU;AACvC,IAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,aAAa,OAAA,EAAQ,GAAI,eAAe,KAAK,CAAA;AACnE,IAAA,MAAM,MAAA,GAAS,OAAO,IAAI,CAAA;AAC1B,IAAA,MAAM,UAAA,GAAa,OAAO,MAAM,CAAA;AAChC,IAAA,IAAA,CAAK,MAAA,GAAS,gBAAgB,CAAA,EAAG;AACjC,IAAA,KAAA,MAAW,YAAY,OAAA,EAAS;AAC9B,MAAA,QAAA,CAAS,QAAQ,EAAE,IAAA,CAAK;AAAA,QACtB,SAAA,EAAW,KAAA;AAAA,QACX,IAAI,SAAA,CAAU,EAAA;AAAA,QACd,KAAA,EAAO,gBAAgB,KAAK,CAAA;AAAA,QAC5B,MAAA,EAAQ,UAAU,MAAA,IAAU,CAAA;AAAA,QAC5B,MAAA;AAAA,QACA,MAAA,EAAQ,UAAA;AAAA,QACR,OAAA,EAAS,cAAc,MAAA,GAAS,CAAA;AAAA,QAChC,SAAA,EAAW,IAAA,CAAK,IAAA,CAAK,CAAC,IAAA,KAAS,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,CAAC,MAAA,KAAW,MAAA,GAAS,QAAQ,CAAC;AAAA,OAChF,CAAA;AAAA,IACH;AAAA,EACF,CAAC,CAAA;AAKD,EAAA,MAAM,cAAA,uBAAqB,GAAA,EAAuC;AAClE,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,QAAQ,UAAA,EAAY;AACxB,IAAA,MAAM,KAAA,GAAQ,OAAO,IAAI,CAAA;AACzB,IAAA,IAAI,KAAA,CAAM,OAAO,WAAA,EAAa;AAC9B,IAAA,MAAM,MAAM,KAAA,CAAM,KAAA,CAAM,QAAQ,GAAA,EAAK,QAAA,CAAS,IAAI,CAAC,CAAA;AACnD,IAAA,MAAM,OAAA,GAAU,EAAE,GAAA,EAAK,IAAA,EAAM,QAAQ,KAAA,EAAO,GAAA,EAAK,GAAG,CAAA,EAAE;AACtD,IAAA,KAAA,MAAW,QAAA,IAAY,eAAA,CAAgB,IAAI,CAAA,EAAG;AAC5C,MAAA,MAAM,QAAA,GAAW,cAAA,CAAe,GAAA,CAAI,QAAQ,CAAA;AAC5C,MAAA,IAAI,QAAA,EAAU,QAAA,CAAS,IAAA,CAAK,OAAO,CAAA;AAAA,WAC9B,cAAA,CAAe,GAAA,CAAI,QAAA,EAAU,CAAC,OAAO,CAAC,CAAA;AAAA,IAC7C;AAAA,EACF;AACA,EAAA,MAAM,IAAA,GAAO,CAAC,QAAA,EAAkB,OAAA,EAAyB,KAAA,KAAoB;AAC3E,IAAA,IAAI,MAAA,GAAS,KAAA;AACb,IAAA,KAAA,MAAW,WAAW,cAAA,CAAe,GAAA,CAAI,QAAQ,CAAA,IAAK,EAAC,EAAG;AACxD,MAAA,MAAA,GAAS,OAAO,QAAA,CAAS,OAAA,CAAQ,OAAO,CAAA,EAAG,KAAK,IAAI,CAAA;AAAA,IACtD;AACA,IAAA,OAAO,MAAA;AAAA,EACT,CAAA;AAGA,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAAY;AACpC,EAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,EAAO,KAAA,KAAU;AAC/B,IAAA,IAAI,KAAA,CAAM,EAAA,KAAO,YAAA,EAAc,KAAA,MAAW,EAAA,IAAM,gBAAgB,KAAK,CAAA,EAAG,WAAA,CAAY,GAAA,CAAI,EAAE,CAAA;AAAA,EAC5F,CAAC,CAAA;AAED,EAAA,MAAM,YAAA,uBAAmB,GAAA,EAAyB;AAClD,EAAA,MAAM,WAAA,GAAc,CAAC,QAAA,KAAkC;AACrD,IAAA,IAAI,OAAA,GAAU,YAAA,CAAa,GAAA,CAAI,QAAQ,CAAA;AACvC,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAA,GAAU,aAAA,CAAc,QAAA,CAAS,QAAQ,CAAA,EAAG,GAAG,CAAA;AAC/C,MAAA,YAAA,CAAa,GAAA,CAAI,UAAU,OAAO,CAAA;AAAA,IACpC;AACA,IAAA,OAAO,OAAA;AAAA,EACT,CAAA;AAaA,EAAA,MAAM,QAAA,GAAW,CACf,QAAA,EACA,MAAA,EACA,MAAA,KAC6C;AAC7C,IAAA,MAAM,QAAQ,WAAA,CAAY,GAAA,CAAI,QAAQ,CAAA,GAAI,WAAA,CAAY,QAAQ,CAAA,GAAI,IAAA;AAElE,IAAA,MAAM,OAAA,GAAU,MAAA,IAAU,KAAA,GAAQ,WAAA,CAAY,QAAQ,CAAA,GAAI,IAAA;AAC1D,IAAA,MAAM,QAAgB,EAAC;AACvB,IAAA,MAAM,UAAwB,EAAC;AAC/B,IAAA,KAAA,MAAW,OAAA,IAAW,CAAC,KAAA,EAAO,MAAM,CAAA,EAAY;AAC9C,MAAA,MAAM,KAAA,GAAQ,OAAO,OAAO,CAAA;AAC5B,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,EAAK;AACxB,MAAA,MAAM,QAAA,GAAW,OAAA,EAAS,QAAA,GAAW,OAAO,CAAA;AAE5C,MAAA,MAAM,IAAA,GACJ,SAAS,IAAA,IAAQ,IAAA,GAAO,IACpB,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAC,OAAA,EAAS,QAAQ,IAAA,CAAK,OAAO,GAAG,CAAC,CAAC,GAAG,GAAG,CAAA,CAAE,SAAA,CAAU,IAAI,CAAA,GACtE,KAAA;AACN,MAAA,MAAM,IAAA,GAAO,KAAA,GAAQ,OAAO,CAAA,IAAK,IAAA;AACjC,MAAA,MAAM,MAAA,GAAS,CAAC,IAAA,KACd,IAAA,CAAK,QAAA,EAAU,OAAA,EAAS,QAAA,GAAW,IAAA,CAAK,QAAA,CAAS,QAAA,EAAU,GAAA,EAAK,IAAI,IAAI,IAAI,CAAA;AAE9E,MAAA,MAAM,OAAA,GAAU,CAAC,IAAA,EAAW,MAAA,EAAiB,KAAA,KAA4B;AACvE,QAAA,IAAI,CAAC,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW;AAChC,UAAA,OAAO,CAAC,EAAE,OAAA,EAAS,OAAA,EAAS,KAAA,IAAS,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,CAAO,IAAI,CAAA,EAAG,CAAA;AAAA,QAC3E;AACA,QAAA,MAAM,CAAC,OAAA,EAAS,SAAS,CAAA,GAAI,IAAA,CAAK,aAAA;AAAA,UAChC,CAAC,MAAA,KAAW,IAAA,CAAK,wBAAA,CAAyB,GAAA,CAAI,MAAM,CAAA,IAAK;AAAA,SAC3D;AACA,QAAA,OAAO;AAAA,UACL,EAAE,SAAS,OAAA,EAAS,IAAA,EAAM,QAAQ,KAAA,EAAO,MAAA,CAAO,OAAO,CAAA,EAAE;AAAA,UACzD,EAAE,SAAS,OAAA,EAAS,KAAA,EAAO,QAAQ,KAAA,EAAO,MAAA,CAAO,SAAS,CAAA;AAAE,SAC9D;AAAA,MACF,CAAA;AAEA,MAAA,IAAI,CAAC,MAAA,IAAU,IAAA,IAAQ,CAAA,EAAG;AACxB,QAAA,KAAA,CAAM,IAAA,CAAK,GAAG,OAAA,CAAQ,IAAA,EAAM,KAAK,CAAC,CAAA;AAClC,QAAA;AAAA,MACF;AACA,MAAA,IAAI,MAAA,CAAO,SAAS,OAAA,EAAS;AAC3B,QAAA,KAAA,CAAM,KAAK,GAAG,OAAA,CAAQ,KAAK,QAAA,EAAS,EAAG,IAAI,CAAC,CAAA;AAC5C,QAAA;AAAA,MACF;AAGA,MAAA,MAAM,SAAA,GAAY,OAAO,OAAO,CAAA;AAChC,MAAA,MAAM,CAAC,KAAA,EAAO,KAAK,CAAA,GAAI,IAAA,CAAK,aAAA,CAAc,CAAC,KAAA,KAAW,KAAA,GAAQ,SAAA,GAAY,CAAA,GAAI,CAAE,CAAA;AAChF,MAAA,IAAI,KAAA,CAAM,IAAA,EAAK,GAAI,CAAA,EAAG;AACpB,QAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAO,GAAI,iBAAA,CAAkB,OAAO,IAAI,CAAA;AACtD,QAAA,KAAA,CAAM,IAAA,CAAK,GAAG,OAAA,CAAQ,IAAA,CAAK,IAAI,MAAM,CAAA,EAAG,IAAI,CAAC,CAAA;AAAA,MAC/C;AAGA,MAAA,MAAM,SAAA,GAA8B,IAAA,GAChC,KAAA,CACG,aAAA,CAAc,CAAC,MAAA,KAAW,IAAA,CAAK,wBAAA,CAAyB,GAAA,CAAI,MAAM,CAAA,IAAK,CAAC,CAAA,CACxE,GAAA,CAAI,CAAC,IAAA,EAAM,KAAA,KAA0B,CAAC,KAAA,KAAU,CAAA,EAAG,IAAI,CAAC,CAAA,GAC3D,CAAC,CAAC,KAAA,EAAO,KAAK,CAAC,CAAA;AACnB,MAAA,KAAA,MAAW,CAAC,OAAA,EAAS,IAAI,CAAA,IAAK,SAAA,EAAW;AACvC,QAAA,IAAI,IAAA,CAAK,IAAA,EAAK,IAAK,CAAA,EAAG;AACtB,QAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAO,GAAI,iBAAA,CAAkB,MAAM,IAAI,CAAA;AACrD,QAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,UACX,OAAA;AAAA,UACA,OAAA;AAAA,UACA,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAM,KAAA,EAAO,OAAO,CAAA;AAAA,UAClC,KAAA,EAAO,OACH,CAAC,GAAG,QAAQ,IAAA,EAAM,IAAA,EAAM,OAAO,CAAA,EAAG,GAAG,QAAQ,MAAA,EAAQ,IAAI,CAAC,CAAA,GAC1D,OAAA,CAAQ,KAAK,GAAA,CAAI,MAAM,CAAA,EAAG,IAAA,EAAM,KAAK;AAAA,SAC1C,CAAA;AAAA,MACH;AAAA,IACF;AACA,IAAA,KAAA,CAAM,IAAA,CAAK,EAAE,OAAA,EAAS,MAAA,EAAQ,OAAA,EAAS,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,KAAA,EAAO,MAAA,CAAO,IAAA,EAAM,CAAA;AACjF,IAAA,OAAO,EAAE,OAAO,OAAA,EAAQ;AAAA,EAC1B,CAAA;AAGA,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAAsB;AAC9C,EAAA,YAAA,CAAa,OAAA,CAAQ,CAAC,SAAA,EAAW,UAAA,KAAe;AAC9C,IAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,MAAA,MAAM,QAAA,GAAW,WAAA,CAAY,GAAA,CAAI,QAAQ,CAAA;AACzC,MAAA,IAAI,QAAA,EAAU,QAAA,CAAS,IAAA,CAAK,UAAU,CAAA;AAAA,WACjC,WAAA,CAAY,GAAA,CAAI,QAAA,EAAU,CAAC,UAAU,CAAC,CAAA;AAAA,IAC7C;AAAA,EACF,CAAC,CAAA;AASD,EAAA,MAAM,QAAgB,EAAC;AACvB,EAAA,MAAM,aAAA,GAAgB,WAAA,CAAY,GAAA,CAAI,CAAC,GAAG,UAAA,KAAe;AACvD,IAAA,MAAM,UAAU,IAAI,GAAA,CAAI,eAAA,CAAgB,UAAA,GAAa,UAAU,CAAC,CAAA;AAChE,IAAA,IAAI,WAAA,GAAc,EAAA;AAClB,IAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,KAAA,EAAO,SAAA,KAAc;AACrC,MAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,EAAE,GAAG,WAAA,GAAc,SAAA;AAAA,IAC3C,CAAC,CAAA;AACD,IAAA,MAAM,IAAA,uBAAW,GAAA,EAAqB;AACtC,IAAA,MAAM,OAAA,GAAU,CAAC,IAAA,EAAc,KAAA,EAA0B,KAAA,KAAwC;AAC/F,MAAA,IAAI,IAAA,GAAO,aAAa,OAAO,KAAA;AAC/B,MAAA,MAAM,GAAA,GAAM,GAAG,IAAI,CAAA,CAAA,EAAI,MAAM,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,IAAI,CAACC,KAAAA,KAAUA,UAAS,IAAA,GAAO,GAAA,GAAM,GAAI,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC,CAAA,CAAA;AACnG,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA;AAC1B,MAAA,IAAI,KAAA,KAAU,QAAW,OAAO,KAAA;AAChC,MAAA,MAAM,IAAA,GAAO,MAAM,IAAI,CAAA;AACvB,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,IAAA,EAAM,KAAA,EAAO,KAAK,CAAA;AACxC,MAAA,IAAI,MAAA;AACJ,MAAA,IAAI,SAAS,IAAA,EAAM;AACjB,QAAA,MAAA,GAAS,OAAA,CAAQ,IAAA,GAAO,CAAA,EAAG,KAAA,EAAO,KAAK,CAAA;AAAA,MACzC,CAAA,MAAO;AACL,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,KAAS,EAAA,GAAK,QAAQ,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,EAAM,KAAA,KAAW,KAAA,KAAU,IAAA,CAAK,IAAA,GAAO,OAAO,IAAK,CAAA;AACtG,QAAA,MAAA,GACE,IAAA,CAAK,QAAA,CAAS,MAAA,KAAW,CAAA,GACrB,OAAA,CAAQ,IAAA,GAAO,CAAA,EAAG,KAAA,EAAO,IAAI,CAAA,GAC7B,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA,CAAE,IAAA;AAAA,UACf,CAAC,IAAA,KACC,IAAA,CAAK,KAAA,CAAM,IAAA,EAAK,GAAI,GAAA,KAClB,IAAA,CAAK,OAAA,KAAY,MAAA,IAAU,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,IAC9C,OAAA,CAAQ,IAAA,GAAO,CAAA,EAAG,QAAA,CAAS,KAAA,EAAO,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,OAAO,CAAA,EAAG,IAAI,CAAA;AAAA,SACvF;AAAA,MACR;AACA,MAAA,IAAA,CAAK,GAAA,CAAI,KAAK,MAAM,CAAA;AACpB,MAAA,OAAO,MAAA;AAAA,IACT,CAAA;AACA,IAAA,OAAO,OAAA;AAAA,EACT,CAAC,CAAA;AAED,EAAA,MAAM,cAAc,MAAc,CAAA;AAClC,EAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,KAAA,EAAO,SAAA,KAAc;AACrC,IAAA,MAAM,QAAQ,KAAA,CAAM,KAAA,KAAU,KAAK,IAAA,GAAO,MAAA,CAAO,MAAM,KAAK,CAAA;AAC5D,IAAA,MAAM,SACJ,KAAA,CAAM,MAAA,KAAW,KACZ,YAAA,CAAa,KAAA,CAAM,MAAM,CAAA,IAAK;AAAA,MAC7B,GAAA,EAAK,UAAA,CAAW,KAAA,CAAM,MAAM,CAAA;AAAA,MAC5B,IAAA,EAAM,IAAI,SAAA,EAAU;AAAA,MACpB,IAAA,EAAM,IAAI,SAAA;AAAU,KACtB,GACA,QAAA,CAAS,KAAA,CAAM,EAAE,CAAA;AAEvB,IAAA,IAAI,KAAA,KAAU,UAAU,WAAA,CAAY,KAAA,CAAM,KAAK,CAAA,CAAA,IAAM,KAAA,CAAM,eAAe,MAAA,EAAW;AAKnF,MAAA,IAAA;AAAA,QACE,oBAAA;AAAA,QACA,KAAA,CAAM,EAAA;AAAA,QACN,CAAA,OAAA,EAAU,MAAM,EAAE,CAAA,4GAAA;AAAA,OACpB;AAAA,IACF;AAEA,IAAA,MAAM,QAAA,GAAW,WAAW,SAAS,CAAA;AACrC,IAAA,IAAI,KAAA,EAAO,EAAA,KAAO,UAAA,IAAc,MAAA,EAAQ;AAGtC,MAAA,MAAM,WAAA,GAAc,iBAAiB,IAAA,CAAK,CAAC,YAAY,OAAA,CAAQ,QAAA,CAAS,KAAA,CAAM,EAAE,CAAC,CAAA;AACjF,MAAA,IAAI,QAAA,KAAa,KAAK,WAAA,EAAa;AACjC,QAAA,IAAA;AAAA,UACE,qBAAA;AAAA,UACA,KAAA,CAAM,EAAA;AAAA,UACN,UAAU,KAAA,CAAM,EAAE,6BAA6B,QAAA,KAAa,CAAA,GAAI,6BAA6B,8BAA8B,CAAA,+OAAA;AAAA,SAC7H;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAM,UAAU,WAAA,CAAY,GAAA,CAAI,KAAA,CAAM,EAAE,KAAK,EAAC;AAC9C,IAAA,IAAI,WAA0B,EAAC;AAC/B,IAAA,IAAI,MAAA,GAAyB,WAAA;AAC7B,IAAA,MAAM,aAAa,MAAA,GAAS,kBAAA,CAAmB,GAAA,CAAI,KAAA,CAAM,EAAE,CAAA,GAAI,MAAA;AAC/D,IAAA,MAAM,SAAA,GACJ,eAAe,MAAA,GAAY,EAAA,GAAM,UAAU,GAAA,CAAI,aAAA,CAAc,UAAU,CAAC,CAAA;AAO1E,IAAA,MAAM,KAAA,GAAQ,CACZ,aAAA,KAC0G;AAC1G,MAAA,MAAM,QAAQ,QAAA,CAAS,KAAA,CAAM,EAAA,EAAI,aAAA,EAAe,IAAI,CAAA,CAAE,KAAA;AACtD,MAAA,IAAI,UAAA,KAAe,QAAW,OAAO,EAAE,UAAU,CAAC,KAAK,CAAA,EAAG,MAAA,EAAQ,WAAA,EAAY;AAC9E,MAAA,MAAM,EAAE,KAAA,EAAO,OAAA,EAAQ,GAAI,QAAA;AAAA,QACzB,KAAA,CAAM,EAAA;AAAA,QACN,aAAA;AAAA,QACA,YAAY,UAAU,CAAA,CAAE,MAAA,IAAU,EAAE,MAAM,QAAA;AAAS,OACrD;AACA,MAAA,MAAM,GAAA,GAAqB,CAAC,KAAK,CAAA;AACjC,MAAA,KAAA,IAAS,OAAO,CAAA,EAAG,IAAA,GAAO,CAAA,IAAK,OAAA,CAAQ,QAAQ,IAAA,EAAA,EAAQ;AACrD,QAAA,GAAA,CAAI,IAAA;AAAA,UACF,UAAA,CAAW;AAAA,YACT,GAAG,KAAA;AAAA,YACH,GAAG,OAAA,CAAQ,OAAA,CAAQ,CAAC,MAAA,EAAQ,GAAA,KAAS,IAAA,GAAQ,CAAA,IAAK,GAAA,GAAO,MAAA,CAAO,IAAA,GAAO,MAAA,CAAO,KAAM;AAAA,WACrF;AAAA,SACH;AAAA,MACF;AACA,MAAA,MAAM,OAAA,GAAU,cAAc,UAAU,CAAA;AACxC,MAAA,OAAO;AAAA,QACL,QAAA,EAAU,GAAA;AAAA;AAAA;AAAA;AAAA,QAIV,MAAA,EAAQ,CAAC,KAAA,EAAO,KAAA,KAAU;AACxB,UAAA,IAAI,KAAA,CAAM,SAAS,CAAA,KAAM,IAAA,EAAM,OAAO,CAAA;AACtC,UAAA,IAAI,IAAA,GAAO,CAAA;AACX,UAAA,OAAA,CAAQ,OAAA,CAAQ,CAAC,MAAA,EAAQ,GAAA,KAAQ;AAC/B,YAAA,IAAI,OAAA,CAAQ,SAAA,GAAY,CAAA,EAAG,QAAA,CAAS,KAAA,EAAO,OAAA,EAAS,MAAA,CAAO,OAAA,EAAS,MAAA,CAAO,OAAO,CAAA,EAAG,KAAK,CAAA,EAAG;AAC3F,cAAA,IAAA,IAAQ,CAAA,IAAK,GAAA;AAAA,YACf;AAAA,UACF,CAAC,CAAA;AACD,UAAA,OAAO,CAAA,GAAI,IAAA;AAAA,QACb;AAAA,OACF;AAAA,IACF,CAAA;AAEA,IAAA,IAAI,MAAA,IAAU,aAAa,CAAA,EAAG;AAC5B,MAAA,CAAC,EAAE,QAAA,EAAU,MAAA,EAAO,GAAI,MAAM,MAAM,CAAA;AAAA,IACtC,WAAW,MAAA,EAAQ;AAIjB,MAAA,MAAM,MAAA,GAAS,QAAA,CAAS,KAAA,CAAM,EAAE,CAAA;AAChC,MAAA,MAAM,UAAA,GAAa,MAAA;AAEnB,MAAA,MAAM,QAAA,GAAW,CAAC,GAAA,KAAuD;AACvE,QAAA,IAAI,SAAA,GAAY,EAAA;AAChB,QAAA,MAAM,SAAA,GAAa,UAAA,CAA2C,SAAA,CAAU,CAAC,IAAA,KAAS;AAChF,UAAA,MAAM,IAAA,GAAc;AAAA,YAClB,GAAG,IAAA;AAAA,YACH,QAAA,EAAU,OAAA,CAAQ,IAAA,CAAK,QAAA,EAAU,KAAK,aAAA,EAAe;AAAA,cACnD,SAAA,EAAA,CAAY,MAAM,aAAA,MAAmB,CAAA;AAAA,cACrC,YAAA,EAAA,CAAe,MAAM,gBAAA,MAAsB;AAAA,aAC5C,CAAA,CAAE,QAAA;AAAA,YACH,SAAA,EAAW,IAAA,CAAK,SAAA,IAAA,CAAc,GAAA,GAAM,eAAA,MAAqB;AAAA,WAC3D;AACA,UAAA,SAAA,GAAY,CAAA,EAAG,IAAA,CAAK,QAAQ,CAAA,CAAA,EAAI,KAAK,SAAS,CAAA,CAAA;AAC9C,UAAA,OAAO,IAAA;AAAA,QACT,CAAC,CAAA;AACD,QAAA,OAAO,EAAE,MAAA,EAAQ,SAAA,EAAW,SAAA,EAAU;AAAA,MACxC,CAAA;AACA,MAAA,IAAI,KAAA;AACJ,MAAA,IAAI,CAAC,MAAM,OAAA,CAAQ,MAAM,KAAK,OAAO,UAAA,CAAW,cAAc,UAAA,EAAY;AACxE,QAAA,IAAI;AACF,UAAA,KAAA,GAAQ,QAAA,CAAS,CAAC,CAAA,CAAE,SAAA;AAAA,QACtB,CAAA,CAAA,MAAQ;AACN,UAAA,KAAA,GAAQ,MAAA;AAAA,QACV;AAAA,MACF;AACA,MAAA,IAAI,UAAU,MAAA,EAAW;AACvB,QAAA,IAAA;AAAA,UACE,sBAAA;AAAA,UACA,KAAA,CAAM,EAAA;AAAA,UACN,CAAA,CAAA,EAAI,MAAM,EAAE,CAAA,gKAAA;AAAA,SACd;AAAA,MACF;AACA,MAAA,IAAI,SAAA,GAAY,CAAC,CAAC,CAAA;AAClB,MAAA,cAAA,CAAe,OAAA,CAAQ,CAAC,SAAA,EAAW,GAAA,KAAQ;AACzC,QAAA,IAAI,QAAA,GAAY,KAAK,GAAA,EAAM;AACzB,UAAA,SAAA,GAAY,CAAC,mBAAG,IAAI,GAAA,CAAI,CAAC,GAAG,SAAA,EAAW,GAAG,SAAA,CAAU,GAAA,CAAI,CAAC,GAAA,KAAQ,GAAA,GAAM,SAAS,CAAC,CAAC,CAAC,CAAA;AAAA,QACrF;AAAA,MACF,CAAC,CAAA;AACD,MAAA,MAAM,MAAA,GAAS,CAAC,KAAA,CAAM,MAAM,CAAC,CAAA;AAC7B,MAAA,MAAM,cAAA,uBAAqB,GAAA,CAAI,CAAC,CAAC,KAAA,EAAiB,CAAC,CAAC,CAAC,CAAA;AACrD,MAAA,MAAM,aAAa,IAAI,KAAA,CAAc,mBAAmB,CAAC,CAAA,CAAE,KAAK,CAAC,CAAA;AACjE,MAAA,KAAA,MAAW,OAAO,SAAA,EAAW;AAC3B,QAAA,MAAM,OAAA,GAAU,SAAS,GAAG,CAAA;AAC5B,QAAA,IAAI,KAAA,GAAQ,cAAA,CAAe,GAAA,CAAI,OAAA,CAAQ,SAAS,CAAA;AAChD,QAAA,IAAI,UAAU,MAAA,EAAW;AACvB,UAAA,KAAA,GAAQ,MAAA,CAAO,MAAA;AACf,UAAA,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,KAAA,CAAM,OAAA,CAAQ,MAAA,EAAQ,GAAA,EAAK,KAAA,CAAM,EAAE,CAAC,CAAiB,CAAC,CAAA;AACpF,UAAA,cAAA,CAAe,GAAA,CAAI,OAAA,CAAQ,SAAA,EAAW,KAAK,CAAA;AAAA,QAC7C;AACA,QAAA,UAAA,CAAW,GAAG,CAAA,GAAI,KAAA;AAAA,MACpB;AACA,MAAA,MAAM,UAAoB,EAAC;AAC3B,MAAA,KAAA,MAAW,QAAQ,MAAA,EAAQ;AACzB,QAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,MAAM,CAAA;AAC5B,QAAA,QAAA,CAAS,IAAA,CAAK,GAAG,IAAA,CAAK,QAAQ,CAAA;AAAA,MAChC;AACA,MAAA,MAAA,GAAS,CAAC,KAAA,EAAO,KAAA,EAAO,KAAA,KAAU;AAChC,QAAA,MAAM,OAAO,KAAA,GAAQ,QAAA;AACrB,QAAA,IAAI,GAAA,GAAM,CAAA;AACV,QAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,IAAA,IAAQ,GAAA,KAAQ,GAAG,GAAA,EAAA,EAAO;AAC1C,UAAA,IAAI,IAAA,GAAQ,CAAA,IAAK,GAAA,EAAM,GAAA,IAAO,eAAe,GAAG,CAAA;AAAA,QAClD;AACA,QAAA,MAAM,KAAA,GAAQ,WAAW,GAAG,CAAA;AAC5B,QAAA,OAAO,OAAA,CAAQ,KAAK,CAAA,GAAI,MAAA,CAAO,KAAK,CAAA,CAAE,MAAA,CAAO,OAAO,KAAK,CAAA;AAAA,MAC3D,CAAA;AAAA,IACF,CAAA,MAAA,IAAW,aAAa,CAAA,EAAG;AACzB,MAAA,IAAA;AAAA,QACE,sBAAA;AAAA,QACA,KAAA,CAAM,EAAA;AAAA,QACN,CAAA,CAAA,EAAI,MAAM,EAAE,CAAA,gLAAA;AAAA,OACd;AAAA,IACF;AAEA,IAAA,MAAM,MAAM,KAAA,IAAS,CAAC,SAAS,QAAA,CAAS,KAAA,CAAM,KAAK,CAAA,GAAI,IAAA;AACvD,IAAA,MAAM,OAAA,GACJ,OAAO,EAAA,KAAO,WAAA,GAAe,UAAU,GAAA,CAAI,KAAA,CAAM,EAAE,CAAA,GAAe,EAAA;AACpE,IAAA,KAAA,CAAM,IAAA,CAAK;AAAA,MACT,IAAI,KAAA,CAAM,EAAA;AAAA,MACV,OAAA,EAAS,KAAA;AAAA,MACT,QAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAA,EAAQ,GAAA,IAAO,KAAA,GAAQ,EAAE,GAAA,EAAK,IAAA,EAAM,OAAA,CAAQ,KAAA,EAAO,GAAA,EAAK,GAAG,CAAA,EAAE,GAAI,IAAA;AAAA,MACjE,OAAA;AAAA,MACA,OAAO,KAAA,GAAS,YAAA,CAAa,IAAI,KAAA,CAAM,KAAK,KAAK,EAAA,GAAM,EAAA;AAAA,MACvD,MAAM,KAAA,GAAS,SAAA,CAAU,GAAA,CAAI,KAAA,CAAM,EAAE,CAAA,GAAe,EAAA;AAAA,MACpD,OAAA,EAAS,OAAA;AAAA,MACT,SAAA;AAAA,MACA,QAAA,EAAU,WAAW,SAAS,CAAA;AAAA,MAC9B,MAAA,EAAQ,SAAS,SAAS;AAAA,KAC3B,CAAA;AAAA,EACH,CAAC,CAAA;AAID,EAAA,MAAM,oBAAoB,IAAI,KAAA,CAAc,aAAa,MAAM,CAAA,CAAE,KAAK,EAAE,CAAA;AACxE,EAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,EAAM,SAAA,KAAc;AAEjC,IAAA,KAAA,MAAW,KAAA,IAAS,CAAC,IAAA,CAAK,KAAA,EAAO,GAAG,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAC,GAAA,KAAQ,GAAA,CAAI,KAAK,CAAC,CAAA,EAAG;AACxE,MAAA,IAAI,KAAA,KAAU,EAAA,EAAI,iBAAA,CAAkB,KAAK,CAAA,GAAI,KAAK,GAAA,CAAI,iBAAA,CAAkB,KAAK,CAAA,EAAG,SAAS,CAAA;AAAA,IAC3F;AAAA,EACF,CAAC,CAAA;AACD,EAAA,KAAA,MAAW,KAAA,IAAS,YAAA,CAAa,MAAA,EAAO,EAAG;AACzC,IAAA,iBAAA,CAAkB,KAAK,IAAI,KAAA,CAAM,MAAA;AAAA,EACnC;AAEA,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,YAAY,YAAA,CAAa,MAAA;AAAA,IACzB,UAAA;AAAA,IACA,SAAA;AAAA,IACA,QAAA;AAAA,IACA,aAAA;AAAA,IACA,SAAA;AAAA,IACA,SAAA;AAAA,IACA,WAAW,SAAA,CAAU,IAAA;AAAA,IACrB,YAAA;AAAA,IACA,iBAAA;AAAA,IACA,YAAA;AAAA,IACA,kBAAkB,SAAA,CAAU,GAAA,CAAI,CAAC,IAAA,KAAS,KAAK,QAAQ;AAAA,GACzD;AACF;;;AC/3CA,IAAM,WAAA,uBAAkB,OAAA,EAAmE;AA2BpF,IAAM,IAAA,GAAN,MAAM,KAAA,CAAK;AAAA,EAMR,WAAA,CAAY,OAAkB,GAAA,EAAa;AAKjD,IAAA,IAAA,CAAK,KAAA,GAAQ;AAAA,MACX,GAAG,KAAA;AAAA,MACH,OAAA,EAAS,CAAC,GAAG,KAAA,CAAM,OAAO,CAAA;AAAA,MAC1B,MAAA,EAAQ,CAAC,GAAG,KAAA,CAAM,MAAM,CAAA;AAAA,MACxB,WAAA,EAAa,CAAC,GAAG,KAAA,CAAM,WAAW,CAAA;AAAA,MAClC,UAAA,EAAY,CAAC,GAAG,KAAA,CAAM,UAAU;AAAA,KAClC;AACA,IAAA,IAAA,CAAK,GAAA,GAAM,GAAA;AAGX,IAAA,IAAA,CAAK,IAAA,GAAO,SAAA,CAAU,IAAA,CAAK,KAAA,EAAO,GAAG,CAAA;AACrC,IAAA,WAAA,CAAY,IAAI,IAAA,EAAM,EAAE,IAAA,EAAM,IAAA,CAAK,MAAM,CAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,OAAO,IAAA,CAAK,IAAA,EAAgB,GAAA,GAAc,CAAA,EAAS;AACjD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,IAAU,EAAC;AAC/B,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,WAAA,IAAe,EAAC;AACzC,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,UAAA,IAAc,EAAC;AACvC,IAAA,MAAM,IAAA,GAA0B,OAAO,MAAA,GACnC,EAAE,MAAM,OAAA,EAAS,KAAA,EAAO,OAAO,MAAA,GAAS,CAAA,KACxC,WAAA,CAAY,MAAA,GACV,EAAE,IAAA,EAAM,YAAA,EAAc,OAAO,WAAA,CAAY,MAAA,GAAS,GAAE,GACpD,IAAA;AACN,IAAA,OAAO,IAAI,KAAA;AAAA,MACT,EAAE,SAAS,IAAA,CAAK,OAAA,EAAS,QAAQ,WAAA,EAAa,UAAA,EAAY,SAAA,EAAW,KAAA,EAAO,IAAA,EAAK;AAAA,MACjF;AAAA,KACF;AAAA,EACF;AAAA,EAEQ,KAAK,OAAA,EAAmC;AAC9C,IAAA,OAAO,IAAI,KAAA,CAAK,EAAE,GAAG,IAAA,CAAK,OAAO,GAAG,OAAA,EAAQ,EAAG,IAAA,CAAK,GAAG,CAAA;AAAA,EACzD;AAAA;AAAA,EAGQ,SAAA,GAA+B;AACrC,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,IAAA,CAAK,WAAW,GAAG,IAAA,CAAK,KAAK,SAAS,CAAA;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAA,CAAO,QAAgB,OAAA,EAAwC;AAC7D,IAAA,IAAA,CAAK,sBAAA,EAAuB;AAC5B,IAAA,MAAM,EAAE,EAAA,EAAI,GAAA,EAAI,GAAI,OAAO,OAAA,KAAY,QAAA,GAAW,EAAE,EAAA,EAAI,OAAA,EAAS,GAAA,EAAK,MAAA,EAAU,GAAK,WAAW,EAAC;AACjG,IAAA,MAAM,KAAA,GACJ,OAAO,MAAA,IAAa,GAAA,KAAQ,SAAY,MAAA,GAAS,EAAE,EAAA,EAAI,GAAA,EAAK,MAAA,EAAO;AACrE,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,EAAE,OAAA,EAAS,CAAC,GAAG,IAAA,CAAK,KAAA,CAAM,OAAA,EAAS,KAAK,CAAA,EAAG,CAAA;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,OAAA,CAAQ,KAAA,EAAe,MAAA,EAAgB,OAAA,GAA4B,EAAC,EAAS;AAC3E,IAAA,IAAI,CAAC,MAAA,CAAO,SAAA,CAAU,KAAK,CAAA,IAAK,QAAQ,CAAA,EAAG;AACzC,MAAA,MAAM,IAAI,UAAA;AAAA,QACR,gDAAgD,KAAK,CAAA,CAAA;AAAA,OACvD;AAAA,IACF;AACA,IAAA,IAAA,CAAK,sBAAA,EAAuB;AAC5B,IAAA,MAAM,KAAA,GAAgB,QAAQ,GAAA,KAAQ,MAAA,GAAY,SAAS,EAAE,GAAA,EAAK,OAAA,CAAQ,GAAA,EAAK,MAAA,EAAO;AACtF,IAAA,MAAM,QAAkB,IAAI,KAAA,CAAc,KAAK,CAAA,CAAE,KAAK,KAAK,CAAA;AAC3D,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,EAAE,OAAA,EAAS,CAAC,GAAG,IAAA,CAAK,KAAA,CAAM,OAAA,EAAS,GAAG,KAAK,CAAA,EAAG,CAAA;AAAA,EACjE;AAAA,EAEQ,sBAAA,GAA+B;AACrC,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,CAAM,SAAA,EAAW;AAC3B,IAAA,MAAM,IAAI,aAAA;AAAA,MACR,oBAAA;AAAA,MACA,EAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,KAAA,EAAoB;AACxB,IAAA,MAAM,QAAA,GACJ,MAAM,EAAA,KAAO,WAAA,IAAe,MAAM,EAAA,KAAO,YAAA,IAAgB,MAAM,EAAA,KAAO,MAAA;AACxE,IAAA,MAAM,KAAA,GAAS,WAAW,EAAE,GAAG,OAAO,EAAA,EAAI,IAAA,CAAK,SAAA,EAAU,EAAE,GAAI,KAAA;AAC/D,IAAA,OAAO,KAAK,IAAA,CAAK;AAAA,MACf,QAAQ,CAAC,GAAG,IAAA,CAAK,KAAA,CAAM,QAAQ,KAAK,CAAA;AAAA,MACpC,SAAA,EAAW,IAAA,CAAK,KAAA,CAAM,SAAA,IAAa,QAAA;AAAA,MACnC,IAAA,EAAM,EAAE,IAAA,EAAM,OAAA,EAAS,OAAO,IAAA,CAAK,KAAA,CAAM,OAAO,MAAA;AAAO,KACxD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,SAAA,CAAU,EAAA,EAAyB,MAAA,EAAgB,OAAA,EAAiC;AAC1F,IAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAQ,GAAG,cAAa,GAAI,OAAA;AAClD,IAAA,MAAM,KAAA,GAAQ,IAAA,KAAS,MAAA,IAAa,MAAA,KAAW,UAAa,MAAA,KAAW,MAAA;AACvE,IAAA,MAAM,QAA4B,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,GAAI,MAAA,GAAS,CAAC,MAAM,CAAA;AAC1E,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,MAAA,CAAO,OAAO,CAAA;AACnC,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,MAAM,IAAI,KAAA;AAAA,UACR;AAAA,SACF;AAAA,MACF;AACA,MAAA,OAAO,IAAA,CAAK,MAAM,EAAE,GAAG,cAAc,MAAA,EAAQ,MAAA,EAAuB,IAAI,CAAA;AAAA,IAC1E;AACA,IAAA,IAAI,IAAA,KAAS,MAAA,IAAa,MAAA,KAAW,MAAA,EAAW;AAC9C,MAAA,MAAM,IAAI,MAAM,2EAA2E,CAAA;AAAA,IAC7F;AACA,IAAA,IAAI,MAAA,KAAW,MAAA,IAAa,IAAA,KAAS,MAAA,IAAa,WAAW,MAAA,EAAW;AACtE,MAAA,MAAM,IAAI,MAAM,uFAAuF,CAAA;AAAA,IACzG;AACA,IAAA,IAAI,IAAA,KAAS,MAAA,IAAa,OAAQ,IAAA,CAAwB,UAAU,UAAA,EAAY;AAC9E,MAAA,MAAM,IAAI,MAAM,qDAAqD,CAAA;AAAA,IACvE;AACA,IAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,CAAC,SAAS,CAAC,OAAA,CAAQ,IAAI,CAAC,CAAA;AACpD,IAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,IAAK,YAAA,CAAa,eAAe,MAAA,EAAW;AAChE,MAAA,MAAM,IAAI,aAAA;AAAA,QACR,oBAAA;AAAA,QACA,aAAa,EAAA,IAAM,EAAA;AAAA,QACnB;AAAA,OACF;AAAA,IACF;AAEA,IAAA,MAAM,EAAA,GAAK,YAAA,CAAa,EAAA,IAAM,IAAA,CAAK,SAAA,EAAU;AAG7C,IAAA,MAAM,WAAA,GAAc,IAAA,KAAS,MAAA,GAAY,MAAA,GAAS,IAAA,CAAK,MAAM,IAAA,CAAK,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA;AAC5E,IAAA,MAAM,KAAA,GAAQ,MAAA,KAAW,MAAA,GAAY,EAAC,GAAI,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,GAAI,MAAA,GAAS,CAAC,MAAe,CAAA;AAC3F,IAAA,MAAM,SAAA,GAA2B;AAAA,MAC/B,GAAI,MAAA,CAAO,MAAA,KAAW,CAAA,IAAK,YAAA,CAAa,EAAA,KAAO,MAAA,GAAY,EAAE,EAAA,EAAI,YAAA,CAAa,EAAA,EAAG,GAAI,EAAC;AAAA,MACtF,EAAA;AAAA,MACA,EAAA;AAAA,MACA,GAAI,WAAA,KAAgB,MAAA,GAAY,EAAC,GAAI,EAAE,QAAQ,WAAA,EAAY;AAAA,MAC3D,MAAA,EAAQ,MAAA,CAAO,GAAA,CAAI,SAAS,CAAA;AAAA,MAC5B,GAAI,KAAA,CAAM,MAAA,KAAW,CAAA,GAAI,EAAC,GAAI,EAAE,MAAA,EAAQ,KAAA,CAAM,GAAA,CAAI,SAAS,CAAA;AAAE,KAC/D;AACA,IAAA,MAAM,SACJ,MAAA,CAAO,MAAA,KAAW,IACd,IAAA,CAAK,KAAA,CAAM,SACX,CAAC,GAAG,IAAA,CAAK,KAAA,CAAM,QAAQ,EAAE,GAAG,cAAc,EAAA,EAAI,MAAA,EAAQ,IAAa,CAAA;AACzE,IAAA,OAAO,KAAK,IAAA,CAAK;AAAA,MACf,MAAA;AAAA,MACA,YAAY,CAAC,GAAG,IAAA,CAAK,KAAA,CAAM,YAAY,SAAS,CAAA;AAAA,MAChD,SAAA,EAAW,IAAA,CAAK,KAAA,CAAM,SAAA,IAAa,aAAa,EAAA,KAAO,MAAA;AAAA,MACvD,IAAA,EAAM,MAAA,CAAO,MAAA,KAAW,CAAA,GAAI,IAAA,GAAO,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,MAAA;AAAO,KACrF,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,UAAA,CAAW,MAAA,EAA4B,OAAA,GAA4B,EAAC,EAAS;AAC3E,IAAA,IAAI,CAAC,YAAY,MAAM,CAAA,SAAU,IAAA,CAAK,SAAA,CAAU,WAAA,EAAa,MAAA,EAAQ,OAAO,CAAA;AAC5E,IAAA,IAAI,OAAA,CAAQ,SAAS,MAAA,IAAa,OAAA,CAAQ,WAAW,MAAA,IAAa,OAAA,CAAQ,WAAW,MAAA,EAAW;AAC9F,MAAA,MAAM,IAAI,MAAM,6EAA6E,CAAA;AAAA,IAC/F;AACA,IAAA,IAAI,OAAA,CAAQ,eAAe,MAAA,EAAW;AACpC,MAAA,MAAM,IAAI,aAAA;AAAA,QACR,oBAAA;AAAA,QACA,QAAQ,EAAA,IAAM,EAAA;AAAA,QACd;AAAA,OACF;AAAA,IACF;AACA,IAAA,MAAM,UAAA,GAA6B;AAAA,MACjC,GAAI,QAAQ,EAAA,KAAO,MAAA,GAAY,EAAC,GAAI,EAAE,EAAA,EAAI,OAAA,CAAQ,EAAA,EAAG;AAAA,MACrD,EAAA,EAAI,WAAA;AAAA,MACJ,EAAA,EAAI,OAAA,CAAQ,EAAA,IAAM,IAAA,CAAK,SAAA,EAAU;AAAA,MACjC,GAAG,iBAAiB,MAAM;AAAA,KAC5B;AACA,IAAA,OAAO,KAAK,IAAA,CAAK;AAAA,MACf,aAAa,CAAC,GAAG,IAAA,CAAK,KAAA,CAAM,aAAa,UAAU,CAAA;AAAA,MACnD,SAAA,EAAW,IAAA,CAAK,KAAA,CAAM,SAAA,IAAa,QAAQ,EAAA,KAAO,MAAA;AAAA,MAClD,IAAA,EAAM,EAAE,IAAA,EAAM,YAAA,EAAc,OAAO,IAAA,CAAK,KAAA,CAAM,YAAY,MAAA;AAAO,KAClE,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,SAAA,CAAU,MAAA,EAAgB,OAAA,GAA4B,EAAC,EAAS;AAC9D,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,UAAA,EAAY,MAAA,EAAQ,OAAO,CAAA;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,SAAA,CAAU,MAAA,EAAqB,OAAA,GAAwB,EAAC,EAAS;AAC/D,IAAA,OAAO,IAAA,CAAK,MAAM,EAAE,GAAG,SAAS,MAAA,EAAQ,EAAA,EAAI,YAAY,CAAA;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,WAAA,CAAY,MAAA,EAAqB,OAAA,GAAwB,EAAC,EAAS;AACjE,IAAA,OAAO,IAAA,CAAK,MAAM,EAAE,GAAG,SAAS,MAAA,EAAQ,EAAA,EAAI,cAAc,CAAA;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,UAAA,CAAW,MAAA,EAAgB,OAAA,GAA4B,EAAC,EAAS;AAC/D,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,WAAA,EAAa,MAAA,EAAQ,OAAO,CAAA;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBA,SAAA,CACE,MAAA,EACA,OAAA,GAAoC,EAAC,EAC/B;AACN,IAAA,MAAM,IAAA,GAAO,KAAK,KAAA,CAAM,IAAA;AACxB,IAAA,IAAI,SAAS,IAAA,EAAM;AACjB,MAAA,MAAM,IAAI,aAAA;AAAA,QACR,YAAA;AAAA,QACA,EAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAGA,IAAA,IAAI,MAAA;AACJ,IAAA,MAAM,MAAA,GAAkB,CAAC,GAAG,IAAA,CAAK,MAAM,MAAM,CAAA;AAC7C,IAAA,MAAM,WAAA,GAAgC,CAAC,GAAG,IAAA,CAAK,MAAM,WAAW,CAAA;AAChE,IAAA,IAAI,IAAA,CAAK,SAAS,YAAA,EAAc;AAC9B,MAAA,MAAM,QAAA,GAAW,WAAA,CAAY,IAAA,CAAK,KAAK,CAAA;AACvC,MAAA,MAAA,GAAS,QAAA,CAAS,EAAA,IAAM,CAAA,WAAA,EAAc,IAAA,CAAK,QAAQ,CAAC,CAAA,CAAA;AACpD,MAAA,WAAA,CAAY,KAAK,KAAK,CAAA,GAAI,EAAE,GAAG,QAAA,EAAU,IAAI,MAAA,EAAO;AAAA,IACtD,CAAA,MAAO;AACL,MAAA,MAAM,QAAA,GAAW,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA;AAClC,MAAA,MAAA,GAAS,QAAA,CAAS,EAAA,IAAM,CAAA,MAAA,EAAS,IAAA,CAAK,QAAQ,CAAC,CAAA,CAAA;AAC/C,MAAA,IAAI,QAAA,CAAS,OAAO,WAAA,EAAa;AAC/B,QAAA,MAAM,IAAI,aAAA;AAAA,UACR,eAAA;AAAA,UACA,MAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF;AACA,MAAA,MAAA,CAAO,KAAK,KAAK,CAAA,GAAI,EAAE,GAAG,QAAA,EAAU,IAAI,MAAA,EAAO;AAAA,IACjD;AACA,IAAA,MAAA,CAAO,IAAA,CAAK,EAAE,GAAG,OAAA,EAAS,QAAQ,EAAA,EAAI,WAAA,EAAa,EAAA,EAAI,MAAA,EAAQ,CAAA;AAC/D,IAAA,OAAO,KAAK,IAAA,CAAK;AAAA,MACf,MAAA;AAAA,MACA,WAAA;AAAA,MACA,MAAM,EAAE,IAAA,EAAM,SAAS,KAAA,EAAO,MAAA,CAAO,SAAS,CAAA;AAAE,KACjD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,WAAA,CACE,EAAA,EACA,MAAA,EACA,OAAA,GAAoC,EAAC,EAC/B;AACN,IAAA,OAAO,IAAA,CAAK,MAAM,EAAE,GAAG,SAAS,MAAA,EAAQ,EAAA,EAAI,YAAA,EAAc,EAAA,EAAI,CAAA;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,KAAK,EAAA,EAAkB;AACrB,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA,QAAS,IAAI,UAAA,CAAW,CAAA,oCAAA,EAAuC,EAAE,CAAA,CAAA,CAAG,CAAA;AAC3F,IAAA,IAAI,OAAA,GAAU,CAAA;AACd,IAAA,MAAM,MAAA,GAAS,CAAC,MAAA,KAA2B;AACzC,MAAA,MAAM,MAAA,GAAS,MAAA;AAIf,MAAA,IAAI,OAAO,MAAA,CAAO,SAAA,KAAc,UAAA,EAAY,OAAO,MAAA;AACnD,MAAA,IAAI,OAAO,MAAA,CAAO,KAAA,EAAO,YAAA,EAAc,EAAA,KAAO,UAAU,OAAO,MAAA;AAC/D,MAAA,OAAA,EAAA;AACA,MAAA,OAAO,MAAA,CAAO,UAAU,CAAC,KAAA,MAAW,EAAE,GAAG,KAAA,EAAO,IAAG,CAAE,CAAA;AAAA,IACvD,CAAA;AACA,IAAA,MAAM,SAAA,GAAY,CAAC,MAAA,KACjB,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,GAAI,MAAA,CAAO,GAAA,CAAI,MAAM,CAAA,GAAI,MAAA,CAAO,MAAgB,CAAA;AAEtE,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,GAAA;AAAA,MACjC,CAAC,KAAA,KACC,QAAA,IAAY,KAAA,GAAQ,EAAE,GAAG,KAAA,EAAO,MAAA,EAAQ,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA,EAAE,GAAI,OAAO,KAAK;AAAA,KACjF;AACA,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,GAAA;AAAA,MAC/B,CAAC,KAAA,MAAkB;AAAA,QACjB,GAAG,KAAA;AAAA,QACH,MAAA,EAAQ,SAAA,CAAU,KAAA,CAAM,MAAM,CAAA;AAAA,QAC9B,GAAI,KAAA,CAAM,UAAA,KAAe,MAAA,GAAY,EAAC,GAAI,EAAE,UAAA,EAAY,SAAA,CAAU,KAAA,CAAM,UAAU,CAAA;AAAE,OACtF;AAAA,KACF;AACA,IAAA,IAAI,YAAY,CAAA,EAAG;AACjB,MAAA,MAAM,IAAI,aAAA;AAAA,QACR,sBAAA;AAAA,QACA,EAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AACA,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,EAAE,OAAA,EAAS,QAAQ,CAAA;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,IAAI,GAAA,GAAW;AACb,IAAA,OAAO,IAAA,CAAK,SAAQ,CAAE,GAAA;AAAA,EACxB;AAAA;AAAA,EAGA,IAAA,GAAe;AACb,IAAA,OAAO,IAAA,CAAK,IAAI,IAAA,EAAK;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,OAAA,GAAqB;AACnB,IAAA,OAAO,IAAI,SAAA,CAAU,CAAC,GAAG,IAAA,CAAK,IAAA,CAAK,UAAU,CAAA,EAAG,IAAA,CAAK,GAAA,EAAK,IAAA,CAAK,GAAG,CAAA;AAAA,EACpE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,SAAA,GAA+B;AACjC,IAAA,OAAO,KAAK,IAAA,CAAK,SAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,QAAA,GAA8B;AAChC,IAAA,OAAO,KAAK,IAAA,CAAK,QAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,aAAA,GAAmC;AACrC,IAAA,OAAO,KAAK,IAAA,CAAK,aAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,YAAA,GAAkC;AACpC,IAAA,OAAO,KAAK,IAAA,CAAK,YAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,gBAAgB,EAAA,EAAoB;AAClC,IAAA,MAAM,OAAO,IAAA,CAAK,OAAA,EAAQ,CAAE,QAAA,CAAS,IAAI,EAAE,CAAA;AAC3C,IAAA,IAAI,SAAS,MAAA,EAAW;AACtB,MAAA,MAAM,IAAI,aAAA;AAAA,QACR,YAAA;AAAA,QACA,EAAA;AAAA,QACA,CAAA,CAAA,EAAI,EAAE,CAAA,gEAAA,EAAmE;AAAA,UACvE,GAAG,KAAK,IAAA,CAAK,QAAA;AAAA,UACb,GAAG,KAAK,IAAA,CAAK,aAAA;AAAA,UACb,GAAG,KAAK,IAAA,CAAK;AAAA,SACf,CACG,GAAA,CAAI,CAAC,IAAA,KAAS,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,CAAG,CAAA,CACzB,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,OACf;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,OAAA,GAA+D;AACrE,IAAA,IAAI,IAAA,CAAK,QAAA,EAAU,OAAO,IAAA,CAAK,QAAA;AAE/B,IAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,IAAA,MAAM,MAAM,IAAA,CAAK,GAAA;AACjB,IAAA,MAAM,QAAQ,IAAA,CAAK,UAAA;AACnB,IAAA,MAAM,cAAA,GAAiB,KAAK,YAAA,CAAa,MAAA;AAiBzC,IAAA,MAAM,KAAA,GAAe;AAAA,MACnB,OAAO,IAAI,KAAA,CAAc,KAAK,CAAA,CAAE,KAAK,UAAU,CAAA;AAAA,MAC/C,GAAA,EAAK,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA;AAAA,MACrB,OAAO,IAAI,KAAA,CAAgB,KAAK,SAAS,CAAA,CAAE,KAAK,IAAI,CAAA;AAAA,MACpD,KAAA,EAAO,CAAA;AAAA,MACP,SAAS,IAAI,KAAA,CAAc,cAAc,CAAA,CAAE,KAAK,CAAC;AAAA,KACnD;AACA,IAAA,IAAI,MAAA,mBAAS,IAAI,GAAA,CAAmB,CAAC,CAAC,OAAO,YAAA,EAAa,EAAG,KAAK,CAAC,CAAC,CAAA;AACpE,IAAA,MAAM,cAAwB,EAAC;AAE/B,IAAA,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,EAAM,SAAA,KAAc;AACtC,MAAA,MAAM,IAAA,uBAAW,GAAA,EAAmB;AAQpC,MAAA,MAAM,aAAuB,EAAC;AAC9B,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,YAAY,CAAA,EAAA,EAAK;AACxC,QAAA,IAAI,KAAK,iBAAA,CAAkB,CAAC,IAAI,SAAA,EAAW,UAAA,CAAW,KAAK,CAAC,CAAA;AAAA,MAC9D;AAGA,MAAA,IAAI,SAAA,GAAY,CAAA;AAChB,MAAA,IAAA,CAAK,gBAAA,CAAiB,OAAA,CAAQ,CAAC,IAAA,EAAM,GAAA,KAAQ;AAC3C,QAAA,IAAI,IAAA,GAAO,SAAA,EAAW,SAAA,IAAa,CAAA,IAAK,GAAA;AAAA,MAC1C,CAAC,CAAA;AAED,MAAA,MAAM,KAAA,GAAQ,CAAC,KAAA,KAAuB;AAKpC,QAAA,IAAI,QAAA,GAAW,EAAA;AACf,QAAA,KAAA,MAAW,CAAA,IAAK,YAAY,QAAA,IAAY,MAAA,CAAO,aAAa,KAAA,CAAM,KAAA,CAAM,CAAC,CAAC,CAAA;AAC1E,QAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,GAAQ,SAAA;AAC5B,QAAA,MAAM,MACJ,QAAA,GACA,GAAA,GACA,MAAM,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAU,IAAA,KAAS,OAAO,GAAA,GAAM,GAAI,EAAE,IAAA,CAAK,EAAE,IAC9D,GAAA,GACA,MAAA,CAAO,aAAa,KAAK,CAAA;AAC3B,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA;AAC7B,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,QAAA,CAAS,GAAA,GAAM,QAAA,CAAS,GAAA,CAAI,GAAA,CAAI,MAAM,GAAG,CAAA;AACzC,UAAA,IAAI,cAAA,EAAgB;AAClB,YAAA,QAAA,CAAS,OAAA,GAAU,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,CAAC,IAAA,EAAM,CAAA,KAAM,IAAA,GAAO,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,UAC9E;AAAA,QACF,CAAA,MAAO;AACL,UAAA,IAAA,CAAK,IAAI,GAAA,EAAK,EAAE,GAAG,KAAA,EAAO,OAAO,CAAA;AAAA,QACnC;AAAA,MACF,CAAA;AAEA,MAAA,KAAA,MAAW,KAAA,IAAS,MAAA,CAAO,MAAA,EAAO,EAAG;AACnC,QAAA,MAAM,OAAO,QAAA,CAAS,IAAA,EAAM,KAAA,CAAM,KAAA,EAAO,MAAM,KAAK,CAAA;AAEpD,QAAA,IAAI,SAAS,IAAA,EAAM;AACjB,UAAA,KAAA,CAAM,KAAK,CAAA;AACX,UAAA;AAAA,QACF;AAEA,QAAA,IAAI,QAAQ,KAAA,CAAM,KAAA;AAClB,QAAA,IAAI,IAAA,CAAK,SAAS,EAAA,EAAI;AACpB,UAAA,KAAA,GAAQ,CAAC,GAAG,KAAK,CAAA;AACjB,UAAA,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA;AAAA,QACrB;AAEA,QAAA,IAAI,IAAA,CAAK,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG;AAC9B,UAAA,MAAM,UAAU,IAAA,CAAK,MAAA;AACrB,UAAA,KAAA,CAAM;AAAA,YACJ,GAAG,KAAA;AAAA,YACH,GAAA,EAAK,MAAM,GAAA,CAAI,QAAA;AAAA,cACb,IAAA,KAAS,MAAA,GAAS,OAAA,CAAQ,IAAA,GAAO,OAAA,CAAQ,GAAA;AAAA,cACzC,GAAA;AAAA,cACA;AAAA,aACF;AAAA,YACA;AAAA,WACD,CAAA;AACD,UAAA;AAAA,QACF;AAKA,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,MAAA,CAAO,MAAM,KAAA,EAAO,KAAA,EAAO,KAAA,CAAM,KAAK,CAAC,CAAA;AACxE,QAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,GAAQ,CAAC,IAAA,CAAK,QAAA;AAClC,QAAA,MAAM,SAAA,GAAY,cAAA,GAAiB,KAAA,CAAM,GAAA,CAAI,MAAK,GAAI,CAAA;AACtD,QAAA,KAAA,MAAW,EAAE,OAAA,EAAS,OAAA,EAAS,MAAA,EAAQ,KAAA,MAAW,KAAA,EAAO;AACvD,UAAA,MAAM,SAAA,GAAY,MAAM,IAAA,EAAK;AAC7B,UAAA,IAAI,aAAa,GAAA,EAAK;AAEtB,UAAA,MAAM,KAAA,GAAQ,CAAC,GAAG,KAAA,CAAM,KAAK,CAAA;AAC7B,UAAA,KAAA,MAAW,KAAA,IAAS,KAAK,OAAA,EAAS;AAChC,YAAA,KAAA,CAAM,KAAK,CAAA,GAAI,OAAA,CAAQ,MAAM,KAAK,CAAA,EAAG,SAAS,OAAO,CAAA;AAAA,UACvD;AACA,UAAA,IAAI,SAAA,GAAY,KAAA;AAChB,UAAA,IAAI,MAAA,EAAQ;AACV,YAAA,SAAA,GAAY,CAAC,GAAG,KAAK,CAAA;AACrB,YAAA,SAAA,CAAU,IAAA,CAAK,SAAS,CAAA,GAAI,OAAA,KAAY,SAAS,MAAA,GAAS,KAAA;AAAA,UAC5D;AACA,UAAA,MAAMC,OAAM,KAAA,CAAM,GAAA,CAAI,QAAA,CAAS,KAAA,EAAO,KAAK,IAAI,CAAA;AAC/C,UAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG;AAC5B,YAAA,KAAA,CAAM;AAAA,cACJ,KAAA;AAAA,cACA,GAAA,EAAAA,IAAAA;AAAA,cACA,KAAA,EAAO,SAAA;AAAA,cACP,KAAA;AAAA,cACA,OAAA,EAAS,cAAA,GAAiB,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,GAAO,SAAS,CAAA,GAAI,KAAA,CAAM;AAAA,aACjF,CAAA;AACD,YAAA;AAAA,UACF;AAKA,UAAA,IAAI,KAAA,GAA+D;AAAA,YACjE,EAAE,KAAA,EAAO,KAAA,EAAO,CAAA,EAAG,OAAA,EAAS,EAAC;AAAE,WACjC;AACA,UAAA,KAAA,MAAW,GAAA,IAAO,KAAK,MAAA,EAAQ;AAC7B,YAAA,IAAI,CAAC,YAAA,CAAa,GAAA,EAAK,OAAA,EAAS,KAAA,CAAM,KAAK,CAAA,EAAG;AAC9C,YAAA,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,KAAS;AAC9B,cAAA,IAAI,GAAA,CAAI,OAAA,KAAY,CAAA,IAAA,CAAM,IAAA,CAAK,KAAA,GAAQ,GAAA,CAAI,OAAA,MAAa,GAAA,CAAI,OAAA,EAAS,OAAO,CAAC,IAAI,CAAA;AACjF,cAAA,MAAM,OAAA,GAAU,GAAA,CAAI,SAAA,GAAY,CAAC,GAAG,KAAK,OAAA,EAAS,GAAA,CAAI,SAAS,CAAA,GAAI,IAAA,CAAK,OAAA;AACxE,cAAA,MAAM,KAAA,GAAQ,EAAE,KAAA,EAAO,IAAA,CAAK,KAAA,GAAQ,GAAA,CAAI,MAAA,EAAQ,KAAA,EAAO,IAAA,CAAK,KAAA,GAAQ,GAAA,CAAI,MAAA,EAAQ,OAAA,EAAQ;AACxF,cAAA,MAAM,KAAA,GAAQ,EAAE,GAAG,IAAA,EAAM,OAAO,IAAA,CAAK,KAAA,GAAQ,GAAA,CAAI,MAAA,EAAQ,KAAA,EAAO,IAAA,CAAK,KAAA,IAAS,CAAA,GAAI,IAAI,MAAA,CAAA,EAAQ;AAC9F,cAAA,OAAO,CAAC,OAAO,KAAK,CAAA,CAAE,OAAO,CAAC,IAAA,KAAS,IAAA,CAAK,KAAA,GAAQ,CAAC,CAAA;AAAA,YACvD,CAAC,CAAA;AAAA,UACH;AACA,UAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,YAAA,MAAM,KAAA,GAAQ,YAAY,IAAA,CAAK,KAAA;AAC/B,YAAA,KAAA,CAAM;AAAA,cACJ,KAAA;AAAA,cACA,GAAA,EAAK,KAAK,KAAA,KAAU,CAAA,GAAIA,OAAMA,IAAAA,CAAI,SAAA,CAAU,KAAK,KAAK,CAAA;AAAA,cACtD,KAAA,EAAO,SAAA;AAAA,cACP,OAAO,IAAA,CAAK,KAAA;AAAA,cACZ,OAAA,EAAS,MAAM,OAAA,CAAQ,GAAA;AAAA,gBAAI,CAAC,IAAA,EAAM,CAAA,KAChC,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAC,CAAA,GAAI,SAAA,GAAY,KAAA,GAAQ,IAAA,GAAO;AAAA;AACxD,aACD,CAAA;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAEA,MAAA,MAAA,GAAS,IAAA;AACT,MAAA,WAAA,CAAY,IAAA,CAAK,KAAK,IAAI,CAAA;AAAA,IAC5B,CAAC,CAAA;AACD,IAAA,WAAA,CAAY,GAAA,CAAI,IAAA,EAAM,EAAE,IAAA,EAAM,aAAa,CAAA;AAG3C,IAAA,MAAM,QAAA,uBAAe,GAAA,EAAoB;AACzC,IAAA,KAAA,MAAW,EAAA,IAAM,KAAK,SAAA,CAAU,IAAA,IAAQ,QAAA,CAAS,GAAA,CAAI,IAAI,CAAC,CAAA;AAC1D,IAAA,KAAA,MAAW,EAAA,IAAM,KAAK,YAAA,CAAa,IAAA,IAAQ,QAAA,CAAS,GAAA,CAAI,IAAI,CAAC,CAAA;AAC7D,IAAA,KAAA,MAAW,MAAM,IAAA,CAAK,YAAA,EAAc,QAAA,CAAS,GAAA,CAAI,IAAI,CAAC,CAAA;AAEtD,IAAA,IAAI,KAAA;AACJ,IAAA,KAAA,MAAW,KAAA,IAAS,MAAA,CAAO,MAAA,EAAO,EAAG;AACnC,MAAA,KAAA,GAAQ,QAAQ,KAAA,CAAM,GAAA,CAAI,KAAA,CAAM,GAAG,IAAI,KAAA,CAAM,GAAA;AAC7C,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,MAAA,KAAA,MAAW,CAAC,EAAA,EAAI,IAAI,CAAA,IAAK,KAAK,SAAA,EAAW;AACvC,QAAA,IAAI,KAAA,CAAM,KAAA,CAAM,IAAI,CAAA,KAAM,IAAA,EAAM;AAC9B,UAAA,QAAA,CAAS,IAAI,EAAA,EAAK,QAAA,CAAS,GAAA,CAAI,EAAE,IAAe,IAAI,CAAA;AAAA,QACtD;AAAA,MACF;AAEA,MAAA,KAAA,MAAW,CAAC,EAAA,EAAI,KAAK,CAAA,IAAK,KAAK,YAAA,EAAc;AAC3C,QAAA,IAAA,CAAM,MAAM,KAAA,CAAM,KAAK,CAAA,IAAK,CAAA,GAAK,OAAU,UAAA,EAAY;AACrD,UAAA,QAAA,CAAS,IAAI,EAAA,EAAK,QAAA,CAAS,GAAA,CAAI,EAAE,IAAe,IAAI,CAAA;AAAA,QACtD;AAAA,MACF;AACA,MAAA,IAAA,CAAK,YAAA,CAAa,OAAA,CAAQ,CAAC,EAAA,EAAI,CAAA,KAAM;AACnC,QAAA,QAAA,CAAS,GAAA,CAAI,IAAK,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA,GAAe,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,MAClE,CAAC,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,GAAA,GAAM,KAAA,IAAS,GAAA,CAAI,KAAA,CAAM,GAAG,GAAG,CAAA;AACrC,IAAA,MAAM,SAAA,GAAY,IAAI,IAAA,EAAK;AAC3B,IAAA,MAAM,mBAAmB,IAAA,CAAK,GAAA,CAAI,YAAY,CAAC,CAAA,GAAI,OAAO,SAAA,GAAY,CAAA;AAMtE,IAAA,IAAI,gBAAA,EAAkB;AACpB,MAAA,KAAA,MAAW,CAAC,IAAI,IAAI,CAAA,IAAK,UAAU,QAAA,CAAS,GAAA,CAAI,EAAA,EAAI,IAAA,GAAO,SAAS,CAAA;AAAA,IACtE;AAEA,IAAA,IAAA,CAAK,QAAA,GAAW;AAAA,MACd,GAAA,EAAK,gBAAA,GAAmB,GAAA,CAAI,SAAA,EAAU,GAAI,GAAA;AAAA,MAC1C;AAAA,KACF;AACA,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACd;AACF;AAYO,SAAS,IAAA,CACd,OAAA,GAAsC,EAAC,EACvC,MAAc,CAAA,EACR;AACN,EAAA,OAAO,IAAA,CAAK,IAAA;AAAA,IACV,EAAE,SAAS,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,GAAI,OAAA,GAAU,CAAC,OAAiB,CAAA,EAAE;AAAA,IAClE;AAAA,GACF;AACF;AAqBO,SAAS,MAAA,CAAO,EAAE,MAAA,EAAQ,GAAA,EAAI,EAA0C;AAC7E,EAAA,IAAI,CAAC,MAAA,CAAO,SAAA,CAAU,GAAG,CAAA,IAAK,MAAM,CAAA,EAAG;AACrC,IAAA,MAAM,IAAI,UAAA,CAAW,CAAA,kDAAA,EAAqD,GAAG,CAAA,CAAA,CAAG,CAAA;AAAA,EAClF;AAEA,EAAA,IAAI,MAAA,GAAS,KAAK,MAAM,CAAA;AACxB,EAAA,IAAI,UAAA,GAAa,MAAA,CAAO,SAAA,CAAU,CAAC,CAAA;AACnC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,EAAK,CAAA,EAAA,EAAK;AAC5B,IAAA,MAAM,OAAA,GAAU,CAAA,OAAA,EAAU,CAAA,GAAI,CAAC,CAAA,CAAA;AAC/B,IAAA,MAAA,GAAS,MAAA,CAAO,YAAY,CAAC,UAAU,GAAG,MAAA,EAAQ,EAAE,EAAA,EAAI,OAAA,EAAS,CAAA;AACjE,IAAA,UAAA,GAAa,OAAA;AAAA,EACf;AACA,EAAA,OAAO,MAAA;AACT","file":"index.js","sourcesContent":["/**\n * Simple LRU cache implementation\n */\n\nlet cachingEnabled = true;\n\n/**\n * Bumped each time caching is turned off. A cache created with `followsCachingToggle` empties\n * itself the next time it is touched after a bump, so no registry holds the caches alive.\n */\nlet cacheGeneration = 0;\n\n/**\n * Enable or disable the library's internal caches: the parse cache, the PMF convolution/power\n * cache, and the builder, die, roll, attack, save and check caches. While disabled those caches\n * store nothing and every lookup misses, and disabling empties them. Caches you construct\n * yourself are unaffected unless created with `followsCachingToggle`.\n */\nexport function setCachingEnabled(enabled: boolean): void {\n cachingEnabled = enabled;\n if (!enabled) cacheGeneration++;\n}\n\n/** Returns whether the library's internal caches are currently enabled. */\nexport function getCachingEnabled(): boolean {\n return cachingEnabled;\n}\n\nexport interface LRUCacheOptions<V> {\n /** Called with every value as it is stored, e.g. to freeze a shared result. */\n onInsert?: (value: V) => void;\n /**\n * Store and return nothing while {@link setCachingEnabled} has turned caching off, and empty\n * this cache when it does.\n */\n followsCachingToggle?: boolean;\n}\n\nexport class LRUCache<K, V> {\n private cache = new Map<K, V>();\n private readonly onInsert?: (value: V) => void;\n private readonly followsCachingToggle: boolean;\n private generation = cacheGeneration;\n\n /**\n * @param maxSize Entries kept before the least recently used is evicted. A capacity of 0 or\n * less (or NaN) makes the cache store nothing.\n */\n constructor(\n private readonly maxSize = 1000,\n options: LRUCacheOptions<V> = {}\n ) {\n this.onInsert = options.onInsert;\n this.followsCachingToggle = options.followsCachingToggle ?? false;\n }\n\n /** Drops the entries of a toggle-following cache when caching was turned off since last use. */\n private sync(): void {\n if (this.followsCachingToggle && this.generation !== cacheGeneration) {\n this.cache.clear();\n this.generation = cacheGeneration;\n }\n }\n\n private get storing(): boolean {\n this.sync();\n return this.maxSize > 0 && (cachingEnabled || !this.followsCachingToggle);\n }\n\n get(key: K): V | undefined {\n if (!this.storing) return undefined;\n const value = this.cache.get(key);\n if (value === undefined) return undefined;\n\n this.cache.delete(key);\n this.cache.set(key, value);\n return value;\n }\n\n delete(key: K): void {\n this.cache.delete(key);\n }\n\n set(key: K, value: V): this {\n if (!this.storing) return this;\n this.onInsert?.(value);\n this.cache.delete(key);\n if (this.cache.size >= this.maxSize) {\n const oldestKey = this.cache.keys().next().value;\n this.cache.delete(oldestKey as K);\n }\n this.cache.set(key, value);\n return this;\n }\n\n clear(): void {\n this.cache.clear();\n }\n\n get size(): number {\n this.sync();\n return this.cache.size;\n }\n\n has(key: K): boolean {\n return this.storing && this.cache.has(key);\n }\n\n keys(): IterableIterator<K> {\n this.sync();\n return this.cache.keys();\n }\n\n values(): IterableIterator<V> {\n this.sync();\n return this.cache.values();\n }\n}\n","/** Mapping from outcome label to probability mass or damage attribution. */\nexport type OutcomeLabelMap = Partial<Record<string, number>>;\n\n/** Computational epsilon for pruning negligible probabilities. */\nexport const EPS = 1e-12;\n\n/** A probability bin for a specific damage value. */\nexport interface Bin {\n /** Total probability mass at this damage value. */\n p: number;\n /** Per-outcome probability mass contributions at this damage. */\n count: OutcomeLabelMap;\n /** Optional per-outcome damage attribution at this damage. */\n attr?: OutcomeLabelMap;\n}\n\n/**\n * One homogeneous die-type's resolved shape within a damage pool — count of dice, faces per die,\n * and the per-die `minimum`/threshold-`reroll` that shape its resolved marginal (see\n * `RollBuilder.getSubRollConfigs()`). The raw material for `dice-match` trigger slicing.\n */\nexport interface DicePoolDescriptor {\n readonly count: number;\n readonly faces: number;\n readonly minimum: number;\n readonly reroll: number;\n}\n\n/**\n * Exact P(match | this branch's own final damage value = d) for a resolved hit/crit branch,\n * keyed by the SAME damage values the branch's PMF uses (post flat `modifier`, post crit\n * doubling) — so a consumer splits a PMF bin-by-bin with no sum/modifier bookkeeping of its own.\n */\nexport interface DiceMatchInfo {\n readonly matchProbabilityByDamage: ReadonlyMap<number, number>;\n}\n\n/**\n * Optional capability of a `dice-match`-eligible damage source (implemented by `AttackBuilder`):\n * exposes the exact per-branch match-probability breakdown needed to slice its hit/crit PMF into\n * matched / did-not-match halves. Absence (a bare `PMF`, a plain non-attack `RollBuilder`, or a\n * `null` branch — `noCrit()`, a parsed/pooled/`keep` source) is a defined \"no match slice\n * available\" state, not a crash: naming such a source in a `dice-match` trigger is a\n * `TurnSpecError`, not a silent zero.\n */\nexport interface HasDiceMatchInfo {\n diceMatchInfo(eps?: number): { hit: DiceMatchInfo | null; crit: DiceMatchInfo | null };\n}\n\nexport interface CritConfig {\n critThreshold: number;\n}\n\n/** Simple mapping from damage value to probability. */\nexport type DamageDistribution = Record<number, number>;\n/** Canonical outcome labels supported by the query helpers. */\nexport type OutcomeType =\n | \"crit\"\n | \"hit\"\n | \"missNone\"\n | \"missDamage\"\n | \"saveHalf\"\n | \"saveFail\"\n | \"pc\";\n\nexport type Rounding = \"none\" | \"floor\" | \"round\" | \"ceil\";\n\n/** How a d20 attack roll resolves: single die, keep-highest of 2/3, or keep-lowest of 2. */\nexport type RollType = \"flat\" | \"advantage\" | \"disadvantage\" | \"elven accuracy\";\n\n/**\n * P(critical hit) for the given crit window and d20 {@link RollType}.\n *\n * `critRange` is the number of top faces that crit (1 for a natural 20, 2 for\n * 19–20, …), so a single die crits with probability `critRange / 20`. Advantage\n * rolls two d20s / elven accuracy three, keeping the best; disadvantage keeps\n * the worst of two.\n */\nexport function critProbability(critRange: number, rollType: RollType = \"flat\"): number {\n const base = critRange / 20;\n switch (rollType) {\n case \"advantage\":\n return 1 - (1 - base) ** 2;\n case \"elven accuracy\":\n return 1 - (1 - base) ** 3;\n case \"disadvantage\":\n return base ** 2;\n case \"flat\":\n default:\n return base;\n }\n}\n\n/**\n * The canonical \"clean miss\" outcome — a point of zero damage with no rider.\n * This is the {@link OutcomeType} that attribution charts and outcome stats key\n * on, and is distinct from the builder's attack-resolution `miss` weight label.\n */\nexport const MISS_NONE_OUTCOME: OutcomeType = \"missNone\";\n\n/**\n * All outcome types in canonical severity order — clean miss → crit. This is\n * also the natural stacking order for attribution charts (least- to\n * most-impactful, bottom → top). Enumerates every {@link OutcomeType} exactly\n * once; use it instead of hand-maintained per-consumer outcome tables.\n */\nexport const ALL_OUTCOME_TYPES: OutcomeType[] = [\n \"missNone\",\n \"missDamage\",\n \"saveFail\",\n \"saveHalf\",\n \"pc\",\n \"hit\",\n \"crit\",\n];\n\n/**\n * Outcome types in display order for stats / breakdown rows — most prominent\n * first (crit, hit, …) down to the clean miss.\n */\nexport const OUTCOME_DISPLAY_ORDER: OutcomeType[] = [\n \"crit\",\n \"hit\",\n \"missDamage\",\n \"saveHalf\",\n \"saveFail\",\n \"pc\",\n \"missNone\",\n];\n\n/**\n * Sort outcome labels by a canonical order (defaults to {@link ALL_OUTCOME_TYPES}).\n * Labels not present in `order` sort after known ones, alphabetically — so\n * ad-hoc/test labels outside the {@link OutcomeType} union stay stable.\n */\nexport function sortOutcomes<T extends string>(\n outcomes: Iterable<T>,\n order: readonly string[] = ALL_OUTCOME_TYPES\n): T[] {\n const rank = new Map(order.map((o, i) => [o, i]));\n return [...outcomes].sort((a, b) => {\n const ra = rank.get(a);\n const rb = rank.get(b);\n if (ra !== undefined && rb !== undefined) return ra - rb;\n if (ra !== undefined) return -1;\n if (rb !== undefined) return 1;\n return a.localeCompare(b);\n });\n}\n\nexport const onAnyHit: OutcomeType[] = [\"hit\", \"crit\"];\nexport const onCritOnly: OutcomeType[] = [\"crit\"];\nexport const onHitOnly: OutcomeType[] = [\"hit\"];\nexport const onMissOnly: OutcomeType[] = [\"missNone\", \"missDamage\"];\nexport const onMissDamageOnly: OutcomeType[] = [\"missDamage\"];\nexport const onSaveHalfOnly: OutcomeType[] = [\"saveHalf\"];\nexport const onSaveFailOnly: OutcomeType[] = [\"saveFail\"];\nexport const onPotentCantripOnly: OutcomeType[] = [\"pc\"];\n","import type { OutcomeType } from \"../common/types\";\nimport { ALL_OUTCOME_TYPES, EPS } from \"../common/types\";\nimport { PMF } from \"./pmf\";\nimport type { DamageAttributionChartModel } from \"./pmf\";\n\n/**\n * Query interface for analyzing dice roll probability distributions.\n *\n * Combines multiple attack PMFs and provides statistical analysis methods for:\n * - Basic statistics (mean, variance, min/max, percentiles)\n * - Probability queries (hit chances, success rates, exact counts)\n * - Damage analysis (ranges by outcome type, expected values)\n * - Data export (charts, tables, visualizations)\n *\n */\n\nexport class DiceQuery {\n public readonly singles: PMF[];\n private readonly _eps: number;\n private readonly _combinedProvided: boolean;\n private _combined?: PMF;\n private _combinedWithAttr?: PMF;\n\n constructor(singles: PMF | PMF[], combined?: PMF, eps = EPS) {\n this.singles = Array.isArray(singles) ? singles : [singles];\n if (this.singles.some((s) => s === undefined)) {\n throw new Error(\"DiceQuery contains undefined singles\");\n }\n this._eps = eps;\n // When the caller supplies an explicit combined distribution that may not\n // equal convolve(singles), the additive closed-form moments would describe\n // a different distribution than cdf/percentiles. Track this so mean()/\n // variance() can fall back to the provided combined and stay consistent.\n this._combinedProvided = combined !== undefined;\n if (combined !== undefined) {\n this._combined =\n Math.abs(combined.mass() - 1) <= eps ? combined : combined.normalize();\n }\n }\n\n /**\n * The combined damage distribution of all single PMFs (their convolution),\n * normalized to total probability 1.\n *\n * Computed lazily on first access and cached. Queries that only need\n * additive statistics — {@link DiceQuery.mean}, {@link DiceQuery.variance},\n * {@link DiceQuery.stddev} — never trigger this convolution.\n */\n get combined(): PMF {\n if (this._combined === undefined) {\n const c = PMF.convolveMany(this.singles);\n this._combined =\n Math.abs(c.mass() - 1) <= this._eps ? c : c.normalize();\n }\n return this._combined;\n }\n\n private static readonly DEFAULT_OUTCOMES: readonly OutcomeType[] = [\n \"hit\",\n \"crit\",\n \"missNone\",\n ] as const;\n\n /**\n * Returns a new PMF with damage attribution metadata populated.\n *\n * This method computes attribution on-demand for builder-generated PMFs,\n * enabling them to work with damage attribution charts. The `attr` field\n * tracks how much damage each outcome type contributes at each damage value.\n *\n * For each bin at damage D: sum(attr.values()) ≈ D × P(damage = D)\n *\n * Performance: Cached after first call. Adds minimal overhead vs `combined`.\n *\n * @returns PMF with attr field populated for damage attribution charts\n *\n * @example\n * const attack = d20.plus(5).ac(15).onHit(d(2,6).plus(3)).onCrit(d(2,6))\n * const query = attack.toQuery()\n * const pmf = query.combinedWithAttribution()\n * // Now pmf can be used with attributionByValue() / damageAttributionChartModel()\n */\n combinedWithAttribution(): PMF {\n if (this._combinedWithAttr) {\n return this._combinedWithAttr;\n }\n\n // An explicitly provided `combined` is NOT the convolution of `singles` —\n // a Turn's exact joint distribution, for instance, is narrower than the\n // independent product because riders correlate with their sources.\n // Re-convolving would silently discard it (and drop the riders' damage\n // entirely), so attribute the provided distribution itself.\n if (this._combinedProvided) {\n this._combinedWithAttr = this.combined.withAttribution();\n return this._combinedWithAttr;\n }\n\n // Fast path: if every single already carries attribution (as parser-\n // generated PMFs do), the attributed convolution is bit-for-bit identical\n // to `combined` — reuse it instead of convolving a second time.\n if (this.singles.every((pmf) => pmf.hasAttribution())) {\n this._combinedWithAttr = this.combined;\n return this._combinedWithAttr;\n }\n\n // Otherwise (e.g. builder-generated PMFs that only carry `count`), add\n // attribution to each single PMF, then convolve.\n const singlesWithAttr = this.singles.map((pmf) => pmf.withAttribution());\n const combined = PMF.convolveMany(singlesWithAttr, this.combined.epsilon);\n\n // Normalize if needed\n const normalized =\n Math.abs(combined.mass() - 1) <= this.combined.epsilon\n ? combined\n : combined.normalize();\n\n this._combinedWithAttr = normalized;\n return normalized;\n }\n\n /**\n * Per-label `damage value → probability mass` series for the combined,\n * attribution-carrying distribution — the provenance core of the stacked\n * damage-attribution chart. Convenience for\n * `combinedWithAttribution().attributionByValue()`; see\n * {@link PMF.attributionByValue}.\n */\n attributionByValue(): Map<string, Map<number, number>> {\n return this.combinedWithAttribution().attributionByValue();\n }\n\n /**\n * Full numeric model for the stacked damage-attribution chart. Convenience for\n * `combinedWithAttribution().damageAttributionChartModel(options)`; see\n * {@link PMF.damageAttributionChartModel}.\n */\n damageAttributionChartModel(options?: {\n maxBuckets?: number;\n stackOrder?: readonly string[];\n epsilon?: number;\n }): DamageAttributionChartModel {\n return this.combinedWithAttribution().damageAttributionChartModel(options);\n }\n\n /**\n * How many of the independent single PMFs can produce the given outcome\n * label. Useful for \"all of them succeeded\" style probabilities where the\n * exponent is the number of contributing attacks (see\n * {@link DiceQuery.probExactlyK}).\n */\n countSinglesWith(label: string): number {\n let count = 0;\n for (const single of this.singles) {\n if (single.hasOutcome(label)) count++;\n }\n return count;\n }\n\n /**\n * Returns the expected damage across all possible outcomes.\n *\n * Example: `query.mean()` → 12.5\n * Use case: \"What's my average damage per round?\"\n */\n mean(): number {\n // If the caller supplied a combined distribution that may diverge from\n // convolve(singles), report its mean so mean() stays consistent with\n // cdf/percentiles/min/max (which all read `combined`).\n if (this._combinedProvided) {\n let m = 0;\n for (const [damageValue, bin] of this.combined) m += damageValue * bin.p;\n return m;\n }\n // Expectation is additive over independent attacks: E[Σ Xᵢ] = Σ E[Xᵢ].\n // Computing it directly from the singles avoids building `combined`.\n let totalMean = 0;\n for (const single of this.singles) {\n const mass = single.mass();\n if (mass <= 0) continue;\n // Match `combined`'s semantics: only divide by mass when it is not\n // already 1 (within eps), so an already-normalized single is bit-exact.\n totalMean +=\n Math.abs(mass - 1) <= this._eps ? single.mean() : single.mean() / mass;\n }\n return totalMean;\n }\n\n /**\n * Returns the variance of the damage distribution.\n *\n * Example: `query.variance()` → 45.2\n * Use case: \"How much does my damage vary from the average?\"\n * High variance means higher risk/reward. Lower variance means more consistent damage.\n */\n variance(): number {\n // Consistent with mean(): if a (possibly divergent) combined was provided,\n // compute the variance of that distribution directly.\n if (this._combinedProvided) {\n const mu = this.mean();\n let v = 0;\n for (const [damageValue, bin] of this.combined) {\n const dev = damageValue - mu;\n v += dev * dev * bin.p;\n }\n return v;\n }\n // Variance is additive over independent attacks: Var[Σ Xᵢ] = Σ Var[Xᵢ].\n // Use the centered form per single (E[(X−μ)²]) rather than E[X²]−μ², which\n // suffers catastrophic cancellation when damage has a large constant offset.\n let totalVariance = 0;\n for (const single of this.singles) {\n const mass = single.mass();\n if (mass <= 0) continue;\n if (Math.abs(mass - 1) <= this._eps) {\n // PMF.variance() is the centered, cached, mass-1 variance.\n totalVariance += single.variance();\n } else {\n // Normalized centered variance of a non-unit-mass single.\n let mu = 0;\n for (const [d, b] of single) mu += d * (b.p / mass);\n let v = 0;\n for (const [d, b] of single) {\n const dev = d - mu;\n v += dev * dev * (b.p / mass);\n }\n totalVariance += v;\n }\n }\n return totalVariance;\n }\n\n /**\n * Returns the standard deviation of the damage distribution.\n *\n * Example: `query.stdev()` → 6.7\n * Use case: \"What's the typical spread around my average damage?\"\n * Used to determine how consistent the damage is.\n */\n stddev(): number {\n return Math.sqrt(this.variance());\n }\n\n /** Alias of {@link DiceQuery.stddev}, matching {@link PMF.stdev}. */\n stdev(): number {\n return this.stddev();\n }\n\n /**\n * Returns the Cumulative Distribution Function.\n */\n cdf(x: number): number {\n return this.probTotalAtMost(x);\n }\n\n /**\n * Returns the probability of dealing X damage or less.\n * In statistics, this is called the cumulative distribution function (CDF).\n * Example: `query.cdf(20)` → 0.75\n * Use case: \"What's the chance I deal 20 damage or less?\"\n */\n probTotalAtMost(x: number): number {\n let cumulativeProbability = 0;\n for (const [damageValue, probabilityBin] of this.combined) {\n if (damageValue <= x) {\n cumulativeProbability += probabilityBin.p;\n }\n }\n return cumulativeProbability;\n }\n\n /**\n * Returns the Complementary Cumulative Distribution Function.\n */\n ccdf(x: number): number {\n return this.probTotalAtLeast(x);\n }\n\n /**\n * Returns the probability of dealing at least X damage.\n *\n * Example: `query.probTotalAtLeast(25)` → 0.35\n * Use case: \"What's the chance I deal at least 25 damage to finish the enemy?\"\n */\n probTotalAtLeast(threshold: number): number {\n let probabilitySum = 0;\n for (const [damageValue, probabilityBin] of this.combined) {\n if (damageValue >= threshold) {\n probabilitySum += probabilityBin.p;\n }\n }\n return probabilitySum;\n }\n\n /**\n * Returns damage values at specific percentiles: for each p, the smallest damage x with\n * P(total ≤ x) ≥ p, exact at CDF boundaries (see {@link PMF.quantile}).\n *\n * Example: `query.percentiles([0.25, 0.5, 0.75])` → [8, 12, 18]\n * Use case: \"What are my 25th, 50th, and 75th percentile damage values?\"\n */\n percentiles(percentileValues: number[]): number[] {\n return percentileValues.map((p) => this.combined.quantile(p));\n }\n\n /**\n * Returns the minimum possible damage.\n *\n * Example: `query.min()` → 0\n * Use case: \"What's the worst-case damage if everything misses?\"\n */\n min(): number {\n return this.combined.min();\n }\n\n /**\n * Returns the maximum possible damage.\n *\n * Example: `query.max()` → 56\n * Use case: \"What's the best-case damage if everything crits and rolls max?\"\n */\n max(): number {\n return this.combined.max();\n }\n\n private singleProb(diceIndex: number, label: OutcomeType): number {\n const single = this.singles[diceIndex];\n let probabilitySum = 0;\n for (const [, probabilityBin] of single) {\n probabilitySum += probabilityBin.count[label] || 0;\n }\n // Return the conditional per-event probability. Dividing by the single's\n // mass keeps the result in [0,1] for a non-normalized single (e.g. one that\n // has been scaled), so probAtLeastOne / the binomial DP stay mass-invariant.\n const mass = single.mass();\n return mass > 0 ? probabilitySum / mass : 0;\n }\n\n /**\n * Full count distribution [P(0), P(1), …, P(n)] for \"an attack succeeds if it\n * carries ANY of `labels`\", over the n independent singles.\n *\n * Each single's per-event success probability is the Poisson-binomial\n * marginal P(≥1 of labels) from {@link probabilityOf} (i.e. probAtLeastOne),\n * computed exactly once. The binomial DP then runs once to produce the whole\n * distribution, so the array-label paths of probExactlyK / probAtLeastK /\n * probAtMostK can slice or sum from it instead of rebuilding a DiceQuery and\n * re-running the DP per requested k.\n */\n private countDistribution(labels: OutcomeType[]): number[] {\n const n = this.singles.length;\n const successProbabilities = this.singles.map((single) =>\n new DiceQuery([single]).probabilityOf(labels)\n );\n\n const dist = new Array(n + 1).fill(0);\n dist[0] = 1;\n for (const successProb of successProbabilities) {\n for (let outcomeCount = n; outcomeCount >= 1; outcomeCount--) {\n dist[outcomeCount] =\n dist[outcomeCount] * (1 - successProb) +\n dist[outcomeCount - 1] * successProb;\n }\n dist[0] *= 1 - successProb;\n }\n return dist;\n }\n\n probAtLeastK(labels: OutcomeType | OutcomeType[], k: number): number {\n const L = Array.isArray(labels) ? [...new Set(labels)] : [labels];\n const n = this.singles.length;\n\n if (k <= 0) return 1;\n if (k > n) return 0;\n\n // Sum the upper tail of the single, shared count distribution rather than\n // calling probExactlyK (which rebuilt the distribution) once per i.\n const dist = this.countDistribution(L);\n let tail = 0;\n for (let i = k; i <= n; i++) {\n tail += dist[i];\n }\n\n if (tail < 0) return 0;\n if (tail > 1) return 1;\n return tail;\n }\n\n /**\n * Returns the probability that at least one attack has the specified outcome(s).\n * - This is the complement of probAtMostK(labels, 0)\n *\n * Examples:\n * - `query.probAtLeastOne('hit')` → 0.88 (88% chance at least one attack hits)\n * - `query.probAtLeastOne(['hit', 'crit'])` → 0.96 (96% chance at least one succeeds)\n *\n * Use cases:\n * - \"What's the chance at least one of my attacks connects?\"\n *\n * Note:\n *\n * - You have to pass in an array of labels to avoid double-counting if you are\n * using multiple labels. You cannot just add them. A label listed twice counts once.\n */\n probAtLeastOne(labels: OutcomeType | OutcomeType[]): number {\n const distinctLabels = typeof labels === \"string\" ? [labels] : [...new Set(labels)];\n\n let productOfNonOccurrence = 1;\n for (let diceIndex = 0; diceIndex < this.singles.length; diceIndex++) {\n // Calculate total probability of any of the specified labels occurring.\n // Clamp to [0,1] so floating-point drift in the per-attack sum cannot push\n // the complement out of range.\n let combinedProbability = 0;\n for (const label of distinctLabels) {\n combinedProbability += this.singleProb(diceIndex, label);\n }\n if (combinedProbability < 0) combinedProbability = 0;\n else if (combinedProbability > 1) combinedProbability = 1;\n productOfNonOccurrence *= 1 - combinedProbability;\n }\n const result = 1 - productOfNonOccurrence;\n return result < 0 ? 0 : result > 1 ? 1 : result;\n }\n\n /**\n * Computes binomial probabilities for exactly 0, 1, 2, ..., maxK occurrences of a label.\n *\n * Uses dynamic programming to efficiently calculate the probability distribution\n * of how many attacks will have the specified outcome, accounting for different\n * success probabilities across individual attacks.\n *\n * Example: For 3 attacks with 50% hit chance each, returns:\n * [0.125, 0.375, 0.375, 0.125] = [P(0 hits), P(1 hit), P(2 hits), P(3 hits)]\n *\n * @param label - The outcome type to count\n * @param maxK - Maximum number of occurrences to calculate (usually number of attacks)\n * @returns Array where index K contains P(exactly K attacks have the label)\n */\n private computeBinomialProbabilities(\n label: OutcomeType,\n maxK: number\n ): number[] {\n const individualProbabilities = this.singles.map((_, diceIndex) =>\n this.singleProb(diceIndex, label)\n );\n const binomialProbs = new Array(maxK + 1).fill(0);\n binomialProbs[0] = 1;\n\n for (const singleProbability of individualProbabilities) {\n for (let outcomeCount = maxK; outcomeCount >= 1; outcomeCount--) {\n binomialProbs[outcomeCount] =\n binomialProbs[outcomeCount] * (1 - singleProbability) +\n binomialProbs[outcomeCount - 1] * singleProbability;\n }\n binomialProbs[0] *= 1 - singleProbability;\n }\n\n return binomialProbs;\n }\n\n /**\n * Returns the probability that exactly K attacks result in the specified outcome(s).\n *\n * Single label examples:\n * - probExactlyK('hit', 2) = probability exactly 2 attacks hit\n * - probExactlyK('crit', 1) = probability exactly 1 attack crits\n * - probExactlyK('crit', 0) = probability no attacks crit\n *\n * Array examples:\n * - probExactlyK(['hit', 'crit'], 2) = probability exactly 2 attacks succeed\n * - probExactlyK(['hit', 'crit'], 1) = probability exactly 1 attack succeeds\n * - probExactlyK(['missDamage', 'missNone'], 0) = probability no attacks miss\n *\n * Use cases:\n * - \"What's the chance exactly one of my attacks hits?\"\n * - \"How likely am I to get exactly 2 successes out of 3 attacks?\"\n * - \"What's the probability that exactly half my attacks succeed?\"\n *\n * Note: For arrays, an attack counts as a \"success\" if it has any of the specified labels,\n * as in probAtLeastK and probAtMostK. A negative k has probability 0.\n */\n probExactlyK(labels: OutcomeType | OutcomeType[], k: number): number {\n if (k < 0) return 0;\n // Handle single label case (backward compatibility)\n if (typeof labels === \"string\") {\n const probabilityArray = this.computeBinomialProbabilities(labels, k);\n return probabilityArray[k];\n }\n\n // For multiple labels, derive P(exactly k) from the single shared count\n // distribution. (k > n is impossible, so index out of range reads as 0.)\n const dist = this.countDistribution(labels);\n return k >= 0 && k < dist.length ? dist[k] : 0;\n }\n\n /**\n * Returns the probability that AT MOST K attacks result in the specified outcome(s).\n *\n * Single label examples:\n * - probAtMostK('hit', 1) = probability 0 or 1 attacks hit (at most 1)\n * - probAtMostK('crit', 0) = probability no attacks crit\n * - probAtMostK('missDamage', 2) = probability at most 2 attacks miss\n *\n * Array examples:\n * - probAtMostK(['hit', 'crit'], 1) = probability at most 1 attack succeeds\n * - probAtMostK(['hit', 'crit'], 0) = probability no attacks succeed (all miss)\n *\n * Use cases:\n * - \"What's the chance that at most one attack hits?\" (rest miss)\n * - \"How likely am I to have mostly failures?\" (at most 1 success)\n * - \"What's the probability of a really bad turn?\" (at most 0 successes)\n *\n */\n probAtMostK(labels: OutcomeType | OutcomeType[], k: number): number {\n // Handle single label case (backward compatibility)\n if (typeof labels === \"string\") {\n const probabilityArray = this.computeBinomialProbabilities(labels, k);\n let cumulativeSum = 0;\n for (let outcomeCount = 0; outcomeCount <= k; outcomeCount++) {\n cumulativeSum += probabilityArray[outcomeCount];\n }\n return cumulativeSum;\n }\n\n // For multiple labels, sum the lower tail of the single shared count\n // distribution rather than recomputing it per outcomeCount.\n const dist = this.countDistribution(labels);\n const upper = Math.min(k, dist.length - 1);\n let cumulativeSum = 0;\n for (let outcomeCount = 0; outcomeCount <= upper; outcomeCount++) {\n cumulativeSum += dist[outcomeCount];\n }\n return cumulativeSum;\n }\n\n /**\n * Returns the expected damage attributed to specific outcome types.\n *\n * Single label examples:\n * - expectedDamageFrom('hit') = expected damage from hit components\n * - expectedDamageFrom('crit') = expected damage from crit components\n *\n * Array examples:\n * - expectedDamageFrom(['hit', 'crit']) = expected damage from any success\n * - expectedDamageFrom(['missDamage', 'missNone']) = expected damage from misses\n *\n * Use cases:\n * - \"How much damage do I expect from successful attacks?\"\n * - \"What's the damage contribution from critical hits specifically?\"\n * - \"How much damage comes from miss effects (like save-for-half spells)?\"\n *\n * A single whose mass is not 1 is normalized exactly as {@link mean} normalizes it, so the\n * contributions of labels that cover every outcome add up to `mean()`. A label listed twice\n * counts once.\n */\n expectedDamageFrom(labels: OutcomeType | OutcomeType[]): number {\n const wanted = Array.isArray(labels) ? [...new Set(labels)] : [labels];\n\n let total = 0;\n // By linearity of expectation, sum the wanted-label damage over each single PMF directly,\n // avoiding the `count` aggregation issues a merged PMF would introduce.\n for (const single of this.singles) {\n const mass = single.mass();\n if (mass <= 0) continue;\n let contribution = 0;\n for (const [dmg, bin] of single) {\n let p = 0;\n for (const label of wanted) p += bin.count[label] ?? 0;\n contribution += dmg * p;\n }\n total += Math.abs(mass - 1) <= this._eps ? contribution : contribution / mass;\n }\n return total;\n }\n\n /**\n * Returns damage statistics for scenarios where AT LEAST ONE attack results in\n * the specified outcome(s).\n *\n * This method answers \"What happens when things go reasonably well?\" rather than\n * \"What's the theoretical maximum?\" It includes mixed scenarios which are more\n * common and tactically relevant than pure scenarios.\n *\n * Single label examples:\n * - damageStatsFrom('hit') = damage range when at least one attack hits\n * - damageStatsFrom('crit') = damage range when at least one attack crits\n *\n * Array examples:\n * - damageStatsFrom(['hit', 'crit']) = damage range when at least one attack succeeds\n * - damageStatsFrom(['missDamage', 'missNone']) = damage range when at least one attack misses\n *\n * Tactical Use Cases:\n * - \"Given that I don't completely whiff (99% of turns), what damage should I expect?\"\n * - \"When planning to kill a 60 HP enemy, what's my damage range on successful turns?\"\n * - \"Should I use this risky spell if it has good damage when it works?\"\n * - \"What's my damage potential when something goes right?\" (vs pure failure)\n *\n * Combat Planning Examples:\n * - 4 attacks with 90% hit chance: \"96% of the time you'll do 25-150 damage, avg 52\"\n * (Much more useful than \"You average 50 damage including complete misses\")\n * - Risk assessment: \"80% of successful turns do 40-80 damage, but 20% do 80-150\"\n * - Resource management: \"If I hit anything, I'll likely finish this enemy\"\n *\n * Statistical Note:\n * This includes mixed scenarios (2 hits + 1 crit, 3 hits + 1 miss, etc.) which\n * occur far more frequently than pure scenarios. For pure scenarios, use combinedDamageStats.\n *\n * KNOWN LIMITATION (multi-attack, single label): the returned `count` is an\n * EXPECTED COUNT (E[#label], so > 1 for N≥2 attacks, not a probability), and\n * `avg` is the size-biased conditional mean E[dmg·#label]/E[#label] rather than\n * E[dmg | the label occurs]. For a single attack both are the plain\n * conditional figures. Use {@link probAtLeastOne} for the scenario probability.\n *\n * @example\n * // High-level tactical planning\n * const successStats = query.damageStatsFrom('hit')\n * const successChance = query.probAtLeastOne('hit')\n * console.log(`${(successChance*100).toFixed(1)}% chance to do ${successStats.min}-${successStats.max} damage`)\n */\n damageStatsFrom(labels: OutcomeType | OutcomeType[]): {\n min: number;\n max: number;\n avg: number;\n count: number;\n } {\n // Normalize input to array for uniform handling\n const labelArray = typeof labels === \"string\" ? [labels] : labels;\n\n let minDamage = Infinity;\n let maxDamage = -Infinity;\n let totalDamage = 0;\n let totalCount = 0;\n\n for (const [damage, probabilityBin] of this.combined) {\n // Check if this bin has any of the specified labels\n let binHasAnyLabel = false;\n let binContribution = 0;\n\n for (const label of labelArray) {\n const count = probabilityBin.count[label] as number;\n if (count && count > 0) {\n binHasAnyLabel = true;\n binContribution += count;\n }\n }\n\n if (damage > 0 && binHasAnyLabel) {\n minDamage = Math.min(minDamage, damage);\n maxDamage = Math.max(maxDamage, damage);\n\n // For single labels, use the specific count; for multiple labels, use total probability\n const weightToUse =\n labelArray.length === 1 ? binContribution : probabilityBin.p;\n totalDamage += damage * weightToUse;\n totalCount += weightToUse;\n }\n }\n\n return {\n min: minDamage === Infinity ? 0 : minDamage,\n max: maxDamage === -Infinity ? 0 : maxDamage,\n avg: totalCount > 0 ? totalDamage / totalCount : 0,\n count: totalCount,\n };\n }\n\n /**\n * Returns damage statistics for scenarios where ALL attacks result in the specified\n * outcome, calculated by leveraging the pure partition of singles.\n *\n * This method answers \"What's the theoretical best/worst case?\" and \"What are the\n * clean mathematical boundaries?\" It provides pure scenarios without mixing outcomes.\n *\n * Examples:\n * - combinedDamageStats('hit') = damage range when all attacks hit (none crit, none miss)\n * - combinedDamageStats('crit') = damage range when all attacks crit (none just hit)\n *\n * UI and Display Use Cases:\n * - Statistics panels showing \"MAX Hit Damage\" (users expect pure hits, not mixed)\n * - \"Best case scenario\" vs \"worst case scenario\" analysis\n * - Mathematical verification: \"Does our hit damage calculation match manual math?\"\n * - Clean damage type attribution: \"How much comes from base hits vs crits?\"\n *\n * Design and Balance Use Cases:\n * - Game designers: \"What's the damage ceiling if someone gets lucky?\"\n * - Character optimization: \"What's my absolute maximum potential?\"\n * - Ability comparison: \"Which build has higher crit ceiling?\"\n * - Minimum guaranteed damage: \"What's the worst I can do if everything hits?\"\n *\n * Mathematical Use Cases:\n * - Validating complex calculations against simple manual math\n * - Understanding damage component contributions in isolation\n * - Separating luck (crit variance) from consistency (hit variance)\n * - Building intuition about damage sources\n *\n * When to Use This vs damageStatsFrom():\n * - Use THIS for: UI max/min displays, theoretical limits, clean comparisons\n * - Use damageStatsFrom() for: tactical planning, realistic expectations, mixed scenarios\n *\n * Statistical Note:\n * Pure scenarios (all hits, all crits) are rare but represent clear mathematical\n * boundaries. These stats help understand the \"shape\" of your damage potential.\n *\n * @example\n * // UI display logic\n * const pureHitMax = query.combinedDamageStats('hit').max // Clean \"MAX Hit Damage: 90\"\n * const pureCritMax = query.combinedDamageStats('crit').max // Clean \"MAX Crit Damage: 168\"\n *\n * // vs tactical planning (use damageStatsFrom instead)\n * const realisticRange = query.damageStatsFrom('hit') // Includes mixed scenarios\n */\n combinedDamageStats(targetLabel: OutcomeType): {\n min: number;\n max: number;\n avg: number;\n count: number;\n } {\n // Get pure statistics from each single attack (singles are already pure partitions)\n const singleStats = this.singles.map((single) =>\n new DiceQuery([single]).damageStatsFrom(targetLabel)\n );\n\n // If any single attack has no outcomes of this type, return zeros\n if (singleStats.some((stats) => stats.count === 0)) {\n return { min: 0, max: 0, avg: 0, count: 0 };\n }\n\n // Calculate combined statistics for N attacks all of target type\n const combinedMin = singleStats.reduce((sum, stats) => sum + stats.min, 0);\n const combinedMax = singleStats.reduce((sum, stats) => sum + stats.max, 0);\n const combinedAvg = singleStats.reduce((sum, stats) => sum + stats.avg, 0);\n const combinedProb = singleStats.reduce(\n (product, stats) => product * stats.count,\n 1\n );\n\n return {\n min: combinedMin,\n max: combinedMax,\n avg: combinedAvg,\n count: combinedProb,\n };\n }\n\n /**\n * Returns the probability that at least one attack carries ANY of the\n * specified labels (the marginal P(≥1) across the independent attacks).\n *\n * Examples:\n * - `query.probabilityOf('hit')` → 0.88 (probability at least one hit occurs)\n * - `query.probabilityOf(['hit', 'crit'])` → 0.96 (probability of any success)\n *\n * Use cases:\n * - \"What's the chance my resolution includes a success label?\"\n * - \"How likely am I to get any hits or crits across all attacks?\"\n *\n * Note: this must NOT be computed by summing `combined` bin probabilities. A\n * single combined damage total is reachable by many outcome combinations and\n * a bin can hold several labels at once, so summing `bin.p` over bins that\n * contain a label over-counts. The correct marginal is the Poisson-binomial\n * complement over the per-attack probabilities, i.e. {@link probAtLeastOne}.\n */\n probabilityOf(labels: OutcomeType | OutcomeType[]): number {\n return this.probAtLeastOne(labels);\n }\n\n /**\n * Returns the probability that at least one attack misses (either kind of miss:\n * `missNone` or `missDamage`). For a single attack this is its miss chance.\n *\n * Example: `query.missChance()` → 0.45\n * Use case: \"What's the chance I miss at least once this turn?\"\n *\n * For the chance that every attack misses, use\n * `probExactlyK([\"missNone\", \"missDamage\"], n)` with n attacks, or\n * `probAtMostK([\"hit\", \"crit\"], 0)`.\n */\n missChance(): number {\n // Miss can be either explicit misses with damage or zero-damage misses\n return this.probabilityOf([\"missDamage\", \"missNone\"]);\n }\n\n /**\n * Returns data formatted for plotting damage probability distribution.\n *\n * Example: `query.toChartSeries()` → [{x: 0, y: 0.04}, {x: 6, y: 0.1}, ...]\n * Use case: \"I want to visualize my damage distribution in a chart.\"\n */\n toChartSeries(): Array<{ x: number; y: number }> {\n return this.combined.support().map((damageValue) => ({\n x: damageValue,\n y: this.combined.map.get(damageValue)!.p,\n }));\n }\n\n /**\n * Returns tabular data showing damage values and their probability breakdowns.\n *\n * Example: `query.toLabeledTable(['hit', 'crit'])` →\n * [{damage: 6, total: 0.01, hit: 0.008, crit: 0}, ...]\n *\n * Use case: \"I want to see exactly how hit/crit probabilities contribute to each damage value.\"\n */\n toLabeledTable(\n labels: OutcomeType[] = []\n ): Array<{ damage: number; total: number } & Record<string, number>> {\n return this.combined.support().map((damageValue) => {\n const probabilityBin = this.combined.map.get(damageValue)!;\n const tableRow: { damage: number; total: number } & Record<\n string,\n number\n > = {\n damage: damageValue,\n total: probabilityBin.p,\n };\n for (const outcomeLabel of labels) {\n tableRow[outcomeLabel] = probabilityBin.count[outcomeLabel] || 0;\n }\n return tableRow;\n });\n }\n\n /**\n * Returns data for stacked charts with unconditional per-label probability mass per damage.\n *\n * - Each dataset value equals the unconditional probability mass for that label at that damage\n * (i.e., `bin.count[label]`).\n * - Column sums may be less than the total probability `bin.p` when you omit labels or when\n * there is unlabeled mass. Include all relevant outcome labels if you need the sum to match.\n * - This behavior matches tests that expect raw per-label mass (not proportional scaling).\n * - NOTE: This implementation may break dprcalc.com chart binning at large n, need to test it more.\n *\n * @example\n * query.toStackedChartData(['hit', 'crit'])\n * // → {labels: [0, 6, 12, ...], datasets: [{label: 'hit', data: [0, 0.03, ...]}, ...]}\n */\n toStackedChartData(\n labels: OutcomeType[] = [],\n epsilon = EPS\n ): { labels: number[]; datasets: Array<{ label: string; data: number[] }> } {\n const damageValues = this.combined.support();\n\n const datasets = labels.map((outcomeLabel) => ({\n label: outcomeLabel,\n data: damageValues.map((dmg) => {\n const bin = this.combined.map.get(dmg);\n const v = bin ? (bin.count[outcomeLabel] as number) || 0 : 0;\n return v <= epsilon ? 0 : v;\n }),\n }));\n\n return { labels: damageValues, datasets };\n }\n\n /**\n * Returns pure mathematical data for cumulative distribution function (CDF).\n * Shows P(X ≤ x) - the probability of getting at most x damage.\n *\n * @param asPercentages Whether to return percentages (0-100) or probabilities (0-1)\n * @returns Pure data structure with support and cumulative probabilities\n *\n * @example\n * query.toCDFSeries()\n * // → {support: [0, 6, 12], data: [5.2, 18.3, 45.1]}\n */\n toCDFSeries(asPercentages: boolean = true): {\n support: number[];\n data: number[];\n } {\n const originalSupport = this.combined.support();\n if (originalSupport.length === 0) {\n return { support: [], data: [] };\n }\n\n // Create complete integer range from min to max\n const minDamage = Math.min(...originalSupport);\n const maxDamage = Math.max(...originalSupport);\n const support = Array.from(\n { length: maxDamage - minDamage + 1 },\n (_, i) => minDamage + i\n );\n\n let cumulativeProbability = 0;\n const cdfData: number[] = [];\n\n for (const damage of support) {\n const bin = this.combined.map.get(damage);\n if (bin) {\n cumulativeProbability += bin.p;\n }\n cdfData.push(\n asPercentages ? cumulativeProbability * 100 : cumulativeProbability\n );\n }\n\n return {\n support,\n data: cdfData,\n };\n }\n\n /**\n * Returns pure mathematical data for complementary cumulative distribution function (CCDF).\n * Shows P(X ≥ x) - the probability of getting at least x damage.\n *\n * @param asPercentages Whether to return percentages (0-100) or probabilities (0-1)\n * @returns Pure data structure with support and complementary cumulative probabilities\n *\n * @example\n * query.toCCDFSeries()\n * // → {support: [0, 6, 12], data: [100, 94.8, 81.7]}\n */\n toCCDFSeries(asPercentages: boolean = true): {\n support: number[];\n data: number[];\n } {\n const originalSupport = this.combined.support();\n if (originalSupport.length === 0) {\n return { support: [], data: [] };\n }\n\n // Create complete integer range from min to max\n const minDamage = Math.min(...originalSupport);\n const maxDamage = Math.max(...originalSupport);\n const support = Array.from(\n { length: maxDamage - minDamage + 1 },\n (_, i) => minDamage + i\n );\n\n // Calculate CCDF: P(X ≥ x) = 1 - P(X < x)\n let cumulativeProbability = 0;\n const ccdfData: number[] = [];\n\n for (const damage of support) {\n // P(X ≥ x) is the total mass minus the cumulative up to (not including) x.\n const ccdf = 1 - cumulativeProbability;\n ccdfData.push(asPercentages ? ccdf * 100 : ccdf);\n\n // Now add current probability for next iteration\n const bin = this.combined.map.get(damage);\n if (bin) {\n cumulativeProbability += bin.p;\n }\n }\n\n return {\n support,\n data: ccdfData,\n };\n }\n\n /** Probability of doing strictly more than threshold damage (default >0). */\n probDamageGreaterThan(threshold = 0): number {\n let acc = 0;\n for (const [x, bin] of this.combined.map) if (x > threshold) acc += bin.p;\n return acc;\n }\n\n /** All outcome keys present in the PMF, ordered by `order` when given. */\n outcomeKeys(order?: OutcomeType[]): OutcomeType[] {\n const found = new Set<string>();\n for (const [, bin] of this.combined.map) {\n for (const k in bin.count)\n if (bin.count[k] && (bin.count[k] as number) > 0) found.add(k);\n }\n if (found.size === 0)\n [\"hit\", \"crit\", \"missNone\"].forEach((k) => found.add(k));\n const keys = Array.from(found).filter(\n (k) => order?.includes(k as OutcomeType) ?? true\n ) as OutcomeType[];\n if (order && order.length)\n keys.sort((a, b) => order.indexOf(a) + 999 - (order.indexOf(b) + 999));\n return keys;\n }\n\n /** Total probability per outcome across the PMF. */\n outcomeTotals(\n outcomes: OutcomeType[] = this.outcomeKeys()\n ): Map<OutcomeType, number> {\n const totals = new Map<OutcomeType, number>();\n outcomes.forEach((o) => totals.set(o, 0));\n for (const [, row] of this.combined.map) {\n for (const o of outcomes) {\n const p = (row.count[o] as number) || 0; // if your bins store per-outcome p; else derive via toLabeledTable\n totals.set(o, (totals.get(o) || 0) + p);\n }\n }\n return totals;\n }\n\n /** Conditional damage range per outcome (min/avg/max of X | outcome). */\n outcomeDamageRanges(\n outcomes: OutcomeType[] = this.outcomeKeys()\n ): Map<OutcomeType, { min: number; avg: number; max: number }> {\n // Use toLabeledTable to stay consistent with your existing attribution\n const table = this.toLabeledTable(outcomes);\n const ranges = new Map<\n OutcomeType,\n { min?: number; max?: number; sum: number; mass: number }\n >();\n outcomes.forEach((o) => ranges.set(o, { sum: 0, mass: 0 }));\n\n for (const row of table) {\n const dmg = row.damage as number;\n for (const o of outcomes) {\n const p = (row[o] as number) || 0; // joint mass at (damage, outcome)\n if (p > 0) {\n const r = ranges.get(o)!;\n r.sum += dmg * p;\n r.mass += p;\n if (r.min === undefined || dmg < r.min) r.min = dmg;\n if (r.max === undefined || dmg > r.max) r.max = dmg;\n }\n }\n }\n\n const out = new Map<\n OutcomeType,\n { min: number; avg: number; max: number }\n >();\n for (const o of outcomes) {\n const r = ranges.get(o)!;\n const avg = r.mass > 0 ? r.sum / r.mass : 0;\n out.set(o, { min: r.min ?? 0, avg, max: r.max ?? 0 });\n }\n return out;\n }\n\n /**\n * Per-outcome probabilities and damage ranges, aggregated over the individual\n * singles rather than read off the combined distribution.\n *\n * `damageRange` is the sum, over every single that can produce the outcome, of\n * that single's own conditional damage range: \"what this outcome contributes\n * across the whole turn when every attack that can produce it does\". Linear in\n * the number of attacks by construction.\n *\n * Prefer this over {@link DiceQuery.snapshot} for a multi-attack query.\n * `snapshot` reads `damageRange` off the combined PMF's `count`, which the\n * convolution accumulates as an expected count, so its `avg` is size-biased\n * for N≥2 (its own doc comment says so). The two agree for a single attack.\n *\n * Only outcomes that actually occur appear in the result.\n *\n * Like every `singles`-based helper on this class, it describes the singles\n * and not an explicitly provided `combined`. `Turn.toQuery()` supplies one whose\n * distribution also contains rider attacks that are absent from `singles`\n * (an `otherwise([unarmed, unarmed])` flurry, say), so those attacks do not\n * appear here. For rider-inclusive figures read the combined distribution\n * directly: {@link DiceQuery.outcomeTotals}, {@link DiceQuery.outcomeDamageRanges}.\n *\n * @param outcomes Which outcomes to consider; defaults to every canonical one.\n */\n outcomeStats(\n outcomes: readonly OutcomeType[] = ALL_OUTCOME_TYPES\n ): Map<OutcomeType, OutcomeSnapshot> {\n const stats = new Map<OutcomeType, OutcomeSnapshot>();\n const perSingle = this.singles.map((pmf) => new DiceQuery([pmf], undefined, this._eps));\n\n for (const outcome of outcomes) {\n const atLeastOneProbability = this.probAtLeastOne(outcome);\n if (atLeastOneProbability <= 0) continue;\n\n const damageRange = { min: 0, avg: 0, max: 0 };\n let contributors = 0;\n for (const single of perSingle) {\n if (single.probAtLeastOne(outcome) <= 0) continue;\n contributors++;\n const stat = single.damageStatsFrom(outcome);\n damageRange.min += stat.min;\n damageRange.avg += stat.avg;\n damageRange.max += stat.max;\n }\n\n stats.set(outcome, {\n atLeastOneProbability,\n allProbability:\n contributors > 0 ? this.probExactlyK(outcome, contributors) : 0,\n damageRange,\n });\n }\n\n return stats;\n }\n\n /**\n * Snapshot of the distribution in the exact shape the UI consumes.\n * - outcome probabilities are \"at least one\" (and equal to \"all\" for a single PMF)\n * - damageRange is conditional on the outcome occurring\n *\n * The outcome probabilities use the correct Poisson-binomial marginals\n * (`atLeastOneProbability` = P(≥1 attack has it), `allProbability` = P(all do)),\n * so they are always valid probabilities in [0,1].\n *\n * KNOWN LIMITATION (multi-attack): `damageRange.avg` is still aggregated from\n * the combined PMF's `count`, which the convolution accumulates as an EXPECTED\n * COUNT, so for N≥2 attacks it is the size-biased mean E[dmg·#label]/E[#label]\n * rather than a clean conditional expectation. It is correct for a single\n * attack.\n */\n snapshot(order?: readonly OutcomeType[]): Snapshot {\n // 1) Discover which outcomes actually appear in this PMF\n const discovered = new Set<string>();\n for (const [, bin] of this.combined.map) {\n for (const k in bin.count) {\n if (bin.count[k] && (bin.count[k] as number) > 0) discovered.add(k);\n }\n }\n if (discovered.size === 0) {\n for (const k of DiceQuery.DEFAULT_OUTCOMES) discovered.add(k);\n }\n\n let outcomes = Array.from(discovered);\n\n // Optional filtering + ordering if a preferred order was provided\n if (order && order.length) {\n const inOrder = new Set(order);\n outcomes = outcomes.filter((k) => inOrder.has(k as OutcomeType));\n const rank = new Map(order.map((k, i) => [k, i]));\n outcomes.sort(\n (a, b) =>\n (rank.get(a as OutcomeType) ?? 999) -\n (rank.get(b as OutcomeType) ?? 999)\n );\n }\n\n // 2) Aggregate per-outcome mass and conditional damage ranges via labeled table\n const rows = this.toLabeledTable(outcomes as OutcomeType[]);\n\n const rangeAcc = new Map<\n OutcomeType,\n { min?: number; max?: number; sum: number; mass: number }\n >();\n for (const ot of outcomes) {\n rangeAcc.set(ot as OutcomeType, { sum: 0, mass: 0 });\n }\n\n for (const row of rows) {\n const dmg = row.damage as number;\n for (const ot of outcomes) {\n const p = (row[ot] as number) || 0;\n if (p <= 0) continue;\n\n const r = rangeAcc.get(ot as OutcomeType)!;\n r.sum += dmg * p;\n r.mass += p;\n if (r.min === undefined || dmg < r.min) r.min = dmg;\n if (r.max === undefined || dmg > r.max) r.max = dmg;\n }\n }\n\n const n = this.singles.length;\n const outcomeMap = new Map<OutcomeType, OutcomeSnapshot>();\n for (const ot of outcomes) {\n const r = rangeAcc.get(ot as OutcomeType)!;\n const avg = r.mass > 0 ? r.sum / r.mass : 0;\n // Use the correct per-attack marginals (Poisson-binomial) so these are\n // always valid probabilities in [0,1]. For a single attack both reduce to\n // P(outcome); the previous `total` was an expected count and could exceed 1.\n outcomeMap.set(ot as OutcomeType, {\n atLeastOneProbability: this.probAtLeastOne(ot as OutcomeType),\n allProbability: this.probAtLeastK(ot as OutcomeType, n),\n damageRange: { min: r.min ?? 0, avg, max: r.max ?? 0 },\n });\n }\n\n // 3) Scalars: mean, damageChance, and percentiles\n const averageDPR = this.mean();\n\n let damageChance = 0; // P(total damage > 0)\n for (const [x, bin] of this.combined.map) if (x > 0) damageChance += bin.p;\n\n const percentiles = {\n p25: this.combined.quantile(0.25),\n p50: this.combined.quantile(0.5),\n p75: this.combined.quantile(0.75),\n };\n\n return { averageDPR, damageChance, percentiles, outcomes: outcomeMap };\n }\n\n /**\n * PMF Transformation Methods\n *\n * These methods provide a fluent API for transforming dice queries by wrapping\n * the underlying PMF transformation methods. All operations work on the combined\n * PMF and return new DiceQuery instances.\n */\n\n /**\n * Returns a new DiceQuery with normalized probabilities (ensuring they sum to 1.0).\n *\n * @returns New DiceQuery with normalized combined PMF\n */\n normalize(): DiceQuery {\n return new DiceQuery([this.combined.normalize()]);\n }\n\n /**\n * Returns a new DiceQuery with low-probability outcomes removed.\n *\n * @param eps Minimum probability threshold (defaults to PMF epsilon)\n * @param keepFinalBin Whether to keep the highest damage bin regardless of probability\n * @returns New DiceQuery with compacted combined PMF\n */\n compact(eps?: number, keepFinalBin?: boolean): DiceQuery {\n return new DiceQuery([this.combined.compact(eps, keepFinalBin)]);\n }\n\n /**\n * Returns a new DiceQuery with an additional scaled branch added.\n * Useful for conditional outcomes like \"30% chance of opportunity attack\".\n *\n * @param branch DiceQuery to add as a scaled branch\n * @param probability Probability of the branch occurring (0-1)\n * @returns New DiceQuery combining this query with the scaled branch\n *\n * @example\n * const baseAttack = parse(\"(d20 + 5 AC 15) * (2d6 + 3)\");\n * const opportunityAttack = parse(\"(d20 + 5 AC 15) * (1d8 + 3)\");\n * const withOpportunity = baseAttack.addScaled(opportunityAttack, 0.3);\n */\n addScaled(branch: DiceQuery, probability: number): DiceQuery {\n return new DiceQuery([\n this.combined.addScaled(branch.combined, probability),\n ]);\n }\n\n /**\n * Returns a new DiceQuery with all probabilities scaled by a factor.\n * Used for conditional scenarios where the entire outcome has reduced probability.\n *\n * @param factor Scaling factor for probabilities\n * @returns New DiceQuery with scaled probabilities\n *\n * @example\n * const fullAttack = parse(\"(d20 + 5 AC 15) * (2d6 + 3)\");\n * const conditionalAttack = fullAttack.scaleMass(0.3); // 30% chance scenario\n */\n scaleMass(factor: number): DiceQuery {\n return new DiceQuery([this.combined.scaleMass(factor)]);\n }\n\n totalMass(): number {\n return this.combined.mass();\n }\n\n /**\n * Returns a new DiceQuery with damage values transformed by a function.\n * Useful for applying modifiers, resistances, or other damage transformations.\n *\n * @param damageTransformFunction Function to transform each damage value\n * @returns New DiceQuery with transformed damage values\n *\n * @example\n * const baseAttack = parse(\"2d6 + 3\");\n * const withResistance = baseAttack.mapDamage(dmg => Math.floor(dmg / 2)); // Half damage\n * const withBonus = baseAttack.mapDamage(dmg => dmg + 5); // +5 damage\n */\n mapDamage(\n damageTransformFunction: (damageValue: number) => number\n ): DiceQuery {\n return new DiceQuery([this.combined.mapDamage(damageTransformFunction)]);\n }\n\n /**\n * Returns a new DiceQuery with damage values scaled by `factor / denominator`.\n * Convenient wrapper around mapDamage for multiplicative scaling; see\n * {@link PMF.scaleDamage} for the rounding rules.\n *\n * @param factor Scaling factor for damage values (the numerator of a ratio)\n * @param rounding Rounding method: \"floor\" (default), \"round\", or \"ceil\"\n * @param denominator Divisor; integer `factor` and `denominator` round exactly\n * @returns New DiceQuery with scaled damage values\n *\n * @example\n * const baseAttack = parse(\"2d6 + 3\");\n * const doubled = baseAttack.scaleDamage(2); // Double damage\n * const halfDamage = baseAttack.scaleDamage(0.5, \"round\"); // Half damage, rounded\n * const sevenTenths = baseAttack.scaleDamage(7, \"floor\", 10); // floor(7v/10), exactly\n */\n scaleDamage(\n factor: number,\n rounding: \"floor\" | \"round\" | \"ceil\" = \"floor\",\n denominator = 1\n ): DiceQuery {\n return new DiceQuery([this.combined.scaleDamage(factor, rounding, denominator)]);\n }\n\n /**\n * Returns a new DiceQuery combining this query with another via convolution.\n * Equivalent to rolling both queries independently and adding results.\n * It is important to use this rather than combing()ing the PMFs directly!\n * This method maintains the provenance of the PMFs which is needed for damage attribution.\n * Combining the .combined PMFs directly is still valid for DPR calculations but\n * is not statistically sound for queries.\n *\n * @param other DiceQuery to combine with\n * @param eps Optional epsilon for precision control\n * @returns New DiceQuery representing the combined outcome\n *\n * @example\n * const mainAttack = parse(\"(d20 + 5 AC 15) * (2d6 + 3)\");\n * const bonusAttack = parse(\"(d20 + 3 AC 15) * (1d6 + 1)\");\n * const bothAttacks = mainAttack.convolve(bonusAttack);\n */\n convolve(other: DiceQuery): DiceQuery {\n const singles = [...this.singles, ...other.singles];\n return new DiceQuery(singles);\n }\n\n /**\n * First-success split over an ordered list of DISTINCT single-swing PMFs.\n * Each PMF may have different success/subset probabilities (from labels).\n *\n * successOutcome: e.g., [\"success\"] or [\"hit\", \"crit\"]\n * subsetOutcome: e.g., [\"subset\"] or [\"crit\"] where subset ⊆ success\n *\n * Returns tuple: [pFirstNonSubset, pFirstSubset, pAnySuccess, pNone]\n */\n public firstSuccessSplit(\n successOutcome: OutcomeType | OutcomeType[],\n subsetOutcome: OutcomeType | OutcomeType[],\n eps = EPS\n ): readonly [pSuccess: number, pSubset: number, pAny: number, pNone: number] {\n const pmfs = this.singles;\n if (!pmfs.length) {\n throw new Error(\"firstSuccessSplitFromPMFs: pmfs must be non-empty\");\n }\n\n const toArr = (x: OutcomeType | OutcomeType[]): OutcomeType[] =>\n Array.isArray(x) ? x : [x];\n const clamp01 = (x: number) => Math.max(0, Math.min(1, x));\n const tol = Math.max(eps, 8 * Number.EPSILON);\n\n // Per-event probabilities from each PMF via DiceQuery([pmf])\n const per = pmfs.map((pmf) => {\n const dq = new DiceQuery([pmf]);\n const pS = dq.probAtLeastOne(toArr(successOutcome));\n const pB = dq.probAtLeastOne(toArr(subsetOutcome));\n if (pB - pS > eps) {\n throw new Error(\n \"firstSuccessSplitFromPMFs: P(subset) > P(success) for an event. Ensure subset ⊆ success.\"\n );\n }\n return { pS, pB };\n });\n\n // Aggregate with running miss prefix\n let missSoFar = 1;\n let pFirstSubset = 0;\n let pFirstNonSubset = 0;\n let pNone = 1;\n\n for (const { pS, pB } of per) {\n pFirstSubset += missSoFar * pB;\n pFirstNonSubset += missSoFar * (pS - pB);\n const miss = 1 - pS;\n missSoFar *= miss;\n pNone *= miss;\n }\n\n const pAny = 1 - pNone;\n\n // Clamp and sanity check\n const a = clamp01(pFirstNonSubset);\n const b = clamp01(pFirstSubset);\n const any = clamp01(pAny);\n const none = clamp01(pNone);\n\n if (Math.abs(a + b - any) > tol * Math.max(1, any)) {\n throw new Error(\n `firstSuccessSplitFromPMFs: parts do not sum to pAny. got a+b=${\n a + b\n }, pAny=${any}`\n );\n }\n\n return [a, b, any, none] as const;\n }\n}\n// Make sure these types are exported in your public index, or inline them here.\nexport type OutcomeSnapshot = {\n atLeastOneProbability: number; // P(outcome occurs at least once)\n allProbability: number; // equal to atLeastOneProbability for a single aggregated PMF\n damageRange: { min: number; avg: number; max: number }; // conditional on the outcome occurring\n};\n\nexport type Snapshot = {\n averageDPR: number;\n damageChance: number; // P(total damage > 0)\n percentiles: { p25: number; p50: number; p75: number };\n outcomes: Map<OutcomeType, OutcomeSnapshot>;\n};\n","import { LRUCache } from \"../common/lru-cache\";\nimport type { LRUCacheOptions } from \"../common/lru-cache\";\nimport type { Bin, OutcomeLabelMap, Rounding } from \"../common/types\";\nimport {\n ALL_OUTCOME_TYPES,\n EPS,\n MISS_NONE_OUTCOME,\n sortOutcomes,\n} from \"../common/types\";\nimport { DiceQuery } from \"./query\";\n\n/** Library caches hand the same PMF to every caller, so entries are frozen as they are stored. */\nconst sharedPMFCacheOptions: LRUCacheOptions<PMF> = {\n onInsert: (pmf) => pmf.freeze(),\n followsCachingToggle: true,\n};\n\nexport const pmfCache = new LRUCache<string, PMF>(1000, sharedPMFCacheOptions);\n\n/**\n * Relative slack when comparing a float-summed CDF with a target probability. Float running\n * sums drift by a few ulps; a target within this fraction of the CDF counts as reached.\n */\nconst QUANTILE_RELATIVE_SLACK = 1e-12;\n\n/**\n * The map of a frozen PMF: a copy of the map it was built with that reads like any `Map` but whose\n * `set`, `delete` and `clear` throw a `TypeError`, so a PMF shared through a cache cannot be\n * changed through it. Only frozen PMFs pay for the copy; the unfrozen hot paths keep their own map.\n */\nclass FrozenBinMap extends Map<number, Bin> {\n constructor(source: ReadonlyMap<number, Bin>) {\n super();\n for (const [value, bin] of source) super.set(value, bin);\n }\n\n override set(value: number): never {\n throw new TypeError(`Cannot set damage value ${value}: this PMF is frozen (shared through a cache)`);\n }\n\n override delete(value: number): never {\n throw new TypeError(`Cannot delete damage value ${value}: this PMF is frozen (shared through a cache)`);\n }\n\n override clear(): never {\n throw new TypeError(\"Cannot clear the map: this PMF is frozen (shared through a cache)\");\n }\n}\n\n/**\n * Complete numeric model for the stacked damage-attribution chart, produced by\n * {@link PMF.damageAttributionChartModel}. Carries every dice-and-probability\n * value the chart needs; a renderer only maps these numbers into its own format\n * (colors, human labels, axis units, dataset objects).\n */\nexport interface DamageAttributionChartModel {\n /** Bucket-start value for each column. Numeric; the caller stringifies for labels. */\n labels: number[];\n /** Present only when the distribution was coarsened; [start,end] inclusive, per bucket. */\n binRanges?: { start: number; end: number }[];\n /** Discovered outcome labels in stack order. Empty for pure (unattributed) distributions. */\n outcomes: string[];\n /** outcome → per-bucket probability mass (fraction 0..1). Bar heights. Σ over outcomes ≈ totals[i]. */\n series: Map<string, number[]>;\n /**\n * outcome → per-bucket conditional share (fraction 0..1) of that bucket's total.\n * Tooltip signal. 0 where the bucket total is below `epsilon`; otherwise Σ over\n * outcomes ≈ 1.\n */\n shares: Map<string, number[]>;\n /** Per-bucket total probability mass (fraction 0..1). The only signal for pure distributions. */\n totals: number[];\n /** Reversed-convention CCDF markers: damage at which P(X ≥ x) crosses 80/50/20%. */\n percentiles: { p80: number; p50: number; p20: number };\n /** Distribution mean, `this.mean()`. */\n mean: number;\n}\n\n/**\n * Probability Mass Function for discrete damage distributions.\n */\nexport class PMF {\n // Unique ID generator for anonymous PMFs to avoid cache key collisions\n private static __anonIdCounter = 1;\n\n // Cached computed values\n private _support?: number[];\n private _min?: number;\n private _max?: number;\n private _totalMass?: number;\n private _mean?: number;\n private _variance?: number;\n private _stdev?: number;\n private _fingerprint?: string;\n private _cumulative?: { values: number[]; below: number[]; above: number[] };\n private _frozen = false;\n\n /**\n * @param map Damage value → bin. Typed read-only: a PMF is immutable once built. A PMF returned\n * from the library's caches is frozen: its bins, its map and the `map` property itself reject\n * writes (see {@link freeze}).\n */\n constructor(\n public readonly map: ReadonlyMap<number, Bin> = new Map(),\n public readonly epsilon = EPS,\n public readonly normalized = false,\n public readonly identifier: string = `anon#${PMF.__anonIdCounter++}`,\n private readonly _preservedProvenance = true\n ) {}\n\n /**\n * A PMF cache that freezes every stored PMF and follows `setCachingEnabled`. The library's\n * own caches are built with this.\n */\n static createCache(maxSize: number): LRUCache<string, PMF> {\n return new LRUCache<string, PMF>(maxSize, sharedPMFCacheOptions);\n }\n\n /**\n * Freezes this PMF so it can be shared through a cache. Every bin is deep-frozen, including its\n * `count` and `attr` maps, so writing to one throws a `TypeError`. The map is replaced by a copy\n * whose `set`/`delete`/`clear` throw a `TypeError` (the map this PMF was built with stays the\n * caller's), and the `map` property becomes read-only, so assigning it throws too.\n * Returns this PMF.\n */\n freeze(): this {\n if (this._frozen) return this;\n const map = new FrozenBinMap(this.map);\n for (const bin of map.values()) {\n Object.freeze(bin.count);\n if (bin.attr) Object.freeze(bin.attr);\n Object.freeze(bin);\n }\n // Frozen too, so no own `set`/`delete`/`clear` can be installed over the throwing ones.\n Object.freeze(map);\n // `as object`: `defineProperty` returns its target, which is not a derived PMF to keep.\n Object.defineProperty(this as object, \"map\", { value: map, writable: false, enumerable: true, configurable: false });\n this._frozen = true;\n return this;\n }\n\n static empty(epsilon = EPS, identifier = \"empty\") {\n return new PMF(new Map(), epsilon, false, identifier);\n }\n\n // This has a single bin at value 0, mass of 1\n static zero(epsilon = EPS): PMF {\n const m = new Map();\n m.set(0, { p: 1, count: { miss: 1 }, attr: {} });\n return new PMF(m, epsilon, false, \"zero\");\n }\n\n static delta(value: number, epsilon = EPS): PMF {\n return PMF.fromMap(new Map([[value, 1]]), epsilon);\n }\n\n /**\n * Point mass at damage 0 tagged with the canonical `missNone` outcome.\n *\n * Differs from {@link PMF.zero}, which labels its zero bin `miss` — the\n * builder's attack-resolution vocabulary. This uses the `missNone`\n * {@link OutcomeType} that the attribution charts and outcome stats key on,\n * so it is the correct \"clean miss / no damage\" delta for provenance-aware\n * mixtures feeding those consumers.\n */\n static missNone(epsilon = EPS): PMF {\n const m = new Map<number, Bin>();\n m.set(0, { p: 1, count: { [MISS_NONE_OUTCOME]: 1 }, attr: {} });\n return new PMF(m, epsilon, false, \"missNone\");\n }\n\n // This creates a single bin at value 0, but with weight 0.\n static emptyMass(): PMF {\n return PMF.zero().scaleMass(0);\n }\n\n // Makes PMF iterable over [damage, bin] pairs.\n [Symbol.iterator](): IterableIterator<[number, Bin]> {\n return this.map[Symbol.iterator]();\n }\n\n static clearCache() {\n pmfCache.clear();\n }\n\n /**\n * Creates a conditional PMF from two branches (success and failure) and a probability.\n * This is the core logic for modeling any probabilistic event where there are two\n * distinct outcomes.\n */\n static branch(\n successPMF: PMF,\n failurePMF: PMF,\n successProbability: number\n ): PMF {\n let p = successProbability;\n if (!Number.isFinite(p)) p = 0;\n if (p < 0) p = 0;\n if (p > 1) p = 1;\n\n const q = 1 - p;\n\n // Fast paths. scaleMass(1) returns the same instance, so these hand back the\n // branch PMF unchanged. That is safe because PMFs are treated as immutable\n // (compact() and the other transforms now clone bins rather than mutate).\n if (p === 0) return failurePMF.scaleMass(1);\n if (p === 1) return successPMF.scaleMass(1);\n\n // Choose epsilon. You can also pick Math.min for a tighter threshold.\n const eps = successPMF.epsilon ?? failurePMF.epsilon;\n const id = `branch(${failurePMF.identifier}*${q.toFixed(6)} + ${\n successPMF.identifier\n }*${p.toFixed(6)})`;\n\n // Proper Bernoulli mixture: q·failure ⊕ p·success, assembled in a single\n // pass. The previous `empty().addScaled(failure,q).addScaled(success,p)`\n // chain copied failurePMF's bins twice (into the intermediate, then again\n // when the intermediate was copied by the second addScaled). Merging both\n // scaled branches directly into one fresh map keeps the same accumulation\n // order — q·failure first, then p·success — so the result is bit-identical.\n const resultMap = new Map<number, Bin>();\n for (const [damageValue, bin] of failurePMF.map) {\n PMF.mergeInto(resultMap, damageValue, PMF.scaleBin(bin, q));\n }\n for (const [damageValue, bin] of successPMF.map) {\n PMF.mergeInto(resultMap, damageValue, PMF.scaleBin(bin, p));\n }\n\n return new PMF(resultMap, eps, false, id);\n }\n\n /**\n * withProbability()\n *\n * A convenience wrapper around branch() for the common case where the \"failure\" branch is always zero().\n *\n * Think of this as a shortcut for:\n * pmf.gate(p, PMF.zero())\n *\n * Use this to model a *single* Bernoulli event — an outcome that either happens or doesn't,\n * like an opportunity attack that occurs with probability p, or a single attack that either hits or misses.\n *\n * This is **not** for combining multiple independent attacks or mutually exclusive multi-outcome scenarios.\n * - For multiple independent swings, use DiceQuery with separate PMFs for each attack.\n * - For modeling \"first success\" logic across multiple attacks (like Sneak Attack or Smite)\n * use query.firstSuccessSplit() to get the exact probabilities.\n * - For scenarios with several mutually exclusive outcomes (like crit vs hit vs none), use PMF.exclusive().\n *\n */\n static withProbability(successPMF: PMF, probability: number): PMF {\n return PMF.branch(successPMF, PMF.zero(), probability);\n }\n\n /**\n * gate()\n *\n * A conditional wrapper around branch() that applies this PMF with probability `p`,\n * and applies a provided fallback PMF otherwise.\n *\n * This is useful for modeling a binary choice between two outcomes:\n * - The \"success\" outcome (this PMF) happens with probability `p`.\n * - The \"failure\" outcome (fallback PMF) happens with probability `1 - p`.\n *\n * Examples:\n * - 25% chance to include an opportunity attack, otherwise nothing:\n * attackPMF.gate(0.25, PMF.zero())\n *\n * - 50% chance to deal fireball damage, otherwise cone of cold damage:\n * fireballPMF.gate(0.5, coneOfColdPMF)\n *\n * Relationship to other helpers:\n * - **withProbability()** is a shortcut for the common case where the fallback is `PMF.zero()`.\n * - **exclusive()** is for three or more mutually exclusive outcomes (e.g., crit vs hit vs none).\n *\n * @param p Probability of applying this PMF (between 0 and 1).\n * @param fallback PMF to apply when this PMF is *not* selected.\n * @returns A new PMF representing the weighted mixture of this PMF and the fallback.\n */\n gate(p: number, fallback: PMF) {\n return PMF.branch(this, fallback, p);\n }\n\n /**\n * PMF.exclusive()\n *\n * Builds a single PMF from a set of mutually exclusive weighted outcomes.\n * Exactly one of the provided options will occur.\n *\n * Each option has:\n * - A PMF representing its outcome (e.g., damage dice).\n * - A weight representing its probability of being selected.\n *\n * Notes:\n * - If total weight < 1 (within eps), leftover mass is assumed to be PMF.zero()\n *\n * @param options Array of `{ pmf, weight }` or `[PMF, number]`.\n * @param eps Optional tolerance for floating point rounding.\n */\n static exclusive(\n options: Array<{ pmf: PMF; weight: number } | [PMF, number]>,\n eps = EPS\n ): PMF {\n const items = options.map((o) =>\n Array.isArray(o) ? { pmf: o[0], weight: o[1] } : o\n );\n\n // Validate weights\n for (const { weight } of items) {\n if (!Number.isFinite(weight) || weight < -eps) {\n throw new Error(`PMF.exclusive: invalid weight ${weight}.`);\n }\n }\n\n // Sum and check\n let totalWeight = items.reduce((s, { weight }) => s + weight, 0);\n\n // Normalize tiny negatives to 0 and tiny overshoot to 1 when within eps\n if (Math.abs(totalWeight) <= eps) totalWeight = 0;\n if (Math.abs(1 - totalWeight) <= eps) totalWeight = 1;\n\n if (totalWeight > 1 + EPS) {\n throw new Error(\n `PMF.exclusive: total weight ${totalWeight} exceeds 1. (epsilon: ${eps})`\n );\n }\n\n // Accumulate scaled components, skipping near-zero weights\n let out = PMF.empty(eps);\n for (const { pmf, weight } of items) {\n if (weight > eps) out = out.addScaled(pmf, weight);\n }\n\n // Add leftover mass at zero outcome\n const leftover = Math.max(0, 1 - totalWeight);\n if (leftover > eps) {\n out = out.addScaled(PMF.zero(), leftover);\n }\n\n return out;\n }\n\n /**\n * PMF.mix()\n *\n * Builds a PMF as a linear combination of input PMFs with the given weights.\n * Unlike `exclusive`, this does NOT:\n * - enforce that weights sum to 1\n * - add leftover probability to δ0 (PMF.zero())\n *\n * Use when outcomes are not mutually exclusive, or for interpolation/blending.\n *\n * @param options Array of `{ pmf, weight }` or `[PMF, number]`.\n * @param eps Optional tolerance for skipping tiny weights.\n */\n static mix(\n options: Array<{ pmf: PMF; weight: number } | [PMF, number]>,\n eps = EPS\n ): PMF {\n const items = options.map((o) =>\n Array.isArray(o) ? { pmf: o[0], weight: o[1] } : o\n );\n\n // Validate weights, but do not constrain their sum.\n for (const { weight } of items) {\n if (!Number.isFinite(weight)) {\n throw new Error(`PMF.mix: invalid weight ${weight}.`);\n }\n }\n\n let out = PMF.empty(eps);\n for (const { pmf, weight } of items) {\n if (Math.abs(weight) <= eps) continue; // ignore crumbs\n out = out.addScaled(pmf, weight);\n }\n return out;\n }\n /**\n * Adds damage attribution metadata to this PMF based on existing count metadata.\n * For each bin, sets attr[outcome] = damage × count[outcome].\n *\n * This enables damage attribution charts to work with builder-generated PMFs.\n * The parser generates attr automatically, but builder PMFs only have count.\n *\n * @returns New PMF with attr field populated in each bin\n */\n /**\n * Returns true if this PMF already carries damage attribution metadata.\n *\n * Only the first positive-damage bin is inspected (parser-generated PMFs\n * populate `attr` uniformly), so this is O(1) in practice.\n */\n hasAttribution(): boolean {\n for (const [damage, bin] of this.map) {\n if (damage !== 0 && bin.attr && Object.keys(bin.attr).length > 0) {\n return true;\n }\n // Only check the first non-zero bin for performance\n if (damage > 0) break;\n }\n return false;\n }\n\n withAttribution(): PMF {\n // Fast path: if attr already exists, return this PMF unchanged\n if (this.hasAttribution()) return this;\n\n const newMap = new Map<number, Bin>();\n\n for (const [damage, bin] of this.map) {\n const attr: OutcomeLabelMap = {};\n\n // For each outcome type in count, compute its damage contribution\n for (const outcome in bin.count) {\n const probability = bin.count[outcome] as number;\n if (probability > 0) {\n attr[outcome] = damage * probability;\n }\n }\n\n // Create new bin with attribution\n newMap.set(damage, {\n p: bin.p,\n count: { ...bin.count },\n attr: Object.keys(attr).length > 0 ? attr : undefined,\n });\n }\n\n // Use a different identifier to avoid cache collisions with non-attributed version\n return new PMF(\n newMap,\n this.epsilon,\n this.normalized,\n `${this.identifier}~attr`\n );\n }\n\n /**\n * General-purpose N-way mixture.\n * weights: Array of [weight, PMF].\n *\n * Example: PMF.mixN([\n * [pMiss, zero],\n * [pHit, hitPMF],\n * [pCrit, critPMF],\n * ]);\n */\n static mixN(weights: [number, PMF][], eps = EPS): PMF {\n // Treat tiny/negative as zero; keep performance clean\n const filtered = weights.filter(([w]) => w > eps);\n\n if (filtered.length === 0) {\n return PMF.emptyMass(); // not PMF.zero(): we want \"no mass\" mixture\n }\n\n // No need to normalize up front; accumulation blends by relative weight\n let acc: PMF | null = null;\n let sum = 0;\n\n for (const [w, pmf] of filtered) {\n if (acc === null) {\n acc = pmf;\n sum = w;\n } else {\n const q = w / (sum + w); // relative weight of the new component\n acc = PMF.branch(pmf, acc, q); // success=new pmf, failure=acc\n sum += w;\n }\n }\n\n // If everything got filtered out (all ~0), return empty mass\n return acc ?? PMF.emptyMass();\n }\n\n /**\n * False for a PMF produced by {@link power}, which folds independent attacks into one\n * distribution and cannot say which attack produced which label.\n */\n public preservedProvenance(): boolean {\n return this._preservedProvenance;\n }\n\n private getPowerCacheKey(n: number, eps: number): string {\n // Includes fingerprint() (per-bin probability/count/attr content), matching convolve()'s\n // cache key: the identifier alone is not content-unique. `mapDamage`/`scaleDamage`,\n // `normalize()`, and `compact()` all keep the PARENT's identifier while producing a\n // numerically different PMF\n // (e.g. `X.mapDamage(f).power(2)` and `X.mapDamage(g).power(2)` would otherwise collide on\n // the same key `map(X)+map(X)@eps` and silently return each other's cached result).\n const id = this.identifier;\n let key = `${id}`;\n for (let i = 1; i < n; i++) key += `+${id}`;\n return `${key}@${eps}|${this.fingerprint()}`;\n }\n\n /**\n * Convolves this PMF with itself `n` times, by exponentiation by squaring. `n` must be a\n * positive integer.\n *\n * NOTE: this folds `n` independent, identical attacks into one PMF, so it loses data\n * provenance. It is only safe when computing masses; for `atLeast`-style queries use a\n * `DiceQuery` instead of `power()`.\n */\n power(n: number, eps = this.epsilon): PMF {\n if (!Number.isInteger(n) || n <= 0) {\n throw new Error(\"power(n): n must be a positive integer\");\n }\n if (n === 1) return this;\n\n const epsilon = eps ?? this.epsilon;\n\n const key = this.getPowerCacheKey(n, epsilon);\n const cached = pmfCache.get(key);\n if (cached) return cached;\n\n // Start from the base PMF and accumulate n-1 additional powers\n let base: PMF = this.normalized ? this : this.normalize();\n let result: PMF = base;\n let exp = n - 1;\n\n while (exp > 0) {\n if (exp & 1) {\n result = result.convolve(base, epsilon);\n }\n exp >>= 1;\n if (exp > 0) {\n base = base.convolve(base, epsilon);\n }\n }\n\n // A copy carries the flag: `result` may be a convolution shared through the cache.\n const folded = new PMF(\n result.map,\n result.epsilon,\n result.normalized,\n result.identifier,\n false\n );\n pmfCache.set(key, folded);\n return folded;\n }\n\n /*\n * Helper for chaining multiple identical attacks\n */\n replicate(n: number): PMF[] {\n if (!Number.isInteger(n) || n <= 0) {\n throw new Error(\"replicate(n): n must be a positive integer\");\n }\n if (n === 1) return [this];\n return Array.from({ length: n }, () => this);\n }\n\n mass(): number {\n if (this._totalMass === undefined) {\n let totalProbabilityMass = 0;\n for (const { p } of this.map.values()) {\n totalProbabilityMass += p;\n }\n this._totalMass = totalProbabilityMass;\n }\n return this._totalMass;\n }\n\n outcomeMass(outcome: string): number {\n let totalProbabilityMass = 0;\n for (const { p, count } of this.map.values()) {\n totalProbabilityMass += p * ((count[outcome] as number) ?? 0);\n }\n return totalProbabilityMass;\n }\n\n // Helper for testing\n faceTotal(): number {\n return [...this.map.keys()].reduce((sum, key) => sum + key, 0);\n }\n\n normalize(): PMF {\n if (this.normalized) return this;\n const normalizationFactor = this.mass();\n if (normalizationFactor === 0) return this;\n\n // Note: this divides by normalizationFactor rather than multiplying by its\n // reciprocal, to keep results bit-identical to direct division.\n const normalizedMap = new Map<number, Bin>();\n for (const [damageValue, probabilityBin] of this.map) {\n const normalizedCount: OutcomeLabelMap = {};\n for (const labelKey in probabilityBin.count) {\n normalizedCount[labelKey] =\n (probabilityBin.count[labelKey] as number) / normalizationFactor;\n }\n\n let normalizedAttributes: OutcomeLabelMap | undefined;\n if (probabilityBin.attr) {\n normalizedAttributes = {};\n for (const labelKey in probabilityBin.attr) {\n normalizedAttributes[labelKey] =\n (probabilityBin.attr[labelKey] as number) / normalizationFactor;\n }\n }\n\n normalizedMap.set(damageValue, {\n p: probabilityBin.p / normalizationFactor,\n count: normalizedCount,\n attr: normalizedAttributes,\n });\n }\n return new PMF(normalizedMap, this.epsilon, true, this.identifier);\n }\n\n /**\n * Returns a copy with negligible probabilities removed (p < eps).\n * If keepFinalBin is true, the bin with the largest key is always kept,\n * even if its probability is below eps. count/attr submaps are still cleaned.\n */\n compact(eps = this.epsilon, keepFinalBin = false): PMF {\n let maxKey = -Infinity;\n if (keepFinalBin) {\n for (const key of this.map.keys()) {\n if (key > maxKey) maxKey = key;\n }\n }\n\n const compactedMap = new Map<number, Bin>();\n\n for (const [damageValue, probabilityBin] of this.map) {\n const shouldKeep =\n probabilityBin.p >= eps || (keepFinalBin && damageValue === maxKey);\n\n if (!shouldKeep) continue;\n\n // Build a fresh Bin rather than mutating the source. Bins are shared by\n // reference across PMFs (e.g. branch()/addScaled()/scaleMass() fast paths\n // can carry another PMF's bin objects), so deleting sub-eps entries in\n // place would silently corrupt the source PMF's count/attr.\n const cleanedBin = PMF.cloneBin(probabilityBin);\n\n for (const labelKey in cleanedBin.count) {\n if (Math.abs(cleanedBin.count[labelKey] || 0) < eps) {\n delete cleanedBin.count[labelKey];\n }\n }\n\n if (cleanedBin.attr) {\n for (const labelKey in cleanedBin.attr) {\n if (Math.abs(cleanedBin.attr[labelKey] || 0) < eps) {\n delete cleanedBin.attr[labelKey];\n }\n }\n if (Object.keys(cleanedBin.attr).length === 0) {\n cleanedBin.attr = undefined;\n }\n }\n\n compactedMap.set(damageValue, cleanedBin);\n }\n\n return new PMF(compactedMap, eps, this.normalized, this.identifier);\n }\n\n // Note: The \"support\" of a PMF is the set of all non-zero probability outcomes.\n // This returns all damage values with non-zero probability, sorted ascending.\n support(): number[] {\n if (this._support === undefined) {\n this._support = [...this.map.keys()].sort((a, b) => a - b);\n }\n return this._support!;\n }\n\n // Minimum possible damage value.\n min(): number {\n if (this._min === undefined) {\n const support = this.support();\n this._min = support.length > 0 ? support[0] : 0;\n }\n return this._min;\n }\n\n // Maximum possible damage value.\n max(): number {\n if (this._max === undefined) {\n const support = this.support();\n this._max = support.length > 0 ? support[support.length - 1] : 0;\n }\n return this._max;\n }\n\n /**\n * Returns the expected (mean) damage value, Σ v·p. Cached.\n *\n * On a PMF whose mass is not 1 this is the partial expectation (the slice's contribution to\n * the whole distribution's mean), not the conditional mean; `DiceQuery.mean()` divides by the\n * mass instead.\n */\n mean(): number {\n if (this._mean === undefined) {\n let totalSum = 0;\n for (const [damageValue, probabilityBin] of this.map) {\n totalSum += damageValue * probabilityBin.p;\n }\n this._mean = totalSum;\n }\n return this._mean;\n }\n\n /**\n * Returns the variance of the damage distribution. Cached.\n *\n * On a PMF whose mass is not 1 (a slice such as {@link filterOutcome}'s output) this is the\n * variance of the distribution conditioned on the slice, Σ (v − μ)²·p / m with μ = Σ v·p / m\n * and m = {@link mass}, the same quantity `DiceQuery.variance()` reports for that PMF. Note\n * that {@link mean} is not conditioned: it stays the partial expectation Σ v·p, so slices add\n * up. Within 1e-12 of unit mass (or at zero or negative mass) no conditioning is applied.\n */\n variance(): number {\n if (this._variance === undefined) {\n const mass = this.mass();\n const conditional = mass > 0 && Math.abs(mass - 1) > EPS;\n const meanValue = conditional ? this.mean() / mass : this.mean();\n let varianceSum = 0;\n for (const [damageValue, probabilityBin] of this.map) {\n const deviationFromMean = damageValue - meanValue;\n varianceSum += deviationFromMean * deviationFromMean * probabilityBin.p;\n }\n this._variance = conditional ? varianceSum / mass : varianceSum;\n }\n return this._variance;\n }\n\n /**\n * Returns the standard deviation of the damage distribution.\n */\n stdev(): number {\n if (this._stdev === undefined) {\n this._stdev = Math.sqrt(this.variance());\n }\n return this._stdev;\n }\n\n /** Deep-copies a Bin, cloning its count and (optional) attr maps. */\n private static cloneBin(bin: Bin): Bin {\n return {\n p: bin.p,\n count: { ...bin.count },\n attr: bin.attr ? { ...bin.attr } : undefined,\n };\n }\n\n /** Returns a new Bin with p, count, and attr all multiplied by `factor`. */\n private static scaleBin(bin: Bin, factor: number): Bin {\n const count: OutcomeLabelMap = {};\n for (const k in bin.count) {\n count[k] = (bin.count[k] as number) * factor;\n }\n\n let attr: OutcomeLabelMap | undefined;\n if (bin.attr) {\n attr = {};\n for (const k in bin.attr) {\n attr[k] = (bin.attr[k] as number) * factor;\n }\n }\n\n return { p: bin.p * factor, count, attr };\n }\n\n private static mergeInto(\n destinationMap: Map<number, Bin>,\n damageValue: number,\n binToAdd: Bin\n ) {\n const existingBin = destinationMap.get(damageValue);\n if (!existingBin) {\n destinationMap.set(damageValue, PMF.cloneBin(binToAdd));\n return;\n }\n\n existingBin.p += binToAdd.p;\n\n for (const labelKey in binToAdd.count) {\n existingBin.count[labelKey] =\n (existingBin.count[labelKey] || 0) +\n (binToAdd.count[labelKey] as number);\n }\n\n if (binToAdd.attr) {\n if (!existingBin.attr) {\n existingBin.attr = {};\n }\n for (const labelKey in binToAdd.attr) {\n existingBin.attr[labelKey] =\n (existingBin.attr[labelKey] || 0) +\n (binToAdd.attr[labelKey] as number);\n }\n }\n }\n\n // Convenience method\n add(other: PMF): PMF {\n return this.addScaled(other, 1);\n }\n\n /**\n * Returns a new PMF with `branch` added to this one, scaled by `probability` before merging —\n * the primitive for conditional effects. Example: `pmf.addScaled(critBranch, 0.05)` → a PMF\n * including a 5% crit slice.\n */\n addScaled(branch: PMF, probability: number): PMF {\n if (probability === 0) return this;\n\n const resultMap = new Map<number, Bin>();\n for (const [dmg, bin] of this.map) {\n resultMap.set(dmg, PMF.cloneBin(bin));\n }\n\n for (const [damageValue, probabilityBin] of branch.map) {\n PMF.mergeInto(\n resultMap,\n damageValue,\n PMF.scaleBin(probabilityBin, probability)\n );\n }\n\n return new PMF(\n resultMap,\n this.epsilon,\n false,\n `${this.identifier}+scaled(${branch.identifier},${probability})`\n );\n }\n\n /**\n * Bernoulli thinning: the effect this PMF describes happens with probability\n * `frequency` and otherwise deals nothing — a conditional attack, an on-hit\n * rider, or a sub-one AoE target fraction. The result is\n * `frequency · X + (1 − frequency) · δ0`.\n *\n * Every bin (negative damage included) keeps `frequency` of its probability\n * mass, per-label `count` and per-label `attr`; the zero bin keeps its labels\n * at that share too. The freed mass, `(1 − frequency) · mass()`, is added to\n * the damage-0 bin under the canonical `missNone` outcome, so the total mass\n * is unchanged, also for a slice whose mass is not 1.\n *\n * Unlike a bare {@link scaleMass} or {@link mapDamage}, this keeps damage\n * attribution (`attr`) intact, so a frequency-scaled PMF still renders\n * correctly in the damage-attribution charts.\n *\n * `frequency >= 1` (or non-finite) returns this PMF unchanged; `frequency <= 0`\n * leaves only the damage-0 bin, holding all of the mass as `missNone`.\n *\n * @param frequency Probability in [0, 1] that the effect occurs.\n */\n applyHitFrequency(frequency: number): PMF {\n if (!Number.isFinite(frequency) || frequency >= 1) return this;\n const freq = Math.max(0, frequency);\n const freedMass = (1 - freq) * this.mass();\n\n const newMap = new Map<number, Bin>();\n if (freq > 0) {\n for (const [damage, bin] of this.map) {\n newMap.set(damage, PMF.scaleBin(bin, freq));\n }\n }\n if (freedMass > 0) {\n PMF.mergeInto(newMap, 0, {\n p: freedMass,\n count: { [MISS_NONE_OUTCOME]: freedMass },\n attr: {},\n });\n }\n\n return new PMF(\n newMap,\n this.epsilon,\n false,\n `freq(${this.identifier},${freq})`\n );\n }\n\n /**\n * Splits this PMF into two complementary PMFs by an arbitrary per-damage-value factor in\n * `[0, 1]` — bin `d`'s mass, `count`, and `attr` split `factor(d)` / `1 - factor(d)` between the\n * two results (via the same proportional scaling {@link applyHitFrequency} uses, `scaleBin`), so\n * `a.add(b)` recovers this PMF exactly and both halves stay chart-attributable. Unlike\n * {@link applyHitFrequency}, mass is NOT redistributed to a miss bin at 0 — each bin stays at its\n * own damage value in whichever half it lands in. `factor` outside `[0, 1]` is clamped.\n *\n * Built for `dice-match` trigger slicing: splitting a hit/crit sub-PMF into \"matched\" and\n * \"did not match\" halves by the exact per-damage-value match probability.\n */\n splitByFactor(factor: (damage: number) => number): [PMF, PMF] {\n const a = new Map<number, Bin>();\n const b = new Map<number, Bin>();\n for (const [damage, bin] of this.map) {\n const f = Math.min(1, Math.max(0, factor(damage)));\n if (f > 0) a.set(damage, PMF.scaleBin(bin, f));\n if (f < 1) b.set(damage, PMF.scaleBin(bin, 1 - f));\n }\n return [\n new PMF(a, this.epsilon, false, `split+(${this.identifier})`),\n new PMF(b, this.epsilon, false, `split-(${this.identifier})`),\n ];\n }\n\n /**\n * Max of two i.i.d. copies of this PMF's distribution: normalize, square\n * the CDF, then restore the original mass. The engine's damage-reroll\n * substitution (`onFirstHit(keepBestDamage())`) applies this to a landing\n * attack's base payload slice — \"roll it again, keep the better total\".\n *\n * PRESERVES outcome labels and attribution. A max, unlike a sum, is\n * literally one of the two draws: the value that wins was drawn from this\n * same distribution, so its `count`/`attr` composition is unchanged in\n * *proportion* — only that bin's total mass is recomputed (via the\n * squared-CDF step) and every label is rescaled by the same factor. This\n * is why {@link power}'s documented provenance loss does not apply here:\n * for a sum, one output value arises from many `(x1, x2)` pairs with\n * different attribution mixes, so provenance is genuinely ambiguous; for a\n * max, there is exactly one realized draw per bin. A naive rebuild through\n * {@link fromMap} would silently discard both `count` and `attr`.\n *\n * Works on a non-unit-mass slice (e.g. {@link filterOutcome}'s output):\n * the CDF is squared on the NORMALIZED distribution, then the result is\n * rescaled back to this PMF's original total mass, not to 1.\n */\n maxOfTwo(): PMF {\n const totalMass = this.mass();\n if (totalMass <= 0) return this;\n\n const resultMap = new Map<number, Bin>();\n let cdf = 0; // running NORMALIZED cdf through the previous support value\n\n for (const damage of this.support()) {\n const bin = this.map.get(damage)!;\n const normalizedP = bin.p / totalMass;\n if (normalizedP <= 0) continue;\n\n const prevCdf = cdf;\n cdf += normalizedP;\n\n // P(max = damage), normalized: F(damage)² − F(damage⁻)², factored as\n // p·(F(damage) + F(damage⁻)). The difference of squares near 1 would\n // cancel the tail bins away; the factored form keeps full precision.\n // It also is the scale factor from the original bin to the new one:\n // reusing the bin's count/attr via scaleBin (rather than rebuilding from\n // a bare number) is what keeps every label's proportion intact.\n resultMap.set(damage, PMF.scaleBin(bin, cdf + prevCdf));\n }\n\n return new PMF(\n resultMap,\n this.epsilon,\n this.normalized,\n `maxOfTwo(${this.identifier})`\n );\n }\n\n scaleMass(factor: number): PMF {\n if (factor === 1) return this;\n\n const scaledMap = new Map<number, Bin>();\n for (const [damageValue, probabilityBin] of this.map) {\n scaledMap.set(damageValue, PMF.scaleBin(probabilityBin, factor));\n }\n return new PMF(\n scaledMap,\n this.epsilon,\n false,\n `scale(${this.identifier},${factor})`\n );\n }\n\n mapDamage(damageTransformFunction: (damageValue: number) => number): PMF {\n const transformedMap = new Map<number, Bin>();\n for (const [originalDamage, probabilityBin] of this.map) {\n const transformedDamage = damageTransformFunction(originalDamage);\n PMF.mergeInto(\n transformedMap,\n transformedDamage,\n PMF.cloneBin(probabilityBin)\n );\n }\n return new PMF(\n transformedMap,\n this.epsilon,\n this.normalized,\n `map(${this.identifier})`\n );\n }\n\n /**\n * Multiplies every damage value by `factor / denominator` and rounds: `floor`\n * (toward −∞, the default), `ceil` (toward +∞) or `round` (to nearest, halves\n * toward +∞). Values that land on the same result merge, labels included.\n *\n * With an integer `factor` and `denominator` the rounding is exact: `v·factor`\n * is an exact integer, and one division of two integers below 2^53 lands on\n * the correct side of every integer. Pass a ratio that way, e.g.\n * `scaleDamage(9, \"ceil\", 7)`; `scaleDamage(9 / 7, \"ceil\")` rounds the factor\n * to a double first, so 21·(9/7) = 27.000000000000004 would round up to 28.\n */\n scaleDamage(\n factor: number,\n rounding: \"floor\" | \"round\" | \"ceil\" = \"floor\",\n denominator = 1\n ): PMF {\n if (!Number.isFinite(factor)) {\n throw new RangeError(`scaleDamage() factor must be finite, got ${factor}`);\n }\n if (!Number.isFinite(denominator) || denominator === 0) {\n throw new RangeError(`scaleDamage() denominator must be finite and non-zero, got ${denominator}`);\n }\n const exact = Number.isInteger(factor) && Number.isInteger(denominator);\n return this.mapDamage((damageValue) => {\n if (exact && Number.isInteger(damageValue)) {\n const numerator = damageValue * factor;\n if (rounding === \"round\") {\n return Math.floor((2 * numerator + denominator) / (2 * denominator));\n }\n const quotient = numerator / denominator;\n return rounding === \"ceil\" ? Math.ceil(quotient) : Math.floor(quotient);\n }\n const scaled = (damageValue * factor) / denominator;\n return rounding === \"round\"\n ? Math.round(scaled)\n : rounding === \"ceil\"\n ? Math.ceil(scaled)\n : Math.floor(scaled);\n });\n }\n\n private getPMFCombineCacheKey(\n p1: PMF,\n p2: PMF,\n eps: number,\n raw: boolean\n ): string {\n const [id1, id2] = [p1.identifier, p2.identifier].sort();\n\n return `v4:${raw ? \"RAW\" : \"N\"}:${id1}+${id2}@${eps}|${p1.fingerprint()}|${p2.fingerprint()}`;\n }\n\n /**\n * A content fingerprint of every bin (probability, per-label `count`, per-label `attr`) plus\n * the `normalized` flag, so convolution/power cache keys change whenever the underlying\n * numbers do. Mass/bin-count/face-sum alone are not content-unique: `mapDamage` variants can\n * keep the same identifier, support, mass, and face sum while differing in per-bin\n * probabilities or in the `count`/`attr` channels `convolve()`/`power()` actually propagate --\n * that previously let `power()` return one PMF's cached result for a different PMF. Memoized\n * because a PMF is immutable once constructed -- this avoids re-deriving the key on every\n * convolve()/power() call (including cache hits). Bin order is sorted by damage value (and\n * label keys sorted within each bin) so two equal-content PMFs built via different code paths\n * fingerprint identically regardless of Map insertion order. Label keys are JSON-encoded, so a\n * label containing the separators cannot make two different bins read the same.\n */\n fingerprint(): string {\n if (this._fingerprint === undefined) {\n const labels = (m: OutcomeLabelMap | undefined): string =>\n m === undefined\n ? \"\"\n : Object.keys(m)\n .sort()\n .map((k) => `${JSON.stringify(k)}:${m[k]}`)\n .join(\",\");\n const bins = [...this.map.entries()].sort((a, b) => a[0] - b[0]);\n const parts: string[] = [];\n for (const [damageValue, bin] of bins) {\n parts.push(`${damageValue}:${bin.p}[${labels(bin.count)}]{${labels(bin.attr)}}`);\n }\n this._fingerprint = `${this.normalized ? 1 : 0}|${parts.join(\";\")}`;\n }\n return this._fingerprint;\n }\n\n convolve(other: PMF, eps?: number, raw = false): PMF {\n const epsilon = eps ?? this.epsilon;\n\n // Normalize-by-value on non-raw path\n const norm = (x: PMF) =>\n raw ? x : Math.abs(x.mass() - 1) <= epsilon ? x : x.normalize();\n const A0 = norm(this);\n const B0 = norm(other);\n\n const [A, B] = A0.identifier <= B0.identifier ? [A0, B0] : [B0, A0];\n const cacheKey = this.getPMFCombineCacheKey(A, B, epsilon, raw);\n const cached = pmfCache.get(cacheKey);\n if (cached) return cached;\n\n // Accumulate directly into each destination bin instead of building a\n // temporary Bin per (a,b) pair and merging it. The probability channel\n // (`dest.p += ap*bp`) accumulates in the same order as before, so it is\n // bit-identical; only the per-label `count`/`attr` sums re-associate, which\n // shifts them by at most a few ULP (far below the eps pruning threshold).\n // Label entries are listed once per bin, outside the pair loop: enumerating\n // the keys of a (frozen, cached) bin per pair costs more than the arithmetic.\n const labelEntries = (m: OutcomeLabelMap | undefined): [string, number][] | undefined =>\n m === undefined ? undefined : (Object.entries(m) as [string, number][]);\n const bEntries = [...B.map].map(([bVal, bBin]) => ({\n bVal,\n bp: bBin.p,\n count: labelEntries(bBin.count) as [string, number][],\n attr: labelEntries(bBin.attr),\n }));\n const combinedMap = new Map<number, Bin>();\n for (const [aVal, aBin] of A.map) {\n const ap = aBin.p;\n const aCount = labelEntries(aBin.count) as [string, number][];\n const aAttr = labelEntries(aBin.attr);\n for (const { bVal, bp, count: bCount, attr: bAttr } of bEntries) {\n const dmg = aVal + bVal;\n\n let dest = combinedMap.get(dmg);\n if (dest === undefined) {\n dest = { p: 0, count: {} };\n combinedMap.set(dmg, dest);\n }\n\n dest.p += ap * bp;\n\n const dc = dest.count;\n for (const [k, v] of aCount) dc[k] = (dc[k] || 0) + v * bp;\n for (const [k, v] of bCount) dc[k] = (dc[k] || 0) + v * ap;\n\n if (aAttr || bAttr) {\n let da = dest.attr;\n if (da === undefined) {\n da = {};\n dest.attr = da;\n }\n if (aAttr) for (const [k, v] of aAttr) da[k] = (da[k] || 0) + v * bp;\n if (bAttr) for (const [k, v] of bAttr) da[k] = (da[k] || 0) + v * ap;\n }\n }\n }\n\n let result = new PMF(\n combinedMap,\n epsilon,\n !raw,\n `${A.identifier}${raw ? \"*\" : \"+\"}${B.identifier}`\n );\n\n // Enforce mass invariant: mass(out) = (raw? A.mass():1) * (raw? B.mass():1)\n const mExp = (raw ? A.mass() : 1) * (raw ? B.mass() : 1);\n const mGot = result.mass();\n // Guard mGot !== 0: a zero-mass operand convolves to the zero measure\n // (mass 0). Without this guard the non-raw path would scaleMass(mExp/0) =\n // scaleMass(Infinity), poisoning every bin to 0*Infinity = NaN.\n if (mExp !== 0 && mGot !== 0 && Math.abs(mGot - mExp) > epsilon) {\n result = result.scaleMass(mExp / mGot);\n }\n if (!raw && mGot !== 0 && Math.abs(result.mass() - 1) > epsilon)\n result = result.normalize();\n\n pmfCache.set(cacheKey, result);\n return result;\n }\n\n // Convolve without renormalizing (raw = true), for callers that combine raw counts.\n combineRaw(other: PMF, eps?: number): PMF {\n return this.convolve(other, eps, true);\n }\n\n // Reduce a list of PMFs by left-folding convolve() with the given eps\n private static reduceConvolveLeft(pmfList: PMF[], eps: number): PMF {\n let result = pmfList[0];\n for (let i = 1; i < pmfList.length; i++) {\n result = result.convolve(pmfList[i], eps);\n }\n return result;\n }\n\n /**\n * Convolves multiple PMFs using linear convolution with automatic caching.\n * Uses a left-to-right accumulation approach for maximum cache reuse.\n * Each convolve() call automatically uses the convolution cache for performance.\n *\n * This linear approach provides better cache hits than pairwise because:\n * - Intermediate results are more predictable and stable\n * - Similar PMF lists share common prefixes (A+B, (A+B)+C, etc.)\n * - Order-independent cache keys work better with consistent build patterns\n */\n static convolveMany(pmfList: PMF[], eps = EPS): PMF {\n if (pmfList.length === 0) return PMF.empty(eps);\n if (pmfList.length === 1) return pmfList[0];\n\n // Linear combination with automatic intermediate caching: each prefix\n // (A+B, (A+B)+C, ...) is a stable cache key, maximizing reuse.\n return PMF.reduceConvolveLeft(pmfList, eps);\n }\n\n /**\n * Returns a plain, JSON-serializable representation of this PMF.\n *\n * Follows the standard `toJSON` contract, so `JSON.stringify(pmf)` produces\n * the expected output (no double-encoding). Use {@link PMF.fromJSON} to\n * reconstruct, or {@link PMF.toJSONString} if you need the string directly.\n */\n toJSON(): {\n bins: Array<[number, Bin]>;\n normalized: boolean;\n identifier: string;\n } {\n return {\n bins: [...this.map.entries()],\n normalized: this.normalized,\n identifier: this.identifier,\n };\n }\n\n /** Serializes this PMF to a JSON string (equivalent to `JSON.stringify(pmf)`). */\n toJSONString(): string {\n return JSON.stringify(this);\n }\n\n static fromJSON(jsonData: {\n bins: Array<[number, Bin]>;\n normalized?: boolean;\n identifier?: string;\n }) {\n return new PMF(\n new Map(jsonData.bins),\n EPS,\n !!jsonData.normalized,\n jsonData.identifier || \"fromJSON\"\n );\n }\n\n /**\n * Relative pruning with optional top-K floor.\n * Keeps bins with p >= epsRel * peak, always keeps min and max damage,\n * optionally guarantees at least `minBins` survivors by adding top-K.\n * Returns a new, non-normalized PMF.\n */\n prune(epsRel: number, minBins = 0): PMF {\n const size = this.map.size;\n if (size === 0) return this;\n\n // One pass: peak, min, max\n let peak = 0;\n let minDamage = Number.POSITIVE_INFINITY;\n let maxDamage = Number.NEGATIVE_INFINITY;\n for (const [dmg, bin] of this.map) {\n if (bin.p > peak) peak = bin.p;\n if (dmg < minDamage) minDamage = dmg;\n if (dmg > maxDamage) maxDamage = dmg;\n }\n if (peak === 0)\n return new PMF(new Map(this.map), epsRel, false, this.identifier);\n\n const thresh = epsRel * peak;\n const entries = [...this.map.entries()];\n\n // Protect endpoints\n const survivorsByDmg = new Map<number, Bin>();\n const protect = (d: number) => {\n const b = this.map.get(d);\n if (b) survivorsByDmg.set(d, b);\n };\n protect(minDamage);\n if (maxDamage !== minDamage) protect(maxDamage);\n\n // Relative survivors\n for (const [dmg, bin] of entries) {\n if (bin.p >= thresh) survivorsByDmg.set(dmg, bin);\n }\n\n // Enforce minBins via top-K if requested\n if (minBins > 0 && survivorsByDmg.size < minBins) {\n // Sort all entries by probability desc (or replace with Quickselect for O(n))\n entries.sort((a, b) => b[1].p - a[1].p);\n for (const [dmg, bin] of entries) {\n if (!survivorsByDmg.has(dmg)) {\n survivorsByDmg.set(dmg, bin);\n if (survivorsByDmg.size >= minBins) break;\n }\n }\n }\n\n // Rebuild map, pruning tiny count/attr entries with the same threshold\n const prunedMap = new Map<number, Bin>();\n for (const [dmg, bin] of survivorsByDmg) {\n const newCount: OutcomeLabelMap = {};\n for (const k in bin.count) {\n const v = bin.count[k] as number;\n if (Math.abs(v) >= thresh) newCount[k] = v;\n }\n let newAttr: OutcomeLabelMap | undefined;\n if (bin.attr) {\n for (const k in bin.attr) {\n const v = bin.attr[k] as number;\n if (Math.abs(v) >= thresh) {\n if (!newAttr) newAttr = {};\n newAttr[k] = v;\n }\n }\n }\n prunedMap.set(dmg, { p: bin.p, count: newCount, attr: newAttr });\n }\n\n // Return non-normalized PMF\n return new PMF(prunedMap, epsRel, false, `prune(${this.identifier})`);\n }\n\n /** Probability mass at exactly x. */\n pAt(x: number): number {\n return this.map.get(x)?.p ?? 0;\n }\n\n /**\n * P(any damage) — the mass on all non-zero outcomes, i.e. `1 - P(0)`.\n * Assumes a miss is encoded as the damage-0 bin (the convention used across\n * attack/save PMFs). The dual of {@link missProbability}.\n */\n hitProbability(): number {\n return 1 - this.pAt(0);\n }\n\n /** P(no damage) — the mass at damage 0. The dual of {@link hitProbability}. */\n missProbability(): number {\n return this.pAt(0);\n }\n\n /**\n * Coarsen the distribution into at most `maxBuckets` contiguous, equal-width\n * damage buckets, aggregating probability mass (and `count`/`attr`\n * provenance) into each bucket's start value. Returns this PMF unchanged when\n * its integer support already fits within `maxBuckets`.\n *\n * This is a lossy display/downsampling transform (bucket start replaces the\n * exact damage value) — use it for charting wide distributions, not for DPR\n * math.\n */\n rebin(maxBuckets: number): PMF {\n if (!(maxBuckets > 0)) return this;\n const support = this.support();\n if (support.length === 0) return this;\n const min = support[0];\n const max = support[support.length - 1];\n const range = max - min;\n if (range + 1 <= maxBuckets) return this;\n const binSize = Math.ceil((range + 1) / maxBuckets);\n return this.mapDamage((d) => min + Math.floor((d - min) / binSize) * binSize);\n }\n\n /** Dense integer support from min..max (inclusive).\n * Useful for showing empty bars in charts.\n */\n denseSupport(): number[] {\n const s = this.support();\n if (s.length === 0) return [];\n const lo = Math.min(...s),\n hi = Math.max(...s);\n return Array.from({ length: hi - lo + 1 }, (_, i) => lo + i).sort(\n (a, b) => a - b\n );\n }\n\n /** CDF at x: P(X ≤ x). */\n cdfAt(x: number): number {\n let acc = 0;\n for (const [val, bin] of this.map) if (val <= x) acc += bin.p;\n return acc;\n }\n\n /**\n * Quantile / inverse CDF: the smallest support value x with P(X ≤ x) ≥ p·mass().\n * `p <= 0` gives the smallest support value; `p >= 1` or NaN gives the largest.\n *\n * A float running sum can land an ulp short of a CDF that is exactly p (a d20's CDF(10) sums\n * to 0.49999999999999994), so the comparison allows a relative slack of a few ulps per bin.\n * Below the median it compares the CDF summed from the low end; above it, the mass strictly\n * above x summed from the high end. A sum of non-negative terms is accurate relative to its\n * own size, so the tail that decides the answer is never swamped by the rest of the mass.\n */\n quantile(p: number): number {\n const { values, below, above } = this.cumulative();\n const n = values.length;\n if (n === 0) return 0;\n const total = below[n - 1];\n if (!(total > 0)) return 0;\n if (p <= 0) return values[0];\n if (p >= 1) return values[n - 1];\n\n const slack = Math.max(QUANTILE_RELATIVE_SLACK, 4 * n * Number.EPSILON);\n const lowTarget = p * total * (1 - slack);\n const highTarget = (1 - p) * total * (1 + slack);\n const lowSide = p <= 0.5;\n\n // Smallest index whose CDF reaches p; the test is monotone in the index.\n let lo = 0;\n let hi = n;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n const reached = lowSide ? below[mid] >= lowTarget : above[mid] <= highTarget;\n if (reached) hi = mid;\n else lo = mid + 1;\n }\n return values[Math.min(lo, n - 1)];\n }\n\n /**\n * Sorted support with `below[i]` = Σ p over values ≤ values[i], summed from the low end,\n * and `above[i]` = Σ p over values > values[i], summed from the high end. Cached.\n */\n private cumulative(): { values: number[]; below: number[]; above: number[] } {\n if (this._cumulative === undefined) {\n const values = this.support();\n const n = values.length;\n const below = new Array<number>(n);\n const above = new Array<number>(n);\n let sum = 0;\n for (let i = 0; i < n; i++) {\n sum += (this.map.get(values[i]) as Bin).p;\n below[i] = sum;\n }\n sum = 0;\n for (let i = n - 1; i >= 0; i--) {\n above[i] = sum;\n sum += (this.map.get(values[i]) as Bin).p;\n }\n this._cumulative = { values, below, above };\n }\n return this._cumulative;\n }\n\n /** Get outcome probability at specific damage value. */\n outcomeAt(damage: number, outcome: string): number {\n return (this.map.get(damage)?.count[outcome] as number) ?? 0;\n }\n\n /** Get all outcome types present in this PMF. */\n outcomes(): string[] {\n const outcomeSet = new Set<string>();\n for (const [, bin] of this.map) {\n for (const outcome in bin.count) {\n if ((bin.count[outcome] as number) > 0) {\n outcomeSet.add(outcome);\n }\n }\n }\n return Array.from(outcomeSet).sort();\n }\n\n /** Get total probability of an outcome across all damage values. */\n outcomeProbability(outcome: string): number {\n let total = 0;\n for (const [, bin] of this.map) {\n total += (bin.count[outcome] as number) ?? 0;\n }\n return total;\n }\n\n /** Get damage attribution for an outcome at specific damage value. */\n outcomeAttributionAt(damage: number, outcome: string): number {\n return (this.map.get(damage)?.attr?.[outcome] as number) ?? 0;\n }\n\n /** Get all outcome data at specific damage value. */\n binAt(damage: number): {\n p: number;\n count: Record<string, number>;\n attr?: Record<string, number>;\n } | null {\n const bin = this.map.get(damage);\n if (!bin) return null;\n\n return {\n p: bin.p,\n count: { ...bin.count } as Record<string, number>,\n attr: bin.attr ? ({ ...bin.attr } as Record<string, number>) : undefined,\n };\n }\n\n /** Check if outcome exists in this PMF. */\n hasOutcome(outcome: string): boolean {\n for (const [, bin] of this.map) {\n if (((bin.count[outcome] as number) ?? 0) > 0) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Split each damage value's probability mass across outcome labels, returning\n * per-label maps of `damage value → probability mass attributable to that\n * label`. Summing over labels at a given value recovers that value's `p`.\n *\n * Damage-bearing bins are split by `attr` weight (the share of damage each\n * outcome contributed); the clean-miss bin at 0 is split by `count` weight\n * (there is no damage to attribute). Attribution is computed on demand via\n * {@link withAttribution} when absent, so builder-generated PMFs work too.\n *\n * This is the provenance core of the stacked damage-attribution chart — the\n * caller only maps these series into its rendering format (colors, binning,\n * axis labels).\n */\n attributionByValue(): Map<string, Map<number, number>> {\n const src = this.hasAttribution() ? this : this.withAttribution();\n const result = new Map<string, Map<number, number>>();\n\n const add = (label: string, damage: number, mass: number): void => {\n if (!(mass > 0)) return;\n let series = result.get(label);\n if (!series) {\n series = new Map<number, number>();\n result.set(label, series);\n }\n series.set(damage, (series.get(damage) ?? 0) + mass);\n };\n\n for (const [damage, bin] of src.map) {\n const p = bin.p || 0;\n if (p <= 0) continue;\n const isMissBin = damage === 0;\n\n // Damage-0 (clean miss): split by count, crediting the missNone label.\n if (isMissBin) {\n let totalCount = 0;\n for (const k in bin.count) totalCount += (bin.count[k] as number) || 0;\n if (totalCount > 0) {\n const c = (bin.count[MISS_NONE_OUTCOME] as number) || 0;\n add(MISS_NONE_OUTCOME, damage, (c / totalCount) * p);\n }\n continue;\n }\n\n // Damage-bearing bin: split by attribution weight.\n let totalAttr = 0;\n if (bin.attr) for (const k in bin.attr) totalAttr += (bin.attr[k] as number) || 0;\n if (bin.attr && totalAttr > 0) {\n for (const k in bin.attr) {\n if (k === MISS_NONE_OUTCOME) continue;\n add(k, damage, (((bin.attr[k] as number) || 0) / totalAttr) * p);\n }\n }\n }\n\n return result;\n }\n\n /**\n * Reversed-convention CCDF percentile markers used by the attribution chart:\n * for each target probability t, the largest damage x still reached with\n * P(X ≥ x) > t%, falling back to the smallest/largest support value at the\n * edges. Ported verbatim from the app so `p80/p50/p20` keep their intentional\n * reversed meaning (p80 is the low-damage end). Computed on the full, un-binned\n * support. Assumes a non-empty map.\n */\n private attributionPercentiles(): { p80: number; p50: number; p20: number } {\n const sortedKeys = [...this.map.keys()].sort((a, b) => a - b);\n const sparseCCDF: { x: number; y: number }[] = [];\n let cumulativeP = 0;\n for (let i = sortedKeys.length - 1; i >= 0; i--) {\n const key = sortedKeys[i];\n const bin = this.map.get(key);\n if (!bin) continue;\n cumulativeP += bin.p;\n sparseCCDF.unshift({ x: key, y: cumulativeP * 100 });\n }\n const findDamageAtProbability = (targetProb: number): number => {\n for (let i = 0; i < sparseCCDF.length; i++) {\n if (sparseCCDF[i].y <= targetProb) {\n return i > 0 ? sparseCCDF[i - 1].x : sparseCCDF[i].x;\n }\n }\n return sparseCCDF[sparseCCDF.length - 1].x;\n };\n return {\n p80: findDamageAtProbability(80),\n p50: findDamageAtProbability(50),\n p20: findDamageAtProbability(20),\n };\n }\n\n /**\n * Full numeric model for the stacked damage-attribution chart — bar-height\n * masses, tooltip shares, bucket labels/ranges, percentile markers, and the\n * mean. The caller only maps these into a rendering format (colors, labels,\n * axis units); all of the dice-and-probability logic lives here.\n *\n * Built split-first-then-bin: the attribution split ({@link attributionByValue})\n * runs on the un-binned distribution, then the resulting series are coarsened.\n * {@link rebin} is deliberately *not* used — rebinning first would fold any\n * sub-`binSize` damage into the damage-0 bucket, which the split then mistakes\n * for a clean miss and drops.\n *\n * @param options.maxBuckets Coarsen to at most this many equal-width buckets\n * when the integer support is wider (`range > maxBuckets`); omit for a dense,\n * per-integer model.\n * @param options.stackOrder Preferred outcome order (defaults to\n * {@link ALL_OUTCOME_TYPES}); labels outside it sort alphabetically after.\n * @param options.epsilon Bucket-total floor below which a `shares` entry is 0\n * (divide-by-~0 guard). Defaults to 1e-9.\n */\n damageAttributionChartModel(\n options: {\n maxBuckets?: number;\n stackOrder?: readonly string[];\n epsilon?: number;\n } = {}\n ): DamageAttributionChartModel {\n const { maxBuckets, stackOrder = ALL_OUTCOME_TYPES, epsilon = 1e-9 } = options;\n\n const empty: DamageAttributionChartModel = {\n labels: [],\n outcomes: [],\n series: new Map(),\n shares: new Map(),\n totals: [],\n percentiles: { p80: 0, p50: 0, p20: 0 },\n mean: 0,\n };\n if (this.map.size === 0) return empty;\n\n // Split on the un-binned distribution: outcome → (damage → probability mass).\n const split = this.attributionByValue();\n\n // Discover outcomes across BOTH count and attr keys so any all-zero legend\n // entries survive (matches the app's discovery), then order for stacking.\n const discovered = new Set<string>();\n for (const [, bin] of this.map) {\n for (const k in bin.count) discovered.add(k);\n if (bin.attr) for (const k in bin.attr) discovered.add(k);\n }\n const outcomes = sortOutcomes([...discovered], stackOrder);\n const hasAttribution = outcomes.length > 0;\n\n // Support window over values carrying positive mass (the app's allDamageValues):\n // from the split for attributed PMFs, from positive-p bins for pure ones.\n let min = Infinity;\n let max = -Infinity;\n const widen = (d: number): void => {\n if (d < min) min = d;\n if (d > max) max = d;\n };\n if (hasAttribution) {\n for (const s of split.values())\n for (const [d, m] of s) if (m > 0) widen(d);\n } else {\n for (const [d, bin] of this.map) if ((bin.p || 0) > 0) widen(d);\n }\n if (max < min) return empty; // nothing carried positive mass\n const range = max - min;\n\n // Binning geometry — dense (per-integer) unless range > maxBuckets.\n const binned =\n maxBuckets !== undefined && maxBuckets > 0 && range > maxBuckets;\n const binSize = binned ? Math.ceil((range + 1) / maxBuckets!) : 1;\n const numBins = binned ? Math.ceil((range + 1) / binSize) : range + 1;\n const bucketOf = (d: number): number => Math.floor((d - min) / binSize);\n\n const labels: number[] = [];\n const binRanges: { start: number; end: number }[] | undefined = binned\n ? []\n : undefined;\n for (let i = 0; i < numBins; i++) {\n const start = min + i * binSize;\n labels.push(start);\n if (binRanges)\n binRanges.push({ start, end: Math.min(start + binSize - 1, max) });\n }\n\n // Aggregate per-outcome masses into buckets.\n const series = new Map<string, number[]>();\n for (const outcome of outcomes) {\n const arr = new Array<number>(numBins).fill(0);\n const s = split.get(outcome);\n if (s) {\n for (const [d, m] of s) {\n const b = bucketOf(d);\n if (b >= 0 && b < numBins) arr[b] += m;\n }\n }\n series.set(outcome, arr);\n }\n\n // Per-bucket totals: sum of the attributed series, or (pure) of raw p.\n const totals = new Array<number>(numBins).fill(0);\n if (hasAttribution) {\n for (const arr of series.values())\n for (let i = 0; i < numBins; i++) totals[i] += arr[i];\n } else {\n for (const [d, bin] of this.map) {\n const p = bin.p || 0;\n if (p <= 0) continue;\n const b = bucketOf(d);\n if (b >= 0 && b < numBins) totals[b] += p;\n }\n }\n\n // Conditional shares for tooltips (guarded against a ~zero bucket total).\n const shares = new Map<string, number[]>();\n for (const outcome of outcomes) {\n const arr = series.get(outcome)!;\n const sh = new Array<number>(numBins).fill(0);\n for (let i = 0; i < numBins; i++) {\n sh[i] = totals[i] > epsilon ? arr[i] / totals[i] : 0;\n }\n shares.set(outcome, sh);\n }\n\n return {\n labels,\n binRanges,\n outcomes,\n series,\n shares,\n totals,\n percentiles: this.attributionPercentiles(),\n mean: this.mean(),\n };\n }\n\n tailProbGE(t: number): number {\n let s = 0;\n for (const [x, bin] of this) {\n if (bin.p > 0 && x >= t) s += bin.p;\n }\n return s;\n }\n\n tailProbGT(t: number): number {\n let s = 0;\n for (const [x, rec] of this) {\n if (x > t) s += rec.p;\n }\n return s;\n }\n\n /**\n * Returns a new PMF containing only bins where the specified outcome has non-zero probability.\n * This creates a marginal distribution for the given outcome type, with probabilities\n * scaled to represent the unconditional mass attributable to that outcome.\n */\n filterOutcome(outcome: string): PMF {\n const filteredMap = new Map<number, Bin>();\n\n for (const [damageValue, bin] of this.map) {\n const outcomeCount = (bin.count[outcome] as number) ?? 0;\n\n // total paths that reached this bin (sum across labels)\n const totalCount = Object.values(bin.count ?? {}).reduce(\n (a, b) => (a ?? 0) + ((b as number) ?? 0),\n 0\n );\n\n if (outcomeCount > 0 && totalCount !== undefined && totalCount > 0) {\n // proportion of this bin's mass attributable to the outcome\n const proportion = outcomeCount / totalCount;\n\n // downweight p to the unconditional mass from the outcome only\n const newP = bin.p * proportion;\n\n const newCount: OutcomeLabelMap = { [outcome]: outcomeCount };\n\n let newAttr: OutcomeLabelMap | undefined;\n if (bin.attr && bin.attr[outcome] !== undefined) {\n // A count-like attr accumulator is scaled by the same proportion; a per-outcome-only\n // attr carries over as-is.\n newAttr = { [outcome]: (bin.attr[outcome] as number) * proportion };\n }\n\n filteredMap.set(damageValue, {\n p: newP,\n count: newCount,\n attr: newAttr,\n });\n }\n }\n\n return new PMF(\n filteredMap,\n this.epsilon,\n false, // don't normalize by default\n `filter(${this.identifier},${outcome})`\n );\n }\n /**\n * Calculates probabilities for first-success outcomes across n independent attempts.\n *\n * @param pSuccess - Total probability of any success on a single attempt.\n * @param pSpecial - Probability of a specific subset of successes (e.g., critical success).\n * @param n - Number of independent attempts.\n *\n * Returns:\n * - pSpecificSuccess: Probability that the first success was of the \"special\" type\n * - pGeneralSuccess: Probability that the first success was of the non-special type\n * - pNone: Probability that no successes occurred\n * - pAny: Probability that at least one success occurred\n */\n public static firstSuccessWeights(\n pSuccess: number,\n pSpecial: number,\n n: number\n ) {\n // Preconditions: the \"special\" successes are a subset of all successes, so\n // 0 <= pSpecial <= pSuccess <= 1. Without this guard, violating inputs\n // silently produce probabilities outside [0,1].\n if (\n !Number.isFinite(pSuccess) ||\n !Number.isFinite(pSpecial) ||\n pSuccess < 0 ||\n pSuccess > 1 ||\n pSpecial < 0 ||\n pSpecial - pSuccess > EPS\n ) {\n throw new Error(\n `firstSuccessWeights: require 0 <= pSpecial <= pSuccess <= 1 (got pSuccess=${pSuccess}, pSpecial=${pSpecial})`\n );\n }\n\n const pFail = 1 - pSuccess;\n const pFailAll = Math.pow(pFail, n);\n\n // Probability of at least one success\n const pAny = 1 - pFailAll;\n\n // Avoid divide-by-zero if pSuccess is 0\n const denom = pSuccess === 0 ? 1 : pSuccess;\n\n // Breakdown of first success type\n const pSpecificSuccess = (pSpecial * pAny) / denom;\n const pGeneralSuccess = ((pSuccess - pSpecial) * pAny) / denom;\n\n const pNone = 1 - pSpecificSuccess - pGeneralSuccess; // Should equal pFailAll\n\n return { pSpecificSuccess, pGeneralSuccess, pNone, pAny };\n }\n\n /**\n * Maps every damage value through `f`, then optionally rounds it (`rounding`, default\n * `\"none\"`). Values that land on the same result merge their probability and, unless\n * `preserveCounts` is false, their per-label `count`. Damage attribution (`attr`) is dropped,\n * because it is tied to the old values. Nothing is pruned and the mass is unchanged.\n *\n * @param eps Epsilon carried by the result.\n * @throws Error when a mapped value is not a finite integer.\n */\n mapValues(\n f: (v: number) => number,\n eps: number = EPS,\n opts?: { rounding?: Rounding; preserveCounts?: boolean }\n ): PMF {\n const rounding = opts?.rounding ?? \"none\";\n const preserveCounts = opts?.preserveCounts ?? true;\n\n const round = (x: number) =>\n rounding === \"floor\"\n ? Math.floor(x)\n : rounding === \"ceil\"\n ? Math.ceil(x)\n : rounding === \"round\"\n ? Math.round(x)\n : x;\n\n const merged = new Map<number, Bin>();\n for (const [v, bin] of this) {\n if (bin.p === 0) continue;\n const u = round(f(v));\n if (!Number.isInteger(u)) {\n throw new Error(`mapValues: ${v} maps to ${u}, not a finite integer`);\n }\n PMF.mergeInto(merged, u, {\n p: bin.p,\n count: preserveCounts ? bin.count : {},\n });\n }\n\n const sorted = new Map([...merged.entries()].sort((a, b) => a[0] - b[0]));\n return new PMF(sorted, eps, this.normalized, `mapValues(${this.identifier})`);\n }\n\n static fromMap(\n m: Map<number, number>,\n eps: number = EPS,\n { requireIntegerValues = true }: { requireIntegerValues?: boolean } = {}\n ): PMF {\n const filtered: Array<[number, number]> = [];\n for (const [v, p] of m) {\n if (!Number.isFinite(v) || !Number.isFinite(p)) continue;\n if (p <= 0 || Math.abs(p) < eps) continue;\n if (requireIntegerValues && !Number.isInteger(v)) {\n throw new Error(`fromMap: non-integer outcome ${v}`);\n }\n filtered.push([v, p]);\n }\n\n if (filtered.length === 0) {\n throw new Error(\"fromMap: empty or invalid input map\");\n }\n\n // Kahan sum for stability\n let sum = 0;\n let c = 0;\n for (const [, p] of filtered) {\n const y = p - c;\n const t = sum + y;\n c = t - sum - y;\n sum = t;\n }\n if (sum <= 0) throw new Error(\"pmfFromMap: probabilities sum to 0\");\n\n filtered.sort((a, b) => a[0] - b[0]);\n\n const internal = new Map<number, Bin>();\n for (const [v, p] of filtered) {\n internal.set(v, { p: p / sum, count: {} }); // keep count object present for consistency\n }\n return new PMF(internal, eps);\n }\n\n query(): DiceQuery {\n return new DiceQuery(this);\n }\n}\n","/**\n * Bounce odds — the \"birthday problem\" for bouncing damage dice (e.g. Chromatic\n * Orb): the probability that at least two of K dice with S faces show the same\n * value, which is what lets the spell jump to another target.\n *\n * Accounts for two modifiers:\n * - **Elemental Adept** (`minimumDieRoll >= 2`): rolls below the minimum are\n * bumped up to it, collapsing the low faces onto a single heavier value.\n * - **Empowered Spell** (`rerollDamageDice > 0`): up to that many dice may be\n * rerolled once, giving a second chance at a match.\n *\n * Every case is exact. With Empowered Spell, a roll that already matched stands;\n * otherwise the caster rerolls the dice — which ones and how many, up to the\n * limit — that maximise the chance of a match. The rerolled dice match when they\n * collide among themselves or with a kept die.\n */\n\n/** Options that modify bounce odds via metamagic / feats. */\nexport interface BounceOddsOptions {\n /** Minimum die roll — e.g. 2 for Elemental Adept, 3 for Great Weapon Fighting 2024. */\n minimumDieRoll?: number;\n /**\n * How many dice may be rerolled once — e.g. CHA modifier for Empowered Spell. \"Up to\":\n * the odds assume the best choice of which dice, and how many, to reroll.\n */\n rerollDamageDice?: number;\n}\n\n/**\n * Exact per-face probability marginal for a single die, honoring threshold `reroll(k)` and\n * `minimum(v)` — the SAME two transforms `resolveSingleDie` (`builder/ast.ts`) applies, in the\n * same order (reroll, then minimum-floor), so a caller building `weights` for\n * `jointSumAndMatch`/`explodingPoolMatchProbability` gets face weights consistent with the pool's\n * actual resolved PMF. Returns a 1-indexed array (`weights[v - 1] = P(shows v)`, `1 <= v <= faces`);\n * a face collapsed onto by `minimum` carries its collapsed neighbors' mass, and a face below\n * `minimum` carries zero.\n */\nexport function faceWeights(faces: number, minimum = 0, reroll = 0): number[] {\n const f = Math.max(0, Math.floor(faces));\n if (f <= 0) return [];\n\n let weights = new Array<number>(f).fill(1 / f);\n\n const r = Math.max(0, Math.min(Math.floor(reroll), f));\n if (r > 0) {\n const rerollMass = r / f;\n const uniformReroll = rerollMass / f;\n weights = weights.map((_, i) => (i < r ? 0 : 1 / f) + uniformReroll);\n }\n\n const minV = Math.max(0, Math.floor(minimum));\n if (minV > 1) {\n const collapsed = new Array<number>(f).fill(0);\n for (let v = 1; v <= f; v++) {\n const target = Math.min(f, Math.max(v, minV));\n collapsed[target - 1] += weights[v - 1];\n }\n weights = collapsed;\n }\n\n return weights;\n}\n\n/** Binomial coefficient C(n, k), 0 for out-of-range k. */\nfunction binom(n: number, k: number): number {\n if (k < 0 || k > n) return 0;\n let result = 1;\n for (let i = 0; i < k; i++) result = (result * (n - i)) / (i + 1);\n return result;\n}\n\n/**\n * Exact P(all K dice show distinct values) for a die with `uniformCount`\n * ordinary faces (each probability `1/faces`) plus one optional heavy face whose\n * probability is `heavyWeight` (used for the Elemental-Adept collapse; pass 0\n * for a plain die). Uses the elementary symmetric polynomial e_K over the face\n * probabilities: P(all distinct) = K! · e_K.\n */\nfunction pAllDistinct(\n dice: number,\n faces: number,\n uniformCount: number,\n heavyWeight: number\n): number {\n const light = 1 / faces;\n // e_K = (choose K distinct light faces) + (heavy face + K-1 light faces).\n const eK =\n binom(uniformCount, dice) * Math.pow(light, dice) +\n heavyWeight * binom(uniformCount, dice - 1) * Math.pow(light, dice - 1);\n let kFactorial = 1;\n for (let i = 2; i <= dice; i++) kFactorial *= i;\n return kFactorial * eK;\n}\n\n/** Exact P(at least one duplicate) among `dice` dice, honoring Elemental Adept. */\nfunction pMatch(dice: number, faces: number, minimumDieRoll: number): number {\n if (dice <= 1) return 0;\n if (dice > faces) return 1;\n\n if (minimumDieRoll >= 2) {\n // Rolls 1..minimumDieRoll collapse onto the value `minimumDieRoll`, giving it\n // weight minimumDieRoll/faces; the faces above it stay uniform at 1/faces.\n const uniformCount = faces - minimumDieRoll; // values minimumDieRoll+1 .. faces\n const effectiveValues = uniformCount + 1; // + the collapsed value\n if (dice > effectiveValues) return 1;\n const heavyWeight = minimumDieRoll / faces;\n const distinct = pAllDistinct(dice, faces, uniformCount, heavyWeight);\n return Math.min(1, Math.max(0, 1 - distinct));\n }\n\n // Plain die: P(all distinct) = falling_factorial(faces, dice) / faces^dice.\n let pDistinct = 1;\n for (let i = 0; i < dice; i++) pDistinct *= (faces - i) / faces;\n return 1 - pDistinct;\n}\n\n/**\n * P(at least two of `diceCount` dice with `dieFaces` faces match), honoring\n * Elemental Adept and Empowered Spell. Returns a probability in [0, 1].\n *\n * With `rerollDamageDice`, a roll that matched stands; otherwise up to that many\n * dice are rerolled once, choosing which and how many to maximise the chance of a\n * match (rerolling fewer can be better: a kept Elemental Adept face is a likely\n * target). The fresh dice match when they collide among themselves or with a kept die.\n *\n * @param diceCount Number of dice rolled.\n * @param dieFaces Faces per die (e.g. 8 for d8).\n * @param options Optional metamagic / feat modifiers.\n */\nexport function calculateBounceOdds(\n diceCount: number,\n dieFaces: number,\n options?: BounceOddsOptions\n): number {\n if (diceCount <= 1) return 0;\n if (diceCount > dieFaces) return 1; // pigeonhole\n\n const minimumDieRoll = options?.minimumDieRoll ?? 0;\n const rerollDamageDice = options?.rerollDamageDice ?? 0;\n\n const pMatchFirst = pMatch(diceCount, dieFaces, minimumDieRoll);\n\n // Without Empowered Spell we're done.\n const rerollLimit = Math.min(Math.floor(rerollDamageDice), diceCount);\n if (rerollLimit <= 0 || pMatchFirst >= 1) return pMatchFirst;\n\n // A roll with no match shows distinct faces. Elemental Adept gives the die two kinds of\n // face: the collapsed minimum (the heavy face, weight minimumDieRoll/dieFaces) and the\n // `lightCount` faces above it (1/dieFaces each); a plain die has only light faces. After\n // rerolling k dice, no match means the k fresh dice are distinct and avoid every kept\n // face: k!·e_k over the faces not kept, which `pAllDistinct` computes.\n const collapsed = minimumDieRoll >= 2;\n const lightCount = collapsed ? dieFaces - minimumDieRoll : dieFaces;\n const heavyWeight = collapsed ? minimumDieRoll / dieFaces : 0;\n const pMissAfter = (rerolled: number, keptLight: number, heavyKept: boolean): number =>\n pAllDistinct(rerolled, dieFaces, lightCount - keptLight, heavyKept ? 0 : heavyWeight);\n\n // The best reroll for each kind of first roll. Without the heavy face every kept face is\n // light; with it, the caster either keeps it or rerolls it along with k − 1 light dice.\n let missLightOnly = 1;\n let missWithHeavy = 1;\n for (let rerolled = 1; rerolled <= rerollLimit; rerolled++) {\n const allLightKept = pMissAfter(rerolled, diceCount - rerolled, false);\n missLightOnly = Math.min(missLightOnly, allLightKept);\n missWithHeavy = Math.min(missWithHeavy, allLightKept);\n if (rerolled < diceCount) {\n missWithHeavy = Math.min(missWithHeavy, pMissAfter(rerolled, diceCount - 1 - rerolled, true));\n }\n }\n\n // P(distinct, light faces only) = n!·C(L, n)·l^n; P(distinct, one heavy) = n·H·(n−1)!·C(L, n−1)·l^(n−1).\n const pLightOnly = pAllDistinct(diceCount, dieFaces, lightCount, 0);\n const pWithHeavy = diceCount * heavyWeight * pAllDistinct(diceCount - 1, dieFaces, lightCount, 0);\n\n return Math.min(\n 1,\n pMatchFirst + pLightOnly * (1 - missLightOnly) + pWithHeavy * (1 - missWithHeavy)\n );\n}\n\n/**\n * Exact joint P(sum ∧ match), K = 2 hardcoded (per design: every shipped 5e bounce mechanic is\n * \"two or more\" — see `CHROMATIC_ORB.md`). `K > 2` (a face with multiplicity ≥ K) is a harder\n * combinatorial problem with no consumer; a `match` parameter whose only legal value is 2 would\n * advertise a generality this DP does not have, so it is not offered.\n *\n * `weights` is the resolved single-die marginal's per-face probabilities, 1-indexed\n * (`weights[v - 1] = P(one die shows v)`) — NOT assumed uniform, so `minimum`/threshold `reroll`\n * (which collapse or reweight faces) compose correctly. Dice are i.i.d. and homogeneous (same\n * `weights` for all of them): a mixed-face-size pool (e.g. 2d6 + 1d4) is a genuinely different,\n * harder problem (dice are no longer exchangeable) with no consumer here.\n */\n\n/** Exact P(sum = s) for `dice` i.i.d. dice sharing `weights`, as a sum -> mass map. */\nexport function diceSumDistribution(dice: number, weights: readonly number[]): Map<number, number> {\n let dist = new Map<number, number>([[0, 1]]);\n for (let die = 0; die < dice; die++) {\n const next = new Map<number, number>();\n for (const [sum, mass] of dist) {\n for (let face = 1; face <= weights.length; face++) {\n const w = weights[face - 1] ?? 0;\n if (w <= 0) continue;\n const s = sum + face;\n next.set(s, (next.get(s) ?? 0) + mass * w);\n }\n }\n dist = next;\n }\n return dist;\n}\n\n/**\n * Exact P(sum = s ∧ all `dice` values distinct), via the elementary-symmetric DP over faces:\n * `dp[c+1][s+f] += dp[c][s] · w_f`, each face used at most once (0/1 knapsack over faces, tracking\n * both count and sum). `P(sum = s ∧ all distinct) = dice! · dp[dice][s]` — `dp[dice][s]` sums over\n * unordered subsets of `dice` distinct faces; multiplying by `dice!` accounts for every way to\n * assign that subset to the `dice` labeled dice.\n */\nfunction sumAllDistinctDistribution(dice: number, weights: readonly number[]): Map<number, number> {\n const faceCount = weights.length;\n let dp = new Map<number, Map<number, number>>([[0, new Map([[0, 1]])]]);\n\n for (let face = 1; face <= faceCount; face++) {\n const w = weights[face - 1] ?? 0;\n const next = new Map<number, Map<number, number>>();\n for (const [count, sumMap] of dp) next.set(count, new Map(sumMap));\n\n if (w > 0) {\n for (const [count, sumMap] of dp) {\n const nextCount = count + 1;\n if (nextCount > dice) continue;\n const target = next.get(nextCount) ?? new Map<number, number>();\n for (const [sum, mass] of sumMap) {\n const s = sum + face;\n target.set(s, (target.get(s) ?? 0) + mass * w);\n }\n next.set(nextCount, target);\n }\n }\n dp = next;\n }\n\n let factorial = 1;\n for (let i = 2; i <= dice; i++) factorial *= i;\n\n const chosen = dp.get(dice) ?? new Map<number, number>();\n const result = new Map<number, number>();\n for (const [sum, mass] of chosen) result.set(sum, mass * factorial);\n return result;\n}\n\n/**\n * Exact joint P(sum = s ∧ match) for `dice` i.i.d. dice sharing `weights`\n * (`P(sum ∧ match) = P(sum) − P(sum ∧ all distinct)`). Returns a sum -> mass map; sums with zero\n * match mass are omitted. `dice <= 1` returns an empty map (no match possible).\n */\nexport function jointSumAndMatch(dice: number, weights: readonly number[]): Map<number, number> {\n if (dice <= 1) return new Map();\n\n const total = diceSumDistribution(dice, weights);\n const distinct = sumAllDistinctDistribution(dice, weights);\n\n // A sum carries match mass only if a roll with a repeated face reaches it: twice one face\n // plus any `dice − 2` faces. At every other sum the difference below is exactly 0, and\n // float residue must not turn it into a bin.\n const rest = diceSumDistribution(dice - 2, weights);\n const matchable = new Set<number>();\n weights.forEach((weight, index) => {\n if (weight <= 0) return;\n for (const sum of rest.keys()) matchable.add(2 * (index + 1) + sum);\n });\n\n const result = new Map<number, number>();\n for (const [sum, mass] of total) {\n if (!matchable.has(sum)) continue;\n const matchMass = Math.max(0, mass - (distinct.get(sum) ?? 0));\n if (matchMass > 0) result.set(sum, matchMass);\n }\n return result;\n}\n\n/**\n * The joint distribution over `(m, k)` — `m` dice landing on the pool's max face, `k` on anything\n * else — realized by the SAME `(pending, budget)` walk as the pool-wide exploding-dice DP\n * (`resolveExplodingPool` in `builder/ast.ts`): one traversal serves both the sum (there) and this\n * match composition (here), rather than each needing its own. `pMax` is the max face's probability\n * under the single die's resolved marginal.\n */\nfunction explodingPoolMkDistribution(\n pMax: number,\n count: number,\n budget: number\n): Map<string, number> {\n const binomial = (n: number, p: number): number[] => {\n const result = new Array<number>(n + 1).fill(0);\n result[0] = 1;\n for (let trial = 0; trial < n; trial++) {\n const next = new Array<number>(n + 1).fill(0);\n for (let successes = 0; successes <= trial; successes++) {\n const mass = result[successes];\n if (mass <= 0) continue;\n next[successes] += mass * (1 - p);\n next[successes + 1] += mass * p;\n }\n for (let i = 0; i <= n; i++) result[i] = next[i];\n }\n return result;\n };\n\n const memo = new Map<string, Map<string, number>>();\n const f = (pending: number, remainingBudget: number): Map<string, number> => {\n if (pending === 0) return new Map([[\"0,0\", 1]]);\n if (remainingBudget === 0) {\n const binom = binomial(pending, pMax);\n const result = new Map<string, number>();\n for (let m = 0; m <= pending; m++) {\n const mass = binom[m];\n if (mass > 0) result.set(`${m},${pending - m}`, mass);\n }\n return result;\n }\n\n const key = `${pending},${remainingBudget}`;\n const cached = memo.get(key);\n if (cached) return cached;\n\n const result = new Map<string, number>();\n const accumulate = (mk: string, mass: number): void => {\n result.set(mk, (result.get(mk) ?? 0) + mass);\n };\n\n for (const [mk, mass] of f(pending, remainingBudget - 1)) {\n const [m, k] = mk.split(\",\").map(Number);\n accumulate(`${m + 1},${k}`, mass * pMax);\n }\n for (const [mk, mass] of f(pending - 1, remainingBudget)) {\n const [m, k] = mk.split(\",\").map(Number);\n accumulate(`${m},${k + 1}`, mass * (1 - pMax));\n }\n\n memo.set(key, result);\n return result;\n };\n\n return f(count, budget);\n}\n\n/** Exact P(`count` i.i.d. dice with face probabilities `weights` all differ): `count! · e_count(weights)`. */\nfunction allDistinctProbability(count: number, weights: readonly number[]): number {\n const symmetric = new Array<number>(count + 1).fill(0);\n symmetric[0] = 1;\n for (const weight of weights) {\n if (weight <= 0) continue;\n for (let chosen = count; chosen >= 1; chosen--) symmetric[chosen] += symmetric[chosen - 1] * weight;\n }\n let factorial = 1;\n for (let i = 2; i <= count; i++) factorial *= i;\n return factorial * symmetric[count];\n}\n\n/**\n * P(match) for a pool sharing ONE pool-wide exploding-dice budget (see\n * `RollBuilder.explodePool()`). The plain `jointSumAndMatch`/`calculateBounceOdds` formulas assume\n * `dice` i.i.d. dice — false for an exploded pool, since conditioning on a realized size already\n * reveals some die rolled max. Exploiting that max is the only exploding face: condition on `m`\n * (dice showing max, the exploded ones included) and `k` (dice showing anything else) —\n *\n * `m ≥ 2` → match is certain (two dice already share the max face).\n * `m ≤ 1` → match iff the `k` non-max dice collide among themselves. Each shows face `v` with\n * the conditional weight `w_v / (1 − pMax)`, and they cannot collide with the max face,\n * so the two parts separate.\n *\n * So a single die can match its own explosion: a lone d8 with budget ≥ 1 matches when it rolls\n * 8 and then 8 again (1/64).\n *\n * `weights` is the single (non-exploding-budget) die's resolved marginal, 1-indexed with the\n * max face last, as {@link faceWeights} returns it.\n */\nexport function explodingPoolMatchProbability(\n weights: readonly number[],\n count: number,\n budget: number\n): number {\n if (count <= 0 || weights.length === 0) return 0;\n\n const pMax = weights[weights.length - 1];\n const nonMax = pMax < 1 ? weights.slice(0, -1).map((weight) => weight / (1 - pMax)) : [];\n\n let pMatchTotal = 0;\n for (const [mk, weight] of explodingPoolMkDistribution(pMax, count, budget)) {\n const [m, k] = mk.split(\",\").map(Number);\n if (m >= 2) pMatchTotal += weight;\n // Fewer than two non-max dice cannot collide: skip the sum that is 1 only up to rounding.\n else if (k >= 2) pMatchTotal += weight * (1 - allDistinctProbability(k, nonMax));\n }\n return Math.min(1, Math.max(0, pMatchTotal));\n}\n","import type { Bin } from \"../common/types\";\nimport { EPS } from \"../common/types\";\nimport { PMF } from \"./pmf\";\n\n/**\n * A labeled mixture builder that preserves provenance in Bin.count.\n *\n * `eps` prunes relative to the normalized mass: an outcome whose share of the total is below\n * `eps` is dropped when the PMF is built, and the survivors are renormalized. `eps = 0` keeps\n * every outcome with positive mass.\n */\nexport class Mixture<L extends string = string> {\n private readonly totals = new Map<number, number>(); // raw mass per outcome (pre-normalization)\n private readonly labelMass = new Map<number, Record<L, number>>(); // raw mass per outcome per label\n private readonly eps: number;\n\n constructor(eps: number = EPS) {\n this.eps = Number.isFinite(eps) ? eps : EPS;\n }\n\n /** Remove all accumulated state. */\n clear(): this {\n this.totals.clear();\n this.labelMass.clear();\n return this;\n }\n\n /** Number of distinct outcome values currently accumulated. */\n size(): number {\n return this.totals.size;\n }\n\n /** Whether a label was ever added. */\n hasLabel(label: L): boolean {\n for (const bag of this.labelMass.values()) if (bag[label]) return true;\n return false;\n }\n\n /**\n * Add a labeled component with a mixture weight.\n * Weight can be any positive finite number; only the ratios between weights matter.\n */\n add(label: L, pmf: PMF, weight = 1): this {\n if (!Number.isFinite(weight) || weight <= 0) return this;\n\n // Stream probabilities from each [value, Bin] pair.\n for (const [v, bin] of pmf) {\n const p = bin.p;\n if (p <= 0) continue;\n\n const add = weight * p;\n if (!Number.isFinite(add) || add <= 0) continue;\n\n this.totals.set(v, (this.totals.get(v) ?? 0) + add);\n const bag = this.labelMass.get(v) ?? ({} as Record<L, number>);\n bag[label] = (bag[label] ?? 0) + add;\n this.labelMass.set(v, bag);\n }\n\n return this;\n }\n\n /**\n * The normalized mixture. Each bin's `p` and per-label `count` are its raw mass divided by\n * the grand total, so labels sum to `p` whatever the weights summed to. Outcomes below\n * `eps` of the total (the pruning `eps` given to the constructor) are dropped first.\n *\n * @param eps Epsilon carried by the built PMF.\n */\n buildPMF(eps: number = EPS): PMF {\n const grand = kahanSum(this.totals.values());\n if (!(grand > 0)) throw new Error(\"Mixture: zero total mass\");\n\n const threshold = this.eps * grand;\n const kept = [...this.totals].filter(([, m]) => m > 0 && m >= threshold);\n if (kept.length === 0) {\n throw new Error(`Mixture: pruning at eps ${this.eps} removed every outcome`);\n }\n const keptTotal =\n kept.length === this.totals.size ? grand : kahanSum(kept.map(([, m]) => m));\n\n const internal = new Map<number, Bin>();\n for (const [v, m] of kept) {\n const count: Record<string, number> = {};\n const bag = this.labelMass.get(v) ?? ({} as Record<L, number>);\n for (const label in bag) count[label] = bag[label] / keptTotal;\n internal.set(v, { p: m / keptTotal, count });\n }\n return new PMF(internal, eps);\n }\n\n /**\n * Produce normalized *per-label* PMFs (labels independent).\n * These are unlabeled PMFs built from the raw mass of that label alone; values below `eps`\n * of the label's own mass are pruned.\n */\n byOutcome(): Record<L, PMF> {\n // Collect the set of labels present.\n const labels = new Set<L>();\n for (const bag of this.labelMass.values()) {\n for (const k of Object.keys(bag) as L[]) labels.add(k);\n }\n\n const out = {} as Record<L, PMF>;\n for (const label of labels) {\n const labelTotal = kahanSum(\n [...this.labelMass.values()].map((bag) => bag[label] ?? 0)\n );\n if (!(labelTotal > 0)) continue;\n const m = new Map<number, number>();\n for (const [v, bag] of this.labelMass) {\n const w = bag[label];\n if (w) m.set(v, w / labelTotal);\n }\n out[label] = PMF.fromMap(m, this.eps);\n }\n return out;\n }\n\n /**\n * Mixture weights per label, normalized to sum to 1 over labels that appeared.\n * Uses raw mass before per-outcome normalization.\n */\n weights(): Record<L, number> {\n const res = {} as Record<L, number>;\n for (const [, bag] of this.labelMass) {\n for (const [lab, w] of Object.entries(bag) as [L, number][]) {\n if (!Number.isFinite(w) || w <= 0) continue;\n res[lab] = (res[lab] ?? 0) + w;\n }\n }\n const total = kahanSum(Object.values(res) as number[]);\n if (total > 0) {\n for (const k in res) res[k as L] = res[k as L] / total;\n }\n return res;\n }\n\n toJSON(): {\n totals: Array<[number, number]>;\n labels: Array<[number, Record<L, number>]>;\n eps: number;\n } {\n return {\n totals: Array.from(this.totals.entries()).sort((a, b) => a[0] - b[0]),\n labels: Array.from(this.labelMass.entries()).sort((a, b) => a[0] - b[0]),\n eps: this.eps,\n };\n }\n\n static mix<L extends string = string>(\n items: Array<[label: L, pmf: PMF, weight: number]>,\n eps: number = EPS\n ): PMF {\n const mix = new Mixture<L>(eps);\n for (const [lab, pmf, w] of items) mix.add(lab, pmf, w);\n return mix.buildPMF(eps);\n }\n}\n\n/** Compensated (Kahan) sum. */\nfunction kahanSum(values: Iterable<number>): number {\n let sum = 0;\n let c = 0;\n for (const v of values) {\n const y = v - c;\n const t = sum + y;\n c = t - sum - y;\n sum = t;\n }\n return sum;\n}\n","/**\n * Crit doubling for parsed damage strings: scale every dice term's count, keep every\n * operator and flat. A dice term is a die together with its per-die modifiers, so the rewrite\n * reads the string with the same grammar `parse()` uses:\n *\n * - `2d6 + 5` → `4d6 + 5`; `2d6 // 2` → `4d6 // 2` (the division applies to the doubled total).\n * - `d6 reroll 1 + 3` → `2(d6 reroll 1) + 3` and `3>d6` → `2(3>d6)`: a lone die with `reroll`,\n * `>`, `<` or `!` applied to it is one die term; a `reroll`'s argument is a face set, never dice.\n * - `2(d6 reroll 1)` → `4(d6 reroll 1)`; `3(1d6 + 2)` → `3(2d6 + 2)` (copies of a group whose\n * flats must not double are doubled inside).\n * - `2kh1(2d6 + 3)` → `2kh1(4d6 + 3)`: a pool doubles inside, then pools; its trial count stays.\n * Only keep-highest-of-1 (\"roll it N times, keep the best\") does: any other keep (`4kh3d6`,\n * `3kl1(1d6)`), a min of two dice terms (`d6 < d6`) and an `&` mix with dice on either side\n * (`1d6 & 3`: doubling its dice also changes each side's share of the mix) have no single doubled\n * meaning, so they throw {@link AmbiguousCritDoublingError} and the caller must give the crit\n * explicitly.\n *\n * An attack or save check (`AC`/`DC`, or a crit/save/pc/miss clause) is not a damage expression —\n * doubling it would double the d20 — so it throws, as does a dice-valued repeat count (`d4d6`).\n */\ntype DiceAtom =\n | { kind: \"number\"; start: number; end: number; value: number }\n | { kind: \"die\"; start: number; end: number }\n | { kind: \"group\"; start: number; end: number; expr: DiceExpr }\n | { kind: \"keep\"; start: number; end: number; inner: DiceAtom; mode: \"h\" | \"l\"; kept: number };\ntype DiceChain = { start: number; atoms: DiceAtom[] };\ntype DiceOp = { op: string; arg: DiceChain | undefined; end: number };\ntype DiceExpr = { first: DiceChain; rest: DiceOp[] };\n\nconst isDigitOrN = (c: string | undefined): boolean =>\n c !== undefined && ((c >= \"0\" && c <= \"9\") || c === \"n\");\n\n/** Operators that, applied to a lone die, modify that die rather than a total. */\nconst isPerDieOp = (op: string): boolean =>\n op === \"reroll\" || op === \">\" || op === \"<\" || op === \"!\";\n\n/** Why a parsed string's dice cannot double: it is not a damage expression `scaleParsedDice` can rewrite. */\nexport class UndoubleableExpressionError extends Error {}\n\n/**\n * Why a damage payload's dice cannot double on a crit: it is damage, but \"double the dice\"\n * has more than one reading for it (a keep other than keep-highest-of-1, a `bestOf()`, a die rolled\n * with advantage, an `&` mix with dice). Never caught as {@link UndoubleableExpressionError}: no\n * crit is approximated.\n */\nexport class AmbiguousCritDoublingError extends Error {}\n\n/** A recursive-descent reader over `parse()`'s cleaned grammar (see `parser.ts`). */\nclass DiceTermReader {\n private pos = 0;\n\n constructor(\n private readonly s: string,\n private readonly expression: string\n ) {}\n\n read(): DiceExpr {\n const expr = this.expr();\n if (this.pos !== this.s.length) this.fail(`unexpected '${this.s[this.pos]}'`);\n return expr;\n }\n\n private fail(reason: string): never {\n throw new UndoubleableExpressionError(`Cannot double the dice of \"${this.expression}\": ${reason}.`);\n }\n\n private expr(): DiceExpr {\n const first = this.chain();\n const rest: DiceOp[] = [];\n for (let op = this.operation(); op !== undefined; op = this.operation()) {\n if (op === \"ac\") {\n this.fail(\"it contains an attack check (a d20 roll against an AC), so it is not a damage expression\");\n }\n if (op === \"dc\") {\n this.fail(\"it contains a saving throw check (a d20 roll against a DC), so it is not a damage expression\");\n }\n const arg = op === \"!\" ? undefined : this.chain();\n const c = this.s[this.pos];\n if (c === \"x\" || c === \"c\" || c === \"s\" || c === \"m\" || this.s.startsWith(\"pc\", this.pos)) {\n this.fail(\"it contains a check-outcome clause (crit/save/pc/miss), so it is not a damage expression\");\n }\n rest.push({ op, arg, end: this.pos });\n }\n return { first, rest };\n }\n\n private chain(): DiceChain {\n const start = this.pos;\n const atoms: DiceAtom[] = [];\n for (let atom = this.atom(); atom !== undefined; atom = this.atom()) atoms.push(atom);\n return { start, atoms };\n }\n\n private atom(): DiceAtom | undefined {\n const start = this.pos;\n const c = this.s[start];\n if (c === \"(\") {\n this.pos++;\n const expr = this.expr();\n if (this.s[this.pos] !== \")\") this.fail(\"unbalanced parentheses\");\n this.pos++;\n return { kind: \"group\", start, end: this.pos, expr };\n }\n if (c === \"h\" && this.s[start + 1] === \"d\" && isDigitOrN(this.s[start + 2])) {\n this.pos += 2;\n this.number();\n return { kind: \"die\", start, end: this.pos };\n }\n if (c === \"d\" && isDigitOrN(this.s[start + 1])) {\n this.pos += 1;\n this.number();\n return { kind: \"die\", start, end: this.pos };\n }\n if (c === \"k\") {\n const mode = this.s[start + 1];\n if (mode !== \"h\" && mode !== \"l\") this.fail(\"'k' must be followed by 'h' or 'l'\");\n this.pos += 2;\n const kept = this.number();\n const inner = this.atom();\n if (inner === undefined) this.fail(\"a keep needs dice after it\");\n return { kind: \"keep\", start, end: this.pos, inner, mode, kept };\n }\n if (isDigitOrN(c)) {\n const value = this.number();\n return { kind: \"number\", start, end: this.pos, value };\n }\n return undefined;\n }\n\n private number(): number {\n let digits = \"\";\n while (isDigitOrN(this.s[this.pos])) {\n const ch = this.s[this.pos++];\n digits += ch === \"n\" ? \"0\" : ch; // ParsedRollBuilder always parses with n = 0\n }\n if (digits.length === 0) this.fail(`expected a number at '${this.s[this.pos]}'`);\n return parseInt(digits, 10);\n }\n\n private operation(): string | undefined {\n const rest = this.s.slice(this.pos);\n const op = [\"reroll\", \"**\", \"//\", \"~+\", \"ac\", \"dc\", \"!\", \">\", \"<\", \"+\", \"-\", \"&\", \"*\", \"/\", \"=\"].find(\n (token) => rest.startsWith(token)\n );\n if (op !== undefined) this.pos += op.length;\n return op;\n }\n}\n\nfunction atomHasDice(atom: DiceAtom): boolean {\n switch (atom.kind) {\n case \"die\":\n return true;\n case \"number\":\n return false;\n case \"keep\":\n return atomHasDice(atom.inner);\n case \"group\":\n // A `reroll`'s argument is a face set (`reroll d2` = faces 1–2), never damage dice.\n return (\n chainHasDice(atom.expr.first) ||\n atom.expr.rest.some(({ op, arg }) => op !== \"reroll\" && arg !== undefined && chainHasDice(arg))\n );\n }\n}\n\nconst chainHasDice = (chain: DiceChain): boolean => chain.atoms.some(atomHasDice);\n\nconst isSingleDieAtom = (atom: DiceAtom): boolean =>\n atom.kind === \"die\" || (atom.kind === \"group\" && isSingleDieExpr(atom.expr, atom.expr.rest.length));\n\n/** Is `expr`'s first `opCount` operations one die term: one lone die, per-die operators, and flats? */\nfunction isSingleDieExpr(expr: DiceExpr, opCount: number): boolean {\n const operands = [expr.first];\n for (const { op, arg } of expr.rest.slice(0, opCount)) {\n if (!isPerDieOp(op)) return false;\n if (op !== \"reroll\" && arg !== undefined) operands.push(arg);\n }\n let dice = 0;\n for (const chain of operands) {\n if (chain.atoms.length === 1 && isSingleDieAtom(chain.atoms[0])) dice++;\n else if (chainHasDice(chain)) return false;\n }\n return dice === 1;\n}\n\n/** Rewrites every dice term's count in a parsed damage expression by `scale`. */\nexport function scaleParsedDice(expression: string, scale: number): string {\n // `parse()` drops every space and lowercases; keep a map back to the original characters so\n // the rewrite leaves the caller's spacing and casing alone.\n let cleaned = \"\";\n const original: number[] = [];\n for (let i = 0; i < expression.length; i++) {\n if (expression[i] === \" \") continue;\n cleaned += expression[i].toLowerCase();\n original.push(i);\n }\n const root = new DiceTermReader(cleaned, expression).read();\n\n const edits: { from: number; to: number; text: string }[] = [];\n /** The original characters behind cleaned `[start, end)`, spaces inside included. */\n const span = (start: number, end: number) => ({ from: original[start], to: original[end - 1] + 1 });\n const wrap = (start: number, end: number, open: string) => {\n const { from, to } = span(start, end);\n edits.push({ from, to: from, text: open }, { from: to, to, text: \")\" });\n };\n const source = (start: number, end: number) => {\n const { from, to } = span(start, end);\n return expression.slice(from, to);\n };\n\n // Shapes whose doubling has no single meaning, each with why. They are refused after the whole\n // walk, so a string that is not damage at all still reports that (UndoubleableExpressionError).\n const ambiguous: string[] = [];\n const keepReading =\n 'has no single doubled meaning (only keep-highest-of-1, \"roll it N times, keep the best\", doubles its dice inside each trial)';\n const noteKeep = (keep: Extract<DiceAtom, { kind: \"keep\" }>, trials?: DiceAtom): void => {\n // A keep of numbers alone is a constant: it has no dice to double, so one meaning.\n if ((keep.mode === \"h\" && keep.kept === 1) || !atomHasDice(keep.inner)) return;\n ambiguous.push(`the keep \\`${source(trials?.kind === \"number\" ? trials.start : keep.start, keep.inner.start)}\\` ${keepReading}`);\n };\n\n // After a keep's count a bare prefix would merge into that number (`4kh3d6` → `4kh32d6`), so a\n // kept lone die takes its count inside new parentheses: `4kh3(2d6)`.\n const scaleKept = (inner: DiceAtom): void => {\n if (isSingleDieAtom(inner)) wrap(inner.start, inner.end, `(${scale}`);\n else if (inner.kind === \"group\") scaleExpr(inner.expr);\n else if (inner.kind === \"keep\") {\n noteKeep(inner);\n scaleKept(inner.inner);\n }\n };\n\n const scaleChain = (chain: DiceChain): void => {\n const { atoms } = chain;\n if (atoms.length === 0) return;\n const last = atoms[atoms.length - 1];\n const counts = atoms.slice(0, -1);\n if (counts.some(atomHasDice)) {\n throw new UndoubleableExpressionError(\n `Cannot double the dice of \"${expression}\": a dice-valued repeat count (like d4d6) has no single dice term to double.`\n );\n }\n if (last.kind === \"keep\") {\n noteKeep(last, counts[counts.length - 1]);\n scaleKept(last.inner); // the pool's trial count stays; its dice double inside\n } else if (isSingleDieAtom(last)) {\n const count = counts[counts.length - 1];\n if (count?.kind === \"number\") {\n edits.push({ ...span(count.start, count.end), text: String(count.value * scale) });\n } else {\n const at = original[last.start];\n edits.push({ from: at, to: at, text: String(scale) });\n }\n } else if (last.kind === \"group\") {\n scaleExpr(last.expr); // copies of a group: double inside so its flats stay single\n }\n };\n\n function scaleExpr(expr: DiceExpr): void {\n // Operators bind left to right, so a leading lone die with per-die operators is one term.\n let unitOps = 0;\n for (let i = 1; i <= expr.rest.length && isPerDieOp(expr.rest[i - 1].op); i++) {\n if (isSingleDieExpr(expr, i)) unitOps = i;\n }\n if (unitOps > 0) wrap(expr.first.start, expr.rest[unitOps - 1].end, `${scale}(`);\n else scaleChain(expr.first);\n let leftHasDice = unitOps > 0 || chainHasDice(expr.first);\n for (const { op, arg, end } of expr.rest.slice(unitOps)) {\n if (op === \"reroll\" || arg === undefined) continue;\n const argHasDice = chainHasDice(arg);\n // `a < b` is min(a, b): with dice on both sides it keeps the lower of two dice terms.\n if (op === \"<\" && leftHasDice && argHasDice) {\n ambiguous.push(`the lower of two dice terms \\`${source(expr.first.start, end)}\\` ${keepReading}`);\n }\n // `a & b` mixes by count: doubling a side's dice multiplies its count, so its share moves.\n if (op === \"&\" && (leftHasDice || argHasDice)) {\n ambiguous.push(\n `the mix \\`${source(expr.first.start, end)}\\` has no single doubled meaning (an \\`&\\` weights each side ` +\n `by its count of outcomes, so doubling a side's dice also changes its share of the mix)`\n );\n }\n leftHasDice ||= argHasDice;\n scaleChain(arg);\n }\n }\n\n scaleExpr(root);\n if (ambiguous.length > 0) {\n throw new AmbiguousCritDoublingError(\n `Cannot double the dice of \"${expression}\" on a crit: ${ambiguous[0]}. ` +\n `Give the crit explicitly: onCrit(...) on an attack, critDamage on a rider, or a crit (...) clause.`\n );\n }\n\n let result = expression;\n for (const { from, to, text } of edits.sort((a, b) => b.from - a.from)) {\n result = result.slice(0, from) + text + result.slice(to);\n }\n return result;\n}\n","/**\n * Error thrown when a dice expression cannot be parsed.\n *\n * Extends the built-in {@link Error}, so existing `catch (e)` / message checks\n * continue to work, while callers can now narrow with `instanceof DiceParseError`.\n *\n * @example\n * try {\n * parse(\"d6@3\");\n * } catch (e) {\n * if (e instanceof DiceParseError) {\n * // e.expression === \"d6@3\"\n * }\n * }\n */\nexport class DiceParseError extends Error {\n /** The original expression that failed to parse, when available. */\n readonly expression?: string;\n\n /** The underlying error that triggered this one, when available. */\n readonly cause?: unknown;\n\n constructor(\n message: string,\n options?: { expression?: string; cause?: unknown }\n ) {\n super(message);\n this.name = \"DiceParseError\";\n this.expression = options?.expression;\n this.cause = options?.cause;\n // Restore the prototype chain for reliable `instanceof` across targets.\n Object.setPrototypeOf(this, DiceParseError.prototype);\n }\n}\n","// dice.ts (internal)\n\nimport { DiceParseError } from \"../common/errors\";\nimport type {\n Bin,\n DamageDistribution,\n OutcomeLabelMap,\n OutcomeType,\n} from \"../common/types\";\nimport { EPS } from \"../common/types\";\nimport { PMF } from \"../pmf/pmf\";\n\n/**\n * Work budget for a single dice×dice operation. binaryOp is O(faces₁ × faces₂),\n * so two individually-legal large dice (e.g. `d100000 + d100000`) would otherwise\n * enumerate ~10^10 face pairs and hang. The parser's per-die / per-count caps\n * bound each operand but not their product, so this bounds the operation itself.\n * Generous enough for any realistic expression; only pathological blow-ups trip\n * it. (Chosen so expressions well beyond normal use still parse; tune if needed.)\n */\nconst MAX_BINARY_OUTCOMES = 100_000_000;\n\n/** Internal bookkeeping attached to a {@link Dice} during parsing. */\nexport interface DicePrivateData {\n /** Marks a DC (saving-throw) check so outcomes are attributed correctly. */\n isDCCheck?: boolean;\n /** The \"other\" distribution recorded by {@link Dice.combine}. */\n except?: Dice | Record<string, never>;\n /** Set by a keep (`4kh3`, `2kl1`) on the dice it keeps from: how many of the repeated copies are\n * kept, and whether the lowest or the highest. A keep of one (`2kh1d20`) keeps a single natural roll. */\n keep?: { kept: number; lowest: boolean };\n /** The natural roll of an attack check, followed through every op applied to it, so a crit is the\n * natural-max event (or an `xcrit` range of natural faces) at any bonus roll. It is the check's one\n * d20 wherever it sits in the sum, or with no d20 its largest die; other dice are bonus dice. Read\n * and written by {@link parseExpression} in parser.ts; set on every freshly parsed `dN`/`hdN` atom. */\n critTrack?: CritTrack;\n /** Set instead of {@link critTrack} on a value whose natural die has no single natural roll to\n * follow (`2d20`, `d20 + d20`, `(d20 + 1d4)!`, a bonus pool like `2d4`): that die's size, so a\n * die it outranks never passes for the natural roll. Read and written by parser.ts. */\n untrackedSides?: number;\n /** Set on a value built from numbers alone, with no die anywhere in it but an AC or DC target. As an\n * attack check it has no natural roll, so its crit mass is exactly 0. Read and written by parser.ts. */\n noDie?: true;\n /** The operands of an `&` mix, each carried through every op since with its own natural roll, so the\n * mix crits where a branch does, at that branch's share. Read and written by parser.ts. */\n branches?: readonly Dice[];\n /** Set on the result of an `AC` gate: a following `*` is an attack's hit payload, which crits\n * even with no crit clause. Read by {@link parseExpression} in parser.ts. */\n isACCheck?: boolean;\n /** Set on an attack whose crit is its hit payload doubled (no crit clause): the payload's\n * text, so a trailing hit-only term joins the payload and doubles with it. See parser.ts. */\n implicitCrit?: { payload: string };\n /** Set on an attack's payload: the result of an AC check's `*`, and of each hit-only term after it.\n * A landed hit that deals 0 there is recorded under `hit` at 0, where the misses also sit, and a\n * later hit-only term keeps it (see {@link Dice.calculateHitDistribution}). Read and written by parser.ts. */\n attackPayload?: true;\n}\n\n/**\n * An attack check's natural roll. `slice(f)` is the check's share where the kept natural roll is f,\n * in the check's own counts: every op after the natural die acts face by face, so replaying the\n * ops on face f's weight gives exactly that share, and a mix of checks adds its branches' shares.\n */\nexport interface CritTrack {\n /** The natural die's size. */\n readonly sides: number;\n /** The check is its natural roll itself, with no op since (`d20`, `2kh1d20`, `d20 > d20`, `d20 & d20`). */\n readonly bare: boolean;\n readonly slice: (face: number) => Dice;\n}\n\n/**\n * @internal\n */\nexport class Dice {\n private readonly faces: DamageDistribution = {};\n public privateData: DicePrivateData = {};\n // Partial: the object starts empty and gains keys as outcomes are recorded,\n // so the type must not claim every OutcomeType is present. (Previously typed\n // as a full Record via an `as` cast, which lied about missing keys.)\n private outcomeData: Partial<Record<OutcomeType, DamageDistribution>> = {};\n private hasHitDistributionCalculated = false;\n public identifier?: string;\n\n constructor(x: number = 0) {\n if (x <= 0) return;\n for (let i = 1; i <= x; i++) {\n this.faces[i] = 1;\n }\n }\n\n getOutcomeDistribution(key: OutcomeType): DamageDistribution | undefined {\n if (key === \"hit\") {\n this.ensureHitDistribution();\n }\n\n const distribution = this.outcomeData[key];\n if (distribution === undefined) return undefined;\n\n return { ...distribution };\n }\n\n getFullOutcomeDistribution(): Partial<\n Record<OutcomeType, DamageDistribution>\n > {\n return { ...this.outcomeData };\n }\n\n setOutcomeDistribution(\n key: OutcomeType,\n data: DamageDistribution | undefined\n ): void {\n if (data) {\n this.outcomeData[key] = data;\n } else {\n delete this.outcomeData[key];\n }\n }\n\n hasOutcomeData(key: OutcomeType): boolean {\n if (key === \"hit\") {\n this.ensureHitDistribution();\n }\n const data = this.outcomeData[key];\n return data !== undefined && Object.keys(data).length > 0;\n }\n\n getOutcomeCount(key: OutcomeType, face: number): number {\n return this.outcomeData[key]?.[face] ?? 0;\n }\n\n getAverage(key: OutcomeType): number {\n const distribution = this.getOutcomeDistribution(key);\n if (!distribution) return 0;\n\n const totalCount = Object.values(distribution).reduce(\n (sum, count) => sum + count,\n 0\n );\n const expectedDamage = Object.entries(distribution).reduce(\n (sum, [damage, count]) => sum + Number(damage) * count,\n 0\n );\n if (totalCount === 0) return 0;\n return expectedDamage / totalCount;\n }\n\n // Public (no modifier) for direct test access.\n calculateHitDistribution(): DamageDistribution {\n const hitValues: DamageDistribution = {};\n\n // Hoist the per-outcome distributions out of the face loop: they are\n // constant across faces, so fetching (and previously cloning) them once is\n // O(faces + outcomes) instead of O(faces × outcomes). The stored maps are\n // only read here, never mutated, so reading them directly is safe and\n // produces identical counts.\n const subtractedOutcomes: (DamageDistribution | undefined)[] = [\n this.outcomeData.crit,\n this.outcomeData.missNone,\n this.outcomeData.missDamage,\n this.outcomeData.saveHalf,\n this.outcomeData.saveFail,\n this.outcomeData.pc,\n ];\n\n for (const [face, totalCount] of Object.entries(this.faces)) {\n const numFace = Number(face);\n let hitCount = totalCount;\n\n for (const distribution of subtractedOutcomes) {\n const outcomeCount = distribution?.[numFace];\n if (outcomeCount) {\n hitCount -= outcomeCount;\n }\n }\n\n // At 0 a miss and a hit that deals nothing coincide: only the landed hits recorded there are\n // hits (an attack payload's, see `attackPayload`); everything else at 0 is a miss.\n if (numFace === 0) {\n hitCount = this.outcomeData.hit?.[0] ?? 0;\n }\n\n // Defensive clamp: guards against negative hit counts from older\n // inclusion-exclusion logic. Should never trigger in practice.\n if (hitCount < 0) {\n hitCount = 0;\n }\n hitValues[numFace] = hitCount;\n }\n\n return hitValues;\n }\n\n private ensureHitDistribution(): void {\n if (!this.hasHitDistributionCalculated) {\n const hitValues = this.calculateHitDistribution();\n this.setOutcomeDistribution(\"hit\", hitValues);\n this.hasHitDistributionCalculated = true;\n }\n }\n\n // PRIVATE FUNCTIONS\n\n private binaryOp(\n other: Dice | number,\n op: (a: number, b: number) => number,\n diceConstructor?: () => Dice\n ): Dice {\n const result = diceConstructor ? diceConstructor() : new Dice();\n\n const isScalar = typeof other === \"number\";\n const keys1 = this.keys();\n // Hoist the inner die's faces out of the outer loop: they are constant\n // across key1, so computing them once avoids re-allocating the array on\n // every outer iteration.\n const keys2 = isScalar ? [] : (other as Dice).keys();\n\n // Guard the O(faces₁ × faces₂) work before running it: a binary op between\n // two large (but individually legal) dice would otherwise blow up.\n if (!isScalar && keys1.length * keys2.length > MAX_BINARY_OUTCOMES) {\n throw new DiceParseError(\n `Dice operation over ${keys1.length}×${keys2.length} face pairs exceeds the maximum of ${MAX_BINARY_OUTCOMES}`\n );\n }\n\n for (const key1 of keys1) {\n const value1 = this.faces[key1]!;\n\n if (isScalar) {\n const resultKey = op(key1, other as number);\n result.increment(resultKey, value1);\n } else {\n for (const key2 of keys2) {\n const value2 = other.faces[key2]!;\n const resultKey = op(key1, key2);\n result.increment(resultKey, value1 * value2);\n }\n }\n }\n\n return result;\n }\n\n // PUBLIC FUNCTIONS\n\n getFaceEntries(): [number, number][] {\n return Object.entries(this.faces).map(([k, v]) => [Number(k), v]);\n }\n\n getFaceMap(): DamageDistribution {\n return { ...this.faces };\n }\n\n get(face: number): number {\n return this.faces[face] ?? 0;\n }\n\n keys(): number[] {\n return Object.keys(this.faces).map(Number);\n }\n\n values(): number[] {\n return Object.values(this.faces);\n }\n\n total(): number {\n return Object.values(this.faces).reduce((sum, value) => sum + value, 0);\n }\n\n public setFace(key: number, value: number): void {\n this.faces[key] = value;\n }\n\n public static scalar(value: number): Dice {\n const result = new Dice();\n result.increment(value, 1);\n return result;\n }\n\n public maxFace(): number {\n const numericKeys = this.keys();\n\n if (numericKeys.length === 0) {\n throw new Error(\"No numeric faces found\");\n }\n\n return Math.max(...numericKeys);\n }\n\n public minFace(): number {\n const numericKeys = this.keys();\n\n if (numericKeys.length === 0) {\n throw new Error(\"No numeric faces found\");\n }\n\n return Math.min(...numericKeys);\n }\n\n public increment(face: number, count: number): void {\n const current = this.faces[face] || 0;\n this.faces[face] = current + count;\n }\n\n /** Scales every face count, and every outcome's counts with it, so each outcome keeps its share. */\n public normalize(scalar: number): Dice {\n const result = new Dice();\n\n for (const [face, count] of Object.entries(this.faces)) {\n result.faces[Number(face)] = count * scalar;\n }\n\n result.privateData = { ...this.privateData };\n for (const [key, distribution] of Object.entries(this.outcomeData)) {\n const scaled: DamageDistribution = {};\n for (const [face, count] of Object.entries(distribution)) {\n scaled[Number(face)] = count * scalar;\n }\n result.outcomeData[key as OutcomeType] = scaled;\n }\n return result;\n }\n\n // OPERATIONS\n\n public add(other: Dice | number): Dice {\n return this.binaryOp(other, (a, b) => a + b);\n }\n\n public subtract(other: Dice | number): Dice {\n return this.binaryOp(other, (a, b) => a - b);\n }\n\n public conditionalApply(other: Dice | number): Dice {\n return this.binaryOp(other, (a, b) => (a === 0 ? 0 : 1) * b);\n }\n\n public multiply(other: Dice | number): Dice {\n return this.binaryOp(other, (a, b) => a * b);\n }\n\n public addNonZero(other: Dice | number): Dice {\n return this.binaryOp(other, (a, b) => (a !== 0 ? a + b : a));\n }\n\n public eq(other: Dice | number): Dice {\n return this.binaryOp(other, (a, b) => (a === b ? 1 : 0));\n }\n\n public max(other: Dice | number): Dice {\n return this.binaryOp(other, (a, b) => Math.max(a, b));\n }\n\n public min(other: Dice | number): Dice {\n return this.binaryOp(other, (a, b) => Math.min(a, b));\n }\n\n public advantage(): Dice {\n return this.max(this);\n }\n\n public ge(other: Dice | number): Dice {\n return this.binaryOp(other, (a, b) => (a >= b ? 0 : 1));\n }\n\n public divide(other: Dice | number): Dice {\n return this.binaryOp(other, (a, b) => a / b);\n }\n\n public divideRoundUp(other: Dice | number): Dice {\n this.assertNonZeroDivisor(other);\n return this.binaryOp(other, (a, b) => (b === 0 ? 0 : Math.ceil(a / b)));\n }\n\n public divideRoundDown(other: Dice | number): Dice {\n this.assertNonZeroDivisor(other);\n return this.binaryOp(other, (a, b) => (b === 0 ? 0 : Math.floor(a / b)));\n }\n\n /** A divisor that can be 0 has no quotient there. A 0 face with no weight is never rolled, so it passes. */\n private assertNonZeroDivisor(other: Dice | number): void {\n if (typeof other === \"number\" ? other === 0 : other.get(0) > 0) {\n throw new DiceParseError(\"Division by zero: the divisor can be 0\");\n }\n }\n\n public and(other: Dice | number): Dice {\n return this.binaryOp(other, (a, b) => (a && b ? 1 : 0));\n }\n\n private checkTarget(\n other: Dice | number,\n comparisonLogic: (roll: number, target: number) => number\n ): Dice {\n const createResult = () => {\n const result = new Dice();\n result.increment(0, 0); // Success\n result.increment(1, 0); // Failure\n return result;\n };\n\n return this.binaryOp(other, comparisonLogic, createResult);\n }\n\n public dc(other: Dice | number): Dice {\n const dcCheck = (a: number, b: number) => (a >= b ? 0 : 1);\n const result = this.checkTarget(other, dcCheck);\n // Mark this as a DC check (save mechanic) for proper attribute assignment\n result.privateData.isDCCheck = true;\n return result;\n }\n\n public ac(other: Dice | number): Dice {\n const acCheck = (a: number, b: number) => (a >= b ? a : 0);\n return this.checkTarget(other, acCheck);\n }\n\n public deleteFace(face: number): Dice {\n const result = new Dice();\n\n for (const [key, value] of Object.entries(this.faces)) {\n const numKey = Number(key);\n if (numKey !== face) {\n result.increment(numKey, value);\n }\n }\n\n result.privateData = { ...this.privateData };\n result.outcomeData = { ...this.outcomeData };\n return result;\n }\n\n /**\n * Roll once and, on a result in `toReroll`'s faces, roll again and keep the second roll. Each\n * result keeps its own weight: with T the total count and c_R the count on the rerolled faces,\n * face v's new count is c_v·(T·[v∉R] + c_R), i.e. p′(v) = p(v)·[v∉R] + P(R)·p(v).\n */\n public reroll(toReroll: Dice | number): Dice {\n const rerolled = new Set(typeof toReroll === \"number\" ? [toReroll] : toReroll.keys());\n const total = this.total();\n let rerolledCount = 0;\n for (const [face, count] of this.getFaceEntries()) if (rerolled.has(face)) rerolledCount += count;\n\n const result = new Dice();\n for (const [face, count] of this.getFaceEntries()) {\n result.increment(face, count * ((rerolled.has(face) ? 0 : total) + rerolledCount));\n }\n return result;\n }\n\n // This is not addition and not rolling two dice at once.\n // Instead, it’s mixing two distributions into a single weighted die.\n public combine(other: Dice | number): Dice {\n if (typeof other === \"number\") {\n other = Dice.scalar(other);\n }\n\n // Start by copying \"other\" into a new Dice object\n const result = new Dice();\n for (const [key, value] of Object.entries(other.faces)) {\n result.faces[Number(key)] = value;\n }\n\n // Build the \"except\" dice and add faces from `this` to result\n const except = new Dice();\n for (const [key, value] of Object.entries(this.faces)) {\n const numKey = Number(key);\n result.increment(numKey, value);\n\n // A key absent from `other` is still tracked in `except`.\n if (!(numKey in other.faces)) {\n except.increment(numKey, value); // still tracked in except\n }\n }\n\n result.privateData = { ...this.privateData, except: other };\n result.outcomeData = { ...this.outcomeData };\n return result;\n }\n\n public combineInPlace(other: Dice): void {\n for (const [key, value] of Object.entries(other.faces)) {\n const numKey = Number(key);\n const current = this.faces[numKey] || 0;\n this.faces[numKey] = current + value;\n }\n }\n\n public percent(): DamageDistribution {\n const total = this.total();\n const result: DamageDistribution = {};\n\n for (const [face, count] of Object.entries(this.faces)) {\n result[Number(face)] = count / total;\n }\n\n return result;\n }\n\n public average(): number {\n const total = this.total();\n if (total === 0) return 0;\n\n let sum = 0;\n for (const [key, value] of Object.entries(this.faces)) {\n sum += Number(key) * value;\n }\n\n return sum / total;\n }\n\n /*\n * Convert dice to PMF using OutcomeType labels directly from damage distribution.\n * This is much cleaner than the original complex distribution conversion.\n */\n public toPMF(numEpsilon: number = EPS): PMF {\n const total = this.total();\n if (total === 0) return PMF.empty(numEpsilon);\n\n // Ensure hit distribution is calculated before using it\n this.ensureHitDistribution();\n\n const map = new Map<number, Bin>();\n\n // Outcome distributions (counts, not probabilities)\n const hitDistro = this.getOutcomeDistribution(\"hit\") || {};\n const critDistro = this.getOutcomeDistribution(\"crit\") || {};\n const missDistro = this.getOutcomeDistribution(\"missDamage\") || {};\n const saveDistro = this.getOutcomeDistribution(\"saveHalf\") || {};\n const saveFailDistro = this.getOutcomeDistribution(\"saveFail\") || {};\n const pcDistro = this.getOutcomeDistribution(\"pc\") || {};\n\n // A save string records its failed saves as `saveFail` and its halved successes as\n // `saveHalf`, a failed save that rolls 0 damage included. What is left of a save-half string\n // is full damage on a failed save too; a bare DC check (no payload) is 1 on a failed save.\n const isSaveHalf = Object.keys(saveDistro).length > 0;\n\n const isDCCheck = this.privateData.isDCCheck === true;\n\n const clampNonNeg = (x: number) => (x < 0 && x > -1e-15 ? 0 : x);\n\n // Process each face value (iterate the internal map directly; this loop\n // only reads it, so the defensive clone from getFaceMap() is unnecessary)\n for (const [faceStr, faceCountRaw] of Object.entries(this.faces)) {\n const face = Number(faceStr);\n const faceCount = Number(faceCountRaw);\n\n // Skip structurally present but empty bins early\n if (faceCount <= 0) continue;\n\n let p = faceCount / total;\n p = clampNonNeg(p);\n\n // Always drop exact zeros to keep PMF semantics clean\n if (!(p > 0)) continue;\n\n // Optional pruning only when epsilon is enabled\n if (numEpsilon >= 0 && p < numEpsilon) continue;\n\n const count: OutcomeLabelMap = {};\n const attr: OutcomeLabelMap = {};\n\n // Add distribution counts and attributions\n if (hitDistro[face]) {\n const c = clampNonNeg(hitDistro[face] / total);\n if (c > 0) {\n if (isSaveHalf || isDCCheck) {\n count.saveFail = c; // full damage on failed save\n attr.saveFail = clampNonNeg((face * hitDistro[face]) / total);\n } else {\n count.hit = c;\n attr.hit = clampNonNeg((face * hitDistro[face]) / total);\n }\n }\n }\n\n if (critDistro[face]) {\n const c = clampNonNeg(critDistro[face] / total);\n if (c > 0) {\n count.crit = c;\n attr.crit = clampNonNeg((face * critDistro[face]) / total);\n }\n }\n\n if (missDistro[face]) {\n const c = clampNonNeg(missDistro[face] / total);\n if (c > 0) {\n count.missDamage = c;\n attr.missDamage = clampNonNeg((face * missDistro[face]) / total);\n }\n }\n\n if (saveDistro[face]) {\n const c = clampNonNeg(saveDistro[face] / total);\n if (c > 0) {\n count.saveHalf = c; // half damage on successful save\n attr.saveHalf = clampNonNeg((face * saveDistro[face]) / total);\n }\n }\n\n if (saveFailDistro[face]) {\n const c = clampNonNeg(saveFailDistro[face] / total);\n if (c > 0) {\n count.saveFail = (count.saveFail ?? 0) + c;\n attr.saveFail = clampNonNeg((attr.saveFail ?? 0) + (face * saveFailDistro[face]) / total);\n }\n }\n\n if (pcDistro[face]) {\n const c = clampNonNeg(pcDistro[face] / total);\n if (c > 0) {\n count.pc = c;\n attr.pc = clampNonNeg((face * pcDistro[face]) / total);\n }\n }\n\n // What no outcome claims deals no damage (missNone); a bare DC check's successes stay unlabelled.\n if (!isDCCheck) {\n const distroCountRaw =\n (hitDistro[face] || 0) +\n (critDistro[face] || 0) +\n (missDistro[face] || 0) +\n (saveDistro[face] || 0) +\n (saveFailDistro[face] || 0) +\n (pcDistro[face] || 0);\n\n const unaccountedCount = clampNonNeg(faceCount - distroCountRaw);\n if (unaccountedCount > 0) {\n const frac = clampNonNeg(unaccountedCount / total);\n if (frac > 0) {\n count.missNone = (count.missNone ?? 0) + frac;\n // missNone does 0 damage, so no attr contribution\n }\n }\n }\n\n const bin: Bin = { p, count };\n if (Object.keys(attr).length > 0) {\n bin.attr = attr;\n }\n\n map.set(face, bin);\n }\n\n // Fall back to a sentinel identifier if none was assigned. This indicates\n // a Dice constructed outside the normal parse/build flow.\n const identifier = this.identifier || \"ERROR\";\n\n // Normalize, drop zeros again if any snuck in, then compaction and pruning\n return new PMF(map, numEpsilon, true, identifier).compact(numEpsilon, true);\n }\n}\n\nexport type _DiceInternal = never;\n","import { DiceParseError } from \"../common/errors\";\nimport { getCachingEnabled } from \"../common/lru-cache\";\nimport type { OutcomeType } from \"../common/types\";\nimport { PMF } from \"../pmf/pmf\";\nimport { Dice } from \"./dice\";\nimport type { CritTrack } from \"./dice\";\nimport { scaleParsedDice, UndoubleableExpressionError } from \"./scaleDice\";\n\ntype DiceOperation = ((this: Dice, other: Dice | number) => Dice) & {\n unary?: boolean;\n};\n\n/**\n * Resource-exhaustion guards. Adversarial expressions (a huge die, a huge dice\n * count, or a keep over a huge pool) can otherwise blow up memory and CPU.\n * These caps are deliberately generous so every legitimate expression the suite\n * exercises (e.g. d100000) still parses.\n */\n// Must stay >= 100000: the suite asserts d100000 (100k faces) parses.\nconst MAX_DIE_SIDES = 1_000_000;\nconst MAX_DICE_COUNT = 10_000;\n// Bound on keepDice's work, faces · kept² · (kept · face span + 1): its states times its steps.\nconst MAX_KEEP_WORK = 100_000_000;\n// Face counts are whole numbers up to here; a repeat whose counts would pass it keeps probabilities.\nconst MAX_EXACT_COUNT = Number.MAX_SAFE_INTEGER;\n\n/**\n * Internal parse cache for PMFs produced from string expressions.\n * Keyed by cleaned expression (spaces stripped, lowercased) and optional `n` value.\n */\nconst parseCache = PMF.createCache(1000);\n\n/** Clears the internal parse cache. */\nexport function clearParserCache(): void {\n parseCache.clear();\n}\n\n/**\n * Parse a dice expression into a PMF.\n *\n * - Expression is case-insensitive and ignores spaces.\n */\nexport function parse(expression: string, n: number = 0): PMF {\n // Check cache first if enabled\n const cleaned = expression.replace(/ /g, \"\").toLowerCase();\n\n if (getCachingEnabled()) {\n const cacheKey = `${cleaned}:${n}`;\n const cached = parseCache.get(cacheKey);\n if (cached) return cached;\n }\n\n const chars = [...cleaned];\n\n let result: Dice;\n try {\n result = parseExpression(chars, n);\n } catch (error) {\n throw new DiceParseError(\n `Cannot parse dice expression [${expression}]: ${error}`,\n { expression, cause: error }\n );\n }\n\n result.privateData = result.privateData || {};\n result.identifier = cleaned;\n\n if (chars.length > 0) {\n throw new DiceParseError(\n `Unexpected token: '${chars[0]}' from expression: '${expression}'`,\n { expression }\n );\n }\n\n const total = result.total();\n if (total === 0) {\n throw new DiceParseError(\n `Cannot parse dice expression [${expression}]: it has no outcomes (a d0 has no faces; it is only a reroll set, as in \\`reroll d0\\`)`,\n { expression }\n );\n }\n if (!Number.isFinite(total)) {\n throw new DiceParseError(\n `Cannot parse dice expression [${expression}]: its outcome counts overflow (too many dice combined to count exactly)`,\n { expression }\n );\n }\n\n // When creating the PMF, do not epsilon prune\n const resultPMF = result.toPMF(-1);\n if (getCachingEnabled()) {\n // Store under the same cleaned key used for the lookup above.\n const cacheKey = `${cleaned}:${n}`;\n parseCache.set(cacheKey, resultPMF);\n }\n\n return resultPMF;\n}\n\nfunction combineDiceWithNormalization(\n dice: Dice,\n normValue: number,\n outcomeType: OutcomeType,\n currentNorm: number,\n finalResult: Dice\n): { newNorm: number; updatedResult: Dice } {\n dice = dice.normalize(currentNorm);\n finalResult = finalResult.normalize(normValue);\n finalResult.setOutcomeDistribution(outcomeType, dice.getFaceMap());\n finalResult = finalResult.combine(dice);\n return { newNorm: currentNorm * normValue, updatedResult: finalResult };\n}\n\n/**\n * Face-wise histogram difference. NOT the same as {@link Dice.subtract}, which convolves VALUES\n * (`a - b` as numbers); this subtracts raw face COUNTS, used to take a sub-distribution (a crit\n * slice, one outcome's share) back out of the distribution it is part of.\n */\nfunction subtractCounts(a: Dice, b: Dice): Dice {\n const result = new Dice();\n for (const [key, value] of a.getFaceEntries()) result.increment(key, value);\n for (const [key, value] of b.getFaceEntries()) result.increment(key, -value);\n return result;\n}\n\n/**\n * Ops that leave a 0 (a miss) at 0 whatever their argument. A term joined to an attack by one of\n * these applies only where the attack deals damage, so it is part of that damage: `(check) *\n * (1d8) + 1d6` is `(check) * ((1d8) + 1d6)`, since the grammar reads left to right.\n */\nconst HIT_ONLY_OPS: ReadonlySet<DiceOperation> = new Set<DiceOperation>([\n Dice.prototype.addNonZero,\n Dice.prototype.conditionalApply,\n Dice.prototype.multiply,\n Dice.prototype.divideRoundUp,\n Dice.prototype.divideRoundDown,\n]);\n\n/** An AC or DC gate: its target, on the right, is never the check's natural roll. */\nconst GATE_OPS: ReadonlySet<DiceOperation> = new Set<DiceOperation>([Dice.prototype.ac, Dice.prototype.dc]);\n\n/**\n * The count of tokens left in `arr` where the last `AC`/`DC` gate at this nesting level starts, or\n * undefined with none. Every term read while more tokens are left builds that check's total.\n */\nfunction lastGateAt(arr: readonly string[]): number | undefined {\n let depth = 0;\n let at: number | undefined;\n for (let i = 0; i < arr.length - 1; i++) {\n const c = arr[i];\n if (c === \"(\") depth++;\n else if (c === \")\") {\n if (depth === 0) break;\n depth--;\n } else if (depth === 0 && (c === \"a\" || c === \"d\") && arr[i + 1] === \"c\") {\n at = arr.length - i;\n }\n }\n return at;\n}\n\n/**\n * `inCheck`: `arr` is part of a check total (a group left of an `AC`/`DC`), so its `+` always adds.\n */\nfunction parseExpression(arr: string[], n: number, inCheck = false): Dice {\n const gate = lastGateAt(arr);\n const buildsCheck = (): boolean => inCheck || (gate !== undefined && arr.length > gate);\n // `+` adds only to a non-zero total, so a miss (0) stays 0 -- except in a check total, where a\n // running total of exactly 0 (`d20 - 5` on a natural 5) is a roll like any other.\n const readOperation = (): DiceOperation | undefined => {\n const checkTerm = buildsCheck();\n const parsed = parseOperation(arr);\n return parsed === Dice.prototype.addNonZero && checkTerm ? Dice.prototype.add : parsed;\n };\n\n const first = parseArgument(arr, n, buildsCheck());\n let finalResult = typeof first === \"number\" ? Dice.scalar(first) : first;\n if (typeof first === \"number\") finalResult.privateData.noDie = true;\n\n // While `finalResult` crits with its doubled hit payload, the text of each op and its argument,\n // so a trailing hit-only term joins the payload it is part of. Joined only for that case.\n let opText = finalResult.privateData.implicitCrit ? arr.join(\"\") : undefined;\n let op = readOperation();\n\n while (op != null) {\n // An AC check times a payload is an attack's hit: keep the payload's text, so its crit can\n // double the dice when the string has no crit clause. Joined only for that case.\n const pending =\n op === Dice.prototype.conditionalApply && finalResult.privateData.isACCheck ? arr.join(\"\") : undefined;\n const arg = !op.unary ? parseArgument(arr, n, buildsCheck()) : finalResult;\n const hitText = pending?.slice(0, pending.length - arr.length);\n const termText = opText?.slice(0, opText.length - arr.length);\n const before = finalResult;\n if (op === Dice.prototype.combine) assertMixable(before, arg, arr);\n\n // Handle crit (e.g. xcrit, crit). With no clause, an attack's crit is its hit payload with\n // every dice term doubled, at the check's natural-max rate, like the builder's. A check\n // with no die in it has no natural roll: its crit mass is exactly 0, so it takes no crit, and a\n // crit clause on it can never fire -- it is read and ignored, and the hit payload applies.\n let crit: Dice | undefined;\n let critNorm = 1;\n const critClause = arr[0] === \"x\" || arr[0] === \"c\";\n const implicitCrit = !critClause && hitText !== undefined && !finalResult.privateData.noDie;\n if (critClause || implicitCrit) {\n let count = 1;\n if (critClause) {\n const isXcrit = arr[0] === \"x\";\n if (isXcrit) assertToken(arr, \"x\");\n assertToken(arr, \"c\");\n assertToken(arr, \"r\");\n assertToken(arr, \"i\");\n assertToken(arr, \"t\");\n if (isXcrit) count = parseNumber(arr, n);\n }\n\n if (finalResult.privateData.noDie) {\n parseBinaryArgument(arg, arr, n);\n } else {\n ({ crit, rest: finalResult } = splitCrit(finalResult, count));\n\n critNorm = crit.total();\n crit = op.call(crit, critClause ? parseBinaryArgument(arg, arr, n) : critPayload(hitText!, n));\n\n critNorm = crit && critNorm ? crit.total() / critNorm : 1;\n }\n }\n\n // Handle save\n let save: Dice | undefined;\n let saveNorm = 1;\n if (arr[0] === \"s\") {\n assertToken(arr, \"s\");\n assertToken(arr, \"a\");\n assertToken(arr, \"v\");\n assertToken(arr, \"e\");\n\n save = new Dice();\n const min = finalResult.minFace();\n save.increment(min > 0 ? min : 1, finalResult.get(min));\n\n saveNorm = save.total();\n finalResult = finalResult.deleteFace(min);\n save = op.call(save, parseBinaryArgument(arg, arr, n));\n saveNorm = save && saveNorm ? save.total() / saveNorm : 1;\n }\n\n // Handle half damage on hit (potent cantrip)\n let pc: Dice | undefined;\n let pcNorm = 1;\n\n if (arr.length >= 2 && arr[0] === \"p\" && arr[1] === \"c\") {\n assertToken(arr, \"p\");\n assertToken(arr, \"c\");\n\n pc = new Dice();\n const min = finalResult.minFace();\n pc.increment(min > 0 ? min : 1, finalResult.get(min));\n\n const missBefore = pc.total();\n finalResult = finalResult.deleteFace(min);\n\n pc = op.call(pc, parseBinaryArgument(arg, arr, n)).divideRoundDown(2); // parse the damage\n\n const missAfter = pc ? pc.total() : 0;\n pcNorm = missBefore ? missAfter / missBefore : 1;\n }\n\n // Handle miss\n let miss: Dice | undefined;\n let missNorm = 1;\n\n if (arr[0] === \"m\") {\n assertToken(arr, \"m\");\n assertToken(arr, \"i\");\n assertToken(arr, \"s\");\n assertToken(arr, \"s\");\n\n miss = new Dice();\n const min = finalResult.minFace();\n miss.increment(min > 0 ? min : 1, finalResult.get(min));\n\n missNorm = miss.total();\n finalResult = finalResult.deleteFace(min);\n\n miss = op.call(miss, parseBinaryArgument(arg, arr, n));\n missNorm = miss && missNorm ? miss.total() / missNorm : 1;\n }\n\n let norm = finalResult.total();\n\n const clause = crit !== undefined || save !== undefined || pc !== undefined || miss !== undefined;\n const labelled = hasOutcomeLabels(finalResult);\n const operand = finalResult;\n if (!clause && labelled && HIT_ONLY_OPS.has(op)) {\n finalResult = applyByOutcome(finalResult, op, arg, termText, n);\n } else {\n finalResult = op.call(finalResult, arg);\n }\n // A save's payload: every failed save (a 1) is `saveFail`, whatever the payload rolls there.\n if (operand.privateData.isDCCheck && HIT_ONLY_OPS.has(op)) {\n finalResult.setOutcomeDistribution(\"saveFail\", op.call(operand.deleteFace(0), arg).getFaceMap());\n }\n // A landed hit that deals 0 is still a hit: record it at 0, where the misses also sit, from the\n // AC check's `*` on through every hit-only term after it.\n if (!operand.privateData.isDCCheck && HIT_ONLY_OPS.has(op) && (hitText !== undefined || operand.privateData.attackPayload)) {\n finalResult.privateData.attackPayload = true;\n const landed = landedHitsAtZero(operand, op, arg);\n if (landed > 0) finalResult.setOutcomeDistribution(\"hit\", { 0: landed });\n } else if (op === Dice.prototype.combine && typeof arg !== \"number\" && arg.privateData.attackPayload) {\n // `combine` keeps the left side's data; an `&` mix lands the hits of both sides.\n finalResult.privateData.attackPayload = true;\n const landed = operand.getOutcomeCount(\"hit\", 0) + arg.getOutcomeCount(\"hit\", 0);\n if (landed > 0) finalResult.setOutcomeDistribution(\"hit\", { 0: landed });\n }\n // An `&` mix is an attack check whichever side the gate is on: `combine` copies the left's data.\n const gated = op === Dice.prototype.combine && typeof arg !== \"number\" && arg.privateData.isACCheck;\n if (op === Dice.prototype.ac || gated) finalResult.privateData.isACCheck = true;\n followNaturalRoll(before, op, arg, finalResult, clause);\n norm = norm ? finalResult.total() / norm : 1;\n\n // Combine dice with normalization\n if (crit) {\n const result = combineDiceWithNormalization(\n crit,\n critNorm,\n \"crit\",\n norm,\n finalResult\n );\n norm = result.newNorm;\n finalResult = result.updatedResult;\n }\n\n if (save) {\n const result = combineDiceWithNormalization(\n save,\n saveNorm,\n \"saveHalf\",\n norm,\n finalResult\n );\n norm = result.newNorm;\n finalResult = result.updatedResult;\n }\n\n if (miss) {\n const result = combineDiceWithNormalization(\n miss,\n missNorm,\n \"missDamage\",\n norm,\n finalResult\n );\n norm = result.newNorm;\n finalResult = result.updatedResult;\n }\n\n if (pc) {\n const result = combineDiceWithNormalization(\n pc,\n pcNorm,\n \"pc\",\n norm,\n finalResult\n );\n norm = result.newNorm;\n finalResult = result.updatedResult;\n }\n\n if (implicitCrit) finalResult.privateData.implicitCrit = { payload: hitText! };\n opText = finalResult.privateData.implicitCrit ? arr.join(\"\") : undefined;\n op = readOperation();\n }\n\n return finalResult;\n}\n\n/** The size of `value`'s natural die, whether or not its natural roll is tracked; 0 with no die. */\nfunction naturalSides(value: Dice | number): number {\n if (typeof value === \"number\") return 0;\n const { critTrack, untrackedSides } = value.privateData;\n return critTrack ? critTrack.sides : (untrackedSides ?? 0);\n}\n\n/**\n * Whether a die of `sides` takes the natural roll from one of `other` sides (0: no die): a d20\n * outranks every other die, and with no d20 the larger die does. A d30 or d100 beside the d20 is a\n * bonus die.\n */\nfunction outranks(sides: number, other: number): boolean {\n if (sides === other) return false;\n if (sides === 20 || other === 20) return sides === 20;\n return sides > other;\n}\n\n/** A check that is its natural roll itself: face f's share is its own count at f. */\nfunction bareTrack(die: Dice): CritTrack {\n return {\n sides: die.maxFace(),\n bare: true,\n slice: (face) => {\n const slice = new Dice();\n const weight = die.get(face);\n if (weight) slice.setFace(face, weight);\n return slice;\n },\n };\n}\n\n/** A number operand as a value: a die-less branch of an `&` mix. */\nfunction asValue(value: Dice | number): Dice {\n if (typeof value !== \"number\") return value;\n const scalar = Dice.scalar(value);\n scalar.privateData.noDie = true;\n return scalar;\n}\n\nfunction branchesOf(value: Dice | number): readonly Dice[] {\n return typeof value === \"number\" ? [asValue(value)] : (value.privateData.branches ?? [value]);\n}\n\nconst hasOutcomeLabels = (value: Dice | number): boolean =>\n typeof value !== \"number\" && Object.keys(value.getFullOutcomeDistribution()).some((label) => label !== \"hit\");\n\nconst isSave = (value: Dice | number): boolean => typeof value !== \"number\" && value.privateData.isDCCheck === true;\n\n/**\n * An `&` mix weights each side by its count of outcomes and keeps the left side's labels. An attack\n * already split into crit, miss or save outcomes has no count to weight by (the split renormalises\n * it), a save beside a non-save has no one set of labels, and a crit, save, pc or miss clause after\n * the mix would split the left side alone. Each reading would depend on operand order, so all three\n * are refused. `rest` is the text after the mix's right side.\n */\nfunction assertMixable(left: Dice, right: Dice | number, rest: readonly string[]): void {\n if (hasOutcomeLabels(left) || hasOutcomeLabels(right)) {\n throw new Error(\n \"an `&` mix of an attack already split into crit, miss or save outcomes has no single reading: \" +\n \"mix the checks before the payload, like `((d20 AC 10) & (d20 AC 15)) * (1d6)`\"\n );\n }\n if (isSave(left) !== isSave(right)) {\n throw new Error(\"an `&` mix of a saving throw (DC) with anything but another saving throw has no single set of outcomes\");\n }\n const [next, after] = rest;\n if (next === \"x\" || next === \"c\" || next === \"s\" || next === \"m\" || (next === \"p\" && after === \"c\")) {\n throw new Error(\"a crit, save, pc or miss clause on an `&` mix has no single reading: put it after the payload's `*`\");\n }\n}\n\n/**\n * Record on `after = op(before, arg)` the natural roll a crit is read from, or the size of the die\n * whose natural roll it lost, replacing whatever `op` copied from `before`. The natural roll is the\n * check's one d20 wherever it sits in the sum, or with no d20 its largest die: other dice are bonus\n * dice, and an AC or DC target is never the roll. Two dice of that size have no single natural roll\n * (`d20 + d20`, like `2d20`), except as advantage or disadvantage between two natural rolls\n * (`d20 > d20`), whose result is the new kept roll. Advantage and rerolls choose which natural roll\n * is kept, so they apply only to a bare die (no op since it). A max or min against anything else\n * follows the natural roll only where its value is the one kept: `d20 > d4` crits on every natural\n * 20, `d20 < 15` never. Every other op acts face by face, so replaying it on one natural face's\n * slice follows that face exactly. A clause splits the check's outcomes off by face, so its natural\n * roll no longer maps onto them.\n *\n * An `&` mix adds its operands' counts, so it keeps them as branches, and every later op but a\n * reroll (which draws again from the whole mix) is replayed on each branch, or each pair of branches:\n * `(d20 & d4) > d20` is `(d20 > d20) & (d4 > d20)`. The mix crits where a branch rolls the natural\n * roll's top faces, at that branch's share: `d4 & d20` crits on the d20 branch's 20, 1 in 24.\n */\nfunction followNaturalRoll(before: Dice, op: DiceOperation, arg: Dice | number, after: Dice, clause: boolean): void {\n const data = after.privateData;\n delete data.critTrack;\n delete data.untrackedSides;\n delete data.noDie;\n delete data.branches;\n const gate = GATE_OPS.has(op);\n if (!clause && before.privateData.noDie && (gate || typeof arg === \"number\" || arg.privateData.noDie)) {\n data.noDie = true;\n }\n\n const mixed =\n before.privateData.branches !== undefined ||\n (!gate && typeof arg !== \"number\" && arg.privateData.branches !== undefined);\n if (!clause && op === Dice.prototype.combine) {\n data.branches = [...branchesOf(before), ...branchesOf(arg)];\n } else if (!clause && mixed && op !== Dice.prototype.reroll) {\n // Advantage is a max of two independent rolls of the mix: every pair of its branches.\n const advantage = op === Dice.prototype.advantage;\n const pairOp = advantage ? Dice.prototype.max : op;\n const lefts = branchesOf(before);\n const rights = advantage ? lefts : gate ? [asValue(arg)] : branchesOf(arg);\n data.branches = lefts.flatMap((left) =>\n rights.map((right) => {\n const part = pairOp.call(left, right);\n followNaturalRoll(left, pairOp, right, part, false);\n return part;\n })\n );\n }\n if (data.branches) {\n mixNaturalRolls(after, data.branches);\n return;\n }\n\n const track = before.privateData.critTrack;\n const argTrack = typeof arg === \"number\" || gate ? undefined : arg.privateData.critTrack;\n const sides = naturalSides(before);\n const argSides = gate ? 0 : naturalSides(arg);\n const extremum = op === Dice.prototype.max || op === Dice.prototype.min;\n const own = track !== undefined && outranks(sides, argSides);\n const followed = own ? track : argTrack && outranks(argSides, sides) ? argTrack : undefined;\n\n if (clause) {\n // A clause leaves no natural roll: untracked below.\n } else if (op === Dice.prototype.advantage || op === Dice.prototype.reroll) {\n if (track?.bare) data.critTrack = bareTrack(after);\n } else if (extremum && track?.bare && argTrack?.bare && sides === argSides) {\n data.critTrack = bareTrack(after);\n } else if (followed) {\n const apply = own ? (value: Dice) => op.call(value, arg) : (value: Dice) => op.call(before, value);\n const step = extremum ? (slice: Dice) => keptPart(slice, apply) : apply;\n data.critTrack = { sides: followed.sides, bare: false, slice: (face) => step(followed.slice(face)) };\n }\n if (!data.critTrack) {\n const top = outranks(argSides, sides) ? argSides : sides;\n if (top > 0) data.untrackedSides = top;\n }\n}\n\n/**\n * The natural roll of an `&` mix `after` of `branches`: the top-ranked natural die among them. A\n * branch without that die never crits; one that has it but not as one natural roll (`d20 + d20`)\n * leaves the mix without one.\n */\nfunction mixNaturalRolls(after: Dice, branches: readonly Dice[]): void {\n const sides = branches.reduce((top, branch) => (outranks(naturalSides(branch), top) ? naturalSides(branch) : top), 0);\n if (sides === 0) return;\n const tracks: CritTrack[] = [];\n for (const branch of branches) {\n if (naturalSides(branch) !== sides) continue;\n const track = branch.privateData.critTrack;\n if (!track) {\n after.privateData.untrackedSides = sides;\n return;\n }\n tracks.push(track);\n }\n after.privateData.critTrack = {\n sides,\n bare: tracks.length === branches.length && tracks.every((track) => track.bare),\n slice: (face) => {\n const slice = new Dice();\n for (const track of tracks) slice.combineInPlace(track.slice(face));\n return slice;\n },\n };\n}\n\n/**\n * The share of a max or min, `apply(face)` per face of `slice`, whose result is that face's own\n * value: where the natural roll is the value kept (ties included), not the other side's.\n */\nfunction keptPart(slice: Dice, apply: (face: Dice) => Dice): Dice {\n const result = new Dice();\n for (const [value, count] of slice.getFaceEntries()) {\n const face = new Dice();\n face.setFace(value, count);\n const kept = apply(face).get(value);\n if (kept) result.increment(value, kept);\n }\n return result;\n}\n\n/**\n * Split an attack check's crit mass off `check`: the slices of its `count` highest natural faces\n * (`count` is 1 for a natural max, N for `xcrit N`), each replayed through every op since the die --\n * bonus dice, modifiers, the AC gate -- so a crit is a natural roll in range at any bonus roll, the\n * builder's rule. A check whose natural roll is not one die throws rather than guessing from its\n * highest totals, which smear a natural roll across several totals once bonus dice are added.\n *\n * A crit face the AC gate turned into 0 missed (parse() has no natural-20 auto-hit): it stays\n * miss mass and is never labelled a crit. `xcrit0` crits on no face, so it needs no natural roll.\n */\nfunction splitCrit(check: Dice, count: number): { crit: Dice; rest: Dice } {\n if (count === 0) {\n const none = new Dice();\n return { crit: none, rest: subtractCounts(check, none) };\n }\n const track = check.privateData.critTrack;\n if (!track) {\n throw new Error(\n \"crit rate cannot be computed exactly for this attack check: its natural roll is not one die \" +\n \"(a dice-valued check like 2d20 or 2kh2d20, two d20s like d20 + d20, or advantage \" +\n \"over a total). Build the attack with the builder API instead.\"\n );\n }\n const { sides } = track;\n if (count > sides) {\n // Usually a count run into the next number: `xcrit2 1d6` reads as `xcrit21 d6`.\n throw new Error(`xcrit${count} is wider than the d${sides} it reads its natural roll from`);\n }\n let crit = new Dice();\n for (let face = sides; face > sides - count; face--) crit.combineInPlace(track.slice(face));\n const rest = subtractCounts(check, crit);\n const missed = crit.get(0);\n if (missed) {\n crit = crit.deleteFace(0);\n rest.increment(0, missed);\n }\n return { crit, rest };\n}\n\n/**\n * The crit payload of an attack string with no crit clause is its hit payload `text` with\n * every dice term doubled and its flats kept -- the rewrite the parsed builder's `doubleDice()`\n * uses, so `(d20 + 5 AC 12) * (1d8 + 3)` crits as `(2d8 + 3)`, exactly like the builder. A payload\n * that rewrite cannot double (a dice-valued count like `d4d6`, a nested check) is added as-is,\n * like a bare PMF.\n */\nfunction critPayload(text: string, n: number): Dice {\n let doubled = text;\n try {\n // The rewrite reads `n` as a digit; substitute it first so a count of `n` doubles by value.\n doubled = scaleParsedDice(text.replace(/n/g, String(n)), 2);\n } catch (error) {\n if (!(error instanceof UndoubleableExpressionError)) throw error;\n }\n const chars = [...doubled];\n const payload = parseExpression(chars, n);\n if (chars.length > 0) {\n throw new Error(`Unexpected token '${chars[0]}' in the crit payload '${doubled}'`);\n }\n return payload;\n}\n\n/**\n * `op(labelled, arg)` for a hit-only op, outcome by outcome, so an attack's labels survive a\n * trailing term. A doubled crit (no crit clause) takes the term into its payload and doubles the\n * whole payload again, exactly as if the term were written inside it; every other outcome,\n * an explicit crit clause's included, takes the term as written.\n */\nfunction applyByOutcome(\n labelled: Dice,\n op: DiceOperation,\n arg: Dice | number,\n termText: string | undefined,\n n: number\n): Dice {\n const implicit = labelled.privateData.implicitCrit;\n const argTotal = typeof arg === \"number\" ? 1 : arg.total();\n const result = new Dice();\n let rest = labelled;\n let payload: string | undefined;\n for (const [label, distribution] of Object.entries(labelled.getFullOutcomeDistribution())) {\n if (label === \"hit\" || distribution === undefined) continue;\n const part = new Dice();\n for (const [face, count] of Object.entries(distribution)) part.increment(Number(face), count);\n rest = subtractCounts(rest, part);\n let applied: Dice;\n if (label === \"crit\" && implicit && termText !== undefined) {\n payload = implicit.payload + termText;\n const doubled = critPayload(payload, n);\n // `op` scales every other outcome's counts by the argument's; keep the crit's share.\n applied = doubled.normalize((part.total() * argTotal) / doubled.total());\n } else {\n applied = op.call(part, arg);\n }\n result.combineInPlace(applied);\n result.setOutcomeDistribution(label as OutcomeType, applied.getFaceMap());\n }\n result.combineInPlace(op.call(rest, arg));\n if (labelled.privateData.isDCCheck) result.privateData.isDCCheck = true;\n if (payload !== undefined) result.privateData.implicitCrit = { payload };\n return result;\n}\n\n/**\n * The count of `op(operand, arg)`'s outcomes at 0 that are landed hits: each of `operand`'s hits (a\n * recorded 0-damage hit included) times the count of `arg`'s values that `op` takes it to 0 with.\n */\nfunction landedHitsAtZero(operand: Dice, op: DiceOperation, arg: Dice | number): number {\n let landed = 0;\n for (const [face, count] of Object.entries(operand.calculateHitDistribution())) {\n if (!(count > 0)) continue;\n const hit = new Dice();\n hit.setFace(Number(face), count);\n landed += op.call(hit, arg).get(0);\n }\n return landed;\n}\n\n/**\n * One argument: a repeat chain (`2d6`, `2(1d4 + 1)`, `(1d4)d6`, `4kh3d6`), or a unary minus and the\n * argument it negates, whole chain included: `-2d6` is `-(2d6)`, `1d6 + -3` is `1d6 - 3`.\n */\nfunction parseArgument(s: string[], n: number, inCheck = false): Dice | number {\n if (s[0] === \"-\") {\n s.shift();\n const operand = parseArgument(s, n, inCheck);\n if (typeof operand === \"number\") return 0 - operand;\n const zero = asValue(0);\n const negated = zero.subtract(operand);\n followNaturalRoll(zero, Dice.prototype.subtract, operand, negated, false);\n return negated;\n }\n\n let result = parseArgumentInternal(s, n, inCheck);\n if (result === undefined) {\n const at = s.length === 0 ? \"the end of the expression\" : `'${s.slice(0, 20).join(\"\")}'`;\n throw new Error(`Expected a number, a die, a keep or '(' at ${at}`);\n }\n\n for (let next = parseArgumentInternal(s, n, inCheck); next !== undefined; next = parseArgumentInternal(s, n, inCheck)) {\n result = multiplyDiceByDice(result, next);\n }\n\n return result;\n}\n\nfunction multiplyDiceByDice(d1: Dice | number, d2: Dice | number): Dice {\n // `2(15)`: copies of a constant are still a constant.\n const noDie =\n (typeof d1 === \"number\" || d1.privateData.noDie) && (typeof d2 === \"number\" || d2.privateData.noDie);\n if (typeof d1 === \"number\") d1 = Dice.scalar(d1);\n if (typeof d2 === \"number\") d2 = Dice.scalar(d2);\n\n const result = new Dice();\n // Keyed by face value. A Map avoids the number→string→parseFloat round-trip of\n // an object and preserves insertion order, which matches d1.keys() ascending\n // order — so the combine order below is identical to the previous version.\n const faces = new Map<number, Dice>();\n let common = 1;\n\n const { keep } = d2.privateData;\n for (const key of d1.keys()) {\n const face = keep ? keepDice(d2, key, keep) : multiplyDice(key, d2);\n\n common *= face.total();\n faces.set(key, face);\n }\n\n // Scaled to one common total the counts stay whole numbers; past MAX_EXACT_COUNT they could not,\n // and the product would overflow, so each count becomes its probability instead.\n const exact = common <= MAX_EXACT_COUNT;\n for (const [k, face] of faces) {\n const count = d1.get(k);\n result.combineInPlace(face.normalize(((exact ? common : 1) * count) / face.total()));\n }\n\n result.privateData.except = {};\n // `1d20` is the die itself, and a keep of one of N rolls of it (`2kh1d20` advantage, `2kl1(1d20)`\n // disadvantage, `3kh1(1d20)` elven accuracy) is one kept natural roll, like `d20 > d20`: a crit\n // is read from either. Any other count or keep has no single natural roll.\n const [only, ...more] = d1.keys();\n const { critTrack } = d2.privateData;\n const rolls = keep === undefined ? only : Math.min(only, keep.kept);\n const sides = outranks(naturalSides(d2), naturalSides(d1)) ? naturalSides(d2) : naturalSides(d1);\n if (rolls === 1 && more.length === 0 && critTrack?.bare) {\n result.privateData.critTrack = bareTrack(result);\n } else if (sides > 0) {\n result.privateData.untrackedSides = sides;\n }\n if (noDie) result.privateData.noDie = true;\n return result;\n}\n\n/** A repeat count is a whole number of copies, 0 included (no dice: the point mass at 0). */\nfunction assertRepeatCount(n: number): void {\n if (!Number.isInteger(n) || n < 0) {\n throw new DiceParseError(`A repeat count must be a whole number of 0 or more; this one can be ${n}`);\n }\n if (n > MAX_DICE_COUNT) {\n throw new DiceParseError(\n `Dice count ${n} exceeds the maximum of ${MAX_DICE_COUNT}`\n );\n }\n}\n\nfunction multiplyDice(n: number, d: Dice): Dice {\n assertRepeatCount(n);\n if (n === 0) return Dice.scalar(0);\n if (n === 1) return d;\n\n const half = Math.floor(n / 2);\n let result = multiplyDice(half, d);\n result = result.add(result);\n\n if (n % 2 === 1) {\n result = result.add(d);\n }\n\n // Counts past MAX_EXACT_COUNT are no longer whole numbers and a few more doublings overflow:\n // keep them as probabilities, which lose nothing more.\n const total = result.total();\n return total > MAX_EXACT_COUNT ? result.normalize(1 / total) : result;\n}\n\n/**\n * The sum of the `kept` highest (or lowest) of `count` independent copies of `die`, exactly, for\n * any per-copy distribution. Faces are visited from the kept end. With `placed` copies already on\n * earlier faces, how many of the other m = count - placed land on this face is Binomial(m, q), q\n * being this face's share of the mass from here on. Once `kept` copies are placed the kept sum is\n * final, so only states with fewer placed are carried: kept × (sums so far) states per face.\n */\nfunction keepDice(die: Dice, count: number, { kept, lowest }: { kept: number; lowest: boolean }): Dice {\n assertRepeatCount(count);\n if (kept >= count) return multiplyDice(count, die);\n if (kept <= 0) return Dice.scalar(0);\n\n const faces = die\n .getFaceEntries()\n .filter(([, weight]) => weight > 0)\n .sort(([a], [b]) => (lowest ? a - b : b - a));\n if (faces.length === 0) return new Dice(); // copies of a d0: no outcomes, reported by parse()\n const span = Math.abs(faces[faces.length - 1][0] - faces[0][0]);\n const work = faces.length * kept * kept * (kept * span + 1);\n if (work > MAX_KEEP_WORK) {\n throw new DiceParseError(\n `Keep of ${kept} of ${count} copies of a ${faces.length}-face roll exceeds the maximum work of ${MAX_KEEP_WORK}`\n );\n }\n\n // The mass from each face on, summed from the far end so the last face's share is exactly 1.\n const tails: number[] = new Array(faces.length);\n for (let i = faces.length - 1, tail = 0; i >= 0; i--) tails[i] = tail += faces[i][1];\n\n const addTo = (map: Map<number, number>, key: number, p: number): void => {\n map.set(key, (map.get(key) ?? 0) + p);\n };\n // states[placed]: kept sum so far → probability, with `placed` < `kept` copies placed.\n let states = Array.from({ length: kept }, () => new Map<number, number>());\n states[0].set(0, 1);\n const done = new Map<number, number>();\n\n faces.forEach(([value, weight], i) => {\n const q = weight / tails[i];\n const next = Array.from({ length: kept }, () => new Map<number, number>());\n states.forEach((sums, placed) => {\n if (sums.size === 0) return;\n const left = count - placed;\n const need = kept - placed;\n // P(exactly c of the `left` copies land here) for c < need; the rest completes the keep.\n const few: number[] = [];\n let logChoose = 0;\n for (let c = 0; c < need; c++) {\n if (c > 0) logChoose += Math.log((left - c + 1) / c);\n few.push(q >= 1 ? 0 : Math.exp(logChoose + c * Math.log(q) + (left - c) * Math.log1p(-q)));\n }\n const enough = Math.max(0, 1 - few.reduce((total, p) => total + p, 0));\n for (const [sum, p] of sums) {\n few.forEach((pc, c) => {\n if (pc > 0) addTo(next[placed + c], sum + c * value, p * pc);\n });\n if (enough > 0) addTo(done, sum + need * value, p * enough);\n }\n });\n states = next;\n });\n\n const result = new Dice();\n for (const [sum, p] of done) result.increment(sum, p);\n return result;\n}\n\nfunction parseArgumentInternal(\n s: string[],\n n: number,\n inCheck = false\n): Dice | number | undefined {\n if (s.length === 0) return;\n\n const c = s[0];\n\n switch (c) {\n case \"(\":\n s.shift();\n return assertToken(s, \")\", parseExpression(s, n, inCheck));\n\n case \"h\":\n case \"d\":\n return parseDice(s, n);\n\n case \"k\":\n assertToken(s, \"k\");\n return parseKeep(s, n, inCheck);\n\n case \"n\":\n return parseNumber(s, n);\n\n default:\n if (isDigit(c)) return parseNumber(s, n);\n return;\n }\n}\n\nfunction parseBinaryArgument(\n arg: Dice | number,\n arr: string[],\n n: number\n): Dice {\n if (arr.length >= 4 && arr[0] === \"h\" && peek(arr, \"half\")) {\n assertToken(arr, \"half\");\n\n const diceArg = typeof arg === \"number\" ? Dice.scalar(arg) : arg;\n return diceArg.divideRoundDown(2);\n }\n\n const parsed = parseArgument(arr, n);\n return typeof parsed === \"number\" ? Dice.scalar(parsed) : parsed;\n}\n\nfunction assertToken<T>(s: string[], expected: string, ret?: T): T | undefined {\n for (const ch of expected) {\n const found = s.shift();\n if (found !== ch) {\n throw new Error(`Expected character '${ch}', found '${found}'`);\n }\n }\n return ret;\n}\n\nfunction parseDice(s: string[], n: number): Dice | undefined {\n let rerollOne = false;\n\n if (peek(s, \"hd\") && peekIsNumber(s, 2)) {\n assertToken(s, \"h\");\n assertToken(s, \"d\");\n rerollOne = true;\n } else if (peek(s, \"d\") && peekIsNumber(s, 1)) {\n assertToken(s, \"d\");\n } else {\n return;\n }\n\n const sides = parseNumber(s, n);\n if (sides > MAX_DIE_SIDES) {\n throw new DiceParseError(\n `Die size ${sides} exceeds the maximum of ${MAX_DIE_SIDES}`\n );\n }\n let result = new Dice(sides);\n // A d0 has no faces: it is only a face set (`reroll d0` rerolls nothing), never a roll.\n if (sides === 0) return result;\n\n if (rerollOne) {\n // Reroll a rolled 1 exactly once, keeping the second roll (e.g. halfling\n // luck). This is the same semantics as the `reroll 1` operator; the previous\n // deleteFace(1).combine(result) computed a weighted union (P(1)=1/(2s−1)),\n // not a reroll (correct P(1)=1/s²).\n result = result.reroll(1);\n }\n\n result.privateData.critTrack = bareTrack(result);\n return result;\n}\n\nfunction peek(arr: string[], expected: string): boolean {\n if (expected.length > arr.length) return false;\n\n for (let i = 0; i < expected.length; i++) {\n if (arr[i] !== expected.charAt(i)) return false;\n }\n\n return true;\n}\n\nfunction peekIsNumber(arr: string[], index: number): boolean {\n if (index >= arr.length) return false;\n return isDigit(arr[index]) || arr[index] === \"n\";\n}\n\nfunction parseNumber(s: string[], n: number): number {\n let ret = \"\";\n\n while (s.length > 0 && (isDigit(s[0]) || s[0] === \"n\")) {\n const ch = s.shift()!;\n ret += ch === \"n\" ? n.toString() : ch;\n }\n\n if (ret.length === 0) {\n throw new Error(`Expected number, found: '${s[0]}'`);\n }\n\n return parseInt(ret, 10);\n}\n\nfunction isDigit(c: string): boolean {\n return c >= \"0\" && c <= \"9\";\n}\n\nfunction parseKeep(s: string[], n: number, inCheck: boolean): Dice | undefined {\n let lowest = false;\n\n if (peek(s, \"l\")) {\n assertToken(s, \"l\");\n lowest = true;\n } else if (peek(s, \"h\")) {\n assertToken(s, \"h\");\n } else {\n return;\n }\n\n const kept = parseNumber(s, n);\n const result = parseArgumentInternal(s, n, inCheck);\n\n if (result instanceof Dice) {\n result.privateData.keep = { kept, lowest };\n return result;\n }\n\n throw new Error(\"Expected Dice after keep modifier\");\n}\n\nfunction parseOperation(s: string[]): DiceOperation | undefined {\n switch (s[0]) {\n case \")\":\n return;\n\n case \"a\":\n assertToken(s, \"ac\");\n return Dice.prototype.ac;\n\n case \"d\":\n assertToken(s, \"dc\");\n return Dice.prototype.dc;\n\n case \"!\":\n assertToken(s, \"!\");\n const adv = Dice.prototype.advantage as DiceOperation;\n adv.unary = true;\n return adv;\n\n case \">\":\n assertToken(s, \">\");\n return Dice.prototype.max;\n\n case \"<\":\n assertToken(s, \"<\");\n return Dice.prototype.min;\n\n case \"+\":\n assertToken(s, \"+\");\n return Dice.prototype.addNonZero;\n\n case \"~\":\n assertToken(s, \"~\");\n assertToken(s, \"+\");\n return Dice.prototype.add;\n\n case \"-\":\n assertToken(s, \"-\");\n return Dice.prototype.subtract;\n\n case \"&\":\n assertToken(s, \"&\");\n return Dice.prototype.combine;\n\n case \"r\":\n assertToken(s, \"reroll\");\n return Dice.prototype.reroll;\n\n case \"*\":\n assertToken(s, \"*\");\n\n if (peek(s, \"*\")) {\n assertToken(s, \"*\");\n return Dice.prototype.multiply;\n }\n\n return Dice.prototype.conditionalApply;\n\n case \"/\":\n assertToken(s, \"/\");\n if (s[0] === \"/\") {\n assertToken(s, \"/\");\n return Dice.prototype.divideRoundDown;\n }\n return Dice.prototype.divideRoundUp;\n\n case \"=\":\n assertToken(s, \"=\");\n return Dice.prototype.eq;\n }\n\n return;\n}\n","import { EPS, PMF } from \"../\";\n\nexport function d20PmfFromCdf(\n cdfPow: (k: number) => number,\n eps: number = EPS\n): PMF {\n const out = new Map<number, number>();\n let prev = 0;\n for (let k = 1; k <= 20; k++) {\n const cur = cdfPow(k);\n const pk = cur - prev;\n if (pk > 0) {\n out.set(k, pk);\n }\n prev = cur;\n }\n\n return PMF.fromMap(out, eps);\n}\n\n/**\n * `P(X ≥ t)` and `P(X < t)` for `pmf`, each summed from its own bins — so a side with no bins is\n * exactly 0, never the `1 - p` float residue of the other. Used to split a check's bonus dice at the\n * total its natural roll still needs.\n */\nexport function splitAtThreshold(pmf: PMF, t: number): { atLeast: number; below: number } {\n let atLeast = 0;\n let below = 0;\n for (const [x, bin] of pmf) {\n if (x >= t) atLeast += bin.p;\n else below += bin.p;\n }\n return { atLeast, below };\n}\n","import { EPS, PMF, pmfCache } from \"../\";\nimport { d20PmfFromCdf } from \"./prob\";\nimport type { RollType } from \"./types\";\n\nconst cacheKeyMap: Record<string, string> = {\n \"flat-flat\": \"d20\",\n \"flat-reroll\": \"hd20\",\n \"advantage-flat\": \"d20 > d20\",\n \"advantage-reroll\": \"hd20 > hd20\",\n \"disadvantage-flat\": \"d20 < d20\",\n \"disadvantage-reroll\": \"hd20 < hd20\",\n \"elven accuracy-flat\": \"d20 > d20 > d20\",\n \"elven accuracy-reroll\": \"hd20 > hd20 > hd20\",\n};\n\n/** Lift a single d20 PMF into advantage, disadvantage, or elven (triple-advantage). */\nexport function d20RollPMF(\n rollType: RollType | undefined,\n rerollOne: boolean = false\n): PMF {\n rollType = rollType || \"flat\";\n const cacheKeyLookup = `${rollType}-${rerollOne ? \"reroll\" : \"flat\"}`;\n const cacheKey = cacheKeyMap[cacheKeyLookup];\n if (!cacheKey) {\n throw new Error(`Invalid roll type: ${rollType}`);\n }\n\n const cached = pmfCache.get(cacheKey);\n if (cached) return cached;\n\n const base = d20PMF(rerollOne);\n if (!rollType || rollType === \"flat\") {\n pmfCache.set(cacheKey, base);\n return base;\n }\n\n const p: number[] = new Array(21).fill(0); // indices 1..20\n for (const [r, rec] of base) {\n const pr = typeof rec === \"number\" ? rec : rec.p;\n if (r >= 1 && r <= 20) p[r] = pr;\n }\n const F: number[] = new Array(21).fill(0);\n for (let k = 1; k <= 20; k++) F[k] = F[k - 1] + p[k];\n\n const eps = 0;\n let result = base;\n if (rollType === \"advantage\") {\n result = d20PmfFromCdf((k) => Math.pow(F[k], 2), eps);\n } else if (rollType === \"elven accuracy\") {\n result = d20PmfFromCdf((k) => Math.pow(F[k], 3), eps);\n } else if (rollType === \"disadvantage\") {\n result = d20PmfFromCdf((k) => 1 - Math.pow(1 - F[k], 2), eps);\n }\n\n pmfCache.set(cacheKey, result);\n return result;\n}\n\nexport function d20PMF(rerollOne: boolean): PMF {\n const cacheKey = `flat-${rerollOne ? \"reroll\" : \"flat\"}`;\n const cached = pmfCache.get(cacheKey);\n if (cached) return cached;\n\n const m = new Map<number, number>();\n const base = 1 / 20;\n const rerollShare = base * base;\n if (!rerollOne) {\n for (let r = 1; r <= 20; r++) {\n m.set(r, base);\n }\n } else {\n for (let r = 1; r <= 20; r++) {\n m.set(r, (r === 1 ? 0 : base) + rerollShare);\n }\n }\n const result = PMF.fromMap(m, EPS);\n pmfCache.set(cacheKey, result);\n return result;\n}\n","/**\n * Throws for a non-finite builder argument, naming it. NaN reads \"got NaN\" unless the call site has\n * its own, earlier NaN message. Internal: not re-exported from the package.\n */\nexport function requireFinite(value: number, what: string): void {\n if (!Number.isFinite(value)) throw new Error(`${what} must be finite, got ${value}`);\n}\n","import { astFromRollConfigs, dieNodeFromConfig } from \"./ast\";\nimport type { DieNode, ExpressionNode, KeepNode } from \"./nodes\";\nimport type { RollConfig } from \"./types\";\n\n/**\n * Printing builders as strings the parser reads back to the same distribution.\n *\n * The grammar reads every binary operator left to right at one precedence, so a term that is\n * itself an expression (`d8 reroll 1`, `3>d6`, `d4 > d4`, `(1d6) // 2`) is parenthesised whenever\n * something precedes it, and every operand of a `>`/`<` chain is an atom. `+` adds only to a\n * non-zero running total, so a term joins with ` + ` only when everything before it can never\n * total 0, and with ` ~+ ` (always add) otherwise. The grammar has no unary minus: a sum whose\n * every term is subtracted starts from `0 - `.\n *\n * Each die group is printed from the AST node the resolver reads (`astFromRollConfigs`), so the\n * string follows the builder's own reading of counts, keeps, roll types and signs.\n */\n\n/** One additive term of a printed sum: the text of its magnitude, its sign, and the range of that\n * magnitude when it is known. */\nexport type ExpressionTerm = {\n readonly text: string;\n readonly sign: 1 | -1;\n readonly range?: readonly [number, number];\n};\n\ntype PrintOptions = {\n /** A lone plain d20 prints as `d20` rather than `1d20` (the check's natural roll). */\n readonly d20Shorthand?: boolean;\n /** A keep-1-of-2 or keep-1-of-3 prints as a `>` / `<` chain (a roll type on a non-d20 die). */\n readonly rollTypeChain?: boolean;\n};\n\nfunction isBareDie(node: ExpressionNode): node is DieNode {\n return node.type === \"die\" && !(node.reroll! > 0) && !(node.minimum! > 0) && !(node.explode! > 0);\n}\n\n/**\n * Whether `text` is read as one argument wherever it sits: a number, a dice term (`2d6`, `d20`,\n * `hd20`), or a group `(…)`, `N(…)` or `NkhK(…)` whose first parenthesis closes at the end.\n */\nfunction isAtomicText(text: string): boolean {\n if (/^\\d+(\\.\\d+)?$/.test(text) || /^(\\d+(\\.\\d+)?)?h?d\\d+$/.test(text)) return true;\n const open = text.indexOf(\"(\");\n if (open < 0 || !text.endsWith(\")\")) return false;\n if (!/^(\\d+(\\.\\d+)?(k[hl]\\d+(\\.\\d+)?)?)?$/.test(text.slice(0, open))) return false;\n let depth = 0;\n for (let i = open; i < text.length; i++) {\n if (text[i] === \"(\") depth++;\n else if (text[i] === \")\" && --depth === 0) return i === text.length - 1;\n }\n return false;\n}\n\n/** `text` as one argument: parenthesised unless it already is one. */\nexport function atom(text: string): string {\n return isAtomicText(text) ? text : `(${text})`;\n}\n\n/** A number as one argument; the grammar has no negative literal, so `-3` is `(0 - 3)`. */\nexport function numberAtom(value: number): string {\n return value < 0 ? `(0 - ${-value})` : `${value}`;\n}\n\n/**\n * Joins signed terms into one sum. Zero terms are dropped; a positive term leads when there is\n * one. A term after the first is parenthesised unless it is atomic, and a positive term joins\n * with ` + ` only when the running total before it can never be 0 (its range excludes 0).\n */\nexport function joinTerms(terms: readonly ExpressionTerm[]): string {\n const live = terms.filter((term) => term.text !== \"0\");\n if (live.length === 0) return \"0\";\n const lead = live.findIndex((term) => term.sign > 0);\n if (lead > 0) live.unshift(...live.splice(lead, 1));\n\n let text = \"\";\n let known = true;\n let lo = 0;\n let hi = 0;\n live.forEach((term, i) => {\n if (i === 0) {\n text = term.sign > 0 ? term.text : `0 - ${atom(term.text)}`;\n } else if (term.sign < 0) {\n text += ` - ${atom(term.text)}`;\n } else {\n const neverZero = known && (lo > 0 || hi < 0);\n text += `${neverZero ? \" + \" : \" ~+ \"}${atom(term.text)}`;\n }\n if (known && term.range) {\n const [a, b] = term.range;\n if (term.sign > 0) {\n lo += a;\n hi += b;\n } else {\n lo -= b;\n hi -= a;\n }\n } else {\n known = false;\n }\n });\n return text;\n}\n\n/**\n * One die with its per-die rules: `d8 reroll 1` rerolls face 1 only, `d8 reroll d3` rerolls faces\n * 1–3 (the builder's reroll threshold), `3>d6` floors it at 3, `hd20` is a d20 rerolling a 1.\n */\nfunction printDie(die: DieNode): string {\n if (die.explode! > 0) {\n throw new Error(\n `toExpression() cannot represent an exploding die (d${die.sides} explode(${die.explode})): the string grammar has no explode syntax. Use the builder's own PMF (.toPMF()/.pmf) instead of round-tripping through toExpression()/parse().`\n );\n }\n const reroll = die.reroll ?? 0;\n const minimum = die.minimum ?? 0;\n if (die.sides === 20 && reroll === 1 && minimum <= 1) return \"hd20\";\n let text = `d${die.sides}`;\n if (reroll > 0) text += reroll === 1 ? \" reroll 1\" : ` reroll d${reroll}`;\n if (minimum > 0) text = `${minimum}>${atom(text)}`;\n return text;\n}\n\nfunction printKeep(node: KeepNode, options: PrintOptions): string {\n const pool = node.child;\n if (pool.type !== \"sum\") throw new Error(\"toExpression(): a keep must hold a pool of trials\");\n const trials = Math.max(0, Math.floor(pool.count));\n if (trials === 0 || Math.min(node.count, trials) <= 0) return \"0\";\n if (options.rollTypeChain && node.count === 1 && (trials === 2 || trials === 3)) {\n const operand = atom(printNode(pool.child));\n return Array(trials).fill(operand).join(node.mode === \"highest\" ? \" > \" : \" < \");\n }\n const trial = isBareDie(pool.child) ? `1d${pool.child.sides}` : printNode(pool.child);\n return `${pool.count}k${node.mode === \"highest\" ? \"h\" : \"l\"}${node.count}(${trial})`;\n}\n\n/**\n * The text of a scaled result `round(value * numerator / denominator)`: `N ** (inner)`,\n * `(inner) // D`, `(inner) / D` or `(inner) ** N // D`. `**` is the product (`*` is the attack\n * gate); `//` rounds down and `/` rounds up. Round-half and fractional factors have no token.\n */\nexport function printScale(\n inner: string,\n numerator: number,\n denominator: number,\n rounding: \"floor\" | \"round\" | \"ceil\"\n): string {\n const den = denominator === 0 ? 1 : denominator;\n if (!Number.isInteger(numerator) || !Number.isInteger(den)) {\n throw new Error(\n `toExpression() cannot represent scaleResult(${numerator}, ${denominator}): the string grammar has only whole numbers. Use the builder's own PMF (.toPMF()/.pmf) instead.`\n );\n }\n if (den === 1) return `${numberAtom(numerator)} ** (${inner})`;\n if (rounding === \"round\") {\n throw new Error(\n `toExpression() cannot represent scaleResult(${numerator}, ${denominator}, \"round\"): the string grammar has only floor (//) and ceil (/) division. Use the builder's own PMF (.toPMF()/.pmf) instead.`\n );\n }\n const div = rounding === \"ceil\" ? \"/\" : \"//\";\n if (numerator === 1) return `(${inner}) ${div} ${numberAtom(den)}`;\n return `(${inner}) ** ${numberAtom(numerator)} ${div} ${numberAtom(den)}`;\n}\n\n/** The text of an AST node, read by the parser as the same distribution the resolver gives it. */\nexport function printNode(node: ExpressionNode, options: PrintOptions = {}): string {\n switch (node.type) {\n case \"constant\":\n return node.value < 0 ? `0 - ${-node.value}` : `${node.value}`;\n case \"die\":\n return printDie(node);\n case \"sum\": {\n if (node.explodePoolBudget! > 0) {\n throw new Error(\n `toExpression() cannot represent a pool-wide exploding-dice budget (d${node.child.type === \"die\" ? node.child.sides : 0} explodePool(${node.explodePoolBudget})): the string grammar has no explode syntax. Use the builder's own PMF (.toPMF()/.pmf) instead of round-tripping through toExpression()/parse().`\n );\n }\n if (Math.floor(node.count) <= 0) return \"0\";\n const child = node.child;\n if (isBareDie(child)) {\n if (node.count !== 1) return `${node.count}d${child.sides}`;\n return options.d20Shorthand && child.sides === 20 ? \"d20\" : `1d${child.sides}`;\n }\n const inner = printNode(child, options);\n return node.count === 1 ? inner : `${node.count}(${inner})`;\n }\n case \"keep\":\n return printKeep(node, options);\n case \"d20Roll\": {\n const operand = atom(printNode(node.child));\n if (node.rollType === \"advantage\") return `${operand} > ${operand}`;\n if (node.rollType === \"disadvantage\") return `${operand} < ${operand}`;\n return `${operand} > ${operand} > ${operand}`;\n }\n case \"maxOf\": {\n const count = Math.max(1, Math.floor(node.count));\n if (count === 1) return printNode(node.child);\n return `${count}kh1(${isBareDie(node.child) ? `1d${node.child.sides}` : printNode(node.child)})`;\n }\n case \"half\":\n return `(${printNode(node.child)}) // 2`;\n case \"scale\":\n return printScale(printNode(node.child), node.numerator, node.denominator, node.rounding);\n case \"add\":\n return joinTerms(\n node.children.map(({ node: child, sign }) =>\n child.type === \"constant\"\n ? constantTerm(sign * child.value)\n : { text: printNode(child), sign, range: nodeRange(child) }\n )\n );\n default:\n throw new Error(`toExpression() has no spelling for a \"${(node as { type: string }).type}\" node`);\n }\n}\n\n/** The least and greatest value `node` can resolve to. */\nexport function nodeRange(node: ExpressionNode): [number, number] {\n switch (node.type) {\n case \"constant\":\n return [node.value, node.value];\n case \"die\": {\n const sides = Math.max(0, Math.floor(node.sides));\n if (sides === 0) return [0, 0];\n const minimum = Math.max(0, Math.floor(node.minimum ?? 0));\n const hi = node.explode! > 0 ? Infinity : Math.max(sides, minimum);\n return [Math.max(1, minimum), hi];\n }\n case \"sum\": {\n const count = Math.max(0, Math.floor(node.count));\n if (count === 0) return [0, 0];\n const [lo, hi] = nodeRange(node.child);\n return [count * lo, node.explodePoolBudget! > 0 ? Infinity : count * hi];\n }\n case \"keep\": {\n let pool: ExpressionNode = node.child;\n while (pool.type === \"keep\") pool = pool.child;\n const trials = pool.type === \"sum\" ? Math.max(0, Math.floor(pool.count)) : 0;\n const kept = Math.max(0, Math.min(node.count, trials));\n if (kept === 0 || pool.type !== \"sum\") return [0, 0];\n const [lo, hi] = nodeRange(pool.child);\n return [kept * lo, kept * hi];\n }\n case \"d20Roll\":\n case \"maxOf\":\n return nodeRange(node.child);\n case \"half\": {\n const [lo, hi] = nodeRange(node.child);\n return [Math.floor(lo / 2), Math.floor(hi / 2)];\n }\n case \"scale\": {\n const [lo, hi] = nodeRange(node.child);\n // Rounded either way, the scaled value lies within the rounded-out scaled bounds.\n const factor = node.numerator / (node.denominator === 0 ? 1 : node.denominator);\n const [a, b] = [lo * factor, hi * factor];\n return [Math.floor(Math.min(a, b)), Math.ceil(Math.max(a, b))];\n }\n case \"add\":\n return node.children.reduce<[number, number]>(\n ([lo, hi], { node: child, sign }) => {\n const [a, b] = nodeRange(child);\n return sign > 0 ? [lo + a, hi + b] : [lo - b, hi - a];\n },\n [0, 0]\n );\n default:\n throw new Error(`no value range for a \"${(node as { type: string }).type}\" node`);\n }\n}\n\nfunction constantTerm(value: number): ExpressionTerm {\n const magnitude = Math.abs(value);\n return { text: `${magnitude}`, sign: value < 0 ? -1 : 1, range: [magnitude, magnitude] };\n}\n\nconst complexity = (config: RollConfig) =>\n (config.reroll > 0 ? 1 : 0) +\n (config.explode > 0 ? 1 : 0) +\n (config.explodePoolBudget > 0 ? 1 : 0) +\n (config.minimum > 0 ? 1 : 0) +\n (config.bestOf > 0 ? 1 : 0) +\n (config.keep !== undefined ? 1 : 0) +\n (config.rollType !== \"flat\" ? 1 : 0);\n\ntype DiceGroup = { config: RollConfig; count: number; negative: boolean; root: boolean };\n\n/**\n * Two groups of the same plain die sum to one group of both counts. A keep, a `bestOf`, a roll\n * type, a pool-wide explode budget or a zero count makes a group's meaning depend on its own\n * count, so such a group is never merged.\n */\nfunction mergeable(config: RollConfig): boolean {\n return (\n config.keep === undefined &&\n !(config.bestOf > 0) &&\n config.rollType === \"flat\" &&\n !(config.explodePoolBudget > 0) &&\n config.count !== 0\n );\n}\n\nfunction diceGroups(configs: readonly RollConfig[], root: RollConfig | undefined): DiceGroup[] {\n const groups: DiceGroup[] = [];\n const byKey = new Map<string, DiceGroup>();\n for (const config of configs) {\n if (!(config.sides > 0)) continue;\n const negative = Boolean(config.isSubtraction) || config.count < 0;\n const count = Math.abs(config.count);\n const isRoot = config === root;\n if (!mergeable(config)) {\n groups.push({ config, count, negative, root: isRoot });\n continue;\n }\n const key = JSON.stringify({ ...config, count: 0, modifier: 0, isSubtraction: negative });\n const existing = byKey.get(key);\n if (existing) {\n existing.count += count;\n existing.root ||= isRoot;\n } else {\n const group = { config, count, negative, root: isRoot };\n byKey.set(key, group);\n groups.push(group);\n }\n }\n return groups;\n}\n\n/** Reroll/minimum groups first, then larger dice, then more complex groups. */\nfunction byPrintOrder(a: DiceGroup, b: DiceGroup): number {\n const aFirst = a.config.reroll > 0 || a.config.minimum > 0;\n const bFirst = b.config.reroll > 0 || b.config.minimum > 0;\n if (aFirst !== bFirst) return aFirst ? -1 : 1;\n if (b.config.sides !== a.config.sides) return b.config.sides - a.config.sides;\n return complexity(b.config) - complexity(a.config);\n}\n\nfunction groupTerms(group: DiceGroup): ExpressionTerm[] {\n const config: RollConfig = {\n ...group.config,\n count: group.count,\n modifier: 0,\n isSubtraction: group.negative,\n };\n const ast = astFromRollConfigs([config]);\n if (!ast || ast.type !== \"add\") return [];\n const options: PrintOptions = {\n d20Shorthand: group.root,\n rollTypeChain: config.rollType !== \"flat\",\n };\n return ast.children\n .filter(({ node }) => node.type !== \"constant\")\n .map(({ node, sign }) => ({ text: printNode(node, options), sign, range: nodeRange(node) }));\n}\n\n/**\n * The terms of a sum of die groups plus their flats, in print order: a leading d20 group (the\n * natural roll) first with the flat total right after it, otherwise the flat total last.\n */\nfunction orderedTerms(groups: DiceGroup[], leading: DiceGroup | undefined, modifier: number): ExpressionTerm[] {\n const ordered = [...(leading ? [leading] : []), ...groups.filter((g) => g !== leading).sort(byPrintOrder)];\n const terms = ordered.map(groupTerms);\n const flat = modifier === 0 ? [] : [constantTerm(modifier)];\n if (ordered.length > 0 && ordered[0].config.sides === 20) {\n return [...terms[0], ...flat, ...terms.slice(1).flat()];\n }\n return [...terms.flat(), ...flat];\n}\n\n/**\n * The terms of a plain roll's configs: every die group, then the total of their flats. `root` is\n * the natural-roll config (a d20 root prints first, as `d20`).\n */\nexport function configTerms(configs: readonly RollConfig[], root: RollConfig | undefined): ExpressionTerm[] {\n const groups = diceGroups(configs, root);\n const rootGroup = groups.find((group) => group.root);\n const modifier = configs.reduce((sum, config) => sum + config.modifier, 0);\n return orderedTerms(groups, rootGroup && rootGroup.config.sides === 20 ? rootGroup : undefined, modifier);\n}\n\n/** The minimal shape of a check the printer reads. */\ntype CheckDice = {\n getRootDieConfig(): RollConfig | undefined;\n getBonusDiceConfigs(): RollConfig[];\n readonly modifier: number;\n};\n\n/**\n * A check's natural roll as the check resolvers read it: ONE root die with its reroll/minimum,\n * rolled with its roll type (`d20`, `hd20`, `d20 > d20`, `(d20 reroll d2) < (d20 reroll d2)`).\n * `undefined` for a check with no die.\n */\nexport function rootDieExpression(check: CheckDice): string | undefined {\n const root = check.getRootDieConfig();\n if (!root || !(root.sides > 0)) return undefined;\n const die = dieNodeFromConfig(root);\n const node: ExpressionNode = root.rollType === \"flat\" ? die : { type: \"d20Roll\", rollType: root.rollType, child: die };\n return printNode(node);\n}\n\n/**\n * The to-hit/save total of a check as its resolvers read it: the root die ({@link\n * rootDieExpression}), its flat total, and every bonus die group (Bless, Bane, Guidance).\n */\nexport function checkExpression(check: CheckDice): string {\n const rootText = rootDieExpression(check);\n const groups = diceGroups(check.getBonusDiceConfigs(), undefined);\n if (rootText === undefined) return joinTerms(orderedTerms(groups, undefined, check.modifier));\n const root = check.getRootDieConfig()!;\n const rootTerm: ExpressionTerm = {\n text: rootText,\n sign: 1,\n range: nodeRange(dieNodeFromConfig(root)),\n };\n const flat = check.modifier === 0 ? [] : [constantTerm(check.modifier)];\n const bonus = orderedTerms(groups, undefined, 0);\n return joinTerms(root.sides === 20 ? [rootTerm, ...flat, ...bonus] : [rootTerm, ...bonus, ...flat]);\n}\n","import type { ACBuilder } from \"./ac\";\nimport type { CritConfig } from \"../common/types\";\nimport type { DCBuilder } from \"./dc\";\nimport { parse } from \"../parser/parser\";\nimport { AmbiguousCritDoublingError, scaleParsedDice, UndoubleableExpressionError } from \"../parser/scaleDice\";\nimport { PMF } from \"../pmf/pmf\";\nimport type { DiceQuery } from \"../pmf/query\";\nimport {\n astFromRollConfigs,\n clearDieCaches,\n perDieKeepReading,\n pmfFromRollBuilder,\n resolveRootD20,\n} from \"./ast\";\nimport { requireFinite } from \"./arguments\";\nimport { configTerms, joinTerms, nodeRange, printScale, rootDieExpression, type ExpressionTerm } from \"./expression\";\nimport { AttackBuilder } from \"./attack\";\nimport type { ExpressionNode, KeepNode, SumNode } from \"./nodes\";\nimport type { RollConfig, RollType } from \"./types\";\n\nexport { AmbiguousKeepError } from \"./ast\";\n\n/**\n * Thrown when a parsed string (`d(\"d20+5\")`, `RollBuilder.fromArgs(\"d20+5\")`) is used as an attack\n * or save check. A parsed builder carries only its PMF, not the dice and flats a check reads, so\n * the check would silently lose them.\n */\nexport class ParsedCheckError extends Error {\n constructor(readonly expression: string, verb: \"ac\" | \"dc\") {\n const example = verb === \"ac\" ? \"d20.plus(5).ac(15)\" : \"d20.plus(5).dc(15)\";\n const full = verb === \"ac\" ? \"(d20 + 5 AC 15) * (1d8)\" : \"(d20 + 5 DC 15) * (8d6) save half\";\n super(\n `Cannot use the parsed string \"${expression}\" as a check with .${verb}(): a parsed roll carries no ` +\n `dice or flats for the check to read. Build the check with the builder API (${example}) or ` +\n `parse a full attack or save string (\"${full}\").`\n );\n this.name = \"ParsedCheckError\";\n Object.setPrototypeOf(this, ParsedCheckError.prototype);\n }\n}\n\n/** A group that `roll(N, X)` must copy N times rather than scale: its dice count is part of its meaning. */\nfunction repeatsByCopy(config: RollConfig): boolean {\n return config.keep !== undefined || config.bestOf > 0 || config.explodePoolBudget > 0;\n}\n\n/** Validates a `scaleDice`/`doubleDice` multiplier: must be a positive integer. Shared by\n * `RollBuilder.scaleDice` and every subclass's override (Half/Scale/MaxOf/Composite/Parsed/Pooled). */\nfunction validateScaleInt(scale: number): number {\n const scaleInt = Math.floor(scale);\n if (scaleInt !== scale) throw new Error(\"Scale must be an integer\");\n if (scaleInt <= 0) throw new Error(\"Scale must be > 0\");\n return scaleInt;\n}\n\n/**\n * Why scaling `config`'s dice by `scale` has no single meaning, or `undefined` when it has one.\n * `astFromRollConfigs` reads a per-die keep through the die count, so multiplying that count only\n * means \"double the dice\" for keep-highest-of-1 (\"roll it N times, keep the best\", which then\n * doubles its dice inside each trial). Any other keep, a `bestOf()` that is (or becomes) a keep, and\n * a die rolled with advantage/disadvantage/elven accuracy (doubled as twice the advantaged dice, or\n * as advantage over the doubled sum) do not.\n */\nfunction ambiguousScaling(config: RollConfig, scale: number): string | undefined {\n const die = `d${config.sides}`;\n if (config.rollType !== \"flat\") {\n return (\n `a ${die} rolled with ${config.rollType} has no single doubled meaning ` +\n `(twice as many dice each rolled with ${config.rollType}, or ${config.rollType} over the doubled sum)`\n );\n }\n if (config.keep) {\n const { total, count, mode } = config.keep;\n if (count === 1 && mode === \"highest\") return undefined;\n return (\n `the per-die keep \\`${total}${mode === \"highest\" ? \"kh\" : \"kl\"}${count}\\` of ${die} has no single doubled meaning ` +\n `(only keep-highest-of-1, \"roll it N times, keep the best\", doubles its dice inside each trial)`\n );\n }\n const dice = Math.abs(config.count);\n if (config.bestOf > 0 && config.bestOf < dice * scale) {\n return `bestOf(${config.bestOf}) on ${dice}${die} keeps individual dice from the scaled pool, which has no single doubled meaning`;\n }\n return undefined;\n}\n\n/**\n * Plain-roll PMF cache, the sibling of {@link attackPMFCache}. `toPMF()` re-runs the whole AST convolution\n * every call, and a DPR sweep rebuilds the SAME damage roll thousands of times — a Paladin's smite damage,\n * a Wizard's Fireball. Keyed by {@link RollBuilder.cacheKey} plus `eps`; a `null` key (half/scale/max/parsed/\n * pooled/composite, whose PMF is not captured by `subRollConfigs`) resolves uncached, because a conservative\n * miss is always safe and a wrong key would corrupt DPR.\n *\n * Subclasses that override `toPMF` (Half/Scale/MaxOf/Composite) never reach this — and all of them return a\n * `null` key anyway, so they are uncacheable by the same rule either way.\n */\nconst rollPMFCache = PMF.createCache(4000);\n\n/** Clears the plain-roll and single-die PMF caches (test/bench seam; mirrors {@link clearAttackCache}). */\nexport function clearRollCache(): void {\n rollPMFCache.clear();\n clearDieCaches();\n}\n\nexport const defaultConfig: RollConfig = {\n count: 1,\n sides: 0,\n modifier: 0,\n reroll: 0,\n explode: 0,\n explodePoolBudget: 0,\n minimum: 0,\n bestOf: 0,\n keep: undefined,\n rollType: \"flat\",\n};\n\n/**\n * Index of the config holding a check's natural roll — the die whose 1 misses and whose 20 hits and\n * crits — or -1 when no config can be one. Only a rolled, added die can: a subtracted or zero-count\n * group never is. A d20 outranks every other die (a d30 or d100 beside it is a bonus die); with no\n * d20 the largest die does, and the first of equal dice wins. The same rule the string parser uses\n * to pick a check's natural roll, so `d4.plus(d20)` and `(1d4 + d20 AC n)` agree.\n */\nexport function naturalRollIndex(configs: readonly RollConfig[]): number {\n let best = -1;\n for (let i = 0; i < configs.length; i++) {\n const { sides, count, isSubtraction } = configs[i];\n if (!(sides > 0) || !(count > 0) || isSubtraction) continue;\n if (best === -1) {\n best = i;\n continue;\n }\n const top = configs[best].sides;\n if (top !== 20 && (sides === 20 || sides > top)) best = i;\n }\n return best;\n}\n\n// Fluent builder for dice to create PMFs with an AST\nexport class RollBuilder {\n protected readonly subRollConfigs: readonly RollConfig[];\n\n constructor(countOrConfigs: number | readonly RollConfig[] = 1) {\n if (typeof countOrConfigs === \"number\") {\n const count = countOrConfigs;\n if (isNaN(count)) throw new Error(\"Invalid NaN value for count\");\n requireFinite(count, \"count\");\n this.subRollConfigs = [\n { ...defaultConfig, count, isSubtraction: count < 0 },\n ];\n } else {\n this.subRollConfigs = countOrConfigs.map((c) => ({ ...c }));\n }\n }\n\n protected create(configs: readonly RollConfig[]): RollBuilder {\n return new RollBuilder(configs);\n }\n\n protected get lastConfig() {\n return this.subRollConfigs[this.subRollConfigs.length - 1];\n }\n\n hasHiddenState(): boolean {\n return false;\n }\n\n getSubRollConfigs(): readonly RollConfig[] {\n return this.subRollConfigs.map((c: RollConfig) => ({ ...c }));\n }\n\n /**\n * A cheap, stable string that FULLY identifies this builder's PMF — used by {@link AttackBuilder.toPMF}\n * to cache resolved attack PMFs across rebuilds without walking the AST via {@link toExpression}. A plain\n * roll is fully determined by its {@link RollConfig} array (count/sides/modifier/reroll/explode/minimum/\n * bestOf/keep/rollType/isSubtraction), so serializing that is sound. Subclasses whose PMF depends on\n * hidden state NOT captured by `subRollConfigs` (half/scale/max/parsed/pooled/composite transforms) return\n * `null` to opt OUT of caching — a conservative miss is always safe; a wrong key would corrupt DPR.\n */\n cacheKey(): string | null {\n // Non-finite numbers are kept distinct: JSON.stringify alone writes ±Infinity and NaN as null.\n return JSON.stringify(this.subRollConfigs, (_key, value: unknown) =>\n typeof value === \"number\" && !Number.isFinite(value) ? `#${value}` : value\n );\n }\n\n // for testing\n static fromConfig(config: Partial<RollConfig>): RollBuilder {\n return new RollBuilder([{ ...defaultConfig, ...config }]);\n }\n\n static fromConfigs(configs: Partial<RollConfig>[]): RollBuilder {\n return new RollBuilder(\n configs.map((config) => ({ ...defaultConfig, ...config }))\n );\n }\n\n static fromArgs(...args: any[]): RollBuilder {\n if (args.length === 1) {\n const arg = args[0];\n if (typeof arg === \"number\") {\n if (isNaN(arg)) throw new Error(\"Invalid NaN value for argument\");\n return new RollBuilder(0).plus(arg);\n }\n if (typeof arg === \"string\") {\n return new ParsedRollBuilder(arg);\n }\n if (arg instanceof RollBuilder) {\n return arg;\n }\n }\n\n if (args.length === 2 || args.length === 3) {\n const [count, sidesOrDie, modifier] = args;\n\n if (typeof count !== \"number\") {\n throw new Error(\"First argument must be a number for multi-arg call\");\n }\n if (isNaN(count)) throw new Error(\"Invalid NaN value for count argument\");\n\n if (sidesOrDie instanceof RollBuilder) {\n const repeated = RollBuilder.repeated(sidesOrDie, count);\n return modifier !== undefined ? repeated.plus(modifier) : repeated;\n } else if (typeof sidesOrDie === \"number\" || sidesOrDie === undefined) {\n if (typeof sidesOrDie === \"number\" && isNaN(sidesOrDie))\n throw new Error(\"Invalid NaN value for sides argument\");\n const builder = new RollBuilder(count).d(sidesOrDie);\n return modifier !== undefined ? builder.plus(modifier) : builder;\n }\n }\n\n throw new Error(`Invalid arguments passed: ${args.join(\", \")}`);\n }\n\n /**\n * `count` independent copies of `die`, subtracted when `count` is negative. A plain group scales\n * its dice count; a group whose count is part of its meaning (a keep, `bestOf()`, a pool-wide\n * `explodePool()` budget) is copied, so `roll(2, d6.keepHighest(2, 1))` is two best-of-two d6.\n * Each copy brings its own flat modifier, negated with the dice when subtracted.\n */\n protected static repeated(die: RollBuilder, count: number): RollBuilder {\n if (die instanceof TransformedRollBuilder) {\n const copies = Math.floor(Math.abs(count));\n if (copies === 0) return new RollBuilder(0);\n const total = sumRolls(Array.from({ length: copies }, () => die));\n return count < 0 ? new ScaleRollBuilder(total, -1) : total;\n }\n if (die.hasHiddenState()) {\n throw new Error(\n \"Cannot use a roll with hidden state (like a pooled roll) as a die type.\"\n );\n }\n const configs = die.getSubRollConfigs();\n if (configs.length === 0) return new RollBuilder(0);\n\n // A fractional count rolls its whole copies, as a fractional die count rolls its whole dice.\n const copies = Math.floor(Math.abs(count));\n const negate = count < 0;\n const repeatedConfigs: RollConfig[] = [];\n for (const config of configs) {\n const isSubtraction = (config.isSubtraction === true || config.count < 0) !== negate;\n const dice = Math.abs(config.count);\n const modifier = (negate ? -1 : 1) * config.modifier * copies;\n if (copies > 1 && repeatsByCopy(config)) {\n for (let i = 0; i < copies; i++) {\n repeatedConfigs.push({ ...config, count: dice, isSubtraction, modifier: i === 0 ? modifier : 0 });\n }\n } else {\n repeatedConfigs.push({ ...config, count: dice * copies, isSubtraction, modifier });\n }\n }\n return new RollBuilder(repeatedConfigs);\n }\n\n // --- Core Dice Methods ---\n d(sides: number | undefined): RollBuilder {\n if (sides !== undefined && isNaN(sides))\n throw new Error(\"Invalid NaN value for sides\");\n if (sides === undefined) return this;\n requireFinite(sides, \"sides\");\n if (sides < 0) throw new Error(`sides must not be negative, got ${sides}`);\n if (this.lastConfig.sides && this.lastConfig.sides > 0) {\n throw new Error(\"Cannot add a die after adding a die\");\n }\n if (sides === 0) return this;\n const newConfigs = this.getSubRollConfigs();\n newConfigs[newConfigs.length - 1].sides = sides;\n return this.create(newConfigs);\n }\n\n plus(modOrRoll: number | RollBuilder | undefined): RollBuilder;\n plus(count: number, die: RollBuilder): RollBuilder;\n plus(\n modOrRoll: number | RollBuilder | undefined,\n die?: RollBuilder\n ): RollBuilder {\n if (typeof modOrRoll === \"number\" && isNaN(modOrRoll))\n throw new Error(\"Invalid NaN value for modOrRoll\");\n if (typeof modOrRoll === \"number\") requireFinite(modOrRoll, \"plus()/minus() argument\");\n if (die instanceof RollBuilder && typeof modOrRoll === \"number\") {\n return this.add(RollBuilder.repeated(die, modOrRoll));\n }\n\n if (die !== undefined) {\n throw new Error(\"Invalid arguments to plus()\");\n }\n\n if (modOrRoll === undefined) return this;\n if (typeof modOrRoll === \"number\") {\n if (modOrRoll === 0) return this;\n const newConfigs = this.getSubRollConfigs();\n newConfigs[newConfigs.length - 1].modifier += modOrRoll;\n return this.create(newConfigs);\n }\n return this.add(modOrRoll as RollBuilder);\n }\n\n minus(modOrRoll: number | RollBuilder | undefined): RollBuilder;\n minus(count: number, die: RollBuilder): RollBuilder;\n minus(\n modOrRoll: number | RollBuilder | undefined,\n die?: RollBuilder\n ): RollBuilder {\n const isNumber = typeof modOrRoll === \"number\";\n const dieIsRoll = die instanceof RollBuilder;\n if (dieIsRoll && isNumber) return this.plus(-modOrRoll, die);\n\n if (die !== undefined) throw new Error(\"Invalid arguments to minus()\");\n if (modOrRoll === undefined) return this;\n\n return isNumber\n ? this.plus(-modOrRoll)\n : this.plus(-1, modOrRoll as RollBuilder);\n }\n\n /**\n * Reroll faces 1..`value` once and keep the second roll (Great Weapon Fighting in the 2014\n * rules). The reroll decides on the die's raw face: on a group that also has a {@link minimum},\n * the floor applies to the kept face afterwards, whichever of the two was called first.\n */\n reroll(value: number): RollBuilder {\n if (isNaN(value)) throw new Error(\"Invalid NaN value for reroll\");\n requireFinite(value, \"reroll()\");\n if (value === this.lastConfig.reroll) return this;\n\n const newConfigs = this.getSubRollConfigs();\n\n newConfigs[newConfigs.length - 1].reroll = value;\n return this.create(newConfigs);\n }\n\n /**\n * Let each die explode: a roll of its highest face adds another die, at most `count` extra dice\n * per die. The cap is required and must be finite; `explode(0)` is a no-op. For one budget\n * shared by the whole pool, use {@link explodePool}.\n */\n explode(count: number): RollBuilder {\n if (count === undefined) {\n throw new Error(\n \"explode() needs an explicit cap: explode(k) lets each die add at most k extra dice.\"\n );\n }\n if (isNaN(count)) throw new Error(\"Invalid NaN value for explode count\");\n requireFinite(count, \"explode() cap\");\n if (count === 0) return this;\n if (count < 0) throw new Error(\"Explode count must be >= 0\");\n if (this.lastConfig.explodePoolBudget > 0) {\n throw new Error(\n \"Cannot set explode() on a config that already has a pool-wide explodePool() budget — the two exploding-dice semantics (per-die vs pool-wide) are mutually exclusive on one config.\"\n );\n }\n\n const newConfigs = this.getSubRollConfigs();\n newConfigs[newConfigs.length - 1].explode = count;\n return this.create(newConfigs);\n }\n\n /**\n * Set a pool-wide exploding-dice budget: at most `budget` extra dice may be added across the\n * WHOLE pool (shared), as opposed to {@link explode}'s per-die cap (`n` dice each individually\n * allowed up to `explode(k)` extra dice). `budget` must be a finite non-negative integer.\n */\n explodePool(budget: number): RollBuilder {\n if (isNaN(budget)) throw new Error(\"Invalid NaN value for explodePool budget\");\n if (!Number.isFinite(budget)) throw new Error(\"explodePool budget must be finite\");\n if (budget < 0) throw new Error(\"explodePool budget must be >= 0\");\n if (budget === 0) return this;\n if (this.lastConfig.explode > 0) {\n throw new Error(\n \"Cannot set explodePool() on a config that already has a per-die explode() cap — the two exploding-dice semantics (per-die vs pool-wide) are mutually exclusive on one config.\"\n );\n }\n\n const newConfigs = this.getSubRollConfigs();\n newConfigs[newConfigs.length - 1].explodePoolBudget = Math.floor(budget);\n return this.create(newConfigs);\n }\n\n /**\n * Floor each die at `val`: `minimum(3)` treats a 1 or 2 as a 3 (the 2024 Great Weapon Fighting\n * style). On a group that also has a {@link reroll}, the reroll decides on the raw face and this\n * floor applies to the kept face afterwards, whichever of the two was called first.\n */\n minimum(val: number | undefined): RollBuilder {\n if (val !== undefined && isNaN(val))\n throw new Error(\"Invalid NaN value for minimum\");\n if (val === undefined) return this;\n requireFinite(val, \"minimum()\");\n if (val === 0) return this;\n if (val < 0) throw new Error(\"Minimum value must be >= 0\");\n\n const newConfigs = this.getSubRollConfigs();\n newConfigs[newConfigs.length - 1].minimum = val;\n return this.create(newConfigs);\n }\n\n bestOf(count: number | undefined): RollBuilder {\n if (count !== undefined && isNaN(count))\n throw new Error(\"Invalid NaN value for bestOf count\");\n if (count === undefined) return this;\n requireFinite(count, \"bestOf()\");\n if (count <= 0) throw new Error(\"Best of count must be > 0\");\n\n const newConfigs = this.getSubRollConfigs();\n newConfigs[newConfigs.length - 1].bestOf = count;\n return this.create(newConfigs);\n }\n\n /**\n * Keep the highest `count` of `total`. On one die, that is `count` of `total` rolls of the die;\n * on N dice it is `count` of the N dice when `total` is N and `count` >= 2, or the best of\n * `total` rolls of the whole N-dice group when `count` is 1. Any other shape on N > 1 dice has\n * more than one reading and throws an {@link AmbiguousKeepError}; use {@link keepHighestAll}\n * or a keep on each die instead.\n */\n keepHighest(total: number, count: number): RollBuilder {\n if (isNaN(total) || isNaN(count))\n throw new Error(\"Invalid NaN value for keepHighest\");\n return this.withKeep({ total, count, mode: \"highest\" });\n }\n\n /**\n * Keep the lowest `count` of `total`; the mirror of {@link keepHighest}. On N > 1 dice,\n * `keepLowest(N, 1)` throws an {@link AmbiguousKeepError}: the lowest single die and the worse\n * of N rolls of the whole group are both plausible readings.\n */\n keepLowest(total: number, count: number): RollBuilder {\n if (isNaN(total) || isNaN(count))\n throw new Error(\"Invalid NaN value for keepLowest\");\n return this.withKeep({ total, count, mode: \"lowest\" });\n }\n\n private withKeep(keep: NonNullable<RollConfig[\"keep\"]>): RollBuilder {\n requireFinite(keep.total, \"keep total\");\n requireFinite(keep.count, \"keep count\");\n const newConfigs = this.getSubRollConfigs();\n const last = newConfigs[newConfigs.length - 1];\n if (last.sides > 0 && last.rollType === \"flat\") perDieKeepReading(last.count, last.sides, keep);\n last.keep = keep;\n return this.create(newConfigs);\n }\n\n keepHighestAll(total: number, count: number): PooledRollBuilder {\n if (isNaN(total) || isNaN(count))\n throw new Error(\"Invalid NaN value for keepHighestAll\");\n requireFinite(total, \"keepHighestAll() total\");\n requireFinite(count, \"keepHighestAll() count\");\n const currentAST = this.toAST();\n // Wrap in SumNode to represent trials, then KeepNode\n const trialPool: SumNode = {\n type: \"sum\",\n count: total,\n child: currentAST,\n };\n const keepNode: KeepNode = {\n type: \"keep\",\n mode: \"highest\",\n count,\n child: trialPool,\n };\n return new PooledRollBuilder(\n keepNode,\n () => (Math.floor(total) <= 0 || count <= 0 ? \"0\" : `${total}kh${count}(${this.toExpression()})`),\n [],\n (scale) => this.scaleDice(scale).keepHighestAll(total, count)\n );\n }\n\n keepLowestAll(total: number, count: number): PooledRollBuilder {\n if (isNaN(total) || isNaN(count))\n throw new Error(\"Invalid NaN value for keepLowestAll\");\n requireFinite(total, \"keepLowestAll() total\");\n requireFinite(count, \"keepLowestAll() count\");\n const currentAST = this.toAST();\n const trialPool: SumNode = {\n type: \"sum\",\n count: total,\n child: currentAST,\n };\n const keepNode: KeepNode = {\n type: \"keep\",\n mode: \"lowest\",\n count,\n child: trialPool,\n };\n return new PooledRollBuilder(\n keepNode,\n () => (Math.floor(total) <= 0 || count <= 0 ? \"0\" : `${total}kl${count}(${this.toExpression()})`),\n [],\n (scale) => this.scaleDice(scale).keepLowestAll(total, count)\n );\n }\n\n withAdvantage(): RollBuilder {\n return this.withRollType(\"advantage\");\n }\n\n withDisadvantage(): RollBuilder {\n return this.withRollType(\"disadvantage\");\n }\n\n /**\n * Sets a roll type. On a roll with a natural d20 (a check: see {@link naturalRollIndex}) it\n * applies to that d20 whatever the call order, so `d20.plus(d4).withAdvantage()` advantages the\n * d20, not the Bless die. Otherwise it applies to the last group.\n */\n private withRollType(rollType: RollType): RollBuilder {\n const configs = this.getSubRollConfigs();\n const rootIdx = naturalRollIndex(configs);\n const idx = rootIdx !== -1 && configs[rootIdx].sides === 20 ? rootIdx : configs.length - 1;\n configs[idx].rollType = rollType;\n return this.create(configs);\n }\n\n add(anotherRoll: RollBuilder | undefined): RollBuilder {\n if (anotherRoll === undefined) return this;\n if (anotherRoll instanceof TransformedRollBuilder) return sumRolls([this, anotherRoll]);\n if (anotherRoll.hasHiddenState()) {\n throw new Error(\n \"Cannot add a roll with hidden state (like a pooled roll) to a standard roll. Try adding the standard roll to the pooled roll instead: pool.plus(roll).\"\n );\n }\n const configs = [...this.subRollConfigs, ...anotherRoll.subRollConfigs];\n return this.create(configs);\n }\n\n withBonus(anotherRoll: RollBuilder): RollBuilder {\n const configs = [...this.subRollConfigs, ...anotherRoll.subRollConfigs];\n return this.create(configs);\n }\n\n addRoll(count: number = 1): RollBuilder {\n if (isNaN(count)) throw new Error(\"Invalid NaN value for count\");\n const configs = [\n ...this.subRollConfigs,\n {\n ...defaultConfig,\n count,\n isSubtraction: count < 0,\n },\n ];\n return this.create(configs);\n }\n\n /**\n * Multiplies every die group's count by `scale` (crit doubling); flats stay. Throws an\n * {@link AmbiguousCritDoublingError} for a group whose scaled meaning is ambiguous (see\n * {@link ambiguousScaling}): the caller must give the crit explicitly.\n */\n scaleDice(scale: number): RollBuilder {\n const scaleInt = validateScaleInt(scale);\n\n const newConfigs = this.getSubRollConfigs().map((config) => {\n if (!config.sides || config.sides <= 0) return config;\n const ambiguity = ambiguousScaling(config, scaleInt);\n if (ambiguity !== undefined) {\n // An exploding die has no string form; the ambiguity, not the missing spelling, is the error.\n let shown = \"this roll\";\n try {\n shown = `\"${this.toExpression()}\"`;\n } catch {\n // keep the generic name\n }\n throw new AmbiguousCritDoublingError(\n `Cannot double the dice of ${shown} on a crit: ${ambiguity}. ` +\n `Give the crit explicitly: onCrit(...) on an attack, critDamage on a rider, or noCrit().`\n );\n }\n return { ...config, count: config.count * scaleInt };\n });\n return this.create(newConfigs);\n }\n\n doubleDice(): RollBuilder {\n return this.scaleDice(2);\n }\n\n alwaysHits() {\n return new AlwaysHitBuilder(this);\n }\n\n alwaysCrits() {\n return new AlwaysCritBuilder(this);\n }\n\n copy(): RollBuilder {\n return this.create(this.getSubRollConfigs());\n }\n\n // --- Dice Shortcut Methods ---\n d4 = () => this.d(4);\n d6 = () => this.d(6);\n d8 = () => this.d(8);\n d10 = () => this.d(10);\n d12 = () => this.d(12);\n d20 = () => this.d(20);\n d100 = () => this.d(100);\n\n withElvenAccuracy() {\n return this.withRollType(\"elven accuracy\");\n }\n\n toExpression(): string {\n return joinTerms(configTerms(this.subRollConfigs, this.getRootDieConfig()));\n }\n\n // Main AST entry point. Cached by the cheap config key across identical rebuilds; see `rollPMFCache`.\n toPMF(eps: number = 0): PMF {\n const key = this.cacheKey();\n if (key === null) return pmfFromRollBuilder(this, eps);\n const fullKey = `${key}*e${eps}`;\n const cached = rollPMFCache.get(fullKey);\n if (cached) return cached;\n const pmf = pmfFromRollBuilder(this, eps);\n rollPMFCache.set(fullKey, pmf);\n return pmf;\n }\n\n get pmf() {\n return this.toPMF();\n }\n\n toQuery(eps: number = 0): DiceQuery {\n return this.toPMF(eps).query();\n }\n\n toAST(): ExpressionNode {\n const configs = this.getSubRollConfigs();\n return (\n astFromRollConfigs(configs) ||\n ({ type: \"constant\", value: 0 } as ExpressionNode)\n );\n }\n\n /**\n * The config carrying this roll's natural die — see {@link naturalRollIndex} — or, with no\n * such die, the first config (so `rollType`/`baseReroll` still read a flat roll's own fields).\n */\n getRootDieConfig(): RollConfig | undefined {\n const configs = this.subRollConfigs;\n const idx = naturalRollIndex(configs);\n return idx === -1 ? configs[0] : configs[idx];\n }\n\n getAllDieConfigs(): readonly RollConfig[] {\n return this.getSubRollConfigs();\n }\n\n /**\n * The check's dice other than its natural die (Bless, Bane, Guidance), each WITHOUT its flat\n * modifier. `.plus(n)` stores `n` on whichever group came last, so `d20.plus(d4).plus(5)` holds\n * the 5 on the d4 group; every check resolver already adds all flats once via {@link modifier},\n * so a bonus group that kept its own would count it twice and make the check order-dependent.\n * A check with no natural die has every die as a bonus die.\n */\n getBonusDiceConfigs(): RollConfig[] {\n const allConfigs = this.subRollConfigs;\n const rootIdx = naturalRollIndex(allConfigs);\n return allConfigs\n .filter((config, i) => config.sides > 0 && i !== rootIdx)\n .map((config) => ({ ...config, modifier: 0 }));\n }\n\n getBonusDicePMFs(check: RollBuilder, eps: number = 0): PMF[] {\n return check\n .getBonusDiceConfigs()\n .map((config) =>\n pmfFromRollBuilder(RollBuilder.fromConfigs([config]), eps)\n );\n }\n\n get modifier(): number {\n return this.subRollConfigs.reduce(\n (sum, config) => sum + config.modifier,\n 0\n );\n }\n\n get rollType(): RollType {\n const rootConfig = this.getRootDieConfig();\n return rootConfig?.rollType || \"flat\";\n }\n\n get baseReroll(): number {\n const rootConfig = this.getRootDieConfig();\n return rootConfig?.reroll || 0;\n }\n\n half(): HalfRollBuilder {\n return new HalfRollBuilder(this);\n }\n\n /**\n * Scale this roll's result by `numerator / denominator`, rounding each outcome.\n * A general, composable form of {@link half} — used to model damage-type resistance\n * (`scaleResult(1, 2)` → `(expr) // 2`) and vulnerability (`scaleResult(2)` → `2 * (expr)`).\n * Compose several of these (and plain rolls) into one payload with {@link sumRolls}.\n */\n scaleResult(\n numerator: number,\n denominator: number = 1,\n rounding: \"floor\" | \"round\" | \"ceil\" = \"floor\"\n ): ScaleRollBuilder {\n return new ScaleRollBuilder(this, numerator, denominator, rounding);\n }\n\n /**\n * The highest of `count` independent rolls of this whole roll (dice, flats, rerolls and all):\n * `roll(2, d6).plus(3).maxOf(2)` is the better of two 2d6 + 3. Given another roll instead, the\n * higher of this roll and that one: `roll(3, d8).maxOf(roll(2, d10))`.\n */\n maxOf(count: number): MaxOfRollBuilder;\n maxOf(other: RollBuilder): RollBuilder;\n maxOf(countOrOther: number | RollBuilder): RollBuilder {\n if (countOrOther instanceof RollBuilder) return new MaxOfRollsBuilder([this, countOrOther]);\n if (isNaN(countOrOther)) throw new Error(\"Invalid NaN value for maxOf count\");\n requireFinite(countOrOther, \"maxOf() count\");\n return new MaxOfRollBuilder(this, countOrOther);\n }\n\n // These methods are implemented via prototype augmentation in ac.ts and dc.ts\n // They are declared here to provide proper TypeScript types\n ac(_targetAC: number): ACBuilder {\n throw new Error(\"ac() should be implemented via prototype augmentation\");\n }\n\n dc(_saveDC: number): DCBuilder {\n throw new Error(\"dc() should be implemented via prototype augmentation\");\n }\n}\n\n/**\n * A roll whose value is a transform of whole rolls: halved, scaled, the highest of several, or a\n * sum that keeps such parts. Arithmetic on it (`plus`, `minus`, `add`) composes as a sum that\n * keeps the transform, so `roll(2, d6).half().plus(1)` is floor(2d6 / 2) + 1. Verbs that edit the\n * underlying dice (`reroll`, `minimum`, `keepHighest`, advantage, ...) throw instead: set them on\n * the roll before transforming it.\n */\nabstract class TransformedRollBuilder extends RollBuilder {\n /** The call that made this roll, for error messages (e.g. `half()`). */\n protected abstract readonly verb: string;\n\n protected override create(_configs: readonly RollConfig[]): RollBuilder {\n throw new Error(\n `Cannot change the dice of a ${this.verb} roll: that would drop the ${this.verb} transform. ` +\n `Set reroll/minimum/explode/keep/advantage on the roll before calling ${this.verb}.`\n );\n }\n\n override plus(modOrRoll: number | RollBuilder | undefined): RollBuilder;\n override plus(count: number, die: RollBuilder): RollBuilder;\n override plus(modOrRoll: number | RollBuilder | undefined, die?: RollBuilder): RollBuilder {\n if (typeof modOrRoll === \"number\" && isNaN(modOrRoll))\n throw new Error(\"Invalid NaN value for modOrRoll\");\n if (typeof modOrRoll === \"number\") requireFinite(modOrRoll, \"plus()/minus() argument\");\n if (die instanceof RollBuilder && typeof modOrRoll === \"number\") {\n return this.add(RollBuilder.repeated(die, modOrRoll));\n }\n if (die !== undefined) throw new Error(\"Invalid arguments to plus()\");\n if (modOrRoll === undefined || modOrRoll === 0) return this;\n if (typeof modOrRoll === \"number\") return sumRolls([this, new RollBuilder(0).plus(modOrRoll)]);\n return this.add(modOrRoll);\n }\n\n override add(anotherRoll: RollBuilder | undefined): RollBuilder {\n return anotherRoll === undefined ? this : sumRolls([this, anotherRoll]);\n }\n}\n\nexport class HalfRollBuilder extends TransformedRollBuilder {\n protected readonly verb = \"half()\";\n\n constructor(private readonly innerRoll: RollBuilder) {\n super(0); // dummy, we override methods\n }\n\n override hasHiddenState(): boolean {\n return this.innerRoll.hasHiddenState();\n }\n\n override cacheKey(): string | null {\n return null; // half-of transform not captured by subRollConfigs\n }\n\n override get lastConfig(): RollConfig {\n // `lastConfig` is protected on the base class; reach it on the wrapped\n // instance via a typed view rather than `any`.\n return (this.innerRoll as unknown as { lastConfig: RollConfig }).lastConfig;\n }\n\n getSubRollConfigs(): readonly RollConfig[] {\n return this.innerRoll.getSubRollConfigs();\n }\n\n toExpression(): string {\n const innerExpression = this.innerRoll.toExpression();\n return `(${innerExpression}) // 2`;\n }\n\n toAST(): ExpressionNode {\n return {\n type: \"half\",\n child: this.innerRoll.toAST(),\n };\n }\n\n toPMF(eps: number = 0): PMF {\n return pmfFromRollBuilder(this, eps);\n }\n\n // Scale the dice, keep the same // 2 (half) transform applied on top -- delegating to the\n // base class's `create()`-based scaleDice would drop the halving entirely, e.g. a doubled-dice\n // crit on a resisted hit payload silently losing the resistance.\n override scaleDice(scale: number): RollBuilder {\n return new HalfRollBuilder(this.innerRoll.scaleDice(scale));\n }\n\n copy(): HalfRollBuilder {\n return new HalfRollBuilder(this.innerRoll.copy());\n }\n}\n\n/**\n * A roll whose result is scaled by `numerator / denominator` and rounded — the composable\n * generalization of {@link HalfRollBuilder}. Renders as `N ** (inner)`, `(inner) // D`, or\n * `(inner) ** N // D`. Arithmetic after it keeps the scale (see {@link sumRolls}).\n */\nexport class ScaleRollBuilder extends TransformedRollBuilder {\n protected readonly verb = \"scaleResult()\";\n\n constructor(\n private readonly innerRoll: RollBuilder,\n private readonly numerator: number,\n private readonly denominator: number = 1,\n private readonly rounding: \"floor\" | \"round\" | \"ceil\" = \"floor\"\n ) {\n super(0); // dummy, we override methods\n requireFinite(numerator, \"scaleResult() numerator\");\n requireFinite(denominator, \"scaleResult() denominator\");\n if (denominator === 0) throw new Error(\"scaleResult() denominator must not be 0\");\n }\n\n override hasHiddenState(): boolean {\n return this.innerRoll.hasHiddenState();\n }\n\n override cacheKey(): string | null {\n return null; // scale transform not captured by subRollConfigs\n }\n\n override get lastConfig(): RollConfig {\n return (this.innerRoll as unknown as { lastConfig: RollConfig }).lastConfig;\n }\n\n getSubRollConfigs(): readonly RollConfig[] {\n return this.innerRoll.getSubRollConfigs();\n }\n\n toExpression(): string {\n return printScale(this.innerRoll.toExpression(), this.numerator, this.denominator, this.rounding);\n }\n\n toAST(): ExpressionNode {\n return {\n type: \"scale\",\n numerator: this.numerator,\n denominator: this.denominator,\n rounding: this.rounding,\n child: this.innerRoll.toAST(),\n };\n }\n\n toPMF(eps: number = 0): PMF {\n return pmfFromRollBuilder(this, eps);\n }\n\n // Scale the dice, keep the same numerator/denominator/rounding transform applied on top --\n // delegating to the base class's `create()`-based scaleDice would drop the scale entirely,\n // e.g. a doubled-dice crit on a vulnerable hit payload silently losing the vulnerability.\n override scaleDice(scale: number): RollBuilder {\n return new ScaleRollBuilder(\n this.innerRoll.scaleDice(scale),\n this.numerator,\n this.denominator,\n this.rounding\n );\n }\n\n copy(): ScaleRollBuilder {\n return new ScaleRollBuilder(\n this.innerRoll.copy(),\n this.numerator,\n this.denominator,\n this.rounding\n );\n }\n}\n\nexport class MaxOfRollBuilder extends TransformedRollBuilder {\n protected readonly verb = \"maxOf()\";\n\n constructor(\n private readonly innerRoll: RollBuilder,\n private readonly count: number,\n private readonly diceCount?: number,\n private readonly diceSides?: number\n ) {\n super(0); // dummy, we override methods\n }\n\n override hasHiddenState(): boolean {\n return this.innerRoll.hasHiddenState();\n }\n\n override cacheKey(): string | null {\n return null; // max-of transform not captured by subRollConfigs\n }\n\n override get lastConfig(): RollConfig {\n // `lastConfig` is protected on the base class; reach it on the wrapped\n // instance via a typed view rather than `any`.\n return (this.innerRoll as unknown as { lastConfig: RollConfig }).lastConfig;\n }\n\n getSubRollConfigs(): readonly RollConfig[] {\n return this.innerRoll.getSubRollConfigs();\n }\n\n /** `NkhK(X)` keeps the highest K of N independent copies of X: the max of N rolls is `Nkh1(X)`. */\n toExpression(): string {\n const count = Math.max(1, Math.floor(this.count));\n const inner = this.innerRoll.toExpression();\n return count === 1 ? inner : `${count}kh1(${inner})`;\n }\n\n toAST(): ExpressionNode {\n return { type: \"maxOf\", count: this.count, child: this.innerRoll.toAST() };\n }\n\n toPMF(eps: number = 0): PMF {\n return pmfFromRollBuilder(this, eps);\n }\n\n // Scale the dice INSIDE each trial (e.g. maxOf(2, 1d12) -> maxOf(2, 2d12)), keeping the same\n // trial count -- delegating to the base class's `create()`-based scaleDice would collapse\n // straight to plain dice, losing the \"take the highest of N trials\" semantics entirely.\n override scaleDice(scale: number): RollBuilder {\n const scaleInt = validateScaleInt(scale);\n return new MaxOfRollBuilder(\n this.innerRoll.scaleDice(scaleInt),\n this.count,\n this.diceCount ? this.diceCount * scaleInt : undefined,\n this.diceSides\n );\n }\n\n copy(): MaxOfRollBuilder {\n return new MaxOfRollBuilder(this.innerRoll.copy(), this.count);\n }\n}\n\nexport class AlwaysHitBuilder extends RollBuilder {\n readonly attackConfig: CritConfig;\n\n constructor(baseRoll: RollBuilder, attackConfig?: CritConfig) {\n if (baseRoll.hasHiddenState()) {\n throw new Error(\n \"Cannot create AlwaysHitBuilder from a roll with hidden state.\"\n );\n }\n super(baseRoll.getSubRollConfigs());\n\n if (attackConfig) {\n this.attackConfig = { ...attackConfig };\n } else {\n this.attackConfig = { critThreshold: 20 };\n }\n }\n\n protected create(configs: readonly RollConfig[]): RollBuilder {\n return new RollBuilder(configs);\n }\n\n onHit(val: number): AttackBuilder;\n onHit(val: string): AttackBuilder;\n onHit(val: RollBuilder): AttackBuilder;\n onHit(count: number, die: RollBuilder): AttackBuilder;\n onHit(count: number, sides: number): AttackBuilder;\n onHit(count: number, die: RollBuilder, modifier: number): AttackBuilder;\n onHit(count: number, sides: number, modifier: number): AttackBuilder;\n onHit(...args: any[]): AttackBuilder {\n const damageRoll = RollBuilder.fromArgs(...args);\n return new AttackBuilder(this, damageRoll);\n }\n\n get critThreshold(): number {\n return this.attackConfig.critThreshold;\n }\n\n override cacheKey(): string | null {\n const base = super.cacheKey();\n return base === null ? null : `H|${this.attackConfig.critThreshold}|${base}`;\n }\n\n /** Sets the crit threshold for this always-hitting check: a natural roll at or above it crits. */\n critOn(critThreshold: number): AlwaysHitBuilder {\n requireFinite(critThreshold, \"critOn() threshold\");\n const newConfig = { critThreshold };\n return new AlwaysHitBuilder(this, newConfig);\n }\n\n alwaysCrits(): AlwaysCritBuilder {\n return new AlwaysCritBuilder(this, undefined, true);\n }\n\n /** The check's natural roll, which is all this builder's own PMF reads (see {@link toPMF}). */\n override toExpression(): string {\n return rootDieExpression(this) ?? super.toExpression();\n }\n\n override toPMF(): PMF {\n return resolveRootD20(this);\n }\n\n override copy(): AlwaysHitBuilder {\n const baseCopy = new RollBuilder(this.getSubRollConfigs());\n const critThreshold = this.critThreshold;\n const newConfig = { critThreshold };\n return new AlwaysHitBuilder(baseCopy, newConfig);\n }\n}\n\nexport class AlwaysCritBuilder extends RollBuilder {\n readonly attackConfig: CritConfig & { ac?: number };\n readonly fromAlwaysHit: boolean;\n\n constructor(\n baseRoll: RollBuilder,\n attackConfig?: CritConfig & { ac?: number },\n fromAlwaysHit: boolean = false\n ) {\n if (baseRoll.hasHiddenState()) {\n throw new Error(\n \"Cannot create AlwaysCritBuilder from a roll with hidden state.\"\n );\n }\n super(baseRoll.getSubRollConfigs());\n\n if (attackConfig) {\n this.attackConfig = { ...attackConfig };\n } else {\n this.attackConfig = { critThreshold: 20 };\n }\n this.fromAlwaysHit = fromAlwaysHit || baseRoll instanceof AlwaysHitBuilder;\n }\n\n protected create(configs: readonly RollConfig[]): RollBuilder {\n return new RollBuilder(configs);\n }\n\n onHit(val: number): AttackBuilder;\n onHit(val: string): AttackBuilder;\n onHit(val: RollBuilder): AttackBuilder;\n onHit(count: number, die: RollBuilder): AttackBuilder;\n onHit(count: number, sides: number): AttackBuilder;\n onHit(count: number, die: RollBuilder, modifier: number): AttackBuilder;\n onHit(count: number, sides: number, modifier: number): AttackBuilder;\n onHit(...args: any[]): AttackBuilder {\n const damageRoll = RollBuilder.fromArgs(...args);\n return new AttackBuilder(this, damageRoll);\n }\n\n get critThreshold(): number {\n return this.attackConfig.critThreshold;\n }\n\n override cacheKey(): string | null {\n const base = super.cacheKey();\n return base === null ? null : `C|${this.fromAlwaysHit ? 1 : 0}|${this.attackConfig.critThreshold}|${this.attackConfig.ac ?? \"\"}|${base}`;\n }\n\n critOn(critThreshold: number): AlwaysCritBuilder {\n requireFinite(critThreshold, \"critOn() threshold\");\n const newConfig = { critThreshold, ac: this.attackConfig.ac };\n return new AlwaysCritBuilder(this, newConfig, this.fromAlwaysHit);\n }\n\n /** The check's natural roll, which is all this builder's own PMF reads (see {@link toPMF}). */\n override toExpression(): string {\n return rootDieExpression(this) ?? super.toExpression();\n }\n\n override toPMF(): PMF {\n return resolveRootD20(this);\n }\n\n override copy(): AlwaysCritBuilder {\n const baseCopy = new RollBuilder(this.getSubRollConfigs());\n const critThreshold = this.critThreshold;\n const newConfig = { critThreshold, ac: this.attackConfig.ac };\n return new AlwaysCritBuilder(baseCopy, newConfig, this.fromAlwaysHit);\n }\n}\n\nexport class ParsedRollBuilder extends RollBuilder {\n private readonly cachedPMF: PMF;\n private readonly originalExpression: string;\n\n constructor(expression: string) {\n super([]); // Empty configs since we're bypassing the normal builder flow\n this.originalExpression = expression;\n this.cachedPMF = parse(expression, 0);\n }\n\n override hasHiddenState(): boolean {\n return true;\n }\n\n override cacheKey(): string | null {\n return null; // parsed expression not captured by subRollConfigs\n }\n\n protected create(configs: readonly RollConfig[]): RollBuilder {\n return new RollBuilder(configs);\n }\n\n override toPMF(_eps: number = 0): PMF {\n // The PMF is pre-computed at construction with eps=0; epsilon is not re-applied here.\n return this.cachedPMF;\n }\n\n override toExpression(): string {\n return this.originalExpression;\n }\n\n /** Refused: a parsed roll has no dice or flats for a check to read (see {@link ParsedCheckError}). */\n override ac(_targetAC: number): ACBuilder {\n throw new ParsedCheckError(this.originalExpression, \"ac\");\n }\n\n /** Refused: a parsed roll has no dice or flats for a check to read (see {@link ParsedCheckError}). */\n override dc(_saveDC: number): DCBuilder {\n throw new ParsedCheckError(this.originalExpression, \"dc\");\n }\n\n override toAST(): ExpressionNode {\n // Parsed expressions carry no AST; they are terminal damage payloads, so AST conversion is\n // unsupported rather than reconstructed.\n throw new Error(\n \"ParsedRollBuilder does not support AST conversion. Use the builder API instead.\"\n );\n }\n\n override copy(): ParsedRollBuilder {\n return new ParsedRollBuilder(this.originalExpression);\n }\n\n /**\n * Whether this is a damage expression whose dice a crit doubles: false for one with an AC/DC\n * check or a crit/save/pc/miss clause, or a dice-valued repeat count (`d4d6`), which a crit adds\n * as-is. True for every other expression, including one whose doubling is ambiguous (a keep other\n * than keep-highest-of-1, a min of two dice terms): that is still damage, and {@link doubleDice}\n * refuses it with an `AmbiguousCritDoublingError` so no crit is approximated. Reads the string\n * only; nothing is parsed into a PMF.\n */\n canDoubleDice(): boolean {\n try {\n scaleParsedDice(this.originalExpression, 2);\n return true;\n } catch (error) {\n if (error instanceof UndoubleableExpressionError) return false;\n if (error instanceof AmbiguousCritDoublingError) return true;\n throw error;\n }\n }\n\n /**\n * A crit doubles every dice term of the expression; flats and operators stay. Throws when\n * {@link canDoubleDice} is false, and for an ambiguous keep (see {@link canDoubleDice}).\n */\n override doubleDice(): ParsedRollBuilder {\n return this.scaleDice(2);\n }\n\n override scaleDice(scale: number): ParsedRollBuilder {\n return new ParsedRollBuilder(scaleParsedDice(this.originalExpression, validateScaleInt(scale)));\n }\n}\n\n/**\n * Rebuilds a pool from its pre-pool roll with that roll's dice scaled. This is how a pool's dice\n * double on a crit: `roll(2,d6).plus(3).keepHighestAll(2,1)` crits as\n * `roll(4,d6).plus(3).keepHighestAll(2,1)`, never as the whole pool rolled twice.\n */\ntype RepoolScaled = (scale: number) => PooledRollBuilder;\n\nexport class PooledRollBuilder extends RollBuilder {\n constructor(\n private readonly baseAST: ExpressionNode,\n /** Prints the pool itself; called only when the expression is asked for. */\n private readonly baseExpression: () => string,\n configs: readonly RollConfig[] = [],\n private readonly repoolScaled?: RepoolScaled\n ) {\n // Initialize with empty config if none provided\n super(configs.length > 0 ? configs : 0);\n }\n\n protected create(configs: readonly RollConfig[]): PooledRollBuilder {\n // Preserves the base AST and expression; only the configs change.\n return new PooledRollBuilder(this.baseAST, this.baseExpression, configs, this.repoolScaled);\n }\n\n override hasHiddenState(): boolean {\n return true;\n }\n\n override cacheKey(): string | null {\n return null; // pooled keep-highest not captured by subRollConfigs\n }\n\n override d(_sides: number | undefined): RollBuilder {\n throw new Error(\"Cannot add dice to a pooled roll. The pool is finalized.\");\n }\n\n override reroll(_value: number): RollBuilder {\n throw new Error(\"Cannot set reroll on a pooled roll.\");\n }\n\n override explode(_count: number): RollBuilder {\n throw new Error(\"Cannot set explode on a pooled roll.\");\n }\n\n override explodePool(_budget: number): RollBuilder {\n throw new Error(\"Cannot set explodePool on a pooled roll.\");\n }\n\n override minimum(_val: number | undefined): RollBuilder {\n throw new Error(\"Cannot set minimum on a pooled roll.\");\n }\n\n override bestOf(_count: number | undefined): RollBuilder {\n throw new Error(\"Cannot set bestOf on a pooled roll.\");\n }\n\n override keepHighest(_total: number, _count: number): RollBuilder {\n throw new Error(\n \"Cannot use keepHighest on a pooled roll. Use keepHighestAll again if you want nested pooling.\"\n );\n }\n\n override keepLowest(_total: number, _count: number): RollBuilder {\n throw new Error(\n \"Cannot use keepLowest on a pooled roll. Use keepLowestAll again if you want nested pooling.\"\n );\n }\n\n override withAdvantage(): RollBuilder {\n throw new Error(\"Cannot set advantage on a pooled roll.\");\n }\n\n override withDisadvantage(): RollBuilder {\n throw new Error(\"Cannot set disadvantage on a pooled roll.\");\n }\n\n override withElvenAccuracy(): RollBuilder {\n throw new Error(\"Cannot set elven accuracy on a pooled roll.\");\n }\n\n override toAST(): ExpressionNode {\n const configsAST = super.toAST();\n\n // Check if configsAST is effectively zero/empty\n const isZero = configsAST.type === \"constant\" && configsAST.value === 0;\n\n if (isZero) {\n return this.baseAST;\n }\n\n const children: { node: ExpressionNode; sign: 1 | -1 }[] = [\n { node: this.baseAST, sign: 1 },\n { node: configsAST, sign: 1 },\n ];\n\n return { type: \"add\", children };\n }\n\n override toExpression(): string {\n const base: ExpressionTerm = { text: this.baseExpression(), sign: 1, range: nodeRange(this.baseAST) };\n return joinTerms([base, ...configTerms(this.subRollConfigs, this.getRootDieConfig())]);\n }\n\n override copy(): PooledRollBuilder {\n return this.create(this.getSubRollConfigs());\n }\n\n /**\n * Scales the dice inside the pool, then pools — the pool is rebuilt from its own pre-pool roll\n * with that roll's dice scaled, so its trial count and flats never multiply. Dice added after\n * pooling (`pool.plus(roll(1, d4))`) scale too; flat modifiers do not.\n */\n override scaleDice(scale: number): PooledRollBuilder {\n const scaleInt = validateScaleInt(scale);\n if (!this.repoolScaled) {\n throw new Error(\n \"This pool has no pre-pool roll to scale its dice inside; build it with keepHighestAll(), keepLowestAll() or times().\"\n );\n }\n const repooled = this.repoolScaled(scaleInt);\n const configs = super.scaleDice(scaleInt).getSubRollConfigs();\n return new PooledRollBuilder(repooled.baseAST, repooled.baseExpression, configs, repooled.repoolScaled);\n }\n\n times(count: number): PooledRollBuilder {\n if (isNaN(count)) throw new Error(\"Invalid NaN value for times\");\n if (Math.floor(count) !== count)\n throw new Error(\"times() requires an integer\");\n if (count < 0) throw new Error(\"times() requires a non-negative integer\");\n\n // Wraps the current state (base + modifiers) into a new pool repeated N times.\n const sumNode: SumNode = {\n type: \"sum\",\n count,\n child: this.toAST(),\n };\n const expression = () =>\n count === 0 ? \"0\" : count === 1 ? this.toExpression() : `${count}(${this.toExpression()})`;\n\n return new PooledRollBuilder(sumNode, expression, [], (scale) => this.scaleDice(scale).times(count));\n }\n}\n\n/**\n * An additive composite of independent rolls that preserves each part's AST — the piece\n * that lets a scaled/halved sub-roll sit beside plain rolls in one damage payload. Its PMF\n * convolves the parts; its expression sums them, each part one term of the sum. Built via\n * {@link sumRolls} and by arithmetic on a transformed roll; it reports hidden state so it is never\n * merged as dice.\n */\nclass CompositeSumRollBuilder extends TransformedRollBuilder {\n protected readonly verb = \"sumRolls()\";\n\n constructor(readonly parts: readonly RollBuilder[]) {\n super(0); // dummy, we override methods\n }\n\n override hasHiddenState(): boolean {\n return true;\n }\n\n override cacheKey(): string | null {\n return null; // composite sum not captured by subRollConfigs\n }\n\n override getSubRollConfigs(): readonly RollConfig[] {\n return [];\n }\n\n override toAST(): ExpressionNode {\n return {\n type: \"add\",\n children: this.parts.map((p) => ({\n node: p.toAST(),\n sign: 1 as const,\n })),\n };\n }\n\n override toExpression(): string {\n return joinTerms(\n this.parts.map((part) => {\n let range: [number, number] | undefined;\n try {\n range = nodeRange(part.toAST());\n } catch {\n // A parsed part has no AST: its range is unknown, so the next part always adds (`~+`).\n }\n return { text: part.toExpression(), sign: 1, range };\n })\n );\n }\n\n override toPMF(eps: number = 0): PMF {\n return pmfFromRollBuilder(this, eps);\n }\n\n // Scaling a composite (mixed damage types, e.g. base + resisted) must scale each PART's own\n // dice while preserving its own half/scale wrapper -- delegating to the base class's\n // `create()`-based scaleDice would lose every part's transform, collapsing straight to plain\n // dice. This is what auto-crit doubling (attack.ts's `hitEffect.copy().doubleDice()`) relies\n // on for a mixed-resistance hit payload.\n override scaleDice(scale: number): RollBuilder {\n validateScaleInt(scale);\n return new CompositeSumRollBuilder(\n this.parts.map((p) => p.scaleDice(scale))\n );\n }\n\n override copy(): CompositeSumRollBuilder {\n return new CompositeSumRollBuilder(this.parts.map((p) => p.copy()));\n }\n}\n\n/** The higher of independent, possibly different rolls: `roll(3, d8).maxOf(roll(2, d10))`. */\nclass MaxOfRollsBuilder extends TransformedRollBuilder {\n protected readonly verb = \"maxOf()\";\n\n constructor(private readonly rolls: readonly RollBuilder[]) {\n super(0); // dummy, we override methods\n }\n\n override hasHiddenState(): boolean {\n return true;\n }\n\n override cacheKey(): string | null {\n return null; // max of rolls not captured by subRollConfigs\n }\n\n override getSubRollConfigs(): readonly RollConfig[] {\n return [];\n }\n\n override toAST(): ExpressionNode {\n return { type: \"max\", children: this.rolls.map((r) => r.toAST()) };\n }\n\n override toExpression(): string {\n return this.rolls.map((r) => `(${r.toExpression()})`).join(\" > \");\n }\n\n override toPMF(eps: number = 0): PMF {\n return pmfFromRollBuilder(this, eps);\n }\n\n /** Scales each roll's dice; the result is still the higher of the scaled rolls. */\n override scaleDice(scale: number): RollBuilder {\n validateScaleInt(scale);\n return new MaxOfRollsBuilder(this.rolls.map((r) => r.scaleDice(scale)));\n }\n\n override copy(): MaxOfRollsBuilder {\n return new MaxOfRollsBuilder(this.rolls.map((r) => r.copy()));\n }\n}\n\n/**\n * Combine several rolls into one additive payload whose PMF is their convolution and whose\n * expression is their sum. Unlike merging plain dice, this preserves parts that carry\n * a transform (e.g. `roll.scaleResult(1, 2)` / `roll.half()`), so per-damage-type resistance\n * and vulnerability survive into both the distribution and the rendered expression.\n * Empty parts collapse to `0`; a single part is returned unwrapped; nested sums are flattened.\n */\nexport function sumRolls(parts: readonly RollBuilder[]): RollBuilder {\n const meaningful = parts\n .filter((p): p is RollBuilder => p !== undefined)\n .flatMap((p) => (p instanceof CompositeSumRollBuilder ? p.parts : [p]));\n if (meaningful.length === 0) return new RollBuilder(0);\n if (meaningful.length === 1) return meaningful[0];\n return new CompositeSumRollBuilder(meaningful);\n}\n","import { PMF } from \"../pmf/pmf\";\nimport { RollBuilder } from \"./roll\";\nimport type { RollFactory } from \"./types\";\n\nconst rollFn = (\n count: number,\n sidesOrDie?: number | RollBuilder,\n modifier?: number\n): RollBuilder => RollBuilder.fromArgs(count, sidesOrDie, modifier);\n\nrollFn.d = (sides: number | string): RollBuilder => {\n if (typeof sides === \"string\") {\n return RollBuilder.fromArgs(sides);\n }\n return new RollBuilder(1).d(sides);\n};\nrollFn.hd20 = (): RollBuilder => new RollBuilder(1).d20().reroll(1);\nrollFn.d4 = (): RollBuilder => new RollBuilder(1).d4();\nrollFn.d6 = (): RollBuilder => new RollBuilder(1).d6();\nrollFn.d8 = (): RollBuilder => new RollBuilder(1).d8();\nrollFn.d10 = (): RollBuilder => new RollBuilder(1).d10();\nrollFn.d12 = (): RollBuilder => new RollBuilder(1).d12();\nrollFn.d20 = (): RollBuilder => new RollBuilder(1).d20();\nrollFn.d100 = (): RollBuilder => new RollBuilder(1).d100();\nrollFn.flat = (n: number): RollBuilder => new RollBuilder(0).plus(n);\n\nexport function d(sides: number | string): RollBuilder {\n if (typeof sides === \"string\") {\n return RollBuilder.fromArgs(sides);\n }\n return new RollBuilder(1).d(sides);\n}\n\nexport const d4 = new RollBuilder(1).d4();\nexport const d6 = new RollBuilder(1).d6();\nexport const d8 = new RollBuilder(1).d8();\nexport const d10 = new RollBuilder(1).d10();\nexport const d12 = new RollBuilder(1).d12();\nexport const d20 = new RollBuilder(1).d20();\nexport const hd20 = new RollBuilder(1).d20().reroll(1);\nexport const d100 = new RollBuilder(1).d100();\nexport const flat = (n: number) => new RollBuilder(0).plus(n);\n\nexport const roll: RollFactory = rollFn as RollFactory;\n\nexport const builderPMFCache = PMF.createCache(1000);\n","import { PMF } from \"../\";\nimport { d20RollPMF } from \"./d20\";\nimport { builderPMFCache } from \"./factory\";\nimport type {\n AddNode,\n ConstantNode,\n D20RollNode,\n DieNode,\n ExpressionNode,\n KeepNode,\n MaxOfNode,\n SumNode,\n} from \"./nodes\";\nimport { naturalRollIndex, type RollBuilder } from \"./roll\";\nimport type { RollConfig, RollType } from \"./types\";\n\n// Default epsilon 0: single-die PMFs resolve without pruning.\nconst defaultEps = 0;\n\nconst singleDiePMFCache = PMF.createCache(1000);\n\n/** Clears the single-die and d20-lift PMF caches (reached through `clearRollCache`). */\nexport function clearDieCaches(): void {\n singleDiePMFCache.clear();\n d20RollLiftCache.clear();\n}\n\nexport function dieNodeFromConfig(cfg: RollConfig): DieNode {\n if (cfg.explode !== undefined && !Number.isFinite(cfg.explode)) {\n throw new Error(\n `An exploding d${cfg.sides} needs a finite cap, got explode(${cfg.explode}): explode(k) allows at most k extra dice per die.`\n );\n }\n return {\n type: \"die\",\n sides: cfg.sides,\n reroll: cfg.reroll > 0 ? cfg.reroll : undefined,\n minimum: cfg.minimum > 0 ? cfg.minimum : undefined,\n explode: cfg.explode > 0 ? cfg.explode : undefined,\n };\n}\n\n/**\n * Thrown for a per-die `keepHighest(T, K)`/`keepLowest(T, K)` on a group of N > 1 dice whose\n * reading is not unique: \"keep K of T rolls of the whole N-dice sum\" and \"keep K of T single dice\"\n * give different numbers, and nothing in the call says which is meant.\n */\nexport class AmbiguousKeepError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"AmbiguousKeepError\";\n Object.setPrototypeOf(this, AmbiguousKeepError.prototype);\n }\n}\n\ntype KeepSpec = NonNullable<RollConfig[\"keep\"]>;\n\n/**\n * How a per-die keep on a group of `count` d`sides` reads:\n *\n * - `\"dice\"`: keep K of T single dice. Used for one die (`d6.keepHighest(3, 2)`), for K >= 2 of\n * the group's own N dice (`roll(4, d6).keepHighest(4, 3)`), and for `bestOf(k)`.\n * - `\"trials\"`: roll the whole N-dice group T times and keep K of those sums. Used for K = 1:\n * `roll(2, d6).keepHighest(2, 1)` is the better of two 2d6, and `keepLowest(T, 1)` with T != N\n * is the worse of T rolls of the group.\n *\n * Every other shape on N > 1 dice (K >= 2 with T != N, and `keepLowest(N, 1)`, whose single-die\n * and whole-group readings differ) throws an {@link AmbiguousKeepError} naming both spellings.\n */\nexport function perDieKeepReading(\n count: number,\n sides: number,\n keep: KeepSpec,\n synthesizedBestOf = false\n): \"dice\" | \"trials\" {\n const n = Math.floor(Math.abs(count));\n if (n <= 1 || synthesizedBestOf) return \"dice\";\n const trials = Math.max(1, Math.floor(keep.total));\n const k = Math.max(0, Math.floor(keep.count));\n if (k === 0) return \"dice\";\n if (k === 1 && (keep.mode === \"highest\" || trials !== n)) return \"trials\";\n if (k >= 2 && trials === n) return \"dice\";\n const verb = keep.mode === \"highest\" ? \"keepHighest\" : \"keepLowest\";\n const which = keep.mode === \"highest\" ? \"highest\" : \"lowest\";\n throw new AmbiguousKeepError(\n `${verb}(${keep.total}, ${keep.count}) on ${n}d${sides} has more than one reading. For the ${which} ` +\n `${k} of ${trials} rolls of the whole ${n}d${sides}, use roll(${n}, d${sides}).${verb}All(${trials}, ${k}); ` +\n `for the ${which} ${k} of ${trials} single d${sides}, use roll(1, d${sides}).${verb}(${trials}, ${k}), ` +\n `adding one such group for each set of dice you mean.`\n );\n}\n\nexport function astFromRollConfigs(\n configs: readonly RollConfig[]\n): ExpressionNode | undefined {\n if (!configs || configs.length === 0) return undefined;\n\n const children: { node: ExpressionNode; sign: 1 | -1 }[] = [];\n let constantSum = 0;\n\n for (const cfg of configs) {\n const sign: 1 | -1 = cfg.isSubtraction || cfg.count < 0 ? -1 : 1;\n const count = Math.floor(Math.abs(cfg.count || 0));\n\n constantSum += cfg.modifier || 0;\n\n // A group of zero dice rolls nothing; only its flat modifier (added above) remains.\n if ((cfg.sides || 0) <= 0 || count === 0) continue;\n\n // `bestOf(k)` (\"roll N, keep the highest k\") is `keep = {total: N, count: k, mode: \"highest\"}`\n // over the same die.\n const isSynthesizedBestOf =\n !cfg.keep && cfg.bestOf > 0 && cfg.bestOf < count;\n const effectiveKeep = isSynthesizedBestOf\n ? { total: count, count: Math.floor(cfg.bestOf), mode: \"highest\" as const }\n : cfg.keep;\n\n const die: DieNode = dieNodeFromConfig(cfg);\n\n let node: ExpressionNode;\n if (cfg.rollType && cfg.rollType !== \"flat\") {\n if (cfg.explodePoolBudget > 0) {\n throw new Error(\n \"explodePool() cannot be combined with advantage/disadvantage/elven-accuracy on the same config — pool-wide explosion is for damage dice pools, not d20 rolls.\"\n );\n }\n // Each die of the group is rolled with the roll type on its own: `roll(2, d6).withAdvantage()`\n // is two advantaged d6, the same as `roll(2, d6.withAdvantage())`.\n let rolled: ExpressionNode;\n if (cfg.sides === 20) {\n rolled = { type: \"d20Roll\", rollType: cfg.rollType, child: die } as D20RollNode;\n } else {\n const n = cfg.rollType === \"elven accuracy\" ? 3 : 2;\n const mode = cfg.rollType === \"disadvantage\" ? \"lowest\" : \"highest\";\n const base: SumNode = { type: \"sum\", count: n, child: die };\n rolled = { type: \"keep\", mode, count: 1, child: base } as KeepNode;\n }\n node = { type: \"sum\", count, child: rolled } as SumNode;\n } else if (effectiveKeep && effectiveKeep.total > 0) {\n if (cfg.explodePoolBudget > 0) {\n throw new Error(\n \"explodePool() cannot be combined with keep()/bestOf() on the same config — the match/keep pool is ambiguous once dice can be added mid-resolution. Use explodePool() on a plain (non-keep) pool.\"\n );\n }\n const reading = perDieKeepReading(count, cfg.sides, effectiveKeep, isSynthesizedBestOf);\n const trials = Math.max(1, Math.floor(effectiveKeep.total));\n const k = Math.max(0, Math.floor(effectiveKeep.count));\n const perTrial: ExpressionNode =\n reading === \"dice\" ? die : ({ type: \"sum\", count, child: die } as SumNode);\n if (trials === 1 && k >= 1) {\n node = perTrial;\n } else if (k === 1 && effectiveKeep.mode === \"highest\") {\n node = { type: \"maxOf\", count: trials, child: perTrial } as MaxOfNode;\n } else {\n const trialPool: SumNode = { type: \"sum\", count: trials, child: perTrial };\n node = { type: \"keep\", mode: effectiveKeep.mode, count: k, child: trialPool } as KeepNode;\n }\n } else {\n node = {\n type: \"sum\",\n count,\n child: die,\n explodePoolBudget: cfg.explodePoolBudget > 0 ? cfg.explodePoolBudget : undefined,\n } as SumNode;\n }\n\n children.push({ node, sign });\n }\n\n if (children.length === 0) {\n return { type: \"constant\", value: constantSum } as ConstantNode;\n }\n\n const add: AddNode = { type: \"add\", children };\n if (constantSum !== 0)\n add.children.push({\n node: { type: \"constant\", value: constantSum },\n sign: 1,\n });\n return add;\n}\n\nexport function resolve(node: ExpressionNode, eps: number = defaultEps): PMF {\n const signature = getASTSignature(node);\n const cacheKey = `${signature}_${eps}`;\n\n const cached = builderPMFCache.get(cacheKey);\n if (cached) return cached;\n\n const result = ((): PMF => {\n switch (node.type) {\n case \"constant\":\n return PMF.delta(node.value, eps);\n\n case \"die\": {\n return resolveSingleDie(node, eps);\n }\n\n case \"sum\": {\n const base = resolve(node.child, eps);\n const n = Math.max(0, Math.floor(node.count));\n if (n === 0) return PMF.delta(0, eps);\n if (node.explodePoolBudget && Number.isFinite(node.explodePoolBudget) && node.explodePoolBudget > 0) {\n const die = findDie(node.child);\n if (!die) {\n throw new Error(\"explodePool() requires the pool's child to be a plain die.\");\n }\n return resolveExplodingPool(base, die.sides, n, Math.floor(node.explodePoolBudget), eps);\n }\n if (n === 1) return base;\n return base.power(n, eps);\n }\n\n case \"add\": {\n let shift = 0;\n const parts: PMF[] = [];\n for (const c of node.children) {\n if (c.node.type === \"constant\") {\n shift += c.sign * c.node.value;\n } else {\n const p = resolve(c.node, eps);\n parts.push(c.sign === 1 ? p : p.mapDamage((v) => -v));\n }\n }\n if (parts.length === 0) return PMF.delta(shift, eps);\n let res = parts.length === 1 ? parts[0] : PMF.convolveMany(parts, eps);\n if (shift !== 0) res = res.mapDamage((v) => v + shift);\n return res;\n }\n\n case \"keep\": {\n const totalTrials = getTotalCount(node);\n const keepCount = Math.max(0, Math.min(node.count, totalTrials));\n if (keepCount === 0 || totalTrials === 0) return PMF.delta(0, eps);\n\n // Resolve the per-trial PMF (the child of the Sum inside Keep)\n const perTrialNode = node.child.child; // Sum(child: perTrial)\n const perTrialPMF = resolve(perTrialNode, eps);\n\n return keepSumPMF(\n perTrialPMF,\n totalTrials,\n keepCount,\n node.mode === \"highest\",\n eps\n );\n }\n\n case \"d20Roll\": {\n const childDie = findDie(node.child);\n if (!childDie) return d20RollPMF(node.rollType, false);\n return resolveD20Roll(childDie, node.rollType);\n }\n\n case \"half\": {\n const childPMF = resolve(node.child, eps);\n return childPMF.scaleDamage(0.5, \"floor\");\n }\n\n case \"maxOf\": {\n const childPMF = resolve(node.child, eps);\n const count = Math.max(1, Math.floor(node.count));\n if (count === 1) return childPMF;\n\n // Compute the maximum of count independent rolls of childPMF\n return computeMaxOfPMF(childPMF, count, eps);\n }\n\n case \"max\":\n return maxOfIndependent(node.children.map((child) => resolve(child, eps)), eps);\n\n case \"scale\": {\n const childPMF = resolve(node.child, eps);\n const denom = node.denominator === 0 ? 1 : node.denominator;\n return childPMF.scaleDamage(node.numerator, node.rounding, denom);\n }\n }\n })();\n\n builderPMFCache.set(cacheKey, result);\n return result;\n}\n\nexport function pmfFromRollBuilder(\n rb: RollBuilder,\n eps: number = defaultEps\n): PMF {\n const ast = rb.toAST();\n return resolve(ast, eps);\n}\n\nconst d20RollLiftCache = PMF.createCache(500);\n\n/**\n * Resolve a d20-shaped die (honoring reroll/minimum/explode via {@link resolveSingleDie}) then\n * lift it into advantage/disadvantage/elven accuracy. Each of the 2 or 3 rolls compared is an\n * independent draw from that SAME resolved marginal — so a Halfling Lucky reroll or a\n * Trance-of-Order floor applies per-die, matching RAW (you reroll/floor each d20 you roll, not\n * just a single \"representative\" one). This generalizes {@link d20RollPMF}, which only ever\n * modeled the plain-uniform-plus-reroll-1 case; callers that resolve a die with no minimum/\n * explode/deeper reroll get bit-identical results to `d20RollPMF` (verified: the reroll-only\n * formula below reduces to the same closed form).\n *\n * Deliberately ignores any caller-facing output-precision `eps` (matching `d20RollPMF`'s own\n * contract): this builds the FOUNDATIONAL check-die distribution, where every face carries real\n * probability mass (e.g. 1/20 per face on a flat d20) — pruning it against an output-rounding\n * epsilon (some callers request eps as coarse as 0.1 purely to round the FINAL hit/miss/crit\n * mixture) would silently delete real faces instead of real noise. Always resolves at the\n * library's near-zero {@link defaultEps} internally; only the mixture built on top of this\n * result should be pruned against the caller's requested eps.\n */\nexport function resolveD20Roll(die: DieNode, rollType: RollType | undefined): PMF {\n const base = resolveSingleDie(die, defaultEps);\n const type = rollType || \"flat\";\n if (type === \"flat\") return base;\n\n const cacheKey = `${getASTSignature(die)}|${type}`;\n const cached = d20RollLiftCache.get(cacheKey);\n if (cached) return cached;\n\n const support = [...base.support()].sort((a, b) => a - b);\n const out = new Map<number, number>();\n let cum = 0;\n let prevLifted = 0;\n for (const k of support) {\n cum += base.pAt(k);\n // advantage: best of 2 (F^2); elven accuracy: best of 3 (F^3); disadvantage: worst of 2\n // (1-(1-F)^2). `type` can't be \"flat\" here — that returns above before the cache lookup.\n const curLifted =\n type === \"advantage\"\n ? cum * cum\n : type === \"elven accuracy\"\n ? cum * cum * cum\n : 1 - (1 - cum) * (1 - cum);\n const pk = curLifted - prevLifted;\n if (pk > 0) out.set(k, pk);\n prevLifted = curLifted;\n }\n const result = PMF.fromMap(out, defaultEps);\n d20RollLiftCache.set(cacheKey, result);\n return result;\n}\n\n/**\n * Resolve a check builder's natural roll (its d20, or with no d20 its largest die: see\n * {@link naturalRollIndex}), honoring that die's reroll/minimum/explode, then lift by its\n * `rollType`. The single entry point every attack/save check builder ({@link ACBuilder},\n * {@link AttackBuilder}, {@link AlwaysHitBuilder}, {@link AlwaysCritBuilder}, `DCBuilder`, save\n * `resolveProbabilities`) uses for the natural roll; the other dice are bonus dice.\n *\n * A check with no die has no natural roll: this returns a certain 0, so its total is its flat\n * modifier plus any bonus dice and no natural-1/natural-20 rule can apply. A natural roll of more\n * than one die (`roll(2, d20)`, or two equal top dice like `d20.plus(d20)`) has no single natural\n * 1 or 20 and throws.\n */\nexport function resolveRootD20(check: RollBuilder): PMF {\n const configs = check.getSubRollConfigs();\n const rootIdx = naturalRollIndex(configs);\n if (rootIdx === -1) return PMF.delta(0);\n const rootConfig = check.getRootDieConfig() ?? configs[rootIdx];\n const sides = configs[rootIdx].sides;\n const tied = configs.some(\n (c, i) => i !== rootIdx && c.sides === sides && c.count > 0 && !c.isSubtraction\n );\n if (rootConfig.count !== 1 || tied) {\n throw new Error(\n `This check's natural roll is not one die: a check needs exactly one d${sides} for its natural 1 and 20. ` +\n \"Roll it once and add any other dice as bonus dice.\"\n );\n }\n return resolveD20Roll(dieNodeFromConfig(rootConfig), check.rollType);\n}\n\nexport function resolveSingleDie(die: DieNode, eps: number = defaultEps): PMF {\n const signature = getASTSignature(die);\n const cacheKey = `${signature}_${eps}`;\n\n const cached = singleDiePMFCache.get(cacheKey);\n if (cached) return cached;\n\n const s = Math.max(0, Math.floor(die.sides));\n if (s <= 0) return PMF.delta(0, eps);\n\n let probs = new Map<number, number>();\n for (let v = 1; v <= s; v++) probs.set(v, 1 / s);\n\n // One-pass reroll: faces 1..k reroll once, and the reroll is kept (see `RollConfig.reroll`).\n const r = Math.max(0, Math.floor(die.reroll || 0));\n if (r > 0) {\n const k = Math.min(r, s);\n const rerollMass = k / s; // total probability rerolled once\n const uniformReroll = rerollMass / s; // mass added to each face from reroll\n const next = new Map<number, number>();\n for (let v = 1; v <= s; v++) {\n const keep = v <= k ? 0 : 1 / s;\n next.set(v, keep + uniformReroll);\n }\n probs = next;\n }\n\n let pmf = PMF.fromMap(new Map(probs), eps);\n\n // Minimum per die\n const minV = Math.max(0, Math.floor(die.minimum || 0));\n if (minV > 0) pmf = pmf.mapDamage((v) => Math.max(v, minV));\n\n // Exploding dice (finite, capped at `times` additional dice) on max face only.\n const times = Math.floor(die.explode || 0);\n if (times > 0) {\n const maxFace = s;\n\n // Split pmf into a max-face slice and a non-max slice. `PMF.fromMap` always normalizes to\n // mass 1 (divides by its own sum), so `nonMaxPMF` is already the correct conditional \"given\n // the roll wasn't max, what was it\" distribution — exactly the shape `PMF.branch` requires\n // for its failure argument. It must NOT be rescaled again afterward: `PMF.branch` weights\n // each branch's bins by (p, 1-p) directly, so a `nonMaxPMF` still holding raw mass (1-pMax)\n // would contribute (1-pMax)^2 instead of (1-pMax) to the result — `d6.explode(1)` would total\n // 0.861 mass instead of 1.\n const nonMax = new Map<number, number>();\n const pMax = pmf.pAt(maxFace);\n for (const v of pmf.support()) {\n if (v !== maxFace) nonMax.set(v, pmf.pAt(v));\n }\n\n if (nonMax.size === 0) {\n // Every face is the max face (a one-sided die, or `minimum` at `sides`): the die and each\n // of its `times` extra dice all show the max face.\n pmf = PMF.delta((times + 1) * maxFace, eps);\n } else {\n const nonMaxPMF = PMF.fromMap(nonMax, eps);\n\n // Capped geometric chain, built bottom-up. `chain` holds the distribution of \"one more die\n // roll, with `remaining` further explosions still allowed if THAT roll is also max\" for\n // `remaining` running from 0 (a final roll that can't chain further, however it lands) up to\n // `times - 1`. Each step wraps the previous chain in one more branch: on a max roll (prob\n // pMax) add another maxFace and recurse into the shorter chain; otherwise stop at a non-max\n // value. This reduces to exactly `explode(1)`'s \"maxFace + one more untouched die\" for\n // `times === 1`, and never lets more than `times` extra dice enter the total.\n let chain = pmf; // remaining = 0: an unconstrained extra die, chains no further either way\n for (let remaining = 1; remaining <= times - 1; remaining++) {\n chain = PMF.branch(chain.mapDamage((v) => v + maxFace), nonMaxPMF, pMax);\n }\n pmf = PMF.branch(chain.mapDamage((v) => v + maxFace), nonMaxPMF, pMax);\n }\n }\n\n singleDiePMFCache.set(cacheKey, pmf);\n return pmf;\n}\n\n/**\n * Resolve a pool of `count` i.i.d. dice sharing ONE pool-wide exploding-dice budget: at most\n * `budget` extra dice may be added in total across the whole pool, as opposed to per-die\n * `explode()` (each of the `count` dice individually allowed its own extra dice). `diePMF` is\n * the already-resolved single-die marginal (post reroll/minimum, no per-die explode — the two\n * mechanisms are mutually exclusive by construction).\n *\n * DP over `(pending dice, budget remaining)`, resolving one arbitrary pending die per step:\n * f(p, b) = (non-max faces) ⊗ f(p-1, b) -- this die didn't explode\n * + (max face) ⊗ (b > 0 ? f(p, b-1) : f(p-1, b)) -- did explode; spends 1 budget,\n * pending count stays p because\n * the extra die takes its place\n * f(0, b) = δ₀ ; f(p, 0) = diePMF.power(p)\n * Acyclic: every recursive call strictly decreases `p + b`, so memoizing on that pair terminates.\n */\nfunction resolveExplodingPool(\n diePMF: PMF,\n maxFace: number,\n count: number,\n budget: number,\n eps: number\n): PMF {\n const pMax = diePMF.pAt(maxFace);\n const nonMax = new Map<number, number>();\n for (const v of diePMF.support()) {\n if (v !== maxFace) nonMax.set(v, diePMF.pAt(v));\n }\n // Every face is the max face (a 1-sided die, or `minimum` at/above `sides`): no roll can be\n // non-max, so every one of the `count` dice AND every one of the `budget` explosions it\n // triggers shows max — the pool is deterministically `count + budget` max faces. Must be\n // checked before `PMF.fromMap(nonMax, ...)`, which throws on an empty map.\n if (nonMax.size === 0) {\n return PMF.delta((count + budget) * maxFace, eps);\n }\n const nonMaxPMF = PMF.fromMap(nonMax, eps);\n\n const memo = new Map<string, PMF>();\n const f = (p: number, b: number): PMF => {\n if (p === 0) return PMF.delta(0, eps);\n if (b === 0) return diePMF.power(p, eps);\n\n const key = `${p},${b}`;\n const cached = memo.get(key);\n if (cached) return cached;\n\n const maxBranch = f(p, b - 1).mapDamage((v) => v + maxFace);\n const nonMaxBranch = nonMaxPMF.convolve(f(p - 1, b), eps);\n const result = PMF.branch(maxBranch, nonMaxBranch, pMax);\n\n memo.set(key, result);\n return result;\n };\n\n return f(count, budget);\n}\n\n// Getters\n\nfunction findDie(node: ExpressionNode): DieNode | undefined {\n switch (node.type) {\n case \"die\":\n return node;\n case \"constant\":\n return undefined;\n case \"sum\":\n case \"d20Roll\":\n case \"half\":\n case \"maxOf\":\n case \"scale\":\n return findDie(node.child);\n case \"keep\":\n return findDie(node.child.child);\n case \"add\":\n for (const c of node.children) {\n const d = findDie(c.node);\n if (d) return d;\n }\n return undefined;\n case \"max\":\n for (const child of node.children) {\n const d = findDie(child);\n if (d) return d;\n }\n return undefined;\n }\n}\n\n/** The highest of independent rolls: P(max <= v) is the product of each part's P(<= v). */\nfunction maxOfIndependent(parts: readonly PMF[], eps: number): PMF {\n const support = [...new Set(parts.flatMap((part) => part.support()))].sort((a, b) => a - b);\n const cumulative = parts.map(() => 0);\n const out = new Map<number, number>();\n let previous = 0;\n for (const value of support) {\n let all = 1;\n for (let i = 0; i < parts.length; i++) {\n cumulative[i] += parts[i].pAt(value);\n all *= cumulative[i];\n }\n if (all > previous) out.set(value, all - previous);\n previous = all;\n }\n return PMF.fromMap(out, eps);\n}\n\nfunction getTotalCount(node: KeepNode): number {\n // The total dice count is encoded in the nearest SumNode under child\n let cur = node.child;\n while (cur.type === \"keep\") cur = cur.child;\n return cur.type === \"sum\" ? Math.max(0, Math.floor(cur.count)) : 0;\n}\n\nfunction computeMaxOfPMF(\n pmf: PMF,\n count: number,\n eps: number = defaultEps\n): PMF {\n // Compute the maximum of 'count' independent rolls of the given PMF\n if (count <= 1) return pmf;\n\n const support = pmf.support();\n const out = new Map<number, number>();\n\n // For small counts, enumerate all outcomes exactly.\n if (count <= 6 && support.length <= 20) {\n function dfs(\n rollsLeft: number,\n currentMax: number,\n probability: number\n ): void {\n if (rollsLeft === 0) {\n out.set(currentMax, (out.get(currentMax) || 0) + probability);\n return;\n }\n\n for (const value of support) {\n const p = pmf.pAt(value);\n if (p > 0) {\n const newMax = Math.max(currentMax, value);\n dfs(rollsLeft - 1, newMax, probability * p);\n }\n }\n }\n\n dfs(count, -Infinity, 1);\n } else {\n // For larger cases, use the CDF method. Walk the sorted support once while\n // accumulating a running CDF, so each P(max = v) costs O(1) instead of a\n // full-map cdfAt() scan (previously O(N) per value → O(N²) overall).\n // Between two consecutive support points there is no probability mass, so\n // the running CDF up to (but not including) v equals cdfAt(v - 1).\n const sortedSupport = [...support].sort((a, b) => a - b);\n let runningCdf = 0;\n for (const value of sortedSupport) {\n const prevCdf = runningCdf;\n runningCdf += pmf.pAt(value);\n\n // P(max = value) = P(all rolls <= value) - P(all rolls <= value-1)\n const probMax = Math.pow(runningCdf, count) - Math.pow(prevCdf, count);\n if (probMax > eps) {\n out.set(value, probMax);\n }\n }\n }\n\n return PMF.fromMap(out, eps);\n}\n\nfunction keepSumPMF(\n single: PMF,\n total: number,\n keep: number,\n highest: boolean,\n eps: number = defaultEps\n): PMF {\n // Trivial/fast paths\n if (keep >= total) return single.power(total, eps);\n if (keep <= 0) return PMF.delta(0, eps);\n\n // Keyed on every probability at full precision: two per-trial distributions that agree to a\n // few digits must not share an entry.\n const sortedSupport = [...single.support()].sort((a, b) => a - b);\n const pmfSig = sortedSupport.map((val) => `${val}:${single.pAt(val)}`).join(\",\");\n const cacheKey = `keep|${pmfSig}|t:${total}|k:${keep}|h:${\n highest ? 1 : 0\n }|e:${eps}`;\n\n const cached = builderPMFCache.get(cacheKey);\n if (cached) return cached;\n\n // kh1/kl1 fast paths using max-of machinery\n if (keep === 1) {\n if (highest) {\n return computeMaxOfPMF(single, total, eps);\n } else {\n // min of n i.i.d. == -max of n of negated variable\n const neg = single.mapDamage((v) => -v);\n const minPMF = computeMaxOfPMF(neg, total, eps).mapDamage((v) => -v);\n builderPMFCache.set(cacheKey, minPMF);\n return minPMF;\n }\n }\n\n // DP over descending values; state = (used, remainingTrials) → map(sum -> prob)\n // Transition by drawing X occurrences at current value v from remainingTrials r: X ~ Binom(r, p)\n // Select t = min(X, keep - used) into the sum (highest picks first), then continue with r - X.\n\n type SumMap = Map<number, number>;\n let state: Map<number, SumMap> = new Map();\n // Pack the (used, remainingTrials) state into a single integer key instead of\n // a \"used|r\" string. r ∈ [0, total], so a stride of (total + 1) is collision\n // free, and decoding is plain integer math — no split()/parseInt() per\n // transition in the hot loop. Behavior is identical (same states, same order).\n const stride = total + 1;\n const keyOf = (used: number, r: number) => used * stride + r;\n\n state.set(keyOf(0, total), new Map([[0, 1]]));\n\n const valuesDesc = highest\n ? [...sortedSupport].sort((a, b) => b - a)\n : [...sortedSupport].sort((a, b) => a - b);\n\n const binomPMF = (r: number, p: number): number[] => {\n if (r <= 0) return [1];\n if (p <= eps) {\n const arr = new Array(r + 1).fill(0);\n arr[0] = 1;\n return arr;\n }\n if (1 - p <= eps) {\n const arr = new Array(r + 1).fill(0);\n arr[r] = 1;\n return arr;\n }\n const q = 1 - p;\n const arr = new Array(r + 1).fill(0);\n\n // stable recurrence from k=0\n arr[0] = Math.pow(q, r);\n const ratio = p / q;\n for (let x = 1; x <= r; x++)\n arr[x] = ((arr[x - 1] * (r - x + 1)) / x) * ratio;\n\n // Normalize minor drift\n let s = 0;\n for (let x = 0; x <= r; x++) s += arr[x];\n if (Math.abs(1 - s) > 1e-12) for (let x = 0; x <= r; x++) arr[x] /= s;\n\n return arr;\n };\n\n const pruneMap = (m: SumMap, threshold: number): SumMap => {\n if (threshold <= 0) return m;\n const out = new Map<number, number>();\n for (const [sum, pr] of m) if (pr >= threshold) out.set(sum, pr);\n return out.size === m.size ? m : out;\n };\n\n const pruneState = (st: Map<number, SumMap>, threshold: number) => {\n if (threshold <= 0) return st;\n const out = new Map<number, SumMap>();\n for (const [k, m] of st) {\n const mm = pruneMap(m, threshold);\n if (mm.size > 0) out.set(k, mm);\n }\n return out;\n };\n\n let processedMass = 0;\n for (const v of valuesDesc) {\n const p = single.pAt(v);\n if (p <= 0) continue;\n const q = Math.max(eps, 1 - processedMass);\n const pCond = Math.min(1, p / q);\n const next: Map<number, SumMap> = new Map();\n\n for (const [k, m] of state) {\n const used = Math.floor(k / stride);\n const r = k - used * stride;\n if (r === 0) {\n // No trials left; carry state forward unchanged\n const destKey = keyOf(used, 0);\n const dest = next.get(destKey) ?? new Map<number, number>();\n for (const [sum, pr] of m) dest.set(sum, (dest.get(sum) || 0) + pr);\n next.set(destKey, dest);\n continue;\n }\n\n const bin = binomPMF(r, pCond);\n const remainingCapacity = keep - used;\n\n for (let x = 0; x <= r; x++) {\n const px = bin[x];\n if (px <= eps) continue;\n const t = Math.min(x, remainingCapacity);\n const used2 = used + t;\n const r2 = r - x;\n const add = t * v;\n\n const destKey = keyOf(used2, r2);\n const dest = next.get(destKey) ?? new Map<number, number>();\n for (const [sum, pr] of m) {\n const s2 = sum + add;\n const prob = pr * px;\n const cur = dest.get(s2) || 0;\n const nv = cur + prob;\n if (nv >= eps) dest.set(s2, nv);\n }\n if (dest.size > 0) next.set(destKey, dest);\n }\n }\n\n // Light pruning proportional to eps\n state = pruneState(next, eps * 1e-6);\n processedMass += p;\n }\n\n // Collect results where all trials assigned and exactly keep were used\n const finalKey = keyOf(keep, 0);\n const dist = state.get(finalKey) ?? new Map<number, number>();\n\n if (dist.size === 0) {\n // Fallback safety: return empty mass (should not happen)\n return PMF.emptyMass();\n }\n\n const result = PMF.fromMap(dist, eps);\n builderPMFCache.set(cacheKey, result);\n return result;\n}\n\nexport function getASTSignature(node: ExpressionNode): string {\n switch (node.type) {\n case \"constant\":\n return `c:${node.value}`;\n case \"die\": {\n // Use a fixed order for properties to ensure a stable signature.\n const parts: string[] = [];\n parts.push(`s:${node.sides}`);\n if (node.reroll) parts.push(`r:${node.reroll}`);\n if (node.minimum) parts.push(`m:${node.minimum}`);\n if (node.explode) parts.push(`e:${node.explode}`);\n return `d{${parts.join(\",\")}}`;\n }\n case \"sum\":\n return `sum{c:${node.count},b:${node.explodePoolBudget || 0},ch:${getASTSignature(node.child)}}`;\n case \"d20Roll\":\n return `d20{t:${node.rollType},ch:${getASTSignature(node.child)}}`;\n case \"keep\":\n return `keep{c:${node.count},m:${node.mode},ch:${getASTSignature(\n node.child\n )}}`;\n case \"half\":\n return `half{ch:${getASTSignature(node.child)}}`;\n case \"maxOf\":\n return `maxOf{c:${node.count},ch:${getASTSignature(node.child)}}`;\n case \"scale\":\n return `scale{n:${node.numerator},d:${node.denominator},r:${\n node.rounding\n },ch:${getASTSignature(node.child)}}`;\n case \"max\":\n return `max[${node.children.map(getASTSignature).join(\",\")}]`;\n case \"add\": {\n let constantValue = 0;\n const otherChildrenSigs: string[] = [];\n for (const c of node.children) {\n if (c.node.type === \"constant\") {\n constantValue += c.sign * c.node.value;\n } else {\n otherChildrenSigs.push(\n `${c.sign === -1 ? \"-\" : \"+\"}${getASTSignature(c.node)}`\n );\n }\n }\n\n if (constantValue !== 0) {\n otherChildrenSigs.push(\n constantValue > 0 ? `+c:${constantValue}` : `-c:${-constantValue}`\n );\n }\n\n // Sort to handle commutative nature of addition.\n otherChildrenSigs.sort();\n\n return `add[${otherChildrenSigs.join(\"\")}]`;\n }\n }\n}\n","import type { DiceMatchInfo, OutcomeType } from \"../common/types\";\nimport { EPS } from \"../common/types\";\nimport { diceSumDistribution, faceWeights, jointSumAndMatch } from \"../common/bounce\";\nimport { Mixture } from \"../pmf/mixture\";\nimport { PMF } from \"../pmf/pmf\";\nimport type { DiceQuery } from \"../pmf/query\";\nimport { AmbiguousCritDoublingError } from \"../parser/scaleDice\";\nimport type { ACBuilder } from \"./ac\";\nimport { pmfFromRollBuilder, resolveRootD20 } from \"./ast\";\nimport { splitAtThreshold } from \"./prob\";\nimport { checkExpression, rootDieExpression } from \"./expression\";\nimport { requireFinite } from \"./arguments\";\nimport {\n AlwaysCritBuilder,\n AlwaysHitBuilder,\n naturalRollIndex,\n ParsedRollBuilder,\n RollBuilder,\n} from \"./roll\";\nimport type { AttackResolution, Check, CheckBuilder, RollConfig, RollType } from \"./types\";\n\ntype ActionEffect = RollBuilder;\n\n/**\n * Resolved-attack PMF cache. `resolve()`/`toPMF()` re-runs the damage convolution + hit/crit/miss mixture\n * every call; a DPR sweep resolves the SAME attack thousands of times (dprcalc measured ~99.9% repeats).\n * Keyed by {@link AttackBuilder.cacheKey} — a cheap serialization of the check + effect {@link RollConfig}s\n * (NOT the AST-walking `toExpression`), which fully determines the PMF. `null` key ⇒ an effect opted out\n * (parsed/pooled/half/scale/max/composite) ⇒ resolve uncached. Cached PMFs are immutable (every PMF op\n * returns a new instance), so sharing is safe.\n */\nconst attackPMFCache = PMF.createCache(4000);\n\n/** Clears the resolved-attack PMF cache (test/bench seam; mirrors {@link clearParserCache}). */\nexport function clearAttackCache(): void {\n attackPMFCache.clear();\n}\n\nexport class AttackBuilder implements CheckBuilder {\n constructor(\n readonly check: ACBuilder | AlwaysHitBuilder | AlwaysCritBuilder,\n private readonly hitEffect?: ActionEffect,\n private readonly critEffect?: ActionEffect | null,\n private readonly missEffect?: ActionEffect,\n // Extra damage channels convolved into hit AND crit — their dice double on a crit like any\n // attack damage — but excluded from base-payload transforms (rerollDamage/minimumDamageDie\n // here; the turn-level reroll substitution). Several `plusSeparateDamage()` calls accumulate.\n private readonly separateDamage: readonly RollBuilder[] = [],\n // The raw (uncapped) argument rerollDamage() was last called with, tracked separately from\n // the transformed dice so a second call with a DIFFERENT value is refused while a repeat of\n // the SAME value stays a no-op.\n private readonly rerollThreshold?: number,\n private readonly minimumDieValue?: number,\n private readonly halfOnMissFlag: boolean = false\n ) {}\n\n onCrit(val: number): AttackBuilder;\n onCrit(val: string): AttackBuilder;\n onCrit(val: RollBuilder): AttackBuilder;\n onCrit(count: number, die: RollBuilder): AttackBuilder;\n onCrit(count: number, sides: number): AttackBuilder;\n onCrit(count: number, die: RollBuilder, modifier: number): AttackBuilder;\n onCrit(count: number, sides: number, modifier: number): AttackBuilder;\n onCrit(...args: any[]): AttackBuilder {\n // The explicit crit is base payload: carry any rerollDamage/minimumDamageDie already set, so\n // the result does not depend on whether onCrit() came before or after them.\n const damageRoll = this.withStoredBaseTransforms(RollBuilder.fromArgs(...args));\n return new AttackBuilder(\n this.check,\n this.hitEffect,\n damageRoll,\n this.missEffect,\n this.separateDamage,\n this.rerollThreshold,\n this.minimumDieValue,\n this.halfOnMissFlag\n );\n }\n\n onMiss(val: number): AttackBuilder;\n onMiss(val: string): AttackBuilder;\n onMiss(val: RollBuilder): AttackBuilder;\n onMiss(count: number, die: RollBuilder): AttackBuilder;\n onMiss(count: number, sides: number): AttackBuilder;\n onMiss(count: number, die: RollBuilder, modifier: number): AttackBuilder;\n onMiss(count: number, sides: number, modifier: number): AttackBuilder;\n onMiss(...args: any[]): AttackBuilder {\n if (this.halfOnMissFlag) {\n throw new Error(\n \"onMiss() cannot be combined with halfOnMiss(): the miss branch can only be one or the other.\"\n );\n }\n const damageRoll = RollBuilder.fromArgs(...args);\n return new AttackBuilder(\n this.check,\n this.hitEffect,\n this.critEffect,\n damageRoll,\n this.separateDamage,\n this.rerollThreshold,\n this.minimumDieValue,\n this.halfOnMissFlag\n );\n }\n\n noCrit(): AttackBuilder {\n return new AttackBuilder(\n this.check,\n this.hitEffect,\n null,\n this.missEffect,\n this.separateDamage,\n this.rerollThreshold,\n this.minimumDieValue,\n this.halfOnMissFlag\n );\n }\n\n /**\n * Adds a second damage channel, convolved into the hit AND crit payloads (its dice double on\n * a crit like any attack damage) but excluded from base-payload transforms — base-payload\n * rerolls and once-per-turn reroll substitutions never touch it. Chainable; several calls\n * accumulate into one convolved channel.\n */\n plusSeparateDamage(damage: RollBuilder): AttackBuilder {\n return new AttackBuilder(\n this.check,\n this.hitEffect,\n this.critEffect,\n this.missEffect,\n [...this.separateDamage, damage],\n this.rerollThreshold,\n this.minimumDieValue,\n this.halfOnMissFlag\n );\n }\n\n /**\n * Lets every die group of the BASE payload (hit, and the crit branch when it is explicit)\n * reroll low faces once, leaving `plusSeparateDamage` channels untouched — so a weapon reads in\n * whichever order the caller likes. The threshold is a permission cap, not an obligation: a\n * group rerolls faces `1..min(threshold, cap)`, where `cap` is the largest face whose kept value\n * `max(face, floor)` is below the expected value of a fresh floored face (`floor` from the\n * group's own `minimum` and {@link minimumDamageDie}; with no floor, `floor(sides / 2)`). For a\n * die that does not explode that is optimal play, and the result is monotone in `threshold`.\n * A group's own `reroll` is kept when it is higher. `RollBuilder.reroll()` keeps its own\n * obligation semantics; this is the attack-level verb.\n */\n rerollDamage(threshold: number): AttackBuilder {\n if (isNaN(threshold)) throw new Error(\"Invalid NaN value for rerollDamage threshold\");\n requireFinite(threshold, \"rerollDamage() threshold\");\n if (this.rerollThreshold !== undefined) {\n if (threshold === this.rerollThreshold) return this;\n throw new Error(\n `Conflicting rerollDamage() threshold: already set to ${this.rerollThreshold}, cannot change to ${threshold}. Repeating the same value is a no-op.`\n );\n }\n const transform = AttackBuilder.baseTransform(threshold, this.minimumDieValue);\n return new AttackBuilder(\n this.check,\n this.hitEffect\n ? AttackBuilder.mapEveryDieGroup(this.hitEffect, \"rerollDamage\", transform)\n : this.hitEffect,\n this.critEffect\n ? AttackBuilder.mapEveryDieGroup(this.critEffect, \"rerollDamage\", transform)\n : this.critEffect,\n this.missEffect,\n this.separateDamage,\n threshold,\n this.minimumDieValue,\n this.halfOnMissFlag\n );\n }\n\n /**\n * Raises every die of the BASE payload (hit, and the crit branch when it is explicit) to at\n * least `minimum`, leaving `plusSeparateDamage` channels untouched. A group's own higher\n * `minimum` is kept. Order-independent with respect to `plusSeparateDamage` and\n * `rerollDamage` (whose cap accounts for the floor).\n */\n minimumDamageDie(minimum: number): AttackBuilder {\n if (isNaN(minimum)) throw new Error(\"Invalid NaN value for minimumDamageDie\");\n requireFinite(minimum, \"minimumDamageDie()\");\n if (this.minimumDieValue !== undefined) {\n if (minimum === this.minimumDieValue) return this;\n throw new Error(\n `Conflicting minimumDamageDie() value: already set to ${this.minimumDieValue}, cannot change to ${minimum}. Repeating the same value is a no-op.`\n );\n }\n const transform = AttackBuilder.baseTransform(this.rerollThreshold, minimum);\n return new AttackBuilder(\n this.check,\n this.hitEffect\n ? AttackBuilder.mapEveryDieGroup(this.hitEffect, \"minimumDamageDie\", transform)\n : this.hitEffect,\n this.critEffect\n ? AttackBuilder.mapEveryDieGroup(this.critEffect, \"minimumDamageDie\", transform)\n : this.critEffect,\n this.missEffect,\n this.separateDamage,\n this.rerollThreshold,\n minimum,\n this.halfOnMissFlag\n );\n }\n\n /**\n * The miss payload becomes `floor(resolved hit payload / 2)` — base plus every\n * `plusSeparateDamage` channel, never the crit payload. Labelled `missDamage`: it is not a\n * landing, so no `first-hit`/`every-hit`/condition trigger reads it, and no reroll\n * substitution touches it. Mutually exclusive with `onMiss()`.\n */\n halfOnMiss(): AttackBuilder {\n if (this.missEffect) {\n throw new Error(\n \"halfOnMiss() cannot be combined with onMiss(): the miss branch can only be one or the other.\"\n );\n }\n if (this.halfOnMissFlag) return this;\n return new AttackBuilder(\n this.check,\n this.hitEffect,\n this.critEffect,\n this.missEffect,\n this.separateDamage,\n this.rerollThreshold,\n this.minimumDieValue,\n true\n );\n }\n\n /**\n * The one way to re-derive hit/crit/miss probabilities for an existing attack: `vsAC` and the\n * turn-level condition variants are both callers. Throws if this attack's check has no AC (an\n * `AlwaysHitBuilder`, or a crit-from-always-hit override) — there is nothing to rebind.\n */\n withCheck(fn: (check: Check) => Check): AttackBuilder {\n const next = fn(this.toCheck());\n return new AttackBuilder(\n AttackBuilder.buildCheck(next),\n this.hitEffect,\n this.critEffect,\n this.missEffect,\n this.separateDamage,\n this.rerollThreshold,\n this.minimumDieValue,\n this.halfOnMissFlag\n );\n }\n\n private toCheck(): Check {\n const check = this.check;\n if (check instanceof AlwaysHitBuilder) {\n throw new Error(\n \"withCheck() requires an AC-bearing check; this attack always hits with no AC to rebind.\"\n );\n }\n const ac = check.attackConfig.ac;\n if (ac === undefined) {\n throw new Error(\n \"withCheck() requires an AC-bearing check; this attack's crit-on-hit override carries no AC.\"\n );\n }\n // Duck-typed rather than `instanceof ACBuilder`: importing the `ACBuilder` VALUE here would\n // reintroduce the ac.ts <-> attack.ts <-> roll.ts load cycle at a point where `RollBuilder`\n // is not yet defined (`ACBuilder extends RollBuilder` would throw). `advantageDice` is the\n // one field only `AttackConfig` (ACBuilder's own attackConfig shape) declares.\n const attackConfig = check.attackConfig;\n const rootConfig = check.getRootDieConfig();\n const rawRollType: RollType = rootConfig?.rollType ?? \"flat\";\n const fromElvenAccuracy = rawRollType === \"elven accuracy\";\n return {\n roll: new RollBuilder(check.getSubRollConfigs()),\n ac,\n critThreshold: check.critThreshold,\n rollType: fromElvenAccuracy ? \"advantage\" : rawRollType,\n advantageDice: fromElvenAccuracy\n ? 3\n : \"advantageDice\" in attackConfig\n ? attackConfig.advantageDice\n : 2,\n critOnHit: check instanceof AlwaysCritBuilder,\n };\n }\n\n private static buildCheck(next: Check): ACBuilder | AlwaysCritBuilder {\n if (isNaN(next.ac)) throw new Error(\"Invalid NaN value for AC in withCheck()\");\n requireFinite(next.ac, \"AC in withCheck()\");\n requireFinite(next.critThreshold, \"crit threshold in withCheck()\");\n const configs = next.roll.getSubRollConfigs();\n let rewritten: readonly RollConfig[] = configs;\n if (configs.length > 0) {\n const rootIdx = naturalRollIndex(configs);\n const idx = rootIdx === -1 ? 0 : rootIdx;\n const updated = [...configs];\n updated[idx] = { ...updated[idx], rollType: next.rollType };\n rewritten = updated;\n }\n // `.ac()`/`.critOn()`/`.threeDiceAdvantage()` are the `RollBuilder`-prototype surface\n // `ac.ts` augments (the same seam that already keeps roll.ts/ac.ts load-order-safe) — using\n // it instead of `new ACBuilder(...)` avoids importing the `ACBuilder` value here.\n let ac = new RollBuilder(rewritten).ac(next.ac).critOn(next.critThreshold);\n if (next.advantageDice === 3) ac = ac.threeDiceAdvantage();\n return next.critOnHit ? ac.alwaysCrits() : ac;\n }\n\n /**\n * The base-payload transform for a `rerollDamage` threshold and a `minimumDamageDie` floor\n * (either may be unset). Each only ever raises a group's own `minimum`/`reroll`, and the reroll\n * cap reads the final floor, so applying it again after the other call lands on the same config\n * whichever order the two calls came in.\n */\n private static baseTransform(\n threshold: number | undefined,\n minimum: number | undefined\n ): (config: RollConfig) => RollConfig {\n return (config) => {\n const floor = minimum === undefined ? config.minimum : Math.max(config.minimum, minimum);\n if (threshold === undefined) return { ...config, minimum: floor };\n // Face f is worth rerolling iff max(f, floor) < E[max(X, floor)] = total / sides; the kept\n // value never falls as f rises, so the worthwhile faces are exactly 1..cap. Integer-exact.\n let total = 0;\n for (let f = 1; f <= config.sides; f++) total += Math.max(f, floor);\n let cap = 0;\n for (let f = 1; f <= config.sides; f++) {\n if (Math.max(f, floor) * config.sides < total) cap = f;\n }\n return { ...config, minimum: floor, reroll: Math.max(config.reroll, Math.min(threshold, cap)) };\n };\n }\n\n /** Applies the `rerollDamage`/`minimumDamageDie` values already set on this builder to `effect`. */\n private withStoredBaseTransforms(effect: ActionEffect): ActionEffect {\n if (this.rerollThreshold === undefined && this.minimumDieValue === undefined) return effect;\n return AttackBuilder.mapEveryDieGroup(\n effect,\n this.rerollThreshold !== undefined ? \"rerollDamage\" : \"minimumDamageDie\",\n AttackBuilder.baseTransform(this.rerollThreshold, this.minimumDieValue)\n );\n }\n\n /**\n * Shared by `rerollDamage`/`minimumDamageDie`: rewrite every die-bearing `RollConfig` of a\n * base-payload effect. Refuses (rather than silently no-oping) an effect with no real dice\n * descriptor — a parsed string or a half/scale/maxOf/pooled/composite wrapper — matching the\n * \"refuse rather than approximate\" bar the reroll substitution's `no-dice-descriptor` uses.\n */\n private static mapEveryDieGroup(\n effect: ActionEffect,\n methodName: string,\n mapConfig: (config: RollConfig) => RollConfig\n ): ActionEffect {\n if (effect.cacheKey() === null) {\n throw new Error(\n `${methodName}() requires a dice descriptor: a parsed string or a half/scale/maxOf/pooled/composite payload has none.`\n );\n }\n const configs = effect.getSubRollConfigs().map((c) => (c.sides > 0 ? mapConfig(c) : c));\n return new RollBuilder(configs);\n }\n\n /**\n * The attack as a string `parse()` reads back to the same outcomes, up to the natural-1 miss and\n * natural-20 hit, which the grammar does not model. The crit clause is always printed, since a\n * string without one crits with its hit dice doubled: `noCrit()` prints `xcrit0 (<hit>)` (no\n * natural face crits, so every landing is a hit), and a crit range keeps its `xcritN`. A check\n * that crits on every hit (`alwaysCrits()`) prints `xcritS`, S the natural die's size; one that\n * always hits prints just its natural roll, which never totals 0.\n */\n toExpression(): string {\n // The string grammar has no separate-damage channel and no \"half the hit payload on a miss\"\n // clause; rendering without them would round-trip to a different distribution.\n if (this.separateDamage.length > 0 || this.halfOnMissFlag) {\n throw new Error(\n \"toExpression() cannot represent plusSeparateDamage() or halfOnMiss(): the expression grammar has no separate damage channel or half-on-miss clause. Use toPMF() instead.\"\n );\n }\n const check = this.check;\n const naturalRoll = rootDieExpression(check);\n let checkPart: string;\n if (check instanceof AlwaysCritBuilder && !check.fromAlwaysHit) {\n checkPart = `(${checkExpression(check)} AC ${check.attackConfig.ac ?? 0})`;\n } else if (check instanceof AlwaysHitBuilder || check instanceof AlwaysCritBuilder) {\n checkPart = naturalRoll ?? check.toExpression();\n } else {\n checkPart = check.toExpression();\n }\n\n let effectPart = \"\";\n\n if (this.hitEffect) {\n const hitExpression = this.hitEffect.toExpression();\n effectPart = `(${hitExpression})`;\n if (this.critEffect === null) {\n effectPart += ` xcrit0 (${hitExpression})`;\n } else {\n // A crit doubles the hit payload's dice — parsed and pooled payloads included.\n const critExpression = (this.critEffect ?? this.hitEffect.copy().doubleDice()).toExpression();\n const critThreshold = check.critThreshold;\n if (critThreshold < 1 || critThreshold > 20) {\n throw new Error(\n `Invalid crit threshold: ${critThreshold}. Must be between 1 and 20.`\n );\n }\n if (check instanceof AlwaysCritBuilder && naturalRoll !== undefined) {\n effectPart += ` xcrit${check.getRootDieConfig()!.sides} (${critExpression})`;\n } else if (critThreshold === 20) {\n effectPart += ` crit (${critExpression})`;\n } else {\n effectPart += ` xcrit${21 - critThreshold} (${critExpression})`;\n }\n }\n\n if (this.missEffect) {\n effectPart += ` miss (${this.missEffect.toExpression()})`;\n }\n }\n\n return `${checkPart} * ${effectPart}`;\n }\n\n /**\n * Hit, crit and miss weights of `check`. A natural 1 misses; a natural 20 hits and crits\n * whatever the AC, the crit threshold, or crit-on-hit; any other natural roll hits when the total\n * reaches the AC, and crits when it is in the crit range (or every hit crits: `alwaysCrits()`).\n * An always-hitting check crits on a natural 20 or in its crit range. A check with no die has no\n * natural roll, so it hits exactly when its flat total and bonus dice reach the AC and never\n * crits unless every hit does.\n */\n resolveProbabilities(\n check: ACBuilder | AlwaysHitBuilder | AlwaysCritBuilder,\n eps: number = 0\n ): { pSuccess: number; pHit: number; pCrit: number; pMiss: number } {\n const critThreshold = check.critThreshold;\n const natural = resolveRootD20(check);\n // A dieless check's natural roll is a certain 0: never a natural 1 or 20, never in crit range.\n const inCritRange = (r: number): boolean => r === 20 || (r >= 1 && r >= critThreshold);\n\n if (check instanceof AlwaysCritBuilder && check.fromAlwaysHit) {\n return { pSuccess: 1, pHit: 0, pCrit: 1, pMiss: 0 };\n }\n\n if (check instanceof AlwaysHitBuilder) {\n let pCrit = 0;\n let pHit = 0;\n for (const [r, bin] of natural) {\n if (inCritRange(r)) pCrit += bin.p;\n else pHit += bin.p;\n }\n return { pSuccess: 1, pHit, pCrit, pMiss: 0 };\n }\n\n // An AC check, or one where every hit crits (`alwaysCrits()` / a crit-on-hit grant).\n const critOnHit = check instanceof AlwaysCritBuilder;\n const ac = check.attackConfig.ac ?? 0;\n const staticMod = check.modifier;\n const bonusDicePMFs = check.getBonusDicePMFs(check, eps);\n const bonusPMF = bonusDicePMFs.length\n ? PMF.convolveMany(bonusDicePMFs, eps)\n : PMF.delta(0, eps);\n\n let pcrit = 0;\n let phit = 0;\n let pmiss = 0;\n\n for (const [r, bin] of natural) {\n const pr = bin.p;\n if (pr <= 0) continue;\n\n if (r === 1) {\n pmiss += pr;\n continue;\n }\n if (r === 20) {\n pcrit += pr;\n continue;\n }\n\n // Any other roll has to reach the AC to hit at all, even inside an expanded crit range.\n const { atLeast, below } = splitAtThreshold(bonusPMF, ac - staticMod - r);\n if (critOnHit || inCritRange(r)) {\n pcrit += pr * atLeast;\n } else {\n phit += pr * atLeast;\n }\n pmiss += pr * below;\n }\n\n return { pSuccess: phit + pcrit, pHit: phit, pCrit: pcrit, pMiss: pmiss };\n }\n\n /** Resolves the attack into its weighted slices. `eps` defaults to 0, as for {@link toPMF}: no reachable damage value is pruned. */\n resolve(eps: number = 0): AttackResolution {\n const {\n pHit,\n pCrit,\n pMiss: pmiss,\n } = this.resolveProbabilities(this.check, eps);\n\n const toEffectPMF = (effect: ActionEffect): PMF =>\n effect instanceof ParsedRollBuilder\n ? effect.toPMF(eps)\n : pmfFromRollBuilder(effect, eps);\n\n const hitBasePMF = this.hitEffect ? toEffectPMF(this.hitEffect) : PMF.delta(0, eps);\n\n let critBasePMF: PMF | null = null;\n let phit = pHit;\n let pcrit = pCrit;\n\n if (this.critEffect === null) {\n critBasePMF = null;\n phit += pcrit;\n pcrit = 0;\n } else {\n // Every damage payload with dice doubles them on a crit — a parsed string by rewriting its\n // dice terms, a pool by doubling inside then pooling. Throws for a parsed payload that\n // contains an attack check, which is not damage.\n const critBuilder = this.critEffect ?? this.hitEffect?.copy().doubleDice();\n\n if (critBuilder) {\n critBasePMF = toEffectPMF(critBuilder);\n }\n }\n\n // `plusSeparateDamage` channels convolve into hit AND crit — their dice double on a crit like\n // any attack damage (including under an explicit `onCrit`, which overrides only the base\n // payload's crit branch, not the channel) — but never feed the base-payload transforms above.\n // `crit` is the crit payload whether or not any roll reaches it, so a zero-weight crit branch\n // still reads base ⊛ doubled channels. The one exception: when no roll can crit and a channel\n // has no single doubled form (a die rolled with advantage, an ambiguous keep), the branch\n // nobody reads is not forced through `doubleDice()`, and `crit`/`critSeparate` are `delta(0)`.\n const hasChannels = this.separateDamage.length > 0;\n const hitChannelsPMF = hasChannels\n ? PMF.convolveMany(this.separateDamage.map((r) => toEffectPMF(r)), eps)\n : null;\n let critChannelsPMF: PMF | null = null;\n let critPMF: PMF | null = critBasePMF;\n if (critBasePMF !== null && hasChannels) {\n try {\n critChannelsPMF = PMF.convolveMany(\n this.separateDamage.map((r) => toEffectPMF(r.copy().doubleDice())),\n eps\n );\n critPMF = PMF.convolveMany([critBasePMF, critChannelsPMF], eps);\n } catch (error) {\n if (pcrit > 0 || !(error instanceof AmbiguousCritDoublingError)) throw error;\n critPMF = null;\n }\n }\n\n const hitPMF = hitChannelsPMF\n ? PMF.convolveMany([hitBasePMF, hitChannelsPMF], eps)\n : hitBasePMF;\n\n let missPMF: PMF;\n let missIsDamage: boolean;\n if (this.halfOnMissFlag) {\n // Half of the RESOLVED hit payload (base + every separate channel), never the crit\n // payload — computed after `hitPMF` above, not from `hitBasePMF`.\n missPMF = hitPMF.scaleDamage(0.5, \"floor\");\n missIsDamage = true;\n } else if (this.missEffect) {\n missPMF = toEffectPMF(this.missEffect);\n missIsDamage = true;\n } else {\n missPMF = PMF.delta(0, eps);\n missIsDamage = false;\n }\n\n // Weight the hit/crit/miss PMFs into the final mixture.\n const mix = new Mixture<OutcomeType>(eps);\n if (phit > 0) mix.add(\"hit\", hitPMF, phit);\n if (critPMF && pcrit > 0) mix.add(\"crit\", critPMF, pcrit);\n if (pmiss > 0) mix.add(missIsDamage ? \"missDamage\" : \"missNone\", missPMF, pmiss);\n\n return {\n pmf: mix.buildPMF(eps) ?? PMF.delta(0, eps),\n check: this.check.toPMF(eps) ?? PMF.delta(0, eps),\n hit: hitPMF ?? PMF.delta(0, eps),\n crit: critPMF ?? PMF.delta(0, eps),\n miss: missPMF ?? PMF.delta(0, eps),\n weights: { hit: phit, crit: pcrit, miss: pmiss },\n hitBase: hitBasePMF,\n critBase: critBasePMF ?? PMF.delta(0, eps),\n hitSeparate: hitChannelsPMF ?? PMF.delta(0, eps),\n critSeparate: critChannelsPMF ?? PMF.delta(0, eps),\n };\n }\n\n /**\n * For `dice-match` trigger slicing (`turn/types.ts`'s `HasDiceMatchInfo`): the exact\n * per-damage-value match probability for the hit and crit branches, or `null` per branch when no\n * descriptor is available — a string-parsed effect, a wrapped transform whose PMF isn't fully\n * captured by its `RollConfig`s (half/scale/maxOf/pooled — `cacheKey()` returns `null` for\n * exactly these), a `keep`/`bestOf` pool (ambiguous \"the dice\" under crit doubling), an\n * exploding pool (per-die `explode` or a pool-wide budget: extra dice join the total), a pool\n * rolled with advantage/disadvantage (one kept die, not a pool), a subtracted pool (its faces\n * lower the damage), a multi-die-type pool, or (crit) `noCrit()`. A single die is supported and\n * can never match (an empty map).\n *\n * The crit branch is built from the SAME crit-effect selection `resolve()` uses (an explicit\n * `onCrit` roll, or the hit dice auto-doubled via `copy().doubleDice()`), so its descriptor\n * reflects the crit branch's REAL doubled pool, not the hit pool re-used blindly.\n *\n * Reads ONLY `hitEffect`/`critEffect` (the base pool) — `plusSeparateDamage` channels are a\n * separate channel, so their dice never count toward a match.\n */\n diceMatchInfo(_eps: number = EPS): { hit: DiceMatchInfo | null; crit: DiceMatchInfo | null } {\n const hit = this.matchInfoForEffect(this.hitEffect);\n\n let critEffect: RollBuilder | undefined;\n if (this.critEffect === null) {\n critEffect = undefined; // noCrit(): no separate crit branch\n } else if (this.critEffect) {\n critEffect = this.critEffect;\n } else if (this.hitEffect instanceof ParsedRollBuilder) {\n critEffect = undefined; // string-parsed hit: no dice descriptor on either branch\n } else {\n try {\n critEffect = this.hitEffect?.copy().doubleDice();\n } catch (error) {\n // An ambiguous keep or advantage payload has no doubled crit, so no crit descriptor either.\n if (!(error instanceof AmbiguousCritDoublingError)) throw error;\n }\n }\n const crit = this.matchInfoForEffect(critEffect);\n\n return { hit, crit };\n }\n\n private matchInfoForEffect(effect: RollBuilder | undefined): DiceMatchInfo | null {\n if (!effect || effect instanceof ParsedRollBuilder) return null;\n // `cacheKey() === null` is exactly the signal this class already uses for \"PMF not fully\n // captured by subRollConfigs\" (half/scale/maxOf/pooled/composite) — the same condition that\n // would make treating getSubRollConfigs() as the branch's real dice pool WRONG here.\n if (effect.cacheKey() === null) return null;\n\n const diceConfigs = effect.getSubRollConfigs().filter((c) => c.sides > 0);\n if (diceConfigs.length !== 1) return null;\n const config = diceConfigs[0];\n if (config.keep || config.bestOf > 0) return null;\n if (config.explode > 0 || config.explodePoolBudget > 0) return null;\n if (config.rollType !== \"flat\") return null;\n if (config.isSubtraction || config.count < 0) return null;\n\n // A single die is a SUPPORTED source that can simply never match — `null` is reserved for\n // \"no descriptor available at all\" (parsed/pooled/keep/bestOf/exploding). Conflating the two\n // previously made a valid 1-die hit pool with an auto-doubled 2-die crit pool (which CAN\n // match) throw `no-dice-descriptor` on the hit branch alone. An empty map still answers every\n // `matchProbabilityByDamage.get(d) ?? 0` lookup with the correct zero.\n if (config.count <= 1) return { matchProbabilityByDamage: new Map() };\n\n const weights = faceWeights(config.sides, config.minimum, config.reroll);\n const totalDist = diceSumDistribution(config.count, weights);\n const joint = jointSumAndMatch(config.count, weights);\n const modifier = effect.modifier;\n\n const matchProbabilityByDamage = new Map<number, number>();\n for (const [sum, totalMass] of totalDist) {\n if (totalMass <= 0) continue;\n const matchMass = joint.get(sum) ?? 0;\n matchProbabilityByDamage.set(sum + modifier, matchMass / totalMass);\n }\n\n return { matchProbabilityByDamage };\n }\n\n /**\n * A cheap, complete key for this attack's resolved PMF, or `null` when it can't be cached soundly (an\n * effect whose PMF isn't captured by its {@link RollConfig}s — see {@link RollBuilder.cacheKey}). Composed\n * from the check + hit/crit/miss effect keys + `eps`. `critEffect === null` (noCrit) and `undefined`\n * (auto-double the hit dice) are distinct crit states, encoded separately.\n */\n private cacheKey(eps: number): string | null {\n const checkKey = this.check.cacheKey();\n if (checkKey === null) return null;\n\n let hitKey = \"\";\n if (this.hitEffect) {\n const k = this.hitEffect.cacheKey();\n if (k === null) return null;\n hitKey = k;\n }\n\n let critKey: string;\n if (this.critEffect === null) critKey = \"n\";\n else if (this.critEffect === undefined) critKey = \"a\";\n else {\n const k = this.critEffect.cacheKey();\n if (k === null) return null;\n critKey = k;\n }\n\n let missKey = \"\";\n if (this.missEffect) {\n const k = this.missEffect.cacheKey();\n if (k === null) return null;\n missKey = k;\n }\n\n let channelsKey = \"\";\n for (const r of this.separateDamage) {\n const k = r.cacheKey();\n if (k === null) return null;\n channelsKey += `|${k}`;\n }\n\n return `${checkKey}*H${hitKey}*C${critKey}*M${missKey}*S${channelsKey}*half${\n this.halfOnMissFlag ? 1 : 0\n }*e${eps}`;\n }\n\n // By default, create PMF with no pruning. Cached by the cheap config key across identical rebuilds.\n toPMF(eps: number = 0): PMF {\n const key = this.cacheKey(eps);\n if (key === null) return this.resolve(eps).pmf;\n const cached = attackPMFCache.get(key);\n if (cached) return cached;\n const pmf = this.resolve(eps).pmf;\n attackPMFCache.set(key, pmf);\n return pmf;\n }\n\n get pmf() {\n return this.toPMF();\n }\n\n // By default, create query on PMF with no pruning\n toQuery(eps: number = 0): DiceQuery {\n return this.toPMF(eps).query();\n }\n}\n","import { PMF } from \"../pmf/pmf\";\nimport { AttackBuilder } from \"./attack\";\nimport { resolveRootD20 } from \"./ast\";\nimport { checkExpression } from \"./expression\";\nimport { requireFinite } from \"./arguments\";\nimport { AlwaysCritBuilder, naturalRollIndex, RollBuilder } from \"./roll\";\nimport type { RollConfig, RollType } from \"./types\";\n\nexport interface AttackConfig {\n ac: number;\n critThreshold: number;\n // An attacker property, not a roll type: how many dice a NET advantage rolls. Persists across\n // `withCheck` re-derivations, whether the advantage came from this source's own roll type or\n // was granted later (`combine()` below). Default 2.\n advantageDice: 2 | 3;\n}\n\n/**\n * Combines a source's own roll type with granted advantage/disadvantage flags by cancellation —\n * `{advantage, disadvantage}` from any combination of source and grants resolve to `advantage` /\n * `disadvantage` / `flat`. `advantageDice` governs how many dice a NET advantage rolls, whether\n * the advantage came from `rollType` itself or from `flags`; an own `elven accuracy` roll type\n * always rolls three. Pure; independently testable against the full 4×2×4 table.\n */\nexport function combine(\n rollType: RollType,\n advantageDice: 2 | 3,\n flags: { advantage: boolean; disadvantage: boolean }\n): { rollType: RollType; dice: number } {\n const ownAdvantage = rollType === \"advantage\" || rollType === \"elven accuracy\";\n const ownDisadvantage = rollType === \"disadvantage\";\n const netAdvantage = ownAdvantage || flags.advantage;\n const netDisadvantage = ownDisadvantage || flags.disadvantage;\n\n if (netAdvantage && netDisadvantage) return { rollType: \"flat\", dice: 1 };\n if (netAdvantage) return { rollType: \"advantage\", dice: rollType === \"elven accuracy\" ? 3 : advantageDice };\n if (netDisadvantage) return { rollType: \"disadvantage\", dice: 2 };\n return { rollType: \"flat\", dice: 1 };\n}\n\nexport class ACBuilder extends RollBuilder {\n readonly attackConfig: AttackConfig;\n\n constructor(baseRoll: RollBuilder, ac: number, attackConfig?: AttackConfig) {\n super(baseRoll.getSubRollConfigs());\n\n if (attackConfig) {\n this.attackConfig = { ...attackConfig, ac };\n } else {\n this.attackConfig = { ac, critThreshold: 20, advantageDice: 2 };\n }\n }\n\n onHit(val: number): AttackBuilder;\n onHit(val: string): AttackBuilder;\n onHit(val: RollBuilder): AttackBuilder;\n onHit(count: number, die: RollBuilder): AttackBuilder;\n onHit(count: number, sides: number): AttackBuilder;\n onHit(count: number, die: RollBuilder, modifier: number): AttackBuilder;\n onHit(count: number, sides: number, modifier: number): AttackBuilder;\n onHit(...args: any[]): AttackBuilder {\n const damageRoll = RollBuilder.fromArgs(...args);\n return new AttackBuilder(this, damageRoll);\n }\n\n get critThreshold(): number {\n return this.attackConfig.critThreshold;\n }\n\n /**\n * Three-dice advantage is an attacker property, not a roll type. Setting it now applies\n * whenever the NET result later resolves to advantage — whether this source already has\n * advantage baked in, or advantage is granted afterward (via `withCheck`).\n */\n threeDiceAdvantage(): ACBuilder {\n if (this.attackConfig.advantageDice === 3) return this;\n return new ACBuilder(this, this.attackConfig.ac, {\n ...this.attackConfig,\n advantageDice: 3,\n });\n }\n\n /**\n * The dice configs with `advantageDice` mechanically folded in (`elven accuracy` in place of\n * `advantage` when the net roll should use 3 dice). Shared by every consumer that needs the\n * REAL resolvable dice rather than the raw stored config: {@link getRootDieConfig} (read by\n * `rollType`/`resolveRootD20`) and {@link alwaysCrits} (whose target class has no override).\n */\n private resolvedConfigs(): readonly RollConfig[] {\n const configs = this.getSubRollConfigs();\n const idx = naturalRollIndex(configs);\n if (idx === -1) return configs;\n // `elven accuracy` (the AST layer's only 3-dice-advantage shape) only ever replaces an\n // already-`advantage` root — never downgrades a config that already reads `elven accuracy`\n // directly (the legacy `withElvenAccuracy()` path stays untouched).\n const mech =\n configs[idx].rollType === \"advantage\" && this.attackConfig.advantageDice === 3\n ? \"elven accuracy\"\n : configs[idx].rollType;\n if (mech === configs[idx].rollType) return configs;\n const updated = [...configs];\n updated[idx] = { ...updated[idx], rollType: mech };\n return updated;\n }\n\n override getRootDieConfig(): RollConfig | undefined {\n const configs = this.resolvedConfigs();\n const idx = naturalRollIndex(configs);\n return idx === -1 ? configs[0] : configs[idx];\n }\n\n override cacheKey(): string | null {\n const base = super.cacheKey();\n return base === null\n ? null\n : `A|${this.attackConfig.ac}|${this.attackConfig.critThreshold}|${this.attackConfig.advantageDice}|${base}`;\n }\n\n /** Sets the crit threshold: a natural roll at or above it is a crit. */\n critOn(threshold: number): ACBuilder {\n requireFinite(threshold, \"critOn() threshold\");\n const newConfig: AttackConfig = {\n ...this.attackConfig,\n critThreshold: threshold,\n };\n return new ACBuilder(this, this.attackConfig.ac, newConfig);\n }\n\n alwaysCrits(): AlwaysCritBuilder {\n const resolvedBase = new RollBuilder(this.resolvedConfigs());\n return new AlwaysCritBuilder(\n resolvedBase,\n {\n critThreshold: this.attackConfig.critThreshold,\n ac: this.attackConfig.ac,\n },\n false\n );\n }\n\n /**\n * `(<to-hit total> AC <ac>)`: the natural roll as {@link toPMF} reads it (one root die, rolled with\n * the resolved roll type, so three-dice advantage prints `d20 > d20 > d20`), its flats and every\n * bonus die.\n */\n override toExpression(): string {\n return `(${checkExpression(this)} AC ${this.attackConfig.ac})`;\n }\n\n /**\n * The raw to-hit PMF: the check's total where it reaches the AC and 0 where it does not, with no\n * natural-1 miss or natural-20 hit (`d20.plus(20).ac(15).toPMF()` never shows 0, although the\n * attack misses on a natural 1). The attack outcome — natural rules, crits — comes from\n * `onHit(...).resolve()`.\n */\n override toPMF(eps: number = 0): PMF {\n const ac = this.attackConfig.ac;\n const d20 = resolveRootD20(this);\n const staticMod = this.modifier;\n const bonusPMFs = this.getBonusDicePMFs(this, eps);\n\n // Build total to-hit value distribution attackRollPMF = d20 ⊕ bonusDice, then shift by staticMod\n const parts = [d20, ...bonusPMFs];\n let attackRollPMF = parts.length === 1 ? d20 : PMF.convolveMany(parts, eps);\n if (staticMod !== 0)\n attackRollPMF = attackRollPMF.mapDamage(\n (rollValue) => rollValue + staticMod\n );\n\n // Map to 0 when below AC\n const out = new Map<number, number>();\n for (const rollValue of attackRollPMF.support()) {\n const p = attackRollPMF.pAt(rollValue);\n const key = rollValue >= ac ? rollValue : 0;\n out.set(key, (out.get(key) || 0) + p);\n }\n return PMF.fromMap(out, eps);\n }\n\n /** Accepts a replacement AC, so `vsAC` can rebind the check without rebuilding the roll. */\n override copy(ac?: number): ACBuilder {\n const baseCopy = new RollBuilder(this.getSubRollConfigs());\n const newConfig: AttackConfig = {\n ac: ac ?? this.attackConfig.ac,\n critThreshold: this.attackConfig.critThreshold,\n advantageDice: this.attackConfig.advantageDice,\n };\n return new ACBuilder(baseCopy, newConfig.ac, newConfig);\n }\n}\n\n// Augment the RollBuilder prototype to implement the ac method\nRollBuilder.prototype.ac = function (targetAC: number): ACBuilder {\n if (isNaN(targetAC)) throw new Error(\"Invalid NaN value for targetAC\");\n requireFinite(targetAC, \"ac()\");\n return new ACBuilder(this, targetAC);\n};\n","import type { OutcomeType } from \"../common/types\";\nimport { EPS } from \"../common/types\";\nimport { Mixture } from \"../pmf/mixture\";\nimport { PMF } from \"../pmf/pmf\";\nimport type { DiceQuery } from \"../pmf/query\";\nimport { pmfFromRollBuilder } from \"./ast\";\nimport type { DCBuilder } from \"./dc\";\nimport { ParsedRollBuilder, type RollBuilder } from \"./roll\";\nimport type { CheckBuilder, SaveResolution } from \"./types\";\n\nexport type SaveOutcome = \"normal\" | \"half\";\n\n/**\n * Resolved-save PMF cache, the save-side sibling of {@link attackPMFCache}. `resolve()` re-runs the failure\n * PMF, the half-damage scale and the success/fail mixture on every call; a save-based DPR sweep (a caster's\n * Fireball, a Paladin's smite) resolves the SAME save thousands of times. Keyed by\n * {@link SaveBuilder.cacheKey}; a `null` key resolves uncached.\n */\nconst savePMFCache = PMF.createCache(4000);\n\n/** Clears the resolved-save PMF cache (test/bench seam; mirrors {@link clearAttackCache}). */\nexport function clearSaveCache(): void {\n savePMFCache.clear();\n}\n\nexport class SaveBuilder implements CheckBuilder {\n constructor(\n readonly check: DCBuilder,\n private readonly failureEffect?: RollBuilder,\n private readonly saveOutcome: SaveOutcome = \"normal\"\n ) {}\n\n saveHalf(): SaveBuilder {\n return new SaveBuilder(this.check, this.failureEffect, \"half\");\n }\n\n toExpression(): string {\n const checkPart = this.check.toExpression();\n if (!this.failureEffect) return checkPart;\n\n const failureEffectPart = this.failureEffect.toExpression();\n const result = `${checkPart} * (${failureEffectPart})`;\n return this.saveOutcome === \"half\" ? `${result} save half` : result;\n }\n\n /**\n * The save's outcome: `check` is the DC check's own PMF (success at 0, failure at 1, as\n * {@link DCBuilder.toPMF}), `weights` its success/failure chances, `saveFail` the failure payload\n * and `saveSuccess` what a success deals (half, floored, under `saveHalf()`; else 0).\n */\n resolve(eps: number = EPS): SaveResolution {\n const { pSuccess: psuccess, pFail: pfail } = this.check.saveProbabilities();\n const failPMF = this.failureEffect\n ? this.failureEffect instanceof ParsedRollBuilder\n ? this.failureEffect.toPMF(eps)\n : pmfFromRollBuilder(this.failureEffect)\n : PMF.delta(0);\n const onSuccess = this.saveOutcome ?? \"half\";\n\n let successPMF: PMF = PMF.delta(0, eps);\n if (onSuccess === \"half\") successPMF = failPMF.scaleDamage(0.5, \"floor\");\n\n const successLabel: OutcomeType =\n onSuccess === \"normal\" ? \"missNone\" : \"saveHalf\";\n const failLabel: OutcomeType = \"saveFail\";\n const baseMix = new Mixture<OutcomeType>(eps);\n const mixture = baseMix\n .add(successLabel, successPMF, psuccess)\n .add(failLabel, failPMF, pfail);\n\n return {\n pmf: mixture.buildPMF(eps) ?? PMF.delta(0, eps),\n check: this.check.toPMF(eps),\n saveFail: failPMF ?? PMF.delta(0, eps),\n saveSuccess: successPMF ?? PMF.delta(0, eps),\n weights: { success: psuccess, fail: pfail },\n };\n }\n\n /**\n * A cheap, complete key for this save's resolved PMF, or `null` when it can't be cached soundly.\n * {@link resolve} reads exactly three things: the DC check (via `saveProbabilities`/`toPMF`), the failure\n * effect's PMF, and the save outcome — so composing their keys pins it. A `ParsedRollBuilder` failure\n * effect returns `null`, which correctly forces this uncached.\n */\n private cacheKey(eps: number): string | null {\n const checkKey = this.check.cacheKey();\n if (checkKey === null) return null;\n\n let failKey = \"\";\n if (this.failureEffect) {\n const k = this.failureEffect.cacheKey();\n if (k === null) return null;\n failKey = k;\n }\n\n return `${checkKey}*F${failKey}*O${this.saveOutcome}*e${eps}`;\n }\n\n // By default, create PMF with no pruning. Cached by the cheap config key across identical rebuilds.\n toPMF(eps: number = 0): PMF {\n const key = this.cacheKey(eps);\n if (key === null) return this.resolve(eps).pmf;\n const cached = savePMFCache.get(key);\n if (cached) return cached;\n const pmf = this.resolve(eps).pmf;\n savePMFCache.set(key, pmf);\n return pmf;\n }\n\n get pmf() {\n return this.toPMF();\n }\n\n // By default, create query on PMF with no pruning\n toQuery(eps: number = 0): DiceQuery {\n return this.toPMF(eps).query();\n }\n}\n","import { PMF } from \"../pmf/pmf\";\nimport { resolveRootD20 } from \"./ast\";\nimport { splitAtThreshold } from \"./prob\";\nimport { requireFinite } from \"./arguments\";\nimport { RollBuilder } from \"./roll\";\nimport { SaveBuilder } from \"./save\";\n\ninterface SaveConfig {\n dc: number;\n}\n\n/**\n * DC-check PMF cache. The two-outcome success/fail PMF is re-derived on every `toPMF()`, and a save-based\n * DPR sweep asks for the SAME check thousands of times. Keyed by {@link DCBuilder.cacheKey} + `eps`.\n */\nconst dcPMFCache = PMF.createCache(4000);\n\n/** Clears the DC-check PMF cache (test/bench seam). */\nexport function clearDCCache(): void {\n dcPMFCache.clear();\n}\n\nexport class DCBuilder extends RollBuilder {\n private readonly saveConfig: SaveConfig;\n\n constructor(baseRoll: RollBuilder, saveConfig?: SaveConfig) {\n super(baseRoll.getSubRollConfigs());\n this.saveConfig = saveConfig ? { ...saveConfig } : { dc: 10 };\n }\n\n override dc(saveDC: number): DCBuilder {\n if (isNaN(saveDC)) throw new Error(\"Invalid NaN value for saveDC\");\n requireFinite(saveDC, \"dc()\");\n if (this.rollType && this.rollType === \"elven accuracy\") {\n throw new Error(\n \"Cannot use dc() on an AttackRollBuilder. Use ac() for attack rolls instead.\"\n );\n }\n return new DCBuilder(this, { dc: saveDC });\n }\n\n get saveDC(): number {\n return this.saveConfig.dc;\n }\n\n override add(anotherRoll: RollBuilder): DCBuilder {\n const newBuilder = super.add(anotherRoll);\n return new DCBuilder(newBuilder, this.saveConfig);\n }\n\n override addRoll(count?: number): DCBuilder {\n const newBuilder = super.addRoll(count);\n return new DCBuilder(newBuilder, this.saveConfig);\n }\n\n onSaveFailure(val: number): SaveBuilder;\n onSaveFailure(val: string): SaveBuilder;\n onSaveFailure(val: RollBuilder): SaveBuilder;\n onSaveFailure(count: number, die: RollBuilder): SaveBuilder;\n onSaveFailure(count: number, sides: number): SaveBuilder;\n onSaveFailure(count: number, die: RollBuilder, modifier: number): SaveBuilder;\n onSaveFailure(count: number, sides: number, modifier: number): SaveBuilder;\n onSaveFailure(...args: any[]): SaveBuilder {\n const damageRoll = RollBuilder.fromArgs(...args);\n return new SaveBuilder(this, damageRoll);\n }\n\n override withElvenAccuracy(): never {\n throw new Error(\n \"Elven Accuracy cannot be used with saving throws (DC checks). It is only valid for attack rolls (AC checks).\"\n );\n }\n\n // Legacy expressions\n override toExpression(): string {\n const subConfigs = this.getSubRollConfigs();\n const allConfigs = [...subConfigs];\n const expression = new RollBuilder(allConfigs).toExpression();\n return `(${expression} DC ${this.saveConfig.dc})`;\n }\n\n /**\n * The DC check's PMF is fully determined by the save DC plus everything `toPMF` below reads off the roll\n * configs (`rollType`, `baseReroll`, `modifier`, bonus dice) — all of which `super.cacheKey()` already\n * serializes. So extend the base key with the DC, mirroring {@link AlwaysHitBuilder.cacheKey}.\n */\n override cacheKey(): string | null {\n const base = super.cacheKey();\n return base === null ? null : `DC|${this.saveConfig.dc}|${base}`;\n }\n\n /**\n * P(success) and P(failure) of this save: success iff natural roll + bonus dice + modifier ≥ DC,\n * with no natural-1/natural-20 rule (a check with no die compares its flat total alone). Each side\n * is summed from its own outcomes, so a certain success has a failure chance of exactly 0.\n */\n saveProbabilities(): { pSuccess: number; pFail: number } {\n const natural = resolveRootD20(this);\n const bonusDicePMFs = this.getBonusDicePMFs(this, 0);\n const bonusPMF = bonusDicePMFs.length ? PMF.convolveMany(bonusDicePMFs, 0) : PMF.delta(0, 0);\n let pSuccess = 0;\n let pFail = 0;\n for (const [r, bin] of natural) {\n const { atLeast, below } = splitAtThreshold(bonusPMF, this.saveDC - this.modifier - r);\n pSuccess += bin.p * atLeast;\n pFail += bin.p * below;\n }\n return { pSuccess, pFail };\n }\n\n /**\n * The check outcome as a PMF: a success at 0, a failure at 1 (so `hitProbability()` is the\n * chance the save fails — the chance the effect lands). `SaveBuilder.resolve().check` is this PMF.\n */\n override toPMF(eps: number = 0): PMF {\n const key = this.cacheKey();\n const fullKey = key === null ? null : `${key}*e${eps}`;\n if (fullKey !== null) {\n const cached = dcPMFCache.get(fullKey);\n if (cached) return cached;\n }\n\n const { pSuccess, pFail } = this.saveProbabilities();\n const m = new Map<number, number>();\n if (pSuccess > 0) m.set(0, pSuccess);\n if (pFail > 0) m.set(1, pFail);\n const pmf = PMF.fromMap(m, eps);\n if (fullKey !== null) dcPMFCache.set(fullKey, pmf);\n return pmf;\n }\n}\n\n// Augment the RollBuilder prototype to implement the dc method\nRollBuilder.prototype.dc = function (saveDC: number): DCBuilder {\n return new DCBuilder(this).dc(saveDC);\n};\n","import type { DiceMatchInfo, HasDiceMatchInfo } from \"../common/types\";\nimport type { PMF } from \"../pmf/pmf\";\n\nexport type { DiceMatchInfo, HasDiceMatchInfo };\n\n/**\n * Triggers that read the outcomes of source attacks, as opposed to `not-fired`,\n * which reads another rider. Includes `any-miss`/`first-miss`, so this is not \"hit triggers\".\n */\nexport type AttackTriggerOn =\n | \"first-hit\"\n | \"any-crit\"\n | \"any-miss\"\n | \"first-miss\"\n | \"every-hit\";\n\n/**\n * When a rider fires. JSON-safe, so a consumer can persist this verbatim and hand\n * it straight back in a {@link TurnSpec}.\n *\n * - `first-hit` — the first source that lands. Fires in that source's mode, so a\n * crit on the *first* landing attack doubles the rider's dice (Sneak Attack).\n * - `any-crit` — at least one source crit. Always fires in crit mode (Divine Smite).\n * - `any-miss` — at least one source missed. Its step runs after every declared attack,\n * which is exact only when the reroll is identically distributed to every attack after\n * the one it replaces. An attack-shaped `any-miss` rider that reads a granted modifier\n * or applies a condition's grants is refused (`unsupported-trigger`): at the end of the\n * turn it would see the wrong grants. Use `first-miss` for such rerolls.\n * - `first-miss` — the FIRST source in `of` that missed. Its step runs immediately after\n * that attack (one slot per watched source, sharing one fire bit), so a reroll lands in\n * turn order and anything that reads order — a `first-hit` rider's crit mode, or a\n * granted modifier — sees it where it happened. The exact model of \"when you miss, you\n * may reroll\" (Unerring Accuracy, Lucky).\n * - `every-hit` — once per landing source, in that hit's mode (Hunter's Mark, Hex, Rage).\n * - `dice-match` — at least one named source's own damage dice showed a duplicate\n * value on hit or crit (Chromatic Orb's bounce). `of` is REQUIRED — unlike the\n * other attack triggers, \"every declared attack\" has no coherent single meaning\n * for \"the dice matched\", so there is no default. Each named source must expose\n * a {@link HasDiceMatchInfo} descriptor (an `AttackBuilder`-shaped source does);\n * naming one that doesn't (a bare `PMF`, a `keep`/`bestOf` pool, a string-parsed\n * expression) is a `TurnSpecError`, not a silent \"never matches\". A damage rider\n * fires in crit mode, its dice doubled, when a crit's dice matched (with several\n * sources, when any matching landing was a crit); otherwise in hit mode.\n * - `not-fired` — the named rider did **not** fire (\"flurry of blows if I didn't smite\").\n * It may also name a substitute: it then fires when the substitute was never spent.\n *\n * For the attack triggers besides `dice-match`, `of` is a list of attack ids,\n * attack-shaped rider ids, or declaration tags (see {@link Attack}); a tag expands to\n * every attack carrying it. A rider whose damage is a list of several attacks is not\n * attack-shaped: naming it is `not-an-attack`, and it never joins a default `of`.\n *\n * `of` defaults to every declared attack plus every attack-shaped `any-miss` /\n * `first-miss` rider before it — a reroll continues the attacks it watches. `Turn`'s\n * chaining methods snapshot that at the call that adds the rider (the attacks and\n * rerolls declared so far); a {@link TurnSpec} resolves it when the plan is built,\n * giving a rider the rerolls listed before it in `riders` and a substitute or\n * condition every reroll. Both spellings of one turn therefore watch the same\n * sources. For `not-fired` it is the single required id of the rider being negated —\n * negating a set of riders has no unambiguous meaning, so the type does not offer it.\n */\nexport type Trigger =\n | { on: AttackTriggerOn; of?: readonly string[] }\n | { on: \"not-fired\"; of: string }\n | { on: \"dice-match\"; of: readonly string[] };\n\n/** Anything that can produce a PMF: `RollBuilder`, `AttackBuilder`, `SaveBuilder`, or a `PMF`. */\nexport interface ToPMF {\n toPMF(eps?: number): PMF;\n}\n\n/**\n * Rider or attack damage. Raw strings are not accepted; wrap one in `d(\"…\")`. On a\n * crit, a rider's dice double and its flats do not: a builder through\n * `doubleDice()`, a `d(\"…\")` string by rewriting its dice terms (`d(\"2d6+5\")` crits\n * as `4d6+5`), a pool inside, then pooled. A bare `PMF` is a fixed distribution with\n * no dice to double, so it is added as-is on a crit. A `d(\"…\")` attack string crits on\n * its own roll: with no crit clause, at its natural 20, with its hit dice doubled.\n */\nexport type Damage = PMF | ToPMF;\n\n/**\n * Same shape as {@link Damage}, named separately because the requirement is\n * stronger: a source must resolve to an *outcome-labelled* PMF carrying\n * hit/crit/miss, which no type can express. Supplying one that does not is a\n * `not-an-attack` {@link TurnSpecError} at build time, not a compile error.\n */\nexport type Source = Damage;\n\n/**\n * One payload, or several to convolve: Flurry of Blows is `[flurry, flurry]`. A list of\n * several attacks deals their exact summed damage, but it is one payload, not attacks\n * that each land: nothing can watch it in `of`, and it never joins a default `of`. To\n * watch each strike, declare each as its own rider.\n */\nexport type RiderDamage = Damage | readonly Damage[];\n\n/** Everything about a rider except what it does and when — see `Turn.onFirstHit`. */\nexport interface RiderOptions {\n /** Required only if another rider names this one in `of`. */\n id?: string;\n /**\n * Which attacks to watch: attack ids, attack-shaped rider ids, or declaration tags.\n * Defaults to the attacks declared so far, plus any attack-shaped `any-miss` /\n * `first-miss` rider declared so far (see {@link Trigger}).\n */\n of?: readonly string[];\n /**\n * Defaults to `damage` with its dice doubled (builders and `d(\"…\")` strings that can double);\n * an attack or save builder or string, or a bare `PMF` part, is added as-is. A rider that\n * rolls its own attack — one attack, or a list of several — crits on its own roll, so\n * giving it one is an `unused-crit-damage` error.\n */\n critDamage?: RiderDamage;\n}\n\nexport type Rider = Trigger & {\n id?: string;\n damage: RiderDamage;\n critDamage?: RiderDamage;\n};\n\n/** How an attack is declared: `id` names it for `of`; `tag` groups it with others. */\nexport interface AttackOptions {\n id?: string;\n /**\n * A name several attacks can share. An `of` entry that is not an id expands to\n * every attack carrying that tag, so a reordered turn cannot silently retarget\n * the way a positional `attack 2` can. A tag matching nothing is `unknown-id`.\n */\n tag?: string;\n}\n\n/**\n * A bare source gets the id `attack 1`, `attack 2`, … in declaration order.\n *\n * Unlike {@link Rider}, the id lives in a wrapper rather than on the value\n * itself: an attack's value is a builder or PMF that this module does not own,\n * so there is nowhere to hang a field.\n */\nexport type Attack = Source | (AttackOptions & { source: Source });\n\n/**\n * When a substitute may be spent: on the first landing it sees (`always`, the\n * default), only when the base payload total (dice plus the payload's own flat\n * bonus, excluding separate-damage channels) is below the threshold for that\n * mode (`below`; a landing spends regardless when no later watched step can\n * still land in that turn state), or by backward induction (`optimal` — not\n * supported in this release).\n */\nexport type SubstitutePolicy =\n | { kind: \"always\" }\n | { kind: \"below\"; hit: number; crit: number }\n | { kind: \"optimal\" };\n\n/**\n * A once-per-turn payload transform: at the first watched landing the policy\n * accepts, the attack's base payload is replaced by a transform of itself. The\n * JSON-safe form of `Turn.onFirstHit(keepBestDamage())`; callers write the\n * factory, never the string.\n */\nexport interface SubstituteSpec {\n id?: string;\n on: \"first-hit\";\n /**\n * Omit it: defaults to every declared attack plus every attack-shaped `any-miss` /\n * `first-miss` rider, the same sources the chaining spelling watches (see {@link Trigger}).\n */\n of?: readonly string[];\n /** Named transform, so a {@link TurnSpec} stays JSON-safe and persistable. */\n substitute: \"reroll-keep-higher\";\n /** Defaults to `{ kind: \"always\" }`. */\n policy?: SubstitutePolicy;\n}\n\n/**\n * One granted modifier: what it does to the attack rolls that read it, how long it\n * lasts, and which attack rolls read it. JSON-safe — the persisted form of a\n * `Grant` built with `advantage().untilNextAttack()` and friends.\n *\n * - `advantage` / `disadvantage` combine with the reading attack's own roll type by\n * cancellation; a net advantage rolls as many dice as that attacker's\n * `advantageDice` (`ACBuilder.threeDiceAdvantage()`).\n * - `critOnHit` makes every landing attack a crit; a natural 1 still misses.\n * - `until: \"next-attack\"` is consumed by the next attack roll that reads it, hit or\n * miss; `\"end-of-turn\"` lasts for the rest of the turn.\n * - `to` lists attack ids, attack-shaped rider ids or tags. Omitted, every later\n * attack roll reads it, attack-shaped riders included (an attack-shaped `any-miss`\n * rider that would read it is refused; see {@link Trigger}).\n */\nexport interface GrantSpec {\n advantage?: true;\n disadvantage?: true;\n critOnHit?: true;\n until: \"next-attack\" | \"end-of-turn\";\n to?: readonly string[];\n}\n\n/**\n * Grants applied by the outcomes of earlier attacks to later attack rolls: \"a hit\n * gives the next attack advantage\". The JSON-safe form of `Turn.onEveryHit(grant)`.\n *\n * `on` says which outcome among `of` applies the grants: `every-hit` on each\n * landing, `first-hit` on the first landing only, `any-crit` on each crit,\n * `first-miss` on the first miss, `any-miss` on each miss. Miss damage\n * (`halfOnMiss`, `onMiss`) is a miss, never a landing.\n *\n * `chance` is the probability each application takes (a target's failed save);\n * `grants` apply on that branch and `onSave` on the other one. Each application\n * rolls it afresh, except that an application whose grants are all `end-of-turn`\n * and all already in force is skipped: nothing is rolled and `onSave` does not\n * apply. An application with any `next-attack` grant is always rolled.\n */\nexport interface ConditionSpec {\n id?: string;\n on: AttackTriggerOn;\n /**\n * Omit it: defaults to every declared attack plus every attack-shaped `any-miss` /\n * `first-miss` rider (see {@link Trigger}).\n */\n of?: readonly string[];\n /** In `[0, 1]`; defaults to 1. */\n chance?: number;\n /** Applied on the fail branch, or with probability `chance`. */\n grants: readonly GrantSpec[];\n /** Applied on the success branch. Requires `chance`. */\n onSave?: readonly GrantSpec[];\n}\n\nexport interface TurnSpec {\n attacks: readonly Attack[];\n riders?: readonly Rider[];\n substitutes?: readonly SubstituteSpec[];\n conditions?: readonly ConditionSpec[];\n}\n\nexport type TurnSpecErrorCode =\n | \"unknown-id\"\n | \"duplicate-id\"\n | \"self-reference\"\n | \"cycle\"\n | \"not-an-attack\"\n | \"unused-crit-damage\"\n | \"too-many-groups\"\n | \"no-dice-descriptor\"\n | \"duplicate-substitute\"\n | \"attack-after-rider\"\n | \"no-rebindable-source\"\n | \"unsupported-trigger\"\n | \"unsupported-policy\"\n | \"too-many-flags\";\n\n/**\n * A malformed turn. `code` is a stable contract: consumer UIs map it to their own\n * states (greyed dropdown option, \"trigger missing\" row error, …) instead of\n * re-implementing validation.\n */\nexport class TurnSpecError extends Error {\n constructor(\n readonly code: TurnSpecErrorCode,\n readonly id: string,\n message: string\n ) {\n super(message);\n this.name = \"TurnSpecError\";\n }\n}\n\n/**\n * How many distinct `of` sets a single turn may track.\n *\n * Each group multiplies the state space, so the cap is a cost ceiling rather\n * than a modelling limit. Measured on four attacks with two riders per group\n * (every group fed by multiple independent sources — the expensive, dense\n * case): 2.1ms for one group, 3.1 for two, 5.9 for three, 23.5 for four —\n * roughly 4x per group. A `bounce()` chain is the opposite case — each group\n * is fed by exactly ONE step, and the chain is strictly sequential (group N+1\n * only ever reads a nonzero state once group N has already resolved), so its\n * reachable state space grows close to linearly rather than combinatorially;\n * see `dice-match.test.ts`'s latency measurement.\n *\n * 9, not 4: Chromatic Orb's `effectCountScaling: 'spell_level_plus_one'` needs\n * up to `1 + 9 = 10` beams at a 9th-level slot — 9 additional bounces beyond\n * the first. A non-bounce turn tracking 9 independent dense groups would be\n * the pathological case the latency table above warns about; real builds use\n * one or two (the goliath rogue/monk/paladin uses one).\n */\nexport const MAX_TRIGGER_GROUPS = 9;\n","import type { DCBuilder } from \"../builder/dc\";\nimport type { GrantSpec, RiderOptions, SubstitutePolicy, SubstituteSpec } from \"./types\";\nimport { TurnSpecError } from \"./types\";\n\n/**\n * A payload transform a trigger verb accepts, as opposed to damage (a rider).\n * Built only by a named factory such as {@link keepBestDamage}, so the wire kind\n * never appears at a call site. Immutable: every method returns a new value.\n */\nexport interface Transform {\n readonly kind: \"transform\";\n /**\n * Spend only when the base payload total (dice plus the payload's own flat\n * bonus, excluding separate-damage channels) is below `threshold` in the mode\n * that landed; otherwise hold for the next watched attack. The threshold\n * applies only while a later watched step can still land in the current turn\n * state; when none can, any landing spends, since holding is worth nothing.\n * A single number applies to both modes, which for a crit's doubled dice\n * usually means \"hold\" — pass `{ hit, crit }` to set each.\n *\n * Compares the payload's own values, so it works on any payload: a builder, a\n * parsed string or a bare `PMF`.\n */\n ifBelow(threshold: number | { hit: number; crit: number }): Transform;\n /**\n * Spend by backward induction over the remaining steps. Not supported in this\n * release: throws `TurnSpecError(\"unsupported-policy\")`.\n */\n optimally(): Transform;\n}\n\nclass SubstituteTransform implements Transform {\n readonly kind = \"transform\" as const;\n\n constructor(\n readonly substitute: SubstituteSpec[\"substitute\"],\n readonly policy: SubstitutePolicy\n ) {}\n\n ifBelow(threshold: number | { hit: number; crit: number }): Transform {\n const { hit, crit } =\n typeof threshold === \"number\" ? { hit: threshold, crit: threshold } : threshold;\n if (Number.isNaN(hit) || Number.isNaN(crit)) {\n throw new RangeError(\"ifBelow() needs numeric thresholds, got NaN.\");\n }\n return new SubstituteTransform(this.substitute, { kind: \"below\", hit, crit });\n }\n\n optimally(): Transform {\n throw new TurnSpecError(\n \"unsupported-policy\",\n \"\",\n \"optimally() is not supported in this release; use ifBelow({ hit, crit }) with the thresholds you want.\"\n );\n }\n}\n\n/**\n * Roll the watched attack's whole base payload again and keep the better total —\n * once per turn. Pass it to `Turn.onFirstHit`:\n *\n * ```ts\n * turn([sword, sword]).onFirstHit(keepBestDamage());\n * ```\n *\n * The transform reads the attack's own damage, so no dice are restated. It never\n * touches `plusSeparateDamage` channels, `every-hit` rider damage, or the miss\n * branch, and a crit transforms the crit payload (the already-doubled dice).\n *\n * **Policy.** The default spends on the first watched attack that lands, whatever\n * it rolled. That is a named policy, not optimal play: a player who sees a high\n * roll holds the reroll for a later attack. The figure is therefore a lower bound.\n * Two `d20+5` attacks against AC 12 dealing `2d6+3` score 15.9849 under this\n * policy against 16.1889 for the optimal hold/use policy (14.7000 without the\n * transform); {@link Transform.ifBelow} with `{ hit: 10, crit: 18 }` reaches the\n * optimum on that turn.\n *\n * **Ties.** When the fresh total ties the original, the original roll is kept. The\n * total is the same either way, but a `dice-match` trigger reading the attack sees\n * the kept dice's match status: a player who would take a tied roll because its\n * dice matched is not modelled.\n */\nexport function keepBestDamage(): Transform {\n return new SubstituteTransform(\"reroll-keep-higher\", { kind: \"always\" });\n}\n\n/** True for a {@link Transform} built by a factory in this module. */\nexport function isTransform(value: unknown): value is Transform {\n return value instanceof SubstituteTransform;\n}\n\n/** The JSON-safe fields a {@link Transform} contributes to a {@link SubstituteSpec}. */\nexport function substituteFields(\n transform: Transform\n): Pick<SubstituteSpec, \"substitute\" | \"policy\"> {\n const { substitute, policy } = transform as SubstituteTransform;\n return policy.kind === \"always\" ? { substitute } : { substitute, policy };\n}\n\n/**\n * What a grant does to the attack rolls that read it, before it has a lifetime.\n * Not yet a {@link Grant}: a trigger verb refuses it at compile time, so a\n * forgotten lifetime is a type error rather than a silent default. Immutable.\n */\nexport interface Modifiers {\n /** Adds advantage; repeating a modifier is a no-op. */\n advantage(): Modifiers;\n disadvantage(): Modifiers;\n /** Every landing attack is a crit; a natural 1 still misses. */\n critOnHit(): Modifiers;\n /** Consumed by the next attack roll that reads it, hit or miss. */\n untilNextAttack(): Grant;\n /** Lasts for the rest of the turn. */\n untilEndOfTurn(): Grant;\n}\n\n/**\n * A modifier with a lifetime: the only thing a trigger verb accepts besides damage\n * and transforms. Pass several in an array to have one outcome (and one save)\n * apply them together. Immutable.\n */\nexport interface Grant {\n readonly kind: \"grant\";\n /**\n * The attack ids, attack-shaped rider ids or tags that read it. Omitted, every\n * later attack roll does. Naming nothing that comes after the condition's\n * sources is `unknown-id`.\n */\n to(...targets: readonly string[]): Grant;\n}\n\ntype Modifier = \"advantage\" | \"disadvantage\" | \"critOnHit\";\n\nclass ModifierSet implements Modifiers {\n constructor(private readonly set: Readonly<Partial<Record<Modifier, true>>>) {}\n\n advantage(): Modifiers {\n return new ModifierSet({ ...this.set, advantage: true });\n }\n\n disadvantage(): Modifiers {\n return new ModifierSet({ ...this.set, disadvantage: true });\n }\n\n critOnHit(): Modifiers {\n return new ModifierSet({ ...this.set, critOnHit: true });\n }\n\n untilNextAttack(): Grant {\n return new GrantValue({ ...this.set, until: \"next-attack\" });\n }\n\n untilEndOfTurn(): Grant {\n return new GrantValue({ ...this.set, until: \"end-of-turn\" });\n }\n}\n\nclass GrantValue implements Grant {\n readonly kind = \"grant\" as const;\n\n constructor(readonly spec: GrantSpec) {}\n\n to(...targets: readonly string[]): Grant {\n return new GrantValue({ ...this.spec, to: [...targets] });\n }\n}\n\n/** Advantage on the attack rolls that read the grant: `advantage().untilNextAttack()`. */\nexport function advantage(): Modifiers {\n return new ModifierSet({ advantage: true });\n}\n\n/** Disadvantage on the attack rolls that read the grant; cancels an advantage. */\nexport function disadvantage(): Modifiers {\n return new ModifierSet({ disadvantage: true });\n}\n\n/** Every landing attack that reads the grant is a crit: `critOnHit().untilEndOfTurn()`. */\nexport function critOnHit(): Modifiers {\n return new ModifierSet({ critOnHit: true });\n}\n\n/** True for a {@link Grant} built by a factory in this module. */\nexport function isGrant(value: unknown): value is Grant {\n return value instanceof GrantValue;\n}\n\n/** The JSON-safe form of a {@link Grant}. */\nexport function grantSpec(grant: Grant): GrantSpec {\n return (grant as GrantValue).spec;\n}\n\n/**\n * Rider options plus what gates a call's grants. The gate applies to grants only:\n * damage passed in the same call lands whatever the save does.\n */\nexport interface ConditionOptions extends RiderOptions {\n /** The target's save; its P(fail) is the chance the grants take. */\n save?: DCBuilder;\n /** In `[0, 1]`; mutually exclusive with `save`. */\n chance?: number;\n /** Grants applied on the other branch: the save succeeded (or `1 - chance`). */\n onSave?: Grant | readonly Grant[];\n}\n","/**\n * Per-group trigger state, packed into one byte.\n *\n * A \"group\" is one distinct set of source ids referenced by a trigger. Everything\n * any trigger needs to know about a group is which outcome landed *first*, whether\n * anything crit, whether anything missed, whether anything's dice matched, and\n * whether a match came from a crit — so the whole turn state stays small per group.\n *\n * Layout: `first << 2 | anyCrit << 1 | anyMiss | anyMatch << 4 | anyCritMatch << 5`,\n * where `first` is one of {@link FIRST_NONE} / {@link FIRST_HIT} / {@link FIRST_CRIT}.\n * Readers decode with `code >> 2 & 0b11`, `code & CRIT_BIT`, `code & MISS_BIT`,\n * `code & MATCH_BIT`, `code & CRIT_MATCH_BIT`.\n */\nexport const FIRST_NONE = 0;\nexport const FIRST_HIT = 1;\nexport const FIRST_CRIT = 2;\n\nexport const CRIT_BIT = 2;\nexport const MISS_BIT = 1;\n/**\n * Bit 4 — `FIRST_CRIT` (2) shifted left by 2 is `0b1000` (bit 3), so bits 0-3 are\n * occupied by first/crit/miss.\n */\nexport const MATCH_BIT = 16;\n/**\n * Bit 5 — set with {@link MATCH_BIT} when the matching landing was a crit, so a\n * damage-shaped `dice-match` rider doubles its dice exactly when a crit's dice\n * matched. Max reachable code is `8|2|1|16|32 = 59`, still < 256, so `turn.ts`'s\n * `String.fromCharCode` per-group state key is unaffected.\n */\nexport const CRIT_MATCH_BIT = 32;\n\n/** A group that has seen nothing yet: no first landing, no crit, no miss, no match. */\nexport const START_CODE = FIRST_NONE << 2;\n\nexport type StepOutcome = \"hit\" | \"crit\" | \"miss\";\n\n/** Fold one source outcome into a group's state. `matched` only has an effect on\n * `\"hit\"`/`\"crit\"` — a miss rolls no dice, so it can never match. */\nexport function advance(code: number, outcome: StepOutcome, matched = false): number {\n if (outcome === \"miss\") return code | MISS_BIT;\n\n const first = (code >> 2) & 0b11;\n const withCrit = outcome === \"crit\" ? code | CRIT_BIT : code;\n const matchBits = matched ? (outcome === \"crit\" ? MATCH_BIT | CRIT_MATCH_BIT : MATCH_BIT) : 0;\n const withMatch = withCrit | matchBits;\n if (first !== FIRST_NONE) return withMatch;\n\n const nextFirst = outcome === \"crit\" ? FIRST_CRIT : FIRST_HIT;\n return (nextFirst << 2) | (withMatch & (CRIT_MATCH_BIT | MATCH_BIT | CRIT_BIT | MISS_BIT));\n}\n","import { combine } from \"../builder/ac\";\nimport { ParsedRollBuilder } from \"../builder/roll\";\nimport type { AttackResolution, Check } from \"../builder/types\";\nimport { EPS } from \"../common/types\";\nimport type { DiceMatchInfo, HasDiceMatchInfo } from \"../common/types\";\nimport { Mixture } from \"../pmf/mixture\";\nimport { PMF } from \"../pmf/pmf\";\nimport { isGrant, isTransform } from \"./effects\";\nimport type { StepOutcome } from \"./state\";\nimport {\n advance,\n CRIT_BIT,\n CRIT_MATCH_BIT,\n FIRST_CRIT,\n FIRST_NONE,\n MATCH_BIT,\n MISS_BIT,\n} from \"./state\";\nimport type {\n Attack,\n AttackTriggerOn,\n ConditionSpec,\n Damage,\n GrantSpec,\n Rider,\n SubstitutePolicy,\n SubstituteSpec,\n ToPMF,\n Trigger,\n TurnSpec,\n TurnSpecErrorCode,\n} from \"./types\";\nimport { MAX_TRIGGER_GROUPS, TurnSpecError } from \"./types\";\n\n/**\n * How many granted-modifier flags a turn may carry in its walk state at once. Each\n * doubles the state space in the worst case, so like {@link MAX_TRIGGER_GROUPS} it\n * is a cost ceiling, not a modelling limit. Flags nothing reads are not counted.\n */\nconst MAX_LIVE_FLAGS = 8;\n\n/** Which payload a rider used when it fired, or `null` while it has not fired. */\nexport type FireMode = \"hit\" | \"crit\" | null;\n\n/**\n * A resolved, validated turn: the ordered steps to walk, plus the trigger\n * groups it tracks. Building this is where every {@link TurnSpecError} is raised,\n * so the walk itself can assume a well-formed plan.\n */\nexport interface TurnPlan {\n steps: readonly Step[];\n /** One entry per distinct `of` set; each holds the step indices that update it. */\n groupCount: number;\n /** Declared attacks only, in order — what `DiceQuery.singles` gets. */\n attackPMFs: readonly PMF[];\n /** Every attack id, in declaration order. */\n attackIds: readonly string[];\n /** Every rider id, in declaration order, including `every-hit` riders. */\n riderIds: readonly string[];\n /** Every substitute id, in declaration order. */\n substituteIds: readonly string[];\n /**\n * Ids of the attack-shaped `any-miss` / `first-miss` riders, in declaration\n * order: a reroll continues the attacks it watches, so `Turn`'s chaining\n * methods add these to a later rider's defaulted `of`. A list of several\n * attacks is not attack-shaped, so it is never among them.\n */\n rerollIds: readonly string[];\n /**\n * Rider or substitute id → its fire slot: the index into the walk's per-state\n * `fired` array. A rider's slot records the mode it fired in; a substitute's\n * records the mode it was spent in. `every-hit` riders have none (see\n * `perHitGroups`); a `first-miss` rider's several steps share one.\n */\n fireSlots: ReadonlyMap<string, number>;\n slotCount: number;\n /**\n * `every-hit` rider id → the group index whose \"something landed\" bit answers\n * P(it fired at least once). Such riders are folded into their sources' slices\n * rather than becoming steps, so they have no step index.\n */\n perHitGroups: ReadonlyMap<string, number>;\n /**\n * The LAST step index (in final walk order) that reads each group, by group\n * index — `steps.length` for a group `perHitGroups` still needs at the final\n * collapse. Once the walk passes a group's last reader, its specific code\n * stops discriminating any future decision, so `Turn.resolve`'s `merge` stops\n * keying on it past that point — the dominant cost fix for a long `dice-match`\n * chain (a group read by exactly one downstream step, the common shape, would\n * otherwise keep splitting states for every step after that single read).\n */\n groupLastReadStep: readonly number[];\n /** Every condition id, in declaration order. */\n conditionIds: readonly string[];\n /**\n * The LAST step index that reads each flag bit, the twin of `groupLastReadStep`:\n * past it the bit no longer changes any decision, so the walk drops it from the\n * merge key. A turn with no conditions has no bits.\n */\n flagLastReadStep: readonly number[];\n}\n\n/** Outcome-labelled sub-mass PMFs for one source, masses summing to 1. */\ninterface SourceSlices {\n hit: PMF;\n crit: PMF;\n miss: PMF;\n}\n\n/**\n * One outcome a step's walk convolves in: which group-state outcome it advances,\n * whether it counts as a dice-match, whether drawing it spends the step's\n * substitute, and the sub-mass PMF itself.\n */\nexport interface Draw {\n outcome: StepOutcome;\n matched: boolean;\n spends: boolean;\n slice: PMF;\n}\n\n/**\n * The draws of one attack step under one state-dependent context. Masses sum to 1.\n *\n * Hit and crit expand into two draws each when the source is match-sliced (a\n * `dice-match` trigger names it) and into more when a substitute's policy splits\n * them into spend and hold parts; every other step walks the same three draws —\n * hit, crit, miss — so turns without those features pay nothing extra.\n */\nexport type StepVariant = readonly Draw[];\n\n/**\n * An above-threshold landing of a substitute's watched step: `hold` keeps the\n * roll, `spend` rerolls it. Which one a variant carries depends on whether a\n * later watched step can still land.\n */\ninterface HoldChoice {\n outcome: \"hit\" | \"crit\";\n matched: boolean;\n hold: Draw[];\n spend: Draw[];\n}\n\n/** `draws` with every pair that advances the walk identically summed into one draw. */\nfunction mergeDraws(draws: readonly Draw[]): Draw[] {\n const merged: Draw[] = [];\n for (const draw of draws) {\n const index = merged.findIndex(\n (other) =>\n other.outcome === draw.outcome &&\n other.matched === draw.matched &&\n other.spends === draw.spends\n );\n if (index === -1) merged.push(draw);\n else merged[index] = { ...merged[index], slice: merged[index].slice.add(draw.slice) };\n }\n return merged;\n}\n\n/** `codes` with `outcome` folded into each group in `updates`. */\nfunction advanced(\n codes: readonly number[],\n updates: readonly number[],\n outcome: StepOutcome,\n matched: boolean\n): number[] {\n const next = [...codes];\n for (const group of updates) next[group] = advance(next[group], outcome, matched);\n return next;\n}\n\n/**\n * One condition, applied at one of its source steps. When the drawn outcome\n * qualifies, the draw splits by `chance`: `grants` are set on one part, `onSave`\n * on the other.\n */\nexport interface GrantApplication {\n /** Index into {@link TurnPlan.conditionIds}. */\n condition: number;\n on: AttackTriggerOn;\n /** Group whose pre-draw code `first-hit` / `first-miss` reads, else -1. */\n reads: number;\n chance: number;\n /** Flag bits set on the `chance` branch. */\n grants: number;\n /** Flag bits set on the other branch. */\n onSave: number;\n /** Non-zero when the application is skipped once all of these bits are set. */\n inForce: number;\n /** Whether a later step reads one of `grants` — what `fireProbability` counts. */\n effective: boolean;\n}\n\n/** Whether `outcome`, drawn in a state whose pre-draw group codes are `codes`, applies `app`. */\nexport function grantApplies(\n app: GrantApplication,\n outcome: StepOutcome,\n codes: readonly number[]\n): boolean {\n switch (app.on) {\n case \"every-hit\":\n return outcome !== \"miss\";\n case \"first-hit\":\n return outcome !== \"miss\" && ((codes[app.reads] >> 2) & 0b11) === FIRST_NONE;\n case \"any-crit\":\n return outcome === \"crit\";\n case \"any-miss\":\n return outcome === \"miss\";\n case \"first-miss\":\n return outcome === \"miss\" && (codes[app.reads] & MISS_BIT) === 0;\n }\n}\n\n/**\n * One step of the turn. A non-empty `variants` ⇒ the step rolls its own attack and\n * advances the groups listed in `updates`; empty ⇒ it is pure damage whose amount\n * depends only on the mode it fires in.\n */\nexport interface Step {\n id: string;\n /** Declared attacks always fire; riders consult their trigger. */\n trigger: Trigger | null;\n /**\n * Every precomputed draw set for this step; index 0 is the plain one. A step with\n * no state dependence has exactly one. Nothing is transformed inside the walk:\n * {@link Step.select} picks one of these at the draw site.\n */\n variants: readonly StepVariant[];\n /**\n * Which variant to draw from, given the state's group codes, its fire slots with\n * this step's own firing already recorded, and its flag bits before this step\n * consumes any.\n */\n select: (codes: readonly number[], fired: readonly FireMode[], flags: number) => number;\n /** Pure-damage payloads, mass 1 each. */\n damage: { hit: PMF; crit: PMF } | null;\n /** Group indices this step's outcome advances. */\n updates: readonly number[];\n /** Group index this step's trigger reads, or -1 for `not-fired` / always-fires. */\n reads: number;\n /** Fire slot this step writes when it fires, or -1 for a declared attack. */\n slot: number;\n /** For `not-fired`: the fire slot of the rider or substitute being negated. */\n negates: number;\n /** Fire slot a `spends` draw sets — the watching substitute's — or -1. */\n spendSlot: number;\n /** `next-attack` flag bits this step reads, and so clears when it rolls. */\n consumes: number;\n /** Conditions this step's outcome may apply, in declaration order. */\n grants: readonly GrantApplication[];\n}\n\n/** Trigger kinds that read a group's accumulated state (as opposed to `not-fired`,\n * which reads another rider's fire/not-fire bit directly). */\nconst READS_GROUP: Record<string, true> = {\n \"first-hit\": true,\n \"any-crit\": true,\n \"any-miss\": true,\n \"first-miss\": true,\n \"every-hit\": true,\n \"dice-match\": true,\n};\n\n/**\n * Triggers a condition accepts. Only `first-hit` and `first-miss` read a group —\n * whether this is the first such outcome — so only they allocate one.\n */\nconst GRANT_TRIGGERS: Record<string, { readsGroup: boolean }> = {\n \"every-hit\": { readsGroup: false },\n \"first-hit\": { readsGroup: true },\n \"any-crit\": { readsGroup: false },\n \"any-miss\": { readsGroup: false },\n \"first-miss\": { readsGroup: true },\n};\n\n/** A read flag's modifiers, as a 3-bit key: which roll context a set of flags selects. */\nconst MOD_ADVANTAGE = 1;\nconst MOD_DISADVANTAGE = 2;\nconst MOD_CRIT_ON_HIT = 4;\n\n/** One granted modifier of one condition, as the plan tracks it. */\ninterface Flag {\n /** For messages: the condition and which of its grants. */\n name: string;\n condition: string;\n grant: GrantSpec;\n /** Steps whose variant it selects; a `next-attack` flag is consumed by each. */\n readers: number[];\n /** The last step that reads it, for a variant or a skip check; -1 if none. */\n lastRead: number;\n /** Its bit in the walk's flag word, or -1 when nothing reads it. */\n bit: number;\n}\n\n/**\n * Decide whether `step` fires in state `codes`, and in which mode.\n *\n * Every group a trigger reads is fully determined before its own step runs\n * (sources always precede dependents), so a trigger can be evaluated once, at\n * its step, and again at the end for `Turn.fireProbability` — both give the\n * same answer. The walk calls this at every step; a threshold policy's\n * look-ahead calls it for the steps still to come.\n */\nexport function fireMode(\n step: Step,\n codes: readonly number[],\n fired: readonly FireMode[]\n): FireMode {\n const trigger = step.trigger;\n if (!trigger) return \"hit\";\n\n if (trigger.on === \"not-fired\") {\n return fired[step.negates] === null ? \"hit\" : null;\n }\n\n const code = codes[step.reads];\n const first = (code >> 2) & 0b11;\n\n switch (trigger.on) {\n case \"first-hit\":\n if (first === FIRST_NONE) return null;\n return first === FIRST_CRIT ? \"crit\" : \"hit\";\n case \"any-crit\":\n return (code & CRIT_BIT) !== 0 ? \"crit\" : null;\n case \"any-miss\":\n return (code & MISS_BIT) !== 0 ? \"hit\" : null;\n case \"first-miss\":\n // One step per watched source, each right after it, sharing one fire slot:\n // the first one to see a miss fires, and the rest see the slot taken.\n return (code & MISS_BIT) !== 0 && fired[step.slot] === null ? \"hit\" : null;\n case \"dice-match\":\n // Crit mode when a crit's dice matched, so damage-shaped rider dice double\n // like every other rider's on a crit. An attack-shaped rider rolls its own\n // attack and reads the mode only as \"it fired\".\n if ((code & MATCH_BIT) === 0) return null;\n return (code & CRIT_MATCH_BIT) !== 0 ? \"crit\" : \"hit\";\n default:\n // `every-hit` never becomes a step — it is folded into its sources' slices.\n return null;\n }\n}\n\nfunction toPMF(\n damage: Damage | readonly Damage[],\n eps: number,\n id = \"\"\n): PMF {\n const parts = Array.isArray(damage) ? damage : [damage as Damage];\n if (parts.length === 0) return PMF.delta(0, eps);\n const pmfs = parts.map((part) => {\n if (part instanceof PMF) return part;\n // `Damage` rules this out, but a consumer deserializing UI state reaches\n // here untyped. Reporting it as a spec error beats a bare TypeError from\n // calling a method that isn't there.\n if (typeof (part as Partial<ToPMF>).toPMF !== \"function\") {\n throw new TurnSpecError(\n \"not-an-attack\",\n id,\n `\"${id}\" is neither a PMF nor a builder with toPMF().`\n );\n }\n // Also checked on the way out: a callable `toPMF` that returns something\n // else would otherwise reach PMF.convolveMany and fail deep inside it.\n const resolved = part.toPMF(eps);\n if (!(resolved instanceof PMF)) {\n throw new TurnSpecError(\n \"not-an-attack\",\n id,\n `\"${id}\" has a toPMF() that did not return a PMF.`\n );\n }\n return resolved;\n });\n return PMF.convolveMany(pmfs, eps);\n}\n\n/**\n * Crit payload for a rider: an explicit `critDamage` wins; otherwise every part with dice\n * doubles them — a builder via `doubleDice()`, which for a pool doubles inside then pools and for\n * a parsed string rewrites its dice terms. A part with no dice to double is added as-is on a crit,\n * like the builder it stands for: a bare `PMF`, a `ToPMF` without `doubleDice()` (an attack or save\n * builder), and a parsed string `doubleDice()` cannot rewrite (an attack or save string, `d4d6`).\n */\nfunction critPMF(rider: Rider, base: PMF, eps: number): PMF {\n if (rider.critDamage !== undefined) return toPMF(rider.critDamage, eps);\n\n const parts = Array.isArray(rider.damage)\n ? rider.damage\n : [rider.damage as Damage];\n if (!parts.some(hasDoubleDice)) return base;\n return PMF.convolveMany(\n parts.map((part) => toPMF(hasDoubleDice(part) ? part.doubleDice() : part, eps)),\n eps\n );\n}\n\n/** A `Damage` whose dice can double: a `RollBuilder`, or a parsed string that is a damage expression. */\nfunction hasDoubleDice(part: Damage): part is Damage & { doubleDice(): Damage } {\n if (part instanceof ParsedRollBuilder) return part.canDoubleDice();\n return \"doubleDice\" in part && typeof part.doubleDice === \"function\";\n}\n\n/** Duck-typed lookup of a `Damage` source's `dice-match` descriptor. Absence\n * (a bare `PMF`, or a `ToPMF` that does not implement {@link HasDiceMatchInfo})\n * is a defined \"no match info\" state — `{ hit: null, crit: null }` — not a crash. */\nfunction diceMatchInfoOf(\n source: Damage,\n eps: number\n): { hit: DiceMatchInfo | null; crit: DiceMatchInfo | null } {\n const capable = source as Partial<HasDiceMatchInfo>;\n if (typeof capable.diceMatchInfo === \"function\") {\n return capable.diceMatchInfo(eps);\n }\n return { hit: null, crit: null };\n}\n\n/**\n * How many parts of a list payload roll their own attack: their PMF carries hit or crit\n * outcomes. A parsed string whose dice can double is damage despite its 'hit' label.\n */\nfunction attackPartCount(damage: readonly Damage[], eps: number, id = \"\"): number {\n return damage.filter((part) => {\n if (part instanceof ParsedRollBuilder && part.canDoubleDice()) return false;\n const labels = toPMF(part, eps, id).outcomes();\n return labels.includes(\"hit\") || labels.includes(\"crit\");\n }).length;\n}\n\n/**\n * Split a source into hit / crit / miss sub-mass PMFs, or return null when the\n * source is not attack-shaped (a plain damage roll is not an attack).\n *\n * The shape comes from the PMF's outcome labels, with one exception for a rider's\n * `damage`: a parsed string whose dice can double is damage, although `parse()` labels\n * its whole PMF 'hit' (so it doubles on a crit and takes `critDamage`, exactly like\n * the equivalent builder). In a list, only the other parts' labels decide. A parsed\n * string with a check stays label-shaped, as do attack builders and labelled PMFs; so\n * does one `canDoubleDice()` rejects for another reason (a dice-valued repeat count, `d4d6`).\n *\n * A list holding more than one attack is not one attack: convolving it averages its\n * attacks' outcome labels, so its slices would describe a single strike landing at the\n * mean per-strike chance. It returns null — its damage is still the exact sum of its\n * parts, but nothing can watch it as a source.\n */\nfunction sliceSource(\n pmf: PMF,\n damage?: Damage | readonly Damage[],\n eps: number = EPS\n): SourceSlices | null {\n const labels = pmf.outcomes();\n let shapeLabels = labels;\n if (damage !== undefined) {\n const parts = Array.isArray(damage) ? damage : [damage as Damage];\n if (Array.isArray(damage) && attackPartCount(parts, eps) > 1) return null;\n const others = parts.filter((part) => !(part instanceof ParsedRollBuilder && part.canDoubleDice()));\n if (others.length < parts.length) {\n shapeLabels = others.length === 0 ? [] : toPMF(others, eps).outcomes();\n }\n }\n if (!shapeLabels.includes(\"hit\") && !shapeLabels.includes(\"crit\")) return null;\n\n const missParts = [\"missNone\", \"missDamage\"]\n .filter((label) => labels.includes(label))\n .map((label) => pmf.filterOutcome(label));\n\n const hit = labels.includes(\"hit\") ? pmf.filterOutcome(\"hit\") : PMF.emptyMass();\n const crit = labels.includes(\"crit\") ? pmf.filterOutcome(\"crit\") : PMF.emptyMass();\n const miss = missParts.length\n ? missParts.reduce((all, part) => all.add(part))\n : PMF.emptyMass();\n\n return { hit, crit, miss };\n}\n\n/**\n * A source's payload split at the base: what transforms and match odds may read,\n * and the `plusSeparateDamage` channels convolved in after them.\n *\n * Duck-typed like {@link diceMatchInfoOf}: an `AttackBuilder` resolves to\n * `hitBase`/`critBase`/`hitSeparate`/`critSeparate`; anything else (a bare `PMF`,\n * a list of payloads) is all base.\n */\ninterface BasePayload {\n /** Unit-mass base payloads, or `null` when the slices already are the base. */\n base: { hit: PMF; crit: PMF } | null;\n /** Unit-mass separate channels; `null` when there are none. */\n separate: { hit: PMF; crit: PMF } | null;\n}\n\nfunction basePayloadOf(source: Damage | readonly Damage[], eps: number): BasePayload {\n const resolvable = source as { resolve?: (eps?: number) => Partial<AttackResolution> };\n if (Array.isArray(source) || typeof resolvable.resolve !== \"function\") {\n return { base: null, separate: null };\n }\n // A `SaveBuilder` resolves too, without the base-payload fields.\n const { hit, hitBase, critBase, hitSeparate, critSeparate } = resolvable.resolve(eps);\n // `hitBase` is the very same PMF as `hit` exactly when there are no channels.\n if (!(hitBase instanceof PMF) || hitBase === hit) return { base: null, separate: null };\n return {\n base: { hit: hitBase, crit: critBase as PMF },\n separate: { hit: hitSeparate as PMF, crit: critSeparate as PMF },\n };\n}\n\n/**\n * The better of `x` and a fresh draw from `base`, for every `x` in `spend` — the\n * spend branch of a threshold policy: P(v) = spend(v)·F(v) + spend(<v)·f(v), with F\n * and f taken from `base` normalized. Returned as its two terms: `kept`, where the\n * original roll stands (ties included), and `beaten`, where the fresh roll won.\n * The dice kept in `kept` are the original ones, so any match status known for\n * `spend` carries over; `beaten` holds fresh dice. When `spend` is all of `base`\n * the sum is `base.maxOfTwo()`. Built from rescaled bins of the two inputs, so\n * outcome labels and attribution survive.\n */\nfunction keepBetterOfFresh(spend: PMF, base: PMF): { kept: PMF; beaten: PMF } {\n const baseMass = base.mass();\n const cdf = new Map<number, number>();\n const spendBelow = new Map<number, number>();\n let running = 0;\n let spendRunning = 0;\n for (const value of base.support()) {\n spendBelow.set(value, spendRunning);\n running += base.pAt(value) / baseMass;\n spendRunning += spend.pAt(value);\n cdf.set(value, running);\n }\n const [kept] = spend.splitByFactor((value) => cdf.get(value) ?? 0);\n const [beaten] = base.splitByFactor((value) => (spendBelow.get(value) ?? 0) / baseMass);\n return { kept, beaten };\n}\n\n/** A declared attack, unwrapped. */\nfunction attackEntry(entry: Attack, index: number): { id: string; tag?: string; source: Damage } {\n const id = `attack ${index + 1}`;\n // A wrapper with no source falls through as a would-be source, so it fails\n // `not-an-attack` in toPMF rather than as a bare TypeError.\n if (!(\"source\" in entry) || entry.source === undefined) return { id, source: entry as Damage };\n return { id: entry.id ?? id, tag: entry.tag, source: entry.source };\n}\n\nexport function buildPlan(spec: TurnSpec, eps: number = EPS): TurnPlan {\n const fail = (code: TurnSpecErrorCode, id: string, message: string): never => {\n throw new TurnSpecError(code, id, message);\n };\n\n const riders = spec.riders ?? [];\n const substitutes: readonly SubstituteSpec[] = spec.substitutes ?? [];\n const conditions: readonly ConditionSpec[] = spec.conditions ?? [];\n\n // --- attacks -------------------------------------------------------------\n const attackIds: string[] = [];\n const attackSources: Damage[] = [];\n const attackPMFs: PMF[] = [];\n const attackSlices: (SourceSlices | null)[] = [];\n const attackIdsByTag = new Map<string, string[]>();\n\n spec.attacks.forEach((entry, index) => {\n const { id, tag, source } = attackEntry(entry, index);\n const pmf = toPMF(source, eps, id);\n attackIds.push(id);\n attackSources.push(source);\n attackPMFs.push(pmf);\n attackSlices.push(sliceSource(pmf));\n if (tag !== undefined) {\n const tagged = attackIdsByTag.get(tag);\n if (tagged) tagged.push(id);\n else attackIdsByTag.set(tag, [id]);\n }\n });\n\n // --- ids -----------------------------------------------------------------\n const riderIds = riders.map((rider, index) => rider.id ?? `rider ${index + 1}`);\n const substituteIds = substitutes.map(\n (substitute, index) => substitute.id ?? `substitute ${index + 1}`\n );\n const conditionIds = conditions.map((condition, index) => condition.id ?? `condition ${index + 1}`);\n const seen = new Set<string>();\n for (const id of [...attackIds, ...riderIds, ...substituteIds, ...conditionIds]) {\n if (seen.has(id)) fail(\"duplicate-id\", id, `Duplicate id \"${id}\".`);\n seen.add(id);\n }\n\n riders.forEach((rider, index) => {\n // Every trigger but `not-fired` reads a group, so READS_GROUP names them all; anything else\n // would build a step `fireMode` never fires.\n if (rider.on !== \"not-fired\" && !Object.prototype.hasOwnProperty.call(READS_GROUP, rider.on)) {\n fail(\n \"unsupported-trigger\",\n riderIds[index],\n `Rider \"${riderIds[index]}\" triggers on \"${String(rider.on)}\", which is not a trigger. Use first-hit, any-crit, any-miss, first-miss, every-hit, dice-match or not-fired.`\n );\n }\n if (isTransform(rider.damage)) {\n fail(\n \"unsupported-trigger\",\n riderIds[index],\n `Rider \"${riderIds[index]}\" carries a transform on \"${rider.on}\". A transform is only accepted by onFirstHit.`\n );\n }\n const parts: readonly unknown[] = Array.isArray(rider.damage) ? rider.damage : [rider.damage];\n if (parts.some(isGrant)) {\n fail(\n \"unsupported-trigger\",\n riderIds[index],\n `Rider \"${riderIds[index]}\" carries a grant on \"${rider.on}\". A grant is only accepted by onEveryHit, onFirstHit and onAnyCrit.`\n );\n }\n });\n conditions.forEach((condition, index) => {\n const id = conditionIds[index];\n if (!GRANT_TRIGGERS[condition.on]) {\n fail(\n \"unsupported-trigger\",\n id,\n `Condition \"${id}\" triggers on \"${condition.on}\"; a condition reads every-hit, first-hit, any-crit, first-miss or any-miss.`\n );\n }\n const { chance } = condition;\n if (chance !== undefined && !(chance >= 0 && chance <= 1)) {\n throw new RangeError(`Condition \"${id}\" needs a chance in [0, 1], got ${chance}.`);\n }\n if (condition.onSave !== undefined && chance === undefined) {\n throw new Error(\n `Condition \"${id}\" has onSave grants but no save or chance: there is no other branch to apply them on.`\n );\n }\n for (const grant of [...condition.grants, ...(condition.onSave ?? [])]) {\n if (!grant.advantage && !grant.disadvantage && !grant.critOnHit) {\n throw new Error(`Condition \"${id}\" has a grant that sets no modifier.`);\n }\n if (grant.until !== \"next-attack\" && grant.until !== \"end-of-turn\") {\n throw new Error(\n `Condition \"${id}\" has a grant lasting \"${String(grant.until)}\"; use \"next-attack\" or \"end-of-turn\".`\n );\n }\n }\n });\n substitutes.forEach((substitute, index) => {\n const id = substituteIds[index];\n if (substitute.on !== \"first-hit\" || substitute.substitute !== \"reroll-keep-higher\") {\n fail(\n \"unsupported-trigger\",\n id,\n `Substitute \"${id}\" must be { on: \"first-hit\", substitute: \"reroll-keep-higher\" }.`\n );\n }\n if (substitute.policy?.kind === \"optimal\") {\n fail(\n \"unsupported-policy\",\n id,\n `Substitute \"${id}\" asks for the optimal policy, which this release does not support.`\n );\n }\n });\n\n const attackIndexById = new Map(attackIds.map((id, index) => [id, index]));\n const riderIndexById = new Map(riderIds.map((id, index) => [id, index]));\n const substituteIndexById = new Map(substituteIds.map((id, index) => [id, index]));\n const conditionIdSet = new Set(conditionIds);\n\n // Riders' own PMFs and slices, built on first use: validation, `rerollIds` and\n // the steps all need them, and resolving a builder is not free.\n const riderPMFs: (PMF | undefined)[] = [];\n const riderSlices: (SourceSlices | null | undefined)[] = [];\n const riderPMF = (index: number): PMF => {\n riderPMFs[index] ??= toPMF(riders[index].damage, eps, riderIds[index]);\n return riderPMFs[index];\n };\n const slicesOf = (sourceId: string): SourceSlices | null => {\n const attackIndex = attackIndexById.get(sourceId);\n if (attackIndex !== undefined) return attackSlices[attackIndex];\n const riderIndex = riderIndexById.get(sourceId) as number;\n if (riderSlices[riderIndex] === undefined) {\n riderSlices[riderIndex] = sliceSource(riderPMF(riderIndex), riders[riderIndex].damage, eps);\n }\n return riderSlices[riderIndex] as SourceSlices | null;\n };\n /**\n * Per rider: whether its payload is a list of more than one attack (a flurry's two\n * strikes). It rolls attacks, so it crits on its own terms and reads grants, but it\n * is no single source: nothing can watch it, and it never joins a default `of`.\n */\n const attackLists = riders.map(\n (rider, index) =>\n Array.isArray(rider.damage) && attackPartCount(rider.damage, eps, riderIds[index]) > 1\n );\n /** The damage a source id rolls: a declared attack's source or a rider's payload. */\n const damageOf = (sourceId: string): Damage | readonly Damage[] => {\n const attackIndex = attackIndexById.get(sourceId);\n if (attackIndex !== undefined) return attackSources[attackIndex];\n return riders[riderIndexById.get(sourceId) as number].damage;\n };\n const matchInfoOf = (\n sourceId: string\n ): { hit: DiceMatchInfo | null; crit: DiceMatchInfo | null } => {\n const damage = damageOf(sourceId);\n return Array.isArray(damage)\n ? { hit: null, crit: null }\n : diceMatchInfoOf(damage as Damage, eps);\n };\n\n // --- references ----------------------------------------------------------\n /**\n * Resolves an `of` list — attack ids, rider ids, or declaration tags — to the\n * source ids it names, and checks each can be watched. Shared by riders and\n * substitutes, so both resolve, expand and fail identically.\n */\n const resolveSources = (\n ownerId: string,\n of: readonly string[],\n watchesDice: boolean\n ): string[] => {\n const sourceIds: string[] = [];\n for (const entry of of) {\n if (attackIndexById.has(entry) || riderIndexById.has(entry)) {\n sourceIds.push(entry);\n } else if (substituteIndexById.has(entry) || conditionIdSet.has(entry)) {\n const kind = substituteIndexById.has(entry) ? \"substitute\" : \"condition\";\n fail(\n \"not-an-attack\",\n entry,\n `\"${ownerId}\" watches \"${entry}\", a ${kind}. A ${kind} changes ${kind === \"substitute\" ? \"damage\" : \"later attack rolls\"}; it rolls no attack to watch.`\n );\n } else if (attackIdsByTag.has(entry)) {\n sourceIds.push(...(attackIdsByTag.get(entry) as string[]));\n } else {\n fail(\"unknown-id\", entry, `\"${ownerId}\" depends on \"${entry}\", which is not in this turn.`);\n }\n }\n // Deduplicated, so `of: [\"a\", \"a\"]` shares a trigger group with `of: [\"a\"]`\n // instead of consuming a second slot and tripping `too-many-groups` on a\n // turn that is really tracking one source set. Repeats are otherwise\n // harmless: advancing a group twice for one outcome is idempotent.\n const unique = [...new Set(sourceIds)];\n if (unique.length === 0) {\n fail(\"unknown-id\", ownerId, `\"${ownerId}\" has no sources.`);\n }\n for (const sourceId of unique) {\n if (sourceId === ownerId) {\n fail(\"self-reference\", ownerId, `\"${ownerId}\" cannot depend on itself.`);\n }\n const riderIndex = riderIndexById.get(sourceId);\n if (riderIndex !== undefined && riders[riderIndex].on === \"every-hit\") {\n fail(\n \"not-an-attack\",\n sourceId,\n `\"${ownerId}\" triggers on \"${sourceId}\", an every-hit rider. Those are folded into their own sources rather than resolved separately, so they cannot be triggered on — point at the attacks instead.`\n );\n }\n if (riderIndex !== undefined && attackLists[riderIndex]) {\n fail(\n \"not-an-attack\",\n sourceId,\n `\"${ownerId}\" watches \"${sourceId}\", a list of several attacks. A list rider resolves as one payload, not as attacks that each land, so it cannot be watched. Declare each attack as its own rider with its own id, and name those.`\n );\n }\n const slices = slicesOf(sourceId);\n if (!slices) {\n fail(\n \"not-an-attack\",\n sourceId,\n `\"${ownerId}\" triggers on \"${sourceId}\", which has no hit/crit outcomes.`\n );\n } else if (watchesDice) {\n const info = matchInfoOf(sourceId);\n const missingHit = slices.hit.mass() > 0 && info.hit === null;\n const missingCrit = slices.crit.mass() > 0 && info.crit === null;\n if (missingHit || missingCrit) {\n fail(\n \"no-dice-descriptor\",\n sourceId,\n `Rider \"${ownerId}\" reads \"${sourceId}\" for \"dice-match\", but \"${sourceId}\" has no dice descriptor to match against — a bare PMF, a string-parsed expression, or a keep()/bestOf() pool (ambiguous \"the dice\" under crit doubling) cannot be matched.`\n );\n }\n }\n }\n return unique;\n };\n\n // Attack-shaped `any-miss` / `first-miss` riders: a reroll continues the attacks it\n // watches, so an omitted `of` includes it (see `Trigger`).\n const isReroll = riders.map(\n (rider, index) =>\n (rider.on === \"any-miss\" || rider.on === \"first-miss\") && slicesOf(riderIds[index]) !== null\n );\n const rerollIds = riderIds.filter((_, index) => isReroll[index]);\n /**\n * An omitted `of`: every declared attack, plus the rerolls among the first `before`\n * riders — for a rider, those listed before it, as `Turn`'s chaining methods snapshot.\n */\n const defaultOf = (before: number): string[] => [\n ...attackIds,\n ...riderIds.filter((_, index) => index < before && isReroll[index]),\n ];\n\n // Nodes of the dependency graph: riders first, then substitutes.\n const riderCount = riders.length;\n const nodeIds = [...riderIds, ...substituteIds];\n const nodeIndexById = new Map(nodeIds.map((id, index) => [id, index]));\n\n // Per rider: the source ids a trigger watches, or for `not-fired` the negated\n // node's id. Per substitute: the source ids it watches.\n const sourceIdsByNode: string[][] = [\n ...riders.map((rider, index) => {\n const id = riderIds[index];\n if (rider.on !== \"not-fired\") {\n return resolveSources(id, rider.of ?? defaultOf(index), rider.on === \"dice-match\");\n }\n const target = rider.of;\n if (target === id) {\n fail(\"self-reference\", id, `Rider \"${id}\" cannot depend on itself.`);\n }\n const targetIndex = nodeIndexById.get(target);\n if (targetIndex === undefined) {\n fail(\n \"unknown-id\",\n target,\n `Rider \"${id}\" negates \"${target}\", which is not a rider or substitute in this turn.`\n );\n }\n if (targetIndex! < riderCount && riders[targetIndex!].on === \"every-hit\") {\n fail(\n \"not-an-attack\",\n target,\n `Rider \"${id}\" negates \"${target}\", an every-hit rider, which can fire more than once and so has no single \"did not fire\" branch.`\n );\n }\n return [target];\n }),\n ...substitutes.map((substitute, index) =>\n resolveSources(substituteIds[index], substitute.of ?? defaultOf(riderCount), false)\n ),\n ];\n // Per condition: the source ids whose outcomes apply its grants.\n const conditionSources = conditions.map((condition, index) =>\n resolveSources(conditionIds[index], condition.of ?? defaultOf(riderCount), false)\n );\n\n // --- ordering ------------------------------------------------------------\n // A node may only reference nodes that resolve before it.\n const order: number[] = [];\n const visiting = new Set<number>();\n const done = new Set<number>();\n\n const visit = (node: number): void => {\n if (done.has(node)) return;\n const id = nodeIds[node];\n if (visiting.has(node)) {\n fail(\"cycle\", id, `\"${id}\" is part of a dependency cycle.`);\n }\n visiting.add(node);\n for (const sourceId of sourceIdsByNode[node]) {\n const dependency = nodeIndexById.get(sourceId);\n if (dependency !== undefined) visit(dependency);\n }\n visiting.delete(node);\n done.add(node);\n order.push(node);\n };\n nodeIds.forEach((_, node) => visit(node));\n\n // --- substitutes: one transform per source ---------------------------------\n // Overlapping `of` sets would transform the same slice twice — max-of-four, not\n // max-of-two — so they are refused rather than applied in sequence.\n const substituteBySource = new Map<string, number>();\n substitutes.forEach((_, index) => {\n for (const sourceId of sourceIdsByNode[riderCount + index]) {\n const other = substituteBySource.get(sourceId);\n if (other !== undefined) {\n fail(\n \"duplicate-substitute\",\n substituteIds[index],\n `Substitutes \"${substituteIds[other]}\" and \"${substituteIds[index]}\" both watch \"${sourceId}\". One transform per source: two would apply to the same payload.`\n );\n }\n substituteBySource.set(sourceId, index);\n }\n });\n\n // --- groups --------------------------------------------------------------\n // One group per distinct source set. Sharing matters: sneak attack and Fire's\n // Burn over the same two daggers are ONE group, so they resolve jointly.\n // Substitutes allocate none: each owns a fire slot instead.\n const groupIndexByKey = new Map<string, number>();\n const groupSources: string[][] = [];\n const groupOf = (sourceIds: readonly string[]): number => {\n // JSON, not a delimiter join: an id is consumer-supplied, and a delimiter\n // that can appear inside one makes the encoding non-injective, so two\n // distinct source sets could share a group.\n const key = JSON.stringify([...sourceIds].sort());\n const existing = groupIndexByKey.get(key);\n if (existing !== undefined) return existing;\n if (groupSources.length >= MAX_TRIGGER_GROUPS) {\n fail(\n \"too-many-groups\",\n key,\n `A turn may track at most ${MAX_TRIGGER_GROUPS} distinct trigger source sets.`\n );\n }\n const index = groupSources.length;\n groupIndexByKey.set(key, index);\n groupSources.push([...sourceIds]);\n return index;\n };\n\n const readsByRider = new Map<number, number>();\n const perHitGroups = new Map<string, number>();\n for (const node of order) {\n if (node >= riderCount) continue;\n const rider = riders[node];\n if (!READS_GROUP[rider.on]) continue;\n const group = groupOf(sourceIdsByNode[node]);\n readsByRider.set(node, group);\n if (rider.on === \"every-hit\") perHitGroups.set(riderIds[node], group);\n }\n // A condition reuses the group its `of` already has: a first-hit grant and a first-hit\n // rider over the same attacks share one. Only first-hit / first-miss read it.\n const conditionGroups = conditions.map((condition, index) =>\n GRANT_TRIGGERS[condition.on].readsGroup ? groupOf(conditionSources[index]) : -1\n );\n\n // --- fire slots ----------------------------------------------------------\n const fireSlots = new Map<string, number>();\n riders.forEach((rider, index) => {\n if (rider.on !== \"every-hit\") fireSlots.set(riderIds[index], fireSlots.size);\n });\n for (const id of substituteIds) fireSlots.set(id, fireSlots.size);\n\n // --- sequence --------------------------------------------------------------\n // Declared attacks in order, then riders in dependency order — except that a\n // `first-miss` rider gets one slot directly after each step of every source it\n // watches, so its reroll lands where the miss happened.\n type Entry = { id: string; attack: number; rider: number };\n const sequence: Entry[] = attackIds.map((id, index) => ({ id, attack: index, rider: -1 }));\n for (const node of order) {\n if (node >= riderCount) continue;\n const rider = riders[node];\n if (rider.on === \"every-hit\" || rider.on === \"first-miss\") continue;\n sequence.push({ id: riderIds[node], attack: -1, rider: node });\n }\n for (const node of order) {\n if (node >= riderCount || riders[node].on !== \"first-miss\") continue;\n const watched = new Set(sourceIdsByNode[node]);\n const slot: Entry = { id: riderIds[node], attack: -1, rider: node };\n for (let position = sequence.length - 1; position >= 0; position--) {\n if (!watched.has(sequence[position].id)) continue;\n // After the source, and after any first-miss slots already placed behind it.\n let after = position + 1;\n while (after < sequence.length && riders[sequence[after].rider]?.on === \"first-miss\") after++;\n sequence.splice(after, 0, slot);\n }\n }\n\n // --- flags -------------------------------------------------------------------\n // One flag per granted modifier: each of a condition's grants and each of its\n // onSave grants, keyed by (condition, grant) rather than by step, so `next-attack`\n // and `end-of-turn` are distinct flags even for the same modifier. A flag read by\n // no later step gets no bit at all: setting it could change nothing.\n // A list of several attacks rolls attacks too, so a grant does not skip it silently.\n const rollsAttack = sequence.map((entry) =>\n entry.attack !== -1\n ? attackSlices[entry.attack] !== null\n : slicesOf(entry.id) !== null || attackLists[entry.rider]\n );\n const conditionFlags = conditions.map((condition, index) => {\n const id = conditionIds[index];\n const sources = new Set(conditionSources[index]);\n const applyAt = sequence.flatMap((entry, position) => (sources.has(entry.id) ? [position] : []));\n const flagOf = (grant: GrantSpec, label: string): Flag => {\n const targets = grant.to === undefined ? null : new Set(resolveSources(id, grant.to, false));\n // Every attack roll after the condition's first source, attack-shaped riders included.\n const readers = sequence.flatMap((entry, position) =>\n position > applyAt[0] && rollsAttack[position] && (targets === null || targets.has(entry.id))\n ? [position]\n : []\n );\n if (targets !== null && readers.length === 0) {\n fail(\n \"unknown-id\",\n id,\n `Condition \"${id}\"'s ${label} is read by ${grant.to?.map((to) => `\"${to}\"`).join(\", \")}, none of which rolls an attack after \"${sequence[applyAt[0]].id}\".`\n );\n }\n return {\n name: `\"${id}\" ${label}`,\n condition: id,\n grant,\n readers,\n lastRead: readers.length ? readers[readers.length - 1] : -1,\n bit: -1,\n };\n };\n const main = condition.grants.map((grant, grantIndex) => flagOf(grant, `grant ${grantIndex + 1}`));\n const onSave = (condition.onSave ?? []).map((grant, grantIndex) =>\n flagOf(grant, `onSave grant ${grantIndex + 1}`)\n );\n // An application whose grants are all end-of-turn and all in force is skipped,\n // onSave with it. With an onSave to skip, that check reads the grants at every source.\n const lastingOnly = main.length > 0 && main.every((flag) => flag.grant.until === \"end-of-turn\");\n if (lastingOnly && onSave.length > 0) {\n for (const flag of main) flag.lastRead = Math.max(flag.lastRead, applyAt[applyAt.length - 1]);\n }\n return { main, onSave, lastingOnly, applyAt };\n });\n\n const liveFlags = conditionFlags.flatMap(({ main, onSave }) =>\n [...main, ...onSave].filter((flag) => flag.lastRead !== -1)\n );\n if (liveFlags.length > MAX_LIVE_FLAGS) {\n fail(\n \"too-many-flags\",\n liveFlags[MAX_LIVE_FLAGS].condition,\n `A turn may carry at most ${MAX_LIVE_FLAGS} granted modifiers that a later attack reads; this one has ${liveFlags.length}: ${liveFlags.map((flag) => flag.name).join(\", \")}.`\n );\n }\n liveFlags.forEach((flag, bit) => {\n flag.bit = bit;\n });\n const bitsOf = (flags: readonly Flag[]): number =>\n flags.reduce((mask, flag) => (flag.bit === -1 ? mask : mask | (1 << flag.bit)), 0);\n const modifiersOfBit = liveFlags.map(\n ({ grant }) =>\n (grant.advantage ? MOD_ADVANTAGE : 0) |\n (grant.disadvantage ? MOD_DISADVANTAGE : 0) |\n (grant.critOnHit ? MOD_CRIT_ON_HIT : 0)\n );\n const readMaskAt = new Array<number>(sequence.length).fill(0);\n const consumesAt = new Array<number>(sequence.length).fill(0);\n for (const flag of liveFlags) {\n for (const reader of flag.readers) {\n readMaskAt[reader] |= 1 << flag.bit;\n if (flag.grant.until === \"next-attack\") consumesAt[reader] |= 1 << flag.bit;\n }\n }\n const grantsAt: GrantApplication[][] = sequence.map(() => []);\n conditions.forEach((condition, index) => {\n const { main, onSave, lastingOnly, applyAt } = conditionFlags[index];\n const grants = bitsOf(main);\n const onSaveBits = bitsOf(onSave);\n if ((grants | onSaveBits) === 0) return;\n for (const position of applyAt) {\n grantsAt[position].push({\n condition: index,\n on: condition.on,\n reads: conditionGroups[index],\n chance: condition.chance ?? 1,\n grants,\n onSave: onSaveBits,\n inForce: lastingOnly ? grants : 0,\n effective: main.some((flag) => flag.readers.some((reader) => reader > position)),\n });\n }\n });\n\n // --- per-hit fold ----------------------------------------------------------\n // `every-hit` riders are not steps: they are convolved into each source's own\n // hit/crit slices, so one hit means one application with no extra state.\n const perHitBySource = new Map<string, { hit: PMF; crit: PMF }[]>();\n for (const node of order) {\n if (node >= riderCount) continue;\n const rider = riders[node];\n if (rider.on !== \"every-hit\") continue;\n const hit = toPMF(rider.damage, eps, riderIds[node]);\n const payload = { hit, crit: critPMF(rider, hit, eps) };\n for (const sourceId of sourceIdsByNode[node]) {\n const existing = perHitBySource.get(sourceId);\n if (existing) existing.push(payload);\n else perHitBySource.set(sourceId, [payload]);\n }\n }\n const fold = (sourceId: string, outcome: \"hit\" | \"crit\", slice: PMF): PMF => {\n let folded = slice;\n for (const payload of perHitBySource.get(sourceId) ?? []) {\n folded = folded.convolve(payload[outcome], eps, true);\n }\n return folded;\n };\n\n // --- draws -----------------------------------------------------------------\n const matchNeeded = new Set<string>();\n riders.forEach((rider, index) => {\n if (rider.on === \"dice-match\") for (const id of sourceIdsByNode[index]) matchNeeded.add(id);\n });\n\n const basePayloads = new Map<string, BasePayload>();\n const basePayload = (sourceId: string): BasePayload => {\n let payload = basePayloads.get(sourceId);\n if (!payload) {\n payload = basePayloadOf(damageOf(sourceId), eps);\n basePayloads.set(sourceId, payload);\n }\n return payload;\n };\n\n /**\n * The draws for `sourceId`: hit and crit, each split by exact match probability\n * when a `dice-match` trigger reads it, and into spend/hold parts under a\n * substitute's `policy`; then the separate channels; then the `every-hit` fold;\n * then miss. Every split happens on the base payload, so neither the match odds\n * nor the transform ever see a separate channel's or the fold's dice.\n *\n * `fixed` draws belong to every variant. Each of `choices` is an above-threshold\n * landing that is held or spent depending on the walk state, so a variant takes\n * either its `hold` or its `spend` draws.\n */\n const drawsFor = (\n sourceId: string,\n slices: SourceSlices,\n policy: SubstitutePolicy | null\n ): { fixed: Draw[]; choices: HoldChoice[] } => {\n const match = matchNeeded.has(sourceId) ? matchInfoOf(sourceId) : null;\n // With neither split, the slices already carry the channels — draw them as they are.\n const payload = policy || match ? basePayload(sourceId) : null;\n const fixed: Draw[] = [];\n const choices: HoldChoice[] = [];\n for (const outcome of [\"hit\", \"crit\"] as const) {\n const slice = slices[outcome];\n const mass = slice.mass();\n const separate = payload?.separate?.[outcome];\n // The base payload as an outcome-labelled slice of this outcome's mass.\n const base =\n payload?.base && mass > 0\n ? Mixture.mix([[outcome, payload.base[outcome], 1]], eps).scaleMass(mass)\n : slice;\n const info = match?.[outcome] ?? null;\n const finish = (part: PMF): PMF =>\n fold(sourceId, outcome, separate ? part.convolve(separate, eps, true) : part);\n /** `part`'s draws: split by match odds on its value, unless its dice's match status is `known`. */\n const drawsOf = (part: PMF, spends: boolean, known?: boolean): Draw[] => {\n if (!info || known !== undefined) {\n return [{ outcome, matched: known ?? false, spends, slice: finish(part) }];\n }\n const [matched, unmatched] = part.splitByFactor(\n (damage) => info.matchProbabilityByDamage.get(damage) ?? 0\n );\n return [\n { outcome, matched: true, spends, slice: finish(matched) },\n { outcome, matched: false, spends, slice: finish(unmatched) },\n ];\n };\n\n if (!policy || mass <= 0) {\n fixed.push(...drawsOf(base, false));\n continue;\n }\n if (policy.kind !== \"below\") {\n fixed.push(...drawsOf(base.maxOfTwo(), true));\n continue;\n }\n // The threshold reads the base payload total as it stands — dice plus the\n // payload's own flat bonus — so each mode splits on its own values.\n const threshold = policy[outcome];\n const [below, above] = base.splitByFactor((value) => (value < threshold ? 1 : 0));\n if (below.mass() > 0) {\n const { kept, beaten } = keepBetterOfFresh(below, base);\n fixed.push(...drawsOf(kept.add(beaten), true));\n }\n // Holding keeps these very dice, so with match odds in play their match\n // status is part of what a later step can still do with them.\n const heldParts: [boolean, PMF][] = info\n ? above\n .splitByFactor((damage) => info.matchProbabilityByDamage.get(damage) ?? 0)\n .map((part, index): [boolean, PMF] => [index === 0, part])\n : [[false, above]];\n for (const [matched, part] of heldParts) {\n if (part.mass() <= 0) continue;\n const { kept, beaten } = keepBetterOfFresh(part, base);\n choices.push({\n outcome,\n matched,\n hold: drawsOf(part, false, matched),\n spend: info\n ? [...drawsOf(kept, true, matched), ...drawsOf(beaten, true)]\n : drawsOf(kept.add(beaten), true, false),\n });\n }\n }\n fixed.push({ outcome: \"miss\", matched: false, spends: false, slice: slices.miss });\n return { fixed, choices };\n };\n\n // --- steps -----------------------------------------------------------------\n const updatesById = new Map<string, number[]>();\n groupSources.forEach((sourceIds, groupIndex) => {\n for (const sourceId of sourceIds) {\n const existing = updatesById.get(sourceId);\n if (existing) existing.push(groupIndex);\n else updatesById.set(sourceId, [groupIndex]);\n }\n });\n\n /**\n * Per substitute: can a step it watches still land, from step `from` on, in the\n * state (`codes`, `fired`)? Exact reachability over the walk's own transitions —\n * every positive-mass draw of each later step's plain variant — memoized on the\n * state. It reads the same group codes and fire slots the walk keys on, so a\n * threshold never holds for a watched step that can no longer fire.\n */\n const steps: Step[] = [];\n const laterLandings = substitutes.map((_, substitute) => {\n const watched = new Set(sourceIdsByNode[riderCount + substitute]);\n let lastWatched = -1;\n sequence.forEach((entry, stepIndex) => {\n if (watched.has(entry.id)) lastWatched = stepIndex;\n });\n const memo = new Map<string, boolean>();\n const canLand = (from: number, codes: readonly number[], fired: readonly FireMode[]): boolean => {\n if (from > lastWatched) return false;\n const key = `${from}|${codes.join(\",\")}|${fired.map((mode) => (mode === null ? \"-\" : \"+\")).join(\"\")}`;\n const known = memo.get(key);\n if (known !== undefined) return known;\n const step = steps[from];\n const mode = fireMode(step, codes, fired);\n let result: boolean;\n if (mode === null) {\n result = canLand(from + 1, codes, fired);\n } else {\n const next = step.slot === -1 ? fired : fired.map((slot, index) => (index === step.slot ? mode : slot));\n result =\n step.variants.length === 0\n ? canLand(from + 1, codes, next)\n : step.variants[0].some(\n (draw) =>\n draw.slice.mass() > eps &&\n ((draw.outcome !== \"miss\" && watched.has(step.id)) ||\n canLand(from + 1, advanced(codes, step.updates, draw.outcome, draw.matched), next))\n );\n }\n memo.set(key, result);\n return result;\n };\n return canLand;\n });\n\n const plainSelect = (): number => 0;\n sequence.forEach((entry, stepIndex) => {\n const rider = entry.rider === -1 ? null : riders[entry.rider];\n const slices =\n entry.attack !== -1\n ? (attackSlices[entry.attack] ?? {\n hit: attackPMFs[entry.attack],\n crit: PMF.emptyMass(),\n miss: PMF.emptyMass(),\n })\n : slicesOf(entry.id);\n\n if (rider && (slices || attackLists[entry.rider]) && rider.critDamage !== undefined) {\n // An attack-shaped rider rolls its own d20 and crits on its own terms —\n // a bonus attack triggered by a crit does not deal doubled dice — so\n // there is nothing for `critDamage` to mean. Silently dropping it would\n // hide a real misunderstanding.\n fail(\n \"unused-crit-damage\",\n entry.id,\n `Rider \"${entry.id}\" rolls its own attack, so its critDamage would never be used. Remove it, or pass plain damage dice instead.`\n );\n }\n\n const readMask = readMaskAt[stepIndex];\n if (rider?.on === \"any-miss\" && slices) {\n // Its step runs after every declared attack, but in play the reroll happens right\n // after the miss: it would read, or grant to, the wrong attack rolls.\n const grantSource = conditionSources.some((sources) => sources.includes(entry.id));\n if (readMask !== 0 || grantSource) {\n fail(\n \"unsupported-trigger\",\n entry.id,\n `Rider \"${entry.id}\" rerolls on any miss and ${readMask !== 0 ? \"reads a granted modifier\" : \"applies a condition's grants\"}. An any-miss rider resolves after every declared attack, so it would see the grants in force at the end of the turn instead of right after the miss. Use onFirstMiss (on: \"first-miss\"), which resolves directly after the attack that missed.`\n );\n }\n }\n\n const updates = updatesById.get(entry.id) ?? [];\n let variants: StepVariant[] = [];\n let select: Step[\"select\"] = plainSelect;\n const substitute = slices ? substituteBySource.get(entry.id) : undefined;\n const spendSlot =\n substitute === undefined ? -1 : (fireSlots.get(substituteIds[substitute]) as number);\n\n /**\n * The plain draws and, under a substitute, one variant per hold mask (variant 1 +\n * mask: bit i set ⇔ choice i is held; only a threshold policy has choices), for\n * one roll context's slices.\n */\n const table = (\n contextSlices: SourceSlices\n ): { variants: StepVariant[]; select: (codes: readonly number[], fired: readonly FireMode[]) => number } => {\n const plain = drawsFor(entry.id, contextSlices, null).fixed;\n if (substitute === undefined) return { variants: [plain], select: plainSelect };\n const { fixed, choices } = drawsFor(\n entry.id,\n contextSlices,\n substitutes[substitute].policy ?? { kind: \"always\" }\n );\n const own: StepVariant[] = [plain];\n for (let mask = 0; mask < 1 << choices.length; mask++) {\n own.push(\n mergeDraws([\n ...fixed,\n ...choices.flatMap((choice, bit) => (mask & (1 << bit) ? choice.hold : choice.spend)),\n ])\n );\n }\n const canLand = laterLandings[substitute];\n return {\n variants: own,\n // Hold an above-threshold landing only while a later watched step can still\n // land in the state holding leaves: this step's outcome recorded, the\n // substitute unspent. Otherwise holding is worth nothing, so it spends.\n select: (codes, fired) => {\n if (fired[spendSlot] !== null) return 0;\n let mask = 0;\n choices.forEach((choice, bit) => {\n if (canLand(stepIndex + 1, advanced(codes, updates, choice.outcome, choice.matched), fired)) {\n mask |= 1 << bit;\n }\n });\n return 1 + mask;\n },\n };\n };\n\n if (slices && readMask === 0) {\n ({ variants, select } = table(slices));\n } else if (slices) {\n // Read flags select a roll context: the source re-derived through `withCheck` with\n // the granted modifiers combined into its own roll type. One table per distinct\n // resolved context the read flags can reach, not per flag set.\n const source = damageOf(entry.id);\n const rebindable = source as { withCheck?: (fn: (check: Check) => Check) => Damage };\n /** The source re-derived under modifier key `key`, and its resolved context. */\n const rederive = (key: number): { source: Damage; signature: string } => {\n let signature = \"\";\n const rederived = (rebindable as Required<typeof rebindable>).withCheck((base) => {\n const next: Check = {\n ...base,\n rollType: combine(base.rollType, base.advantageDice, {\n advantage: (key & MOD_ADVANTAGE) !== 0,\n disadvantage: (key & MOD_DISADVANTAGE) !== 0,\n }).rollType,\n critOnHit: base.critOnHit || (key & MOD_CRIT_ON_HIT) !== 0,\n };\n signature = `${next.rollType}|${next.critOnHit}`;\n return next;\n });\n return { source: rederived, signature };\n };\n let plain: string | undefined;\n if (!Array.isArray(source) && typeof rebindable.withCheck === \"function\") {\n try {\n plain = rederive(0).signature;\n } catch {\n plain = undefined;\n }\n }\n if (plain === undefined) {\n fail(\n \"no-rebindable-source\",\n entry.id,\n `\"${entry.id}\" reads a granted modifier, but it has no attack check to re-derive (an attack that always hits, a bare PMF or a list of payloads). Scope the grant with \\`to\\`.`\n );\n }\n let reachable = [0];\n modifiersOfBit.forEach((modifiers, bit) => {\n if (readMask & (1 << bit)) {\n reachable = [...new Set([...reachable, ...reachable.map((key) => key | modifiers)])];\n }\n });\n const tables = [table(slices)];\n const tableByContext = new Map([[plain as string, 0]]);\n const tableOfKey = new Array<number>(MOD_CRIT_ON_HIT << 1).fill(0);\n for (const key of reachable) {\n const variant = rederive(key);\n let index = tableByContext.get(variant.signature);\n if (index === undefined) {\n index = tables.length;\n tables.push(table(sliceSource(toPMF(variant.source, eps, entry.id)) as SourceSlices));\n tableByContext.set(variant.signature, index);\n }\n tableOfKey[key] = index;\n }\n const offsets: number[] = [];\n for (const each of tables) {\n offsets.push(variants.length);\n variants.push(...each.variants);\n }\n select = (codes, fired, flags) => {\n const read = flags & readMask;\n let key = 0;\n for (let bit = 0; read >> bit !== 0; bit++) {\n if (read & (1 << bit)) key |= modifiersOfBit[bit];\n }\n const index = tableOfKey[key];\n return offsets[index] + tables[index].select(codes, fired);\n };\n } else if (readMask !== 0) {\n fail(\n \"no-rebindable-source\",\n entry.id,\n `\"${entry.id}\" reads a granted modifier, but it is a list of several attacks, with no single attack check to re-derive. Declare each attack as its own rider, or scope the grant with \\`to\\`.`\n );\n }\n\n const hit = rider && !slices ? riderPMF(entry.rider) : null;\n const negated =\n rider?.on === \"not-fired\" ? (fireSlots.get(rider.of) as number) : -1;\n steps.push({\n id: entry.id,\n trigger: rider,\n variants,\n select,\n damage: hit && rider ? { hit, crit: critPMF(rider, hit, eps) } : null,\n updates,\n reads: rider ? (readsByRider.get(entry.rider) ?? -1) : -1,\n slot: rider ? (fireSlots.get(entry.id) as number) : -1,\n negates: negated,\n spendSlot,\n consumes: consumesAt[stepIndex],\n grants: grantsAt[stepIndex],\n });\n });\n\n // Group last-read indices (see the `groupLastReadStep` field docs). `perHitGroups` groups are\n // read only at the final collapse, so they stay live the whole walk.\n const groupLastReadStep = new Array<number>(groupSources.length).fill(-1);\n steps.forEach((step, stepIndex) => {\n // A first-hit / first-miss grant reads its group's pre-draw code at its source step.\n for (const reads of [step.reads, ...step.grants.map((app) => app.reads)]) {\n if (reads !== -1) groupLastReadStep[reads] = Math.max(groupLastReadStep[reads], stepIndex);\n }\n });\n for (const group of perHitGroups.values()) {\n groupLastReadStep[group] = steps.length;\n }\n\n return {\n steps,\n groupCount: groupSources.length,\n attackPMFs,\n attackIds,\n riderIds,\n substituteIds,\n rerollIds,\n fireSlots,\n slotCount: fireSlots.size,\n perHitGroups,\n groupLastReadStep,\n conditionIds,\n flagLastReadStep: liveFlags.map((flag) => flag.lastRead),\n };\n}\n","import type { Check } from \"../builder/types\";\nimport { PMF } from \"../pmf/pmf\";\nimport { DiceQuery } from \"../pmf/query\";\nimport type { ConditionOptions, Grant, Transform } from \"./effects\";\nimport { grantSpec, isGrant, isTransform, substituteFields } from \"./effects\";\nimport type { FireMode, TurnPlan } from \"./plan\";\nimport { buildPlan, fireMode, grantApplies } from \"./plan\";\nimport { advance, FIRST_NONE, START_CODE } from \"./state\";\nimport type {\n Attack,\n AttackOptions,\n ConditionSpec,\n Damage,\n Rider,\n RiderDamage,\n RiderOptions,\n Source,\n SubstituteSpec,\n ToPMF,\n TurnSpec,\n} from \"./types\";\nimport { TurnSpecError } from \"./types\";\n\n/** Everything a `Turn` is built from, plus what its chaining methods remember. */\ninterface TurnState {\n attacks: readonly Attack[];\n riders: readonly Rider[];\n substitutes: readonly SubstituteSpec[];\n conditions: readonly ConditionSpec[];\n /**\n * A chaining call defaulted some rider's, substitute's or condition's `of`.\n * Appending an attack now would leave it out of that set silently, so it throws\n * instead.\n */\n defaulted: boolean;\n /** What the last chaining call added — the target of {@link Turn.otherwise}. */\n last: { kind: \"rider\" | \"substitute\"; index: number } | null;\n}\n\n/** What a trigger verb accepts: damage, grants, or both in one list. */\ntype Effect = RiderDamage | Grant | readonly (Damage | Grant)[];\n\n/** Test seam: the plan and walk size of a turn. Not exported from the package. */\nconst inspections = new WeakMap<Turn, { plan: TurnPlan; stateCounts?: readonly number[] }>();\n\n/**\n * The number of trigger groups `t` tracks and, per step, the number of distinct\n * walk states after it. Resolves `t` if it has not been resolved yet.\n */\nexport function inspectTurn(t: Turn): { groupCount: number; stateCounts: readonly number[] } {\n t.mean();\n const inspection = inspections.get(t) as { plan: TurnPlan; stateCounts: readonly number[] };\n return { groupCount: inspection.plan.groupCount, stateCounts: inspection.stateCounts };\n}\n\n/**\n * A turn of attacks plus conditional damage riders, resolved to one **exact**\n * joint distribution.\n *\n * Riders are correlated with the attacks that trigger them, so a rider cannot be\n * a separate `DiceQuery` single convolved in afterwards: that preserves the mean\n * but corrupts the distribution (two daggers + Sneak Attack report P(0 damage) of\n * 0.015 instead of the true 0.1225). `Turn` owns the sources and enumerates the\n * joint outcome space instead, carrying one byte of state per trigger group.\n *\n * @example\n * const dagger = d20.plus(8).ac(16).onHit(d4.plus(4));\n * const rogue = turn([dagger, dagger]).rider({ damage: roll(3, d6), on: \"first-hit\" });\n * rogue.mean(); // 18.6225\n */\nexport class Turn {\n private readonly eps: number;\n private readonly state: TurnState;\n private readonly plan: TurnPlan;\n private resolved?: { pmf: PMF; fireMass: ReadonlyMap<string, number> };\n\n private constructor(state: TurnState, eps: number) {\n // Copied, because a caller can hand in an array they still hold and keep\n // mutating it. Shallow is the right depth: the entries are builders and\n // PMFs this module does not own and which are immutable by convention\n // throughout this library.\n this.state = {\n ...state,\n attacks: [...state.attacks],\n riders: [...state.riders],\n substitutes: [...state.substitutes],\n conditions: [...state.conditions],\n };\n this.eps = eps;\n // Built here, not on first use, so every way of constructing a Turn\n // validates at the same moment: the call that introduced the mistake.\n this.plan = buildPlan(this.state, eps);\n inspections.set(this, { plan: this.plan });\n }\n\n /**\n * Builds a turn from plain data, throwing {@link TurnSpecError} if it is\n * malformed. Use this from a UI, where `error.code` maps to the field state to\n * show.\n *\n * A rider, substitute or condition with no `of` watches every declared attack\n * plus the attack-shaped `any-miss` / `first-miss` rerolls — for a rider, those\n * listed before it — the same sources the chaining spelling snapshots.\n */\n static from(spec: TurnSpec, eps: number = 0): Turn {\n const riders = spec.riders ?? [];\n const substitutes = spec.substitutes ?? [];\n const conditions = spec.conditions ?? [];\n const last: TurnState[\"last\"] = riders.length\n ? { kind: \"rider\", index: riders.length - 1 }\n : substitutes.length\n ? { kind: \"substitute\", index: substitutes.length - 1 }\n : null;\n return new Turn(\n { attacks: spec.attacks, riders, substitutes, conditions, defaulted: false, last },\n eps\n );\n }\n\n private with(changes: Partial<TurnState>): Turn {\n return new Turn({ ...this.state, ...changes }, this.eps);\n }\n\n /** What a chaining call's omitted `of` means: the attacks so far, plus any reroll so far. */\n private defaultOf(): readonly string[] {\n return [...this.plan.attackIds, ...this.plan.rerollIds];\n }\n\n /**\n * Appends an attack, throwing {@link TurnSpecError} if that makes the turn\n * invalid. Pass an id (or `{ id, tag }`) to name it in `of`; a `tag` can be\n * shared by several attacks and names all of them at once.\n *\n * Declare attacks before the riders that watch them. A rider added without an\n * `of` watches the attacks declared *so far*, so appending one after it throws\n * `attack-after-rider` rather than silently leaving the new attack out. Give\n * that rider an explicit `of` to pin it to the attacks it already saw.\n */\n attack(source: Source, options?: string | AttackOptions): Turn {\n this.refuseAttackAfterRider();\n const { id, tag } = typeof options === \"string\" ? { id: options, tag: undefined } : (options ?? {});\n const entry: Attack =\n id === undefined && tag === undefined ? source : { id, tag, source };\n return this.with({ attacks: [...this.state.attacks, entry] });\n }\n\n /**\n * Appends `count` copies of the same attack — the Extra Attack case, which is\n * most of 5e. Argument order mirrors `roll(count, die)`. `tag` names every copy\n * at once in a later `of`.\n *\n * ```ts\n * turn().attacks(4, greatsword).onEveryHit(d6); // fighter 20 + hunter's mark\n * ```\n *\n * @throws {RangeError} if `count` is not a positive integer.\n */\n attacks(count: number, source: Source, options: { tag?: string } = {}): Turn {\n if (!Number.isInteger(count) || count < 1) {\n throw new RangeError(\n `attacks(count) needs a positive integer, got ${count}.`\n );\n }\n this.refuseAttackAfterRider();\n const entry: Attack = options.tag === undefined ? source : { tag: options.tag, source };\n const added: Attack[] = new Array<Attack>(count).fill(entry);\n return this.with({ attacks: [...this.state.attacks, ...added] });\n }\n\n private refuseAttackAfterRider(): void {\n if (!this.state.defaulted) return;\n throw new TurnSpecError(\n \"attack-after-rider\",\n \"\",\n \"An attack was added after a rider or substitute whose `of` defaulted to the attacks declared before it, so the new attack would be silently left out. Declare attacks first, or give that rider an explicit `of`.\"\n );\n }\n\n /**\n * Appends a rider, throwing {@link TurnSpecError} if that makes the turn\n * invalid. The `onX` methods below are the readable way to call this.\n *\n * An omitted `of` is filled in here, not when the plan is built: the attacks\n * declared so far, plus any attack-shaped `any-miss` / `first-miss` rider\n * declared so far. Nothing else joins — not `every-hit` riders, not\n * damage-shaped riders, not a list of several attacks, not `dice-match` beams\n * (name those explicitly).\n */\n rider(rider: Rider): Turn {\n const defaults =\n rider.on !== \"not-fired\" && rider.on !== \"dice-match\" && rider.of === undefined;\n const entry = (defaults ? { ...rider, of: this.defaultOf() } : rider) as Rider;\n return this.with({\n riders: [...this.state.riders, entry],\n defaulted: this.state.defaulted || defaults,\n last: { kind: \"rider\", index: this.state.riders.length },\n });\n }\n\n /**\n * Adds what one trigger-verb call describes: its damage as a rider, its grants as\n * a condition over the same `of`. The gate (`save` / `chance` / `onSave`) applies\n * to the grants only; the damage lands whatever the save does. With both, `id`\n * names the rider and the condition takes the default `condition N`.\n */\n private addEffect(on: ConditionSpec[\"on\"], effect: Effect, options: ConditionOptions): Turn {\n const { save, chance, onSave, ...riderOptions } = options;\n const gated = save !== undefined || chance !== undefined || onSave !== undefined;\n const parts: readonly unknown[] = Array.isArray(effect) ? effect : [effect];\n const grants = parts.filter(isGrant);\n if (grants.length === 0) {\n if (gated) {\n throw new Error(\n \"save, chance and onSave gate grants only, and this call has none: damage is never gated by them. Pass a SaveBuilder as the damage for damage that depends on a save.\"\n );\n }\n return this.rider({ ...riderOptions, damage: effect as RiderDamage, on });\n }\n if (save !== undefined && chance !== undefined) {\n throw new Error(\"Pass either save or chance, not both: each is the chance the grants take.\");\n }\n if (onSave !== undefined && save === undefined && chance === undefined) {\n throw new Error(\"onSave needs a save or a chance: without one there is no other branch to apply it on.\");\n }\n if (save !== undefined && typeof (save as Partial<ToPMF>).toPMF !== \"function\") {\n throw new Error(\"save must be a DC check such as d20.plus(2).dc(15).\");\n }\n const damage = parts.filter((part) => !isGrant(part)) as Damage[];\n if (damage.length === 0 && riderOptions.critDamage !== undefined) {\n throw new TurnSpecError(\n \"unused-crit-damage\",\n riderOptions.id ?? \"\",\n \"A grant deals no damage, so critDamage has nothing to apply to.\"\n );\n }\n\n const of = riderOptions.of ?? this.defaultOf();\n // A save's P(fail): the DC check's PMF puts it at 1. `vsAC` leaves it alone —\n // it is the target's save bonus, not its AC.\n const probability = save === undefined ? chance : save.toPMF(this.eps).pAt(1);\n const saved = onSave === undefined ? [] : Array.isArray(onSave) ? onSave : [onSave as Grant];\n const condition: ConditionSpec = {\n ...(damage.length === 0 && riderOptions.id !== undefined ? { id: riderOptions.id } : {}),\n on,\n of,\n ...(probability === undefined ? {} : { chance: probability }),\n grants: grants.map(grantSpec),\n ...(saved.length === 0 ? {} : { onSave: saved.map(grantSpec) }),\n };\n const riders =\n damage.length === 0\n ? this.state.riders\n : [...this.state.riders, { ...riderOptions, of, damage, on } as Rider];\n return this.with({\n riders,\n conditions: [...this.state.conditions, condition],\n defaulted: this.state.defaulted || riderOptions.of === undefined,\n last: damage.length === 0 ? null : { kind: \"rider\", index: this.state.riders.length },\n });\n }\n\n /**\n * Fires once, on the first source that lands, in that source's mode — so a\n * crit on the first landing attack doubles the rider's dice. Sneak Attack.\n *\n * Given a {@link Transform} such as `keepBestDamage()` instead of damage, it\n * adds a once-per-turn substitute: the first watched landing its policy accepts\n * draws the transformed base payload instead. One call covers every watched\n * attack; a second over any of the same attacks is `duplicate-substitute`. A\n * substitute allocates no trigger group. `fireProbability(id)` is P(spent).\n *\n * Given a {@link Grant}, the first landing applies it once — a passed save is\n * final for the turn:\n *\n * ```ts\n * turn([fist, fist, fist]).onFirstHit(advantage().critOnHit().untilEndOfTurn(), { chance: 0.4 });\n * ```\n */\n onFirstHit(effect: Effect | Transform, options: ConditionOptions = {}): Turn {\n if (!isTransform(effect)) return this.addEffect(\"first-hit\", effect, options);\n if (options.save !== undefined || options.chance !== undefined || options.onSave !== undefined) {\n throw new Error(\"save, chance and onSave gate grants only; a transform is not gated by them.\");\n }\n if (options.critDamage !== undefined) {\n throw new TurnSpecError(\n \"unused-crit-damage\",\n options.id ?? \"\",\n \"A transform rewrites the attack's own payload, so critDamage has nothing to apply to.\"\n );\n }\n const substitute: SubstituteSpec = {\n ...(options.id === undefined ? {} : { id: options.id }),\n on: \"first-hit\",\n of: options.of ?? this.defaultOf(),\n ...substituteFields(effect),\n };\n return this.with({\n substitutes: [...this.state.substitutes, substitute],\n defaulted: this.state.defaulted || options.of === undefined,\n last: { kind: \"substitute\", index: this.state.substitutes.length },\n });\n }\n\n /**\n * Fires once if any source crit, always in crit mode. Divine Smite: nothing is\n * lost by holding it for a crit, so this is \"any\", not \"first\".\n *\n * Given a {@link Grant}, every crit applies it.\n */\n onAnyCrit(effect: Effect, options: ConditionOptions = {}): Turn {\n return this.addEffect(\"any-crit\", effect, options);\n }\n\n /**\n * Fires once if any source missed. A reroll is a fresh attack, so pass one as\n * the damage.\n *\n * Its step runs after every declared attack. That is exact when the reroll is\n * identically distributed to the attacks after the one it replaces; when it is\n * not, or a later rider reads the order things landed in, use\n * {@link Turn.onFirstMiss}. A reroll that reads a granted modifier or applies a\n * condition's grants throws `unsupported-trigger`: use {@link Turn.onFirstMiss}.\n */\n onAnyMiss(damage: RiderDamage, options: RiderOptions = {}): Turn {\n return this.rider({ ...options, damage, on: \"any-miss\" });\n }\n\n /**\n * Fires once, on the first source that misses, and resolves directly after that\n * attack — so a reroll lands in turn order, before the attacks that follow it,\n * and reads the grants in force at that point. The exact model of \"when you\n * miss, you may reroll\": Kensei's Unerring Accuracy, Lucky.\n */\n onFirstMiss(damage: RiderDamage, options: RiderOptions = {}): Turn {\n return this.rider({ ...options, damage, on: \"first-miss\" });\n }\n\n /**\n * Fires once per source that lands, in that hit's mode — so it can fire several\n * times in a turn. Hunter's Mark, Hex, Rage.\n *\n * Given a {@link Grant}, every landing applies it, and a `save` or `chance` is\n * rolled again on each landing until it takes:\n *\n * ```ts\n * turn([sword, sword, sword]).onEveryHit(advantage().untilNextAttack());\n * turn([axe, axe]).onEveryHit(advantage().untilEndOfTurn(), { save: d20.plus(2).dc(15) });\n * ```\n */\n onEveryHit(effect: Effect, options: ConditionOptions = {}): Turn {\n return this.addEffect(\"every-hit\", effect, options);\n }\n\n /**\n * Damage for the turns where the rider added just before this one did *not*\n * fire: \"flurry of blows if I didn't smite\". After a transform, it fires when\n * the transform was never spent — under the default policy, when no watched\n * attack landed.\n *\n * ```ts\n * turn([dagger, dagger])\n * .onAnyCrit(roll(2, d8)) // smite\n * .otherwise([flurry, flurry]) // ... or two more attacks\n * ```\n *\n * Always binds to the *immediately* preceding rider, so the two are branches of\n * one decision and can never both land. Chaining it therefore alternates rather\n * than laddering: `a.otherwise(b).otherwise(c)` makes `c` fire whenever `b` did\n * not, which is exactly when `a` did. For a genuine three-way priority chain,\n * name the riders and use explicit `not-fired` triggers against the right one.\n */\n otherwise(\n damage: RiderDamage,\n options: Omit<RiderOptions, \"of\"> = {}\n ): Turn {\n const last = this.state.last;\n if (last === null) {\n throw new TurnSpecError(\n \"unknown-id\",\n \"\",\n \"otherwise() needs a preceding rider to negate.\"\n );\n }\n\n // `of` must name the negated node, so give it the id `buildPlan` would.\n let target: string;\n const riders: Rider[] = [...this.state.riders];\n const substitutes: SubstituteSpec[] = [...this.state.substitutes];\n if (last.kind === \"substitute\") {\n const previous = substitutes[last.index];\n target = previous.id ?? `substitute ${last.index + 1}`;\n substitutes[last.index] = { ...previous, id: target };\n } else {\n const previous = riders[last.index];\n target = previous.id ?? `rider ${last.index + 1}`;\n if (previous.on === \"every-hit\") {\n throw new TurnSpecError(\n \"not-an-attack\",\n target,\n \"otherwise() cannot negate an every-hit rider: it can fire more than once.\"\n );\n }\n riders[last.index] = { ...previous, id: target };\n }\n riders.push({ ...options, damage, on: \"not-fired\", of: target });\n return this.with({\n riders,\n substitutes,\n last: { kind: \"rider\", index: riders.length - 1 },\n });\n }\n\n /**\n * Fires once if any of `of`'s named sources' own damage dice matched (showed a\n * duplicate value) on hit or crit — Chromatic Orb's bounce. Unlike the other\n * `onX` triggers, `of` is required: \"the dice matched\" has no coherent meaning\n * defaulted across every declared attack. Each named source must expose a\n * dice-match descriptor (an `AttackBuilder`-shaped source does); naming one\n * that doesn't is a `TurnSpecError(\"no-dice-descriptor\", ...)`.\n *\n * Most callers want {@link bounce} instead of calling this directly — it\n * builds the whole depth-capped chain of attack-shaped riders.\n */\n onDiceMatch(\n of: readonly string[],\n damage: RiderDamage,\n options: Omit<RiderOptions, \"of\"> = {}\n ): Turn {\n return this.rider({ ...options, damage, on: \"dice-match\", of });\n }\n\n /**\n * The same turn against a target with armor class `ac`: every attack with an\n * AC — declared, or carried by a rider (a reroll, a bonus attack) — is rebuilt\n * through `withCheck`. Saves, attacks with no AC to rebind, and bare PMFs pass\n * through unchanged, so a mixed attack/save turn still sweeps.\n *\n * ```ts\n * const base = turn([sword, sword]).onFirstHit(roll(3, d6));\n * [12, 14, 16, 18].map((ac) => base.vsAC(ac).mean());\n * ```\n *\n * @throws {TurnSpecError} `no-rebindable-source` if nothing in the turn has an AC.\n */\n vsAC(ac: number): Turn {\n if (!Number.isFinite(ac)) throw new RangeError(`vsAC(ac) needs a finite number, got ${ac}.`);\n let rebound = 0;\n const rebind = (damage: Damage): Damage => {\n const attack = damage as {\n check?: { attackConfig?: { ac?: number } };\n withCheck?: (fn: (check: Check) => Check) => Damage;\n };\n if (typeof attack.withCheck !== \"function\") return damage;\n if (typeof attack.check?.attackConfig?.ac !== \"number\") return damage;\n rebound++;\n return attack.withCheck((check) => ({ ...check, ac }));\n };\n const rebindAll = (damage: RiderDamage): RiderDamage =>\n Array.isArray(damage) ? damage.map(rebind) : rebind(damage as Damage);\n\n const attacks = this.state.attacks.map(\n (entry): Attack =>\n \"source\" in entry ? { ...entry, source: rebind(entry.source) } : rebind(entry)\n );\n const riders = this.state.riders.map(\n (rider): Rider => ({\n ...rider,\n damage: rebindAll(rider.damage),\n ...(rider.critDamage === undefined ? {} : { critDamage: rebindAll(rider.critDamage) }),\n })\n );\n if (rebound === 0) {\n throw new TurnSpecError(\n \"no-rebindable-source\",\n \"\",\n \"vsAC() found nothing with an AC to rebind: every source is a save, an attack that always hits, or a bare PMF.\"\n );\n }\n return this.with({ attacks, riders });\n }\n\n /**\n * The exact joint distribution: mass 1, outcome-labelled. Resolved once and\n * cached.\n *\n * There is no `toPMF(eps)` to match the builders: a turn's epsilon is fixed\n * when it is constructed, because the plan is validated and its sources are\n * resolved at that point.\n */\n get pmf(): PMF {\n return this.resolve().pmf;\n }\n\n /** Mean damage for the turn. */\n mean(): number {\n return this.pmf.mean();\n }\n\n /**\n * A query whose `singles` are the **declared attacks** and whose combined\n * distribution is the exact turn PMF.\n *\n * Riders are inside the combined PMF, not in `singles`, so singles-based\n * helpers (`probAtLeastOne`, `countSinglesWith`, `outcomeStats`) describe the\n * attacks only. Read rider-inclusive statistics off the combined PMF —\n * `outcomeTotals`, `outcomeDamageRanges`, `damageAttributionChartModel`.\n */\n toQuery(): DiceQuery {\n return new DiceQuery([...this.plan.attackPMFs], this.pmf, this.eps);\n }\n\n /**\n * Attack ids in declaration order, including the `attack 1`, `attack 2`, …\n * defaults given to bare sources. These are the names `of` accepts.\n */\n get attackIds(): readonly string[] {\n return this.plan.attackIds;\n }\n\n /**\n * Rider ids in declaration order, including the `rider 1`, `rider 2`, …\n * defaults. These are the names {@link Turn.fireProbability} accepts.\n */\n get riderIds(): readonly string[] {\n return this.plan.riderIds;\n }\n\n /**\n * Substitute ids in declaration order, including the `substitute 1`, … defaults.\n * {@link Turn.fireProbability} accepts these too.\n */\n get substituteIds(): readonly string[] {\n return this.plan.substituteIds;\n }\n\n /**\n * Condition ids in declaration order, including the `condition 1`, … defaults.\n * {@link Turn.fireProbability} accepts these too.\n */\n get conditionIds(): readonly string[] {\n return this.plan.conditionIds;\n }\n\n /**\n * P(this rider fired). For an `every-hit` rider it is P(at least one source\n * hit), since that rider can fire more than once in a turn. For a substitute it\n * is P(it was spent). For a condition it is P(its grants were applied at least\n * once where a later attack roll reads them) — on the fail branch of its save,\n * not the `onSave` one. Two attacks with \"a hit gives the next attack\n * advantage\" give P(attack 1 landed), since nothing reads attack 2's grant.\n *\n * @throws {TurnSpecError} `unknown-id` if `id` is not a rider, substitute or\n * condition — attack ids included, since attacks always happen and have no\n * firing probability.\n */\n fireProbability(id: string): number {\n const mass = this.resolve().fireMass.get(id);\n if (mass === undefined) {\n throw new TurnSpecError(\n \"unknown-id\",\n id,\n `\"${id}\" is not a rider, substitute or condition in this turn. Riders: ${[\n ...this.plan.riderIds,\n ...this.plan.substituteIds,\n ...this.plan.conditionIds,\n ]\n .map((each) => `\"${each}\"`)\n .join(\", \")}.`\n );\n }\n return mass;\n }\n\n private resolve(): { pmf: PMF; fireMass: ReadonlyMap<string, number> } {\n if (this.resolved) return this.resolved;\n\n const plan = this.plan;\n const eps = this.eps;\n const width = plan.groupCount;\n const conditionCount = plan.conditionIds.length;\n\n // state key -> { codes, accumulated sub-mass damage, per-slot firing, flag word,\n // per-condition applied mass }\n type State = {\n codes: number[];\n pmf: PMF;\n fired: FireMode[];\n flags: number;\n /**\n * Per condition, the part of `pmf`'s mass in which it was applied at least once\n * while a later step read it. Carried as mass rather than as a key bit: whether\n * it was applied changes no later transition, so it must not split states.\n */\n applied: number[];\n };\n\n const start: State = {\n codes: new Array<number>(width).fill(START_CODE),\n pmf: PMF.delta(0, eps),\n fired: new Array<FireMode>(plan.slotCount).fill(null),\n flags: 0,\n applied: new Array<number>(conditionCount).fill(0),\n };\n let states = new Map<string, State>([[String.fromCharCode(), start]]);\n const stateCounts: number[] = [];\n\n plan.steps.forEach((step, stepIndex) => {\n const next = new Map<string, State>();\n\n // Groups with no reader at a LATER step are dead weight in the key: once the walk passes a\n // group's last reader, its specific code can no longer change any future decision, so two\n // states differing only in a dead group's code are behaviorally identical from here on.\n // Filtering them out (recomputed per step, since \"later\" shifts as the walk advances) keeps\n // a long `dice-match` chain's state count from growing — a group read by exactly one\n // downstream step would otherwise keep splitting states after nothing reads it again.\n const liveGroups: number[] = [];\n for (let g = 0; g < plan.groupCount; g++) {\n if (plan.groupLastReadStep[g] > stepIndex) liveGroups.push(g);\n }\n // Flags get the same treatment, and a dead flag is cleared rather than merely\n // left out of the key, so a stale bit can never be read back.\n let liveFlags = 0;\n plan.flagLastReadStep.forEach((last, bit) => {\n if (last > stepIndex) liveFlags |= 1 << bit;\n });\n\n const merge = (state: State): void => {\n // Whether each rider fired (and each substitute was spent) is part of the\n // state: two paths that agree on group codes but disagree on a slot must\n // not merge — `not-fired`, `first-miss`, a substitute's variant choice AND\n // the final `fireMass` collapse all read `state.fired`.\n let codesKey = \"\";\n for (const g of liveGroups) codesKey += String.fromCharCode(state.codes[g]);\n const flags = state.flags & liveFlags;\n const key =\n codesKey +\n \"\\u0001\" +\n state.fired.map((mode) => (mode === null ? \"-\" : \"+\")).join(\"\") +\n \"\\u0002\" +\n String.fromCharCode(flags);\n const existing = next.get(key);\n if (existing) {\n existing.pmf = existing.pmf.add(state.pmf);\n if (conditionCount) {\n existing.applied = existing.applied.map((mass, c) => mass + state.applied[c]);\n }\n } else {\n next.set(key, { ...state, flags });\n }\n };\n\n for (const state of states.values()) {\n const mode = fireMode(step, state.codes, state.fired);\n\n if (mode === null) {\n merge(state);\n continue;\n }\n\n let fired = state.fired;\n if (step.slot !== -1) {\n fired = [...fired];\n fired[step.slot] = mode;\n }\n\n if (step.variants.length === 0) {\n const payload = step.damage as { hit: PMF; crit: PMF };\n merge({\n ...state,\n pmf: state.pmf.convolve(\n mode === \"crit\" ? payload.crit : payload.hit,\n eps,\n true\n ),\n fired,\n });\n continue;\n }\n\n // Order at a step: read the flags to select the variant, clear the\n // `next-attack` flags this roll consumes, draw, advance the groups, then\n // apply this outcome's grants.\n const draws = step.variants[step.select(state.codes, fired, state.flags)];\n const flags = state.flags & ~step.consumes;\n const stateMass = conditionCount ? state.pmf.mass() : 0;\n for (const { outcome, matched, spends, slice } of draws) {\n const sliceMass = slice.mass();\n if (sliceMass <= eps) continue;\n\n const codes = [...state.codes];\n for (const group of step.updates) {\n codes[group] = advance(codes[group], outcome, matched);\n }\n let drawFired = fired;\n if (spends) {\n drawFired = [...fired];\n drawFired[step.spendSlot] = outcome === \"crit\" ? \"crit\" : \"hit\";\n }\n const pmf = state.pmf.convolve(slice, eps, true);\n if (step.grants.length === 0) {\n merge({\n codes,\n pmf,\n fired: drawFired,\n flags,\n applied: conditionCount ? state.applied.map((mass) => mass * sliceMass) : state.applied,\n });\n continue;\n }\n\n // Each qualifying condition splits the draw by its chance: its grants on\n // one part, its onSave grants on the other. Splits compose, since each\n // condition rolls its own save.\n let parts: { flags: number; share: number; applied: number[] }[] = [\n { flags, share: 1, applied: [] },\n ];\n for (const app of step.grants) {\n if (!grantApplies(app, outcome, state.codes)) continue;\n parts = parts.flatMap((part) => {\n if (app.inForce !== 0 && (part.flags & app.inForce) === app.inForce) return [part];\n const applied = app.effective ? [...part.applied, app.condition] : part.applied;\n const taken = { flags: part.flags | app.grants, share: part.share * app.chance, applied };\n const saved = { ...part, flags: part.flags | app.onSave, share: part.share * (1 - app.chance) };\n return [taken, saved].filter((each) => each.share > 0);\n });\n }\n for (const part of parts) {\n const scale = sliceMass * part.share;\n merge({\n codes,\n pmf: part.share === 1 ? pmf : pmf.scaleMass(part.share),\n fired: drawFired,\n flags: part.flags,\n applied: state.applied.map((mass, c) =>\n part.applied.includes(c) ? stateMass * scale : mass * scale\n ),\n });\n }\n }\n }\n\n states = next;\n stateCounts.push(next.size);\n });\n inspections.set(this, { plan, stateCounts });\n\n // Collapse: sum every terminal state, and tally per-rider firing mass.\n const fireMass = new Map<string, number>();\n for (const id of plan.fireSlots.keys()) fireMass.set(id, 0);\n for (const id of plan.perHitGroups.keys()) fireMass.set(id, 0);\n for (const id of plan.conditionIds) fireMass.set(id, 0);\n\n let total: PMF | undefined;\n for (const state of states.values()) {\n total = total ? total.add(state.pmf) : state.pmf;\n const mass = state.pmf.mass();\n for (const [id, slot] of plan.fireSlots) {\n if (state.fired[slot] !== null) {\n fireMass.set(id, (fireMass.get(id) as number) + mass);\n }\n }\n // `every-hit` riders have no step: they fired iff something landed.\n for (const [id, group] of plan.perHitGroups) {\n if (((state.codes[group] >> 2) & 0b11) !== FIRST_NONE) {\n fireMass.set(id, (fireMass.get(id) as number) + mass);\n }\n }\n plan.conditionIds.forEach((id, c) => {\n fireMass.set(id, (fireMass.get(id) as number) + state.applied[c]);\n });\n }\n\n const pmf = total ?? PMF.delta(0, eps);\n const totalMass = pmf.mass();\n const needsNormalizing = Math.abs(totalMass - 1) > eps && totalMass > 0;\n\n // Firing masses are accumulated in the same unnormalized units as the\n // terminal states, so they have to follow the distribution through\n // normalization or `fireProbability` stops agreeing with `pmf`. Reachable\n // whenever a caller supplies a source PMF whose own mass is not 1.\n if (needsNormalizing) {\n for (const [id, mass] of fireMass) fireMass.set(id, mass / totalMass);\n }\n\n this.resolved = {\n pmf: needsNormalizing ? pmf.normalize() : pmf,\n fireMass,\n };\n return this.resolved;\n }\n}\n\n/**\n * Starts a {@link Turn}. Takes one attack or a list of them, so the two common\n * shapes both read straight:\n *\n * ```ts\n * turn(greatsword).onAnyCrit(roll(4, d8)); // one attack\n * turn([dagger, dagger]).onFirstHit(roll(3, d6)); // two\n * turn().attacks(4, greatsword); // four\n * ```\n */\nexport function turn(\n attacks: Attack | readonly Attack[] = [],\n eps: number = 0\n): Turn {\n return Turn.from(\n { attacks: Array.isArray(attacks) ? attacks : [attacks as Attack] },\n eps\n );\n}\n\n/**\n * `bounce({ source, max })` — sugar for a depth-capped chain of attack-shaped\n * `dice-match` riders, so no caller hand-writes the chain by hand: beam 1 is\n * `source` itself as the turn's only declared attack; beam `i + 1` (for\n * `i = 1..max`) is `source` again, as a rider fired only when beam `i`'s own\n * dice matched. Every beam shares `source`'s exact profile (same to-hit, same\n * damage dice) — the natural reading of \"the orb leaps to a new target, same\n * damage profile, and repeats.\"\n *\n * `max` is required and MUST be a non-negative integer: match probability alone\n * does not terminate the recursion (Chromatic Orb bounces are not literally\n * unbounded — DMs cap them by fiat or table size — and something has to).\n *\n * Each beam after the first is its own {@link MAX_TRIGGER_GROUPS}-counted trigger\n * group (`of: [<previous beam's id>]` is a distinct source set every time), so\n * `max` is effectively capped at the turn's remaining group budget — a chain\n * asking for more throws `TurnSpecError(\"too-many-groups\", ...)` the same way\n * any other over-budget turn would, not a silent truncation.\n */\nexport function bounce({ source, max }: { source: Source; max: number }): Turn {\n if (!Number.isInteger(max) || max < 0) {\n throw new RangeError(`bounce({ max }) needs a non-negative integer, got ${max}.`);\n }\n\n let result = turn(source);\n let previousId = result.attackIds[0];\n for (let i = 0; i < max; i++) {\n const riderId = `bounce ${i + 1}`;\n result = result.onDiceMatch([previousId], source, { id: riderId });\n previousId = riderId;\n }\n return result;\n}\n"]}