footprintjs 9.44.1 → 9.44.3
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 +6 -5
- 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 +25 -7
- package/dist/esm/lib/memory/EventLog.js +31 -11
- package/dist/esm/lib/memory/StageContext.d.ts +4 -33
- package/dist/esm/lib/memory/StageContext.js +18 -81
- package/dist/esm/lib/memory/TransactionBuffer.js +2 -2
- 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/memory/recordCommit.d.ts +43 -0
- package/dist/esm/lib/memory/recordCommit.js +59 -0
- package/dist/esm/lib/memory/redaction.d.ts +1 -1
- package/dist/esm/lib/memory/redaction.js +2 -2
- package/dist/esm/lib/runner/ExecutionRuntime.d.ts +6 -3
- package/dist/esm/lib/runner/ExecutionRuntime.js +17 -12
- 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 +30 -10
- package/dist/lib/memory/StageContext.js +17 -80
- package/dist/lib/memory/TransactionBuffer.js +2 -2
- 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/memory/recordCommit.js +63 -0
- package/dist/lib/memory/redaction.js +2 -2
- package/dist/lib/runner/ExecutionRuntime.js +16 -11
- 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 +25 -7
- package/dist/types/lib/memory/StageContext.d.ts +4 -33
- package/dist/types/lib/memory/equality.d.ts +55 -19
- package/dist/types/lib/memory/recordCommit.d.ts +43 -0
- package/dist/types/lib/memory/redaction.d.ts +1 -1
- package/dist/types/lib/runner/ExecutionRuntime.d.ts +6 -3
- package/package.json +2 -1
|
@@ -45,7 +45,7 @@ function joinSegment(prefix, segment, intoArray) {
|
|
|
45
45
|
* `deepEqual`, and stops at the first disagreement.
|
|
46
46
|
*/
|
|
47
47
|
export function firstDifferingPath(before, after, prefix = '', depth = 0) {
|
|
48
|
-
if (deepEqual(before, after))
|
|
48
|
+
if (deepEqual(before, after, 'copies'))
|
|
49
49
|
return undefined;
|
|
50
50
|
if (depth >= 24)
|
|
51
51
|
return prefix; // pathological nesting — name what we have
|
|
@@ -127,4 +127,4 @@ export function borrowedMutationMessage(stageName, key, path) {
|
|
|
127
127
|
'This usually comes from mutating an element reached by `find`/`filter`/`for…of`/`forEach`, ' +
|
|
128
128
|
'which the scope proxy cannot intercept.');
|
|
129
129
|
}
|
|
130
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9ycm93ZWRNdXRhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvbWVtb3J5L2JvcnJvd2VkTXV0YXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQThCRztBQUVILE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFdkMsOEVBQThFO0FBQzlFLFNBQVMsV0FBVyxDQUFDLE1BQWMsRUFBRSxPQUFlLEVBQUUsU0FBa0I7SUFDdEUsSUFBSSxTQUFTO1FBQUUsT0FBTyxHQUFHLE1BQU0sSUFBSSxPQUFPLEdBQUcsQ0FBQztJQUM5QyxPQUFPLE1BQU0sS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLElBQUksT0FBTyxFQUFFLENBQUM7QUFDMUQsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQUMsTUFBZSxFQUFFLEtBQWMsRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFFLEtBQUssR0FBRyxDQUFDO0lBQ3hGLElBQUksU0FBUyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUMvQyxJQUFJLEtBQUssSUFBSSxFQUFFO1FBQUUsT0FBTyxNQUFNLENBQUMsQ0FBQywyQ0FBMkM7SUFDM0UsSUFBSSxNQUFNLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVE7UUFBRSxPQUFPLE1BQU0sQ0FBQztJQUVoSCxNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzVDLElBQUksYUFBYSxLQUFLLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQUUsT0FBTyxNQUFNLENBQUM7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QUFHLENBQUMsQ0FBQztJQUN6RSxPQUFPLENBQ0wsc0JBQXNCLFNBQVMsZUFBZSxLQUFLLHdDQUF3QztRQUMzRixvR0FBb0c7UUFDcEcsbUdBQW1HO1FBQ25HLDREQUE0RDtRQUM1RCwwQ0FBMEM7UUFDMUMsS0FBSztRQUNMLHlEQUF5RDtRQUN6RCx3REFBd0QsR0FBRyxjQUFjO1FBQ3pFLDZGQUE2RjtRQUM3Rix5Q0FBeUMsQ0FDMUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIG1lbW9yeS9ib3Jyb3dlZE11dGF0aW9uIOKAlCB0aGUgaG9uZXN0IGJvdW5kYXJ5J3MgdHdvIHRleHRzOiB0aGUgZGV2LW1vZGVcbiAqIFJFUE9SVCBmb3IgYSB3cml0ZSB0aGUgZW5naW5lIGNhbm5vdCBzZWUgKHtAbGluayBib3Jyb3dlZE11dGF0aW9uTWVzc2FnZX0pXG4gKiBhbmQgdGhlIFJFRlVTQUwgZm9yIGEgd3JpdGUgZnJvbSBhIGhhbmRsZSBoZWxkIHBhc3QgaXRzIHN0YWdlXG4gKiAoe0BsaW5rIGRlYWRGcmFtZU1lc3NhZ2V9LCB0aHJvd24gYnkgYFN0YWdlQ29udGV4dC5zdGFnZVdyaXRlYCkuXG4gKlxuICog4pSA4pSAIFRoZSBob25lc3QgYm91bmRhcnkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gKiBUaGUgdHlwZWQgc2NvcGUgaW50ZXJjZXB0cyBldmVyeSB3cml0ZSBpdCBjYW4gcmVhY2g6IGEgcHJvcGVydHkgYXQgYW55XG4gKiBkZXB0aCwgYW4gaW5kZXhlZCBlbGVtZW50LCBhbiBhcnJheSBtZXRob2QuIFdoYXQgaXQgY2Fubm90IHJlYWNoIGlzIGFuXG4gKiBlbGVtZW50IGhhbmRlZCBvdXQgYnkgYSBSRUFEIE1FVEhPRCDigJQgYGZpbmRgLCBgZmlsdGVyYCwgYGZvcuKApm9mYCwgYGZvckVhY2hgLFxuICogZGVzdHJ1Y3R1cmluZyDigJQgYmVjYXVzZSB3cmFwcGluZyB0aG9zZSB3b3VsZCBtZWFuIHJldHVybmluZyBwcm94aWVzIG91dCBvZlxuICogZXZlcnkgcmVhZCAoYG1hcGAgd291bGQgYnVpbGQgYW4gYXJyYXkgb2YgcHJveGllcywgYGZpbHRlcmAgd291bGQgY29tcGFyZVxuICogcHJveGllcywgYSByZXR1cm5lZCB2YWx1ZSB3b3VsZCBlc2NhcGUgdGhlIHN0YWdlIHN0aWxsIGJvdW5kIHRvIGl0KS4gVGhhdCBpc1xuICogYSBjb3N0IHRoZSBsaWJyYXJ5IHNob3VsZCBub3QgcGF5LCBhbmQgYSBzZW1hbnRpYyBjaGFuZ2UgaXQgc2hvdWxkIG5vdCBtYWtlLlxuICpcbiAqIFNvIHRoZSBhbnN3ZXIgZm9yIHRoYXQgZmFtaWx5IGlzIG5vdCBpbnRlcmNlcHRpb24g4oCUIGl0IGlzIGEgUkVQT1JULiBBIHJlYWRcbiAqIGlzIEJPUlJPV0VEOyBtdXRhdGluZyBpdCBpbiBwbGFjZSBpcyBvdXQgb2YgY29udHJhY3QuIFRoaXMgbW9kdWxlIGRldGVjdHMgdGhlXG4gKiB2aW9sYXRpb24gYWZ0ZXIgdGhlIGZhY3QgYW5kIG5hbWVzIGl0IChhIGRldi1tb2RlIHdhcm5pbmcgYXQgY29tbWl0IOKAlCB0aGVcbiAqIHdyaXRlIGFscmVhZHkgaGFwcGVuZWQsIHNvIGl0IGNhbm5vdCBiZSByZWZ1c2VkKSwgaW5zdGVhZCBvZiBsZXR0aW5nIHRoZSBydW5cbiAqIGVuZCB3aXRoIGEgY29tbWl0IGxvZyB0aGF0IGRpc2FncmVlcyB3aXRoIGZpbmFsIHN0YXRlIGFuZCBub3RoaW5nIHNheWluZyBzby5cbiAqXG4gKiDilIDilIAgSG93IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICogYHJlYWRUcmFja2luZzogJ2Z1bGwnYCAodGhlIGRlZmF1bHQpIGFscmVhZHkgcmV0YWlucyBhIENMT05FIG9mIGV2ZXJ5IHZhbHVlXG4gKiBhIHN0YWdlIHJlYWQuIEF0IGNvbW1pdCwgYSBrZXkgdGhlIHN0YWdlIHJlYWQgYnV0IG5ldmVyIFdST1RFIG11c3Qgc3RpbGxcbiAqIGhvbGQgd2hhdCBpdCBoZWxkIGF0IHJlYWQgdGltZSDigJQgY29tbWl0dGVkIHN0YXRlIGlzIGltbXV0YWJsZS1hZnRlci1zd2FwIGFuZFxuICogdGhlIGJ1ZmZlcidzIHdvcmtpbmcgY29weSBpcyBwcml2YXRlLiBJZiBpdCBkaWZmZXJzLCB0aGUgb25seSB0aGluZyB0aGF0IGNhblxuICogaGF2ZSBjaGFuZ2VkIGl0IGlzIHRoZSBzdGFnZSBpdHNlbGYsIGluIHBsYWNlLlxuICpcbiAqIERldi1tb2RlIG9ubHkgKGBlbmFibGVEZXZNb2RlKClgKSwgc28gdGhlIGRlZmF1bHQgcnVuIHBheXMgbm90aGluZyBhbmQgaXRzXG4gKiBieXRlcyBhcmUgdW5jaGFuZ2VkLlxuICovXG5cbmltcG9ydCB7IGRlZXBFcXVhbCB9IGZyb20gJy4vdXRpbHMuanMnO1xuXG4vKiogUmVuZGVyIG9uZSBwYXRoIHNlZ21lbnQgZm9yIGEgaHVtYW46IGBsaW5lc1swXS5xdHlgLCBub3QgYGxpbmVzLjAucXR5YC4gKi9cbmZ1bmN0aW9uIGpvaW5TZWdtZW50KHByZWZpeDogc3RyaW5nLCBzZWdtZW50OiBzdHJpbmcsIGludG9BcnJheTogYm9vbGVhbik6IHN0cmluZyB7XG4gIGlmIChpbnRvQXJyYXkpIHJldHVybiBgJHtwcmVmaXh9WyR7c2VnbWVudH1dYDtcbiAgcmV0dXJuIHByZWZpeCA9PT0gJycgPyBzZWdtZW50IDogYCR7cHJlZml4fS4ke3NlZ21lbnR9YDtcbn1cblxuLyoqXG4gKiBUaGUgZmlyc3QgcGF0aCBhdCB3aGljaCBgYWZ0ZXJgIHN0b3BzIGFncmVlaW5nIHdpdGggYGJlZm9yZWAsIG9yIGB1bmRlZmluZWRgXG4gKiB3aGVuIHRoZXkgYXJlIHN0cnVjdHVyYWxseSBlcXVhbC4gRGVwdGgtZmlyc3QsIG93biBrZXlzIG9ubHkg4oCUIHRoZSBzYW1lXG4gKiBzaGFwZXMgYGRlZXBFcXVhbGAgaGFuZGxlcywgc2luY2UgY29tbWl0dGVkIHN0YXRlIGlzIEpTT04tc2hhcGVkLlxuICpcbiAqIEN5Y2xlLXNhZmUgYnkgY29uc3RydWN0aW9uOiBpdCBvbmx5IHJlY3Vyc2VzIGludG8gcGFpcnMgdGhhdCBhcmUgbm90IGFscmVhZHlcbiAqIGBkZWVwRXF1YWxgLCBhbmQgc3RvcHMgYXQgdGhlIGZpcnN0IGRpc2FncmVlbWVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpcnN0RGlmZmVyaW5nUGF0aChiZWZvcmU6IHVua25vd24sIGFmdGVyOiB1bmtub3duLCBwcmVmaXggPSAnJywgZGVwdGggPSAwKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGRlZXBFcXVhbChiZWZvcmUsIGFmdGVyKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKGRlcHRoID49IDI0KSByZXR1cm4gcHJlZml4OyAvLyBwYXRob2xvZ2ljYWwgbmVzdGluZyDigJQgbmFtZSB3aGF0IHdlIGhhdmVcbiAgaWYgKGJlZm9yZSA9PT0gbnVsbCB8fCBhZnRlciA9PT0gbnVsbCB8fCB0eXBlb2YgYmVmb3JlICE9PSAnb2JqZWN0JyB8fCB0eXBlb2YgYWZ0ZXIgIT09ICdvYmplY3QnKSByZXR1cm4gcHJlZml4O1xuXG4gIGNvbnN0IGJlZm9yZUlzQXJyYXkgPSBBcnJheS5pc0FycmF5KGJlZm9yZSk7XG4gIGlmIChiZWZvcmVJc0FycmF5ICE9PSBBcnJheS5pc0FycmF5KGFmdGVyKSkgcmV0dXJuIHByZWZpeDtcblxuICBpZiAoYmVmb3JlSXNBcnJheSkge1xuICAgIGNvbnN0IGEgPSBiZWZvcmUgYXMgdW5rbm93bltdO1xuICAgIGNvbnN0IGIgPSBhZnRlciBhcyB1bmtub3duW107XG4gICAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkgcmV0dXJuIHByZWZpeDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGRlZXBlciA9IGZpcnN0RGlmZmVyaW5nUGF0aChhW2ldLCBiW2ldLCBqb2luU2VnbWVudChwcmVmaXgsIFN0cmluZyhpKSwgdHJ1ZSksIGRlcHRoICsgMSk7XG4gICAgICBpZiAoZGVlcGVyICE9PSB1bmRlZmluZWQpIHJldHVybiBkZWVwZXI7XG4gICAgfVxuICAgIHJldHVybiBwcmVmaXg7XG4gIH1cblxuICBjb25zdCBhID0gYmVmb3JlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBjb25zdCBiID0gYWZ0ZXIgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNvbnN0IGtleXMgPSBuZXcgU2V0KFsuLi5PYmplY3Qua2V5cyhhKSwgLi4uT2JqZWN0LmtleXMoYildKTtcbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgIGNvbnN0IGRlZXBlciA9IGZpcnN0RGlmZmVyaW5nUGF0aChhW2tleV0sIGJba2V5XSwgam9pblNlZ21lbnQocHJlZml4LCBrZXksIGZhbHNlKSwgZGVwdGggKyAxKTtcbiAgICBpZiAoZGVlcGVyICE9PSB1bmRlZmluZWQpIHJldHVybiBkZWVwZXI7XG4gIH1cbiAgcmV0dXJuIHByZWZpeDtcbn1cblxuLyoqXG4gKiBUaGUgcmVmdXNhbCB0ZXh0IGZvciBhIHdyaXRlIHRoYXQgcmVhY2hlZCBhIGZyYW1lIEFGVEVSIGl0cyBzdGFnZSBjb21taXR0ZWQuXG4gKiBBIHNjb3BlLCBhbmQgZXZlcnkgcHJveHkgcmVhZCBvdXQgb2YgaXQsIGlzIGJvdW5kIHRvIHRoZSBzdGFnZSBpdCB3YXMgaGFuZGVkXG4gKiB0bzsga2VwdCBwYXN0IHRoYXQgc3RhZ2UncyBjb21taXQgaXQgaGFzIG5vIGZyYW1lIHRvIGxhbmQgaW4sIHNvIHRoZSB3cml0ZVxuICogd291bGQgc2l0IGluIGEgYnVmZmVyIG5vdGhpbmcgZXZlciBjb21taXRzIOKAlCBubyB0cmFjZSByb3csIHN0YXRlIHVuY2hhbmdlZC5cbiAqIFRoZSB0aHJvdyBzdXJmYWNlcyBpbiB0aGUgc3RhZ2UgdGhhdCBtYWRlIHRoZSB3cml0ZSAodGhlIGVuZ2luZSdzIGVycm9yXG4gKiBwYXRoIG5hbWVzIGl0KTsgdGhpcyB0ZXh0IG5hbWVzIHRoZSBzdGFnZSB0aGUgaGFuZGxlIGNhbWUgZnJvbS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlYWRGcmFtZU1lc3NhZ2Uoc3RhZ2VOYW1lOiBzdHJpbmcsIHJ1bnRpbWVTdGFnZUlkOiBzdHJpbmcgfCB1bmRlZmluZWQsIGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgZnJvbSA9IHJ1bnRpbWVTdGFnZUlkID8gYFwiJHtzdGFnZU5hbWV9XCIgKCR7cnVudGltZVN0YWdlSWR9KWAgOiBgXCIke3N0YWdlTmFtZX1cImA7XG4gIHJldHVybiAoXG4gICAgYFtmb290cHJpbnRdIFN0YWdlICR7ZnJvbX0gaGFzIGFscmVhZHkgY29tbWl0dGVkIOKAlCBpdHMgc2NvcGUgaXMgZGVhZCwgYW5kIGEgd3JpdGUgdG8gXFxgJHtrZXl9XFxgIGAgK1xuICAgICdqdXN0IHJlYWNoZWQgaXQgZnJvbSBhIGxhdGVyIHN0YWdlICh0aGlzIGVycm9yIGlzIHJhaXNlZCBpbiB0aGF0IHN0YWdlKS4gQSBzY29wZSwgYW5kIGFueXRoaW5nIHJlYWQgJyArXG4gICAgJ291dCBvZiBpdCAoYHNjb3BlLmtgLCBgc2NvcGUuay5hcnJbMF1gKSwgYmVsb25ncyB0byB0aGUgc3RhZ2UgaXQgd2FzIGhhbmRlZCB0bzsgaGVsZCBwYXN0IHRoYXQgJyArXG4gICAgXCJzdGFnZSdzIGNvbW1pdCBpdCBoYXMgbm8gZnJhbWUgdG8gbGFuZCBpbiwgc28gdGhlIHdyaXRlIHdvdWxkIHZhbmlzaCB3aXRoIG5vIHRyYWNlIHJvdy4gXCIgK1xuICAgIFwiUmVhZCB0aGUga2V5IGFnYWluIHRocm91Z2ggdGhlIENVUlJFTlQgc3RhZ2UncyBzY29wZSBhbmQgd3JpdGUgdGhlcmUuXCJcbiAgKTtcbn1cblxuLyoqXG4gKiBUaGUgd2FybmluZyB0ZXh0IGZvciBhIGtleSB0aGUgc3RhZ2UgV1JPVEUgYWZ0ZXIgY2hhbmdpbmcsIGluIHBsYWNlLCB0aGVcbiAqIGNvbW1pdHRlZCB2YWx1ZSBpdCBoYWQgcmVhZCBiZWZvcmUgaXRzIGZpcnN0IHdyaXRlIChjb3B5LW9uLXdyaXRlLCA5LjI5LjApLlxuICogVGhlIGNvbW1pdCBjb21wYXJlcyB3aGF0IHRoZSBzdGFnZSB3cm90ZSBhZ2FpbnN0IGNvbW1pdHRlZCBzdGF0ZSDigJQgdGhlXG4gKiBvYmplY3QgdGhlIGluLXBsYWNlIGNoYW5nZSBhbHNvIG1vdmVkIOKAlCBzbyBpdCByZWNvcmRzIG5vIGNoYW5nZTogbGl2ZSBzdGF0ZVxuICoga2VlcHMgdGhlIGVkaXQsIHRoZSBsb2cgYW5kIGV2ZXJ5IGZvbGQgZG8gbm90LiAoOS4yOC4wIHJlY29yZGVkIGl0IHdoZW4gdGhlXG4gKiBlZGl0IGNhbWUgYWZ0ZXIgdGhlIGZpcnN0IHdyaXRlLCBieSBhY2NpZGVudCBvZiBhIHdob2xlLXN0YXRlIGNsb25lLilcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbW1pdHRlZE11dGF0aW9uTWVzc2FnZShzdGFnZU5hbWU6IHN0cmluZywga2V5OiBzdHJpbmcsIHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHdoZXJlID0gcGF0aCA9PT0gJycgPyBrZXkgOiBgJHtrZXl9LiR7cGF0aH1gLnJlcGxhY2UoL1xcLlxcWy9nLCAnWycpO1xuICByZXR1cm4gKFxuICAgIGBbZm9vdHByaW50XSBTdGFnZSBcIiR7c3RhZ2VOYW1lfVwiIGNoYW5nZWQgXFxgJHt3aGVyZX1cXGAgSU4gUExBQ0Ugb24gdGhlIGNvbW1pdHRlZCB2YWx1ZSBpdCByZWFkIGJlZm9yZSBgICtcbiAgICAnaXRzIGZpcnN0IHdyaXRlLCB0aGVuIHdyb3RlIHRoZSBrZXkuIFRoZSBjb21taXQgY29tcGFyZXMgdGhlIHdyaXR0ZW4gdmFsdWUgd2l0aCBjb21taXR0ZWQgc3RhdGUg4oCUICcgK1xuICAgICd3aGljaCB0aGUgaW4tcGxhY2UgY2hhbmdlIGFsc28gbW92ZWQg4oCUIHNvIGl0IHJlY29yZHMgTk8gY2hhbmdlOiBsaXZlIHN0YXRlIGtlZXBzIHRoZSBlZGl0LCB0aGUgY29tbWl0ICcgK1xuICAgICdsb2cgYW5kIGV2ZXJ5IHJlYWRlciB0aGF0IGZvbGRzIGl0IGRvIG5vdC4gUmVhZHMgYXJlIEJPUlJPV0VELiBCdWlsZCB0aGUgbmV4dCB2YWx1ZSBpbnN0ZWFkICcgK1xuICAgIGAoXFxgc2NvcGUuJHNldFZhbHVlKCcke2tleX0nLCB7IC4uLnZhbHVlLCDigKYgfSlcXGApLCBvciByZWFkIHRoZSBrZXkgYWdhaW4gYWZ0ZXIgdGhlIHN0YWdlJ3MgZmlyc3QgYCArXG4gICAgXCJ3cml0ZSDigJQgdGhhdCByZWFkIGlzIHRoZSBzdGFnZSdzIG93biBjb3B5LlwiXG4gICk7XG59XG5cbi8qKlxuICogVGhlIHdhcm5pbmcgdGV4dC4gTmFtZXMgdGhlIHN0YWdlLCB0aGUgZXhhY3QgcGF0aCB0aGF0IG1vdmVkLCBhbmQgdGhlIHR3b1xuICogd2F5cyB0byB3cml0ZSBpdCBiYWNrIOKAlCBiZWNhdXNlIFwieW91IG11dGF0ZWQgc29tZXRoaW5nXCIgaXMgbm90IGFjdGlvbmFibGVcbiAqIGFuZCB0aGlzIGlzIHRoZSBvbmUgZmFpbHVyZSBtb2RlIHRoZSB3aG9sZSBkZXNpZ24gZXhpc3RzIHRvIHByZXZlbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBib3Jyb3dlZE11dGF0aW9uTWVzc2FnZShzdGFnZU5hbWU6IHN0cmluZywga2V5OiBzdHJpbmcsIHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHdoZXJlID0gcGF0aCA9PT0gJycgPyBrZXkgOiBgJHtrZXl9LiR7cGF0aH1gLnJlcGxhY2UoL1xcLlxcWy9nLCAnWycpO1xuICByZXR1cm4gKFxuICAgIGBbZm9vdHByaW50XSBTdGFnZSBcIiR7c3RhZ2VOYW1lfVwiIGNoYW5nZWQgXFxgJHt3aGVyZX1cXGAgSU4gUExBQ0UsIG9uIGEgdmFsdWUgaXQgb25seSByZWFkLiBgICtcbiAgICAnZm9vdHByaW50IG5ldmVyIHNhdyB0aGF0IHdyaXRlOiB0aGVyZSBpcyBubyB0cmFjZSByb3cgZm9yIGl0LCBzbyB0aGUgY29tbWl0IGxvZywgdGhlIGNhdXNhbCBjaGFpbiAnICtcbiAgICAnYW5kIGV2ZXJ5IHJlYWRlciB0aGF0IGZvbGRzIHRoZSBsb2cgd2lsbCBkaXNhZ3JlZSB3aXRoIGZpbmFsIHN0YXRlIOKAlCBhbmQgdW5kZXIgYSBkaWZmZXJlbnQgd3JpdGUgJyArXG4gICAgJ29yZGVyIHRoZSBjaGFuZ2UgaXMgZHJvcHBlZCBlbnRpcmVseS4gUmVhZHMgYXJlIEJPUlJPV0VELiAnICtcbiAgICAnV3JpdGUgdGhyb3VnaCB0aGUgc2NvcGUgaW5zdGVhZCAoYHNjb3BlLicgK1xuICAgIHdoZXJlICtcbiAgICAnID0g4oCmYCDigJQgcHJvcGVydHkgYW5kIGluZGV4ZWQgYWNjZXNzIGFyZSBib3RoIHRyYWNrZWQpLCAnICtcbiAgICBgb3IgaGFuZCBiYWNrIHRoZSB3aG9sZSB2YWx1ZSB3aXRoIFxcYHNjb3BlLiRzZXRWYWx1ZSgnJHtrZXl9JywgbmV4dClcXGAuIGAgK1xuICAgICdUaGlzIHVzdWFsbHkgY29tZXMgZnJvbSBtdXRhdGluZyBhbiBlbGVtZW50IHJlYWNoZWQgYnkgYGZpbmRgL2BmaWx0ZXJgL2Bmb3LigKZvZmAvYGZvckVhY2hgLCAnICtcbiAgICAnd2hpY2ggdGhlIHNjb3BlIHByb3h5IGNhbm5vdCBpbnRlcmNlcHQuJ1xuICApO1xufVxuIl19
|
|
130
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9ycm93ZWRNdXRhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvbWVtb3J5L2JvcnJvd2VkTXV0YXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQThCRztBQUVILE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFdkMsOEVBQThFO0FBQzlFLFNBQVMsV0FBVyxDQUFDLE1BQWMsRUFBRSxPQUFlLEVBQUUsU0FBa0I7SUFDdEUsSUFBSSxTQUFTO1FBQUUsT0FBTyxHQUFHLE1BQU0sSUFBSSxPQUFPLEdBQUcsQ0FBQztJQUM5QyxPQUFPLE1BQU0sS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLElBQUksT0FBTyxFQUFFLENBQUM7QUFDMUQsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQUMsTUFBZSxFQUFFLEtBQWMsRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFFLEtBQUssR0FBRyxDQUFDO0lBQ3hGLElBQUksU0FBUyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDekQsSUFBSSxLQUFLLElBQUksRUFBRTtRQUFFLE9BQU8sTUFBTSxDQUFDLENBQUMsMkNBQTJDO0lBQzNFLElBQUksTUFBTSxLQUFLLElBQUksSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVEsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO1FBQUUsT0FBTyxNQUFNLENBQUM7SUFFaEgsTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM1QyxJQUFJLGFBQWEsS0FBSyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8s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QUFPLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDekUsT0FBTyxDQUNMLHNCQUFzQixTQUFTLGVBQWUsS0FBSyx3Q0FBd0M7UUFDM0Ysb0dBQW9HO1FBQ3BHLG1HQUFtRztRQUNuRyw0REFBNEQ7UUFDNUQsMENBQTBDO1FBQzFDLEtBQUs7UUFDTCx5REFBeUQ7UUFDekQsd0RBQXdELEdBQUcsY0FBYztRQUN6RSw2RkFBNkY7UUFDN0YseUNBQXlDLENBQzFDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBtZW1vcnkvYm9ycm93ZWRNdXRhdGlvbiDigJQgdGhlIGhvbmVzdCBib3VuZGFyeSdzIHR3byB0ZXh0czogdGhlIGRldi1tb2RlXG4gKiBSRVBPUlQgZm9yIGEgd3JpdGUgdGhlIGVuZ2luZSBjYW5ub3Qgc2VlICh7QGxpbmsgYm9ycm93ZWRNdXRhdGlvbk1lc3NhZ2V9KVxuICogYW5kIHRoZSBSRUZVU0FMIGZvciBhIHdyaXRlIGZyb20gYSBoYW5kbGUgaGVsZCBwYXN0IGl0cyBzdGFnZVxuICogKHtAbGluayBkZWFkRnJhbWVNZXNzYWdlfSwgdGhyb3duIGJ5IGBTdGFnZUNvbnRleHQuc3RhZ2VXcml0ZWApLlxuICpcbiAqIOKUgOKUgCBUaGUgaG9uZXN0IGJvdW5kYXJ5IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICogVGhlIHR5cGVkIHNjb3BlIGludGVyY2VwdHMgZXZlcnkgd3JpdGUgaXQgY2FuIHJlYWNoOiBhIHByb3BlcnR5IGF0IGFueVxuICogZGVwdGgsIGFuIGluZGV4ZWQgZWxlbWVudCwgYW4gYXJyYXkgbWV0aG9kLiBXaGF0IGl0IGNhbm5vdCByZWFjaCBpcyBhblxuICogZWxlbWVudCBoYW5kZWQgb3V0IGJ5IGEgUkVBRCBNRVRIT0Qg4oCUIGBmaW5kYCwgYGZpbHRlcmAsIGBmb3LigKZvZmAsIGBmb3JFYWNoYCxcbiAqIGRlc3RydWN0dXJpbmcg4oCUIGJlY2F1c2Ugd3JhcHBpbmcgdGhvc2Ugd291bGQgbWVhbiByZXR1cm5pbmcgcHJveGllcyBvdXQgb2ZcbiAqIGV2ZXJ5IHJlYWQgKGBtYXBgIHdvdWxkIGJ1aWxkIGFuIGFycmF5IG9mIHByb3hpZXMsIGBmaWx0ZXJgIHdvdWxkIGNvbXBhcmVcbiAqIHByb3hpZXMsIGEgcmV0dXJuZWQgdmFsdWUgd291bGQgZXNjYXBlIHRoZSBzdGFnZSBzdGlsbCBib3VuZCB0byBpdCkuIFRoYXQgaXNcbiAqIGEgY29zdCB0aGUgbGlicmFyeSBzaG91bGQgbm90IHBheSwgYW5kIGEgc2VtYW50aWMgY2hhbmdlIGl0IHNob3VsZCBub3QgbWFrZS5cbiAqXG4gKiBTbyB0aGUgYW5zd2VyIGZvciB0aGF0IGZhbWlseSBpcyBub3QgaW50ZXJjZXB0aW9uIOKAlCBpdCBpcyBhIFJFUE9SVC4gQSByZWFkXG4gKiBpcyBCT1JST1dFRDsgbXV0YXRpbmcgaXQgaW4gcGxhY2UgaXMgb3V0IG9mIGNvbnRyYWN0LiBUaGlzIG1vZHVsZSBkZXRlY3RzIHRoZVxuICogdmlvbGF0aW9uIGFmdGVyIHRoZSBmYWN0IGFuZCBuYW1lcyBpdCAoYSBkZXYtbW9kZSB3YXJuaW5nIGF0IGNvbW1pdCDigJQgdGhlXG4gKiB3cml0ZSBhbHJlYWR5IGhhcHBlbmVkLCBzbyBpdCBjYW5ub3QgYmUgcmVmdXNlZCksIGluc3RlYWQgb2YgbGV0dGluZyB0aGUgcnVuXG4gKiBlbmQgd2l0aCBhIGNvbW1pdCBsb2cgdGhhdCBkaXNhZ3JlZXMgd2l0aCBmaW5hbCBzdGF0ZSBhbmQgbm90aGluZyBzYXlpbmcgc28uXG4gKlxuICog4pSA4pSAIEhvdyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAqIGByZWFkVHJhY2tpbmc6ICdmdWxsJ2AgKHRoZSBkZWZhdWx0KSBhbHJlYWR5IHJldGFpbnMgYSBDTE9ORSBvZiBldmVyeSB2YWx1ZVxuICogYSBzdGFnZSByZWFkLiBBdCBjb21taXQsIGEga2V5IHRoZSBzdGFnZSByZWFkIGJ1dCBuZXZlciBXUk9URSBtdXN0IHN0aWxsXG4gKiBob2xkIHdoYXQgaXQgaGVsZCBhdCByZWFkIHRpbWUg4oCUIGNvbW1pdHRlZCBzdGF0ZSBpcyBpbW11dGFibGUtYWZ0ZXItc3dhcCBhbmRcbiAqIHRoZSBidWZmZXIncyB3b3JraW5nIGNvcHkgaXMgcHJpdmF0ZS4gSWYgaXQgZGlmZmVycywgdGhlIG9ubHkgdGhpbmcgdGhhdCBjYW5cbiAqIGhhdmUgY2hhbmdlZCBpdCBpcyB0aGUgc3RhZ2UgaXRzZWxmLCBpbiBwbGFjZS5cbiAqXG4gKiBEZXYtbW9kZSBvbmx5IChgZW5hYmxlRGV2TW9kZSgpYCksIHNvIHRoZSBkZWZhdWx0IHJ1biBwYXlzIG5vdGhpbmcgYW5kIGl0c1xuICogYnl0ZXMgYXJlIHVuY2hhbmdlZC5cbiAqL1xuXG5pbXBvcnQgeyBkZWVwRXF1YWwgfSBmcm9tICcuL3V0aWxzLmpzJztcblxuLyoqIFJlbmRlciBvbmUgcGF0aCBzZWdtZW50IGZvciBhIGh1bWFuOiBgbGluZXNbMF0ucXR5YCwgbm90IGBsaW5lcy4wLnF0eWAuICovXG5mdW5jdGlvbiBqb2luU2VnbWVudChwcmVmaXg6IHN0cmluZywgc2VnbWVudDogc3RyaW5nLCBpbnRvQXJyYXk6IGJvb2xlYW4pOiBzdHJpbmcge1xuICBpZiAoaW50b0FycmF5KSByZXR1cm4gYCR7cHJlZml4fVske3NlZ21lbnR9XWA7XG4gIHJldHVybiBwcmVmaXggPT09ICcnID8gc2VnbWVudCA6IGAke3ByZWZpeH0uJHtzZWdtZW50fWA7XG59XG5cbi8qKlxuICogVGhlIGZpcnN0IHBhdGggYXQgd2hpY2ggYGFmdGVyYCBzdG9wcyBhZ3JlZWluZyB3aXRoIGBiZWZvcmVgLCBvciBgdW5kZWZpbmVkYFxuICogd2hlbiB0aGV5IGFyZSBzdHJ1Y3R1cmFsbHkgZXF1YWwuIERlcHRoLWZpcnN0LCBvd24ga2V5cyBvbmx5IOKAlCB0aGUgc2FtZVxuICogc2hhcGVzIGBkZWVwRXF1YWxgIGhhbmRsZXMsIHNpbmNlIGNvbW1pdHRlZCBzdGF0ZSBpcyBKU09OLXNoYXBlZC5cbiAqXG4gKiBDeWNsZS1zYWZlIGJ5IGNvbnN0cnVjdGlvbjogaXQgb25seSByZWN1cnNlcyBpbnRvIHBhaXJzIHRoYXQgYXJlIG5vdCBhbHJlYWR5XG4gKiBgZGVlcEVxdWFsYCwgYW5kIHN0b3BzIGF0IHRoZSBmaXJzdCBkaXNhZ3JlZW1lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaXJzdERpZmZlcmluZ1BhdGgoYmVmb3JlOiB1bmtub3duLCBhZnRlcjogdW5rbm93biwgcHJlZml4ID0gJycsIGRlcHRoID0gMCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChkZWVwRXF1YWwoYmVmb3JlLCBhZnRlciwgJ2NvcGllcycpKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAoZGVwdGggPj0gMjQpIHJldHVybiBwcmVmaXg7IC8vIHBhdGhvbG9naWNhbCBuZXN0aW5nIOKAlCBuYW1lIHdoYXQgd2UgaGF2ZVxuICBpZiAoYmVmb3JlID09PSBudWxsIHx8IGFmdGVyID09PSBudWxsIHx8IHR5cGVvZiBiZWZvcmUgIT09ICdvYmplY3QnIHx8IHR5cGVvZiBhZnRlciAhPT0gJ29iamVjdCcpIHJldHVybiBwcmVmaXg7XG5cbiAgY29uc3QgYmVmb3JlSXNBcnJheSA9IEFycmF5LmlzQXJyYXkoYmVmb3JlKTtcbiAgaWYgKGJlZm9yZUlzQXJyYXkgIT09IEFycmF5LmlzQXJyYXkoYWZ0ZXIpKSByZXR1cm4gcHJlZml4O1xuXG4gIGlmIChiZWZvcmVJc0FycmF5KSB7XG4gICAgY29uc3QgYSA9IGJlZm9yZSBhcyB1bmtub3duW107XG4gICAgY29uc3QgYiA9IGFmdGVyIGFzIHVua25vd25bXTtcbiAgICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKSByZXR1cm4gcHJlZml4O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZGVlcGVyID0gZmlyc3REaWZmZXJpbmdQYXRoKGFbaV0sIGJbaV0sIGpvaW5TZWdtZW50KHByZWZpeCwgU3RyaW5nKGkpLCB0cnVlKSwgZGVwdGggKyAxKTtcbiAgICAgIGlmIChkZWVwZXIgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGRlZXBlcjtcbiAgICB9XG4gICAgcmV0dXJuIHByZWZpeDtcbiAgfVxuXG4gIGNvbnN0IGEgPSBiZWZvcmUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNvbnN0IGIgPSBhZnRlciBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgY29uc3Qga2V5cyA9IG5ldyBTZXQoWy4uLk9iamVjdC5rZXlzKGEpLCAuLi5PYmplY3Qua2V5cyhiKV0pO1xuICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgY29uc3QgZGVlcGVyID0gZmlyc3REaWZmZXJpbmdQYXRoKGFba2V5XSwgYltrZXldLCBqb2luU2VnbWVudChwcmVmaXgsIGtleSwgZmFsc2UpLCBkZXB0aCArIDEpO1xuICAgIGlmIChkZWVwZXIgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGRlZXBlcjtcbiAgfVxuICByZXR1cm4gcHJlZml4O1xufVxuXG4vKipcbiAqIFRoZSByZWZ1c2FsIHRleHQgZm9yIGEgd3JpdGUgdGhhdCByZWFjaGVkIGEgZnJhbWUgQUZURVIgaXRzIHN0YWdlIGNvbW1pdHRlZC5cbiAqIEEgc2NvcGUsIGFuZCBldmVyeSBwcm94eSByZWFkIG91dCBvZiBpdCwgaXMgYm91bmQgdG8gdGhlIHN0YWdlIGl0IHdhcyBoYW5kZWRcbiAqIHRvOyBrZXB0IHBhc3QgdGhhdCBzdGFnZSdzIGNvbW1pdCBpdCBoYXMgbm8gZnJhbWUgdG8gbGFuZCBpbiwgc28gdGhlIHdyaXRlXG4gKiB3b3VsZCBzaXQgaW4gYSBidWZmZXIgbm90aGluZyBldmVyIGNvbW1pdHMg4oCUIG5vIHRyYWNlIHJvdywgc3RhdGUgdW5jaGFuZ2VkLlxuICogVGhlIHRocm93IHN1cmZhY2VzIGluIHRoZSBzdGFnZSB0aGF0IG1hZGUgdGhlIHdyaXRlICh0aGUgZW5naW5lJ3MgZXJyb3JcbiAqIHBhdGggbmFtZXMgaXQpOyB0aGlzIHRleHQgbmFtZXMgdGhlIHN0YWdlIHRoZSBoYW5kbGUgY2FtZSBmcm9tLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVhZEZyYW1lTWVzc2FnZShzdGFnZU5hbWU6IHN0cmluZywgcnVudGltZVN0YWdlSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCwga2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBmcm9tID0gcnVudGltZVN0YWdlSWQgPyBgXCIke3N0YWdlTmFtZX1cIiAoJHtydW50aW1lU3RhZ2VJZH0pYCA6IGBcIiR7c3RhZ2VOYW1lfVwiYDtcbiAgcmV0dXJuIChcbiAgICBgW2Zvb3RwcmludF0gU3RhZ2UgJHtmcm9tfSBoYXMgYWxyZWFkeSBjb21taXR0ZWQg4oCUIGl0cyBzY29wZSBpcyBkZWFkLCBhbmQgYSB3cml0ZSB0byBcXGAke2tleX1cXGAgYCArXG4gICAgJ2p1c3QgcmVhY2hlZCBpdCBmcm9tIGEgbGF0ZXIgc3RhZ2UgKHRoaXMgZXJyb3IgaXMgcmFpc2VkIGluIHRoYXQgc3RhZ2UpLiBBIHNjb3BlLCBhbmQgYW55dGhpbmcgcmVhZCAnICtcbiAgICAnb3V0IG9mIGl0IChgc2NvcGUua2AsIGBzY29wZS5rLmFyclswXWApLCBiZWxvbmdzIHRvIHRoZSBzdGFnZSBpdCB3YXMgaGFuZGVkIHRvOyBoZWxkIHBhc3QgdGhhdCAnICtcbiAgICBcInN0YWdlJ3MgY29tbWl0IGl0IGhhcyBubyBmcmFtZSB0byBsYW5kIGluLCBzbyB0aGUgd3JpdGUgd291bGQgdmFuaXNoIHdpdGggbm8gdHJhY2Ugcm93LiBcIiArXG4gICAgXCJSZWFkIHRoZSBrZXkgYWdhaW4gdGhyb3VnaCB0aGUgQ1VSUkVOVCBzdGFnZSdzIHNjb3BlIGFuZCB3cml0ZSB0aGVyZS5cIlxuICApO1xufVxuXG4vKipcbiAqIFRoZSB3YXJuaW5nIHRleHQgZm9yIGEga2V5IHRoZSBzdGFnZSBXUk9URSBhZnRlciBjaGFuZ2luZywgaW4gcGxhY2UsIHRoZVxuICogY29tbWl0dGVkIHZhbHVlIGl0IGhhZCByZWFkIGJlZm9yZSBpdHMgZmlyc3Qgd3JpdGUgKGNvcHktb24td3JpdGUsIDkuMjkuMCkuXG4gKiBUaGUgY29tbWl0IGNvbXBhcmVzIHdoYXQgdGhlIHN0YWdlIHdyb3RlIGFnYWluc3QgY29tbWl0dGVkIHN0YXRlIOKAlCB0aGVcbiAqIG9iamVjdCB0aGUgaW4tcGxhY2UgY2hhbmdlIGFsc28gbW92ZWQg4oCUIHNvIGl0IHJlY29yZHMgbm8gY2hhbmdlOiBsaXZlIHN0YXRlXG4gKiBrZWVwcyB0aGUgZWRpdCwgdGhlIGxvZyBhbmQgZXZlcnkgZm9sZCBkbyBub3QuICg5LjI4LjAgcmVjb3JkZWQgaXQgd2hlbiB0aGVcbiAqIGVkaXQgY2FtZSBhZnRlciB0aGUgZmlyc3Qgd3JpdGUsIGJ5IGFjY2lkZW50IG9mIGEgd2hvbGUtc3RhdGUgY2xvbmUuKVxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tbWl0dGVkTXV0YXRpb25NZXNzYWdlKHN0YWdlTmFtZTogc3RyaW5nLCBrZXk6IHN0cmluZywgcGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgd2hlcmUgPSBwYXRoID09PSAnJyA/IGtleSA6IGAke2tleX0uJHtwYXRofWAucmVwbGFjZSgvXFwuXFxbL2csICdbJyk7XG4gIHJldHVybiAoXG4gICAgYFtmb290cHJpbnRdIFN0YWdlIFwiJHtzdGFnZU5hbWV9XCIgY2hhbmdlZCBcXGAke3doZXJlfVxcYCBJTiBQTEFDRSBvbiB0aGUgY29tbWl0dGVkIHZhbHVlIGl0IHJlYWQgYmVmb3JlIGAgK1xuICAgICdpdHMgZmlyc3Qgd3JpdGUsIHRoZW4gd3JvdGUgdGhlIGtleS4gVGhlIGNvbW1pdCBjb21wYXJlcyB0aGUgd3JpdHRlbiB2YWx1ZSB3aXRoIGNvbW1pdHRlZCBzdGF0ZSDigJQgJyArXG4gICAgJ3doaWNoIHRoZSBpbi1wbGFjZSBjaGFuZ2UgYWxzbyBtb3ZlZCDigJQgc28gaXQgcmVjb3JkcyBOTyBjaGFuZ2U6IGxpdmUgc3RhdGUga2VlcHMgdGhlIGVkaXQsIHRoZSBjb21taXQgJyArXG4gICAgJ2xvZyBhbmQgZXZlcnkgcmVhZGVyIHRoYXQgZm9sZHMgaXQgZG8gbm90LiBSZWFkcyBhcmUgQk9SUk9XRUQuIEJ1aWxkIHRoZSBuZXh0IHZhbHVlIGluc3RlYWQgJyArXG4gICAgYChcXGBzY29wZS4kc2V0VmFsdWUoJyR7a2V5fScsIHsgLi4udmFsdWUsIOKApiB9KVxcYCksIG9yIHJlYWQgdGhlIGtleSBhZ2FpbiBhZnRlciB0aGUgc3RhZ2UncyBmaXJzdCBgICtcbiAgICBcIndyaXRlIOKAlCB0aGF0IHJlYWQgaXMgdGhlIHN0YWdlJ3Mgb3duIGNvcHkuXCJcbiAgKTtcbn1cblxuLyoqXG4gKiBUaGUgd2FybmluZyB0ZXh0LiBOYW1lcyB0aGUgc3RhZ2UsIHRoZSBleGFjdCBwYXRoIHRoYXQgbW92ZWQsIGFuZCB0aGUgdHdvXG4gKiB3YXlzIHRvIHdyaXRlIGl0IGJhY2sg4oCUIGJlY2F1c2UgXCJ5b3UgbXV0YXRlZCBzb21ldGhpbmdcIiBpcyBub3QgYWN0aW9uYWJsZVxuICogYW5kIHRoaXMgaXMgdGhlIG9uZSBmYWlsdXJlIG1vZGUgdGhlIHdob2xlIGRlc2lnbiBleGlzdHMgdG8gcHJldmVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJvcnJvd2VkTXV0YXRpb25NZXNzYWdlKHN0YWdlTmFtZTogc3RyaW5nLCBrZXk6IHN0cmluZywgcGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgd2hlcmUgPSBwYXRoID09PSAnJyA/IGtleSA6IGAke2tleX0uJHtwYXRofWAucmVwbGFjZSgvXFwuXFxbL2csICdbJyk7XG4gIHJldHVybiAoXG4gICAgYFtmb290cHJpbnRdIFN0YWdlIFwiJHtzdGFnZU5hbWV9XCIgY2hhbmdlZCBcXGAke3doZXJlfVxcYCBJTiBQTEFDRSwgb24gYSB2YWx1ZSBpdCBvbmx5IHJlYWQuIGAgK1xuICAgICdmb290cHJpbnQgbmV2ZXIgc2F3IHRoYXQgd3JpdGU6IHRoZXJlIGlzIG5vIHRyYWNlIHJvdyBmb3IgaXQsIHNvIHRoZSBjb21taXQgbG9nLCB0aGUgY2F1c2FsIGNoYWluICcgK1xuICAgICdhbmQgZXZlcnkgcmVhZGVyIHRoYXQgZm9sZHMgdGhlIGxvZyB3aWxsIGRpc2FncmVlIHdpdGggZmluYWwgc3RhdGUg4oCUIGFuZCB1bmRlciBhIGRpZmZlcmVudCB3cml0ZSAnICtcbiAgICAnb3JkZXIgdGhlIGNoYW5nZSBpcyBkcm9wcGVkIGVudGlyZWx5LiBSZWFkcyBhcmUgQk9SUk9XRUQuICcgK1xuICAgICdXcml0ZSB0aHJvdWdoIHRoZSBzY29wZSBpbnN0ZWFkIChgc2NvcGUuJyArXG4gICAgd2hlcmUgK1xuICAgICcgPSDigKZgIOKAlCBwcm9wZXJ0eSBhbmQgaW5kZXhlZCBhY2Nlc3MgYXJlIGJvdGggdHJhY2tlZCksICcgK1xuICAgIGBvciBoYW5kIGJhY2sgdGhlIHdob2xlIHZhbHVlIHdpdGggXFxgc2NvcGUuJHNldFZhbHVlKCcke2tleX0nLCBuZXh0KVxcYC4gYCArXG4gICAgJ1RoaXMgdXN1YWxseSBjb21lcyBmcm9tIG11dGF0aW5nIGFuIGVsZW1lbnQgcmVhY2hlZCBieSBgZmluZGAvYGZpbHRlcmAvYGZvcuKApm9mYC9gZm9yRWFjaGAsICcgK1xuICAgICd3aGljaCB0aGUgc2NvcGUgcHJveHkgY2Fubm90IGludGVyY2VwdC4nXG4gICk7XG59XG4iXX0=
|
|
@@ -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';
|
|
@@ -1,35 +1,54 @@
|
|
|
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
|
*/
|
|
9
|
+
import { kindOf } from '../capture/valueKinds.js';
|
|
7
10
|
/**
|
|
8
11
|
* Structural deep equality for committed-state values.
|
|
9
12
|
*
|
|
10
13
|
* Used by {@link TransactionBuffer} to decide whether a stage actually CHANGED
|
|
11
14
|
* a path or merely re-wrote / reverted it to the value it already held (a
|
|
12
15
|
* "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
|
-
*
|
|
16
|
+
* borrowed read moved. Committed state must survive `structuredClone`, so the
|
|
17
|
+
* values it can hold are the kinds the clone keeps, and two values are equal
|
|
18
|
+
* when a record holds the same thing for both. Every kind has ONE arm below
|
|
19
|
+
* (`equalPairs`' switch over `ValueKind` — a kind added to the union does not
|
|
20
|
+
* compile until it is compared). Before 9.22.0 a Date, Map or Set was compared
|
|
21
|
+
* as an object with no own keys, and until 9.44.2 so were a RegExp, an Error,
|
|
22
|
+
* a boxed primitive, an ArrayBuffer, a DataView and a Blob: any two of a kind
|
|
23
|
+
* were "equal", so `$setValue('re', /y/g)` over `/x/g` committed no row and
|
|
24
|
+
* live state kept the OLD value.
|
|
21
25
|
*
|
|
22
26
|
* Semantics:
|
|
23
27
|
* - reference / identical-primitive short-circuits first (cheap fast path)
|
|
24
28
|
* - `NaN` equals `NaN` (primitive compare falls back to `Object.is`)
|
|
29
|
+
* - two values of different KINDS are never equal (a `Date` is never `{}`,
|
|
30
|
+
* an array never `{ 0: … }`)
|
|
25
31
|
* - `Date`: same `getTime()` (two invalid dates are equal)
|
|
32
|
+
* - `RegExp`: same `source` and `flags` (the clone resets `lastIndex`)
|
|
33
|
+
* - `Error`: the same restored kind (one of the six built-in error names,
|
|
34
|
+
* else `Error`), own `message`, `stack` and own `cause` (deep) — what the
|
|
35
|
+
* clone keeps; any other own field is dropped by it, so it never counts
|
|
36
|
+
* (the admitted record's law)
|
|
37
|
+
* - a boxed primitive: the same wrapper type and the same primitive inside
|
|
38
|
+
* - an `ArrayBuffer`: length, resizability and bytes; a typed array or a
|
|
39
|
+
* `DataView`: its type and the bytes IT views — never the rest of its
|
|
40
|
+
* buffer (a Node `Buffer` views a slice of a shared pool, and the record
|
|
41
|
+
* keeps the view's bytes only: `capture/freeze.ts · freezeRecord`)
|
|
26
42
|
* - `Map`: same size AND, per key of `a`, `b` holds a deep-equal value —
|
|
27
43
|
* keys by `Map` identity (`SameValueZero`), values deep
|
|
28
44
|
* - `Set`: same size AND every member of `a` is deep-equal to SOME member
|
|
29
45
|
* of `b` (order-insensitive — a Set has no order to compare by)
|
|
30
|
-
* -
|
|
31
|
-
*
|
|
32
|
-
*
|
|
46
|
+
* - an OPAQUE value (a Blob, a `DOMException` — content this library cannot
|
|
47
|
+
* read): by the caller's {@link OpaqueRule} — equal only to itself by
|
|
48
|
+
* default (replacing one is always a change), or, when both sides are
|
|
49
|
+
* copies of one record, equal to any other of its kind
|
|
50
|
+
* - arrays: equal length AND deep-equal element-wise (order-sensitive; an
|
|
51
|
+
* array's expando keys are out of contract and not compared)
|
|
33
52
|
* - objects: identical set of keys that HOLD a value AND deep-equal per key.
|
|
34
53
|
* An own key whose value is `undefined` counts as ABSENT: it is this
|
|
35
54
|
* library's other spelling of a deleted key (`'full'` mode flattens
|
|
@@ -38,11 +57,13 @@
|
|
|
38
57
|
* mirror — reads the two spellings as one state. So must the net-change
|
|
39
58
|
* filter (9.19.1): `{}` and `{ k: undefined }` are not a change. Arrays
|
|
40
59
|
* are untouched — a slot holding `undefined` is still a slot.
|
|
41
|
-
* - mismatched kinds (array vs object, object vs null) → not equal
|
|
42
60
|
*
|
|
43
61
|
* Cost & safety:
|
|
44
|
-
* - Allocates
|
|
45
|
-
*
|
|
62
|
+
* - Allocates only transient `Object.keys` arrays, an error's property
|
|
63
|
+
* descriptors and a byte view per compared buffer — no clones (but one
|
|
64
|
+
* probe clone per class prototype, remembered: `capture/valueKinds.ts ·
|
|
65
|
+
* kindOf`). It is strictly cheaper than the `structuredClone` the commit
|
|
66
|
+
* already performs.
|
|
46
67
|
* - Primitive comparisons (the bulk of state) are O(1) via the `===` /
|
|
47
68
|
* `Object.is` fast paths; only nested objects/arrays incur a walk, bounded
|
|
48
69
|
* by the value's own size.
|
|
@@ -54,10 +75,10 @@
|
|
|
54
75
|
* change. Dev mode still warns about cycles at write time
|
|
55
76
|
* (`ScopeFacade.setValue`) because they surprise narrative and JSON.
|
|
56
77
|
*/
|
|
57
|
-
export function deepEqual(a, b) {
|
|
58
|
-
return equalPairs(a, b, undefined);
|
|
78
|
+
export function deepEqual(a, b, opaque = 'identity') {
|
|
79
|
+
return equalPairs(a, b, undefined, opaque);
|
|
59
80
|
}
|
|
60
|
-
function equalPairs(a, b, seen) {
|
|
81
|
+
function equalPairs(a, b, seen, opaque) {
|
|
61
82
|
if (a === b)
|
|
62
83
|
return true; // same reference or identical primitive
|
|
63
84
|
if (typeof a !== typeof b)
|
|
@@ -66,16 +87,35 @@ function equalPairs(a, b, seen) {
|
|
|
66
87
|
return a === b; // one is null, the other isn't
|
|
67
88
|
if (typeof a !== 'object')
|
|
68
89
|
return Object.is(a, b); // NaN-safe primitive compare
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
const aKind = typedKind(a);
|
|
72
|
-
if (aKind !== typedKind(b))
|
|
90
|
+
const kind = kindOf(a);
|
|
91
|
+
if (kind !== kindOf(b))
|
|
73
92
|
return false;
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
93
|
+
switch (kind) {
|
|
94
|
+
// Atoms: their content is a slot, not their keys.
|
|
95
|
+
case 'date':
|
|
96
|
+
return Object.is(Date.prototype.getTime.call(a), Date.prototype.getTime.call(b));
|
|
97
|
+
case 'regexp':
|
|
98
|
+
return a.source === b.source && a.flags === b.flags;
|
|
99
|
+
case 'boxed':
|
|
100
|
+
return tagOf(a) === tagOf(b) && equalPairs(a.valueOf(), b.valueOf(), seen, opaque);
|
|
101
|
+
case 'buffer':
|
|
102
|
+
return equalBuffers(a, b);
|
|
103
|
+
case 'view':
|
|
104
|
+
return equalViews(a, b);
|
|
105
|
+
case 'opaque':
|
|
106
|
+
return opaque === 'copies' && tagOf(a) === tagOf(b); // `a === b` was answered above
|
|
107
|
+
case 'plain':
|
|
108
|
+
case 'array':
|
|
109
|
+
case 'map':
|
|
110
|
+
case 'set':
|
|
111
|
+
case 'error':
|
|
112
|
+
return equalContainers(a, b, kind, seen, opaque);
|
|
113
|
+
default:
|
|
114
|
+
return unknownKind(kind);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/** The kinds whose content is other values: compared part by part, under the cycle guard. */
|
|
118
|
+
function equalContainers(a, b, kind, seen, opaque) {
|
|
79
119
|
// Cycle guard — a pair we are already inside is equal by assumption.
|
|
80
120
|
seen ??= new WeakMap();
|
|
81
121
|
let partners = seen.get(a);
|
|
@@ -84,15 +124,17 @@ function equalPairs(a, b, seen) {
|
|
|
84
124
|
if (!partners)
|
|
85
125
|
seen.set(a, (partners = new WeakSet()));
|
|
86
126
|
partners.add(b);
|
|
87
|
-
if (
|
|
88
|
-
return equalMaps(a, b, seen);
|
|
89
|
-
if (
|
|
90
|
-
return equalSets(a, b, seen);
|
|
91
|
-
if (
|
|
127
|
+
if (kind === 'map')
|
|
128
|
+
return equalMaps(a, b, seen, opaque);
|
|
129
|
+
if (kind === 'set')
|
|
130
|
+
return equalSets(a, b, seen, opaque);
|
|
131
|
+
if (kind === 'error')
|
|
132
|
+
return equalErrors(a, b, seen, opaque);
|
|
133
|
+
if (kind === 'array') {
|
|
92
134
|
if (a.length !== b.length)
|
|
93
135
|
return false;
|
|
94
136
|
for (let i = 0; i < a.length; i++) {
|
|
95
|
-
if (!equalPairs(a[i], b[i], seen))
|
|
137
|
+
if (!equalPairs(a[i], b[i], seen, opaque))
|
|
96
138
|
return false;
|
|
97
139
|
}
|
|
98
140
|
return true;
|
|
@@ -106,7 +148,7 @@ function equalPairs(a, b, seen) {
|
|
|
106
148
|
aHeld++;
|
|
107
149
|
if (!Object.prototype.hasOwnProperty.call(b, key))
|
|
108
150
|
return false;
|
|
109
|
-
if (!equalPairs(a[key], b[key], seen))
|
|
151
|
+
if (!equalPairs(a[key], b[key], seen, opaque))
|
|
110
152
|
return false;
|
|
111
153
|
}
|
|
112
154
|
let bHeld = 0;
|
|
@@ -115,23 +157,84 @@ function equalPairs(a, b, seen) {
|
|
|
115
157
|
bHeld++;
|
|
116
158
|
return aHeld === bHeld;
|
|
117
159
|
}
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
160
|
+
function unknownKind(kind) {
|
|
161
|
+
throw new TypeError(`deepEqual: no comparison for the value kind '${String(kind)}'`);
|
|
162
|
+
}
|
|
163
|
+
/** `[object Number]`, `[object Uint8Array]` … — the built-in type a boxed value or a view carries. */
|
|
164
|
+
function tagOf(value) {
|
|
165
|
+
return Object.prototype.toString.call(value);
|
|
166
|
+
}
|
|
167
|
+
/** The same view type over the same bytes — the bytes the view sees, wherever they sit in its buffer. */
|
|
168
|
+
function equalViews(a, b) {
|
|
169
|
+
if (tagOf(a) !== tagOf(b) || a.byteLength !== b.byteLength)
|
|
170
|
+
return false;
|
|
171
|
+
if (a.buffer === b.buffer && a.byteOffset === b.byteOffset)
|
|
172
|
+
return true;
|
|
173
|
+
const p = new Uint8Array(a.buffer, a.byteOffset, a.byteLength);
|
|
174
|
+
const q = new Uint8Array(b.buffer, b.byteOffset, b.byteLength);
|
|
175
|
+
for (let i = 0; i < p.length; i++)
|
|
176
|
+
if (p[i] !== q[i])
|
|
177
|
+
return false;
|
|
178
|
+
return true;
|
|
179
|
+
}
|
|
180
|
+
/** The same length, resizability and bytes. */
|
|
181
|
+
function equalBuffers(a, b) {
|
|
182
|
+
if (a === b)
|
|
183
|
+
return true;
|
|
184
|
+
const x = a;
|
|
185
|
+
const y = b;
|
|
186
|
+
if (x.byteLength !== y.byteLength || x.resizable !== y.resizable || x.maxByteLength !== y.maxByteLength) {
|
|
187
|
+
return false;
|
|
188
|
+
}
|
|
189
|
+
const p = new Uint8Array(a);
|
|
190
|
+
const q = new Uint8Array(b);
|
|
191
|
+
for (let i = 0; i < p.length; i++)
|
|
192
|
+
if (p[i] !== q[i])
|
|
193
|
+
return false;
|
|
194
|
+
return true;
|
|
195
|
+
}
|
|
196
|
+
/** The six error names `structuredClone` restores; any other name comes back an `Error`. */
|
|
197
|
+
const ERROR_NAMES = new Set(['EvalError', 'RangeError', 'ReferenceError', 'SyntaxError', 'TypeError', 'URIError']);
|
|
198
|
+
/**
|
|
199
|
+
* Two errors as the clone keeps them: the restored kind, the own `message`,
|
|
200
|
+
* the `stack` and the own `cause` (deep). Any other own field is dropped by
|
|
201
|
+
* the clone, so it never counts.
|
|
202
|
+
*/
|
|
203
|
+
function equalErrors(a, b, seen, opaque) {
|
|
204
|
+
if (errorKindOf(a) !== errorKindOf(b) || stackOf(a) !== stackOf(b))
|
|
205
|
+
return false;
|
|
206
|
+
const aMessage = ownData(a, 'message');
|
|
207
|
+
const bMessage = ownData(b, 'message');
|
|
208
|
+
if (String(aMessage?.value) !== String(bMessage?.value) || !aMessage !== !bMessage)
|
|
209
|
+
return false;
|
|
210
|
+
const aCause = ownData(a, 'cause');
|
|
211
|
+
const bCause = ownData(b, 'cause');
|
|
212
|
+
if (!aCause || !bCause)
|
|
213
|
+
return !aCause === !bCause;
|
|
214
|
+
return equalPairs(aCause.value, bCause.value, seen, opaque);
|
|
215
|
+
}
|
|
216
|
+
function errorKindOf(error) {
|
|
217
|
+
const name = String(error.name);
|
|
218
|
+
return ERROR_NAMES.has(name) ? name : 'Error';
|
|
219
|
+
}
|
|
220
|
+
function stackOf(error) {
|
|
221
|
+
const stack = error.stack;
|
|
222
|
+
return typeof stack === 'string' ? stack : undefined;
|
|
223
|
+
}
|
|
224
|
+
/** An own DATA property, boxed — how the clone reads an error's `message` and `cause`. */
|
|
225
|
+
function ownData(value, key) {
|
|
226
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, key);
|
|
227
|
+
return descriptor !== undefined && Object.prototype.hasOwnProperty.call(descriptor, 'value')
|
|
228
|
+
? { value: descriptor.value }
|
|
229
|
+
: undefined;
|
|
127
230
|
}
|
|
128
|
-
function equalMaps(a, b, seen) {
|
|
231
|
+
function equalMaps(a, b, seen, opaque) {
|
|
129
232
|
if (a.size !== b.size)
|
|
130
233
|
return false;
|
|
131
234
|
for (const [key, value] of a) {
|
|
132
235
|
if (!b.has(key))
|
|
133
236
|
return false;
|
|
134
|
-
if (!equalPairs(value, b.get(key), seen))
|
|
237
|
+
if (!equalPairs(value, b.get(key), seen, opaque))
|
|
135
238
|
return false;
|
|
136
239
|
}
|
|
137
240
|
return true;
|
|
@@ -140,7 +243,7 @@ function equalMaps(a, b, seen) {
|
|
|
140
243
|
* Order-insensitive, deep per member. Quadratic in the worst case for sets of
|
|
141
244
|
* objects — a set of primitives (the common shape) is one `has` per member.
|
|
142
245
|
*/
|
|
143
|
-
function equalSets(a, b, seen) {
|
|
246
|
+
function equalSets(a, b, seen, opaque) {
|
|
144
247
|
if (a.size !== b.size)
|
|
145
248
|
return false;
|
|
146
249
|
const unmatched = [...b];
|
|
@@ -149,11 +252,11 @@ function equalSets(a, b, seen) {
|
|
|
149
252
|
// Each match retires its slot so two structurally-equal members of `a`
|
|
150
253
|
// cannot both claim the same member of `b`.
|
|
151
254
|
const at = unmatched.indexOf(member);
|
|
152
|
-
const found = at >= 0 ? at : unmatched.findIndex((candidate) => equalPairs(member, candidate, seen));
|
|
255
|
+
const found = at >= 0 ? at : unmatched.findIndex((candidate) => equalPairs(member, candidate, seen, opaque));
|
|
153
256
|
if (found < 0)
|
|
154
257
|
return false;
|
|
155
258
|
unmatched.splice(found, 1);
|
|
156
259
|
}
|
|
157
260
|
return true;
|
|
158
261
|
}
|
|
159
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXF1YWxpdHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21lbW9yeS9lcXVhbGl0eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQUVIOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaURHO0FBQ0gsTUFBTSxVQUFVLFNBQVMsQ0FBQyxDQUFNLEVBQUUsQ0FBTTtJQUN0QyxPQUFPLFVBQVUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQ3JDLENBQUM7QUFXRCxTQUFTLFVBQVUsQ0FBQyxDQUFNLEVBQUUsQ0FBTSxFQUFFLElBQTJCO0lBQzdELElBQUksQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQyxDQUFDLHdDQUF3QztJQUNsRSxJQUFJLE9BQU8sQ0FBQyxLQUFLLE9BQU8sQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ3hDLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSTtRQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLCtCQUErQjtJQUM3RSxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVE7UUFBRSxPQUFPLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsNkJBQTZCO0lBRWhGLHVFQUF1RTtJQUN2RSw0REFBNEQ7SUFDNUQsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNCLElBQUksS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUN6QyxJQUFJLEtBQUssS0FBSyxNQUFNO1FBQUUsT0FBTyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUVq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LElBQUksQ0FBQztBQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGVxdWFsaXR5LnRzIOKAlCBzdHJ1Y3R1cmFsIGVxdWFsaXR5IG9mIGNvbW1pdHRlZC1zdGF0ZSB2YWx1ZXMuIEEgbGVhZiAoTDAsXG4gKiBpbXBvcnRzIG5vdGhpbmcpOiB3aGF0IGBUcmFuc2FjdGlvbkJ1ZmZlcmAncyBuZXQtY2hhbmdlIGZpbHRlciwgdGhlIGFkbWl0dGVkXG4gKiByZWNvcmQncyBjb21wYXJlIGFuZCB0aGUgYm9ycm93ZWQtbXV0YXRpb24gZ3VhcmQgYWxsIGFzay4gUmUtZXhwb3J0ZWQgZnJvbVxuICogYHV0aWxzLnRzYCwgc28gbm8gaW1wb3J0ZXIgbW92ZWQuXG4gKi9cblxuLyoqXG4gKiBTdHJ1Y3R1cmFsIGRlZXAgZXF1YWxpdHkgZm9yIGNvbW1pdHRlZC1zdGF0ZSB2YWx1ZXMuXG4gKlxuICogVXNlZCBieSB7QGxpbmsgVHJhbnNhY3Rpb25CdWZmZXJ9IHRvIGRlY2lkZSB3aGV0aGVyIGEgc3RhZ2UgYWN0dWFsbHkgQ0hBTkdFRFxuICogYSBwYXRoIG9yIG1lcmVseSByZS13cm90ZSAvIHJldmVydGVkIGl0IHRvIHRoZSB2YWx1ZSBpdCBhbHJlYWR5IGhlbGQgKGFcbiAqIFwibm8tb3Agd3JpdGVcIiksIGFuZCBieSBgYm9ycm93ZWRNdXRhdGlvbi5maXJzdERpZmZlcmluZ1BhdGhgIHRvIGZpbmQgd2hlcmUgYVxuICogYm9ycm93ZWQgcmVhZCBtb3ZlZC4gQ29tbWl0dGVkIHN0YXRlIG11c3Qgc3Vydml2ZSBgc3RydWN0dXJlZENsb25lYCwgYW5kXG4gKiBgc3RydWN0dXJlZENsb25lYCBrZWVwcyBgRGF0ZWAsIGBNYXBgIGFuZCBgU2V0YCDigJQgc28gdGhvc2UgYXJlIGxlZ2FsIHN0YXRlXG4gKiB2YWx1ZXMgKGEgYCRzZXRWYWx1ZWAgYnlwYXNzZXMgdGhlIHByb3h5J3MgSlNPTiByb3VuZC10cmlwKSBhbmQgdGhpcyBtdXN0XG4gKiB0ZWxsIHR3byBvZiB0aGVtIGFwYXJ0LiBCZWZvcmUgOS4yMi4wIGl0IGNvbXBhcmVkIHRoZW0gYXMgcGxhaW4gb2JqZWN0cywgYW5kXG4gKiBhIGBEYXRlYC9gTWFwYC9gU2V0YCBoYXMgbm8gb3duIGVudW1lcmFibGUga2V5czogZXZlcnkgcGFpciB3YXMgXCJlcXVhbFwiLCBzb1xuICogYCRzZXRWYWx1ZSgnaycsIG5ldyBEYXRlKDE5OTkpKWAgb3ZlciBhIDIwMjAgZGF0ZSB3YXMgZHJvcHBlZCBhcyBhIG5vLW9wIOKAlFxuICogbm8gdHJhY2Ugcm93LCBzdGF0ZSB1bmNoYW5nZWQg4oCUIGFuZCBhIGBzZXRGdWxsWWVhcmAgaW4gcGxhY2Ugc2xpcHBlZCBwYXN0XG4gKiB0aGUgZGV2LW1vZGUgZ3VhcmQuXG4gKlxuICogU2VtYW50aWNzOlxuICogICAtIHJlZmVyZW5jZSAvIGlkZW50aWNhbC1wcmltaXRpdmUgc2hvcnQtY2lyY3VpdHMgZmlyc3QgKGNoZWFwIGZhc3QgcGF0aClcbiAqICAgLSBgTmFOYCBlcXVhbHMgYE5hTmAgKHByaW1pdGl2ZSBjb21wYXJlIGZhbGxzIGJhY2sgdG8gYE9iamVjdC5pc2ApXG4gKiAgIC0gYERhdGVgOiBzYW1lIGBnZXRUaW1lKClgICh0d28gaW52YWxpZCBkYXRlcyBhcmUgZXF1YWwpXG4gKiAgIC0gYE1hcGA6IHNhbWUgc2l6ZSBBTkQsIHBlciBrZXkgb2YgYGFgLCBgYmAgaG9sZHMgYSBkZWVwLWVxdWFsIHZhbHVlIOKAlFxuICogICAgIGtleXMgYnkgYE1hcGAgaWRlbnRpdHkgKGBTYW1lVmFsdWVaZXJvYCksIHZhbHVlcyBkZWVwXG4gKiAgIC0gYFNldGA6IHNhbWUgc2l6ZSBBTkQgZXZlcnkgbWVtYmVyIG9mIGBhYCBpcyBkZWVwLWVxdWFsIHRvIFNPTUUgbWVtYmVyXG4gKiAgICAgb2YgYGJgIChvcmRlci1pbnNlbnNpdGl2ZSDigJQgYSBTZXQgaGFzIG5vIG9yZGVyIHRvIGNvbXBhcmUgYnkpXG4gKiAgIC0gYSB0eXBlZCB2YWx1ZSBhZ2FpbnN0IGEgcGxhaW4gdmFsdWUsIG9yIHR3byBkaWZmZXJlbnQgdHlwZWQga2luZHMg4oaSIG5vdFxuICogICAgIGVxdWFsIChhIGBEYXRlYCBpcyBuZXZlciBge31gKVxuICogICAtIGFycmF5czogZXF1YWwgbGVuZ3RoIEFORCBkZWVwLWVxdWFsIGVsZW1lbnQtd2lzZSAob3JkZXItc2Vuc2l0aXZlKVxuICogICAtIG9iamVjdHM6IGlkZW50aWNhbCBzZXQgb2Yga2V5cyB0aGF0IEhPTEQgYSB2YWx1ZSBBTkQgZGVlcC1lcXVhbCBwZXIga2V5LlxuICogICAgIEFuIG93biBrZXkgd2hvc2UgdmFsdWUgaXMgYHVuZGVmaW5lZGAgY291bnRzIGFzIEFCU0VOVDogaXQgaXMgdGhpc1xuICogICAgIGxpYnJhcnkncyBvdGhlciBzcGVsbGluZyBvZiBhIGRlbGV0ZWQga2V5IChgJ2Z1bGwnYCBtb2RlIGZsYXR0ZW5zXG4gKiAgICAgYGRlbGV0ZWAgaW50byBga2V5OiB1bmRlZmluZWRgOyBgJ2RlbHRhJ2AgbW9kZSdzIGBkZWxldGVgIHZlcmIgcmVtb3Zlc1xuICogICAgIHRoZSBrZXkpLCBhbmQgZXZlcnkgY29uc3VtZXIg4oCUIEpTT04sIHRoZSBmb2xkLCBgY29tbWl0VmFsdWVBdGAsIHRoZVxuICogICAgIG1pcnJvciDigJQgcmVhZHMgdGhlIHR3byBzcGVsbGluZ3MgYXMgb25lIHN0YXRlLiBTbyBtdXN0IHRoZSBuZXQtY2hhbmdlXG4gKiAgICAgZmlsdGVyICg5LjE5LjEpOiBge31gIGFuZCBgeyBrOiB1bmRlZmluZWQgfWAgYXJlIG5vdCBhIGNoYW5nZS4gQXJyYXlzXG4gKiAgICAgYXJlIHVudG91Y2hlZCDigJQgYSBzbG90IGhvbGRpbmcgYHVuZGVmaW5lZGAgaXMgc3RpbGwgYSBzbG90LlxuICogICAtIG1pc21hdGNoZWQga2luZHMgKGFycmF5IHZzIG9iamVjdCwgb2JqZWN0IHZzIG51bGwpIOKGkiBub3QgZXF1YWxcbiAqXG4gKiBDb3N0ICYgc2FmZXR5OlxuICogICAtIEFsbG9jYXRlcyBOT1RISU5HIGJ1dCB0cmFuc2llbnQgYE9iamVjdC5rZXlzYCBhcnJheXMg4oCUIG5vIGNsb25lcy4gSXQgaXNcbiAqICAgICBzdHJpY3RseSBjaGVhcGVyIHRoYW4gdGhlIGBzdHJ1Y3R1cmVkQ2xvbmVgIHRoZSBjb21taXQgYWxyZWFkeSBwZXJmb3Jtcy5cbiAqICAgLSBQcmltaXRpdmUgY29tcGFyaXNvbnMgKHRoZSBidWxrIG9mIHN0YXRlKSBhcmUgTygxKSB2aWEgdGhlIGA9PT1gIC9cbiAqICAgICBgT2JqZWN0LmlzYCBmYXN0IHBhdGhzOyBvbmx5IG5lc3RlZCBvYmplY3RzL2FycmF5cyBpbmN1ciBhIHdhbGssIGJvdW5kZWRcbiAqICAgICBieSB0aGUgdmFsdWUncyBvd24gc2l6ZS5cbiAqICAgLSBUZXJtaW5hdGVzIG9uIENZQ0xJQyB2YWx1ZXMgKDkuMTguMSk6IGEgc3RhdGUgdmFsdWUgbXVzdCBzdXJ2aXZlXG4gKiAgICAgYHN0cnVjdHVyZWRDbG9uZWAsIGFuZCBgc3RydWN0dXJlZENsb25lYCBwcmVzZXJ2ZXMgY3ljbGVzIOKAlCBzbyBhXG4gKiAgICAgc2VsZi1yZWZlcmVuY2luZyB2YWx1ZSBpcyBhIGxlZ2FsIHZhbHVlLCBub3QgYW4gb3V0LW9mLWNvbnRyYWN0IG9uZS4gQVxuICogICAgIHBhaXIgb2Ygb2JqZWN0cyBhbHJlYWR5IHVuZGVyIGNvbXBhcmlzb24gaXMgdHJlYXRlZCBhcyBlcXVhbCAodGhlXG4gKiAgICAgc3RydWN0dXJhbCBhbnN3ZXIsIGxvZGFzaCBgaXNFcXVhbGAgc2VtYW50aWNzKTsgYWN5Y2xpYyBpbnB1dHMgc2VlIG5vXG4gKiAgICAgY2hhbmdlLiBEZXYgbW9kZSBzdGlsbCB3YXJucyBhYm91dCBjeWNsZXMgYXQgd3JpdGUgdGltZVxuICogICAgIChgU2NvcGVGYWNhZGUuc2V0VmFsdWVgKSBiZWNhdXNlIHRoZXkgc3VycHJpc2UgbmFycmF0aXZlIGFuZCBKU09OLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVlcEVxdWFsKGE6IGFueSwgYjogYW55KTogYm9vbGVhbiB7XG4gIHJldHVybiBlcXVhbFBhaXJzKGEsIGIsIHVuZGVmaW5lZCk7XG59XG5cbi8qKlxuICogT2JqZWN0IHBhaXJzIG1ldCBzbyBmYXIsIGtleWVkIGBhIOKGkiB0aGUgYidzIGl0IGhhcyBiZWVuIHBhaXJlZCB3aXRoYC4gQ3JlYXRlZFxuICogbGF6aWx5IGJ5IHRoZSBmaXJzdCBvYmplY3QgcGFpciwgc28gcHJpbWl0aXZlIGNvbXBhcmVzIGFsbG9jYXRlIG5vdGhpbmcuXG4gKiBOZXZlciBwcnVuZWQ6IGV2ZXJ5IGBmYWxzZWAgcmV0dXJucyBzdHJhaWdodCB1cCB0byB0aGUgY2FsbGVyIChlYWNoIHJlY3Vyc2l2ZVxuICogY2FsbCBzaG9ydC1jaXJjdWl0cyBvbiBpdCksIHNvIG5vdGhpbmcgaXMgbG9va2VkIHVwIGFmdGVyIGEgbWlzbWF0Y2gg4oCUIGFcbiAqIHN0b3JlZCBwYWlyIGlzIGVpdGhlciBzdGlsbCB1bmRlciBjb21wYXJpc29uIG9yIGFscmVhZHkga25vd24gZXF1YWwuXG4gKi9cbnR5cGUgU2VlblBhaXJzID0gV2Vha01hcDxvYmplY3QsIFdlYWtTZXQ8b2JqZWN0Pj47XG5cbmZ1bmN0aW9uIGVxdWFsUGFpcnMoYTogYW55LCBiOiBhbnksIHNlZW46IFNlZW5QYWlycyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICBpZiAoYSA9PT0gYikgcmV0dXJuIHRydWU7IC8vIHNhbWUgcmVmZXJlbmNlIG9yIGlkZW50aWNhbCBwcmltaXRpdmVcbiAgaWYgKHR5cGVvZiBhICE9PSB0eXBlb2YgYikgcmV0dXJuIGZhbHNlO1xuICBpZiAoYSA9PT0gbnVsbCB8fCBiID09PSBudWxsKSByZXR1cm4gYSA9PT0gYjsgLy8gb25lIGlzIG51bGwsIHRoZSBvdGhlciBpc24ndFxuICBpZiAodHlwZW9mIGEgIT09ICdvYmplY3QnKSByZXR1cm4gT2JqZWN0LmlzKGEsIGIpOyAvLyBOYU4tc2FmZSBwcmltaXRpdmUgY29tcGFyZVxuXG4gIC8vIFR5cGVkIGFybXMgZmlyc3Qg4oCUIGEgRGF0ZS9NYXAvU2V0IGhhcyBubyBvd24gZW51bWVyYWJsZSBrZXlzLCBzbyB0aGVcbiAgLy8gcGxhaW4tb2JqZWN0IHdhbGsgYmVsb3cgd291bGQgY2FsbCBhbnkgdHdvIG9mIHRoZW0gZXF1YWwuXG4gIGNvbnN0IGFLaW5kID0gdHlwZWRLaW5kKGEpO1xuICBpZiAoYUtpbmQgIT09IHR5cGVkS2luZChiKSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoYUtpbmQgPT09ICdkYXRlJykgcmV0dXJuIE9iamVjdC5pcyhhLmdldFRpbWUoKSwgYi5nZXRUaW1lKCkpO1xuXG4gIGNvbnN0IGFJc0FycmF5ID0gQXJyYXkuaXNBcnJheShhKTtcbiAgaWYgKGFJc0FycmF5ICE9PSBBcnJheS5pc0FycmF5KGIpKSByZXR1cm4gZmFsc2U7IC8vIGFycmF5IHZzIHBsYWluIG9iamVjdFxuXG4gIC8vIEN5Y2xlIGd1YXJkIOKAlCBhIHBhaXIgd2UgYXJlIGFscmVhZHkgaW5zaWRlIGlzIGVxdWFsIGJ5IGFzc3VtcHRpb24uXG4gIHNlZW4gPz89IG5ldyBXZWFrTWFwKCk7XG4gIGxldCBwYXJ0bmVycyA9IHNlZW4uZ2V0KGEpO1xuICBpZiAocGFydG5lcnM/LmhhcyhiKSkgcmV0dXJuIHRydWU7XG4gIGlmICghcGFydG5lcnMpIHNlZW4uc2V0KGEsIChwYXJ0bmVycyA9IG5ldyBXZWFrU2V0KCkpKTtcbiAgcGFydG5lcnMuYWRkKGIpO1xuXG4gIGlmIChhS2luZCA9PT0gJ21hcCcpIHJldHVybiBlcXVhbE1hcHMoYSwgYiwgc2Vlbik7XG4gIGlmIChhS2luZCA9PT0gJ3NldCcpIHJldHVybiBlcXVhbFNldHMoYSwgYiwgc2Vlbik7XG5cbiAgaWYgKGFJc0FycmF5KSB7XG4gICAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCFlcXVhbFBhaXJzKGFbaV0sIGJbaV0sIHNlZW4pKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gT2JqZWN0czogb25seSBrZXlzIHRoYXQgSE9MRCBhIHZhbHVlIHRha2UgcGFydCDigJQgYW4gb3duIGB1bmRlZmluZWRgIGlzIGFcbiAgLy8gZGVsZXRlZCBrZXksIHRoZSBzYW1lIHN0YXRlIGFzIGFuIGFic2VudCBvbmUgKHNlZSB0aGUgY29udHJhY3QgYWJvdmUpLlxuICBsZXQgYUhlbGQgPSAwO1xuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhhKSkge1xuICAgIGlmIChhW2tleV0gPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgYUhlbGQrKztcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBrZXkpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCFlcXVhbFBhaXJzKGFba2V5XSwgYltrZXldLCBzZWVuKSkgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGxldCBiSGVsZCA9IDA7XG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGIpKSBpZiAoYltrZXldICE9PSB1bmRlZmluZWQpIGJIZWxkKys7XG4gIHJldHVybiBhSGVsZCA9PT0gYkhlbGQ7XG59XG5cbi8qKiBUaGUgdHlwZWQgc3RhdGUgdmFsdWVzIGBzdHJ1Y3R1cmVkQ2xvbmVgIGtlZXBzIGFuZCBhIGtleSB3YWxrIGNhbm5vdCBzZWUuICovXG5mdW5jdGlvbiB0eXBlZEtpbmQodmFsdWU6IG9iamVjdCk6ICdkYXRlJyB8ICdtYXAnIHwgJ3NldCcgfCB1bmRlZmluZWQge1xuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSByZXR1cm4gJ2RhdGUnO1xuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBNYXApIHJldHVybiAnbWFwJztcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU2V0KSByZXR1cm4gJ3NldCc7XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGVxdWFsTWFwcyhhOiBNYXA8dW5rbm93biwgdW5rbm93bj4sIGI6IE1hcDx1bmtub3duLCB1bmtub3duPiwgc2VlbjogU2VlblBhaXJzKTogYm9vbGVhbiB7XG4gIGlmIChhLnNpemUgIT09IGIuc2l6ZSkgcmV0dXJuIGZhbHNlO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBhKSB7XG4gICAgaWYgKCFiLmhhcyhrZXkpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCFlcXVhbFBhaXJzKHZhbHVlLCBiLmdldChrZXkpLCBzZWVuKSkgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIE9yZGVyLWluc2Vuc2l0aXZlLCBkZWVwIHBlciBtZW1iZXIuIFF1YWRyYXRpYyBpbiB0aGUgd29yc3QgY2FzZSBmb3Igc2V0cyBvZlxuICogb2JqZWN0cyDigJQgYSBzZXQgb2YgcHJpbWl0aXZlcyAodGhlIGNvbW1vbiBzaGFwZSkgaXMgb25lIGBoYXNgIHBlciBtZW1iZXIuXG4gKi9cbmZ1bmN0aW9uIGVxdWFsU2V0cyhhOiBTZXQ8dW5rbm93bj4sIGI6IFNldDx1bmtub3duPiwgc2VlbjogU2VlblBhaXJzKTogYm9vbGVhbiB7XG4gIGlmIChhLnNpemUgIT09IGIuc2l6ZSkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCB1bm1hdGNoZWQgPSBbLi4uYl07XG4gIGZvciAoY29uc3QgbWVtYmVyIG9mIGEpIHtcbiAgICAvLyBTYW1lVmFsdWVaZXJvIGZpcnN0IOKAlCBwcmltaXRpdmVzIGFuZCBzaGFyZWQgcmVmZXJlbmNlcywgb25lIGBoYXNgLlxuICAgIC8vIEVhY2ggbWF0Y2ggcmV0aXJlcyBpdHMgc2xvdCBzbyB0d28gc3RydWN0dXJhbGx5LWVxdWFsIG1lbWJlcnMgb2YgYGFgXG4gICAgLy8gY2Fubm90IGJvdGggY2xhaW0gdGhlIHNhbWUgbWVtYmVyIG9mIGBiYC5cbiAgICBjb25zdCBhdCA9IHVubWF0Y2hlZC5pbmRleE9mKG1lbWJlcik7XG4gICAgY29uc3QgZm91bmQgPSBhdCA+PSAwID8gYXQgOiB1bm1hdGNoZWQuZmluZEluZGV4KChjYW5kaWRhdGUpID0+IGVxdWFsUGFpcnMobWVtYmVyLCBjYW5kaWRhdGUsIHNlZW4pKTtcbiAgICBpZiAoZm91bmQgPCAwKSByZXR1cm4gZmFsc2U7XG4gICAgdW5tYXRjaGVkLnNwbGljZShmb3VuZCwgMSk7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG4iXX0=
|
|
262
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXF1YWxpdHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21lbW9yeS9lcXVhbGl0eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7OztHQU9HO0FBRUgsT0FBTyxFQUFrQixNQUFNLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUVsRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1FRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQUMsQ0FBTSxFQUFFLENBQU0sRUFBRSxTQUFxQixVQUFVO0lBQ3ZFLE9BQU8sVUFBVSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQzdDLENBQUM7QUE0QkQsU0FBUyxVQUFVLENBQUMsQ0FBTSxFQUFFLENBQU0sRUFBRSxJQUEyQixFQUFFLE1BQWtCO0lBQ2pGLElBQUksQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQyxDQUFDLHdDQUF3QztJQUNsRSxJQUFJLE9BQU8sQ0FBQyxLQUFLLE9BQU8sQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ3hDLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSTtRQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLCtCQUErQjtJQUM3RSxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVE7UUFBRSxPQUFPLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsNkJBQTZCO0lBRWhGLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN2QixJQUFJLElBQUksS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDckMsUUFBUSxJQUFJLEVBQUUsQ0FBQztRQUNiLGtEQUFrRDtR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QU0sRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDN0csSUFBSSxLQUFLLEdBQUcsQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQzVCLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGVxdWFsaXR5LnRzIOKAlCBzdHJ1Y3R1cmFsIGVxdWFsaXR5IG9mIGNvbW1pdHRlZC1zdGF0ZSB2YWx1ZXM6IFRIRSBvd25lciBvZlxuICogXCJ3aGF0IGNvdW50cyBhcyBhIGNoYW5nZVwiLiBXaGF0IGBUcmFuc2FjdGlvbkJ1ZmZlcmAncyBuZXQtY2hhbmdlIGZpbHRlciwgdGhlXG4gKiBhZG1pdHRlZCByZWNvcmQncyBjb21wYXJlLCB0aGUgcmVhZCBtb2RlbCdzIHdyaXRlciBydWxlIGFuZCB0aGVcbiAqIGJvcnJvd2VkLW11dGF0aW9uIGd1YXJkIGFsbCBhc2suIEl0cyBvbmUgaW1wb3J0IGlzIHRoZSBjbGFzc2lmaWVyIG9mIHZhbHVlXG4gKiBraW5kcyAoYGNhcHR1cmUvdmFsdWVLaW5kcy50c2AsIGEgbGVhZik7IHJlLWV4cG9ydGVkIGZyb20gYHV0aWxzLnRzYCwgc28gbm9cbiAqIGltcG9ydGVyIG1vdmVkLlxuICovXG5cbmltcG9ydCB7IHR5cGUgVmFsdWVLaW5kLCBraW5kT2YgfSBmcm9tICcuLi9jYXB0dXJlL3ZhbHVlS2luZHMuanMnO1xuXG4vKipcbiAqIFN0cnVjdHVyYWwgZGVlcCBlcXVhbGl0eSBmb3IgY29tbWl0dGVkLXN0YXRlIHZhbHVlcy5cbiAqXG4gKiBVc2VkIGJ5IHtAbGluayBUcmFuc2FjdGlvbkJ1ZmZlcn0gdG8gZGVjaWRlIHdoZXRoZXIgYSBzdGFnZSBhY3R1YWxseSBDSEFOR0VEXG4gKiBhIHBhdGggb3IgbWVyZWx5IHJlLXdyb3RlIC8gcmV2ZXJ0ZWQgaXQgdG8gdGhlIHZhbHVlIGl0IGFscmVhZHkgaGVsZCAoYVxuICogXCJuby1vcCB3cml0ZVwiKSwgYW5kIGJ5IGBib3Jyb3dlZE11dGF0aW9uLmZpcnN0RGlmZmVyaW5nUGF0aGAgdG8gZmluZCB3aGVyZSBhXG4gKiBib3Jyb3dlZCByZWFkIG1vdmVkLiBDb21taXR0ZWQgc3RhdGUgbXVzdCBzdXJ2aXZlIGBzdHJ1Y3R1cmVkQ2xvbmVgLCBzbyB0aGVcbiAqIHZhbHVlcyBpdCBjYW4gaG9sZCBhcmUgdGhlIGtpbmRzIHRoZSBjbG9uZSBrZWVwcywgYW5kIHR3byB2YWx1ZXMgYXJlIGVxdWFsXG4gKiB3aGVuIGEgcmVjb3JkIGhvbGRzIHRoZSBzYW1lIHRoaW5nIGZvciBib3RoLiBFdmVyeSBraW5kIGhhcyBPTkUgYXJtIGJlbG93XG4gKiAoYGVxdWFsUGFpcnNgJyBzd2l0Y2ggb3ZlciBgVmFsdWVLaW5kYCDigJQgYSBraW5kIGFkZGVkIHRvIHRoZSB1bmlvbiBkb2VzIG5vdFxuICogY29tcGlsZSB1bnRpbCBpdCBpcyBjb21wYXJlZCkuIEJlZm9yZSA5LjIyLjAgYSBEYXRlLCBNYXAgb3IgU2V0IHdhcyBjb21wYXJlZFxuICogYXMgYW4gb2JqZWN0IHdpdGggbm8gb3duIGtleXMsIGFuZCB1bnRpbCA5LjQ0LjIgc28gd2VyZSBhIFJlZ0V4cCwgYW4gRXJyb3IsXG4gKiBhIGJveGVkIHByaW1pdGl2ZSwgYW4gQXJyYXlCdWZmZXIsIGEgRGF0YVZpZXcgYW5kIGEgQmxvYjogYW55IHR3byBvZiBhIGtpbmRcbiAqIHdlcmUgXCJlcXVhbFwiLCBzbyBgJHNldFZhbHVlKCdyZScsIC95L2cpYCBvdmVyIGAveC9nYCBjb21taXR0ZWQgbm8gcm93IGFuZFxuICogbGl2ZSBzdGF0ZSBrZXB0IHRoZSBPTEQgdmFsdWUuXG4gKlxuICogU2VtYW50aWNzOlxuICogICAtIHJlZmVyZW5jZSAvIGlkZW50aWNhbC1wcmltaXRpdmUgc2hvcnQtY2lyY3VpdHMgZmlyc3QgKGNoZWFwIGZhc3QgcGF0aClcbiAqICAgLSBgTmFOYCBlcXVhbHMgYE5hTmAgKHByaW1pdGl2ZSBjb21wYXJlIGZhbGxzIGJhY2sgdG8gYE9iamVjdC5pc2ApXG4gKiAgIC0gdHdvIHZhbHVlcyBvZiBkaWZmZXJlbnQgS0lORFMgYXJlIG5ldmVyIGVxdWFsIChhIGBEYXRlYCBpcyBuZXZlciBge31gLFxuICogICAgIGFuIGFycmF5IG5ldmVyIGB7IDA6IOKApiB9YClcbiAqICAgLSBgRGF0ZWA6IHNhbWUgYGdldFRpbWUoKWAgKHR3byBpbnZhbGlkIGRhdGVzIGFyZSBlcXVhbClcbiAqICAgLSBgUmVnRXhwYDogc2FtZSBgc291cmNlYCBhbmQgYGZsYWdzYCAodGhlIGNsb25lIHJlc2V0cyBgbGFzdEluZGV4YClcbiAqICAgLSBgRXJyb3JgOiB0aGUgc2FtZSByZXN0b3JlZCBraW5kIChvbmUgb2YgdGhlIHNpeCBidWlsdC1pbiBlcnJvciBuYW1lcyxcbiAqICAgICBlbHNlIGBFcnJvcmApLCBvd24gYG1lc3NhZ2VgLCBgc3RhY2tgIGFuZCBvd24gYGNhdXNlYCAoZGVlcCkg4oCUIHdoYXQgdGhlXG4gKiAgICAgY2xvbmUga2VlcHM7IGFueSBvdGhlciBvd24gZmllbGQgaXMgZHJvcHBlZCBieSBpdCwgc28gaXQgbmV2ZXIgY291bnRzXG4gKiAgICAgKHRoZSBhZG1pdHRlZCByZWNvcmQncyBsYXcpXG4gKiAgIC0gYSBib3hlZCBwcmltaXRpdmU6IHRoZSBzYW1lIHdyYXBwZXIgdHlwZSBhbmQgdGhlIHNhbWUgcHJpbWl0aXZlIGluc2lkZVxuICogICAtIGFuIGBBcnJheUJ1ZmZlcmA6IGxlbmd0aCwgcmVzaXphYmlsaXR5IGFuZCBieXRlczsgYSB0eXBlZCBhcnJheSBvciBhXG4gKiAgICAgYERhdGFWaWV3YDogaXRzIHR5cGUgYW5kIHRoZSBieXRlcyBJVCB2aWV3cyDigJQgbmV2ZXIgdGhlIHJlc3Qgb2YgaXRzXG4gKiAgICAgYnVmZmVyIChhIE5vZGUgYEJ1ZmZlcmAgdmlld3MgYSBzbGljZSBvZiBhIHNoYXJlZCBwb29sLCBhbmQgdGhlIHJlY29yZFxuICogICAgIGtlZXBzIHRoZSB2aWV3J3MgYnl0ZXMgb25seTogYGNhcHR1cmUvZnJlZXplLnRzIMK3IGZyZWV6ZVJlY29yZGApXG4gKiAgIC0gYE1hcGA6IHNhbWUgc2l6ZSBBTkQsIHBlciBrZXkgb2YgYGFgLCBgYmAgaG9sZHMgYSBkZWVwLWVxdWFsIHZhbHVlIOKAlFxuICogICAgIGtleXMgYnkgYE1hcGAgaWRlbnRpdHkgKGBTYW1lVmFsdWVaZXJvYCksIHZhbHVlcyBkZWVwXG4gKiAgIC0gYFNldGA6IHNhbWUgc2l6ZSBBTkQgZXZlcnkgbWVtYmVyIG9mIGBhYCBpcyBkZWVwLWVxdWFsIHRvIFNPTUUgbWVtYmVyXG4gKiAgICAgb2YgYGJgIChvcmRlci1pbnNlbnNpdGl2ZSDigJQgYSBTZXQgaGFzIG5vIG9yZGVyIHRvIGNvbXBhcmUgYnkpXG4gKiAgIC0gYW4gT1BBUVVFIHZhbHVlIChhIEJsb2IsIGEgYERPTUV4Y2VwdGlvbmAg4oCUIGNvbnRlbnQgdGhpcyBsaWJyYXJ5IGNhbm5vdFxuICogICAgIHJlYWQpOiBieSB0aGUgY2FsbGVyJ3Mge0BsaW5rIE9wYXF1ZVJ1bGV9IOKAlCBlcXVhbCBvbmx5IHRvIGl0c2VsZiBieVxuICogICAgIGRlZmF1bHQgKHJlcGxhY2luZyBvbmUgaXMgYWx3YXlzIGEgY2hhbmdlKSwgb3IsIHdoZW4gYm90aCBzaWRlcyBhcmVcbiAqICAgICBjb3BpZXMgb2Ygb25lIHJlY29yZCwgZXF1YWwgdG8gYW55IG90aGVyIG9mIGl0cyBraW5kXG4gKiAgIC0gYXJyYXlzOiBlcXVhbCBsZW5ndGggQU5EIGRlZXAtZXF1YWwgZWxlbWVudC13aXNlIChvcmRlci1zZW5zaXRpdmU7IGFuXG4gKiAgICAgYXJyYXkncyBleHBhbmRvIGtleXMgYXJlIG91dCBvZiBjb250cmFjdCBhbmQgbm90IGNvbXBhcmVkKVxuICogICAtIG9iamVjdHM6IGlkZW50aWNhbCBzZXQgb2Yga2V5cyB0aGF0IEhPTEQgYSB2YWx1ZSBBTkQgZGVlcC1lcXVhbCBwZXIga2V5LlxuICogICAgIEFuIG93biBrZXkgd2hvc2UgdmFsdWUgaXMgYHVuZGVmaW5lZGAgY291bnRzIGFzIEFCU0VOVDogaXQgaXMgdGhpc1xuICogICAgIGxpYnJhcnkncyBvdGhlciBzcGVsbGluZyBvZiBhIGRlbGV0ZWQga2V5IChgJ2Z1bGwnYCBtb2RlIGZsYXR0ZW5zXG4gKiAgICAgYGRlbGV0ZWAgaW50byBga2V5OiB1bmRlZmluZWRgOyBgJ2RlbHRhJ2AgbW9kZSdzIGBkZWxldGVgIHZlcmIgcmVtb3Zlc1xuICogICAgIHRoZSBrZXkpLCBhbmQgZXZlcnkgY29uc3VtZXIg4oCUIEpTT04sIHRoZSBmb2xkLCBgY29tbWl0VmFsdWVBdGAsIHRoZVxuICogICAgIG1pcnJvciDigJQgcmVhZHMgdGhlIHR3byBzcGVsbGluZ3MgYXMgb25lIHN0YXRlLiBTbyBtdXN0IHRoZSBuZXQtY2hhbmdlXG4gKiAgICAgZmlsdGVyICg5LjE5LjEpOiBge31gIGFuZCBgeyBrOiB1bmRlZmluZWQgfWAgYXJlIG5vdCBhIGNoYW5nZS4gQXJyYXlzXG4gKiAgICAgYXJlIHVudG91Y2hlZCDigJQgYSBzbG90IGhvbGRpbmcgYHVuZGVmaW5lZGAgaXMgc3RpbGwgYSBzbG90LlxuICpcbiAqIENvc3QgJiBzYWZldHk6XG4gKiAgIC0gQWxsb2NhdGVzIG9ubHkgdHJhbnNpZW50IGBPYmplY3Qua2V5c2AgYXJyYXlzLCBhbiBlcnJvcidzIHByb3BlcnR5XG4gKiAgICAgZGVzY3JpcHRvcnMgYW5kIGEgYnl0ZSB2aWV3IHBlciBjb21wYXJlZCBidWZmZXIg4oCUIG5vIGNsb25lcyAoYnV0IG9uZVxuICogICAgIHByb2JlIGNsb25lIHBlciBjbGFzcyBwcm90b3R5cGUsIHJlbWVtYmVyZWQ6IGBjYXB0dXJlL3ZhbHVlS2luZHMudHMgwrdcbiAqICAgICBraW5kT2ZgKS4gSXQgaXMgc3RyaWN0bHkgY2hlYXBlciB0aGFuIHRoZSBgc3RydWN0dXJlZENsb25lYCB0aGUgY29tbWl0XG4gKiAgICAgYWxyZWFkeSBwZXJmb3Jtcy5cbiAqICAgLSBQcmltaXRpdmUgY29tcGFyaXNvbnMgKHRoZSBidWxrIG9mIHN0YXRlKSBhcmUgTygxKSB2aWEgdGhlIGA9PT1gIC9cbiAqICAgICBgT2JqZWN0LmlzYCBmYXN0IHBhdGhzOyBvbmx5IG5lc3RlZCBvYmplY3RzL2FycmF5cyBpbmN1ciBhIHdhbGssIGJvdW5kZWRcbiAqICAgICBieSB0aGUgdmFsdWUncyBvd24gc2l6ZS5cbiAqICAgLSBUZXJtaW5hdGVzIG9uIENZQ0xJQyB2YWx1ZXMgKDkuMTguMSk6IGEgc3RhdGUgdmFsdWUgbXVzdCBzdXJ2aXZlXG4gKiAgICAgYHN0cnVjdHVyZWRDbG9uZWAsIGFuZCBgc3RydWN0dXJlZENsb25lYCBwcmVzZXJ2ZXMgY3ljbGVzIOKAlCBzbyBhXG4gKiAgICAgc2VsZi1yZWZlcmVuY2luZyB2YWx1ZSBpcyBhIGxlZ2FsIHZhbHVlLCBub3QgYW4gb3V0LW9mLWNvbnRyYWN0IG9uZS4gQVxuICogICAgIHBhaXIgb2Ygb2JqZWN0cyBhbHJlYWR5IHVuZGVyIGNvbXBhcmlzb24gaXMgdHJlYXRlZCBhcyBlcXVhbCAodGhlXG4gKiAgICAgc3RydWN0dXJhbCBhbnN3ZXIsIGxvZGFzaCBgaXNFcXVhbGAgc2VtYW50aWNzKTsgYWN5Y2xpYyBpbnB1dHMgc2VlIG5vXG4gKiAgICAgY2hhbmdlLiBEZXYgbW9kZSBzdGlsbCB3YXJucyBhYm91dCBjeWNsZXMgYXQgd3JpdGUgdGltZVxuICogICAgIChgU2NvcGVGYWNhZGUuc2V0VmFsdWVgKSBiZWNhdXNlIHRoZXkgc3VycHJpc2UgbmFycmF0aXZlIGFuZCBKU09OLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVlcEVxdWFsKGE6IGFueSwgYjogYW55LCBvcGFxdWU6IE9wYXF1ZVJ1bGUgPSAnaWRlbnRpdHknKTogYm9vbGVhbiB7XG4gIHJldHVybiBlcXVhbFBhaXJzKGEsIGIsIHVuZGVmaW5lZCwgb3BhcXVlKTtcbn1cblxuLyoqXG4gKiBIb3cge0BsaW5rIGRlZXBFcXVhbH0gY29tcGFyZXMgdHdvIE9QQVFVRSB2YWx1ZXMgKGEgQmxvYiwgYSBgRE9NRXhjZXB0aW9uYCDigJRcbiAqIGNvbnRlbnQgdGhpcyBsaWJyYXJ5IGNhbm5vdCByZWFkKTpcbiAqXG4gKiAgIC0gYCdpZGVudGl0eSdgICh0aGUgZGVmYXVsdCkg4oCUIGVxdWFsIG9ubHkgdG8gaXRzZWxmLiBUaGUgYW5zd2VyIHdoZW4gb25lXG4gKiAgICAgc2lkZSBpcyBhIHZhbHVlIGEgc3RhZ2UgaGFuZGVkIGluOiB0aGUgbmV0LWNoYW5nZSBmaWx0ZXJcbiAqICAgICAoYFRyYW5zYWN0aW9uQnVmZmVyYCksIHRoZSBhcHBlbmQgY2hlY2sgKGBkZWx0YUVuY29kaW5nYCkuIEEgbmV3IG9iamVjdFxuICogICAgIGlzIGEgY2hhbmdlLCBiZWNhdXNlIG5vdGhpbmcgY2FuIHNheSBpdCBpcyBub3QuXG4gKiAgIC0gYCdjb3BpZXMnYCDigJQgZXF1YWwgdG8gYW55IG90aGVyIG9mIGl0cyBraW5kLiBUaGUgYW5zd2VyIHdoZW4gQk9USCBzaWRlc1xuICogICAgIGFyZSBjb3BpZXMgb2Ygb25lIHJlY29yZGVkIHZhbHVlIOKAlCBhIGZvbGQncyBnZW5lcmF0aW9ucyAoYGxvZ01vZGVsYCxcbiAqICAgICBgZWxlbWVudFByb3ZlbmFuY2VgKSwgYSByZXRhaW5lZCByZWFkIGFnYWluc3QgbGl2ZSBzdGF0ZVxuICogICAgIChgYm9ycm93ZWRNdXRhdGlvbmApLCB0aGUgcmVjb3JkIHJlcGxheWVkIGFnYWluc3QgdGhlIHJlYWQtYmFja1xuICogICAgIChgYWRtaXNzaW9uYCk6IGNvcGllcyBuZXZlciBzaGFyZSBpZGVudGl0eSwgc28gaWRlbnRpdHkgd291bGQgY2FsbCBldmVyeVxuICogICAgIG9wYXF1ZSB2YWx1ZSBjaGFuZ2VkLlxuICovXG5leHBvcnQgdHlwZSBPcGFxdWVSdWxlID0gJ2lkZW50aXR5JyB8ICdjb3BpZXMnO1xuXG4vKipcbiAqIE9iamVjdCBwYWlycyBtZXQgc28gZmFyLCBrZXllZCBgYSDihpIgdGhlIGIncyBpdCBoYXMgYmVlbiBwYWlyZWQgd2l0aGAuIENyZWF0ZWRcbiAqIGxhemlseSBieSB0aGUgZmlyc3Qgb2JqZWN0IHBhaXIsIHNvIHByaW1pdGl2ZSBjb21wYXJlcyBhbGxvY2F0ZSBub3RoaW5nLlxuICogTmV2ZXIgcHJ1bmVkOiBldmVyeSBgZmFsc2VgIHJldHVybnMgc3RyYWlnaHQgdXAgdG8gdGhlIGNhbGxlciAoZWFjaCByZWN1cnNpdmVcbiAqIGNhbGwgc2hvcnQtY2lyY3VpdHMgb24gaXQpLCBzbyBub3RoaW5nIGlzIGxvb2tlZCB1cCBhZnRlciBhIG1pc21hdGNoIOKAlCBhXG4gKiBzdG9yZWQgcGFpciBpcyBlaXRoZXIgc3RpbGwgdW5kZXIgY29tcGFyaXNvbiBvciBhbHJlYWR5IGtub3duIGVxdWFsLlxuICovXG50eXBlIFNlZW5QYWlycyA9IFdlYWtNYXA8b2JqZWN0LCBXZWFrU2V0PG9iamVjdD4+O1xuXG5mdW5jdGlvbiBlcXVhbFBhaXJzKGE6IGFueSwgYjogYW55LCBzZWVuOiBTZWVuUGFpcnMgfCB1bmRlZmluZWQsIG9wYXF1ZTogT3BhcXVlUnVsZSk6IGJvb2xlYW4ge1xuICBpZiAoYSA9PT0gYikgcmV0dXJuIHRydWU7IC8vIHNhbWUgcmVmZXJlbmNlIG9yIGlkZW50aWNhbCBwcmltaXRpdmVcbiAgaWYgKHR5cGVvZiBhICE9PSB0eXBlb2YgYikgcmV0dXJuIGZhbHNlO1xuICBpZiAoYSA9PT0gbnVsbCB8fCBiID09PSBudWxsKSByZXR1cm4gYSA9PT0gYjsgLy8gb25lIGlzIG51bGwsIHRoZSBvdGhlciBpc24ndFxuICBpZiAodHlwZW9mIGEgIT09ICdvYmplY3QnKSByZXR1cm4gT2JqZWN0LmlzKGEsIGIpOyAvLyBOYU4tc2FmZSBwcmltaXRpdmUgY29tcGFyZVxuXG4gIGNvbnN0IGtpbmQgPSBraW5kT2YoYSk7XG4gIGlmIChraW5kICE9PSBraW5kT2YoYikpIHJldHVybiBmYWxzZTtcbiAgc3dpdGNoIChraW5kKSB7XG4gICAgLy8gQXRvbXM6IHRoZWlyIGNvbnRlbnQgaXMgYSBzbG90LCBub3QgdGhlaXIga2V5cy5cbiAgICBjYXNlICdkYXRlJzpcbiAgICAgIHJldHVybiBPYmplY3QuaXMoRGF0ZS5wcm90b3R5cGUuZ2V0VGltZS5jYWxsKGEpLCBEYXRlLnByb3RvdHlwZS5nZXRUaW1lLmNhbGwoYikpO1xuICAgIGNhc2UgJ3JlZ2V4cCc6XG4gICAgICByZXR1cm4gYS5zb3VyY2UgPT09IGIuc291cmNlICYmIGEuZmxhZ3MgPT09IGIuZmxhZ3M7XG4gICAgY2FzZSAnYm94ZWQnOlxuICAgICAgcmV0dXJuIHRhZ09mKGEpID09PSB0YWdPZihiKSAmJiBlcXVhbFBhaXJzKGEudmFsdWVPZigpLCBiLnZhbHVlT2YoKSwgc2Vlbiwgb3BhcXVlKTtcbiAgICBjYXNlICdidWZmZXInOlxuICAgICAgcmV0dXJuIGVxdWFsQnVmZmVycyhhLCBiKTtcbiAgICBjYXNlICd2aWV3JzpcbiAgICAgIHJldHVybiBlcXVhbFZpZXdzKGEsIGIpO1xuICAgIGNhc2UgJ29wYXF1ZSc6XG4gICAgICByZXR1cm4gb3BhcXVlID09PSAnY29waWVzJyAmJiB0YWdPZihhKSA9PT0gdGFnT2YoYik7IC8vIGBhID09PSBiYCB3YXMgYW5zd2VyZWQgYWJvdmVcbiAgICBjYXNlICdwbGFpbic6XG4gICAgY2FzZSAnYXJyYXknOlxuICAgIGNhc2UgJ21hcCc6XG4gICAgY2FzZSAnc2V0JzpcbiAgICBjYXNlICdlcnJvcic6XG4gICAgICByZXR1cm4gZXF1YWxDb250YWluZXJzKGEsIGIsIGtpbmQsIHNlZW4sIG9wYXF1ZSk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB1bmtub3duS2luZChraW5kKTtcbiAgfVxufVxuXG4vKiogVGhlIGtpbmRzIHdob3NlIGNvbnRlbnQgaXMgb3RoZXIgdmFsdWVzOiBjb21wYXJlZCBwYXJ0IGJ5IHBhcnQsIHVuZGVyIHRoZSBjeWNsZSBndWFyZC4gKi9cbmZ1bmN0aW9uIGVxdWFsQ29udGFpbmVycyhhOiBhbnksIGI6IGFueSwga2luZDogVmFsdWVLaW5kLCBzZWVuOiBTZWVuUGFpcnMgfCB1bmRlZmluZWQsIG9wYXF1ZTogT3BhcXVlUnVsZSk6IGJvb2xlYW4ge1xuICAvLyBDeWNsZSBndWFyZCDigJQgYSBwYWlyIHdlIGFyZSBhbHJlYWR5IGluc2lkZSBpcyBlcXVhbCBieSBhc3N1bXB0aW9uLlxuICBzZWVuID8/PSBuZXcgV2Vha01hcCgpO1xuICBsZXQgcGFydG5lcnMgPSBzZWVuLmdldChhKTtcbiAgaWYgKHBhcnRuZXJzPy5oYXMoYikpIHJldHVybiB0cnVlO1xuICBpZiAoIXBhcnRuZXJzKSBzZWVuLnNldChhLCAocGFydG5lcnMgPSBuZXcgV2Vha1NldCgpKSk7XG4gIHBhcnRuZXJzLmFkZChiKTtcblxuICBpZiAoa2luZCA9PT0gJ21hcCcpIHJldHVybiBlcXVhbE1hcHMoYSwgYiwgc2Vlbiwgb3BhcXVlKTtcbiAgaWYgKGtpbmQgPT09ICdzZXQnKSByZXR1cm4gZXF1YWxTZXRzKGEsIGIsIHNlZW4sIG9wYXF1ZSk7XG4gIGlmIChraW5kID09PSAnZXJyb3InKSByZXR1cm4gZXF1YWxFcnJvcnMoYSwgYiwgc2Vlbiwgb3BhcXVlKTtcbiAgaWYgKGtpbmQgPT09ICdhcnJheScpIHtcbiAgICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIWVxdWFsUGFpcnMoYVtpXSwgYltpXSwgc2Vlbiwgb3BhcXVlKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIE9iamVjdHM6IG9ubHkga2V5cyB0aGF0IEhPTEQgYSB2YWx1ZSB0YWtlIHBhcnQg4oCUIGFuIG93biBgdW5kZWZpbmVkYCBpcyBhXG4gIC8vIGRlbGV0ZWQga2V5LCB0aGUgc2FtZSBzdGF0ZSBhcyBhbiBhYnNlbnQgb25lIChzZWUgdGhlIGNvbnRyYWN0IGFib3ZlKS5cbiAgbGV0IGFIZWxkID0gMDtcbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoYSkpIHtcbiAgICBpZiAoYVtrZXldID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgIGFIZWxkKys7XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwga2V5KSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICghZXF1YWxQYWlycyhhW2tleV0sIGJba2V5XSwgc2Vlbiwgb3BhcXVlKSkgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGxldCBiSGVsZCA9IDA7XG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGIpKSBpZiAoYltrZXldICE9PSB1bmRlZmluZWQpIGJIZWxkKys7XG4gIHJldHVybiBhSGVsZCA9PT0gYkhlbGQ7XG59XG5cbmZ1bmN0aW9uIHVua25vd25LaW5kKGtpbmQ6IG5ldmVyKTogbmV2ZXIge1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKGBkZWVwRXF1YWw6IG5vIGNvbXBhcmlzb24gZm9yIHRoZSB2YWx1ZSBraW5kICcke1N0cmluZyhraW5kKX0nYCk7XG59XG5cbi8qKiBgW29iamVjdCBOdW1iZXJdYCwgYFtvYmplY3QgVWludDhBcnJheV1gIOKApiDigJQgdGhlIGJ1aWx0LWluIHR5cGUgYSBib3hlZCB2YWx1ZSBvciBhIHZpZXcgY2Fycmllcy4gKi9cbmZ1bmN0aW9uIHRhZ09mKHZhbHVlOiBvYmplY3QpOiBzdHJpbmcge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKTtcbn1cblxuLyoqIFRoZSBzYW1lIHZpZXcgdHlwZSBvdmVyIHRoZSBzYW1lIGJ5dGVzIOKAlCB0aGUgYnl0ZXMgdGhlIHZpZXcgc2Vlcywgd2hlcmV2ZXIgdGhleSBzaXQgaW4gaXRzIGJ1ZmZlci4gKi9cbmZ1bmN0aW9uIGVxdWFsVmlld3MoYTogQXJyYXlCdWZmZXJWaWV3LCBiOiBBcnJheUJ1ZmZlclZpZXcpOiBib29sZWFuIHtcbiAgaWYgKHRhZ09mKGEpICE9PSB0YWdPZihiKSB8fCBhLmJ5dGVMZW5ndGggIT09IGIuYnl0ZUxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoYS5idWZmZXIgPT09IGIuYnVmZmVyICYmIGEuYnl0ZU9mZnNldCA9PT0gYi5ieXRlT2Zmc2V0KSByZXR1cm4gdHJ1ZTtcbiAgY29uc3QgcCA9IG5ldyBVaW50OEFycmF5KGEuYnVmZmVyLCBhLmJ5dGVPZmZzZXQsIGEuYnl0ZUxlbmd0aCk7XG4gIGNvbnN0IHEgPSBuZXcgVWludDhBcnJheShiLmJ1ZmZlciwgYi5ieXRlT2Zmc2V0LCBiLmJ5dGVMZW5ndGgpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHAubGVuZ3RoOyBpKyspIGlmIChwW2ldICE9PSBxW2ldKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKiogVGhlIHNhbWUgbGVuZ3RoLCByZXNpemFiaWxpdHkgYW5kIGJ5dGVzLiAqL1xuZnVuY3Rpb24gZXF1YWxCdWZmZXJzKGE6IEFycmF5QnVmZmVyTGlrZSwgYjogQXJyYXlCdWZmZXJMaWtlKTogYm9vbGVhbiB7XG4gIGlmIChhID09PSBiKSByZXR1cm4gdHJ1ZTtcbiAgY29uc3QgeCA9IGEgYXMgQXJyYXlCdWZmZXJMaWtlICYgeyByZXNpemFibGU/OiBib29sZWFuOyBtYXhCeXRlTGVuZ3RoPzogbnVtYmVyIH07XG4gIGNvbnN0IHkgPSBiIGFzIHR5cGVvZiB4O1xuICBpZiAoeC5ieXRlTGVuZ3RoICE9PSB5LmJ5dGVMZW5ndGggfHwgeC5yZXNpemFibGUgIT09IHkucmVzaXphYmxlIHx8IHgubWF4Qnl0ZUxlbmd0aCAhPT0geS5tYXhCeXRlTGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IHAgPSBuZXcgVWludDhBcnJheShhKTtcbiAgY29uc3QgcSA9IG5ldyBVaW50OEFycmF5KGIpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHAubGVuZ3RoOyBpKyspIGlmIChwW2ldICE9PSBxW2ldKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKiogVGhlIHNpeCBlcnJvciBuYW1lcyBgc3RydWN0dXJlZENsb25lYCByZXN0b3JlczsgYW55IG90aGVyIG5hbWUgY29tZXMgYmFjayBhbiBgRXJyb3JgLiAqL1xuY29uc3QgRVJST1JfTkFNRVMgPSBuZXcgU2V0KFsnRXZhbEVycm9yJywgJ1JhbmdlRXJyb3InLCAnUmVmZXJlbmNlRXJyb3InLCAnU3ludGF4RXJyb3InLCAnVHlwZUVycm9yJywgJ1VSSUVycm9yJ10pO1xuXG4vKipcbiAqIFR3byBlcnJvcnMgYXMgdGhlIGNsb25lIGtlZXBzIHRoZW06IHRoZSByZXN0b3JlZCBraW5kLCB0aGUgb3duIGBtZXNzYWdlYCxcbiAqIHRoZSBgc3RhY2tgIGFuZCB0aGUgb3duIGBjYXVzZWAgKGRlZXApLiBBbnkgb3RoZXIgb3duIGZpZWxkIGlzIGRyb3BwZWQgYnlcbiAqIHRoZSBjbG9uZSwgc28gaXQgbmV2ZXIgY291bnRzLlxuICovXG5mdW5jdGlvbiBlcXVhbEVycm9ycyhhOiBFcnJvciwgYjogRXJyb3IsIHNlZW46IFNlZW5QYWlycywgb3BhcXVlOiBPcGFxdWVSdWxlKTogYm9vbGVhbiB7XG4gIGlmIChlcnJvcktpbmRPZihhKSAhPT0gZXJyb3JLaW5kT2YoYikgfHwgc3RhY2tPZihhKSAhPT0gc3RhY2tPZihiKSkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBhTWVzc2FnZSA9IG93bkRhdGEoYSwgJ21lc3NhZ2UnKTtcbiAgY29uc3QgYk1lc3NhZ2UgPSBvd25EYXRhKGIsICdtZXNzYWdlJyk7XG4gIGlmIChTdHJpbmcoYU1lc3NhZ2U/LnZhbHVlKSAhPT0gU3RyaW5nKGJNZXNzYWdlPy52YWx1ZSkgfHwgIWFNZXNzYWdlICE9PSAhYk1lc3NhZ2UpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgYUNhdXNlID0gb3duRGF0YShhLCAnY2F1c2UnKTtcbiAgY29uc3QgYkNhdXNlID0gb3duRGF0YShiLCAnY2F1c2UnKTtcbiAgaWYgKCFhQ2F1c2UgfHwgIWJDYXVzZSkgcmV0dXJuICFhQ2F1c2UgPT09ICFiQ2F1c2U7XG4gIHJldHVybiBlcXVhbFBhaXJzKGFDYXVzZS52YWx1ZSwgYkNhdXNlLnZhbHVlLCBzZWVuLCBvcGFxdWUpO1xufVxuXG5mdW5jdGlvbiBlcnJvcktpbmRPZihlcnJvcjogRXJyb3IpOiBzdHJpbmcge1xuICBjb25zdCBuYW1lID0gU3RyaW5nKGVycm9yLm5hbWUpO1xuICByZXR1cm4gRVJST1JfTkFNRVMuaGFzKG5hbWUpID8gbmFtZSA6ICdFcnJvcic7XG59XG5cbmZ1bmN0aW9uIHN0YWNrT2YoZXJyb3I6IEVycm9yKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc3RhY2sgPSBlcnJvci5zdGFjaztcbiAgcmV0dXJuIHR5cGVvZiBzdGFjayA9PT0gJ3N0cmluZycgPyBzdGFjayA6IHVuZGVmaW5lZDtcbn1cblxuLyoqIEFuIG93biBEQVRBIHByb3BlcnR5LCBib3hlZCDigJQgaG93IHRoZSBjbG9uZSByZWFkcyBhbiBlcnJvcidzIGBtZXNzYWdlYCBhbmQgYGNhdXNlYC4gKi9cbmZ1bmN0aW9uIG93bkRhdGEodmFsdWU6IG9iamVjdCwga2V5OiBzdHJpbmcpOiB7IHZhbHVlOiB1bmtub3duIH0gfCB1bmRlZmluZWQge1xuICBjb25zdCBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih2YWx1ZSwga2V5KTtcbiAgcmV0dXJuIGRlc2NyaXB0b3IgIT09IHVuZGVmaW5lZCAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZGVzY3JpcHRvciwgJ3ZhbHVlJylcbiAgICA/IHsgdmFsdWU6IGRlc2NyaXB0b3IudmFsdWUgfVxuICAgIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBlcXVhbE1hcHMoYTogTWFwPHVua25vd24sIHVua25vd24+LCBiOiBNYXA8dW5rbm93biwgdW5rbm93bj4sIHNlZW46IFNlZW5QYWlycywgb3BhcXVlOiBPcGFxdWVSdWxlKTogYm9vbGVhbiB7XG4gIGlmIChhLnNpemUgIT09IGIuc2l6ZSkgcmV0dXJuIGZhbHNlO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBhKSB7XG4gICAgaWYgKCFiLmhhcyhrZXkpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCFlcXVhbFBhaXJzKHZhbHVlLCBiLmdldChrZXkpLCBzZWVuLCBvcGFxdWUpKSByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogT3JkZXItaW5zZW5zaXRpdmUsIGRlZXAgcGVyIG1lbWJlci4gUXVhZHJhdGljIGluIHRoZSB3b3JzdCBjYXNlIGZvciBzZXRzIG9mXG4gKiBvYmplY3RzIOKAlCBhIHNldCBvZiBwcmltaXRpdmVzICh0aGUgY29tbW9uIHNoYXBlKSBpcyBvbmUgYGhhc2AgcGVyIG1lbWJlci5cbiAqL1xuZnVuY3Rpb24gZXF1YWxTZXRzKGE6IFNldDx1bmtub3duPiwgYjogU2V0PHVua25vd24+LCBzZWVuOiBTZWVuUGFpcnMsIG9wYXF1ZTogT3BhcXVlUnVsZSk6IGJvb2xlYW4ge1xuICBpZiAoYS5zaXplICE9PSBiLnNpemUpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgdW5tYXRjaGVkID0gWy4uLmJdO1xuICBmb3IgKGNvbnN0IG1lbWJlciBvZiBhKSB7XG4gICAgLy8gU2FtZVZhbHVlWmVybyBmaXJzdCDigJQgcHJpbWl0aXZlcyBhbmQgc2hhcmVkIHJlZmVyZW5jZXMsIG9uZSBgaGFzYC5cbiAgICAvLyBFYWNoIG1hdGNoIHJldGlyZXMgaXRzIHNsb3Qgc28gdHdvIHN0cnVjdHVyYWxseS1lcXVhbCBtZW1iZXJzIG9mIGBhYFxuICAgIC8vIGNhbm5vdCBib3RoIGNsYWltIHRoZSBzYW1lIG1lbWJlciBvZiBgYmAuXG4gICAgY29uc3QgYXQgPSB1bm1hdGNoZWQuaW5kZXhPZihtZW1iZXIpO1xuICAgIGNvbnN0IGZvdW5kID0gYXQgPj0gMCA/IGF0IDogdW5tYXRjaGVkLmZpbmRJbmRleCgoY2FuZGlkYXRlKSA9PiBlcXVhbFBhaXJzKG1lbWJlciwgY2FuZGlkYXRlLCBzZWVuLCBvcGFxdWUpKTtcbiAgICBpZiAoZm91bmQgPCAwKSByZXR1cm4gZmFsc2U7XG4gICAgdW5tYXRjaGVkLnNwbGljZShmb3VuZCwgMSk7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG4iXX0=
|