@agentmeshhq/agent 0.4.6 → 0.4.11

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 (73) hide show
  1. package/dist/__tests__/auth-doctor-integration.test.d.ts +14 -0
  2. package/dist/__tests__/auth-doctor-integration.test.js +130 -0
  3. package/dist/__tests__/auth-doctor-integration.test.js.map +1 -0
  4. package/dist/__tests__/auth-guard.integration.test.d.ts +12 -0
  5. package/dist/__tests__/auth-guard.integration.test.js +132 -0
  6. package/dist/__tests__/auth-guard.integration.test.js.map +1 -0
  7. package/dist/__tests__/auth-guard.test.d.ts +17 -0
  8. package/dist/__tests__/auth-guard.test.js +483 -0
  9. package/dist/__tests__/auth-guard.test.js.map +1 -0
  10. package/dist/__tests__/done-state-guard.integration.test.d.ts +1 -0
  11. package/dist/__tests__/done-state-guard.integration.test.js +281 -0
  12. package/dist/__tests__/done-state-guard.integration.test.js.map +1 -0
  13. package/dist/__tests__/done-state-guard.test.d.ts +1 -0
  14. package/dist/__tests__/done-state-guard.test.js +327 -0
  15. package/dist/__tests__/done-state-guard.test.js.map +1 -0
  16. package/dist/__tests__/registry.register.test.d.ts +8 -0
  17. package/dist/__tests__/registry.register.test.js +109 -0
  18. package/dist/__tests__/registry.register.test.js.map +1 -0
  19. package/dist/__tests__/start-team-id.test.d.ts +9 -0
  20. package/dist/__tests__/start-team-id.test.js +160 -0
  21. package/dist/__tests__/start-team-id.test.js.map +1 -0
  22. package/dist/__tests__/tmux-runtime.test.d.ts +1 -0
  23. package/dist/__tests__/tmux-runtime.test.js +113 -0
  24. package/dist/__tests__/tmux-runtime.test.js.map +1 -0
  25. package/dist/cli/auth.d.ts +11 -0
  26. package/dist/cli/auth.js +92 -0
  27. package/dist/cli/auth.js.map +1 -0
  28. package/dist/cli/index.js +132 -1
  29. package/dist/cli/index.js.map +1 -1
  30. package/dist/cli/local.d.ts +4 -2
  31. package/dist/cli/local.js +257 -108
  32. package/dist/cli/local.js.map +1 -1
  33. package/dist/cli/migrate.d.ts +1 -0
  34. package/dist/cli/migrate.js +14 -10
  35. package/dist/cli/migrate.js.map +1 -1
  36. package/dist/cli/start.d.ts +11 -0
  37. package/dist/cli/start.js +46 -24
  38. package/dist/cli/start.js.map +1 -1
  39. package/dist/cli/test.d.ts +1 -0
  40. package/dist/cli/test.js +21 -10
  41. package/dist/cli/test.js.map +1 -1
  42. package/dist/cli/watcher.d.ts +27 -0
  43. package/dist/cli/watcher.js +365 -0
  44. package/dist/cli/watcher.js.map +1 -0
  45. package/dist/config/schema.d.ts +13 -0
  46. package/dist/config/schema.js.map +1 -1
  47. package/dist/core/auth-guard.d.ts +155 -0
  48. package/dist/core/auth-guard.js +498 -0
  49. package/dist/core/auth-guard.js.map +1 -0
  50. package/dist/core/auth-sync.d.ts +105 -0
  51. package/dist/core/auth-sync.js +263 -0
  52. package/dist/core/auth-sync.js.map +1 -0
  53. package/dist/core/daemon/context-template.js +65 -0
  54. package/dist/core/daemon/context-template.js.map +1 -1
  55. package/dist/core/daemon/done-state-guard.d.ts +63 -0
  56. package/dist/core/daemon/done-state-guard.js +102 -0
  57. package/dist/core/daemon/done-state-guard.js.map +1 -0
  58. package/dist/core/daemon/tmux-session.d.ts +1 -0
  59. package/dist/core/daemon/tmux-session.js +1 -1
  60. package/dist/core/daemon/tmux-session.js.map +1 -1
  61. package/dist/core/daemon.d.ts +18 -1
  62. package/dist/core/daemon.js +158 -37
  63. package/dist/core/daemon.js.map +1 -1
  64. package/dist/core/registry.d.ts +11 -1
  65. package/dist/core/registry.js +32 -1
  66. package/dist/core/registry.js.map +1 -1
  67. package/dist/core/tmux-runtime.d.ts +11 -2
  68. package/dist/core/tmux-runtime.js +45 -19
  69. package/dist/core/tmux-runtime.js.map +1 -1
  70. package/dist/core/tmux.d.ts +1 -1
  71. package/dist/core/tmux.js +7 -3
  72. package/dist/core/tmux.js.map +1 -1
  73. package/package.json +1 -1
@@ -0,0 +1,483 @@
1
+ /**
2
+ * Unit tests for auth-guard.ts — Epics #470 + #490
3
+ *
4
+ * Tests:
5
+ * 1. validateCanonicalAuth — detects valid/invalid/missing canonical auth
6
+ * 2. isValidAuthSymlink — detects valid/broken/missing/regular-file symlinks
7
+ * 3. linkAgentAuth — creates symlink, backs up regular files, removes stale symlinks
8
+ * 4. ensureAgentAuthLink — full link-or-repair flow
9
+ * 5. preflightAgentAuth — preflight with retry semantics
10
+ * 6. startAuthHealthWatcher — periodic check, backoff, event emission
11
+ * 7. runAuthDoctor — discovery + optional repair
12
+ * 8. isTempPath — temp path detection (#490)
13
+ * 9. validateAuthSchema — schema validation incl. auth.type field (#490)
14
+ * 10. writeRealAuthFile — real-file fallback when symlinking fails (#490)
15
+ * 11. getSymlinkTempTarget — detects temp-path symlink targets (#490)
16
+ */
17
+ import fs from "node:fs";
18
+ import os from "node:os";
19
+ import path from "node:path";
20
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
21
+ import { getSymlinkTempTarget, isTempPath, isValidAuthSymlink, linkAgentAuth, preflightAgentAuth, runAuthDoctor, startAuthHealthWatcher, validateAuthSchema, validateCanonicalAuth, writeRealAuthFile, } from "../core/auth-guard.js";
22
+ // ─── Helpers ─────────────────────────────────────────────────────────────────
23
+ function makeTmpDir() {
24
+ return fs.mkdtempSync(path.join(os.tmpdir(), "am-auth-test-"));
25
+ }
26
+ function writeJson(filePath, data) {
27
+ fs.mkdirSync(path.dirname(filePath), { recursive: true });
28
+ fs.writeFileSync(filePath, JSON.stringify(data, null, 2));
29
+ }
30
+ // ─── Tests ────────────────────────────────────────────────────────────────────
31
+ describe("validateCanonicalAuth", () => {
32
+ let tmp;
33
+ beforeEach(() => {
34
+ tmp = makeTmpDir();
35
+ });
36
+ afterEach(() => {
37
+ fs.rmSync(tmp, { recursive: true, force: true });
38
+ });
39
+ it("returns true for a valid JSON auth file", () => {
40
+ const p = path.join(tmp, "auth.json");
41
+ writeJson(p, { provider: "anthropic", token: "tok_abc" });
42
+ expect(validateCanonicalAuth(p)).toBe(true);
43
+ });
44
+ it("returns false when file does not exist", () => {
45
+ expect(validateCanonicalAuth(path.join(tmp, "nonexistent.json"))).toBe(false);
46
+ });
47
+ it("returns false for malformed JSON", () => {
48
+ const p = path.join(tmp, "auth.json");
49
+ fs.writeFileSync(p, "{ invalid json }");
50
+ expect(validateCanonicalAuth(p)).toBe(false);
51
+ });
52
+ it("returns false when path is a directory", () => {
53
+ const d = path.join(tmp, "auth.json");
54
+ fs.mkdirSync(d);
55
+ expect(validateCanonicalAuth(d)).toBe(false);
56
+ });
57
+ });
58
+ // ─────────────────────────────────────────────────────────────────────────────
59
+ describe("isValidAuthSymlink", () => {
60
+ let tmp;
61
+ let canonical;
62
+ beforeEach(() => {
63
+ tmp = makeTmpDir();
64
+ canonical = path.join(tmp, "canonical", "auth.json");
65
+ writeJson(canonical, { provider: "anthropic" });
66
+ });
67
+ afterEach(() => {
68
+ fs.rmSync(tmp, { recursive: true, force: true });
69
+ });
70
+ it("returns true for a valid symlink pointing to readable JSON", () => {
71
+ const link = path.join(tmp, "agent", "auth.json");
72
+ fs.mkdirSync(path.dirname(link), { recursive: true });
73
+ fs.symlinkSync(canonical, link);
74
+ expect(isValidAuthSymlink(link)).toBe(true);
75
+ });
76
+ it("returns false when path does not exist", () => {
77
+ expect(isValidAuthSymlink(path.join(tmp, "missing.json"))).toBe(false);
78
+ });
79
+ it("returns false for a regular file (not a symlink)", () => {
80
+ const p = path.join(tmp, "auth.json");
81
+ writeJson(p, { provider: "anthropic" });
82
+ expect(isValidAuthSymlink(p)).toBe(false);
83
+ });
84
+ it("returns false for a broken symlink (target missing)", () => {
85
+ const link = path.join(tmp, "broken.json");
86
+ fs.symlinkSync(path.join(tmp, "ghost.json"), link);
87
+ expect(isValidAuthSymlink(link)).toBe(false);
88
+ });
89
+ it("returns false for a symlink to malformed JSON", () => {
90
+ const bad = path.join(tmp, "bad.json");
91
+ fs.writeFileSync(bad, "not-json");
92
+ const link = path.join(tmp, "link.json");
93
+ fs.symlinkSync(bad, link);
94
+ expect(isValidAuthSymlink(link)).toBe(false);
95
+ });
96
+ });
97
+ // ─────────────────────────────────────────────────────────────────────────────
98
+ describe("linkAgentAuth", () => {
99
+ let tmp;
100
+ let canonical;
101
+ beforeEach(() => {
102
+ tmp = makeTmpDir();
103
+ canonical = path.join(tmp, "canonical", "auth.json");
104
+ writeJson(canonical, { provider: "anthropic" });
105
+ });
106
+ afterEach(() => {
107
+ fs.rmSync(tmp, { recursive: true, force: true });
108
+ });
109
+ it("creates symlink when nothing exists", () => {
110
+ const link = path.join(tmp, "agent", "opencode", "auth.json");
111
+ const result = linkAgentAuth(link, canonical);
112
+ expect(result.linked).toBe(true);
113
+ expect(result.backedUp).toBeUndefined();
114
+ expect(fs.lstatSync(link).isSymbolicLink()).toBe(true);
115
+ expect(fs.readlinkSync(link)).toBe(canonical);
116
+ });
117
+ it("backs up existing regular file before creating symlink", () => {
118
+ const link = path.join(tmp, "agent", "opencode", "auth.json");
119
+ fs.mkdirSync(path.dirname(link), { recursive: true });
120
+ writeJson(link, { stale: true });
121
+ const result = linkAgentAuth(link, canonical);
122
+ expect(result.linked).toBe(true);
123
+ expect(result.backedUp).toBeDefined();
124
+ expect(fs.existsSync(result.backedUp)).toBe(true);
125
+ // Backup should contain the original stale content
126
+ const backed = JSON.parse(fs.readFileSync(result.backedUp, "utf-8"));
127
+ expect(backed.stale).toBe(true);
128
+ // Link now points to canonical
129
+ expect(fs.lstatSync(link).isSymbolicLink()).toBe(true);
130
+ });
131
+ it("replaces a stale symlink pointing to missing target", () => {
132
+ const link = path.join(tmp, "agent", "opencode", "auth.json");
133
+ fs.mkdirSync(path.dirname(link), { recursive: true });
134
+ fs.symlinkSync(path.join(tmp, "ghost.json"), link); // broken symlink
135
+ const result = linkAgentAuth(link, canonical);
136
+ expect(result.linked).toBe(true);
137
+ expect(fs.readlinkSync(link)).toBe(canonical);
138
+ });
139
+ it("returns linked:false when canonical dir does not exist and cannot create", () => {
140
+ // Pass a canonical path under a read-only root that won't be auto-created
141
+ const badCanonical = "/nonexistent/deep/path/auth.json";
142
+ const link = path.join(tmp, "agent", "opencode", "auth.json");
143
+ // The symlink creation itself should work, but we're testing the error path
144
+ // by making the agent dir non-writable
145
+ fs.mkdirSync(path.dirname(link), { recursive: true });
146
+ fs.chmodSync(path.dirname(link), 0o444); // read-only
147
+ const result = linkAgentAuth(link, badCanonical);
148
+ // Restore perms for cleanup
149
+ fs.chmodSync(path.dirname(link), 0o755);
150
+ expect(result.linked).toBe(false);
151
+ expect(result.error).toBeDefined();
152
+ });
153
+ });
154
+ // ─────────────────────────────────────────────────────────────────────────────
155
+ describe("ensureAgentAuthLink", () => {
156
+ let tmp;
157
+ let canonical;
158
+ beforeEach(() => {
159
+ tmp = makeTmpDir();
160
+ canonical = path.join(tmp, "canonical", "auth.json");
161
+ writeJson(canonical, { provider: "anthropic", accessToken: "fresh_token" });
162
+ });
163
+ afterEach(() => {
164
+ fs.rmSync(tmp, { recursive: true, force: true });
165
+ });
166
+ it("returns no-canonical when canonical auth is missing (tested via validateCanonicalAuth)", () => {
167
+ // We can't override CANONICAL_AUTH_PATH constant at runtime without vi.mock,
168
+ // so we test the underlying validator directly — if canonical is missing, validate returns false
169
+ const missingPath = path.join(tmp, "nonexistent", "auth.json");
170
+ expect(validateCanonicalAuth(missingPath)).toBe(false);
171
+ });
172
+ it("returns ok when symlink already valid (idempotent)", () => {
173
+ // Build a valid link manually then call ensure
174
+ const authPath = path.join(tmp, "opencode-data", "agent1", "opencode", "auth.json");
175
+ fs.mkdirSync(path.dirname(authPath), { recursive: true });
176
+ fs.symlinkSync(canonical, authPath);
177
+ // We can't test ensureAgentAuthLink directly without mocking the module constants,
178
+ // so test the primitives that compose it
179
+ expect(isValidAuthSymlink(authPath)).toBe(true);
180
+ const linkResult = linkAgentAuth(authPath, canonical);
181
+ // Calling link again replaces the existing symlink
182
+ expect(linkResult.linked).toBe(true);
183
+ expect(fs.lstatSync(authPath).isSymbolicLink()).toBe(true);
184
+ });
185
+ it("returns repaired when regular file replaced with symlink", () => {
186
+ const authPath = path.join(tmp, "opencode-data", "agent2", "opencode", "auth.json");
187
+ fs.mkdirSync(path.dirname(authPath), { recursive: true });
188
+ writeJson(authPath, { stale: true }); // regular file
189
+ const result = linkAgentAuth(authPath, canonical);
190
+ expect(result.linked).toBe(true);
191
+ expect(result.backedUp).toBeDefined();
192
+ expect(isValidAuthSymlink(authPath)).toBe(true);
193
+ });
194
+ });
195
+ // ─────────────────────────────────────────────────────────────────────────────
196
+ describe("preflightAgentAuth", () => {
197
+ it("returns ok:false with no-canonical when global auth missing", () => {
198
+ // Agent name that won't have a data dir — canonical won't exist either
199
+ const { ok, result } = preflightAgentAuth("__test_agent_no_canonical__");
200
+ // Canonical ~/.local/share/opencode/auth.json is unlikely to be missing in CI,
201
+ // but the agent data dir won't be a valid symlink
202
+ // So either ok or degraded — we mainly confirm it doesn't throw.
203
+ expect(typeof ok).toBe("boolean");
204
+ expect(result.status).toMatch(/ok|repaired|degraded|no-canonical/);
205
+ });
206
+ });
207
+ // ─────────────────────────────────────────────────────────────────────────────
208
+ describe("startAuthHealthWatcher", () => {
209
+ let tmp;
210
+ let canonical;
211
+ beforeEach(() => {
212
+ tmp = makeTmpDir();
213
+ canonical = path.join(tmp, "canonical", "auth.json");
214
+ writeJson(canonical, { provider: "anthropic" });
215
+ vi.useFakeTimers();
216
+ });
217
+ afterEach(() => {
218
+ fs.rmSync(tmp, { recursive: true, force: true });
219
+ vi.useRealTimers();
220
+ });
221
+ it("emits auth-health-ok when symlink is valid on first tick", () => {
222
+ // Build a valid symlink manually for a fake agent
223
+ const authPath = path.join(tmp, "opencode-data", "watcher-agent", "opencode", "auth.json");
224
+ fs.mkdirSync(path.dirname(authPath), { recursive: true });
225
+ fs.symlinkSync(canonical, authPath);
226
+ const events = [];
227
+ // We can't override AGENTMESH_OPENCODE_DATA_ROOT, so we test the watcher
228
+ // by verifying its event model using a dummy agent name that has no data dir
229
+ const watcher = startAuthHealthWatcher("__nonexistent_watcher__", (ev) => {
230
+ events.push(ev.type);
231
+ });
232
+ // Advance past the first healthcheck interval (5 min)
233
+ vi.advanceTimersByTime(5 * 60 * 1000 + 100);
234
+ watcher.stop();
235
+ // Should have fired once — either ok or degraded (no data dir = degraded)
236
+ expect(events.length).toBe(1);
237
+ expect(events[0]).toMatch(/auth-health-ok|auth-health-degraded|auth-health-repaired/);
238
+ });
239
+ it("stops emitting events after stop() is called", () => {
240
+ const events = [];
241
+ const watcher = startAuthHealthWatcher("__stop_test__", (ev) => {
242
+ events.push(ev.type);
243
+ });
244
+ vi.advanceTimersByTime(5 * 60 * 1000 + 100);
245
+ const countAfterFirst = events.length;
246
+ watcher.stop();
247
+ vi.advanceTimersByTime(30 * 60 * 1000);
248
+ // No new events after stop
249
+ expect(events.length).toBe(countAfterFirst);
250
+ });
251
+ it("emits exactly one event per interval tick, not more", () => {
252
+ // Verifies the watcher only fires once per scheduled interval regardless of agent state
253
+ const events = [];
254
+ const watcher = startAuthHealthWatcher("__tick_rate_test__", (ev) => {
255
+ events.push(ev.type);
256
+ });
257
+ // Before first interval: no events
258
+ vi.advanceTimersByTime(4 * 60 * 1000); // 4 min — below 5-min initial interval
259
+ // Events may be 0 or 1 depending on system state (repair may happen immediately at first tick)
260
+ // Key property: advance to just past 5 min and record count
261
+ vi.advanceTimersByTime(1 * 60 * 1000 + 100); // cross 5-min mark
262
+ const afterFirstTick = events.length;
263
+ expect(afterFirstTick).toBeGreaterThanOrEqual(1); // at least 1 event fired
264
+ // Record count now; advance less than the minimum possible next interval (5 min)
265
+ // No new events should fire in a sub-interval window
266
+ const countBefore = events.length;
267
+ vi.advanceTimersByTime(4 * 60 * 1000); // 4 min: less than 5-min minimum
268
+ // If last event was a repair (reset to 5min interval), we haven't crossed 5min yet
269
+ // If last event was degraded (backoff to 10min), we definitely haven't crossed 10min
270
+ // Either way: no new event should have fired in 4 min
271
+ expect(events.length).toBe(countBefore);
272
+ watcher.stop();
273
+ });
274
+ });
275
+ // ─────────────────────────────────────────────────────────────────────────────
276
+ describe("runAuthDoctor", () => {
277
+ let tmp;
278
+ let canonical;
279
+ beforeEach(() => {
280
+ tmp = makeTmpDir();
281
+ canonical = path.join(tmp, "canonical", "auth.json");
282
+ writeJson(canonical, { provider: "anthropic", accessToken: "tok_fresh" });
283
+ });
284
+ afterEach(() => {
285
+ fs.rmSync(tmp, { recursive: true, force: true });
286
+ });
287
+ it("returns empty agents list when explicit empty agentNames array passed as undefined", () => {
288
+ // runAuthDoctor with explicit agentNames=undefined triggers discovery from real data root,
289
+ // but passing a sentinel list with no matching dirs returns zero agents.
290
+ const report = runAuthDoctor({ agentNames: ["__nonexistent_agent_xyz_123__"] });
291
+ // This agent dir won't exist so auth is degraded/missing, but exactly 1 entry
292
+ expect(report.agents).toHaveLength(1);
293
+ expect(report.agents[0]?.agentName).toBe("__nonexistent_agent_xyz_123__");
294
+ expect(report.agents[0]?.isValid).toBe(false);
295
+ // canonical may or may not be valid depending on the real system
296
+ expect(typeof report.canonicalValid).toBe("boolean");
297
+ });
298
+ it("reports degraded for agent with regular file auth (not symlink)", () => {
299
+ // Build agent data dir with regular file
300
+ const agentDir = path.join(tmp, "opencode-data", "agent-regular");
301
+ const authPath = path.join(agentDir, "opencode", "auth.json");
302
+ fs.mkdirSync(path.dirname(authPath), { recursive: true });
303
+ writeJson(authPath, { stale: true });
304
+ // We can't pass a custom data root to runAuthDoctor without refactoring,
305
+ // so we test the underlying linkAgentAuth that doctor uses internally
306
+ const lstat = fs.lstatSync(authPath);
307
+ expect(lstat.isSymbolicLink()).toBe(false);
308
+ expect(lstat.isFile()).toBe(true);
309
+ });
310
+ it("repair=true replaces regular file with symlink", () => {
311
+ const authPath = path.join(tmp, "opencode-data", "repair-agent", "opencode", "auth.json");
312
+ fs.mkdirSync(path.dirname(authPath), { recursive: true });
313
+ writeJson(authPath, { stale: true });
314
+ // Test the repair primitive directly
315
+ const result = linkAgentAuth(authPath, canonical);
316
+ expect(result.linked).toBe(true);
317
+ expect(result.backedUp).toBeDefined();
318
+ expect(fs.lstatSync(authPath).isSymbolicLink()).toBe(true);
319
+ expect(isValidAuthSymlink(authPath)).toBe(true);
320
+ // Backup file must exist and preserve original content
321
+ const backupContent = JSON.parse(fs.readFileSync(result.backedUp, "utf-8"));
322
+ expect(backupContent.stale).toBe(true);
323
+ });
324
+ });
325
+ // ─── Epic #490 tests ──────────────────────────────────────────────────────────
326
+ describe("isTempPath (#490)", () => {
327
+ it("returns true for /tmp/ paths", () => {
328
+ expect(isTempPath("/tmp/opencode-auth-12345")).toBe(true);
329
+ expect(isTempPath("/tmp/")).toBe(true);
330
+ });
331
+ it("returns true for os.tmpdir() paths", () => {
332
+ const tmpPath = path.join(os.tmpdir(), "some-auth.json");
333
+ expect(isTempPath(tmpPath)).toBe(true);
334
+ });
335
+ it("returns false for persistent home paths", () => {
336
+ expect(isTempPath(path.join(os.homedir(), ".local", "share", "opencode", "auth.json"))).toBe(false);
337
+ expect(isTempPath(path.join(os.homedir(), ".agentmesh", "opencode-data", "agent", "auth.json"))).toBe(false);
338
+ });
339
+ it("returns false for /var/log (non-temp var path)", () => {
340
+ // /var/log is not a temp folder
341
+ expect(isTempPath("/var/log/somefile")).toBe(false);
342
+ });
343
+ });
344
+ // ─────────────────────────────────────────────────────────────────────────────
345
+ describe("validateAuthSchema (#490)", () => {
346
+ let tmp;
347
+ beforeEach(() => {
348
+ tmp = fs.mkdtempSync(path.join(os.tmpdir(), "am-schema-test-"));
349
+ });
350
+ afterEach(() => {
351
+ fs.rmSync(tmp, { recursive: true, force: true });
352
+ });
353
+ it("returns valid:true for auth with type field", () => {
354
+ const p = path.join(tmp, "auth.json");
355
+ fs.writeFileSync(p, JSON.stringify({ type: "oauth2", accessToken: "tok_abc" }));
356
+ const result = validateAuthSchema(p);
357
+ expect(result.valid).toBe(true);
358
+ expect(result.parsed?.["type"]).toBe("oauth2");
359
+ });
360
+ it("returns valid:false when type field is missing", () => {
361
+ const p = path.join(tmp, "auth.json");
362
+ fs.writeFileSync(p, JSON.stringify({ accessToken: "tok_abc" }));
363
+ const result = validateAuthSchema(p);
364
+ expect(result.valid).toBe(false);
365
+ expect(result.error).toMatch(/type/);
366
+ });
367
+ it("returns valid:false when type field is empty string", () => {
368
+ const p = path.join(tmp, "auth.json");
369
+ fs.writeFileSync(p, JSON.stringify({ type: "", accessToken: "tok" }));
370
+ const result = validateAuthSchema(p);
371
+ expect(result.valid).toBe(false);
372
+ });
373
+ it("returns valid:false when type field is not a string", () => {
374
+ const p = path.join(tmp, "auth.json");
375
+ fs.writeFileSync(p, JSON.stringify({ type: 42 }));
376
+ const result = validateAuthSchema(p);
377
+ expect(result.valid).toBe(false);
378
+ });
379
+ it("returns valid:false for malformed JSON", () => {
380
+ const p = path.join(tmp, "auth.json");
381
+ fs.writeFileSync(p, "{ broken json");
382
+ const result = validateAuthSchema(p);
383
+ expect(result.valid).toBe(false);
384
+ expect(result.error).toMatch(/parse/i);
385
+ });
386
+ it("returns valid:false for non-object JSON", () => {
387
+ const p = path.join(tmp, "auth.json");
388
+ fs.writeFileSync(p, JSON.stringify([1, 2, 3]));
389
+ const result = validateAuthSchema(p);
390
+ expect(result.valid).toBe(false);
391
+ });
392
+ it("returns valid:false when file does not exist", () => {
393
+ const result = validateAuthSchema(path.join(tmp, "nonexistent.json"));
394
+ expect(result.valid).toBe(false);
395
+ });
396
+ });
397
+ // ─────────────────────────────────────────────────────────────────────────────
398
+ describe("getSymlinkTempTarget (#490)", () => {
399
+ let tmp;
400
+ beforeEach(() => {
401
+ tmp = fs.mkdtempSync(path.join(os.tmpdir(), "am-templink-test-"));
402
+ });
403
+ afterEach(() => {
404
+ fs.rmSync(tmp, { recursive: true, force: true });
405
+ });
406
+ it("returns the target when symlink points to a temp path", () => {
407
+ const tempTarget = path.join(os.tmpdir(), "ephemeral-auth.json");
408
+ const link = path.join(tmp, "auth.json");
409
+ fs.symlinkSync(tempTarget, link);
410
+ const result = getSymlinkTempTarget(link);
411
+ expect(result).toBe(tempTarget);
412
+ });
413
+ it("returns null when symlink points to a persistent path", () => {
414
+ const persistentTarget = path.join(os.homedir(), ".local", "share", "opencode", "auth.json");
415
+ const link = path.join(tmp, "auth.json");
416
+ fs.symlinkSync(persistentTarget, link);
417
+ const result = getSymlinkTempTarget(link);
418
+ expect(result).toBeNull();
419
+ });
420
+ it("returns null for a regular file (not a symlink)", () => {
421
+ const p = path.join(tmp, "auth.json");
422
+ fs.writeFileSync(p, "{}");
423
+ expect(getSymlinkTempTarget(p)).toBeNull();
424
+ });
425
+ it("returns null when path does not exist", () => {
426
+ expect(getSymlinkTempTarget(path.join(tmp, "missing.json"))).toBeNull();
427
+ });
428
+ });
429
+ // ─────────────────────────────────────────────────────────────────────────────
430
+ describe("writeRealAuthFile (#490)", () => {
431
+ let tmp;
432
+ let canonical;
433
+ beforeEach(() => {
434
+ tmp = fs.mkdtempSync(path.join(os.tmpdir(), "am-realfile-test-"));
435
+ canonical = path.join(tmp, "canonical", "auth.json");
436
+ fs.mkdirSync(path.dirname(canonical), { recursive: true });
437
+ fs.writeFileSync(canonical, JSON.stringify({ type: "oauth2", accessToken: "tok_fresh", xai: "strip_me" }));
438
+ });
439
+ afterEach(() => {
440
+ fs.rmSync(tmp, { recursive: true, force: true });
441
+ });
442
+ it("writes a real file from canonical, stripping xai key", () => {
443
+ const dest = path.join(tmp, "agent", "opencode", "auth.json");
444
+ const result = writeRealAuthFile(dest, canonical);
445
+ expect(result.written).toBe(true);
446
+ expect(fs.lstatSync(dest).isFile()).toBe(true);
447
+ expect(fs.lstatSync(dest).isSymbolicLink()).toBe(false);
448
+ const content = JSON.parse(fs.readFileSync(dest, "utf-8"));
449
+ expect(content["type"]).toBe("oauth2");
450
+ expect(content["xai"]).toBeUndefined();
451
+ });
452
+ it("sets file permissions to 0o600", () => {
453
+ const dest = path.join(tmp, "agent2", "opencode", "auth.json");
454
+ writeRealAuthFile(dest, canonical);
455
+ const mode = fs.statSync(dest).mode & 0o777;
456
+ expect(mode).toBe(0o600);
457
+ });
458
+ it("backs up existing regular file before overwriting", () => {
459
+ const dest = path.join(tmp, "agent3", "opencode", "auth.json");
460
+ fs.mkdirSync(path.dirname(dest), { recursive: true });
461
+ fs.writeFileSync(dest, JSON.stringify({ type: "old", stale: true }));
462
+ const result = writeRealAuthFile(dest, canonical);
463
+ expect(result.written).toBe(true);
464
+ expect(result.backedUp).toBeDefined();
465
+ const backed = JSON.parse(fs.readFileSync(result.backedUp, "utf-8"));
466
+ expect(backed.stale).toBe(true);
467
+ });
468
+ it("returns written:false when canonical is missing", () => {
469
+ const dest = path.join(tmp, "agent4", "opencode", "auth.json");
470
+ const result = writeRealAuthFile(dest, path.join(tmp, "nonexistent.json"));
471
+ expect(result.written).toBe(false);
472
+ expect(result.error).toBeDefined();
473
+ });
474
+ it("returns written:false when canonical fails schema validation", () => {
475
+ const badCanonical = path.join(tmp, "bad-canonical.json");
476
+ fs.writeFileSync(badCanonical, JSON.stringify({ accessToken: "no-type-field" }));
477
+ const dest = path.join(tmp, "agent5", "opencode", "auth.json");
478
+ const result = writeRealAuthFile(dest, badCanonical);
479
+ expect(result.written).toBe(false);
480
+ expect(result.error).toMatch(/schema/i);
481
+ });
482
+ });
483
+ //# sourceMappingURL=auth-guard.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-guard.test.js","sourceRoot":"","sources":["../../src/__tests__/auth-guard.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAGL,oBAAoB,EACpB,UAAU,EACV,kBAAkB,EAClB,aAAa,EACb,kBAAkB,EAClB,aAAa,EACb,sBAAsB,EACtB,kBAAkB,EAClB,qBAAqB,EACrB,iBAAiB,GAClB,MAAM,uBAAuB,CAAC;AAE/B,gFAAgF;AAEhF,SAAS,UAAU;IACjB,OAAO,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC;AACjE,CAAC;AAED,SAAS,SAAS,CAAC,QAAgB,EAAE,IAAa;IAChD,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED,iFAAiF;AAEjF,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,IAAI,GAAW,CAAC;IAEhB,UAAU,CAAC,GAAG,EAAE;QACd,GAAG,GAAG,UAAU,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IACH,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QACtC,SAAS,CAAC,CAAC,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAC1D,MAAM,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QACtC,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAC;QACxC,MAAM,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QACtC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAChB,MAAM,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,gFAAgF;AAEhF,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,IAAI,GAAW,CAAC;IAChB,IAAI,SAAiB,CAAC;IAEtB,UAAU,CAAC,GAAG,EAAE;QACd,GAAG,GAAG,UAAU,EAAE,CAAC;QACnB,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;QACrD,SAAS,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IACH,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;QACpE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;QAClD,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,EAAE,CAAC,WAAW,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAChC,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QACtC,SAAS,CAAC,CAAC,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC;QACxC,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;QAC3C,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,EAAE,IAAI,CAAC,CAAC;QACnD,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QACvC,EAAE,CAAC,aAAa,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QAClC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QACzC,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC1B,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,gFAAgF;AAEhF,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,IAAI,GAAW,CAAC;IAChB,IAAI,SAAiB,CAAC;IAEtB,UAAU,CAAC,GAAG,EAAE;QACd,GAAG,GAAG,UAAU,EAAE,CAAC;QACnB,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;QACrD,SAAS,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IACH,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;QAC9D,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAC9C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,aAAa,EAAE,CAAC;QACxC,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvD,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;QAC9D,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,SAAS,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAEjC,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAC9C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;QACtC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,QAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnD,mDAAmD;QACnD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,QAAS,EAAE,OAAO,CAAC,CAAuB,CAAC;QAC5F,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,+BAA+B;QAC/B,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;QAC9D,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,iBAAiB;QAErE,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAC9C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0EAA0E,EAAE,GAAG,EAAE;QAClF,0EAA0E;QAC1E,MAAM,YAAY,GAAG,kCAAkC,CAAC;QACxD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;QAC9D,4EAA4E;QAC5E,uCAAuC;QACvC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,YAAY;QACrD,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QACjD,4BAA4B;QAC5B,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;QACxC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;IACrC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,gFAAgF;AAEhF,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,IAAI,GAAW,CAAC;IAChB,IAAI,SAAiB,CAAC;IAEtB,UAAU,CAAC,GAAG,EAAE;QACd,GAAG,GAAG,UAAU,EAAE,CAAC;QACnB,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;QACrD,SAAS,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;IACH,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wFAAwF,EAAE,GAAG,EAAE;QAChG,6EAA6E;QAC7E,iGAAiG;QACjG,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC;QAC/D,MAAM,CAAC,qBAAqB,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,+CAA+C;QAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,eAAe,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;QACpF,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,EAAE,CAAC,WAAW,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAEpC,mFAAmF;QACnF,yCAAyC;QACzC,MAAM,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChD,MAAM,UAAU,GAAG,aAAa,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QACtD,mDAAmD;QACnD,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrC,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,eAAe,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;QACpF,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,SAAS,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,eAAe;QAErD,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QAClD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;QACtC,MAAM,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,gFAAgF;AAEhF,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,uEAAuE;QACvE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,kBAAkB,CAAC,6BAA6B,CAAC,CAAC;QACzE,+EAA+E;QAC/E,kDAAkD;QAClD,iEAAiE;QACjE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,mCAAmC,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,gFAAgF;AAEhF,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,IAAI,GAAW,CAAC;IAChB,IAAI,SAAiB,CAAC;IAEtB,UAAU,CAAC,GAAG,EAAE;QACd,GAAG,GAAG,UAAU,EAAE,CAAC;QACnB,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;QACrD,SAAS,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC;QAChD,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IACH,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,kDAAkD;QAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,eAAe,EAAE,eAAe,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;QAC3F,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,EAAE,CAAC,WAAW,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAEpC,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,yEAAyE;QACzE,6EAA6E;QAC7E,MAAM,OAAO,GAAG,sBAAsB,CAAC,yBAAyB,EAAE,CAAC,EAAE,EAAE,EAAE;YACvE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC,CAAC,CAAC;QAEH,sDAAsD;QACtD,EAAE,CAAC,mBAAmB,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI,GAAG,GAAG,CAAC,CAAC;QAE5C,OAAO,CAAC,IAAI,EAAE,CAAC;QAEf,0EAA0E;QAC1E,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,0DAA0D,CAAC,CAAC;IACxF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,sBAAsB,CAAC,eAAe,EAAE,CAAC,EAAE,EAAE,EAAE;YAC7D,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mBAAmB,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI,GAAG,GAAG,CAAC,CAAC;QAC5C,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC;QAEtC,OAAO,CAAC,IAAI,EAAE,CAAC;QAEf,EAAE,CAAC,mBAAmB,CAAC,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QACvC,2BAA2B;QAC3B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,wFAAwF;QACxF,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,sBAAsB,CAAC,oBAAoB,EAAE,CAAC,EAAE,EAAE,EAAE;YAClE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC,CAAC,CAAC;QAEH,mCAAmC;QACnC,EAAE,CAAC,mBAAmB,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,uCAAuC;QAC9E,+FAA+F;QAC/F,4DAA4D;QAC5D,EAAE,CAAC,mBAAmB,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,mBAAmB;QAChE,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC;QACrC,MAAM,CAAC,cAAc,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAAC,yBAAyB;QAE3E,iFAAiF;QACjF,qDAAqD;QACrD,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC;QAClC,EAAE,CAAC,mBAAmB,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,iCAAiC;QACxE,mFAAmF;QACnF,qFAAqF;QACrF,sDAAsD;QACtD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAExC,OAAO,CAAC,IAAI,EAAE,CAAC;IACjB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,gFAAgF;AAEhF,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,IAAI,GAAW,CAAC;IAChB,IAAI,SAAiB,CAAC;IAEtB,UAAU,CAAC,GAAG,EAAE;QACd,GAAG,GAAG,UAAU,EAAE,CAAC;QACnB,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;QACrD,SAAS,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;IACH,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oFAAoF,EAAE,GAAG,EAAE;QAC5F,2FAA2F;QAC3F,yEAAyE;QACzE,MAAM,MAAM,GAAG,aAAa,CAAC,EAAE,UAAU,EAAE,CAAC,+BAA+B,CAAC,EAAE,CAAC,CAAC;QAChF,8EAA8E;QAC9E,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACtC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QAC1E,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9C,iEAAiE;QACjE,MAAM,CAAC,OAAO,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;QACzE,yCAAyC;QACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,eAAe,EAAE,eAAe,CAAC,CAAC;QAClE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;QAC9D,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,SAAS,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAErC,yEAAyE;QACzE,sEAAsE;QACtE,MAAM,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACrC,MAAM,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3C,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,eAAe,EAAE,cAAc,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;QAC1F,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,SAAS,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAErC,qCAAqC;QACrC,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QAClD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;QACtC,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3D,MAAM,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEhD,uDAAuD;QACvD,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,QAAS,EAAE,OAAO,CAAC,CAE1E,CAAC;QACF,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,iFAAiF;AAEjF,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,CAAC,UAAU,CAAC,0BAA0B,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1D,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,gBAAgB,CAAC,CAAC;QACzD,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAC1F,KAAK,CACN,CAAC;QACF,MAAM,CACJ,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,YAAY,EAAE,eAAe,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC,CACzF,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,gCAAgC;QAChC,MAAM,CAAC,UAAU,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,gFAAgF;AAEhF,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACzC,IAAI,GAAW,CAAC;IAEhB,UAAU,CAAC,GAAG,EAAE;QACd,GAAG,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IACH,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QACtC,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;QAChF,MAAM,MAAM,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QACtC,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;QAChE,MAAM,MAAM,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QACtC,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QACtE,MAAM,MAAM,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QACtC,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QACtC,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC;QACrC,MAAM,MAAM,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QACtC,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,MAAM,GAAG,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC,CAAC;QACtE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,gFAAgF;AAEhF,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;IAC3C,IAAI,GAAW,CAAC;IAEhB,UAAU,CAAC,GAAG,EAAE;QACd,GAAG,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,mBAAmB,CAAC,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IACH,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,qBAAqB,CAAC,CAAC;QACjE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QACzC,EAAE,CAAC,WAAW,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QACjC,MAAM,MAAM,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;QAC7F,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QACzC,EAAE,CAAC,WAAW,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;QACvC,MAAM,MAAM,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QACtC,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QAC1B,MAAM,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC1E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,gFAAgF;AAEhF,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,IAAI,GAAW,CAAC;IAChB,IAAI,SAAiB,CAAC;IAEtB,UAAU,CAAC,GAAG,EAAE;QACd,GAAG,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,mBAAmB,CAAC,CAAC,CAAC;QAClE,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;QACrD,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3D,EAAE,CAAC,aAAa,CACd,SAAS,EACT,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,CAC9E,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;QAC9D,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAClD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/C,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAA4B,CAAC;QACtF,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;QAC/D,iBAAiB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QACnC,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC;QAC5C,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;QAC/D,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACrE,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAClD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;QACtC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,QAAS,EAAE,OAAO,CAAC,CAAuB,CAAC;QAC5F,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;QAC/D,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC,CAAC;QAC3E,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,oBAAoB,CAAC,CAAC;QAC1D,EAAE,CAAC,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC;QACjF,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;QAC/D,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QACrD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}