@manifesto-ai/core 0.3.0 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +148 -498
- package/dist/__tests__/apply.test.d.ts +2 -0
- package/dist/__tests__/apply.test.d.ts.map +1 -0
- package/dist/__tests__/apply.test.js +144 -0
- package/dist/__tests__/apply.test.js.map +1 -0
- package/dist/__tests__/jcs.test.d.ts +2 -0
- package/dist/__tests__/jcs.test.d.ts.map +1 -0
- package/dist/__tests__/jcs.test.js +45 -0
- package/dist/__tests__/jcs.test.js.map +1 -0
- package/dist/core/apply.d.ts +17 -0
- package/dist/core/apply.d.ts.map +1 -0
- package/dist/core/apply.js +130 -0
- package/dist/core/apply.js.map +1 -0
- package/dist/core/compute.d.ts +17 -0
- package/dist/core/compute.d.ts.map +1 -0
- package/dist/core/compute.js +287 -0
- package/dist/core/compute.js.map +1 -0
- package/dist/core/compute.test.d.ts +2 -0
- package/dist/core/compute.test.d.ts.map +1 -0
- package/dist/core/compute.test.js +633 -0
- package/dist/core/compute.test.js.map +1 -0
- package/dist/core/explain.d.ts +14 -0
- package/dist/core/explain.d.ts.map +1 -0
- package/dist/core/explain.js +78 -0
- package/dist/core/explain.js.map +1 -0
- package/dist/core/index.d.ts +5 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +5 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/validate.d.ts +16 -0
- package/dist/core/validate.d.ts.map +1 -0
- package/dist/core/validate.js +361 -0
- package/dist/core/validate.js.map +1 -0
- package/dist/core/validate.test.d.ts +2 -0
- package/dist/core/validate.test.d.ts.map +1 -0
- package/dist/core/validate.test.js +638 -0
- package/dist/core/validate.test.js.map +1 -0
- package/dist/core/validation-utils.d.ts +20 -0
- package/dist/core/validation-utils.d.ts.map +1 -0
- package/dist/core/validation-utils.js +289 -0
- package/dist/core/validation-utils.js.map +1 -0
- package/dist/errors.d.ts +30 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +51 -0
- package/dist/errors.js.map +1 -0
- package/dist/evaluator/computed.d.ts +14 -0
- package/dist/evaluator/computed.d.ts.map +1 -0
- package/dist/evaluator/computed.js +60 -0
- package/dist/evaluator/computed.js.map +1 -0
- package/dist/evaluator/context.d.ts +59 -0
- package/dist/evaluator/context.d.ts.map +1 -0
- package/dist/evaluator/context.js +41 -0
- package/dist/evaluator/context.js.map +1 -0
- package/dist/evaluator/dag.d.ts +30 -0
- package/dist/evaluator/dag.d.ts.map +1 -0
- package/dist/evaluator/dag.js +121 -0
- package/dist/evaluator/dag.js.map +1 -0
- package/dist/evaluator/expr.d.ts +11 -0
- package/dist/evaluator/expr.d.ts.map +1 -0
- package/dist/evaluator/expr.js +649 -0
- package/dist/evaluator/expr.js.map +1 -0
- package/dist/evaluator/expr.test.d.ts +2 -0
- package/dist/evaluator/expr.test.d.ts.map +1 -0
- package/dist/evaluator/expr.test.js +449 -0
- package/dist/evaluator/expr.test.js.map +1 -0
- package/dist/evaluator/flow.d.ts +35 -0
- package/dist/evaluator/flow.d.ts.map +1 -0
- package/dist/evaluator/flow.js +387 -0
- package/dist/evaluator/flow.js.map +1 -0
- package/dist/evaluator/flow.test.d.ts +2 -0
- package/dist/evaluator/flow.test.d.ts.map +1 -0
- package/dist/evaluator/flow.test.js +499 -0
- package/dist/evaluator/flow.test.js.map +1 -0
- package/dist/evaluator/index.d.ts +6 -0
- package/dist/evaluator/index.d.ts.map +1 -0
- package/dist/evaluator/index.js +6 -0
- package/dist/evaluator/index.js.map +1 -0
- package/dist/factories.d.ts +22 -0
- package/dist/factories.d.ts.map +1 -0
- package/dist/factories.js +44 -0
- package/dist/factories.js.map +1 -0
- package/dist/index.d.ts +47 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +30 -45
- package/dist/index.js.map +1 -1
- package/dist/index.test.d.ts +2 -0
- package/dist/index.test.d.ts.map +1 -0
- package/dist/index.test.js +13 -0
- package/dist/index.test.js.map +1 -0
- package/dist/schema/action.d.ts +14 -0
- package/dist/schema/action.d.ts.map +1 -0
- package/dist/schema/action.js +30 -0
- package/dist/schema/action.js.map +1 -0
- package/dist/schema/common.d.ts +37 -0
- package/dist/schema/common.d.ts.map +1 -0
- package/dist/schema/common.js +20 -0
- package/dist/schema/common.js.map +1 -0
- package/dist/schema/computed.d.ts +23 -0
- package/dist/schema/computed.d.ts.map +1 -0
- package/dist/schema/computed.js +34 -0
- package/dist/schema/computed.js.map +1 -0
- package/dist/schema/domain.d.ts +50 -0
- package/dist/schema/domain.d.ts.map +1 -0
- package/dist/schema/domain.js +60 -0
- package/dist/schema/domain.js.map +1 -0
- package/dist/schema/expr.d.ts +303 -0
- package/dist/schema/expr.d.ts.map +1 -0
- package/dist/schema/expr.js +283 -0
- package/dist/schema/expr.js.map +1 -0
- package/dist/schema/field.d.ts +48 -0
- package/dist/schema/field.d.ts.map +1 -0
- package/dist/schema/field.js +31 -0
- package/dist/schema/field.js.map +1 -0
- package/dist/schema/flow.d.ts +103 -0
- package/dist/schema/flow.d.ts.map +1 -0
- package/dist/schema/flow.js +82 -0
- package/dist/schema/flow.js.map +1 -0
- package/dist/schema/host-context.d.ts +12 -0
- package/dist/schema/host-context.d.ts.map +1 -0
- package/dist/schema/host-context.js +23 -0
- package/dist/schema/host-context.js.map +1 -0
- package/dist/schema/index.d.ts +13 -2
- package/dist/schema/index.d.ts.map +1 -1
- package/dist/schema/index.js +25 -2
- package/dist/schema/index.js.map +1 -1
- package/dist/schema/patch.d.ts +59 -0
- package/dist/schema/patch.d.ts.map +1 -0
- package/dist/schema/patch.js +60 -0
- package/dist/schema/patch.js.map +1 -0
- package/dist/schema/result.d.ts +142 -0
- package/dist/schema/result.d.ts.map +1 -0
- package/dist/schema/result.js +94 -0
- package/dist/schema/result.js.map +1 -0
- package/dist/schema/snapshot.d.ts +153 -0
- package/dist/schema/snapshot.d.ts.map +1 -0
- package/dist/schema/snapshot.js +160 -0
- package/dist/schema/snapshot.js.map +1 -0
- package/dist/schema/trace.d.ts +98 -0
- package/dist/schema/trace.d.ts.map +1 -0
- package/dist/schema/trace.js +90 -0
- package/dist/schema/trace.js.map +1 -0
- package/dist/schema/type-spec.d.ts +34 -0
- package/dist/schema/type-spec.d.ts.map +1 -0
- package/dist/schema/type-spec.js +40 -0
- package/dist/schema/type-spec.js.map +1 -0
- package/dist/utils/canonical.d.ts +37 -0
- package/dist/utils/canonical.d.ts.map +1 -0
- package/dist/utils/canonical.js +122 -0
- package/dist/utils/canonical.js.map +1 -0
- package/dist/utils/canonical.test.d.ts +2 -0
- package/dist/utils/canonical.test.d.ts.map +1 -0
- package/dist/utils/canonical.test.js +183 -0
- package/dist/utils/canonical.test.js.map +1 -0
- package/dist/utils/hash.d.ts +28 -0
- package/dist/utils/hash.d.ts.map +1 -0
- package/dist/utils/hash.js +152 -0
- package/dist/utils/hash.js.map +1 -0
- package/dist/utils/hash.test.d.ts +2 -0
- package/dist/utils/hash.test.d.ts.map +1 -0
- package/dist/utils/hash.test.js +170 -0
- package/dist/utils/hash.test.js.map +1 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +4 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/path.d.ts +40 -0
- package/dist/utils/path.d.ts.map +1 -0
- package/dist/utils/path.js +132 -0
- package/dist/utils/path.js.map +1 -0
- package/dist/utils/path.test.d.ts +2 -0
- package/dist/utils/path.test.d.ts.map +1 -0
- package/dist/utils/path.test.js +191 -0
- package/dist/utils/path.test.js.map +1 -0
- package/package.json +28 -41
- package/LICENSE +0 -21
- package/dist/dag/graph.d.ts +0 -62
- package/dist/dag/graph.d.ts.map +0 -1
- package/dist/dag/graph.js +0 -244
- package/dist/dag/graph.js.map +0 -1
- package/dist/dag/index.d.ts +0 -4
- package/dist/dag/index.d.ts.map +0 -1
- package/dist/dag/index.js +0 -4
- package/dist/dag/index.js.map +0 -1
- package/dist/dag/propagation.d.ts +0 -58
- package/dist/dag/propagation.d.ts.map +0 -1
- package/dist/dag/propagation.js +0 -224
- package/dist/dag/propagation.js.map +0 -1
- package/dist/dag/topological.d.ts +0 -33
- package/dist/dag/topological.d.ts.map +0 -1
- package/dist/dag/topological.js +0 -173
- package/dist/dag/topological.js.map +0 -1
- package/dist/domain/define.d.ts +0 -82
- package/dist/domain/define.d.ts.map +0 -1
- package/dist/domain/define.js +0 -105
- package/dist/domain/define.js.map +0 -1
- package/dist/domain/index.d.ts +0 -4
- package/dist/domain/index.d.ts.map +0 -1
- package/dist/domain/index.js +0 -4
- package/dist/domain/index.js.map +0 -1
- package/dist/domain/types.d.ts +0 -203
- package/dist/domain/types.d.ts.map +0 -1
- package/dist/domain/types.js +0 -2
- package/dist/domain/types.js.map +0 -1
- package/dist/domain/validate.d.ts +0 -17
- package/dist/domain/validate.d.ts.map +0 -1
- package/dist/domain/validate.js +0 -204
- package/dist/domain/validate.js.map +0 -1
- package/dist/effect/index.d.ts +0 -4
- package/dist/effect/index.d.ts.map +0 -1
- package/dist/effect/index.js +0 -4
- package/dist/effect/index.js.map +0 -1
- package/dist/effect/result.d.ts +0 -100
- package/dist/effect/result.d.ts.map +0 -1
- package/dist/effect/result.js +0 -163
- package/dist/effect/result.js.map +0 -1
- package/dist/effect/runner.d.ts +0 -98
- package/dist/effect/runner.d.ts.map +0 -1
- package/dist/effect/runner.js +0 -321
- package/dist/effect/runner.js.map +0 -1
- package/dist/effect/types.d.ts +0 -169
- package/dist/effect/types.d.ts.map +0 -1
- package/dist/effect/types.js +0 -28
- package/dist/effect/types.js.map +0 -1
- package/dist/expression/analyzer.d.ts +0 -42
- package/dist/expression/analyzer.d.ts.map +0 -1
- package/dist/expression/analyzer.js +0 -166
- package/dist/expression/analyzer.js.map +0 -1
- package/dist/expression/evaluator.d.ts +0 -16
- package/dist/expression/evaluator.d.ts.map +0 -1
- package/dist/expression/evaluator.js +0 -382
- package/dist/expression/evaluator.js.map +0 -1
- package/dist/expression/index.d.ts +0 -5
- package/dist/expression/index.d.ts.map +0 -1
- package/dist/expression/index.js +0 -5
- package/dist/expression/index.js.map +0 -1
- package/dist/expression/parser.d.ts +0 -37
- package/dist/expression/parser.d.ts.map +0 -1
- package/dist/expression/parser.js +0 -201
- package/dist/expression/parser.js.map +0 -1
- package/dist/expression/types.d.ts +0 -123
- package/dist/expression/types.d.ts.map +0 -1
- package/dist/expression/types.js +0 -10
- package/dist/expression/types.js.map +0 -1
- package/dist/policy/field-policy.d.ts +0 -63
- package/dist/policy/field-policy.d.ts.map +0 -1
- package/dist/policy/field-policy.js +0 -138
- package/dist/policy/field-policy.js.map +0 -1
- package/dist/policy/index.d.ts +0 -3
- package/dist/policy/index.d.ts.map +0 -1
- package/dist/policy/index.js +0 -3
- package/dist/policy/index.js.map +0 -1
- package/dist/policy/precondition.d.ts +0 -58
- package/dist/policy/precondition.d.ts.map +0 -1
- package/dist/policy/precondition.js +0 -115
- package/dist/policy/precondition.js.map +0 -1
- package/dist/runtime/index.d.ts +0 -4
- package/dist/runtime/index.d.ts.map +0 -1
- package/dist/runtime/index.js +0 -4
- package/dist/runtime/index.js.map +0 -1
- package/dist/runtime/runtime.d.ts +0 -94
- package/dist/runtime/runtime.d.ts.map +0 -1
- package/dist/runtime/runtime.js +0 -294
- package/dist/runtime/runtime.js.map +0 -1
- package/dist/runtime/snapshot.d.ts +0 -39
- package/dist/runtime/snapshot.d.ts.map +0 -1
- package/dist/runtime/snapshot.js +0 -264
- package/dist/runtime/snapshot.js.map +0 -1
- package/dist/runtime/subscription.d.ts +0 -82
- package/dist/runtime/subscription.d.ts.map +0 -1
- package/dist/runtime/subscription.js +0 -222
- package/dist/runtime/subscription.js.map +0 -1
- package/dist/schema/integration.d.ts +0 -89
- package/dist/schema/integration.d.ts.map +0 -1
- package/dist/schema/integration.js +0 -171
- package/dist/schema/integration.js.map +0 -1
- package/dist/schema/validation.d.ts +0 -51
- package/dist/schema/validation.d.ts.map +0 -1
- package/dist/schema/validation.js +0 -212
- package/dist/schema/validation.js.map +0 -1
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { sha256, sha256Sync, hashSchema, hashSchemaSync, generateRequirementId, generateTraceId, } from "./hash.js";
|
|
3
|
+
describe("Hash Utilities", () => {
|
|
4
|
+
describe("sha256", () => {
|
|
5
|
+
it("should produce consistent hash for same input", async () => {
|
|
6
|
+
const hash1 = await sha256("hello world");
|
|
7
|
+
const hash2 = await sha256("hello world");
|
|
8
|
+
expect(hash1).toBe(hash2);
|
|
9
|
+
});
|
|
10
|
+
it("should produce different hash for different input", async () => {
|
|
11
|
+
const hash1 = await sha256("hello");
|
|
12
|
+
const hash2 = await sha256("world");
|
|
13
|
+
expect(hash1).not.toBe(hash2);
|
|
14
|
+
});
|
|
15
|
+
it("should produce 64 character hex string", async () => {
|
|
16
|
+
const hash = await sha256("test");
|
|
17
|
+
expect(hash).toHaveLength(64);
|
|
18
|
+
expect(hash).toMatch(/^[a-f0-9]{64}$/);
|
|
19
|
+
});
|
|
20
|
+
it("should handle empty string", async () => {
|
|
21
|
+
const hash = await sha256("");
|
|
22
|
+
expect(hash).toHaveLength(64);
|
|
23
|
+
});
|
|
24
|
+
it("should handle unicode characters", async () => {
|
|
25
|
+
const hash = await sha256("안녕하세요");
|
|
26
|
+
expect(hash).toHaveLength(64);
|
|
27
|
+
});
|
|
28
|
+
it("should match known SHA-256 hash", async () => {
|
|
29
|
+
// "test" hashes to this known value
|
|
30
|
+
const hash = await sha256("test");
|
|
31
|
+
expect(hash).toBe("9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08");
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
describe("sha256Sync", () => {
|
|
35
|
+
it("should match async sha256", async () => {
|
|
36
|
+
const syncHash = sha256Sync("hello world");
|
|
37
|
+
const asyncHash = await sha256("hello world");
|
|
38
|
+
expect(syncHash).toBe(asyncHash);
|
|
39
|
+
});
|
|
40
|
+
it("should match known SHA-256 hash", () => {
|
|
41
|
+
const hash = sha256Sync("test");
|
|
42
|
+
expect(hash).toBe("9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08");
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
describe("hashSchema", () => {
|
|
46
|
+
it("should produce consistent hash for same schema", async () => {
|
|
47
|
+
const schema = {
|
|
48
|
+
id: "manifesto:test",
|
|
49
|
+
version: "1.0.0",
|
|
50
|
+
types: {},
|
|
51
|
+
state: { fields: {} },
|
|
52
|
+
computed: { fields: {} },
|
|
53
|
+
actions: {},
|
|
54
|
+
};
|
|
55
|
+
const hash1 = await hashSchema(schema);
|
|
56
|
+
const hash2 = await hashSchema(schema);
|
|
57
|
+
expect(hash1).toBe(hash2);
|
|
58
|
+
});
|
|
59
|
+
it("should produce same hash regardless of key order", async () => {
|
|
60
|
+
const schema1 = {
|
|
61
|
+
id: "manifesto:test",
|
|
62
|
+
version: "1.0.0",
|
|
63
|
+
types: {},
|
|
64
|
+
state: { fields: {} },
|
|
65
|
+
computed: { fields: {} },
|
|
66
|
+
actions: {},
|
|
67
|
+
};
|
|
68
|
+
const schema2 = {
|
|
69
|
+
actions: {},
|
|
70
|
+
computed: { fields: {} },
|
|
71
|
+
state: { fields: {} },
|
|
72
|
+
types: {},
|
|
73
|
+
version: "1.0.0",
|
|
74
|
+
id: "manifesto:test",
|
|
75
|
+
};
|
|
76
|
+
const hash1 = await hashSchema(schema1);
|
|
77
|
+
const hash2 = await hashSchema(schema2);
|
|
78
|
+
expect(hash1).toBe(hash2);
|
|
79
|
+
});
|
|
80
|
+
it("should produce different hash for different schemas", async () => {
|
|
81
|
+
const schema1 = {
|
|
82
|
+
id: "test1",
|
|
83
|
+
version: "1.0.0",
|
|
84
|
+
types: {},
|
|
85
|
+
state: { fields: {} },
|
|
86
|
+
computed: { fields: {} },
|
|
87
|
+
actions: {},
|
|
88
|
+
};
|
|
89
|
+
const schema2 = {
|
|
90
|
+
id: "test2",
|
|
91
|
+
version: "1.0.0",
|
|
92
|
+
types: {},
|
|
93
|
+
state: { fields: {} },
|
|
94
|
+
computed: { fields: {} },
|
|
95
|
+
actions: {},
|
|
96
|
+
};
|
|
97
|
+
const hash1 = await hashSchema(schema1);
|
|
98
|
+
const hash2 = await hashSchema(schema2);
|
|
99
|
+
expect(hash1).not.toBe(hash2);
|
|
100
|
+
});
|
|
101
|
+
it("should detect changes in nested structures", async () => {
|
|
102
|
+
const schema1 = {
|
|
103
|
+
id: "manifesto:test",
|
|
104
|
+
version: "1.0.0",
|
|
105
|
+
types: {},
|
|
106
|
+
state: { fields: { count: { type: "number", required: true } } },
|
|
107
|
+
computed: { fields: {} },
|
|
108
|
+
actions: {},
|
|
109
|
+
};
|
|
110
|
+
const schema2 = {
|
|
111
|
+
id: "manifesto:test",
|
|
112
|
+
version: "1.0.0",
|
|
113
|
+
types: {},
|
|
114
|
+
state: { fields: { count: { type: "string", required: true } } },
|
|
115
|
+
computed: { fields: {} },
|
|
116
|
+
actions: {},
|
|
117
|
+
};
|
|
118
|
+
const hash1 = await hashSchema(schema1);
|
|
119
|
+
const hash2 = await hashSchema(schema2);
|
|
120
|
+
expect(hash1).not.toBe(hash2);
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
describe("hashSchemaSync", () => {
|
|
124
|
+
it("should match async hashSchema", async () => {
|
|
125
|
+
const schema = {
|
|
126
|
+
id: "manifesto:test",
|
|
127
|
+
version: "1.0.0",
|
|
128
|
+
types: {},
|
|
129
|
+
state: { fields: {} },
|
|
130
|
+
computed: { fields: {} },
|
|
131
|
+
actions: {},
|
|
132
|
+
};
|
|
133
|
+
const syncHash = hashSchemaSync(schema);
|
|
134
|
+
const asyncHash = await hashSchema(schema);
|
|
135
|
+
expect(syncHash).toBe(asyncHash);
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
describe("generateRequirementId", () => {
|
|
139
|
+
it("should produce consistent ID for same inputs", async () => {
|
|
140
|
+
const id1 = await generateRequirementId("schema-hash", "intent-1", "action", "path");
|
|
141
|
+
const id2 = await generateRequirementId("schema-hash", "intent-1", "action", "path");
|
|
142
|
+
expect(id1).toBe(id2);
|
|
143
|
+
});
|
|
144
|
+
it("should produce different ID for different inputs", async () => {
|
|
145
|
+
const id1 = await generateRequirementId("schema-hash", "intent-1", "action", "path");
|
|
146
|
+
const id2 = await generateRequirementId("schema-hash", "intent-2", "action", "path");
|
|
147
|
+
expect(id1).not.toBe(id2);
|
|
148
|
+
});
|
|
149
|
+
it("should produce ID with req- prefix", async () => {
|
|
150
|
+
const id = await generateRequirementId("hash", "intent", "action", "path");
|
|
151
|
+
expect(id).toMatch(/^req-[a-f0-9]{16}$/);
|
|
152
|
+
});
|
|
153
|
+
it("should produce 20 character ID (req- + 16 hex chars)", async () => {
|
|
154
|
+
const id = await generateRequirementId("hash", "intent", "action", "path");
|
|
155
|
+
expect(id).toHaveLength(20);
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
describe("generateTraceId", () => {
|
|
159
|
+
it("should produce unique IDs for different indexes", () => {
|
|
160
|
+
const id1 = generateTraceId(0);
|
|
161
|
+
const id2 = generateTraceId(1);
|
|
162
|
+
expect(id1).not.toBe(id2);
|
|
163
|
+
});
|
|
164
|
+
it("should produce ID with trace- prefix", () => {
|
|
165
|
+
const id = generateTraceId(42);
|
|
166
|
+
expect(id).toBe("trace-42");
|
|
167
|
+
});
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
//# sourceMappingURL=hash.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hash.test.js","sourceRoot":"","sources":["../../src/utils/hash.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { SemanticPath } from "../schema/common.js";
|
|
2
|
+
/**
|
|
3
|
+
* Parse a dot-separated path into segments
|
|
4
|
+
*/
|
|
5
|
+
export declare function parsePath(path: SemanticPath): string[];
|
|
6
|
+
/**
|
|
7
|
+
* Join path segments into a semantic path
|
|
8
|
+
*/
|
|
9
|
+
export declare function joinPath(...segments: string[]): SemanticPath;
|
|
10
|
+
/**
|
|
11
|
+
* Get value at path from object
|
|
12
|
+
* Returns undefined for non-existent paths (never throws)
|
|
13
|
+
*/
|
|
14
|
+
export declare function getByPath(obj: unknown, path: SemanticPath): unknown;
|
|
15
|
+
/**
|
|
16
|
+
* Immutably set value at path
|
|
17
|
+
* Creates intermediate objects as needed
|
|
18
|
+
*/
|
|
19
|
+
export declare function setByPath(obj: unknown, path: SemanticPath, value: unknown): unknown;
|
|
20
|
+
/**
|
|
21
|
+
* Immutably remove value at path
|
|
22
|
+
*/
|
|
23
|
+
export declare function unsetByPath(obj: unknown, path: SemanticPath): unknown;
|
|
24
|
+
/**
|
|
25
|
+
* Immutably shallow merge at path
|
|
26
|
+
*/
|
|
27
|
+
export declare function mergeAtPath(obj: unknown, path: SemanticPath, value: Record<string, unknown>): unknown;
|
|
28
|
+
/**
|
|
29
|
+
* Check if a path exists in an object
|
|
30
|
+
*/
|
|
31
|
+
export declare function hasPath(obj: unknown, path: SemanticPath): boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Get parent path
|
|
34
|
+
*/
|
|
35
|
+
export declare function parentPath(path: SemanticPath): SemanticPath;
|
|
36
|
+
/**
|
|
37
|
+
* Get last segment of path
|
|
38
|
+
*/
|
|
39
|
+
export declare function lastSegment(path: SemanticPath): string;
|
|
40
|
+
//# sourceMappingURL=path.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path.d.ts","sourceRoot":"","sources":["../../src/utils/path.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,EAAE,CAGtD;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,QAAQ,EAAE,MAAM,EAAE,GAAG,YAAY,CAE5D;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO,CAmBnE;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAKnF;AAmBD;;GAEG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO,CAKrE;AAsBD;;GAEG;AACH,wBAAgB,WAAW,CACzB,GAAG,EAAE,OAAO,EACZ,IAAI,EAAE,YAAY,EAClB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,OAAO,CAQT;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO,CAuBjE;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,YAAY,GAAG,YAAY,CAG3D;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAGtD"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parse a dot-separated path into segments
|
|
3
|
+
*/
|
|
4
|
+
export function parsePath(path) {
|
|
5
|
+
if (!path)
|
|
6
|
+
return [];
|
|
7
|
+
return path.split(".");
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Join path segments into a semantic path
|
|
11
|
+
*/
|
|
12
|
+
export function joinPath(...segments) {
|
|
13
|
+
return segments.filter(Boolean).join(".");
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Get value at path from object
|
|
17
|
+
* Returns undefined for non-existent paths (never throws)
|
|
18
|
+
*/
|
|
19
|
+
export function getByPath(obj, path) {
|
|
20
|
+
if (!path)
|
|
21
|
+
return obj;
|
|
22
|
+
const segments = parsePath(path);
|
|
23
|
+
let current = obj;
|
|
24
|
+
for (const segment of segments) {
|
|
25
|
+
if (current === null || current === undefined) {
|
|
26
|
+
return undefined;
|
|
27
|
+
}
|
|
28
|
+
if (typeof current === "object") {
|
|
29
|
+
current = current[segment];
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
return undefined;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return current;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Immutably set value at path
|
|
39
|
+
* Creates intermediate objects as needed
|
|
40
|
+
*/
|
|
41
|
+
export function setByPath(obj, path, value) {
|
|
42
|
+
if (!path)
|
|
43
|
+
return value;
|
|
44
|
+
const segments = parsePath(path);
|
|
45
|
+
return setByPathSegments(obj, segments, value);
|
|
46
|
+
}
|
|
47
|
+
function setByPathSegments(obj, segments, value) {
|
|
48
|
+
if (segments.length === 0)
|
|
49
|
+
return value;
|
|
50
|
+
const [head, ...tail] = segments;
|
|
51
|
+
const current = obj !== null && typeof obj === "object" ? obj : {};
|
|
52
|
+
if (tail.length === 0) {
|
|
53
|
+
return { ...current, [head]: value };
|
|
54
|
+
}
|
|
55
|
+
const nested = current[head];
|
|
56
|
+
return {
|
|
57
|
+
...current,
|
|
58
|
+
[head]: setByPathSegments(nested, tail, value),
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Immutably remove value at path
|
|
63
|
+
*/
|
|
64
|
+
export function unsetByPath(obj, path) {
|
|
65
|
+
if (!path)
|
|
66
|
+
return undefined;
|
|
67
|
+
const segments = parsePath(path);
|
|
68
|
+
return unsetByPathSegments(obj, segments);
|
|
69
|
+
}
|
|
70
|
+
function unsetByPathSegments(obj, segments) {
|
|
71
|
+
if (segments.length === 0 || obj === null || typeof obj !== "object") {
|
|
72
|
+
return obj;
|
|
73
|
+
}
|
|
74
|
+
const [head, ...tail] = segments;
|
|
75
|
+
const current = obj;
|
|
76
|
+
if (tail.length === 0) {
|
|
77
|
+
const { [head]: _, ...rest } = current;
|
|
78
|
+
return rest;
|
|
79
|
+
}
|
|
80
|
+
const nested = current[head];
|
|
81
|
+
return {
|
|
82
|
+
...current,
|
|
83
|
+
[head]: unsetByPathSegments(nested, tail),
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Immutably shallow merge at path
|
|
88
|
+
*/
|
|
89
|
+
export function mergeAtPath(obj, path, value) {
|
|
90
|
+
const existing = getByPath(obj, path);
|
|
91
|
+
const merged = existing !== null && typeof existing === "object"
|
|
92
|
+
? { ...existing, ...value }
|
|
93
|
+
: value;
|
|
94
|
+
return setByPath(obj, path, merged);
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Check if a path exists in an object
|
|
98
|
+
*/
|
|
99
|
+
export function hasPath(obj, path) {
|
|
100
|
+
if (!path)
|
|
101
|
+
return obj !== undefined;
|
|
102
|
+
const segments = parsePath(path);
|
|
103
|
+
let current = obj;
|
|
104
|
+
for (const segment of segments) {
|
|
105
|
+
if (current === null || current === undefined) {
|
|
106
|
+
return false;
|
|
107
|
+
}
|
|
108
|
+
if (typeof current !== "object") {
|
|
109
|
+
return false;
|
|
110
|
+
}
|
|
111
|
+
if (!(segment in current)) {
|
|
112
|
+
return false;
|
|
113
|
+
}
|
|
114
|
+
current = current[segment];
|
|
115
|
+
}
|
|
116
|
+
return true;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Get parent path
|
|
120
|
+
*/
|
|
121
|
+
export function parentPath(path) {
|
|
122
|
+
const segments = parsePath(path);
|
|
123
|
+
return segments.slice(0, -1).join(".");
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Get last segment of path
|
|
127
|
+
*/
|
|
128
|
+
export function lastSegment(path) {
|
|
129
|
+
const segments = parsePath(path);
|
|
130
|
+
return segments[segments.length - 1] ?? "";
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=path.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path.js","sourceRoot":"","sources":["../../src/utils/path.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path.test.d.ts","sourceRoot":"","sources":["../../src/utils/path.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { parsePath, joinPath, getByPath, setByPath, unsetByPath, mergeAtPath, hasPath, parentPath, lastSegment, } from "./path.js";
|
|
3
|
+
describe("Path Utilities", () => {
|
|
4
|
+
describe("parsePath", () => {
|
|
5
|
+
it("should parse dot-separated path", () => {
|
|
6
|
+
expect(parsePath("a.b.c")).toEqual(["a", "b", "c"]);
|
|
7
|
+
});
|
|
8
|
+
it("should return single segment for simple path", () => {
|
|
9
|
+
expect(parsePath("name")).toEqual(["name"]);
|
|
10
|
+
});
|
|
11
|
+
it("should return empty array for empty path", () => {
|
|
12
|
+
expect(parsePath("")).toEqual([]);
|
|
13
|
+
});
|
|
14
|
+
});
|
|
15
|
+
describe("joinPath", () => {
|
|
16
|
+
it("should join segments with dots", () => {
|
|
17
|
+
expect(joinPath("a", "b", "c")).toBe("a.b.c");
|
|
18
|
+
});
|
|
19
|
+
it("should filter empty segments", () => {
|
|
20
|
+
expect(joinPath("a", "", "b")).toBe("a.b");
|
|
21
|
+
});
|
|
22
|
+
it("should handle single segment", () => {
|
|
23
|
+
expect(joinPath("a")).toBe("a");
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
describe("getByPath", () => {
|
|
27
|
+
it("should get value at path", () => {
|
|
28
|
+
const obj = { a: { b: { c: 42 } } };
|
|
29
|
+
expect(getByPath(obj, "a.b.c")).toBe(42);
|
|
30
|
+
});
|
|
31
|
+
it("should get nested object", () => {
|
|
32
|
+
const obj = { a: { b: { c: 42 } } };
|
|
33
|
+
expect(getByPath(obj, "a.b")).toEqual({ c: 42 });
|
|
34
|
+
});
|
|
35
|
+
it("should return undefined for non-existent path", () => {
|
|
36
|
+
const obj = { a: { b: 1 } };
|
|
37
|
+
expect(getByPath(obj, "a.c")).toBeUndefined();
|
|
38
|
+
});
|
|
39
|
+
it("should return undefined for path through non-object", () => {
|
|
40
|
+
const obj = { a: 1 };
|
|
41
|
+
expect(getByPath(obj, "a.b")).toBeUndefined();
|
|
42
|
+
});
|
|
43
|
+
it("should return object for empty path", () => {
|
|
44
|
+
const obj = { a: 1 };
|
|
45
|
+
expect(getByPath(obj, "")).toEqual({ a: 1 });
|
|
46
|
+
});
|
|
47
|
+
it("should handle null values", () => {
|
|
48
|
+
const obj = { a: null };
|
|
49
|
+
expect(getByPath(obj, "a")).toBeNull();
|
|
50
|
+
expect(getByPath(obj, "a.b")).toBeUndefined();
|
|
51
|
+
});
|
|
52
|
+
it("should get array elements", () => {
|
|
53
|
+
const obj = { items: [1, 2, 3] };
|
|
54
|
+
expect(getByPath(obj, "items")).toEqual([1, 2, 3]);
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
describe("setByPath", () => {
|
|
58
|
+
it("should set value at path", () => {
|
|
59
|
+
const obj = { a: { b: 1 } };
|
|
60
|
+
const result = setByPath(obj, "a.b", 2);
|
|
61
|
+
expect(result).toEqual({ a: { b: 2 } });
|
|
62
|
+
});
|
|
63
|
+
it("should not mutate original object", () => {
|
|
64
|
+
const obj = { a: { b: 1 } };
|
|
65
|
+
setByPath(obj, "a.b", 2);
|
|
66
|
+
expect(obj).toEqual({ a: { b: 1 } });
|
|
67
|
+
});
|
|
68
|
+
it("should create intermediate objects", () => {
|
|
69
|
+
const obj = {};
|
|
70
|
+
const result = setByPath(obj, "a.b.c", 42);
|
|
71
|
+
expect(result).toEqual({ a: { b: { c: 42 } } });
|
|
72
|
+
});
|
|
73
|
+
it("should replace non-object with object when needed", () => {
|
|
74
|
+
const obj = { a: 1 };
|
|
75
|
+
const result = setByPath(obj, "a.b", 2);
|
|
76
|
+
expect(result).toEqual({ a: { b: 2 } });
|
|
77
|
+
});
|
|
78
|
+
it("should replace root for empty path", () => {
|
|
79
|
+
const obj = { a: 1 };
|
|
80
|
+
const result = setByPath(obj, "", "new");
|
|
81
|
+
expect(result).toBe("new");
|
|
82
|
+
});
|
|
83
|
+
it("should preserve other keys", () => {
|
|
84
|
+
const obj = { a: 1, b: { c: 2, d: 3 } };
|
|
85
|
+
const result = setByPath(obj, "b.c", 10);
|
|
86
|
+
expect(result).toEqual({ a: 1, b: { c: 10, d: 3 } });
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
describe("unsetByPath", () => {
|
|
90
|
+
it("should remove value at path", () => {
|
|
91
|
+
const obj = { a: 1, b: 2 };
|
|
92
|
+
const result = unsetByPath(obj, "a");
|
|
93
|
+
expect(result).toEqual({ b: 2 });
|
|
94
|
+
});
|
|
95
|
+
it("should not mutate original object", () => {
|
|
96
|
+
const obj = { a: 1, b: 2 };
|
|
97
|
+
unsetByPath(obj, "a");
|
|
98
|
+
expect(obj).toEqual({ a: 1, b: 2 });
|
|
99
|
+
});
|
|
100
|
+
it("should remove nested value", () => {
|
|
101
|
+
const obj = { a: { b: 1, c: 2 } };
|
|
102
|
+
const result = unsetByPath(obj, "a.b");
|
|
103
|
+
expect(result).toEqual({ a: { c: 2 } });
|
|
104
|
+
});
|
|
105
|
+
it("should return undefined for empty path", () => {
|
|
106
|
+
const obj = { a: 1 };
|
|
107
|
+
const result = unsetByPath(obj, "");
|
|
108
|
+
expect(result).toBeUndefined();
|
|
109
|
+
});
|
|
110
|
+
it("should handle non-existent path gracefully", () => {
|
|
111
|
+
const obj = { a: 1 };
|
|
112
|
+
const result = unsetByPath(obj, "b.c");
|
|
113
|
+
expect(result).toEqual({ a: 1 });
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
describe("mergeAtPath", () => {
|
|
117
|
+
it("should merge objects at path", () => {
|
|
118
|
+
const obj = { a: { b: 1, c: 2 } };
|
|
119
|
+
const result = mergeAtPath(obj, "a", { c: 3, d: 4 });
|
|
120
|
+
expect(result).toEqual({ a: { b: 1, c: 3, d: 4 } });
|
|
121
|
+
});
|
|
122
|
+
it("should not mutate original object", () => {
|
|
123
|
+
const obj = { a: { b: 1 } };
|
|
124
|
+
mergeAtPath(obj, "a", { c: 2 });
|
|
125
|
+
expect(obj).toEqual({ a: { b: 1 } });
|
|
126
|
+
});
|
|
127
|
+
it("should create path if it does not exist", () => {
|
|
128
|
+
const obj = {};
|
|
129
|
+
const result = mergeAtPath(obj, "a", { b: 1 });
|
|
130
|
+
expect(result).toEqual({ a: { b: 1 } });
|
|
131
|
+
});
|
|
132
|
+
it("should replace non-object with merged value", () => {
|
|
133
|
+
const obj = { a: 1 };
|
|
134
|
+
const result = mergeAtPath(obj, "a", { b: 2 });
|
|
135
|
+
expect(result).toEqual({ a: { b: 2 } });
|
|
136
|
+
});
|
|
137
|
+
it("should merge at root for empty path", () => {
|
|
138
|
+
const obj = { a: 1 };
|
|
139
|
+
const result = mergeAtPath(obj, "", { b: 2 });
|
|
140
|
+
expect(result).toEqual({ a: 1, b: 2 });
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
describe("hasPath", () => {
|
|
144
|
+
it("should return true for existing path", () => {
|
|
145
|
+
const obj = { a: { b: 1 } };
|
|
146
|
+
expect(hasPath(obj, "a.b")).toBe(true);
|
|
147
|
+
});
|
|
148
|
+
it("should return true for path to null value", () => {
|
|
149
|
+
const obj = { a: null };
|
|
150
|
+
expect(hasPath(obj, "a")).toBe(true);
|
|
151
|
+
});
|
|
152
|
+
it("should return false for non-existent path", () => {
|
|
153
|
+
const obj = { a: { b: 1 } };
|
|
154
|
+
expect(hasPath(obj, "a.c")).toBe(false);
|
|
155
|
+
});
|
|
156
|
+
it("should return false for path through non-object", () => {
|
|
157
|
+
const obj = { a: 1 };
|
|
158
|
+
expect(hasPath(obj, "a.b")).toBe(false);
|
|
159
|
+
});
|
|
160
|
+
it("should return true for empty path if object exists", () => {
|
|
161
|
+
const obj = { a: 1 };
|
|
162
|
+
expect(hasPath(obj, "")).toBe(true);
|
|
163
|
+
});
|
|
164
|
+
it("should return false for undefined value", () => {
|
|
165
|
+
expect(hasPath(undefined, "")).toBe(false);
|
|
166
|
+
});
|
|
167
|
+
});
|
|
168
|
+
describe("parentPath", () => {
|
|
169
|
+
it("should return parent path", () => {
|
|
170
|
+
expect(parentPath("a.b.c")).toBe("a.b");
|
|
171
|
+
});
|
|
172
|
+
it("should return empty string for single segment", () => {
|
|
173
|
+
expect(parentPath("a")).toBe("");
|
|
174
|
+
});
|
|
175
|
+
it("should return empty string for empty path", () => {
|
|
176
|
+
expect(parentPath("")).toBe("");
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
describe("lastSegment", () => {
|
|
180
|
+
it("should return last segment", () => {
|
|
181
|
+
expect(lastSegment("a.b.c")).toBe("c");
|
|
182
|
+
});
|
|
183
|
+
it("should return segment for single segment path", () => {
|
|
184
|
+
expect(lastSegment("a")).toBe("a");
|
|
185
|
+
});
|
|
186
|
+
it("should return empty string for empty path", () => {
|
|
187
|
+
expect(lastSegment("")).toBe("");
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
});
|
|
191
|
+
//# sourceMappingURL=path.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path.test.js","sourceRoot":"","sources":["../../src/utils/path.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,SAAS,EACT,QAAQ,EACR,SAAS,EACT,SAAS,EACT,WAAW,EACX,WAAW,EACX,OAAO,EACP,UAAU,EACV,WAAW,GACZ,MAAM,WAAW,CAAC;AAEnB,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;QACzB,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;YACzC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;YACtD,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;YAClD,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;QACxB,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;YACxC,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;YACtC,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;YACtC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;QACzB,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;YAClC,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;YACpC,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;YAClC,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;YACpC,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;YACvD,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5B,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;QAChD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;YAC7D,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;YACrB,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;QAChD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;YACrB,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;YACnC,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC;YACxB,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;YACvC,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;QAChD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;YACnC,MAAM,GAAG,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YACjC,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;QACzB,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;YAClC,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5B,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YACxC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;YAC3C,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5B,SAAS,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YACzB,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;YAC5C,MAAM,GAAG,GAAG,EAAE,CAAC;YACf,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;YAC3C,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;YAC3D,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;YACrB,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YACxC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;YAC5C,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;YACrB,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;YACzC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;YACpC,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;YACzC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;YACrC,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;YAC3B,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YACrC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;YAC3C,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;YAC3B,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YACtB,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;YACpC,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAClC,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACvC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;YACrB,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACpC,MAAM,CAAC,MAAM,CAAC,CAAC,aAAa,EAAE,CAAC;QACjC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;YACpD,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;YACrB,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACvC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;YACtC,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAClC,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YACrD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;YAC3C,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5B,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YAChC,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,MAAM,GAAG,GAAG,EAAE,CAAC;YACf,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YAC/C,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;YACrD,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;YACrB,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YAC/C,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;YACrB,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YAC9C,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;QACvB,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;YAC9C,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5B,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACnD,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC;YACxB,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACnD,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5B,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;YACzD,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;YACrB,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;YAC5D,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;YACrB,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;QAC1B,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;YACnC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;YACvD,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACnD,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;YACpC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;YACvD,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACnD,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|