footprintjs 9.28.0 → 9.30.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/CLAUDE.md +8 -6
- package/dist/esm/lib/engine/handlers/SubflowExecutor.js +41 -2
- package/dist/esm/lib/memory/EventLog.d.ts +6 -0
- package/dist/esm/lib/memory/EventLog.js +10 -4
- package/dist/esm/lib/memory/SharedMemory.d.ts +18 -4
- package/dist/esm/lib/memory/SharedMemory.js +42 -11
- package/dist/esm/lib/memory/StageContext.d.ts +45 -18
- package/dist/esm/lib/memory/StageContext.js +82 -27
- package/dist/esm/lib/memory/TransactionBuffer.d.ts +256 -86
- package/dist/esm/lib/memory/TransactionBuffer.js +497 -273
- package/dist/esm/lib/memory/admission.d.ts +81 -0
- package/dist/esm/lib/memory/admission.js +152 -0
- package/dist/esm/lib/memory/borrowedMutation.d.ts +9 -0
- package/dist/esm/lib/memory/borrowedMutation.js +18 -1
- package/dist/esm/lib/memory/deltaEncoding.d.ts +66 -0
- package/dist/esm/lib/memory/deltaEncoding.js +122 -0
- package/dist/esm/lib/memory/pathOps.d.ts +63 -0
- package/dist/esm/lib/memory/pathOps.js +150 -1
- package/dist/esm/lib/memory/utils.d.ts +47 -16
- package/dist/esm/lib/memory/utils.js +119 -24
- package/dist/esm/lib/runner/FlowChartExecutor.d.ts +7 -5
- package/dist/esm/lib/runner/FlowChartExecutor.js +8 -6
- package/dist/lib/engine/handlers/SubflowExecutor.js +41 -2
- package/dist/lib/memory/EventLog.js +9 -3
- package/dist/lib/memory/SharedMemory.js +40 -9
- package/dist/lib/memory/StageContext.js +81 -26
- package/dist/lib/memory/TransactionBuffer.js +495 -271
- package/dist/lib/memory/admission.js +158 -0
- package/dist/lib/memory/borrowedMutation.js +20 -2
- package/dist/lib/memory/deltaEncoding.js +128 -0
- package/dist/lib/memory/pathOps.js +159 -2
- package/dist/lib/memory/utils.js +122 -25
- package/dist/lib/runner/FlowChartExecutor.js +8 -6
- package/dist/types/lib/memory/EventLog.d.ts +6 -0
- package/dist/types/lib/memory/SharedMemory.d.ts +18 -4
- package/dist/types/lib/memory/StageContext.d.ts +45 -18
- package/dist/types/lib/memory/TransactionBuffer.d.ts +256 -86
- package/dist/types/lib/memory/admission.d.ts +81 -0
- package/dist/types/lib/memory/borrowedMutation.d.ts +9 -0
- package/dist/types/lib/memory/deltaEncoding.d.ts +66 -0
- package/dist/types/lib/memory/pathOps.d.ts +63 -0
- package/dist/types/lib/memory/utils.d.ts +47 -16
- package/dist/types/lib/runner/FlowChartExecutor.d.ts +7 -5
- package/package.json +2 -1
|
@@ -21,6 +21,8 @@
|
|
|
21
21
|
*
|
|
22
22
|
* Paths may be dot-notation strings or pre-split (string|number)[] arrays.
|
|
23
23
|
*/
|
|
24
|
+
/** Is `segment` one of the three prototype-pollution vectors every helper here refuses? */
|
|
25
|
+
export declare function isDeniedSegment(segment: string | number): boolean;
|
|
24
26
|
/**
|
|
25
27
|
* Get the value at `path` in `obj`, returning `defaultValue` if absent.
|
|
26
28
|
*
|
|
@@ -42,6 +44,67 @@ export declare function nativeSet(obj: any, path: string | (string | number)[],
|
|
|
42
44
|
* prototype-chain walks are inert.
|
|
43
45
|
*/
|
|
44
46
|
export declare function nativeDelete(obj: any, path: string | (string | number)[]): void;
|
|
47
|
+
/** A container a writer may own: anything `typeof 'object'` and not null. */
|
|
48
|
+
export declare function isContainer(value: unknown): value is object;
|
|
49
|
+
/**
|
|
50
|
+
* `parent[key]` when `parent` is a container that OWNS `key` — the slot
|
|
51
|
+
* {@link nativeGet} would read, refusing the same prototype-pollution
|
|
52
|
+
* segments — else `undefined`. One step of a path walk.
|
|
53
|
+
*/
|
|
54
|
+
export declare function ownChild(parent: unknown, key: string | number): unknown;
|
|
55
|
+
/**
|
|
56
|
+
* A SHALLOW copy of one container that keeps every slot the whole-state
|
|
57
|
+
* `structuredClone` this replaced kept — so a path copy and a deep clone give
|
|
58
|
+
* the same value at every path:
|
|
59
|
+
* - a plain object (or a null-prototype one): its own enumerable keys, in
|
|
60
|
+
* order, by spread — an own `__proto__` key stays a key; the result has
|
|
61
|
+
* `Object.prototype`, as a clone's does;
|
|
62
|
+
* - an array: its indices, holes and length (`slice`) AND any named
|
|
63
|
+
* property a nested write hung off it (`slice` alone would drop those);
|
|
64
|
+
* - anything else — a `Date`, `Map`, `Set`, typed array, a class instance —
|
|
65
|
+
* is deep-cloned, which is what the whole-state clone did to it; and the
|
|
66
|
+
* own enumerable properties the clone cannot carry (an expando a nested
|
|
67
|
+
* write hung on a `Date`) are carried over by reference, so a later write
|
|
68
|
+
* through it changes exactly its own path. Rare on a write path.
|
|
69
|
+
*/
|
|
70
|
+
export declare function shallowCopy<T extends object>(container: T): T;
|
|
71
|
+
/**
|
|
72
|
+
* Make the containers on the way to `path`'s LEAF ones the writer owns, so
|
|
73
|
+
* the write that follows (`nativeSet` / `nativeDelete` / a verb arm) edits
|
|
74
|
+
* nothing it did not create.
|
|
75
|
+
*
|
|
76
|
+
* `root` must already be owned. Walking down, every container the writer did
|
|
77
|
+
* not create (`owned` does not hold it) is replaced, in its parent, by its
|
|
78
|
+
* {@link shallowCopy}, which the writer then owns. The walk stops where
|
|
79
|
+
* `nativeSet` would stop or create: a DENIED segment (the write is refused
|
|
80
|
+
* there anyway), or a missing / primitive intermediate (`nativeSet` makes a
|
|
81
|
+
* fresh container from that point on). The leaf itself is never copied — the
|
|
82
|
+
* write replaces it.
|
|
83
|
+
*
|
|
84
|
+
* Cost: one shallow copy per container on the path that this writer has not
|
|
85
|
+
* already copied — O(depth × width), independent of everything the write
|
|
86
|
+
* does not pass through. A path of one segment (a root key, the common case)
|
|
87
|
+
* copies nothing here.
|
|
88
|
+
*/
|
|
89
|
+
export declare function ownSpine(root: any, path: string | (string | number)[], owned: WeakSet<object>): void;
|
|
90
|
+
/**
|
|
91
|
+
* The root of a new generation: a shallow copy of `base` when it is a
|
|
92
|
+
* container (owned by the writer), else the historical deep clone of a
|
|
93
|
+
* non-container base (`undefined`, a primitive) so the callers' behaviour on
|
|
94
|
+
* such a base is unchanged.
|
|
95
|
+
*/
|
|
96
|
+
export declare function ownedRootOf(base: any, owned?: WeakSet<object>): any;
|
|
97
|
+
/** Mark a value the writer just created (a fresh clone, a merge result) as owned. */
|
|
98
|
+
export declare function own(value: unknown, owned: WeakSet<object> | undefined): void;
|
|
99
|
+
/**
|
|
100
|
+
* Mark EVERY container of a tree the writer just created whole (a
|
|
101
|
+
* `structuredClone` result) as owned, so a later write through any of them
|
|
102
|
+
* edits it in place instead of copying it again. Walks own enumerable keys —
|
|
103
|
+
* the slots a path can address; a `Map`'s or `Set`'s entries are not. O(the
|
|
104
|
+
* tree's containers); a container already owned is not walked twice (a cycle
|
|
105
|
+
* inside the clone ends there).
|
|
106
|
+
*/
|
|
107
|
+
export declare function adopt(tree: unknown, owned: WeakSet<object>): void;
|
|
45
108
|
/** Returns true if `obj` has an own property at every segment of `path`. */
|
|
46
109
|
export declare function nativeHas(obj: any, path: string | (string | number)[]): boolean;
|
|
47
110
|
/**
|
|
@@ -22,6 +22,10 @@
|
|
|
22
22
|
* Paths may be dot-notation strings or pre-split (string|number)[] arrays.
|
|
23
23
|
*/
|
|
24
24
|
const DENIED = new Set(['__proto__', 'constructor', 'prototype']);
|
|
25
|
+
/** Is `segment` one of the three prototype-pollution vectors every helper here refuses? */
|
|
26
|
+
export function isDeniedSegment(segment) {
|
|
27
|
+
return DENIED.has(String(segment));
|
|
28
|
+
}
|
|
25
29
|
function toSegments(path) {
|
|
26
30
|
return Array.isArray(path) ? path : path.split('.');
|
|
27
31
|
}
|
|
@@ -93,6 +97,151 @@ export function nativeDelete(obj, path) {
|
|
|
93
97
|
delete curr[last];
|
|
94
98
|
}
|
|
95
99
|
}
|
|
100
|
+
// ── Copy-on-write primitives (docs/design/2026-10-copy-on-write-commit.md) ──
|
|
101
|
+
//
|
|
102
|
+
// THE LAW: a committed generation is never edited. A writer copies the root
|
|
103
|
+
// and every container on each path it writes, edits only containers it
|
|
104
|
+
// created during the current operation (its `owned` set), and shares every
|
|
105
|
+
// other subtree with the generation before it. The same law
|
|
106
|
+
// `reactive/structuralWrite.ts · setInPath` applies to a single value.
|
|
107
|
+
/** A container a writer may own: anything `typeof 'object'` and not null. */
|
|
108
|
+
export function isContainer(value) {
|
|
109
|
+
return value !== null && typeof value === 'object';
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* `parent[key]` when `parent` is a container that OWNS `key` — the slot
|
|
113
|
+
* {@link nativeGet} would read, refusing the same prototype-pollution
|
|
114
|
+
* segments — else `undefined`. One step of a path walk.
|
|
115
|
+
*/
|
|
116
|
+
export function ownChild(parent, key) {
|
|
117
|
+
return isContainer(parent) && !DENIED.has(String(key)) && Object.prototype.hasOwnProperty.call(parent, key)
|
|
118
|
+
? parent[key]
|
|
119
|
+
: undefined;
|
|
120
|
+
}
|
|
121
|
+
/** True for an own key of an array that is an array INDEX (`'0'`, `'12'`), not a name (`arr.note`). */
|
|
122
|
+
function isArrayIndexKey(key) {
|
|
123
|
+
const n = Number(key);
|
|
124
|
+
return Number.isInteger(n) && n >= 0 && n < 4294967295 && String(n) === key;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* The named (non-index) own keys of an array, in order. Own-key order puts
|
|
128
|
+
* every index first, ascending, and names after them — so the names are the
|
|
129
|
+
* tail of `Object.keys`, and an array without any is told by its last key.
|
|
130
|
+
*/
|
|
131
|
+
function namedArrayKeys(array) {
|
|
132
|
+
const keys = Object.keys(array);
|
|
133
|
+
let first = keys.length;
|
|
134
|
+
while (first > 0 && !isArrayIndexKey(keys[first - 1]))
|
|
135
|
+
first--;
|
|
136
|
+
return keys.slice(first);
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* A SHALLOW copy of one container that keeps every slot the whole-state
|
|
140
|
+
* `structuredClone` this replaced kept — so a path copy and a deep clone give
|
|
141
|
+
* the same value at every path:
|
|
142
|
+
* - a plain object (or a null-prototype one): its own enumerable keys, in
|
|
143
|
+
* order, by spread — an own `__proto__` key stays a key; the result has
|
|
144
|
+
* `Object.prototype`, as a clone's does;
|
|
145
|
+
* - an array: its indices, holes and length (`slice`) AND any named
|
|
146
|
+
* property a nested write hung off it (`slice` alone would drop those);
|
|
147
|
+
* - anything else — a `Date`, `Map`, `Set`, typed array, a class instance —
|
|
148
|
+
* is deep-cloned, which is what the whole-state clone did to it; and the
|
|
149
|
+
* own enumerable properties the clone cannot carry (an expando a nested
|
|
150
|
+
* write hung on a `Date`) are carried over by reference, so a later write
|
|
151
|
+
* through it changes exactly its own path. Rare on a write path.
|
|
152
|
+
*/
|
|
153
|
+
export function shallowCopy(container) {
|
|
154
|
+
if (Array.isArray(container)) {
|
|
155
|
+
const copy = container.slice();
|
|
156
|
+
for (const key of namedArrayKeys(container))
|
|
157
|
+
copy[key] = container[key];
|
|
158
|
+
return copy;
|
|
159
|
+
}
|
|
160
|
+
const proto = Object.getPrototypeOf(container);
|
|
161
|
+
if (proto === Object.prototype || proto === null)
|
|
162
|
+
return { ...container };
|
|
163
|
+
const copy = structuredClone(container);
|
|
164
|
+
for (const key of Object.keys(container)) {
|
|
165
|
+
if (!Object.prototype.hasOwnProperty.call(copy, key))
|
|
166
|
+
copy[key] = container[key];
|
|
167
|
+
}
|
|
168
|
+
return copy;
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Make the containers on the way to `path`'s LEAF ones the writer owns, so
|
|
172
|
+
* the write that follows (`nativeSet` / `nativeDelete` / a verb arm) edits
|
|
173
|
+
* nothing it did not create.
|
|
174
|
+
*
|
|
175
|
+
* `root` must already be owned. Walking down, every container the writer did
|
|
176
|
+
* not create (`owned` does not hold it) is replaced, in its parent, by its
|
|
177
|
+
* {@link shallowCopy}, which the writer then owns. The walk stops where
|
|
178
|
+
* `nativeSet` would stop or create: a DENIED segment (the write is refused
|
|
179
|
+
* there anyway), or a missing / primitive intermediate (`nativeSet` makes a
|
|
180
|
+
* fresh container from that point on). The leaf itself is never copied — the
|
|
181
|
+
* write replaces it.
|
|
182
|
+
*
|
|
183
|
+
* Cost: one shallow copy per container on the path that this writer has not
|
|
184
|
+
* already copied — O(depth × width), independent of everything the write
|
|
185
|
+
* does not pass through. A path of one segment (a root key, the common case)
|
|
186
|
+
* copies nothing here.
|
|
187
|
+
*/
|
|
188
|
+
export function ownSpine(root, path, owned) {
|
|
189
|
+
const segs = toSegments(path);
|
|
190
|
+
let curr = root;
|
|
191
|
+
for (let i = 0; i < segs.length - 1; i++) {
|
|
192
|
+
const k = segs[i];
|
|
193
|
+
if (DENIED.has(String(k)))
|
|
194
|
+
return;
|
|
195
|
+
const next = curr[k];
|
|
196
|
+
if (!isContainer(next))
|
|
197
|
+
return;
|
|
198
|
+
if (owned.has(next)) {
|
|
199
|
+
curr = next;
|
|
200
|
+
continue;
|
|
201
|
+
}
|
|
202
|
+
const copy = shallowCopy(next);
|
|
203
|
+
owned.add(copy);
|
|
204
|
+
curr[k] = copy;
|
|
205
|
+
curr = copy;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* The root of a new generation: a shallow copy of `base` when it is a
|
|
210
|
+
* container (owned by the writer), else the historical deep clone of a
|
|
211
|
+
* non-container base (`undefined`, a primitive) so the callers' behaviour on
|
|
212
|
+
* such a base is unchanged.
|
|
213
|
+
*/
|
|
214
|
+
export function ownedRootOf(base, owned) {
|
|
215
|
+
if (!isContainer(base))
|
|
216
|
+
return structuredClone(base);
|
|
217
|
+
const root = shallowCopy(base);
|
|
218
|
+
owned?.add(root);
|
|
219
|
+
return root;
|
|
220
|
+
}
|
|
221
|
+
/** Mark a value the writer just created (a fresh clone, a merge result) as owned. */
|
|
222
|
+
export function own(value, owned) {
|
|
223
|
+
if (owned !== undefined && isContainer(value))
|
|
224
|
+
owned.add(value);
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Mark EVERY container of a tree the writer just created whole (a
|
|
228
|
+
* `structuredClone` result) as owned, so a later write through any of them
|
|
229
|
+
* edits it in place instead of copying it again. Walks own enumerable keys —
|
|
230
|
+
* the slots a path can address; a `Map`'s or `Set`'s entries are not. O(the
|
|
231
|
+
* tree's containers); a container already owned is not walked twice (a cycle
|
|
232
|
+
* inside the clone ends there).
|
|
233
|
+
*/
|
|
234
|
+
export function adopt(tree, owned) {
|
|
235
|
+
const stack = [tree];
|
|
236
|
+
while (stack.length > 0) {
|
|
237
|
+
const value = stack.pop();
|
|
238
|
+
if (!isContainer(value) || owned.has(value))
|
|
239
|
+
continue;
|
|
240
|
+
owned.add(value);
|
|
241
|
+
for (const key of Object.keys(value))
|
|
242
|
+
stack.push(value[key]);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
96
245
|
/** Returns true if `obj` has an own property at every segment of `path`. */
|
|
97
246
|
export function nativeHas(obj, path) {
|
|
98
247
|
const segs = toSegments(path);
|
|
@@ -139,4 +288,4 @@ export function mergeContextWins(dst, src) {
|
|
|
139
288
|
}
|
|
140
289
|
return out;
|
|
141
290
|
}
|
|
142
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0aE9wcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvbWVtb3J5L3BhdGhPcHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQkc7QUFFSCxNQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLFdBQVcsRUFBRSxhQUFhLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztBQUVsRSxTQUFTLFVBQVUsQ0FBQyxJQUFrQztJQUNwRCxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN0RCxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQUMsR0FBUSxFQUFFLElBQWtDLEVBQUUsWUFBa0I7SUFDeEYsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlCLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQztJQUNmLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDdkIsSUFBSSxJQUFJLElBQUksSUFBSTtZQUFFLE9BQU8sWUFBWSxDQUFDO1FBQ3RDLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7WUFBRSxPQUFPLFlBQVksQ0FBQztRQUNqRCxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUM7WUFBRSxPQUFPLFlBQVksQ0FBQztRQUMxRSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ25CLENBQUM7SUFDRCxPQUFPLElBQUksS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMs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RSxNQUFNLEtBQUssSUFBSTtnQkFDZixPQUFPLE1BQU0sS0FBSyxRQUFRO2dCQUMxQixDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO2dCQUN0QixHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSTtnQkFDakIsT0FBTyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssUUFBUTtnQkFDNUIsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUN4QixDQUFDO2dCQUNELEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDaEQsQ0FBQztZQUNELDZCQUE2QjtRQUMvQixDQUFDO2FBQU0sQ0FBQztZQUNOLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdEIsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHBhdGhPcHMudHMg4oCUIE5hdGl2ZSBuZXN0ZWQtcGF0aCBoZWxwZXJzIChyZXBsYWNlcyBsb2Rhc2guZ2V0L3NldC9oYXMvbWVyZ2V3aXRoKVxuICpcbiAqIFNlY3VyaXR5IGNvbnRyYWN0OiBhbGwgZnVuY3Rpb25zIGd1YXJkIGFnYWluc3QgcHJvdG90eXBlLXBvbGx1dGlvbiBhbmRcbiAqIHByb3RvdHlwZS1jaGFpbi1yZWFkIGF0dGFja3MuIFRoZSBERU5JRUQgc2V0IGJsb2NrcyB0aGUgdGhyZWUgY2Fub25pY2FsXG4gKiBwb2xsdXRpb24gdmVjdG9ycyAoX19wcm90b19fLCBjb25zdHJ1Y3RvciwgcHJvdG90eXBlKSBvbiBldmVyeSBmdW5jdGlvbi5cbiAqXG4gKiBJbnRlbnRpb25hbCBhc3ltbWV0cnk6XG4gKiAgIC0gbmF0aXZlU2V0ICDigJQgREVOSUVEIGNoZWNrIG9ubHkgYXQgZWFjaCBzZWdtZW50LiBObyBoYXNPd25Qcm9wZXJ0eVxuICogICAgIGNoZWNrIGlzIG5lZWRlZCBiZWNhdXNlIHdyaXRpbmcgYWx3YXlzIGNyZWF0ZXMgYW4gT1dOIHByb3BlcnR5IG9uIGBjdXJyYCxcbiAqICAgICB3aGljaCBjYW5ub3QgcG9sbHV0ZSB0aGUgcHJvdG90eXBlIGNoYWluLlxuICogICAtIG5hdGl2ZUdldCAvIG5hdGl2ZUhhcyDigJQgREVOSUVEIGNoZWNrICsgaGFzT3duUHJvcGVydHkgYXQgZXZlcnkgc3RlcC5cbiAqICAgICBSZWFkcyBmb2xsb3cgdGhlIHByb3RvdHlwZSBjaGFpbiBieSBkZWZhdWx0IChicmFja2V0IG5vdGF0aW9uKSwgc28gdGhlXG4gKiAgICAgaGFzT3duUHJvcGVydHkgZ3VhcmQgaXMgcmVxdWlyZWQgdG8gcHJldmVudCBsZWFraW5nIGluaGVyaXRlZCB2YWx1ZXNcbiAqICAgICAoZS5nLiBPYmplY3QucHJvdG90eXBlLCBPYmplY3QgY29uc3RydWN0b3IsIHRvU3RyaW5nKS5cbiAqICAgLSBtZXJnZUNvbnRleHRXaW5zIOKAlCBERU5JRUQgY2hlY2sgb25seTsgT2JqZWN0LmtleXMoKSBpcyBvd24tZW51bWVyYWJsZS1vbmx5XG4gKiAgICAgYnkgc3BlYyBzbyBwcm90b3R5cGUga2V5cyBuZXZlciBhcHBlYXIgaW4gdGhlIGl0ZXJhdGlvbi5cbiAqXG4gKiBEbyBOT1QgXCJmaXhcIiB0aGUgbmF0aXZlU2V0IGFzeW1tZXRyeSBieSBhZGRpbmcgaGFzT3duUHJvcGVydHkg4oCUIGl0IGlzXG4gKiBpbnRlbnRpb25hbCBhbmQgd291bGQgYnJlYWsgcGF0aCBjcmVhdGlvbiBmb3IgbmV3IGludGVybWVkaWF0ZSBub2Rlcy5cbiAqXG4gKiBQYXRocyBtYXkgYmUgZG90LW5vdGF0aW9uIHN0cmluZ3Mgb3IgcHJlLXNwbGl0IChzdHJpbmd8bnVtYmVyKVtdIGFycmF5cy5cbiAqL1xuXG5jb25zdCBERU5JRUQgPSBuZXcgU2V0KFsnX19wcm90b19fJywgJ2NvbnN0cnVjdG9yJywgJ3Byb3RvdHlwZSddKTtcblxuZnVuY3Rpb24gdG9TZWdtZW50cyhwYXRoOiBzdHJpbmcgfCAoc3RyaW5nIHwgbnVtYmVyKVtdKTogKHN0cmluZyB8IG51bWJlcilbXSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHBhdGgpID8gcGF0aCA6IHBhdGguc3BsaXQoJy4nKTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIHZhbHVlIGF0IGBwYXRoYCBpbiBgb2JqYCwgcmV0dXJuaW5nIGBkZWZhdWx0VmFsdWVgIGlmIGFic2VudC5cbiAqXG4gKiBTZWN1cml0eTogZWFjaCBwYXRoIHNlZ21lbnQgaXMgY2hlY2tlZCBhZ2FpbnN0IHRoZSBERU5JRUQgbGlzdCBhbmQgcmVxdWlyZXNcbiAqIGFuIG93biBwcm9wZXJ0eSBhdCBldmVyeSBzdGVwLCBwcmV2ZW50aW5nIHByb3RvdHlwZS1jaGFpbiByZWFkcy5cbiAqIGUuZy4gbmF0aXZlR2V0KHt9LCAnX19wcm90b19fJykgYW5kIG5hdGl2ZUdldCh7fSwgJ2NvbnN0cnVjdG9yJykgYm90aCByZXR1cm5cbiAqIGBkZWZhdWx0VmFsdWVgIGluc3RlYWQgb2YgbGVha2luZyBPYmplY3QucHJvdG90eXBlIC8gdGhlIE9iamVjdCBjb25zdHJ1Y3Rvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5hdGl2ZUdldChvYmo6IGFueSwgcGF0aDogc3RyaW5nIHwgKHN0cmluZyB8IG51bWJlcilbXSwgZGVmYXVsdFZhbHVlPzogYW55KTogYW55IHtcbiAgY29uc3Qgc2VncyA9IHRvU2VnbWVudHMocGF0aCk7XG4gIGxldCBjdXJyID0gb2JqO1xuICBmb3IgKGNvbnN0IHNlZyBvZiBzZWdzKSB7XG4gICAgaWYgKGN1cnIgPT0gbnVsbCkgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgICBpZiAoREVOSUVELmhhcyhTdHJpbmcoc2VnKSkpIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY3Vyciwgc2VnKSkgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgICBjdXJyID0gY3VycltzZWddO1xuICB9XG4gIHJldHVybiBjdXJyID09PSB1bmRlZmluZWQgPyBkZWZhdWx0VmFsdWUgOiBjdXJyO1xufVxuXG4vKiogTXV0YXRlIGBvYmpgLCBzZXR0aW5nIGB2YWx1ZWAgYXQgYHBhdGhgIChjcmVhdGVzIGludGVybWVkaWF0ZSBvYmplY3RzKS4gUmV0dXJucyBgb2JqYC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuYXRpdmVTZXQob2JqOiBhbnksIHBhdGg6IHN0cmluZyB8IChzdHJpbmcgfCBudW1iZXIpW10sIHZhbHVlOiBhbnkpOiBhbnkge1xuICBjb25zdCBzZWdzID0gdG9TZWdtZW50cyhwYXRoKTtcbiAgbGV0IGN1cnIgPSBvYmo7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2Vncy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICBjb25zdCBrID0gc2Vnc1tpXTtcbiAgICBpZiAoREVOSUVELmhhcyhTdHJpbmcoaykpKSByZXR1cm4gb2JqO1xuICAgIGlmIChjdXJyW2tdID09IG51bGwgfHwgdHlwZW9mIGN1cnJba10gIT09ICdvYmplY3QnKSB7XG4gICAgICBjdXJyW2tdID0gdHlwZW9mIHNlZ3NbaSArIDFdID09PSAnbnVtYmVyJyA/IFtdIDoge307XG4gICAgfVxuICAgIGN1cnIgPSBjdXJyW2tdO1xuICB9XG4gIGNvbnN0IGxhc3QgPSBzZWdzW3NlZ3MubGVuZ3RoIC0gMV07XG4gIGlmIChERU5JRUQuaGFzKFN0cmluZyhsYXN0KSkpIHJldHVybiBvYmo7XG4gIGN1cnJbbGFzdF0gPSB2YWx1ZTtcbiAgcmV0dXJuIG9iajtcbn1cblxuLyoqXG4gKiBSZW1vdmUgdGhlIG93biBwcm9wZXJ0eSBhdCBgcGF0aGAgaW4gYG9iamAgKHRoZSByZXBsYXkgcHJpbWl0aXZlIGZvciB0aGVcbiAqIGBkZWxldGVgIGNvbW1pdCB2ZXJiLCAjMTNjLUIpLiBOby1vcCB3aGVuIGFueSBpbnRlcm1lZGlhdGUgc2VnbWVudCBpc1xuICogbWlzc2luZyDigJQgZGVsZXRpbmcgYW4gYWJzZW50IGtleSBoYXMgbm90aGluZyB0byByZW1vdmUuXG4gKlxuICogU2VjdXJpdHk6IHNhbWUgREVOSUVEICsgaGFzT3duUHJvcGVydHkgZGlzY2lwbGluZSBhcyBuYXRpdmVHZXQg4oCUIGV2ZXJ5XG4gKiBzZWdtZW50IGlzIGNoZWNrZWQsIHNvIGBuYXRpdmVEZWxldGUob2JqLCAnX19wcm90b19fXHUwMDFmeCcpYCBhbmRcbiAqIHByb3RvdHlwZS1jaGFpbiB3YWxrcyBhcmUgaW5lcnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuYXRpdmVEZWxldGUob2JqOiBhbnksIHBhdGg6IHN0cmluZyB8IChzdHJpbmcgfCBudW1iZXIpW10pOiB2b2lkIHtcbiAgY29uc3Qgc2VncyA9IHRvU2VnbWVudHMocGF0aCk7XG4gIGxldCBjdXJyID0gb2JqO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHNlZ3MubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgY29uc3Qgc2VnID0gc2Vnc1tpXTtcbiAgICBpZiAoREVOSUVELmhhcyhTdHJpbmcoc2VnKSkpIHJldHVybjtcbiAgICBpZiAoY3VyciA9PSBudWxsIHx8IHR5cGVvZiBjdXJyICE9PSAnb2JqZWN0JyB8fCAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGN1cnIsIHNlZykpIHJldHVybjtcbiAgICBjdXJyID0gY3VycltzZWddO1xuICB9XG4gIGNvbnN0IGxhc3QgPSBzZWdzW3NlZ3MubGVuZ3RoIC0gMV07XG4gIGlmIChERU5JRUQuaGFzKFN0cmluZyhsYXN0KSkpIHJldHVybjtcbiAgaWYgKGN1cnIgIT0gbnVsbCAmJiB0eXBlb2YgY3VyciA9PT0gJ29iamVjdCcpIHtcbiAgICBkZWxldGUgY3VycltsYXN0XTtcbiAgfVxufVxuXG4vKiogUmV0dXJucyB0cnVlIGlmIGBvYmpgIGhhcyBhbiBvd24gcHJvcGVydHkgYXQgZXZlcnkgc2VnbWVudCBvZiBgcGF0aGAuICovXG5leHBvcnQgZnVuY3Rpb24gbmF0aXZlSGFzKG9iajogYW55LCBwYXRoOiBzdHJpbmcgfCAoc3RyaW5nIHwgbnVtYmVyKVtdKTogYm9vbGVhbiB7XG4gIGNvbnN0IHNlZ3MgPSB0b1NlZ21lbnRzKHBhdGgpO1xuICBsZXQgY3VyciA9IG9iajtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWdzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGN1cnIgPT0gbnVsbCB8fCAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGN1cnIsIHNlZ3NbaV0pKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGkgPCBzZWdzLmxlbmd0aCAtIDEpIGN1cnIgPSBjdXJyW3NlZ3NbaV1dO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIERlZXAgbWVyZ2Ugd2hlcmUgZGVzdGluYXRpb24gd2lucyBmb3IgYW55IGRlZmluZWQgdmFsdWUuXG4gKiBGaWxscyBtaXNzaW5nIGtleXMgZnJvbSBgc3JjYCwgYnV0IG5ldmVyIG92ZXJ3cml0ZXMgZGVmaW5lZCBrZXlzIGluIGBkc3RgLlxuICogQXJyYXlzIGFyZSBub3QgcmVjdXJzZWQg4oCUIGRzdCBhcnJheSBhbHdheXMgd2lucyB3aGVuIHByZXNlbnQuXG4gKlxuICogUmVwbGFjZXM6IGBtZXJnZVdpdGgoZHN0LCBzcmMsIChvYmpWYWx1ZSkgPT4gb2JqVmFsdWUgIT09IHVuZGVmaW5lZCA/IG9ialZhbHVlIDogdW5kZWZpbmVkKWBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlQ29udGV4dFdpbnMoZHN0OiBhbnksIHNyYzogYW55KTogYW55IHtcbiAgaWYgKCFzcmMgfHwgdHlwZW9mIHNyYyAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShzcmMpKSB7XG4gICAgcmV0dXJuIGRzdCAhPT0gdW5kZWZpbmVkID8gZHN0IDogc3JjO1xuICB9XG4gIGNvbnN0IG91dDogYW55ID0gZHN0ICE9IG51bGwgJiYgdHlwZW9mIGRzdCA9PT0gJ29iamVjdCcgPyB7IC4uLmRzdCB9IDoge307XG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHNyYykpIHtcbiAgICBpZiAoREVOSUVELmhhcyhrZXkpKSBjb250aW51ZTtcbiAgICBjb25zdCBkc3RWYWwgPSBvdXRba2V5XTtcbiAgICBpZiAoZHN0VmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIGRzdCB3aW5zOyByZWN1cnNlIG9ubHkgaWYgYm90aCBzaWRlcyBhcmUgcGxhaW4gb2JqZWN0c1xuICAgICAgaWYgKFxuICAgICAgICBkc3RWYWwgIT09IG51bGwgJiZcbiAgICAgICAgdHlwZW9mIGRzdFZhbCA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgIUFycmF5LmlzQXJyYXkoZHN0VmFsKSAmJlxuICAgICAgICBzcmNba2V5XSAhPT0gbnVsbCAmJlxuICAgICAgICB0eXBlb2Ygc3JjW2tleV0gPT09ICdvYmplY3QnICYmXG4gICAgICAgICFBcnJheS5pc0FycmF5KHNyY1trZXldKVxuICAgICAgKSB7XG4gICAgICAgIG91dFtrZXldID0gbWVyZ2VDb250ZXh0V2lucyhkc3RWYWwsIHNyY1trZXldKTtcbiAgICAgIH1cbiAgICAgIC8vIGVsc2Uga2VlcCBkc3RWYWwgdW5jaGFuZ2VkXG4gICAgfSBlbHNlIHtcbiAgICAgIG91dFtrZXldID0gc3JjW2tleV07XG4gICAgfVxuICB9XG4gIHJldHVybiBvdXQ7XG59XG4iXX0=
|
|
291
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0aE9wcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvbWVtb3J5L3BhdGhPcHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQkc7QUFFSCxNQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLFdBQVcsRUFBRSxhQUFhLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztBQUVsRSwyRkFBMkY7QUFDM0YsTUFBTSxVQUFVLGVBQWUsQ0FBQyxPQUF3QjtJQUN0RCxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFDckMsQ0FBQztBQUVELFNBQVMsVUFBVSxDQUFDLElBQWtDO0lBQ3BELE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3RELENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLFNBQVMsQ0FBQyxHQUFRLEVBQUUsSUFBa0MsRUFBRSxZQUFrQjtJQUN4RixNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDOUIsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDO0lBQ2YsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN2QixJQUFJLElBQUksSUFBSSxJQUFJO1lBQUUsT0FBTyxZQUFZLENBQUM7UUFDdEMsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUFFLE9BQU8sWUFBWSxDQUFDO1FBQ2pELElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQztZQUFFLE9BQU8sWUFBWSxD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QUFHLENBQUMsQ0FBQyxFQUN4QixDQUFDO2dCQUNELEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDaEQsQ0FBQztZQUNELDZCQUE2QjtRQUMvQixDQUFDO2FBQU0sQ0FBQztZQUNOLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdEIsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHBhdGhPcHMudHMg4oCUIE5hdGl2ZSBuZXN0ZWQtcGF0aCBoZWxwZXJzIChyZXBsYWNlcyBsb2Rhc2guZ2V0L3NldC9oYXMvbWVyZ2V3aXRoKVxuICpcbiAqIFNlY3VyaXR5IGNvbnRyYWN0OiBhbGwgZnVuY3Rpb25zIGd1YXJkIGFnYWluc3QgcHJvdG90eXBlLXBvbGx1dGlvbiBhbmRcbiAqIHByb3RvdHlwZS1jaGFpbi1yZWFkIGF0dGFja3MuIFRoZSBERU5JRUQgc2V0IGJsb2NrcyB0aGUgdGhyZWUgY2Fub25pY2FsXG4gKiBwb2xsdXRpb24gdmVjdG9ycyAoX19wcm90b19fLCBjb25zdHJ1Y3RvciwgcHJvdG90eXBlKSBvbiBldmVyeSBmdW5jdGlvbi5cbiAqXG4gKiBJbnRlbnRpb25hbCBhc3ltbWV0cnk6XG4gKiAgIC0gbmF0aXZlU2V0ICDigJQgREVOSUVEIGNoZWNrIG9ubHkgYXQgZWFjaCBzZWdtZW50LiBObyBoYXNPd25Qcm9wZXJ0eVxuICogICAgIGNoZWNrIGlzIG5lZWRlZCBiZWNhdXNlIHdyaXRpbmcgYWx3YXlzIGNyZWF0ZXMgYW4gT1dOIHByb3BlcnR5IG9uIGBjdXJyYCxcbiAqICAgICB3aGljaCBjYW5ub3QgcG9sbHV0ZSB0aGUgcHJvdG90eXBlIGNoYWluLlxuICogICAtIG5hdGl2ZUdldCAvIG5hdGl2ZUhhcyDigJQgREVOSUVEIGNoZWNrICsgaGFzT3duUHJvcGVydHkgYXQgZXZlcnkgc3RlcC5cbiAqICAgICBSZWFkcyBmb2xsb3cgdGhlIHByb3RvdHlwZSBjaGFpbiBieSBkZWZhdWx0IChicmFja2V0IG5vdGF0aW9uKSwgc28gdGhlXG4gKiAgICAgaGFzT3duUHJvcGVydHkgZ3VhcmQgaXMgcmVxdWlyZWQgdG8gcHJldmVudCBsZWFraW5nIGluaGVyaXRlZCB2YWx1ZXNcbiAqICAgICAoZS5nLiBPYmplY3QucHJvdG90eXBlLCBPYmplY3QgY29uc3RydWN0b3IsIHRvU3RyaW5nKS5cbiAqICAgLSBtZXJnZUNvbnRleHRXaW5zIOKAlCBERU5JRUQgY2hlY2sgb25seTsgT2JqZWN0LmtleXMoKSBpcyBvd24tZW51bWVyYWJsZS1vbmx5XG4gKiAgICAgYnkgc3BlYyBzbyBwcm90b3R5cGUga2V5cyBuZXZlciBhcHBlYXIgaW4gdGhlIGl0ZXJhdGlvbi5cbiAqXG4gKiBEbyBOT1QgXCJmaXhcIiB0aGUgbmF0aXZlU2V0IGFzeW1tZXRyeSBieSBhZGRpbmcgaGFzT3duUHJvcGVydHkg4oCUIGl0IGlzXG4gKiBpbnRlbnRpb25hbCBhbmQgd291bGQgYnJlYWsgcGF0aCBjcmVhdGlvbiBmb3IgbmV3IGludGVybWVkaWF0ZSBub2Rlcy5cbiAqXG4gKiBQYXRocyBtYXkgYmUgZG90LW5vdGF0aW9uIHN0cmluZ3Mgb3IgcHJlLXNwbGl0IChzdHJpbmd8bnVtYmVyKVtdIGFycmF5cy5cbiAqL1xuXG5jb25zdCBERU5JRUQgPSBuZXcgU2V0KFsnX19wcm90b19fJywgJ2NvbnN0cnVjdG9yJywgJ3Byb3RvdHlwZSddKTtcblxuLyoqIElzIGBzZWdtZW50YCBvbmUgb2YgdGhlIHRocmVlIHByb3RvdHlwZS1wb2xsdXRpb24gdmVjdG9ycyBldmVyeSBoZWxwZXIgaGVyZSByZWZ1c2VzPyAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRGVuaWVkU2VnbWVudChzZWdtZW50OiBzdHJpbmcgfCBudW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIERFTklFRC5oYXMoU3RyaW5nKHNlZ21lbnQpKTtcbn1cblxuZnVuY3Rpb24gdG9TZWdtZW50cyhwYXRoOiBzdHJpbmcgfCAoc3RyaW5nIHwgbnVtYmVyKVtdKTogKHN0cmluZyB8IG51bWJlcilbXSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHBhdGgpID8gcGF0aCA6IHBhdGguc3BsaXQoJy4nKTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIHZhbHVlIGF0IGBwYXRoYCBpbiBgb2JqYCwgcmV0dXJuaW5nIGBkZWZhdWx0VmFsdWVgIGlmIGFic2VudC5cbiAqXG4gKiBTZWN1cml0eTogZWFjaCBwYXRoIHNlZ21lbnQgaXMgY2hlY2tlZCBhZ2FpbnN0IHRoZSBERU5JRUQgbGlzdCBhbmQgcmVxdWlyZXNcbiAqIGFuIG93biBwcm9wZXJ0eSBhdCBldmVyeSBzdGVwLCBwcmV2ZW50aW5nIHByb3RvdHlwZS1jaGFpbiByZWFkcy5cbiAqIGUuZy4gbmF0aXZlR2V0KHt9LCAnX19wcm90b19fJykgYW5kIG5hdGl2ZUdldCh7fSwgJ2NvbnN0cnVjdG9yJykgYm90aCByZXR1cm5cbiAqIGBkZWZhdWx0VmFsdWVgIGluc3RlYWQgb2YgbGVha2luZyBPYmplY3QucHJvdG90eXBlIC8gdGhlIE9iamVjdCBjb25zdHJ1Y3Rvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5hdGl2ZUdldChvYmo6IGFueSwgcGF0aDogc3RyaW5nIHwgKHN0cmluZyB8IG51bWJlcilbXSwgZGVmYXVsdFZhbHVlPzogYW55KTogYW55IHtcbiAgY29uc3Qgc2VncyA9IHRvU2VnbWVudHMocGF0aCk7XG4gIGxldCBjdXJyID0gb2JqO1xuICBmb3IgKGNvbnN0IHNlZyBvZiBzZWdzKSB7XG4gICAgaWYgKGN1cnIgPT0gbnVsbCkgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgICBpZiAoREVOSUVELmhhcyhTdHJpbmcoc2VnKSkpIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY3Vyciwgc2VnKSkgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgICBjdXJyID0gY3VycltzZWddO1xuICB9XG4gIHJldHVybiBjdXJyID09PSB1bmRlZmluZWQgPyBkZWZhdWx0VmFsdWUgOiBjdXJyO1xufVxuXG4vKiogTXV0YXRlIGBvYmpgLCBzZXR0aW5nIGB2YWx1ZWAgYXQgYHBhdGhgIChjcmVhdGVzIGludGVybWVkaWF0ZSBvYmplY3RzKS4gUmV0dXJucyBgb2JqYC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuYXRpdmVTZXQob2JqOiBhbnksIHBhdGg6IHN0cmluZyB8IChzdHJpbmcgfCBudW1iZXIpW10sIHZhbHVlOiBhbnkpOiBhbnkge1xuICBjb25zdCBzZWdzID0gdG9TZWdtZW50cyhwYXRoKTtcbiAgbGV0IGN1cnIgPSBvYmo7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2Vncy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICBjb25zdCBrID0gc2Vnc1tpXTtcbiAgICBpZiAoREVOSUVELmhhcyhTdHJpbmcoaykpKSByZXR1cm4gb2JqO1xuICAgIGlmIChjdXJyW2tdID09IG51bGwgfHwgdHlwZW9mIGN1cnJba10gIT09ICdvYmplY3QnKSB7XG4gICAgICBjdXJyW2tdID0gdHlwZW9mIHNlZ3NbaSArIDFdID09PSAnbnVtYmVyJyA/IFtdIDoge307XG4gICAgfVxuICAgIGN1cnIgPSBjdXJyW2tdO1xuICB9XG4gIGNvbnN0IGxhc3QgPSBzZWdzW3NlZ3MubGVuZ3RoIC0gMV07XG4gIGlmIChERU5JRUQuaGFzKFN0cmluZyhsYXN0KSkpIHJldHVybiBvYmo7XG4gIGN1cnJbbGFzdF0gPSB2YWx1ZTtcbiAgcmV0dXJuIG9iajtcbn1cblxuLyoqXG4gKiBSZW1vdmUgdGhlIG93biBwcm9wZXJ0eSBhdCBgcGF0aGAgaW4gYG9iamAgKHRoZSByZXBsYXkgcHJpbWl0aXZlIGZvciB0aGVcbiAqIGBkZWxldGVgIGNvbW1pdCB2ZXJiLCAjMTNjLUIpLiBOby1vcCB3aGVuIGFueSBpbnRlcm1lZGlhdGUgc2VnbWVudCBpc1xuICogbWlzc2luZyDigJQgZGVsZXRpbmcgYW4gYWJzZW50IGtleSBoYXMgbm90aGluZyB0byByZW1vdmUuXG4gKlxuICogU2VjdXJpdHk6IHNhbWUgREVOSUVEICsgaGFzT3duUHJvcGVydHkgZGlzY2lwbGluZSBhcyBuYXRpdmVHZXQg4oCUIGV2ZXJ5XG4gKiBzZWdtZW50IGlzIGNoZWNrZWQsIHNvIGBuYXRpdmVEZWxldGUob2JqLCAnX19wcm90b19fXHUwMDFmeCcpYCBhbmRcbiAqIHByb3RvdHlwZS1jaGFpbiB3YWxrcyBhcmUgaW5lcnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuYXRpdmVEZWxldGUob2JqOiBhbnksIHBhdGg6IHN0cmluZyB8IChzdHJpbmcgfCBudW1iZXIpW10pOiB2b2lkIHtcbiAgY29uc3Qgc2VncyA9IHRvU2VnbWVudHMocGF0aCk7XG4gIGxldCBjdXJyID0gb2JqO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHNlZ3MubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgY29uc3Qgc2VnID0gc2Vnc1tpXTtcbiAgICBpZiAoREVOSUVELmhhcyhTdHJpbmcoc2VnKSkpIHJldHVybjtcbiAgICBpZiAoY3VyciA9PSBudWxsIHx8IHR5cGVvZiBjdXJyICE9PSAnb2JqZWN0JyB8fCAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGN1cnIsIHNlZykpIHJldHVybjtcbiAgICBjdXJyID0gY3VycltzZWddO1xuICB9XG4gIGNvbnN0IGxhc3QgPSBzZWdzW3NlZ3MubGVuZ3RoIC0gMV07XG4gIGlmIChERU5JRUQuaGFzKFN0cmluZyhsYXN0KSkpIHJldHVybjtcbiAgaWYgKGN1cnIgIT0gbnVsbCAmJiB0eXBlb2YgY3VyciA9PT0gJ29iamVjdCcpIHtcbiAgICBkZWxldGUgY3VycltsYXN0XTtcbiAgfVxufVxuXG4vLyDilIDilIAgQ29weS1vbi13cml0ZSBwcmltaXRpdmVzIChkb2NzL2Rlc2lnbi8yMDI2LTEwLWNvcHktb24td3JpdGUtY29tbWl0Lm1kKSDilIDilIBcbi8vXG4vLyBUSEUgTEFXOiBhIGNvbW1pdHRlZCBnZW5lcmF0aW9uIGlzIG5ldmVyIGVkaXRlZC4gQSB3cml0ZXIgY29waWVzIHRoZSByb290XG4vLyBhbmQgZXZlcnkgY29udGFpbmVyIG9uIGVhY2ggcGF0aCBpdCB3cml0ZXMsIGVkaXRzIG9ubHkgY29udGFpbmVycyBpdFxuLy8gY3JlYXRlZCBkdXJpbmcgdGhlIGN1cnJlbnQgb3BlcmF0aW9uIChpdHMgYG93bmVkYCBzZXQpLCBhbmQgc2hhcmVzIGV2ZXJ5XG4vLyBvdGhlciBzdWJ0cmVlIHdpdGggdGhlIGdlbmVyYXRpb24gYmVmb3JlIGl0LiBUaGUgc2FtZSBsYXdcbi8vIGByZWFjdGl2ZS9zdHJ1Y3R1cmFsV3JpdGUudHMgwrcgc2V0SW5QYXRoYCBhcHBsaWVzIHRvIGEgc2luZ2xlIHZhbHVlLlxuXG4vKiogQSBjb250YWluZXIgYSB3cml0ZXIgbWF5IG93bjogYW55dGhpbmcgYHR5cGVvZiAnb2JqZWN0J2AgYW5kIG5vdCBudWxsLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ29udGFpbmVyKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgb2JqZWN0IHtcbiAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCc7XG59XG5cbi8qKlxuICogYHBhcmVudFtrZXldYCB3aGVuIGBwYXJlbnRgIGlzIGEgY29udGFpbmVyIHRoYXQgT1dOUyBga2V5YCDigJQgdGhlIHNsb3RcbiAqIHtAbGluayBuYXRpdmVHZXR9IHdvdWxkIHJlYWQsIHJlZnVzaW5nIHRoZSBzYW1lIHByb3RvdHlwZS1wb2xsdXRpb25cbiAqIHNlZ21lbnRzIOKAlCBlbHNlIGB1bmRlZmluZWRgLiBPbmUgc3RlcCBvZiBhIHBhdGggd2Fsay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG93bkNoaWxkKHBhcmVudDogdW5rbm93biwga2V5OiBzdHJpbmcgfCBudW1iZXIpOiB1bmtub3duIHtcbiAgcmV0dXJuIGlzQ29udGFpbmVyKHBhcmVudCkgJiYgIURFTklFRC5oYXMoU3RyaW5nKGtleSkpICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChwYXJlbnQsIGtleSlcbiAgICA/IChwYXJlbnQgYXMgUmVjb3JkPHN0cmluZyB8IG51bWJlciwgdW5rbm93bj4pW2tleV1cbiAgICA6IHVuZGVmaW5lZDtcbn1cblxuLyoqIFRydWUgZm9yIGFuIG93biBrZXkgb2YgYW4gYXJyYXkgdGhhdCBpcyBhbiBhcnJheSBJTkRFWCAoYCcwJ2AsIGAnMTInYCksIG5vdCBhIG5hbWUgKGBhcnIubm90ZWApLiAqL1xuZnVuY3Rpb24gaXNBcnJheUluZGV4S2V5KGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IG4gPSBOdW1iZXIoa2V5KTtcbiAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIobikgJiYgbiA+PSAwICYmIG4gPCA0Mjk0OTY3Mjk1ICYmIFN0cmluZyhuKSA9PT0ga2V5O1xufVxuXG4vKipcbiAqIFRoZSBuYW1lZCAobm9uLWluZGV4KSBvd24ga2V5cyBvZiBhbiBhcnJheSwgaW4gb3JkZXIuIE93bi1rZXkgb3JkZXIgcHV0c1xuICogZXZlcnkgaW5kZXggZmlyc3QsIGFzY2VuZGluZywgYW5kIG5hbWVzIGFmdGVyIHRoZW0g4oCUIHNvIHRoZSBuYW1lcyBhcmUgdGhlXG4gKiB0YWlsIG9mIGBPYmplY3Qua2V5c2AsIGFuZCBhbiBhcnJheSB3aXRob3V0IGFueSBpcyB0b2xkIGJ5IGl0cyBsYXN0IGtleS5cbiAqL1xuZnVuY3Rpb24gbmFtZWRBcnJheUtleXMoYXJyYXk6IHVua25vd25bXSk6IHN0cmluZ1tdIHtcbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGFycmF5KTtcbiAgbGV0IGZpcnN0ID0ga2V5cy5sZW5ndGg7XG4gIHdoaWxlIChmaXJzdCA+IDAgJiYgIWlzQXJyYXlJbmRleEtleShrZXlzW2ZpcnN0IC0gMV0pKSBmaXJzdC0tO1xuICByZXR1cm4ga2V5cy5zbGljZShmaXJzdCk7XG59XG5cbi8qKlxuICogQSBTSEFMTE9XIGNvcHkgb2Ygb25lIGNvbnRhaW5lciB0aGF0IGtlZXBzIGV2ZXJ5IHNsb3QgdGhlIHdob2xlLXN0YXRlXG4gKiBgc3RydWN0dXJlZENsb25lYCB0aGlzIHJlcGxhY2VkIGtlcHQg4oCUIHNvIGEgcGF0aCBjb3B5IGFuZCBhIGRlZXAgY2xvbmUgZ2l2ZVxuICogdGhlIHNhbWUgdmFsdWUgYXQgZXZlcnkgcGF0aDpcbiAqICAgLSBhIHBsYWluIG9iamVjdCAob3IgYSBudWxsLXByb3RvdHlwZSBvbmUpOiBpdHMgb3duIGVudW1lcmFibGUga2V5cywgaW5cbiAqICAgICBvcmRlciwgYnkgc3ByZWFkIOKAlCBhbiBvd24gYF9fcHJvdG9fX2Aga2V5IHN0YXlzIGEga2V5OyB0aGUgcmVzdWx0IGhhc1xuICogICAgIGBPYmplY3QucHJvdG90eXBlYCwgYXMgYSBjbG9uZSdzIGRvZXM7XG4gKiAgIC0gYW4gYXJyYXk6IGl0cyBpbmRpY2VzLCBob2xlcyBhbmQgbGVuZ3RoIChgc2xpY2VgKSBBTkQgYW55IG5hbWVkXG4gKiAgICAgcHJvcGVydHkgYSBuZXN0ZWQgd3JpdGUgaHVuZyBvZmYgaXQgKGBzbGljZWAgYWxvbmUgd291bGQgZHJvcCB0aG9zZSk7XG4gKiAgIC0gYW55dGhpbmcgZWxzZSDigJQgYSBgRGF0ZWAsIGBNYXBgLCBgU2V0YCwgdHlwZWQgYXJyYXksIGEgY2xhc3MgaW5zdGFuY2Ug4oCUXG4gKiAgICAgaXMgZGVlcC1jbG9uZWQsIHdoaWNoIGlzIHdoYXQgdGhlIHdob2xlLXN0YXRlIGNsb25lIGRpZCB0byBpdDsgYW5kIHRoZVxuICogICAgIG93biBlbnVtZXJhYmxlIHByb3BlcnRpZXMgdGhlIGNsb25lIGNhbm5vdCBjYXJyeSAoYW4gZXhwYW5kbyBhIG5lc3RlZFxuICogICAgIHdyaXRlIGh1bmcgb24gYSBgRGF0ZWApIGFyZSBjYXJyaWVkIG92ZXIgYnkgcmVmZXJlbmNlLCBzbyBhIGxhdGVyIHdyaXRlXG4gKiAgICAgdGhyb3VnaCBpdCBjaGFuZ2VzIGV4YWN0bHkgaXRzIG93biBwYXRoLiBSYXJlIG9uIGEgd3JpdGUgcGF0aC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNoYWxsb3dDb3B5PFQgZXh0ZW5kcyBvYmplY3Q+KGNvbnRhaW5lcjogVCk6IFQge1xuICBpZiAoQXJyYXkuaXNBcnJheShjb250YWluZXIpKSB7XG4gICAgY29uc3QgY29weSA9IGNvbnRhaW5lci5zbGljZSgpIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgZm9yIChjb25zdCBrZXkgb2YgbmFtZWRBcnJheUtleXMoY29udGFpbmVyKSkgY29weVtrZXldID0gKGNvbnRhaW5lciBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldO1xuICAgIHJldHVybiBjb3B5IGFzIHVua25vd24gYXMgVDtcbiAgfVxuICBjb25zdCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihjb250YWluZXIpO1xuICBpZiAocHJvdG8gPT09IE9iamVjdC5wcm90b3R5cGUgfHwgcHJvdG8gPT09IG51bGwpIHJldHVybiB7IC4uLmNvbnRhaW5lciB9O1xuICBjb25zdCBjb3B5ID0gc3RydWN0dXJlZENsb25lKGNvbnRhaW5lcikgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGNvbnRhaW5lcikpIHtcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjb3B5LCBrZXkpKSBjb3B5W2tleV0gPSAoY29udGFpbmVyIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldO1xuICB9XG4gIHJldHVybiBjb3B5IGFzIFQ7XG59XG5cbi8qKlxuICogTWFrZSB0aGUgY29udGFpbmVycyBvbiB0aGUgd2F5IHRvIGBwYXRoYCdzIExFQUYgb25lcyB0aGUgd3JpdGVyIG93bnMsIHNvXG4gKiB0aGUgd3JpdGUgdGhhdCBmb2xsb3dzIChgbmF0aXZlU2V0YCAvIGBuYXRpdmVEZWxldGVgIC8gYSB2ZXJiIGFybSkgZWRpdHNcbiAqIG5vdGhpbmcgaXQgZGlkIG5vdCBjcmVhdGUuXG4gKlxuICogYHJvb3RgIG11c3QgYWxyZWFkeSBiZSBvd25lZC4gV2Fsa2luZyBkb3duLCBldmVyeSBjb250YWluZXIgdGhlIHdyaXRlciBkaWRcbiAqIG5vdCBjcmVhdGUgKGBvd25lZGAgZG9lcyBub3QgaG9sZCBpdCkgaXMgcmVwbGFjZWQsIGluIGl0cyBwYXJlbnQsIGJ5IGl0c1xuICoge0BsaW5rIHNoYWxsb3dDb3B5fSwgd2hpY2ggdGhlIHdyaXRlciB0aGVuIG93bnMuIFRoZSB3YWxrIHN0b3BzIHdoZXJlXG4gKiBgbmF0aXZlU2V0YCB3b3VsZCBzdG9wIG9yIGNyZWF0ZTogYSBERU5JRUQgc2VnbWVudCAodGhlIHdyaXRlIGlzIHJlZnVzZWRcbiAqIHRoZXJlIGFueXdheSksIG9yIGEgbWlzc2luZyAvIHByaW1pdGl2ZSBpbnRlcm1lZGlhdGUgKGBuYXRpdmVTZXRgIG1ha2VzIGFcbiAqIGZyZXNoIGNvbnRhaW5lciBmcm9tIHRoYXQgcG9pbnQgb24pLiBUaGUgbGVhZiBpdHNlbGYgaXMgbmV2ZXIgY29waWVkIOKAlCB0aGVcbiAqIHdyaXRlIHJlcGxhY2VzIGl0LlxuICpcbiAqIENvc3Q6IG9uZSBzaGFsbG93IGNvcHkgcGVyIGNvbnRhaW5lciBvbiB0aGUgcGF0aCB0aGF0IHRoaXMgd3JpdGVyIGhhcyBub3RcbiAqIGFscmVhZHkgY29waWVkIOKAlCBPKGRlcHRoIMOXIHdpZHRoKSwgaW5kZXBlbmRlbnQgb2YgZXZlcnl0aGluZyB0aGUgd3JpdGVcbiAqIGRvZXMgbm90IHBhc3MgdGhyb3VnaC4gQSBwYXRoIG9mIG9uZSBzZWdtZW50IChhIHJvb3Qga2V5LCB0aGUgY29tbW9uIGNhc2UpXG4gKiBjb3BpZXMgbm90aGluZyBoZXJlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gb3duU3BpbmUocm9vdDogYW55LCBwYXRoOiBzdHJpbmcgfCAoc3RyaW5nIHwgbnVtYmVyKVtdLCBvd25lZDogV2Vha1NldDxvYmplY3Q+KTogdm9pZCB7XG4gIGNvbnN0IHNlZ3MgPSB0b1NlZ21lbnRzKHBhdGgpO1xuICBsZXQgY3VyciA9IHJvb3Q7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2Vncy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICBjb25zdCBrID0gc2Vnc1tpXTtcbiAgICBpZiAoREVOSUVELmhhcyhTdHJpbmcoaykpKSByZXR1cm47XG4gICAgY29uc3QgbmV4dCA9IGN1cnJba107XG4gICAgaWYgKCFpc0NvbnRhaW5lcihuZXh0KSkgcmV0dXJuO1xuICAgIGlmIChvd25lZC5oYXMobmV4dCkpIHtcbiAgICAgIGN1cnIgPSBuZXh0O1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGNvcHkgPSBzaGFsbG93Q29weShuZXh0KTtcbiAgICBvd25lZC5hZGQoY29weSk7XG4gICAgY3VycltrXSA9IGNvcHk7XG4gICAgY3VyciA9IGNvcHk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgcm9vdCBvZiBhIG5ldyBnZW5lcmF0aW9uOiBhIHNoYWxsb3cgY29weSBvZiBgYmFzZWAgd2hlbiBpdCBpcyBhXG4gKiBjb250YWluZXIgKG93bmVkIGJ5IHRoZSB3cml0ZXIpLCBlbHNlIHRoZSBoaXN0b3JpY2FsIGRlZXAgY2xvbmUgb2YgYVxuICogbm9uLWNvbnRhaW5lciBiYXNlIChgdW5kZWZpbmVkYCwgYSBwcmltaXRpdmUpIHNvIHRoZSBjYWxsZXJzJyBiZWhhdmlvdXIgb25cbiAqIHN1Y2ggYSBiYXNlIGlzIHVuY2hhbmdlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG93bmVkUm9vdE9mKGJhc2U6IGFueSwgb3duZWQ/OiBXZWFrU2V0PG9iamVjdD4pOiBhbnkge1xuICBpZiAoIWlzQ29udGFpbmVyKGJhc2UpKSByZXR1cm4gc3RydWN0dXJlZENsb25lKGJhc2UpO1xuICBjb25zdCByb290ID0gc2hhbGxvd0NvcHkoYmFzZSk7XG4gIG93bmVkPy5hZGQocm9vdCk7XG4gIHJldHVybiByb290O1xufVxuXG4vKiogTWFyayBhIHZhbHVlIHRoZSB3cml0ZXIganVzdCBjcmVhdGVkIChhIGZyZXNoIGNsb25lLCBhIG1lcmdlIHJlc3VsdCkgYXMgb3duZWQuICovXG5leHBvcnQgZnVuY3Rpb24gb3duKHZhbHVlOiB1bmtub3duLCBvd25lZDogV2Vha1NldDxvYmplY3Q+IHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGlmIChvd25lZCAhPT0gdW5kZWZpbmVkICYmIGlzQ29udGFpbmVyKHZhbHVlKSkgb3duZWQuYWRkKHZhbHVlKTtcbn1cblxuLyoqXG4gKiBNYXJrIEVWRVJZIGNvbnRhaW5lciBvZiBhIHRyZWUgdGhlIHdyaXRlciBqdXN0IGNyZWF0ZWQgd2hvbGUgKGFcbiAqIGBzdHJ1Y3R1cmVkQ2xvbmVgIHJlc3VsdCkgYXMgb3duZWQsIHNvIGEgbGF0ZXIgd3JpdGUgdGhyb3VnaCBhbnkgb2YgdGhlbVxuICogZWRpdHMgaXQgaW4gcGxhY2UgaW5zdGVhZCBvZiBjb3B5aW5nIGl0IGFnYWluLiBXYWxrcyBvd24gZW51bWVyYWJsZSBrZXlzIOKAlFxuICogdGhlIHNsb3RzIGEgcGF0aCBjYW4gYWRkcmVzczsgYSBgTWFwYCdzIG9yIGBTZXRgJ3MgZW50cmllcyBhcmUgbm90LiBPKHRoZVxuICogdHJlZSdzIGNvbnRhaW5lcnMpOyBhIGNvbnRhaW5lciBhbHJlYWR5IG93bmVkIGlzIG5vdCB3YWxrZWQgdHdpY2UgKGEgY3ljbGVcbiAqIGluc2lkZSB0aGUgY2xvbmUgZW5kcyB0aGVyZSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZG9wdCh0cmVlOiB1bmtub3duLCBvd25lZDogV2Vha1NldDxvYmplY3Q+KTogdm9pZCB7XG4gIGNvbnN0IHN0YWNrOiB1bmtub3duW10gPSBbdHJlZV07XG4gIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgdmFsdWUgPSBzdGFjay5wb3AoKTtcbiAgICBpZiAoIWlzQ29udGFpbmVyKHZhbHVlKSB8fCBvd25lZC5oYXModmFsdWUpKSBjb250aW51ZTtcbiAgICBvd25lZC5hZGQodmFsdWUpO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHZhbHVlKSkgc3RhY2sucHVzaCgodmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0pO1xuICB9XG59XG5cbi8qKiBSZXR1cm5zIHRydWUgaWYgYG9iamAgaGFzIGFuIG93biBwcm9wZXJ0eSBhdCBldmVyeSBzZWdtZW50IG9mIGBwYXRoYC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuYXRpdmVIYXMob2JqOiBhbnksIHBhdGg6IHN0cmluZyB8IChzdHJpbmcgfCBudW1iZXIpW10pOiBib29sZWFuIHtcbiAgY29uc3Qgc2VncyA9IHRvU2VnbWVudHMocGF0aCk7XG4gIGxldCBjdXJyID0gb2JqO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHNlZ3MubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoY3VyciA9PSBudWxsIHx8ICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY3Vyciwgc2Vnc1tpXSkpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoaSA8IHNlZ3MubGVuZ3RoIC0gMSkgY3VyciA9IGN1cnJbc2Vnc1tpXV07XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogRGVlcCBtZXJnZSB3aGVyZSBkZXN0aW5hdGlvbiB3aW5zIGZvciBhbnkgZGVmaW5lZCB2YWx1ZS5cbiAqIEZpbGxzIG1pc3Npbmcga2V5cyBmcm9tIGBzcmNgLCBidXQgbmV2ZXIgb3ZlcndyaXRlcyBkZWZpbmVkIGtleXMgaW4gYGRzdGAuXG4gKiBBcnJheXMgYXJlIG5vdCByZWN1cnNlZCDigJQgZHN0IGFycmF5IGFsd2F5cyB3aW5zIHdoZW4gcHJlc2VudC5cbiAqXG4gKiBSZXBsYWNlczogYG1lcmdlV2l0aChkc3QsIHNyYywgKG9ialZhbHVlKSA9PiBvYmpWYWx1ZSAhPT0gdW5kZWZpbmVkID8gb2JqVmFsdWUgOiB1bmRlZmluZWQpYFxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VDb250ZXh0V2lucyhkc3Q6IGFueSwgc3JjOiBhbnkpOiBhbnkge1xuICBpZiAoIXNyYyB8fCB0eXBlb2Ygc3JjICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHNyYykpIHtcbiAgICByZXR1cm4gZHN0ICE9PSB1bmRlZmluZWQgPyBkc3QgOiBzcmM7XG4gIH1cbiAgY29uc3Qgb3V0OiBhbnkgPSBkc3QgIT0gbnVsbCAmJiB0eXBlb2YgZHN0ID09PSAnb2JqZWN0JyA/IHsgLi4uZHN0IH0gOiB7fTtcbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoc3JjKSkge1xuICAgIGlmIChERU5JRUQuaGFzKGtleSkpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGRzdFZhbCA9IG91dFtrZXldO1xuICAgIGlmIChkc3RWYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gZHN0IHdpbnM7IHJlY3Vyc2Ugb25seSBpZiBib3RoIHNpZGVzIGFyZSBwbGFpbiBvYmplY3RzXG4gICAgICBpZiAoXG4gICAgICAgIGRzdFZhbCAhPT0gbnVsbCAmJlxuICAgICAgICB0eXBlb2YgZHN0VmFsID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAhQXJyYXkuaXNBcnJheShkc3RWYWwpICYmXG4gICAgICAgIHNyY1trZXldICE9PSBudWxsICYmXG4gICAgICAgIHR5cGVvZiBzcmNba2V5XSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgIUFycmF5LmlzQXJyYXkoc3JjW2tleV0pXG4gICAgICApIHtcbiAgICAgICAgb3V0W2tleV0gPSBtZXJnZUNvbnRleHRXaW5zKGRzdFZhbCwgc3JjW2tleV0pO1xuICAgICAgfVxuICAgICAgLy8gZWxzZSBrZWVwIGRzdFZhbCB1bmNoYW5nZWRcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0W2tleV0gPSBzcmNba2V5XTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cbiJdfQ==
|
|
@@ -183,9 +183,11 @@ export declare function deepSmartMerge(dst: any, src: any): any;
|
|
|
183
183
|
* whole-array `set` rows on one path, and this is what makes replaying them
|
|
184
184
|
* O(N) instead of O(N × rows).
|
|
185
185
|
*
|
|
186
|
-
*
|
|
187
|
-
*
|
|
188
|
-
*
|
|
186
|
+
* Asked by `replayRows` — live state and the redacted mirror through
|
|
187
|
+
* {@link nextGeneration}, `EventLog.materialise` and `stateAt` through
|
|
188
|
+
* {@link applySmartMergeInto}, the public {@link applySmartMerge}, and the
|
|
189
|
+
* admitted record's {@link dryFold} (9.30.0; the delta encoder's own
|
|
190
|
+
* per-family replay, which asked it too, was deleted then).
|
|
189
191
|
* `commitValueAt` needs no skip: it anchors at the LAST `set` by construction.
|
|
190
192
|
*/
|
|
191
193
|
export declare function supersededByNextSet(rows: readonly {
|
|
@@ -196,10 +198,15 @@ export declare function supersededByNextSet(rows: readonly {
|
|
|
196
198
|
* Applies a commit bundle to a base state by replaying operations in order.
|
|
197
199
|
* Guarantees "last writer wins" semantics.
|
|
198
200
|
*
|
|
199
|
-
*
|
|
200
|
-
*
|
|
201
|
-
*
|
|
202
|
-
*
|
|
201
|
+
* Returns a FULLY DETACHED result: the base is deep-cloned first and every
|
|
202
|
+
* value the replay writes is its own (`set` / `append` clone the recorded
|
|
203
|
+
* value; the `merge` arm reads a detached copy of `updates`), so the result
|
|
204
|
+
* shares no container with `base`, `updates` or `overwrite`. This is the
|
|
205
|
+
* public (`footprintjs/advanced`) contract, unchanged by copy-on-write
|
|
206
|
+
* (9.29.0) — byte-identical to 9.28.0 for every caller. The engine's own
|
|
207
|
+
* commit does NOT come here: `SharedMemory.applyPatch` builds the next
|
|
208
|
+
* generation with `nextGeneration`, which copies only the written
|
|
209
|
+
* paths. Both run the ONE verb switch, `replayRows`.
|
|
203
210
|
*
|
|
204
211
|
* Verb arms:
|
|
205
212
|
* - `'set'` — overwrite with `overwrite[path]` (the full final value).
|
|
@@ -217,18 +224,42 @@ export declare function supersededByNextSet(rows: readonly {
|
|
|
217
224
|
*
|
|
218
225
|
* Work, not bytes (9.22.1): a `set` row the NEXT row re-sets is skipped
|
|
219
226
|
* ({@link supersededByNextSet}) — the rows stay in the log, only the clone
|
|
220
|
-
* each would have paid is not. Every consumer
|
|
221
|
-
*
|
|
227
|
+
* each would have paid is not. Every consumer inherits the skip from
|
|
228
|
+
* `replayRows`; there is no second replay loop to keep in step.
|
|
222
229
|
*/
|
|
223
230
|
export declare function applySmartMerge(base: any, updates: MemoryPatch, overwrite: MemoryPatch, trace: TraceEntry[]): any;
|
|
224
231
|
/**
|
|
225
|
-
* The
|
|
226
|
-
*
|
|
227
|
-
*
|
|
228
|
-
*
|
|
229
|
-
*
|
|
230
|
-
*
|
|
231
|
-
*
|
|
232
|
+
* The engine's commit (copy-on-write, 9.29.0 — docs/design/2026-10-copy-on-
|
|
233
|
+
* write-commit.md): the NEXT committed generation. A copy of `base`'s ROOT
|
|
234
|
+
* plus a copy of every container on each written path; every other subtree
|
|
235
|
+
* is SHARED with `base`, which is never edited — committed state is
|
|
236
|
+
* immutable-after-swap, so sharing is safe, and a commit costs O(what it
|
|
237
|
+
* wrote), not O(state). `SharedMemory.applyPatch` (live state and the
|
|
238
|
+
* redacted mirror) is its caller. Internal: the public replay is
|
|
239
|
+
* {@link applySmartMerge}.
|
|
240
|
+
*/
|
|
241
|
+
export declare function nextGeneration(base: any, updates: MemoryPatch, overwrite: MemoryPatch, trace: TraceEntry[]): any;
|
|
242
|
+
/**
|
|
243
|
+
* The same replay, INTO `target` — no clone of its own. For a caller that
|
|
244
|
+
* already holds a private working copy (the read-side folds: `stateAt` in
|
|
245
|
+
* `time-travel/stateAt.ts` and `EventLog.materialise` clone their base ONCE
|
|
246
|
+
* and then apply every bundle here), so a fold over N bundles costs N row
|
|
247
|
+
* applications, not N clones of the whole state. Never hand it committed
|
|
248
|
+
* state: it mutates the ROOT in place. Below the root it follows the live
|
|
249
|
+
* commit's law ({@link nextGeneration}) — a container this call did not
|
|
250
|
+
* create is copied before a write passes through it — so a fold and the live
|
|
251
|
+
* state give the same value at every path, aliased subtrees included.
|
|
252
|
+
* The values it writes are its own, so `target` never aliases the log.
|
|
232
253
|
*/
|
|
233
254
|
export declare function applySmartMergeInto(target: any, updates: MemoryPatch, overwrite: MemoryPatch, trace: TraceEntry[]): any;
|
|
255
|
+
/**
|
|
256
|
+
* The fold, for COMPARISON only (9.30.0 — the admitted record): `base` with
|
|
257
|
+
* the bundle replayed by the one verb switch, copy-on-write below the root,
|
|
258
|
+
* every recorded value placed BY REFERENCE — no clone, so it costs what the
|
|
259
|
+
* bundle wrote and nothing more. It aliases the payload and every subtree of
|
|
260
|
+
* `base` the bundle did not write, and edits neither. Never hand it out,
|
|
261
|
+
* store it or write through it: `TransactionBuffer` builds one to ask whether
|
|
262
|
+
* a bundle folds back to what the stage read, then drops it.
|
|
263
|
+
*/
|
|
264
|
+
export declare function dryFold(base: any, updates: MemoryPatch, overwrite: MemoryPatch, trace: TraceEntry[]): any;
|
|
234
265
|
export {};
|