cubing 0.31.6 → 0.32.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/alg/index.js +1 -1
- package/dist/esm/bluetooth/index.js +5 -5
- package/dist/esm/bluetooth/index.js.map +2 -2
- package/dist/esm/{chunk-WEYPAZEE.js → chunk-2IZUSAXQ.js} +1 -1
- package/dist/esm/{chunk-WEYPAZEE.js.map → chunk-2IZUSAXQ.js.map} +1 -1
- package/dist/esm/{chunk-LGJ4AXVG.js → chunk-AUF56UEH.js} +2 -2
- package/dist/esm/{chunk-LGJ4AXVG.js.map → chunk-AUF56UEH.js.map} +0 -0
- package/dist/esm/{chunk-6CRQ3Z75.js → chunk-CI3M726K.js} +3 -3
- package/dist/esm/chunk-CI3M726K.js.map +7 -0
- package/dist/esm/{chunk-YM4RYQQM.js → chunk-CQII4VKQ.js} +3 -3
- package/dist/esm/{chunk-YM4RYQQM.js.map → chunk-CQII4VKQ.js.map} +0 -0
- package/dist/esm/{chunk-23PDUZN6.js → chunk-IJP4IAGZ.js} +1 -1
- package/dist/esm/chunk-IJP4IAGZ.js.map +7 -0
- package/dist/esm/chunk-MH4KS76F.js +60 -0
- package/dist/esm/chunk-MH4KS76F.js.map +7 -0
- package/dist/esm/{chunk-Z4UAFYMU.js → chunk-NOAOLQ25.js} +2 -2
- package/dist/esm/{chunk-Z4UAFYMU.js.map → chunk-NOAOLQ25.js.map} +0 -0
- package/dist/esm/{chunk-KSPS7U45.js → chunk-OGXWZ6ER.js} +2 -2
- package/dist/esm/{chunk-KSPS7U45.js.map → chunk-OGXWZ6ER.js.map} +0 -0
- package/dist/esm/{chunk-K6RENDGG.js → chunk-QSTEXHX6.js} +14 -18
- package/dist/esm/chunk-QSTEXHX6.js.map +7 -0
- package/dist/esm/{chunk-YVIUZYDL.js → chunk-SPJL6GKQ.js} +10 -354
- package/dist/esm/chunk-SPJL6GKQ.js.map +7 -0
- package/dist/esm/{chunk-NIDW7PCY.js → chunk-VCOWJQSD.js} +12 -14
- package/dist/esm/chunk-VCOWJQSD.js.map +7 -0
- package/dist/esm/{chunk-TUETQPSZ.js → chunk-W6D5GKZQ.js} +478 -56
- package/dist/esm/chunk-W6D5GKZQ.js.map +7 -0
- package/dist/esm/kpuzzle/index.js +2 -2
- package/dist/esm/notation/index.js +2 -2
- package/dist/esm/protocol/index.js +4 -4
- package/dist/esm/puzzle-geometry/index.js +1 -1
- package/dist/esm/puzzle-geometry/index.js.map +2 -2
- package/dist/esm/puzzles/index.js +4 -4
- package/dist/esm/scramble/index.js +3 -3
- package/dist/esm/search/index.js +7 -8
- package/dist/esm/{search-dynamic-sgs-side-events-LNK5H654.js → search-dynamic-sgs-side-events-ACBWOA4K.js} +6 -6
- package/dist/esm/search-dynamic-sgs-side-events-ACBWOA4K.js.map +7 -0
- package/dist/esm/{search-dynamic-sgs-unofficial-V6KHVP33.js → search-dynamic-sgs-unofficial-5SZWN2CW.js} +14 -19
- package/dist/esm/{search-dynamic-sgs-unofficial-V6KHVP33.js.map → search-dynamic-sgs-unofficial-5SZWN2CW.js.map} +3 -3
- package/dist/esm/{search-dynamic-solve-4x4x4-OGUGCJII.js → search-dynamic-solve-4x4x4-2P5MFI3L.js} +18 -21
- package/dist/esm/search-dynamic-solve-4x4x4-2P5MFI3L.js.map +7 -0
- package/dist/esm/{search-dynamic-solve-fto-MA4X6JEE.js → search-dynamic-solve-fto-WS5S4S6Z.js} +17 -18
- package/dist/esm/search-dynamic-solve-fto-WS5S4S6Z.js.map +7 -0
- package/dist/esm/{search-dynamic-solve-kilominx-NGTYP5YN.js → search-dynamic-solve-kilominx-FZGO4SCA.js} +11 -17
- package/dist/esm/search-dynamic-solve-kilominx-FZGO4SCA.js.map +7 -0
- package/dist/esm/{search-dynamic-solve-master_tetraminx-YKINTRUU.js → search-dynamic-solve-master_tetraminx-XM2AZB2D.js} +18 -19
- package/dist/esm/search-dynamic-solve-master_tetraminx-XM2AZB2D.js.map +7 -0
- package/dist/esm/{search-dynamic-solve-sq1-W33UXTDZ.js → search-dynamic-solve-sq1-BMSU2UG2.js} +13 -14
- package/dist/esm/search-dynamic-solve-sq1-BMSU2UG2.js.map +7 -0
- package/dist/esm/{search-worker-inside-generated-string-PM5MPECU.js → search-worker-inside-generated-string-EVS44GHX.js} +29 -29
- package/dist/esm/search-worker-inside-generated-string-EVS44GHX.js.map +7 -0
- package/dist/esm/{search-worker-js-entry-BLPSRSPB.js → search-worker-js-entry-P6QKWWFE.js} +28 -34
- package/dist/esm/search-worker-js-entry-P6QKWWFE.js.map +7 -0
- package/dist/esm/{search-worker-ts-entry-63LKRWMR.js → search-worker-ts-entry-BBHCSUXE.js} +3 -3
- package/dist/esm/{search-worker-ts-entry-63LKRWMR.js.map → search-worker-ts-entry-BBHCSUXE.js.map} +0 -0
- package/dist/esm/stream/index.js +1 -1
- package/dist/esm/twisty/index.js +40 -13
- package/dist/esm/twisty/index.js.map +3 -3
- package/dist/esm/{twisty-dynamic-3d-K4BNTWDJ.js → twisty-dynamic-3d-E5SBRWVZ.js} +41 -29
- package/dist/esm/twisty-dynamic-3d-E5SBRWVZ.js.map +7 -0
- package/dist/types/{TwizzleLink-4d656916.d.ts → TwizzleLink-b28e5d4f.d.ts} +36 -23
- package/dist/types/puzzles/index.d.ts +2 -2
- package/dist/types/twisty/index.d.ts +2 -2
- package/package.json +3 -3
- package/dist/esm/.DS_Store +0 -0
- package/dist/esm/chunk-23PDUZN6.js.map +0 -7
- package/dist/esm/chunk-6CRQ3Z75.js.map +0 -7
- package/dist/esm/chunk-HR5D6SD4.js +0 -77
- package/dist/esm/chunk-HR5D6SD4.js.map +0 -7
- package/dist/esm/chunk-K6RENDGG.js.map +0 -7
- package/dist/esm/chunk-NIDW7PCY.js.map +0 -7
- package/dist/esm/chunk-QHWK5RXN.js +0 -42
- package/dist/esm/chunk-QHWK5RXN.js.map +0 -7
- package/dist/esm/chunk-TUETQPSZ.js.map +0 -7
- package/dist/esm/chunk-YVIUZYDL.js.map +0 -7
- package/dist/esm/search-dynamic-sgs-side-events-LNK5H654.js.map +0 -7
- package/dist/esm/search-dynamic-solve-4x4x4-OGUGCJII.js.map +0 -7
- package/dist/esm/search-dynamic-solve-fto-MA4X6JEE.js.map +0 -7
- package/dist/esm/search-dynamic-solve-kilominx-NGTYP5YN.js.map +0 -7
- package/dist/esm/search-dynamic-solve-master_tetraminx-YKINTRUU.js.map +0 -7
- package/dist/esm/search-dynamic-solve-sq1-W33UXTDZ.js.map +0 -7
- package/dist/esm/search-worker-inside-generated-string-PM5MPECU.js.map +0 -7
- package/dist/esm/search-worker-js-entry-BLPSRSPB.js.map +0 -7
- package/dist/esm/twisty-dynamic-3d-K4BNTWDJ.js.map +0 -7
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { A as AlgIndexer, T as Timestamp, D as Duration, S as StickeringMask } from '../TwizzleLink-
|
|
2
|
-
export { A as AlgIndexer, B as BackViewLayout, N as EXPERIMENTAL_PROP_NO_VALUE, M as ExperimentalMillisecondTimestamp, E as ExperimentalStickering, P as PuzzleID, d as TwistyAlgEditor, c as TwistyAlgViewer, b as TwistyPlayer, e as TwistyPlayerConfig, g as TwizzleLink, V as VisualizationFormat, f as backViewLayouts } from '../TwizzleLink-
|
|
1
|
+
import { A as AlgIndexer, T as Timestamp, D as Duration, S as StickeringMask } from '../TwizzleLink-b28e5d4f.js';
|
|
2
|
+
export { A as AlgIndexer, B as BackViewLayout, N as EXPERIMENTAL_PROP_NO_VALUE, M as ExperimentalMillisecondTimestamp, E as ExperimentalStickering, P as PuzzleID, d as TwistyAlgEditor, c as TwistyAlgViewer, b as TwistyPlayer, e as TwistyPlayerConfig, g as TwizzleLink, V as VisualizationFormat, f as backViewLayouts } from '../TwizzleLink-b28e5d4f.js';
|
|
3
3
|
import { a as Alg, M as Move } from '../Alg-8b4e9255.js';
|
|
4
4
|
import { a as KPuzzle, K as KState, e as KTransformation } from '../KState-0da22515.js';
|
|
5
5
|
import 'three';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cubing",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.32.0",
|
|
4
4
|
"description": "A collection of JavaScript cubing libraries.",
|
|
5
5
|
"author": "The js.cubing.net team",
|
|
6
6
|
"type": "module",
|
|
@@ -77,7 +77,7 @@
|
|
|
77
77
|
"node-fetch": "^3.2.10",
|
|
78
78
|
"peggy": "^2.0.1",
|
|
79
79
|
"playwright": "^1.25.1",
|
|
80
|
-
"rome": "^0.
|
|
80
|
+
"rome": "^10.0.1",
|
|
81
81
|
"tsup": "^6.2.2",
|
|
82
82
|
"typedoc": "^0.23.18",
|
|
83
83
|
"typescript": "^4.7.4",
|
|
@@ -90,7 +90,7 @@
|
|
|
90
90
|
"rome"
|
|
91
91
|
],
|
|
92
92
|
"engines": {
|
|
93
|
-
"node": "
|
|
93
|
+
"node": ">=19"
|
|
94
94
|
},
|
|
95
95
|
"files": [
|
|
96
96
|
"/LICENSE.md",
|
package/dist/esm/.DS_Store
DELETED
|
Binary file
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/cubing/alg/common.ts", "../../src/cubing/alg/iteration.ts", "../../src/cubing/alg/limits.ts", "../../src/cubing/alg/AlgBuilder.ts", "../../src/cubing/alg/debug.ts", "../../src/cubing/alg/alg-nodes/containers/Commutator.ts", "../../src/cubing/alg/alg-nodes/containers/Conjugate.ts", "../../src/cubing/alg/alg-nodes/leaves/LineComment.ts", "../../src/cubing/alg/alg-nodes/leaves/Newline.ts", "../../src/cubing/alg/alg-nodes/leaves/Pause.ts", "../../src/cubing/alg/parseAlg.ts", "../../src/cubing/alg/warnOnce.ts", "../../src/cubing/alg/alg-nodes/QuantumWithAmount.ts", "../../src/cubing/alg/alg-nodes/leaves/Move.ts", "../../src/cubing/alg/alg-nodes/containers/Grouping.ts", "../../src/cubing/alg/is.ts", "../../src/cubing/alg/traversal.ts", "../../src/cubing/alg/simplify/options.ts", "../../src/cubing/alg/simplify/append.ts", "../../src/cubing/alg/simplify/simplify.ts", "../../src/cubing/alg/Alg.ts", "../../src/cubing/alg/example.ts", "../../src/cubing/alg/keyboard.ts", "../../src/cubing/alg/url.ts"],
|
|
4
|
-
"sourcesContent": ["import type { Alg } from \"./Alg\";\nimport type { IterationDirection } from \"./iteration\";\nimport type { AlgLeaf, AlgNode } from \"./alg-nodes/AlgNode\";\n\nlet writeAlgDebugField = false;\nexport function setAlgDebugField(debug: boolean): void {\n writeAlgDebugField = debug;\n}\n\nexport abstract class Comparable {\n is(c: any): boolean {\n return this instanceof c;\n }\n\n as<T>(c: new (...args: any) => T): T | null {\n return this instanceof c ? this : null;\n }\n\n abstract isIdentical(other: Comparable): boolean;\n}\n\nexport interface Repeatable extends Comparable {\n experimentalExpand(\n iterDir?: IterationDirection,\n depth?: number,\n ): Generator<AlgLeaf>;\n}\n\n// Common to `Alg` or `AlgNode` classes.\nexport abstract class AlgCommon<T extends Alg | AlgNode>\n extends Comparable\n implements Repeatable\n{\n constructor() {\n super();\n if (writeAlgDebugField) {\n Object.defineProperty(this, \"_debugStr\", {\n get: () => {\n return this.toString();\n },\n });\n }\n }\n\n get log(): (message?: any) => void {\n // By returning a (bound) version of `console.log`, we ensure that DevTools\n // logs the call site instead of this function.\n return console.log.bind(console, this, this.toString()) as (\n message?: any,\n ) => void;\n }\n\n abstract toString(): string;\n\n abstract invert(): T;\n\n abstract experimentalExpand(iterDir: IterationDirection): Generator<AlgLeaf>;\n}\n", "export enum IterationDirection {\n Forwards = 1,\n Backwards = -1,\n}\n\nexport function toggleDirection(\n iterationDirection: IterationDirection,\n flip: boolean = true,\n): IterationDirection {\n if (!flip) {\n return iterationDirection;\n }\n switch (iterationDirection) {\n case IterationDirection.Forwards:\n return IterationDirection.Backwards;\n case IterationDirection.Backwards:\n return IterationDirection.Forwards;\n }\n}\n\nexport function direct<T>(\n g: Iterable<T>,\n iterDir: IterationDirection,\n): Iterable<T> {\n return iterDir === IterationDirection.Backwards ? Array.from(g).reverse() : g;\n}\n\nexport function reverse<T>(g: Iterable<T>): Iterable<T> {\n return Array.from(g).reverse();\n}\n\nexport function* directedGenerator<T>(\n g: Generator<T>,\n direction: IterationDirection,\n): Generator<T> {\n direction === IterationDirection.Backwards\n ? yield* reverseGenerator(g)\n : yield* g;\n}\n\nexport function* reverseGenerator<T>(g: Generator<T>): Generator<T> {\n for (const t of Array.from(g).reverse()) {\n yield t;\n }\n}\n", "export const MAX_INT = 0x7fffffff; // 2^31-1, the max value for signed 32-bit ints.\nexport const MAX_INT_DESCRIPTION = \"2^31 - 1\";\nexport const MIN_INT = -0x80000000;\nexport const MIN_INT_DESCRIPTION = \"-2^31\";\n", "import { Alg } from \"./Alg\";\nimport type { AlgNode } from \"./alg-nodes/AlgNode\";\n\n/** @category Alg */\nexport class AlgBuilder {\n #algNode: AlgNode[] = [];\n\n push(u: AlgNode): void {\n this.#algNode.push(u);\n }\n\n // TODO: Allow FlexibleAlgSource?\n /** @deprecated */\n experimentalPushAlg(alg: Alg): void {\n // TODO: Optimize?\n for (const u of alg.childAlgNodes()) {\n this.push(u);\n }\n }\n\n // TODO: can we guarantee this to be fast in the permanent API?\n experimentalNumAlgNodes(): number {\n return this.#algNode.length;\n }\n\n // can be called multiple times, even if you push alg nodes inbetween.\n toAlg(): Alg {\n return new Alg(this.#algNode);\n }\n\n reset(): void {\n this.#algNode = [];\n }\n}\n", "type ReportingLevel = \"none\" | \"warn\" | \"error\";\nlet currentReportingLevel = \"warn\";\n\nconst MAX_NUMBER_OF_TIMES_TO_WARN = 10;\nlet numWarned = 0;\n\n// TODO: Avoid creating the string message if it won't be used (e.g. by taking a function?).\nexport function reportTypeMismatch(msg: string): void {\n switch (currentReportingLevel) {\n case \"error\":\n throw new Error(msg);\n case \"warn\": {\n numWarned++;\n if (numWarned < MAX_NUMBER_OF_TIMES_TO_WARN) {\n if (numWarned + 1 === MAX_NUMBER_OF_TIMES_TO_WARN) {\n console.warn(msg);\n }\n }\n return;\n }\n }\n}\n\nexport function setAlgPartTypeMismatchReportingLevel(\n level: ReportingLevel,\n): void {\n currentReportingLevel = level;\n}\n\nexport const algDebugGlobals: { caratNISSNotationEnabled: boolean } = {\n caratNISSNotationEnabled: false,\n};\n\nexport function setAlgDebug(options: {\n caratNISSNotationEnabled?: boolean;\n}): void {\n if (\"caratNISSNotationEnabled\" in options) {\n algDebugGlobals.caratNISSNotationEnabled =\n !!options.caratNISSNotationEnabled;\n }\n}\n", "import { Alg, experimentalEnsureAlg, FlexibleAlgSource } from \"../../Alg\";\nimport { AlgCommon, Comparable } from \"../../common\";\nimport { IterationDirection } from \"../../iteration\";\nimport type { AlgLeaf } from \"../AlgNode\";\n\n/** @category Alg Nodes */\nexport class Commutator extends AlgCommon<Commutator> {\n readonly #A: Alg;\n readonly #B: Alg;\n\n constructor(aSource: FlexibleAlgSource, bSource: FlexibleAlgSource) {\n super();\n this.#A = experimentalEnsureAlg(aSource);\n this.#B = experimentalEnsureAlg(bSource);\n }\n\n get A(): Alg {\n return this.#A;\n }\n\n get B(): Alg {\n return this.#B;\n }\n\n isIdentical(other: Comparable): boolean {\n const otherAsCommutator = other.as(Commutator);\n return !!(\n otherAsCommutator?.A.isIdentical(this.A) &&\n otherAsCommutator?.B.isIdentical(this.B)\n );\n }\n\n invert(): Commutator {\n return new Commutator(this.#B, this.#A);\n }\n\n *experimentalExpand(\n iterDir: IterationDirection = IterationDirection.Forwards,\n depth?: number,\n ): Generator<AlgLeaf> {\n depth ??= Infinity;\n if (depth === 0) {\n yield iterDir === IterationDirection.Forwards ? this : this.invert();\n } else {\n if (iterDir === IterationDirection.Forwards) {\n yield* this.A.experimentalExpand(\n IterationDirection.Forwards,\n depth - 1,\n );\n yield* this.B.experimentalExpand(\n IterationDirection.Forwards,\n depth - 1,\n );\n yield* this.A.experimentalExpand(\n IterationDirection.Backwards,\n depth - 1,\n );\n yield* this.B.experimentalExpand(\n IterationDirection.Backwards,\n depth - 1,\n );\n } else {\n yield* this.B.experimentalExpand(\n IterationDirection.Forwards,\n depth - 1,\n );\n yield* this.A.experimentalExpand(\n IterationDirection.Forwards,\n depth - 1,\n );\n yield* this.B.experimentalExpand(\n IterationDirection.Backwards,\n depth - 1,\n );\n yield* this.A.experimentalExpand(\n IterationDirection.Backwards,\n depth - 1,\n );\n }\n }\n }\n\n toString(): string {\n return `[${this.#A.toString()}, ${this.#B.toString()}]`;\n }\n}\n", "import { Alg, experimentalEnsureAlg, FlexibleAlgSource } from \"../../Alg\";\nimport { AlgCommon, Comparable } from \"../../common\";\nimport { IterationDirection } from \"../../iteration\";\nimport type { AlgLeaf } from \"../AlgNode\";\n\n/** @category Alg Nodes */\nexport class Conjugate extends AlgCommon<Conjugate> {\n readonly #A: Alg;\n readonly #B: Alg;\n\n constructor(aSource: FlexibleAlgSource, bSource: FlexibleAlgSource) {\n super();\n this.#A = experimentalEnsureAlg(aSource);\n this.#B = experimentalEnsureAlg(bSource);\n }\n\n get A(): Alg {\n return this.#A;\n }\n\n get B(): Alg {\n return this.#B;\n }\n\n isIdentical(other: Comparable): boolean {\n const otherAsConjugate = other.as(Conjugate);\n return !!(\n otherAsConjugate?.A.isIdentical(this.A) &&\n otherAsConjugate?.B.isIdentical(this.B)\n );\n }\n\n invert(): Conjugate {\n return new Conjugate(this.#A, this.#B.invert());\n }\n\n *experimentalExpand(\n iterDir: IterationDirection,\n depth?: number,\n ): Generator<AlgLeaf> {\n depth ??= Infinity;\n if (depth === 0) {\n yield iterDir === IterationDirection.Forwards ? this : this.invert();\n } else {\n yield* this.A.experimentalExpand(IterationDirection.Forwards, depth - 1);\n yield* this.B.experimentalExpand(iterDir, depth - 1);\n yield* this.A.experimentalExpand(IterationDirection.Backwards, depth - 1);\n }\n }\n\n toString(): string {\n return `[${this.A}: ${this.B}]`;\n }\n}\n", "import { AlgCommon, Comparable } from \"../../common\";\nimport { IterationDirection } from \"../../iteration\";\nimport type { AlgLeaf } from \"../AlgNode\";\n\n// TODO: hash\n// TODO: this conflicts with the HTML `LineComment` class\n/** @category Alg Nodes */\nexport class LineComment extends AlgCommon<LineComment> {\n readonly #text: string;\n\n constructor(commentText: string) {\n super();\n if (commentText.includes(\"\\n\") || commentText.includes(\"\\r\")) {\n throw new Error(\"LineComment cannot contain newline\");\n }\n this.#text = commentText;\n }\n\n get text(): string {\n return this.#text;\n }\n\n isIdentical(other: Comparable): boolean {\n const otherAsLineComment = other as LineComment;\n return other.is(LineComment) && this.#text === otherAsLineComment.#text;\n }\n\n invert(): LineComment {\n return this;\n }\n\n *experimentalExpand(\n _iterDir: IterationDirection = IterationDirection.Forwards,\n _depth: number = Infinity,\n ): Generator<AlgLeaf> {\n yield this;\n }\n\n toString(): string {\n return `//${this.#text}`;\n }\n // toJSON(): LineCommentJSON {\n // return {\n // type: \"comment\",\n // text: this.#text,\n // };\n // }\n}\n", "import { AlgCommon, Comparable } from \"../../common\";\nimport { IterationDirection } from \"../../iteration\";\nimport type { AlgLeaf } from \"../AlgNode\";\n\n/** @category Alg Nodes */\nexport class Newline extends AlgCommon<Newline> {\n toString(): string {\n return \"\\n\";\n }\n\n isIdentical(other: Comparable): boolean {\n return other.is(Newline);\n }\n\n invert(): Newline {\n return this;\n }\n\n *experimentalExpand(\n _iterDir: IterationDirection = IterationDirection.Forwards,\n _depth: number = Infinity,\n ): Generator<AlgLeaf> {\n yield this;\n }\n}\n", "import type { Grouping } from \"..\";\nimport { AlgCommon, Comparable } from \"../../common\";\nimport { IterationDirection } from \"../../iteration\";\nimport type { AlgLeaf } from \"../AlgNode\";\n\n/** @category Alg Nodes */\nexport class Pause extends AlgCommon<Pause> {\n experimentalNISSGrouping?: Grouping; // TODO: tie this to the alg\n\n toString(): string {\n return \".\";\n }\n\n isIdentical(other: Comparable): boolean {\n return other.is(Pause);\n }\n\n invert(): Pause {\n return this;\n }\n\n *experimentalExpand(\n _iterDir: IterationDirection = IterationDirection.Forwards,\n _depth: number = Infinity,\n ): Generator<AlgLeaf> {\n yield this;\n }\n}\n", "import { Alg } from \"./Alg\";\nimport { AlgBuilder } from \"./AlgBuilder\";\nimport { algDebugGlobals } from \"./debug\";\nimport type { AlgNode } from \"./alg-nodes\";\nimport { Commutator } from \"./alg-nodes/containers/Commutator\";\nimport { Conjugate } from \"./alg-nodes/containers/Conjugate\";\nimport { Grouping } from \"./alg-nodes/containers/Grouping\";\nimport { LineComment } from \"./alg-nodes/leaves/LineComment\";\nimport { Move, QuantumMove } from \"./alg-nodes/leaves/Move\";\nimport { Newline } from \"./alg-nodes/leaves/Newline\";\nimport { Pause } from \"./alg-nodes/leaves/Pause\";\n\ntype StoppingChar = \",\" | \":\" | \"]\" | \")\";\n\nfunction parseIntWithEmptyFallback<T>(n: string, emptyFallback: T): number | T {\n return n ? parseInt(n) : emptyFallback;\n}\n\nconst AMOUNT_REGEX = /^(\\d+)?('?)/;\nconst MOVE_START_REGEX = /^[_\\dA-Za-z]/; // TODO: Handle slash\nconst QUANTUM_MOVE_REGEX = /^((([1-9]\\d*)-)?([1-9]\\d*))?([_A-Za-z]+)?/;\nconst COMMENT_TEXT_REGEX = /^[^\\n]*/;\nconst SQUARE1_PAIR_START_REGEX = /^(-?\\d+), ?/; // TODO: match up with other whitespace handling?\nconst SQUARE1_PAIR_END_REGEX = /^(-?\\d+)\\)/; // TODO: match up with other whitespace handling?\n\nexport function parseAlg(s: string): Alg {\n return new AlgParser().parseAlg(s);\n}\n\nexport function parseMove(s: string): Move {\n return new AlgParser().parseMove(s);\n}\n\nexport function parseQuantumMove(s: string): QuantumMove {\n return new AlgParser().parseQuantumMove(s);\n}\n\nexport interface ParserIndexed {\n startCharIndex: number;\n endCharIndex: number;\n}\n\nexport type Parsed<T extends Alg | AlgNode> = T & ParserIndexed;\n\n// TODO: attach to parser so the end char index can default to `this.#idx`?\nfunction addCharIndices<T extends Alg | AlgNode>(\n t: T,\n startCharIndex: number,\n endCharIndex: number,\n): Parsed<T> {\n const parsedT = t as ParserIndexed & T;\n parsedT.startCharIndex = startCharIndex;\n parsedT.endCharIndex = endCharIndex;\n return parsedT;\n}\n\nexport function transferCharIndex<T extends Alg | AlgNode>(from: T, to: T): T {\n if (\"startCharIndex\" in from) {\n (to as Parsed<T>).startCharIndex = (from as Parsed<T>).startCharIndex;\n }\n if (\"endCharIndex\" in from) {\n (to as Parsed<T>).endCharIndex = (from as Parsed<T>).endCharIndex;\n }\n return to;\n}\n\ntype MoveSuffix = \"+\" | \"++\" | \"-\" | \"--\";\n\n// TODO: support recording string locations for moves.\nclass AlgParser {\n #input: string = \"\";\n #idx: number = 0;\n #nissQueue: Grouping[] = [];\n\n parseAlg(input: string): Parsed<Alg> {\n this.#input = input;\n this.#idx = 0;\n const alg = this.parseAlgWithStopping([]);\n this.mustBeAtEndOfInput();\n const algNodes = Array.from(alg.childAlgNodes());\n if (this.#nissQueue.length > 0) {\n for (const nissGrouping of this.#nissQueue.reverse()) {\n algNodes.push(nissGrouping);\n }\n }\n const newAlg = new Alg(algNodes) as Parsed<Alg>;\n const { startCharIndex, endCharIndex } = alg;\n addCharIndices(newAlg, startCharIndex, endCharIndex);\n return newAlg;\n }\n\n parseMove(input: string): Parsed<Move> {\n this.#input = input;\n this.#idx = 0;\n const move = this.parseMoveImpl();\n this.mustBeAtEndOfInput();\n return move;\n }\n\n parseQuantumMove(input: string): QuantumMove {\n this.#input = input;\n this.#idx = 0;\n const quantumMove = this.parseQuantumMoveImpl();\n this.mustBeAtEndOfInput();\n return quantumMove;\n }\n\n private mustBeAtEndOfInput() {\n if (this.#idx !== this.#input.length) {\n throw new Error(\"parsing unexpectedly ended early\");\n }\n }\n\n private parseAlgWithStopping(stopBefore: StoppingChar[]): Parsed<Alg> {\n let algStartIdx = this.#idx;\n let algEndIdx = this.#idx;\n const algBuilder = new AlgBuilder();\n\n // We're \"crowded\" if there was not a space or newline since the last alg node.\n let crowded = false;\n\n const mustNotBeCrowded = (idx: number): void => {\n if (crowded) {\n throw new Error(\n `Unexpected character at index ${idx}. Are you missing a space?`,\n ); // TODO better error message\n }\n };\n\n mainLoop: while (this.#idx < this.#input.length) {\n const savedCharIndex = this.#idx;\n if ((stopBefore as string[]).includes(this.#input[this.#idx])) {\n return addCharIndices(algBuilder.toAlg(), algStartIdx, algEndIdx);\n }\n if (this.tryConsumeNext(\" \")) {\n crowded = false;\n if (algBuilder.experimentalNumAlgNodes() === 0) {\n algStartIdx = this.#idx;\n }\n // rome-ignore lint(correctness/noUnnecessaryContinue): This line allows for more robust refactoring.\n continue mainLoop;\n } else if (MOVE_START_REGEX.test(this.#input[this.#idx])) {\n mustNotBeCrowded(savedCharIndex);\n const move = this.parseMoveImpl();\n algBuilder.push(move);\n crowded = true;\n algEndIdx = this.#idx;\n\n // rome-ignore lint(correctness/noUnnecessaryContinue): This line allows for more robust refactoring.\n continue mainLoop;\n } else if (this.tryConsumeNext(\"(\")) {\n mustNotBeCrowded(savedCharIndex);\n const sq1PairStartMatch = this.tryRegex(SQUARE1_PAIR_START_REGEX);\n if (sq1PairStartMatch) {\n const topAmountString = sq1PairStartMatch[1];\n const savedCharIndexD = this.#idx;\n const sq1PairEndMatch = this.parseRegex(SQUARE1_PAIR_END_REGEX);\n const uMove = addCharIndices(\n new Move(new QuantumMove(\"U_SQ_\"), parseInt(topAmountString)),\n savedCharIndex + 1,\n savedCharIndex + 1 + topAmountString.length,\n );\n const dMove = addCharIndices(\n new Move(new QuantumMove(\"D_SQ_\"), parseInt(sq1PairEndMatch[1])),\n savedCharIndexD,\n this.#idx - 1,\n );\n const alg = addCharIndices(\n new Alg([uMove, dMove]),\n savedCharIndex + 1,\n this.#idx - 1,\n );\n algBuilder.push(\n addCharIndices(new Grouping(alg), savedCharIndex, this.#idx),\n );\n crowded = true;\n algEndIdx = this.#idx;\n\n // rome-ignore lint(correctness/noUnnecessaryContinue): This line allows for more robust refactoring.\n continue mainLoop;\n } else {\n const alg = this.parseAlgWithStopping([\")\"]);\n this.mustConsumeNext(\")\");\n const amount = this.parseAmount();\n algBuilder.push(\n addCharIndices(\n new Grouping(alg, amount),\n savedCharIndex,\n this.#idx,\n ),\n );\n crowded = true;\n algEndIdx = this.#idx;\n\n // rome-ignore lint(correctness/noUnnecessaryContinue): This line allows for more robust refactoring.\n continue mainLoop;\n }\n } else if (this.tryConsumeNext(\"^\")) {\n if (!algDebugGlobals.caratNISSNotationEnabled) {\n throw new Error(\n \"Alg contained a carat but carat NISS notation is not enabled.\",\n );\n }\n\n this.mustConsumeNext(\"(\");\n const alg = this.parseAlgWithStopping([\")\"]);\n this.popNext();\n\n const grouping = new Grouping(alg, -1);\n const placeholder = new Pause();\n\n grouping.experimentalNISSPlaceholder = placeholder;\n placeholder.experimentalNISSGrouping = grouping;\n\n this.#nissQueue.push(grouping);\n algBuilder.push(placeholder);\n } else if (this.tryConsumeNext(\"[\")) {\n mustNotBeCrowded(savedCharIndex);\n const A = this.parseAlgWithStopping([\",\", \":\"]);\n const separator = this.popNext();\n const B = this.parseAlgWithStopping([\"]\"]);\n this.mustConsumeNext(\"]\");\n switch (separator) {\n case \":\": {\n algBuilder.push(\n addCharIndices(new Conjugate(A, B), savedCharIndex, this.#idx),\n );\n crowded = true;\n algEndIdx = this.#idx;\n\n // rome-ignore lint(correctness/noUnnecessaryContinue): This line allows for more robust refactoring.\n continue mainLoop;\n }\n case \",\": {\n algBuilder.push(\n addCharIndices(new Commutator(A, B), savedCharIndex, this.#idx),\n );\n crowded = true;\n algEndIdx = this.#idx;\n\n // rome-ignore lint(correctness/noUnnecessaryContinue): This line allows for more robust refactoring.\n continue mainLoop;\n }\n default:\n throw new Error(\"unexpected parsing error\");\n }\n } else if (this.tryConsumeNext(\"\\n\")) {\n algBuilder.push(\n addCharIndices(new Newline(), savedCharIndex, this.#idx),\n );\n crowded = false;\n algEndIdx = this.#idx;\n\n // rome-ignore lint(correctness/noUnnecessaryContinue): This line allows for more robust refactoring.\n continue mainLoop;\n } else if (this.tryConsumeNext(\"/\")) {\n if (this.tryConsumeNext(\"/\")) {\n mustNotBeCrowded(savedCharIndex);\n const [text] = this.parseRegex(COMMENT_TEXT_REGEX);\n algBuilder.push(\n addCharIndices(new LineComment(text), savedCharIndex, this.#idx),\n );\n crowded = false;\n algEndIdx = this.#idx;\n\n // rome-ignore lint(correctness/noUnnecessaryContinue): This line allows for more robust refactoring.\n continue mainLoop;\n } else {\n // We allow crowding here to account for csTimer scrambles, which don't have a space between a Square-1 tuple and the following slash.\n algBuilder.push(\n addCharIndices(new Move(\"_SLASH_\"), savedCharIndex, this.#idx),\n );\n crowded = true;\n algEndIdx = this.#idx;\n\n // rome-ignore lint(correctness/noUnnecessaryContinue): This line allows for more robust refactoring.\n continue mainLoop;\n }\n } else if (this.tryConsumeNext(\".\")) {\n mustNotBeCrowded(savedCharIndex);\n algBuilder.push(addCharIndices(new Pause(), savedCharIndex, this.#idx));\n crowded = true;\n algEndIdx = this.#idx;\n\n // rome-ignore lint(correctness/noUnnecessaryContinue): This line allows for more robust refactoring.\n continue mainLoop;\n } else {\n throw new Error(`Unexpected character: ${this.popNext()}`);\n }\n }\n\n if (this.#idx !== this.#input.length) {\n throw new Error(\"did not finish parsing?\");\n }\n if (stopBefore.length > 0) {\n throw new Error(\"expected stopping\");\n }\n return addCharIndices(algBuilder.toAlg(), algStartIdx, algEndIdx);\n }\n\n private parseQuantumMoveImpl(): QuantumMove {\n const [, , , outerLayerStr, innerLayerStr, family] =\n this.parseRegex(QUANTUM_MOVE_REGEX);\n\n return new QuantumMove(\n family,\n parseIntWithEmptyFallback(innerLayerStr, undefined),\n parseIntWithEmptyFallback(outerLayerStr, undefined),\n );\n }\n\n private parseMoveImpl(): Parsed<Move> {\n const savedCharIndex = this.#idx;\n\n if (this.tryConsumeNext(\"/\")) {\n return addCharIndices(new Move(\"_SLASH_\"), savedCharIndex, this.#idx);\n }\n\n let quantumMove = this.parseQuantumMoveImpl();\n // Only `hadEmptyAbsAmount` is `const`.\n let [amount, hadEmptyAbsAmount] = this.parseAmountAndTrackEmptyAbsAmount();\n const suffix = this.parseMoveSuffix();\n\n if (suffix) {\n if (amount < 0) {\n throw new Error(\"uh-oh\");\n }\n if ((suffix === \"++\" || suffix === \"--\") && amount !== 1) {\n // TODO: Handle 1 vs. null\n throw new Error(\n \"Pochmann ++ or -- moves cannot have an amount other than 1.\",\n );\n }\n if ((suffix === \"++\" || suffix === \"--\") && !hadEmptyAbsAmount) {\n throw new Error(\n \"Pochmann ++ or -- moves cannot have an amount written as a number.\",\n );\n }\n if ((suffix === \"+\" || suffix === \"-\") && hadEmptyAbsAmount) {\n throw new Error(\n \"Clock dial moves must have an amount written as a natural number followed by + or -.\",\n );\n }\n if (suffix.startsWith(\"+\")) {\n quantumMove = quantumMove.modified({\n family: `${quantumMove.family}_${\n suffix === \"+\" ? \"PLUS\" : \"PLUSPLUS\"\n }_`, // TODO\n });\n }\n if (suffix.startsWith(\"-\")) {\n quantumMove = quantumMove.modified({\n family: `${quantumMove.family}_${\n suffix === \"-\" ? \"PLUS\" : \"PLUSPLUS\"\n }_`, // TODO\n });\n amount *= -1;\n }\n }\n\n const move = addCharIndices(\n new Move(quantumMove, amount),\n savedCharIndex,\n this.#idx,\n );\n return move;\n }\n\n private parseMoveSuffix(): MoveSuffix | null {\n if (this.tryConsumeNext(\"+\")) {\n if (this.tryConsumeNext(\"+\")) {\n return \"++\";\n }\n return \"+\";\n }\n if (this.tryConsumeNext(\"-\")) {\n if (this.tryConsumeNext(\"-\")) {\n return \"--\";\n }\n return \"-\";\n }\n return null;\n }\n\n private parseAmountAndTrackEmptyAbsAmount(): [number, boolean] {\n const savedIdx = this.#idx;\n const [, absAmountStr, primeStr] = this.parseRegex(AMOUNT_REGEX);\n if (absAmountStr?.startsWith(\"0\") && absAmountStr !== \"0\") {\n throw new Error(\n `Error at char index ${savedIdx}: An amount can only start with 0 if it's exactly the digit 0.`,\n );\n }\n return [\n parseIntWithEmptyFallback(absAmountStr, 1) * (primeStr === \"'\" ? -1 : 1),\n !absAmountStr,\n ];\n }\n\n private parseAmount(): number {\n const savedIdx = this.#idx;\n const [, absAmountStr, primeStr] = this.parseRegex(AMOUNT_REGEX);\n if (absAmountStr?.startsWith(\"0\") && absAmountStr !== \"0\") {\n throw new Error(\n `Error at char index ${savedIdx}: An amount number can only start with 0 if it's exactly the digit 0.`,\n );\n }\n return (\n parseIntWithEmptyFallback(absAmountStr, 1) * (primeStr === \"'\" ? -1 : 1)\n );\n }\n\n private parseRegex(regex: RegExp): RegExpExecArray {\n const arr = regex.exec(this.remaining());\n if (arr === null) {\n throw new Error(\"internal parsing error\"); // TODO\n }\n this.#idx += arr[0].length;\n return arr;\n }\n\n // TOD: can we avoid this?\n private tryRegex(regex: RegExp): RegExpExecArray | null {\n const arr = regex.exec(this.remaining());\n if (arr === null) {\n return null;\n }\n this.#idx += arr[0].length;\n return arr;\n }\n\n private remaining(): string {\n return this.#input.slice(this.#idx);\n }\n\n private popNext(): string {\n const next = this.#input[this.#idx];\n this.#idx++;\n return next;\n }\n\n private tryConsumeNext(expected: string): boolean {\n if (this.#input[this.#idx] === expected) {\n this.#idx++;\n return true;\n }\n return false;\n }\n\n private mustConsumeNext(expected: string): string {\n const next = this.popNext();\n if (next !== expected) {\n throw new Error(\n `expected \\`${expected}\\` while parsing, encountered ${next}`,\n ); // TODO: be more helpful\n }\n return next;\n }\n}\n", "const warned = new Set<string>();\nexport function warnOnce(s: string): void {\n if (!warned.has(s)) {\n console.warn(s);\n warned.add(s);\n }\n}\n", "import type { Repeatable } from \"../common\";\nimport { IterationDirection, toggleDirection } from \"../iteration\";\nimport { MAX_INT, MAX_INT_DESCRIPTION, MIN_INT } from \"../limits\";\nimport type { AlgLeaf } from \"./AlgNode\";\n\nexport class QuantumWithAmount<Q extends Repeatable> {\n readonly quantum: Q;\n readonly amount: number;\n\n constructor(quantum: Q, amount: number = 1) {\n this.quantum = quantum;\n this.amount = amount;\n\n if (\n !Number.isInteger(this.amount) ||\n this.amount < MIN_INT ||\n this.amount > MAX_INT\n ) {\n throw new Error(\n `AlgNode amount absolute value must be a non-negative integer below ${MAX_INT_DESCRIPTION}.`,\n );\n }\n }\n\n suffix(): string {\n let s: string = \"\";\n // TODO\n const absAmount = Math.abs(this.amount);\n if (absAmount !== 1) {\n s += absAmount;\n }\n if (this.amount < 0) {\n s += \"'\";\n }\n return s;\n }\n\n isIdentical(other: QuantumWithAmount<Q>): boolean {\n return (\n this.quantum.isIdentical(other.quantum) && this.amount === other.amount\n );\n }\n\n // TODO: `Conjugate` and `Commutator` decrement `depth` inside the quantum, `Grouping` has to do it outside the quantum.\n *experimentalExpand(\n iterDir: IterationDirection,\n depth: number,\n ): Generator<AlgLeaf> {\n const absAmount = Math.abs(this.amount);\n const newIterDir = toggleDirection(iterDir, this.amount < 0);\n for (let i = 0; i < absAmount; i++) {\n yield* this.quantum.experimentalExpand(newIterDir, depth);\n }\n }\n}\n", "import { AlgCommon, Comparable } from \"../../common\";\nimport { IterationDirection } from \"../../iteration\";\nimport { MAX_INT, MAX_INT_DESCRIPTION } from \"../../limits\";\nimport { parseMove, parseQuantumMove, transferCharIndex } from \"../../parseAlg\";\nimport { warnOnce } from \"../../warnOnce\";\nimport { QuantumWithAmount } from \"../QuantumWithAmount\";\nimport type { AlgLeaf } from \"../AlgNode\";\n\ninterface QuantumMoveModifications {\n outerLayer?: number;\n innerLayer?: number;\n family?: string;\n}\n\nexport class QuantumMove extends Comparable {\n readonly #family: string;\n readonly #innerLayer: number | null;\n readonly #outerLayer: number | null;\n\n constructor(\n family: string,\n innerLayer?: number | null,\n outerLayer?: number | null,\n ) {\n super();\n this.#family = family;\n this.#innerLayer = innerLayer ?? null;\n this.#outerLayer = outerLayer ?? null;\n Object.freeze(this);\n\n if (\n this.#innerLayer !== null &&\n (!Number.isInteger(this.#innerLayer) ||\n this.#innerLayer < 1 ||\n this.#innerLayer > MAX_INT)\n ) {\n throw new Error(\n `QuantumMove inner layer must be a positive integer below ${MAX_INT_DESCRIPTION}.`,\n );\n }\n\n if (\n this.#outerLayer !== null &&\n (!Number.isInteger(this.#outerLayer) ||\n this.#outerLayer < 1 ||\n this.#outerLayer > MAX_INT)\n ) {\n throw new Error(\n `QuantumMove outer layer must be a positive integer below ${MAX_INT_DESCRIPTION}.`,\n );\n }\n\n if (\n this.#outerLayer !== null &&\n this.#innerLayer !== null &&\n this.#innerLayer <= this.#outerLayer\n ) {\n throw new Error(\n \"QuantumMove outer layer must be smaller than inner layer.\",\n );\n }\n\n if (this.#outerLayer !== null && this.#innerLayer === null) {\n throw new Error(\n \"QuantumMove with an outer layer must have an inner layer\",\n ); // TODO: test\n }\n }\n\n static fromString(s: string): QuantumMove {\n return parseQuantumMove(s);\n }\n\n // TODO: `modify`?\n modified(modifications: QuantumMoveModifications): QuantumMove {\n return new QuantumMove(\n modifications.family ?? this.#family,\n modifications.innerLayer ?? this.#innerLayer,\n modifications.outerLayer ?? this.#outerLayer,\n );\n }\n\n isIdentical(other: QuantumMove): boolean {\n const otherAsQuantumMove = other;\n return (\n other.is(QuantumMove) &&\n this.#family === otherAsQuantumMove.#family &&\n this.#innerLayer === otherAsQuantumMove.#innerLayer &&\n this.#outerLayer === otherAsQuantumMove.#outerLayer\n );\n }\n\n // TODO: provide something more useful on average.\n /** @deprecated */\n get family(): string {\n return this.#family;\n }\n\n // TODO: provide something more useful on average.\n /** @deprecated */\n get outerLayer(): number | null {\n return this.#outerLayer;\n }\n\n // TODO: provide something more useful on average.\n /** @deprecated */\n get innerLayer(): number | null {\n return this.#innerLayer;\n }\n\n experimentalExpand(): Generator<AlgLeaf> {\n throw new Error(\n \"experimentalExpand() cannot be called on a `QuantumMove` directly.\",\n );\n }\n\n toString(): string {\n let s = this.#family;\n if (this.#innerLayer !== null) {\n s = String(this.#innerLayer) + s;\n if (this.#outerLayer !== null) {\n s = `${String(this.#outerLayer)}-${s}`;\n }\n }\n return s;\n }\n}\n\nexport interface MoveModifications {\n outerLayer?: number;\n innerLayer?: number;\n family?: string;\n amount?: number;\n}\n\n/** @category Alg Nodes */\nexport class Move extends AlgCommon<Move> {\n readonly #quantumWithAmount: QuantumWithAmount<QuantumMove>;\n\n constructor(\n ...args: [QuantumMove] | [QuantumMove, number] | [string] | [string, number]\n ) {\n super();\n if (typeof args[0] === \"string\") {\n if (args[1] ?? null) {\n this.#quantumWithAmount = new QuantumWithAmount(\n QuantumMove.fromString(args[0]),\n args[1],\n );\n return;\n } else {\n return Move.fromString(args[0]); // TODO: can we return here?\n }\n }\n this.#quantumWithAmount = new QuantumWithAmount<QuantumMove>(\n args[0],\n args[1],\n );\n }\n\n isIdentical(other: Comparable): boolean {\n const otherAsMove = other.as(Move);\n return (\n !!otherAsMove &&\n this.#quantumWithAmount.isIdentical(otherAsMove.#quantumWithAmount)\n );\n }\n\n invert(): Move {\n // TODO: handle char indices more consistently among alg nodes.\n return transferCharIndex(\n this,\n new Move(this.#quantumWithAmount.quantum, -this.amount),\n );\n }\n\n *experimentalExpand(\n iterDir: IterationDirection = IterationDirection.Forwards,\n ): Generator<AlgLeaf> {\n if (iterDir === IterationDirection.Forwards) {\n yield this;\n } else {\n yield this.modified({\n amount: -this.amount,\n });\n }\n }\n\n get quantum(): QuantumMove {\n return this.#quantumWithAmount.quantum;\n }\n\n // TODO: `modify`?\n modified(modifications: MoveModifications): Move {\n // TODO: Avoid creating a new quantum move\n return new Move(\n this.#quantumWithAmount.quantum.modified(modifications),\n modifications.amount ?? this.amount,\n );\n }\n\n static fromString(s: string): Move {\n return parseMove(s);\n }\n\n get amount(): number {\n return this.#quantumWithAmount.amount;\n }\n\n /** @deprecated */\n get type(): string {\n warnOnce(\"deprecated: type\");\n return \"blockMove\";\n }\n\n /** @deprecated */\n get family(): string {\n return this.#quantumWithAmount.quantum.family ?? undefined;\n }\n\n /** @deprecated */\n get outerLayer(): number | undefined {\n return this.#quantumWithAmount.quantum.outerLayer ?? undefined;\n }\n\n /** @deprecated */\n get innerLayer(): number | undefined {\n return this.#quantumWithAmount.quantum.innerLayer ?? undefined;\n }\n\n toString(): string {\n if (this.family === \"_SLASH_\") {\n return \"/\"; // TODO: validate no amount\n }\n if (this.family.endsWith(\"_PLUS_\")) {\n return (\n this.#quantumWithAmount.quantum.toString().slice(0, -6) +\n Math.abs(this.amount) +\n (this.amount < 0 ? \"-\" : \"+\")\n ); // TODO\n }\n if (this.family.endsWith(\"_PLUSPLUS_\")) {\n const absAmount = Math.abs(this.amount);\n return (\n this.#quantumWithAmount.quantum.toString().slice(0, -10) +\n (absAmount === 1 ? \"\" : absAmount) +\n (this.amount < 0 ? \"--\" : \"++\")\n ); // TODO\n }\n\n return (\n this.#quantumWithAmount.quantum.toString() +\n this.#quantumWithAmount.suffix()\n );\n }\n // // TODO: Serialize as a string?\n // toJSON(): MoveJSON {\n // return {\n // type: \"move\",\n // family: this.family,\n // innerLayer: this.innerLayer,\n // outerLayer: this.outerLayer,\n // };\n // }\n}\n", "import { Alg, experimentalEnsureAlg, FlexibleAlgSource } from \"../../Alg\";\nimport { AlgCommon, Comparable } from \"../../common\";\nimport { IterationDirection } from \"../../iteration\";\nimport { Move, QuantumMove } from \"../leaves/Move\";\nimport type { Pause } from \"../leaves/Pause\";\nimport { QuantumWithAmount } from \"../QuantumWithAmount\";\nimport type { AlgLeaf } from \"../AlgNode\";\n\n// This is a workaround for `jest`, which doesn't handle cycles of imports inside `cubing/alg`.\n// We need to lazy-initialize the reusable quantum moves for Square-1, so we create this wrapper for it.\nclass Square1TupleFormatter {\n quantumU_SQ_: QuantumMove | null = null;\n quantumD_SQ_: QuantumMove | null = null;\n\n format(grouping: Grouping): string | null {\n const amounts = this.tuple(grouping);\n if (!amounts) {\n return null;\n }\n return `(${amounts.map((move) => move.amount).join(\", \")})`;\n }\n\n tuple(grouping: Grouping): [moveU: Move, moveD: Move] | null {\n this.quantumU_SQ_ ||= new QuantumMove(\"U_SQ_\");\n this.quantumD_SQ_ ||= new QuantumMove(\"D_SQ_\");\n\n const quantumAlg = grouping.alg;\n if (quantumAlg.experimentalNumChildAlgNodes() === 2) {\n const [U, D] = quantumAlg.childAlgNodes();\n if (\n U.as(Move)?.quantum.isIdentical(this.quantumU_SQ_) &&\n D.as(Move)?.quantum.isIdentical(this.quantumD_SQ_)\n ) {\n if (grouping.amount !== 1) {\n throw new Error(\n \"Square-1 tuples cannot have an amount other than 1.\",\n );\n }\n return [U as Move, D as Move]; // TODO: can we reuse the casting from above?\n }\n }\n return null;\n }\n}\nconst square1TupleFormatterInstance = new Square1TupleFormatter();\n\n/** @category Alg Nodes */\nexport class Grouping extends AlgCommon<Grouping> {\n readonly #quantumWithAmount: QuantumWithAmount<Alg>;\n experimentalNISSPlaceholder?: Pause; // TODO: tie this to the alg\n\n constructor(algSource: FlexibleAlgSource, amount?: number) {\n super();\n const alg = experimentalEnsureAlg(algSource);\n this.#quantumWithAmount = new QuantumWithAmount(alg, amount);\n }\n\n isIdentical(other: Comparable): boolean {\n const otherAsGrouping = other as Grouping;\n return (\n other.is(Grouping) &&\n this.#quantumWithAmount.isIdentical(otherAsGrouping.#quantumWithAmount)\n );\n }\n\n get alg(): Alg {\n return this.#quantumWithAmount.quantum;\n }\n\n get amount(): number {\n return this.#quantumWithAmount.amount;\n }\n\n /** @deprecated */\n get experimentalRepetitionSuffix(): string {\n return this.#quantumWithAmount.suffix();\n }\n\n invert(): Grouping {\n return new Grouping(\n this.#quantumWithAmount.quantum,\n -this.#quantumWithAmount.amount,\n );\n }\n\n *experimentalExpand(\n iterDir: IterationDirection = IterationDirection.Forwards,\n depth?: number,\n ): Generator<AlgLeaf> {\n depth ??= Infinity;\n if (depth === 0) {\n yield iterDir === IterationDirection.Forwards ? this : this.invert();\n } else {\n yield* this.#quantumWithAmount.experimentalExpand(iterDir, depth - 1);\n }\n }\n\n static fromString(): Grouping {\n throw new Error(\"unimplemented\");\n }\n\n toString(): string {\n return (\n square1TupleFormatterInstance.format(this) ??\n `(${this.#quantumWithAmount.quantum.toString()})${this.#quantumWithAmount.suffix()}`\n );\n }\n\n experimentalAsSquare1Tuple(): [moveU: Move, moveD: Move] | null {\n return square1TupleFormatterInstance.tuple(this);\n }\n // toJSON(): GroupingJSON {\n // return {\n // type: \"grouping\",\n // alg: this.#quanta.quantum.toJSON(),\n // };\n // }\n}\n", "import type { Alg } from \"./Alg\";\nimport {\n Commutator,\n Conjugate,\n Grouping,\n LineComment,\n Move,\n Newline,\n Pause,\n} from \"./alg-nodes\";\n\nexport function experimentalIs(\n v: any,\n c:\n | typeof Alg\n | typeof Grouping\n | typeof LineComment\n | typeof Commutator\n | typeof Conjugate\n | typeof Move\n | typeof Newline\n | typeof Pause,\n): boolean {\n return v instanceof c;\n}\nexport function experimentalIsAlgNode(v: any): boolean {\n return (\n experimentalIs(v, Grouping) ||\n experimentalIs(v, LineComment) ||\n experimentalIs(v, Commutator) ||\n experimentalIs(v, Conjugate) ||\n experimentalIs(v, Move) ||\n experimentalIs(v, Newline) ||\n experimentalIs(v, Pause)\n );\n}\n", "import type { Alg } from \"./Alg\";\nimport type { AlgNode } from \"./alg-nodes/AlgNode\";\nimport { Commutator } from \"./alg-nodes/containers/Commutator\";\nimport { Conjugate } from \"./alg-nodes/containers/Conjugate\";\nimport { Grouping } from \"./alg-nodes/containers/Grouping\";\nimport { LineComment } from \"./alg-nodes/leaves/LineComment\";\nimport { Move } from \"./alg-nodes/leaves/Move\";\nimport { Newline } from \"./alg-nodes/leaves/Newline\";\nimport { Pause } from \"./alg-nodes/leaves/Pause\";\nimport type { Comparable } from \"./common\";\n\nfunction dispatch<DataDown, DataAlgUp, DataAlgNodeUp>(\n t: TraversalDownUp<DataDown, DataAlgUp, DataAlgNodeUp>,\n algNode: AlgNode,\n dataDown: DataDown,\n): DataAlgNodeUp {\n // TODO: Can we turn this back into a `switch` or something more efficiently?\n if (algNode.is(Grouping)) {\n return t.traverseGrouping(algNode as Grouping, dataDown);\n }\n if (algNode.is(Move)) {\n return t.traverseMove(algNode as Move, dataDown);\n }\n if (algNode.is(Commutator)) {\n return t.traverseCommutator(algNode as Commutator, dataDown);\n }\n if (algNode.is(Conjugate)) {\n return t.traverseConjugate(algNode as Conjugate, dataDown);\n }\n if (algNode.is(Pause)) {\n return t.traversePause(algNode as Pause, dataDown);\n }\n if (algNode.is(Newline)) {\n return t.traverseNewline(algNode as Newline, dataDown);\n }\n if (algNode.is(LineComment)) {\n return t.traverseLineComment(algNode as LineComment, dataDown);\n }\n throw new Error(\"unknown AlgNode\");\n}\n\nfunction mustBeAlgNode(t: Comparable): AlgNode {\n if (\n t.is(Grouping) ||\n t.is(Move) ||\n t.is(Commutator) ||\n t.is(Conjugate) ||\n t.is(Pause) ||\n t.is(Newline) ||\n t.is(LineComment)\n ) {\n return t as AlgNode;\n }\n throw new Error(\"internal error: expected AlgNode\"); // TODO: Make more helpful, add tests\n}\n\nexport abstract class TraversalDownUp<\n DataDown,\n DataAlgUp,\n DataAlgNodeUp = DataAlgUp,\n> {\n // Immediate subclasses should overwrite this.\n public traverseAlgNode(algNode: AlgNode, dataDown: DataDown): DataAlgNodeUp {\n return dispatch(this, algNode, dataDown);\n }\n\n public traverseIntoAlgNode(algNode: AlgNode, dataDown: DataDown): AlgNode {\n return mustBeAlgNode(this.traverseAlgNode(algNode, dataDown) as any);\n }\n\n public abstract traverseAlg(alg: Alg, dataDown: DataDown): DataAlgUp;\n\n public abstract traverseGrouping(\n grouping: Grouping,\n dataDown: DataDown,\n ): DataAlgNodeUp;\n\n public abstract traverseMove(move: Move, dataDown: DataDown): DataAlgNodeUp;\n\n public abstract traverseCommutator(\n commutator: Commutator,\n dataDown: DataDown,\n ): DataAlgNodeUp;\n\n public abstract traverseConjugate(\n conjugate: Conjugate,\n dataDown: DataDown,\n ): DataAlgNodeUp;\n\n public abstract traversePause(\n pause: Pause,\n dataDown: DataDown,\n ): DataAlgNodeUp;\n public abstract traverseNewline(\n newline: Newline,\n dataDown: DataDown,\n ): DataAlgNodeUp;\n\n public abstract traverseLineComment(\n comment: LineComment,\n dataDown: DataDown,\n ): DataAlgNodeUp;\n}\n\nexport abstract class TraversalUp<\n DataAlgUp,\n DataAlgNodeUp = DataAlgUp,\n> extends TraversalDownUp<undefined, DataAlgUp, DataAlgNodeUp> {\n public traverseAlgNode(algNode: AlgNode): DataAlgNodeUp {\n return dispatch<unknown, DataAlgUp, DataAlgNodeUp>(\n this,\n algNode,\n undefined,\n );\n }\n\n public traverseIntoAlgNode(algNode: AlgNode): AlgNode {\n return mustBeAlgNode(this.traverseAlgNode(algNode) as any);\n }\n\n public abstract traverseAlg(alg: Alg): DataAlgUp;\n public abstract traverseGrouping(grouping: Grouping): DataAlgNodeUp;\n public abstract traverseMove(move: Move): DataAlgNodeUp;\n public abstract traverseCommutator(commutator: Commutator): DataAlgNodeUp;\n public abstract traverseConjugate(conjugate: Conjugate): DataAlgNodeUp;\n public abstract traversePause(pause: Pause): DataAlgNodeUp;\n public abstract traverseNewline(newline: Newline): DataAlgNodeUp;\n public abstract traverseLineComment(comment: LineComment): DataAlgNodeUp;\n}\n\nexport function functionFromTraversal<\n DataDown,\n DataAlgUp,\n ConstructorArgs extends unknown[],\n>(\n traversalConstructor: {\n new (...args: ConstructorArgs): TraversalDownUp<DataDown, DataAlgUp, any>;\n },\n constructorArgs?: ConstructorArgs,\n): undefined extends DataDown\n ? (alg: Alg) => DataAlgUp\n : (alg: Alg, v: DataDown) => DataAlgUp {\n const instance = new traversalConstructor(\n ...(constructorArgs ?? ([] as any)),\n );\n return instance.traverseAlg.bind(instance);\n}\n", "import type { Move, QuantumMove } from \"../alg-nodes\";\n\n// TODO: enums?\nconst DEFAULT_DIRECTIONAL = \"any-direction\";\nDEFAULT_DIRECTIONAL;\nexport type QuantumDirectionalCancellation =\n | typeof DEFAULT_DIRECTIONAL // Cancel any moves with the same quantum.\n | \"same-direction\" // Cancel two quantums when have non-zero amounts of the same sign (positive/negative). An amount of 0 always counts as the same direction as any other amount.\n | \"none\";\n\n// Example input: `R7' . R6' . R5' . R6` on a cube.\nexport type ModWrap =\n | \"none\" // R7' . R6' . R5' . R6\n | \"gravity\" // R . R2' . R' . R2\n | \"canonical-centered\" // R . R2 . R' . R2\n | \"canonical-positive\" // R . R2 . R3 . R2\n | \"preserve-sign\"; // R3' . R2' . R' . R2\n\nexport interface AppendCancelOptions {\n directional?: QuantumDirectionalCancellation;\n puzzleSpecificModWrap?: ModWrap; // Default depends on `directional`\n}\n\n// TODO: preserve single moves even when amount is 0?\nexport interface AppendOptions {\n cancel?: boolean | AppendCancelOptions; // Set to `true` to use future-proof defaults.\n // Takes precedence over the direct `puzzleSpecificSimplifyOptions` field.\n puzzleLoader?: {\n puzzleSpecificSimplifyOptions?: PuzzleSpecificSimplifyOptions;\n };\n puzzleSpecificSimplifyOptions?: PuzzleSpecificSimplifyOptions;\n}\n\nexport class AppendOptionsHelper {\n constructor(private config: AppendOptions = {}) {}\n\n cancelQuantum(): QuantumDirectionalCancellation {\n const { cancel } = this.config;\n if (cancel === true) {\n return DEFAULT_DIRECTIONAL;\n }\n if (cancel === false) {\n return \"none\";\n }\n return cancel?.directional ?? \"none\";\n }\n\n cancelAny() {\n return this.config.cancel && this.cancelQuantum() !== \"none\";\n }\n\n cancelPuzzleSpecificModWrap(): ModWrap {\n const { cancel } = this.config;\n if (cancel === true || cancel === false) {\n return \"canonical-centered\";\n }\n if (cancel?.puzzleSpecificModWrap) {\n return cancel?.puzzleSpecificModWrap;\n }\n return cancel?.directional === \"same-direction\"\n ? \"preserve-sign\"\n : \"canonical-centered\";\n }\n\n puzzleSpecificSimplifyOptions(): PuzzleSpecificSimplifyOptions | undefined {\n return (\n this.config.puzzleLoader?.puzzleSpecificSimplifyOptions ??\n this.config.puzzleSpecificSimplifyOptions\n );\n }\n}\n\nexport interface SimplifyOptions extends AppendOptions {\n depth?: number | null; // TODO: test\n}\n\nexport interface PuzzleSpecificAxisSimplifyInfo {\n // All moves on the same axis *must* commute.\n areQuantumMovesSameAxis: (\n quantumMove1: QuantumMove,\n quantumMove2: QuantumMove,\n ) => boolean;\n simplifySameAxisMoves: (moves: Move[], quantumMod: boolean) => Move[];\n}\n\n// TOOD: allow \"normal\" \"twisty\" puzzles to hardcode axis concepts without hardcoding too much in `Alg` that's not relevant to all puzzles.\nexport interface PuzzleSpecificSimplifyOptions {\n quantumMoveOrder?: (quantumMove: QuantumMove) => number;\n // TODO: implement cancellation for non-axis commuting moves (e.g. Megaminx: `BL R BL'` \u2192 `R`)\n // // Commutation is not transitive. For example, on Megaminx: BR and BL both commute with F, but not with each other.\n // doQuantumMovesCommute?: (\n // quantumMove1: QuantumMove,\n // quantumMove2: QuantumMove,\n // ) => boolean;\n axis?: PuzzleSpecificAxisSimplifyInfo;\n}\n", "import { Alg } from \"../Alg\";\nimport type { AlgNode } from \"../alg-nodes\";\nimport type { AlgLeaf } from \"../alg-nodes/AlgNode\";\nimport { Move } from \"../alg-nodes/leaves/Move\";\nimport { AppendOptions, AppendOptionsHelper } from \"./options\";\n\nfunction areSameDirection(direction: -1 | 1, move2: Move): boolean {\n // This multiplication has two properties:\n // - If either amount is 0, returns true.\n // - Otherwise, the signs have to match.\n return direction * Math.sign(move2.amount) >= 0;\n}\n\nfunction offsetMod(x: number, positiveMod: number, offset: number): number {\n return ((((x - offset) % positiveMod) + positiveMod) % positiveMod) + offset;\n}\n\nexport function experimentalAppendMove(\n alg: Alg,\n addedMove: Move,\n options?: AppendOptions,\n): Alg {\n const optionsHelper = new AppendOptionsHelper(options);\n\n let outputPrefix: AlgNode[] = Array.from(alg.childAlgNodes());\n let outputSuffix: Move[] = [addedMove];\n function output() {\n return new Alg([...outputPrefix, ...outputSuffix]); // TODO: What's the most efficient way to do this?\n }\n\n function modMove(move: Move): Move {\n if (optionsHelper.cancelPuzzleSpecificModWrap() === \"none\") {\n return move;\n }\n const quantumMoveOrder =\n optionsHelper.puzzleSpecificSimplifyOptions()?.quantumMoveOrder;\n if (!quantumMoveOrder) {\n return move;\n }\n const mod = quantumMoveOrder(addedMove.quantum)!; // TODO: throw if `undefined`?\n let offset: number;\n switch (optionsHelper.cancelPuzzleSpecificModWrap()) {\n case \"gravity\": {\n offset = -Math.floor((mod - (move.amount < 0 ? 0 : 1)) / 2); // TODO: dedup this calculation for the most common path?\n break;\n }\n case \"canonical-centered\": {\n offset = -Math.floor((mod - 1) / 2); // TODO: dedup this calculation for the most common path?\n break;\n }\n case \"canonical-positive\": {\n offset = 0;\n break;\n }\n case \"preserve-sign\": {\n offset = move.amount < 0 ? 1 - mod : 0;\n break;\n }\n default: {\n throw new Error(\"Unknown mod wrap\");\n }\n }\n let offsetAmount = offsetMod(move.amount, mod, offset);\n return move.modified({ amount: offsetAmount });\n }\n\n if (optionsHelper.cancelAny()) {\n let canCancelMoveBasedOnQuantum: (move: Move) => boolean;\n const axis = optionsHelper.puzzleSpecificSimplifyOptions()?.axis;\n if (axis) {\n canCancelMoveBasedOnQuantum = (move: Move): boolean =>\n axis.areQuantumMovesSameAxis(addedMove.quantum, move.quantum);\n } else {\n const newMoveQuantumString = addedMove.quantum.toString();\n canCancelMoveBasedOnQuantum = (move: Move): boolean =>\n move.quantum.toString() === newMoveQuantumString;\n }\n\n const sameDirectionOnly =\n optionsHelper.cancelQuantum() === \"same-direction\";\n\n const quantumDirections = new Map<string, 1 | 0 | -1>();\n quantumDirections.set(\n addedMove.quantum.toString(),\n Math.sign(addedMove.amount) as -1 | 0 | 1,\n );\n let i: number;\n for (i = outputPrefix.length - 1; i >= 0; i--) {\n const move = outputPrefix[i].as(Move);\n if (!move) {\n break;\n }\n if (!canCancelMoveBasedOnQuantum(move)) {\n break;\n }\n const quantumKey = move.quantum.toString();\n if (sameDirectionOnly) {\n const existingQuantumDirectionOnAxis =\n quantumDirections.get(quantumKey);\n if (\n existingQuantumDirectionOnAxis && // Short-circuits, but that's actually okay here.\n !areSameDirection(existingQuantumDirectionOnAxis, move)\n ) {\n break;\n }\n quantumDirections.set(quantumKey, Math.sign(move.amount) as -1 | 0 | 1);\n }\n }\n const suffix = [...(outputPrefix.splice(i + 1) as Move[]), addedMove];\n\n if (axis) {\n // TODO: pass down quantum mod\n outputSuffix = axis.simplifySameAxisMoves(\n suffix,\n optionsHelper.cancelPuzzleSpecificModWrap() !== \"none\",\n );\n } else {\n let amount = suffix.reduce(\n (sum: number, move: Move) => sum + move.amount,\n 0,\n );\n if (quantumDirections.size !== 1) {\n throw new Error(\n \"Internal error: multiple quantums when one was expected\",\n );\n }\n outputSuffix = [new Move(addedMove.quantum, amount)];\n }\n }\n outputSuffix = outputSuffix\n .map((m) => modMove(m))\n .filter((move: Move) => move.amount !== 0);\n return output();\n}\n\nexport function experimentalAppendNode(\n alg: Alg,\n leaf: AlgLeaf,\n options: AppendOptions,\n): Alg {\n const maybeMove = leaf.as(Move);\n if (maybeMove) {\n return experimentalAppendMove(alg, maybeMove, options);\n } else {\n return new Alg([...alg.childAlgNodes(), leaf]);\n }\n}\n", "import { Alg } from \"../Alg\";\nimport type { AlgNode } from \"../alg-nodes/AlgNode\";\nimport { Commutator } from \"../alg-nodes/containers/Commutator\";\nimport { Conjugate } from \"../alg-nodes/containers/Conjugate\";\nimport { Grouping } from \"../alg-nodes/containers/Grouping\";\nimport type { LineComment } from \"../alg-nodes/leaves/LineComment\";\nimport { Move } from \"../alg-nodes/leaves/Move\";\nimport type { Newline } from \"../alg-nodes/leaves/Newline\";\nimport { Pause } from \"../alg-nodes/leaves/Pause\";\nimport { functionFromTraversal, TraversalDownUp } from \"../traversal\";\nimport { experimentalAppendNode } from \"./append\";\nimport { AppendOptionsHelper, SimplifyOptions } from \"./options\";\n\n// TODO: Test that inverses are bijections.\nclass Simplify extends TraversalDownUp<SimplifyOptions, Generator<AlgNode>> {\n #newPlaceholderAssociationsMap?: Map<Grouping, Pause>;\n #newPlaceholderAssociations(): Map<Grouping, Pause> {\n return (this.#newPlaceholderAssociationsMap ??= new Map<Grouping, Pause>());\n }\n\n // TODO: avoid allocations?\n #descendOptions(options: SimplifyOptions): SimplifyOptions {\n return {\n ...options,\n depth: options.depth ? options.depth - 1 : null,\n };\n }\n\n // TODO: Handle\n public *traverseAlg(alg: Alg, options: SimplifyOptions): Generator<AlgNode> {\n if (options.depth === 0) {\n yield* alg.childAlgNodes();\n return;\n }\n\n let output: AlgNode[] = [];\n\n const newOptions: SimplifyOptions = this.#descendOptions(options); // TODO: avoid allocations?\n for (const algNode of alg.childAlgNodes()) {\n for (const traversedNode of this.traverseAlgNode(algNode, newOptions)) {\n output = Array.from(\n experimentalAppendNode(\n new Alg(output),\n traversedNode,\n newOptions,\n ).childAlgNodes(),\n );\n }\n }\n\n // TODO: try to use `yield* output[Symbol.iterator]();`?\n for (const newAlgNode of output) {\n yield newAlgNode;\n }\n }\n\n public *traverseGrouping(\n grouping: Grouping,\n options: SimplifyOptions,\n ): Generator<AlgNode> {\n if (options.depth === 0) {\n yield grouping;\n return;\n }\n if (grouping.amount === 0) {\n // TODO: Are we okay with throwing away nested comments?\n return;\n }\n const newGrouping = new Grouping(\n this.traverseAlg(grouping.alg, this.#descendOptions(options)),\n grouping.amount,\n );\n if (newGrouping.alg.experimentalIsEmpty()) {\n return;\n }\n\n const newPlaceholder = this.#newPlaceholderAssociations().get(grouping);\n if (newPlaceholder) {\n newGrouping.experimentalNISSPlaceholder = newPlaceholder;\n newPlaceholder.experimentalNISSGrouping = newGrouping;\n }\n\n yield newGrouping;\n }\n\n public *traverseMove(\n move: Move,\n _options: SimplifyOptions,\n ): Generator<AlgNode> {\n yield move;\n }\n\n #doChildrenCommute(A: Alg, B: Alg, options: SimplifyOptions): boolean {\n if (\n A.experimentalNumChildAlgNodes() === 1 &&\n B.experimentalNumChildAlgNodes() === 1\n ) {\n // Handle the special case where each side has been reduced to a single move.\n const aMove = Array.from(A.childAlgNodes())[0]?.as(Move);\n const bMove = Array.from(B.childAlgNodes())[0]?.as(Move);\n if (!(aMove && bMove)) {\n return false;\n }\n if (bMove.quantum.isIdentical(aMove.quantum)) {\n return true;\n }\n const appendOptionsHelper = new AppendOptionsHelper(options); // TODO: avoid re-allocating every time.\n if (\n appendOptionsHelper\n .puzzleSpecificSimplifyOptions()\n ?.axis?.areQuantumMovesSameAxis(aMove.quantum, bMove.quantum)\n ) {\n return true;\n }\n }\n return false;\n }\n\n public *traverseCommutator(\n commutator: Commutator,\n options: SimplifyOptions,\n ): Generator<AlgNode> {\n if (options.depth === 0) {\n yield commutator;\n return;\n }\n const newOptions = this.#descendOptions(options);\n const newCommutator = new Commutator(\n this.traverseAlg(commutator.A, newOptions),\n this.traverseAlg(commutator.B, newOptions),\n );\n if (\n newCommutator.A.experimentalIsEmpty() ||\n newCommutator.B.experimentalIsEmpty() ||\n newCommutator.A.isIdentical(newCommutator.B) ||\n newCommutator.A.isIdentical(newCommutator.B.invert()) ||\n this.#doChildrenCommute(newCommutator.A, newCommutator.B, options)\n ) {\n return;\n }\n yield newCommutator;\n }\n\n public *traverseConjugate(\n conjugate: Conjugate,\n options: SimplifyOptions,\n ): Generator<AlgNode> {\n if (options.depth === 0) {\n yield conjugate;\n return;\n }\n const newOptions = this.#descendOptions(options);\n const newConjugate = new Conjugate(\n this.traverseAlg(conjugate.A, newOptions),\n this.traverseAlg(conjugate.B, newOptions),\n );\n if (newConjugate.B.experimentalIsEmpty()) {\n return;\n }\n if (\n newConjugate.A.experimentalIsEmpty() ||\n newConjugate.A.isIdentical(newConjugate.B) ||\n newConjugate.A.isIdentical(newConjugate.B.invert()) ||\n this.#doChildrenCommute(newConjugate.A, newConjugate.B, options)\n ) {\n yield* conjugate.B.childAlgNodes();\n return;\n }\n yield newConjugate;\n }\n\n public *traversePause(\n pause: Pause,\n _options: SimplifyOptions,\n ): Generator<AlgNode> {\n if (pause.experimentalNISSGrouping) {\n const newPause = new Pause();\n this.#newPlaceholderAssociations().set(\n pause.experimentalNISSGrouping,\n newPause,\n );\n yield newPause;\n } else {\n yield pause;\n }\n }\n\n public *traverseNewline(\n newline: Newline,\n _options: SimplifyOptions,\n ): Generator<AlgNode> {\n yield newline;\n }\n\n public *traverseLineComment(\n comment: LineComment,\n _options: SimplifyOptions,\n ): Generator<AlgNode> {\n yield comment;\n }\n}\n\nexport const simplify = functionFromTraversal(Simplify);\n", "// https://js.cubing.net/cubing/alg/\n\nimport { AlgCommon, Comparable } from \"./common\";\nimport { experimentalIs, experimentalIsAlgNode } from \"./is\";\nimport { direct, IterationDirection, reverse } from \"./iteration\";\nimport { parseAlg } from \"./parseAlg\";\nimport { simplify, SimplifyOptions } from \"./simplify\";\nimport { Grouping, Pause } from \"./alg-nodes\";\nimport { LineComment } from \"./alg-nodes/leaves/LineComment\";\nimport { Move } from \"./alg-nodes/leaves/Move\";\nimport { Newline } from \"./alg-nodes/leaves/Newline\";\nimport type { AlgLeaf, AlgNode } from \"./alg-nodes/AlgNode\";\nimport { warnOnce } from \"./warnOnce\";\n\nexport type FlexibleAlgSource = string | Iterable<AlgNode> | Alg;\n\n// TODO: validate\nfunction toIterable(input?: FlexibleAlgSource): Iterable<AlgNode> {\n if (!input) {\n return [];\n }\n\n if (experimentalIs(input, Alg)) {\n return (input as Alg).childAlgNodes();\n }\n\n if (typeof input === \"string\") {\n return parseAlg(input).childAlgNodes(); // TODO: something more direct?\n }\n\n const iter = input as Iterable<AlgNode>;\n if (typeof iter[Symbol.iterator] === \"function\") {\n return iter; // TODO: avoid allocations\n }\n\n throw new Error(\"Invalid AlgNode\");\n}\n\n// Preserves the alg if it's already an `Alg`.\nexport function experimentalEnsureAlg(alg: FlexibleAlgSource): Alg {\n if (experimentalIs(alg, Alg)) {\n return alg as Alg;\n }\n return new Alg(alg);\n}\n\n/**\n * `Alg` is a class that encapsulates a structured alg. To create an `Alg` from a string, use:\n *\n * new Alg(\"R U R'\"); // Convenient\n * Alg.fromString(dynamicString); // Recommended when the string input is user-provided.\n *\n * Once you have an `Alg`, you can call methods to transform it:\n *\n * new Alg(\"[[R: U], R U R2']\").expand().experimentalSimplify({cancel: true}).invert().log()\n *\n * To convert an `Alg` to a string, use .toString():\n *\n * new Alg(\"R U F\").invert().toString();\n *\n * If you need to debug, you may also find it convenient to use .log():\n *\n * if (alg.isIdentical(alg.invert())) {\n * alg.log(\"A self-inverse!\")\n * }\n *\n * For more information, see: {@link https://js.cubing.net/cubing/alg/}\n *\n * @category Alg\n */\nexport class Alg extends AlgCommon<Alg> {\n // #debugString: string;\n #algNodes: Iterable<AlgNode>; // TODO: freeze?\n constructor(alg?: FlexibleAlgSource) {\n super();\n this.#algNodes = Array.from(toIterable(alg)); // TODO: can we avoid array-casting?\n // this.#debugString = this.toString();\n\n for (const algNode of this.#algNodes) {\n if (!experimentalIsAlgNode(algNode)) {\n throw new Error(\"An alg can only contain alg nodes.\");\n }\n }\n }\n\n /**\n * Checks whether this Alg is structurally identical to another Alg. This\n * essentially means that they are written identically apart from whitespace.\n *\n * const alg1 = new Alg(\"R U L'\");\n * const alg2 = new Alg(\"L U' R'\").invert();\n * // true\n * alg1.isIdentical(alg2);\n *\n * // false\n * new Alg(\"[R, U]\").isIdentical(new Alg(\"R U R' U'\"));\n * // true\n * new Alg(\"[R, U]\").expand().isIdentical(new Alg(\"R U R' U'\"));\n *\n * Note that .isIdentical() efficiently compares algorithms, but mainly exists\n * to help optimize code when the structure of an algorithm hasn't changed.\n * There are many ways to write the \"same\" alg on most puzzles, but is\n * *highly* recommended to avoid expanding two Alg instances to compare them,\n * since that can easily slow your program to a crawl if someone inputs an alg\n * containing a large repetition. In general, you should use `cubing/kpuzzle`\n * to compare if two algs have the same effect on a puzzle.\n *\n * Also note that parser annotations are not taken into account while comparing\n * algs:\n *\n * const alg = new Alg([new Move(\"R\"), new Move(\"U2\")]);\n * // true, even though one of the algs has parser annotations\n * alg.isIdentical(new Alg(\"R U2\"))\n *\n */\n isIdentical(other: Comparable): boolean {\n const otherAsAlg = other as Alg;\n if (!other.is(Alg)) {\n return false;\n }\n\n // TODO: avoid converting to array\n const l1 = Array.from(this.#algNodes);\n const l2 = Array.from(otherAsAlg.#algNodes);\n if (l1.length !== l2.length) {\n return false;\n }\n for (let i = 0; i < l1.length; i++) {\n if (!l1[i].isIdentical(l2[i])) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * Returns the inverse of the given alg.\n *\n * Note that that this does not make any assumptions about what puzzle the alg\n * is for. For example, U2 is its own inverse on a cube, but U2' has the same\n * effect U3 (and not U2) on Megaminx:\n *\n * // Outputs: R U2' L'\n * new Alg(\"L U2 R'\").invert().log();\n */\n invert(): Alg {\n // TODO: Handle newLines and comments correctly\n // TODO: Make more efficient.\n return new Alg(reverse(Array.from(this.#algNodes).map((u) => u.invert())));\n }\n\n /** @deprecated Use {@link Alg.expand} instead. */\n *experimentalExpand(\n iterDir: IterationDirection = IterationDirection.Forwards,\n depth?: number,\n ): Generator<AlgLeaf> {\n depth ??= Infinity;\n for (const algNode of direct(this.#algNodes, iterDir)) {\n yield* algNode.experimentalExpand(iterDir, depth);\n }\n }\n\n /**\n * Expands all Grouping, Commutator, and Conjugate parts nested inside the\n * alg.\n *\n * // F R U R' U' F'\n * new Alg(\"[F: [R, U]]\").expand().log();\n *\n * // F [R, U] F'\n * new Alg(\"[F: [R, U]]\").expand(({ depth: 1 }).log();\n *\n * Avoid calling this on a user-provided alg unless the user explicitly asks\n * to see the expanded alg. Otherwise, it's easy to make your program freeze\n * when someone passes in an alg like: (R U)10000000\n *\n * Generally, if you want to perform an operation on an entire alg, you'll\n * want to use something based on the `Traversal` mechanism, like countMoves()\n * from `cubing/notation`.\n */\n expand(options?: { depth?: number }): Alg {\n return new Alg(\n this.experimentalExpand(\n IterationDirection.Forwards,\n options?.depth ?? Infinity,\n ),\n );\n }\n\n /** @deprecated */\n *experimentalLeafMoves(): Generator<Move> {\n for (const leaf of this.experimentalExpand()) {\n if (leaf.is(Move)) {\n yield leaf as Move;\n }\n }\n }\n\n concat(input: FlexibleAlgSource): Alg {\n return new Alg(\n Array.from(this.#algNodes).concat(Array.from(toIterable(input))),\n );\n }\n\n /** @deprecated */\n experimentalIsEmpty(): boolean {\n for (const _ of this.#algNodes) {\n return false;\n }\n return true;\n }\n\n static fromString(s: string): Alg {\n return parseAlg(s);\n }\n\n /** @deprecated */\n units(): Generator<AlgNode> {\n return this.childAlgNodes();\n }\n\n *childAlgNodes(): Generator<AlgNode> {\n for (const algNode of this.#algNodes) {\n yield algNode;\n }\n }\n\n /** @deprecated */\n experimentalNumUnits(): number {\n return this.experimentalNumChildAlgNodes();\n }\n\n experimentalNumChildAlgNodes(): number {\n return Array.from(this.#algNodes).length;\n }\n\n /** @deprecated */\n get type(): string {\n warnOnce(\"deprecated: type\");\n return \"sequence\";\n }\n\n /**\n * Converts the Alg to a string:\n *\n * const alg = new Alg([new Move(\"R\"), new Move(\"U2\"), new Move(\"L\")])\n * // R U2 L\n * console.log(alg.toString())\n */\n toString(): string {\n let output = \"\";\n let previousVisibleAlgNode: AlgNode | null = null;\n for (const algNode of this.#algNodes) {\n if (previousVisibleAlgNode) {\n output += spaceBetween(previousVisibleAlgNode, algNode);\n }\n const nissGrouping = algNode.as(Pause)?.experimentalNISSGrouping;\n if (nissGrouping) {\n if (nissGrouping.amount !== -1) {\n throw new Error(\"Invalid NISS Grouping amount!\");\n }\n output += `^(${nissGrouping.alg.toString()})`;\n } else if (algNode.as(Grouping)?.experimentalNISSPlaceholder) {\n // do not serialize (rely on the placeholder instead)\n } else {\n output += algNode.toString();\n }\n previousVisibleAlgNode = algNode;\n }\n return output;\n }\n\n /**\n * `experimentalSimplify` can perform several mostly-syntactic simplifications on an alg:\n *\n * // Logs: R' U3\n * import { Alg } from \"cubing/alg\";\n * new Alg(\"R R2' U U2\").experimentalSimplify({ cancel: true }).log()\n *\n * You can pass in a `PuzzleLoader` (currently only for 3x3x3) for puzzle-specific simplifications:\n *\n * // Logs: R' U'\n * import { Alg } from \"cubing/alg\";\n * import { cube3x3x3 } from \"cubing/puzzles\";\n * new Alg(\"R R2' U U2\").experimentalSimplify({ cancel: true, puzzleLoader: cube3x3x3 }).log()\n *\n * You can also cancel only moves that are in the same direction:\n *\n * // Logs: R R2' U'\n * import { Alg } from \"cubing/alg\";\n * import { cube3x3x3 } from \"cubing/puzzles\";\n * new Alg(\"R R2' U U2\").experimentalSimplify({\n * cancel: { directional: \"same-direction\" },\n * puzzleLoader: cube3x3x3\n * }).log()\n *\n * Additionally, you can specify how moves are \"wrapped\":\n *\n * import { Alg } from \"cubing/alg\";\n * import { cube3x3x3 } from \"cubing/puzzles\";\n *\n * function example(puzzleSpecificModWrap) {\n * alg.experimentalSimplify({\n * cancel: { puzzleSpecificModWrap },\n * puzzleLoader: cube3x3x3\n * }).log()\n * }\n *\n * const alg = new Alg(\"R7' . R6' . R5' . R6\")\n * example(\"none\") // R7' . R6' . R5' . R6\n * example(\"gravity\") // R . R2' . R' . R2\n * example(\"canonical-centered\") // R . R2 . R' . R2\n * example(\"canonical-positive\") // R . R2 . R3 . R2\n * example(\"preserve-sign\") // R3' . R2' . R' . R2\n *\n * Same-axis and simultaneous move canonicalization is not implemented yet:\n *\n * // Logs: R L R\n * import { Alg } from \"cubing/alg\";\n * import { cube3x3x3 } from \"cubing/puzzles\";\n * new Alg(\"R L R\").experimentalSimplify({ cancel: true, puzzleLoader: cube3x3x3 }).log()\n */\n experimentalSimplify(options?: SimplifyOptions): Alg {\n return new Alg(simplify(this, options ?? {}));\n }\n\n /** @deprecated See {@link experimentalSimplify} */\n simplify(options?: SimplifyOptions): Alg {\n return this.experimentalSimplify(options);\n }\n}\n\nfunction spaceBetween(u1: AlgNode, u2: AlgNode): string {\n if (u1.is(Newline) || u2.is(Newline)) {\n return \"\";\n }\n if (u2.as(Grouping)?.experimentalNISSPlaceholder) {\n return \"\";\n }\n if (u1.is(LineComment) && !u2.is(Newline)) {\n return \"\\n\"; /// TODO\n }\n return \" \";\n}\n", "// tslint:disable-next-line no-namespace // TODO: nested module\n\nimport { Alg } from \"./Alg\";\nimport { Grouping } from \"./alg-nodes\";\nimport { Commutator } from \"./alg-nodes/containers/Commutator\";\nimport { Conjugate } from \"./alg-nodes/containers/Conjugate\";\nimport { Move } from \"./alg-nodes/leaves/Move\";\nimport { Pause } from \"./alg-nodes/leaves/Pause\";\n\nexport const Example = {\n Sune: new Alg([\n new Move(\"R\", 1),\n new Move(\"U\", 1),\n new Move(\"R\", -1),\n new Move(\"U\", 1),\n new Move(\"R\", 1),\n new Move(\"U\", -2),\n new Move(\"R\", -1),\n ]),\n\n AntiSune: new Alg([\n new Move(\"R\", 1),\n new Move(\"U\", 2),\n new Move(\"R\", -1),\n new Move(\"U\", -1),\n new Move(\"R\", 1),\n new Move(\"U\", -1),\n new Move(\"R\", -1),\n ]),\n\n SuneCommutator: new Alg([\n new Commutator(\n new Alg([new Move(\"R\", 1), new Move(\"U\", 1), new Move(\"R\", -2)]),\n new Alg([\n new Conjugate(new Alg([new Move(\"R\", 1)]), new Alg([new Move(\"U\", 1)])),\n ]),\n ),\n ]),\n\n Niklas: new Alg([\n new Move(\"R\", 1),\n new Move(\"U\", -1),\n new Move(\"L\", -1),\n new Move(\"U\", 1),\n new Move(\"R\", -1),\n new Move(\"U\", -1),\n new Move(\"L\", 1),\n new Move(\"U\", 1),\n ]),\n\n EPerm: new Alg([\n new Move(\"x\", -1),\n new Commutator(\n new Alg([\n new Conjugate(\n new Alg([new Move(\"R\", 1)]),\n new Alg([new Move(\"U\", -1)]),\n ),\n ]),\n new Alg([new Move(\"D\", 1)]),\n ),\n new Commutator(\n new Alg([\n new Conjugate(new Alg([new Move(\"R\", 1)]), new Alg([new Move(\"U\", 1)])),\n ]),\n new Alg([new Move(\"D\", 1)]),\n ),\n new Move(\"x\", 1),\n ]),\n\n FURURFCompact: new Alg([\n new Conjugate(\n new Alg([new Move(\"F\", 1)]),\n new Alg([\n new Commutator(\n new Alg([new Move(\"U\", 1)]),\n new Alg([new Move(\"R\", 1)]),\n ),\n ]),\n ),\n ]),\n\n APermCompact: new Alg([\n new Conjugate(\n new Alg([new Move(\"R\", 2)]),\n new Alg([\n new Commutator(\n new Alg([new Move(\"F\", 2)]),\n new Alg([new Move(\"R\", -1), new Move(\"B\", -1), new Move(\"R\", 1)]),\n ),\n ]),\n ),\n ]),\n\n FURURFMoves: new Alg([\n new Move(\"F\", 1),\n new Move(\"U\", 1),\n new Move(\"R\", 1),\n new Move(\"U\", -1),\n new Move(\"R\", -1),\n new Move(\"F\", -1),\n ]),\n\n TPerm: new Alg([\n new Move(\"R\", 1),\n new Move(\"U\", 1),\n new Move(\"R\", -1),\n new Move(\"U\", -1),\n new Move(\"R\", -1),\n new Move(\"F\", 1),\n new Move(\"R\", 2),\n new Move(\"U\", -1),\n new Move(\"R\", -1),\n new Move(\"U\", -1),\n new Move(\"R\", 1),\n new Move(\"U\", 1),\n new Move(\"R\", -1),\n new Move(\"F\", -1),\n ]),\n\n HeadlightSwaps: new Alg([\n new Conjugate(\n new Alg([new Move(\"F\", 1)]),\n new Alg([\n new Grouping(\n new Alg([\n new Commutator(\n new Alg([new Move(\"R\", 1)]),\n new Alg([new Move(\"U\", 1)]),\n ),\n ]),\n 3,\n ),\n ]),\n ),\n ]),\n\n TriplePause: new Alg([new Pause(), new Pause(), new Pause()]),\n // AllAlgParts: [\n // new Alg([new Move(\"R\", 1), new Move(\"U\", -1)]),\n // new Grouping(new Alg([new Move(\"F\", 1)]), 2),\n // // new Rotation(\"y\", -1),\n // new Move(\"R\", 2),\n // new Commutator(new Alg([new Move(\"R\", 2)]), new Alg([new Move(\"U\", 2)]), 2),\n // new Conjugate(new Alg([new Move(\"L\", 2)]), new Alg([new Move(\"D\", -1)]), 2),\n // new Pause(),\n // new Newline(),\n // new LineComment(\"line comment\"),\n // ],\n};\n", "import { Pause } from \"./alg-nodes\";\nimport type { AlgLeaf } from \"./alg-nodes/AlgNode\";\nimport { Move } from \"./alg-nodes/leaves/Move\";\n\nconst cubeKeyMapping: { [key: number]: AlgLeaf } = {\n 73: new Move(\"R\"),\n 75: new Move(\"R'\"),\n 87: new Move(\"B\"),\n 79: new Move(\"B'\"),\n 83: new Move(\"D\"),\n 76: new Move(\"D'\"),\n 68: new Move(\"L\"),\n 69: new Move(\"L'\"),\n 74: new Move(\"U\"),\n 70: new Move(\"U'\"),\n 72: new Move(\"F\"),\n 71: new Move(\"F'\"),\n\n 78: new Move(\"x'\"),\n 67: new Move(\"l\"),\n 82: new Move(\"l'\"),\n 85: new Move(\"r\"),\n 77: new Move(\"r'\"),\n\n 88: new Move(\"d\"),\n 188: new Move(\"d'\"),\n\n 84: new Move(\"x\"),\n 89: new Move(\"x\"),\n 66: new Move(\"x'\"),\n 186: new Move(\"y\"),\n 59: new Move(\"y\"),\n 65: new Move(\"y'\"), // 186 is WebKit, 59 is Mozilla; see http://unixpapa.com/js/key.html\n 80: new Move(\"z\"),\n 81: new Move(\"z'\"),\n\n 90: new Move(\"M'\"),\n 190: new Move(\"M'\"),\n\n 192: new Pause(),\n};\n\n// TODO: options about whether to ignore modifier keys (e.g. alt, ctrl).\n// TODO: Support different mappings.\n// TODO: Return BaseMove instead?\nexport function keyToMove(e: KeyboardEvent): AlgLeaf | null {\n if (e.altKey || e.ctrlKey) {\n return null;\n }\n\n return cubeKeyMapping[e.keyCode] || null;\n}\n", "import type { Alg } from \"./Alg\";\n\n// This is not the most sophisticated scheme, but it has been used in production\n// at alg.cubing.net for years.\nfunction serializeURLParam(a: Alg): string {\n let escaped = a.toString();\n escaped = escaped.replace(/_/g, \"_\").replace(/ /g, \"_\");\n escaped = escaped.replace(/\\+/g, \"b;\");\n escaped = escaped.replace(/-/g, \"-\").replace(/'/g, \"-\");\n return escaped;\n}\n\nexport interface AlgCubingNetOptions {\n alg?: Alg;\n setup?: Alg;\n title?: string;\n puzzle?:\n | \"1x1x1\"\n | \"2x2x2\"\n | \"3x3x3\"\n | \"4x4x4\"\n | \"5x5x5\"\n | \"6x6x6\"\n | \"7x7x7\"\n | \"8x8x8\"\n | \"9x9x9\"\n | \"10x10x10\"\n | \"11x11x11\"\n | \"12x12x12\"\n | \"13x13x13\"\n | \"14x14x14\"\n | \"16x16x16\"\n | \"17x17x17\";\n stage?:\n | \"full\"\n | \"cross\"\n | \"F2L\"\n | \"LL\"\n | \"OLL\"\n | \"PLL\"\n | \"CLS\"\n | \"ELS\"\n | \"L6E\"\n | \"CMLL\"\n | \"WV\"\n | \"ZBLL\"\n | \"void\";\n view?: \"editor\" | \"playback\" | \"fullscreen\";\n type?: \"moves\" | \"reconstruction\" | \"alg\" | \"reconstruction-end-with-setup\";\n}\n\n// TODO: runtime validation?\n/** @deprecated */\nexport function experimentalAlgCubingNetLink(\n options: AlgCubingNetOptions,\n): string {\n const url = new URL(\"https://alg.cubing.net\");\n if (!options.alg) {\n throw new Error(\"An alg parameter is required.\");\n }\n url.searchParams.set(\"alg\", serializeURLParam(options.alg));\n\n if (options.setup) {\n url.searchParams.set(\"setup\", serializeURLParam(options.setup));\n }\n if (options.title) {\n url.searchParams.set(\"title\", options.title);\n }\n if (options.puzzle) {\n if (\n ![\n \"1x1x1\",\n \"2x2x2\",\n \"3x3x3\",\n \"4x4x4\",\n \"5x5x5\",\n \"6x6x6\",\n \"7x7x7\",\n \"8x8x8\",\n \"9x9x9\",\n \"10x10x10\",\n \"11x11x11\",\n \"12x12x12\",\n \"13x13x13\",\n \"14x14x14\",\n \"16x16x16\",\n \"17x17x17\",\n ].includes(options.puzzle)\n ) {\n throw new Error(`Invalid puzzle parameter: ${options.puzzle}`);\n }\n url.searchParams.set(\"puzzle\", options.puzzle);\n }\n if (options.stage) {\n if (\n ![\n \"full\",\n \"cross\",\n \"F2L\",\n \"LL\",\n \"OLL\",\n \"PLL\",\n \"CLS\",\n \"ELS\",\n \"L6E\",\n \"CMLL\",\n \"WV\",\n \"ZBLL\",\n \"void\",\n ].includes(options.stage)\n ) {\n throw new Error(`Invalid stage parameter: ${options.stage}`);\n }\n url.searchParams.set(\"stage\", options.stage);\n }\n if (options.view) {\n if (![\"editor\", \"playback\", \"fullscreen\"].includes(options.view)) {\n throw new Error(`Invalid view parameter: ${options.view}`);\n }\n url.searchParams.set(\"view\", options.view);\n }\n if (options.type) {\n if (\n ![\n \"moves\",\n \"reconstruction\",\n \"alg\",\n \"reconstruction-end-with-setup\",\n ].includes(options.type)\n ) {\n throw new Error(`Invalid type parameter: ${options.type}`);\n }\n url.searchParams.set(\"type\", options.type);\n }\n return url.toString();\n}\n"],
|
|
5
|
-
"mappings": ";AAIA,IAAI,qBAAqB;AAKlB,IAAe,aAAf,MAA0B;AAAA,EAC/B,GAAG,GAAiB;AAClB,WAAO,gBAAgB;AAAA,EACzB;AAAA,EAEA,GAAM,GAAsC;AAC1C,WAAO,gBAAgB,IAAI,OAAO;AAAA,EACpC;AAGF;AAUO,IAAe,YAAf,cACG,WAEV;AAAA,EACE,cAAc;AACZ,UAAM;AACN,QAAI,oBAAoB;AACtB,aAAO,eAAe,MAAM,aAAa;AAAA,QACvC,KAAK,MAAM;AACT,iBAAO,KAAK,SAAS;AAAA,QACvB;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,IAAI,MAA+B;AAGjC,WAAO,QAAQ,IAAI,KAAK,SAAS,MAAM,KAAK,SAAS,CAAC;AAAA,EAGxD;AAOF;;;ACpDO,SAAS,gBACd,oBACA,OAAgB,MACI;AACpB,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AACA,UAAQ;AAAA,SACD;AACH,aAAO;AAAA,SACJ;AACH,aAAO;AAAA;AAEb;AAEO,SAAS,OACd,GACA,SACa;AACb,SAAO,YAAY,qBAA+B,MAAM,KAAK,CAAC,EAAE,QAAQ,IAAI;AAC9E;AAEO,SAAS,QAAW,GAA6B;AACtD,SAAO,MAAM,KAAK,CAAC,EAAE,QAAQ;AAC/B;AAEO,UAAU,kBACf,GACA,WACc;AACd,gBAAc,qBACV,OAAO,iBAAiB,CAAC,IACzB,OAAO;AACb;AAEO,UAAU,iBAAoB,GAA+B;AAClE,aAAW,KAAK,MAAM,KAAK,CAAC,EAAE,QAAQ,GAAG;AACvC,UAAM;AAAA,EACR;AACF;;;AC5CO,IAAM,UAAU;AAChB,IAAM,sBAAsB;AAC5B,IAAM,UAAU;;;ACEhB,IAAM,aAAN,MAAiB;AAAA,EACtB,WAAsB,CAAC;AAAA,EAEvB,KAAK,GAAkB;AACrB,SAAK,SAAS,KAAK,CAAC;AAAA,EACtB;AAAA,EAIA,oBAAoB,KAAgB;AAElC,eAAW,KAAK,IAAI,cAAc,GAAG;AACnC,WAAK,KAAK,CAAC;AAAA,IACb;AAAA,EACF;AAAA,EAGA,0BAAkC;AAChC,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA,EAGA,QAAa;AACX,WAAO,IAAI,IAAI,KAAK,QAAQ;AAAA,EAC9B;AAAA,EAEA,QAAc;AACZ,SAAK,WAAW,CAAC;AAAA,EACnB;AACF;;;ACJO,IAAM,kBAAyD;AAAA,EACpE,0BAA0B;AAC5B;AAEO,SAAS,YAAY,SAEnB;AACP,MAAI,8BAA8B,SAAS;AACzC,oBAAgB,2BACd,CAAC,CAAC,QAAQ;AAAA,EACd;AACF;;;AClCO,IAAM,aAAN,cAAyB,UAAsB;AAAA,EAC3C;AAAA,EACA;AAAA,EAET,YAAY,SAA4B,SAA4B;AAClE,UAAM;AACN,SAAK,KAAK,sBAAsB,OAAO;AACvC,SAAK,KAAK,sBAAsB,OAAO;AAAA,EACzC;AAAA,EAEA,IAAI,IAAS;AACX,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,IAAS;AACX,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,YAAY,OAA4B;AACtC,UAAM,oBAAoB,MAAM,GAAG,UAAU;AAC7C,WAAO,CAAC,EACN,mBAAmB,EAAE,YAAY,KAAK,CAAC,KACvC,mBAAmB,EAAE,YAAY,KAAK,CAAC;AAAA,EAE3C;AAAA,EAEA,SAAqB;AACnB,WAAO,IAAI,WAAW,KAAK,IAAI,KAAK,EAAE;AAAA,EACxC;AAAA,EAEA,CAAC,mBACC,4BACA,OACoB;AACpB,sBAAU;AACV,QAAI,UAAU,GAAG;AACf,YAAM,+BAA0C,OAAO,KAAK,OAAO;AAAA,IACrE,OAAO;AACL,UAAI,8BAAyC;AAC3C,eAAO,KAAK,EAAE;AAAA;AAAA,UAEZ,QAAQ;AAAA,QACV;AACA,eAAO,KAAK,EAAE;AAAA;AAAA,UAEZ,QAAQ;AAAA,QACV;AACA,eAAO,KAAK,EAAE;AAAA;AAAA,UAEZ,QAAQ;AAAA,QACV;AACA,eAAO,KAAK,EAAE;AAAA;AAAA,UAEZ,QAAQ;AAAA,QACV;AAAA,MACF,OAAO;AACL,eAAO,KAAK,EAAE;AAAA;AAAA,UAEZ,QAAQ;AAAA,QACV;AACA,eAAO,KAAK,EAAE;AAAA;AAAA,UAEZ,QAAQ;AAAA,QACV;AACA,eAAO,KAAK,EAAE;AAAA;AAAA,UAEZ,QAAQ;AAAA,QACV;AACA,eAAO,KAAK,EAAE;AAAA;AAAA,UAEZ,QAAQ;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,WAAmB;AACjB,WAAO,IAAI,KAAK,GAAG,SAAS,MAAM,KAAK,GAAG,SAAS;AAAA,EACrD;AACF;;;AC/EO,IAAM,YAAN,cAAwB,UAAqB;AAAA,EACzC;AAAA,EACA;AAAA,EAET,YAAY,SAA4B,SAA4B;AAClE,UAAM;AACN,SAAK,KAAK,sBAAsB,OAAO;AACvC,SAAK,KAAK,sBAAsB,OAAO;AAAA,EACzC;AAAA,EAEA,IAAI,IAAS;AACX,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,IAAS;AACX,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,YAAY,OAA4B;AACtC,UAAM,mBAAmB,MAAM,GAAG,SAAS;AAC3C,WAAO,CAAC,EACN,kBAAkB,EAAE,YAAY,KAAK,CAAC,KACtC,kBAAkB,EAAE,YAAY,KAAK,CAAC;AAAA,EAE1C;AAAA,EAEA,SAAoB;AAClB,WAAO,IAAI,UAAU,KAAK,IAAI,KAAK,GAAG,OAAO,CAAC;AAAA,EAChD;AAAA,EAEA,CAAC,mBACC,SACA,OACoB;AACpB,sBAAU;AACV,QAAI,UAAU,GAAG;AACf,YAAM,+BAA0C,OAAO,KAAK,OAAO;AAAA,IACrE,OAAO;AACL,aAAO,KAAK,EAAE,qCAAgD,QAAQ,CAAC;AACvE,aAAO,KAAK,EAAE,mBAAmB,SAAS,QAAQ,CAAC;AACnD,aAAO,KAAK,EAAE,uCAAiD,QAAQ,CAAC;AAAA,IAC1E;AAAA,EACF;AAAA,EAEA,WAAmB;AACjB,WAAO,IAAI,KAAK,MAAM,KAAK;AAAA,EAC7B;AACF;;;AC9CO,IAAM,cAAN,cAA0B,UAAuB;AAAA,EAC7C;AAAA,EAET,YAAY,aAAqB;AAC/B,UAAM;AACN,QAAI,YAAY,SAAS,IAAI,KAAK,YAAY,SAAS,IAAI,GAAG;AAC5D,YAAM,IAAI,MAAM,oCAAoC;AAAA,IACtD;AACA,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,IAAI,OAAe;AACjB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,YAAY,OAA4B;AACtC,UAAM,qBAAqB;AAC3B,WAAO,MAAM,GAAG,WAAW,KAAK,KAAK,UAAU,mBAAmB;AAAA,EACpE;AAAA,EAEA,SAAsB;AACpB,WAAO;AAAA,EACT;AAAA,EAEA,CAAC,mBACC,6BACA,SAAiB,UACG;AACpB,UAAM;AAAA,EACR;AAAA,EAEA,WAAmB;AACjB,WAAO,KAAK,KAAK;AAAA,EACnB;AAOF;;;AC1CO,IAAM,UAAN,cAAsB,UAAmB;AAAA,EAC9C,WAAmB;AACjB,WAAO;AAAA,EACT;AAAA,EAEA,YAAY,OAA4B;AACtC,WAAO,MAAM,GAAG,OAAO;AAAA,EACzB;AAAA,EAEA,SAAkB;AAChB,WAAO;AAAA,EACT;AAAA,EAEA,CAAC,mBACC,6BACA,SAAiB,UACG;AACpB,UAAM;AAAA,EACR;AACF;;;AClBO,IAAM,QAAN,cAAoB,UAAiB;AAAA,EAG1C,WAAmB;AACjB,WAAO;AAAA,EACT;AAAA,EAEA,YAAY,OAA4B;AACtC,WAAO,MAAM,GAAG,KAAK;AAAA,EACvB;AAAA,EAEA,SAAgB;AACd,WAAO;AAAA,EACT;AAAA,EAEA,CAAC,mBACC,6BACA,SAAiB,UACG;AACpB,UAAM;AAAA,EACR;AACF;;;ACbA,SAAS,0BAA6B,GAAW,eAA8B;AAC7E,SAAO,IAAI,SAAS,CAAC,IAAI;AAC3B;AAEA,IAAM,eAAe;AACrB,IAAM,mBAAmB;AACzB,IAAM,qBAAqB;AAC3B,IAAM,qBAAqB;AAC3B,IAAM,2BAA2B;AACjC,IAAM,yBAAyB;AAExB,SAAS,SAAS,GAAgB;AACvC,SAAO,IAAI,UAAU,EAAE,SAAS,CAAC;AACnC;AAEO,SAAS,UAAU,GAAiB;AACzC,SAAO,IAAI,UAAU,EAAE,UAAU,CAAC;AACpC;AAEO,SAAS,iBAAiB,GAAwB;AACvD,SAAO,IAAI,UAAU,EAAE,iBAAiB,CAAC;AAC3C;AAUA,SAAS,eACP,GACA,gBACA,cACW;AACX,QAAM,UAAU;AAChB,UAAQ,iBAAiB;AACzB,UAAQ,eAAe;AACvB,SAAO;AACT;AAEO,SAAS,kBAA2C,MAAS,IAAU;AAC5E,MAAI,oBAAoB,MAAM;AAC5B,IAAC,GAAiB,iBAAkB,KAAmB;AAAA,EACzD;AACA,MAAI,kBAAkB,MAAM;AAC1B,IAAC,GAAiB,eAAgB,KAAmB;AAAA,EACvD;AACA,SAAO;AACT;AAKA,IAAM,YAAN,MAAgB;AAAA,EACd,SAAiB;AAAA,EACjB,OAAe;AAAA,EACf,aAAyB,CAAC;AAAA,EAE1B,SAAS,OAA4B;AACnC,SAAK,SAAS;AACd,SAAK,OAAO;AACZ,UAAM,MAAM,KAAK,qBAAqB,CAAC,CAAC;AACxC,SAAK,mBAAmB;AACxB,UAAM,WAAW,MAAM,KAAK,IAAI,cAAc,CAAC;AAC/C,QAAI,KAAK,WAAW,SAAS,GAAG;AAC9B,iBAAW,gBAAgB,KAAK,WAAW,QAAQ,GAAG;AACpD,iBAAS,KAAK,YAAY;AAAA,MAC5B;AAAA,IACF;AACA,UAAM,SAAS,IAAI,IAAI,QAAQ;AAC/B,UAAM,EAAE,gBAAgB,aAAa,IAAI;AACzC,mBAAe,QAAQ,gBAAgB,YAAY;AACnD,WAAO;AAAA,EACT;AAAA,EAEA,UAAU,OAA6B;AACrC,SAAK,SAAS;AACd,SAAK,OAAO;AACZ,UAAM,OAAO,KAAK,cAAc;AAChC,SAAK,mBAAmB;AACxB,WAAO;AAAA,EACT;AAAA,EAEA,iBAAiB,OAA4B;AAC3C,SAAK,SAAS;AACd,SAAK,OAAO;AACZ,UAAM,cAAc,KAAK,qBAAqB;AAC9C,SAAK,mBAAmB;AACxB,WAAO;AAAA,EACT;AAAA,EAEQ,qBAAqB;AAC3B,QAAI,KAAK,SAAS,KAAK,OAAO,QAAQ;AACpC,YAAM,IAAI,MAAM,kCAAkC;AAAA,IACpD;AAAA,EACF;AAAA,EAEQ,qBAAqB,YAAyC;AACpE,QAAI,cAAc,KAAK;AACvB,QAAI,YAAY,KAAK;AACrB,UAAM,aAAa,IAAI,WAAW;AAGlC,QAAI,UAAU;AAEd,UAAM,mBAAmB,CAAC,QAAsB;AAC9C,UAAI,SAAS;AACX,cAAM,IAAI;AAAA,UACR,iCAAiC;AAAA,QACnC;AAAA,MACF;AAAA,IACF;AAEA;AAAU,aAAO,KAAK,OAAO,KAAK,OAAO,QAAQ;AAC/C,cAAM,iBAAiB,KAAK;AAC5B,YAAK,WAAwB,SAAS,KAAK,OAAO,KAAK,KAAK,GAAG;AAC7D,iBAAO,eAAe,WAAW,MAAM,GAAG,aAAa,SAAS;AAAA,QAClE;AACA,YAAI,KAAK,eAAe,GAAG,GAAG;AAC5B,oBAAU;AACV,cAAI,WAAW,wBAAwB,MAAM,GAAG;AAC9C,0BAAc,KAAK;AAAA,UACrB;AAEA,mBAAS;AAAA,QACX,WAAW,iBAAiB,KAAK,KAAK,OAAO,KAAK,KAAK,GAAG;AACxD,2BAAiB,cAAc;AAC/B,gBAAM,OAAO,KAAK,cAAc;AAChC,qBAAW,KAAK,IAAI;AACpB,oBAAU;AACV,sBAAY,KAAK;AAGjB,mBAAS;AAAA,QACX,WAAW,KAAK,eAAe,GAAG,GAAG;AACnC,2BAAiB,cAAc;AAC/B,gBAAM,oBAAoB,KAAK,SAAS,wBAAwB;AAChE,cAAI,mBAAmB;AACrB,kBAAM,kBAAkB,kBAAkB;AAC1C,kBAAM,kBAAkB,KAAK;AAC7B,kBAAM,kBAAkB,KAAK,WAAW,sBAAsB;AAC9D,kBAAM,QAAQ;AAAA,cACZ,IAAI,KAAK,IAAI,YAAY,OAAO,GAAG,SAAS,eAAe,CAAC;AAAA,cAC5D,iBAAiB;AAAA,cACjB,iBAAiB,IAAI,gBAAgB;AAAA,YACvC;AACA,kBAAM,QAAQ;AAAA,cACZ,IAAI,KAAK,IAAI,YAAY,OAAO,GAAG,SAAS,gBAAgB,EAAE,CAAC;AAAA,cAC/D;AAAA,cACA,KAAK,OAAO;AAAA,YACd;AACA,kBAAM,MAAM;AAAA,cACV,IAAI,IAAI,CAAC,OAAO,KAAK,CAAC;AAAA,cACtB,iBAAiB;AAAA,cACjB,KAAK,OAAO;AAAA,YACd;AACA,uBAAW;AAAA,cACT,eAAe,IAAI,SAAS,GAAG,GAAG,gBAAgB,KAAK,IAAI;AAAA,YAC7D;AACA,sBAAU;AACV,wBAAY,KAAK;AAGjB,qBAAS;AAAA,UACX,OAAO;AACL,kBAAM,MAAM,KAAK,qBAAqB,CAAC,GAAG,CAAC;AAC3C,iBAAK,gBAAgB,GAAG;AACxB,kBAAM,SAAS,KAAK,YAAY;AAChC,uBAAW;AAAA,cACT;AAAA,gBACE,IAAI,SAAS,KAAK,MAAM;AAAA,gBACxB;AAAA,gBACA,KAAK;AAAA,cACP;AAAA,YACF;AACA,sBAAU;AACV,wBAAY,KAAK;AAGjB,qBAAS;AAAA,UACX;AAAA,QACF,WAAW,KAAK,eAAe,GAAG,GAAG;AACnC,cAAI,CAAC,gBAAgB,0BAA0B;AAC7C,kBAAM,IAAI;AAAA,cACR;AAAA,YACF;AAAA,UACF;AAEA,eAAK,gBAAgB,GAAG;AACxB,gBAAM,MAAM,KAAK,qBAAqB,CAAC,GAAG,CAAC;AAC3C,eAAK,QAAQ;AAEb,gBAAM,WAAW,IAAI,SAAS,KAAK,EAAE;AACrC,gBAAM,cAAc,IAAI,MAAM;AAE9B,mBAAS,8BAA8B;AACvC,sBAAY,2BAA2B;AAEvC,eAAK,WAAW,KAAK,QAAQ;AAC7B,qBAAW,KAAK,WAAW;AAAA,QAC7B,WAAW,KAAK,eAAe,GAAG,GAAG;AACnC,2BAAiB,cAAc;AAC/B,gBAAM,IAAI,KAAK,qBAAqB,CAAC,KAAK,GAAG,CAAC;AAC9C,gBAAM,YAAY,KAAK,QAAQ;AAC/B,gBAAM,IAAI,KAAK,qBAAqB,CAAC,GAAG,CAAC;AACzC,eAAK,gBAAgB,GAAG;AACxB,kBAAQ;AAAA,iBACD,KAAK;AACR,yBAAW;AAAA,gBACT,eAAe,IAAI,UAAU,GAAG,CAAC,GAAG,gBAAgB,KAAK,IAAI;AAAA,cAC/D;AACA,wBAAU;AACV,0BAAY,KAAK;AAGjB,uBAAS;AAAA,YACX;AAAA,iBACK,KAAK;AACR,yBAAW;AAAA,gBACT,eAAe,IAAI,WAAW,GAAG,CAAC,GAAG,gBAAgB,KAAK,IAAI;AAAA,cAChE;AACA,wBAAU;AACV,0BAAY,KAAK;AAGjB,uBAAS;AAAA,YACX;AAAA;AAEE,oBAAM,IAAI,MAAM,0BAA0B;AAAA;AAAA,QAEhD,WAAW,KAAK,eAAe,IAAI,GAAG;AACpC,qBAAW;AAAA,YACT,eAAe,IAAI,QAAQ,GAAG,gBAAgB,KAAK,IAAI;AAAA,UACzD;AACA,oBAAU;AACV,sBAAY,KAAK;AAGjB,mBAAS;AAAA,QACX,WAAW,KAAK,eAAe,GAAG,GAAG;AACnC,cAAI,KAAK,eAAe,GAAG,GAAG;AAC5B,6BAAiB,cAAc;AAC/B,kBAAM,CAAC,IAAI,IAAI,KAAK,WAAW,kBAAkB;AACjD,uBAAW;AAAA,cACT,eAAe,IAAI,YAAY,IAAI,GAAG,gBAAgB,KAAK,IAAI;AAAA,YACjE;AACA,sBAAU;AACV,wBAAY,KAAK;AAGjB,qBAAS;AAAA,UACX,OAAO;AAEL,uBAAW;AAAA,cACT,eAAe,IAAI,KAAK,SAAS,GAAG,gBAAgB,KAAK,IAAI;AAAA,YAC/D;AACA,sBAAU;AACV,wBAAY,KAAK;AAGjB,qBAAS;AAAA,UACX;AAAA,QACF,WAAW,KAAK,eAAe,GAAG,GAAG;AACnC,2BAAiB,cAAc;AAC/B,qBAAW,KAAK,eAAe,IAAI,MAAM,GAAG,gBAAgB,KAAK,IAAI,CAAC;AACtE,oBAAU;AACV,sBAAY,KAAK;AAGjB,mBAAS;AAAA,QACX,OAAO;AACL,gBAAM,IAAI,MAAM,yBAAyB,KAAK,QAAQ,GAAG;AAAA,QAC3D;AAAA,MACF;AAEA,QAAI,KAAK,SAAS,KAAK,OAAO,QAAQ;AACpC,YAAM,IAAI,MAAM,yBAAyB;AAAA,IAC3C;AACA,QAAI,WAAW,SAAS,GAAG;AACzB,YAAM,IAAI,MAAM,mBAAmB;AAAA,IACrC;AACA,WAAO,eAAe,WAAW,MAAM,GAAG,aAAa,SAAS;AAAA,EAClE;AAAA,EAEQ,uBAAoC;AAC1C,UAAM,CAAC,EAAE,EAAE,EAAE,eAAe,eAAe,MAAM,IAC/C,KAAK,WAAW,kBAAkB;AAEpC,WAAO,IAAI;AAAA,MACT;AAAA,MACA,0BAA0B,eAAe,MAAS;AAAA,MAClD,0BAA0B,eAAe,MAAS;AAAA,IACpD;AAAA,EACF;AAAA,EAEQ,gBAA8B;AACpC,UAAM,iBAAiB,KAAK;AAE5B,QAAI,KAAK,eAAe,GAAG,GAAG;AAC5B,aAAO,eAAe,IAAI,KAAK,SAAS,GAAG,gBAAgB,KAAK,IAAI;AAAA,IACtE;AAEA,QAAI,cAAc,KAAK,qBAAqB;AAE5C,QAAI,CAAC,QAAQ,iBAAiB,IAAI,KAAK,kCAAkC;AACzE,UAAM,SAAS,KAAK,gBAAgB;AAEpC,QAAI,QAAQ;AACV,UAAI,SAAS,GAAG;AACd,cAAM,IAAI,MAAM,OAAO;AAAA,MACzB;AACA,WAAK,WAAW,QAAQ,WAAW,SAAS,WAAW,GAAG;AAExD,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AACA,WAAK,WAAW,QAAQ,WAAW,SAAS,CAAC,mBAAmB;AAC9D,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AACA,WAAK,WAAW,OAAO,WAAW,QAAQ,mBAAmB;AAC3D,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AACA,UAAI,OAAO,WAAW,GAAG,GAAG;AAC1B,sBAAc,YAAY,SAAS;AAAA,UACjC,QAAQ,GAAG,YAAY,UACrB,WAAW,MAAM,SAAS;AAAA,QAE9B,CAAC;AAAA,MACH;AACA,UAAI,OAAO,WAAW,GAAG,GAAG;AAC1B,sBAAc,YAAY,SAAS;AAAA,UACjC,QAAQ,GAAG,YAAY,UACrB,WAAW,MAAM,SAAS;AAAA,QAE9B,CAAC;AACD,kBAAU;AAAA,MACZ;AAAA,IACF;AAEA,UAAM,OAAO;AAAA,MACX,IAAI,KAAK,aAAa,MAAM;AAAA,MAC5B;AAAA,MACA,KAAK;AAAA,IACP;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,kBAAqC;AAC3C,QAAI,KAAK,eAAe,GAAG,GAAG;AAC5B,UAAI,KAAK,eAAe,GAAG,GAAG;AAC5B,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT;AACA,QAAI,KAAK,eAAe,GAAG,GAAG;AAC5B,UAAI,KAAK,eAAe,GAAG,GAAG;AAC5B,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,oCAAuD;AAC7D,UAAM,WAAW,KAAK;AACtB,UAAM,CAAC,EAAE,cAAc,QAAQ,IAAI,KAAK,WAAW,YAAY;AAC/D,QAAI,cAAc,WAAW,GAAG,KAAK,iBAAiB,KAAK;AACzD,YAAM,IAAI;AAAA,QACR,uBAAuB;AAAA,MACzB;AAAA,IACF;AACA,WAAO;AAAA,MACL,0BAA0B,cAAc,CAAC,KAAK,aAAa,MAAM,KAAK;AAAA,MACtE,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,cAAsB;AAC5B,UAAM,WAAW,KAAK;AACtB,UAAM,CAAC,EAAE,cAAc,QAAQ,IAAI,KAAK,WAAW,YAAY;AAC/D,QAAI,cAAc,WAAW,GAAG,KAAK,iBAAiB,KAAK;AACzD,YAAM,IAAI;AAAA,QACR,uBAAuB;AAAA,MACzB;AAAA,IACF;AACA,WACE,0BAA0B,cAAc,CAAC,KAAK,aAAa,MAAM,KAAK;AAAA,EAE1E;AAAA,EAEQ,WAAW,OAAgC;AACjD,UAAM,MAAM,MAAM,KAAK,KAAK,UAAU,CAAC;AACvC,QAAI,QAAQ,MAAM;AAChB,YAAM,IAAI,MAAM,wBAAwB;AAAA,IAC1C;AACA,SAAK,QAAQ,IAAI,GAAG;AACpB,WAAO;AAAA,EACT;AAAA,EAGQ,SAAS,OAAuC;AACtD,UAAM,MAAM,MAAM,KAAK,KAAK,UAAU,CAAC;AACvC,QAAI,QAAQ,MAAM;AAChB,aAAO;AAAA,IACT;AACA,SAAK,QAAQ,IAAI,GAAG;AACpB,WAAO;AAAA,EACT;AAAA,EAEQ,YAAoB;AAC1B,WAAO,KAAK,OAAO,MAAM,KAAK,IAAI;AAAA,EACpC;AAAA,EAEQ,UAAkB;AACxB,UAAM,OAAO,KAAK,OAAO,KAAK;AAC9B,SAAK;AACL,WAAO;AAAA,EACT;AAAA,EAEQ,eAAe,UAA2B;AAChD,QAAI,KAAK,OAAO,KAAK,UAAU,UAAU;AACvC,WAAK;AACL,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,gBAAgB,UAA0B;AAChD,UAAM,OAAO,KAAK,QAAQ;AAC1B,QAAI,SAAS,UAAU;AACrB,YAAM,IAAI;AAAA,QACR,cAAc,yCAAyC;AAAA,MACzD;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACF;;;ACzcA,IAAM,SAAS,oBAAI,IAAY;AACxB,SAAS,SAAS,GAAiB;AACxC,MAAI,CAAC,OAAO,IAAI,CAAC,GAAG;AAClB,YAAQ,KAAK,CAAC;AACd,WAAO,IAAI,CAAC;AAAA,EACd;AACF;;;ACDO,IAAM,oBAAN,MAA8C;AAAA,EAInD,YAAY,SAAY,SAAiB,GAAG;AAC1C,SAAK,UAAU;AACf,SAAK,SAAS;AAEd,QACE,CAAC,OAAO,UAAU,KAAK,MAAM,KAC7B,KAAK,SAAS,WACd,KAAK,SAAS,SACd;AACA,YAAM,IAAI;AAAA,QACR,sEAAsE;AAAA,MACxE;AAAA,IACF;AAAA,EACF;AAAA,EAEA,SAAiB;AACf,QAAI,IAAY;AAEhB,UAAM,YAAY,KAAK,IAAI,KAAK,MAAM;AACtC,QAAI,cAAc,GAAG;AACnB,WAAK;AAAA,IACP;AACA,QAAI,KAAK,SAAS,GAAG;AACnB,WAAK;AAAA,IACP;AACA,WAAO;AAAA,EACT;AAAA,EAEA,YAAY,OAAsC;AAChD,WACE,KAAK,QAAQ,YAAY,MAAM,OAAO,KAAK,KAAK,WAAW,MAAM;AAAA,EAErE;AAAA,EAGA,CAAC,mBACC,SACA,OACoB;AACpB,UAAM,YAAY,KAAK,IAAI,KAAK,MAAM;AACtC,UAAM,aAAa,gBAAgB,SAAS,KAAK,SAAS,CAAC;AAC3D,aAAS,IAAI,GAAG,IAAI,WAAW,KAAK;AAClC,aAAO,KAAK,QAAQ,mBAAmB,YAAY,KAAK;AAAA,IAC1D;AAAA,EACF;AACF;;;ACxCO,IAAM,cAAN,cAA0B,WAAW;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EAET,YACE,QACA,YACA,YACA;AACA,UAAM;AACN,SAAK,UAAU;AACf,SAAK,cAAc,cAAc;AACjC,SAAK,cAAc,cAAc;AACjC,WAAO,OAAO,IAAI;AAElB,QACE,KAAK,gBAAgB,SACpB,CAAC,OAAO,UAAU,KAAK,WAAW,KACjC,KAAK,cAAc,KACnB,KAAK,cAAc,UACrB;AACA,YAAM,IAAI;AAAA,QACR,4DAA4D;AAAA,MAC9D;AAAA,IACF;AAEA,QACE,KAAK,gBAAgB,SACpB,CAAC,OAAO,UAAU,KAAK,WAAW,KACjC,KAAK,cAAc,KACnB,KAAK,cAAc,UACrB;AACA,YAAM,IAAI;AAAA,QACR,4DAA4D;AAAA,MAC9D;AAAA,IACF;AAEA,QACE,KAAK,gBAAgB,QACrB,KAAK,gBAAgB,QACrB,KAAK,eAAe,KAAK,aACzB;AACA,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,QAAI,KAAK,gBAAgB,QAAQ,KAAK,gBAAgB,MAAM;AAC1D,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO,WAAW,GAAwB;AACxC,WAAO,iBAAiB,CAAC;AAAA,EAC3B;AAAA,EAGA,SAAS,eAAsD;AAC7D,WAAO,IAAI;AAAA,MACT,cAAc,UAAU,KAAK;AAAA,MAC7B,cAAc,cAAc,KAAK;AAAA,MACjC,cAAc,cAAc,KAAK;AAAA,IACnC;AAAA,EACF;AAAA,EAEA,YAAY,OAA6B;AACvC,UAAM,qBAAqB;AAC3B,WACE,MAAM,GAAG,WAAW,KACpB,KAAK,YAAY,mBAAmB,WACpC,KAAK,gBAAgB,mBAAmB,eACxC,KAAK,gBAAgB,mBAAmB;AAAA,EAE5C;AAAA,EAIA,IAAI,SAAiB;AACnB,WAAO,KAAK;AAAA,EACd;AAAA,EAIA,IAAI,aAA4B;AAC9B,WAAO,KAAK;AAAA,EACd;AAAA,EAIA,IAAI,aAA4B;AAC9B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,qBAAyC;AACvC,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAAA,EAEA,WAAmB;AACjB,QAAI,IAAI,KAAK;AACb,QAAI,KAAK,gBAAgB,MAAM;AAC7B,UAAI,OAAO,KAAK,WAAW,IAAI;AAC/B,UAAI,KAAK,gBAAgB,MAAM;AAC7B,YAAI,GAAG,OAAO,KAAK,WAAW,KAAK;AAAA,MACrC;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACF;AAUO,IAAM,OAAN,cAAmB,UAAgB;AAAA,EAC/B;AAAA,EAET,eACK,MACH;AACA,UAAM;AACN,QAAI,OAAO,KAAK,OAAO,UAAU;AAC/B,UAAI,KAAK,MAAM,MAAM;AACnB,aAAK,qBAAqB,IAAI;AAAA,UAC5B,YAAY,WAAW,KAAK,EAAE;AAAA,UAC9B,KAAK;AAAA,QACP;AACA;AAAA,MACF,OAAO;AACL,eAAO,KAAK,WAAW,KAAK,EAAE;AAAA,MAChC;AAAA,IACF;AACA,SAAK,qBAAqB,IAAI;AAAA,MAC5B,KAAK;AAAA,MACL,KAAK;AAAA,IACP;AAAA,EACF;AAAA,EAEA,YAAY,OAA4B;AACtC,UAAM,cAAc,MAAM,GAAG,IAAI;AACjC,WACE,CAAC,CAAC,eACF,KAAK,mBAAmB,YAAY,YAAY,kBAAkB;AAAA,EAEtE;AAAA,EAEA,SAAe;AAEb,WAAO;AAAA,MACL;AAAA,MACA,IAAI,KAAK,KAAK,mBAAmB,SAAS,CAAC,KAAK,MAAM;AAAA,IACxD;AAAA,EACF;AAAA,EAEA,CAAC,mBACC,4BACoB;AACpB,QAAI,8BAAyC;AAC3C,YAAM;AAAA,IACR,OAAO;AACL,YAAM,KAAK,SAAS;AAAA,QAClB,QAAQ,CAAC,KAAK;AAAA,MAChB,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,IAAI,UAAuB;AACzB,WAAO,KAAK,mBAAmB;AAAA,EACjC;AAAA,EAGA,SAAS,eAAwC;AAE/C,WAAO,IAAI;AAAA,MACT,KAAK,mBAAmB,QAAQ,SAAS,aAAa;AAAA,MACtD,cAAc,UAAU,KAAK;AAAA,IAC/B;AAAA,EACF;AAAA,EAEA,OAAO,WAAW,GAAiB;AACjC,WAAO,UAAU,CAAC;AAAA,EACpB;AAAA,EAEA,IAAI,SAAiB;AACnB,WAAO,KAAK,mBAAmB;AAAA,EACjC;AAAA,EAGA,IAAI,OAAe;AACjB,aAAS,kBAAkB;AAC3B,WAAO;AAAA,EACT;AAAA,EAGA,IAAI,SAAiB;AACnB,WAAO,KAAK,mBAAmB,QAAQ,UAAU;AAAA,EACnD;AAAA,EAGA,IAAI,aAAiC;AACnC,WAAO,KAAK,mBAAmB,QAAQ,cAAc;AAAA,EACvD;AAAA,EAGA,IAAI,aAAiC;AACnC,WAAO,KAAK,mBAAmB,QAAQ,cAAc;AAAA,EACvD;AAAA,EAEA,WAAmB;AACjB,QAAI,KAAK,WAAW,WAAW;AAC7B,aAAO;AAAA,IACT;AACA,QAAI,KAAK,OAAO,SAAS,QAAQ,GAAG;AAClC,aACE,KAAK,mBAAmB,QAAQ,SAAS,EAAE,MAAM,GAAG,EAAE,IACtD,KAAK,IAAI,KAAK,MAAM,KACnB,KAAK,SAAS,IAAI,MAAM;AAAA,IAE7B;AACA,QAAI,KAAK,OAAO,SAAS,YAAY,GAAG;AACtC,YAAM,YAAY,KAAK,IAAI,KAAK,MAAM;AACtC,aACE,KAAK,mBAAmB,QAAQ,SAAS,EAAE,MAAM,GAAG,GAAG,KACtD,cAAc,IAAI,KAAK,cACvB,KAAK,SAAS,IAAI,OAAO;AAAA,IAE9B;AAEA,WACE,KAAK,mBAAmB,QAAQ,SAAS,IACzC,KAAK,mBAAmB,OAAO;AAAA,EAEnC;AAUF;;;AC9PA,IAAM,wBAAN,MAA4B;AAAA,EAA5B;AACE,wBAAmC;AACnC,wBAAmC;AAAA;AAAA,EAEnC,OAAO,UAAmC;AACxC,UAAM,UAAU,KAAK,MAAM,QAAQ;AACnC,QAAI,CAAC,SAAS;AACZ,aAAO;AAAA,IACT;AACA,WAAO,IAAI,QAAQ,IAAI,CAAC,SAAS,KAAK,MAAM,EAAE,KAAK,IAAI;AAAA,EACzD;AAAA,EAEA,MAAM,UAAuD;AAC3D,SAAK,iBAAL,KAAK,eAAiB,IAAI,YAAY,OAAO;AAC7C,SAAK,iBAAL,KAAK,eAAiB,IAAI,YAAY,OAAO;AAE7C,UAAM,aAAa,SAAS;AAC5B,QAAI,WAAW,6BAA6B,MAAM,GAAG;AACnD,YAAM,CAAC,GAAG,CAAC,IAAI,WAAW,cAAc;AACxC,UACE,EAAE,GAAG,IAAI,GAAG,QAAQ,YAAY,KAAK,YAAY,KACjD,EAAE,GAAG,IAAI,GAAG,QAAQ,YAAY,KAAK,YAAY,GACjD;AACA,YAAI,SAAS,WAAW,GAAG;AACzB,gBAAM,IAAI;AAAA,YACR;AAAA,UACF;AAAA,QACF;AACA,eAAO,CAAC,GAAW,CAAS;AAAA,MAC9B;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACF;AACA,IAAM,gCAAgC,IAAI,sBAAsB;AAGzD,IAAM,WAAN,cAAuB,UAAoB;AAAA,EAIhD,YAAY,WAA8B,QAAiB;AACzD,UAAM;AACN,UAAM,MAAM,sBAAsB,SAAS;AAC3C,SAAK,qBAAqB,IAAI,kBAAkB,KAAK,MAAM;AAAA,EAC7D;AAAA,EAPS;AAAA,EAST,YAAY,OAA4B;AACtC,UAAM,kBAAkB;AACxB,WACE,MAAM,GAAG,QAAQ,KACjB,KAAK,mBAAmB,YAAY,gBAAgB,kBAAkB;AAAA,EAE1E;AAAA,EAEA,IAAI,MAAW;AACb,WAAO,KAAK,mBAAmB;AAAA,EACjC;AAAA,EAEA,IAAI,SAAiB;AACnB,WAAO,KAAK,mBAAmB;AAAA,EACjC;AAAA,EAGA,IAAI,+BAAuC;AACzC,WAAO,KAAK,mBAAmB,OAAO;AAAA,EACxC;AAAA,EAEA,SAAmB;AACjB,WAAO,IAAI;AAAA,MACT,KAAK,mBAAmB;AAAA,MACxB,CAAC,KAAK,mBAAmB;AAAA,IAC3B;AAAA,EACF;AAAA,EAEA,CAAC,mBACC,4BACA,OACoB;AACpB,sBAAU;AACV,QAAI,UAAU,GAAG;AACf,YAAM,+BAA0C,OAAO,KAAK,OAAO;AAAA,IACrE,OAAO;AACL,aAAO,KAAK,mBAAmB,mBAAmB,SAAS,QAAQ,CAAC;AAAA,IACtE;AAAA,EACF;AAAA,EAEA,OAAO,aAAuB;AAC5B,UAAM,IAAI,MAAM,eAAe;AAAA,EACjC;AAAA,EAEA,WAAmB;AACjB,WACE,8BAA8B,OAAO,IAAI,KACzC,IAAI,KAAK,mBAAmB,QAAQ,SAAS,KAAK,KAAK,mBAAmB,OAAO;AAAA,EAErF;AAAA,EAEA,6BAAgE;AAC9D,WAAO,8BAA8B,MAAM,IAAI;AAAA,EACjD;AAOF;;;AC1GO,SAAS,eACd,GACA,GASS;AACT,SAAO,aAAa;AACtB;AACO,SAAS,sBAAsB,GAAiB;AACrD,SACE,eAAe,GAAG,QAAQ,KAC1B,eAAe,GAAG,WAAW,KAC7B,eAAe,GAAG,UAAU,KAC5B,eAAe,GAAG,SAAS,KAC3B,eAAe,GAAG,IAAI,KACtB,eAAe,GAAG,OAAO,KACzB,eAAe,GAAG,KAAK;AAE3B;;;ACxBA,SAAS,SACP,GACA,SACA,UACe;AAEf,MAAI,QAAQ,GAAG,QAAQ,GAAG;AACxB,WAAO,EAAE,iBAAiB,SAAqB,QAAQ;AAAA,EACzD;AACA,MAAI,QAAQ,GAAG,IAAI,GAAG;AACpB,WAAO,EAAE,aAAa,SAAiB,QAAQ;AAAA,EACjD;AACA,MAAI,QAAQ,GAAG,UAAU,GAAG;AAC1B,WAAO,EAAE,mBAAmB,SAAuB,QAAQ;AAAA,EAC7D;AACA,MAAI,QAAQ,GAAG,SAAS,GAAG;AACzB,WAAO,EAAE,kBAAkB,SAAsB,QAAQ;AAAA,EAC3D;AACA,MAAI,QAAQ,GAAG,KAAK,GAAG;AACrB,WAAO,EAAE,cAAc,SAAkB,QAAQ;AAAA,EACnD;AACA,MAAI,QAAQ,GAAG,OAAO,GAAG;AACvB,WAAO,EAAE,gBAAgB,SAAoB,QAAQ;AAAA,EACvD;AACA,MAAI,QAAQ,GAAG,WAAW,GAAG;AAC3B,WAAO,EAAE,oBAAoB,SAAwB,QAAQ;AAAA,EAC/D;AACA,QAAM,IAAI,MAAM,iBAAiB;AACnC;AAEA,SAAS,cAAc,GAAwB;AAC7C,MACE,EAAE,GAAG,QAAQ,KACb,EAAE,GAAG,IAAI,KACT,EAAE,GAAG,UAAU,KACf,EAAE,GAAG,SAAS,KACd,EAAE,GAAG,KAAK,KACV,EAAE,GAAG,OAAO,KACZ,EAAE,GAAG,WAAW,GAChB;AACA,WAAO;AAAA,EACT;AACA,QAAM,IAAI,MAAM,kCAAkC;AACpD;AAEO,IAAe,kBAAf,MAIL;AAAA,EAEO,gBAAgB,SAAkB,UAAmC;AAC1E,WAAO,SAAS,MAAM,SAAS,QAAQ;AAAA,EACzC;AAAA,EAEO,oBAAoB,SAAkB,UAA6B;AACxE,WAAO,cAAc,KAAK,gBAAgB,SAAS,QAAQ,CAAQ;AAAA,EACrE;AAkCF;AAEO,IAAe,cAAf,cAGG,gBAAqD;AAAA,EACtD,gBAAgB,SAAiC;AACtD,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEO,oBAAoB,SAA2B;AACpD,WAAO,cAAc,KAAK,gBAAgB,OAAO,CAAQ;AAAA,EAC3D;AAUF;AAEO,SAAS,sBAKd,sBAGA,iBAGuC;AACvC,QAAM,WAAW,IAAI;AAAA,IACnB,GAAI,mBAAoB,CAAC;AAAA,EAC3B;AACA,SAAO,SAAS,YAAY,KAAK,QAAQ;AAC3C;;;AC/IA,IAAM,sBAAsB;AA8BrB,IAAM,sBAAN,MAA0B;AAAA,EAC/B,YAAoB,SAAwB,CAAC,GAAG;AAA5B;AAAA,EAA6B;AAAA,EAEjD,gBAAgD;AAC9C,UAAM,EAAE,OAAO,IAAI,KAAK;AACxB,QAAI,WAAW,MAAM;AACnB,aAAO;AAAA,IACT;AACA,QAAI,WAAW,OAAO;AACpB,aAAO;AAAA,IACT;AACA,WAAO,QAAQ,eAAe;AAAA,EAChC;AAAA,EAEA,YAAY;AACV,WAAO,KAAK,OAAO,UAAU,KAAK,cAAc,MAAM;AAAA,EACxD;AAAA,EAEA,8BAAuC;AACrC,UAAM,EAAE,OAAO,IAAI,KAAK;AACxB,QAAI,WAAW,QAAQ,WAAW,OAAO;AACvC,aAAO;AAAA,IACT;AACA,QAAI,QAAQ,uBAAuB;AACjC,aAAO,QAAQ;AAAA,IACjB;AACA,WAAO,QAAQ,gBAAgB,mBAC3B,kBACA;AAAA,EACN;AAAA,EAEA,gCAA2E;AACzE,WACE,KAAK,OAAO,cAAc,iCAC1B,KAAK,OAAO;AAAA,EAEhB;AACF;;;AChEA,SAAS,iBAAiB,WAAmB,OAAsB;AAIjE,SAAO,YAAY,KAAK,KAAK,MAAM,MAAM,KAAK;AAChD;AAEA,SAAS,UAAU,GAAW,aAAqB,QAAwB;AACzE,WAAW,IAAI,UAAU,cAAe,eAAe,cAAe;AACxE;AAEO,SAAS,uBACd,KACA,WACA,SACK;AACL,QAAM,gBAAgB,IAAI,oBAAoB,OAAO;AAErD,MAAI,eAA0B,MAAM,KAAK,IAAI,cAAc,CAAC;AAC5D,MAAI,eAAuB,CAAC,SAAS;AACrC,WAAS,SAAS;AAChB,WAAO,IAAI,IAAI,CAAC,GAAG,cAAc,GAAG,YAAY,CAAC;AAAA,EACnD;AAEA,WAAS,QAAQ,MAAkB;AACjC,QAAI,cAAc,4BAA4B,MAAM,QAAQ;AAC1D,aAAO;AAAA,IACT;AACA,UAAM,mBACJ,cAAc,8BAA8B,GAAG;AACjD,QAAI,CAAC,kBAAkB;AACrB,aAAO;AAAA,IACT;AACA,UAAM,MAAM,iBAAiB,UAAU,OAAO;AAC9C,QAAI;AACJ,YAAQ,cAAc,4BAA4B;AAAA,WAC3C,WAAW;AACd,iBAAS,CAAC,KAAK,OAAO,OAAO,KAAK,SAAS,IAAI,IAAI,MAAM,CAAC;AAC1D;AAAA,MACF;AAAA,WACK,sBAAsB;AACzB,iBAAS,CAAC,KAAK,OAAO,MAAM,KAAK,CAAC;AAClC;AAAA,MACF;AAAA,WACK,sBAAsB;AACzB,iBAAS;AACT;AAAA,MACF;AAAA,WACK,iBAAiB;AACpB,iBAAS,KAAK,SAAS,IAAI,IAAI,MAAM;AACrC;AAAA,MACF;AAAA,eACS;AACP,cAAM,IAAI,MAAM,kBAAkB;AAAA,MACpC;AAAA;AAEF,QAAI,eAAe,UAAU,KAAK,QAAQ,KAAK,MAAM;AACrD,WAAO,KAAK,SAAS,EAAE,QAAQ,aAAa,CAAC;AAAA,EAC/C;AAEA,MAAI,cAAc,UAAU,GAAG;AAC7B,QAAI;AACJ,UAAM,OAAO,cAAc,8BAA8B,GAAG;AAC5D,QAAI,MAAM;AACR,oCAA8B,CAAC,SAC7B,KAAK,wBAAwB,UAAU,SAAS,KAAK,OAAO;AAAA,IAChE,OAAO;AACL,YAAM,uBAAuB,UAAU,QAAQ,SAAS;AACxD,oCAA8B,CAAC,SAC7B,KAAK,QAAQ,SAAS,MAAM;AAAA,IAChC;AAEA,UAAM,oBACJ,cAAc,cAAc,MAAM;AAEpC,UAAM,oBAAoB,oBAAI,IAAwB;AACtD,sBAAkB;AAAA,MAChB,UAAU,QAAQ,SAAS;AAAA,MAC3B,KAAK,KAAK,UAAU,MAAM;AAAA,IAC5B;AACA,QAAI;AACJ,SAAK,IAAI,aAAa,SAAS,GAAG,KAAK,GAAG,KAAK;AAC7C,YAAM,OAAO,aAAa,GAAG,GAAG,IAAI;AACpC,UAAI,CAAC,MAAM;AACT;AAAA,MACF;AACA,UAAI,CAAC,4BAA4B,IAAI,GAAG;AACtC;AAAA,MACF;AACA,YAAM,aAAa,KAAK,QAAQ,SAAS;AACzC,UAAI,mBAAmB;AACrB,cAAM,iCACJ,kBAAkB,IAAI,UAAU;AAClC,YACE,kCACA,CAAC,iBAAiB,gCAAgC,IAAI,GACtD;AACA;AAAA,QACF;AACA,0BAAkB,IAAI,YAAY,KAAK,KAAK,KAAK,MAAM,CAAe;AAAA,MACxE;AAAA,IACF;AACA,UAAM,SAAS,CAAC,GAAI,aAAa,OAAO,IAAI,CAAC,GAAc,SAAS;AAEpE,QAAI,MAAM;AAER,qBAAe,KAAK;AAAA,QAClB;AAAA,QACA,cAAc,4BAA4B,MAAM;AAAA,MAClD;AAAA,IACF,OAAO;AACL,UAAI,SAAS,OAAO;AAAA,QAClB,CAAC,KAAa,SAAe,MAAM,KAAK;AAAA,QACxC;AAAA,MACF;AACA,UAAI,kBAAkB,SAAS,GAAG;AAChC,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AACA,qBAAe,CAAC,IAAI,KAAK,UAAU,SAAS,MAAM,CAAC;AAAA,IACrD;AAAA,EACF;AACA,iBAAe,aACZ,IAAI,CAAC,MAAM,QAAQ,CAAC,CAAC,EACrB,OAAO,CAAC,SAAe,KAAK,WAAW,CAAC;AAC3C,SAAO,OAAO;AAChB;AAEO,SAAS,uBACd,KACA,MACA,SACK;AACL,QAAM,YAAY,KAAK,GAAG,IAAI;AAC9B,MAAI,WAAW;AACb,WAAO,uBAAuB,KAAK,WAAW,OAAO;AAAA,EACvD,OAAO;AACL,WAAO,IAAI,IAAI,CAAC,GAAG,IAAI,cAAc,GAAG,IAAI,CAAC;AAAA,EAC/C;AACF;;;ACpIA,IAAM,WAAN,cAAuB,gBAAqD;AAAA,EAC1E;AAAA,EACA,8BAAoD;AAClD,WAAQ,8EAAwC,oBAAI,IAAqB;AAAA,EAC3E;AAAA,EAGA,gBAAgB,SAA2C;AACzD,WAAO;AAAA,MACL,GAAG;AAAA,MACH,OAAO,QAAQ,QAAQ,QAAQ,QAAQ,IAAI;AAAA,IAC7C;AAAA,EACF;AAAA,EAGA,CAAQ,YAAY,KAAU,SAA8C;AAC1E,QAAI,QAAQ,UAAU,GAAG;AACvB,aAAO,IAAI,cAAc;AACzB;AAAA,IACF;AAEA,QAAI,SAAoB,CAAC;AAEzB,UAAM,aAA8B,KAAK,gBAAgB,OAAO;AAChE,eAAW,WAAW,IAAI,cAAc,GAAG;AACzC,iBAAW,iBAAiB,KAAK,gBAAgB,SAAS,UAAU,GAAG;AACrE,iBAAS,MAAM;AAAA,UACb;AAAA,YACE,IAAI,IAAI,MAAM;AAAA,YACd;AAAA,YACA;AAAA,UACF,EAAE,cAAc;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAGA,eAAW,cAAc,QAAQ;AAC/B,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,CAAQ,iBACN,UACA,SACoB;AACpB,QAAI,QAAQ,UAAU,GAAG;AACvB,YAAM;AACN;AAAA,IACF;AACA,QAAI,SAAS,WAAW,GAAG;AAEzB;AAAA,IACF;AACA,UAAM,cAAc,IAAI;AAAA,MACtB,KAAK,YAAY,SAAS,KAAK,KAAK,gBAAgB,OAAO,CAAC;AAAA,MAC5D,SAAS;AAAA,IACX;AACA,QAAI,YAAY,IAAI,oBAAoB,GAAG;AACzC;AAAA,IACF;AAEA,UAAM,iBAAiB,KAAK,4BAA4B,EAAE,IAAI,QAAQ;AACtE,QAAI,gBAAgB;AAClB,kBAAY,8BAA8B;AAC1C,qBAAe,2BAA2B;AAAA,IAC5C;AAEA,UAAM;AAAA,EACR;AAAA,EAEA,CAAQ,aACN,MACA,UACoB;AACpB,UAAM;AAAA,EACR;AAAA,EAEA,mBAAmB,GAAQ,GAAQ,SAAmC;AACpE,QACE,EAAE,6BAA6B,MAAM,KACrC,EAAE,6BAA6B,MAAM,GACrC;AAEA,YAAM,QAAQ,MAAM,KAAK,EAAE,cAAc,CAAC,EAAE,IAAI,GAAG,IAAI;AACvD,YAAM,QAAQ,MAAM,KAAK,EAAE,cAAc,CAAC,EAAE,IAAI,GAAG,IAAI;AACvD,UAAI,EAAE,SAAS,QAAQ;AACrB,eAAO;AAAA,MACT;AACA,UAAI,MAAM,QAAQ,YAAY,MAAM,OAAO,GAAG;AAC5C,eAAO;AAAA,MACT;AACA,YAAM,sBAAsB,IAAI,oBAAoB,OAAO;AAC3D,UACE,oBACG,8BAA8B,GAC7B,MAAM,wBAAwB,MAAM,SAAS,MAAM,OAAO,GAC9D;AACA,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,CAAQ,mBACN,YACA,SACoB;AACpB,QAAI,QAAQ,UAAU,GAAG;AACvB,YAAM;AACN;AAAA,IACF;AACA,UAAM,aAAa,KAAK,gBAAgB,OAAO;AAC/C,UAAM,gBAAgB,IAAI;AAAA,MACxB,KAAK,YAAY,WAAW,GAAG,UAAU;AAAA,MACzC,KAAK,YAAY,WAAW,GAAG,UAAU;AAAA,IAC3C;AACA,QACE,cAAc,EAAE,oBAAoB,KACpC,cAAc,EAAE,oBAAoB,KACpC,cAAc,EAAE,YAAY,cAAc,CAAC,KAC3C,cAAc,EAAE,YAAY,cAAc,EAAE,OAAO,CAAC,KACpD,KAAK,mBAAmB,cAAc,GAAG,cAAc,GAAG,OAAO,GACjE;AACA;AAAA,IACF;AACA,UAAM;AAAA,EACR;AAAA,EAEA,CAAQ,kBACN,WACA,SACoB;AACpB,QAAI,QAAQ,UAAU,GAAG;AACvB,YAAM;AACN;AAAA,IACF;AACA,UAAM,aAAa,KAAK,gBAAgB,OAAO;AAC/C,UAAM,eAAe,IAAI;AAAA,MACvB,KAAK,YAAY,UAAU,GAAG,UAAU;AAAA,MACxC,KAAK,YAAY,UAAU,GAAG,UAAU;AAAA,IAC1C;AACA,QAAI,aAAa,EAAE,oBAAoB,GAAG;AACxC;AAAA,IACF;AACA,QACE,aAAa,EAAE,oBAAoB,KACnC,aAAa,EAAE,YAAY,aAAa,CAAC,KACzC,aAAa,EAAE,YAAY,aAAa,EAAE,OAAO,CAAC,KAClD,KAAK,mBAAmB,aAAa,GAAG,aAAa,GAAG,OAAO,GAC/D;AACA,aAAO,UAAU,EAAE,cAAc;AACjC;AAAA,IACF;AACA,UAAM;AAAA,EACR;AAAA,EAEA,CAAQ,cACN,OACA,UACoB;AACpB,QAAI,MAAM,0BAA0B;AAClC,YAAM,WAAW,IAAI,MAAM;AAC3B,WAAK,4BAA4B,EAAE;AAAA,QACjC,MAAM;AAAA,QACN;AAAA,MACF;AACA,YAAM;AAAA,IACR,OAAO;AACL,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,CAAQ,gBACN,SACA,UACoB;AACpB,UAAM;AAAA,EACR;AAAA,EAEA,CAAQ,oBACN,SACA,UACoB;AACpB,UAAM;AAAA,EACR;AACF;AAEO,IAAM,WAAW,sBAAsB,QAAQ;;;ACzLtD,SAAS,WAAW,OAA8C;AAChE,MAAI,CAAC,OAAO;AACV,WAAO,CAAC;AAAA,EACV;AAEA,MAAI,eAAe,OAAO,GAAG,GAAG;AAC9B,WAAQ,MAAc,cAAc;AAAA,EACtC;AAEA,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,SAAS,KAAK,EAAE,cAAc;AAAA,EACvC;AAEA,QAAM,OAAO;AACb,MAAI,OAAO,KAAK,OAAO,cAAc,YAAY;AAC/C,WAAO;AAAA,EACT;AAEA,QAAM,IAAI,MAAM,iBAAiB;AACnC;AAGO,SAAS,sBAAsB,KAA6B;AACjE,MAAI,eAAe,KAAK,GAAG,GAAG;AAC5B,WAAO;AAAA,EACT;AACA,SAAO,IAAI,IAAI,GAAG;AACpB;AA0BO,IAAM,MAAN,cAAkB,UAAe;AAAA,EAEtC;AAAA,EACA,YAAY,KAAyB;AACnC,UAAM;AACN,SAAK,YAAY,MAAM,KAAK,WAAW,GAAG,CAAC;AAG3C,eAAW,WAAW,KAAK,WAAW;AACpC,UAAI,CAAC,sBAAsB,OAAO,GAAG;AACnC,cAAM,IAAI,MAAM,oCAAoC;AAAA,MACtD;AAAA,IACF;AAAA,EACF;AAAA,EAgCA,YAAY,OAA4B;AACtC,UAAM,aAAa;AACnB,QAAI,CAAC,MAAM,GAAG,GAAG,GAAG;AAClB,aAAO;AAAA,IACT;AAGA,UAAM,KAAK,MAAM,KAAK,KAAK,SAAS;AACpC,UAAM,KAAK,MAAM,KAAK,WAAW,SAAS;AAC1C,QAAI,GAAG,WAAW,GAAG,QAAQ;AAC3B,aAAO;AAAA,IACT;AACA,aAAS,IAAI,GAAG,IAAI,GAAG,QAAQ,KAAK;AAClC,UAAI,CAAC,GAAG,GAAG,YAAY,GAAG,EAAE,GAAG;AAC7B,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAYA,SAAc;AAGZ,WAAO,IAAI,IAAI,QAAQ,MAAM,KAAK,KAAK,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAAA,EAC3E;AAAA,EAGA,CAAC,mBACC,4BACA,OACoB;AACpB,sBAAU;AACV,eAAW,WAAW,OAAO,KAAK,WAAW,OAAO,GAAG;AACrD,aAAO,QAAQ,mBAAmB,SAAS,KAAK;AAAA,IAClD;AAAA,EACF;AAAA,EAoBA,OAAO,SAAmC;AACxC,WAAO,IAAI;AAAA,MACT,KAAK;AAAA;AAAA,QAEH,SAAS,SAAS;AAAA,MACpB;AAAA,IACF;AAAA,EACF;AAAA,EAGA,CAAC,wBAAyC;AACxC,eAAW,QAAQ,KAAK,mBAAmB,GAAG;AAC5C,UAAI,KAAK,GAAG,IAAI,GAAG;AACjB,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO,OAA+B;AACpC,WAAO,IAAI;AAAA,MACT,MAAM,KAAK,KAAK,SAAS,EAAE,OAAO,MAAM,KAAK,WAAW,KAAK,CAAC,CAAC;AAAA,IACjE;AAAA,EACF;AAAA,EAGA,sBAA+B;AAC7B,eAAW,KAAK,KAAK,WAAW;AAC9B,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,WAAW,GAAgB;AAChC,WAAO,SAAS,CAAC;AAAA,EACnB;AAAA,EAGA,QAA4B;AAC1B,WAAO,KAAK,cAAc;AAAA,EAC5B;AAAA,EAEA,CAAC,gBAAoC;AACnC,eAAW,WAAW,KAAK,WAAW;AACpC,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAGA,uBAA+B;AAC7B,WAAO,KAAK,6BAA6B;AAAA,EAC3C;AAAA,EAEA,+BAAuC;AACrC,WAAO,MAAM,KAAK,KAAK,SAAS,EAAE;AAAA,EACpC;AAAA,EAGA,IAAI,OAAe;AACjB,aAAS,kBAAkB;AAC3B,WAAO;AAAA,EACT;AAAA,EASA,WAAmB;AACjB,QAAI,SAAS;AACb,QAAI,yBAAyC;AAC7C,eAAW,WAAW,KAAK,WAAW;AACpC,UAAI,wBAAwB;AAC1B,kBAAU,aAAa,wBAAwB,OAAO;AAAA,MACxD;AACA,YAAM,eAAe,QAAQ,GAAG,KAAK,GAAG;AACxC,UAAI,cAAc;AAChB,YAAI,aAAa,WAAW,IAAI;AAC9B,gBAAM,IAAI,MAAM,+BAA+B;AAAA,QACjD;AACA,kBAAU,KAAK,aAAa,IAAI,SAAS;AAAA,MAC3C,WAAW,QAAQ,GAAG,QAAQ,GAAG,6BAA6B;AAAA,MAE9D,OAAO;AACL,kBAAU,QAAQ,SAAS;AAAA,MAC7B;AACA,+BAAyB;AAAA,IAC3B;AACA,WAAO;AAAA,EACT;AAAA,EAoDA,qBAAqB,SAAgC;AACnD,WAAO,IAAI,IAAI,SAAS,MAAM,WAAW,CAAC,CAAC,CAAC;AAAA,EAC9C;AAAA,EAGA,SAAS,SAAgC;AACvC,WAAO,KAAK,qBAAqB,OAAO;AAAA,EAC1C;AACF;AAEA,SAAS,aAAa,IAAa,IAAqB;AACtD,MAAI,GAAG,GAAG,OAAO,KAAK,GAAG,GAAG,OAAO,GAAG;AACpC,WAAO;AAAA,EACT;AACA,MAAI,GAAG,GAAG,QAAQ,GAAG,6BAA6B;AAChD,WAAO;AAAA,EACT;AACA,MAAI,GAAG,GAAG,WAAW,KAAK,CAAC,GAAG,GAAG,OAAO,GAAG;AACzC,WAAO;AAAA,EACT;AACA,SAAO;AACT;;;AC9UO,IAAM,UAAU;AAAA,EACrB,MAAM,IAAI,IAAI;AAAA,IACZ,IAAI,KAAK,KAAK,CAAC;AAAA,IACf,IAAI,KAAK,KAAK,CAAC;AAAA,IACf,IAAI,KAAK,KAAK,EAAE;AAAA,IAChB,IAAI,KAAK,KAAK,CAAC;AAAA,IACf,IAAI,KAAK,KAAK,CAAC;AAAA,IACf,IAAI,KAAK,KAAK,EAAE;AAAA,IAChB,IAAI,KAAK,KAAK,EAAE;AAAA,EAClB,CAAC;AAAA,EAED,UAAU,IAAI,IAAI;AAAA,IAChB,IAAI,KAAK,KAAK,CAAC;AAAA,IACf,IAAI,KAAK,KAAK,CAAC;AAAA,IACf,IAAI,KAAK,KAAK,EAAE;AAAA,IAChB,IAAI,KAAK,KAAK,EAAE;AAAA,IAChB,IAAI,KAAK,KAAK,CAAC;AAAA,IACf,IAAI,KAAK,KAAK,EAAE;AAAA,IAChB,IAAI,KAAK,KAAK,EAAE;AAAA,EAClB,CAAC;AAAA,EAED,gBAAgB,IAAI,IAAI;AAAA,IACtB,IAAI;AAAA,MACF,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,GAAG,IAAI,KAAK,KAAK,CAAC,GAAG,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC;AAAA,MAC/D,IAAI,IAAI;AAAA,QACN,IAAI,UAAU,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC;AAAA,MACxE,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAAA,EAED,QAAQ,IAAI,IAAI;AAAA,IACd,IAAI,KAAK,KAAK,CAAC;AAAA,IACf,IAAI,KAAK,KAAK,EAAE;AAAA,IAChB,IAAI,KAAK,KAAK,EAAE;AAAA,IAChB,IAAI,KAAK,KAAK,CAAC;AAAA,IACf,IAAI,KAAK,KAAK,EAAE;AAAA,IAChB,IAAI,KAAK,KAAK,EAAE;AAAA,IAChB,IAAI,KAAK,KAAK,CAAC;AAAA,IACf,IAAI,KAAK,KAAK,CAAC;AAAA,EACjB,CAAC;AAAA,EAED,OAAO,IAAI,IAAI;AAAA,IACb,IAAI,KAAK,KAAK,EAAE;AAAA,IAChB,IAAI;AAAA,MACF,IAAI,IAAI;AAAA,QACN,IAAI;AAAA,UACF,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC;AAAA,UAC1B,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC;AAAA,QAC7B;AAAA,MACF,CAAC;AAAA,MACD,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC;AAAA,IAC5B;AAAA,IACA,IAAI;AAAA,MACF,IAAI,IAAI;AAAA,QACN,IAAI,UAAU,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC;AAAA,MACxE,CAAC;AAAA,MACD,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC;AAAA,IAC5B;AAAA,IACA,IAAI,KAAK,KAAK,CAAC;AAAA,EACjB,CAAC;AAAA,EAED,eAAe,IAAI,IAAI;AAAA,IACrB,IAAI;AAAA,MACF,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC;AAAA,MAC1B,IAAI,IAAI;AAAA,QACN,IAAI;AAAA,UACF,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC;AAAA,UAC1B,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC;AAAA,QAC5B;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAAA,EAED,cAAc,IAAI,IAAI;AAAA,IACpB,IAAI;AAAA,MACF,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC;AAAA,MAC1B,IAAI,IAAI;AAAA,QACN,IAAI;AAAA,UACF,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC;AAAA,UAC1B,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,EAAE,GAAG,IAAI,KAAK,KAAK,EAAE,GAAG,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC;AAAA,QAClE;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAAA,EAED,aAAa,IAAI,IAAI;AAAA,IACnB,IAAI,KAAK,KAAK,CAAC;AAAA,IACf,IAAI,KAAK,KAAK,CAAC;AAAA,IACf,IAAI,KAAK,KAAK,CAAC;AAAA,IACf,IAAI,KAAK,KAAK,EAAE;AAAA,IAChB,IAAI,KAAK,KAAK,EAAE;AAAA,IAChB,IAAI,KAAK,KAAK,EAAE;AAAA,EAClB,CAAC;AAAA,EAED,OAAO,IAAI,IAAI;AAAA,IACb,IAAI,KAAK,KAAK,CAAC;AAAA,IACf,IAAI,KAAK,KAAK,CAAC;AAAA,IACf,IAAI,KAAK,KAAK,EAAE;AAAA,IAChB,IAAI,KAAK,KAAK,EAAE;AAAA,IAChB,IAAI,KAAK,KAAK,EAAE;AAAA,IAChB,IAAI,KAAK,KAAK,CAAC;AAAA,IACf,IAAI,KAAK,KAAK,CAAC;AAAA,IACf,IAAI,KAAK,KAAK,EAAE;AAAA,IAChB,IAAI,KAAK,KAAK,EAAE;AAAA,IAChB,IAAI,KAAK,KAAK,EAAE;AAAA,IAChB,IAAI,KAAK,KAAK,CAAC;AAAA,IACf,IAAI,KAAK,KAAK,CAAC;AAAA,IACf,IAAI,KAAK,KAAK,EAAE;AAAA,IAChB,IAAI,KAAK,KAAK,EAAE;AAAA,EAClB,CAAC;AAAA,EAED,gBAAgB,IAAI,IAAI;AAAA,IACtB,IAAI;AAAA,MACF,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC;AAAA,MAC1B,IAAI,IAAI;AAAA,QACN,IAAI;AAAA,UACF,IAAI,IAAI;AAAA,YACN,IAAI;AAAA,cACF,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC;AAAA,cAC1B,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC;AAAA,YAC5B;AAAA,UACF,CAAC;AAAA,UACD;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAAA,EAED,aAAa,IAAI,IAAI,CAAC,IAAI,MAAM,GAAG,IAAI,MAAM,GAAG,IAAI,MAAM,CAAC,CAAC;AAY9D;;;ACjJA,IAAM,iBAA6C;AAAA,EACjD,IAAI,IAAI,KAAK,GAAG;AAAA,EAChB,IAAI,IAAI,KAAK,IAAI;AAAA,EACjB,IAAI,IAAI,KAAK,GAAG;AAAA,EAChB,IAAI,IAAI,KAAK,IAAI;AAAA,EACjB,IAAI,IAAI,KAAK,GAAG;AAAA,EAChB,IAAI,IAAI,KAAK,IAAI;AAAA,EACjB,IAAI,IAAI,KAAK,GAAG;AAAA,EAChB,IAAI,IAAI,KAAK,IAAI;AAAA,EACjB,IAAI,IAAI,KAAK,GAAG;AAAA,EAChB,IAAI,IAAI,KAAK,IAAI;AAAA,EACjB,IAAI,IAAI,KAAK,GAAG;AAAA,EAChB,IAAI,IAAI,KAAK,IAAI;AAAA,EAEjB,IAAI,IAAI,KAAK,IAAI;AAAA,EACjB,IAAI,IAAI,KAAK,GAAG;AAAA,EAChB,IAAI,IAAI,KAAK,IAAI;AAAA,EACjB,IAAI,IAAI,KAAK,GAAG;AAAA,EAChB,IAAI,IAAI,KAAK,IAAI;AAAA,EAEjB,IAAI,IAAI,KAAK,GAAG;AAAA,EAChB,KAAK,IAAI,KAAK,IAAI;AAAA,EAElB,IAAI,IAAI,KAAK,GAAG;AAAA,EAChB,IAAI,IAAI,KAAK,GAAG;AAAA,EAChB,IAAI,IAAI,KAAK,IAAI;AAAA,EACjB,KAAK,IAAI,KAAK,GAAG;AAAA,EACjB,IAAI,IAAI,KAAK,GAAG;AAAA,EAChB,IAAI,IAAI,KAAK,IAAI;AAAA,EACjB,IAAI,IAAI,KAAK,GAAG;AAAA,EAChB,IAAI,IAAI,KAAK,IAAI;AAAA,EAEjB,IAAI,IAAI,KAAK,IAAI;AAAA,EACjB,KAAK,IAAI,KAAK,IAAI;AAAA,EAElB,KAAK,IAAI,MAAM;AACjB;AAKO,SAAS,UAAU,GAAkC;AAC1D,MAAI,EAAE,UAAU,EAAE,SAAS;AACzB,WAAO;AAAA,EACT;AAEA,SAAO,eAAe,EAAE,YAAY;AACtC;;;AC/CA,SAAS,kBAAkB,GAAgB;AACzC,MAAI,UAAU,EAAE,SAAS;AACzB,YAAU,QAAQ,QAAQ,MAAM,OAAO,EAAE,QAAQ,MAAM,GAAG;AAC1D,YAAU,QAAQ,QAAQ,OAAO,OAAO;AACxC,YAAU,QAAQ,QAAQ,MAAM,OAAO,EAAE,QAAQ,MAAM,GAAG;AAC1D,SAAO;AACT;AA2CO,SAAS,6BACd,SACQ;AACR,QAAM,MAAM,IAAI,IAAI,wBAAwB;AAC5C,MAAI,CAAC,QAAQ,KAAK;AAChB,UAAM,IAAI,MAAM,+BAA+B;AAAA,EACjD;AACA,MAAI,aAAa,IAAI,OAAO,kBAAkB,QAAQ,GAAG,CAAC;AAE1D,MAAI,QAAQ,OAAO;AACjB,QAAI,aAAa,IAAI,SAAS,kBAAkB,QAAQ,KAAK,CAAC;AAAA,EAChE;AACA,MAAI,QAAQ,OAAO;AACjB,QAAI,aAAa,IAAI,SAAS,QAAQ,KAAK;AAAA,EAC7C;AACA,MAAI,QAAQ,QAAQ;AAClB,QACE,CAAC;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,EAAE,SAAS,QAAQ,MAAM,GACzB;AACA,YAAM,IAAI,MAAM,6BAA6B,QAAQ,QAAQ;AAAA,IAC/D;AACA,QAAI,aAAa,IAAI,UAAU,QAAQ,MAAM;AAAA,EAC/C;AACA,MAAI,QAAQ,OAAO;AACjB,QACE,CAAC;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,EAAE,SAAS,QAAQ,KAAK,GACxB;AACA,YAAM,IAAI,MAAM,4BAA4B,QAAQ,OAAO;AAAA,IAC7D;AACA,QAAI,aAAa,IAAI,SAAS,QAAQ,KAAK;AAAA,EAC7C;AACA,MAAI,QAAQ,MAAM;AAChB,QAAI,CAAC,CAAC,UAAU,YAAY,YAAY,EAAE,SAAS,QAAQ,IAAI,GAAG;AAChE,YAAM,IAAI,MAAM,2BAA2B,QAAQ,MAAM;AAAA,IAC3D;AACA,QAAI,aAAa,IAAI,QAAQ,QAAQ,IAAI;AAAA,EAC3C;AACA,MAAI,QAAQ,MAAM;AAChB,QACE,CAAC;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,EAAE,SAAS,QAAQ,IAAI,GACvB;AACA,YAAM,IAAI,MAAM,2BAA2B,QAAQ,MAAM;AAAA,IAC3D;AACA,QAAI,aAAa,IAAI,QAAQ,QAAQ,IAAI;AAAA,EAC3C;AACA,SAAO,IAAI,SAAS;AACtB;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/cubing/twisty/debug.ts", "../../src/cubing/twisty/model/PromiseFreshener.ts", "../../src/cubing/twisty/model/props/TwistyProp.ts", "../../src/cubing/twisty/controllers/RenderScheduler.ts", "../../src/cubing/twisty/model/props/puzzle/display/HintFaceletProp.ts", "../../src/cubing/twisty/views/3D/TAU.ts", "../../src/cubing/twisty/views/node-custom-element-shims.ts", "../../src/cubing/twisty/views/ManagedCustomElement.ts", "../../src/cubing/vendor/three/examples/jsm/libs/stats.modified.module.ts", "../../src/cubing/twisty/heavy-code-imports/3d.ts", "../../src/cubing/twisty/views/canvas.ts", "../../src/cubing/twisty/views/3D/Twisty3DVantage.css.ts", "../../src/cubing/twisty/views/3D/DragTracker.ts", "../../src/cubing/twisty/views/3D/RendererPool.ts", "../../src/cubing/twisty/views/3D/TwistyOrbitControls.ts", "../../src/cubing/twisty/views/3D/Twisty3DVantage.ts"],
|
|
4
|
-
"sourcesContent": ["export const twistyDebugGlobals: {\n // WARNING: The current shared renderer implementation has performance issues, especially in Safari.\n // Avoid using for players that are likely to have dimensions approaching 1 megapixel or higher.\n // TODO: use a dedicated renderer while fullscreen?\n // - \"auto\": Default heuristics.\n // - \"always\": Force all new (i.e. constructed in the future) renderers to be shared\n // - \"never\": Force all new (i.e. constructed in the future) renderers to be dedicated\n shareAllNewRenderers: \"auto\" | \"always\" | \"never\";\n showRenderStats: boolean;\n} = {\n shareAllNewRenderers: \"auto\",\n showRenderStats: false,\n};\n\nexport function setTwistyDebug(\n options: Partial<typeof twistyDebugGlobals>,\n): void {\n for (const [key, value] of Object.entries(options)) {\n if (key in twistyDebugGlobals) {\n (twistyDebugGlobals as any)[key] = value;\n }\n }\n}\n", "// TODO: Pick a much better name.\nexport class PromiseFreshener<T> {\n #latestAssignedIdx = 0;\n #latestResolvedIdx = 0;\n\n // TODO: reject instead? Drop?\n async queue(\n p: Promise<T>,\n ): Promise<{ fresh: false } | { fresh: true; result: T }> {\n const idx = ++this.#latestAssignedIdx;\n const result = await p;\n if (idx > this.#latestResolvedIdx) {\n this.#latestResolvedIdx = idx;\n return {\n fresh: true,\n result: result,\n };\n } else {\n return { fresh: false };\n }\n }\n}\n\n// This will silenty drop a queued Promise (i.e. not resolve it) if a\n// newer queued one already resolved first. This is useful for classes that want\n// to know the \"latest\" state of something without jumping back to an older\n// value by accident.\n// TODO: Remove this because it's too easy to misuse?\nexport class StaleDropper<T> {\n #latestAssignedIdx = 0;\n #latestResolvedIdx = 0;\n\n queue(p: Promise<T>): Promise<T> {\n // rome-ignore lint(correctness/noAsyncPromiseExecutor): This is a very rare case where we *do* want to drop a Promise sometimes.\n return new Promise(async (resolve, reject) => {\n try {\n const idx = ++this.#latestAssignedIdx;\n const result = await p;\n if (idx > this.#latestResolvedIdx) {\n this.#latestResolvedIdx = idx;\n resolve(result);\n }\n } catch (e) {\n reject(e);\n }\n });\n }\n}\n", "import { from } from \"../../../vendor/p-lazy/p-lazy\";\nimport { StaleDropper } from \"../PromiseFreshener\";\nimport type { UserVisibleErrorTracker } from \"../UserVisibleErrorTracker\";\n\ntype InputRecord = {};\n\nexport type InputProps<T extends InputRecord> = {\n [s in keyof T]: TwistyPropParent<T[s]>;\n};\n\ntype InputPromises<T extends InputRecord> = {\n [s in keyof T]: Promise<T[s]>;\n};\n\ninterface SourceEventDetail<OutputType> {\n sourceProp: TwistyPropSource<OutputType, any>;\n value: Promise<OutputType>; // TODO: remove?\n generation: number;\n}\n\ntype SourceEvent<T> = CustomEvent<SourceEventDetail<T>>;\n\ntype PromiseOrValue<T> = T | Promise<T>;\n\n// Values of T must be immutable.\nlet globalSourceGeneration = 0; // This is incremented before being used, so 1 will be the first active value.\nexport abstract class TwistyPropParent<T> {\n public abstract get(): Promise<T>;\n\n // Don't overwrite this. Overwrite `canReuseValue` instead.\n canReuse(v1: T, v2: T): boolean {\n return v1 === v2 || this.canReuseValue(v1, v2);\n }\n\n // Overwrite with a cheap semantic comparison when possible.\n // Note that this is not called if `v1 === v2` (in which case the value is automatically reused).\n canReuseValue(_v1: T, _v2: T): boolean {\n return false;\n }\n\n debugGetChildren(): TwistyPropDerived<any, any>[] {\n return Array.from(this.#children.values());\n }\n\n // Propagation\n\n #children: Set<TwistyPropDerived<any, any>> = new Set();\n protected addChild(child: TwistyPropDerived<any, any>): void {\n this.#children.add(child);\n }\n\n protected removeChild(child: TwistyPropDerived<any, any>): void {\n this.#children.delete(child);\n }\n\n protected lastSourceGeneration: number = 0;\n // Synchronously marks all descendants as stale. This doesn't actually\n // literally mark as stale, but it updates the last source generation, which\n // is used to tell if a cahced result is stale.\n protected markStale(sourceEvent: SourceEvent<any>): void {\n if (sourceEvent.detail.generation !== globalSourceGeneration) {\n // The full stale propagation is synchronous, so there should not be a new one yet.\n throw new Error(\"A TwistyProp was marked stale too late!\");\n }\n if (this.lastSourceGeneration === sourceEvent.detail.generation) {\n // Already propagated.\n return;\n }\n this.lastSourceGeneration = sourceEvent.detail.generation;\n for (const child of this.#children) {\n child.markStale(sourceEvent);\n }\n // We schedule sending out events *after* the (synchronous) propagation has happened, in\n // case one of the listeners updates a source again.\n this.#scheduleRawDispatch();\n }\n\n #rawListeners: Set<() => void> = new Set();\n /** @deprecated */\n addRawListener(listener: () => void, options?: { initial: boolean }): void {\n this.#rawListeners.add(listener);\n if (options?.initial) {\n listener(); // TODO: wrap in a try?\n }\n }\n\n /** @deprecated */\n removeRawListener(listener: () => void): void {\n this.#rawListeners.delete(listener);\n }\n\n /** @deprecated */\n #scheduleRawDispatch(): void {\n if (!this.#rawDispatchPending) {\n this.#rawDispatchPending = true;\n setTimeout(() => this.#dispatchRawListeners(), 0);\n }\n }\n\n #rawDispatchPending: boolean = false;\n #dispatchRawListeners(): void {\n if (!this.#rawDispatchPending) {\n throw new Error(\"Invalid dispatch state!\");\n }\n for (const listener of this.#rawListeners) {\n listener(); // TODO: wrap in a try?\n }\n this.#rawDispatchPending = false;\n }\n\n #freshListeners: Map<(value: T) => void, () => void> = new Map();\n // TODO: Pick a better name.\n addFreshListener(listener: (value: T) => void): void {\n const staleDropper: StaleDropper<T> = new StaleDropper<T>();\n let lastResult: T | null = null;\n const callback = async () => {\n const result = await staleDropper.queue(this.get());\n if (lastResult !== null && this.canReuse(lastResult, result)) {\n return;\n }\n lastResult = result;\n listener(result);\n };\n this.#freshListeners.set(listener, callback);\n this.addRawListener(callback, { initial: true });\n }\n\n removeFreshListener(listener: (value: T) => void): void {\n this.removeRawListener(this.#freshListeners.get(listener)!); // TODO: throw a custom error?\n this.#freshListeners.delete(listener);\n }\n}\n\nexport abstract class TwistyPropSource<\n OutputType,\n InputType = OutputType,\n> extends TwistyPropParent<OutputType> {\n #value: Promise<OutputType>;\n\n public abstract getDefaultValue(): PromiseOrValue<OutputType>;\n\n constructor(initialValue?: PromiseOrValue<InputType>) {\n super();\n this.#value = from(() => this.getDefaultValue());\n if (initialValue) {\n this.#value = this.deriveFromPromiseOrValue(initialValue, this.#value);\n }\n }\n\n set(input: PromiseOrValue<InputType>): void {\n this.#value = this.deriveFromPromiseOrValue(input, this.#value);\n\n const sourceEventDetail: SourceEventDetail<OutputType> = {\n sourceProp: this,\n value: this.#value,\n generation: ++globalSourceGeneration,\n };\n this.markStale(\n new CustomEvent<SourceEventDetail<OutputType>>(\"stale\", {\n detail: sourceEventDetail,\n }),\n );\n }\n\n async get(): Promise<OutputType> {\n return this.#value;\n }\n\n async deriveFromPromiseOrValue(\n input: PromiseOrValue<InputType>,\n oldValuePromise: Promise<OutputType>,\n ): Promise<OutputType> {\n return this.derive(await input, oldValuePromise);\n }\n\n // TODO: add an indirect layer to cache the derivation?\n protected abstract derive(\n input: InputType,\n oldValuePromise: Promise<OutputType>,\n ): PromiseOrValue<OutputType>;\n}\n\nexport abstract class SimpleTwistyPropSource<\n SimpleType,\n> extends TwistyPropSource<SimpleType> {\n derive(input: SimpleType): PromiseOrValue<SimpleType> {\n return input;\n }\n}\n\n// TODO: Can we support `null` as a valid output value without loosening type\n// safety?\nexport const NO_VALUE = Symbol(\"no value\");\nexport type NoValueType = typeof NO_VALUE;\n\nexport abstract class TwistyPropDerived<\n InputTypes extends InputRecord,\n OutputType,\n> extends TwistyPropParent<OutputType> {\n // cachedInputs:\n #parents: InputProps<InputTypes>;\n\n constructor(\n parents: InputProps<InputTypes>,\n protected userVisibleErrorTracker?: UserVisibleErrorTracker,\n ) {\n super();\n this.#parents = parents;\n for (const parent of Object.values(parents)) {\n (\n parent as TwistyPropDerived<InputProps<InputTypes>, OutputType>\n ).addChild(this);\n }\n }\n\n #cachedLastSuccessfulCalculation: {\n inputs: InputTypes;\n output: Promise<OutputType>;\n generation: number;\n } | null = null;\n\n #cachedLatestGenerationCalculation: {\n output: Promise<OutputType>;\n generation: number;\n } | null = null;\n\n public async get(): Promise<OutputType> {\n const generation = this.lastSourceGeneration;\n\n if (this.#cachedLatestGenerationCalculation?.generation === generation) {\n return this.#cachedLatestGenerationCalculation.output;\n }\n\n const latestGenerationCalculation = {\n generation,\n output: this.#cacheDerive(\n this.#getParents(),\n generation,\n this.#cachedLastSuccessfulCalculation,\n ),\n };\n this.#cachedLatestGenerationCalculation = latestGenerationCalculation;\n\n this.userVisibleErrorTracker?.reset();\n return latestGenerationCalculation.output;\n }\n\n async #getParents(): Promise<InputTypes> {\n const inputValuePromises: InputPromises<InputRecord> = {} as any; // TODO\n for (const [key, parent] of Object.entries(this.#parents)) {\n (inputValuePromises as Record<string, Promise<unknown>>)[key] = (\n parent as TwistyPropParent<unknown>\n ).get();\n }\n\n const inputs: InputTypes = {} as any; // TODO\n for (const key in this.#parents) {\n inputs[key] = (await (\n inputValuePromises as Record<string, Promise<unknown>>\n )[key]) as any;\n }\n return inputs;\n }\n\n async #cacheDerive(\n inputsPromise: PromiseOrValue<InputTypes>,\n generation: number,\n cachedLatestGenerationCalculation: {\n inputs: InputTypes;\n output: Promise<OutputType>;\n generation: number;\n } | null = null,\n ): Promise<OutputType> {\n const inputs = await inputsPromise;\n\n const cache = (output: OutputType): OutputType => {\n this.#cachedLastSuccessfulCalculation = {\n inputs,\n output: Promise.resolve(output),\n generation,\n };\n return output;\n };\n\n if (!cachedLatestGenerationCalculation) {\n return cache(await this.derive(inputs));\n }\n\n const cachedInputs = cachedLatestGenerationCalculation.inputs;\n for (const key in this.#parents) {\n const parent = this.#parents[key];\n if (!parent.canReuse(inputs[key], cachedInputs[key])) {\n return cache(await this.derive(inputs));\n }\n }\n\n return cachedLatestGenerationCalculation.output;\n }\n\n protected abstract derive(input: InputTypes): PromiseOrValue<OutputType>;\n}\n\nexport class FreshListenerManager {\n #disconnectionFunctions: (() => void)[] = [];\n\n addListener<T>(\n prop: TwistyPropParent<T>,\n listener: (value: T) => void,\n ): void {\n let disconnected = false;\n const wrappedListener = (value: T) => {\n if (disconnected) {\n // TODO\n // console.warn(\"Should be disconnected!\");\n return;\n }\n listener(value);\n };\n\n prop.addFreshListener(wrappedListener);\n\n this.#disconnectionFunctions.push(() => {\n prop.removeFreshListener(wrappedListener);\n disconnected = true;\n });\n }\n\n // TODO: Figure out the signature to let us do overloads\n /** @deprecated */\n addMultiListener3<U, V, W>(\n props: [TwistyPropParent<U>, TwistyPropParent<V>, TwistyPropParent<W>],\n listener: (values: [U, V, W]) => void,\n ): void {\n this.addMultiListener(props as any, listener as any); // TODO\n }\n addMultiListener<U, V>(\n props: [TwistyPropParent<U>, TwistyPropParent<V>],\n listener: (values: [U, V]) => void,\n ) {\n let disconnected = false;\n\n // We're going to get one initial call per prop. We'll ignore all but one.\n let initialIgnoresLeft = props.length - 1;\n const wrappedListener = async (_: any) => {\n if (initialIgnoresLeft > 0) {\n initialIgnoresLeft--;\n return;\n }\n if (disconnected) {\n // TODO\n // console.warn(\"Should be disconnected!\");\n return;\n }\n // We rely on `TwistyProp` caching to give us the full set of latest\n // values efficiently.\n const promises = (props as TwistyPropParent<any>[]).map((prop) =>\n prop.get(),\n );\n const values = await Promise.all(promises);\n listener(values as any); // TODO: fix up types\n };\n\n for (const prop of props) {\n prop.addFreshListener(wrappedListener);\n }\n\n this.#disconnectionFunctions.push(() => {\n for (const prop of props) {\n prop.removeFreshListener(wrappedListener);\n }\n disconnected = true;\n });\n }\n\n disconnect(): void {\n for (const disconnectionFunction of this.#disconnectionFunctions) {\n disconnectionFunction();\n }\n }\n}\n", "// Debounces `requestAnimationFrame()`.\nexport class RenderScheduler {\n private animFrameID: number | null = null;\n private animFrame = this.animFrameWrapper.bind(this);\n constructor(private callback: (timestamp: DOMHighResTimeStamp) => void) {}\n\n requestIsPending(): boolean {\n return !!this.animFrameID;\n }\n\n requestAnimFrame(): void {\n if (!this.animFrameID) {\n this.animFrameID = requestAnimationFrame(this.animFrame);\n }\n }\n\n cancelAnimFrame(): void {\n if (this.animFrameID) {\n cancelAnimationFrame(this.animFrameID);\n this.animFrameID = 0;\n }\n }\n\n private animFrameWrapper(timestamp: DOMHighResTimeStamp): void {\n this.animFrameID = 0;\n this.callback(timestamp);\n }\n}\n\n// An interface for classes to use to expose their scheduling.\nexport interface Schedulable {\n scheduleRender(): void;\n}\n", "import { SimpleTwistyPropSource } from \"../../TwistyProp\";\n\n// TODO: turn these maps into lists?\nexport const hintFaceletStyles = {\n floating: true, // default\n none: true,\n};\nexport type HintFaceletStyle = keyof typeof hintFaceletStyles;\nexport type HintFaceletStyleWithAuto = HintFaceletStyle | \"auto\";\n\nexport class HintFaceletProp extends SimpleTwistyPropSource<HintFaceletStyleWithAuto> {\n getDefaultValue(): HintFaceletStyleWithAuto {\n return \"auto\";\n }\n}\n", "export const TAU = Math.PI * 2;\nexport const DEGREES_PER_RADIAN = 360 / TAU;\n", "// Workarounds for `node`.\n// TODO: figure out how to remove this.\n\n// This stub does not need to be callable, just constructable to satisfy the `node` loader.\nclass HTMLElementStub {}\n\nlet HTMLElementShim: typeof HTMLElement;\nif (globalThis.HTMLElement) {\n HTMLElementShim = HTMLElement;\n} else {\n HTMLElementShim = HTMLElementStub as any;\n}\n\nexport { HTMLElementShim };\n\nclass CustomElementsStub {\n define(): void {\n // nothing\n }\n}\n\nlet customElementsShim: typeof customElements;\n\nif (globalThis.customElements) {\n customElementsShim = customElements;\n} else {\n customElementsShim = new CustomElementsStub() as any;\n}\n\nexport { customElementsShim };\n", "import {\n HTMLElementShim,\n customElementsShim,\n} from \"./node-custom-element-shims\";\n\nexport class CSSSource {\n constructor(private sourceText: string) {\n // TODO: Replace with adopted style sheets some day if we can.\n // const blob = new Blob([sourceText], {\n // type: \"text/utf8\",\n // });\n // this.url = URL.createObjectURL(blob);\n }\n\n getAsString(): string {\n return this.sourceText;\n }\n}\n\n// - Wrapped element\n// - Shadow root\n// - Content wrapper\nexport class ManagedCustomElement extends HTMLElementShim {\n public readonly shadow: ShadowRoot; // TODO: hide this\n public readonly contentWrapper: HTMLDivElement; // TODO: can we get rid of this wrapper?\n\n #cssSourceMap: Map<CSSSource, HTMLStyleElement> = new Map();\n constructor(options?: { mode: \"open\" | \"closed\" }) {\n super();\n this.shadow = this.attachShadow({ mode: options?.mode ?? \"closed\" });\n\n this.contentWrapper = document.createElement(\"div\");\n this.contentWrapper.classList.add(\"wrapper\");\n this.shadow.appendChild(this.contentWrapper);\n }\n\n // Add the source, if not already added.\n // Returns the existing if it's already on the element.\n public addCSS(cssSource: CSSSource): HTMLStyleElement {\n const existing = this.#cssSourceMap.get(cssSource);\n if (existing) {\n return existing;\n }\n\n const cssElem: HTMLStyleElement = document.createElement(\"style\");\n cssElem.textContent = cssSource.getAsString();\n\n this.#cssSourceMap.set(cssSource, cssElem);\n this.shadow.appendChild(cssElem);\n return cssElem;\n }\n\n // Remove the source, if it's currently added.\n public removeCSS(cssSource: CSSSource): void {\n const cssElem = this.#cssSourceMap.get(cssSource);\n if (!cssElem) {\n return;\n }\n this.shadow.removeChild(cssElem);\n this.#cssSourceMap.delete(cssSource);\n }\n\n public addElement<T extends Node>(element: T): T {\n return this.contentWrapper.appendChild(element);\n }\n\n public prependElement<T extends Node>(element: T): void {\n this.contentWrapper.prepend(element);\n }\n\n public removeElement<T extends Node>(element: T): T {\n return this.contentWrapper.removeChild(element);\n }\n}\n\ncustomElementsShim.define(\n \"twisty-managed-custom-element\",\n ManagedCustomElement,\n);\n", "/**\n * @author mrdoob / http://mrdoob.com/\n * ESM conversion by Lucas Garron, 2021-12-21\n */\n\nconst performance:\n | null\n | (Performance & {\n memory?: {\n usedJSHeapSize: number;\n jsHeapSizeLimit: number;\n };\n }) = globalThis.performance;\n\nexport class Stats {\n mode = 0;\n\n dom = document.createElement(\"div\");\n\n constructor() {\n this.dom.style.cssText =\n \"position:fixed;top:0;left:0;cursor:pointer;opacity:0.9;z-index:10000\";\n this.dom.addEventListener(\n \"click\",\n (event) => {\n event.preventDefault();\n this.showPanel(++this.mode % this.dom.children.length);\n },\n false,\n );\n\n this.showPanel(0);\n }\n\n addPanel(panel: StatsPanel): StatsPanel {\n this.dom.appendChild(panel.dom);\n return panel;\n }\n\n showPanel(id: number): void {\n for (let i = 0; i < this.dom.children.length; i++) {\n (this.dom.children[i] as HTMLElement).style.display =\n i === id ? \"block\" : \"none\";\n }\n\n this.mode = id;\n }\n\n beginTime = (performance || Date).now();\n prevTime = this.beginTime;\n frames = 0;\n\n fpsPanel = this.addPanel(new StatsPanel(\"FPS\", \"#0ff\", \"#002\"));\n msPanel = this.addPanel(new StatsPanel(\"MS\", \"#0f0\", \"#020\"));\n memPanel = performance?.memory\n ? this.addPanel(new StatsPanel(\"MB\", \"#f08\", \"#201\"))\n : null;\n REVISION = 16;\n\n begin() {\n this.beginTime = (performance || Date).now();\n }\n\n end() {\n this.frames++;\n\n const time = (performance || Date).now();\n\n this.msPanel.update(time - this.beginTime, 200);\n\n if (time >= this.prevTime + 1000) {\n this.fpsPanel.update((this.frames * 1000) / (time - this.prevTime), 100);\n\n this.prevTime = time;\n this.frames = 0;\n\n if (this.memPanel) {\n const memory = performance!.memory!;\n this.memPanel.update(\n memory.usedJSHeapSize / 1048576,\n memory.jsHeapSizeLimit / 1048576,\n );\n }\n }\n\n return time;\n }\n\n update() {\n this.beginTime = this.end();\n }\n}\n\nconst PR = Math.round(globalThis?.window?.devicePixelRatio ?? 1);\n\nconst WIDTH = 80 * PR;\nconst HEIGHT = 48 * PR;\nconst TEXT_X = 3 * PR;\nconst TEXT_Y = 2 * PR;\nconst GRAPH_X = 3 * PR;\nconst GRAPH_Y = 15 * PR;\nconst GRAPH_WIDTH = 74 * PR;\nconst GRAPH_HEIGHT = 30 * PR;\n\nexport class StatsPanel {\n min = Infinity;\n max = 0;\n dom = document.createElement(\"canvas\");\n context = this.dom.getContext(\"2d\")!;\n constructor(private name: string, private fg: string, private bg: string) {\n this.dom.width = WIDTH;\n this.dom.height = HEIGHT;\n this.dom.style.cssText = \"width:80px;height:48px\";\n\n this.context.font = `bold ${9 * PR}px Helvetica,Arial,sans-serif`;\n this.context.textBaseline = \"top\";\n\n this.context.fillStyle = bg;\n this.context.fillRect(0, 0, WIDTH, HEIGHT);\n\n this.context.fillStyle = fg;\n this.context.fillText(name, TEXT_X, TEXT_Y);\n this.context.fillRect(GRAPH_X, GRAPH_Y, GRAPH_WIDTH, GRAPH_HEIGHT);\n\n this.context.fillStyle = bg;\n this.context.globalAlpha = 0.9;\n this.context.fillRect(GRAPH_X, GRAPH_Y, GRAPH_WIDTH, GRAPH_HEIGHT);\n }\n\n update(value: number, maxValue: number) {\n this.min = Math.min(this.min, value);\n this.max = Math.max(this.max, value);\n\n this.context.fillStyle = this.bg;\n this.context.globalAlpha = 1;\n this.context.fillRect(0, 0, WIDTH, GRAPH_Y);\n this.context.fillStyle = this.fg;\n this.context.fillText(\n `${Math.round(value)} ${this.name} (${Math.round(this.min)}-${Math.round(\n this.max,\n )})`,\n TEXT_X,\n TEXT_Y,\n );\n\n this.context.drawImage(\n this.dom,\n GRAPH_X + PR,\n GRAPH_Y,\n GRAPH_WIDTH - PR,\n GRAPH_HEIGHT,\n GRAPH_X,\n GRAPH_Y,\n GRAPH_WIDTH - PR,\n GRAPH_HEIGHT,\n );\n\n this.context.fillRect(\n GRAPH_X + GRAPH_WIDTH - PR,\n GRAPH_Y,\n PR,\n GRAPH_HEIGHT,\n );\n\n this.context.fillStyle = this.bg;\n this.context.globalAlpha = 0.9;\n this.context.fillRect(\n GRAPH_X + GRAPH_WIDTH - PR,\n GRAPH_Y,\n PR,\n Math.round((1 - value / maxValue) * GRAPH_HEIGHT),\n );\n }\n}\n", "import { from } from \"../../vendor/p-lazy/p-lazy\";\n\n// TODO can we remove the cached proxy?\n\n// In theory we can, but we've run into situations where imports are not properly cached.\nlet cachedConstructorProxy: Promise<\n typeof import(\"./dynamic-entries/twisty-dynamic-3d\")\n> | null = null;\n\nexport async function proxy3D(): Promise<\n typeof import(\"./dynamic-entries/twisty-dynamic-3d\")\n> {\n return (cachedConstructorProxy ??= import(\n \"./dynamic-entries/twisty-dynamic-3d\",\n ));\n}\n\nexport const THREEJS: Promise<typeof import(\"three\")> = from(\n async () => (await proxy3D()).T3I,\n);\n", "let globalPixelRatioOverride: number | null = null;\nexport function setGlobalPixelRatioOverride(override: number | null): void {\n globalPixelRatioOverride = override;\n}\n\n// TODO: Handle if you move across screens?\nexport function pixelRatio(): number {\n return globalPixelRatioOverride ?? (devicePixelRatio || 1);\n}\n", "import { CSSSource } from \"../ManagedCustomElement\";\n\n// The `position` values are a hack for a bug in Safari where the canvas either\n// grows infinitely, or takes up the full `fr` of any encompassing grid (making\n// the contents of that element e.g. over 100% of its height). `contain:\n// content` is a good fix for this, but there is no indication that Safari will\n// support it soon. https://developer.mozilla.org/en-US/docs/Web/CSS/contain\n\nexport const twisty3DVantageCSS = new CSSSource(\n `\n:host {\n width: 384px;\n height: 256px;\n display: grid;\n}\n\n.wrapper {\n width: 100%;\n height: 100%;\n display: grid;\n overflow: hidden;\n place-content: center;\n contain: strict;\n}\n\n.loading {\n width: 4em;\n height: 4em;\n border-radius: 2.5em;\n border: 0.5em solid rgba(0, 0, 0, 0);\n border-top: 0.5em solid rgba(0, 0, 0, 0.7);\n border-right: 0.5em solid rgba(0, 0, 0, 0.7);\n animation: fade-in-delayed 4s, rotate 1s linear infinite;\n}\n\n@keyframes fade-in-delayed {\n 0% { opacity: 0; }\n 25% {opacity: 0; }\n 100% { opacity: 1; }\n}\n\n@keyframes rotate {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n}\n\n/* TODO: This is due to stats hack. Replace with \\`canvas\\`. */\n.wrapper > canvas {\n max-width: 100%;\n max-height: 100%;\n animation: fade-in 0.25s ease-in;\n}\n\n@keyframes fade-in {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n.wrapper.invisible {\n opacity: 0;\n}\n\n.wrapper.drag-input-enabled > canvas {\n cursor: grab;\n}\n\n.wrapper.drag-input-enabled > canvas:active {\n cursor: grabbing;\n}\n`,\n);\n", "// export class Drag() {\n\n// }\n\ninterface DragInfo {\n attachedInfo: Record<any, any>;\n hasMoved: boolean;\n lastClientX: number;\n lastClientY: number;\n lastTimeStamp: number;\n}\n\ntype PointerID = number;\n\nexport interface DragMovementInfo {\n attachedInfo: Record<any, any>;\n movementX: number;\n movementY: number;\n elapsedMs: number;\n}\n\nexport interface UpInfo {\n attachedInfo: Record<any, any>;\n}\n\nexport interface PressInfo {\n normalizedX: number;\n normalizedY: number;\n rightClick: boolean;\n keys: {\n // TODO: group these\n altKey: boolean;\n ctrlOrMetaKey: boolean;\n shiftKey: boolean;\n };\n}\n\n// Chrome can report movements as low as `0.0000152587890625` even if the cursor did not move at all. So we need a treshold insteadl.\nconst MOVEMENT_EPSILON = 0.1; // px\n\nexport class DragTracker extends EventTarget {\n #dragInfoMap: Map<PointerID, DragInfo> = new Map();\n\n constructor(public readonly target: HTMLElement) {\n super();\n }\n\n // Idempotent\n start() {\n this.addTargetListener(\"pointerdown\", this.onPointerDown.bind(this));\n // Prevent right-click on desktop (only tested on macOS Chrome/Safari/Firefox) so we can detect right-click moves.\n // TODO: Can we do this selectively, e.g. only on the puzzle? That way we could allow right-click to download the canvas. Unfortunately, it would probably require a sync calculation.\n this.addTargetListener(\"contextmenu\", (e) => {\n e.preventDefault();\n });\n // Prevent touch scrolling (preventing default on `pointermove` doesn't work).\n this.addTargetListener(\"touchmove\", (e) => e.preventDefault());\n // Prevent zooming on double-tap (iOS).\n // This is because `dblclick` works to zoom in, but does *not* work to zoom out. So the user can get stuck zoomed into the player without a way to zoom out.\n this.addTargetListener(\"dblclick\", (e) => e.preventDefault());\n }\n\n // Idempotent\n stop(): void {\n for (const [eventType, listener] of this.#targetListeners.entries()) {\n this.target.removeEventListener(eventType, listener);\n }\n this.#targetListeners.clear();\n this.#lazyListenersRegistered = false;\n }\n\n #targetListeners = new Map<string, (e: MouseEvent) => any>();\n addTargetListener(eventType: string, listener: (e: MouseEvent) => any) {\n if (!this.#targetListeners.has(eventType)) {\n this.target.addEventListener(eventType, listener);\n this.#targetListeners.set(eventType, listener);\n }\n }\n\n // This allows us to avoid getting a callback every time the pointer moves over the canvas, until we have a down event.\n // TODO: Ideally we'd also support unregistering when we're certain there are no more active touches. But this means we need to properly handle every way a pointer \"click\" can end, which is tricky across environments (due to e.g. mouse vs. touch vs. stylues, canvas/viewport/window/scroll boundaries, right-click and other ways of losing focus, etc.), so we conservatively leave the listeners on.\n #lazyListenersRegistered: boolean = false;\n #registerLazyListeners(): void {\n if (this.#lazyListenersRegistered) {\n return;\n }\n this.addTargetListener(\"pointermove\", this.onPointerMove.bind(this)); // TODO: only register this after pointer down.\n this.addTargetListener(\"pointerup\", this.onPointerUp.bind(this));\n this.#lazyListenersRegistered = true;\n }\n\n #clear(e: PointerEvent): void {\n this.#dragInfoMap.delete(e.pointerId);\n }\n\n // `null`: means: ignore this result (no movement, or not\n #trackDrag(e: PointerEvent): {\n movementInfo: DragMovementInfo | null;\n hasMoved: boolean;\n } {\n // TODO: Find a way to detect if this is an active press, in a way that works cross-platform.\n // if (e.buttons === 0) {\n // return { movementInfo: null, hasMoved: false };\n // }\n const existing = this.#dragInfoMap.get(e.pointerId);\n if (!existing) {\n return { movementInfo: null, hasMoved: false };\n }\n // We would try to use `e.movementX`/`e.movementY`, except Safari:\n // - Does not have those values on i[Pad]OS.\n // - Will always report `0` for these values on macOS.\n // https://bugs.webkit.org/show_bug.cgi?id=220194\n //\n // The following are all insufficiently powerful for detecting the Safari `0` bug:\n // - `\"movementX\" in e`\n // - `e.movementX !== \"undefined\"`\n // - `e.hasOwnProperty(\"movementX\")`\n\n let movementInfo: DragMovementInfo;\n if ((e.movementX ?? 0) !== 0 || (e.movementY ?? 0) !== 0) {\n // We optimistically try to catch sub-pixel movements in Chrome.\n movementInfo = {\n attachedInfo: existing.attachedInfo,\n movementX: e.movementX,\n movementY: e.movementY,\n elapsedMs: e.timeStamp - existing.lastTimeStamp,\n };\n } else {\n movementInfo = {\n attachedInfo: existing.attachedInfo,\n movementX: e.clientX - existing.lastClientX,\n movementY: e.clientY - existing.lastClientY,\n elapsedMs: e.timeStamp - existing.lastTimeStamp,\n };\n }\n existing.lastClientX = e.clientX;\n existing.lastClientY = e.clientY;\n existing.lastTimeStamp = e.timeStamp;\n if (\n Math.abs(movementInfo.movementX) < MOVEMENT_EPSILON &&\n Math.abs(movementInfo.movementY) < MOVEMENT_EPSILON\n ) {\n return { movementInfo: null, hasMoved: existing.hasMoved };\n } else {\n existing.hasMoved = true;\n return { movementInfo, hasMoved: existing.hasMoved };\n }\n }\n\n private onPointerDown(e: PointerEvent) {\n this.#registerLazyListeners();\n const newDragInfo: DragInfo = {\n attachedInfo: {},\n hasMoved: false,\n lastClientX: e.clientX,\n lastClientY: e.clientY,\n lastTimeStamp: e.timeStamp,\n };\n this.#dragInfoMap.set(e.pointerId, newDragInfo);\n this.target.setPointerCapture(e.pointerId);\n }\n\n private onPointerMove(e: PointerEvent) {\n const movementInfo = this.#trackDrag(e).movementInfo;\n if (movementInfo) {\n e.preventDefault();\n this.dispatchEvent(\n new CustomEvent(\"move\", {\n detail: movementInfo,\n }),\n );\n }\n }\n\n private onPointerUp(e: PointerEvent) {\n const trackDragResult = this.#trackDrag(e);\n const existing = this.#dragInfoMap.get(e.pointerId)!; // TODO\n this.#clear(e);\n this.target.releasePointerCapture(e.pointerId); // TODO: unnecessary?\n let event: CustomEvent;\n if (trackDragResult.hasMoved) {\n // TODO: send proper movement/momentum since last move event.\n event = new CustomEvent<UpInfo>(\"up\", {\n detail: { attachedInfo: existing.attachedInfo },\n });\n } else {\n const { altKey, ctrlKey, metaKey, shiftKey } = e;\n event = new CustomEvent<PressInfo>(\"press\", {\n detail: {\n normalizedX: (e.offsetX / this.target.offsetWidth) * 2 - 1,\n normalizedY: 1 - (e.offsetY / this.target.offsetHeight) * 2,\n rightClick: !!(e.button & 2),\n keys: {\n altKey,\n ctrlOrMetaKey: ctrlKey || metaKey,\n shiftKey,\n },\n },\n });\n }\n this.dispatchEvent(event);\n }\n}\n", "// TODO: https://stackoverflow.com/a/40443642\n\n// let shareAllNewRenderers: boolean = false;\n\n// // WARNING: The current shared renderer implementation is not every efficient.\n// // Avoid using for players that are likely to have dimensions approaching 1 megapixel or higher.\n// // TODO: use a dedicated renderer while fullscreen?\n// export function experimentalSetShareAllNewRenderers(share: boolean): void {\n// shareAllNewRenderers = share;\n// }\n\n// const sharedRenderer: WebGLRenderer | null = null;\n\nimport { THREEJS } from \"../../heavy-code-imports/3d\";\nimport type { Camera, Scene, WebGLRenderer } from \"three\";\nimport { pixelRatio } from \"../canvas\";\n\nconst renderers: Promise<WebGLRenderer>[] = [];\n\n// Render result is guaranteed to be available synchronously at resolution time.\nexport async function rawRenderPooled(\n width: number,\n height: number,\n scene: Scene,\n camera: Camera,\n): Promise<HTMLCanvasElement> {\n // At most one in the pool for now.\n if (renderers.length === 0) {\n renderers.push(newRenderer());\n }\n const renderer = await renderers[0];\n // TODO: scissoring\n renderer.setSize(width, height); // TODO: is it faster if we cache values and only call this when necessary?\n renderer.render(scene, camera);\n\n return renderer.domElement;\n}\n\n// let haveSet = false;\nexport async function renderPooled(\n width: number,\n height: number,\n canvas: HTMLCanvasElement,\n scene: Scene,\n camera: Camera,\n): Promise<void> {\n if (width === 0 || height === 0) {\n return;\n }\n // At most one in the pool for now.\n if (renderers.length === 0) {\n renderers.push(newRenderer());\n }\n\n const rendererCanvas = await rawRenderPooled(width, height, scene, camera);\n\n // TODO: Should we cache this? Seems to take about 0.0001ms to get.\n const context = canvas.getContext(\"2d\")!;\n context.clearRect(0, 0, canvas.width, canvas.height);\n context.drawImage(rendererCanvas, 0, 0);\n}\n\nexport async function newRenderer(): Promise<WebGLRenderer> {\n const rendererConstructor = (await THREEJS).WebGLRenderer;\n const renderer = new rendererConstructor({\n antialias: true,\n alpha: true,\n });\n renderer.setPixelRatio(pixelRatio());\n return renderer;\n}\n", "import type { Vector3 } from \"three\";\nimport { RenderScheduler } from \"../../controllers/RenderScheduler\";\nimport { THREEJS } from \"../../heavy-code-imports/3d\";\nimport type { OrbitCoordinates } from \"../../model/props/viewer/OrbitCoordinatesRequestProp\";\nimport type { TwistyPlayerModel } from \"../../model/TwistyPlayerModel\";\nimport type { DragMovementInfo, DragTracker } from \"./DragTracker\";\nimport { DEGREES_PER_RADIAN } from \"./TAU\";\n\nconst INERTIA_DEFAULT: boolean = true;\n\nconst INERTIA_DURATION_MS = 500;\n// If the first inertial render is this long after the last move, we assume the\n// user has halted the cursor and we consider inertia to have \"timed out\". We\n// never begin animating the inertia.\nconst INERTIA_TIMEOUT_MS = 50;\n\nconst VERTICAL_MOVEMENT_BASE_SCALE = 0.75;\n\n// progress is from 0 to 1.\nfunction momentumScale(progress: number) {\n // This is the exponential curve flipped so that\n // - The slope at progress = 0 is 1 (this corresponds to \"x = 1\" on the normal\n // curve).\n // - The scale exponentially \"decays\" until progress = 1.\n // This means the scale at the end will be about 0.418\n return (Math.exp(1 - progress) - (1 - progress)) / (1 - Math.E) + 1;\n}\n\nclass Inertia {\n private scheduler = new RenderScheduler(this.render.bind(this));\n private lastTimestamp: number;\n constructor(\n private startTimestamp: number,\n private momentumX: number,\n private momentumY: number,\n private callback: (movementX: number, movementY: number) => void,\n ) {\n this.scheduler.requestAnimFrame();\n this.lastTimestamp = startTimestamp;\n }\n\n private render(now: DOMHighResTimeStamp) {\n const progressBefore =\n (this.lastTimestamp - this.startTimestamp) / INERTIA_DURATION_MS;\n const progressAfter = Math.min(\n 1,\n (now - this.startTimestamp) / INERTIA_DURATION_MS,\n );\n\n if (\n progressBefore === 0 &&\n progressAfter > INERTIA_TIMEOUT_MS / INERTIA_DURATION_MS\n ) {\n // The user has already paused for a while. Don't start any inertia.\n return;\n }\n\n const delta = momentumScale(progressAfter) - momentumScale(progressBefore);\n\n // TODO: For now, we only carry horizontal momentum. If this should stay, we\n // can remove the plumbing for the Y dimension.\n this.callback(this.momentumX * delta * 1000, this.momentumY * delta * 1000);\n\n if (progressAfter < 1) {\n this.scheduler.requestAnimFrame();\n }\n this.lastTimestamp = now;\n }\n}\n\nexport async function positionToOrbitCoordinates(\n position: Vector3,\n): Promise<OrbitCoordinates> {\n const spherical = new (await THREEJS).Spherical();\n spherical.setFromVector3(position);\n return {\n latitude: 90 - spherical.phi * DEGREES_PER_RADIAN,\n longitude: spherical.theta * DEGREES_PER_RADIAN,\n distance: spherical.radius,\n };\n}\n\ninterface TwistyOrbitControlsDragAttachedInfo {\n lastTemperedX: number;\n lastTemperedY: number;\n timestamp: number;\n}\n\n// TODO: change mouse cursor while moving.\nexport class TwistyOrbitControls {\n /** @deprecated */\n experimentalInertia: boolean = INERTIA_DEFAULT;\n private onMovementBound = this.onMovement.bind(this);\n public experimentalHasBeenMoved: boolean = false;\n constructor(\n private model: TwistyPlayerModel,\n private mirror: boolean,\n private canvas: HTMLCanvasElement,\n private dragTracker: DragTracker,\n ) {\n this.dragTracker.addEventListener(\"move\", this.onMove.bind(this));\n this.dragTracker.addEventListener(\"up\", this.onUp.bind(this));\n }\n\n // f is the fraction of the canvas traversed per ms.\n temperMovement(f: number): number {\n // This is scaled to be linear for small values, but to reduce large values\n // by a significant factor.\n return (Math.sign(f) * Math.log(Math.abs(f * 10) + 1)) / 6;\n }\n\n onMove(e: CustomEvent<DragMovementInfo>): void {\n e.detail.attachedInfo ??= {};\n\n const { temperedX, temperedY } = this.onMovement(\n e.detail.movementX,\n e.detail.movementY,\n );\n const attachedInfo = e.detail\n .attachedInfo as TwistyOrbitControlsDragAttachedInfo;\n attachedInfo.lastTemperedX = temperedX * 10;\n attachedInfo.lastTemperedY = temperedY * 10;\n attachedInfo.timestamp = e.timeStamp; // TODO\n }\n\n onMovement(\n movementX: number,\n movementY: number,\n ): {\n temperedX: number;\n temperedY: number;\n } {\n const scale = this.mirror ? -1 : 1;\n\n // TODO: refactor\n const minDim = Math.min(this.canvas.offsetWidth, this.canvas.offsetHeight);\n\n const temperedX = this.temperMovement(movementX / minDim);\n const temperedY = this.temperMovement(\n (movementY / minDim) * VERTICAL_MOVEMENT_BASE_SCALE,\n );\n this.model.twistySceneModel.orbitCoordinatesRequest.set(\n (async () => {\n const prevCoords =\n await this.model.twistySceneModel.orbitCoordinates.get();\n\n const newCoords = {\n latitude:\n prevCoords.latitude + 2 * temperedY * DEGREES_PER_RADIAN * scale,\n longitude: prevCoords.longitude - 2 * temperedX * DEGREES_PER_RADIAN,\n };\n return newCoords;\n })(),\n );\n return { temperedX, temperedY };\n }\n\n onUp(e: CustomEvent<DragMovementInfo>): void {\n e.preventDefault();\n if (\n \"lastTemperedX\" in e.detail.attachedInfo &&\n \"lastTemperedY\" in e.detail.attachedInfo &&\n \"timestamp\" in e.detail.attachedInfo &&\n e.timeStamp - e.detail.attachedInfo.timestamp < 60 // TODO\n ) {\n new Inertia(\n e.timeStamp, // TODO\n (e.detail.attachedInfo as TwistyOrbitControlsDragAttachedInfo)\n .lastTemperedX,\n (e.detail.attachedInfo as TwistyOrbitControlsDragAttachedInfo)\n .lastTemperedY,\n this.onMovementBound,\n ); // TODO: cancel inertia\n }\n }\n}\n", "import type { PerspectiveCamera, WebGLRenderer } from \"three\";\nimport { Stats } from \"../../../vendor/three/examples/jsm/libs/stats.modified.module\";\nimport { THREEJS } from \"../../heavy-code-imports/3d\";\nimport { StaleDropper } from \"../../model/PromiseFreshener\";\nimport type { TwistyPropParent } from \"../../model/props/TwistyProp\";\nimport type { OrbitCoordinates } from \"../../model/props/viewer/OrbitCoordinatesRequestProp\";\nimport type { TwistyPlayerModel } from \"../../model/TwistyPlayerModel\";\nimport { RenderScheduler } from \"../../controllers/RenderScheduler\";\nimport { ManagedCustomElement } from \"../ManagedCustomElement\";\nimport { customElementsShim } from \"../node-custom-element-shims\";\nimport { pixelRatio } from \"../canvas\";\nimport { twisty3DVantageCSS } from \"./Twisty3DVantage.css\";\nimport { DragTracker, PressInfo } from \"./DragTracker\";\nimport { newRenderer, renderPooled } from \"./RendererPool\";\nimport { DEGREES_PER_RADIAN } from \"./TAU\";\nimport type { Twisty3DSceneWrapper } from \"./Twisty3DSceneWrapper\";\nimport { TwistyOrbitControls } from \"./TwistyOrbitControls\";\nimport type { DragInputMode } from \"../../model/props/puzzle/state/DragInputProp\";\nimport { twistyDebugGlobals } from \"../../debug\";\n\nexport async function setCameraFromOrbitCoordinates(\n camera: PerspectiveCamera,\n orbitCoordinates: OrbitCoordinates,\n backView: boolean = false,\n): Promise<void> {\n const spherical = new (await THREEJS).Spherical(\n orbitCoordinates.distance,\n (90 - (backView ? -1 : 1) * orbitCoordinates.latitude) / DEGREES_PER_RADIAN,\n ((backView ? 180 : 0) + orbitCoordinates.longitude) / DEGREES_PER_RADIAN,\n );\n spherical.makeSafe();\n camera.position.setFromSpherical(spherical);\n camera.lookAt(0, 0, 0);\n}\n\nlet dedicatedRenderersSoFar = 0;\nconst DEFAULT_MAX_DEDICATED_RENDERERS = 2; // This allows for a front view and a back view (or two separate front views).\nlet sharingRenderers = false;\nfunction shareRenderer(): boolean {\n if (twistyDebugGlobals.shareAllNewRenderers !== \"auto\") {\n if (!twistyDebugGlobals.shareAllNewRenderers) {\n dedicatedRenderersSoFar++;\n }\n return twistyDebugGlobals.shareAllNewRenderers !== \"never\";\n }\n if (dedicatedRenderersSoFar < DEFAULT_MAX_DEDICATED_RENDERERS) {\n dedicatedRenderersSoFar++;\n return false;\n } else {\n sharingRenderers = true;\n return true;\n }\n}\n\nexport function haveStartedSharingRenderers(): boolean {\n return sharingRenderers;\n}\n\nexport class Twisty3DVantage extends ManagedCustomElement {\n scene: Twisty3DSceneWrapper | null = null;\n\n stats: Stats | null = null;\n\n private rendererIsShared: boolean = shareRenderer();\n\n loadingElement: HTMLDivElement | null = null;\n constructor(\n private model?: TwistyPlayerModel,\n scene?: Twisty3DSceneWrapper,\n private options?: { backView?: boolean },\n ) {\n super();\n this.scene = scene ?? null;\n\n this.loadingElement = this.addElement(document.createElement(\"div\"));\n this.loadingElement.classList.add(\"loading\");\n\n if (twistyDebugGlobals.showRenderStats) {\n this.stats = new Stats();\n this.stats.dom.style.position = \"absolute\";\n this.contentWrapper.appendChild(this.stats.dom);\n }\n }\n\n async connectedCallback(): Promise<void> {\n this.addCSS(twisty3DVantageCSS);\n this.addElement((await this.canvasInfo()).canvas);\n\n this.#onResize();\n const observer = new ResizeObserver(this.#onResize.bind(this));\n observer.observe(this.contentWrapper);\n this.orbitControls(); // Instantiate orbit controls\n this.#setupBasicPresses();\n\n this.scheduleRender();\n }\n\n async #setupBasicPresses(): Promise<void> {\n const dragTracker = await this.#dragTracker();\n dragTracker.addEventListener(\"press\", async (e: CustomEvent<PressInfo>) => {\n const movePressInput =\n await this.model!.twistySceneModel.movePressInput.get();\n if (movePressInput !== \"basic\") {\n return;\n }\n this.dispatchEvent(\n new CustomEvent(\"press\", {\n detail: {\n pressInfo: e.detail,\n cameraPromise: this.camera(),\n },\n }),\n );\n });\n }\n\n #onResizeStaleDropper = new StaleDropper<PerspectiveCamera>();\n\n async clearCanvas(): Promise<void> {\n if (this.rendererIsShared) {\n const canvasInfo = await this.canvasInfo();\n canvasInfo.context.clearRect(\n 0,\n 0,\n canvasInfo.canvas.width,\n canvasInfo.canvas.height,\n );\n } else {\n const renderer = await this.renderer();\n const context = renderer.getContext();\n context.clear(context.COLOR_BUFFER_BIT);\n }\n }\n\n // TODO: Why doesn't this work for the top-right back view height?\n #width: number = 0;\n #height: number = 0;\n async #onResize(): Promise<void> {\n const camera = await this.#onResizeStaleDropper.queue(this.camera());\n\n const w = this.contentWrapper.clientWidth;\n const h = this.contentWrapper.clientHeight;\n this.#width = w;\n this.#height = h;\n const off = 0;\n let yoff = 0;\n let excess = 0;\n if (h > w) {\n excess = h - w;\n yoff = -Math.floor(0.5 * excess);\n }\n camera.aspect = w / h;\n camera.setViewOffset(w, h - excess, off, yoff, w, h);\n camera.updateProjectionMatrix(); // TODO\n\n this.clearCanvas();\n if (this.rendererIsShared) {\n const canvasInfo = await this.canvasInfo();\n\n canvasInfo.canvas.width = w * pixelRatio();\n canvasInfo.canvas.height = h * pixelRatio();\n canvasInfo.canvas.style.width = w.toString();\n canvasInfo.canvas.style.height = h.toString();\n } else {\n const renderer = await this.renderer();\n renderer.setSize(w, h, true);\n }\n\n this.scheduleRender();\n }\n\n #cachedRenderer: Promise<WebGLRenderer> | null = null;\n async renderer(): Promise<WebGLRenderer> {\n if (this.rendererIsShared) {\n throw new Error(\"renderer expected to be shared.\");\n }\n return (this.#cachedRenderer ??= newRenderer());\n }\n\n #cachedCanvas: Promise<{\n canvas: HTMLCanvasElement;\n context: CanvasRenderingContext2D;\n }> | null = null;\n async canvasInfo(): Promise<{\n canvas: HTMLCanvasElement;\n context: CanvasRenderingContext2D;\n }> {\n return (this.#cachedCanvas ??= (async () => {\n let canvas: HTMLCanvasElement;\n if (this.rendererIsShared) {\n canvas = this.addElement(document.createElement(\"canvas\"));\n } else {\n const renderer = await this.renderer();\n canvas = this.addElement(renderer.domElement);\n }\n this.loadingElement?.remove();\n const context = canvas.getContext(\"2d\")!;\n return { canvas, context };\n })());\n }\n\n #cachedDragTracker: Promise<DragTracker> | null = null;\n async #dragTracker(): Promise<DragTracker> {\n return (this.#cachedDragTracker ??= (async () => {\n const dragTracker = new DragTracker((await this.canvasInfo()).canvas);\n this.model?.twistySceneModel.dragInput.addFreshListener(\n (dragInputMode: DragInputMode) => {\n let dragInputEnabled = false;\n switch (dragInputMode) {\n case \"auto\": {\n dragTracker.start();\n dragInputEnabled = true;\n break;\n }\n case \"none\": {\n dragTracker.stop();\n break;\n }\n }\n this.contentWrapper.classList.toggle(\n \"drag-input-enabled\",\n dragInputEnabled,\n );\n },\n );\n return dragTracker;\n })());\n }\n\n #cachedCamera: Promise<PerspectiveCamera> | null = null;\n async camera(): Promise<PerspectiveCamera> {\n return (this.#cachedCamera ??= (async () => {\n const camera = new (await THREEJS).PerspectiveCamera(\n 20,\n 1, // We rely on the resize logic to handle this.\n 0.1,\n 20,\n );\n camera.position.copy(\n new (await THREEJS).Vector3(2, 4, 4).multiplyScalar(\n this.options?.backView ? -1 : 1,\n ),\n );\n camera.lookAt(0, 0, 0);\n // TODO: `TwistyOrbitControls` breaks isolateion\n return camera;\n })());\n }\n\n #cachedOrbitControls: Promise<TwistyOrbitControls> | null = null;\n async orbitControls(): Promise<TwistyOrbitControls> {\n return (this.#cachedOrbitControls ??= (async () => {\n const orbitControls = new TwistyOrbitControls(\n this.model!,\n !!this.options?.backView,\n (await this.canvasInfo()).canvas,\n await this.#dragTracker(),\n );\n\n if (this.model) {\n this.addListener(\n this.model.twistySceneModel.orbitCoordinates,\n async (orbitCoordinates: OrbitCoordinates) => {\n const camera = await this.camera();\n setCameraFromOrbitCoordinates(\n camera,\n orbitCoordinates,\n this.options?.backView,\n );\n // TODO: Wrap in StaleDropper?\n\n this.scheduleRender();\n },\n );\n }\n\n return orbitControls;\n })());\n }\n\n addListener<T>(\n prop: TwistyPropParent<T>,\n listener: (value: T) => void,\n ): void {\n prop.addFreshListener(listener);\n this.#disconnectionFunctions.push(() => {\n prop.removeFreshListener(listener);\n // disconnected = true; // TODO\n });\n }\n\n #disconnectionFunctions: (() => void)[] = [];\n disconnect(): void {\n for (const fn of this.#disconnectionFunctions) {\n fn();\n }\n this.#disconnectionFunctions = []; // TODO: Encapsulate this.\n }\n\n #experimentalNextRenderFinishedCallback: (() => void) | null = null;\n experimentalNextRenderFinishedCallback(callback: () => void): void {\n this.#experimentalNextRenderFinishedCallback = callback;\n }\n\n async render(): Promise<void> {\n if (!this.scene) {\n throw new Error(\"Attempted to render without a scene\");\n }\n\n this.stats?.begin();\n\n const [scene, camera, canvas] = await Promise.all([\n this.scene.scene(),\n this.camera(),\n this.canvasInfo(),\n ]);\n if (this.rendererIsShared) {\n renderPooled(this.#width, this.#height, canvas.canvas, scene, camera);\n } else {\n (await this.renderer()).render(scene, camera);\n }\n\n this.stats?.end();\n this.#experimentalNextRenderFinishedCallback?.();\n this.#experimentalNextRenderFinishedCallback = null;\n }\n\n #scheduler = new RenderScheduler(this.render.bind(this));\n scheduleRender(): void {\n // console.log(\"scheduling\", this);\n this.#scheduler.requestAnimFrame();\n }\n}\n\ncustomElementsShim.define(\"twisty-3d-vantage\", Twisty3DVantage);\n"],
|
|
5
|
-
"mappings": ";;;;;AAAO,IAAM,qBAST;AAAA,EACF,sBAAsB;AAAA,EACtB,iBAAiB;AACnB;AAEO,SAAS,eACd,SACM;AACN,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,OAAO,GAAG;AAClD,QAAI,OAAO,oBAAoB;AAC7B,MAAC,mBAA2B,OAAO;AAAA,IACrC;AAAA,EACF;AACF;;;ACMO,IAAM,eAAN,MAAsB;AAAA,EAC3B,qBAAqB;AAAA,EACrB,qBAAqB;AAAA,EAErB,MAAM,GAA2B;AAE/B,WAAO,IAAI,QAAQ,OAAO,SAAS,WAAW;AAC5C,UAAI;AACF,cAAM,MAAM,EAAE,KAAK;AACnB,cAAM,SAAS,MAAM;AACrB,YAAI,MAAM,KAAK,oBAAoB;AACjC,eAAK,qBAAqB;AAC1B,kBAAQ,MAAM;AAAA,QAChB;AAAA,MACF,SAAS,GAAP;AACA,eAAO,CAAC;AAAA,MACV;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;ACtBA,IAAI,yBAAyB;AACtB,IAAe,mBAAf,MAAmC;AAAA,EAAnC;AAoBL,qBAA8C,oBAAI,IAAI;AAStD,SAAU,uBAA+B;AAsBzC,yBAAiC,oBAAI,IAAI;AAsBzC,+BAA+B;AAW/B,2BAAuD,oBAAI,IAAI;AAAA;AAAA,EAhF/D,SAAS,IAAO,IAAgB;AAC9B,WAAO,OAAO,MAAM,KAAK,cAAc,IAAI,EAAE;AAAA,EAC/C;AAAA,EAIA,cAAc,KAAQ,KAAiB;AACrC,WAAO;AAAA,EACT;AAAA,EAEA,mBAAkD;AAChD,WAAO,MAAM,KAAK,KAAK,UAAU,OAAO,CAAC;AAAA,EAC3C;AAAA,EAIA;AAAA,EACU,SAAS,OAA0C;AAC3D,SAAK,UAAU,IAAI,KAAK;AAAA,EAC1B;AAAA,EAEU,YAAY,OAA0C;AAC9D,SAAK,UAAU,OAAO,KAAK;AAAA,EAC7B;AAAA,EAMU,UAAU,aAAqC;AACvD,QAAI,YAAY,OAAO,eAAe,wBAAwB;AAE5D,YAAM,IAAI,MAAM,yCAAyC;AAAA,IAC3D;AACA,QAAI,KAAK,yBAAyB,YAAY,OAAO,YAAY;AAE/D;AAAA,IACF;AACA,SAAK,uBAAuB,YAAY,OAAO;AAC/C,eAAW,SAAS,KAAK,WAAW;AAClC,YAAM,UAAU,WAAW;AAAA,IAC7B;AAGA,SAAK,qBAAqB;AAAA,EAC5B;AAAA,EAEA;AAAA,EAEA,eAAe,UAAsB,SAAsC;AACzE,SAAK,cAAc,IAAI,QAAQ;AAC/B,QAAI,SAAS,SAAS;AACpB,eAAS;AAAA,IACX;AAAA,EACF;AAAA,EAGA,kBAAkB,UAA4B;AAC5C,SAAK,cAAc,OAAO,QAAQ;AAAA,EACpC;AAAA,EAGA,uBAA6B;AAC3B,QAAI,CAAC,KAAK,qBAAqB;AAC7B,WAAK,sBAAsB;AAC3B,iBAAW,MAAM,KAAK,sBAAsB,GAAG,CAAC;AAAA,IAClD;AAAA,EACF;AAAA,EAEA;AAAA,EACA,wBAA8B;AAC5B,QAAI,CAAC,KAAK,qBAAqB;AAC7B,YAAM,IAAI,MAAM,yBAAyB;AAAA,IAC3C;AACA,eAAW,YAAY,KAAK,eAAe;AACzC,eAAS;AAAA,IACX;AACA,SAAK,sBAAsB;AAAA,EAC7B;AAAA,EAEA;AAAA,EAEA,iBAAiB,UAAoC;AACnD,UAAM,eAAgC,IAAI,aAAgB;AAC1D,QAAI,aAAuB;AAC3B,UAAM,WAAW,YAAY;AAC3B,YAAM,SAAS,MAAM,aAAa,MAAM,KAAK,IAAI,CAAC;AAClD,UAAI,eAAe,QAAQ,KAAK,SAAS,YAAY,MAAM,GAAG;AAC5D;AAAA,MACF;AACA,mBAAa;AACb,eAAS,MAAM;AAAA,IACjB;AACA,SAAK,gBAAgB,IAAI,UAAU,QAAQ;AAC3C,SAAK,eAAe,UAAU,EAAE,SAAS,KAAK,CAAC;AAAA,EACjD;AAAA,EAEA,oBAAoB,UAAoC;AACtD,SAAK,kBAAkB,KAAK,gBAAgB,IAAI,QAAQ,CAAE;AAC1D,SAAK,gBAAgB,OAAO,QAAQ;AAAA,EACtC;AACF;AAEO,IAAe,mBAAf,cAGG,iBAA6B;AAAA,EACrC;AAAA,EAIA,YAAY,cAA0C;AACpD,UAAM;AACN,SAAK,SAAS,KAAK,MAAM,KAAK,gBAAgB,CAAC;AAC/C,QAAI,cAAc;AAChB,WAAK,SAAS,KAAK,yBAAyB,cAAc,KAAK,MAAM;AAAA,IACvE;AAAA,EACF;AAAA,EAEA,IAAI,OAAwC;AAC1C,SAAK,SAAS,KAAK,yBAAyB,OAAO,KAAK,MAAM;AAE9D,UAAM,oBAAmD;AAAA,MACvD,YAAY;AAAA,MACZ,OAAO,KAAK;AAAA,MACZ,YAAY,EAAE;AAAA,IAChB;AACA,SAAK;AAAA,MACH,IAAI,YAA2C,SAAS;AAAA,QACtD,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,MAA2B;AAC/B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,yBACJ,OACA,iBACqB;AACrB,WAAO,KAAK,OAAO,MAAM,OAAO,eAAe;AAAA,EACjD;AAOF;AAEO,IAAe,yBAAf,cAEG,iBAA6B;AAAA,EACrC,OAAO,OAA+C;AACpD,WAAO;AAAA,EACT;AACF;AAIO,IAAM,WAAW,OAAO,UAAU;AAGlC,IAAe,oBAAf,cAGG,iBAA6B;AAAA,EAIrC,YACE,SACU,yBACV;AACA,UAAM;AAFI;AAGV,SAAK,WAAW;AAChB,eAAW,UAAU,OAAO,OAAO,OAAO,GAAG;AAC3C,MACE,OACA,SAAS,IAAI;AAAA,IACjB;AAAA,EACF;AAAA,EAbA;AAAA,EAeA,mCAIW;AAAA,EAEX,qCAGW;AAAA,EAEX,MAAa,MAA2B;AACtC,UAAM,aAAa,KAAK;AAExB,QAAI,KAAK,oCAAoC,eAAe,YAAY;AACtE,aAAO,KAAK,mCAAmC;AAAA,IACjD;AAEA,UAAM,8BAA8B;AAAA,MAClC;AAAA,MACA,QAAQ,KAAK;AAAA,QACX,KAAK,YAAY;AAAA,QACjB;AAAA,QACA,KAAK;AAAA,MACP;AAAA,IACF;AACA,SAAK,qCAAqC;AAE1C,SAAK,yBAAyB,MAAM;AACpC,WAAO,4BAA4B;AAAA,EACrC;AAAA,EAEA,MAAM,cAAmC;AACvC,UAAM,qBAAiD,CAAC;AACxD,eAAW,CAAC,KAAK,MAAM,KAAK,OAAO,QAAQ,KAAK,QAAQ,GAAG;AACzD,MAAC,mBAAwD,OACvD,OACA,IAAI;AAAA,IACR;AAEA,UAAM,SAAqB,CAAC;AAC5B,eAAW,OAAO,KAAK,UAAU;AAC/B,aAAO,OAAQ,MACb,mBACA;AAAA,IACJ;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,aACJ,eACA,YACA,oCAIW,MACU;AACrB,UAAM,SAAS,MAAM;AAErB,UAAM,QAAQ,CAAC,WAAmC;AAChD,WAAK,mCAAmC;AAAA,QACtC;AAAA,QACA,QAAQ,QAAQ,QAAQ,MAAM;AAAA,QAC9B;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAEA,QAAI,CAAC,mCAAmC;AACtC,aAAO,MAAM,MAAM,KAAK,OAAO,MAAM,CAAC;AAAA,IACxC;AAEA,UAAM,eAAe,kCAAkC;AACvD,eAAW,OAAO,KAAK,UAAU;AAC/B,YAAM,SAAS,KAAK,SAAS;AAC7B,UAAI,CAAC,OAAO,SAAS,OAAO,MAAM,aAAa,IAAI,GAAG;AACpD,eAAO,MAAM,MAAM,KAAK,OAAO,MAAM,CAAC;AAAA,MACxC;AAAA,IACF;AAEA,WAAO,kCAAkC;AAAA,EAC3C;AAGF;AAEO,IAAM,uBAAN,MAA2B;AAAA,EAChC,0BAA0C,CAAC;AAAA,EAE3C,YACE,MACA,UACM;AACN,QAAI,eAAe;AACnB,UAAM,kBAAkB,CAAC,UAAa;AACpC,UAAI,cAAc;AAGhB;AAAA,MACF;AACA,eAAS,KAAK;AAAA,IAChB;AAEA,SAAK,iBAAiB,eAAe;AAErC,SAAK,wBAAwB,KAAK,MAAM;AACtC,WAAK,oBAAoB,eAAe;AACxC,qBAAe;AAAA,IACjB,CAAC;AAAA,EACH;AAAA,EAIA,kBACE,OACA,UACM;AACN,SAAK,iBAAiB,OAAc,QAAe;AAAA,EACrD;AAAA,EACA,iBACE,OACA,UACA;AACA,QAAI,eAAe;AAGnB,QAAI,qBAAqB,MAAM,SAAS;AACxC,UAAM,kBAAkB,OAAO,MAAW;AACxC,UAAI,qBAAqB,GAAG;AAC1B;AACA;AAAA,MACF;AACA,UAAI,cAAc;AAGhB;AAAA,MACF;AAGA,YAAM,WAAY,MAAkC;AAAA,QAAI,CAAC,SACvD,KAAK,IAAI;AAAA,MACX;AACA,YAAM,SAAS,MAAM,QAAQ,IAAI,QAAQ;AACzC,eAAS,MAAa;AAAA,IACxB;AAEA,eAAW,QAAQ,OAAO;AACxB,WAAK,iBAAiB,eAAe;AAAA,IACvC;AAEA,SAAK,wBAAwB,KAAK,MAAM;AACtC,iBAAW,QAAQ,OAAO;AACxB,aAAK,oBAAoB,eAAe;AAAA,MAC1C;AACA,qBAAe;AAAA,IACjB,CAAC;AAAA,EACH;AAAA,EAEA,aAAmB;AACjB,eAAW,yBAAyB,KAAK,yBAAyB;AAChE,4BAAsB;AAAA,IACxB;AAAA,EACF;AACF;;;AC1XO,IAAM,kBAAN,MAAsB;AAAA,EAG3B,YAAoB,UAAoD;AAApD;AAFpB,SAAQ,cAA6B;AACrC,SAAQ,YAAY,KAAK,iBAAiB,KAAK,IAAI;AAAA,EACsB;AAAA,EAEzE,mBAA4B;AAC1B,WAAO,CAAC,CAAC,KAAK;AAAA,EAChB;AAAA,EAEA,mBAAyB;AACvB,QAAI,CAAC,KAAK,aAAa;AACrB,WAAK,cAAc,sBAAsB,KAAK,SAAS;AAAA,IACzD;AAAA,EACF;AAAA,EAEA,kBAAwB;AACtB,QAAI,KAAK,aAAa;AACpB,2BAAqB,KAAK,WAAW;AACrC,WAAK,cAAc;AAAA,IACrB;AAAA,EACF;AAAA,EAEQ,iBAAiB,WAAsC;AAC7D,SAAK,cAAc;AACnB,SAAK,SAAS,SAAS;AAAA,EACzB;AACF;;;ACxBO,IAAM,oBAAoB;AAAA,EAC/B,UAAU;AAAA,EACV,MAAM;AACR;AAIO,IAAM,kBAAN,cAA8B,uBAAiD;AAAA,EACpF,kBAA4C;AAC1C,WAAO;AAAA,EACT;AACF;;;ACdO,IAAM,MAAM,KAAK,KAAK;AACtB,IAAM,qBAAqB,MAAM;;;ACGxC,IAAM,kBAAN,MAAsB;AAAC;AAEvB,IAAI;AACJ,IAAI,WAAW,aAAa;AAC1B,oBAAkB;AACpB,OAAO;AACL,oBAAkB;AACpB;AAIA,IAAM,qBAAN,MAAyB;AAAA,EACvB,SAAe;AAAA,EAEf;AACF;AAEA,IAAI;AAEJ,IAAI,WAAW,gBAAgB;AAC7B,uBAAqB;AACvB,OAAO;AACL,uBAAqB,IAAI,mBAAmB;AAC9C;;;ACtBO,IAAM,YAAN,MAAgB;AAAA,EACrB,YAAoB,YAAoB;AAApB;AAAA,EAMpB;AAAA,EAEA,cAAsB;AACpB,WAAO,KAAK;AAAA,EACd;AACF;AAKO,IAAM,uBAAN,cAAmC,gBAAgB;AAAA,EAKxD,YAAY,SAAuC;AACjD,UAAM;AAFR,yBAAkD,oBAAI,IAAI;AAGxD,SAAK,SAAS,KAAK,aAAa,EAAE,MAAM,SAAS,QAAQ,SAAS,CAAC;AAEnE,SAAK,iBAAiB,SAAS,cAAc,KAAK;AAClD,SAAK,eAAe,UAAU,IAAI,SAAS;AAC3C,SAAK,OAAO,YAAY,KAAK,cAAc;AAAA,EAC7C;AAAA,EARA;AAAA,EAYO,OAAO,WAAwC;AACpD,UAAM,WAAW,KAAK,cAAc,IAAI,SAAS;AACjD,QAAI,UAAU;AACZ,aAAO;AAAA,IACT;AAEA,UAAM,UAA4B,SAAS,cAAc,OAAO;AAChE,YAAQ,cAAc,UAAU,YAAY;AAE5C,SAAK,cAAc,IAAI,WAAW,OAAO;AACzC,SAAK,OAAO,YAAY,OAAO;AAC/B,WAAO;AAAA,EACT;AAAA,EAGO,UAAU,WAA4B;AAC3C,UAAM,UAAU,KAAK,cAAc,IAAI,SAAS;AAChD,QAAI,CAAC,SAAS;AACZ;AAAA,IACF;AACA,SAAK,OAAO,YAAY,OAAO;AAC/B,SAAK,cAAc,OAAO,SAAS;AAAA,EACrC;AAAA,EAEO,WAA2B,SAAe;AAC/C,WAAO,KAAK,eAAe,YAAY,OAAO;AAAA,EAChD;AAAA,EAEO,eAA+B,SAAkB;AACtD,SAAK,eAAe,QAAQ,OAAO;AAAA,EACrC;AAAA,EAEO,cAA8B,SAAe;AAClD,WAAO,KAAK,eAAe,YAAY,OAAO;AAAA,EAChD;AACF;AAEA,mBAAmB;AAAA,EACjB;AAAA,EACA;AACF;;;ACzEA,IAAM,cAOG,WAAW;AAEb,IAAM,QAAN,MAAY;AAAA,EAKjB,cAAc;AAJd,gBAAO;AAEP,eAAM,SAAS,cAAc,KAAK;AA+BlC,sBAAa,eAAe,MAAM,IAAI;AACtC,oBAAW,KAAK;AAChB,kBAAS;AAET,oBAAW,KAAK,SAAS,IAAI,WAAW,OAAO,QAAQ,MAAM,CAAC;AAC9D,mBAAU,KAAK,SAAS,IAAI,WAAW,MAAM,QAAQ,MAAM,CAAC;AAC5D,oBAAW,aAAa,SACpB,KAAK,SAAS,IAAI,WAAW,MAAM,QAAQ,MAAM,CAAC,IAClD;AACJ,oBAAW;AArCT,SAAK,IAAI,MAAM,UACb;AACF,SAAK,IAAI;AAAA,MACP;AAAA,MACA,CAAC,UAAU;AACT,cAAM,eAAe;AACrB,aAAK,UAAU,EAAE,KAAK,OAAO,KAAK,IAAI,SAAS,MAAM;AAAA,MACvD;AAAA,MACA;AAAA,IACF;AAEA,SAAK,UAAU,CAAC;AAAA,EAClB;AAAA,EAEA,SAAS,OAA+B;AACtC,SAAK,IAAI,YAAY,MAAM,GAAG;AAC9B,WAAO;AAAA,EACT;AAAA,EAEA,UAAU,IAAkB;AAC1B,aAAS,IAAI,GAAG,IAAI,KAAK,IAAI,SAAS,QAAQ,KAAK;AACjD,MAAC,KAAK,IAAI,SAAS,GAAmB,MAAM,UAC1C,MAAM,KAAK,UAAU;AAAA,IACzB;AAEA,SAAK,OAAO;AAAA,EACd;AAAA,EAaA,QAAQ;AACN,SAAK,aAAa,eAAe,MAAM,IAAI;AAAA,EAC7C;AAAA,EAEA,MAAM;AACJ,SAAK;AAEL,UAAM,QAAQ,eAAe,MAAM,IAAI;AAEvC,SAAK,QAAQ,OAAO,OAAO,KAAK,WAAW,GAAG;AAE9C,QAAI,QAAQ,KAAK,WAAW,KAAM;AAChC,WAAK,SAAS,OAAQ,KAAK,SAAS,OAAS,OAAO,KAAK,WAAW,GAAG;AAEvE,WAAK,WAAW;AAChB,WAAK,SAAS;AAEd,UAAI,KAAK,UAAU;AACjB,cAAM,SAAS,YAAa;AAC5B,aAAK,SAAS;AAAA,UACZ,OAAO,iBAAiB;AAAA,UACxB,OAAO,kBAAkB;AAAA,QAC3B;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,SAAS;AACP,SAAK,YAAY,KAAK,IAAI;AAAA,EAC5B;AACF;AAEA,IAAM,KAAK,KAAK,MAAM,YAAY,QAAQ,oBAAoB,CAAC;AAE/D,IAAM,QAAQ,KAAK;AACnB,IAAM,SAAS,KAAK;AACpB,IAAM,SAAS,IAAI;AACnB,IAAM,SAAS,IAAI;AACnB,IAAM,UAAU,IAAI;AACpB,IAAM,UAAU,KAAK;AACrB,IAAM,cAAc,KAAK;AACzB,IAAM,eAAe,KAAK;AAEnB,IAAM,aAAN,MAAiB;AAAA,EAKtB,YAAoB,MAAsB,IAAoB,IAAY;AAAtD;AAAsB;AAAoB;AAJ9D,eAAM;AACN,eAAM;AACN,eAAM,SAAS,cAAc,QAAQ;AACrC,mBAAU,KAAK,IAAI,WAAW,IAAI;AAEhC,SAAK,IAAI,QAAQ;AACjB,SAAK,IAAI,SAAS;AAClB,SAAK,IAAI,MAAM,UAAU;AAEzB,SAAK,QAAQ,OAAO,QAAQ,IAAI;AAChC,SAAK,QAAQ,eAAe;AAE5B,SAAK,QAAQ,YAAY;AACzB,SAAK,QAAQ,SAAS,GAAG,GAAG,OAAO,MAAM;AAEzC,SAAK,QAAQ,YAAY;AACzB,SAAK,QAAQ,SAAS,MAAM,QAAQ,MAAM;AAC1C,SAAK,QAAQ,SAAS,SAAS,SAAS,aAAa,YAAY;AAEjE,SAAK,QAAQ,YAAY;AACzB,SAAK,QAAQ,cAAc;AAC3B,SAAK,QAAQ,SAAS,SAAS,SAAS,aAAa,YAAY;AAAA,EACnE;AAAA,EAEA,OAAO,OAAe,UAAkB;AACtC,SAAK,MAAM,KAAK,IAAI,KAAK,KAAK,KAAK;AACnC,SAAK,MAAM,KAAK,IAAI,KAAK,KAAK,KAAK;AAEnC,SAAK,QAAQ,YAAY,KAAK;AAC9B,SAAK,QAAQ,cAAc;AAC3B,SAAK,QAAQ,SAAS,GAAG,GAAG,OAAO,OAAO;AAC1C,SAAK,QAAQ,YAAY,KAAK;AAC9B,SAAK,QAAQ;AAAA,MACX,GAAG,KAAK,MAAM,KAAK,KAAK,KAAK,SAAS,KAAK,MAAM,KAAK,GAAG,KAAK,KAAK;AAAA,QACjE,KAAK;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,SAAK,QAAQ;AAAA,MACX,KAAK;AAAA,MACL,UAAU;AAAA,MACV;AAAA,MACA,cAAc;AAAA,MACd;AAAA,MACA;AAAA,MACA;AAAA,MACA,cAAc;AAAA,MACd;AAAA,IACF;AAEA,SAAK,QAAQ;AAAA,MACX,UAAU,cAAc;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,SAAK,QAAQ,YAAY,KAAK;AAC9B,SAAK,QAAQ,cAAc;AAC3B,SAAK,QAAQ;AAAA,MACX,UAAU,cAAc;AAAA,MACxB;AAAA,MACA;AAAA,MACA,KAAK,OAAO,IAAI,QAAQ,YAAY,YAAY;AAAA,IAClD;AAAA,EACF;AACF;;;ACxKA,IAAI,yBAEO;AAEX,eAAsB,UAEpB;AACA,SAAQ,oDAA2B,OACjC;AAEJ;AAEO,IAAM,UAA2C;AAAA,EACtD,aAAa,MAAM,QAAQ,GAAG;AAChC;;;ACnBA,IAAI,2BAA0C;AAMvC,SAAS,aAAqB;AACnC,SAAO,6BAA6B,oBAAoB;AAC1D;;;ACAO,IAAM,qBAAqB,IAAI;AAAA,EACpC;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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA6DF;;;AChCA,IAAM,mBAAmB;AAElB,IAAM,cAAN,cAA0B,YAAY;AAAA,EAG3C,YAA4B,QAAqB;AAC/C,UAAM;AADoB;AAAA,EAE5B;AAAA,EAJA,eAAyC,oBAAI,IAAI;AAAA,EAOjD,QAAQ;AACN,SAAK,kBAAkB,eAAe,KAAK,cAAc,KAAK,IAAI,CAAC;AAGnE,SAAK,kBAAkB,eAAe,CAAC,MAAM;AAC3C,QAAE,eAAe;AAAA,IACnB,CAAC;AAED,SAAK,kBAAkB,aAAa,CAAC,MAAM,EAAE,eAAe,CAAC;AAG7D,SAAK,kBAAkB,YAAY,CAAC,MAAM,EAAE,eAAe,CAAC;AAAA,EAC9D;AAAA,EAGA,OAAa;AACX,eAAW,CAAC,WAAW,QAAQ,KAAK,KAAK,iBAAiB,QAAQ,GAAG;AACnE,WAAK,OAAO,oBAAoB,WAAW,QAAQ;AAAA,IACrD;AACA,SAAK,iBAAiB,MAAM;AAC5B,SAAK,2BAA2B;AAAA,EAClC;AAAA,EAEA,mBAAmB,oBAAI,IAAoC;AAAA,EAC3D,kBAAkB,WAAmB,UAAkC;AACrE,QAAI,CAAC,KAAK,iBAAiB,IAAI,SAAS,GAAG;AACzC,WAAK,OAAO,iBAAiB,WAAW,QAAQ;AAChD,WAAK,iBAAiB,IAAI,WAAW,QAAQ;AAAA,IAC/C;AAAA,EACF;AAAA,EAIA,2BAAoC;AAAA,EACpC,yBAA+B;AAC7B,QAAI,KAAK,0BAA0B;AACjC;AAAA,IACF;AACA,SAAK,kBAAkB,eAAe,KAAK,cAAc,KAAK,IAAI,CAAC;AACnE,SAAK,kBAAkB,aAAa,KAAK,YAAY,KAAK,IAAI,CAAC;AAC/D,SAAK,2BAA2B;AAAA,EAClC;AAAA,EAEA,OAAO,GAAuB;AAC5B,SAAK,aAAa,OAAO,EAAE,SAAS;AAAA,EACtC;AAAA,EAGA,WAAW,GAGT;AAKA,UAAM,WAAW,KAAK,aAAa,IAAI,EAAE,SAAS;AAClD,QAAI,CAAC,UAAU;AACb,aAAO,EAAE,cAAc,MAAM,UAAU,MAAM;AAAA,IAC/C;AAWA,QAAI;AACJ,SAAK,EAAE,aAAa,OAAO,MAAM,EAAE,aAAa,OAAO,GAAG;AAExD,qBAAe;AAAA,QACb,cAAc,SAAS;AAAA,QACvB,WAAW,EAAE;AAAA,QACb,WAAW,EAAE;AAAA,QACb,WAAW,EAAE,YAAY,SAAS;AAAA,MACpC;AAAA,IACF,OAAO;AACL,qBAAe;AAAA,QACb,cAAc,SAAS;AAAA,QACvB,WAAW,EAAE,UAAU,SAAS;AAAA,QAChC,WAAW,EAAE,UAAU,SAAS;AAAA,QAChC,WAAW,EAAE,YAAY,SAAS;AAAA,MACpC;AAAA,IACF;AACA,aAAS,cAAc,EAAE;AACzB,aAAS,cAAc,EAAE;AACzB,aAAS,gBAAgB,EAAE;AAC3B,QACE,KAAK,IAAI,aAAa,SAAS,IAAI,oBACnC,KAAK,IAAI,aAAa,SAAS,IAAI,kBACnC;AACA,aAAO,EAAE,cAAc,MAAM,UAAU,SAAS,SAAS;AAAA,IAC3D,OAAO;AACL,eAAS,WAAW;AACpB,aAAO,EAAE,cAAc,UAAU,SAAS,SAAS;AAAA,IACrD;AAAA,EACF;AAAA,EAEQ,cAAc,GAAiB;AACrC,SAAK,uBAAuB;AAC5B,UAAM,cAAwB;AAAA,MAC5B,cAAc,CAAC;AAAA,MACf,UAAU;AAAA,MACV,aAAa,EAAE;AAAA,MACf,aAAa,EAAE;AAAA,MACf,eAAe,EAAE;AAAA,IACnB;AACA,SAAK,aAAa,IAAI,EAAE,WAAW,WAAW;AAC9C,SAAK,OAAO,kBAAkB,EAAE,SAAS;AAAA,EAC3C;AAAA,EAEQ,cAAc,GAAiB;AACrC,UAAM,eAAe,KAAK,WAAW,CAAC,EAAE;AACxC,QAAI,cAAc;AAChB,QAAE,eAAe;AACjB,WAAK;AAAA,QACH,IAAI,YAAY,QAAQ;AAAA,UACtB,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,YAAY,GAAiB;AACnC,UAAM,kBAAkB,KAAK,WAAW,CAAC;AACzC,UAAM,WAAW,KAAK,aAAa,IAAI,EAAE,SAAS;AAClD,SAAK,OAAO,CAAC;AACb,SAAK,OAAO,sBAAsB,EAAE,SAAS;AAC7C,QAAI;AACJ,QAAI,gBAAgB,UAAU;AAE5B,cAAQ,IAAI,YAAoB,MAAM;AAAA,QACpC,QAAQ,EAAE,cAAc,SAAS,aAAa;AAAA,MAChD,CAAC;AAAA,IACH,OAAO;AACL,YAAM,EAAE,QAAQ,SAAS,SAAS,SAAS,IAAI;AAC/C,cAAQ,IAAI,YAAuB,SAAS;AAAA,QAC1C,QAAQ;AAAA,UACN,aAAc,EAAE,UAAU,KAAK,OAAO,cAAe,IAAI;AAAA,UACzD,aAAa,IAAK,EAAE,UAAU,KAAK,OAAO,eAAgB;AAAA,UAC1D,YAAY,CAAC,EAAE,EAAE,SAAS;AAAA,UAC1B,MAAM;AAAA,YACJ;AAAA,YACA,eAAe,WAAW;AAAA,YAC1B;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AACA,SAAK,cAAc,KAAK;AAAA,EAC1B;AACF;;;ACzLA,IAAM,YAAsC,CAAC;AAG7C,eAAsB,gBACpB,OACA,QACA,OACA,QAC4B;AAE5B,MAAI,UAAU,WAAW,GAAG;AAC1B,cAAU,KAAK,YAAY,CAAC;AAAA,EAC9B;AACA,QAAM,WAAW,MAAM,UAAU;AAEjC,WAAS,QAAQ,OAAO,MAAM;AAC9B,WAAS,OAAO,OAAO,MAAM;AAE7B,SAAO,SAAS;AAClB;AAGA,eAAsB,aACpB,OACA,QACA,QACA,OACA,QACe;AACf,MAAI,UAAU,KAAK,WAAW,GAAG;AAC/B;AAAA,EACF;AAEA,MAAI,UAAU,WAAW,GAAG;AAC1B,cAAU,KAAK,YAAY,CAAC;AAAA,EAC9B;AAEA,QAAM,iBAAiB,MAAM,gBAAgB,OAAO,QAAQ,OAAO,MAAM;AAGzE,QAAM,UAAU,OAAO,WAAW,IAAI;AACtC,UAAQ,UAAU,GAAG,GAAG,OAAO,OAAO,OAAO,MAAM;AACnD,UAAQ,UAAU,gBAAgB,GAAG,CAAC;AACxC;AAEA,eAAsB,cAAsC;AAC1D,QAAM,uBAAuB,MAAM,SAAS;AAC5C,QAAM,WAAW,IAAI,oBAAoB;AAAA,IACvC,WAAW;AAAA,IACX,OAAO;AAAA,EACT,CAAC;AACD,WAAS,cAAc,WAAW,CAAC;AACnC,SAAO;AACT;;;AC9DA,IAAM,kBAA2B;AAEjC,IAAM,sBAAsB;AAI5B,IAAM,qBAAqB;AAE3B,IAAM,+BAA+B;AAGrC,SAAS,cAAc,UAAkB;AAMvC,UAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,IAAI,cAAc,IAAI,KAAK,KAAK;AACpE;AAEA,IAAM,UAAN,MAAc;AAAA,EAGZ,YACU,gBACA,WACA,WACA,UACR;AAJQ;AACA;AACA;AACA;AANV,SAAQ,YAAY,IAAI,gBAAgB,KAAK,OAAO,KAAK,IAAI,CAAC;AAQ5D,SAAK,UAAU,iBAAiB;AAChC,SAAK,gBAAgB;AAAA,EACvB;AAAA,EAEQ,OAAO,KAA0B;AACvC,UAAM,kBACH,KAAK,gBAAgB,KAAK,kBAAkB;AAC/C,UAAM,gBAAgB,KAAK;AAAA,MACzB;AAAA,OACC,MAAM,KAAK,kBAAkB;AAAA,IAChC;AAEA,QACE,mBAAmB,KACnB,gBAAgB,qBAAqB,qBACrC;AAEA;AAAA,IACF;AAEA,UAAM,QAAQ,cAAc,aAAa,IAAI,cAAc,cAAc;AAIzE,SAAK,SAAS,KAAK,YAAY,QAAQ,KAAM,KAAK,YAAY,QAAQ,GAAI;AAE1E,QAAI,gBAAgB,GAAG;AACrB,WAAK,UAAU,iBAAiB;AAAA,IAClC;AACA,SAAK,gBAAgB;AAAA,EACvB;AACF;AAqBO,IAAM,sBAAN,MAA0B;AAAA,EAK/B,YACU,OACA,QACA,QACA,aACR;AAJQ;AACA;AACA;AACA;AAPV,+BAA+B;AAC/B,SAAQ,kBAAkB,KAAK,WAAW,KAAK,IAAI;AACnD,SAAO,2BAAoC;AAOzC,SAAK,YAAY,iBAAiB,QAAQ,KAAK,OAAO,KAAK,IAAI,CAAC;AAChE,SAAK,YAAY,iBAAiB,MAAM,KAAK,KAAK,KAAK,IAAI,CAAC;AAAA,EAC9D;AAAA,EAGA,eAAe,GAAmB;AAGhC,WAAQ,KAAK,KAAK,CAAC,IAAI,KAAK,IAAI,KAAK,IAAI,IAAI,EAAE,IAAI,CAAC,IAAK;AAAA,EAC3D;AAAA,EAEA,OAAO,GAAwC;AA/GjD;AAgHI,YAAE,QAAO,iBAAT,GAAS,eAAiB,CAAC;AAE3B,UAAM,EAAE,WAAW,UAAU,IAAI,KAAK;AAAA,MACpC,EAAE,OAAO;AAAA,MACT,EAAE,OAAO;AAAA,IACX;AACA,UAAM,eAAe,EAAE,OACpB;AACH,iBAAa,gBAAgB,YAAY;AACzC,iBAAa,gBAAgB,YAAY;AACzC,iBAAa,YAAY,EAAE;AAAA,EAC7B;AAAA,EAEA,WACE,WACA,WAIA;AACA,UAAM,QAAQ,KAAK,SAAS,KAAK;AAGjC,UAAM,SAAS,KAAK,IAAI,KAAK,OAAO,aAAa,KAAK,OAAO,YAAY;AAEzE,UAAM,YAAY,KAAK,eAAe,YAAY,MAAM;AACxD,UAAM,YAAY,KAAK;AAAA,MACpB,YAAY,SAAU;AAAA,IACzB;AACA,SAAK,MAAM,iBAAiB,wBAAwB;AAAA,OACjD,YAAY;AACX,cAAM,aACJ,MAAM,KAAK,MAAM,iBAAiB,iBAAiB,IAAI;AAEzD,cAAM,YAAY;AAAA,UAChB,UACE,WAAW,WAAW,IAAI,YAAY,qBAAqB;AAAA,UAC7D,WAAW,WAAW,YAAY,IAAI,YAAY;AAAA,QACpD;AACA,eAAO;AAAA,MACT,GAAG;AAAA,IACL;AACA,WAAO,EAAE,WAAW,UAAU;AAAA,EAChC;AAAA,EAEA,KAAK,GAAwC;AAC3C,MAAE,eAAe;AACjB,QACE,mBAAmB,EAAE,OAAO,gBAC5B,mBAAmB,EAAE,OAAO,gBAC5B,eAAe,EAAE,OAAO,gBACxB,EAAE,YAAY,EAAE,OAAO,aAAa,YAAY,IAChD;AACA,UAAI;AAAA,QACF,EAAE;AAAA,QACD,EAAE,OAAO,aACP;AAAA,QACF,EAAE,OAAO,aACP;AAAA,QACH,KAAK;AAAA,MACP;AAAA,IACF;AAAA,EACF;AACF;;;AC3JA,eAAsB,8BACpB,QACA,kBACA,WAAoB,OACL;AACf,QAAM,YAAY,KAAK,MAAM,SAAS;AAAA,IACpC,iBAAiB;AAAA,KAChB,MAAM,WAAW,KAAK,KAAK,iBAAiB,YAAY;AAAA,MACvD,WAAW,MAAM,KAAK,iBAAiB,aAAa;AAAA,EACxD;AACA,YAAU,SAAS;AACnB,SAAO,SAAS,iBAAiB,SAAS;AAC1C,SAAO,OAAO,GAAG,GAAG,CAAC;AACvB;AAEA,IAAI,0BAA0B;AAC9B,IAAM,kCAAkC;AACxC,IAAI,mBAAmB;AACvB,SAAS,gBAAyB;AAChC,MAAI,mBAAmB,yBAAyB,QAAQ;AACtD,QAAI,CAAC,mBAAmB,sBAAsB;AAC5C;AAAA,IACF;AACA,WAAO,mBAAmB,yBAAyB;AAAA,EACrD;AACA,MAAI,0BAA0B,iCAAiC;AAC7D;AACA,WAAO;AAAA,EACT,OAAO;AACL,uBAAmB;AACnB,WAAO;AAAA,EACT;AACF;AAEO,SAAS,8BAAuC;AACrD,SAAO;AACT;AAEO,IAAM,kBAAN,cAA8B,qBAAqB;AAAA,EAQxD,YACU,OACR,OACQ,SACR;AACA,UAAM;AAJE;AAEA;AAVV,iBAAqC;AAErC,iBAAsB;AAEtB,SAAQ,mBAA4B,cAAc;AAElD,0BAAwC;AAmDxC,iCAAwB,IAAI,aAAgC;AAmB5D,kBAAiB;AACjB,mBAAkB;AAmClB,2BAAiD;AAQjD,yBAGY;AAmBZ,8BAAkD;AA4BlD,yBAAmD;AAoBnD,gCAA4D;AA0C5D,mCAA0C,CAAC;AAQ3C,mDAA+D;AA4B/D,sBAAa,IAAI,gBAAgB,KAAK,OAAO,KAAK,IAAI,CAAC;AA/PrD,SAAK,QAAQ,SAAS;AAEtB,SAAK,iBAAiB,KAAK,WAAW,SAAS,cAAc,KAAK,CAAC;AACnE,SAAK,eAAe,UAAU,IAAI,SAAS;AAE3C,QAAI,mBAAmB,iBAAiB;AACtC,WAAK,QAAQ,IAAI,MAAM;AACvB,WAAK,MAAM,IAAI,MAAM,WAAW;AAChC,WAAK,eAAe,YAAY,KAAK,MAAM,GAAG;AAAA,IAChD;AAAA,EACF;AAAA,EAEA,MAAM,oBAAmC;AACvC,SAAK,OAAO,kBAAkB;AAC9B,SAAK,YAAY,MAAM,KAAK,WAAW,GAAG,MAAM;AAEhD,SAAK,UAAU;AACf,UAAM,WAAW,IAAI,eAAe,KAAK,UAAU,KAAK,IAAI,CAAC;AAC7D,aAAS,QAAQ,KAAK,cAAc;AACpC,SAAK,cAAc;AACnB,SAAK,mBAAmB;AAExB,SAAK,eAAe;AAAA,EACtB;AAAA,EAEA,MAAM,qBAAoC;AACxC,UAAM,cAAc,MAAM,KAAK,aAAa;AAC5C,gBAAY,iBAAiB,SAAS,OAAO,MAA8B;AACzE,YAAM,iBACJ,MAAM,KAAK,MAAO,iBAAiB,eAAe,IAAI;AACxD,UAAI,mBAAmB,SAAS;AAC9B;AAAA,MACF;AACA,WAAK;AAAA,QACH,IAAI,YAAY,SAAS;AAAA,UACvB,QAAQ;AAAA,YACN,WAAW,EAAE;AAAA,YACb,eAAe,KAAK,OAAO;AAAA,UAC7B;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA;AAAA,EAEA,MAAM,cAA6B;AACjC,QAAI,KAAK,kBAAkB;AACzB,YAAM,aAAa,MAAM,KAAK,WAAW;AACzC,iBAAW,QAAQ;AAAA,QACjB;AAAA,QACA;AAAA,QACA,WAAW,OAAO;AAAA,QAClB,WAAW,OAAO;AAAA,MACpB;AAAA,IACF,OAAO;AACL,YAAM,WAAW,MAAM,KAAK,SAAS;AACrC,YAAM,UAAU,SAAS,WAAW;AACpC,cAAQ,MAAM,QAAQ,gBAAgB;AAAA,IACxC;AAAA,EACF;AAAA,EAGA;AAAA,EACA;AAAA,EACA,MAAM,YAA2B;AAC/B,UAAM,SAAS,MAAM,KAAK,sBAAsB,MAAM,KAAK,OAAO,CAAC;AAEnE,UAAM,IAAI,KAAK,eAAe;AAC9B,UAAM,IAAI,KAAK,eAAe;AAC9B,SAAK,SAAS;AACd,SAAK,UAAU;AACf,UAAM,MAAM;AACZ,QAAI,OAAO;AACX,QAAI,SAAS;AACb,QAAI,IAAI,GAAG;AACT,eAAS,IAAI;AACb,aAAO,CAAC,KAAK,MAAM,MAAM,MAAM;AAAA,IACjC;AACA,WAAO,SAAS,IAAI;AACpB,WAAO,cAAc,GAAG,IAAI,QAAQ,KAAK,MAAM,GAAG,CAAC;AACnD,WAAO,uBAAuB;AAE9B,SAAK,YAAY;AACjB,QAAI,KAAK,kBAAkB;AACzB,YAAM,aAAa,MAAM,KAAK,WAAW;AAEzC,iBAAW,OAAO,QAAQ,IAAI,WAAW;AACzC,iBAAW,OAAO,SAAS,IAAI,WAAW;AAC1C,iBAAW,OAAO,MAAM,QAAQ,EAAE,SAAS;AAC3C,iBAAW,OAAO,MAAM,SAAS,EAAE,SAAS;AAAA,IAC9C,OAAO;AACL,YAAM,WAAW,MAAM,KAAK,SAAS;AACrC,eAAS,QAAQ,GAAG,GAAG,IAAI;AAAA,IAC7B;AAEA,SAAK,eAAe;AAAA,EACtB;AAAA,EAEA;AAAA,EACA,MAAM,WAAmC;AACvC,QAAI,KAAK,kBAAkB;AACzB,YAAM,IAAI,MAAM,iCAAiC;AAAA,IACnD;AACA,WAAQ,gDAAyB,YAAY;AAAA,EAC/C;AAAA,EAEA;AAAA,EAIA,MAAM,aAGH;AACD,WAAQ,6CAAwB,YAAY;AAC1C,UAAI;AACJ,UAAI,KAAK,kBAAkB;AACzB,iBAAS,KAAK,WAAW,SAAS,cAAc,QAAQ,CAAC;AAAA,MAC3D,OAAO;AACL,cAAM,WAAW,MAAM,KAAK,SAAS;AACrC,iBAAS,KAAK,WAAW,SAAS,UAAU;AAAA,MAC9C;AACA,WAAK,gBAAgB,OAAO;AAC5B,YAAM,UAAU,OAAO,WAAW,IAAI;AACtC,aAAO,EAAE,QAAQ,QAAQ;AAAA,IAC3B,GAAG;AAAA,EACL;AAAA,EAEA;AAAA,EACA,MAAM,eAAqC;AACzC,WAAQ,uDAA6B,YAAY;AAC/C,YAAM,cAAc,IAAI,aAAa,MAAM,KAAK,WAAW,GAAG,MAAM;AACpE,WAAK,OAAO,iBAAiB,UAAU;AAAA,QACrC,CAAC,kBAAiC;AAChC,cAAI,mBAAmB;AACvB,kBAAQ;AAAA,iBACD,QAAQ;AACX,0BAAY,MAAM;AAClB,iCAAmB;AACnB;AAAA,YACF;AAAA,iBACK,QAAQ;AACX,0BAAY,KAAK;AACjB;AAAA,YACF;AAAA;AAEF,eAAK,eAAe,UAAU;AAAA,YAC5B;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA,aAAO;AAAA,IACT,GAAG;AAAA,EACL;AAAA,EAEA;AAAA,EACA,MAAM,SAAqC;AACzC,WAAQ,6CAAwB,YAAY;AAC1C,YAAM,SAAS,KAAK,MAAM,SAAS;AAAA,QACjC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,aAAO,SAAS;AAAA,QACd,KAAK,MAAM,SAAS,QAAQ,GAAG,GAAG,CAAC,EAAE;AAAA,UACnC,KAAK,SAAS,WAAW,KAAK;AAAA,QAChC;AAAA,MACF;AACA,aAAO,OAAO,GAAG,GAAG,CAAC;AAErB,aAAO;AAAA,IACT,GAAG;AAAA,EACL;AAAA,EAEA;AAAA,EACA,MAAM,gBAA8C;AAClD,WAAQ,2DAA+B,YAAY;AACjD,YAAM,gBAAgB,IAAI;AAAA,QACxB,KAAK;AAAA,QACL,CAAC,CAAC,KAAK,SAAS;AAAA,SACf,MAAM,KAAK,WAAW,GAAG;AAAA,QAC1B,MAAM,KAAK,aAAa;AAAA,MAC1B;AAEA,UAAI,KAAK,OAAO;AACd,aAAK;AAAA,UACH,KAAK,MAAM,iBAAiB;AAAA,UAC5B,OAAO,qBAAuC;AAC5C,kBAAM,SAAS,MAAM,KAAK,OAAO;AACjC;AAAA,cACE;AAAA,cACA;AAAA,cACA,KAAK,SAAS;AAAA,YAChB;AAGA,iBAAK,eAAe;AAAA,UACtB;AAAA,QACF;AAAA,MACF;AAEA,aAAO;AAAA,IACT,GAAG;AAAA,EACL;AAAA,EAEA,YACE,MACA,UACM;AACN,SAAK,iBAAiB,QAAQ;AAC9B,SAAK,wBAAwB,KAAK,MAAM;AACtC,WAAK,oBAAoB,QAAQ;AAAA,IAEnC,CAAC;AAAA,EACH;AAAA,EAEA;AAAA,EACA,aAAmB;AACjB,eAAW,MAAM,KAAK,yBAAyB;AAC7C,SAAG;AAAA,IACL;AACA,SAAK,0BAA0B,CAAC;AAAA,EAClC;AAAA,EAEA;AAAA,EACA,uCAAuC,UAA4B;AACjE,SAAK,0CAA0C;AAAA,EACjD;AAAA,EAEA,MAAM,SAAwB;AAC5B,QAAI,CAAC,KAAK,OAAO;AACf,YAAM,IAAI,MAAM,qCAAqC;AAAA,IACvD;AAEA,SAAK,OAAO,MAAM;AAElB,UAAM,CAAC,OAAO,QAAQ,MAAM,IAAI,MAAM,QAAQ,IAAI;AAAA,MAChD,KAAK,MAAM,MAAM;AAAA,MACjB,KAAK,OAAO;AAAA,MACZ,KAAK,WAAW;AAAA,IAClB,CAAC;AACD,QAAI,KAAK,kBAAkB;AACzB,mBAAa,KAAK,QAAQ,KAAK,SAAS,OAAO,QAAQ,OAAO,MAAM;AAAA,IACtE,OAAO;AACL,OAAC,MAAM,KAAK,SAAS,GAAG,OAAO,OAAO,MAAM;AAAA,IAC9C;AAEA,SAAK,OAAO,IAAI;AAChB,SAAK,0CAA0C;AAC/C,SAAK,0CAA0C;AAAA,EACjD;AAAA,EAEA;AAAA,EACA,iBAAuB;AAErB,SAAK,WAAW,iBAAiB;AAAA,EACnC;AACF;AAEA,mBAAmB,OAAO,qBAAqB,eAAe;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
// src/cubing/vendor/random-uint-below/get-random-values.ts
|
|
2
|
-
var cryptoPromise = null;
|
|
3
|
-
var cryptoMangled = "cr-yp-to";
|
|
4
|
-
var cryptoUnmangled = () => cryptoMangled.replace(/-/g, "");
|
|
5
|
-
async function getRandomValuesFactory() {
|
|
6
|
-
if (!globalThis?.crypto?.getRandomValues) {
|
|
7
|
-
const nodeWebCrypto = (await (cryptoPromise ?? (cryptoPromise = import(
|
|
8
|
-
/* @vite-ignore */
|
|
9
|
-
cryptoUnmangled()
|
|
10
|
-
)))).webcrypto;
|
|
11
|
-
return nodeWebCrypto.getRandomValues.bind(
|
|
12
|
-
nodeWebCrypto
|
|
13
|
-
);
|
|
14
|
-
} else {
|
|
15
|
-
return crypto.getRandomValues.bind(crypto);
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
// src/cubing/vendor/random-uint-below/random53BitValue.ts
|
|
20
|
-
var MAX_JS_PRECISE_INT = 9007199254740992;
|
|
21
|
-
var UPPER_HALF_MULTIPLIER = 2097152;
|
|
22
|
-
var LOWER_HALF_DIVIDER = 2048;
|
|
23
|
-
function random53BitValue(getRandomValues) {
|
|
24
|
-
const arr = new Uint32Array(2);
|
|
25
|
-
getRandomValues(arr);
|
|
26
|
-
const upper = arr[0];
|
|
27
|
-
const lower = arr[1];
|
|
28
|
-
return Math.floor(upper * UPPER_HALF_MULTIPLIER) + Math.floor(lower / LOWER_HALF_DIVIDER);
|
|
29
|
-
}
|
|
30
|
-
function validateMax(max) {
|
|
31
|
-
if (typeof max !== "number" || max < 0 || Math.floor(max) !== max) {
|
|
32
|
-
throw new Error(
|
|
33
|
-
"randomInt.below() not called with a positive integer value."
|
|
34
|
-
);
|
|
35
|
-
}
|
|
36
|
-
if (max > MAX_JS_PRECISE_INT) {
|
|
37
|
-
throw new Error(
|
|
38
|
-
`Called randomInt.below() with max === ${max}, which is larger than JavaScript can handle with integer precision.`
|
|
39
|
-
);
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
async function randomUIntBelowFactory() {
|
|
43
|
-
const getRandomValues = await getRandomValuesFactory();
|
|
44
|
-
const randomUIntBelow = (max) => {
|
|
45
|
-
validateMax(max);
|
|
46
|
-
const val = random53BitValue(getRandomValues);
|
|
47
|
-
const maxUniformSamplingRange = Math.floor(MAX_JS_PRECISE_INT / max) * max;
|
|
48
|
-
if (val < maxUniformSamplingRange) {
|
|
49
|
-
return val % max;
|
|
50
|
-
} else {
|
|
51
|
-
return randomUIntBelow(max);
|
|
52
|
-
}
|
|
53
|
-
};
|
|
54
|
-
return randomUIntBelow;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
// src/cubing/vendor/random-uint-below/random-choice.ts
|
|
58
|
-
async function randomChoiceFactory() {
|
|
59
|
-
const randomUIntBelow = await randomUIntBelowFactory();
|
|
60
|
-
return (arr) => arr[randomUIntBelow(arr.length)];
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
// src/cubing/vendor/random-uint-below/index.ts
|
|
64
|
-
var randomUIntBelowPromise = randomUIntBelowFactory();
|
|
65
|
-
async function randomPermute(list) {
|
|
66
|
-
for (let i = 1; i < list.length; i++) {
|
|
67
|
-
const j = (await randomUIntBelowPromise)(i);
|
|
68
|
-
[list[i], list[j]] = [list[j], list[i]];
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
export {
|
|
73
|
-
randomUIntBelowFactory,
|
|
74
|
-
randomChoiceFactory,
|
|
75
|
-
randomPermute
|
|
76
|
-
};
|
|
77
|
-
//# sourceMappingURL=chunk-HR5D6SD4.js.map
|