@rpgm-tools/neo-angband-content 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. package/LICENSE.md +43 -0
  2. package/README.md +65 -0
  3. package/dist/compile.d.ts +10 -0
  4. package/dist/compile.d.ts.map +1 -0
  5. package/dist/compile.js +42 -0
  6. package/dist/compile.js.map +1 -0
  7. package/dist/data-exactness.reader.d.ts +105 -0
  8. package/dist/data-exactness.reader.d.ts.map +1 -0
  9. package/dist/data-exactness.reader.js +547 -0
  10. package/dist/data-exactness.reader.js.map +1 -0
  11. package/dist/index.d.ts +17 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +15 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/parser.d.ts +70 -0
  16. package/dist/parser.d.ts.map +1 -0
  17. package/dist/parser.js +365 -0
  18. package/dist/parser.js.map +1 -0
  19. package/dist/records.d.ts +101 -0
  20. package/dist/records.d.ts.map +1 -0
  21. package/dist/records.js +244 -0
  22. package/dist/records.js.map +1 -0
  23. package/dist/specs/generate.d.ts +12 -0
  24. package/dist/specs/generate.d.ts.map +1 -0
  25. package/dist/specs/generate.js +57 -0
  26. package/dist/specs/generate.js.map +1 -0
  27. package/dist/specs/index.d.ts +9 -0
  28. package/dist/specs/index.d.ts.map +1 -0
  29. package/dist/specs/index.js +60 -0
  30. package/dist/specs/index.js.map +1 -0
  31. package/dist/specs/init.d.ts +23 -0
  32. package/dist/specs/init.d.ts.map +1 -0
  33. package/dist/specs/init.js +305 -0
  34. package/dist/specs/init.js.map +1 -0
  35. package/dist/specs/misc.d.ts +33 -0
  36. package/dist/specs/misc.d.ts.map +1 -0
  37. package/dist/specs/misc.js +146 -0
  38. package/dist/specs/misc.js.map +1 -0
  39. package/dist/specs/mon-init.d.ts +22 -0
  40. package/dist/specs/mon-init.d.ts.map +1 -0
  41. package/dist/specs/mon-init.js +157 -0
  42. package/dist/specs/mon-init.js.map +1 -0
  43. package/dist/specs/obj-init.d.ts +19 -0
  44. package/dist/specs/obj-init.d.ts.map +1 -0
  45. package/dist/specs/obj-init.js +219 -0
  46. package/dist/specs/obj-init.js.map +1 -0
  47. package/dist/specs/ui-entry.d.ts +22 -0
  48. package/dist/specs/ui-entry.d.ts.map +1 -0
  49. package/dist/specs/ui-entry.js +69 -0
  50. package/dist/specs/ui-entry.js.map +1 -0
  51. package/dist/specs/visuals.d.ts +26 -0
  52. package/dist/specs/visuals.d.ts.map +1 -0
  53. package/dist/specs/visuals.js +35 -0
  54. package/dist/specs/visuals.js.map +1 -0
  55. package/pack/activation.json +3340 -0
  56. package/pack/artifact.json +5146 -0
  57. package/pack/blow_effects.json +370 -0
  58. package/pack/blow_methods.json +286 -0
  59. package/pack/body.json +59 -0
  60. package/pack/brand.json +100 -0
  61. package/pack/chest_trap.json +117 -0
  62. package/pack/class.json +5501 -0
  63. package/pack/constants.json +470 -0
  64. package/pack/curse.json +580 -0
  65. package/pack/dungeon_profile.json +836 -0
  66. package/pack/ego_item.json +2900 -0
  67. package/pack/flavor.json +1541 -0
  68. package/pack/hints.json +303 -0
  69. package/pack/history.json +1656 -0
  70. package/pack/manifest.json +52 -0
  71. package/pack/monster.json +29392 -0
  72. package/pack/monster_base.json +688 -0
  73. package/pack/monster_spell.json +2735 -0
  74. package/pack/names.json +1204 -0
  75. package/pack/object.json +11877 -0
  76. package/pack/object_base.json +364 -0
  77. package/pack/object_property.json +2034 -0
  78. package/pack/p_race.json +447 -0
  79. package/pack/pain.json +150 -0
  80. package/pack/pit.json +617 -0
  81. package/pack/player_property.json +519 -0
  82. package/pack/player_timed.json +1321 -0
  83. package/pack/projection.json +664 -0
  84. package/pack/quest.json +18 -0
  85. package/pack/realm.json +34 -0
  86. package/pack/room_template.json +9571 -0
  87. package/pack/shape.json +263 -0
  88. package/pack/slay.json +116 -0
  89. package/pack/store.json +675 -0
  90. package/pack/summon.json +143 -0
  91. package/pack/terrain.json +511 -0
  92. package/pack/trap.json +1483 -0
  93. package/pack/ui_entry.json +382 -0
  94. package/pack/ui_entry_base.json +60 -0
  95. package/pack/ui_entry_renderer.json +43 -0
  96. package/pack/ui_knowledge.json +302 -0
  97. package/pack/vault.json +4355 -0
  98. package/pack/visuals.json +680 -0
  99. package/pack/world.json +1030 -0
  100. package/package.json +67 -0
  101. package/src/compile.ts +55 -0
  102. package/src/data-exactness.reader.ts +559 -0
  103. package/src/index.ts +31 -0
  104. package/src/parser.ts +406 -0
  105. package/src/records.ts +341 -0
  106. package/src/specs/generate.ts +61 -0
  107. package/src/specs/index.ts +103 -0
  108. package/src/specs/init.ts +322 -0
  109. package/src/specs/misc.ts +153 -0
  110. package/src/specs/mon-init.ts +165 -0
  111. package/src/specs/obj-init.ts +230 -0
  112. package/src/specs/ui-entry.ts +74 -0
  113. package/src/specs/visuals.ts +37 -0
package/LICENSE.md ADDED
@@ -0,0 +1,43 @@
1
+ # License
2
+
3
+ Neo Angband is a derivative work of Angband and retains upstream's dual
4
+ license, as the Angband project asks of its variants (see
5
+ `reference/docs/copying.rst`, which remains the authoritative statement for
6
+ the original code and its assets).
7
+
8
+ Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke, and the
9
+ Angband contributors; port code copyright (c) 2026 the Neo Angband
10
+ contributors.
11
+
12
+ This work is free software; you can redistribute it and/or modify it under
13
+ the terms of either:
14
+
15
+ a) the GNU General Public License as published by the Free Software
16
+ Foundation, version 2, or
17
+
18
+ b) the "Angband licence":
19
+ This software may be copied and distributed for educational, research,
20
+ and not for profit purposes provided that this copyright and statement
21
+ are included in all such copies. Other copyrights may also apply.
22
+
23
+ ## Assets
24
+
25
+ Asset licenses under `reference/` vary and are NOT all dual-licensed as
26
+ above; see `reference/docs/copying.rst` for the full statements, and
27
+ `packages/web/public/tiles/CREDITS.md` for the four tile packs this port
28
+ actually bundles and the terms each one is bundled under.
29
+
30
+ The Adam Bolt tiles (any purpose, with or without modification) and David
31
+ Gervais tiles (CC BY 3.0, attribution given in that CREDITS.md) are available
32
+ to tile packs under their own terms. The Shockbolt tile set is a distinct
33
+ case and is **not** bundled: its license grants fee-free distribution *with*
34
+ Angband but withholds modification without the author's permission, and
35
+ withholds use with "other games or projects" absent explicit permission —
36
+ so whether this port may carry it turns on a question only the author can
37
+ settle. CREDITS.md states the grants and the prohibitions in full.
38
+
39
+ ## Mods
40
+
41
+ Declarative content packs and tile packs are independent works and may be
42
+ licensed as their authors choose. Distributed scripted plugins are safest
43
+ treated as GPLv2 derivatives. See `docs/MODS.md`.
package/README.md ADDED
@@ -0,0 +1,65 @@
1
+ # @rpgm-tools/neo-angband-content
2
+
3
+ Angband 4.2.6's gamedata, compiled to the schema-validated pack format
4
+ [Neo Angband](https://github.com/neostryder/neo-angband) boots from — plus the
5
+ compiler that produced it.
6
+
7
+ ```bash
8
+ npm install @rpgm-tools/neo-angband-content
9
+ ```
10
+
11
+ `@rpgm-tools/neo-angband-core` is the rules and holds no content: it can roll dice, run
12
+ the effect interpreter and read a save, but it cannot generate a populated level
13
+ without a pack handed to it. This is that pack.
14
+
15
+ ## The base game is pack zero
16
+
17
+ The gamedata is not special-cased anywhere. `monster.txt`, `object.txt`,
18
+ `terrain.txt` and the rest go through the **same pipeline any mod's content goes
19
+ through**, and come out as the same JSON records with the same schema. That is
20
+ what makes a total conversion possible by construction rather than by permission:
21
+ a mod that replaces every record is doing what the base game already does.
22
+
23
+ ## What is in the tarball
24
+
25
+ | Path | What it holds |
26
+ | --- | --- |
27
+ | `pack/` | 45 compiled JSON files — the content itself, which is what most consumers want |
28
+ | `dist/` | The compiler: `compileGamedata`, the line parser, and the per-file specs |
29
+
30
+ ```ts
31
+ import monsters from "@rpgm-tools/neo-angband-content/pack/monster.json" with { type: "json" };
32
+ ```
33
+
34
+ To recompile from upstream's text files — which needs an Angband checkout, not
35
+ shipped here:
36
+
37
+ ```ts
38
+ import { compileGamedata, gamedataSpecs } from "@rpgm-tools/neo-angband-content";
39
+ ```
40
+
41
+ ## Exactness is the whole point
42
+
43
+ The compiler is not a convenient reader. It is checked against upstream's own
44
+ parser (`reference/src/parser.c`) directive by directive, and the pack is checked
45
+ back against the text it came from — a field the compiler drops silently is the
46
+ failure mode that matters, because the game then plays subtly differently with
47
+ nothing to see. Those checks are `data-exactness.test.ts` and the
48
+ `*.upstream.test.ts` files in `src/`.
49
+
50
+ ## Versioning
51
+
52
+ The pack moves with the engine and carries the game's version, not Angband's.
53
+ `PARITY_BASELINE` in `@rpgm-tools/neo-angband-core` is the upstream release this content
54
+ was compiled from and moves independently.
55
+
56
+ ## Licence
57
+
58
+ Neo Angband keeps Angband's dual licence, as the Angband project asks of its
59
+ variants: **GNU GPL v2, or the Angband licence**, at your option. npm can only
60
+ carry one SPDX identifier, so the manifest says `GPL-2.0-only` — the more
61
+ restrictive of the two. The full text of both is in [LICENSE.md](LICENSE.md).
62
+
63
+ The gamedata in `pack/` is Angband's, by Ben Harrison, James E. Wilson, Robert A.
64
+ Koeneke and the Angband contributors. The compiler and the pack format are by
65
+ neostryder / RPGM Tools.
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Gamedata compiler CLI.
3
+ *
4
+ * Reads reference/lib/gamedata/<file>.txt (Angband 4.2.6, the read-only
5
+ * source of truth) and emits packages/content/pack/<file>.json plus a
6
+ * pack manifest. Run from the built output: `pnpm --filter
7
+ * @rpgm-tools/neo-angband-content compile` (or `node dist/compile.js`).
8
+ */
9
+ export declare function main(): void;
10
+ //# sourceMappingURL=compile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../src/compile.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAiBH,wBAAgB,IAAI,IAAI,IAAI,CA4B3B"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Gamedata compiler CLI.
3
+ *
4
+ * Reads reference/lib/gamedata/<file>.txt (Angband 4.2.6, the read-only
5
+ * source of truth) and emits packages/content/pack/<file>.json plus a
6
+ * pack manifest. Run from the built output: `pnpm --filter
7
+ * @rpgm-tools/neo-angband-content compile` (or `node dist/compile.js`).
8
+ */
9
+ import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
10
+ import path from "node:path";
11
+ import { fileURLToPath } from "node:url";
12
+ import { compileGamedata } from "./records.js";
13
+ import { gamedataSpecs } from "./specs/index.js";
14
+ export function main() {
15
+ const here = path.dirname(fileURLToPath(import.meta.url));
16
+ const contentRoot = path.resolve(here, "..");
17
+ const repoRoot = path.resolve(contentRoot, "..", "..");
18
+ const gamedataDir = path.join(repoRoot, "reference", "lib", "gamedata");
19
+ const packDir = path.join(contentRoot, "pack");
20
+ mkdirSync(packDir, { recursive: true });
21
+ const files = [];
22
+ for (const spec of gamedataSpecs) {
23
+ const sourcePath = path.join(gamedataDir, `${spec.name}.txt`);
24
+ const text = readFileSync(sourcePath, "utf8");
25
+ const compiled = compileGamedata(text, spec);
26
+ const outName = `${spec.name}.json`;
27
+ writeFileSync(path.join(packDir, outName), `${JSON.stringify(compiled, null, 2)}\n`);
28
+ files.push(outName);
29
+ console.log(`${outName}: ${compiled.records.length} records`);
30
+ }
31
+ const manifest = {
32
+ id: "core",
33
+ name: "Angband",
34
+ version: "4.2.6",
35
+ engine: ">=0.1.0",
36
+ files,
37
+ };
38
+ writeFileSync(path.join(packDir, "manifest.json"), `${JSON.stringify(manifest, null, 2)}\n`);
39
+ console.log(`manifest.json: ${files.length} files`);
40
+ }
41
+ main();
42
+ //# sourceMappingURL=compile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compile.js","sourceRoot":"","sources":["../src/compile.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACjE,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAUjD,MAAM,UAAU,IAAI;IAClB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1D,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACvD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;IACxE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAC/C,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAExC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;QACjC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,IAAI,MAAM,CAAC,CAAC;QAC9D,MAAM,IAAI,GAAG,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAC9C,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,GAAG,IAAI,CAAC,IAAI,OAAO,CAAC;QACpC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QACrF,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,KAAK,QAAQ,CAAC,OAAO,CAAC,MAAM,UAAU,CAAC,CAAC;IAChE,CAAC;IAED,MAAM,QAAQ,GAAa;QACzB,EAAE,EAAE,MAAM;QACV,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,OAAO;QAChB,MAAM,EAAE,SAAS;QACjB,KAAK;KACN,CAAC;IACF,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IAC7F,OAAO,CAAC,GAAG,CAAC,kBAAkB,KAAK,CAAC,MAAM,QAAQ,CAAC,CAAC;AACtD,CAAC;AAED,IAAI,EAAE,CAAC"}
@@ -0,0 +1,105 @@
1
+ /**
2
+ * Independent gamedata re-parser for W5 data-exactness.
3
+ *
4
+ * Deliberately does NOT import packages/content's parseLine / compileGamedata.
5
+ * Line-level semantics follow reference/src/parser.c (Angband 4.2.6);
6
+ * record assembly follows the C init parsers' attach/repeat idioms as
7
+ * documented in reference/src/{parser,parse,init,mon-init,obj-init}.c.
8
+ *
9
+ * Format registration data (parser_reg format strings + which directives
10
+ * repeat / nest) is supplied by the caller so this module stays free of
11
+ * packages/content's parser implementation. Because that metadata is itself
12
+ * port-supplied, extractParserRegFormats() below lets the caller check the
13
+ * format strings back against reference/src/*.c rather than trusting them.
14
+ */
15
+ export type FieldType = "int" | "uint" | "sym" | "str" | "char" | "rand";
16
+ export interface FieldSpec {
17
+ readonly type: FieldType;
18
+ readonly name: string;
19
+ readonly optional: boolean;
20
+ }
21
+ export interface DirectiveSignature {
22
+ readonly directive: string;
23
+ readonly fields: readonly FieldSpec[];
24
+ }
25
+ export interface DirectiveDef {
26
+ readonly fmt: string;
27
+ readonly repeat?: boolean;
28
+ readonly childOf?: readonly string[];
29
+ /**
30
+ * Synthetic key that records the file order of a cross-directive repeat
31
+ * group. C keeps such groups in one linked list (e.g. monster_drop, built by
32
+ * prepending in parse_monster_drop / parse_monster_drop_base), so splitting
33
+ * them into per-directive arrays would lose the interleaving. There is no
34
+ * upstream directive of this name; the key is generated, and every generated
35
+ * key must be declared here so the coverage guard can see it.
36
+ */
37
+ readonly orderKey?: string;
38
+ }
39
+ export interface FileSpec {
40
+ readonly name: string;
41
+ readonly recordStart: string | null;
42
+ readonly header?: readonly string[];
43
+ readonly directives: readonly DirectiveDef[];
44
+ }
45
+ export type JsonPrimitive = string | number | boolean;
46
+ export type JsonValue = JsonPrimitive | JsonValue[] | {
47
+ [key: string]: JsonValue;
48
+ };
49
+ export type JsonObject = {
50
+ [key: string]: JsonValue;
51
+ };
52
+ export interface CompiledFile {
53
+ file: string;
54
+ source: string;
55
+ header?: JsonObject;
56
+ records: JsonObject[];
57
+ }
58
+ /**
59
+ * Faithful reimplementation of parse_random() from reference/src/parser.c.
60
+ * Validity only; the raw dice string is what gets stored.
61
+ */
62
+ export declare function independentIsValidRandom(s: string): boolean;
63
+ export declare function independentParseSignature(fmt: string): DirectiveSignature;
64
+ interface LineValues {
65
+ directive: string;
66
+ values: Record<string, string | number>;
67
+ }
68
+ /**
69
+ * Parse one physical line. Returns null for blanks/comments.
70
+ * Tokenizer mirrors strtok(":") for non-str/char and rest-of-line for str.
71
+ */
72
+ export declare function independentParseLine(line: string, lookup: (directive: string) => DirectiveSignature | undefined): LineValues | null;
73
+ /** Split a flags: payload the way C does: strtok(flags, " |"). */
74
+ export declare function splitFlagList(raw: string): string[];
75
+ /**
76
+ * Compile one gamedata file text into the same JSON shape as pack/*.json.
77
+ * Engine is independent of packages/content/src/{parser,records}.ts.
78
+ */
79
+ export declare function independentCompile(text: string, spec: FileSpec): CompiledFile;
80
+ /**
81
+ * The directive of every data line in a gamedata file, in file order.
82
+ *
83
+ * Mirrors the front of parser_parse(): skip leading isspace, drop blank and '#'
84
+ * lines, then take the first strtok(line, ":") token (strtok skips a run of
85
+ * leading delimiters). Deliberately does no field parsing, so it is an
86
+ * independent check on the record splitter and the directive table.
87
+ */
88
+ export declare function extractDirectiveSequence(text: string): string[];
89
+ /** Every directive key that occurs in a gamedata file, with its line count. */
90
+ export declare function extractDirectiveKeys(text: string): Map<string, number>;
91
+ /**
92
+ * parse_specs() tokenizes the format string with strtok(fmt, " "), so runs of
93
+ * whitespace collapse and leading/trailing whitespace is insignificant.
94
+ */
95
+ export declare function normalizeFormat(fmt: string): string;
96
+ /**
97
+ * Every format string handed to parser_reg() in a C source file, normalized.
98
+ *
99
+ * Adjacent string literals are concatenated the way the C compiler does, so
100
+ * registrations wrapped across source lines (e.g. init.c's melee-critical-level)
101
+ * come back as the single format string parse_specs() actually sees.
102
+ */
103
+ export declare function extractParserRegFormats(source: string): string[];
104
+ export {};
105
+ //# sourceMappingURL=data-exactness.reader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-exactness.reader.d.ts","sourceRoot":"","sources":["../src/data-exactness.reader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;AAEzE,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,SAAS,SAAS,EAAE,CAAC;CACvC;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC;;;;;;;OAOG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,UAAU,EAAE,SAAS,YAAY,EAAE,CAAC;CAC9C;AAED,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AACtD,MAAM,MAAM,SAAS,GAAG,aAAa,GAAG,SAAS,EAAE,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AACnF,MAAM,MAAM,UAAU,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AAEtD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,OAAO,EAAE,UAAU,EAAE,CAAC;CACvB;AA+DD;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CA6D3D;AAED,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,MAAM,GAAG,kBAAkB,CAoBzE;AAED,UAAU,UAAU;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;CACzC;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,kBAAkB,GAAG,SAAS,GAC5D,UAAU,GAAG,IAAI,CAsEnB;AAED,kEAAkE;AAClE,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAWnD;AA0ED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,YAAY,CA0F7E;AAED;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAiB/D;AAED,+EAA+E;AAC/E,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAMtE;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CA8BhE"}