@react-text-game/core 0.1.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 (178) hide show
  1. package/README.md +744 -0
  2. package/dist/baseGameObject.d.ts +90 -0
  3. package/dist/baseGameObject.d.ts.map +1 -0
  4. package/dist/baseGameObject.js +109 -0
  5. package/dist/baseGameObject.js.map +1 -0
  6. package/dist/constants.d.ts +12 -0
  7. package/dist/constants.d.ts.map +1 -0
  8. package/dist/constants.js +12 -0
  9. package/dist/constants.js.map +1 -0
  10. package/dist/game.d.ts +294 -0
  11. package/dist/game.d.ts.map +1 -0
  12. package/dist/game.js +489 -0
  13. package/dist/game.js.map +1 -0
  14. package/dist/helpers.d.ts +2 -0
  15. package/dist/helpers.d.ts.map +1 -0
  16. package/dist/helpers.js +6 -0
  17. package/dist/helpers.js.map +1 -0
  18. package/dist/hooks/index.d.ts +4 -0
  19. package/dist/hooks/index.d.ts.map +1 -0
  20. package/dist/hooks/index.js +4 -0
  21. package/dist/hooks/index.js.map +1 -0
  22. package/dist/hooks/useCurrentPassage.d.ts +10 -0
  23. package/dist/hooks/useCurrentPassage.d.ts.map +1 -0
  24. package/dist/hooks/useCurrentPassage.js +17 -0
  25. package/dist/hooks/useCurrentPassage.js.map +1 -0
  26. package/dist/hooks/useGameEntity.d.ts +21 -0
  27. package/dist/hooks/useGameEntity.d.ts.map +1 -0
  28. package/dist/hooks/useGameEntity.js +70 -0
  29. package/dist/hooks/useGameEntity.js.map +1 -0
  30. package/dist/hooks/useGameIsStarted.d.ts +12 -0
  31. package/dist/hooks/useGameIsStarted.d.ts.map +1 -0
  32. package/dist/hooks/useGameIsStarted.js +18 -0
  33. package/dist/hooks/useGameIsStarted.js.map +1 -0
  34. package/dist/index.d.ts +12 -0
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/index.js +10 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/logger.d.ts +8 -0
  39. package/dist/logger.d.ts.map +1 -0
  40. package/dist/logger.js +36 -0
  41. package/dist/logger.js.map +1 -0
  42. package/dist/options.d.ts +13 -0
  43. package/dist/options.d.ts.map +1 -0
  44. package/dist/options.js +15 -0
  45. package/dist/options.js.map +1 -0
  46. package/dist/passages/interactiveMap/fabric.d.ts +4 -0
  47. package/dist/passages/interactiveMap/fabric.d.ts.map +1 -0
  48. package/dist/passages/interactiveMap/fabric.js +3 -0
  49. package/dist/passages/interactiveMap/fabric.js.map +1 -0
  50. package/dist/passages/interactiveMap/index.d.ts +4 -0
  51. package/dist/passages/interactiveMap/index.d.ts.map +1 -0
  52. package/dist/passages/interactiveMap/index.js +4 -0
  53. package/dist/passages/interactiveMap/index.js.map +1 -0
  54. package/dist/passages/interactiveMap/interactiveMap.d.ts +89 -0
  55. package/dist/passages/interactiveMap/interactiveMap.d.ts.map +1 -0
  56. package/dist/passages/interactiveMap/interactiveMap.js +103 -0
  57. package/dist/passages/interactiveMap/interactiveMap.js.map +1 -0
  58. package/dist/passages/interactiveMap/types.d.ts +822 -0
  59. package/dist/passages/interactiveMap/types.d.ts.map +1 -0
  60. package/dist/passages/interactiveMap/types.js +2 -0
  61. package/dist/passages/interactiveMap/types.js.map +1 -0
  62. package/dist/passages/passage.d.ts +57 -0
  63. package/dist/passages/passage.d.ts.map +1 -0
  64. package/dist/passages/passage.js +64 -0
  65. package/dist/passages/passage.js.map +1 -0
  66. package/dist/passages/story/fabric.d.ts +4 -0
  67. package/dist/passages/story/fabric.d.ts.map +1 -0
  68. package/dist/passages/story/fabric.js +3 -0
  69. package/dist/passages/story/fabric.js.map +1 -0
  70. package/dist/passages/story/index.d.ts +5 -0
  71. package/dist/passages/story/index.d.ts.map +1 -0
  72. package/dist/passages/story/index.js +5 -0
  73. package/dist/passages/story/index.js.map +1 -0
  74. package/dist/passages/story/start.d.ts +14 -0
  75. package/dist/passages/story/start.d.ts.map +1 -0
  76. package/dist/passages/story/start.js +22 -0
  77. package/dist/passages/story/start.js.map +1 -0
  78. package/dist/passages/story/story.d.ts +84 -0
  79. package/dist/passages/story/story.d.ts.map +1 -0
  80. package/dist/passages/story/story.js +88 -0
  81. package/dist/passages/story/story.js.map +1 -0
  82. package/dist/passages/story/types.d.ts +911 -0
  83. package/dist/passages/story/types.d.ts.map +1 -0
  84. package/dist/passages/story/types.js +2 -0
  85. package/dist/passages/story/types.js.map +1 -0
  86. package/dist/passages/types/index.d.ts +3 -0
  87. package/dist/passages/types/index.d.ts.map +1 -0
  88. package/dist/passages/types/index.js +2 -0
  89. package/dist/passages/types/index.js.map +1 -0
  90. package/dist/passages/widget.d.ts +62 -0
  91. package/dist/passages/widget.d.ts.map +1 -0
  92. package/dist/passages/widget.js +66 -0
  93. package/dist/passages/widget.js.map +1 -0
  94. package/dist/saves/constants.d.ts +17 -0
  95. package/dist/saves/constants.d.ts.map +1 -0
  96. package/dist/saves/constants.js +17 -0
  97. package/dist/saves/constants.js.map +1 -0
  98. package/dist/saves/db.d.ts +119 -0
  99. package/dist/saves/db.d.ts.map +1 -0
  100. package/dist/saves/db.js +231 -0
  101. package/dist/saves/db.js.map +1 -0
  102. package/dist/saves/helpers.d.ts +28 -0
  103. package/dist/saves/helpers.d.ts.map +1 -0
  104. package/dist/saves/helpers.js +84 -0
  105. package/dist/saves/helpers.js.map +1 -0
  106. package/dist/saves/hooks/index.d.ts +10 -0
  107. package/dist/saves/hooks/index.d.ts.map +1 -0
  108. package/dist/saves/hooks/index.js +10 -0
  109. package/dist/saves/hooks/index.js.map +1 -0
  110. package/dist/saves/hooks/useDeleteAllSlots.d.ts +18 -0
  111. package/dist/saves/hooks/useDeleteAllSlots.d.ts.map +1 -0
  112. package/dist/saves/hooks/useDeleteAllSlots.js +18 -0
  113. package/dist/saves/hooks/useDeleteAllSlots.js.map +1 -0
  114. package/dist/saves/hooks/useDeleteGame.d.ts +22 -0
  115. package/dist/saves/hooks/useDeleteGame.d.ts.map +1 -0
  116. package/dist/saves/hooks/useDeleteGame.js +33 -0
  117. package/dist/saves/hooks/useDeleteGame.js.map +1 -0
  118. package/dist/saves/hooks/useExportSaves.d.ts +27 -0
  119. package/dist/saves/hooks/useExportSaves.d.ts.map +1 -0
  120. package/dist/saves/hooks/useExportSaves.js +54 -0
  121. package/dist/saves/hooks/useExportSaves.js.map +1 -0
  122. package/dist/saves/hooks/useImportSaves.d.ts +29 -0
  123. package/dist/saves/hooks/useImportSaves.d.ts.map +1 -0
  124. package/dist/saves/hooks/useImportSaves.js +108 -0
  125. package/dist/saves/hooks/useImportSaves.js.map +1 -0
  126. package/dist/saves/hooks/useLastLoadGame.d.ts +39 -0
  127. package/dist/saves/hooks/useLastLoadGame.d.ts.map +1 -0
  128. package/dist/saves/hooks/useLastLoadGame.js +72 -0
  129. package/dist/saves/hooks/useLastLoadGame.js.map +1 -0
  130. package/dist/saves/hooks/useLoadGame.d.ts +22 -0
  131. package/dist/saves/hooks/useLoadGame.d.ts.map +1 -0
  132. package/dist/saves/hooks/useLoadGame.js +40 -0
  133. package/dist/saves/hooks/useLoadGame.js.map +1 -0
  134. package/dist/saves/hooks/useRestartGame.d.ts +20 -0
  135. package/dist/saves/hooks/useRestartGame.d.ts.map +1 -0
  136. package/dist/saves/hooks/useRestartGame.js +29 -0
  137. package/dist/saves/hooks/useRestartGame.js.map +1 -0
  138. package/dist/saves/hooks/useSaveGame.d.ts +22 -0
  139. package/dist/saves/hooks/useSaveGame.d.ts.map +1 -0
  140. package/dist/saves/hooks/useSaveGame.js +34 -0
  141. package/dist/saves/hooks/useSaveGame.js.map +1 -0
  142. package/dist/saves/hooks/useSaveSlots.d.ts +45 -0
  143. package/dist/saves/hooks/useSaveSlots.d.ts.map +1 -0
  144. package/dist/saves/hooks/useSaveSlots.js +42 -0
  145. package/dist/saves/hooks/useSaveSlots.js.map +1 -0
  146. package/dist/saves/index.d.ts +4 -0
  147. package/dist/saves/index.d.ts.map +1 -0
  148. package/dist/saves/index.js +3 -0
  149. package/dist/saves/index.js.map +1 -0
  150. package/dist/saves/types.d.ts +52 -0
  151. package/dist/saves/types.d.ts.map +1 -0
  152. package/dist/saves/types.js +2 -0
  153. package/dist/saves/types.js.map +1 -0
  154. package/dist/storage.d.ts +124 -0
  155. package/dist/storage.d.ts.map +1 -0
  156. package/dist/storage.js +229 -0
  157. package/dist/storage.js.map +1 -0
  158. package/dist/tests/game.test.d.ts +2 -0
  159. package/dist/tests/game.test.d.ts.map +1 -0
  160. package/dist/tests/game.test.js +602 -0
  161. package/dist/tests/game.test.js.map +1 -0
  162. package/dist/tests/interactiveMap.test.d.ts +2 -0
  163. package/dist/tests/interactiveMap.test.d.ts.map +1 -0
  164. package/dist/tests/interactiveMap.test.js +1003 -0
  165. package/dist/tests/interactiveMap.test.js.map +1 -0
  166. package/dist/tests/storage.test.d.ts +2 -0
  167. package/dist/tests/storage.test.d.ts.map +1 -0
  168. package/dist/tests/storage.test.js +328 -0
  169. package/dist/tests/storage.test.js.map +1 -0
  170. package/dist/tests/story.test.d.ts +2 -0
  171. package/dist/tests/story.test.d.ts.map +1 -0
  172. package/dist/tests/story.test.js +698 -0
  173. package/dist/tests/story.test.js.map +1 -0
  174. package/dist/types.d.ts +19 -0
  175. package/dist/types.d.ts.map +1 -0
  176. package/dist/types.js +2 -0
  177. package/dist/types.js.map +1 -0
  178. package/package.json +60 -0
@@ -0,0 +1,602 @@
1
+ import { afterEach, beforeEach, describe, expect, test } from "bun:test";
2
+ import { BaseGameObject } from "../baseGameObject";
3
+ import { SYSTEM_PASSAGE_NAMES } from "../constants";
4
+ import { Game } from "../game";
5
+ import { Passage } from "../passages/passage";
6
+ import { Storage } from "../storage";
7
+ // Create a mock storage that properly handles setState/getState
8
+ class MockStorage {
9
+ static state = {};
10
+ static getValue(jsonPath) {
11
+ // Simple implementation that handles our test cases
12
+ const path = jsonPath.replace(/^\$\./, "").split(".");
13
+ let current = this.state;
14
+ for (const key of path) {
15
+ if (current && typeof current === "object" && key in current) {
16
+ current = current[key];
17
+ }
18
+ else {
19
+ return [];
20
+ }
21
+ }
22
+ return [current];
23
+ }
24
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
25
+ static setValue(jsonPath, value, _isSystem = false) {
26
+ const path = jsonPath.replace(/^\$\./, "").split(".");
27
+ let current = this.state;
28
+ for (let i = 0; i < path.length - 1; i++) {
29
+ const key = path[i];
30
+ if (!(key in current)) {
31
+ current[key] = {};
32
+ }
33
+ current = current[key];
34
+ }
35
+ current[path[path.length - 1]] = value;
36
+ }
37
+ static getState() {
38
+ // Return a deep clone to avoid reference issues
39
+ return JSON.parse(JSON.stringify(this.state));
40
+ }
41
+ static setState(state) {
42
+ // Deep clone the incoming state to avoid reference issues
43
+ this.state = JSON.parse(JSON.stringify(state));
44
+ }
45
+ static reset() {
46
+ this.state = {};
47
+ }
48
+ }
49
+ // Test helper classes
50
+ class TestEntity extends BaseGameObject {
51
+ constructor(id, health = 100, name = "Test") {
52
+ super({
53
+ id,
54
+ variables: { health, name },
55
+ });
56
+ }
57
+ // Provide methods to modify state for testing
58
+ setHealth(value) {
59
+ this._variables.health = value;
60
+ }
61
+ setName(value) {
62
+ this._variables.name = value;
63
+ }
64
+ getHealth() {
65
+ return this._variables.health;
66
+ }
67
+ getName() {
68
+ return this._variables.name;
69
+ }
70
+ }
71
+ class TestPassage extends Passage {
72
+ constructor(id) {
73
+ super(id, "widget");
74
+ }
75
+ display() {
76
+ return { content: `Passage: ${this.id}` };
77
+ }
78
+ }
79
+ // Counter for unique IDs
80
+ let testCounter = 0;
81
+ function uniqueId(prefix) {
82
+ return `${prefix}-${testCounter++}`;
83
+ }
84
+ // Store original Storage methods
85
+ const originalStorageMethods = {
86
+ getValue: Storage.getValue.bind(Storage),
87
+ setValue: Storage.setValue.bind(Storage),
88
+ getState: Storage.getState.bind(Storage),
89
+ setState: Storage.setState.bind(Storage),
90
+ };
91
+ describe("Game", () => {
92
+ beforeEach(async () => {
93
+ // Replace Storage methods with MockStorage
94
+ Storage.getValue = MockStorage.getValue.bind(MockStorage);
95
+ Storage.setValue = MockStorage.setValue.bind(MockStorage);
96
+ Storage.getState = MockStorage.getState.bind(MockStorage);
97
+ Storage.setState = MockStorage.setState.bind(MockStorage);
98
+ // Reset mock storage
99
+ MockStorage.reset();
100
+ // Clear session storage
101
+ sessionStorage.clear();
102
+ // Re-initialize the game for each test
103
+ await Game.init({ gameName: "Test Game", isDevMode: true });
104
+ });
105
+ afterEach(() => {
106
+ // Reset game state after each test to ensure clean state
107
+ Game._resetForTesting();
108
+ // Reset mock storage
109
+ MockStorage.reset();
110
+ // Restore original Storage methods
111
+ Storage.getValue = originalStorageMethods.getValue;
112
+ Storage.setValue = originalStorageMethods.setValue;
113
+ Storage.getState = originalStorageMethods.getState;
114
+ Storage.setState = originalStorageMethods.setState;
115
+ });
116
+ describe("Initialization", () => {
117
+ test("sets default options on init", () => {
118
+ expect(Game.options.gameName).toBe("Test Game");
119
+ expect(Game.options.gameVersion).toBe("1.0.0");
120
+ });
121
+ test("sets custom options on init", async () => {
122
+ await Game.init({
123
+ gameName: "Custom Game",
124
+ gameId: "custom-id",
125
+ description: "Test description",
126
+ gameVersion: "2.0.0",
127
+ author: "Test Author",
128
+ isDevMode: true,
129
+ });
130
+ expect(Game.options.gameName).toBe("Custom Game");
131
+ expect(Game.options.gameId).toBe("custom-id");
132
+ expect(Game.options.description).toBe("Test description");
133
+ expect(Game.options.gameVersion).toBe("2.0.0");
134
+ expect(Game.options.author).toBe("Test Author");
135
+ expect(Game.options.isDevMode).toBe(true);
136
+ });
137
+ test("sets start menu as current passage on init", () => {
138
+ expect(Game.selfState.currentPassageId).toBe(SYSTEM_PASSAGE_NAMES.START_MENU);
139
+ });
140
+ });
141
+ describe("Entity Registration", () => {
142
+ test("registers a single entity", () => {
143
+ const entity = new TestEntity(uniqueId("player"));
144
+ // Entity should be registered (constructor calls registerEntity)
145
+ const proxied = Game._getProxiedObject(entity);
146
+ expect(proxied).toBeDefined();
147
+ expect(proxied.id).toBe(entity.id);
148
+ });
149
+ test("registers multiple entities", () => {
150
+ const player = new TestEntity(uniqueId("player"));
151
+ const enemy = new TestEntity(uniqueId("enemy"));
152
+ const allEntities = Game._getAllProxiedObjects();
153
+ expect(allEntities.length).toBeGreaterThanOrEqual(2);
154
+ const playerProxy = Game._getProxiedObject(player);
155
+ const enemyProxy = Game._getProxiedObject(enemy);
156
+ expect(playerProxy.id).toBe(player.id);
157
+ expect(enemyProxy.id).toBe(enemy.id);
158
+ });
159
+ test("throws error when registering duplicate entity", () => {
160
+ const id = uniqueId("duplicate");
161
+ new TestEntity(id);
162
+ expect(() => {
163
+ new TestEntity(id);
164
+ }).toThrow(`Object "${id}" is already registered`);
165
+ });
166
+ test("proxies entities with Valtio", () => {
167
+ const entity = new TestEntity(uniqueId("player"));
168
+ const proxied = Game._getProxiedObject(entity);
169
+ // Proxied object should be reactive
170
+ proxied.setHealth(50);
171
+ expect(entity.getHealth()).toBe(50);
172
+ });
173
+ });
174
+ describe("Passage Registration", () => {
175
+ test("registers a single passage", () => {
176
+ const passageId = uniqueId("intro");
177
+ new TestPassage(passageId);
178
+ const retrieved = Game.getPassageById(passageId);
179
+ expect(retrieved).not.toBeNull();
180
+ expect(retrieved?.id).toBe(passageId);
181
+ });
182
+ test("registers multiple passages", () => {
183
+ const id1 = uniqueId("intro");
184
+ const id2 = uniqueId("chapter1");
185
+ const id3 = uniqueId("chapter2");
186
+ new TestPassage(id1);
187
+ new TestPassage(id2);
188
+ new TestPassage(id3);
189
+ const allPassages = Game.getAllPassages();
190
+ expect(allPassages.length).toBeGreaterThanOrEqual(3);
191
+ const intro = Game.getPassageById(id1);
192
+ const chapter1 = Game.getPassageById(id2);
193
+ expect(intro?.id).toBe(id1);
194
+ expect(chapter1?.id).toBe(id2);
195
+ });
196
+ test("throws error when registering duplicate non-system passage", () => {
197
+ const id = uniqueId("intro");
198
+ new TestPassage(id);
199
+ expect(() => {
200
+ new TestPassage(id);
201
+ }).toThrow(`Passage "${id}" is already registered`);
202
+ });
203
+ test("allows re-registration of system passages", () => {
204
+ const systemPassage1 = new TestPassage(SYSTEM_PASSAGE_NAMES.START_MENU);
205
+ const systemPassage2 = new TestPassage(SYSTEM_PASSAGE_NAMES.START_MENU);
206
+ // Should not throw
207
+ expect(systemPassage1.id).toBe(SYSTEM_PASSAGE_NAMES.START_MENU);
208
+ expect(systemPassage2.id).toBe(SYSTEM_PASSAGE_NAMES.START_MENU);
209
+ });
210
+ test("returns iterator of registered passages", () => {
211
+ // Create some passages first
212
+ new TestPassage(uniqueId("p1"));
213
+ new TestPassage(uniqueId("p2"));
214
+ const iterator = Game.registeredPassages;
215
+ const passages = Array.from(iterator);
216
+ expect(passages.length).toBeGreaterThanOrEqual(2);
217
+ });
218
+ });
219
+ describe("Navigation", () => {
220
+ test("jumps to passage by string id", () => {
221
+ const passageId = uniqueId("intro");
222
+ new TestPassage(passageId);
223
+ Game.jumpTo(passageId);
224
+ expect(Game.selfState.currentPassageId).toBe(passageId);
225
+ });
226
+ test("jumps to passage by object", () => {
227
+ const passageId = uniqueId("intro");
228
+ const passage = new TestPassage(passageId);
229
+ Game.jumpTo(passage);
230
+ expect(Game.selfState.currentPassageId).toBe(passageId);
231
+ });
232
+ test("throws error when jumping to non-existent passage", () => {
233
+ expect(() => {
234
+ Game.jumpTo("nonexistent");
235
+ }).toThrow('Passage "nonexistent" not found');
236
+ });
237
+ test("sets current passage without validation", () => {
238
+ Game.setCurrent("any-passage-id");
239
+ expect(Game.selfState.currentPassageId).toBe("any-passage-id");
240
+ });
241
+ test("currentPassage returns null when no current passage exists", () => {
242
+ Game.setCurrent("nonexistent");
243
+ const current = Game.currentPassage;
244
+ expect(current).toBeNull();
245
+ });
246
+ test("currentPassage returns passage object when set", () => {
247
+ const passageId = uniqueId("intro");
248
+ const passage = new TestPassage(passageId);
249
+ Game.jumpTo(passage);
250
+ const current = Game.currentPassage;
251
+ expect(current).not.toBeNull();
252
+ expect(current?.id).toBe(passageId);
253
+ });
254
+ test("getPassageById returns null for non-existent passage", () => {
255
+ const passage = Game.getPassageById("nonexistent");
256
+ expect(passage).toBeNull();
257
+ });
258
+ test("getAllPassages returns array of all passages", () => {
259
+ // Create some passages first
260
+ new TestPassage(uniqueId("p1"));
261
+ new TestPassage(uniqueId("p2"));
262
+ new TestPassage(uniqueId("p3"));
263
+ const passages = Game.getAllPassages();
264
+ expect(Array.isArray(passages)).toBe(true);
265
+ expect(passages.length).toBeGreaterThanOrEqual(3);
266
+ });
267
+ });
268
+ describe("State Management", () => {
269
+ test("getState captures complete game state", () => {
270
+ const passageId = uniqueId("intro");
271
+ new TestPassage(passageId);
272
+ Game.jumpTo(passageId);
273
+ const state = Game.getState();
274
+ expect(state).toBeDefined();
275
+ expect(typeof state).toBe("object");
276
+ });
277
+ test("getState includes Game's internal state", () => {
278
+ const passageId = uniqueId("intro");
279
+ new TestPassage(passageId);
280
+ Game.jumpTo(passageId);
281
+ const state = Game.getState();
282
+ // Should have system data
283
+ expect(state).toHaveProperty("_system");
284
+ expect(state._system).toHaveProperty("game");
285
+ // @ts-expect-error TS18046
286
+ expect(state._system.game.currentPassageId).toBe(passageId);
287
+ });
288
+ test("getState includes entity states", () => {
289
+ const entityId = uniqueId("player");
290
+ new TestEntity(entityId, 75, "Hero");
291
+ const state = Game.getState();
292
+ // Should have player data
293
+ expect(state).toHaveProperty(entityId);
294
+ expect(state[entityId]).toEqual({ health: 75, name: "Hero" });
295
+ });
296
+ test("setState restores complete game state", () => {
297
+ const entityId = uniqueId("player");
298
+ const passageId = uniqueId("intro");
299
+ const entity = new TestEntity(entityId, 100, "Hero");
300
+ new TestPassage(passageId);
301
+ Game.jumpTo(passageId);
302
+ const savedState = Game.getState();
303
+ // Change state
304
+ entity.setHealth(50);
305
+ Game.setCurrent(SYSTEM_PASSAGE_NAMES.START_MENU);
306
+ // Restore - NOTE: This may fail due to Storage system path handling issues
307
+ // when entity registries accumulate state from previous tests
308
+ Game.setState(savedState);
309
+ expect(entity.getHealth()).toBe(100);
310
+ expect(Game.selfState.currentPassageId).toBe(passageId);
311
+ });
312
+ test("setState restores entity variables", () => {
313
+ const playerId = uniqueId("player");
314
+ const enemyId = uniqueId("enemy");
315
+ const player = new TestEntity(playerId, 100, "Hero");
316
+ const enemy = new TestEntity(enemyId, 50, "Goblin");
317
+ const savedState = Game.getState();
318
+ // Modify entities
319
+ player.setHealth(25);
320
+ player.setName("Changed");
321
+ enemy.setHealth(10);
322
+ // Restore
323
+ Game.setState(savedState);
324
+ expect(player.getHealth()).toBe(100);
325
+ expect(player.getName()).toBe("Hero");
326
+ expect(enemy.getHealth()).toBe(50);
327
+ expect(enemy.getName()).toBe("Goblin");
328
+ });
329
+ test("state is serializable", () => {
330
+ const entityId = uniqueId("player");
331
+ const passageId = uniqueId("intro");
332
+ new TestEntity(entityId, 100, "Hero");
333
+ new TestPassage(passageId);
334
+ Game.jumpTo(passageId);
335
+ const state = Game.getState();
336
+ const serialized = JSON.stringify(state);
337
+ const deserialized = JSON.parse(serialized);
338
+ expect(deserialized).toEqual(state);
339
+ });
340
+ });
341
+ describe("Auto-save", () => {
342
+ test("enableAutoSave enables auto-saving", async () => {
343
+ const entityId = uniqueId("player");
344
+ const entity = new TestEntity(entityId);
345
+ // Enable auto-save explicitly
346
+ Game.enableAutoSave();
347
+ // Clear session storage to test
348
+ sessionStorage.clear();
349
+ // Change state
350
+ entity.setHealth(50);
351
+ // Wait for debounce
352
+ await new Promise((resolve) => setTimeout(resolve, 600));
353
+ const saved = sessionStorage.getItem("gameAutoSave");
354
+ // When explicitly enabled, auto-save should work even in dev mode
355
+ expect(saved).not.toBeNull();
356
+ });
357
+ test("disableAutoSave stops auto-saving", async () => {
358
+ const entityId = uniqueId("player");
359
+ const entity = new TestEntity(entityId);
360
+ // Disable auto-save
361
+ Game.disableAutoSave();
362
+ // Clear session storage
363
+ sessionStorage.clear();
364
+ // Change state
365
+ entity.setHealth(50);
366
+ // Wait for debounce
367
+ await new Promise((resolve) => setTimeout(resolve, 600));
368
+ const saved = sessionStorage.getItem("gameAutoSave");
369
+ expect(saved).toBeNull();
370
+ });
371
+ test("loadFromSessionStorage loads saved state", async () => {
372
+ const entityId = uniqueId("player");
373
+ const passageId = uniqueId("intro");
374
+ const entity = new TestEntity(entityId, 100, "Hero");
375
+ new TestPassage(passageId);
376
+ Game.jumpTo(passageId);
377
+ const state = Game.getState();
378
+ sessionStorage.setItem("gameAutoSave", JSON.stringify(state));
379
+ // Change state
380
+ entity.setHealth(50);
381
+ Game.setCurrent("different");
382
+ // Load from session storage
383
+ const loaded = Game.loadFromSessionStorage();
384
+ expect(loaded).toBe(true);
385
+ expect(entity.getHealth()).toBe(100);
386
+ expect(Game.selfState.currentPassageId).toBe(passageId);
387
+ });
388
+ test("loadFromSessionStorage returns false when no saved state", () => {
389
+ sessionStorage.clear();
390
+ const loaded = Game.loadFromSessionStorage();
391
+ expect(loaded).toBe(false);
392
+ });
393
+ test("loadFromSessionStorage returns false on invalid JSON", () => {
394
+ sessionStorage.setItem("gameAutoSave", "invalid json");
395
+ const loaded = Game.loadFromSessionStorage();
396
+ expect(loaded).toBe(false);
397
+ });
398
+ test("clearAutoSave removes session storage", () => {
399
+ sessionStorage.setItem("gameAutoSave", "test data");
400
+ Game.clearAutoSave();
401
+ const saved = sessionStorage.getItem("gameAutoSave");
402
+ expect(saved).toBeNull();
403
+ });
404
+ });
405
+ describe("Options Management", () => {
406
+ test("updateOptions updates game options", () => {
407
+ Game.updateOptions({
408
+ gameName: "Updated Game",
409
+ gameVersion: "3.0.0",
410
+ });
411
+ expect(Game.options.gameName).toBe("Updated Game");
412
+ expect(Game.options.gameVersion).toBe("3.0.0");
413
+ });
414
+ test("updateOptions preserves existing options", () => {
415
+ const originalAuthor = Game.options.author;
416
+ Game.updateOptions({
417
+ gameName: "Updated Game",
418
+ });
419
+ expect(Game.options.gameName).toBe("Updated Game");
420
+ expect(Game.options.author).toBe(originalAuthor);
421
+ });
422
+ });
423
+ describe("Integration Tests", () => {
424
+ test("complete game flow: init, create entities, navigate, save, load", async () => {
425
+ await Game.init({
426
+ gameName: "Adventure Game",
427
+ gameVersion: "1.0.0",
428
+ author: "Test Author",
429
+ isDevMode: true,
430
+ });
431
+ // Create entities
432
+ const playerId = uniqueId("player");
433
+ const enemyId = uniqueId("enemy");
434
+ const player = new TestEntity(playerId, 100, "Hero");
435
+ const enemy = new TestEntity(enemyId, 50, "Goblin");
436
+ // Create passages
437
+ const introId = uniqueId("intro");
438
+ const battleId = uniqueId("battle");
439
+ const victoryId = uniqueId("victory");
440
+ new TestPassage(introId);
441
+ new TestPassage(battleId);
442
+ new TestPassage(victoryId);
443
+ // Navigate
444
+ Game.jumpTo(introId);
445
+ expect(Game.currentPassage?.id).toBe(introId);
446
+ // Simulate game progress
447
+ Game.jumpTo(battleId);
448
+ player.setHealth(75);
449
+ enemy.setHealth(25);
450
+ // Save state
451
+ const savedState = Game.getState();
452
+ // Continue playing
453
+ Game.jumpTo(victoryId);
454
+ player.setHealth(100);
455
+ enemy.setHealth(0);
456
+ // Load saved state
457
+ Game.setState(savedState);
458
+ // Verify restoration
459
+ expect(Game.currentPassage?.id).toBe(battleId);
460
+ expect(player.getHealth()).toBe(75);
461
+ expect(enemy.getHealth()).toBe(25);
462
+ });
463
+ test("multiple save slots simulation", () => {
464
+ const playerId = uniqueId("player");
465
+ const player = new TestEntity(playerId, 100, "Hero");
466
+ const chapter1Id = uniqueId("chapter1");
467
+ const chapter2Id = uniqueId("chapter2");
468
+ const chapter3Id = uniqueId("chapter3");
469
+ new TestPassage(chapter1Id);
470
+ new TestPassage(chapter2Id);
471
+ new TestPassage(chapter3Id);
472
+ // Save slot 1 - Chapter 1
473
+ Game.jumpTo(chapter1Id);
474
+ player.setHealth(100);
475
+ const save1 = Game.getState();
476
+ // Save slot 2 - Chapter 2
477
+ Game.jumpTo(chapter2Id);
478
+ player.setHealth(80);
479
+ const save2 = Game.getState();
480
+ // Save slot 3 - Chapter 3
481
+ Game.jumpTo(chapter3Id);
482
+ player.setHealth(60);
483
+ const save3 = Game.getState();
484
+ // Load save 1
485
+ Game.setState(save1);
486
+ expect(Game.currentPassage?.id).toBe(chapter1Id);
487
+ expect(player.getHealth()).toBe(100);
488
+ // Load save 3
489
+ Game.setState(save3);
490
+ expect(Game.currentPassage?.id).toBe(chapter3Id);
491
+ expect(player.getHealth()).toBe(60);
492
+ // Load save 2
493
+ Game.setState(save2);
494
+ expect(Game.currentPassage?.id).toBe(chapter2Id);
495
+ expect(player.getHealth()).toBe(80);
496
+ });
497
+ test("entity state persistence across multiple changes", () => {
498
+ const playerId = uniqueId("player");
499
+ const player = new TestEntity(playerId, 100, "Hero");
500
+ // Make multiple changes
501
+ player.setHealth(90);
502
+ player.save();
503
+ player.setHealth(80);
504
+ player.save();
505
+ player.setName("Veteran Hero");
506
+ player.save();
507
+ const state = Game.getState();
508
+ // Change values
509
+ player.setHealth(10);
510
+ player.setName("Defeated");
511
+ // Restore
512
+ Game.setState(state);
513
+ expect(player.getHealth()).toBe(80);
514
+ expect(player.getName()).toBe("Veteran Hero");
515
+ });
516
+ });
517
+ describe("Edge Cases", () => {
518
+ test("handles empty game state", () => {
519
+ const state = Game.getState();
520
+ expect(state).toBeDefined();
521
+ expect(typeof state).toBe("object");
522
+ });
523
+ test("handles setState with minimal state", () => {
524
+ const minimalState = {
525
+ _system: {
526
+ game: {
527
+ currentPassageId: null,
528
+ },
529
+ },
530
+ };
531
+ Game.setState(minimalState);
532
+ expect(Game.selfState.currentPassageId).toBeNull();
533
+ });
534
+ test("entity with no variables", () => {
535
+ const entityId = uniqueId("empty");
536
+ new BaseGameObject({ id: entityId });
537
+ const state = Game.getState();
538
+ expect(state).toHaveProperty(entityId);
539
+ });
540
+ test("passage display throws error if not implemented", () => {
541
+ class IncompletePassage extends Passage {
542
+ constructor() {
543
+ super(uniqueId("incomplete"), "widget");
544
+ }
545
+ }
546
+ const passage = new IncompletePassage();
547
+ expect(() => {
548
+ passage.display();
549
+ }).toThrow("Display method not implemented");
550
+ });
551
+ test("multiple consecutive jumpTo calls", () => {
552
+ const id1 = uniqueId("p1");
553
+ const id2 = uniqueId("p2");
554
+ const id3 = uniqueId("p3");
555
+ new TestPassage(id1);
556
+ new TestPassage(id2);
557
+ new TestPassage(id3);
558
+ Game.jumpTo(id1);
559
+ Game.jumpTo(id2);
560
+ Game.jumpTo(id3);
561
+ expect(Game.currentPassage?.id).toBe(id3);
562
+ });
563
+ test("selfState provides access to internal state", () => {
564
+ const state = Game.selfState;
565
+ expect(state).toBeDefined();
566
+ expect(state).toHaveProperty("currentPassageId");
567
+ });
568
+ test("registering entity with special characters in id", () => {
569
+ const entityId = uniqueId("player_123");
570
+ const entity = new TestEntity(entityId);
571
+ const proxied = Game._getProxiedObject(entity);
572
+ expect(proxied.id).toBe(entityId);
573
+ });
574
+ test("state serialization with special values", () => {
575
+ class SpecialEntity extends BaseGameObject {
576
+ constructor(id) {
577
+ super({
578
+ id,
579
+ variables: {
580
+ emptyString: "",
581
+ zero: 0,
582
+ falseValue: false,
583
+ nullValue: null,
584
+ },
585
+ });
586
+ }
587
+ }
588
+ const entityId = uniqueId("special");
589
+ new SpecialEntity(entityId);
590
+ const state = Game.getState();
591
+ const serialized = JSON.stringify(state);
592
+ const deserialized = JSON.parse(serialized);
593
+ expect(deserialized[entityId]).toEqual({
594
+ emptyString: "",
595
+ zero: 0,
596
+ falseValue: false,
597
+ nullValue: null,
598
+ });
599
+ });
600
+ });
601
+ });
602
+ //# sourceMappingURL=game.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"game.test.js","sourceRoot":"","sources":["../../src/tests/game.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAEzE,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AAC7B,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAGnC,gEAAgE;AAChE,MAAM,WAAW;IACL,MAAM,CAAC,KAAK,GAAkB,EAAE,CAAC;IAEzC,MAAM,CAAC,QAAQ,CAAI,QAAgB;QAC/B,oDAAoD;QACpD,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACtD,IAAI,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC;QAEzB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACrB,IAAI,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,GAAG,IAAI,OAAO,EAAE,CAAC;gBAC3D,OAAO,GAAG,OAAO,CAAC,GAAG,CAAkB,CAAC;YAC5C,CAAC;iBAAM,CAAC;gBACJ,OAAO,EAAE,CAAC;YACd,CAAC;QACL,CAAC;QAED,OAAO,CAAC,OAAO,CAAa,CAAC;IACjC,CAAC;IAED,6DAA6D;IAC7D,MAAM,CAAC,QAAQ,CAAI,QAAgB,EAAE,KAAQ,EAAE,SAAS,GAAG,KAAK;QAC5D,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACtD,IAAI,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC;QAEzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACpB,IAAI,CAAC,CAAC,GAAI,IAAI,OAAO,CAAC,EAAE,CAAC;gBACrB,OAAO,CAAC,GAAI,CAAC,GAAG,EAAE,CAAC;YACvB,CAAC;YACD,OAAO,GAAG,OAAO,CAAC,GAAI,CAAkB,CAAC;QAC7C,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,GAAG,KAAK,CAAC;IAC5C,CAAC;IAED,MAAM,CAAC,QAAQ;QACX,gDAAgD;QAChD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAClD,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,KAAoB;QAChC,0DAA0D;QAC1D,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,CAAC,KAAK;QACR,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;IACpB,CAAC;;AAGL,sBAAsB;AACtB,MAAM,UAAW,SAAQ,cAAgD;IACrE,YAAY,EAAU,EAAE,MAAM,GAAG,GAAG,EAAE,IAAI,GAAG,MAAM;QAC/C,KAAK,CAAC;YACF,EAAE;YACF,SAAS,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;SAC9B,CAAC,CAAC;IACP,CAAC;IAED,8CAA8C;IAC9C,SAAS,CAAC,KAAa;QACnB,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,KAAK,CAAC;IACnC,CAAC;IAED,OAAO,CAAC,KAAa;QACjB,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,KAAK,CAAC;IACjC,CAAC;IAED,SAAS;QACL,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;IAClC,CAAC;IAED,OAAO;QACH,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;IAChC,CAAC;CACJ;AAED,MAAM,WAAY,SAAQ,OAAO;IAC7B,YAAY,EAAU;QAClB,KAAK,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;IACxB,CAAC;IAED,OAAO;QACH,OAAO,EAAE,OAAO,EAAE,YAAY,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC;IAC9C,CAAC;CACJ;AAED,yBAAyB;AACzB,IAAI,WAAW,GAAG,CAAC,CAAC;AACpB,SAAS,QAAQ,CAAC,MAAc;IAC5B,OAAO,GAAG,MAAM,IAAI,WAAW,EAAE,EAAE,CAAC;AACxC,CAAC;AAED,iCAAiC;AACjC,MAAM,sBAAsB,GAAG;IAC3B,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;IACxC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;IACxC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;IACxC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;CAC3C,CAAC;AAEF,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE;IAClB,UAAU,CAAC,KAAK,IAAI,EAAE;QAClB,2CAA2C;QAC3C,OAAO,CAAC,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC1D,OAAO,CAAC,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC1D,OAAO,CAAC,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC1D,OAAO,CAAC,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAE1D,qBAAqB;QACrB,WAAW,CAAC,KAAK,EAAE,CAAC;QAEpB,wBAAwB;QACxB,cAAc,CAAC,KAAK,EAAE,CAAC;QAEvB,uCAAuC;QACvC,MAAM,IAAI,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACX,yDAAyD;QACzD,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAExB,qBAAqB;QACrB,WAAW,CAAC,KAAK,EAAE,CAAC;QAEpB,mCAAmC;QACnC,OAAO,CAAC,QAAQ,GAAG,sBAAsB,CAAC,QAAQ,CAAC;QACnD,OAAO,CAAC,QAAQ,GAAG,sBAAsB,CAAC,QAAQ,CAAC;QACnD,OAAO,CAAC,QAAQ,GAAG,sBAAsB,CAAC,QAAQ,CAAC;QACnD,OAAO,CAAC,QAAQ,GAAG,sBAAsB,CAAC,QAAQ,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC5B,IAAI,CAAC,8BAA8B,EAAE,GAAG,EAAE;YACtC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAChD,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;YAC3C,MAAM,IAAI,CAAC,IAAI,CAAC;gBACZ,QAAQ,EAAE,aAAa;gBACvB,MAAM,EAAE,WAAW;gBACnB,WAAW,EAAE,kBAAkB;gBAC/B,WAAW,EAAE,OAAO;gBACpB,MAAM,EAAE,aAAa;gBACrB,SAAS,EAAE,IAAI;aAClB,CAAC,CAAC;YAEH,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAClD,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC9C,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YAC1D,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC/C,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAChD,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,4CAA4C,EAAE,GAAG,EAAE;YACpD,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC,IAAI,CACxC,oBAAoB,CAAC,UAAU,CAClC,CAAC;QACN,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;QACjC,IAAI,CAAC,2BAA2B,EAAE,GAAG,EAAE;YACnC,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;YAElD,iEAAiE;YACjE,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;YAC/C,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;YAC9B,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,6BAA6B,EAAE,GAAG,EAAE;YACrC,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;YAClD,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;YAEhD,MAAM,WAAW,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;YACjD,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;YAErD,MAAM,WAAW,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;YACnD,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAEjD,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACvC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,gDAAgD,EAAE,GAAG,EAAE;YACxD,MAAM,EAAE,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;YACjC,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;YAEnB,MAAM,CAAC,GAAG,EAAE;gBACR,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;YACvB,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,yBAAyB,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,8BAA8B,EAAE,GAAG,EAAE;YACtC,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;YAClD,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;YAE/C,oCAAoC;YACpC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YACtB,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAClC,IAAI,CAAC,4BAA4B,EAAE,GAAG,EAAE;YACpC,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;YACpC,IAAI,WAAW,CAAC,SAAS,CAAC,CAAC;YAE3B,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;YACjD,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;YACjC,MAAM,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,6BAA6B,EAAE,GAAG,EAAE;YACrC,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC9B,MAAM,GAAG,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;YACjC,MAAM,GAAG,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;YAEjC,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC;YACrB,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC;YACrB,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC;YAErB,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;YAC1C,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;YAErD,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;YACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;YAE1C,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC5B,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,4DAA4D,EAAE,GAAG,EAAE;YACpE,MAAM,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC7B,IAAI,WAAW,CAAC,EAAE,CAAC,CAAC;YAEpB,MAAM,CAAC,GAAG,EAAE;gBACR,IAAI,WAAW,CAAC,EAAE,CAAC,CAAC;YACxB,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,yBAAyB,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACnD,MAAM,cAAc,GAAG,IAAI,WAAW,CAClC,oBAAoB,CAAC,UAAU,CAClC,CAAC;YACF,MAAM,cAAc,GAAG,IAAI,WAAW,CAClC,oBAAoB,CAAC,UAAU,CAClC,CAAC;YAEF,mBAAmB;YACnB,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC;YAChE,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC;QACpE,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,6BAA6B;YAC7B,IAAI,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;YAChC,IAAI,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;YAEhC,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC;YACzC,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAEtC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;QACxB,IAAI,CAAC,+BAA+B,EAAE,GAAG,EAAE;YACvC,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;YACpC,IAAI,WAAW,CAAC,SAAS,CAAC,CAAC;YAE3B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAEvB,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,4BAA4B,EAAE,GAAG,EAAE;YACpC,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;YACpC,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,SAAS,CAAC,CAAC;YAE3C,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAErB,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,mDAAmD,EAAE,GAAG,EAAE;YAC3D,MAAM,CAAC,GAAG,EAAE;gBACR,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;YAC/B,CAAC,CAAC,CAAC,OAAO,CAAC,iCAAiC,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;YAElC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACnE,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,4DAA4D,EAAE,GAAG,EAAE;YACpE,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;YAE/B,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC;YACpC,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,gDAAgD,EAAE,GAAG,EAAE;YACxD,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;YACpC,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,SAAS,CAAC,CAAC;YAC3C,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAErB,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC;YACpC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;YAC/B,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,sDAAsD,EAAE,GAAG,EAAE;YAC9D,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;YACnD,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,8CAA8C,EAAE,GAAG,EAAE;YACtD,6BAA6B;YAC7B,IAAI,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;YAChC,IAAI,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;YAChC,IAAI,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;YAEhC,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;YACvC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC3C,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAC9B,IAAI,CAAC,uCAAuC,EAAE,GAAG,EAAE;YAC/C,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;YACpC,IAAI,WAAW,CAAC,SAAS,CAAC,CAAC;YAC3B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAEvB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YAE9B,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;YAC5B,MAAM,CAAC,OAAO,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;YACpC,IAAI,WAAW,CAAC,SAAS,CAAC,CAAC;YAC3B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAEvB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YAE9B,0BAA0B;YAC1B,MAAM,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;YACxC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;YAC7C,2BAA2B;YAC3B,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAChE,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,iCAAiC,EAAE,GAAG,EAAE;YACzC,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACpC,IAAI,UAAU,CAAC,QAAQ,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;YAErC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YAE9B,0BAA0B;YAC1B,MAAM,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;YACvC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,uCAAuC,EAAE,GAAG,EAAE;YAC/C,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACpC,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;YAEpC,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,QAAQ,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;YACrD,IAAI,WAAW,CAAC,SAAS,CAAC,CAAC;YAC3B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAEvB,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YAEnC,eAAe;YACf,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YACrB,IAAI,CAAC,UAAU,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC;YAEjD,2EAA2E;YAC3E,8DAA8D;YAC9D,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YAE1B,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACrC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,oCAAoC,EAAE,GAAG,EAAE;YAC5C,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACpC,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;YAElC,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,QAAQ,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;YACrD,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,OAAO,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAC;YAEpD,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YAEnC,kBAAkB;YAClB,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YACrB,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAC1B,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YAEpB,UAAU;YACV,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YAE1B,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACrC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACtC,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACnC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,uBAAuB,EAAE,GAAG,EAAE;YAC/B,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACpC,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;YAEpC,IAAI,UAAU,CAAC,QAAQ,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;YACtC,IAAI,WAAW,CAAC,SAAS,CAAC,CAAC;YAC3B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAEvB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC9B,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YACzC,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAkB,CAAC;YAE7D,MAAM,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;QACvB,IAAI,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;YAClD,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAEpC,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC;YAExC,8BAA8B;YAC9B,IAAI,CAAC,cAAc,EAAE,CAAC;YAEtB,gCAAgC;YAChC,cAAc,CAAC,KAAK,EAAE,CAAC;YAEvB,eAAe;YACf,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YAErB,oBAAoB;YACpB,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;YAEzD,MAAM,KAAK,GAAG,cAAc,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;YACrD,kEAAkE;YAClE,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QACjC,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;YACjD,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACpC,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC;YAExC,oBAAoB;YACpB,IAAI,CAAC,eAAe,EAAE,CAAC;YAEvB,wBAAwB;YACxB,cAAc,CAAC,KAAK,EAAE,CAAC;YAEvB,eAAe;YACf,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YAErB,oBAAoB;YACpB,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;YAEzD,MAAM,KAAK,GAAG,cAAc,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;YACrD,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;YACxD,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACpC,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;YAEpC,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,QAAQ,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;YACrD,IAAI,WAAW,CAAC,SAAS,CAAC,CAAC;YAC3B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAEvB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC9B,cAAc,CAAC,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;YAE9D,eAAe;YACf,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YACrB,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;YAE7B,4BAA4B;YAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAE7C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1B,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACrC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,0DAA0D,EAAE,GAAG,EAAE;YAClE,cAAc,CAAC,KAAK,EAAE,CAAC;YAEvB,MAAM,MAAM,GAAG,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAC7C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,sDAAsD,EAAE,GAAG,EAAE;YAC9D,cAAc,CAAC,OAAO,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;YAEvD,MAAM,MAAM,GAAG,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAC7C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,uCAAuC,EAAE,GAAG,EAAE;YAC/C,cAAc,CAAC,OAAO,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;YAEpD,IAAI,CAAC,aAAa,EAAE,CAAC;YAErB,MAAM,KAAK,GAAG,cAAc,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;YACrD,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC7B,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAChC,IAAI,CAAC,oCAAoC,EAAE,GAAG,EAAE;YAC5C,IAAI,CAAC,aAAa,CAAC;gBACf,QAAQ,EAAE,cAAc;gBACxB,WAAW,EAAE,OAAO;aACvB,CAAC,CAAC;YAEH,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACnD,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,0CAA0C,EAAE,GAAG,EAAE;YAClD,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;YAE3C,IAAI,CAAC,aAAa,CAAC;gBACf,QAAQ,EAAE,cAAc;aAC3B,CAAC,CAAC;YAEH,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACnD,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;QAC/B,IAAI,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;YAC/E,MAAM,IAAI,CAAC,IAAI,CAAC;gBACZ,QAAQ,EAAE,gBAAgB;gBAC1B,WAAW,EAAE,OAAO;gBACpB,MAAM,EAAE,aAAa;gBACrB,SAAS,EAAE,IAAI;aAClB,CAAC,CAAC;YAEH,kBAAkB;YAClB,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACpC,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;YAClC,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,QAAQ,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;YACrD,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,OAAO,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAC;YAEpD,kBAAkB;YAClB,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;YAClC,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACpC,MAAM,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;YAEtC,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC;YACzB,IAAI,WAAW,CAAC,QAAQ,CAAC,CAAC;YAC1B,IAAI,WAAW,CAAC,SAAS,CAAC,CAAC;YAE3B,WAAW;YACX,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACrB,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAE9C,yBAAyB;YACzB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YACtB,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YACrB,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YAEpB,aAAa;YACb,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YAEnC,mBAAmB;YACnB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACvB,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACtB,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YAEnB,mBAAmB;YACnB,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YAE1B,qBAAqB;YACrB,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC/C,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACpC,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,gCAAgC,EAAE,GAAG,EAAE;YACxC,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACpC,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,QAAQ,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;YAErD,MAAM,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;YACxC,MAAM,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;YACxC,MAAM,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;YAExC,IAAI,WAAW,CAAC,UAAU,CAAC,CAAC;YAC5B,IAAI,WAAW,CAAC,UAAU,CAAC,CAAC;YAC5B,IAAI,WAAW,CAAC,UAAU,CAAC,CAAC;YAE5B,0BAA0B;YAC1B,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YACxB,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACtB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YAE9B,0BAA0B;YAC1B,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YACxB,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YACrB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YAE9B,0BAA0B;YAC1B,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YACxB,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YACrB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YAE9B,cAAc;YACd,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACrB,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACjD,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAErC,cAAc;YACd,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACrB,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACjD,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAEpC,cAAc;YACd,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACrB,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACjD,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,kDAAkD,EAAE,GAAG,EAAE;YAC1D,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACpC,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,QAAQ,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;YAErD,wBAAwB;YACxB,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YACrB,MAAM,CAAC,IAAI,EAAE,CAAC;YAEd,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YACrB,MAAM,CAAC,IAAI,EAAE,CAAC;YAEd,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;YAC/B,MAAM,CAAC,IAAI,EAAE,CAAC;YAEd,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YAE9B,gBAAgB;YAChB,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YACrB,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAE3B,UAAU;YACV,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAErB,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACpC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;QACxB,IAAI,CAAC,0BAA0B,EAAE,GAAG,EAAE;YAClC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC9B,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;YAC5B,MAAM,CAAC,OAAO,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,MAAM,YAAY,GAAG;gBACjB,OAAO,EAAE;oBACL,IAAI,EAAE;wBACF,gBAAgB,EAAE,IAAI;qBACzB;iBACJ;aACJ,CAAC;YAEF,IAAI,CAAC,QAAQ,CAAC,YAA6B,CAAC,CAAC;YAE7C,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC,QAAQ,EAAE,CAAC;QACvD,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,0BAA0B,EAAE,GAAG,EAAE;YAClC,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;YACnC,IAAI,cAAc,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;YAErC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC9B,MAAM,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,iDAAiD,EAAE,GAAG,EAAE;YACzD,MAAM,iBAAkB,SAAQ,OAAO;gBACnC;oBACI,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,QAAQ,CAAC,CAAC;gBAC5C,CAAC;aACJ;YAED,MAAM,OAAO,GAAG,IAAI,iBAAiB,EAAE,CAAC;YAExC,MAAM,CAAC,GAAG,EAAE;gBACR,OAAO,CAAC,OAAO,EAAE,CAAC;YACtB,CAAC,CAAC,CAAC,OAAO,CAAC,gCAAgC,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,mCAAmC,EAAE,GAAG,EAAE;YAC3C,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC3B,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC3B,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;YAE3B,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC;YACrB,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC;YACrB,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC;YAErB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAEjB,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,6CAA6C,EAAE,GAAG,EAAE;YACrD,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC;YAE7B,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;YAC5B,MAAM,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,kBAAkB,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,kDAAkD,EAAE,GAAG,EAAE;YAC1D,MAAM,QAAQ,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC;YACxC,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC;YAExC,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;YAC/C,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,MAAM,aAAc,SAAQ,cAK1B;gBACE,YAAY,EAAU;oBAClB,KAAK,CAAC;wBACF,EAAE;wBACF,SAAS,EAAE;4BACP,WAAW,EAAE,EAAE;4BACf,IAAI,EAAE,CAAC;4BACP,UAAU,EAAE,KAAK;4BACjB,SAAS,EAAE,IAAI;yBAClB;qBACJ,CAAC,CAAC;gBACP,CAAC;aACJ;YAED,MAAM,QAAQ,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;YACrC,IAAI,aAAa,CAAC,QAAQ,CAAC,CAAC;YAE5B,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC9B,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YACzC,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAE5C,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC;gBACnC,WAAW,EAAE,EAAE;gBACf,IAAI,EAAE,CAAC;gBACP,UAAU,EAAE,KAAK;gBACjB,SAAS,EAAE,IAAI;aAClB,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=interactiveMap.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interactiveMap.test.d.ts","sourceRoot":"","sources":["../../src/tests/interactiveMap.test.ts"],"names":[],"mappings":""}