@indigoai-us/hq-cloud 6.14.17 → 6.14.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/ci.yml +35 -0
- package/dist/active-company.d.ts +43 -0
- package/dist/active-company.d.ts.map +1 -0
- package/dist/active-company.js +132 -0
- package/dist/active-company.js.map +1 -0
- package/dist/active-company.test.d.ts +2 -0
- package/dist/active-company.test.d.ts.map +1 -0
- package/dist/active-company.test.js +149 -0
- package/dist/active-company.test.js.map +1 -0
- package/dist/bin/sync-runner-company.d.ts +7 -0
- package/dist/bin/sync-runner-company.d.ts.map +1 -1
- package/dist/bin/sync-runner-company.js +21 -1
- package/dist/bin/sync-runner-company.js.map +1 -1
- package/dist/bin/sync-runner-planning.d.ts +27 -1
- package/dist/bin/sync-runner-planning.d.ts.map +1 -1
- package/dist/bin/sync-runner-planning.js +33 -4
- package/dist/bin/sync-runner-planning.js.map +1 -1
- package/dist/bin/sync-runner-planning.test.d.ts +2 -0
- package/dist/bin/sync-runner-planning.test.d.ts.map +1 -0
- package/dist/bin/sync-runner-planning.test.js +115 -0
- package/dist/bin/sync-runner-planning.test.js.map +1 -0
- package/dist/bin/sync-runner-watch-loop.d.ts +10 -2
- package/dist/bin/sync-runner-watch-loop.d.ts.map +1 -1
- package/dist/bin/sync-runner-watch-loop.js +201 -25
- package/dist/bin/sync-runner-watch-loop.js.map +1 -1
- package/dist/bin/sync-runner-watch-routes.d.ts +1 -1
- package/dist/bin/sync-runner-watch-routes.d.ts.map +1 -1
- package/dist/bin/sync-runner-watch-routes.js +14 -2
- package/dist/bin/sync-runner-watch-routes.js.map +1 -1
- package/dist/bin/sync-runner.d.ts +39 -9
- package/dist/bin/sync-runner.d.ts.map +1 -1
- package/dist/bin/sync-runner.js +114 -20
- package/dist/bin/sync-runner.js.map +1 -1
- package/dist/bin/sync-runner.test.js +852 -8
- package/dist/bin/sync-runner.test.js.map +1 -1
- package/dist/cli/rescue-core.js +27 -1
- package/dist/cli/rescue-core.js.map +1 -1
- package/dist/cli/rescue-drop-dir-symlink.test.d.ts +2 -0
- package/dist/cli/rescue-drop-dir-symlink.test.d.ts.map +1 -0
- package/dist/cli/rescue-drop-dir-symlink.test.js +206 -0
- package/dist/cli/rescue-drop-dir-symlink.test.js.map +1 -0
- package/dist/cli/share.d.ts +15 -0
- package/dist/cli/share.d.ts.map +1 -1
- package/dist/cli/share.js +100 -55
- package/dist/cli/share.js.map +1 -1
- package/dist/cli/share.test.js +119 -6
- package/dist/cli/share.test.js.map +1 -1
- package/dist/cli/sync.d.ts.map +1 -1
- package/dist/cli/sync.js +19 -25
- package/dist/cli/sync.js.map +1 -1
- package/dist/cli/sync.test.js +121 -0
- package/dist/cli/sync.test.js.map +1 -1
- package/dist/journal.d.ts +3 -1
- package/dist/journal.d.ts.map +1 -1
- package/dist/journal.js +13 -2
- package/dist/journal.js.map +1 -1
- package/dist/journal.test.js +26 -1
- package/dist/journal.test.js.map +1 -1
- package/dist/manifest-reconcile.d.ts +118 -5
- package/dist/manifest-reconcile.d.ts.map +1 -1
- package/dist/manifest-reconcile.js +319 -62
- package/dist/manifest-reconcile.js.map +1 -1
- package/dist/manifest-reconcile.test.js +824 -2
- package/dist/manifest-reconcile.test.js.map +1 -1
- package/dist/personal-vault.d.ts +12 -0
- package/dist/personal-vault.d.ts.map +1 -1
- package/dist/personal-vault.js +20 -0
- package/dist/personal-vault.js.map +1 -1
- package/dist/qmd-reindex.d.ts +88 -11
- package/dist/qmd-reindex.d.ts.map +1 -1
- package/dist/qmd-reindex.js +354 -65
- package/dist/qmd-reindex.js.map +1 -1
- package/dist/qmd-reindex.test.d.ts +4 -0
- package/dist/qmd-reindex.test.d.ts.map +1 -1
- package/dist/qmd-reindex.test.js +285 -3
- package/dist/qmd-reindex.test.js.map +1 -1
- package/dist/s3.d.ts +13 -0
- package/dist/s3.d.ts.map +1 -1
- package/dist/s3.js +34 -1
- package/dist/s3.js.map +1 -1
- package/dist/s3.test.js +60 -1
- package/dist/s3.test.js.map +1 -1
- package/dist/telemetry.d.ts +22 -0
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +79 -0
- package/dist/telemetry.js.map +1 -1
- package/dist/telemetry.test.js +117 -1
- package/dist/telemetry.test.js.map +1 -1
- package/dist/watcher.d.ts +26 -1
- package/dist/watcher.d.ts.map +1 -1
- package/dist/watcher.js +75 -12
- package/dist/watcher.js.map +1 -1
- package/package.json +1 -1
- package/pnpm-workspace.yaml +1 -1
- package/src/active-company.test.ts +188 -0
- package/src/active-company.ts +168 -0
- package/src/bin/sync-runner-company.ts +29 -1
- package/src/bin/sync-runner-planning.test.ts +131 -0
- package/src/bin/sync-runner-planning.ts +60 -7
- package/src/bin/sync-runner-watch-loop.ts +322 -32
- package/src/bin/sync-runner-watch-routes.ts +14 -1
- package/src/bin/sync-runner.test.ts +1021 -16
- package/src/bin/sync-runner.ts +179 -28
- package/src/cli/rescue-core.ts +26 -1
- package/src/cli/rescue-drop-dir-symlink.test.ts +224 -0
- package/src/cli/share.test.ts +150 -6
- package/src/cli/share.ts +143 -48
- package/src/cli/sync.test.ts +150 -1
- package/src/cli/sync.ts +25 -29
- package/src/journal.test.ts +45 -0
- package/src/journal.ts +18 -1
- package/src/manifest-reconcile.test.ts +1019 -3
- package/src/manifest-reconcile.ts +424 -66
- package/src/personal-vault.ts +23 -0
- package/src/qmd-reindex.test.ts +324 -4
- package/src/qmd-reindex.ts +414 -76
- package/src/s3.test.ts +79 -0
- package/src/s3.ts +48 -1
- package/src/telemetry.test.ts +128 -0
- package/src/telemetry.ts +80 -0
- package/src/watcher.ts +111 -14
- package/test/e2e/watcher-real-chokidar.test.ts +62 -2
- package/test/e2e/watcher-recursive-backend.test.ts +67 -1
- package/test/joiner-manifest-reconcile.integration.test.ts +283 -0
|
@@ -6,12 +6,21 @@ export async function resolveMembershipsForRun(options) {
|
|
|
6
6
|
return { status: "memberships", memberships: [] };
|
|
7
7
|
}
|
|
8
8
|
if (options.companies) {
|
|
9
|
+
let pendingInviteCount = 0;
|
|
9
10
|
if (options.claims) {
|
|
10
|
-
await options.runClaimDance(options.client, options.claims, options.stderr);
|
|
11
|
+
pendingInviteCount = await options.runClaimDance(options.client, options.claims, options.stderr);
|
|
11
12
|
}
|
|
12
13
|
const memberships = await options.listMemberships(options.client);
|
|
13
14
|
if (memberships.length === 0) {
|
|
14
|
-
|
|
15
|
+
// Pending invites that did NOT become memberships are the single most
|
|
16
|
+
// useful thing we can tell this user: they are not "solo", they have an
|
|
17
|
+
// invite waiting to be accepted. Reported only on the empty path, where
|
|
18
|
+
// it explains the emptiness.
|
|
19
|
+
return {
|
|
20
|
+
status: "setup-needed",
|
|
21
|
+
reason: "no-memberships",
|
|
22
|
+
...(pendingInviteCount > 0 ? { pendingInviteCount } : {}),
|
|
23
|
+
};
|
|
15
24
|
}
|
|
16
25
|
return { status: "memberships", memberships };
|
|
17
26
|
}
|
|
@@ -25,12 +34,25 @@ export async function buildFanoutPlan(options) {
|
|
|
25
34
|
for (const m of options.memberships) {
|
|
26
35
|
let slug = m.companyUid;
|
|
27
36
|
let name;
|
|
37
|
+
// Carried onto the target so downstream consumers (manifest reconciliation)
|
|
38
|
+
// can use the bucket, and judge liveness, without re-fetching the entity we
|
|
39
|
+
// already resolved here. On the degraded catch path below these stay
|
|
40
|
+
// undefined, which every consumer must read as "unknown" and reject.
|
|
41
|
+
let bucketName;
|
|
42
|
+
let entityType;
|
|
43
|
+
let entityStatus;
|
|
28
44
|
try {
|
|
29
45
|
const info = await options.client.entity.get(m.companyUid);
|
|
30
46
|
if (!info)
|
|
31
47
|
continue;
|
|
32
48
|
slug = info.slug || m.companyUid;
|
|
33
49
|
name = info.name;
|
|
50
|
+
bucketName = info.bucketName;
|
|
51
|
+
// Recorded, never acted on here: a suspended or unexpectedly-typed
|
|
52
|
+
// company still gets a sync leg exactly as before. Only the manifest
|
|
53
|
+
// decision consumes these.
|
|
54
|
+
entityType = info.type;
|
|
55
|
+
entityStatus = info.status;
|
|
34
56
|
}
|
|
35
57
|
catch (err) {
|
|
36
58
|
if (err instanceof VaultAuthError)
|
|
@@ -48,7 +70,14 @@ export async function buildFanoutPlan(options) {
|
|
|
48
70
|
}
|
|
49
71
|
// Best-effort — keep UID as the display identifier.
|
|
50
72
|
}
|
|
51
|
-
plan.push({
|
|
73
|
+
plan.push({
|
|
74
|
+
uid: m.companyUid,
|
|
75
|
+
slug,
|
|
76
|
+
...(name ? { name } : {}),
|
|
77
|
+
...(bucketName ? { bucketName } : {}),
|
|
78
|
+
...(entityType ? { entityType } : {}),
|
|
79
|
+
...(entityStatus ? { entityStatus } : {}),
|
|
80
|
+
});
|
|
52
81
|
}
|
|
53
82
|
if ((options.companies || options.personal) &&
|
|
54
83
|
!options.resolveSkipPersonal(options.skipPersonal)) {
|
|
@@ -81,7 +110,7 @@ export async function buildFanoutPlan(options) {
|
|
|
81
110
|
});
|
|
82
111
|
}
|
|
83
112
|
else if (options.personal) {
|
|
84
|
-
return { status: "setup-needed" };
|
|
113
|
+
return { status: "setup-needed", reason: "no-person-entity" };
|
|
85
114
|
}
|
|
86
115
|
}
|
|
87
116
|
return { status: "plan", plan };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync-runner-planning.js","sourceRoot":"","sources":["../../src/bin/sync-runner-planning.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAmB,MAAM,aAAa,CAAC;AAClF,OAAO,EACL,yBAAyB,EACzB,mBAAmB,GACpB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,2BAA2B,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"sync-runner-planning.js","sourceRoot":"","sources":["../../src/bin/sync-runner-planning.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-runner-planning.test.d.ts","sourceRoot":"","sources":["../../src/bin/sync-runner-planning.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { buildFanoutPlan, resolveMembershipsForRun } from "./sync-runner-planning.js";
|
|
3
|
+
const noopStderr = { write: () => true };
|
|
4
|
+
function clientStub(overrides = {}) {
|
|
5
|
+
return {
|
|
6
|
+
entity: {
|
|
7
|
+
get: () => Promise.resolve(undefined),
|
|
8
|
+
listByType: () => Promise.resolve([]),
|
|
9
|
+
},
|
|
10
|
+
...overrides,
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
describe("resolveMembershipsForRun — setup-needed reasons", () => {
|
|
14
|
+
// Each reason must come from its OWN trigger. Collapsing them back into a
|
|
15
|
+
// bare `setup-needed` is what left joiners unable to tell "you have no team"
|
|
16
|
+
// apart from "you have an invite waiting".
|
|
17
|
+
it("reports no-memberships when the membership list came back empty", async () => {
|
|
18
|
+
const result = await resolveMembershipsForRun({
|
|
19
|
+
personal: false,
|
|
20
|
+
companies: true,
|
|
21
|
+
client: clientStub(),
|
|
22
|
+
claims: null,
|
|
23
|
+
stderr: noopStderr,
|
|
24
|
+
runClaimDance: () => Promise.resolve(0),
|
|
25
|
+
listMemberships: () => Promise.resolve([]),
|
|
26
|
+
});
|
|
27
|
+
expect(result).toEqual({ status: "setup-needed", reason: "no-memberships" });
|
|
28
|
+
});
|
|
29
|
+
it("attaches pendingInviteCount when the claim dance left invites unconverted", async () => {
|
|
30
|
+
const result = await resolveMembershipsForRun({
|
|
31
|
+
personal: false,
|
|
32
|
+
companies: true,
|
|
33
|
+
client: clientStub(),
|
|
34
|
+
claims: { sub: "sub-1" },
|
|
35
|
+
stderr: noopStderr,
|
|
36
|
+
runClaimDance: () => Promise.resolve(3),
|
|
37
|
+
listMemberships: () => Promise.resolve([]),
|
|
38
|
+
});
|
|
39
|
+
expect(result).toEqual({
|
|
40
|
+
status: "setup-needed",
|
|
41
|
+
reason: "no-memberships",
|
|
42
|
+
pendingInviteCount: 3,
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
it("omits pendingInviteCount rather than reporting zero", async () => {
|
|
46
|
+
const result = await resolveMembershipsForRun({
|
|
47
|
+
personal: false,
|
|
48
|
+
companies: true,
|
|
49
|
+
client: clientStub(),
|
|
50
|
+
claims: { sub: "sub-1" },
|
|
51
|
+
stderr: noopStderr,
|
|
52
|
+
runClaimDance: () => Promise.resolve(0),
|
|
53
|
+
listMemberships: () => Promise.resolve([]),
|
|
54
|
+
});
|
|
55
|
+
expect(result).toEqual({ status: "setup-needed", reason: "no-memberships" });
|
|
56
|
+
expect("pendingInviteCount" in result).toBe(false);
|
|
57
|
+
});
|
|
58
|
+
it("does not report setup-needed at all when memberships exist", async () => {
|
|
59
|
+
const runClaimDance = vi.fn().mockResolvedValue(2);
|
|
60
|
+
const result = await resolveMembershipsForRun({
|
|
61
|
+
personal: false,
|
|
62
|
+
companies: true,
|
|
63
|
+
client: clientStub(),
|
|
64
|
+
claims: { sub: "sub-1" },
|
|
65
|
+
stderr: noopStderr,
|
|
66
|
+
runClaimDance,
|
|
67
|
+
listMemberships: () => Promise.resolve([{ companyUid: "cmp_a" }]),
|
|
68
|
+
});
|
|
69
|
+
// Pending invites are only meaningful as an explanation for emptiness.
|
|
70
|
+
expect(result).toEqual({
|
|
71
|
+
status: "memberships",
|
|
72
|
+
memberships: [{ companyUid: "cmp_a" }],
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
describe("buildFanoutPlan — setup-needed reasons", () => {
|
|
77
|
+
it("reports no-person-entity when --personal has no resolvable personal target", async () => {
|
|
78
|
+
const result = await buildFanoutPlan({
|
|
79
|
+
memberships: [],
|
|
80
|
+
companies: false,
|
|
81
|
+
personal: true,
|
|
82
|
+
skipPersonal: false,
|
|
83
|
+
client: clientStub(),
|
|
84
|
+
claims: null,
|
|
85
|
+
resolveSkipPersonal: () => false,
|
|
86
|
+
});
|
|
87
|
+
expect(result).toEqual({ status: "setup-needed", reason: "no-person-entity" });
|
|
88
|
+
});
|
|
89
|
+
// A --companies run does not need a personal target to be useful, so an
|
|
90
|
+
// unresolvable one must not abort the whole run.
|
|
91
|
+
it("does not report no-person-entity for a --companies run", async () => {
|
|
92
|
+
const result = await buildFanoutPlan({
|
|
93
|
+
memberships: [{ companyUid: "cmp_a" }],
|
|
94
|
+
companies: true,
|
|
95
|
+
personal: false,
|
|
96
|
+
skipPersonal: false,
|
|
97
|
+
client: clientStub({
|
|
98
|
+
entity: {
|
|
99
|
+
get: () => Promise.resolve({
|
|
100
|
+
uid: "cmp_a",
|
|
101
|
+
slug: "acme",
|
|
102
|
+
type: "company",
|
|
103
|
+
status: "active",
|
|
104
|
+
bucketName: "bucket-a",
|
|
105
|
+
}),
|
|
106
|
+
listByType: () => Promise.resolve([]),
|
|
107
|
+
},
|
|
108
|
+
}),
|
|
109
|
+
claims: null,
|
|
110
|
+
resolveSkipPersonal: () => false,
|
|
111
|
+
});
|
|
112
|
+
expect(result.status).toBe("plan");
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
//# sourceMappingURL=sync-runner-planning.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-runner-planning.test.js","sourceRoot":"","sources":["../../src/bin/sync-runner-planning.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import { readJournal } from "../journal.js";
|
|
1
2
|
import type { TelemetryClaims } from "../telemetry-events.js";
|
|
2
|
-
import type { Direction, RunnerLoopDeps } from "./sync-runner.js";
|
|
3
|
+
import type { Direction, RunnerLoopDeps, RunnerPassOutcome } from "./sync-runner.js";
|
|
3
4
|
/**
|
|
4
5
|
* Map whole-box load to a poll interval in the [floor, ceil] range.
|
|
5
6
|
*
|
|
@@ -22,7 +23,7 @@ export interface ParsedLoopArgs {
|
|
|
22
23
|
direction?: Direction;
|
|
23
24
|
}
|
|
24
25
|
export interface WatchLoopRuntime {
|
|
25
|
-
runPassWithOperationLockAlreadyHeld: (passArgv: string[]) => Promise<number>;
|
|
26
|
+
runPassWithOperationLockAlreadyHeld: (passArgv: string[]) => Promise<number | RunnerPassOutcome>;
|
|
26
27
|
authRequiredPassExit: number;
|
|
27
28
|
defaultGetIdTokenClaims: () => ({
|
|
28
29
|
email?: string;
|
|
@@ -31,6 +32,13 @@ export interface WatchLoopRuntime {
|
|
|
31
32
|
apiUrl: string;
|
|
32
33
|
region: string;
|
|
33
34
|
}
|
|
35
|
+
type JournalFiles = ReturnType<typeof readJournal>["files"];
|
|
36
|
+
/**
|
|
37
|
+
* Select journal entries covered by one watcher delete. Exact file unlinks
|
|
38
|
+
* deliberately avoid enumeration; only directory unlinks expand descendants.
|
|
39
|
+
*/
|
|
40
|
+
export declare function journalEntriesForWatcherDelete(files: JournalFiles, key: string, kind: "unlink" | "unlinkDir"): Array<[string, JournalFiles[string]]>;
|
|
34
41
|
export declare function runOneShotWithOperationLock(argv: string[], parsed: ParsedLoopArgs, deps: RunnerLoopDeps, runtime: WatchLoopRuntime): Promise<number>;
|
|
35
42
|
export declare function runWatchLoop(argv: string[], parsed: ParsedLoopArgs, deps: RunnerLoopDeps, runtime: WatchLoopRuntime): Promise<number>;
|
|
43
|
+
export {};
|
|
36
44
|
//# sourceMappingURL=sync-runner-watch-loop.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync-runner-watch-loop.d.ts","sourceRoot":"","sources":["../../src/bin/sync-runner-watch-loop.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sync-runner-watch-loop.d.ts","sourceRoot":"","sources":["../../src/bin/sync-runner-watch-loop.ts"],"names":[],"mappings":"AAuBA,OAAO,EAIL,WAAW,EAEZ,MAAM,eAAe,CAAC;AAWvB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAS9D,OAAO,KAAK,EACV,SAAS,EACT,cAAc,EACd,iBAAiB,EAElB,MAAM,kBAAkB,CAAC;AAiB1B;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,MAA+B,EACxC,MAAM,GAAE,MAA8B,GACrC,MAAM,CAKR;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC/B,mCAAmC,EAAE,CACnC,QAAQ,EAAE,MAAM,EAAE,KACf,OAAO,CAAC,MAAM,GAAG,iBAAiB,CAAC,CAAC;IACzC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,uBAAuB,EAAE,MAAM,CAAC;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,eAAe,CAAC,GAAG,IAAI,CAAC;IAC7E,qBAAqB,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7C,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,KAAK,YAAY,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC;AAE5D;;;GAGG;AACH,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,YAAY,EACnB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,QAAQ,GAAG,WAAW,GAC3B,KAAK,CAAC,CAAC,MAAM,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CASvC;AAMD,wBAAsB,2BAA2B,CAC/C,IAAI,EAAE,MAAM,EAAE,EACd,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,cAAc,EACpB,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,MAAM,CAAC,CAgBjB;AAED,wBAAsB,YAAY,CAChC,IAAI,EAAE,MAAM,EAAE,EACd,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,cAAc,EACpB,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,MAAM,CAAC,CAksBjB"}
|