@json-schema-engine/core 0.0.1
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/LICENSE +21 -0
- package/README.md +50 -0
- package/dist/coverage.d.ts +30 -0
- package/dist/coverage.d.ts.map +1 -0
- package/dist/coverage.js +81 -0
- package/dist/coverage.js.map +1 -0
- package/dist/cursor.d.ts +16 -0
- package/dist/cursor.d.ts.map +1 -0
- package/dist/cursor.js +28 -0
- package/dist/cursor.js.map +1 -0
- package/dist/dialect.d.ts +316 -0
- package/dist/dialect.d.ts.map +1 -0
- package/dist/dialect.js +135 -0
- package/dist/dialect.js.map +1 -0
- package/dist/engine.d.ts +203 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js +493 -0
- package/dist/engine.js.map +1 -0
- package/dist/index.d.ts +182 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +370 -0
- package/dist/index.js.map +1 -0
- package/dist/json.d.ts +49 -0
- package/dist/json.d.ts.map +1 -0
- package/dist/json.js +128 -0
- package/dist/json.js.map +1 -0
- package/dist/keywords/applicator.d.ts +57 -0
- package/dist/keywords/applicator.d.ts.map +1 -0
- package/dist/keywords/applicator.js +789 -0
- package/dist/keywords/applicator.js.map +1 -0
- package/dist/keywords/core.d.ts +42 -0
- package/dist/keywords/core.d.ts.map +1 -0
- package/dist/keywords/core.js +139 -0
- package/dist/keywords/core.js.map +1 -0
- package/dist/keywords/format.d.ts +43 -0
- package/dist/keywords/format.d.ts.map +1 -0
- package/dist/keywords/format.js +101 -0
- package/dist/keywords/format.js.map +1 -0
- package/dist/keywords/metaschemas2019.d.ts +3 -0
- package/dist/keywords/metaschemas2019.d.ts.map +1 -0
- package/dist/keywords/metaschemas2019.js +406 -0
- package/dist/keywords/metaschemas2019.js.map +1 -0
- package/dist/keywords/metaschemas2020.d.ts +3 -0
- package/dist/keywords/metaschemas2020.d.ts.map +1 -0
- package/dist/keywords/metaschemas2020.js +441 -0
- package/dist/keywords/metaschemas2020.js.map +1 -0
- package/dist/keywords/metaschemas6.d.ts +3 -0
- package/dist/keywords/metaschemas6.d.ts.map +1 -0
- package/dist/keywords/metaschemas6.js +221 -0
- package/dist/keywords/metaschemas6.js.map +1 -0
- package/dist/keywords/metaschemas7.d.ts +3 -0
- package/dist/keywords/metaschemas7.d.ts.map +1 -0
- package/dist/keywords/metaschemas7.js +248 -0
- package/dist/keywords/metaschemas7.js.map +1 -0
- package/dist/keywords/unevaluated.d.ts +14 -0
- package/dist/keywords/unevaluated.d.ts.map +1 -0
- package/dist/keywords/unevaluated.js +296 -0
- package/dist/keywords/unevaluated.js.map +1 -0
- package/dist/keywords/validation.d.ts +21 -0
- package/dist/keywords/validation.d.ts.map +1 -0
- package/dist/keywords/validation.js +332 -0
- package/dist/keywords/validation.js.map +1 -0
- package/dist/keywords/vocab2019.d.ts +36 -0
- package/dist/keywords/vocab2019.d.ts.map +1 -0
- package/dist/keywords/vocab2019.js +585 -0
- package/dist/keywords/vocab2019.js.map +1 -0
- package/dist/keywords/vocab2020.d.ts +20 -0
- package/dist/keywords/vocab2020.d.ts.map +1 -0
- package/dist/keywords/vocab2020.js +55 -0
- package/dist/keywords/vocab2020.js.map +1 -0
- package/dist/keywords/vocab7.d.ts +46 -0
- package/dist/keywords/vocab7.d.ts.map +1 -0
- package/dist/keywords/vocab7.js +305 -0
- package/dist/keywords/vocab7.js.map +1 -0
- package/dist/loader.d.ts +41 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +13 -0
- package/dist/loader.js.map +1 -0
- package/dist/lowering.d.ts +371 -0
- package/dist/lowering.d.ts.map +1 -0
- package/dist/lowering.js +59 -0
- package/dist/lowering.js.map +1 -0
- package/dist/output.d.ts +251 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +357 -0
- package/dist/output.js.map +1 -0
- package/dist/records.d.ts +71 -0
- package/dist/records.d.ts.map +1 -0
- package/dist/records.js +150 -0
- package/dist/records.js.map +1 -0
- package/dist/ref.d.ts +10 -0
- package/dist/ref.d.ts.map +1 -0
- package/dist/ref.js +5 -0
- package/dist/ref.js.map +1 -0
- package/dist/regex.d.ts +45 -0
- package/dist/regex.d.ts.map +1 -0
- package/dist/regex.js +163 -0
- package/dist/regex.js.map +1 -0
- package/dist/registry.d.ts +141 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +407 -0
- package/dist/registry.js.map +1 -0
- package/dist/result.d.ts +109 -0
- package/dist/result.d.ts.map +1 -0
- package/dist/result.js +112 -0
- package/dist/result.js.map +1 -0
- package/dist/uri.d.ts +18 -0
- package/dist/uri.d.ts.map +1 -0
- package/dist/uri.js +27 -0
- package/dist/uri.js.map +1 -0
- package/dist/walk.d.ts +25 -0
- package/dist/walk.d.ts.map +1 -0
- package/dist/walk.js +65 -0
- package/dist/walk.js.map +1 -0
- package/package.json +32 -0
- package/src/coverage.ts +88 -0
- package/src/cursor.ts +42 -0
- package/src/dialect.ts +428 -0
- package/src/engine.ts +741 -0
- package/src/index.ts +699 -0
- package/src/json.ts +137 -0
- package/src/keywords/applicator.ts +895 -0
- package/src/keywords/core.ts +168 -0
- package/src/keywords/format.ts +143 -0
- package/src/keywords/metaschemas2019.ts +410 -0
- package/src/keywords/metaschemas2020.ts +443 -0
- package/src/keywords/metaschemas6.ts +226 -0
- package/src/keywords/metaschemas7.ts +253 -0
- package/src/keywords/unevaluated.ts +329 -0
- package/src/keywords/validation.ts +627 -0
- package/src/keywords/vocab2019.ts +676 -0
- package/src/keywords/vocab2020.ts +82 -0
- package/src/keywords/vocab7.ts +393 -0
- package/src/loader.ts +60 -0
- package/src/lowering.ts +414 -0
- package/src/output.ts +651 -0
- package/src/records.ts +226 -0
- package/src/ref.ts +14 -0
- package/src/regex.ts +171 -0
- package/src/registry.ts +481 -0
- package/src/result.ts +252 -0
- package/src/uri.ts +35 -0
- package/src/walk.ts +88 -0
package/dist/engine.js
ADDED
|
@@ -0,0 +1,493 @@
|
|
|
1
|
+
// Evaluation engine: frame-scoped record channel (DESIGN.md §4, normative),
|
|
2
|
+
// evaluation-path tracking with lazy string materialization, cycle guard,
|
|
3
|
+
// annotation retention.
|
|
4
|
+
//
|
|
5
|
+
// Channel rules implemented here and nowhere else:
|
|
6
|
+
// 1. each schema application pushes a frame;
|
|
7
|
+
// 2. annotate() appends an annotation record (the keyword's own value) and
|
|
8
|
+
// produce() a dependency record (computed data for other keywords) to
|
|
9
|
+
// the current frame;
|
|
10
|
+
// 3. on success the frame merges into its parent, on failure it is
|
|
11
|
+
// discarded;
|
|
12
|
+
// 4. visibility = the current frame's dependency records filtered by
|
|
13
|
+
// cursor identity;
|
|
14
|
+
// 5. the annotation result is the root frame's annotation records filtered
|
|
15
|
+
// by the annotation selection; selection never affects rule 4;
|
|
16
|
+
// 6. relevance (draft-03 §12.2): a keyword that accepts makes the errors of
|
|
17
|
+
// its rejecting sub-evaluations irrelevant — evaluateKeyword drops them
|
|
18
|
+
// (kept aside only when tracing, for verbose output); rule 3 is the same
|
|
19
|
+
// transition for a rejecting schema object's accepting sub-evaluations.
|
|
20
|
+
import { isObject, escapeSegment } from "./json.js";
|
|
21
|
+
import { resolveUri, splitFragment } from "./uri.js";
|
|
22
|
+
import { rootCursor } from "./cursor.js";
|
|
23
|
+
import { unknownKeywordId, } from "./dialect.js";
|
|
24
|
+
import { DEFAULT_MAX_DEPTH, InvalidSchemaError, MaxDepthExceededError, describeNonSchema, } from "./registry.js";
|
|
25
|
+
import { RegexCache } from "./regex.js";
|
|
26
|
+
/** Thrown when a schema is re-entered at the same instance location (D8/cycle guard). */
|
|
27
|
+
export class InfiniteLoopError extends Error {
|
|
28
|
+
}
|
|
29
|
+
/** Thrown when a dialect disallows unknown keywords and one is present. */
|
|
30
|
+
export class UnknownKeywordError extends Error {
|
|
31
|
+
}
|
|
32
|
+
/** Thrown when a keyword reads a dependency behavior id it never declared via `analyze().consumes`. */
|
|
33
|
+
export class UndeclaredConsumptionError extends Error {
|
|
34
|
+
}
|
|
35
|
+
/** Thrown when a keyword produces dependency data without declaring its own id via `analyze().produces`. */
|
|
36
|
+
export class UndeclaredProductionError extends Error {
|
|
37
|
+
}
|
|
38
|
+
/** Thrown when a keyword reports an error through `ctx.error()` yet accepts the input. */
|
|
39
|
+
export class KeywordContractError extends Error {
|
|
40
|
+
}
|
|
41
|
+
/** Materializes a path node chain into its JSON Pointer string. */
|
|
42
|
+
export function materializePath(node) {
|
|
43
|
+
let s = "";
|
|
44
|
+
for (let n = node; n !== null; n = n.parent)
|
|
45
|
+
s = "/" + n.segment + s;
|
|
46
|
+
return s;
|
|
47
|
+
}
|
|
48
|
+
// Appends with a loop: an argument spread puts every element on the native
|
|
49
|
+
// stack, so `dst.push(...src)` throws past ~120k elements — a ceiling a wide
|
|
50
|
+
// instance reaches long before maxDepth does.
|
|
51
|
+
function appendAll(dst, src) {
|
|
52
|
+
for (const x of src)
|
|
53
|
+
dst.push(x);
|
|
54
|
+
}
|
|
55
|
+
/** Mutable state for one evaluation run: frames, errors, dynamic scope, and tracing. */
|
|
56
|
+
export class EvalState {
|
|
57
|
+
registry;
|
|
58
|
+
shouldRecord;
|
|
59
|
+
regexCache;
|
|
60
|
+
maxDepth;
|
|
61
|
+
frames = [{ annotations: [], dependencies: [] }];
|
|
62
|
+
/** Relevant errors, in encounter order (rule 6). */
|
|
63
|
+
errors = [];
|
|
64
|
+
// Errors made irrelevant by an accepting ancestor keyword (rule 6), kept
|
|
65
|
+
// only when tracing so verbose output can show them.
|
|
66
|
+
droppedErrors = null;
|
|
67
|
+
// Dynamic scope (D8): resources entered by schema application, outermost
|
|
68
|
+
// first. Duplicates are fine — resolution takes the first (outermost) hit.
|
|
69
|
+
dynamicScope = [];
|
|
70
|
+
// Tracing (opt-in, zero cost when off): every application as a tree, and
|
|
71
|
+
// every record regardless of frame discard — failed-branch annotations
|
|
72
|
+
// surface as droppedAnnotations in verbose outputs; dependency records are
|
|
73
|
+
// kept for diagnostics and never rendered.
|
|
74
|
+
traceRoot = null;
|
|
75
|
+
allAnnotations = null;
|
|
76
|
+
allDependencies = null;
|
|
77
|
+
// Active schema-application nesting, bounded by maxDepth (see applySchema).
|
|
78
|
+
depth = 0;
|
|
79
|
+
traceStack = [];
|
|
80
|
+
active = new Map();
|
|
81
|
+
constructor(registry, tracing = false, shouldRecord = null, regexCache = new RegexCache(), maxDepth = DEFAULT_MAX_DEPTH) {
|
|
82
|
+
this.registry = registry;
|
|
83
|
+
this.shouldRecord = shouldRecord;
|
|
84
|
+
this.regexCache = regexCache;
|
|
85
|
+
this.maxDepth = maxDepth;
|
|
86
|
+
if (tracing) {
|
|
87
|
+
this.allAnnotations = [];
|
|
88
|
+
this.allDependencies = [];
|
|
89
|
+
this.droppedErrors = [];
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/** True when tracing is active for this run. */
|
|
93
|
+
get tracing() {
|
|
94
|
+
return this.allAnnotations !== null;
|
|
95
|
+
}
|
|
96
|
+
/** Removes the errors pushed since `mark`: rejecting sub-evaluations of a keyword that accepted (rule 6). */
|
|
97
|
+
dropErrorsFrom(mark) {
|
|
98
|
+
const dropped = this.errors.splice(mark);
|
|
99
|
+
if (this.droppedErrors !== null)
|
|
100
|
+
appendAll(this.droppedErrors, dropped);
|
|
101
|
+
}
|
|
102
|
+
/** Opens a trace node for a schema application and links it under the current one. */
|
|
103
|
+
traceEnter(schemaRef, pathNode, cursor) {
|
|
104
|
+
const node = {
|
|
105
|
+
schemaRef,
|
|
106
|
+
pathNode,
|
|
107
|
+
cursor,
|
|
108
|
+
valid: true,
|
|
109
|
+
keywords: [],
|
|
110
|
+
children: [],
|
|
111
|
+
};
|
|
112
|
+
const parent = this.traceStack[this.traceStack.length - 1];
|
|
113
|
+
if (parent)
|
|
114
|
+
parent.children.push(node);
|
|
115
|
+
else
|
|
116
|
+
this.traceRoot = node;
|
|
117
|
+
this.traceStack.push(node);
|
|
118
|
+
return node;
|
|
119
|
+
}
|
|
120
|
+
/** Closes the current trace node with its final validity. */
|
|
121
|
+
traceExit(node, valid) {
|
|
122
|
+
node.valid = valid;
|
|
123
|
+
this.traceStack.pop();
|
|
124
|
+
}
|
|
125
|
+
/** Records one keyword evaluation's verdict on the current trace node. */
|
|
126
|
+
traceKeyword(name, valid) {
|
|
127
|
+
this.traceStack[this.traceStack.length - 1]?.keywords.push({ name, valid });
|
|
128
|
+
}
|
|
129
|
+
/** The innermost open frame. */
|
|
130
|
+
get frame() {
|
|
131
|
+
return this.frames[this.frames.length - 1];
|
|
132
|
+
}
|
|
133
|
+
/** Annotations surviving at the root frame — the annotation result before retention filtering. */
|
|
134
|
+
get rootAnnotations() {
|
|
135
|
+
return this.frames[0].annotations;
|
|
136
|
+
}
|
|
137
|
+
/** Dependency records surviving at the root frame. */
|
|
138
|
+
get rootDependencies() {
|
|
139
|
+
return this.frames[0].dependencies;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Records entry into a schema application for cycle detection.
|
|
143
|
+
* @throws InfiniteLoopError if this schema is already active at this cursor.
|
|
144
|
+
*/
|
|
145
|
+
enter(schemaRef, cursor) {
|
|
146
|
+
const key = `${schemaRef.baseUri}#${schemaRef.pointer}`;
|
|
147
|
+
let keys = this.active.get(cursor);
|
|
148
|
+
if (keys === undefined) {
|
|
149
|
+
keys = new Set();
|
|
150
|
+
this.active.set(cursor, keys);
|
|
151
|
+
}
|
|
152
|
+
else if (keys.has(key)) {
|
|
153
|
+
throw new InfiniteLoopError(`schema '${key}' re-entered at the same instance location`);
|
|
154
|
+
}
|
|
155
|
+
keys.add(key);
|
|
156
|
+
}
|
|
157
|
+
/** Records exit from a schema application, releasing its cycle-detection entry. */
|
|
158
|
+
exit(schemaRef, cursor) {
|
|
159
|
+
const keys = this.active.get(cursor);
|
|
160
|
+
keys.delete(`${schemaRef.baseUri}#${schemaRef.pointer}`);
|
|
161
|
+
if (keys.size === 0)
|
|
162
|
+
this.active.delete(cursor);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
class KeywordContextImpl {
|
|
166
|
+
state;
|
|
167
|
+
schemaRef;
|
|
168
|
+
entry;
|
|
169
|
+
cursor;
|
|
170
|
+
pathNode;
|
|
171
|
+
/** Set once this keyword reports an error of its own (the contract check in evaluateKeyword). */
|
|
172
|
+
reported = false;
|
|
173
|
+
constructor(state, schemaRef, entry, cursor, pathNode) {
|
|
174
|
+
this.state = state;
|
|
175
|
+
this.schemaRef = schemaRef;
|
|
176
|
+
this.entry = entry;
|
|
177
|
+
this.cursor = cursor;
|
|
178
|
+
this.pathNode = pathNode;
|
|
179
|
+
}
|
|
180
|
+
get schema() {
|
|
181
|
+
return this.schemaRef.node;
|
|
182
|
+
}
|
|
183
|
+
apply(segments, cursor) {
|
|
184
|
+
const child = this.state.registry.child(this.schemaRef, segments);
|
|
185
|
+
let pathNode = this.pathNode;
|
|
186
|
+
for (const seg of segments) {
|
|
187
|
+
pathNode = { parent: pathNode, segment: escapeSegment(String(seg)) };
|
|
188
|
+
}
|
|
189
|
+
return applySchema(this.state, child, cursor, pathNode);
|
|
190
|
+
}
|
|
191
|
+
resolveRef(ref) {
|
|
192
|
+
return this.state.registry.resolveRef(ref, this.schemaRef.baseUri);
|
|
193
|
+
}
|
|
194
|
+
resolveDynamic(ref) {
|
|
195
|
+
const registry = this.state.registry;
|
|
196
|
+
// Lexical resolution first (spec: the initial target must exist); the
|
|
197
|
+
// rebinding below only applies to plain-name fragments minted by a
|
|
198
|
+
// dynamic anchor — pointer fragments behave exactly like $ref.
|
|
199
|
+
const target = registry.resolveRef(ref, this.schemaRef.baseUri);
|
|
200
|
+
const { resource, fragment } = splitFragment(resolveUri(ref, this.schemaRef.baseUri));
|
|
201
|
+
if (fragment === null || fragment === "" || fragment.startsWith("/"))
|
|
202
|
+
return target;
|
|
203
|
+
if (registry.dynamicAnchor(resource, fragment) === undefined)
|
|
204
|
+
return target;
|
|
205
|
+
for (const scopeUri of this.state.dynamicScope) {
|
|
206
|
+
const hit = registry.dynamicAnchor(scopeUri, fragment);
|
|
207
|
+
if (hit !== undefined)
|
|
208
|
+
return hit;
|
|
209
|
+
}
|
|
210
|
+
return target;
|
|
211
|
+
}
|
|
212
|
+
resolveRecursive(ref) {
|
|
213
|
+
const registry = this.state.registry;
|
|
214
|
+
// 2019-09: the reference is "#"; anything with a non-empty fragment
|
|
215
|
+
// behaves like $ref. Rebinding is all-or-nothing on the root-level
|
|
216
|
+
// $recursiveAnchor flag rather than a named anchor.
|
|
217
|
+
const target = registry.resolveRef(ref, this.schemaRef.baseUri);
|
|
218
|
+
const { resource, fragment } = splitFragment(resolveUri(ref, this.schemaRef.baseUri));
|
|
219
|
+
if (fragment !== null && fragment !== "")
|
|
220
|
+
return target;
|
|
221
|
+
if (!registry.hasRecursiveRoot(resource))
|
|
222
|
+
return target;
|
|
223
|
+
for (const scopeUri of this.state.dynamicScope) {
|
|
224
|
+
if (registry.hasRecursiveRoot(scopeUri))
|
|
225
|
+
return registry.rootRef(scopeUri);
|
|
226
|
+
}
|
|
227
|
+
return target;
|
|
228
|
+
}
|
|
229
|
+
applyResolved(target) {
|
|
230
|
+
const pathNode = {
|
|
231
|
+
parent: this.pathNode,
|
|
232
|
+
segment: escapeSegment(this.entry.name),
|
|
233
|
+
};
|
|
234
|
+
return applySchema(this.state, target, this.cursor, pathNode);
|
|
235
|
+
}
|
|
236
|
+
compileRegex(pattern) {
|
|
237
|
+
return this.state.regexCache.compile(pattern);
|
|
238
|
+
}
|
|
239
|
+
annotate() {
|
|
240
|
+
const record = this.state.shouldRecord;
|
|
241
|
+
if (record &&
|
|
242
|
+
!record(this.entry.behaviorId, this.entry.name, this.entry.vocabularyUri)) {
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
const annotation = {
|
|
246
|
+
kind: "annotation",
|
|
247
|
+
behaviorId: this.entry.behaviorId,
|
|
248
|
+
keywordName: this.entry.name,
|
|
249
|
+
vocabularyUri: this.entry.vocabularyUri,
|
|
250
|
+
schemaRef: this.schemaRef,
|
|
251
|
+
pathNode: this.pathNode,
|
|
252
|
+
cursor: this.cursor,
|
|
253
|
+
value: this.entry.value,
|
|
254
|
+
};
|
|
255
|
+
this.state.frame.annotations.push(annotation);
|
|
256
|
+
// Frames discard on failure; the trace keeps everything so verbose
|
|
257
|
+
// outputs can report droppedAnnotations.
|
|
258
|
+
this.state.allAnnotations?.push(annotation);
|
|
259
|
+
}
|
|
260
|
+
produce(data) {
|
|
261
|
+
// A producer nobody declared is invisible to elision analysis and to the
|
|
262
|
+
// compiler's channel routing — fail loud, not wrong. The check is per
|
|
263
|
+
// behavior id: the registry unions every occurrence's declarations.
|
|
264
|
+
const registry = this.state.registry;
|
|
265
|
+
if (!registry.producedIds().has(this.entry.behaviorId)) {
|
|
266
|
+
throw new UndeclaredProductionError(`'${this.entry.behaviorId}' produces dependency data without declaring it in analyze().produces`);
|
|
267
|
+
}
|
|
268
|
+
// Under elision, dependency data nobody consumes is never read.
|
|
269
|
+
if (this.state.shouldRecord !== null &&
|
|
270
|
+
!registry.consumedIds().has(this.entry.behaviorId)) {
|
|
271
|
+
return;
|
|
272
|
+
}
|
|
273
|
+
const dependency = {
|
|
274
|
+
kind: "dependency",
|
|
275
|
+
behaviorId: this.entry.behaviorId,
|
|
276
|
+
keywordName: this.entry.name,
|
|
277
|
+
schemaRef: this.schemaRef,
|
|
278
|
+
pathNode: this.pathNode,
|
|
279
|
+
cursor: this.cursor,
|
|
280
|
+
data,
|
|
281
|
+
};
|
|
282
|
+
this.state.frame.dependencies.push(dependency);
|
|
283
|
+
this.state.allDependencies?.push(dependency);
|
|
284
|
+
}
|
|
285
|
+
visible(behaviorIds, scope = "all") {
|
|
286
|
+
// Under elision, reading an id nobody declared via StaticFacts.consumes
|
|
287
|
+
// means the records may already be gone — fail loud, not wrong.
|
|
288
|
+
if (this.state.shouldRecord !== null) {
|
|
289
|
+
const consumed = this.state.registry.consumedIds();
|
|
290
|
+
for (const id of behaviorIds) {
|
|
291
|
+
if (!consumed.has(id)) {
|
|
292
|
+
throw new UndeclaredConsumptionError(`'${this.entry.behaviorId}' reads '${id}' without declaring it in analyze().consumes`);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
// Every keyword of one schema application shares its pathNode, so
|
|
297
|
+
// identity picks out the adjacent keywords' records.
|
|
298
|
+
return this.state.frame.dependencies.filter((d) => d.cursor === this.cursor &&
|
|
299
|
+
behaviorIds.includes(d.behaviorId) &&
|
|
300
|
+
(scope === "all" || d.pathNode === this.pathNode));
|
|
301
|
+
}
|
|
302
|
+
error(message, params) {
|
|
303
|
+
this.reported = true;
|
|
304
|
+
this.state.errors.push({
|
|
305
|
+
keywordName: this.entry.name,
|
|
306
|
+
vocabularyUri: this.entry.vocabularyUri,
|
|
307
|
+
schemaRef: this.schemaRef,
|
|
308
|
+
pathNode: this.pathNode,
|
|
309
|
+
cursor: this.cursor,
|
|
310
|
+
message,
|
|
311
|
+
...(params === undefined ? {} : { params }),
|
|
312
|
+
});
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* Applies one schema to one instance cursor: pushes a frame, evaluates the
|
|
317
|
+
* dialect's keywords in order, merges or discards the frame per DESIGN.md §4.
|
|
318
|
+
* @throws InfiniteLoopError if the schema is already active at this cursor.
|
|
319
|
+
* @throws UnknownKeywordError if the dialect disallows an unknown keyword present in the schema.
|
|
320
|
+
*/
|
|
321
|
+
export function applySchema(state, schemaRef, cursor, pathNode) {
|
|
322
|
+
if (state.depth >= state.maxDepth) {
|
|
323
|
+
throw new MaxDepthExceededError(`schema application exceeds maxDepth (${state.maxDepth}) at ` +
|
|
324
|
+
`'${schemaRef.baseUri}#${schemaRef.pointer}'`);
|
|
325
|
+
}
|
|
326
|
+
state.depth++;
|
|
327
|
+
try {
|
|
328
|
+
return applySchemaAtDepth(state, schemaRef, cursor, pathNode);
|
|
329
|
+
}
|
|
330
|
+
finally {
|
|
331
|
+
state.depth--;
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
function applySchemaAtDepth(state, schemaRef, cursor, pathNode) {
|
|
335
|
+
const node = schemaRef.node;
|
|
336
|
+
if (typeof node === "boolean") {
|
|
337
|
+
if (!node) {
|
|
338
|
+
state.errors.push({
|
|
339
|
+
keywordName: null,
|
|
340
|
+
vocabularyUri: null,
|
|
341
|
+
schemaRef,
|
|
342
|
+
pathNode,
|
|
343
|
+
cursor,
|
|
344
|
+
message: "schema is false",
|
|
345
|
+
});
|
|
346
|
+
}
|
|
347
|
+
if (state.tracing) {
|
|
348
|
+
state.traceExit(state.traceEnter(schemaRef, pathNode, cursor), node);
|
|
349
|
+
}
|
|
350
|
+
return node;
|
|
351
|
+
}
|
|
352
|
+
// Backstop for the registration walk's eager D19 check: a position the
|
|
353
|
+
// walk never saw (e.g. a $ref whose pointer lands inside an unknown
|
|
354
|
+
// keyword's value) still fails loud when applied, never silently passes.
|
|
355
|
+
if (!isObject(node)) {
|
|
356
|
+
throw new InvalidSchemaError(`non-schema value (${describeNonSchema(node)}) applied as a schema ` +
|
|
357
|
+
`at '${schemaRef.baseUri}#${schemaRef.pointer}'`);
|
|
358
|
+
}
|
|
359
|
+
const dialect = state.registry.dialectFor(schemaRef.baseUri);
|
|
360
|
+
// draft-07/06 (D18): a $ref makes every sibling keyword act as if absent.
|
|
361
|
+
const refOnly = dialect.refIgnoresSiblings && Object.hasOwn(node, "$ref");
|
|
362
|
+
state.enter(schemaRef, cursor);
|
|
363
|
+
state.dynamicScope.push(schemaRef.baseUri);
|
|
364
|
+
state.frames.push({ annotations: [], dependencies: [] });
|
|
365
|
+
const traceNode = state.tracing
|
|
366
|
+
? state.traceEnter(schemaRef, pathNode, cursor)
|
|
367
|
+
: null;
|
|
368
|
+
let valid = true;
|
|
369
|
+
try {
|
|
370
|
+
for (const entry of dialect.ordered) {
|
|
371
|
+
if (refOnly && entry.name !== "$ref")
|
|
372
|
+
continue;
|
|
373
|
+
if (!Object.hasOwn(node, entry.name))
|
|
374
|
+
continue;
|
|
375
|
+
if (!evaluateKeyword(state, schemaRef, entry, cursor, pathNode))
|
|
376
|
+
valid = false;
|
|
377
|
+
}
|
|
378
|
+
for (const name of Object.keys(node)) {
|
|
379
|
+
if (refOnly)
|
|
380
|
+
break;
|
|
381
|
+
if (dialect.keywords.has(name))
|
|
382
|
+
continue;
|
|
383
|
+
if (!dialect.allowUnknownKeywords) {
|
|
384
|
+
throw new UnknownKeywordError(`dialect '${dialect.uri}' does not allow unknown keyword '${name}'`);
|
|
385
|
+
}
|
|
386
|
+
// Unknown keywords are collected as annotations: the keyword's value is
|
|
387
|
+
// the annotation value (spec SHOULD).
|
|
388
|
+
const behaviorId = unknownKeywordId(name);
|
|
389
|
+
if (state.tracing)
|
|
390
|
+
state.traceKeyword(name, true);
|
|
391
|
+
if (state.shouldRecord && !state.shouldRecord(behaviorId, name, null))
|
|
392
|
+
continue;
|
|
393
|
+
const annotation = {
|
|
394
|
+
kind: "annotation",
|
|
395
|
+
behaviorId,
|
|
396
|
+
keywordName: name,
|
|
397
|
+
vocabularyUri: null,
|
|
398
|
+
schemaRef,
|
|
399
|
+
pathNode,
|
|
400
|
+
cursor,
|
|
401
|
+
value: node[name],
|
|
402
|
+
};
|
|
403
|
+
state.frame.annotations.push(annotation);
|
|
404
|
+
state.allAnnotations?.push(annotation);
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
finally {
|
|
408
|
+
const frame = state.frames.pop();
|
|
409
|
+
if (valid) {
|
|
410
|
+
const parent = state.frame;
|
|
411
|
+
appendAll(parent.annotations, frame.annotations);
|
|
412
|
+
appendAll(parent.dependencies, frame.dependencies);
|
|
413
|
+
}
|
|
414
|
+
if (traceNode)
|
|
415
|
+
state.traceExit(traceNode, valid);
|
|
416
|
+
state.dynamicScope.pop();
|
|
417
|
+
state.exit(schemaRef, cursor);
|
|
418
|
+
}
|
|
419
|
+
return valid;
|
|
420
|
+
}
|
|
421
|
+
function evaluateKeyword(state, schemaRef, entry, cursor, pathNode) {
|
|
422
|
+
const value = schemaRef.node[entry.name];
|
|
423
|
+
const ctx = new KeywordContextImpl(state, schemaRef, {
|
|
424
|
+
name: entry.name,
|
|
425
|
+
behaviorId: entry.behavior.id,
|
|
426
|
+
vocabularyUri: entry.vocabularyUri,
|
|
427
|
+
value,
|
|
428
|
+
}, cursor, pathNode);
|
|
429
|
+
const mark = state.errors.length;
|
|
430
|
+
const ok = entry.behavior.evaluate(value, cursor, ctx);
|
|
431
|
+
if (ok) {
|
|
432
|
+
// Rule 6 keys on the keyword's verdict, so a keyword that reports and
|
|
433
|
+
// still accepts would have its own error silently dropped — fail loud.
|
|
434
|
+
if (ctx.reported) {
|
|
435
|
+
throw new KeywordContractError(`'${entry.behavior.id}' reported an error but accepted the input`);
|
|
436
|
+
}
|
|
437
|
+
if (state.errors.length > mark)
|
|
438
|
+
state.dropErrorsFrom(mark);
|
|
439
|
+
}
|
|
440
|
+
// Identifier and reserved-location keywords evaluate to nothing and appear
|
|
441
|
+
// in no output unit (draft-03 §12.6, §12.10).
|
|
442
|
+
if (state.tracing && entry.behavior.structural !== true) {
|
|
443
|
+
state.traceKeyword(entry.name, ok);
|
|
444
|
+
}
|
|
445
|
+
return ok;
|
|
446
|
+
}
|
|
447
|
+
/** Evaluates an instance against a registered root schema, returning validity and final state. */
|
|
448
|
+
export function runEvaluation(registry, schemaUri, instance, tracing = false, shouldRecord = null, regexCache = new RegexCache(), maxDepth = DEFAULT_MAX_DEPTH) {
|
|
449
|
+
const state = new EvalState(registry, tracing, shouldRecord, regexCache, maxDepth);
|
|
450
|
+
const valid = applyWithOverflowBackstop(state, registry.rootRef(schemaUri), rootCursor(instance), null, maxDepth);
|
|
451
|
+
return { valid, state };
|
|
452
|
+
}
|
|
453
|
+
// Backstop: if maxDepth is set above the runtime's own stack ceiling, a
|
|
454
|
+
// native overflow surfaces as a RangeError. Convert it to the same typed,
|
|
455
|
+
// catchable error so callers never face an uncatchable-by-type crash.
|
|
456
|
+
function applyWithOverflowBackstop(state, target, cursor, pathNode, maxDepth) {
|
|
457
|
+
try {
|
|
458
|
+
return applySchema(state, target, cursor, pathNode);
|
|
459
|
+
}
|
|
460
|
+
catch (err) {
|
|
461
|
+
if (err instanceof RangeError && /call stack/i.test(err.message)) {
|
|
462
|
+
throw new MaxDepthExceededError(`evaluation exceeded the native call stack (maxDepth=${maxDepth}); ` +
|
|
463
|
+
`reduce nesting or lower maxDepth`);
|
|
464
|
+
}
|
|
465
|
+
throw err;
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
/**
|
|
469
|
+
* Evaluates one schema fragment with pre-seeded state: the compiled tier's
|
|
470
|
+
* trampoline into the interpreter (M6), used for dynamic islands and for
|
|
471
|
+
* fallback units alike. Returns the fragment's verdict, its errors, and its
|
|
472
|
+
* root frame's surviving annotation and dependency records — cursor
|
|
473
|
+
* identities intact, so a compiled caller can merge them under channel rule
|
|
474
|
+
* 3 and filter under rule 4 exactly as an interpreted parent would. With
|
|
475
|
+
* `tracing`, also the trace and the retained irrelevant records.
|
|
476
|
+
*/
|
|
477
|
+
export function evaluateFragment(registry, target, cursor, options = {}) {
|
|
478
|
+
const maxDepth = options.maxDepth ?? DEFAULT_MAX_DEPTH;
|
|
479
|
+
const state = new EvalState(registry, options.tracing === true, options.shouldRecord ?? null, options.regexCache ?? new RegexCache(), maxDepth);
|
|
480
|
+
state.dynamicScope.push(...(options.dynamicScope ?? []));
|
|
481
|
+
state.depth = options.depth ?? 0;
|
|
482
|
+
const valid = applyWithOverflowBackstop(state, target, cursor, options.pathNode ?? null, maxDepth);
|
|
483
|
+
return {
|
|
484
|
+
valid,
|
|
485
|
+
errors: state.errors,
|
|
486
|
+
annotations: state.rootAnnotations,
|
|
487
|
+
dependencies: state.rootDependencies,
|
|
488
|
+
traceRoot: state.traceRoot,
|
|
489
|
+
droppedErrors: state.droppedErrors ?? [],
|
|
490
|
+
allAnnotations: state.allAnnotations ?? [],
|
|
491
|
+
};
|
|
492
|
+
}
|
|
493
|
+
//# sourceMappingURL=engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,0EAA0E;AAC1E,wBAAwB;AACxB,EAAE;AACF,mDAAmD;AACnD,8CAA8C;AAC9C,4EAA4E;AAC5E,0EAA0E;AAC1E,yBAAyB;AACzB,oEAAoE;AACpE,iBAAiB;AACjB,sEAAsE;AACtE,uBAAuB;AACvB,4EAA4E;AAC5E,mEAAmE;AACnE,6EAA6E;AAC7E,4EAA4E;AAC5E,6EAA6E;AAC7E,4EAA4E;AAE5E,OAAO,EAAa,QAAQ,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,EAAU,UAAU,EAAE,MAAM,aAAa,CAAC;AAEjD,OAAO,EAML,gBAAgB,GACjB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,qBAAqB,EAErB,iBAAiB,GAClB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAiB,UAAU,EAAE,MAAM,YAAY,CAAC;AAEvD,yFAAyF;AACzF,MAAM,OAAO,iBAAkB,SAAQ,KAAK;CAAG;AAC/C,2EAA2E;AAC3E,MAAM,OAAO,mBAAoB,SAAQ,KAAK;CAAG;AACjD,uGAAuG;AACvG,MAAM,OAAO,0BAA2B,SAAQ,KAAK;CAAG;AACxD,4GAA4G;AAC5G,MAAM,OAAO,yBAA0B,SAAQ,KAAK;CAAG;AACvD,0FAA0F;AAC1F,MAAM,OAAO,oBAAqB,SAAQ,KAAK;CAAG;AAwBlD,mEAAmE;AACnE,MAAM,UAAU,eAAe,CAAC,IAAqB;IACnD,IAAI,CAAC,GAAG,EAAE,CAAC;IACX,KAAK,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM;QAAE,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC;IACrE,OAAO,CAAC,CAAC;AACX,CAAC;AAgDD,2EAA2E;AAC3E,6EAA6E;AAC7E,8CAA8C;AAC9C,SAAS,SAAS,CAAI,GAAQ,EAAE,GAAiB;IAC/C,KAAK,MAAM,CAAC,IAAI,GAAG;QAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACnC,CAAC;AA+BD,wFAAwF;AACxF,MAAM,OAAO,SAAS;IAuBX;IAEA;IACA;IACA;IA1BT,MAAM,GAAY,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC,CAAC;IAC1D,oDAAoD;IACpD,MAAM,GAAkB,EAAE,CAAC;IAC3B,yEAAyE;IACzE,qDAAqD;IACrD,aAAa,GAAyB,IAAI,CAAC;IAC3C,yEAAyE;IACzE,2EAA2E;IAC3E,YAAY,GAAa,EAAE,CAAC;IAC5B,yEAAyE;IACzE,uEAAuE;IACvE,2EAA2E;IAC3E,2CAA2C;IAC3C,SAAS,GAAqB,IAAI,CAAC;IACnC,cAAc,GAA8B,IAAI,CAAC;IACjD,eAAe,GAA8B,IAAI,CAAC;IAClD,4EAA4E;IAC5E,KAAK,GAAG,CAAC,CAAC;IACF,UAAU,GAAgB,EAAE,CAAC;IAC7B,MAAM,GAAG,IAAI,GAAG,EAAuB,CAAC;IAEhD,YACS,QAAwB,EAC/B,OAAO,GAAG,KAAK,EACR,eAAuC,IAAI,EAC3C,aAAyB,IAAI,UAAU,EAAE,EACzC,WAAmB,iBAAiB;QAJpC,aAAQ,GAAR,QAAQ,CAAgB;QAExB,iBAAY,GAAZ,YAAY,CAA+B;QAC3C,eAAU,GAAV,UAAU,CAA+B;QACzC,aAAQ,GAAR,QAAQ,CAA4B;QAE3C,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;YACzB,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;YAC1B,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,gDAAgD;IAChD,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,cAAc,KAAK,IAAI,CAAC;IACtC,CAAC;IAED,6GAA6G;IAC7G,cAAc,CAAC,IAAY;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,IAAI,CAAC,aAAa,KAAK,IAAI;YAAE,SAAS,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;IAC1E,CAAC;IAED,sFAAsF;IACtF,UAAU,CACR,SAAoB,EACpB,QAAyB,EACzB,MAAc;QAEd,MAAM,IAAI,GAAc;YACtB,SAAS;YACT,QAAQ;YACR,MAAM;YACN,KAAK,EAAE,IAAI;YACX,QAAQ,EAAE,EAAE;YACZ,QAAQ,EAAE,EAAE;SACb,CAAC;QACF,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC3D,IAAI,MAAM;YAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;;YAClC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QAC3B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,6DAA6D;IAC7D,SAAS,CAAC,IAAe,EAAE,KAAc;QACvC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC;IACxB,CAAC;IAED,0EAA0E;IAC1E,YAAY,CAAC,IAAY,EAAE,KAAc;QACvC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC9E,CAAC;IAED,gCAAgC;IAChC,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC;IAC9C,CAAC;IACD,kGAAkG;IAClG,IAAI,eAAe;QACjB,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,WAAW,CAAC;IACrC,CAAC;IACD,sDAAsD;IACtD,IAAI,gBAAgB;QAClB,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,YAAY,CAAC;IACtC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,SAAoB,EAAE,MAAc;QACxC,MAAM,GAAG,GAAG,GAAG,SAAS,CAAC,OAAO,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC;QACxD,IAAI,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACnC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC;YACjB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAChC,CAAC;aAAM,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,iBAAiB,CACzB,WAAW,GAAG,4CAA4C,CAC3D,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAChB,CAAC;IAED,mFAAmF;IACnF,IAAI,CAAC,SAAoB,EAAE,MAAc;QACvC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAE,CAAC;QACtC,IAAI,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC,OAAO,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC;QACzD,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC;YAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAClD,CAAC;CACF;AAED,MAAM,kBAAkB;IAKZ;IACA;IACA;IAMD;IACC;IAbV,iGAAiG;IACjG,QAAQ,GAAG,KAAK,CAAC;IAEjB,YACU,KAAgB,EAChB,SAAoB,EACpB,KAKP,EACM,MAAc,EACb,QAAyB;QATzB,UAAK,GAAL,KAAK,CAAW;QAChB,cAAS,GAAT,SAAS,CAAW;QACpB,UAAK,GAAL,KAAK,CAKZ;QACM,WAAM,GAAN,MAAM,CAAQ;QACb,aAAQ,GAAR,QAAQ,CAAiB;IAChC,CAAC;IAEJ,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,SAAS,CAAC,IAAiC,CAAC;IAC1D,CAAC;IAED,KAAK,CAAC,QAAsC,EAAE,MAAc;QAC1D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAClE,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC7B,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC3B,QAAQ,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QACvE,CAAC;QACD,OAAO,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC1D,CAAC;IAED,UAAU,CAAC,GAAW;QACpB,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACrE,CAAC;IAED,cAAc,CAAC,GAAW;QACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;QACrC,sEAAsE;QACtE,mEAAmE;QACnE,+DAA+D;QAC/D,MAAM,MAAM,GAAG,QAAQ,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAChE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,aAAa,CAC1C,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CACxC,CAAC;QACF,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,EAAE,IAAI,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC;YAClE,OAAO,MAAM,CAAC;QAChB,IAAI,QAAQ,CAAC,aAAa,CAAC,QAAQ,EAAE,QAAQ,CAAC,KAAK,SAAS;YAAE,OAAO,MAAM,CAAC;QAC5E,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;YAC/C,MAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YACvD,IAAI,GAAG,KAAK,SAAS;gBAAE,OAAO,GAAG,CAAC;QACpC,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,gBAAgB,CAAC,GAAW;QAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;QACrC,oEAAoE;QACpE,mEAAmE;QACnE,oDAAoD;QACpD,MAAM,MAAM,GAAG,QAAQ,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAChE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,aAAa,CAC1C,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CACxC,CAAC;QACF,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,EAAE;YAAE,OAAO,MAAM,CAAC;QACxD,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,CAAC;YAAE,OAAO,MAAM,CAAC;QACxD,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;YAC/C,IAAI,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,CAAC;gBACrC,OAAO,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACtC,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,aAAa,CAAC,MAAiB;QAC7B,MAAM,QAAQ,GAAG;YACf,MAAM,EAAE,IAAI,CAAC,QAAQ;YACrB,OAAO,EAAE,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;SACxC,CAAC;QACF,OAAO,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAChE,CAAC;IAED,YAAY,CAAC,OAAe;QAC1B,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAChD,CAAC;IAED,QAAQ;QACN,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC;QACvC,IACE,MAAM;YACN,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,EACzE,CAAC;YACD,OAAO;QACT,CAAC;QACD,MAAM,UAAU,GAAqB;YACnC,IAAI,EAAE,YAAY;YAClB,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU;YACjC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;YAC5B,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,aAAa;YACvC,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK;SACxB,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC9C,mEAAmE;QACnE,yCAAyC;QACzC,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IAC9C,CAAC;IAED,OAAO,CAAC,IAAa;QACnB,yEAAyE;QACzE,sEAAsE;QACtE,oEAAoE;QACpE,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;QACrC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;YACvD,MAAM,IAAI,yBAAyB,CACjC,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,uEAAuE,CACjG,CAAC;QACJ,CAAC;QACD,gEAAgE;QAChE,IACE,IAAI,CAAC,KAAK,CAAC,YAAY,KAAK,IAAI;YAChC,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,EAClD,CAAC;YACD,OAAO;QACT,CAAC;QACD,MAAM,UAAU,GAAqB;YACnC,IAAI,EAAE,YAAY;YAClB,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU;YACjC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;YAC5B,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,IAAI;SACL,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC/C,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO,CACL,WAA8B,EAC9B,QAA4B,KAAK;QAEjC,wEAAwE;QACxE,gEAAgE;QAChE,IAAI,IAAI,CAAC,KAAK,CAAC,YAAY,KAAK,IAAI,EAAE,CAAC;YACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;YACnD,KAAK,MAAM,EAAE,IAAI,WAAW,EAAE,CAAC;gBAC7B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;oBACtB,MAAM,IAAI,0BAA0B,CAClC,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,YAAY,EAAE,8CAA8C,CACtF,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QACD,kEAAkE;QAClE,qDAAqD;QACrD,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CACzC,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM;YACxB,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC;YAClC,CAAC,KAAK,KAAK,KAAK,IAAI,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,QAAQ,CAAC,CACpD,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,OAAe,EAAE,MAAoB;QACzC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC;YACrB,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;YAC5B,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,aAAa;YACvC,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,OAAO;YACP,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;SAC5C,CAAC,CAAC;IACL,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CACzB,KAAgB,EAChB,SAAoB,EACpB,MAAc,EACd,QAAyB;IAEzB,IAAI,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QAClC,MAAM,IAAI,qBAAqB,CAC7B,wCAAwC,KAAK,CAAC,QAAQ,OAAO;YAC3D,IAAI,SAAS,CAAC,OAAO,IAAI,SAAS,CAAC,OAAO,GAAG,CAChD,CAAC;IACJ,CAAC;IACD,KAAK,CAAC,KAAK,EAAE,CAAC;IACd,IAAI,CAAC;QACH,OAAO,kBAAkB,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IAChE,CAAC;YAAS,CAAC;QACT,KAAK,CAAC,KAAK,EAAE,CAAC;IAChB,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CACzB,KAAgB,EAChB,SAAoB,EACpB,MAAc,EACd,QAAyB;IAEzB,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC;IAC5B,IAAI,OAAO,IAAI,KAAK,SAAS,EAAE,CAAC;QAC9B,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC;gBAChB,WAAW,EAAE,IAAI;gBACjB,aAAa,EAAE,IAAI;gBACnB,SAAS;gBACT,QAAQ;gBACR,MAAM;gBACN,OAAO,EAAE,iBAAiB;aAC3B,CAAC,CAAC;QACL,CAAC;QACD,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YAClB,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC;QACvE,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,uEAAuE;IACvE,oEAAoE;IACpE,yEAAyE;IACzE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,kBAAkB,CAC1B,qBAAqB,iBAAiB,CAAC,IAAI,CAAC,wBAAwB;YAClE,OAAO,SAAS,CAAC,OAAO,IAAI,SAAS,CAAC,OAAO,GAAG,CACnD,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAY,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAEtE,0EAA0E;IAC1E,MAAM,OAAO,GAAG,OAAO,CAAC,kBAAkB,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAE1E,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAC/B,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAC3C,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC,CAAC;IACzD,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO;QAC7B,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,EAAE,QAAQ,EAAE,MAAM,CAAC;QAC/C,CAAC,CAAC,IAAI,CAAC;IACT,IAAI,KAAK,GAAG,IAAI,CAAC;IACjB,IAAI,CAAC;QACH,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpC,IAAI,OAAO,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM;gBAAE,SAAS;YAC/C,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC;gBAAE,SAAS;YAC/C,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC;gBAC7D,KAAK,GAAG,KAAK,CAAC;QAClB,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACrC,IAAI,OAAO;gBAAE,MAAM;YACnB,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,SAAS;YACzC,IAAI,CAAC,OAAO,CAAC,oBAAoB,EAAE,CAAC;gBAClC,MAAM,IAAI,mBAAmB,CAC3B,YAAY,OAAO,CAAC,GAAG,qCAAqC,IAAI,GAAG,CACpE,CAAC;YACJ,CAAC;YACD,wEAAwE;YACxE,sCAAsC;YACtC,MAAM,UAAU,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;YAC1C,IAAI,KAAK,CAAC,OAAO;gBAAE,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAClD,IAAI,KAAK,CAAC,YAAY,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC;gBACnE,SAAS;YACX,MAAM,UAAU,GAAqB;gBACnC,IAAI,EAAE,YAAY;gBAClB,UAAU;gBACV,WAAW,EAAE,IAAI;gBACjB,aAAa,EAAE,IAAI;gBACnB,SAAS;gBACT,QAAQ;gBACR,MAAM;gBACN,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC;aAClB,CAAC;YACF,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACzC,KAAK,CAAC,cAAc,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;YAAS,CAAC;QACT,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,EAAG,CAAC;QAClC,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC;YAC3B,SAAS,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;YACjD,SAAS,CAAC,MAAM,CAAC,YAAY,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;QACrD,CAAC;QACD,IAAI,SAAS;YAAE,KAAK,CAAC,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QACjD,KAAK,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,eAAe,CACtB,KAAgB,EAChB,SAAoB,EACpB,KAAqB,EACrB,MAAc,EACd,QAAyB;IAEzB,MAAM,KAAK,GAAI,SAAS,CAAC,IAAkC,CAAC,KAAK,CAAC,IAAI,CAAE,CAAC;IACzE,MAAM,GAAG,GAAG,IAAI,kBAAkB,CAChC,KAAK,EACL,SAAS,EACT;QACE,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,UAAU,EAAE,KAAK,CAAC,QAAQ,CAAC,EAAE;QAC7B,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,KAAK;KACN,EACD,MAAM,EACN,QAAQ,CACT,CAAC;IACF,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;IACjC,MAAM,EAAE,GAAG,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;IACvD,IAAI,EAAE,EAAE,CAAC;QACP,sEAAsE;QACtE,uEAAuE;QACvE,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;YACjB,MAAM,IAAI,oBAAoB,CAC5B,IAAI,KAAK,CAAC,QAAQ,CAAC,EAAE,4CAA4C,CAClE,CAAC;QACJ,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI;YAAE,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAC7D,CAAC;IACD,2EAA2E;IAC3E,8CAA8C;IAC9C,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;QACxD,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,kGAAkG;AAClG,MAAM,UAAU,aAAa,CAC3B,QAAwB,EACxB,SAAiB,EACjB,QAAmB,EACnB,OAAO,GAAG,KAAK,EACf,eAAuC,IAAI,EAC3C,aAAyB,IAAI,UAAU,EAAE,EACzC,WAAmB,iBAAiB;IAEpC,MAAM,KAAK,GAAG,IAAI,SAAS,CACzB,QAAQ,EACR,OAAO,EACP,YAAY,EACZ,UAAU,EACV,QAAQ,CACT,CAAC;IACF,MAAM,KAAK,GAAG,yBAAyB,CACrC,KAAK,EACL,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,EAC3B,UAAU,CAAC,QAAQ,CAAC,EACpB,IAAI,EACJ,QAAQ,CACT,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAC1B,CAAC;AAED,wEAAwE;AACxE,0EAA0E;AAC1E,sEAAsE;AACtE,SAAS,yBAAyB,CAChC,KAAgB,EAChB,MAAiB,EACjB,MAAc,EACd,QAAyB,EACzB,QAAgB;IAEhB,IAAI,CAAC;QACH,OAAO,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IACtD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,UAAU,IAAI,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YACjE,MAAM,IAAI,qBAAqB,CAC7B,uDAAuD,QAAQ,KAAK;gBAClE,kCAAkC,CACrC,CAAC;QACJ,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAsBD;;;;;;;;GAQG;AACH,MAAM,UAAU,gBAAgB,CAC9B,QAAwB,EACxB,MAAiB,EACjB,MAAc,EACd,UAA2B,EAAE;IAa7B,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,iBAAiB,CAAC;IACvD,MAAM,KAAK,GAAG,IAAI,SAAS,CACzB,QAAQ,EACR,OAAO,CAAC,OAAO,KAAK,IAAI,EACxB,OAAO,CAAC,YAAY,IAAI,IAAI,EAC5B,OAAO,CAAC,UAAU,IAAI,IAAI,UAAU,EAAE,EACtC,QAAQ,CACT,CAAC;IACF,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,CAAC;IACzD,KAAK,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC;IACjC,MAAM,KAAK,GAAG,yBAAyB,CACrC,KAAK,EACL,MAAM,EACN,MAAM,EACN,OAAO,CAAC,QAAQ,IAAI,IAAI,EACxB,QAAQ,CACT,CAAC;IACF,OAAO;QACL,KAAK;QACL,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,WAAW,EAAE,KAAK,CAAC,eAAe;QAClC,YAAY,EAAE,KAAK,CAAC,gBAAgB;QACpC,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,aAAa,EAAE,KAAK,CAAC,aAAa,IAAI,EAAE;QACxC,cAAc,EAAE,KAAK,CAAC,cAAc,IAAI,EAAE;KAC3C,CAAC;AACJ,CAAC"}
|