footprintjs 9.44.1 → 9.44.2
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 +4 -3
- package/dist/esm/lib/capture/freeze.d.ts +51 -7
- package/dist/esm/lib/capture/freeze.js +289 -24
- package/dist/esm/lib/capture/valueKinds.d.ts +57 -0
- package/dist/esm/lib/capture/valueKinds.js +142 -0
- package/dist/esm/lib/memory/EventLog.d.ts +24 -6
- package/dist/esm/lib/memory/EventLog.js +30 -10
- package/dist/esm/lib/memory/admission.js +4 -3
- package/dist/esm/lib/memory/borrowedMutation.js +2 -2
- package/dist/esm/lib/memory/equality.d.ts +55 -19
- package/dist/esm/lib/memory/equality.js +154 -51
- package/dist/esm/lib/memory/logModel.js +11 -4
- package/dist/esm/lib/runner/ExecutionRuntime.d.ts +4 -1
- package/dist/esm/lib/runner/ExecutionRuntime.js +15 -10
- package/dist/esm/lib/runner/snapshot.js +17 -3
- package/dist/esm/lib/slice/elementProvenance.js +2 -2
- package/dist/esm/lib/time-travel/chain.js +28 -26
- package/dist/lib/capture/freeze.js +292 -25
- package/dist/lib/capture/valueKinds.js +146 -0
- package/dist/lib/memory/EventLog.js +29 -9
- package/dist/lib/memory/admission.js +4 -3
- package/dist/lib/memory/borrowedMutation.js +2 -2
- package/dist/lib/memory/equality.js +154 -51
- package/dist/lib/memory/logModel.js +11 -4
- package/dist/lib/runner/ExecutionRuntime.js +14 -9
- package/dist/lib/runner/snapshot.js +16 -2
- package/dist/lib/slice/elementProvenance.js +2 -2
- package/dist/lib/time-travel/chain.js +27 -25
- package/dist/types/lib/capture/freeze.d.ts +51 -7
- package/dist/types/lib/capture/valueKinds.d.ts +57 -0
- package/dist/types/lib/memory/EventLog.d.ts +24 -6
- package/dist/types/lib/memory/equality.d.ts +55 -19
- package/dist/types/lib/runner/ExecutionRuntime.d.ts +4 -1
- package/package.json +2 -1
|
@@ -44,6 +44,7 @@
|
|
|
44
44
|
*/
|
|
45
45
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
46
46
|
exports.refuseChain = exports.spanOf = void 0;
|
|
47
|
+
const valueKinds_js_1 = require("../capture/valueKinds.js");
|
|
47
48
|
const runtimeStageId_js_1 = require("../ids/runtimeStageId.js");
|
|
48
49
|
const utils_js_1 = require("../memory/utils.js");
|
|
49
50
|
const stateAt_js_1 = require("./stateAt.js");
|
|
@@ -74,44 +75,45 @@ exports.spanOf = spanOf;
|
|
|
74
75
|
*
|
|
75
76
|
* The fold reproduces `'REDACTED'` wherever the engine scrubbed a write, while
|
|
76
77
|
* the checkpoint that seeded the resumed leg holds the real value — so those
|
|
77
|
-
* paths CANNOT agree, and are not asked to. Everything else
|
|
78
|
-
*
|
|
79
|
-
*
|
|
80
|
-
*
|
|
81
|
-
*
|
|
78
|
+
* paths CANNOT agree, and are not asked to. Everything else is decided by the
|
|
79
|
+
* ONE equality law (`memory/equality.ts · deepEqual`, every value kind compared
|
|
80
|
+
* as the record holds it; 9.44.2 — this walk had a law of its own, which held
|
|
81
|
+
* any two RegExps, Errors or buffers equal). Both sides are copies of one
|
|
82
|
+
* record, so an opaque value compares as `'copies'`. Only the containers above
|
|
83
|
+
* a redacted path are walked here.
|
|
82
84
|
*/
|
|
83
85
|
function sameState(a, b, redacted, path) {
|
|
84
|
-
if (
|
|
85
|
-
return
|
|
86
|
-
if (typeof a !== 'object' || typeof b !== 'object' || a === null || b === null)
|
|
87
|
-
return false;
|
|
88
|
-
if (a instanceof Date || b instanceof Date) {
|
|
89
|
-
return a instanceof Date && b instanceof Date && a.getTime() === b.getTime();
|
|
90
|
-
}
|
|
91
|
-
if (a instanceof Map || b instanceof Map || a instanceof Set || b instanceof Set) {
|
|
92
|
-
if (!(a instanceof Map && b instanceof Map) && !(a instanceof Set && b instanceof Set))
|
|
93
|
-
return false;
|
|
94
|
-
return sameState([...a.entries()], [...b.entries()], redacted, path);
|
|
95
|
-
}
|
|
96
|
-
if (Array.isArray(a) !== Array.isArray(b))
|
|
97
|
-
return false;
|
|
86
|
+
if (!redactedBelow(path, redacted))
|
|
87
|
+
return (0, utils_js_1.deepEqual)(a, b, 'copies');
|
|
98
88
|
if (Array.isArray(a) && Array.isArray(b)) {
|
|
99
89
|
if (a.length !== b.length)
|
|
100
90
|
return false;
|
|
101
91
|
return a.every((item, i) => sameState(item, b[i], redacted, path === '' ? String(i) : `${path}${utils_js_1.DELIM}${i}`));
|
|
102
92
|
}
|
|
103
|
-
const
|
|
104
|
-
|
|
93
|
+
const plain = (v) => v !== null && typeof v === 'object' && !Array.isArray(v) && (0, valueKinds_js_1.kindOf)(v) === 'plain';
|
|
94
|
+
if (!plain(a) || !plain(b))
|
|
95
|
+
return (0, utils_js_1.deepEqual)(a, b, 'copies');
|
|
105
96
|
const present = (o) => Object.keys(o).filter((k) => o[k] !== undefined);
|
|
106
|
-
const leftKeys = present(
|
|
107
|
-
const rightKeys = new Set(present(
|
|
97
|
+
const leftKeys = present(a);
|
|
98
|
+
const rightKeys = new Set(present(b));
|
|
108
99
|
if (leftKeys.length !== rightKeys.size || !leftKeys.every((k) => rightKeys.has(k)))
|
|
109
100
|
return false;
|
|
110
101
|
return leftKeys.every((k) => {
|
|
111
102
|
const childPath = path === '' ? k : `${path}${utils_js_1.DELIM}${k}`;
|
|
112
|
-
return redacted.has(childPath) || sameState(
|
|
103
|
+
return redacted.has(childPath) || sameState(a[k], b[k], redacted, childPath);
|
|
113
104
|
});
|
|
114
105
|
}
|
|
106
|
+
/** Is `path`, or a path below it, one the log was redacted at? */
|
|
107
|
+
function redactedBelow(path, redacted) {
|
|
108
|
+
if (redacted.size === 0)
|
|
109
|
+
return false;
|
|
110
|
+
if (path === '')
|
|
111
|
+
return true;
|
|
112
|
+
for (const r of redacted)
|
|
113
|
+
if (r === path || r.startsWith(`${path}${utils_js_1.DELIM}`))
|
|
114
|
+
return true;
|
|
115
|
+
return false;
|
|
116
|
+
}
|
|
115
117
|
/**
|
|
116
118
|
* Check that `legs` really are one run read in order, and say why not.
|
|
117
119
|
*
|
|
@@ -188,4 +190,4 @@ function refuseChain(legs) {
|
|
|
188
190
|
return undefined;
|
|
189
191
|
}
|
|
190
192
|
exports.refuseChain = refuseChain;
|
|
191
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhaW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RpbWUtdHJhdmVsL2NoYWluLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMENHOzs7QUFFSCxnRUFBK0Q7QUFFL0QsaURBQTJDO0FBQzNDLDZDQUF5RDtBQWF6RCwyRUFBMkU7QUFDM0UsU0FBZ0IsTUFBTSxDQUFDLEdBQTRCO0lBS2pELElBQUksS0FBeUIsQ0FBQztJQUM5QixJQUFJLElBQXdCLENBQUM7SUFDN0IsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUM5QixLQUFLLE1BQU0sTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUM7UUFDakMsSUFBSSxDQUFDLEVBQUU7WUFBRSxTQUFTO1FBQ2xCLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDWixNQUFNLEVBQUUsY0FBYyxFQUFFLEdBQUcsSUFBQSx1Q0FBbUIsRUFBQyxFQUFFLENBQUMsQ0FBQztRQUNuRCxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDO1lBQUUsU0FBUztRQUMzQyxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksY0FBYyxHQUFHLEtBQUs7WUFBRSxLQUFLLEdBQUcsY0FBYyxDQUFDO1FBQzFFLElBQUksSUFBSSxLQUFLLFNBQVMsSUFBSSxjQUFjLEdBQUcsSUFBSTtZQUFFLElBQUksR0FBRyxjQUFjLENBQUM7SUFDekUsQ0FBQztJQUNELE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQzlCLENBQUM7QUFsQkQsd0JBa0JDO0FBRUQ7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxTQUFTLFNBQVMsQ0FBQyxDQUFVLEVBQUUsQ0FBVSxFQUFFLFFBQTZCLEVBQUUsSUFBWTtJQUNwRixJQUFJLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ2pDLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDN0YsSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQztRQUMzQyxPQUFPLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQy9FLENBQUM7SUFDRCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQztRQUNqRixJQUFJLENBQUMsQ0FBQyxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDckcsT0FBTyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUNELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ3hELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDekMsSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxNQUFNO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDeEMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsZ0JBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDaEgsQ0FBQztJQUNELE1BQU0sSUFBSSxHQUFHLENBQTRCLENBQUM7SUFDMUMsTUFBTSxLQUFLLEdBQUcsQ0FBNEIsQ0FBQztJQUMzQyxNQUFNLE9BQU8sR0FBRyxDQUFDLENBQTBCLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUM7SUFDakcsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9CLE1BQU0sU0FBUyxHQUFHLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQzFDLElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxTQUFTLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ2pHLE9BQU8sUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1FBQzFCLE1BQU0sU0FBUyxHQUFHLElBQUksS0FBSyxF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QUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ3RFLE9BQU8sQ0FDTCxzQkFBc0IsQ0FBQywyQ0FBMkMsQ0FBQyxHQUFHLENBQUMseUJBQXlCO2dCQUNoRyxnR0FBZ0c7Z0JBQ2hHLGlHQUFpRztnQkFDakcsOEJBQThCLENBQy9CLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFoREQsa0NBZ0RDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBjaGFpbi50cyDigJQgcmVhZGluZyBhIHBhdXNlL3Jlc3VtZSBhcyBPTkUgYXhpcy5cbiAqXG4gKiBXSFkgVEhJUyBGSUxFIEVYSVNUUy4gQSBwYXVzZSBhbmQgaXRzIHJlc3VtZSBwcm9kdWNlIFRXTyBzbmFwc2hvdHMuIE9uIGFcbiAqIGNyb3NzLWV4ZWN1dG9yIHJlc3VtZSAodGhlIGNoZWNrcG9pbnQgd2FzIHBlcnNpc3RlZCBhbmQgYSBmcmVzaCBleGVjdXRvclxuICogcGlja2VkIGl0IHVwKSB0aGUgc2Vjb25kIHJ1biBnZXRzIGEgZnJlc2ggcnVudGltZTogaXRzIGBjb21taXRMb2dgIHN0YXJ0cyBhdFxuICogaW5kZXggMCBhbmQgaG9sZHMgb25seSB0aGUgcG9zdC1yZXN1bWUgY29tbWl0cywgYW5kIGl0cyBgaW5pdGlhbFN0YXRlYCBpc1xuICogdGhlIHN0YXRlIGF0IHRoZSBwYXVzZS4gVHdvIGxvZ3MsIHR3byBkaXNqb2ludCBheGVzIOKAlCBzbyBhIHJlYWRlciBzY3J1YmJpbmdcbiAqIGEgcmVzdW1lZCBydW4gc2F3IG9ubHkgdGhlIHNlY29uZCBoYWxmIHVubGVzcyB0aGUgYXBwbGljYXRpb24gaGFkIGtlcHQgdGhlXG4gKiBwYXVzZWQgc25hcHNob3QgYW5kIHN0aXRjaGVkIHRoZSBoYWx2ZXMgaXRzZWxmLiBFdmVyeSBhcHBsaWNhdGlvbiB0aGF0XG4gKiBwYXVzZXMgd291bGQgd3JpdGUgdGhhdCBzdGl0Y2hpbmcsIGFuZCBub25lIG9mIHRoZW0gb3duIHRoZSBhcml0aG1ldGljLlxuICpcbiAqIFRIRSBIT05FU1QgQklULCB1cCBmcm9udDogQ09NTUlUIElORElDRVMgQVJFIFJVTi1MT0NBTC4gVGhlcmUgaXMgbm8gZ2xvYmFsXG4gKiBpbmRleCBhY3Jvc3MgYSBjaGFpbiBhbmQgdGhpcyBmaWxlIGRvZXMgbm90IGludmVudCBvbmUg4oCUIGBjb21taXRJZHhgIGFuZFxuICogYGxhc3RDb21taXRJZHhgIGtlZXAgaW5kZXhpbmcgdGhlaXIgb3duIHNvdXJjZSwgYW5kIGV2ZXJ5IHN0b3AgY2FycmllcyB0aGVcbiAqIHtAbGluayBTdG9wLnNvdXJjZUlkeH0gdGhleSBiZWxvbmcgdG8uIFRoZSBjdXJzb3IncyBTVEVQUyBhcmUgd2hhdCBydW5cbiAqIGFjcm9zcyB0aGUgd2hvbGUgY2hhaW4uXG4gKlxuICogQU5EIFRIRSBSRUZVU0FMOiBhIGNoYWluIHRoYXQgaXMgbm90IG9yZGVyZWQsIG9yIHdob3NlIGxlZ3MgYXJlIG5vdCBmcm9tIG9uZVxuICogbGluZWFnZSwgaXMgUkVGVVNFRCByYXRoZXIgdGhhbiBndWVzc2VkIGF0LiBUaGUgcmVjb3JkIGNhcnJpZXMgVFdPIHNpZ25hbHNcbiAqIGFuZCB0aGlzIGZpbGUgcmVhZHMgYm90aDpcbiAqXG4gKiAtIFRoZSBleGVjdXRpb24gaW5kZXggdGhlIGVuZ2luZSBzdGFtcHMgaW50byBldmVyeSBgcnVudGltZVN0YWdlSWRgIOKAlFxuICogICBnbG9iYWxseSBtb25vdG9uaWMgcGVyIHJ1biBhbmQsIGRlbGliZXJhdGVseSwgTk9UIHJlc2V0IG9uIHJlc3VtZS4gU28gYVxuICogICBsYXRlciBsZWcncyBmaXJzdCBleGVjdXRpb24gaW5kZXggbXVzdCBiZSBwYXN0IHRoZSBlYXJsaWVyIGxlZydzIGxhc3QsIGFuZFxuICogICBubyBzdGFnZSBtYXkgYXBwZWFyIGluIHR3byBsZWdzLiBUaGlzIGNhdGNoZXMgYSBiYWNrd2FyZHMgY2hhaW4sIGEgZnJlc2hcbiAqICAgcnVuICh3aGljaCByZXN0YXJ0cyBhdCAwKSBhbmQgYSBzYW1lLWV4ZWN1dG9yIHJlc3VtZSAod2hvc2Ugb25lIHNuYXBzaG90XG4gKiAgIGFscmVhZHkgaG9sZHMgYm90aCBoYWx2ZXMpLlxuICogLSBUaGUgbGF0ZXIgbGVnJ3MgYGluaXRpYWxTdGF0ZWAuIE9uIGEgcmVzdW1lIHRoZSBmcmVzaCBydW50aW1lIGlzIHNlZWRlZFxuICogICBmcm9tIHRoZSBjaGVja3BvaW50LCBzbyB0aGF0IGJhc2UgSVMgdGhlIHN0YXRlIGF0IHRoZSBwYXVzZSDigJQgYW5kIHRoZVxuICogICBzdGF0ZSB0aGUgZWFybGllciBsZWdzIEZPTEQgVE8gbXVzdCBkZWVwLWVxdWFsIGl0LiBUaGlzIGlzIHdoYXQgY2F0Y2hlcyBhXG4gKiAgIGxlZyBmcm9tIHNvbWUgT1RIRVIgbGluZWFnZSB3aG9zZSBpbmRpY2VzIG1lcmVseSBoYXBwZW4gdG8gYmUgaGlnaGVyOiB0aGVcbiAqICAgY291bnRlcnMgbGluZSB1cCBieSBhY2NpZGVudCwgdGhlIHN0YXRlIG5ldmVyIGRvZXMuXG4gKlxuICogQSBjaGFydCBpZGVudGl0eSBvciBhIGxpbmVhZ2UgaWQgaXMgTk9UIG9uIHRoZSByZWNvcmQsIHNvIG5vdGhpbmcgaGVyZVxuICogcHJldGVuZHMgdG8gY2hlY2sgb25lLiBBbmQgd2hlcmUgdGhlIHN0YXRlIHNpZ25hbCBpcyBub3Qgb24gdGhlIHJlY29yZFxuICogZWl0aGVyIOKAlCBhIGxlZyByZWNvcmRlZCBiZWZvcmUgOS4xNyBjYXJyaWVzIG5vIGBpbml0aWFsU3RhdGVgOyBhbiBlYXJsaWVyXG4gKiBsZWcgd2l0aCBubyBiYXNlIGZvbGRzIGAnbG9nLW9ubHknYDsgYSBsZWcgd2l0aCB1bnJlYWRhYmxlIHJvd3MgZm9sZHMgYW5cbiAqIGluY29tcGxldGUgc3RhdGUg4oCUIHRoYXQgY2hlY2sgaXMgU0tJUFBFRCwgbm90IGZha2VkOiB0aGUgY2hhaW4gdGhlbiByZXN0cyBvblxuICogdGhlIGluZGV4IGNoZWNrcyBhbG9uZSwgYW5kIGV2ZXJ5IGZvbGQncyBgYmFzaXNgIHN0aWxsIHNheXMgd2hhdCBpdCBzdG9vZFxuICogb24uIFRoYXQgZGVncmFkYXRpb24gaXMgZG9jdW1lbnRlZCBvbiBgcmVmdXNlQ2hhaW5gLCBvbiBgdGltZVRyYXZlbGAnc1xuICogYEB0aHJvd3NgLCBhbmQgaW4gdGhlIFJFQURNRS5cbiAqL1xuXG5pbXBvcnQgeyBwYXJzZVJ1bnRpbWVTdGFnZUlkIH0gZnJvbSAnLi4vaWRzL3J1bnRpbWVTdGFnZUlkLmpzJztcbmltcG9ydCB0eXBlIHsgQ29tbWl0QnVuZGxlIH0gZnJvbSAnLi4vbWVtb3J5L3R5cGVzLmpzJztcbmltcG9ydCB7IERFTElNIH0gZnJvbSAnLi4vbWVtb3J5L3V0aWxzLmpzJztcbmltcG9ydCB7IHR5cGUgUmVhZFNvdXJjZSwgZm9sZExlZ3MgfSBmcm9tICcuL3N0YXRlQXQuanMnO1xuaW1wb3J0IHR5cGUgeyBUaW1lVHJhdmVsU291cmNlIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbi8qKiBPbmUgbGVnIG9mIGEgY2hhaW46IGEgc291cmNlLCBpdHMgcmVhZCBsb2csIGFuZCB3aGVyZSBpdCBzaXRzIGluIHRoZSBydW4uICovXG5leHBvcnQgaW50ZXJmYWNlIENoYWluTGVnIHtcbiAgcmVhZG9ubHkgc291cmNlOiBUaW1lVHJhdmVsU291cmNlO1xuICByZWFkb25seSBsb2c6IHJlYWRvbmx5IENvbW1pdEJ1bmRsZVtdO1xuICAvKiogTG93ZXN0IGV4ZWN1dGlvbiBpbmRleCBzdGFtcGVkIGluIHRoaXMgbGVnOyBgdW5kZWZpbmVkYCBmb3IgYW4gaWQtbGVzcyBsb2cuICovXG4gIHJlYWRvbmx5IGZpcnN0RXhlY3V0aW9uSW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgLyoqIEhpZ2hlc3QgZXhlY3V0aW9uIGluZGV4IHN0YW1wZWQgaW4gdGhpcyBsZWcuICovXG4gIHJlYWRvbmx5IGxhc3RFeGVjdXRpb25JbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkO1xufVxuXG4vKiogVGhlIGV4ZWN1dGlvbi1pbmRleCBzcGFuIG9mIG9uZSBsZWcsIHJlYWQgb2ZmIGl0cyBgcnVudGltZVN0YWdlSWRgcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzcGFuT2YobG9nOiByZWFkb25seSBDb21taXRCdW5kbGVbXSk6IHtcbiAgZmlyc3Q6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgbGFzdDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBpZHM6IFNldDxzdHJpbmc+O1xufSB7XG4gIGxldCBmaXJzdDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBsZXQgbGFzdDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBjb25zdCBpZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBidW5kbGUgb2YgbG9nKSB7XG4gICAgY29uc3QgaWQgPSBidW5kbGUucnVudGltZVN0YWdlSWQ7XG4gICAgaWYgKCFpZCkgY29udGludWU7XG4gICAgaWRzLmFkZChpZCk7XG4gICAgY29uc3QgeyBleGVjdXRpb25JbmRleCB9ID0gcGFyc2VSdW50aW1lU3RhZ2VJZChpZCk7XG4gICAgaWYgKE51bWJlci5pc05hTihleGVjdXRpb25JbmRleCkpIGNvbnRpbnVlO1xuICAgIGlmIChmaXJzdCA9PT0gdW5kZWZpbmVkIHx8IGV4ZWN1dGlvbkluZGV4IDwgZmlyc3QpIGZpcnN0ID0gZXhlY3V0aW9uSW5kZXg7XG4gICAgaWYgKGxhc3QgPT09IHVuZGVmaW5lZCB8fCBleGVjdXRpb25JbmRleCA+IGxhc3QpIGxhc3QgPSBleGVjdXRpb25JbmRleDtcbiAgfVxuICByZXR1cm4geyBmaXJzdCwgbGFzdCwgaWRzIH07XG59XG5cbi8qKlxuICogU3RydWN0dXJhbCBlcXVhbGl0eSBvZiB0d28gZm9sZGVkIHN0YXRlcywgaWdub3JpbmcgdGhlIHBhdGhzIHRoZSBsb2cgd2FzXG4gKiByZWRhY3RlZCBhdC5cbiAqXG4gKiBUaGUgZm9sZCByZXByb2R1Y2VzIGAnUkVEQUNURUQnYCB3aGVyZXZlciB0aGUgZW5naW5lIHNjcnViYmVkIGEgd3JpdGUsIHdoaWxlXG4gKiB0aGUgY2hlY2twb2ludCB0aGF0IHNlZWRlZCB0aGUgcmVzdW1lZCBsZWcgaG9sZHMgdGhlIHJlYWwgdmFsdWUg4oCUIHNvIHRob3NlXG4gKiBwYXRocyBDQU5OT1QgYWdyZWUsIGFuZCBhcmUgbm90IGFza2VkIHRvLiBFdmVyeXRoaW5nIGVsc2UgbXVzdDogc2FtZSBrZXlzXG4gKiAoYSBrZXkgaG9sZGluZyBgdW5kZWZpbmVkYCBjb3VudHMgYXMgYWJzZW50LCBhcyBpdCBkb2VzIHRocm91Z2ggSlNPTiksIHNhbWVcbiAqIGFycmF5IGxlbmd0aHMsIHNhbWUgbGVhdmVzIGJ5IGBPYmplY3QuaXNgLCBEYXRlcyBieSB0aGVpciBpbnN0YW50LiBWYWx1ZXNcbiAqIGFyZSB3aGF0ZXZlciBzdXJ2aXZlZCBgc3RydWN0dXJlZENsb25lYCwgd2hpY2ggaXMgdGhlIGxpYnJhcnkncyBvd24gbGF3IG9uXG4gKiBzdGF0ZSB2YWx1ZXMuXG4gKi9cbmZ1bmN0aW9uIHNhbWVTdGF0ZShhOiB1bmtub3duLCBiOiB1bmtub3duLCByZWRhY3RlZDogUmVhZG9ubHlTZXQ8c3RyaW5nPiwgcGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmIChPYmplY3QuaXMoYSwgYikpIHJldHVybiB0cnVlO1xuICBpZiAodHlwZW9mIGEgIT09ICdvYmplY3QnIHx8IHR5cGVvZiBiICE9PSAnb2JqZWN0JyB8fCBhID09PSBudWxsIHx8IGIgPT09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgaWYgKGEgaW5zdGFuY2VvZiBEYXRlIHx8IGIgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgcmV0dXJuIGEgaW5zdGFuY2VvZiBEYXRlICYmIGIgaW5zdGFuY2VvZiBEYXRlICYmIGEuZ2V0VGltZSgpID09PSBiLmdldFRpbWUoKTtcbiAgfVxuICBpZiAoYSBpbnN0YW5jZW9mIE1hcCB8fCBiIGluc3RhbmNlb2YgTWFwIHx8IGEgaW5zdGFuY2VvZiBTZXQgfHwgYiBpbnN0YW5jZW9mIFNldCkge1xuICAgIGlmICghKGEgaW5zdGFuY2VvZiBNYXAgJiYgYiBpbnN0YW5jZW9mIE1hcCkgJiYgIShhIGluc3RhbmNlb2YgU2V0ICYmIGIgaW5zdGFuY2VvZiBTZXQpKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHNhbWVTdGF0ZShbLi4uYS5lbnRyaWVzKCldLCBbLi4uYi5lbnRyaWVzKCldLCByZWRhY3RlZCwgcGF0aCk7XG4gIH1cbiAgaWYgKEFycmF5LmlzQXJyYXkoYSkgIT09IEFycmF5LmlzQXJyYXkoYikpIHJldHVybiBmYWxzZTtcbiAgaWYgKEFycmF5LmlzQXJyYXkoYSkgJiYgQXJyYXkuaXNBcnJheShiKSkge1xuICAgIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gYS5ldmVyeSgoaXRlbSwgaSkgPT4gc2FtZVN0YXRlKGl0ZW0sIGJbaV0sIHJlZGFjdGVkLCBwYXRoID09PSAnJyA/IFN0cmluZyhpKSA6IGAke3BhdGh9JHtERUxJTX0ke2l9YCkpO1xuICB9XG4gIGNvbnN0IGxlZnQgPSBhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBjb25zdCByaWdodCA9IGIgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNvbnN0IHByZXNlbnQgPSAobzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IE9iamVjdC5rZXlzKG8pLmZpbHRlcigoaykgPT4gb1trXSAhPT0gdW5kZWZpbmVkKTtcbiAgY29uc3QgbGVmdEtleXMgPSBwcmVzZW50KGxlZnQpO1xuICBjb25zdCByaWdodEtleXMgPSBuZXcgU2V0KHByZXNlbnQocmlnaHQpKTtcbiAgaWYgKGxlZnRLZXlzLmxlbmd0aCAhPT0gcmlnaHRLZXlzLnNpemUgfHwgIWxlZnRLZXlzLmV2ZXJ5KChrKSA9PiByaWdodEtleXMuaGFzKGspKSkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gbGVmdEtleXMuZXZlcnkoKGspID0+IHtcbiAgICBjb25zdCBjaGlsZFBhdGggPSBwYXRoID09PSAnJyA/IGsgOiBgJHtwYXRofSR7REVMSU19JHtrfWA7XG4gICAgcmV0dXJuIHJlZGFjdGVkLmhhcyhjaGlsZFBhdGgpIHx8IHNhbWVTdGF0ZShsZWZ0W2tdLCByaWdodFtrXSwgcmVkYWN0ZWQsIGNoaWxkUGF0aCk7XG4gIH0pO1xufVxuXG4vKipcbiAqIENoZWNrIHRoYXQgYGxlZ3NgIHJlYWxseSBhcmUgb25lIHJ1biByZWFkIGluIG9yZGVyLCBhbmQgc2F5IHdoeSBub3QuXG4gKlxuICogUmV0dXJucyB0aGUgcmVmdXNhbCBtZXNzYWdlLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZSBjaGFpbiBpcyBzb3VuZC4gVGhyZWVcbiAqIGRpc3RpbmN0IGZhaWx1cmVzLCBiZWNhdXNlIHRoZXkgYXJlIHRocmVlIGRpZmZlcmVudCBtaXN0YWtlcywgY2hlY2tlZCBpblxuICogdGhpcyBvcmRlcjpcbiAqXG4gKiAtIFJFUEVBVEVEIFNUQUdFIOKAlCBvbmUgYHJ1bnRpbWVTdGFnZUlkYCBhcHBlYXJzIGluIHR3byBsZWdzLiBJZHMgYXJlIHVuaXF1ZVxuICogICB3aXRoaW4gYSBydW4sIHNvIGEgcmVwZWF0IG1lYW5zIHRoZSBzYW1lIGV4ZWN1dGlvbiB3YXMgcmVjb3JkZWQgdHdpY2U6IGFcbiAqICAgc2FtZS1leGVjdXRvciByZXN1bWUsIHdob3NlIHNuYXBzaG90IEFMUkVBRFkgaG9sZHMgdGhlIHdob2xlIGxvZyBhbmQgbmVlZHNcbiAqICAgbm8gY2hhaW5pbmcsIGlzIHRoZSB1c3VhbCBjYXVzZS5cbiAqIC0gT1VUIE9GIE9SREVSIOKAlCBhIGxhdGVyIGxlZydzIGZpcnN0IGV4ZWN1dGlvbiBpbmRleCBpcyBub3QgcGFzdCB0aGUgZWFybGllclxuICogICBsZWcncyBsYXN0LiBFaXRoZXIgdGhlIHNvdXJjZXMgd2VyZSBoYW5kZWQgb3ZlciBiYWNrd2FyZHMsIG9yIHRoZSBzZWNvbmRcbiAqICAgaXMgbm90IGEgY29udGludWF0aW9uIGF0IGFsbCAoYSBmcmVzaCBydW4gcmVzdGFydHMgdGhlIGNvdW50ZXIgYXQgMCwgc28gYW5cbiAqICAgdW5yZWxhdGVkIHNuYXBzaG90IGZhaWxzIGhlcmUgcmF0aGVyIHRoYW4gc2lsZW50bHkgaW50ZXJsZWF2aW5nKS5cbiAqIC0gV1JPTkcgTElORUFHRSDigJQgbGVnIGsncyBgaW5pdGlhbFN0YXRlYCBpcyBub3QgdGhlIHN0YXRlIGxlZ3MgMC4uay0xIGZvbGRcbiAqICAgdG8uIE9uIGEgcmVzdW1lIHRoZSBsYXRlciBsZWcgaXMgc2VlZGVkIGZyb20gdGhlIGNoZWNrcG9pbnQsIHNvIGl0cyBiYXNlXG4gKiAgIElTIHRoZSBzdGF0ZSBhdCB0aGUgcGF1c2U7IGEgbGVnIHRoYXQgYmVnaW5zIGFueXdoZXJlIGVsc2UgaXMgZnJvbSBzb21lXG4gKiAgIG90aGVyIHJ1biwgaG93ZXZlciBpdHMgaW5kaWNlcyBoYXBwZW4gdG8gbGluZSB1cC5cbiAqXG4gKiBUSEUgTElORUFHRSBDSEVDSyBSVU5TIE9OTFkgV0hFUkUgVEhFIFJFQ09SRCBBTExPV1MgSVQsIGFuZCBpcyBza2lwcGVkIOKAlFxuICogbmV2ZXIgZmFrZWQg4oCUIG90aGVyd2lzZTogbGVnIGsgbXVzdCBjYXJyeSBhbiBgaW5pdGlhbFN0YXRlYCAoYSByZWNvcmRpbmdcbiAqIG1hZGUgYmVmb3JlIDkuMTcgaGFzIG5vbmUpLCBhbmQgdGhlIGZvbGQgb2YgdGhlIGxlZ3MgYmVmb3JlIGl0IG11c3Qgc3RhbmQgb25cbiAqIGEgcmVhbCBiYXNlIChgYmFzaXM6ICdpbml0aWFsK2xvZydgKSB3aXRoIG5vIHVucmVhZGFibGUgcm93cyAoYHNraXBwZWRgXG4gKiBhYnNlbnQpIOKAlCBhIGxvZy1vbmx5IG9yIGdhcHBlZCBmb2xkIGlzIG5vdCBhIHN0YXRlIGEgcmVhbCBiYXNlIG1heSBiZSBoZWxkXG4gKiBhZ2FpbnN0LiBPbiBzdWNoIGEgY2hhaW4gdGhlIHR3byBpbmRleCBjaGVja3MgYXJlIHRoZSB3aG9sZSBkZWZlbmNlLCBhbmRcbiAqIGBmb2xkTGVnc2AnIGxlZyBydWxlIHRoZW4gQ09OVElOVUVTIHRoZSBmb2xkIGFjcm9zcyB0aGUgc2VhbSwgd2hpY2ggaXMgdGhlXG4gKiByaWdodCBzdGF0ZSBmb3IgYSByZWFsIHJlc3VtZSBhbmQgaXMgd2hhdCBgYmFzaXNgIHJlcG9ydHMuIFBhdGhzIHRoZSBsb2dcbiAqIHdhcyByZWRhY3RlZCBhdCBhcmUgZXhjbHVkZWQgZnJvbSB0aGUgY29tcGFyaXNvbjogdGhlIGZvbGQgaG9sZHNcbiAqIGAnUkVEQUNURUQnYCB0aGVyZSBhbmQgdGhlIGNoZWNrcG9pbnQgaG9sZHMgdGhlIHZhbHVlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVmdXNlQ2hhaW4obGVnczogcmVhZG9ubHkgUmVhZFNvdXJjZVtdKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGxlZ3MubGVuZ3RoID09PSAwKSByZXR1cm4gJ3RpbWVUcmF2ZWw6IGEgY2hhaW4gbmVlZHMgYXQgbGVhc3Qgb25lIHNvdXJjZSwgZ290IGFuIGVtcHR5IGFycmF5Lic7XG5cbiAgY29uc3Qgc3BhbnMgPSBsZWdzLm1hcCgobGVnKSA9PiBzcGFuT2YobGVnLmxvZykpO1xuICBjb25zdCBzZWVuID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgZm9yIChjb25zdCBbaSwgc3Bhbl0gb2Ygc3BhbnMuZW50cmllcygpKSB7XG4gICAgZm9yIChjb25zdCBpZCBvZiBzcGFuLmlkcykge1xuICAgICAgY29uc3QgZWFybGllciA9IHNlZW4uZ2V0KGlkKTtcbiAgICAgIGlmIChlYXJsaWVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBgdGltZVRyYXZlbDogc291cmNlcyAke2VhcmxpZXJ9IGFuZCAke2l9IGJvdGggcmVjb3JkICcke2lkfScuIEEgcnVudGltZVN0YWdlSWQgaXMgdW5pcXVlIGAgK1xuICAgICAgICAgICd3aXRoaW4gYSBydW4sIHNvIHRoZXNlIGFyZSBub3QgdHdvIGxlZ3Mgb2Ygb25lIHJ1biDigJQgYSBzYW1lLWV4ZWN1dG9yIHJlc3VtZSBhbHJlYWR5ICcgK1xuICAgICAgICAgICdjYXJyaWVzIHRoZSB3aG9sZSBsb2cgaW4gT05FIHNuYXBzaG90IGFuZCBtdXN0IG5vdCBiZSBjaGFpbmVkIHdpdGggdGhlIHBhdXNlZCBvbmUuJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgc2Vlbi5zZXQoaWQsIGkpO1xuICAgIH1cbiAgfVxuXG4gIGxldCBwcmV2aW91czogeyBpZHg6IG51bWJlcjsgbGFzdDogbnVtYmVyIH0gfCB1bmRlZmluZWQ7XG4gIGZvciAoY29uc3QgW2ksIHNwYW5dIG9mIHNwYW5zLmVudHJpZXMoKSkge1xuICAgIGlmIChzcGFuLmZpcnN0ID09PSB1bmRlZmluZWQgfHwgc3Bhbi5sYXN0ID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgIGlmIChwcmV2aW91cyAmJiBzcGFuLmZpcnN0IDw9IHByZXZpb3VzLmxhc3QpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGB0aW1lVHJhdmVsOiBzb3VyY2UgJHtpfSBzdGFydHMgYXQgZXhlY3V0aW9uIGluZGV4ICR7c3Bhbi5maXJzdH0sIHdoaWNoIGlzIG5vdCBwYXN0IGAgK1xuICAgICAgICBgc291cmNlICR7cHJldmlvdXMuaWR4fSdzIGxhc3QgKCR7cHJldmlvdXMubGFzdH0pLiBDaGFpbiB0aGUgc291cmNlcyBpbiBydW4gb3JkZXIsIGFuZCBgICtcbiAgICAgICAgJ29ubHkgc291cmNlcyBmcm9tIE9ORSBsaW5lYWdlIOKAlCB0aGUgZW5naW5lIG5ldmVyIHJlc2V0cyB0aGUgZXhlY3V0aW9uIGNvdW50ZXIgYWNyb3NzIGEgJyArXG4gICAgICAgICdyZXN1bWUsIHNvIGEgZnJlc2ggcnVuIHJlc3RhcnRpbmcgYXQgMCBpcyBhIGRpZmZlcmVudCBydW4sIG5vdCBhIGNvbnRpbnVhdGlvbi4nXG4gICAgICApO1xuICAgIH1cbiAgICBwcmV2aW91cyA9IHsgaWR4OiBpLCBsYXN0OiBzcGFuLmxhc3QgfTtcbiAgfVxuXG4gIGZvciAobGV0IGsgPSAxOyBrIDwgbGVncy5sZW5ndGg7IGsrKykge1xuICAgIGNvbnN0IGJhc2UgPSBsZWdzW2tdLmJhc2U7XG4gICAgaWYgKCFiYXNlIHx8IHR5cGVvZiBiYXNlICE9PSAnb2JqZWN0JykgY29udGludWU7IC8vIG5vIHNpZ25hbCBvbiB0aGUgcmVjb3JkIOKAlCBkb2N1bWVudGVkIGRlZ3JhZGF0aW9uXG4gICAgY29uc3QgYmVmb3JlID0gZm9sZExlZ3MobGVncywgayAtIDEsIE51bWJlci5QT1NJVElWRV9JTkZJTklUWSk7XG4gICAgaWYgKGJlZm9yZS5iYXNpcyAhPT0gJ2luaXRpYWwrbG9nJyB8fCBiZWZvcmUuc2tpcHBlZCkgY29udGludWU7IC8vIG5vdCBhIHN0YXRlIGEgcmVhbCBiYXNlIGNhbiBiZSBoZWxkIHRvXG4gICAgaWYgKCFzYW1lU3RhdGUoYmVmb3JlLnN0YXRlLCBiYXNlLCBuZXcgU2V0KGJlZm9yZS5yZWRhY3RlZFBhdGhzKSwgJycpKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBgdGltZVRyYXZlbDogc291cmNlICR7a30ncyBpbml0aWFsU3RhdGUgaXMgbm90IHRoZSBzdGF0ZSBzb3VyY2UgJHtrIC0gMX0gZm9sZHMgdG8uIE9uIGEgcmVzdW1lIGAgK1xuICAgICAgICBcInRoZSBsYXRlciBsZWcncyBpbml0aWFsU3RhdGUgSVMgdGhlIHN0YXRlIGF0IHRoZSBwYXVzZSwgc28gYSBsZWcgdGhhdCBiZWdpbnMgYW55d2hlcmUgZWxzZSBpcyBcIiArXG4gICAgICAgICdub3QgZnJvbSBvbmUgbGluZWFnZSDigJQgYSBkaWZmZXJlbnQgY2hhcnQsIG9yIGFub3RoZXIgcnVuIG9mIHRoaXMgb25lIOKAlCBldmVuIHdoZW4gaXRzIGV4ZWN1dGlvbiAnICtcbiAgICAgICAgJ2luZGljZXMgaGFwcGVuIHRvIGJlIGhpZ2hlci4nXG4gICAgICApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuIl19
|
|
193
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhaW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RpbWUtdHJhdmVsL2NoYWluLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMENHOzs7QUFFSCw0REFBa0Q7QUFDbEQsZ0VBQStEO0FBRS9ELGlEQUFzRDtBQUN0RCw2Q0FBeUQ7QUFhekQsMkVBQTJFO0FBQzNFLFNBQWdCLE1BQU0sQ0FBQyxHQUE0QjtJQUtqRCxJQUFJLEtBQXlCLENBQUM7SUFDOUIsSUFBSSxJQUF3QixDQUFDO0lBQzdCLE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFDOUIsS0FBSyxNQUFNLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUN6QixNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxFQUFFO1lBQUUsU0FBUztRQUNsQixHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ1osTUFBTSxFQUFFLGNBQWMsRUFBRSxHQUFHLElBQUEsdUNBQW1CLEVBQUMsRUFBRSxDQUFDLENBQUM7UUFDbkQsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQztZQUFFLFNBQVM7UUFDM0MsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLGNBQWMsR0FBRyxLQUFLO1lBQUUsS0FBSyxHQUFHLGNBQWMsQ0FBQztRQUMxRSxJQUFJLElBQUksS0FBSyxTQUFTLElBQUksY0FBYyxHQUFHLElBQUk7WUFBRSxJQUFJLEdBQUcsY0FBYyxDQUFDO0lBQ3pFLENBQUM7SUFDRCxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUM5QixDQUFDO0FBbEJELHdCQWtCQztBQUVEOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILFNBQVMsU0FBUyxDQUFDLENBQVUsRUFBRSxD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QUF5QjtnQkFDaEcsZ0dBQWdHO2dCQUNoRyxpR0FBaUc7Z0JBQ2pHLDhCQUE4QixDQUMvQixDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDO0FBaERELGtDQWdEQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogY2hhaW4udHMg4oCUIHJlYWRpbmcgYSBwYXVzZS9yZXN1bWUgYXMgT05FIGF4aXMuXG4gKlxuICogV0hZIFRISVMgRklMRSBFWElTVFMuIEEgcGF1c2UgYW5kIGl0cyByZXN1bWUgcHJvZHVjZSBUV08gc25hcHNob3RzLiBPbiBhXG4gKiBjcm9zcy1leGVjdXRvciByZXN1bWUgKHRoZSBjaGVja3BvaW50IHdhcyBwZXJzaXN0ZWQgYW5kIGEgZnJlc2ggZXhlY3V0b3JcbiAqIHBpY2tlZCBpdCB1cCkgdGhlIHNlY29uZCBydW4gZ2V0cyBhIGZyZXNoIHJ1bnRpbWU6IGl0cyBgY29tbWl0TG9nYCBzdGFydHMgYXRcbiAqIGluZGV4IDAgYW5kIGhvbGRzIG9ubHkgdGhlIHBvc3QtcmVzdW1lIGNvbW1pdHMsIGFuZCBpdHMgYGluaXRpYWxTdGF0ZWAgaXNcbiAqIHRoZSBzdGF0ZSBhdCB0aGUgcGF1c2UuIFR3byBsb2dzLCB0d28gZGlzam9pbnQgYXhlcyDigJQgc28gYSByZWFkZXIgc2NydWJiaW5nXG4gKiBhIHJlc3VtZWQgcnVuIHNhdyBvbmx5IHRoZSBzZWNvbmQgaGFsZiB1bmxlc3MgdGhlIGFwcGxpY2F0aW9uIGhhZCBrZXB0IHRoZVxuICogcGF1c2VkIHNuYXBzaG90IGFuZCBzdGl0Y2hlZCB0aGUgaGFsdmVzIGl0c2VsZi4gRXZlcnkgYXBwbGljYXRpb24gdGhhdFxuICogcGF1c2VzIHdvdWxkIHdyaXRlIHRoYXQgc3RpdGNoaW5nLCBhbmQgbm9uZSBvZiB0aGVtIG93biB0aGUgYXJpdGhtZXRpYy5cbiAqXG4gKiBUSEUgSE9ORVNUIEJJVCwgdXAgZnJvbnQ6IENPTU1JVCBJTkRJQ0VTIEFSRSBSVU4tTE9DQUwuIFRoZXJlIGlzIG5vIGdsb2JhbFxuICogaW5kZXggYWNyb3NzIGEgY2hhaW4gYW5kIHRoaXMgZmlsZSBkb2VzIG5vdCBpbnZlbnQgb25lIOKAlCBgY29tbWl0SWR4YCBhbmRcbiAqIGBsYXN0Q29tbWl0SWR4YCBrZWVwIGluZGV4aW5nIHRoZWlyIG93biBzb3VyY2UsIGFuZCBldmVyeSBzdG9wIGNhcnJpZXMgdGhlXG4gKiB7QGxpbmsgU3RvcC5zb3VyY2VJZHh9IHRoZXkgYmVsb25nIHRvLiBUaGUgY3Vyc29yJ3MgU1RFUFMgYXJlIHdoYXQgcnVuXG4gKiBhY3Jvc3MgdGhlIHdob2xlIGNoYWluLlxuICpcbiAqIEFORCBUSEUgUkVGVVNBTDogYSBjaGFpbiB0aGF0IGlzIG5vdCBvcmRlcmVkLCBvciB3aG9zZSBsZWdzIGFyZSBub3QgZnJvbSBvbmVcbiAqIGxpbmVhZ2UsIGlzIFJFRlVTRUQgcmF0aGVyIHRoYW4gZ3Vlc3NlZCBhdC4gVGhlIHJlY29yZCBjYXJyaWVzIFRXTyBzaWduYWxzXG4gKiBhbmQgdGhpcyBmaWxlIHJlYWRzIGJvdGg6XG4gKlxuICogLSBUaGUgZXhlY3V0aW9uIGluZGV4IHRoZSBlbmdpbmUgc3RhbXBzIGludG8gZXZlcnkgYHJ1bnRpbWVTdGFnZUlkYCDigJRcbiAqICAgZ2xvYmFsbHkgbW9ub3RvbmljIHBlciBydW4gYW5kLCBkZWxpYmVyYXRlbHksIE5PVCByZXNldCBvbiByZXN1bWUuIFNvIGFcbiAqICAgbGF0ZXIgbGVnJ3MgZmlyc3QgZXhlY3V0aW9uIGluZGV4IG11c3QgYmUgcGFzdCB0aGUgZWFybGllciBsZWcncyBsYXN0LCBhbmRcbiAqICAgbm8gc3RhZ2UgbWF5IGFwcGVhciBpbiB0d28gbGVncy4gVGhpcyBjYXRjaGVzIGEgYmFja3dhcmRzIGNoYWluLCBhIGZyZXNoXG4gKiAgIHJ1biAod2hpY2ggcmVzdGFydHMgYXQgMCkgYW5kIGEgc2FtZS1leGVjdXRvciByZXN1bWUgKHdob3NlIG9uZSBzbmFwc2hvdFxuICogICBhbHJlYWR5IGhvbGRzIGJvdGggaGFsdmVzKS5cbiAqIC0gVGhlIGxhdGVyIGxlZydzIGBpbml0aWFsU3RhdGVgLiBPbiBhIHJlc3VtZSB0aGUgZnJlc2ggcnVudGltZSBpcyBzZWVkZWRcbiAqICAgZnJvbSB0aGUgY2hlY2twb2ludCwgc28gdGhhdCBiYXNlIElTIHRoZSBzdGF0ZSBhdCB0aGUgcGF1c2Ug4oCUIGFuZCB0aGVcbiAqICAgc3RhdGUgdGhlIGVhcmxpZXIgbGVncyBGT0xEIFRPIG11c3QgZGVlcC1lcXVhbCBpdC4gVGhpcyBpcyB3aGF0IGNhdGNoZXMgYVxuICogICBsZWcgZnJvbSBzb21lIE9USEVSIGxpbmVhZ2Ugd2hvc2UgaW5kaWNlcyBtZXJlbHkgaGFwcGVuIHRvIGJlIGhpZ2hlcjogdGhlXG4gKiAgIGNvdW50ZXJzIGxpbmUgdXAgYnkgYWNjaWRlbnQsIHRoZSBzdGF0ZSBuZXZlciBkb2VzLlxuICpcbiAqIEEgY2hhcnQgaWRlbnRpdHkgb3IgYSBsaW5lYWdlIGlkIGlzIE5PVCBvbiB0aGUgcmVjb3JkLCBzbyBub3RoaW5nIGhlcmVcbiAqIHByZXRlbmRzIHRvIGNoZWNrIG9uZS4gQW5kIHdoZXJlIHRoZSBzdGF0ZSBzaWduYWwgaXMgbm90IG9uIHRoZSByZWNvcmRcbiAqIGVpdGhlciDigJQgYSBsZWcgcmVjb3JkZWQgYmVmb3JlIDkuMTcgY2FycmllcyBubyBgaW5pdGlhbFN0YXRlYDsgYW4gZWFybGllclxuICogbGVnIHdpdGggbm8gYmFzZSBmb2xkcyBgJ2xvZy1vbmx5J2A7IGEgbGVnIHdpdGggdW5yZWFkYWJsZSByb3dzIGZvbGRzIGFuXG4gKiBpbmNvbXBsZXRlIHN0YXRlIOKAlCB0aGF0IGNoZWNrIGlzIFNLSVBQRUQsIG5vdCBmYWtlZDogdGhlIGNoYWluIHRoZW4gcmVzdHMgb25cbiAqIHRoZSBpbmRleCBjaGVja3MgYWxvbmUsIGFuZCBldmVyeSBmb2xkJ3MgYGJhc2lzYCBzdGlsbCBzYXlzIHdoYXQgaXQgc3Rvb2RcbiAqIG9uLiBUaGF0IGRlZ3JhZGF0aW9uIGlzIGRvY3VtZW50ZWQgb24gYHJlZnVzZUNoYWluYCwgb24gYHRpbWVUcmF2ZWxgJ3NcbiAqIGBAdGhyb3dzYCwgYW5kIGluIHRoZSBSRUFETUUuXG4gKi9cblxuaW1wb3J0IHsga2luZE9mIH0gZnJvbSAnLi4vY2FwdHVyZS92YWx1ZUtpbmRzLmpzJztcbmltcG9ydCB7IHBhcnNlUnVudGltZVN0YWdlSWQgfSBmcm9tICcuLi9pZHMvcnVudGltZVN0YWdlSWQuanMnO1xuaW1wb3J0IHR5cGUgeyBDb21taXRCdW5kbGUgfSBmcm9tICcuLi9tZW1vcnkvdHlwZXMuanMnO1xuaW1wb3J0IHsgZGVlcEVxdWFsLCBERUxJTSB9IGZyb20gJy4uL21lbW9yeS91dGlscy5qcyc7XG5pbXBvcnQgeyB0eXBlIFJlYWRTb3VyY2UsIGZvbGRMZWdzIH0gZnJvbSAnLi9zdGF0ZUF0LmpzJztcbmltcG9ydCB0eXBlIHsgVGltZVRyYXZlbFNvdXJjZSB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vKiogT25lIGxlZyBvZiBhIGNoYWluOiBhIHNvdXJjZSwgaXRzIHJlYWQgbG9nLCBhbmQgd2hlcmUgaXQgc2l0cyBpbiB0aGUgcnVuLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDaGFpbkxlZyB7XG4gIHJlYWRvbmx5IHNvdXJjZTogVGltZVRyYXZlbFNvdXJjZTtcbiAgcmVhZG9ubHkgbG9nOiByZWFkb25seSBDb21taXRCdW5kbGVbXTtcbiAgLyoqIExvd2VzdCBleGVjdXRpb24gaW5kZXggc3RhbXBlZCBpbiB0aGlzIGxlZzsgYHVuZGVmaW5lZGAgZm9yIGFuIGlkLWxlc3MgbG9nLiAqL1xuICByZWFkb25seSBmaXJzdEV4ZWN1dGlvbkluZGV4OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIC8qKiBIaWdoZXN0IGV4ZWN1dGlvbiBpbmRleCBzdGFtcGVkIGluIHRoaXMgbGVnLiAqL1xuICByZWFkb25seSBsYXN0RXhlY3V0aW9uSW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZDtcbn1cblxuLyoqIFRoZSBleGVjdXRpb24taW5kZXggc3BhbiBvZiBvbmUgbGVnLCByZWFkIG9mZiBpdHMgYHJ1bnRpbWVTdGFnZUlkYHMuICovXG5leHBvcnQgZnVuY3Rpb24gc3Bhbk9mKGxvZzogcmVhZG9ubHkgQ29tbWl0QnVuZGxlW10pOiB7XG4gIGZpcnN0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIGxhc3Q6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgaWRzOiBTZXQ8c3RyaW5nPjtcbn0ge1xuICBsZXQgZmlyc3Q6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgbGV0IGxhc3Q6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgY29uc3QgaWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgYnVuZGxlIG9mIGxvZykge1xuICAgIGNvbnN0IGlkID0gYnVuZGxlLnJ1bnRpbWVTdGFnZUlkO1xuICAgIGlmICghaWQpIGNvbnRpbnVlO1xuICAgIGlkcy5hZGQoaWQpO1xuICAgIGNvbnN0IHsgZXhlY3V0aW9uSW5kZXggfSA9IHBhcnNlUnVudGltZVN0YWdlSWQoaWQpO1xuICAgIGlmIChOdW1iZXIuaXNOYU4oZXhlY3V0aW9uSW5kZXgpKSBjb250aW51ZTtcbiAgICBpZiAoZmlyc3QgPT09IHVuZGVmaW5lZCB8fCBleGVjdXRpb25JbmRleCA8IGZpcnN0KSBmaXJzdCA9IGV4ZWN1dGlvbkluZGV4O1xuICAgIGlmIChsYXN0ID09PSB1bmRlZmluZWQgfHwgZXhlY3V0aW9uSW5kZXggPiBsYXN0KSBsYXN0ID0gZXhlY3V0aW9uSW5kZXg7XG4gIH1cbiAgcmV0dXJuIHsgZmlyc3QsIGxhc3QsIGlkcyB9O1xufVxuXG4vKipcbiAqIFN0cnVjdHVyYWwgZXF1YWxpdHkgb2YgdHdvIGZvbGRlZCBzdGF0ZXMsIGlnbm9yaW5nIHRoZSBwYXRocyB0aGUgbG9nIHdhc1xuICogcmVkYWN0ZWQgYXQuXG4gKlxuICogVGhlIGZvbGQgcmVwcm9kdWNlcyBgJ1JFREFDVEVEJ2Agd2hlcmV2ZXIgdGhlIGVuZ2luZSBzY3J1YmJlZCBhIHdyaXRlLCB3aGlsZVxuICogdGhlIGNoZWNrcG9pbnQgdGhhdCBzZWVkZWQgdGhlIHJlc3VtZWQgbGVnIGhvbGRzIHRoZSByZWFsIHZhbHVlIOKAlCBzbyB0aG9zZVxuICogcGF0aHMgQ0FOTk9UIGFncmVlLCBhbmQgYXJlIG5vdCBhc2tlZCB0by4gRXZlcnl0aGluZyBlbHNlIGlzIGRlY2lkZWQgYnkgdGhlXG4gKiBPTkUgZXF1YWxpdHkgbGF3IChgbWVtb3J5L2VxdWFsaXR5LnRzIMK3IGRlZXBFcXVhbGAsIGV2ZXJ5IHZhbHVlIGtpbmQgY29tcGFyZWRcbiAqIGFzIHRoZSByZWNvcmQgaG9sZHMgaXQ7IDkuNDQuMiDigJQgdGhpcyB3YWxrIGhhZCBhIGxhdyBvZiBpdHMgb3duLCB3aGljaCBoZWxkXG4gKiBhbnkgdHdvIFJlZ0V4cHMsIEVycm9ycyBvciBidWZmZXJzIGVxdWFsKS4gQm90aCBzaWRlcyBhcmUgY29waWVzIG9mIG9uZVxuICogcmVjb3JkLCBzbyBhbiBvcGFxdWUgdmFsdWUgY29tcGFyZXMgYXMgYCdjb3BpZXMnYC4gT25seSB0aGUgY29udGFpbmVycyBhYm92ZVxuICogYSByZWRhY3RlZCBwYXRoIGFyZSB3YWxrZWQgaGVyZS5cbiAqL1xuZnVuY3Rpb24gc2FtZVN0YXRlKGE6IHVua25vd24sIGI6IHVua25vd24sIHJlZGFjdGVkOiBSZWFkb25seVNldDxzdHJpbmc+LCBwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKCFyZWRhY3RlZEJlbG93KHBhdGgsIHJlZGFjdGVkKSkgcmV0dXJuIGRlZXBFcXVhbChhLCBiLCAnY29waWVzJyk7XG4gIGlmIChBcnJheS5pc0FycmF5KGEpICYmIEFycmF5LmlzQXJyYXkoYikpIHtcbiAgICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIGEuZXZlcnkoKGl0ZW0sIGkpID0+IHNhbWVTdGF0ZShpdGVtLCBiW2ldLCByZWRhY3RlZCwgcGF0aCA9PT0gJycgPyBTdHJpbmcoaSkgOiBgJHtwYXRofSR7REVMSU19JHtpfWApKTtcbiAgfVxuICBjb25zdCBwbGFpbiA9ICh2OiB1bmtub3duKTogdiBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PlxuICAgIHYgIT09IG51bGwgJiYgdHlwZW9mIHYgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHYpICYmIGtpbmRPZih2KSA9PT0gJ3BsYWluJztcbiAgaWYgKCFwbGFpbihhKSB8fCAhcGxhaW4oYikpIHJldHVybiBkZWVwRXF1YWwoYSwgYiwgJ2NvcGllcycpO1xuICBjb25zdCBwcmVzZW50ID0gKG86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiBPYmplY3Qua2V5cyhvKS5maWx0ZXIoKGspID0+IG9ba10gIT09IHVuZGVmaW5lZCk7XG4gIGNvbnN0IGxlZnRLZXlzID0gcHJlc2VudChhKTtcbiAgY29uc3QgcmlnaHRLZXlzID0gbmV3IFNldChwcmVzZW50KGIpKTtcbiAgaWYgKGxlZnRLZXlzLmxlbmd0aCAhPT0gcmlnaHRLZXlzLnNpemUgfHwgIWxlZnRLZXlzLmV2ZXJ5KChrKSA9PiByaWdodEtleXMuaGFzKGspKSkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gbGVmdEtleXMuZXZlcnkoKGspID0+IHtcbiAgICBjb25zdCBjaGlsZFBhdGggPSBwYXRoID09PSAnJyA/IGsgOiBgJHtwYXRofSR7REVMSU19JHtrfWA7XG4gICAgcmV0dXJuIHJlZGFjdGVkLmhhcyhjaGlsZFBhdGgpIHx8IHNhbWVTdGF0ZShhW2tdLCBiW2tdLCByZWRhY3RlZCwgY2hpbGRQYXRoKTtcbiAgfSk7XG59XG5cbi8qKiBJcyBgcGF0aGAsIG9yIGEgcGF0aCBiZWxvdyBpdCwgb25lIHRoZSBsb2cgd2FzIHJlZGFjdGVkIGF0PyAqL1xuZnVuY3Rpb24gcmVkYWN0ZWRCZWxvdyhwYXRoOiBzdHJpbmcsIHJlZGFjdGVkOiBSZWFkb25seVNldDxzdHJpbmc+KTogYm9vbGVhbiB7XG4gIGlmIChyZWRhY3RlZC5zaXplID09PSAwKSByZXR1cm4gZmFsc2U7XG4gIGlmIChwYXRoID09PSAnJykgcmV0dXJuIHRydWU7XG4gIGZvciAoY29uc3QgciBvZiByZWRhY3RlZCkgaWYgKHIgPT09IHBhdGggfHwgci5zdGFydHNXaXRoKGAke3BhdGh9JHtERUxJTX1gKSkgcmV0dXJuIHRydWU7XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBDaGVjayB0aGF0IGBsZWdzYCByZWFsbHkgYXJlIG9uZSBydW4gcmVhZCBpbiBvcmRlciwgYW5kIHNheSB3aHkgbm90LlxuICpcbiAqIFJldHVybnMgdGhlIHJlZnVzYWwgbWVzc2FnZSwgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGUgY2hhaW4gaXMgc291bmQuIFRocmVlXG4gKiBkaXN0aW5jdCBmYWlsdXJlcywgYmVjYXVzZSB0aGV5IGFyZSB0aHJlZSBkaWZmZXJlbnQgbWlzdGFrZXMsIGNoZWNrZWQgaW5cbiAqIHRoaXMgb3JkZXI6XG4gKlxuICogLSBSRVBFQVRFRCBTVEFHRSDigJQgb25lIGBydW50aW1lU3RhZ2VJZGAgYXBwZWFycyBpbiB0d28gbGVncy4gSWRzIGFyZSB1bmlxdWVcbiAqICAgd2l0aGluIGEgcnVuLCBzbyBhIHJlcGVhdCBtZWFucyB0aGUgc2FtZSBleGVjdXRpb24gd2FzIHJlY29yZGVkIHR3aWNlOiBhXG4gKiAgIHNhbWUtZXhlY3V0b3IgcmVzdW1lLCB3aG9zZSBzbmFwc2hvdCBBTFJFQURZIGhvbGRzIHRoZSB3aG9sZSBsb2cgYW5kIG5lZWRzXG4gKiAgIG5vIGNoYWluaW5nLCBpcyB0aGUgdXN1YWwgY2F1c2UuXG4gKiAtIE9VVCBPRiBPUkRFUiDigJQgYSBsYXRlciBsZWcncyBmaXJzdCBleGVjdXRpb24gaW5kZXggaXMgbm90IHBhc3QgdGhlIGVhcmxpZXJcbiAqICAgbGVnJ3MgbGFzdC4gRWl0aGVyIHRoZSBzb3VyY2VzIHdlcmUgaGFuZGVkIG92ZXIgYmFja3dhcmRzLCBvciB0aGUgc2Vjb25kXG4gKiAgIGlzIG5vdCBhIGNvbnRpbnVhdGlvbiBhdCBhbGwgKGEgZnJlc2ggcnVuIHJlc3RhcnRzIHRoZSBjb3VudGVyIGF0IDAsIHNvIGFuXG4gKiAgIHVucmVsYXRlZCBzbmFwc2hvdCBmYWlscyBoZXJlIHJhdGhlciB0aGFuIHNpbGVudGx5IGludGVybGVhdmluZykuXG4gKiAtIFdST05HIExJTkVBR0Ug4oCUIGxlZyBrJ3MgYGluaXRpYWxTdGF0ZWAgaXMgbm90IHRoZSBzdGF0ZSBsZWdzIDAuLmstMSBmb2xkXG4gKiAgIHRvLiBPbiBhIHJlc3VtZSB0aGUgbGF0ZXIgbGVnIGlzIHNlZWRlZCBmcm9tIHRoZSBjaGVja3BvaW50LCBzbyBpdHMgYmFzZVxuICogICBJUyB0aGUgc3RhdGUgYXQgdGhlIHBhdXNlOyBhIGxlZyB0aGF0IGJlZ2lucyBhbnl3aGVyZSBlbHNlIGlzIGZyb20gc29tZVxuICogICBvdGhlciBydW4sIGhvd2V2ZXIgaXRzIGluZGljZXMgaGFwcGVuIHRvIGxpbmUgdXAuXG4gKlxuICogVEhFIExJTkVBR0UgQ0hFQ0sgUlVOUyBPTkxZIFdIRVJFIFRIRSBSRUNPUkQgQUxMT1dTIElULCBhbmQgaXMgc2tpcHBlZCDigJRcbiAqIG5ldmVyIGZha2VkIOKAlCBvdGhlcndpc2U6IGxlZyBrIG11c3QgY2FycnkgYW4gYGluaXRpYWxTdGF0ZWAgKGEgcmVjb3JkaW5nXG4gKiBtYWRlIGJlZm9yZSA5LjE3IGhhcyBub25lKSwgYW5kIHRoZSBmb2xkIG9mIHRoZSBsZWdzIGJlZm9yZSBpdCBtdXN0IHN0YW5kIG9uXG4gKiBhIHJlYWwgYmFzZSAoYGJhc2lzOiAnaW5pdGlhbCtsb2cnYCkgd2l0aCBubyB1bnJlYWRhYmxlIHJvd3MgKGBza2lwcGVkYFxuICogYWJzZW50KSDigJQgYSBsb2ctb25seSBvciBnYXBwZWQgZm9sZCBpcyBub3QgYSBzdGF0ZSBhIHJlYWwgYmFzZSBtYXkgYmUgaGVsZFxuICogYWdhaW5zdC4gT24gc3VjaCBhIGNoYWluIHRoZSB0d28gaW5kZXggY2hlY2tzIGFyZSB0aGUgd2hvbGUgZGVmZW5jZSwgYW5kXG4gKiBgZm9sZExlZ3NgJyBsZWcgcnVsZSB0aGVuIENPTlRJTlVFUyB0aGUgZm9sZCBhY3Jvc3MgdGhlIHNlYW0sIHdoaWNoIGlzIHRoZVxuICogcmlnaHQgc3RhdGUgZm9yIGEgcmVhbCByZXN1bWUgYW5kIGlzIHdoYXQgYGJhc2lzYCByZXBvcnRzLiBQYXRocyB0aGUgbG9nXG4gKiB3YXMgcmVkYWN0ZWQgYXQgYXJlIGV4Y2x1ZGVkIGZyb20gdGhlIGNvbXBhcmlzb246IHRoZSBmb2xkIGhvbGRzXG4gKiBgJ1JFREFDVEVEJ2AgdGhlcmUgYW5kIHRoZSBjaGVja3BvaW50IGhvbGRzIHRoZSB2YWx1ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZnVzZUNoYWluKGxlZ3M6IHJlYWRvbmx5IFJlYWRTb3VyY2VbXSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChsZWdzLmxlbmd0aCA9PT0gMCkgcmV0dXJuICd0aW1lVHJhdmVsOiBhIGNoYWluIG5lZWRzIGF0IGxlYXN0IG9uZSBzb3VyY2UsIGdvdCBhbiBlbXB0eSBhcnJheS4nO1xuXG4gIGNvbnN0IHNwYW5zID0gbGVncy5tYXAoKGxlZykgPT4gc3Bhbk9mKGxlZy5sb2cpKTtcbiAgY29uc3Qgc2VlbiA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gIGZvciAoY29uc3QgW2ksIHNwYW5dIG9mIHNwYW5zLmVudHJpZXMoKSkge1xuICAgIGZvciAoY29uc3QgaWQgb2Ygc3Bhbi5pZHMpIHtcbiAgICAgIGNvbnN0IGVhcmxpZXIgPSBzZWVuLmdldChpZCk7XG4gICAgICBpZiAoZWFybGllciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgYHRpbWVUcmF2ZWw6IHNvdXJjZXMgJHtlYXJsaWVyfSBhbmQgJHtpfSBib3RoIHJlY29yZCAnJHtpZH0nLiBBIHJ1bnRpbWVTdGFnZUlkIGlzIHVuaXF1ZSBgICtcbiAgICAgICAgICAnd2l0aGluIGEgcnVuLCBzbyB0aGVzZSBhcmUgbm90IHR3byBsZWdzIG9mIG9uZSBydW4g4oCUIGEgc2FtZS1leGVjdXRvciByZXN1bWUgYWxyZWFkeSAnICtcbiAgICAgICAgICAnY2FycmllcyB0aGUgd2hvbGUgbG9nIGluIE9ORSBzbmFwc2hvdCBhbmQgbXVzdCBub3QgYmUgY2hhaW5lZCB3aXRoIHRoZSBwYXVzZWQgb25lLidcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHNlZW4uc2V0KGlkLCBpKTtcbiAgICB9XG4gIH1cblxuICBsZXQgcHJldmlvdXM6IHsgaWR4OiBudW1iZXI7IGxhc3Q6IG51bWJlciB9IHwgdW5kZWZpbmVkO1xuICBmb3IgKGNvbnN0IFtpLCBzcGFuXSBvZiBzcGFucy5lbnRyaWVzKCkpIHtcbiAgICBpZiAoc3Bhbi5maXJzdCA9PT0gdW5kZWZpbmVkIHx8IHNwYW4ubGFzdCA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICBpZiAocHJldmlvdXMgJiYgc3Bhbi5maXJzdCA8PSBwcmV2aW91cy5sYXN0KSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBgdGltZVRyYXZlbDogc291cmNlICR7aX0gc3RhcnRzIGF0IGV4ZWN1dGlvbiBpbmRleCAke3NwYW4uZmlyc3R9LCB3aGljaCBpcyBub3QgcGFzdCBgICtcbiAgICAgICAgYHNvdXJjZSAke3ByZXZpb3VzLmlkeH0ncyBsYXN0ICgke3ByZXZpb3VzLmxhc3R9KS4gQ2hhaW4gdGhlIHNvdXJjZXMgaW4gcnVuIG9yZGVyLCBhbmQgYCArXG4gICAgICAgICdvbmx5IHNvdXJjZXMgZnJvbSBPTkUgbGluZWFnZSDigJQgdGhlIGVuZ2luZSBuZXZlciByZXNldHMgdGhlIGV4ZWN1dGlvbiBjb3VudGVyIGFjcm9zcyBhICcgK1xuICAgICAgICAncmVzdW1lLCBzbyBhIGZyZXNoIHJ1biByZXN0YXJ0aW5nIGF0IDAgaXMgYSBkaWZmZXJlbnQgcnVuLCBub3QgYSBjb250aW51YXRpb24uJ1xuICAgICAgKTtcbiAgICB9XG4gICAgcHJldmlvdXMgPSB7IGlkeDogaSwgbGFzdDogc3Bhbi5sYXN0IH07XG4gIH1cblxuICBmb3IgKGxldCBrID0gMTsgayA8IGxlZ3MubGVuZ3RoOyBrKyspIHtcbiAgICBjb25zdCBiYXNlID0gbGVnc1trXS5iYXNlO1xuICAgIGlmICghYmFzZSB8fCB0eXBlb2YgYmFzZSAhPT0gJ29iamVjdCcpIGNvbnRpbnVlOyAvLyBubyBzaWduYWwgb24gdGhlIHJlY29yZCDigJQgZG9jdW1lbnRlZCBkZWdyYWRhdGlvblxuICAgIGNvbnN0IGJlZm9yZSA9IGZvbGRMZWdzKGxlZ3MsIGsgLSAxLCBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpO1xuICAgIGlmIChiZWZvcmUuYmFzaXMgIT09ICdpbml0aWFsK2xvZycgfHwgYmVmb3JlLnNraXBwZWQpIGNvbnRpbnVlOyAvLyBub3QgYSBzdGF0ZSBhIHJlYWwgYmFzZSBjYW4gYmUgaGVsZCB0b1xuICAgIGlmICghc2FtZVN0YXRlKGJlZm9yZS5zdGF0ZSwgYmFzZSwgbmV3IFNldChiZWZvcmUucmVkYWN0ZWRQYXRocyksICcnKSkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgYHRpbWVUcmF2ZWw6IHNvdXJjZSAke2t9J3MgaW5pdGlhbFN0YXRlIGlzIG5vdCB0aGUgc3RhdGUgc291cmNlICR7ayAtIDF9IGZvbGRzIHRvLiBPbiBhIHJlc3VtZSBgICtcbiAgICAgICAgXCJ0aGUgbGF0ZXIgbGVnJ3MgaW5pdGlhbFN0YXRlIElTIHRoZSBzdGF0ZSBhdCB0aGUgcGF1c2UsIHNvIGEgbGVnIHRoYXQgYmVnaW5zIGFueXdoZXJlIGVsc2UgaXMgXCIgK1xuICAgICAgICAnbm90IGZyb20gb25lIGxpbmVhZ2Ug4oCUIGEgZGlmZmVyZW50IGNoYXJ0LCBvciBhbm90aGVyIHJ1biBvZiB0aGlzIG9uZSDigJQgZXZlbiB3aGVuIGl0cyBleGVjdXRpb24gJyArXG4gICAgICAgICdpbmRpY2VzIGhhcHBlbiB0byBiZSBoaWdoZXIuJ1xuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbiJdfQ==
|
|
@@ -1,21 +1,42 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* freeze.ts — the ONE deep-freeze walk (moved here from `scope/protection/readonlyInput.ts` in F3)
|
|
2
|
+
* freeze.ts — the ONE deep-freeze walk (moved here from `scope/protection/readonlyInput.ts` in F3),
|
|
3
|
+
* and the serve-time law for the commit log (9.44.2).
|
|
3
4
|
*
|
|
4
5
|
* WHY HERE. Saved trees freeze through this walk: the fold base served as
|
|
5
6
|
* `initialState` (`ExecutionRuntime · getFoldBase`), the
|
|
6
7
|
* dev-mode snapshot (`runner/snapshot.ts · servedSnapshot`), every state `stateAt` hands out
|
|
7
8
|
* (`time-travel/stateAt.ts`) and, since F3, every commit bundle (`EventLog · record`). `memory/` must
|
|
8
9
|
* not import `scope/` (that edge closed the memory ⇄ scope ⇄ recorder module cycle F0 removed), so the
|
|
9
|
-
* walk lives in this leaf, which imports nothing. Args use an ownership snapshot
|
|
10
|
-
* (`scope/protection/readonlyInput.ts · createFrozenArgs`): never freeze borrowed caller values.
|
|
10
|
+
* walk lives in this leaf folder, which imports nothing outside itself. Args use an ownership snapshot
|
|
11
|
+
* instead (`scope/protection/readonlyInput.ts · createFrozenArgs`): never freeze borrowed caller values.
|
|
12
|
+
*
|
|
13
|
+
* FREEZE WHAT CAN BE FROZEN, COPY WHAT CAN'T (9.44.2). `Object.freeze` cannot seal a Date's time, a
|
|
14
|
+
* Map's or Set's entries, a buffer's bytes, a RegExp (`compile()` rewrites a frozen one) or an Error
|
|
15
|
+
* (V8's own `stack` accessor writes through a frozen one). A fresh tree handed to one caller (a `stateAt`
|
|
16
|
+
* state, the dev-mode snapshot) is that caller's own, so freezing it is a guard and nothing more. The
|
|
17
|
+
* COMMIT LOG — each bundle, and the fold base — is served to every reader, so {@link freezeRecord}
|
|
18
|
+
* remembers that a record holds such a value, its first serve maps the containers on the way to each
|
|
19
|
+
* one (its open PATHS), and {@link serveRecord} hands a reader a copy of those paths only: a fresh copy
|
|
20
|
+
* of each such value, fresh frozen containers on the way to it, and every other part shared, frozen, as
|
|
21
|
+
* it is. Until 9.44.2 `snapshot.commitLog[i].overwrite.when.setTime(0)` rewrote every later snapshot,
|
|
22
|
+
* `stateAt`, `commitValueAt`, slice and cursor answer.
|
|
23
|
+
*
|
|
24
|
+
* Every walk here is ITERATIVE (an explicit stack): a record's depth is not bounded by the call stack.
|
|
11
25
|
*
|
|
12
26
|
* @example
|
|
13
27
|
* ```typescript
|
|
14
|
-
* import { deepFreeze } from './freeze.js';
|
|
28
|
+
* import { deepFreeze, freezeRecord, serveRecord } from './freeze.js';
|
|
15
29
|
*
|
|
16
30
|
* const args = deepFreeze({ order: { lines: [{ sku: 'A' }] }, bytes: new Uint8Array([1]) });
|
|
17
31
|
* Object.isFrozen(args.order.lines[0]); // true
|
|
18
32
|
* Object.isFrozen(args.bytes); // false — a typed array cannot be frozen; it is skipped
|
|
33
|
+
*
|
|
34
|
+
* const record = freezeRecord({ when: new Date(0), tags: ['a'] });
|
|
35
|
+
* const served = serveRecord(record);
|
|
36
|
+
* served.when.setTime(5); // changes the reader's copy
|
|
37
|
+
* serveRecord(record).when.getTime(); // 0 — every serve is the record as recorded
|
|
38
|
+
* served.tags === record.tags; // true — the sealed part is shared, not copied
|
|
39
|
+
* serveRecord(freezeRecord({ n: 1 })); // a record freezing sealed whole: served as itself
|
|
19
40
|
* ```
|
|
20
41
|
*/
|
|
21
42
|
/**
|
|
@@ -25,8 +46,8 @@
|
|
|
25
46
|
* AND any expando (`arr.note = { … }`). The dev-mode snapshot relies on this contract.
|
|
26
47
|
* - `'indices'` — the index elements only, so no key string is allocated per element; this is what
|
|
27
48
|
* keeps freezing a 10,000-element commit inside its budget (`bench/element-writes.ts`). An object
|
|
28
|
-
* hung on an array EXPANDO is then left unfrozen — the commit
|
|
29
|
-
* (`EventLog · record
|
|
49
|
+
* hung on an array EXPANDO is then left unfrozen, and unseen by {@link serveRecord} — the commit
|
|
50
|
+
* log's named hole (`EventLog · record`; an array expando is out of contract for state).
|
|
30
51
|
*/
|
|
31
52
|
export type ArrayWalk = 'every-key' | 'indices';
|
|
32
53
|
/**
|
|
@@ -41,7 +62,30 @@ export type ArrayWalk = 'every-key' | 'indices';
|
|
|
41
62
|
* snapshot here.
|
|
42
63
|
* - What `Object.freeze` cannot reach stays mutable — Map and Set contents, a Date's time, the
|
|
43
64
|
* bytes behind a buffer. A frozen RegExp's `lastIndex` is read-only, so a `/g` or `/y` regex
|
|
44
|
-
* taken from a frozen tree throws when `exec` or `replace` advance it.
|
|
65
|
+
* taken from a frozen tree throws when `exec` or `replace` advance it. The commit log goes through
|
|
66
|
+
* {@link freezeRecord} and {@link serveRecord} instead.
|
|
45
67
|
* - Functions are not descended (they are not values the engine stores).
|
|
46
68
|
*/
|
|
47
69
|
export declare function deepFreeze<T>(obj: T, arrays?: ArrayWalk): T;
|
|
70
|
+
/**
|
|
71
|
+
* {@link deepFreeze} for a record many readers are SERVED (a commit bundle, the fold base), and two more
|
|
72
|
+
* things on the same walk:
|
|
73
|
+
*
|
|
74
|
+
* - it remembers THAT the record holds a value freezing cannot seal — one flag; the record's first
|
|
75
|
+
* serve maps WHERE (the containers on the way to each such value, its open paths), so the run pays
|
|
76
|
+
* nothing more and {@link serveRecord} copies those paths and nothing else;
|
|
77
|
+
* - a typed array or `DataView` that views a SLICE of a bigger buffer (a Node `Buffer` views its
|
|
78
|
+
* shared pool) is replaced, in the record, by a copy of the bytes it views — the record keeps the
|
|
79
|
+
* view's bytes, never the rest of the buffer (a resizable or shared buffer is kept as it is).
|
|
80
|
+
*
|
|
81
|
+
* A part frozen before is not frozen past (deepFreeze's contract) but is looked through, so a value
|
|
82
|
+
* freezing cannot seal inside it still opens the record. Returns `record`.
|
|
83
|
+
*/
|
|
84
|
+
export declare function freezeRecord<T extends object>(record: T, arrays?: ArrayWalk): T;
|
|
85
|
+
/**
|
|
86
|
+
* The record as a reader may hold it — THE serve-time law: a record freezing sealed whole is served as
|
|
87
|
+
* itself (shared, no cost); any other as a copy of its open paths ({@link freezeRecord}): fresh frozen
|
|
88
|
+
* containers down to each value freezing cannot seal, a fresh copy of that value, and every other part
|
|
89
|
+
* shared, frozen, as it is. A copy is served the same way again.
|
|
90
|
+
*/
|
|
91
|
+
export declare function serveRecord<T>(record: T): T;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* valueKinds.ts — what KIND of value a record holds: the one classifier.
|
|
3
|
+
*
|
|
4
|
+
* WHY. Committed state is what survives `structuredClone` (an engine invariant), so the values a
|
|
5
|
+
* record holds are the kinds the clone keeps. Two laws need the kind, and both ask here:
|
|
6
|
+
*
|
|
7
|
+
* - what counts as a CHANGE (`memory/equality.ts · deepEqual`): two values are equal when a record
|
|
8
|
+
* holds the same thing for both, compared kind by kind. Until 9.44.2 only Date, Map and Set had a
|
|
9
|
+
* kind; a RegExp, an Error, a boxed number, a buffer, a DataView or a Blob was compared as an
|
|
10
|
+
* object with no own keys — equal to any other of its kind — so replacing one committed no row
|
|
11
|
+
* and live state kept the old value;
|
|
12
|
+
* - what a served record must COPY (`capture/freeze.ts · freezeRecord` / `serveRecord`):
|
|
13
|
+
* `Object.freeze` seals only the kinds whose content is their own properties ({@link SEALABLE}).
|
|
14
|
+
*
|
|
15
|
+
* A leaf: imports nothing (`capture/` is L0, below `memory/`).
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```typescript
|
|
19
|
+
* kindOf(new Date(0)); // 'date'
|
|
20
|
+
* kindOf(new (class Point { x = 1 })()); // 'plain' — its clone is a plain object
|
|
21
|
+
* kindOf(new Blob(['a'])); // 'opaque' — its clone keeps content this library cannot read
|
|
22
|
+
* SEALABLE.date; // false — setTime writes a slot Object.freeze cannot reach
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
/** Every kind a record can hold. */
|
|
26
|
+
export type ValueKind =
|
|
27
|
+
/** An object the clone keeps as its own enumerable keys — a class instance included. */
|
|
28
|
+
'plain' | 'array' | 'date' | 'regexp' | 'map' | 'set' | 'error'
|
|
29
|
+
/** A boxed primitive: `new Number(1)`, `new String('a')`, `new Boolean(true)`, `Object(1n)`. */
|
|
30
|
+
| 'boxed'
|
|
31
|
+
/** An `ArrayBuffer` (a `SharedArrayBuffer` too: shared memory is out of contract for state). */
|
|
32
|
+
| 'buffer'
|
|
33
|
+
/** A typed array or a `DataView`. */
|
|
34
|
+
| 'view'
|
|
35
|
+
/** Any other object the clone keeps as itself (a Blob, a File, a `DOMException`): content unread here. */
|
|
36
|
+
| 'opaque';
|
|
37
|
+
/**
|
|
38
|
+
* Does `Object.freeze` seal every part of a value of this kind? True only where the content is the
|
|
39
|
+
* value's own properties (or a slot nothing can write). A `Record`, so a new kind does not compile
|
|
40
|
+
* until it is decided here.
|
|
41
|
+
*/
|
|
42
|
+
export declare const SEALABLE: {
|
|
43
|
+
readonly [K in ValueKind]: boolean;
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* The kind of an object, as a record holds it. A plain object or an array — the bulk of state —
|
|
47
|
+
* costs one `Array.isArray` and one `getPrototypeOf`; a built-in a tag and one brand-checked read.
|
|
48
|
+
* The brand is the value's own slot, so a subclass (a `Map` subclass is a `'map'`, Node's `Buffer` a
|
|
49
|
+
* `'view'`) and a value from another realm land on their kind.
|
|
50
|
+
*
|
|
51
|
+
* Any other object is classified by WHAT ITS CLONE IS, once per prototype: a class instance comes
|
|
52
|
+
* back a plain object (`'plain'`), a fake built-in (`Object.create(Date.prototype)`, or a class whose
|
|
53
|
+
* `Symbol.toStringTag` says `'Date'`) comes back `{}` (`'plain'`), and a host object comes back as
|
|
54
|
+
* itself (`'opaque'`). A prototype whose instance the clone refuses is `'opaque'` — remembered too:
|
|
55
|
+
* it cannot be held, and its commit will refuse it.
|
|
56
|
+
*/
|
|
57
|
+
export declare function kindOf(value: object): ValueKind;
|
|
@@ -13,11 +13,17 @@
|
|
|
13
13
|
* (`verbs.ts · foldRows` detaches, `StageContext · retainedForm` clones) — pinned by
|
|
14
14
|
* test/lib/memory/property/record-reachability.property.test.ts.
|
|
15
15
|
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
16
|
+
* What `Object.freeze` cannot seal — a Date's time, a Map's or Set's entries, a buffer's bytes, a
|
|
17
|
+
* RegExp, an Error's stack — is never handed out to a reader (9.44.2): `record` remembers that a
|
|
18
|
+
* bundle holds such a value (`capture/freeze.ts · freezeRecord`), and `list()` — like the public
|
|
19
|
+
* snapshot, `runner/snapshot.ts · servedSnapshot` — serves that bundle as a copy of its open paths
|
|
20
|
+
* (`serveRecord`, mapped at its first serve): fresh frozen containers down to each such value, a
|
|
21
|
+
* fresh copy of it, every other part the log's own. A reader edits only its own copy; every later
|
|
22
|
+
* serve reads the record as recorded. `recorded()` is the engine's own, unserved read. Named holes: an object hung on an array EXPANDO (arrays are walked
|
|
23
|
+
* by index — the `'indices'` walk, which keeps the freeze inside its budget; an expando is out of
|
|
24
|
+
* contract for state) and a `SharedArrayBuffer` (every copy shares its memory). A frozen RegExp's
|
|
25
|
+
* `lastIndex` is read-only, so a `/g` or `/y` regex read from a bundle throws when `exec` or
|
|
26
|
+
* `replace` advance it.
|
|
21
27
|
*/
|
|
22
28
|
import type { EmitSourcePosition, LogAddress } from './eventPosition.js';
|
|
23
29
|
import type { CommitBundle } from './types.js';
|
|
@@ -72,8 +78,20 @@ export declare class EventLog {
|
|
|
72
78
|
* will no longer edit — its own object is the one frozen.
|
|
73
79
|
*/
|
|
74
80
|
record(bundle: CommitBundle): void;
|
|
75
|
-
/**
|
|
81
|
+
/**
|
|
82
|
+
* Every recorded commit bundle, AS SERVED (9.44.2): a new array each call; a bundle freezing sealed
|
|
83
|
+
* whole is the log's own (frozen) object, one holding a Date, Map, buffer … is a copy of its open
|
|
84
|
+
* paths (`capture/freeze.ts · serveRecord`) — the reader's own, so no edit reaches the log.
|
|
85
|
+
*/
|
|
76
86
|
list(): CommitBundle[];
|
|
87
|
+
/**
|
|
88
|
+
* @internal The bundles as the log holds them — each frozen, NOT served — in a new array, so a holder's
|
|
89
|
+
* `splice` reaches only its own. For the engine's own snapshot (`ExecutionRuntime · getSnapshot`, which
|
|
90
|
+
* a subflow mount takes once per mount), so the run serves nothing; a reader is served by `list()` and
|
|
91
|
+
* `getSnapshot().commitLog`. A known open door (CHANGELOG 9.44.2): a holder of these bundles can still
|
|
92
|
+
* edit a Date, Map or buffer inside them.
|
|
93
|
+
*/
|
|
94
|
+
recorded(): CommitBundle[];
|
|
77
95
|
/** Number of recorded commits. */
|
|
78
96
|
get length(): number;
|
|
79
97
|
/** Immutable identity of this log, absent until the engine binds it. */
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* equality.ts — structural equality of committed-state values
|
|
3
|
-
*
|
|
4
|
-
* record's compare
|
|
5
|
-
*
|
|
2
|
+
* equality.ts — structural equality of committed-state values: THE owner of
|
|
3
|
+
* "what counts as a change". What `TransactionBuffer`'s net-change filter, the
|
|
4
|
+
* admitted record's compare, the read model's writer rule and the
|
|
5
|
+
* borrowed-mutation guard all ask. Its one import is the classifier of value
|
|
6
|
+
* kinds (`capture/valueKinds.ts`, a leaf); re-exported from `utils.ts`, so no
|
|
7
|
+
* importer moved.
|
|
6
8
|
*/
|
|
7
9
|
/**
|
|
8
10
|
* Structural deep equality for committed-state values.
|
|
@@ -10,26 +12,42 @@
|
|
|
10
12
|
* Used by {@link TransactionBuffer} to decide whether a stage actually CHANGED
|
|
11
13
|
* a path or merely re-wrote / reverted it to the value it already held (a
|
|
12
14
|
* "no-op write"), and by `borrowedMutation.firstDifferingPath` to find where a
|
|
13
|
-
* borrowed read moved. Committed state must survive `structuredClone`,
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
15
|
+
* borrowed read moved. Committed state must survive `structuredClone`, so the
|
|
16
|
+
* values it can hold are the kinds the clone keeps, and two values are equal
|
|
17
|
+
* when a record holds the same thing for both. Every kind has ONE arm below
|
|
18
|
+
* (`equalPairs`' switch over `ValueKind` — a kind added to the union does not
|
|
19
|
+
* compile until it is compared). Before 9.22.0 a Date, Map or Set was compared
|
|
20
|
+
* as an object with no own keys, and until 9.44.2 so were a RegExp, an Error,
|
|
21
|
+
* a boxed primitive, an ArrayBuffer, a DataView and a Blob: any two of a kind
|
|
22
|
+
* were "equal", so `$setValue('re', /y/g)` over `/x/g` committed no row and
|
|
23
|
+
* live state kept the OLD value.
|
|
21
24
|
*
|
|
22
25
|
* Semantics:
|
|
23
26
|
* - reference / identical-primitive short-circuits first (cheap fast path)
|
|
24
27
|
* - `NaN` equals `NaN` (primitive compare falls back to `Object.is`)
|
|
28
|
+
* - two values of different KINDS are never equal (a `Date` is never `{}`,
|
|
29
|
+
* an array never `{ 0: … }`)
|
|
25
30
|
* - `Date`: same `getTime()` (two invalid dates are equal)
|
|
31
|
+
* - `RegExp`: same `source` and `flags` (the clone resets `lastIndex`)
|
|
32
|
+
* - `Error`: the same restored kind (one of the six built-in error names,
|
|
33
|
+
* else `Error`), own `message`, `stack` and own `cause` (deep) — what the
|
|
34
|
+
* clone keeps; any other own field is dropped by it, so it never counts
|
|
35
|
+
* (the admitted record's law)
|
|
36
|
+
* - a boxed primitive: the same wrapper type and the same primitive inside
|
|
37
|
+
* - an `ArrayBuffer`: length, resizability and bytes; a typed array or a
|
|
38
|
+
* `DataView`: its type and the bytes IT views — never the rest of its
|
|
39
|
+
* buffer (a Node `Buffer` views a slice of a shared pool, and the record
|
|
40
|
+
* keeps the view's bytes only: `capture/freeze.ts · freezeRecord`)
|
|
26
41
|
* - `Map`: same size AND, per key of `a`, `b` holds a deep-equal value —
|
|
27
42
|
* keys by `Map` identity (`SameValueZero`), values deep
|
|
28
43
|
* - `Set`: same size AND every member of `a` is deep-equal to SOME member
|
|
29
44
|
* of `b` (order-insensitive — a Set has no order to compare by)
|
|
30
|
-
* -
|
|
31
|
-
*
|
|
32
|
-
*
|
|
45
|
+
* - an OPAQUE value (a Blob, a `DOMException` — content this library cannot
|
|
46
|
+
* read): by the caller's {@link OpaqueRule} — equal only to itself by
|
|
47
|
+
* default (replacing one is always a change), or, when both sides are
|
|
48
|
+
* copies of one record, equal to any other of its kind
|
|
49
|
+
* - arrays: equal length AND deep-equal element-wise (order-sensitive; an
|
|
50
|
+
* array's expando keys are out of contract and not compared)
|
|
33
51
|
* - objects: identical set of keys that HOLD a value AND deep-equal per key.
|
|
34
52
|
* An own key whose value is `undefined` counts as ABSENT: it is this
|
|
35
53
|
* library's other spelling of a deleted key (`'full'` mode flattens
|
|
@@ -38,11 +56,13 @@
|
|
|
38
56
|
* mirror — reads the two spellings as one state. So must the net-change
|
|
39
57
|
* filter (9.19.1): `{}` and `{ k: undefined }` are not a change. Arrays
|
|
40
58
|
* are untouched — a slot holding `undefined` is still a slot.
|
|
41
|
-
* - mismatched kinds (array vs object, object vs null) → not equal
|
|
42
59
|
*
|
|
43
60
|
* Cost & safety:
|
|
44
|
-
* - Allocates
|
|
45
|
-
*
|
|
61
|
+
* - Allocates only transient `Object.keys` arrays, an error's property
|
|
62
|
+
* descriptors and a byte view per compared buffer — no clones (but one
|
|
63
|
+
* probe clone per class prototype, remembered: `capture/valueKinds.ts ·
|
|
64
|
+
* kindOf`). It is strictly cheaper than the `structuredClone` the commit
|
|
65
|
+
* already performs.
|
|
46
66
|
* - Primitive comparisons (the bulk of state) are O(1) via the `===` /
|
|
47
67
|
* `Object.is` fast paths; only nested objects/arrays incur a walk, bounded
|
|
48
68
|
* by the value's own size.
|
|
@@ -54,4 +74,20 @@
|
|
|
54
74
|
* change. Dev mode still warns about cycles at write time
|
|
55
75
|
* (`ScopeFacade.setValue`) because they surprise narrative and JSON.
|
|
56
76
|
*/
|
|
57
|
-
export declare function deepEqual(a: any, b: any): boolean;
|
|
77
|
+
export declare function deepEqual(a: any, b: any, opaque?: OpaqueRule): boolean;
|
|
78
|
+
/**
|
|
79
|
+
* How {@link deepEqual} compares two OPAQUE values (a Blob, a `DOMException` —
|
|
80
|
+
* content this library cannot read):
|
|
81
|
+
*
|
|
82
|
+
* - `'identity'` (the default) — equal only to itself. The answer when one
|
|
83
|
+
* side is a value a stage handed in: the net-change filter
|
|
84
|
+
* (`TransactionBuffer`), the append check (`deltaEncoding`). A new object
|
|
85
|
+
* is a change, because nothing can say it is not.
|
|
86
|
+
* - `'copies'` — equal to any other of its kind. The answer when BOTH sides
|
|
87
|
+
* are copies of one recorded value — a fold's generations (`logModel`,
|
|
88
|
+
* `elementProvenance`), a retained read against live state
|
|
89
|
+
* (`borrowedMutation`), the record replayed against the read-back
|
|
90
|
+
* (`admission`): copies never share identity, so identity would call every
|
|
91
|
+
* opaque value changed.
|
|
92
|
+
*/
|
|
93
|
+
export type OpaqueRule = 'identity' | 'copies';
|
|
@@ -187,7 +187,10 @@ export declare class ExecutionRuntime {
|
|
|
187
187
|
* The frozen, detached fold base served as {@link RuntimeSnapshot.initialState}.
|
|
188
188
|
* Computed once (the base never changes after construction) and shared —
|
|
189
189
|
* safe because it is deeply frozen, so no holder can mutate it or reach the
|
|
190
|
-
* engine through it
|
|
190
|
+
* engine through it; a base holding a Date, Map, buffer … (what freezing
|
|
191
|
+
* cannot seal) is served by the public snapshot as a copy of its open paths
|
|
192
|
+
* (`runner/snapshot.ts · servedSnapshot`, `capture/freeze.ts · serveRecord`,
|
|
193
|
+
* 9.44.2).
|
|
191
194
|
*/
|
|
192
195
|
private getFoldBase;
|
|
193
196
|
getPipelines(): string[];
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "footprintjs",
|
|
3
|
-
"version": "9.44.
|
|
3
|
+
"version": "9.44.2",
|
|
4
4
|
"description": "Explainable backend flows — automatic causal traces, decision evidence, and MCP tool generation for AI agents",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Sanjay Krishna Anbalagan",
|
|
@@ -53,6 +53,7 @@
|
|
|
53
53
|
"check:layering": "node scripts/check-layering.mjs",
|
|
54
54
|
"check:doc-snippets": "node scripts/check-doc-snippets.mjs",
|
|
55
55
|
"audit:family": "node scripts/audit-family-versions.mjs",
|
|
56
|
+
"audit:consumers": "node scripts/audit-consumers.mjs",
|
|
56
57
|
"lint": "eslint '{src,test}/**/*.ts' --ext .ts",
|
|
57
58
|
"lint:fix": "eslint '{src,test}/**/*.ts' --ext .ts --fix",
|
|
58
59
|
"format:fix": "prettier --config .prettierrc.js --write '{src,test}/**/*.ts'",
|