footprintjs 9.47.0 → 9.48.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +2 -2
- package/CLAUDE.md +8 -8
- package/dist/esm/lib/builder/FlowChartBuilder.js +5 -4
- package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +1 -1
- package/dist/esm/lib/engine/traversal/FlowchartTraverser.d.ts +1 -1
- package/dist/esm/lib/engine/traversal/FlowchartTraverser.js +4 -3
- package/dist/esm/lib/engine/types.d.ts +1 -1
- package/dist/esm/lib/engine/types.js +1 -1
- package/dist/esm/lib/ids/reservedIds.d.ts +34 -0
- package/dist/esm/lib/ids/reservedIds.js +45 -0
- package/dist/esm/lib/ids/runtimeStageId.d.ts +13 -31
- package/dist/esm/lib/ids/runtimeStageId.js +12 -43
- package/dist/esm/lib/memory/DiagnosticCollector.d.ts +1 -1
- package/dist/esm/lib/memory/DiagnosticCollector.js +1 -1
- package/dist/esm/lib/memory/StageContext.d.ts +2 -1
- package/dist/esm/lib/memory/StageContext.js +1 -1
- package/dist/esm/lib/memory/backtrack.d.ts +3 -2
- package/dist/esm/lib/memory/backtrack.js +4 -10
- package/dist/esm/lib/memory/frameTypes.d.ts +98 -0
- package/dist/esm/lib/memory/frameTypes.js +14 -0
- package/dist/esm/lib/memory/index.d.ts +4 -2
- package/dist/esm/lib/memory/index.js +1 -2
- package/dist/esm/lib/memory/runPolicy.d.ts +2 -1
- package/dist/esm/lib/memory/runPolicy.js +1 -1
- package/dist/esm/lib/memory/types.d.ts +41 -98
- package/dist/esm/lib/memory/types.js +7 -8
- package/dist/esm/lib/runner/ExecutionRuntime.d.ts +2 -1
- package/dist/esm/lib/runner/ExecutionRuntime.js +1 -1
- package/dist/esm/lib/runner/FlowChartExecutor.d.ts +2 -1
- package/dist/esm/lib/runner/FlowChartExecutor.js +1 -1
- package/dist/esm/lib/runner/getSubtreeSnapshot.d.ts +1 -1
- package/dist/esm/lib/runner/getSubtreeSnapshot.js +1 -1
- package/dist/esm/lib/slice/keysReadSources.d.ts +3 -3
- package/dist/esm/lib/slice/keysReadSources.js +3 -4
- package/dist/esm/lib/time-travel/bundles.d.ts +3 -3
- package/dist/esm/lib/time-travel/bundles.js +2 -2
- package/dist/esm/lib/time-travel/commitStops.d.ts +2 -2
- package/dist/esm/lib/time-travel/commitStops.js +1 -1
- package/dist/esm/lib/time-travel/tagStops.js +1 -1
- package/dist/esm/lib/time-travel/types.d.ts +23 -14
- package/dist/esm/lib/time-travel/types.js +9 -9
- package/dist/esm/trace.d.ts +5 -4
- package/dist/esm/trace.js +4 -4
- package/dist/lib/builder/FlowChartBuilder.js +5 -4
- package/dist/lib/engine/traversal/FlowchartTraverser.js +6 -5
- package/dist/lib/engine/types.js +1 -1
- package/dist/lib/ids/reservedIds.js +49 -0
- package/dist/lib/ids/runtimeStageId.js +26 -58
- package/dist/lib/memory/DiagnosticCollector.js +1 -1
- package/dist/lib/memory/StageContext.js +1 -1
- package/dist/lib/memory/backtrack.js +4 -10
- package/dist/lib/memory/frameTypes.js +15 -0
- package/dist/lib/memory/index.js +2 -5
- package/dist/lib/memory/runPolicy.js +1 -1
- package/dist/lib/memory/types.js +6 -11
- package/dist/lib/runner/ExecutionRuntime.js +1 -1
- package/dist/lib/runner/FlowChartExecutor.js +1 -1
- package/dist/lib/runner/getSubtreeSnapshot.js +1 -1
- package/dist/lib/slice/keysReadSources.js +3 -4
- package/dist/lib/time-travel/bundles.js +2 -2
- package/dist/lib/time-travel/commitStops.js +1 -1
- package/dist/lib/time-travel/tagStops.js +1 -1
- package/dist/lib/time-travel/types.js +9 -9
- package/dist/trace.js +32 -32
- package/dist/types/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +1 -1
- package/dist/types/lib/engine/traversal/FlowchartTraverser.d.ts +1 -1
- package/dist/types/lib/engine/types.d.ts +1 -1
- package/dist/types/lib/ids/reservedIds.d.ts +34 -0
- package/dist/types/lib/ids/runtimeStageId.d.ts +13 -31
- package/dist/types/lib/memory/DiagnosticCollector.d.ts +1 -1
- package/dist/types/lib/memory/StageContext.d.ts +2 -1
- package/dist/types/lib/memory/backtrack.d.ts +3 -2
- package/dist/types/lib/memory/frameTypes.d.ts +98 -0
- package/dist/types/lib/memory/index.d.ts +4 -2
- package/dist/types/lib/memory/runPolicy.d.ts +2 -1
- package/dist/types/lib/memory/types.d.ts +41 -98
- package/dist/types/lib/runner/ExecutionRuntime.d.ts +2 -1
- package/dist/types/lib/runner/FlowChartExecutor.d.ts +2 -1
- package/dist/types/lib/runner/getSubtreeSnapshot.d.ts +1 -1
- package/dist/types/lib/slice/keysReadSources.d.ts +3 -3
- package/dist/types/lib/time-travel/bundles.d.ts +3 -3
- package/dist/types/lib/time-travel/commitStops.d.ts +2 -2
- package/dist/types/lib/time-travel/types.d.ts +23 -14
- package/dist/types/trace.d.ts +5 -4
- package/package.json +1 -1
|
@@ -56,7 +56,6 @@
|
|
|
56
56
|
* console.log(formatCausalChain(dag)); // human-readable
|
|
57
57
|
* ```
|
|
58
58
|
*/
|
|
59
|
-
import { isDevMode } from '../devMode.js';
|
|
60
59
|
import { findLastWriter } from './commitLogUtils.js';
|
|
61
60
|
import { queryWork, relation, writesOnlyInside } from './keyPaths.js';
|
|
62
61
|
import { logModel } from './logModel.js';
|
|
@@ -364,16 +363,11 @@ export function causalChain(commitLog, startId, getKeysRead, options) {
|
|
|
364
363
|
}
|
|
365
364
|
}
|
|
366
365
|
}
|
|
367
|
-
// RFC-003 D4 — truncation visibility on the root (absent when complete).
|
|
366
|
+
// RFC-003 D4 — truncation visibility on the root (absent when complete). It is DATA, and only
|
|
367
|
+
// data: a reader reads `root.truncated` (and `formatCausalChain` prints it); the record writes no
|
|
368
|
+
// console line (the dev-mode warning went in C6 — the record imports nothing outside itself).
|
|
368
369
|
if (truncatedByDepth || truncatedByNodes) {
|
|
369
370
|
root.truncated = { byDepth: truncatedByDepth, byNodes: truncatedByNodes };
|
|
370
|
-
if (isDevMode()) {
|
|
371
|
-
// eslint-disable-next-line no-console
|
|
372
|
-
console.warn(`[footprint] causalChain('${startId}') truncated by ` +
|
|
373
|
-
`${[truncatedByDepth && `maxDepth (${maxDepth})`, truncatedByNodes && `maxNodes (${maxNodes})`]
|
|
374
|
-
.filter(Boolean)
|
|
375
|
-
.join(' + ')} — the slice is incomplete. Raise the limits or narrow keysRead.`);
|
|
376
|
-
}
|
|
377
371
|
}
|
|
378
372
|
return root;
|
|
379
373
|
}
|
|
@@ -460,4 +454,4 @@ export function formatCausalChain(root) {
|
|
|
460
454
|
// ── Exported for testing (internal) ────────────────────────────────────
|
|
461
455
|
/** @internal Exposed for testing the strategy selection. */
|
|
462
456
|
export const _REVERSE_INDEX_THRESHOLD = REVERSE_INDEX_THRESHOLD;
|
|
463
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja3RyYWNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvYmFja3RyYWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F5REc7QUFFSCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUVyRCxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN0RSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBK0x6QywwRUFBMEU7QUFFMUU7Ozs7R0FJRztBQUNILE1BQU0sdUJBQXVCLEdBQUcsR0FBRyxDQUFDO0FBUXBDLGtFQUFrRTtBQUNsRSxTQUFTLGdCQUFnQixDQUFDLFNBQXlCO0lBQ2pELE9BQU8sQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLEVBQUUsQ0FBQyxjQUFjLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUN2RSxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILFNBQVMsa0JBQWtCLENBQUMsU0FBeUI7SUFDbkQsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ2xDLE9BQU8sQ0FBQyxHQUFXLEVBQUUsU0FBaUIsRUFBNEIsRUFBRTtRQUNsRSxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ2xELE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDN0MsQ0FBQyxDQUFDO0FBQ0osQ0FBQztB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QUFtQixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxpQ0FBaUMsQ0FDL0csQ0FBQztRQUNKLENBQUM7UUFFRCxLQUFLLE1BQU0sTUFBTSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNsQyxJQUFJLENBQ0YsTUFBTSxFQUNOLE1BQU0sR0FBRyxDQUFDLEVBQ1YsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssTUFBTSxDQUFDLENBQ3BELENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVELElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFFZCxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNuQixNQUFNLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxJQUFJLGtCQUFrQixFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxJQUFJLGtCQUFrQixDQUFDO2FBQ3hHLE1BQU0sQ0FBQyxPQUFPLENBQUM7YUFDZixJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDZCxLQUFLLENBQUMsSUFBSSxDQUFDLHNCQUFzQixNQUFNLDRDQUE0QyxDQUFDLENBQUM7SUFDdkYsQ0FBQztJQUVELE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMxQixDQUFDO0FBRUQsMEVBQTBFO0FBRTFFLDREQUE0RDtBQUM1RCxNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBRyx1QkFBdUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogYmFja3RyYWNrLnRzIOKAlCBCYWNrd2FyZCBjYXVzYWwgY2hhaW4gYW5hbHlzaXMgb24gdGhlIGNvbW1pdCBsb2cuXG4gKlxuICogSW1wbGVtZW50cyAqKmJhY2t3YXJkIHByb2dyYW0gc2xpY2luZyoqIChXZWlzZXIgMTk4NCwgdGhpbi1zbGljZSB2YXJpYW50KTpcbiAqIGdpdmVuIGEgc3RhcnRpbmcgZXhlY3V0aW9uIHN0ZXAsIHdhbGsgYmFja3dhcmRzIHRocm91Z2ggcmVhZOKGkndyaXRlXG4gKiBkZXBlbmRlbmNpZXMgdG8gYnVpbGQgdGhlIGNhdXNhbCBEQUcgdGhhdCBwcm9kdWNlZCB0aGUgZGF0YSBhdCB0aGF0IHN0ZXAuXG4gKlxuICogIyMgQWxnb3JpdGhtXG4gKlxuICogQkZTIG9uIHRoZSBpbXBsaWNpdCBkZXBlbmRlbmN5IGdyYXBoIHdoZXJlIGVkZ2VzIHJ1biBmcm9tIHJlYWRlciDihpIgd3JpdGVyLlxuICpcbiAqIDEuIExvY2F0ZSBzdGFydElkIGluIGNvbW1pdExvZyDihpIgcm9vdCBub2RlXG4gKiAyLiBHZXQga2V5c1JlYWQgZm9yIHJvb3QgdmlhIGBnZXRLZXlzUmVhZGAgY2FsbGJhY2tcbiAqIDMuIEZvciBlYWNoIGtleSByZWFkLCBmaW5kIHdobyBsYXN0IHdyb3RlIGl0IGJlZm9yZSB0aGlzIHN0ZXAg4oaSIHBhcmVudCBjb21taXRcbiAqICAgIChcIndyb3RlXCIgaXMgdGhlIHdyaXRlciBydWxlIG9mIGBrZXlQYXRocy50c2AsIDkuMzMuMDogYSByb3cgb24gdGhlIGtleSwgaW5zaWRlIGl0LCBvclxuICogICAgYXJvdW5kIGl0IHRoYXQgY2hhbmdlZCBpdCDigJQgc28gYSBzdGFnZSB0aGF0IHJlYWQgYGNmZ2AgbGlua3MgdG8gdGhlIHN1YmZsb3cgc2VlZCBvclxuICogICAgbWVyZ2UtYmFjayB0aGF0IHdyb3RlIGBjZmfikJ9iYClcbiAqIDQuIENyZWF0ZSBwYXJlbnQgQ2F1c2FsTm9kZSwgbGluayB0byByb290LnBhcmVudHNcbiAqIDUuIEVucXVldWUgcGFyZW50LiBSZXBlYXQgdW50aWwgcXVldWUgZW1wdHkgb3IgbGltaXRzIGhpdC5cbiAqXG4gKiBPdXRwdXQgaXMgYSAqKkRBRyoqIChub3QgYSBsaW5rZWQgbGlzdCk6IGEgc3RhZ2UgcmVhZGluZyBgY3JlZGl0U2NvcmVgIEFORCBgZHRpYFxuICogZnJvbSBkaWZmZXJlbnQgd3JpdGVycyBoYXMgdHdvIHBhcmVudHMuXG4gKlxuICogIyMgU3RhZ2VkIE9wdGltaXphdGlvblxuICpcbiAqIFR3byB3cml0ZXItbG9va3VwIHN0cmF0ZWdpZXMsIGNob3NlbiBhdXRvbWF0aWNhbGx5IGJ5IGNvbW1pdCBsb2cgc2l6ZTpcbiAqXG4gKiB8IFN0cmF0ZWd5IHwgV2hlbiB8IENvbXBsZXhpdHkgcGVyIGxvb2t1cCB8XG4gKiB8LS0tLS0tLS0tLXwtLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLXxcbiAqIHwgTGluZWFyIHNjYW4gfCBOIOKJpCAyNTYgfCBPKE4pIOKAlCBzaW1wbGUgYmFja3dhcmQgc2NhbiB8XG4gKiB8IFJldmVyc2UgaW5kZXggfCBOID4gMjU2IHwgTyhLIGxvZyBOKSDigJQgcHJlYnVpbHQga2V54oaSW2luZGljZXNdLCBiaW5hcnkgc2VhcmNoIHxcbiAqXG4gKiBUaGUgdGhyZXNob2xkICgyNTYpIGlzIGNob3NlbiBzbyB0aGUgTyhOKSBidWlsZCBjb3N0IG9mIHRoZSByZXZlcnNlIGluZGV4XG4gKiBpcyBhbW9ydGl6ZWQgb3ZlciB0aGUgQkZTIHRyYXZlcnNhbC4gQmVsb3cgMjU2LCBsaW5lYXIgc2NhbiB3aW5zIGJlY2F1c2VcbiAqIHRoZXJlJ3Mgbm8gaW5kZXggYnVpbGQgb3ZlcmhlYWQuIFRoZSBjb25zdW1lciBuZXZlciBzZWVzIHRoaXMg4oCUIGBjYXVzYWxDaGFpbigpYFxuICogcGlja3MgdGhlIHJpZ2h0IHN0cmF0ZWd5IGludGVybmFsbHkgKGxpa2UgYSBxdWVyeSBvcHRpbWl6ZXIgY2hvb3NpbmcgYmV0d2VlblxuICogc2VxdWVudGlhbCBzY2FuIHZzIGluZGV4IHNjYW4gYmFzZWQgb24gdGFibGUgc2l6ZSkuXG4gKlxuICogIyMgQ29tcGxleGl0eVxuICpcbiAqIC0gKipTbWFsbCBsb2dzIChOIOKJpCAyNTYpOioqIE8oViDDlyBLIMOXIE4pIHRvdGFsLiBWPXZpc2l0ZWQsIEs9YXZnIGtleXMvbm9kZS5cbiAqIC0gKipMYXJnZSBsb2dzIChOID4gMjU2KToqKiBPKE4gw5cgVSkgaW5kZXggYnVpbGQgKyBPKFYgw5cgSyDDlyBsb2cgTikgbG9va3Vwcy5cbiAqICAgVSA9IHVuaXF1ZSBrZXlzLiBBbW9ydGl6ZWQgb3ZlciBhbGwgQkZTIGhvcHMuXG4gKlxuICogIyMgUmVmZXJlbmNlc1xuICpcbiAqIC0gV2Vpc2VyLCBNLiAoMTk4NCkuIFwiUHJvZ3JhbSBTbGljaW5nLlwiIElFRUUgVFNFLlxuICogLSBTcmlkaGFyYW4sIE0uIGV0IGFsLiAoMjAwNykuIFwiVGhpbiBTbGljaW5nLlwiIFBMREkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IGNhdXNhbENoYWluLCBmbGF0dGVuQ2F1c2FsREFHLCBmb3JtYXRDYXVzYWxDaGFpbiB9IGZyb20gJ2Zvb3RwcmludGpzL3RyYWNlJztcbiAqXG4gKiBjb25zdCBkYWcgPSBjYXVzYWxDaGFpbihjb21taXRMb2csICdkZWNpZGUjMicsIChpZCkgPT4gcmVjb3JkZXIuZ2V0S2V5c1JlYWQoaWQpKTtcbiAqIGNvbnN0IGZsYXQgPSBmbGF0dGVuQ2F1c2FsREFHKGRhZyk7ICAgICAvLyBCRlMtb3JkZXJlZCBmbGF0IGxpc3RcbiAqIGNvbnNvbGUubG9nKGZvcm1hdENhdXNhbENoYWluKGRhZykpOyAgICAgLy8gaHVtYW4tcmVhZGFibGVcbiAqIGBgYFxuICovXG5cbmltcG9ydCB7IGlzRGV2TW9kZSB9IGZyb20gJy4uL2Rldk1vZGUuanMnO1xuaW1wb3J0IHsgZmluZExhc3RXcml0ZXIgfSBmcm9tICcuL2NvbW1pdExvZ1V0aWxzLmpzJztcbmltcG9ydCB0eXBlIHsgUmVnaXN0ZXJlZENvZGUgfSBmcm9tICcuL2hvbmVzdHkuanMnO1xuaW1wb3J0IHsgcXVlcnlXb3JrLCByZWxhdGlvbiwgd3JpdGVzT25seUluc2lkZSB9IGZyb20gJy4va2V5UGF0aHMuanMnO1xuaW1wb3J0IHsgbG9nTW9kZWwgfSBmcm9tICcuL2xvZ01vZGVsLmpzJztcbmltcG9ydCB0eXBlIHsgQ29tbWl0QnVuZGxlLCBUcmFjZUVudHJ5LCBVbnRyYWNrZWRTb3VyY2UgfSBmcm9tICcuL3R5cGVzLmpzJztcblxuLy8g4pSA4pSAIFR5cGVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKiogQSBzaW5nbGUgbm9kZSBpbiB0aGUgY2F1c2FsIERBRy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2F1c2FsTm9kZSB7XG4gIC8qKiBVbmlxdWUgZXhlY3V0aW9uIHN0ZXAgaWRlbnRpZmllci4gKi9cbiAgcnVudGltZVN0YWdlSWQ6IHN0cmluZztcbiAgLyoqIFN0YWJsZSBzdGFnZSBpZGVudGlmaWVyLiAqL1xuICBzdGFnZUlkOiBzdHJpbmc7XG4gIC8qKiBIdW1hbi1yZWFkYWJsZSBzdGFnZSBuYW1lLiAqL1xuICBzdGFnZU5hbWU6IHN0cmluZztcbiAgLyoqIEtleXMgdGhpcyBzdGFnZSB3cm90ZSAoZnJvbSBpdHMgQ29tbWl0QnVuZGxlLnRyYWNlKS4gKi9cbiAga2V5c1dyaXR0ZW46IHN0cmluZ1tdO1xuICAvKiogVGhlIGtleSB3aG9zZSByZWFk4oaSd3JpdGUgZGVwZW5kZW5jeSBsaW5rZWQgdGhpcyBub2RlIHRvIGl0cyBjaGlsZC4gRW1wdHkgZm9yIHRoZSByb290LiAqL1xuICBsaW5rZWRCeTogc3RyaW5nO1xuICAvKiogQkZTIGRlcHRoIGZyb20gdGhlIHN0YXJ0aW5nIG5vZGUgKDAgPSBzdGFydCkuICovXG4gIGRlcHRoOiBudW1iZXI7XG4gIC8qKlxuICAgKiBQYXJlbnQgbm9kZXMg4oCUIHN0YWdlcyB0aGlzIG5vZGUgZGVwZW5kcyBvbi4gREFHOiBtdWx0aXBsZSBwYXJlbnRzXG4gICAqIHBvc3NpYmxlLiBLRVBUIGZvciBjb21wYXRpYmlsaXR5OyB3aXRoIHRoZSBgY29udHJvbERlcHNgIG9wdGlvblxuICAgKiAoUkZDLTAwMyBEMykgZ292ZXJuaW5nIGRlY2lkZXJzIGFwcGVhciBoZXJlIHRvby4gRm9yIHR5cGVkL2tleWVkL1xuICAgKiB3ZWlnaHRlZCBkZXRhaWwgdXNlIHtAbGluayBwYXJlbnRFZGdlc30uXG4gICAqL1xuICBwYXJlbnRzOiBDYXVzYWxOb2RlW107XG4gIC8qKlxuICAgKiBSRkMtMDAzIEQzIOKAlCBvbmUgZWRnZSBwZXIgZGVwZW5kZW5jeSBMSU5LIChub3QgcGVyIHBhcmVudCk6IGEgbm9kZVxuICAgKiByZWFkaW5nIHR3byBrZXlzIGZyb20gdGhlIHNhbWUgd3JpdGVyIGhhcyBPTkUgZW50cnkgaW4ge0BsaW5rIHBhcmVudHN9XG4gICAqIGJ1dCBUV08gYCdkYXRhJ2AgZWRnZXMgaGVyZS4gQ29udHJvbCBkZXBlbmRlbmNpZXMgKHZpYSB0aGVcbiAgICogYGNvbnRyb2xEZXBzYCBvcHRpb24pIGFkZCBhIGAnY29udHJvbCdgIGVkZ2UgdG8gdGhlIGdvdmVybmluZyBkZWNpZGVyLlxuICAgKi9cbiAgcGFyZW50RWRnZXM6IENhdXNhbEVkZ2VbXTtcbiAgLyoqXG4gICAqIFJGQy0wMDMgRDIgaG9uZXN0eSBtYXJrZXIg4oCUIHN0YW1wZWQgZnJvbSB0aGUgc3RhZ2Unc1xuICAgKiBgQ29tbWl0QnVuZGxlLnVudHJhY2tlZFNvdXJjZXNgLiBQcmVzZW50IHdoZW4gdGhpcyBzdGFnZSBBTFNPIGNvbnN1bWVkXG4gICAqIHVudHJhY2tlZCByZWFkIHBhdGhzIChgYXJnc2AgLyBgZW52YCAvIHVuc2hhZG93ZWQgYHNpbGVudGAgcmVhZHMpOiB0aGVcbiAgICogYmFja3dhcmQgc2xpY2UgdGhyb3VnaCB0aGlzIG5vZGUgbWF5IGJlIGluY29tcGxldGUsIGJlY2F1c2UgdGhvc2UgcmVhZHNcbiAgICogcHJvZHVjZSBubyByZWFk4oaSd3JpdGUgZWRnZSB0byBmb2xsb3cuIGBmb3JtYXRDYXVzYWxDaGFpbmAgcmVuZGVycyB0aGlzXG4gICAqIGFzIGEgYOKaoCDigKYgc2xpY2UgbWF5IGJlIGluY29tcGxldGUgaGVyZWAgbGluZS4gQWJzZW50IHdoZW4gdGhlIHN0YWdlJ3NcbiAgICogcmVhZHMgd2VyZSBmdWxseSB0cmFja2VkLlxuICAgKlxuICAgKiBSZWdpc3RyeSBjb2RlOiBgJ2luY29tcGxldGUtc291cmNlcydgIChgbWVtb3J5L2hvbmVzdHkudHMgwrdcbiAgICogSE9ORVNUWV9DT0RFU2AsIHNlcnZlZCBvbiBgZm9vdHByaW50anMvdHJhY2VgKSBzYXlzIHdoYXQgdGhpcyBmaWVsZFxuICAgKiBtZWFucy4gVGhlIGZpZWxkIGNhcnJpZXMgbm8gYGNvZGVgIOKAlCBpdHMgdmFsdWVzIGFyZSB0aGVcbiAgICoge0BsaW5rIFVudHJhY2tlZFNvdXJjZX1zLlxuICAgKi9cbiAgaW5jb21wbGV0ZVNvdXJjZXM/OiBSZWFkb25seUFycmF5PFVudHJhY2tlZFNvdXJjZT47XG4gIC8qKlxuICAgKiBSRkMtMDAzIEQ0IHRydW5jYXRpb24gdmlzaWJpbGl0eSDigJQgc2V0IG9uIHRoZSBST09UIG5vZGUgb25seSwgYW5kIG9ubHlcbiAgICogd2hlbiBhIGxpbWl0IGFjdHVhbGx5IGN1dCB0aGUgc2xpY2U6IGBieURlcHRoYCB3aGVuIGEgbm9kZSBhdCB0aGVcbiAgICogYG1heERlcHRoYCBob3Jpem9uIHN0aWxsIGhhZCBlZGdlcyB0byBleHBhbmQsIGBieU5vZGVzYCB3aGVuIHRoZVxuICAgKiBgbWF4Tm9kZXNgIGJ1ZGdldCBibG9ja2VkIGNyZWF0aW5nIGEgZGlzY292ZXJlZCBwYXJlbnQuIEFic2VudCB3aGVuIHRoZVxuICAgKiBzbGljZSBpcyBjb21wbGV0ZS4gRGV2IG1vZGUgKGBlbmFibGVEZXZNb2RlKClgKSBhbHNvIHdhcm5zIG9uXG4gICAqIHRydW5jYXRpb24sIGFuZCBgZm9ybWF0Q2F1c2FsQ2hhaW5gIGFwcGVuZHMgYSBg4pqgIHNsaWNlIHRydW5jYXRlZCDigKZgXG4gICAqIGxpbmUg4oCUIGEgY29uc3VtZXIgbXVzdCBuZXZlciBtaXN0YWtlIGEgdHJ1bmNhdGVkIHNsaWNlIGZvciBhIGZ1bGwgb25lLlxuICAgKlxuICAgKiBSZWdpc3RyeSBjb2RlOiBgJ3RydW5jYXRlZCdgIChgbWVtb3J5L2hvbmVzdHkudHMgwrcgSE9ORVNUWV9DT0RFU2AsIHNlcnZlZFxuICAgKiBvbiBgZm9vdHByaW50anMvdHJhY2VgKSBzYXlzIHdoYXQgdGhpcyBmaWVsZCBtZWFuczsgdGhlIGZpZWxkIGNhcnJpZXMgbm9cbiAgICogYGNvZGVgLlxuICAgKi9cbiAgdHJ1bmNhdGVkPzogeyBieURlcHRoOiBib29sZWFuOyBieU5vZGVzOiBib29sZWFuIH07XG4gIC8qKlxuICAgKiBGNGIgKDkuMzMuMCkg4oCUIHRoZSBrZXlzIHRoaXMgbm9kZSByZWFkIHRoYXQgTk8gY29tbWl0IGJlZm9yZSBpdCB3cm90ZSAodW5kZXIgdGhlIHdyaXRlciBydWxlKSwgc28gdGhlXG4gICAqIHdhbGsgaGFzIG5vIGVkZ2UgdG8gZm9sbG93IGZvciB0aGVtOiB0aGVpciB2YWx1ZSBjYW1lIGZyb20gdGhlIGluaXRpYWwgc3RhdGUsIGZyb3plbiBydW4gaW5wdXQgb3IgYVxuICAgKiBjbG9zdXJlIOKAlCBvdXRzaWRlIHRoZSBjb21taXQgbG9nLiBUaGUgY29kZSBzYXlzIHNvIChgJ3ByZS1ydW4tb3JpZ2luJ2AsIHJlZ2lzdGVyZWQgaW5cbiAgICogYG1lbW9yeS9ob25lc3R5LnRzIMK3IEhPTkVTVFlfQ09ERVNgKTsgYGtleXNgIGFyZSBpbiB0aGUgb3JkZXIgdGhlIHdhbGsgbWV0IHRoZW0uIEFCU0VOVCB3aGVuIGV2ZXJ5IGtleVxuICAgKiB0aGUgbm9kZSBleHBhbmRlZCBoYWQgYSB3cml0ZXIsIHNvIHN1Y2ggYSBub2RlIGtlZXBzIGl0cyA5LjMyLjAgc2hhcGUuIEJlZm9yZSA5LjMzLjAgdGhlc2UgcmVhZHMgd2VyZVxuICAgKiBkcm9wcGVkIHdpdGhvdXQgYSB3b3JkLlxuICAgKi9cbiAgcHJlUnVuUmVhZHM/OiB7IGNvZGU6IFJlZ2lzdGVyZWRDb2RlPCdwcmUtcnVuLW9yaWdpbic+OyBrZXlzOiBzdHJpbmdbXSB9O1xufVxuXG4vKipcbiAqIFJGQy0wMDMgRDMg4oCUIGEgdHlwZWQgZGVwZW5kZW5jeSBlZGdlIGZyb20gYSBjaGlsZCBub2RlIHRvIG9uZSBwYXJlbnQuXG4gKlxuICogLSBga2luZDogJ2RhdGEnYCAgICDigJQgcmVhZOKGkndyaXRlIGRlcGVuZGVuY3k7IGBrZXlgIGlzIHRoZSBzdGF0ZSBrZXkuXG4gKiAtIGBraW5kOiAnY29udHJvbCdgIOKAlCB0aGUgcGFyZW50IGlzIHRoZSBkZWNpZGVyL3NlbGVjdG9yIHdob3NlIGRlY2lzaW9uXG4gKiAgIGFsbG93ZWQgdGhlIGNoaWxkIHRvIHJ1bjsgYGtleWAgaXMgdGhlIGRlY2lkZSgpIHJ1bGUgbGFiZWwgd2hlbiBwcmVzZW50LlxuICpcbiAqIGB3ZWlnaHRgIGRlZmF1bHRzIHRvIDEuMDsgdGhlIGB3ZWlnaGAgaG9vayAoUkZDLTAwMyBENCkgY2FuIG92ZXJyaWRlIGl0LlxuICogVGhlIGVuZ2luZSBpdHNlbGYgTkVWRVIgY29tcHV0ZXMgd2VpZ2h0cyDigJQgc2VtYW50aWNzIGJlbG9uZyB0byB0aGVcbiAqIGNvbnN1bWVyLWluamVjdGVkIHdlaWdoZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2F1c2FsRWRnZSB7XG4gIHBhcmVudDogQ2F1c2FsTm9kZTtcbiAga2luZDogJ2RhdGEnIHwgJ2NvbnRyb2wnO1xuICBrZXk/OiBzdHJpbmc7XG4gIHdlaWdodDogbnVtYmVyO1xuICAvKipcbiAgICogRjRiICg5LjMzLjApIOKAlCBwcmVzZW50IG9ubHkgb24gYSBgJ2RhdGEnYCBlZGdlIHdob3NlIHBhcmVudCB3cm90ZSBga2V5YCBPTkxZIHRocm91Z2ggcm93cyBpbnNpZGUgaXRcbiAgICogKGEgc3ViZmxvdydzIGlucHV0IHNlZWQsIGFuIG91dHB1dE1hcHBlciBtZXJnZS1iYWNrLCBhIGZvcmsgY2hpbGQncyBuYW1lc3BhY2UpOiB0aGF0IHdyaXRlIG1hZGUgcGFydFxuICAgKiBvZiB0aGUgdmFsdWUsIGFuZCBlYXJsaWVyIHdyaXRlcnMgbWF5IGFjY291bnQgZm9yIHRoZSByZXN0LiBSZWdpc3RlcmVkIGFzIGAnbmVzdGVkLXJvd3MnYCBpblxuICAgKiBgbWVtb3J5L2hvbmVzdHkudHMgwrcgSE9ORVNUWV9DT0RFU2AuIEFic2VudCBmb3IgYSB3cml0ZSBvbiBvciBhcm91bmQgdGhlIGtleSwgc28gYW4gZXhhY3QgZWRnZSBrZWVwc1xuICAgKiBpdHMgOS4zMi4wIHNoYXBlLlxuICAgKi9cbiAgYmFzaXM/OiBSZWdpc3RlcmVkQ29kZTwnbmVzdGVkLXJvd3MnPjtcbn1cblxuLyoqXG4gKiBSRkMtMDAzIEQzIOKAlCBhIGNvbnRyb2wgZGVwZW5kZW5jeSByZXNvbHZlZCBmb3Igb25lIGV4ZWN1dGlvbiBzdGVwOlxuICogd2hpY2ggZGVjaWRlci9zZWxlY3RvciBleGVjdXRpb24gYWxsb3dlZCB0aGlzIHN0YWdlIHRvIHJ1bi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb250cm9sRGVwZW5kZW5jeSB7XG4gIC8qKiBydW50aW1lU3RhZ2VJZCBvZiB0aGUgZ292ZXJuaW5nIGRlY2lkZXIvc2VsZWN0b3IgZXhlY3V0aW9uIHN0ZXAuICovXG4gIGRlY2lkZXJJZDogc3RyaW5nO1xuICAvKiogVGhlIGRlY2lkZSgpIHJ1bGUgbGFiZWwgZm9yIHRoZSBjaG9zZW4gYnJhbmNoLCB3aGVuIHByZXNlbnQuICovXG4gIGxhYmVsPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJGQy0wMDMgRDMg4oCUIGNhbGxiYWNrIHJlc29sdmluZyB0aGUgZ292ZXJuaW5nIGRlY2lkZXIgZm9yIGFuIGV4ZWN1dGlvblxuICogc3RlcC4gUmV0dXJuIGB1bmRlZmluZWRgIHdoZW4gdGhlIHN0ZXAgaXMgbm90IGNvbnRyb2wtZGVwZW5kZW50IG9uIGFueVxuICogcmVjb3JkZWQgZGVjaXNpb24uIEJ1aWxkIG9uZSB3aXRoIGBjb250cm9sRGVwUmVjb3JkZXIoKWAgZnJvbVxuICogYGZvb3RwcmludGpzL3RyYWNlYCwgb3Igc3VwcGx5IHlvdXIgb3duLlxuICovXG5leHBvcnQgdHlwZSBDb250cm9sRGVwTG9va3VwID0gKHJ1bnRpbWVTdGFnZUlkOiBzdHJpbmcpID0+IENvbnRyb2xEZXBlbmRlbmN5IHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIFJGQy0wMDMgRDQg4oCUIGNvbnN1bWVyLWluamVjdGVkIGVkZ2Ugd2VpZ2hlci4gQ2FsbGVkIG9uY2UgcGVyIGNyZWF0ZWRcbiAqIGVkZ2U7IHJldHVybiBhIHdlaWdodCwgb3IgYHVuZGVmaW5lZGAgdG8ga2VlcCB0aGUgZGVmYXVsdCAxLjAuIFRoZVxuICogRU5HSU5FIG5ldmVyIGNvbXB1dGVzIHdlaWdodHMgKHplcm8gbmV3IGRlcGVuZGVuY2llcyDigJQgc2VtYW50aWNzIGxpa2VcbiAqIGVtYmVkZGluZyBzaW1pbGFyaXR5IG9yIEZETCBpbmZsdWVuY2UgYmVsb25nIHRvIGRvd25zdHJlYW0gbGlicmFyaWVzLFxuICogdGhlIHNhbWUgcGx1Zy1pbiBwYXR0ZXJuIGFzIGBOYXJyYXRpdmVGb3JtYXR0ZXJgKS4gV2VpZ2h0cyByZW5kZXIgaW5cbiAqIGBmb3JtYXRDYXVzYWxDaGFpbmAgYXMgYOKGkCB2aWEgc3lzdGVtUHJvbXB0ICgwLjE4KWAuXG4gKi9cbmV4cG9ydCB0eXBlIEVkZ2VXZWlnaGVyID0gKFxuICBjaGlsZDogQ2F1c2FsTm9kZSxcbiAgcGFyZW50OiBDYXVzYWxOb2RlLFxuICBrZXk6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAga2luZDogJ2RhdGEnIHwgJ2NvbnRyb2wnLFxuKSA9PiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbi8qKiBPcHRpb25zIGZvciBjYXVzYWxDaGFpbigpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXVzYWxDaGFpbk9wdGlvbnMge1xuICAvKiogTWF4aW11bSBCRlMgZGVwdGggKGRlZmF1bHQ6IDIwKS4gUHJldmVudHMgcnVuYXdheSB0cmF2ZXJzYWwuICovXG4gIG1heERlcHRoPzogbnVtYmVyO1xuICAvKiogTWF4aW11bSB0b3RhbCBub2RlcyB0byB2aXNpdCAoZGVmYXVsdDogMTAwKS4gSGFyZCBjYXAgZm9yIHNhZmV0eS4gKi9cbiAgbWF4Tm9kZXM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBSRkMtMDAzIEQzIOKAlCBjb250cm9sLWRlcGVuZGVuY2UgbG9va3VwLiBXaGVuIHByb3ZpZGVkLCBleHBhbmRpbmcgYSBub2RlXG4gICAqIEFMU08gbGlua3MgYSBgJ2NvbnRyb2wnYCBlZGdlIHRvIGl0cyBnb3Zlcm5pbmcgZGVjaWRlciAobGFiZWxlZCBieSB0aGVcbiAgICogZGVjaWRlKCkgcnVsZSBsYWJlbCB3aGVuIHByZXNlbnQpOyB0aGUgZGVjaWRlciBub2RlIHRoZW4gZXhwYW5kc1xuICAgKiBub3JtYWxseSB0aHJvdWdoIGl0cyBvd24gZGF0YSByZWFkcywgc28gY2hhaW5zIGxpa2VcbiAgICogYHN0YXR1cyDihpAgW2NvbnRyb2xdIENsYXNzaWZ5UmlzayDihpAgW2RhdGE6IGNyZWRpdFNjb3JlXSBQdWxsQnVyZWF1YFxuICAgKiByZXNvbHZlIGVuZC10by1lbmQuIFdpdGhvdXQgdGhpcyBvcHRpb24gYmVoYXZpb3IgaXMgdW5jaGFuZ2VkLlxuICAgKi9cbiAgY29udHJvbERlcHM/OiBDb250cm9sRGVwTG9va3VwO1xuICAvKipcbiAgICogUkZDLTAwMyBENCDigJQgZWRnZSB3ZWlnaGVyLiBTdGFtcHMgYENhdXNhbEVkZ2Uud2VpZ2h0YCBhdCBlZGdlIGNyZWF0aW9uO1xuICAgKiBgdW5kZWZpbmVkYCAob3Igbm8gd2VpZ2hlcikg4oaSIDEuMC4gU2VlIHtAbGluayBFZGdlV2VpZ2hlcn0uXG4gICAqL1xuICB3ZWlnaD86IEVkZ2VXZWlnaGVyO1xuICAvKipcbiAgICogI1AxIOKAlCBob3cgYSBub2RlJ3MgZXhwYW5zaW9uIHJlYWQtc2V0IGlzIGRlcml2ZWQ6XG4gICAqXG4gICAqIC0gYCdzdGFnZSdgIChkZWZhdWx0LCBoaXN0b3JpY2FsKSDigJQgZXZlcnkgdmlzaXRlZCBub2RlIGV4cGFuZHMgdGhyb3VnaFxuICAgKiAgIEFMTCBvZiBpdHMgc3RhZ2UncyByZWFkcyAoYGdldEtleXNSZWFkYCkuIEEgc3RhZ2UgcmVhZGluZyBgYSxiYCBhbmRcbiAgICogICB3cml0aW5nIGB4LHlgIGxpbmtzIGJvdGggcmVhZHMgYXMgY2F1c2VzIG9mIGJvdGggd3JpdGVzIOKAlCBhIHNvdW5kIGJ1dFxuICAgKiAgIGNvYXJzZSBvdmVyLWFwcHJveGltYXRpb24uXG4gICAqIC0gYCdwZXItd3JpdGUnYCDigJQgd2hlbiB0aGUgY29tbWl0IGxvZyBjYXJyaWVzIHBlci13cml0ZSByZWFkIHByb3ZlbmFuY2VcbiAgICogICAoYFRyYWNlRW50cnkucmVhZEtleXNgLCByZWNvcmRlZCB1bmRlciB0aGUgZXhlY3V0b3Inc1xuICAgKiAgIGB3cml0ZVByb3ZlbmFuY2U6ICdyZWFkcy1wcmVmaXgnYCBkaWFsKSwgYSBub2RlIHJlYWNoZWQgdmlhIGtleSBga2BcbiAgICogICBleHBhbmRzIHRocm91Z2ggT05MWSB0aGUgcmVhZHMgdGhhdCBwcmVjZWRlZCBpdHMgd3JpdGUgb2YgYGtgXG4gICAqICAgKHRlbXBvcmFsIHByZWZpeCkuIE5vZGVzIGxpbmtlZCBsYXRlciB2aWEgYWRkaXRpb25hbCBrZXlzIGFyZVxuICAgKiAgIGluY3JlbWVudGFsbHkgcmUtZXhwYW5kZWQgd2l0aCBqdXN0IHRoZSBuZXcgcmVhZHMgKHdvcmtsaXN0IOKAlCB0aGVcbiAgICogICBzbGljZSBvbmx5IGV2ZXIgR1JPV1MgdG93YXJkIHRoZSBzdGFnZS1sZXZlbCBjZWlsaW5nKS4gSE9ORVNUXG4gICAqICAgRkFMTEJBQ0s6IGFueSBsaW5rIHdob3NlIHRyYWNlIGVudHJ5IGxhY2tzIGByZWFkS2V5c2AgZXhwYW5kcyB0aGF0XG4gICAqICAgbm9kZSBhdCBzdGFnZSBsZXZlbCDigJQgbWl4ZWQgb3IgZGlhbC1vZmYgbG9ncyBkZWdyYWRlIHRvIGAnc3RhZ2UnYFxuICAgKiAgIGJlaGF2aW9yIGV4YWN0bHksIG5ldmVyIHRvIHNpbGVuY2UuXG4gICAqL1xuICBlZGdlQXR0cmlidXRpb24/OiAnc3RhZ2UnIHwgJ3Blci13cml0ZSc7XG4gIC8qKlxuICAgKiAjUDEg4oCUIHRoZSB3cml0dGVuIGtleXMgdGhhdCBhbmNob3IgdGhlIFJPT1QncyBleHBhbnNpb24gdW5kZXJcbiAgICogYCdwZXItd3JpdGUnYCAoZS5nLiBgc2xpY2VGb3JLZXlgIHBhc3NlcyB0aGUgc2xpY2VkIGtleSwgc28gdGhlIHJvb3RcbiAgICogZXhwYW5kcyB0aHJvdWdoIHRoZSByZWFkcyB0aGF0IGZlZCBUSEFUIHdyaXRlLCBub3QgdGhlIHdob2xlIHN0YWdlKS5cbiAgICogSWdub3JlZCB1bmRlciBgJ3N0YWdlJ2AuIFVuc2V0IOKGkiByb290IGV4cGFuZHMgYXQgc3RhZ2UgbGV2ZWwuXG4gICAqL1xuICByb290TGlua0tleXM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBDYWxsYmFjayB0aGF0IHJldHVybnMgdGhlIGtleXMgYSBzdGFnZSByZWFkIGR1cmluZyBleGVjdXRpb24uXG4gKiBUaGUgYmFja3RyYWNrZXIgY2FsbHMgdGhpcyBmb3IgZWFjaCB2aXNpdGVkIG5vZGUgdG8gZGV0ZXJtaW5lXG4gKiB3aGljaCByZWFk4oaSd3JpdGUgZWRnZXMgdG8gZm9sbG93LlxuICpcbiAqIEltcGxlbWVudG9yczogUXVhbGl0eVJlY29yZGVyIHRyYWNrcyBrZXlzUmVhZCBwZXIgc3RlcCxcbiAqIG9yIGJ1aWxkIGEgTWFwPHJ1bnRpbWVTdGFnZUlkLCBzdHJpbmdbXT4gZnJvbSBTY29wZVJlY29yZGVyLm9uUmVhZCBldmVudHMuXG4gKi9cbmV4cG9ydCB0eXBlIEtleXNSZWFkTG9va3VwID0gKHJ1bnRpbWVTdGFnZUlkOiBzdHJpbmcpID0+IHN0cmluZ1tdO1xuXG4vLyDilIDilIAgU3RhZ2VkIG9wdGltaXphdGlvbjogd3JpdGVyIGxvb2t1cCBzdHJhdGVnaWVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIFRocmVzaG9sZCBmb3Igc3dpdGNoaW5nIGZyb20gbGluZWFyIHNjYW4gdG8gcmV2ZXJzZSBpbmRleC5cbiAqIEJlbG93IHRoaXMsIE8oTikgc2NhbiBpcyBmYXN0ZXIgKG5vIGluZGV4IGJ1aWxkIGNvc3QpLlxuICogQWJvdmUgdGhpcywgTyhsb2cgTikgYmluYXJ5IHNlYXJjaCB3aW5zLlxuICovXG5jb25zdCBSRVZFUlNFX0lOREVYX1RIUkVTSE9MRCA9IDI1NjtcblxuLyoqXG4gKiBXcml0ZXIgbG9va3VwIGZ1bmN0aW9uIHNpZ25hdHVyZS5cbiAqIFJldHVybnMgdGhlIENvbW1pdEJ1bmRsZSB0aGF0IGxhc3Qgd3JvdGUgYGtleWAgYmVmb3JlIHBvc2l0aW9uIGBiZWZvcmVJZHhgLlxuICovXG50eXBlIFdyaXRlckxvb2t1cCA9IChrZXk6IHN0cmluZywgYmVmb3JlSWR4OiBudW1iZXIpID0+IENvbW1pdEJ1bmRsZSB8IHVuZGVmaW5lZDtcblxuLyoqIFN0cmF0ZWd5IDE6IExpbmVhciBzY2FuIOKAlCBPKE4pIHBlciBsb29rdXAsIHplcm8gc2V0dXAgY29zdC4gKi9cbmZ1bmN0aW9uIGxpbmVhclNjYW5Mb29rdXAoY29tbWl0TG9nOiBDb21taXRCdW5kbGVbXSk6IFdyaXRlckxvb2t1cCB7XG4gIHJldHVybiAoa2V5LCBiZWZvcmVJZHgpID0+IGZpbmRMYXN0V3JpdGVyKGNvbW1pdExvZywga2V5LCBiZWZvcmVJZHgpO1xufVxuXG4vKipcbiAqIFN0cmF0ZWd5IDI6IFJldmVyc2UgaW5kZXgg4oCUIG9uZSBPKHJvd3MpIGJ1aWxkLCBPKGRlcHRoICsgbG9nIE4pIHBlciBsb29rdXAuXG4gKiBUaGUgbG9nJ3MgcmVhZCBtb2RlbCAoYGxvZ01vZGVsLnRzYDogYSBwYXRoIHRyaWUsIGVhY2ggdG9wLWxldmVsIGtleSBmb2xkZWQgYXRcbiAqIG1vc3Qgb25jZSkgYW5zd2VycyB0aGUgd3JpdGVyIHJ1bGUg4oCUIHJvd3Mgb24sIGluc2lkZSBvciBhcm91bmQgdGhlIGtleSDigJQgYnlcbiAqIGJpbmFyeSBzZWFyY2ggZm9yIHRoZSBsYXN0IHdyaXRlIG9uIG9yIGluc2lkZSBpdCwgdGhlbiBhIHZlcmRpY3Qgb25seSBmb3IgdGhlXG4gKiBhcm91bmQtY2FuZGlkYXRlcyBhZnRlciBpdC4gVGhlIHNhbWUgYW5zd2VyIGBmaW5kTGFzdFdyaXRlcmAgZ2l2ZXMsIHNvIHRoZVxuICogc3RyYXRlZ3kgc3dpdGNoIGJlbG93IG5ldmVyIGNoYW5nZXMgYSBzbGljZS5cbiAqL1xuZnVuY3Rpb24gcmV2ZXJzZUluZGV4TG9va3VwKGNvbW1pdExvZzogQ29tbWl0QnVuZGxlW10pOiBXcml0ZXJMb29rdXAge1xuICBjb25zdCBtb2RlbCA9IGxvZ01vZGVsKGNvbW1pdExvZyk7XG4gIHJldHVybiAoa2V5OiBzdHJpbmcsIGJlZm9yZUlkeDogbnVtYmVyKTogQ29tbWl0QnVuZGxlIHwgdW5kZWZpbmVkID0+IHtcbiAgICBjb25zdCBhdCA9IG1vZGVsLmxhc3RXcml0ZXJCZWZvcmUoa2V5LCBiZWZvcmVJZHgpO1xuICAgIHJldHVybiBhdCA+PSAwID8gY29tbWl0TG9nW2F0XSA6IHVuZGVmaW5lZDtcbiAgfTtcbn1cblxuLyoqXG4gKiBUaGUgdHJhY2UgZW50cmllcyBvZiBgY29tbWl0YCB0aGF0IG1ha2UgaXQgYSB3cml0ZXIgb2YgYGxpbmtLZXlgIOKAlCB0aGUgZW50cmllcyB3aG9zZSByZWFkXG4gKiBwcmVmaXggKGBUcmFjZUVudHJ5LnJlYWRLZXlzYCkgYSBwZXItd3JpdGUgZWRnZSBleHBhbmRzIHRocm91Z2guIFRoZSBGSVJTVCBlbnRyeSBvbiB0aGUgZXhhY3RcbiAqIHBhdGggd2hlbiB0aGVyZSBpcyBvbmUgKHRoZSAjUDEgYmVoYXZpb3VyLCB1bmNoYW5nZWQpOyBvdGhlcndpc2UgZXZlcnkgZW50cnkgaW5zaWRlIG9yIGFyb3VuZFxuICogdGhlIGtleSAoOS4zMy4wOiB0aGUgY29tbWl0IHdyb3RlIHRoZSBrZXkgdGhyb3VnaCBhIG5lc3RlZCByb3cg4oCUIGEgc3ViZmxvdyBzZWVkLCBhblxuICogb3V0cHV0TWFwcGVyIG1lcmdlLWJhY2sg4oCUIGFuZCBhbGwgb2YgdGhvc2Ugcm93cyB3cm90ZSBpdCkuXG4gKi9cbmZ1bmN0aW9uIGxpbmtpbmdFbnRyaWVzKGNvbW1pdDogQ29tbWl0QnVuZGxlLCBsaW5rS2V5OiBzdHJpbmcpOiBUcmFjZUVudHJ5W10ge1xuICBjb25zdCBleGFjdCA9IGNvbW1pdC50cmFjZS5maW5kKCh0KSA9PiB0LnBhdGggPT09IGxpbmtLZXkpO1xuICBpZiAoZXhhY3QgIT09IHVuZGVmaW5lZCkgcmV0dXJuIFtleGFjdF07XG4gIHJldHVybiBjb21taXQudHJhY2UuZmlsdGVyKCh0KSA9PiByZWxhdGlvbih0LnBhdGgsIGxpbmtLZXkpICE9PSB1bmRlZmluZWQpO1xufVxuXG4vKipcbiAqIFN0YWdlZCBvcHRpbWl6YXRpb246IHBpY2sgdGhlIHJpZ2h0IHdyaXRlci1sb29rdXAgc3RyYXRlZ3kgYmFzZWQgb24gZGF0YSBzaXplLlxuICpcbiAqIExpa2UgYSBkYXRhYmFzZSBxdWVyeSBvcHRpbWl6ZXIgY2hvb3NpbmcgYmV0d2VlbiBzZXF1ZW50aWFsIHNjYW4gYW5kIGluZGV4IHNjYW46XG4gKlxuICogLSAqKlNtYWxsIGxvZyAo4omkIDI1Nik6KiogTGluZWFyIHNjYW4gd2lucy4gWmVybyBzZXR1cCBjb3N0LCBnb29kIGNhY2hlIGxvY2FsaXR5LlxuICogICBUaGUgb3ZlcmhlYWQgb2YgYnVpbGRpbmcgYSByZXZlcnNlIGluZGV4IGlzbid0IHdvcnRoIGl0IGZvciBzaG9ydCBsb2dzLlxuICpcbiAqIC0gKipMYXJnZSBsb2cgKD4gMjU2KToqKiBSZXZlcnNlIGluZGV4IHdpbnMuIE8oTsOXVSkgdXBmcm9udCBidWlsZCBjb3N0IGlzIGFtb3J0aXplZFxuICogICBhY3Jvc3MgYWxsIEJGUyBob3BzLiBFYWNoIGxvb2t1cCBiZWNvbWVzIE8obG9nIE4pIHZpYSBiaW5hcnkgc2VhcmNoIGluc3RlYWQgb2YgTyhOKS5cbiAqICAgRm9yIGFuIGFnZW50IGxvb3Agd2l0aCA1MDAgaXRlcmF0aW9ucyBhbmQgNSBrZXlzIHBlciBob3AsIHRoaXMgaXMgNTAww5c1w5dsb2coNTAwKeKJiDIySyBvcHNcbiAqICAgdnMgNTAww5c1w5c1MDA9MS4yNU0gb3BzIHdpdGggbGluZWFyIHNjYW4uXG4gKlxuICogVGhlIGNhbGxlciBuZXZlciBzZWVzIHRoaXMg4oCUIGBjYXVzYWxDaGFpbigpYCBwaWNrcyBhdXRvbWF0aWNhbGx5LlxuICovXG5mdW5jdGlvbiBjcmVhdGVXcml0ZXJMb29rdXAoY29tbWl0TG9nOiBDb21taXRCdW5kbGVbXSk6IFdyaXRlckxvb2t1cCB7XG4gIGlmIChjb21taXRMb2cubGVuZ3RoIDw9IFJFVkVSU0VfSU5ERVhfVEhSRVNIT0xEKSB7XG4gICAgcmV0dXJuIGxpbmVhclNjYW5Mb29rdXAoY29tbWl0TG9nKTtcbiAgfVxuICByZXR1cm4gcmV2ZXJzZUluZGV4TG9va3VwKGNvbW1pdExvZyk7XG59XG5cbi8vIOKUgOKUgCBDb3JlIGFsZ29yaXRobSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBSRkMtMDAzIEQyOiB0aGUgYGluY29tcGxldGVTb3VyY2VzYCBub2RlIGZyYWdtZW50IGZvciBhIGNvbW1pdCDigJQgYHt9YFxuICogd2hlbiB0aGUgc3RhZ2UgY29uc3VtZWQgbm8gdW50cmFja2VkIHJlYWQgcGF0aHMsIGtlZXBpbmcgdGhlIGZpZWxkXG4gKiBBQlNFTlQgKG5vdCBlbXB0eS1hcnJheS12YWx1ZWQpIGZvciBmdWxseS10cmFja2VkIHN0YWdlcy5cbiAqL1xuZnVuY3Rpb24gaW5jb21wbGV0ZVNvdXJjZXNGcmFnbWVudChjb21taXQ6IENvbW1pdEJ1bmRsZSk6IHsgaW5jb21wbGV0ZVNvdXJjZXM/OiBSZWFkb25seUFycmF5PFVudHJhY2tlZFNvdXJjZT4gfSB7XG4gIGlmICghY29tbWl0LnVudHJhY2tlZFNvdXJjZXMgfHwgY29tbWl0LnVudHJhY2tlZFNvdXJjZXMubGVuZ3RoID09PSAwKSByZXR1cm4ge307XG4gIHJldHVybiB7IGluY29tcGxldGVTb3VyY2VzOiBjb21taXQudW50cmFja2VkU291cmNlcyB9O1xufVxuXG4vKipcbiAqIEJ1aWxkIHRoZSBjYXVzYWwgREFHIHJvb3RlZCBhdCBgc3RhcnRJZGAgYnkgd2Fsa2luZyBiYWNrd2FyZHNcbiAqIHRocm91Z2ggcmVhZOKGkndyaXRlIGRlcGVuZGVuY2llcyBpbiB0aGUgY29tbWl0IGxvZy5cbiAqXG4gKiBBdXRvbWF0aWNhbGx5IHNlbGVjdHMgdGhlIG9wdGltYWwgd3JpdGVyIGxvb2t1cCBzdHJhdGVneTpcbiAqIC0gTGluZWFyIHNjYW4gZm9yIHNtYWxsIGxvZ3MgKOKJpCAyNTYgY29tbWl0cylcbiAqIC0gUmV2ZXJzZSBpbmRleCB3aXRoIGJpbmFyeSBzZWFyY2ggZm9yIGxhcmdlIGxvZ3MgKD4gMjU2IGNvbW1pdHMpXG4gKlxuICogUHJvZHVjZXMgYSBEQUcgKG5vdCBhIHRyZWUpOiBpZiB0d28gY2hpbGRyZW4gYm90aCByZWFkIGZyb20gdGhlIHNhbWVcbiAqIHBhcmVudCwgdGhlIHBhcmVudCBub2RlIGlzIHNoYXJlZCAoZGVkdXBlZCBieSBydW50aW1lU3RhZ2VJZCkuXG4gKlxuICogQHBhcmFtIGNvbW1pdExvZyAgIE9yZGVyZWQgY29tbWl0IGJ1bmRsZXMgZnJvbSBleGVjdXRvci5nZXRTbmFwc2hvdCgpLmNvbW1pdExvZ1xuICogQHBhcmFtIHN0YXJ0SWQgICAgIHJ1bnRpbWVTdGFnZUlkIHRvIHN0YXJ0IGJhY2t0cmFja2luZyBmcm9tXG4gKiBAcGFyYW0gZ2V0S2V5c1JlYWQgQ2FsbGJhY2sgcmV0dXJuaW5nIGtleXMgcmVhZCBieSBhIGdpdmVuIGV4ZWN1dGlvbiBzdGVwXG4gKiBAcGFyYW0gb3B0aW9ucyAgICAgRGVwdGggYW5kIG5vZGUgbGltaXRzXG4gKiBAcmV0dXJucyBSb290IENhdXNhbE5vZGUgd2l0aCAucGFyZW50cyBmb3JtaW5nIHRoZSBEQUcsIG9yIHVuZGVmaW5lZCBpZiBzdGFydElkIG5vdCBmb3VuZFxuICovXG5leHBvcnQgZnVuY3Rpb24gY2F1c2FsQ2hhaW4oXG4gIGNvbW1pdExvZzogQ29tbWl0QnVuZGxlW10sXG4gIHN0YXJ0SWQ6IHN0cmluZyxcbiAgZ2V0S2V5c1JlYWQ6IEtleXNSZWFkTG9va3VwLFxuICBvcHRpb25zPzogQ2F1c2FsQ2hhaW5PcHRpb25zLFxuKTogQ2F1c2FsTm9kZSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG1heERlcHRoID0gb3B0aW9ucz8ubWF4RGVwdGggPz8gMjA7XG4gIGNvbnN0IG1heE5vZGVzID0gb3B0aW9ucz8ubWF4Tm9kZXMgPz8gMTAwO1xuICBjb25zdCBjb250cm9sRGVwcyA9IG9wdGlvbnM/LmNvbnRyb2xEZXBzO1xuICBjb25zdCB3ZWlnaCA9IG9wdGlvbnM/LndlaWdoO1xuICBjb25zdCBwZXJXcml0ZSA9IG9wdGlvbnM/LmVkZ2VBdHRyaWJ1dGlvbiA9PT0gJ3Blci13cml0ZSc7XG5cbiAgLy8gUkZDLTAwMyBENCDigJQgdHJ1bmNhdGlvbiB2aXNpYmlsaXR5LiBTZXQgb25seSB3aGVuIGEgbGltaXQgYWN0dWFsbHlcbiAgLy8gY3V0cyB0aGUgc2xpY2U7IHN1cmZhY2VkIG9uIHRoZSByb290IGFzIGB0cnVuY2F0ZWRgIHNvIGEgY29uc3VtZXIgY2FuXG4gIC8vIG5ldmVyIG1pc3Rha2UgYSB0cnVuY2F0ZWQgc2xpY2UgZm9yIGEgY29tcGxldGUgb25lLlxuICBsZXQgdHJ1bmNhdGVkQnlEZXB0aCA9IGZhbHNlO1xuICBsZXQgdHJ1bmNhdGVkQnlOb2RlcyA9IGZhbHNlO1xuXG4gIC8vIEJ1aWxkIHBvc2l0aW9uIGluZGV4OiBydW50aW1lU3RhZ2VJZCDihpIgYXJyYXkgcG9zaXRpb24gKE8obikgb25jZSlcbiAgY29uc3QgaWR4TWFwID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb21taXRMb2cubGVuZ3RoOyBpKyspIHtcbiAgICBpZHhNYXAuc2V0KGNvbW1pdExvZ1tpXS5ydW50aW1lU3RhZ2VJZCwgaSk7XG4gIH1cbiAgcXVlcnlXb3JrLnVuaXRzICs9IGNvbW1pdExvZy5sZW5ndGg7XG5cbiAgY29uc3Qgc3RhcnRJZHggPSBpZHhNYXAuZ2V0KHN0YXJ0SWQpO1xuICBpZiAoc3RhcnRJZHggPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBjb25zdCBzdGFydENvbW1pdCA9IGNvbW1pdExvZ1tzdGFydElkeF07XG5cbiAgLy8gUGljayB3cml0ZXIgbG9va3VwIHN0cmF0ZWd5IGJhc2VkIG9uIGxvZyBzaXplXG4gIGNvbnN0IGZpbmRXcml0ZXIgPSBjcmVhdGVXcml0ZXJMb29rdXAoY29tbWl0TG9nKTtcblxuICAvLyBOb2RlIGRlZHVwIG1hcDogcnVudGltZVN0YWdlSWQg4oaSIENhdXNhbE5vZGUgKGVuc3VyZXMgREFHLCBub3QgdHJlZSlcbiAgY29uc3Qgbm9kZU1hcCA9IG5ldyBNYXA8c3RyaW5nLCBDYXVzYWxOb2RlPigpO1xuXG4gIGNvbnN0IHJvb3Q6IENhdXNhbE5vZGUgPSB7XG4gICAgcnVudGltZVN0YWdlSWQ6IHN0YXJ0SWQsXG4gICAgc3RhZ2VJZDogc3RhcnRDb21taXQuc3RhZ2VJZCxcbiAgICBzdGFnZU5hbWU6IHN0YXJ0Q29tbWl0LnN0YWdlLFxuICAgIGtleXNXcml0dGVuOiBzdGFydENvbW1pdC50cmFjZS5tYXAoKHQpID0+IHQucGF0aCksXG4gICAgbGlua2VkQnk6ICcnLFxuICAgIGRlcHRoOiAwLFxuICAgIHBhcmVudHM6IFtdLFxuICAgIHBhcmVudEVkZ2VzOiBbXSxcbiAgICAuLi5pbmNvbXBsZXRlU291cmNlc0ZyYWdtZW50KHN0YXJ0Q29tbWl0KSxcbiAgfTtcbiAgbm9kZU1hcC5zZXQoc3RhcnRJZCwgcm9vdCk7XG5cbiAgLy8g4pSA4pSAICNQMSBwZXItd3JpdGUgYXR0cmlidXRpb24gbWFjaGluZXJ5IChpbmVydCB1bmRlciAnc3RhZ2UnKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy8gZXhwYW5kZWRSZWFkczogcGVyIG5vZGUsIHRoZSByZWFkcyBhbHJlYWR5IHF1ZXVlZCBmb3IgZXhwYW5zaW9uIOKAlCBsYXRlXG4gIC8vIGxpbmtzIHZpYSBhZGRpdGlvbmFsIGtleXMgcmUtZW5xdWV1ZSBvbmx5IHRoZSBERUxUQSwgc28gdGhlIHNsaWNlIGdyb3dzXG4gIC8vIG1vbm90b25pY2FsbHkgdG93YXJkIHRoZSBzdGFnZS1sZXZlbCBjZWlsaW5nIGFuZCB0ZXJtaW5hdGVzIChlYWNoIGtleVxuICAvLyBleHBhbmRzIGF0IG1vc3Qgb25jZSBwZXIgbm9kZSkuIGZ1bGx5RXhwYW5kZWQ6IG5vZGVzIHRoYXQgZmVsbCBiYWNrIHRvXG4gIC8vIHN0YWdlIGxldmVsIChubyByZWFkS2V5cyBvbiBhIGxpbmtpbmcgZW50cnkpIOKAlCBub3RoaW5nIGxlZnQgdG8gYWRkLlxuICBjb25zdCBleHBhbmRlZFJlYWRzID0gbmV3IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+PigpO1xuICBjb25zdCBmdWxseUV4cGFuZGVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgYSBub2RlJ3MgZXhwYW5zaW9uIHJlYWQtc2V0IGZvciB0aGUgZ2l2ZW4gbGlua2luZyBXUklUVEVOIGtleXMuXG4gICAqIFBlci13cml0ZSBtb2RlIHdpdGggcHJvdmVuYW5jZSBwcmVzZW50IOKGkiB1bmlvbiBvZiB0aGUgbGlua2luZyB3cml0ZXMnXG4gICAqIHRlbXBvcmFsLXByZWZpeCBgcmVhZEtleXNgLiBBbnkgbGlua2luZyBlbnRyeSBXSVRIT1VUIGByZWFkS2V5c2AgKG9yIG5vXG4gICAqIGxpbmtLZXlzIGF0IGFsbCkg4oaSIGhvbmVzdCBzdGFnZS1sZXZlbCBmYWxsYmFjaywgZmxhZ2dlZCB2aWEgdGhlIHNlY29uZFxuICAgKiB0dXBsZSBtZW1iZXIgc28gdGhlIGNhbGxlciBtYXJrcyB0aGUgbm9kZSBmdWxseSBleHBhbmRlZC5cbiAgICovXG4gIGZ1bmN0aW9uIHJlYWRzRm9yTGlua3MoY29tbWl0OiBDb21taXRCdW5kbGUsIGxpbmtLZXlzOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCk6IFtzdHJpbmdbXSwgYm9vbGVhbl0ge1xuICAgIGlmICghcGVyV3JpdGUgfHwgIWxpbmtLZXlzIHx8IGxpbmtLZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtnZXRLZXlzUmVhZChjb21taXQucnVudGltZVN0YWdlSWQpLCB0cnVlXTtcbiAgICB9XG4gICAgY29uc3QgdW5pb24gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IGxpbmtLZXkgb2YgbGlua0tleXMpIHtcbiAgICAgIGNvbnN0IGVudHJpZXMgPSBsaW5raW5nRW50cmllcyhjb21taXQsIGxpbmtLZXkpO1xuICAgICAgaWYgKGVudHJpZXMubGVuZ3RoID09PSAwIHx8IGVudHJpZXMuc29tZSgoZSkgPT4gZS5yZWFkS2V5cyA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICAvLyBNaXhlZC9kaWFsLW9mZiBsb2cg4oCUIGRlZ3JhZGUgVEhJUyBub2RlIHRvIHN0YWdlIGxldmVsLCBob25lc3RseS5cbiAgICAgICAgcmV0dXJuIFtnZXRLZXlzUmVhZChjb21taXQucnVudGltZVN0YWdlSWQpLCB0cnVlXTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykgZm9yIChjb25zdCByayBvZiBlbnRyeS5yZWFkS2V5cyBhcyBzdHJpbmdbXSkgdW5pb24uYWRkKHJrKTtcbiAgICB9XG4gICAgcmV0dXJuIFtbLi4udW5pb25dLCBmYWxzZV07XG4gIH1cblxuICAvLyBCRlMvd29ya2xpc3QgcXVldWU6IFtub2RlLCBjb21taXRJZHgsIGRlcHRoLCBrZXlzVG9FeHBhbmRdXG4gIGNvbnN0IFtyb290UmVhZHMsIHJvb3RJc0Z1bGxdID0gcGVyV3JpdGVcbiAgICA/IHJlYWRzRm9yTGlua3Moc3RhcnRDb21taXQsIG9wdGlvbnM/LnJvb3RMaW5rS2V5cylcbiAgICA6IFtnZXRLZXlzUmVhZChzdGFydElkKSwgdHJ1ZV07XG4gIGV4cGFuZGVkUmVhZHMuc2V0KHN0YXJ0SWQsIG5ldyBTZXQocm9vdFJlYWRzKSk7XG4gIGlmIChyb290SXNGdWxsKSBmdWxseUV4cGFuZGVkLmFkZChzdGFydElkKTtcbiAgY29uc3QgcXVldWU6IEFycmF5PFtDYXVzYWxOb2RlLCBudW1iZXIsIG51bWJlciwgc3RyaW5nW11dPiA9IFtbcm9vdCwgc3RhcnRJZHgsIDAsIHJvb3RSZWFkc11dO1xuICBsZXQgdmlzaXRlZCA9IDE7XG5cbiAgLyoqXG4gICAqIExpbmsgYG5vZGUg4oaSIHBhcmVudGAgKGNyZWF0aW5nICsgZW5xdWV1ZWluZyB0aGUgcGFyZW50IHdoZW4gbmV3KS5cbiAgICogU2hhcmVkIGJ5IGRhdGEtZWRnZSBleHBhbnNpb24gKHJlYWTihpJ3cml0ZSkgYW5kIGNvbnRyb2wtZWRnZSBleHBhbnNpb25cbiAgICogKEQzKS4gT25lIENhdXNhbEVkZ2UgcGVyIGRpc3RpbmN0IChwYXJlbnQsIGtpbmQsIGtleSkgbGluazsgYHBhcmVudHNgXG4gICAqIGtlZXBzIGl0cyBoaXN0b3JpY2FsIG9uZS1lbnRyeS1wZXItcGFyZW50IGRlZHVwLlxuICAgKi9cbiAgZnVuY3Rpb24gbGlua1BhcmVudChcbiAgICBub2RlOiBDYXVzYWxOb2RlLFxuICAgIHBhcmVudENvbW1pdDogQ29tbWl0QnVuZGxlLFxuICAgIGtpbmQ6ICdkYXRhJyB8ICdjb250cm9sJyxcbiAgICBrZXk6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBkZXB0aDogbnVtYmVyLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBwYXJlbnRJZCA9IHBhcmVudENvbW1pdC5ydW50aW1lU3RhZ2VJZDtcbiAgICAvLyB0aGUgZGVkdXAgc2NhbnMgYmVsb3csIGFuZCB0aGUgcGFyZW50J3MgdHJhY2Ugd2hlbiBpdCBpcyBuZXcg4oCUIGNvdW50ZWQgZm9yIHRoZSBzY2FsaW5nIHRlc3RcbiAgICBxdWVyeVdvcmsudW5pdHMgKz0gMSArIG5vZGUucGFyZW50cy5sZW5ndGggKyBub2RlLnBhcmVudEVkZ2VzLmxlbmd0aDtcbiAgICAvLyAjUDE6IHRoZSBwYXJlbnQncyBleHBhbnNpb24gcmVhZHMsIHJlc29sdmVkIExBWklMWSAob25seSBmb3IgbmV3IG5vZGVzXG4gICAgLy8gb3IgcGVyLXdyaXRlIHJlLWV4cGFuc2lvbiDigJQgZHVwbGljYXRlIGxpbmtzIHVuZGVyICdzdGFnZScgcGF5IG5vdGhpbmcpLlxuICAgIC8vIERhdGEgbGlua3MgZXhwYW5kIHRocm91Z2ggdGhlIHJlYWRzIHRoYXQgZmVkIHRoZSBwYXJlbnQncyB3cml0ZSBvZlxuICAgIC8vIGBrZXlgOyBjb250cm9sIGxpbmtzIGV4cGFuZCB0aGUgZGVjaWRlciBhdCBzdGFnZSBsZXZlbCAoYSBkZWNpc2lvblxuICAgIC8vIGRlcGVuZHMgb24gZXZlcnl0aGluZyBpdCByZWFkKS5cbiAgICBjb25zdCByZXNvbHZlTGlua1JlYWRzID0gKCk6IFtzdHJpbmdbXSwgYm9vbGVhbl0gPT5cbiAgICAgIGtpbmQgPT09ICdkYXRhJ1xuICAgICAgICA/IHJlYWRzRm9yTGlua3MocGFyZW50Q29tbWl0LCBrZXkgIT09IHVuZGVmaW5lZCA/IFtrZXldIDogdW5kZWZpbmVkKVxuICAgICAgICA6IFtnZXRLZXlzUmVhZChwYXJlbnRJZCksIHRydWVdO1xuXG4gICAgbGV0IHBhcmVudE5vZGUgPSBub2RlTWFwLmdldChwYXJlbnRJZCk7XG4gICAgaWYgKCFwYXJlbnROb2RlKSB7XG4gICAgICAvLyBOZXcgbm9kZSDigJQgY3JlYXRlIGFuZCBlbnF1ZXVlIChyZXNwZWN0aW5nIHRoZSBub2RlIGJ1ZGdldClcbiAgICAgIGlmICh2aXNpdGVkID49IG1heE5vZGVzKSB7XG4gICAgICAgIHRydW5jYXRlZEJ5Tm9kZXMgPSB0cnVlOyAvLyBENDogYSBkaXNjb3ZlcmVkIHBhcmVudCB3YXMgZHJvcHBlZFxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhcmVudElkeCA9IGlkeE1hcC5nZXQocGFyZW50SWQpO1xuICAgICAgaWYgKHBhcmVudElkeCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG5cbiAgICAgIHF1ZXJ5V29yay51bml0cyArPSBwYXJlbnRDb21taXQudHJhY2UubGVuZ3RoO1xuICAgICAgcGFyZW50Tm9kZSA9IHtcbiAgICAgICAgcnVudGltZVN0YWdlSWQ6IHBhcmVudElkLFxuICAgICAgICBzdGFnZUlkOiBwYXJlbnRDb21taXQuc3RhZ2VJZCxcbiAgICAgICAgc3RhZ2VOYW1lOiBwYXJlbnRDb21taXQuc3RhZ2UsXG4gICAgICAgIGtleXNXcml0dGVuOiBwYXJlbnRDb21taXQudHJhY2UubWFwKCh0KSA9PiB0LnBhdGgpLFxuICAgICAgICAvLyBsaW5rZWRCeSBzdGF5cyBhIERBVEEta2V5IGNvbmNlcHQgKGJhY2stY29tcGF0KSDigJQgY29udHJvbC1saW5rZWRcbiAgICAgICAgLy8gbm9kZXMgY2FycnkgdGhlaXIgbGFiZWwgb24gdGhlIGVkZ2UgaW5zdGVhZC5cbiAgICAgICAgbGlua2VkQnk6IGtpbmQgPT09ICdkYXRhJyA/IGtleSA/PyAnJyA6ICcnLFxuICAgICAgICBkZXB0aDogZGVwdGggKyAxLFxuICAgICAgICBwYXJlbnRzOiBbXSxcbiAgICAgICAgcGFyZW50RWRnZXM6IFtdLFxuICAgICAgICAuLi5pbmNvbXBsZXRlU291cmNlc0ZyYWdtZW50KHBhcmVudENvbW1pdCksXG4gICAgICB9O1xuICAgICAgbm9kZU1hcC5zZXQocGFyZW50SWQsIHBhcmVudE5vZGUpO1xuICAgICAgdmlzaXRlZCsrO1xuICAgICAgY29uc3QgW2xpbmtSZWFkcywgbGlua0lzRnVsbF0gPSByZXNvbHZlTGlua1JlYWRzKCk7XG4gICAgICBleHBhbmRlZFJlYWRzLnNldChwYXJlbnRJZCwgbmV3IFNldChsaW5rUmVhZHMpKTtcbiAgICAgIGlmIChsaW5rSXNGdWxsKSBmdWxseUV4cGFuZGVkLmFkZChwYXJlbnRJZCk7XG4gICAgICBxdWV1ZS5wdXNoKFtwYXJlbnROb2RlLCBwYXJlbnRJZHgsIGRlcHRoICsgMSwgbGlua1JlYWRzXSk7XG4gICAgfSBlbHNlIGlmIChwZXJXcml0ZSAmJiAhZnVsbHlFeHBhbmRlZC5oYXMocGFyZW50SWQpKSB7XG4gICAgICAvLyAjUDEgd29ya2xpc3Q6IGFuIEVYSVNUSU5HIG5vZGUgbGlua2VkIHZpYSBhbm90aGVyIGtleSBtYXkgb3dlIG1vcmVcbiAgICAgIC8vIGV4cGFuc2lvbiDigJQgZW5xdWV1ZSBvbmx5IHRoZSByZWFkcyBub3QgeWV0IGV4cGFuZGVkIChtb25vdG9uZTsgdGhlXG4gICAgICAvLyBub2RlIGJ1ZGdldCBpcyB1bnRvdWNoZWQsIG5vIG5vZGUgaXMgY3JlYXRlZCkuIFJlLWV4cGFuc2lvbiBrZWVwc1xuICAgICAgLy8gdGhlIG5vZGUncyBPUklHSU5BTCBkZXB0aCBzbyBpdHMgcGFyZW50cyBnZXQgYSBjb25zaXN0ZW50IGRlcHRoKzEuXG4gICAgICBjb25zdCBbbGlua1JlYWRzLCBsaW5rSXNGdWxsXSA9IHJlc29sdmVMaW5rUmVhZHMoKTtcbiAgICAgIGNvbnN0IGV4cGFuZGVkID0gZXhwYW5kZWRSZWFkcy5nZXQocGFyZW50SWQpITtcbiAgICAgIGNvbnN0IGRlbHRhID0gbGlua1JlYWRzLmZpbHRlcigoaykgPT4gIWV4cGFuZGVkLmhhcyhrKSk7XG4gICAgICBpZiAobGlua0lzRnVsbCkgZnVsbHlFeHBhbmRlZC5hZGQocGFyZW50SWQpO1xuICAgICAgaWYgKGRlbHRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZm9yIChjb25zdCBrIG9mIGRlbHRhKSBleHBhbmRlZC5hZGQoayk7XG4gICAgICAgIGNvbnN0IHBhcmVudElkeCA9IGlkeE1hcC5nZXQocGFyZW50SWQpO1xuICAgICAgICBpZiAocGFyZW50SWR4ICE9PSB1bmRlZmluZWQpIHF1ZXVlLnB1c2goW3BhcmVudE5vZGUsIHBhcmVudElkeCwgcGFyZW50Tm9kZS5kZXB0aCwgZGVsdGFdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEQUcgbWVyZ2U6IG9uZSBwYXJlbnRzW10gZW50cnkgcGVyIGRpc3RpbmN0IHBhcmVudCAoaGlzdG9yaWNhbCBzaGFwZSlcbiAgICBpZiAoIW5vZGUucGFyZW50cy5zb21lKChwKSA9PiBwLnJ1bnRpbWVTdGFnZUlkID09PSBwYXJlbnRJZCkpIHtcbiAgICAgIG5vZGUucGFyZW50cy5wdXNoKHBhcmVudE5vZGUpO1xuICAgIH1cbiAgICAvLyBPbmUgZWRnZSBwZXIgZGlzdGluY3QgKHBhcmVudCwga2luZCwga2V5KSBsaW5rLiBUaGUgd2VpZ2hlciAoRDQpXG4gICAgLy8gc3RhbXBzIHRoZSB3ZWlnaHQgYXQgY3JlYXRpb247IGB1bmRlZmluZWRgIOKGkiAxLjAg4oCUIHRoZSBlbmdpbmUgbmV2ZXJcbiAgICAvLyBjb21wdXRlcyB3ZWlnaHRzIGl0c2VsZi5cbiAgICBpZiAoIW5vZGUucGFyZW50RWRnZXMuc29tZSgoZSkgPT4gZS5wYXJlbnQucnVudGltZVN0YWdlSWQgPT09IHBhcmVudElkICYmIGUua2luZCA9PT0ga2luZCAmJiBlLmtleSA9PT0ga2V5KSkge1xuICAgICAgLy8gRXJyb3IgaXNvbGF0aW9uIChyZXZpZXcgZmluZGluZyk6IGEgY29uc3VtZXIgd2VpZ2hlciB0aGF0IHRocm93c1xuICAgICAgLy8gbXVzdCBkZWdyYWRlIHRvIHRoZSBkZWZhdWx0IHdlaWdodCwgbmV2ZXIgY3Jhc2ggdGhlIHNsaWNlIOKAlCB0aGVcbiAgICAgIC8vIHNhbWUgY29udHJhY3QgZXZlcnkgb3RoZXIgY29uc3VtZXIgY2FsbGJhY2sgaW4gdGhlIGxpYnJhcnkgZ2V0cy5cbiAgICAgIGxldCB3ZWlnaHQgPSAxLjA7XG4gICAgICBpZiAod2VpZ2gpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB3ZWlnaHQgPSB3ZWlnaChub2RlLCBwYXJlbnROb2RlLCBrZXksIGtpbmQpID8/IDEuMDtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLyogd2VpZ2hlciB0aHJldyDigJQga2VlcCAxLjAsIHRoZSBzbGljZSBzdGF5cyB1c2FibGUgKi9cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgbmVzdGVkID0ga2luZCA9PT0gJ2RhdGEnICYmIGtleSAhPT0gdW5kZWZpbmVkICYmIHdyaXRlc09ubHlJbnNpZGUocGFyZW50Q29tbWl0LCBrZXkpO1xuICAgICAgbm9kZS5wYXJlbnRFZGdlcy5wdXNoKHtcbiAgICAgICAgcGFyZW50OiBwYXJlbnROb2RlLFxuICAgICAgICBraW5kLFxuICAgICAgICBrZXksXG4gICAgICAgIHdlaWdodCxcbiAgICAgICAgLi4uKG5lc3RlZCAmJiB7IGJhc2lzOiAnbmVzdGVkLXJvd3MnIGFzIGNvbnN0IH0pLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgd2hpbGUgKHF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBbbm9kZSwgY29tbWl0SWR4LCBkZXB0aCwga2V5c1RvRXhwYW5kXSA9IHF1ZXVlLnNoaWZ0KCkhO1xuICAgIHF1ZXJ5V29yay51bml0cyArPSAxICsga2V5c1RvRXhwYW5kLmxlbmd0aDtcblxuICAgIGlmIChkZXB0aCA+PSBtYXhEZXB0aCkge1xuICAgICAgLy8gRDQ6IG9ubHkgYSBub2RlIHRoYXQgc3RpbGwgSEFEIHNvbWV0aGluZyB0byBleHBhbmQgY291bnRzIGFzIGEgY3V0XG4gICAgICAvLyAoYSBsZWFmIGF0IHRoZSBob3Jpem9uIHRydW5jYXRlcyBub3RoaW5nKS5cbiAgICAgIGlmIChrZXlzVG9FeHBhbmQubGVuZ3RoID4gMCB8fCBjb250cm9sRGVwcz8uKG5vZGUucnVudGltZVN0YWdlSWQpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdHJ1bmNhdGVkQnlEZXB0aCA9IHRydWU7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBEYXRhIGVkZ2VzOiBmb3IgZWFjaCBrZXkgaW4gdGhpcyBleHBhbnNpb24ncyByZWFkLXNldCwgZmluZCB3aG8gd3JvdGVcbiAgICAvLyBpdC4gVW5kZXIgJ3N0YWdlJyB0aGlzIGlzIHRoZSBub2RlJ3MgZnVsbCByZWFkLXNldCAoaGlzdG9yaWNhbFxuICAgIC8vIGJlaGF2aW9yKTsgdW5kZXIgJ3Blci13cml0ZScgaXQgaXMgdGhlIGxpbmtpbmcgd3JpdGVzJyB0ZW1wb3JhbCBwcmVmaXhcbiAgICAvLyAob3IgYSB3b3JrbGlzdCBkZWx0YSBvbiByZS1leHBhbnNpb24pLlxuICAgIGNvbnN0IGtleXNSZWFkID0ga2V5c1RvRXhwYW5kO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXNSZWFkKSB7XG4gICAgICBjb25zdCB3cml0ZXIgPSBmaW5kV3JpdGVyKGtleSwgY29tbWl0SWR4KTtcbiAgICAgIGlmICghd3JpdGVyKSB7XG4gICAgICAgIC8vIEY0Yjogc2F5IHdoeSB0aGVyZSBpcyBubyBlZGdlIOKAlCBubyBjb21taXQgYmVmb3JlIHRoaXMgbm9kZSB3cm90ZSB0aGUga2V5LlxuICAgICAgICBub2RlLnByZVJ1blJlYWRzID8/PSB7IGNvZGU6ICdwcmUtcnVuLW9yaWdpbicsIGtleXM6IFtdIH07XG4gICAgICAgIGlmICghbm9kZS5wcmVSdW5SZWFkcy5rZXlzLmluY2x1ZGVzKGtleSkpIG5vZGUucHJlUnVuUmVhZHMua2V5cy5wdXNoKGtleSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgbGlua1BhcmVudChub2RlLCB3cml0ZXIsICdkYXRhJywga2V5LCBkZXB0aCk7XG4gICAgfVxuXG4gICAgLy8gQ29udHJvbCBlZGdlIChSRkMtMDAzIEQzKTogbGluayB0aGUgZ292ZXJuaW5nIGRlY2lkZXIsIGxhYmVsZWQgYnkgdGhlXG4gICAgLy8gZGVjaWRlKCkgcnVsZSBsYWJlbCB3aGVuIHByZXNlbnQuIFRoZSBkZWNpZGVyIG5vZGUgdGhlbiBleHBhbmRzXG4gICAgLy8gbm9ybWFsbHkgdGhyb3VnaCBpdHMgb3duIGRhdGEgcmVhZHMgKGFuZCBpdHMgb3duIGNvbnRyb2wgcGFyZW50KS5cbiAgICBpZiAoY29udHJvbERlcHMpIHtcbiAgICAgIGNvbnN0IGRlcCA9IGNvbnRyb2xEZXBzKG5vZGUucnVudGltZVN0YWdlSWQpO1xuICAgICAgaWYgKGRlcCkge1xuICAgICAgICBjb25zdCBkZWNpZGVySWR4ID0gaWR4TWFwLmdldChkZXAuZGVjaWRlcklkKTtcbiAgICAgICAgaWYgKGRlY2lkZXJJZHggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGxpbmtQYXJlbnQobm9kZSwgY29tbWl0TG9nW2RlY2lkZXJJZHhdLCAnY29udHJvbCcsIGRlcC5sYWJlbCwgZGVwdGgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gUkZDLTAwMyBENCDigJQgdHJ1bmNhdGlvbiB2aXNpYmlsaXR5IG9uIHRoZSByb290IChhYnNlbnQgd2hlbiBjb21wbGV0ZSkuXG4gIGlmICh0cnVuY2F0ZWRCeURlcHRoIHx8IHRydW5jYXRlZEJ5Tm9kZXMpIHtcbiAgICByb290LnRydW5jYXRlZCA9IHsgYnlEZXB0aDogdHJ1bmNhdGVkQnlEZXB0aCwgYnlOb2RlczogdHJ1bmNhdGVkQnlOb2RlcyB9O1xuICAgIGlmIChpc0Rldk1vZGUoKSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFtmb290cHJpbnRdIGNhdXNhbENoYWluKCcke3N0YXJ0SWR9JykgdHJ1bmNhdGVkIGJ5IGAgK1xuICAgICAgICAgIGAke1t0cnVuY2F0ZWRCeURlcHRoICYmIGBtYXhEZXB0aCAoJHttYXhEZXB0aH0pYCwgdHJ1bmNhdGVkQnlOb2RlcyAmJiBgbWF4Tm9kZXMgKCR7bWF4Tm9kZXN9KWBdXG4gICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgICAgICAuam9pbignICsgJyl9IOKAlCB0aGUgc2xpY2UgaXMgaW5jb21wbGV0ZS4gUmFpc2UgdGhlIGxpbWl0cyBvciBuYXJyb3cga2V5c1JlYWQuYCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJvb3Q7XG59XG5cbi8vIOKUgOKUgCBVdGlsaXRpZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogRmxhdHRlbiB0aGUgY2F1c2FsIERBRyBpbnRvIGEgQkZTLW9yZGVyZWQgbGlzdCBvZiBub2Rlcy5cbiAqIEVhY2ggbm9kZSBhcHBlYXJzIGV4YWN0bHkgb25jZSAoZmlyc3Qgb2NjdXJyZW5jZSBieSBCRlMgb3JkZXIpLlxuICogVXNlZnVsIGZvciBsaW5lYXIgZGlzcGxheSBvciBpdGVyYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmbGF0dGVuQ2F1c2FsREFHKHJvb3Q6IENhdXNhbE5vZGUpOiBDYXVzYWxOb2RlW10ge1xuICBjb25zdCByZXN1bHQ6IENhdXNhbE5vZGVbXSA9IFtdO1xuICBjb25zdCB2aXNpdGVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IHF1ZXVlOiBDYXVzYWxOb2RlW10gPSBbcm9vdF07XG5cbiAgd2hpbGUgKHF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBub2RlID0gcXVldWUuc2hpZnQoKSE7XG4gICAgaWYgKHZpc2l0ZWQuaGFzKG5vZGUucnVudGltZVN0YWdlSWQpKSBjb250aW51ZTtcbiAgICB2aXNpdGVkLmFkZChub2RlLnJ1bnRpbWVTdGFnZUlkKTtcbiAgICByZXN1bHQucHVzaChub2RlKTtcblxuICAgIGZvciAoY29uc3QgcGFyZW50IG9mIG5vZGUucGFyZW50cykge1xuICAgICAgaWYgKCF2aXNpdGVkLmhhcyhwYXJlbnQucnVudGltZVN0YWdlSWQpKSB7XG4gICAgICAgIHF1ZXVlLnB1c2gocGFyZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEZvcm1hdCBhIGNhdXNhbCBEQUcgYXMgaHVtYW4tcmVhZGFibGUgaW5kZW50ZWQgdGV4dC5cbiAqIFNob3dzIHRoZSBkZXBlbmRlbmN5IGNoYWluIHdpdGggZGVwdGggaW5kZW50YXRpb24gYW5kIGxpbmtlZC1ieSBrZXlzLlxuICpcbiAqIFJGQy0wMDMgRDI6IG5vZGVzIHRoYXQgY29uc3VtZWQgdW50cmFja2VkIHJlYWQgcGF0aHMgcmVuZGVyIGFuIGV4dHJhXG4gKiBg4pqgIGFsc28gY29uc3VtZWQg4oCmIOKAlCBzbGljZSBtYXkgYmUgaW5jb21wbGV0ZSBoZXJlYCBsaW5lLCBzbyBhIGNvbnN1bWVyXG4gKiAoaHVtYW4gb3IgTExNKSBkZWJ1Z2dpbmcgZnJvbSB0aGUgc2xpY2UgaXMgVE9MRCB3aGVuIGl0IGlzIGluY29tcGxldGUuXG4gKlxuICogUkZDLTAwMyBEMzogY29udHJvbCBlZGdlcyByZW5kZXIgYXMgYOKGkCBbY29udHJvbDogPHJ1bGUgbGFiZWw+XWBcbiAqIChsYWJlbCBvbWl0dGVkIHdoZW4gdGhlIGRlY2lzaW9uIGNhcnJpZWQgbm9uZSkuIERhdGEgcmVuZGVyaW5nIGlzXG4gKiBieXRlLWlkZW50aWNhbCB0byB0aGUgcHJlLUQzIG91dHB1dCDigJQgYOKGkCB2aWEgPGtleT5gIGZyb20gdGhlIG5vZGUnc1xuICogZGlzY292ZXJ5LXRpbWUgYGxpbmtlZEJ5YC5cbiAqXG4gKiBSRkMtMDAzIEQ0OiBlZGdlIHdlaWdodHMgZnJvbSB0aGUgYHdlaWdoYCBob29rIHJlbmRlciBhcyBhIHN1ZmZpeCDigJRcbiAqIGDihpAgdmlhIHN5c3RlbVByb21wdCAoMC4xOClgIOKAlCBvbmx5IHdoZW4g4omgIDEuMCwgc28gdW53ZWlnaHRlZCBvdXRwdXQgaXNcbiAqIHVuY2hhbmdlZC4gQSB0cnVuY2F0ZWQgc2xpY2UgKHJvb3QudHJ1bmNhdGVkKSBhcHBlbmRzIGEgZmluYWxcbiAqIGDimqAgc2xpY2UgdHJ1bmNhdGVkIOKApmAgbGluZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdENhdXNhbENoYWluKHJvb3Q6IENhdXNhbE5vZGUpOiBzdHJpbmcge1xuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgdmlzaXRlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIGNvbnN0IHdlaWdodFN1ZmZpeCA9IChlZGdlOiBDYXVzYWxFZGdlIHwgdW5kZWZpbmVkKTogc3RyaW5nID0+XG4gICAgZWRnZSAhPT0gdW5kZWZpbmVkICYmIGVkZ2Uud2VpZ2h0ICE9PSAxID8gYCAoJHtlZGdlLndlaWdodH0pYCA6ICcnO1xuXG4gIGZ1bmN0aW9uIHdhbGsobm9kZTogQ2F1c2FsTm9kZSwgaW5kZW50OiBudW1iZXIsIGVkZ2VzRnJvbUNoaWxkPzogQ2F1c2FsRWRnZVtdKTogdm9pZCB7XG4gICAgaWYgKHZpc2l0ZWQuaGFzKG5vZGUucnVudGltZVN0YWdlSWQpKSB7XG4gICAgICBsaW5lcy5wdXNoKGAkeycgICcucmVwZWF0KGluZGVudCl94oazICR7bm9kZS5ydW50aW1lU3RhZ2VJZH0gKHNlZSBhYm92ZSlgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmlzaXRlZC5hZGQobm9kZS5ydW50aW1lU3RhZ2VJZCk7XG5cbiAgICBjb25zdCBsaW5rUGFydHM6IHN0cmluZ1tdID0gW107XG4gICAgaWYgKG5vZGUubGlua2VkQnkpIHtcbiAgICAgIGNvbnN0IGRhdGFFZGdlID0gZWRnZXNGcm9tQ2hpbGQ/LmZpbmQoKGUpID0+IGUua2luZCA9PT0gJ2RhdGEnKTtcbiAgICAgIGxpbmtQYXJ0cy5wdXNoKGB2aWEgJHtub2RlLmxpbmtlZEJ5fSR7d2VpZ2h0U3VmZml4KGRhdGFFZGdlKX1gKTtcbiAgICB9XG4gICAgY29uc3QgY29udHJvbEVkZ2UgPSBlZGdlc0Zyb21DaGlsZD8uZmluZCgoZSkgPT4gZS5raW5kID09PSAnY29udHJvbCcpO1xuICAgIGlmIChjb250cm9sRWRnZSkge1xuICAgICAgbGlua1BhcnRzLnB1c2goYFtjb250cm9sJHtjb250cm9sRWRnZS5rZXkgPyBgOiAke2NvbnRyb2xFZGdlLmtleX1gIDogJyd9XSR7d2VpZ2h0U3VmZml4KGNvbnRyb2xFZGdlKX1gKTtcbiAgICB9XG4gICAgY29uc3QgbGluayA9IGxpbmtQYXJ0cy5sZW5ndGggPiAwID8gYCDihpAgJHtsaW5rUGFydHMuam9pbignIOKGkCAnKX1gIDogJyc7XG5cbiAgICBjb25zdCB3cml0ZXMgPSBub2RlLmtleXNXcml0dGVuLmxlbmd0aCA+IDAgPyBgIFt3cm90ZTogJHtub2RlLmtleXNXcml0dGVuLmpvaW4oJywgJyl9XWAgOiAnJztcbiAgICBsaW5lcy5wdXNoKGAkeycgICcucmVwZWF0KGluZGVudCl9JHtub2RlLnN0YWdlTmFtZX0gKCR7bm9kZS5ydW50aW1lU3RhZ2VJZH0pJHtsaW5rfSR7d3JpdGVzfWApO1xuXG4gICAgaWYgKG5vZGUuaW5jb21wbGV0ZVNvdXJjZXMgJiYgbm9kZS5pbmNvbXBsZXRlU291cmNlcy5sZW5ndGggPiAwKSB7XG4gICAgICBsaW5lcy5wdXNoKFxuICAgICAgICBgJHsnICAnLnJlcGVhdChpbmRlbnQgKyAxKX3imqAgYWxzbyBjb25zdW1lZCAke25vZGUuaW5jb21wbGV0ZVNvdXJjZXMuam9pbignLycpfSDigJQgc2xpY2UgbWF5IGJlIGluY29tcGxldGUgaGVyZWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcGFyZW50IG9mIG5vZGUucGFyZW50cykge1xuICAgICAgd2FsayhcbiAgICAgICAgcGFyZW50LFxuICAgICAgICBpbmRlbnQgKyAxLFxuICAgICAgICBub2RlLnBhcmVudEVkZ2VzLmZpbHRlcigoZSkgPT4gZS5wYXJlbnQgPT09IHBhcmVudCksXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHdhbGsocm9vdCwgMCk7XG5cbiAgaWYgKHJvb3QudHJ1bmNhdGVkKSB7XG4gICAgY29uc3QgY2F1c2VzID0gW3Jvb3QudHJ1bmNhdGVkLmJ5RGVwdGggJiYgJ21heERlcHRoIHJlYWNoZWQnLCByb290LnRydW5jYXRlZC5ieU5vZGVzICYmICdtYXhOb2RlcyByZWFjaGVkJ11cbiAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgIC5qb2luKCcsICcpO1xuICAgIGxpbmVzLnB1c2goYOKaoCBzbGljZSB0cnVuY2F0ZWQgKCR7Y2F1c2VzfSkg4oCUIG9sZGVyIGNhdXNlcyBleGlzdCBiZXlvbmQgdGhpcyBob3Jpem9uYCk7XG4gIH1cblxuICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG59XG5cbi8vIOKUgOKUgCBFeHBvcnRlZCBmb3IgdGVzdGluZyAoaW50ZXJuYWwpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKiogQGludGVybmFsIEV4cG9zZWQgZm9yIHRlc3RpbmcgdGhlIHN0cmF0ZWd5IHNlbGVjdGlvbi4gKi9cbmV4cG9ydCBjb25zdCBfUkVWRVJTRV9JTkRFWF9USFJFU0hPTEQgPSBSRVZFUlNFX0lOREVYX1RIUkVTSE9MRDtcbiJdfQ==
|
|
457
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja3RyYWNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvYmFja3RyYWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F5REc7QUFFSCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFckQsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdEUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQWdNekMsMEVBQTBFO0FBRTFFOzs7O0dBSUc7QUFDSCxNQUFNLHVCQUF1QixHQUFHLEdBQUcsQ0FBQztBQVFwQyxrRUFBa0U7QUFDbEUsU0FBUyxnQkFBZ0IsQ0FBQyxTQUF5QjtJQUNqRCxPQUFPLENBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxFQUFFLENBQUMsY0FBYyxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDdkUsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFTLGtCQUFrQixDQUFDLFNBQXlCO0lBQ25ELE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNsQyxPQUFPLENBQUMsR0FBVyxFQUFFLFNBQWlCLEVBQTRCLEVBQUU7UUFDbEUsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNsRCxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQzdDLENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLGNBQWMsQ0FBQyxNQUFvQixF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QztRQUNKLENBQUM7SUFDSCxDQUFDO0lBRUQsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUVkLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ25CLE1BQU0sTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLElBQUksa0JBQWtCLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLElBQUksa0JBQWtCLENBQUM7YUFDeEcsTUFBTSxDQUFDLE9BQU8sQ0FBQzthQUNmLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNkLEtBQUssQ0FBQyxJQUFJLENBQUMsc0JBQXNCLE1BQU0sNENBQTRDLENBQUMsQ0FBQztJQUN2RixDQUFDO0lBRUQsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzFCLENBQUM7QUFFRCwwRUFBMEU7QUFFMUUsNERBQTREO0FBQzVELE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLHVCQUF1QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBiYWNrdHJhY2sudHMg4oCUIEJhY2t3YXJkIGNhdXNhbCBjaGFpbiBhbmFseXNpcyBvbiB0aGUgY29tbWl0IGxvZy5cbiAqXG4gKiBJbXBsZW1lbnRzICoqYmFja3dhcmQgcHJvZ3JhbSBzbGljaW5nKiogKFdlaXNlciAxOTg0LCB0aGluLXNsaWNlIHZhcmlhbnQpOlxuICogZ2l2ZW4gYSBzdGFydGluZyBleGVjdXRpb24gc3RlcCwgd2FsayBiYWNrd2FyZHMgdGhyb3VnaCByZWFk4oaSd3JpdGVcbiAqIGRlcGVuZGVuY2llcyB0byBidWlsZCB0aGUgY2F1c2FsIERBRyB0aGF0IHByb2R1Y2VkIHRoZSBkYXRhIGF0IHRoYXQgc3RlcC5cbiAqXG4gKiAjIyBBbGdvcml0aG1cbiAqXG4gKiBCRlMgb24gdGhlIGltcGxpY2l0IGRlcGVuZGVuY3kgZ3JhcGggd2hlcmUgZWRnZXMgcnVuIGZyb20gcmVhZGVyIOKGkiB3cml0ZXIuXG4gKlxuICogMS4gTG9jYXRlIHN0YXJ0SWQgaW4gY29tbWl0TG9nIOKGkiByb290IG5vZGVcbiAqIDIuIEdldCBrZXlzUmVhZCBmb3Igcm9vdCB2aWEgYGdldEtleXNSZWFkYCBjYWxsYmFja1xuICogMy4gRm9yIGVhY2gga2V5IHJlYWQsIGZpbmQgd2hvIGxhc3Qgd3JvdGUgaXQgYmVmb3JlIHRoaXMgc3RlcCDihpIgcGFyZW50IGNvbW1pdFxuICogICAgKFwid3JvdGVcIiBpcyB0aGUgd3JpdGVyIHJ1bGUgb2YgYGtleVBhdGhzLnRzYCwgOS4zMy4wOiBhIHJvdyBvbiB0aGUga2V5LCBpbnNpZGUgaXQsIG9yXG4gKiAgICBhcm91bmQgaXQgdGhhdCBjaGFuZ2VkIGl0IOKAlCBzbyBhIHN0YWdlIHRoYXQgcmVhZCBgY2ZnYCBsaW5rcyB0byB0aGUgc3ViZmxvdyBzZWVkIG9yXG4gKiAgICBtZXJnZS1iYWNrIHRoYXQgd3JvdGUgYGNmZ+KQn2JgKVxuICogNC4gQ3JlYXRlIHBhcmVudCBDYXVzYWxOb2RlLCBsaW5rIHRvIHJvb3QucGFyZW50c1xuICogNS4gRW5xdWV1ZSBwYXJlbnQuIFJlcGVhdCB1bnRpbCBxdWV1ZSBlbXB0eSBvciBsaW1pdHMgaGl0LlxuICpcbiAqIE91dHB1dCBpcyBhICoqREFHKiogKG5vdCBhIGxpbmtlZCBsaXN0KTogYSBzdGFnZSByZWFkaW5nIGBjcmVkaXRTY29yZWAgQU5EIGBkdGlgXG4gKiBmcm9tIGRpZmZlcmVudCB3cml0ZXJzIGhhcyB0d28gcGFyZW50cy5cbiAqXG4gKiAjIyBTdGFnZWQgT3B0aW1pemF0aW9uXG4gKlxuICogVHdvIHdyaXRlci1sb29rdXAgc3RyYXRlZ2llcywgY2hvc2VuIGF1dG9tYXRpY2FsbHkgYnkgY29tbWl0IGxvZyBzaXplOlxuICpcbiAqIHwgU3RyYXRlZ3kgfCBXaGVuIHwgQ29tcGxleGl0eSBwZXIgbG9va3VwIHxcbiAqIHwtLS0tLS0tLS0tfC0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tfFxuICogfCBMaW5lYXIgc2NhbiB8IE4g4omkIDI1NiB8IE8oTikg4oCUIHNpbXBsZSBiYWNrd2FyZCBzY2FuIHxcbiAqIHwgUmV2ZXJzZSBpbmRleCB8IE4gPiAyNTYgfCBPKEsgbG9nIE4pIOKAlCBwcmVidWlsdCBrZXnihpJbaW5kaWNlc10sIGJpbmFyeSBzZWFyY2ggfFxuICpcbiAqIFRoZSB0aHJlc2hvbGQgKDI1NikgaXMgY2hvc2VuIHNvIHRoZSBPKE4pIGJ1aWxkIGNvc3Qgb2YgdGhlIHJldmVyc2UgaW5kZXhcbiAqIGlzIGFtb3J0aXplZCBvdmVyIHRoZSBCRlMgdHJhdmVyc2FsLiBCZWxvdyAyNTYsIGxpbmVhciBzY2FuIHdpbnMgYmVjYXVzZVxuICogdGhlcmUncyBubyBpbmRleCBidWlsZCBvdmVyaGVhZC4gVGhlIGNvbnN1bWVyIG5ldmVyIHNlZXMgdGhpcyDigJQgYGNhdXNhbENoYWluKClgXG4gKiBwaWNrcyB0aGUgcmlnaHQgc3RyYXRlZ3kgaW50ZXJuYWxseSAobGlrZSBhIHF1ZXJ5IG9wdGltaXplciBjaG9vc2luZyBiZXR3ZWVuXG4gKiBzZXF1ZW50aWFsIHNjYW4gdnMgaW5kZXggc2NhbiBiYXNlZCBvbiB0YWJsZSBzaXplKS5cbiAqXG4gKiAjIyBDb21wbGV4aXR5XG4gKlxuICogLSAqKlNtYWxsIGxvZ3MgKE4g4omkIDI1Nik6KiogTyhWIMOXIEsgw5cgTikgdG90YWwuIFY9dmlzaXRlZCwgSz1hdmcga2V5cy9ub2RlLlxuICogLSAqKkxhcmdlIGxvZ3MgKE4gPiAyNTYpOioqIE8oTiDDlyBVKSBpbmRleCBidWlsZCArIE8oViDDlyBLIMOXIGxvZyBOKSBsb29rdXBzLlxuICogICBVID0gdW5pcXVlIGtleXMuIEFtb3J0aXplZCBvdmVyIGFsbCBCRlMgaG9wcy5cbiAqXG4gKiAjIyBSZWZlcmVuY2VzXG4gKlxuICogLSBXZWlzZXIsIE0uICgxOTg0KS4gXCJQcm9ncmFtIFNsaWNpbmcuXCIgSUVFRSBUU0UuXG4gKiAtIFNyaWRoYXJhbiwgTS4gZXQgYWwuICgyMDA3KS4gXCJUaGluIFNsaWNpbmcuXCIgUExESS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgY2F1c2FsQ2hhaW4sIGZsYXR0ZW5DYXVzYWxEQUcsIGZvcm1hdENhdXNhbENoYWluIH0gZnJvbSAnZm9vdHByaW50anMvdHJhY2UnO1xuICpcbiAqIGNvbnN0IGRhZyA9IGNhdXNhbENoYWluKGNvbW1pdExvZywgJ2RlY2lkZSMyJywgKGlkKSA9PiByZWNvcmRlci5nZXRLZXlzUmVhZChpZCkpO1xuICogY29uc3QgZmxhdCA9IGZsYXR0ZW5DYXVzYWxEQUcoZGFnKTsgICAgIC8vIEJGUy1vcmRlcmVkIGZsYXQgbGlzdFxuICogY29uc29sZS5sb2coZm9ybWF0Q2F1c2FsQ2hhaW4oZGFnKSk7ICAgICAvLyBodW1hbi1yZWFkYWJsZVxuICogYGBgXG4gKi9cblxuaW1wb3J0IHsgZmluZExhc3RXcml0ZXIgfSBmcm9tICcuL2NvbW1pdExvZ1V0aWxzLmpzJztcbmltcG9ydCB0eXBlIHsgUmVnaXN0ZXJlZENvZGUgfSBmcm9tICcuL2hvbmVzdHkuanMnO1xuaW1wb3J0IHsgcXVlcnlXb3JrLCByZWxhdGlvbiwgd3JpdGVzT25seUluc2lkZSB9IGZyb20gJy4va2V5UGF0aHMuanMnO1xuaW1wb3J0IHsgbG9nTW9kZWwgfSBmcm9tICcuL2xvZ01vZGVsLmpzJztcbmltcG9ydCB0eXBlIHsgQ29tbWl0QnVuZGxlLCBUcmFjZUVudHJ5LCBVbnRyYWNrZWRTb3VyY2UgfSBmcm9tICcuL3R5cGVzLmpzJztcblxuLy8g4pSA4pSAIFR5cGVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKiogQSBzaW5nbGUgbm9kZSBpbiB0aGUgY2F1c2FsIERBRy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2F1c2FsTm9kZSB7XG4gIC8qKiBVbmlxdWUgZXhlY3V0aW9uIHN0ZXAgaWRlbnRpZmllci4gKi9cbiAgcnVudGltZVN0YWdlSWQ6IHN0cmluZztcbiAgLyoqIFN0YWJsZSBzdGFnZSBpZGVudGlmaWVyLiAqL1xuICBzdGFnZUlkOiBzdHJpbmc7XG4gIC8qKiBIdW1hbi1yZWFkYWJsZSBzdGFnZSBuYW1lLiAqL1xuICBzdGFnZU5hbWU6IHN0cmluZztcbiAgLyoqIEtleXMgdGhpcyBzdGFnZSB3cm90ZSAoZnJvbSBpdHMgQ29tbWl0QnVuZGxlLnRyYWNlKS4gKi9cbiAga2V5c1dyaXR0ZW46IHN0cmluZ1tdO1xuICAvKiogVGhlIGtleSB3aG9zZSByZWFk4oaSd3JpdGUgZGVwZW5kZW5jeSBsaW5rZWQgdGhpcyBub2RlIHRvIGl0cyBjaGlsZC4gRW1wdHkgZm9yIHRoZSByb290LiAqL1xuICBsaW5rZWRCeTogc3RyaW5nO1xuICAvKiogQkZTIGRlcHRoIGZyb20gdGhlIHN0YXJ0aW5nIG5vZGUgKDAgPSBzdGFydCkuICovXG4gIGRlcHRoOiBudW1iZXI7XG4gIC8qKlxuICAgKiBQYXJlbnQgbm9kZXMg4oCUIHN0YWdlcyB0aGlzIG5vZGUgZGVwZW5kcyBvbi4gREFHOiBtdWx0aXBsZSBwYXJlbnRzXG4gICAqIHBvc3NpYmxlLiBLRVBUIGZvciBjb21wYXRpYmlsaXR5OyB3aXRoIHRoZSBgY29udHJvbERlcHNgIG9wdGlvblxuICAgKiAoUkZDLTAwMyBEMykgZ292ZXJuaW5nIGRlY2lkZXJzIGFwcGVhciBoZXJlIHRvby4gRm9yIHR5cGVkL2tleWVkL1xuICAgKiB3ZWlnaHRlZCBkZXRhaWwgdXNlIHtAbGluayBwYXJlbnRFZGdlc30uXG4gICAqL1xuICBwYXJlbnRzOiBDYXVzYWxOb2RlW107XG4gIC8qKlxuICAgKiBSRkMtMDAzIEQzIOKAlCBvbmUgZWRnZSBwZXIgZGVwZW5kZW5jeSBMSU5LIChub3QgcGVyIHBhcmVudCk6IGEgbm9kZVxuICAgKiByZWFkaW5nIHR3byBrZXlzIGZyb20gdGhlIHNhbWUgd3JpdGVyIGhhcyBPTkUgZW50cnkgaW4ge0BsaW5rIHBhcmVudHN9XG4gICAqIGJ1dCBUV08gYCdkYXRhJ2AgZWRnZXMgaGVyZS4gQ29udHJvbCBkZXBlbmRlbmNpZXMgKHZpYSB0aGVcbiAgICogYGNvbnRyb2xEZXBzYCBvcHRpb24pIGFkZCBhIGAnY29udHJvbCdgIGVkZ2UgdG8gdGhlIGdvdmVybmluZyBkZWNpZGVyLlxuICAgKi9cbiAgcGFyZW50RWRnZXM6IENhdXNhbEVkZ2VbXTtcbiAgLyoqXG4gICAqIFJGQy0wMDMgRDIgaG9uZXN0eSBtYXJrZXIg4oCUIHN0YW1wZWQgZnJvbSB0aGUgc3RhZ2Unc1xuICAgKiBgQ29tbWl0QnVuZGxlLnVudHJhY2tlZFNvdXJjZXNgLiBQcmVzZW50IHdoZW4gdGhpcyBzdGFnZSBBTFNPIGNvbnN1bWVkXG4gICAqIHVudHJhY2tlZCByZWFkIHBhdGhzIChgYXJnc2AgLyBgZW52YCAvIHVuc2hhZG93ZWQgYHNpbGVudGAgcmVhZHMpOiB0aGVcbiAgICogYmFja3dhcmQgc2xpY2UgdGhyb3VnaCB0aGlzIG5vZGUgbWF5IGJlIGluY29tcGxldGUsIGJlY2F1c2UgdGhvc2UgcmVhZHNcbiAgICogcHJvZHVjZSBubyByZWFk4oaSd3JpdGUgZWRnZSB0byBmb2xsb3cuIGBmb3JtYXRDYXVzYWxDaGFpbmAgcmVuZGVycyB0aGlzXG4gICAqIGFzIGEgYOKaoCDigKYgc2xpY2UgbWF5IGJlIGluY29tcGxldGUgaGVyZWAgbGluZS4gQWJzZW50IHdoZW4gdGhlIHN0YWdlJ3NcbiAgICogcmVhZHMgd2VyZSBmdWxseSB0cmFja2VkLlxuICAgKlxuICAgKiBSZWdpc3RyeSBjb2RlOiBgJ2luY29tcGxldGUtc291cmNlcydgIChgbWVtb3J5L2hvbmVzdHkudHMgwrdcbiAgICogSE9ORVNUWV9DT0RFU2AsIHNlcnZlZCBvbiBgZm9vdHByaW50anMvdHJhY2VgKSBzYXlzIHdoYXQgdGhpcyBmaWVsZFxuICAgKiBtZWFucy4gVGhlIGZpZWxkIGNhcnJpZXMgbm8gYGNvZGVgIOKAlCBpdHMgdmFsdWVzIGFyZSB0aGVcbiAgICoge0BsaW5rIFVudHJhY2tlZFNvdXJjZX1zLlxuICAgKi9cbiAgaW5jb21wbGV0ZVNvdXJjZXM/OiBSZWFkb25seUFycmF5PFVudHJhY2tlZFNvdXJjZT47XG4gIC8qKlxuICAgKiBSRkMtMDAzIEQ0IHRydW5jYXRpb24gdmlzaWJpbGl0eSDigJQgc2V0IG9uIHRoZSBST09UIG5vZGUgb25seSwgYW5kIG9ubHlcbiAgICogd2hlbiBhIGxpbWl0IGFjdHVhbGx5IGN1dCB0aGUgc2xpY2U6IGBieURlcHRoYCB3aGVuIGEgbm9kZSBhdCB0aGVcbiAgICogYG1heERlcHRoYCBob3Jpem9uIHN0aWxsIGhhZCBlZGdlcyB0byBleHBhbmQsIGBieU5vZGVzYCB3aGVuIHRoZVxuICAgKiBgbWF4Tm9kZXNgIGJ1ZGdldCBibG9ja2VkIGNyZWF0aW5nIGEgZGlzY292ZXJlZCBwYXJlbnQuIEFic2VudCB3aGVuIHRoZVxuICAgKiBzbGljZSBpcyBjb21wbGV0ZS4gYGZvcm1hdENhdXNhbENoYWluYCBhcHBlbmRzIGEgYOKaoCBzbGljZSB0cnVuY2F0ZWQg4oCmYFxuICAgKiBsaW5lIOKAlCBhIGNvbnN1bWVyIG11c3QgbmV2ZXIgbWlzdGFrZSBhIHRydW5jYXRlZCBzbGljZSBmb3IgYSBmdWxsIG9uZS5cbiAgICogKFVudGlsIDkuNDguMCBkZXYgbW9kZSBhbHNvIHdhcm5lZCBvbiB0aGUgY29uc29sZTsgdGhlIGZpZWxkIGlzIHRoZVxuICAgKiBzaWduYWwsIHJlYWQgaXQuKVxuICAgKlxuICAgKiBSZWdpc3RyeSBjb2RlOiBgJ3RydW5jYXRlZCdgIChgbWVtb3J5L2hvbmVzdHkudHMgwrcgSE9ORVNUWV9DT0RFU2AsIHNlcnZlZFxuICAgKiBvbiBgZm9vdHByaW50anMvdHJhY2VgKSBzYXlzIHdoYXQgdGhpcyBmaWVsZCBtZWFuczsgdGhlIGZpZWxkIGNhcnJpZXMgbm9cbiAgICogYGNvZGVgLlxuICAgKi9cbiAgdHJ1bmNhdGVkPzogeyBieURlcHRoOiBib29sZWFuOyBieU5vZGVzOiBib29sZWFuIH07XG4gIC8qKlxuICAgKiBGNGIgKDkuMzMuMCkg4oCUIHRoZSBrZXlzIHRoaXMgbm9kZSByZWFkIHRoYXQgTk8gY29tbWl0IGJlZm9yZSBpdCB3cm90ZSAodW5kZXIgdGhlIHdyaXRlciBydWxlKSwgc28gdGhlXG4gICAqIHdhbGsgaGFzIG5vIGVkZ2UgdG8gZm9sbG93IGZvciB0aGVtOiB0aGVpciB2YWx1ZSBjYW1lIGZyb20gdGhlIGluaXRpYWwgc3RhdGUsIGZyb3plbiBydW4gaW5wdXQgb3IgYVxuICAgKiBjbG9zdXJlIOKAlCBvdXRzaWRlIHRoZSBjb21taXQgbG9nLiBUaGUgY29kZSBzYXlzIHNvIChgJ3ByZS1ydW4tb3JpZ2luJ2AsIHJlZ2lzdGVyZWQgaW5cbiAgICogYG1lbW9yeS9ob25lc3R5LnRzIMK3IEhPTkVTVFlfQ09ERVNgKTsgYGtleXNgIGFyZSBpbiB0aGUgb3JkZXIgdGhlIHdhbGsgbWV0IHRoZW0uIEFCU0VOVCB3aGVuIGV2ZXJ5IGtleVxuICAgKiB0aGUgbm9kZSBleHBhbmRlZCBoYWQgYSB3cml0ZXIsIHNvIHN1Y2ggYSBub2RlIGtlZXBzIGl0cyA5LjMyLjAgc2hhcGUuIEJlZm9yZSA5LjMzLjAgdGhlc2UgcmVhZHMgd2VyZVxuICAgKiBkcm9wcGVkIHdpdGhvdXQgYSB3b3JkLlxuICAgKi9cbiAgcHJlUnVuUmVhZHM/OiB7IGNvZGU6IFJlZ2lzdGVyZWRDb2RlPCdwcmUtcnVuLW9yaWdpbic+OyBrZXlzOiBzdHJpbmdbXSB9O1xufVxuXG4vKipcbiAqIFJGQy0wMDMgRDMg4oCUIGEgdHlwZWQgZGVwZW5kZW5jeSBlZGdlIGZyb20gYSBjaGlsZCBub2RlIHRvIG9uZSBwYXJlbnQuXG4gKlxuICogLSBga2luZDogJ2RhdGEnYCAgICDigJQgcmVhZOKGkndyaXRlIGRlcGVuZGVuY3k7IGBrZXlgIGlzIHRoZSBzdGF0ZSBrZXkuXG4gKiAtIGBraW5kOiAnY29udHJvbCdgIOKAlCB0aGUgcGFyZW50IGlzIHRoZSBkZWNpZGVyL3NlbGVjdG9yIHdob3NlIGRlY2lzaW9uXG4gKiAgIGFsbG93ZWQgdGhlIGNoaWxkIHRvIHJ1bjsgYGtleWAgaXMgdGhlIGRlY2lkZSgpIHJ1bGUgbGFiZWwgd2hlbiBwcmVzZW50LlxuICpcbiAqIGB3ZWlnaHRgIGRlZmF1bHRzIHRvIDEuMDsgdGhlIGB3ZWlnaGAgaG9vayAoUkZDLTAwMyBENCkgY2FuIG92ZXJyaWRlIGl0LlxuICogVGhlIGVuZ2luZSBpdHNlbGYgTkVWRVIgY29tcHV0ZXMgd2VpZ2h0cyDigJQgc2VtYW50aWNzIGJlbG9uZyB0byB0aGVcbiAqIGNvbnN1bWVyLWluamVjdGVkIHdlaWdoZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2F1c2FsRWRnZSB7XG4gIHBhcmVudDogQ2F1c2FsTm9kZTtcbiAga2luZDogJ2RhdGEnIHwgJ2NvbnRyb2wnO1xuICBrZXk/OiBzdHJpbmc7XG4gIHdlaWdodDogbnVtYmVyO1xuICAvKipcbiAgICogRjRiICg5LjMzLjApIOKAlCBwcmVzZW50IG9ubHkgb24gYSBgJ2RhdGEnYCBlZGdlIHdob3NlIHBhcmVudCB3cm90ZSBga2V5YCBPTkxZIHRocm91Z2ggcm93cyBpbnNpZGUgaXRcbiAgICogKGEgc3ViZmxvdydzIGlucHV0IHNlZWQsIGFuIG91dHB1dE1hcHBlciBtZXJnZS1iYWNrLCBhIGZvcmsgY2hpbGQncyBuYW1lc3BhY2UpOiB0aGF0IHdyaXRlIG1hZGUgcGFydFxuICAgKiBvZiB0aGUgdmFsdWUsIGFuZCBlYXJsaWVyIHdyaXRlcnMgbWF5IGFjY291bnQgZm9yIHRoZSByZXN0LiBSZWdpc3RlcmVkIGFzIGAnbmVzdGVkLXJvd3MnYCBpblxuICAgKiBgbWVtb3J5L2hvbmVzdHkudHMgwrcgSE9ORVNUWV9DT0RFU2AuIEFic2VudCBmb3IgYSB3cml0ZSBvbiBvciBhcm91bmQgdGhlIGtleSwgc28gYW4gZXhhY3QgZWRnZSBrZWVwc1xuICAgKiBpdHMgOS4zMi4wIHNoYXBlLlxuICAgKi9cbiAgYmFzaXM/OiBSZWdpc3RlcmVkQ29kZTwnbmVzdGVkLXJvd3MnPjtcbn1cblxuLyoqXG4gKiBSRkMtMDAzIEQzIOKAlCBhIGNvbnRyb2wgZGVwZW5kZW5jeSByZXNvbHZlZCBmb3Igb25lIGV4ZWN1dGlvbiBzdGVwOlxuICogd2hpY2ggZGVjaWRlci9zZWxlY3RvciBleGVjdXRpb24gYWxsb3dlZCB0aGlzIHN0YWdlIHRvIHJ1bi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb250cm9sRGVwZW5kZW5jeSB7XG4gIC8qKiBydW50aW1lU3RhZ2VJZCBvZiB0aGUgZ292ZXJuaW5nIGRlY2lkZXIvc2VsZWN0b3IgZXhlY3V0aW9uIHN0ZXAuICovXG4gIGRlY2lkZXJJZDogc3RyaW5nO1xuICAvKiogVGhlIGRlY2lkZSgpIHJ1bGUgbGFiZWwgZm9yIHRoZSBjaG9zZW4gYnJhbmNoLCB3aGVuIHByZXNlbnQuICovXG4gIGxhYmVsPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJGQy0wMDMgRDMg4oCUIGNhbGxiYWNrIHJlc29sdmluZyB0aGUgZ292ZXJuaW5nIGRlY2lkZXIgZm9yIGFuIGV4ZWN1dGlvblxuICogc3RlcC4gUmV0dXJuIGB1bmRlZmluZWRgIHdoZW4gdGhlIHN0ZXAgaXMgbm90IGNvbnRyb2wtZGVwZW5kZW50IG9uIGFueVxuICogcmVjb3JkZWQgZGVjaXNpb24uIEJ1aWxkIG9uZSB3aXRoIGBjb250cm9sRGVwUmVjb3JkZXIoKWAgZnJvbVxuICogYGZvb3RwcmludGpzL3RyYWNlYCwgb3Igc3VwcGx5IHlvdXIgb3duLlxuICovXG5leHBvcnQgdHlwZSBDb250cm9sRGVwTG9va3VwID0gKHJ1bnRpbWVTdGFnZUlkOiBzdHJpbmcpID0+IENvbnRyb2xEZXBlbmRlbmN5IHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIFJGQy0wMDMgRDQg4oCUIGNvbnN1bWVyLWluamVjdGVkIGVkZ2Ugd2VpZ2hlci4gQ2FsbGVkIG9uY2UgcGVyIGNyZWF0ZWRcbiAqIGVkZ2U7IHJldHVybiBhIHdlaWdodCwgb3IgYHVuZGVmaW5lZGAgdG8ga2VlcCB0aGUgZGVmYXVsdCAxLjAuIFRoZVxuICogRU5HSU5FIG5ldmVyIGNvbXB1dGVzIHdlaWdodHMgKHplcm8gbmV3IGRlcGVuZGVuY2llcyDigJQgc2VtYW50aWNzIGxpa2VcbiAqIGVtYmVkZGluZyBzaW1pbGFyaXR5IG9yIEZETCBpbmZsdWVuY2UgYmVsb25nIHRvIGRvd25zdHJlYW0gbGlicmFyaWVzLFxuICogdGhlIHNhbWUgcGx1Zy1pbiBwYXR0ZXJuIGFzIGBOYXJyYXRpdmVGb3JtYXR0ZXJgKS4gV2VpZ2h0cyByZW5kZXIgaW5cbiAqIGBmb3JtYXRDYXVzYWxDaGFpbmAgYXMgYOKGkCB2aWEgc3lzdGVtUHJvbXB0ICgwLjE4KWAuXG4gKi9cbmV4cG9ydCB0eXBlIEVkZ2VXZWlnaGVyID0gKFxuICBjaGlsZDogQ2F1c2FsTm9kZSxcbiAgcGFyZW50OiBDYXVzYWxOb2RlLFxuICBrZXk6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAga2luZDogJ2RhdGEnIHwgJ2NvbnRyb2wnLFxuKSA9PiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbi8qKiBPcHRpb25zIGZvciBjYXVzYWxDaGFpbigpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXVzYWxDaGFpbk9wdGlvbnMge1xuICAvKiogTWF4aW11bSBCRlMgZGVwdGggKGRlZmF1bHQ6IDIwKS4gUHJldmVudHMgcnVuYXdheSB0cmF2ZXJzYWwuICovXG4gIG1heERlcHRoPzogbnVtYmVyO1xuICAvKiogTWF4aW11bSB0b3RhbCBub2RlcyB0byB2aXNpdCAoZGVmYXVsdDogMTAwKS4gSGFyZCBjYXAgZm9yIHNhZmV0eS4gKi9cbiAgbWF4Tm9kZXM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBSRkMtMDAzIEQzIOKAlCBjb250cm9sLWRlcGVuZGVuY2UgbG9va3VwLiBXaGVuIHByb3ZpZGVkLCBleHBhbmRpbmcgYSBub2RlXG4gICAqIEFMU08gbGlua3MgYSBgJ2NvbnRyb2wnYCBlZGdlIHRvIGl0cyBnb3Zlcm5pbmcgZGVjaWRlciAobGFiZWxlZCBieSB0aGVcbiAgICogZGVjaWRlKCkgcnVsZSBsYWJlbCB3aGVuIHByZXNlbnQpOyB0aGUgZGVjaWRlciBub2RlIHRoZW4gZXhwYW5kc1xuICAgKiBub3JtYWxseSB0aHJvdWdoIGl0cyBvd24gZGF0YSByZWFkcywgc28gY2hhaW5zIGxpa2VcbiAgICogYHN0YXR1cyDihpAgW2NvbnRyb2xdIENsYXNzaWZ5UmlzayDihpAgW2RhdGE6IGNyZWRpdFNjb3JlXSBQdWxsQnVyZWF1YFxuICAgKiByZXNvbHZlIGVuZC10by1lbmQuIFdpdGhvdXQgdGhpcyBvcHRpb24gYmVoYXZpb3IgaXMgdW5jaGFuZ2VkLlxuICAgKi9cbiAgY29udHJvbERlcHM/OiBDb250cm9sRGVwTG9va3VwO1xuICAvKipcbiAgICogUkZDLTAwMyBENCDigJQgZWRnZSB3ZWlnaGVyLiBTdGFtcHMgYENhdXNhbEVkZ2Uud2VpZ2h0YCBhdCBlZGdlIGNyZWF0aW9uO1xuICAgKiBgdW5kZWZpbmVkYCAob3Igbm8gd2VpZ2hlcikg4oaSIDEuMC4gU2VlIHtAbGluayBFZGdlV2VpZ2hlcn0uXG4gICAqL1xuICB3ZWlnaD86IEVkZ2VXZWlnaGVyO1xuICAvKipcbiAgICogI1AxIOKAlCBob3cgYSBub2RlJ3MgZXhwYW5zaW9uIHJlYWQtc2V0IGlzIGRlcml2ZWQ6XG4gICAqXG4gICAqIC0gYCdzdGFnZSdgIChkZWZhdWx0LCBoaXN0b3JpY2FsKSDigJQgZXZlcnkgdmlzaXRlZCBub2RlIGV4cGFuZHMgdGhyb3VnaFxuICAgKiAgIEFMTCBvZiBpdHMgc3RhZ2UncyByZWFkcyAoYGdldEtleXNSZWFkYCkuIEEgc3RhZ2UgcmVhZGluZyBgYSxiYCBhbmRcbiAgICogICB3cml0aW5nIGB4LHlgIGxpbmtzIGJvdGggcmVhZHMgYXMgY2F1c2VzIG9mIGJvdGggd3JpdGVzIOKAlCBhIHNvdW5kIGJ1dFxuICAgKiAgIGNvYXJzZSBvdmVyLWFwcHJveGltYXRpb24uXG4gICAqIC0gYCdwZXItd3JpdGUnYCDigJQgd2hlbiB0aGUgY29tbWl0IGxvZyBjYXJyaWVzIHBlci13cml0ZSByZWFkIHByb3ZlbmFuY2VcbiAgICogICAoYFRyYWNlRW50cnkucmVhZEtleXNgLCByZWNvcmRlZCB1bmRlciB0aGUgZXhlY3V0b3Inc1xuICAgKiAgIGB3cml0ZVByb3ZlbmFuY2U6ICdyZWFkcy1wcmVmaXgnYCBkaWFsKSwgYSBub2RlIHJlYWNoZWQgdmlhIGtleSBga2BcbiAgICogICBleHBhbmRzIHRocm91Z2ggT05MWSB0aGUgcmVhZHMgdGhhdCBwcmVjZWRlZCBpdHMgd3JpdGUgb2YgYGtgXG4gICAqICAgKHRlbXBvcmFsIHByZWZpeCkuIE5vZGVzIGxpbmtlZCBsYXRlciB2aWEgYWRkaXRpb25hbCBrZXlzIGFyZVxuICAgKiAgIGluY3JlbWVudGFsbHkgcmUtZXhwYW5kZWQgd2l0aCBqdXN0IHRoZSBuZXcgcmVhZHMgKHdvcmtsaXN0IOKAlCB0aGVcbiAgICogICBzbGljZSBvbmx5IGV2ZXIgR1JPV1MgdG93YXJkIHRoZSBzdGFnZS1sZXZlbCBjZWlsaW5nKS4gSE9ORVNUXG4gICAqICAgRkFMTEJBQ0s6IGFueSBsaW5rIHdob3NlIHRyYWNlIGVudHJ5IGxhY2tzIGByZWFkS2V5c2AgZXhwYW5kcyB0aGF0XG4gICAqICAgbm9kZSBhdCBzdGFnZSBsZXZlbCDigJQgbWl4ZWQgb3IgZGlhbC1vZmYgbG9ncyBkZWdyYWRlIHRvIGAnc3RhZ2UnYFxuICAgKiAgIGJlaGF2aW9yIGV4YWN0bHksIG5ldmVyIHRvIHNpbGVuY2UuXG4gICAqL1xuICBlZGdlQXR0cmlidXRpb24/OiAnc3RhZ2UnIHwgJ3Blci13cml0ZSc7XG4gIC8qKlxuICAgKiAjUDEg4oCUIHRoZSB3cml0dGVuIGtleXMgdGhhdCBhbmNob3IgdGhlIFJPT1QncyBleHBhbnNpb24gdW5kZXJcbiAgICogYCdwZXItd3JpdGUnYCAoZS5nLiBgc2xpY2VGb3JLZXlgIHBhc3NlcyB0aGUgc2xpY2VkIGtleSwgc28gdGhlIHJvb3RcbiAgICogZXhwYW5kcyB0aHJvdWdoIHRoZSByZWFkcyB0aGF0IGZlZCBUSEFUIHdyaXRlLCBub3QgdGhlIHdob2xlIHN0YWdlKS5cbiAgICogSWdub3JlZCB1bmRlciBgJ3N0YWdlJ2AuIFVuc2V0IOKGkiByb290IGV4cGFuZHMgYXQgc3RhZ2UgbGV2ZWwuXG4gICAqL1xuICByb290TGlua0tleXM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBDYWxsYmFjayB0aGF0IHJldHVybnMgdGhlIGtleXMgYSBzdGFnZSByZWFkIGR1cmluZyBleGVjdXRpb24uXG4gKiBUaGUgYmFja3RyYWNrZXIgY2FsbHMgdGhpcyBmb3IgZWFjaCB2aXNpdGVkIG5vZGUgdG8gZGV0ZXJtaW5lXG4gKiB3aGljaCByZWFk4oaSd3JpdGUgZWRnZXMgdG8gZm9sbG93LlxuICpcbiAqIEltcGxlbWVudG9yczogUXVhbGl0eVJlY29yZGVyIHRyYWNrcyBrZXlzUmVhZCBwZXIgc3RlcCxcbiAqIG9yIGJ1aWxkIGEgTWFwPHJ1bnRpbWVTdGFnZUlkLCBzdHJpbmdbXT4gZnJvbSBTY29wZVJlY29yZGVyLm9uUmVhZCBldmVudHMuXG4gKi9cbmV4cG9ydCB0eXBlIEtleXNSZWFkTG9va3VwID0gKHJ1bnRpbWVTdGFnZUlkOiBzdHJpbmcpID0+IHN0cmluZ1tdO1xuXG4vLyDilIDilIAgU3RhZ2VkIG9wdGltaXphdGlvbjogd3JpdGVyIGxvb2t1cCBzdHJhdGVnaWVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIFRocmVzaG9sZCBmb3Igc3dpdGNoaW5nIGZyb20gbGluZWFyIHNjYW4gdG8gcmV2ZXJzZSBpbmRleC5cbiAqIEJlbG93IHRoaXMsIE8oTikgc2NhbiBpcyBmYXN0ZXIgKG5vIGluZGV4IGJ1aWxkIGNvc3QpLlxuICogQWJvdmUgdGhpcywgTyhsb2cgTikgYmluYXJ5IHNlYXJjaCB3aW5zLlxuICovXG5jb25zdCBSRVZFUlNFX0lOREVYX1RIUkVTSE9MRCA9IDI1NjtcblxuLyoqXG4gKiBXcml0ZXIgbG9va3VwIGZ1bmN0aW9uIHNpZ25hdHVyZS5cbiAqIFJldHVybnMgdGhlIENvbW1pdEJ1bmRsZSB0aGF0IGxhc3Qgd3JvdGUgYGtleWAgYmVmb3JlIHBvc2l0aW9uIGBiZWZvcmVJZHhgLlxuICovXG50eXBlIFdyaXRlckxvb2t1cCA9IChrZXk6IHN0cmluZywgYmVmb3JlSWR4OiBudW1iZXIpID0+IENvbW1pdEJ1bmRsZSB8IHVuZGVmaW5lZDtcblxuLyoqIFN0cmF0ZWd5IDE6IExpbmVhciBzY2FuIOKAlCBPKE4pIHBlciBsb29rdXAsIHplcm8gc2V0dXAgY29zdC4gKi9cbmZ1bmN0aW9uIGxpbmVhclNjYW5Mb29rdXAoY29tbWl0TG9nOiBDb21taXRCdW5kbGVbXSk6IFdyaXRlckxvb2t1cCB7XG4gIHJldHVybiAoa2V5LCBiZWZvcmVJZHgpID0+IGZpbmRMYXN0V3JpdGVyKGNvbW1pdExvZywga2V5LCBiZWZvcmVJZHgpO1xufVxuXG4vKipcbiAqIFN0cmF0ZWd5IDI6IFJldmVyc2UgaW5kZXgg4oCUIG9uZSBPKHJvd3MpIGJ1aWxkLCBPKGRlcHRoICsgbG9nIE4pIHBlciBsb29rdXAuXG4gKiBUaGUgbG9nJ3MgcmVhZCBtb2RlbCAoYGxvZ01vZGVsLnRzYDogYSBwYXRoIHRyaWUsIGVhY2ggdG9wLWxldmVsIGtleSBmb2xkZWQgYXRcbiAqIG1vc3Qgb25jZSkgYW5zd2VycyB0aGUgd3JpdGVyIHJ1bGUg4oCUIHJvd3Mgb24sIGluc2lkZSBvciBhcm91bmQgdGhlIGtleSDigJQgYnlcbiAqIGJpbmFyeSBzZWFyY2ggZm9yIHRoZSBsYXN0IHdyaXRlIG9uIG9yIGluc2lkZSBpdCwgdGhlbiBhIHZlcmRpY3Qgb25seSBmb3IgdGhlXG4gKiBhcm91bmQtY2FuZGlkYXRlcyBhZnRlciBpdC4gVGhlIHNhbWUgYW5zd2VyIGBmaW5kTGFzdFdyaXRlcmAgZ2l2ZXMsIHNvIHRoZVxuICogc3RyYXRlZ3kgc3dpdGNoIGJlbG93IG5ldmVyIGNoYW5nZXMgYSBzbGljZS5cbiAqL1xuZnVuY3Rpb24gcmV2ZXJzZUluZGV4TG9va3VwKGNvbW1pdExvZzogQ29tbWl0QnVuZGxlW10pOiBXcml0ZXJMb29rdXAge1xuICBjb25zdCBtb2RlbCA9IGxvZ01vZGVsKGNvbW1pdExvZyk7XG4gIHJldHVybiAoa2V5OiBzdHJpbmcsIGJlZm9yZUlkeDogbnVtYmVyKTogQ29tbWl0QnVuZGxlIHwgdW5kZWZpbmVkID0+IHtcbiAgICBjb25zdCBhdCA9IG1vZGVsLmxhc3RXcml0ZXJCZWZvcmUoa2V5LCBiZWZvcmVJZHgpO1xuICAgIHJldHVybiBhdCA+PSAwID8gY29tbWl0TG9nW2F0XSA6IHVuZGVmaW5lZDtcbiAgfTtcbn1cblxuLyoqXG4gKiBUaGUgdHJhY2UgZW50cmllcyBvZiBgY29tbWl0YCB0aGF0IG1ha2UgaXQgYSB3cml0ZXIgb2YgYGxpbmtLZXlgIOKAlCB0aGUgZW50cmllcyB3aG9zZSByZWFkXG4gKiBwcmVmaXggKGBUcmFjZUVudHJ5LnJlYWRLZXlzYCkgYSBwZXItd3JpdGUgZWRnZSBleHBhbmRzIHRocm91Z2guIFRoZSBGSVJTVCBlbnRyeSBvbiB0aGUgZXhhY3RcbiAqIHBhdGggd2hlbiB0aGVyZSBpcyBvbmUgKHRoZSAjUDEgYmVoYXZpb3VyLCB1bmNoYW5nZWQpOyBvdGhlcndpc2UgZXZlcnkgZW50cnkgaW5zaWRlIG9yIGFyb3VuZFxuICogdGhlIGtleSAoOS4zMy4wOiB0aGUgY29tbWl0IHdyb3RlIHRoZSBrZXkgdGhyb3VnaCBhIG5lc3RlZCByb3cg4oCUIGEgc3ViZmxvdyBzZWVkLCBhblxuICogb3V0cHV0TWFwcGVyIG1lcmdlLWJhY2sg4oCUIGFuZCBhbGwgb2YgdGhvc2Ugcm93cyB3cm90ZSBpdCkuXG4gKi9cbmZ1bmN0aW9uIGxpbmtpbmdFbnRyaWVzKGNvbW1pdDogQ29tbWl0QnVuZGxlLCBsaW5rS2V5OiBzdHJpbmcpOiBUcmFjZUVudHJ5W10ge1xuICBjb25zdCBleGFjdCA9IGNvbW1pdC50cmFjZS5maW5kKCh0KSA9PiB0LnBhdGggPT09IGxpbmtLZXkpO1xuICBpZiAoZXhhY3QgIT09IHVuZGVmaW5lZCkgcmV0dXJuIFtleGFjdF07XG4gIHJldHVybiBjb21taXQudHJhY2UuZmlsdGVyKCh0KSA9PiByZWxhdGlvbih0LnBhdGgsIGxpbmtLZXkpICE9PSB1bmRlZmluZWQpO1xufVxuXG4vKipcbiAqIFN0YWdlZCBvcHRpbWl6YXRpb246IHBpY2sgdGhlIHJpZ2h0IHdyaXRlci1sb29rdXAgc3RyYXRlZ3kgYmFzZWQgb24gZGF0YSBzaXplLlxuICpcbiAqIExpa2UgYSBkYXRhYmFzZSBxdWVyeSBvcHRpbWl6ZXIgY2hvb3NpbmcgYmV0d2VlbiBzZXF1ZW50aWFsIHNjYW4gYW5kIGluZGV4IHNjYW46XG4gKlxuICogLSAqKlNtYWxsIGxvZyAo4omkIDI1Nik6KiogTGluZWFyIHNjYW4gd2lucy4gWmVybyBzZXR1cCBjb3N0LCBnb29kIGNhY2hlIGxvY2FsaXR5LlxuICogICBUaGUgb3ZlcmhlYWQgb2YgYnVpbGRpbmcgYSByZXZlcnNlIGluZGV4IGlzbid0IHdvcnRoIGl0IGZvciBzaG9ydCBsb2dzLlxuICpcbiAqIC0gKipMYXJnZSBsb2cgKD4gMjU2KToqKiBSZXZlcnNlIGluZGV4IHdpbnMuIE8oTsOXVSkgdXBmcm9udCBidWlsZCBjb3N0IGlzIGFtb3J0aXplZFxuICogICBhY3Jvc3MgYWxsIEJGUyBob3BzLiBFYWNoIGxvb2t1cCBiZWNvbWVzIE8obG9nIE4pIHZpYSBiaW5hcnkgc2VhcmNoIGluc3RlYWQgb2YgTyhOKS5cbiAqICAgRm9yIGFuIGFnZW50IGxvb3Agd2l0aCA1MDAgaXRlcmF0aW9ucyBhbmQgNSBrZXlzIHBlciBob3AsIHRoaXMgaXMgNTAww5c1w5dsb2coNTAwKeKJiDIySyBvcHNcbiAqICAgdnMgNTAww5c1w5c1MDA9MS4yNU0gb3BzIHdpdGggbGluZWFyIHNjYW4uXG4gKlxuICogVGhlIGNhbGxlciBuZXZlciBzZWVzIHRoaXMg4oCUIGBjYXVzYWxDaGFpbigpYCBwaWNrcyBhdXRvbWF0aWNhbGx5LlxuICovXG5mdW5jdGlvbiBjcmVhdGVXcml0ZXJMb29rdXAoY29tbWl0TG9nOiBDb21taXRCdW5kbGVbXSk6IFdyaXRlckxvb2t1cCB7XG4gIGlmIChjb21taXRMb2cubGVuZ3RoIDw9IFJFVkVSU0VfSU5ERVhfVEhSRVNIT0xEKSB7XG4gICAgcmV0dXJuIGxpbmVhclNjYW5Mb29rdXAoY29tbWl0TG9nKTtcbiAgfVxuICByZXR1cm4gcmV2ZXJzZUluZGV4TG9va3VwKGNvbW1pdExvZyk7XG59XG5cbi8vIOKUgOKUgCBDb3JlIGFsZ29yaXRobSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBSRkMtMDAzIEQyOiB0aGUgYGluY29tcGxldGVTb3VyY2VzYCBub2RlIGZyYWdtZW50IGZvciBhIGNvbW1pdCDigJQgYHt9YFxuICogd2hlbiB0aGUgc3RhZ2UgY29uc3VtZWQgbm8gdW50cmFja2VkIHJlYWQgcGF0aHMsIGtlZXBpbmcgdGhlIGZpZWxkXG4gKiBBQlNFTlQgKG5vdCBlbXB0eS1hcnJheS12YWx1ZWQpIGZvciBmdWxseS10cmFja2VkIHN0YWdlcy5cbiAqL1xuZnVuY3Rpb24gaW5jb21wbGV0ZVNvdXJjZXNGcmFnbWVudChjb21taXQ6IENvbW1pdEJ1bmRsZSk6IHsgaW5jb21wbGV0ZVNvdXJjZXM/OiBSZWFkb25seUFycmF5PFVudHJhY2tlZFNvdXJjZT4gfSB7XG4gIGlmICghY29tbWl0LnVudHJhY2tlZFNvdXJjZXMgfHwgY29tbWl0LnVudHJhY2tlZFNvdXJjZXMubGVuZ3RoID09PSAwKSByZXR1cm4ge307XG4gIHJldHVybiB7IGluY29tcGxldGVTb3VyY2VzOiBjb21taXQudW50cmFja2VkU291cmNlcyB9O1xufVxuXG4vKipcbiAqIEJ1aWxkIHRoZSBjYXVzYWwgREFHIHJvb3RlZCBhdCBgc3RhcnRJZGAgYnkgd2Fsa2luZyBiYWNrd2FyZHNcbiAqIHRocm91Z2ggcmVhZOKGkndyaXRlIGRlcGVuZGVuY2llcyBpbiB0aGUgY29tbWl0IGxvZy5cbiAqXG4gKiBBdXRvbWF0aWNhbGx5IHNlbGVjdHMgdGhlIG9wdGltYWwgd3JpdGVyIGxvb2t1cCBzdHJhdGVneTpcbiAqIC0gTGluZWFyIHNjYW4gZm9yIHNtYWxsIGxvZ3MgKOKJpCAyNTYgY29tbWl0cylcbiAqIC0gUmV2ZXJzZSBpbmRleCB3aXRoIGJpbmFyeSBzZWFyY2ggZm9yIGxhcmdlIGxvZ3MgKD4gMjU2IGNvbW1pdHMpXG4gKlxuICogUHJvZHVjZXMgYSBEQUcgKG5vdCBhIHRyZWUpOiBpZiB0d28gY2hpbGRyZW4gYm90aCByZWFkIGZyb20gdGhlIHNhbWVcbiAqIHBhcmVudCwgdGhlIHBhcmVudCBub2RlIGlzIHNoYXJlZCAoZGVkdXBlZCBieSBydW50aW1lU3RhZ2VJZCkuXG4gKlxuICogQHBhcmFtIGNvbW1pdExvZyAgIE9yZGVyZWQgY29tbWl0IGJ1bmRsZXMgZnJvbSBleGVjdXRvci5nZXRTbmFwc2hvdCgpLmNvbW1pdExvZ1xuICogQHBhcmFtIHN0YXJ0SWQgICAgIHJ1bnRpbWVTdGFnZUlkIHRvIHN0YXJ0IGJhY2t0cmFja2luZyBmcm9tXG4gKiBAcGFyYW0gZ2V0S2V5c1JlYWQgQ2FsbGJhY2sgcmV0dXJuaW5nIGtleXMgcmVhZCBieSBhIGdpdmVuIGV4ZWN1dGlvbiBzdGVwXG4gKiBAcGFyYW0gb3B0aW9ucyAgICAgRGVwdGggYW5kIG5vZGUgbGltaXRzXG4gKiBAcmV0dXJucyBSb290IENhdXNhbE5vZGUgd2l0aCAucGFyZW50cyBmb3JtaW5nIHRoZSBEQUcsIG9yIHVuZGVmaW5lZCBpZiBzdGFydElkIG5vdCBmb3VuZFxuICovXG5leHBvcnQgZnVuY3Rpb24gY2F1c2FsQ2hhaW4oXG4gIGNvbW1pdExvZzogQ29tbWl0QnVuZGxlW10sXG4gIHN0YXJ0SWQ6IHN0cmluZyxcbiAgZ2V0S2V5c1JlYWQ6IEtleXNSZWFkTG9va3VwLFxuICBvcHRpb25zPzogQ2F1c2FsQ2hhaW5PcHRpb25zLFxuKTogQ2F1c2FsTm9kZSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG1heERlcHRoID0gb3B0aW9ucz8ubWF4RGVwdGggPz8gMjA7XG4gIGNvbnN0IG1heE5vZGVzID0gb3B0aW9ucz8ubWF4Tm9kZXMgPz8gMTAwO1xuICBjb25zdCBjb250cm9sRGVwcyA9IG9wdGlvbnM/LmNvbnRyb2xEZXBzO1xuICBjb25zdCB3ZWlnaCA9IG9wdGlvbnM/LndlaWdoO1xuICBjb25zdCBwZXJXcml0ZSA9IG9wdGlvbnM/LmVkZ2VBdHRyaWJ1dGlvbiA9PT0gJ3Blci13cml0ZSc7XG5cbiAgLy8gUkZDLTAwMyBENCDigJQgdHJ1bmNhdGlvbiB2aXNpYmlsaXR5LiBTZXQgb25seSB3aGVuIGEgbGltaXQgYWN0dWFsbHlcbiAgLy8gY3V0cyB0aGUgc2xpY2U7IHN1cmZhY2VkIG9uIHRoZSByb290IGFzIGB0cnVuY2F0ZWRgIHNvIGEgY29uc3VtZXIgY2FuXG4gIC8vIG5ldmVyIG1pc3Rha2UgYSB0cnVuY2F0ZWQgc2xpY2UgZm9yIGEgY29tcGxldGUgb25lLlxuICBsZXQgdHJ1bmNhdGVkQnlEZXB0aCA9IGZhbHNlO1xuICBsZXQgdHJ1bmNhdGVkQnlOb2RlcyA9IGZhbHNlO1xuXG4gIC8vIEJ1aWxkIHBvc2l0aW9uIGluZGV4OiBydW50aW1lU3RhZ2VJZCDihpIgYXJyYXkgcG9zaXRpb24gKE8obikgb25jZSlcbiAgY29uc3QgaWR4TWFwID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb21taXRMb2cubGVuZ3RoOyBpKyspIHtcbiAgICBpZHhNYXAuc2V0KGNvbW1pdExvZ1tpXS5ydW50aW1lU3RhZ2VJZCwgaSk7XG4gIH1cbiAgcXVlcnlXb3JrLnVuaXRzICs9IGNvbW1pdExvZy5sZW5ndGg7XG5cbiAgY29uc3Qgc3RhcnRJZHggPSBpZHhNYXAuZ2V0KHN0YXJ0SWQpO1xuICBpZiAoc3RhcnRJZHggPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBjb25zdCBzdGFydENvbW1pdCA9IGNvbW1pdExvZ1tzdGFydElkeF07XG5cbiAgLy8gUGljayB3cml0ZXIgbG9va3VwIHN0cmF0ZWd5IGJhc2VkIG9uIGxvZyBzaXplXG4gIGNvbnN0IGZpbmRXcml0ZXIgPSBjcmVhdGVXcml0ZXJMb29rdXAoY29tbWl0TG9nKTtcblxuICAvLyBOb2RlIGRlZHVwIG1hcDogcnVudGltZVN0YWdlSWQg4oaSIENhdXNhbE5vZGUgKGVuc3VyZXMgREFHLCBub3QgdHJlZSlcbiAgY29uc3Qgbm9kZU1hcCA9IG5ldyBNYXA8c3RyaW5nLCBDYXVzYWxOb2RlPigpO1xuXG4gIGNvbnN0IHJvb3Q6IENhdXNhbE5vZGUgPSB7XG4gICAgcnVudGltZVN0YWdlSWQ6IHN0YXJ0SWQsXG4gICAgc3RhZ2VJZDogc3RhcnRDb21taXQuc3RhZ2VJZCxcbiAgICBzdGFnZU5hbWU6IHN0YXJ0Q29tbWl0LnN0YWdlLFxuICAgIGtleXNXcml0dGVuOiBzdGFydENvbW1pdC50cmFjZS5tYXAoKHQpID0+IHQucGF0aCksXG4gICAgbGlua2VkQnk6ICcnLFxuICAgIGRlcHRoOiAwLFxuICAgIHBhcmVudHM6IFtdLFxuICAgIHBhcmVudEVkZ2VzOiBbXSxcbiAgICAuLi5pbmNvbXBsZXRlU291cmNlc0ZyYWdtZW50KHN0YXJ0Q29tbWl0KSxcbiAgfTtcbiAgbm9kZU1hcC5zZXQoc3RhcnRJZCwgcm9vdCk7XG5cbiAgLy8g4pSA4pSAICNQMSBwZXItd3JpdGUgYXR0cmlidXRpb24gbWFjaGluZXJ5IChpbmVydCB1bmRlciAnc3RhZ2UnKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy8gZXhwYW5kZWRSZWFkczogcGVyIG5vZGUsIHRoZSByZWFkcyBhbHJlYWR5IHF1ZXVlZCBmb3IgZXhwYW5zaW9uIOKAlCBsYXRlXG4gIC8vIGxpbmtzIHZpYSBhZGRpdGlvbmFsIGtleXMgcmUtZW5xdWV1ZSBvbmx5IHRoZSBERUxUQSwgc28gdGhlIHNsaWNlIGdyb3dzXG4gIC8vIG1vbm90b25pY2FsbHkgdG93YXJkIHRoZSBzdGFnZS1sZXZlbCBjZWlsaW5nIGFuZCB0ZXJtaW5hdGVzIChlYWNoIGtleVxuICAvLyBleHBhbmRzIGF0IG1vc3Qgb25jZSBwZXIgbm9kZSkuIGZ1bGx5RXhwYW5kZWQ6IG5vZGVzIHRoYXQgZmVsbCBiYWNrIHRvXG4gIC8vIHN0YWdlIGxldmVsIChubyByZWFkS2V5cyBvbiBhIGxpbmtpbmcgZW50cnkpIOKAlCBub3RoaW5nIGxlZnQgdG8gYWRkLlxuICBjb25zdCBleHBhbmRlZFJlYWRzID0gbmV3IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+PigpO1xuICBjb25zdCBmdWxseUV4cGFuZGVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgYSBub2RlJ3MgZXhwYW5zaW9uIHJlYWQtc2V0IGZvciB0aGUgZ2l2ZW4gbGlua2luZyBXUklUVEVOIGtleXMuXG4gICAqIFBlci13cml0ZSBtb2RlIHdpdGggcHJvdmVuYW5jZSBwcmVzZW50IOKGkiB1bmlvbiBvZiB0aGUgbGlua2luZyB3cml0ZXMnXG4gICAqIHRlbXBvcmFsLXByZWZpeCBgcmVhZEtleXNgLiBBbnkgbGlua2luZyBlbnRyeSBXSVRIT1VUIGByZWFkS2V5c2AgKG9yIG5vXG4gICAqIGxpbmtLZXlzIGF0IGFsbCkg4oaSIGhvbmVzdCBzdGFnZS1sZXZlbCBmYWxsYmFjaywgZmxhZ2dlZCB2aWEgdGhlIHNlY29uZFxuICAgKiB0dXBsZSBtZW1iZXIgc28gdGhlIGNhbGxlciBtYXJrcyB0aGUgbm9kZSBmdWxseSBleHBhbmRlZC5cbiAgICovXG4gIGZ1bmN0aW9uIHJlYWRzRm9yTGlua3MoY29tbWl0OiBDb21taXRCdW5kbGUsIGxpbmtLZXlzOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCk6IFtzdHJpbmdbXSwgYm9vbGVhbl0ge1xuICAgIGlmICghcGVyV3JpdGUgfHwgIWxpbmtLZXlzIHx8IGxpbmtLZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtnZXRLZXlzUmVhZChjb21taXQucnVudGltZVN0YWdlSWQpLCB0cnVlXTtcbiAgICB9XG4gICAgY29uc3QgdW5pb24gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IGxpbmtLZXkgb2YgbGlua0tleXMpIHtcbiAgICAgIGNvbnN0IGVudHJpZXMgPSBsaW5raW5nRW50cmllcyhjb21taXQsIGxpbmtLZXkpO1xuICAgICAgaWYgKGVudHJpZXMubGVuZ3RoID09PSAwIHx8IGVudHJpZXMuc29tZSgoZSkgPT4gZS5yZWFkS2V5cyA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICAvLyBNaXhlZC9kaWFsLW9mZiBsb2cg4oCUIGRlZ3JhZGUgVEhJUyBub2RlIHRvIHN0YWdlIGxldmVsLCBob25lc3RseS5cbiAgICAgICAgcmV0dXJuIFtnZXRLZXlzUmVhZChjb21taXQucnVudGltZVN0YWdlSWQpLCB0cnVlXTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykgZm9yIChjb25zdCByayBvZiBlbnRyeS5yZWFkS2V5cyBhcyBzdHJpbmdbXSkgdW5pb24uYWRkKHJrKTtcbiAgICB9XG4gICAgcmV0dXJuIFtbLi4udW5pb25dLCBmYWxzZV07XG4gIH1cblxuICAvLyBCRlMvd29ya2xpc3QgcXVldWU6IFtub2RlLCBjb21taXRJZHgsIGRlcHRoLCBrZXlzVG9FeHBhbmRdXG4gIGNvbnN0IFtyb290UmVhZHMsIHJvb3RJc0Z1bGxdID0gcGVyV3JpdGVcbiAgICA/IHJlYWRzRm9yTGlua3Moc3RhcnRDb21taXQsIG9wdGlvbnM/LnJvb3RMaW5rS2V5cylcbiAgICA6IFtnZXRLZXlzUmVhZChzdGFydElkKSwgdHJ1ZV07XG4gIGV4cGFuZGVkUmVhZHMuc2V0KHN0YXJ0SWQsIG5ldyBTZXQocm9vdFJlYWRzKSk7XG4gIGlmIChyb290SXNGdWxsKSBmdWxseUV4cGFuZGVkLmFkZChzdGFydElkKTtcbiAgY29uc3QgcXVldWU6IEFycmF5PFtDYXVzYWxOb2RlLCBudW1iZXIsIG51bWJlciwgc3RyaW5nW11dPiA9IFtbcm9vdCwgc3RhcnRJZHgsIDAsIHJvb3RSZWFkc11dO1xuICBsZXQgdmlzaXRlZCA9IDE7XG5cbiAgLyoqXG4gICAqIExpbmsgYG5vZGUg4oaSIHBhcmVudGAgKGNyZWF0aW5nICsgZW5xdWV1ZWluZyB0aGUgcGFyZW50IHdoZW4gbmV3KS5cbiAgICogU2hhcmVkIGJ5IGRhdGEtZWRnZSBleHBhbnNpb24gKHJlYWTihpJ3cml0ZSkgYW5kIGNvbnRyb2wtZWRnZSBleHBhbnNpb25cbiAgICogKEQzKS4gT25lIENhdXNhbEVkZ2UgcGVyIGRpc3RpbmN0IChwYXJlbnQsIGtpbmQsIGtleSkgbGluazsgYHBhcmVudHNgXG4gICAqIGtlZXBzIGl0cyBoaXN0b3JpY2FsIG9uZS1lbnRyeS1wZXItcGFyZW50IGRlZHVwLlxuICAgKi9cbiAgZnVuY3Rpb24gbGlua1BhcmVudChcbiAgICBub2RlOiBDYXVzYWxOb2RlLFxuICAgIHBhcmVudENvbW1pdDogQ29tbWl0QnVuZGxlLFxuICAgIGtpbmQ6ICdkYXRhJyB8ICdjb250cm9sJyxcbiAgICBrZXk6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBkZXB0aDogbnVtYmVyLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBwYXJlbnRJZCA9IHBhcmVudENvbW1pdC5ydW50aW1lU3RhZ2VJZDtcbiAgICAvLyB0aGUgZGVkdXAgc2NhbnMgYmVsb3csIGFuZCB0aGUgcGFyZW50J3MgdHJhY2Ugd2hlbiBpdCBpcyBuZXcg4oCUIGNvdW50ZWQgZm9yIHRoZSBzY2FsaW5nIHRlc3RcbiAgICBxdWVyeVdvcmsudW5pdHMgKz0gMSArIG5vZGUucGFyZW50cy5sZW5ndGggKyBub2RlLnBhcmVudEVkZ2VzLmxlbmd0aDtcbiAgICAvLyAjUDE6IHRoZSBwYXJlbnQncyBleHBhbnNpb24gcmVhZHMsIHJlc29sdmVkIExBWklMWSAob25seSBmb3IgbmV3IG5vZGVzXG4gICAgLy8gb3IgcGVyLXdyaXRlIHJlLWV4cGFuc2lvbiDigJQgZHVwbGljYXRlIGxpbmtzIHVuZGVyICdzdGFnZScgcGF5IG5vdGhpbmcpLlxuICAgIC8vIERhdGEgbGlua3MgZXhwYW5kIHRocm91Z2ggdGhlIHJlYWRzIHRoYXQgZmVkIHRoZSBwYXJlbnQncyB3cml0ZSBvZlxuICAgIC8vIGBrZXlgOyBjb250cm9sIGxpbmtzIGV4cGFuZCB0aGUgZGVjaWRlciBhdCBzdGFnZSBsZXZlbCAoYSBkZWNpc2lvblxuICAgIC8vIGRlcGVuZHMgb24gZXZlcnl0aGluZyBpdCByZWFkKS5cbiAgICBjb25zdCByZXNvbHZlTGlua1JlYWRzID0gKCk6IFtzdHJpbmdbXSwgYm9vbGVhbl0gPT5cbiAgICAgIGtpbmQgPT09ICdkYXRhJ1xuICAgICAgICA/IHJlYWRzRm9yTGlua3MocGFyZW50Q29tbWl0LCBrZXkgIT09IHVuZGVmaW5lZCA/IFtrZXldIDogdW5kZWZpbmVkKVxuICAgICAgICA6IFtnZXRLZXlzUmVhZChwYXJlbnRJZCksIHRydWVdO1xuXG4gICAgbGV0IHBhcmVudE5vZGUgPSBub2RlTWFwLmdldChwYXJlbnRJZCk7XG4gICAgaWYgKCFwYXJlbnROb2RlKSB7XG4gICAgICAvLyBOZXcgbm9kZSDigJQgY3JlYXRlIGFuZCBlbnF1ZXVlIChyZXNwZWN0aW5nIHRoZSBub2RlIGJ1ZGdldClcbiAgICAgIGlmICh2aXNpdGVkID49IG1heE5vZGVzKSB7XG4gICAgICAgIHRydW5jYXRlZEJ5Tm9kZXMgPSB0cnVlOyAvLyBENDogYSBkaXNjb3ZlcmVkIHBhcmVudCB3YXMgZHJvcHBlZFxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhcmVudElkeCA9IGlkeE1hcC5nZXQocGFyZW50SWQpO1xuICAgICAgaWYgKHBhcmVudElkeCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG5cbiAgICAgIHF1ZXJ5V29yay51bml0cyArPSBwYXJlbnRDb21taXQudHJhY2UubGVuZ3RoO1xuICAgICAgcGFyZW50Tm9kZSA9IHtcbiAgICAgICAgcnVudGltZVN0YWdlSWQ6IHBhcmVudElkLFxuICAgICAgICBzdGFnZUlkOiBwYXJlbnRDb21taXQuc3RhZ2VJZCxcbiAgICAgICAgc3RhZ2VOYW1lOiBwYXJlbnRDb21taXQuc3RhZ2UsXG4gICAgICAgIGtleXNXcml0dGVuOiBwYXJlbnRDb21taXQudHJhY2UubWFwKCh0KSA9PiB0LnBhdGgpLFxuICAgICAgICAvLyBsaW5rZWRCeSBzdGF5cyBhIERBVEEta2V5IGNvbmNlcHQgKGJhY2stY29tcGF0KSDigJQgY29udHJvbC1saW5rZWRcbiAgICAgICAgLy8gbm9kZXMgY2FycnkgdGhlaXIgbGFiZWwgb24gdGhlIGVkZ2UgaW5zdGVhZC5cbiAgICAgICAgbGlua2VkQnk6IGtpbmQgPT09ICdkYXRhJyA/IGtleSA/PyAnJyA6ICcnLFxuICAgICAgICBkZXB0aDogZGVwdGggKyAxLFxuICAgICAgICBwYXJlbnRzOiBbXSxcbiAgICAgICAgcGFyZW50RWRnZXM6IFtdLFxuICAgICAgICAuLi5pbmNvbXBsZXRlU291cmNlc0ZyYWdtZW50KHBhcmVudENvbW1pdCksXG4gICAgICB9O1xuICAgICAgbm9kZU1hcC5zZXQocGFyZW50SWQsIHBhcmVudE5vZGUpO1xuICAgICAgdmlzaXRlZCsrO1xuICAgICAgY29uc3QgW2xpbmtSZWFkcywgbGlua0lzRnVsbF0gPSByZXNvbHZlTGlua1JlYWRzKCk7XG4gICAgICBleHBhbmRlZFJlYWRzLnNldChwYXJlbnRJZCwgbmV3IFNldChsaW5rUmVhZHMpKTtcbiAgICAgIGlmIChsaW5rSXNGdWxsKSBmdWxseUV4cGFuZGVkLmFkZChwYXJlbnRJZCk7XG4gICAgICBxdWV1ZS5wdXNoKFtwYXJlbnROb2RlLCBwYXJlbnRJZHgsIGRlcHRoICsgMSwgbGlua1JlYWRzXSk7XG4gICAgfSBlbHNlIGlmIChwZXJXcml0ZSAmJiAhZnVsbHlFeHBhbmRlZC5oYXMocGFyZW50SWQpKSB7XG4gICAgICAvLyAjUDEgd29ya2xpc3Q6IGFuIEVYSVNUSU5HIG5vZGUgbGlua2VkIHZpYSBhbm90aGVyIGtleSBtYXkgb3dlIG1vcmVcbiAgICAgIC8vIGV4cGFuc2lvbiDigJQgZW5xdWV1ZSBvbmx5IHRoZSByZWFkcyBub3QgeWV0IGV4cGFuZGVkIChtb25vdG9uZTsgdGhlXG4gICAgICAvLyBub2RlIGJ1ZGdldCBpcyB1bnRvdWNoZWQsIG5vIG5vZGUgaXMgY3JlYXRlZCkuIFJlLWV4cGFuc2lvbiBrZWVwc1xuICAgICAgLy8gdGhlIG5vZGUncyBPUklHSU5BTCBkZXB0aCBzbyBpdHMgcGFyZW50cyBnZXQgYSBjb25zaXN0ZW50IGRlcHRoKzEuXG4gICAgICBjb25zdCBbbGlua1JlYWRzLCBsaW5rSXNGdWxsXSA9IHJlc29sdmVMaW5rUmVhZHMoKTtcbiAgICAgIGNvbnN0IGV4cGFuZGVkID0gZXhwYW5kZWRSZWFkcy5nZXQocGFyZW50SWQpITtcbiAgICAgIGNvbnN0IGRlbHRhID0gbGlua1JlYWRzLmZpbHRlcigoaykgPT4gIWV4cGFuZGVkLmhhcyhrKSk7XG4gICAgICBpZiAobGlua0lzRnVsbCkgZnVsbHlFeHBhbmRlZC5hZGQocGFyZW50SWQpO1xuICAgICAgaWYgKGRlbHRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZm9yIChjb25zdCBrIG9mIGRlbHRhKSBleHBhbmRlZC5hZGQoayk7XG4gICAgICAgIGNvbnN0IHBhcmVudElkeCA9IGlkeE1hcC5nZXQocGFyZW50SWQpO1xuICAgICAgICBpZiAocGFyZW50SWR4ICE9PSB1bmRlZmluZWQpIHF1ZXVlLnB1c2goW3BhcmVudE5vZGUsIHBhcmVudElkeCwgcGFyZW50Tm9kZS5kZXB0aCwgZGVsdGFdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEQUcgbWVyZ2U6IG9uZSBwYXJlbnRzW10gZW50cnkgcGVyIGRpc3RpbmN0IHBhcmVudCAoaGlzdG9yaWNhbCBzaGFwZSlcbiAgICBpZiAoIW5vZGUucGFyZW50cy5zb21lKChwKSA9PiBwLnJ1bnRpbWVTdGFnZUlkID09PSBwYXJlbnRJZCkpIHtcbiAgICAgIG5vZGUucGFyZW50cy5wdXNoKHBhcmVudE5vZGUpO1xuICAgIH1cbiAgICAvLyBPbmUgZWRnZSBwZXIgZGlzdGluY3QgKHBhcmVudCwga2luZCwga2V5KSBsaW5rLiBUaGUgd2VpZ2hlciAoRDQpXG4gICAgLy8gc3RhbXBzIHRoZSB3ZWlnaHQgYXQgY3JlYXRpb247IGB1bmRlZmluZWRgIOKGkiAxLjAg4oCUIHRoZSBlbmdpbmUgbmV2ZXJcbiAgICAvLyBjb21wdXRlcyB3ZWlnaHRzIGl0c2VsZi5cbiAgICBpZiAoIW5vZGUucGFyZW50RWRnZXMuc29tZSgoZSkgPT4gZS5wYXJlbnQucnVudGltZVN0YWdlSWQgPT09IHBhcmVudElkICYmIGUua2luZCA9PT0ga2luZCAmJiBlLmtleSA9PT0ga2V5KSkge1xuICAgICAgLy8gRXJyb3IgaXNvbGF0aW9uIChyZXZpZXcgZmluZGluZyk6IGEgY29uc3VtZXIgd2VpZ2hlciB0aGF0IHRocm93c1xuICAgICAgLy8gbXVzdCBkZWdyYWRlIHRvIHRoZSBkZWZhdWx0IHdlaWdodCwgbmV2ZXIgY3Jhc2ggdGhlIHNsaWNlIOKAlCB0aGVcbiAgICAgIC8vIHNhbWUgY29udHJhY3QgZXZlcnkgb3RoZXIgY29uc3VtZXIgY2FsbGJhY2sgaW4gdGhlIGxpYnJhcnkgZ2V0cy5cbiAgICAgIGxldCB3ZWlnaHQgPSAxLjA7XG4gICAgICBpZiAod2VpZ2gpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB3ZWlnaHQgPSB3ZWlnaChub2RlLCBwYXJlbnROb2RlLCBrZXksIGtpbmQpID8/IDEuMDtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLyogd2VpZ2hlciB0aHJldyDigJQga2VlcCAxLjAsIHRoZSBzbGljZSBzdGF5cyB1c2FibGUgKi9cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgbmVzdGVkID0ga2luZCA9PT0gJ2RhdGEnICYmIGtleSAhPT0gdW5kZWZpbmVkICYmIHdyaXRlc09ubHlJbnNpZGUocGFyZW50Q29tbWl0LCBrZXkpO1xuICAgICAgbm9kZS5wYXJlbnRFZGdlcy5wdXNoKHtcbiAgICAgICAgcGFyZW50OiBwYXJlbnROb2RlLFxuICAgICAgICBraW5kLFxuICAgICAgICBrZXksXG4gICAgICAgIHdlaWdodCxcbiAgICAgICAgLi4uKG5lc3RlZCAmJiB7IGJhc2lzOiAnbmVzdGVkLXJvd3MnIGFzIGNvbnN0IH0pLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgd2hpbGUgKHF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBbbm9kZSwgY29tbWl0SWR4LCBkZXB0aCwga2V5c1RvRXhwYW5kXSA9IHF1ZXVlLnNoaWZ0KCkhO1xuICAgIHF1ZXJ5V29yay51bml0cyArPSAxICsga2V5c1RvRXhwYW5kLmxlbmd0aDtcblxuICAgIGlmIChkZXB0aCA+PSBtYXhEZXB0aCkge1xuICAgICAgLy8gRDQ6IG9ubHkgYSBub2RlIHRoYXQgc3RpbGwgSEFEIHNvbWV0aGluZyB0byBleHBhbmQgY291bnRzIGFzIGEgY3V0XG4gICAgICAvLyAoYSBsZWFmIGF0IHRoZSBob3Jpem9uIHRydW5jYXRlcyBub3RoaW5nKS5cbiAgICAgIGlmIChrZXlzVG9FeHBhbmQubGVuZ3RoID4gMCB8fCBjb250cm9sRGVwcz8uKG5vZGUucnVudGltZVN0YWdlSWQpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdHJ1bmNhdGVkQnlEZXB0aCA9IHRydWU7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBEYXRhIGVkZ2VzOiBmb3IgZWFjaCBrZXkgaW4gdGhpcyBleHBhbnNpb24ncyByZWFkLXNldCwgZmluZCB3aG8gd3JvdGVcbiAgICAvLyBpdC4gVW5kZXIgJ3N0YWdlJyB0aGlzIGlzIHRoZSBub2RlJ3MgZnVsbCByZWFkLXNldCAoaGlzdG9yaWNhbFxuICAgIC8vIGJlaGF2aW9yKTsgdW5kZXIgJ3Blci13cml0ZScgaXQgaXMgdGhlIGxpbmtpbmcgd3JpdGVzJyB0ZW1wb3JhbCBwcmVmaXhcbiAgICAvLyAob3IgYSB3b3JrbGlzdCBkZWx0YSBvbiByZS1leHBhbnNpb24pLlxuICAgIGNvbnN0IGtleXNSZWFkID0ga2V5c1RvRXhwYW5kO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXNSZWFkKSB7XG4gICAgICBjb25zdCB3cml0ZXIgPSBmaW5kV3JpdGVyKGtleSwgY29tbWl0SWR4KTtcbiAgICAgIGlmICghd3JpdGVyKSB7XG4gICAgICAgIC8vIEY0Yjogc2F5IHdoeSB0aGVyZSBpcyBubyBlZGdlIOKAlCBubyBjb21taXQgYmVmb3JlIHRoaXMgbm9kZSB3cm90ZSB0aGUga2V5LlxuICAgICAgICBub2RlLnByZVJ1blJlYWRzID8/PSB7IGNvZGU6ICdwcmUtcnVuLW9yaWdpbicsIGtleXM6IFtdIH07XG4gICAgICAgIGlmICghbm9kZS5wcmVSdW5SZWFkcy5rZXlzLmluY2x1ZGVzKGtleSkpIG5vZGUucHJlUnVuUmVhZHMua2V5cy5wdXNoKGtleSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgbGlua1BhcmVudChub2RlLCB3cml0ZXIsICdkYXRhJywga2V5LCBkZXB0aCk7XG4gICAgfVxuXG4gICAgLy8gQ29udHJvbCBlZGdlIChSRkMtMDAzIEQzKTogbGluayB0aGUgZ292ZXJuaW5nIGRlY2lkZXIsIGxhYmVsZWQgYnkgdGhlXG4gICAgLy8gZGVjaWRlKCkgcnVsZSBsYWJlbCB3aGVuIHByZXNlbnQuIFRoZSBkZWNpZGVyIG5vZGUgdGhlbiBleHBhbmRzXG4gICAgLy8gbm9ybWFsbHkgdGhyb3VnaCBpdHMgb3duIGRhdGEgcmVhZHMgKGFuZCBpdHMgb3duIGNvbnRyb2wgcGFyZW50KS5cbiAgICBpZiAoY29udHJvbERlcHMpIHtcbiAgICAgIGNvbnN0IGRlcCA9IGNvbnRyb2xEZXBzKG5vZGUucnVudGltZVN0YWdlSWQpO1xuICAgICAgaWYgKGRlcCkge1xuICAgICAgICBjb25zdCBkZWNpZGVySWR4ID0gaWR4TWFwLmdldChkZXAuZGVjaWRlcklkKTtcbiAgICAgICAgaWYgKGRlY2lkZXJJZHggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGxpbmtQYXJlbnQobm9kZSwgY29tbWl0TG9nW2RlY2lkZXJJZHhdLCAnY29udHJvbCcsIGRlcC5sYWJlbCwgZGVwdGgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gUkZDLTAwMyBENCDigJQgdHJ1bmNhdGlvbiB2aXNpYmlsaXR5IG9uIHRoZSByb290IChhYnNlbnQgd2hlbiBjb21wbGV0ZSkuIEl0IGlzIERBVEEsIGFuZCBvbmx5XG4gIC8vIGRhdGE6IGEgcmVhZGVyIHJlYWRzIGByb290LnRydW5jYXRlZGAgKGFuZCBgZm9ybWF0Q2F1c2FsQ2hhaW5gIHByaW50cyBpdCk7IHRoZSByZWNvcmQgd3JpdGVzIG5vXG4gIC8vIGNvbnNvbGUgbGluZSAodGhlIGRldi1tb2RlIHdhcm5pbmcgd2VudCBpbiBDNiDigJQgdGhlIHJlY29yZCBpbXBvcnRzIG5vdGhpbmcgb3V0c2lkZSBpdHNlbGYpLlxuICBpZiAodHJ1bmNhdGVkQnlEZXB0aCB8fCB0cnVuY2F0ZWRCeU5vZGVzKSB7XG4gICAgcm9vdC50cnVuY2F0ZWQgPSB7IGJ5RGVwdGg6IHRydW5jYXRlZEJ5RGVwdGgsIGJ5Tm9kZXM6IHRydW5jYXRlZEJ5Tm9kZXMgfTtcbiAgfVxuXG4gIHJldHVybiByb290O1xufVxuXG4vLyDilIDilIAgVXRpbGl0aWVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIEZsYXR0ZW4gdGhlIGNhdXNhbCBEQUcgaW50byBhIEJGUy1vcmRlcmVkIGxpc3Qgb2Ygbm9kZXMuXG4gKiBFYWNoIG5vZGUgYXBwZWFycyBleGFjdGx5IG9uY2UgKGZpcnN0IG9jY3VycmVuY2UgYnkgQkZTIG9yZGVyKS5cbiAqIFVzZWZ1bCBmb3IgbGluZWFyIGRpc3BsYXkgb3IgaXRlcmF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmxhdHRlbkNhdXNhbERBRyhyb290OiBDYXVzYWxOb2RlKTogQ2F1c2FsTm9kZVtdIHtcbiAgY29uc3QgcmVzdWx0OiBDYXVzYWxOb2RlW10gPSBbXTtcbiAgY29uc3QgdmlzaXRlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBxdWV1ZTogQ2F1c2FsTm9kZVtdID0gW3Jvb3RdO1xuXG4gIHdoaWxlIChxdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgY29uc3Qgbm9kZSA9IHF1ZXVlLnNoaWZ0KCkhO1xuICAgIGlmICh2aXNpdGVkLmhhcyhub2RlLnJ1bnRpbWVTdGFnZUlkKSkgY29udGludWU7XG4gICAgdmlzaXRlZC5hZGQobm9kZS5ydW50aW1lU3RhZ2VJZCk7XG4gICAgcmVzdWx0LnB1c2gobm9kZSk7XG5cbiAgICBmb3IgKGNvbnN0IHBhcmVudCBvZiBub2RlLnBhcmVudHMpIHtcbiAgICAgIGlmICghdmlzaXRlZC5oYXMocGFyZW50LnJ1bnRpbWVTdGFnZUlkKSkge1xuICAgICAgICBxdWV1ZS5wdXNoKHBhcmVudCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBGb3JtYXQgYSBjYXVzYWwgREFHIGFzIGh1bWFuLXJlYWRhYmxlIGluZGVudGVkIHRleHQuXG4gKiBTaG93cyB0aGUgZGVwZW5kZW5jeSBjaGFpbiB3aXRoIGRlcHRoIGluZGVudGF0aW9uIGFuZCBsaW5rZWQtYnkga2V5cy5cbiAqXG4gKiBSRkMtMDAzIEQyOiBub2RlcyB0aGF0IGNvbnN1bWVkIHVudHJhY2tlZCByZWFkIHBhdGhzIHJlbmRlciBhbiBleHRyYVxuICogYOKaoCBhbHNvIGNvbnN1bWVkIOKApiDigJQgc2xpY2UgbWF5IGJlIGluY29tcGxldGUgaGVyZWAgbGluZSwgc28gYSBjb25zdW1lclxuICogKGh1bWFuIG9yIExMTSkgZGVidWdnaW5nIGZyb20gdGhlIHNsaWNlIGlzIFRPTEQgd2hlbiBpdCBpcyBpbmNvbXBsZXRlLlxuICpcbiAqIFJGQy0wMDMgRDM6IGNvbnRyb2wgZWRnZXMgcmVuZGVyIGFzIGDihpAgW2NvbnRyb2w6IDxydWxlIGxhYmVsPl1gXG4gKiAobGFiZWwgb21pdHRlZCB3aGVuIHRoZSBkZWNpc2lvbiBjYXJyaWVkIG5vbmUpLiBEYXRhIHJlbmRlcmluZyBpc1xuICogYnl0ZS1pZGVudGljYWwgdG8gdGhlIHByZS1EMyBvdXRwdXQg4oCUIGDihpAgdmlhIDxrZXk+YCBmcm9tIHRoZSBub2RlJ3NcbiAqIGRpc2NvdmVyeS10aW1lIGBsaW5rZWRCeWAuXG4gKlxuICogUkZDLTAwMyBENDogZWRnZSB3ZWlnaHRzIGZyb20gdGhlIGB3ZWlnaGAgaG9vayByZW5kZXIgYXMgYSBzdWZmaXgg4oCUXG4gKiBg4oaQIHZpYSBzeXN0ZW1Qcm9tcHQgKDAuMTgpYCDigJQgb25seSB3aGVuIOKJoCAxLjAsIHNvIHVud2VpZ2h0ZWQgb3V0cHV0IGlzXG4gKiB1bmNoYW5nZWQuIEEgdHJ1bmNhdGVkIHNsaWNlIChyb290LnRydW5jYXRlZCkgYXBwZW5kcyBhIGZpbmFsXG4gKiBg4pqgIHNsaWNlIHRydW5jYXRlZCDigKZgIGxpbmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRDYXVzYWxDaGFpbihyb290OiBDYXVzYWxOb2RlKTogc3RyaW5nIHtcbiAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHZpc2l0ZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBjb25zdCB3ZWlnaHRTdWZmaXggPSAoZWRnZTogQ2F1c2FsRWRnZSB8IHVuZGVmaW5lZCk6IHN0cmluZyA9PlxuICAgIGVkZ2UgIT09IHVuZGVmaW5lZCAmJiBlZGdlLndlaWdodCAhPT0gMSA/IGAgKCR7ZWRnZS53ZWlnaHR9KWAgOiAnJztcblxuICBmdW5jdGlvbiB3YWxrKG5vZGU6IENhdXNhbE5vZGUsIGluZGVudDogbnVtYmVyLCBlZGdlc0Zyb21DaGlsZD86IENhdXNhbEVkZ2VbXSk6IHZvaWQge1xuICAgIGlmICh2aXNpdGVkLmhhcyhub2RlLnJ1bnRpbWVTdGFnZUlkKSkge1xuICAgICAgbGluZXMucHVzaChgJHsnICAnLnJlcGVhdChpbmRlbnQpfeKGsyAke25vZGUucnVudGltZVN0YWdlSWR9IChzZWUgYWJvdmUpYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZpc2l0ZWQuYWRkKG5vZGUucnVudGltZVN0YWdlSWQpO1xuXG4gICAgY29uc3QgbGlua1BhcnRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGlmIChub2RlLmxpbmtlZEJ5KSB7XG4gICAgICBjb25zdCBkYXRhRWRnZSA9IGVkZ2VzRnJvbUNoaWxkPy5maW5kKChlKSA9PiBlLmtpbmQgPT09ICdkYXRhJyk7XG4gICAgICBsaW5rUGFydHMucHVzaChgdmlhICR7bm9kZS5saW5rZWRCeX0ke3dlaWdodFN1ZmZpeChkYXRhRWRnZSl9YCk7XG4gICAgfVxuICAgIGNvbnN0IGNvbnRyb2xFZGdlID0gZWRnZXNGcm9tQ2hpbGQ/LmZpbmQoKGUpID0+IGUua2luZCA9PT0gJ2NvbnRyb2wnKTtcbiAgICBpZiAoY29udHJvbEVkZ2UpIHtcbiAgICAgIGxpbmtQYXJ0cy5wdXNoKGBbY29udHJvbCR7Y29udHJvbEVkZ2Uua2V5ID8gYDogJHtjb250cm9sRWRnZS5rZXl9YCA6ICcnfV0ke3dlaWdodFN1ZmZpeChjb250cm9sRWRnZSl9YCk7XG4gICAgfVxuICAgIGNvbnN0IGxpbmsgPSBsaW5rUGFydHMubGVuZ3RoID4gMCA/IGAg4oaQICR7bGlua1BhcnRzLmpvaW4oJyDihpAgJyl9YCA6ICcnO1xuXG4gICAgY29uc3Qgd3JpdGVzID0gbm9kZS5rZXlzV3JpdHRlbi5sZW5ndGggPiAwID8gYCBbd3JvdGU6ICR7bm9kZS5rZXlzV3JpdHRlbi5qb2luKCcsICcpfV1gIDogJyc7XG4gICAgbGluZXMucHVzaChgJHsnICAnLnJlcGVhdChpbmRlbnQpfSR7bm9kZS5zdGFnZU5hbWV9ICgke25vZGUucnVudGltZVN0YWdlSWR9KSR7bGlua30ke3dyaXRlc31gKTtcblxuICAgIGlmIChub2RlLmluY29tcGxldGVTb3VyY2VzICYmIG5vZGUuaW5jb21wbGV0ZVNvdXJjZXMubGVuZ3RoID4gMCkge1xuICAgICAgbGluZXMucHVzaChcbiAgICAgICAgYCR7JyAgJy5yZXBlYXQoaW5kZW50ICsgMSl94pqgIGFsc28gY29uc3VtZWQgJHtub2RlLmluY29tcGxldGVTb3VyY2VzLmpvaW4oJy8nKX0g4oCUIHNsaWNlIG1heSBiZSBpbmNvbXBsZXRlIGhlcmVgLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHBhcmVudCBvZiBub2RlLnBhcmVudHMpIHtcbiAgICAgIHdhbGsoXG4gICAgICAgIHBhcmVudCxcbiAgICAgICAgaW5kZW50ICsgMSxcbiAgICAgICAgbm9kZS5wYXJlbnRFZGdlcy5maWx0ZXIoKGUpID0+IGUucGFyZW50ID09PSBwYXJlbnQpLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICB3YWxrKHJvb3QsIDApO1xuXG4gIGlmIChyb290LnRydW5jYXRlZCkge1xuICAgIGNvbnN0IGNhdXNlcyA9IFtyb290LnRydW5jYXRlZC5ieURlcHRoICYmICdtYXhEZXB0aCByZWFjaGVkJywgcm9vdC50cnVuY2F0ZWQuYnlOb2RlcyAmJiAnbWF4Tm9kZXMgcmVhY2hlZCddXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAuam9pbignLCAnKTtcbiAgICBsaW5lcy5wdXNoKGDimqAgc2xpY2UgdHJ1bmNhdGVkICgke2NhdXNlc30pIOKAlCBvbGRlciBjYXVzZXMgZXhpc3QgYmV5b25kIHRoaXMgaG9yaXpvbmApO1xuICB9XG5cbiAgcmV0dXJuIGxpbmVzLmpvaW4oJ1xcbicpO1xufVxuXG4vLyDilIDilIAgRXhwb3J0ZWQgZm9yIHRlc3RpbmcgKGludGVybmFsKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqIEBpbnRlcm5hbCBFeHBvc2VkIGZvciB0ZXN0aW5nIHRoZSBzdHJhdGVneSBzZWxlY3Rpb24uICovXG5leHBvcnQgY29uc3QgX1JFVkVSU0VfSU5ERVhfVEhSRVNIT0xEID0gUkVWRVJTRV9JTkRFWF9USFJFU0hPTEQ7XG4iXX0=
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* frameTypes.ts — the types of the engine's frame (L4): what one stage inside a run reports.
|
|
3
|
+
*
|
|
4
|
+
* Its snapshot (`StageSnapshot`, one node of the execution tree), its flow messages
|
|
5
|
+
* (`FlowMessage`, `FlowControlType`) and the two retention dials that shape what the snapshot
|
|
6
|
+
* keeps (`ReadTrackingMode`, `WriteTrackingMode`, over `capture/`'s `RetentionPolicy`). They lived
|
|
7
|
+
* in the record's `types.ts` until C6; the record names nothing outside itself now
|
|
8
|
+
* (`RECORD_FILES`, scripts/layering.config.cjs), so they sit beside the frame that writes them.
|
|
9
|
+
*
|
|
10
|
+
* A `StageSnapshot` is an `ExecutionTree` (`types.ts`), the shape the record's readers walk:
|
|
11
|
+
* `commitStops`, `tagStops` and `keysReadFromExecutionTree` take one.
|
|
12
|
+
*/
|
|
13
|
+
import type { RetentionPolicy } from '../capture/policies.js';
|
|
14
|
+
/** Types of control flow decisions captured by the execution engine. */
|
|
15
|
+
export type FlowControlType = 'next' | 'branch' | 'children' | 'selected' | 'subflow' | 'loop';
|
|
16
|
+
/** A single flow control narrative entry. */
|
|
17
|
+
export interface FlowMessage {
|
|
18
|
+
type: FlowControlType;
|
|
19
|
+
description: string;
|
|
20
|
+
targetStage?: string | string[];
|
|
21
|
+
rationale?: string;
|
|
22
|
+
count?: number;
|
|
23
|
+
iteration?: number;
|
|
24
|
+
timestamp?: number;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Policy for how tracked reads are recorded into `StageSnapshot.stageReads`.
|
|
28
|
+
*
|
|
29
|
+
* - `'full'` (default) — every tracked read `structuredClone`s the value into
|
|
30
|
+
* the stage's read view. Byte-identical to the historical behavior; this is
|
|
31
|
+
* what snapshot consumers (lens, agentfootprint) see today.
|
|
32
|
+
* - `'summary'` — reads record a cheap {@link ReadSummaryMarker} (type + size
|
|
33
|
+
* proxy + short preview) instead of the cloned value. O(1)-ish per read —
|
|
34
|
+
* no value clone, no serialization of large objects.
|
|
35
|
+
* - `'off'` — reads are not recorded at all; `stageReads` is absent from the
|
|
36
|
+
* snapshot. Zero per-read cost. Values are still readable, and the
|
|
37
|
+
* `ScopeRecorder.onRead` event still fires (it passes the live reference and
|
|
38
|
+
* never cloned) — so narrative output is identical in every mode. The policy
|
|
39
|
+
* scopes ONLY the snapshot's `stageReads` payload.
|
|
40
|
+
*
|
|
41
|
+
* Set via `new FlowChartExecutor(chart, { readTracking })` or
|
|
42
|
+
* `executor.setReadTracking(mode)` (before `run()`).
|
|
43
|
+
*
|
|
44
|
+
* Alias of the shared {@link RetentionPolicy} family (#13c-A) — kept as the
|
|
45
|
+
* shipped public name for the read dial.
|
|
46
|
+
*/
|
|
47
|
+
export type ReadTrackingMode = RetentionPolicy;
|
|
48
|
+
/**
|
|
49
|
+
* Policy for how tracked writes are recorded into `StageSnapshot.stageWrites`
|
|
50
|
+
* (#13c-A) — the sibling of {@link ReadTrackingMode}.
|
|
51
|
+
*
|
|
52
|
+
* - `'full'` (default) — every tracked write `structuredClone`s the value into
|
|
53
|
+
* the stage's write view. Byte-identical to the historical behavior.
|
|
54
|
+
* - `'summary'` — writes record a cheap {@link WriteSummaryMarker} instead of
|
|
55
|
+
* the cloned value.
|
|
56
|
+
* - `'off'` — writes are not recorded at all; `stageWrites` is absent from the
|
|
57
|
+
* snapshot. The writes themselves still commit to shared state and still
|
|
58
|
+
* appear in the commit log — only the per-stage snapshot bookkeeping (and
|
|
59
|
+
* therefore the commit observer's mutations payload) is affected. (The
|
|
60
|
+
* commit log's own value encoding has its own lossless dial —
|
|
61
|
+
* {@link CommitValuesMode}, #13c-B.)
|
|
62
|
+
*
|
|
63
|
+
* Set via `new FlowChartExecutor(chart, { writeTracking })` or
|
|
64
|
+
* `executor.setWriteTracking(mode)` (before `run()`). See
|
|
65
|
+
* `FlowChartExecutorOptions.writeTracking` for the full observable-consequence
|
|
66
|
+
* contract (onCommit payload, redaction precedence, what is OUT of scope).
|
|
67
|
+
*/
|
|
68
|
+
export type WriteTrackingMode = RetentionPolicy;
|
|
69
|
+
/** Serialisable representation of a stage's state (for debugging / visualisation). */
|
|
70
|
+
export type StageSnapshot = {
|
|
71
|
+
id: string;
|
|
72
|
+
/** Unique per-execution-step identifier. Format: [subflowPath/]stageId#executionIndex */
|
|
73
|
+
runtimeStageId?: string;
|
|
74
|
+
name?: string;
|
|
75
|
+
/** Human-readable description of what this stage does (from builder). */
|
|
76
|
+
description?: string;
|
|
77
|
+
/** Subflow identifier — present when this stage is a subflow entry point. */
|
|
78
|
+
subflowId?: string;
|
|
79
|
+
isDecider?: boolean;
|
|
80
|
+
isFork?: boolean;
|
|
81
|
+
/** User-level writes made by this stage (pre-namespace keys → values).
|
|
82
|
+
* Shape depends on {@link WriteTrackingMode}: cloned values under `'full'`
|
|
83
|
+
* (default), {@link WriteSummaryMarker}s under `'summary'`, absent under
|
|
84
|
+
* `'off'`. Redacted writes show `'[REDACTED]'` regardless of mode. */
|
|
85
|
+
stageWrites?: Record<string, unknown>;
|
|
86
|
+
/** User-level reads made by this stage (pre-namespace keys → values at read
|
|
87
|
+
* time). Shape depends on {@link ReadTrackingMode}: cloned values under
|
|
88
|
+
* `'full'` (default), {@link ReadSummaryMarker}s under `'summary'`, absent
|
|
89
|
+
* under `'off'`. */
|
|
90
|
+
stageReads?: Record<string, unknown>;
|
|
91
|
+
logs: Record<string, unknown>;
|
|
92
|
+
errors: Record<string, unknown>;
|
|
93
|
+
metrics: Record<string, unknown>;
|
|
94
|
+
evals: Record<string, unknown>;
|
|
95
|
+
flowMessages?: FlowMessage[];
|
|
96
|
+
next?: StageSnapshot;
|
|
97
|
+
children?: StageSnapshot[];
|
|
98
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* frameTypes.ts — the types of the engine's frame (L4): what one stage inside a run reports.
|
|
3
|
+
*
|
|
4
|
+
* Its snapshot (`StageSnapshot`, one node of the execution tree), its flow messages
|
|
5
|
+
* (`FlowMessage`, `FlowControlType`) and the two retention dials that shape what the snapshot
|
|
6
|
+
* keeps (`ReadTrackingMode`, `WriteTrackingMode`, over `capture/`'s `RetentionPolicy`). They lived
|
|
7
|
+
* in the record's `types.ts` until C6; the record names nothing outside itself now
|
|
8
|
+
* (`RECORD_FILES`, scripts/layering.config.cjs), so they sit beside the frame that writes them.
|
|
9
|
+
*
|
|
10
|
+
* A `StageSnapshot` is an `ExecutionTree` (`types.ts`), the shape the record's readers walk:
|
|
11
|
+
* `commitStops`, `tagStops` and `keysReadFromExecutionTree` take one.
|
|
12
|
+
*/
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJhbWVUeXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvbWVtb3J5L2ZyYW1lVHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7O0dBV0ciLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGZyYW1lVHlwZXMudHMg4oCUIHRoZSB0eXBlcyBvZiB0aGUgZW5naW5lJ3MgZnJhbWUgKEw0KTogd2hhdCBvbmUgc3RhZ2UgaW5zaWRlIGEgcnVuIHJlcG9ydHMuXG4gKlxuICogSXRzIHNuYXBzaG90IChgU3RhZ2VTbmFwc2hvdGAsIG9uZSBub2RlIG9mIHRoZSBleGVjdXRpb24gdHJlZSksIGl0cyBmbG93IG1lc3NhZ2VzXG4gKiAoYEZsb3dNZXNzYWdlYCwgYEZsb3dDb250cm9sVHlwZWApIGFuZCB0aGUgdHdvIHJldGVudGlvbiBkaWFscyB0aGF0IHNoYXBlIHdoYXQgdGhlIHNuYXBzaG90XG4gKiBrZWVwcyAoYFJlYWRUcmFja2luZ01vZGVgLCBgV3JpdGVUcmFja2luZ01vZGVgLCBvdmVyIGBjYXB0dXJlL2AncyBgUmV0ZW50aW9uUG9saWN5YCkuIFRoZXkgbGl2ZWRcbiAqIGluIHRoZSByZWNvcmQncyBgdHlwZXMudHNgIHVudGlsIEM2OyB0aGUgcmVjb3JkIG5hbWVzIG5vdGhpbmcgb3V0c2lkZSBpdHNlbGYgbm93XG4gKiAoYFJFQ09SRF9GSUxFU2AsIHNjcmlwdHMvbGF5ZXJpbmcuY29uZmlnLmNqcyksIHNvIHRoZXkgc2l0IGJlc2lkZSB0aGUgZnJhbWUgdGhhdCB3cml0ZXMgdGhlbS5cbiAqXG4gKiBBIGBTdGFnZVNuYXBzaG90YCBpcyBhbiBgRXhlY3V0aW9uVHJlZWAgKGB0eXBlcy50c2ApLCB0aGUgc2hhcGUgdGhlIHJlY29yZCdzIHJlYWRlcnMgd2FsazpcbiAqIGBjb21taXRTdG9wc2AsIGB0YWdTdG9wc2AgYW5kIGBrZXlzUmVhZEZyb21FeGVjdXRpb25UcmVlYCB0YWtlIG9uZS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFJldGVudGlvblBvbGljeSB9IGZyb20gJy4uL2NhcHR1cmUvcG9saWNpZXMuanMnO1xuXG4vLyDilIDilIAgRmxvdyBDb250cm9sIE5hcnJhdGl2ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqIFR5cGVzIG9mIGNvbnRyb2wgZmxvdyBkZWNpc2lvbnMgY2FwdHVyZWQgYnkgdGhlIGV4ZWN1dGlvbiBlbmdpbmUuICovXG5leHBvcnQgdHlwZSBGbG93Q29udHJvbFR5cGUgPSAnbmV4dCcgfCAnYnJhbmNoJyB8ICdjaGlsZHJlbicgfCAnc2VsZWN0ZWQnIHwgJ3N1YmZsb3cnIHwgJ2xvb3AnO1xuXG4vKiogQSBzaW5nbGUgZmxvdyBjb250cm9sIG5hcnJhdGl2ZSBlbnRyeS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmxvd01lc3NhZ2Uge1xuICB0eXBlOiBGbG93Q29udHJvbFR5cGU7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIHRhcmdldFN0YWdlPzogc3RyaW5nIHwgc3RyaW5nW107XG4gIHJhdGlvbmFsZT86IHN0cmluZztcbiAgY291bnQ/OiBudW1iZXI7XG4gIGl0ZXJhdGlvbj86IG51bWJlcjtcbiAgdGltZXN0YW1wPzogbnVtYmVyO1xufVxuXG4vLyDilIDilIAgUmVhZCAvIFdyaXRlIFRyYWNraW5nICgjMTQsICMxM2MtQSkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vL1xuLy8gVGhlIHBvbGljeSBmYW1pbHkgYW5kIG1hcmtlciBzaGFwZXMgYXJlIG93bmVkIGJ5IGBjYXB0dXJlL2AgKHNoYXJlZCB3aXRoXG4vLyB0aGUgZGVmZXJyZWQtb2JzZXJ2ZXIgY2FwdHVyZSB0aWVyKS5cblxuLyoqXG4gKiBQb2xpY3kgZm9yIGhvdyB0cmFja2VkIHJlYWRzIGFyZSByZWNvcmRlZCBpbnRvIGBTdGFnZVNuYXBzaG90LnN0YWdlUmVhZHNgLlxuICpcbiAqIC0gYCdmdWxsJ2AgKGRlZmF1bHQpIOKAlCBldmVyeSB0cmFja2VkIHJlYWQgYHN0cnVjdHVyZWRDbG9uZWBzIHRoZSB2YWx1ZSBpbnRvXG4gKiAgIHRoZSBzdGFnZSdzIHJlYWQgdmlldy4gQnl0ZS1pZGVudGljYWwgdG8gdGhlIGhpc3RvcmljYWwgYmVoYXZpb3I7IHRoaXMgaXNcbiAqICAgd2hhdCBzbmFwc2hvdCBjb25zdW1lcnMgKGxlbnMsIGFnZW50Zm9vdHByaW50KSBzZWUgdG9kYXkuXG4gKiAtIGAnc3VtbWFyeSdgIOKAlCByZWFkcyByZWNvcmQgYSBjaGVhcCB7QGxpbmsgUmVhZFN1bW1hcnlNYXJrZXJ9ICh0eXBlICsgc2l6ZVxuICogICBwcm94eSArIHNob3J0IHByZXZpZXcpIGluc3RlYWQgb2YgdGhlIGNsb25lZCB2YWx1ZS4gTygxKS1pc2ggcGVyIHJlYWQg4oCUXG4gKiAgIG5vIHZhbHVlIGNsb25lLCBubyBzZXJpYWxpemF0aW9uIG9mIGxhcmdlIG9iamVjdHMuXG4gKiAtIGAnb2ZmJ2Ag4oCUIHJlYWRzIGFyZSBub3QgcmVjb3JkZWQgYXQgYWxsOyBgc3RhZ2VSZWFkc2AgaXMgYWJzZW50IGZyb20gdGhlXG4gKiAgIHNuYXBzaG90LiBaZXJvIHBlci1yZWFkIGNvc3QuIFZhbHVlcyBhcmUgc3RpbGwgcmVhZGFibGUsIGFuZCB0aGVcbiAqICAgYFNjb3BlUmVjb3JkZXIub25SZWFkYCBldmVudCBzdGlsbCBmaXJlcyAoaXQgcGFzc2VzIHRoZSBsaXZlIHJlZmVyZW5jZSBhbmRcbiAqICAgbmV2ZXIgY2xvbmVkKSDigJQgc28gbmFycmF0aXZlIG91dHB1dCBpcyBpZGVudGljYWwgaW4gZXZlcnkgbW9kZS4gVGhlIHBvbGljeVxuICogICBzY29wZXMgT05MWSB0aGUgc25hcHNob3QncyBgc3RhZ2VSZWFkc2AgcGF5bG9hZC5cbiAqXG4gKiBTZXQgdmlhIGBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIHsgcmVhZFRyYWNraW5nIH0pYCBvclxuICogYGV4ZWN1dG9yLnNldFJlYWRUcmFja2luZyhtb2RlKWAgKGJlZm9yZSBgcnVuKClgKS5cbiAqXG4gKiBBbGlhcyBvZiB0aGUgc2hhcmVkIHtAbGluayBSZXRlbnRpb25Qb2xpY3l9IGZhbWlseSAoIzEzYy1BKSDigJQga2VwdCBhcyB0aGVcbiAqIHNoaXBwZWQgcHVibGljIG5hbWUgZm9yIHRoZSByZWFkIGRpYWwuXG4gKi9cbmV4cG9ydCB0eXBlIFJlYWRUcmFja2luZ01vZGUgPSBSZXRlbnRpb25Qb2xpY3k7XG5cbi8qKlxuICogUG9saWN5IGZvciBob3cgdHJhY2tlZCB3cml0ZXMgYXJlIHJlY29yZGVkIGludG8gYFN0YWdlU25hcHNob3Quc3RhZ2VXcml0ZXNgXG4gKiAoIzEzYy1BKSDigJQgdGhlIHNpYmxpbmcgb2Yge0BsaW5rIFJlYWRUcmFja2luZ01vZGV9LlxuICpcbiAqIC0gYCdmdWxsJ2AgKGRlZmF1bHQpIOKAlCBldmVyeSB0cmFja2VkIHdyaXRlIGBzdHJ1Y3R1cmVkQ2xvbmVgcyB0aGUgdmFsdWUgaW50b1xuICogICB0aGUgc3RhZ2UncyB3cml0ZSB2aWV3LiBCeXRlLWlkZW50aWNhbCB0byB0aGUgaGlzdG9yaWNhbCBiZWhhdmlvci5cbiAqIC0gYCdzdW1tYXJ5J2Ag4oCUIHdyaXRlcyByZWNvcmQgYSBjaGVhcCB7QGxpbmsgV3JpdGVTdW1tYXJ5TWFya2VyfSBpbnN0ZWFkIG9mXG4gKiAgIHRoZSBjbG9uZWQgdmFsdWUuXG4gKiAtIGAnb2ZmJ2Ag4oCUIHdyaXRlcyBhcmUgbm90IHJlY29yZGVkIGF0IGFsbDsgYHN0YWdlV3JpdGVzYCBpcyBhYnNlbnQgZnJvbSB0aGVcbiAqICAgc25hcHNob3QuIFRoZSB3cml0ZXMgdGhlbXNlbHZlcyBzdGlsbCBjb21taXQgdG8gc2hhcmVkIHN0YXRlIGFuZCBzdGlsbFxuICogICBhcHBlYXIgaW4gdGhlIGNvbW1pdCBsb2cg4oCUIG9ubHkgdGhlIHBlci1zdGFnZSBzbmFwc2hvdCBib29ra2VlcGluZyAoYW5kXG4gKiAgIHRoZXJlZm9yZSB0aGUgY29tbWl0IG9ic2VydmVyJ3MgbXV0YXRpb25zIHBheWxvYWQpIGlzIGFmZmVjdGVkLiAoVGhlXG4gKiAgIGNvbW1pdCBsb2cncyBvd24gdmFsdWUgZW5jb2RpbmcgaGFzIGl0cyBvd24gbG9zc2xlc3MgZGlhbCDigJRcbiAqICAge0BsaW5rIENvbW1pdFZhbHVlc01vZGV9LCAjMTNjLUIuKVxuICpcbiAqIFNldCB2aWEgYG5ldyBGbG93Q2hhcnRFeGVjdXRvcihjaGFydCwgeyB3cml0ZVRyYWNraW5nIH0pYCBvclxuICogYGV4ZWN1dG9yLnNldFdyaXRlVHJhY2tpbmcobW9kZSlgIChiZWZvcmUgYHJ1bigpYCkuIFNlZVxuICogYEZsb3dDaGFydEV4ZWN1dG9yT3B0aW9ucy53cml0ZVRyYWNraW5nYCBmb3IgdGhlIGZ1bGwgb2JzZXJ2YWJsZS1jb25zZXF1ZW5jZVxuICogY29udHJhY3QgKG9uQ29tbWl0IHBheWxvYWQsIHJlZGFjdGlvbiBwcmVjZWRlbmNlLCB3aGF0IGlzIE9VVCBvZiBzY29wZSkuXG4gKi9cbmV4cG9ydCB0eXBlIFdyaXRlVHJhY2tpbmdNb2RlID0gUmV0ZW50aW9uUG9saWN5O1xuXG4vLyDilIDilIAgU3RhZ2UgU25hcHNob3Qg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKiBTZXJpYWxpc2FibGUgcmVwcmVzZW50YXRpb24gb2YgYSBzdGFnZSdzIHN0YXRlIChmb3IgZGVidWdnaW5nIC8gdmlzdWFsaXNhdGlvbikuICovXG5leHBvcnQgdHlwZSBTdGFnZVNuYXBzaG90ID0ge1xuICBpZDogc3RyaW5nO1xuICAvKiogVW5pcXVlIHBlci1leGVjdXRpb24tc3RlcCBpZGVudGlmaWVyLiBGb3JtYXQ6IFtzdWJmbG93UGF0aC9dc3RhZ2VJZCNleGVjdXRpb25JbmRleCAqL1xuICBydW50aW1lU3RhZ2VJZD86IHN0cmluZztcbiAgbmFtZT86IHN0cmluZztcbiAgLyoqIEh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHdoYXQgdGhpcyBzdGFnZSBkb2VzIChmcm9tIGJ1aWxkZXIpLiAqL1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgLyoqIFN1YmZsb3cgaWRlbnRpZmllciDigJQgcHJlc2VudCB3aGVuIHRoaXMgc3RhZ2UgaXMgYSBzdWJmbG93IGVudHJ5IHBvaW50LiAqL1xuICBzdWJmbG93SWQ/OiBzdHJpbmc7XG4gIGlzRGVjaWRlcj86IGJvb2xlYW47XG4gIGlzRm9yaz86IGJvb2xlYW47XG4gIC8qKiBVc2VyLWxldmVsIHdyaXRlcyBtYWRlIGJ5IHRoaXMgc3RhZ2UgKHByZS1uYW1lc3BhY2Uga2V5cyDihpIgdmFsdWVzKS5cbiAgICogIFNoYXBlIGRlcGVuZHMgb24ge0BsaW5rIFdyaXRlVHJhY2tpbmdNb2RlfTogY2xvbmVkIHZhbHVlcyB1bmRlciBgJ2Z1bGwnYFxuICAgKiAgKGRlZmF1bHQpLCB7QGxpbmsgV3JpdGVTdW1tYXJ5TWFya2VyfXMgdW5kZXIgYCdzdW1tYXJ5J2AsIGFic2VudCB1bmRlclxuICAgKiAgYCdvZmYnYC4gUmVkYWN0ZWQgd3JpdGVzIHNob3cgYCdbUkVEQUNURURdJ2AgcmVnYXJkbGVzcyBvZiBtb2RlLiAqL1xuICBzdGFnZVdyaXRlcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAvKiogVXNlci1sZXZlbCByZWFkcyBtYWRlIGJ5IHRoaXMgc3RhZ2UgKHByZS1uYW1lc3BhY2Uga2V5cyDihpIgdmFsdWVzIGF0IHJlYWRcbiAgICogIHRpbWUpLiBTaGFwZSBkZXBlbmRzIG9uIHtAbGluayBSZWFkVHJhY2tpbmdNb2RlfTogY2xvbmVkIHZhbHVlcyB1bmRlclxuICAgKiAgYCdmdWxsJ2AgKGRlZmF1bHQpLCB7QGxpbmsgUmVhZFN1bW1hcnlNYXJrZXJ9cyB1bmRlciBgJ3N1bW1hcnknYCwgYWJzZW50XG4gICAqICB1bmRlciBgJ29mZidgLiAqL1xuICBzdGFnZVJlYWRzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGxvZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBlcnJvcnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBtZXRyaWNzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgZXZhbHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBmbG93TWVzc2FnZXM/OiBGbG93TWVzc2FnZVtdO1xuICBuZXh0PzogU3RhZ2VTbmFwc2hvdDtcbiAgY2hpbGRyZW4/OiBTdGFnZVNuYXBzaG90W107XG59O1xuIl19
|
|
@@ -18,7 +18,9 @@ export type { HonestyCode } from './honesty.js';
|
|
|
18
18
|
export { HONESTY_CODES } from './honesty.js';
|
|
19
19
|
export { LOG_PLACEHOLDER } from './placeholders.js';
|
|
20
20
|
export { SCOPE_PLACEHOLDER } from './redaction.js';
|
|
21
|
-
export type {
|
|
22
|
-
export {
|
|
21
|
+
export type { RetentionPolicy } from '../capture/policies.js';
|
|
22
|
+
export type { ReadSummaryMarker, WriteSummaryMarker } from '../capture/summarize.js';
|
|
23
|
+
export type { FlowControlType, FlowMessage, ReadTrackingMode, StageSnapshot, WriteTrackingMode } from './frameTypes.js';
|
|
24
|
+
export type { CommitBundle, CommitValuesMode, MemoryPatch, TraceEntry, UntrackedSource } from './types.js';
|
|
23
25
|
export { UnknownVerbError } from './verbs.js';
|
|
24
26
|
export { applySmartMerge, deepSmartMerge, DELIM, getNestedValue, getRunAndGlobalPaths, normalisePath, pathSegments, setNestedValue, updateNestedValue, updateValue, } from './utils.js';
|
|
@@ -18,9 +18,8 @@ export { HONESTY_CODES } from './honesty.js';
|
|
|
18
18
|
// The two strings a redaction leaves where a value was, one per owner (F4a; split in C4): the record's, the verdict's
|
|
19
19
|
export { LOG_PLACEHOLDER } from './placeholders.js';
|
|
20
20
|
export { SCOPE_PLACEHOLDER } from './redaction.js';
|
|
21
|
-
export { READ_PREVIEW_LENGTH, SUMMARY_PREVIEW_LENGTH } from './types.js';
|
|
22
21
|
// The verb law's refusal: a commit row whose verb is not set | merge | append | delete
|
|
23
22
|
export { UnknownVerbError } from './verbs.js';
|
|
24
23
|
// Utilities
|
|
25
24
|
export { applySmartMerge, deepSmartMerge, DELIM, getNestedValue, getRunAndGlobalPaths, normalisePath, pathSegments, setNestedValue, updateNestedValue, updateValue, } from './utils.js';
|
|
26
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21lbW9yeS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwwQkFBMEI7QUFDMUI7Ozs7O0dBS0c7QUFFSCxVQUFVO0FBQ1YsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDL0QsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDakQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBSTNELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBSXpDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUkvRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRTdDLHNIQUFzSDtBQUN0SCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDcEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFTbkQsdUZBQXVGO0FBQ3ZGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUU5QyxZQUFZO0FBQ1osT0FBTyxFQUNMLGVBQWUsRUFDZixjQUFjLEVBQ2QsS0FBSyxFQUNMLGNBQWMsRUFDZCxvQkFBb0IsRUFDcEIsYUFBYSxFQUNiLFlBQVksRUFDWixjQUFjLEVBQ2QsaUJBQWlCLEVBQ2pCLFdBQVcsR0FDWixNQUFNLFlBQVksQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGlzdGFuYnVsIGlnbm9yZSBmaWxlICovXG4vKipcbiAqIG1lbW9yeS8g4oCUIEZvdW5kYXRpb24gbGlicmFyeSAoemVybyBleHRlcm5hbCBkZXBzKVxuICpcbiAqIFRyYW5zYWN0aW9uYWwgc3RhdGUgbWFuYWdlbWVudCB3aXRoIG5hbWVzcGFjZSBpc29sYXRpb24sXG4gKiBhdG9taWMgY29tbWl0cywgYW5kIGV2ZW50LXNvdXJjZWQgdGltZS10cmF2ZWwuXG4gKi9cblxuLy8gQ2xhc3Nlc1xuZXhwb3J0IHsgRGlhZ25vc3RpY0NvbGxlY3RvciB9IGZyb20gJy4vRGlhZ25vc3RpY0NvbGxlY3Rvci5qcyc7XG5leHBvcnQgeyBFdmVudExvZyB9IGZyb20gJy4vRXZlbnRMb2cuanMnO1xuZXhwb3J0IHsgU2hhcmVkTWVtb3J5IH0gZnJvbSAnLi9TaGFyZWRNZW1vcnkuanMnO1xuZXhwb3J0IHsgU3RhZ2VDb250ZXh0IH0gZnJvbSAnLi9TdGFnZUNvbnRleHQuanMnO1xuZXhwb3J0IHsgVHJhbnNhY3Rpb25CdWZmZXIgfSBmcm9tICcuL1RyYW5zYWN0aW9uQnVmZmVyLmpzJztcblxuLy8gUmVkYWN0aW9uIOKAlCB0aGUgT05FIG93bmVyIG9mIHRoZSB2ZXJkaWN0ICg5LjE5LjApOyB0aGUgbG9nJ3Mgc2NydWIgaXMgdGhlIHJlY29yZCdzIChzY3J1Yi50cywgQzQpXG5leHBvcnQgdHlwZSB7IFJlZGFjdGlvblZlcmRpY3QgfSBmcm9tICcuL3JlZGFjdGlvbi5qcyc7XG5leHBvcnQgeyBSZWRhY3Rpb25SdWxlIH0gZnJvbSAnLi9yZWRhY3Rpb24uanMnO1xuZXhwb3J0IHsgcmVkYWN0UGF0Y2ggfSBmcm9tICcuL3NjcnViLmpzJztcblxuLy8gVGhlIHJ1bidzIHBvbGljeSDigJQgdGhlIGZvdXIgZGlhbHMsIHRoZSBydWxlLCB0aGUgbWlycm9yIGZsYWcgYXMgT05FIG9iamVjdCAoRjUpXG5leHBvcnQgdHlwZSB7IFJ1bkRpYWxzLCBSdW5Qb2xpY3kgfSBmcm9tICcuL3J1blBvbGljeS5qcyc7XG5leHBvcnQgeyBERUZBVUxUX1JVTl9QT0xJQ1ksIHJ1blBvbGljeSB9IGZyb20gJy4vcnVuUG9saWN5LmpzJztcblxuLy8gSG9uZXN0eSDigJQgdGhlIE9ORSB2b2NhYnVsYXJ5IGZvciB3aGF0IGEgcmVhZGVyIGNhbm5vdCBzZWUgKEY0YSk6IGNvZGUg4oaSIHRoZSBvbmUgc2VudGVuY2VcbmV4cG9ydCB0eXBlIHsgSG9uZXN0eUNvZGUgfSBmcm9tICcuL2hvbmVzdHkuanMnO1xuZXhwb3J0IHsgSE9ORVNUWV9DT0RFUyB9IGZyb20gJy4vaG9uZXN0eS5qcyc7XG5cbi8vIFRoZSB0d28gc3RyaW5ncyBhIHJlZGFjdGlvbiBsZWF2ZXMgd2hlcmUgYSB2YWx1ZSB3YXMsIG9uZSBwZXIgb3duZXIgKEY0YTsgc3BsaXQgaW4gQzQpOiB0aGUgcmVjb3JkJ3MsIHRoZSB2ZXJkaWN0J3NcbmV4cG9ydCB7IExPR19QTEFDRUhPTERFUiB9IGZyb20gJy4vcGxhY2Vob2xkZXJzLmpzJztcbmV4cG9ydCB7IFNDT1BFX1BMQUNFSE9MREVSIH0gZnJvbSAnLi9yZWRhY3Rpb24uanMnO1xuXG4vLyBUeXBlcyDigJQgdGhlIHJldGVudGlvbiBmYW1pbHkgdGhlIGZyYW1lJ3MgZGlhbHMgYWxpYXMgKGNhcHR1cmUvLCBpdHMgb3duZXIpLCB0aGUgZnJhbWUncyAoZnJhbWVUeXBlcy50cyxcbi8vIEw0IOKAlCBvdXQgb2YgdGhlIHJlY29yZCdzIHR5cGVzLnRzIGluIEM2KSBhbmQgdGhlIHJlY29yZCdzICh0eXBlcy50cylcbmV4cG9ydCB0eXBlIHsgUmV0ZW50aW9uUG9saWN5IH0gZnJvbSAnLi4vY2FwdHVyZS9wb2xpY2llcy5qcyc7XG5leHBvcnQgdHlwZSB7IFJlYWRTdW1tYXJ5TWFya2VyLCBXcml0ZVN1bW1hcnlNYXJrZXIgfSBmcm9tICcuLi9jYXB0dXJlL3N1bW1hcml6ZS5qcyc7XG5leHBvcnQgdHlwZSB7IEZsb3dDb250cm9sVHlwZSwgRmxvd01lc3NhZ2UsIFJlYWRUcmFja2luZ01vZGUsIFN0YWdlU25hcHNob3QsIFdyaXRlVHJhY2tpbmdNb2RlIH0gZnJvbSAnLi9mcmFtZVR5cGVzLmpzJztcbmV4cG9ydCB0eXBlIHsgQ29tbWl0QnVuZGxlLCBDb21taXRWYWx1ZXNNb2RlLCBNZW1vcnlQYXRjaCwgVHJhY2VFbnRyeSwgVW50cmFja2VkU291cmNlIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbi8vIFRoZSB2ZXJiIGxhdydzIHJlZnVzYWw6IGEgY29tbWl0IHJvdyB3aG9zZSB2ZXJiIGlzIG5vdCBzZXQgfCBtZXJnZSB8IGFwcGVuZCB8IGRlbGV0ZVxuZXhwb3J0IHsgVW5rbm93blZlcmJFcnJvciB9IGZyb20gJy4vdmVyYnMuanMnO1xuXG4vLyBVdGlsaXRpZXNcbmV4cG9ydCB7XG4gIGFwcGx5U21hcnRNZXJnZSxcbiAgZGVlcFNtYXJ0TWVyZ2UsXG4gIERFTElNLFxuICBnZXROZXN0ZWRWYWx1ZSxcbiAgZ2V0UnVuQW5kR2xvYmFsUGF0aHMsXG4gIG5vcm1hbGlzZVBhdGgsXG4gIHBhdGhTZWdtZW50cyxcbiAgc2V0TmVzdGVkVmFsdWUsXG4gIHVwZGF0ZU5lc3RlZFZhbHVlLFxuICB1cGRhdGVWYWx1ZSxcbn0gZnJvbSAnLi91dGlscy5qcyc7XG4iXX0=
|
|
@@ -29,8 +29,9 @@
|
|
|
29
29
|
* rule's marks. The mirror STORE is not policy — each runtime (a subflow has its own) keeps
|
|
30
30
|
* its own store when `mirror` is set.
|
|
31
31
|
*/
|
|
32
|
+
import type { ReadTrackingMode, WriteTrackingMode } from './frameTypes.js';
|
|
32
33
|
import type { RedactionRule } from './redaction.js';
|
|
33
|
-
import type { CommitValuesMode,
|
|
34
|
+
import type { CommitValuesMode, WriteProvenanceMode } from './types.js';
|
|
34
35
|
/**
|
|
35
36
|
* The four observability dials as an executor takes them — every field optional, an absent
|
|
36
37
|
* one is its default. `FlowChartExecutorOptions` extends this interface.
|
|
@@ -66,4 +66,4 @@ export function withRedaction(policy, redaction) {
|
|
|
66
66
|
export function derivePolicy(policy, patch) {
|
|
67
67
|
return Object.freeze({ ...policy, ...patch });
|
|
68
68
|
}
|
|
69
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVuUG9saWN5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvcnVuUG9saWN5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4Qkc7QUErR0gseUdBQXlHO0FBQ3pHLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBaUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUN2RSxZQUFZLEVBQUUsTUFBTTtJQUNwQixhQUFhLEVBQUUsTUFBTTtJQUNyQixZQUFZLEVBQUUsTUFBTTtJQUNwQixlQUFlLEVBQUUsS0FBSztDQUN2QixDQUFDLENBQUM7QUFFSCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBMEIsQ0FBQztBQUV2RSwyR0FBMkc7QUFDM0csTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQWMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsYUFBYSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0FBRWhHLG1GQUFtRjtBQUNuRixNQUFNLFVBQVUsU0FBUyxDQUFDLFFBQWtCLEVBQUUsRUFBRSxTQUF5QixFQUFFLE1BQU0sR0FBRyxLQUFLO0lBQ3ZGLE1BQU0sUUFBUSxHQUE0QixFQUFFLEdBQUcsYUFBYSxFQUFFLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDO0lBQzVGLElBQUksU0FBUztRQUFFLFFBQVEsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO0lBQzlDLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQXlCLENBQUM7QUFDekQsQ0FBQztBQUVELHFGQUFxRjtBQUNyRixNQUFNLFVBQVUsU0FBUyxDQUFDLE1BQWdCO0lBQ3hDLE1BQU0sS0FBSyxHQUE0QixFQUFFLENBQUM7SUFDMUMsS0FBSyxNQUFNLElBQUksSUFBSSxVQUFVO1FBQUUsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssU0FBUztZQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDMUYsT0FBTyxLQUFpQixDQUFDO0FBQzNCLENBQUM7QUFFRCw2RkFBNkY7QUFDN0YsTUFBTSxVQUFVLGFBQWEsQ0FBQyxNQUFpQixFQUFFLFNBQXdCO0lBQ3ZFLE9BQU8sWUFBWSxDQUFDLE1BQU0sRUFBRSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7QUFDN0MsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUFDLE1BQWlCLEVBQUUsS0FBeUI7SUFDdkUsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxNQUFNLEVBQUUsR0FBRyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0FBQ2hELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFJ1blBvbGljeSDigJQgd2hhdCBhIHJ1biByZXRhaW5zLCBlbmNvZGVzIGFuZCBzY3J1YnMsIGFzIE9ORSBpbW11dGFibGUgb2JqZWN0IChGNSkuXG4gKlxuICogV0hZLiBBIHJ1biBjYXJyaWVzIHNpeCBzZXR0aW5ncyB0aGF0IGV2ZXJ5IHN0YWdlIGZyYW1lIG11c3QgYWdyZWUgb246IHRoZSBmb3VyXG4gKiBvYnNlcnZhYmlsaXR5IGRpYWxzIChgcmVhZFRyYWNraW5nYCwgYHdyaXRlVHJhY2tpbmdgLCBgY29tbWl0VmFsdWVzYCwgYHdyaXRlUHJvdmVuYW5jZWApLFxuICogdGhlIHJlZGFjdGlvbiBydWxlLCBhbmQgd2hldGhlciBhIHJlZGFjdGVkIG1pcnJvciBpcyBrZXB0LiBVbnRpbCA5LjM0LjAgZWFjaCBvbmUgd2FzXG4gKiBjb3BpZWQgZmllbGQgYnkgZmllbGQgZG93biB0aHJlZSBzZXBhcmF0ZSBwYXRocyDigJQgYEV4ZWN1dGlvblJ1bnRpbWUudXNlKmAgb24gdGhlIHJvb3QsXG4gKiBgU3RhZ2VDb250ZXh0LmNyZWF0ZU5leHRgL2BjcmVhdGVDaGlsZGAgKHNpeCBhc3NpZ25tZW50cyBlYWNoKSwgYW5kIGEgZHVjay10eXBlZCBwdXNoIHBlclxuICogZGlhbCBpbiBgU3ViZmxvd0V4ZWN1dG9yYCDigJQgc28gYSBuZXcgZGlhbCBtZWFudCBzaXggZWRpdHMsIGFuZCBhIG1pc3NlZCBvbmUgcmFuIGEgc3ViZmxvd1xuICogb24gdGhlIGRlZmF1bHQgc2lsZW50bHkuIE5vdyB0aGUgZXhlY3V0b3IgYnVpbGRzIE9ORSBwb2xpY3kgcGVyIHJ1biAoYW5kIHBlciByZXN1bWUpLCB0aGVcbiAqIHJ1bnRpbWUgaW5zdGFsbHMgaXQgb24gaXRzIHJvb3QgZnJhbWUsIGFuZCBldmVyeSBmcmFtZSBob2xkcyBpdCBCWSBSRUZFUkVOQ0U6IGEgY2hpbGQsIGFcbiAqIGNvbnRpbnVhdGlvbiBhbmQgYSBzdWJmbG93J3Mgcm9vdCAoaXRzIHNlZWQgZnJhbWUgaW5jbHVkZWQpIGFsbCBwb2ludCBhdCB0aGUgc2FtZSBvYmplY3QuXG4gKiBUaGUgYm9ycm93ZWQgaWRlYSBpcyBHbydzIGBjb250ZXh0LkNvbnRleHRgIC8gT3BlblRlbGVtZXRyeSdzIGBDb250ZXh0YDogYW4gaW1tdXRhYmxlIHZhbHVlXG4gKiBoYW5kZWQgZG93biwgbmV2ZXIgY29waWVkIGFwYXJ0LlxuICpcbiAqIEFERElORyBBIERJQUwgaXMgdHdvIGZpbGVzOiBhIGZpZWxkICsgaXRzIGRlZmF1bHQgaGVyZSAoe0BsaW5rIFJ1bkRpYWxzfSxcbiAqIHtAbGluayBESUFMX0RFRkFVTFRTfSksIGFuZCB0aGUgZnJhbWUgY29kZSB0aGF0IHJlYWRzIGBwb2xpY3kuPGRpYWw+YCAoYFN0YWdlQ29udGV4dGApLiBUaGVcbiAqIGV4ZWN1dG9yJ3Mgb3B0aW9ucyBpbmhlcml0IHtAbGluayBSdW5EaWFsc30sIHBpY2tzIHRoZW0gd2l0aCB7QGxpbmsgcGlja0RpYWxzfSwgYW5kIGV2ZXJ5XG4gKiBwcm9wYWdhdGlvbiBwYXRoIGNhcnJpZXMgdGhlIHdob2xlIG9iamVjdCDigJQgbm9uZSBvZiB0aGVtIG5hbWVzIGEgZGlhbC5cbiAqXG4gKiBgYGB0c1xuICogY29uc3QgcG9saWN5ID0gcnVuUG9saWN5KHsgY29tbWl0VmFsdWVzOiAnZGVsdGEnIH0sIHJ1bGUsIHRydWUpO1xuICogcG9saWN5LnJlYWRUcmFja2luZzsgLy8gJ2Z1bGwnIOKAlCBhbiBhYnNlbnQgZGlhbCBpcyBpdHMgZGVmYXVsdFxuICogT2JqZWN0LmlzRnJvemVuKHBvbGljeSk7IC8vIHRydWUg4oCUIGEgZnJhbWUgY2FuIG5ldmVyIGVkaXQgd2hhdCBpdHMgc2libGluZ3Mgc2hhcmVcbiAqIGBgYFxuICpcbiAqIFRoZSBSVUxFIGluc2lkZSBpcyBzaGFyZWQgdG9vLCBhbmQgaXMgaXRzZWxmIHN0YXRlZnVsIGJ5IGRlc2lnbiAocGVyLWNhbGwgYHNldFZhbHVlKGssIHYsXG4gKiB0cnVlKWAgbWFya3MgYSBrZXkgb24gaXQgZm9yIHRoZSByZXN0IG9mIHRoZSBydW4pOyB0aGUgcG9saWN5IGZyZWV6ZXMgd2hpY2ggcnVsZSwgbm90IHRoZVxuICogcnVsZSdzIG1hcmtzLiBUaGUgbWlycm9yIFNUT1JFIGlzIG5vdCBwb2xpY3kg4oCUIGVhY2ggcnVudGltZSAoYSBzdWJmbG93IGhhcyBpdHMgb3duKSBrZWVwc1xuICogaXRzIG93biBzdG9yZSB3aGVuIGBtaXJyb3JgIGlzIHNldC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFJlZGFjdGlvblJ1bGUgfSBmcm9tICcuL3JlZGFjdGlvbi5qcyc7XG5pbXBvcnQgdHlwZSB7IENvbW1pdFZhbHVlc01vZGUsIFJlYWRUcmFja2luZ01vZGUsIFdyaXRlUHJvdmVuYW5jZU1vZGUsIFdyaXRlVHJhY2tpbmdNb2RlIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbi8qKlxuICogVGhlIGZvdXIgb2JzZXJ2YWJpbGl0eSBkaWFscyBhcyBhbiBleGVjdXRvciB0YWtlcyB0aGVtIOKAlCBldmVyeSBmaWVsZCBvcHRpb25hbCwgYW4gYWJzZW50XG4gKiBvbmUgaXMgaXRzIGRlZmF1bHQuIGBGbG93Q2hhcnRFeGVjdXRvck9wdGlvbnNgIGV4dGVuZHMgdGhpcyBpbnRlcmZhY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnVuRGlhbHMge1xuICAvKipcbiAgICogUG9saWN5IGZvciBgU3RhZ2VTbmFwc2hvdC5zdGFnZVJlYWRzYCAoIzE0KS4gRGVmYXVsdCBgJ2Z1bGwnYCDigJQgZXZlcnlcbiAgICogdHJhY2tlZCByZWFkIGBzdHJ1Y3R1cmVkQ2xvbmVgcyB0aGUgdmFsdWUgaW50byB0aGUgc3RhZ2UncyByZWFkIHZpZXdcbiAgICogKHRoZSBoaXN0b3JpY2FsIGJlaGF2aW9yOyB3aGF0IGxlbnMvYWdlbnRmb290cHJpbnQgc25hcHNob3RzIHNob3cpLlxuICAgKiBgJ3N1bW1hcnknYCByZWNvcmRzIGEgY2hlYXAgdHlwZS9zaXplL3ByZXZpZXcgbWFya2VyIHBlciByZWFkOyBgJ29mZidgXG4gICAqIHJlY29yZHMgbm90aGluZyDigJQgemVybyBwZXItcmVhZCBjbG9uZSBjb3N0IChyZWFkcyBvZiBsYXJnZSB2YWx1ZXMgYmVjb21lXG4gICAqIH5mcmVlKS4gTmFycmF0aXZlIGFuZCBgU2NvcGVSZWNvcmRlci5vblJlYWRgIGFyZSBpZGVudGljYWwgaW4gZXZlcnkgbW9kZS5cbiAgICogQ2F2ZWF0OiB1bmRlciBgJ29mZidgIGEgc3RhZ2UncyBzbmFwc2hvdCBpcyBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIG9uZVxuICAgKiB0aGF0IHJlYWQgbm90aGluZyDigJQgYXVkaXRpbmcgY29uc3VtZXJzIHRoYXQgbmVlZCBcImRpZCBpdCByZWFkP1wiIHdpdGhvdXRcbiAgICogdGhlIHZhbHVlIGNvc3Qgc2hvdWxkIHByZWZlciBgJ3N1bW1hcnknYC5cbiAgICogRXF1aXZhbGVudCB0byBjYWxsaW5nIGBleGVjdXRvci5zZXRSZWFkVHJhY2tpbmcobW9kZSlgIGJlZm9yZSBgcnVuKClgLlxuICAgKi9cbiAgcmVhZFRyYWNraW5nPzogUmVhZFRyYWNraW5nTW9kZTtcblxuICAvKipcbiAgICogUG9saWN5IGZvciBgU3RhZ2VTbmFwc2hvdC5zdGFnZVdyaXRlc2AgKCMxM2MtQSkg4oCUIHRoZSBzaWJsaW5nIG9mXG4gICAqIHtAbGluayByZWFkVHJhY2tpbmd9OyB0aGUgdHdvIGRpYWxzIGFyZSBpbmRlcGVuZGVudC4gRGVmYXVsdCBgJ2Z1bGwnYCDigJRcbiAgICogZXZlcnkgdHJhY2tlZCB3cml0ZSBgc3RydWN0dXJlZENsb25lYHMgdGhlIHZhbHVlIGludG8gdGhlIHN0YWdlJ3Mgd3JpdGVcbiAgICogdmlldyAodGhlIGhpc3RvcmljYWwgYmVoYXZpb3IpLiBgJ3N1bW1hcnknYCByZWNvcmRzIGEgY2hlYXBcbiAgICogYFdyaXRlU3VtbWFyeU1hcmtlcmAgKHR5cGUvc2l6ZS9wcmV2aWV3KSBwZXIgd3JpdGU7IGAnb2ZmJ2AgcmVjb3Jkc1xuICAgKiBub3RoaW5nIOKAlCBgc3RhZ2VXcml0ZXNgIGlzIGFic2VudCBmcm9tIHRoZSBzbmFwc2hvdC5cbiAgICpcbiAgICogT2JzZXJ2YWJsZSBjb25zZXF1ZW5jZXMg4oCUIHdoYXQgdGhlIHBvbGljeSBET0VTIGdvdmVybjpcbiAgICogLSBgU3RhZ2VTbmFwc2hvdC5zdGFnZVdyaXRlc2AgKG1hcmtlcnMgdW5kZXIgYCdzdW1tYXJ5J2AsIGFic2VudCB1bmRlclxuICAgKiAgIGAnb2ZmJ2ApLlxuICAgKiAtIFRoZSBjb21taXQgb2JzZXJ2ZXIgcGF5bG9hZDogYFNjb3BlUmVjb3JkZXIub25Db21taXQobXV0YXRpb25zKWBcbiAgICogICByZWNlaXZlcyB0aGUgcmV0YWluZWQgYF9zdGFnZVdyaXRlc2AgZW50cmllcywgc28gaXQgY2FycmllcyB0aGUgc2FtZVxuICAgKiAgIG1hcmtlcnMgdW5kZXIgYCdzdW1tYXJ5J2AgYW5kIGFuIGVtcHR5IG11dGF0aW9ucyBiYWcgdW5kZXIgYCdvZmYnYCDigJRcbiAgICogICBkZWZlcnJlZC9vYnNlcnZlciBjb25zdW1lcnMgc2VlIGV4YWN0bHkgd2hhdCByZXRlbnRpb24gc3RvcmVkLlxuICAgKlxuICAgKiBXaGF0IGl0IGRvZXMgTk9UIGdvdmVybjpcbiAgICogLSBUaGUgd3JpdGVzIHRoZW1zZWx2ZXM6IHNoYXJlZCBzdGF0ZSwgdGhlIHRyYW5zYWN0aW9uIGJ1ZmZlciwgYW5kIHRoZVxuICAgKiAgIENPTU1JVCBMT0cgYXJlIGlkZW50aWNhbCBpbiBldmVyeSBtb2RlIChjb21taXRMb2cgdmFsdWVzIGtlZXAgdGhlaXJcbiAgICogICBmdWxsIHBheWxvYWRzIOKAlCB0aGUgbG9zc2xlc3MgbGluZWFyLWNvc3QgZml4IGZvciB0aG9zZSBpcyB0aGVcbiAgICogICB7QGxpbmsgY29tbWl0VmFsdWVzfSBkaWFsLCAjMTNjLUIpLlxuICAgKiAtIFBlci1vcCBgU2NvcGVSZWNvcmRlci5vbldyaXRlYCBldmVudHMg4oCUIHRoZXkgZmlyZSB3aXRoIGxpdmUgdmFsdWVzXG4gICAqICAgcmVnYXJkbGVzcyAoZGVsaXZlcnkgdGllciwgUkZDLTAwMSdzIGNvbmNlcm4pLCBzbyBuYXJyYXRpdmUgb3V0cHV0IGlzXG4gICAqICAgaWRlbnRpY2FsIGluIGV2ZXJ5IG1vZGUuXG4gICAqIC0gUmVkYWN0aW9uOiBhIHBvbGljeS9wZXItY2FsbC1yZWRhY3RlZCB3cml0ZSBzdG9yZXMgYCdbUkVEQUNURURdJ2BcbiAgICogICB1bmRlciBgJ2Z1bGwnYCBBTkQgYCdzdW1tYXJ5J2AgKHJlZGFjdGlvbiB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgdGhlXG4gICAqICAgZGlhbDsgYSBtYXJrZXIgd291bGQgbGVhayBzaXplL3ByZXZpZXcpLCBhbmQgbm90aGluZyB1bmRlciBgJ29mZidgLlxuICAgKlxuICAgKiBDYXZlYXQ6IHVuZGVyIGAnb2ZmJ2AgYSBzdGFnZSdzIFNOQVBTSE9UIGlzIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gb25lXG4gICAqIHRoYXQgd3JvdGUgbm90aGluZyDigJQgYnV0IHVubGlrZSBgcmVhZFRyYWNraW5nOiAnb2ZmJ2AsIHRoZSBjb21taXQgbG9nXG4gICAqIHN0aWxsIHJlY29yZHMgZXZlcnkgbmV0IGNoYW5nZSwgc28gXCJkaWQgaXQgd3JpdGU/XCIgc3RheXMgYW5zd2VyYWJsZS5cbiAgICogRXF1aXZhbGVudCB0byBjYWxsaW5nIGBleGVjdXRvci5zZXRXcml0ZVRyYWNraW5nKG1vZGUpYCBiZWZvcmUgYHJ1bigpYC5cbiAgICovXG4gIHdyaXRlVHJhY2tpbmc/OiBXcml0ZVRyYWNraW5nTW9kZTtcblxuICAvKipcbiAgICogRW5jb2RpbmcgcG9saWN5IGZvciBDT01NSVQgTE9HIHZhbHVlcyAoIzEzYy1CKSDigJQgdGhlIHRoaXJkIGRpYWwgb2YgdGhlXG4gICAqIGZhbWlseSwgYW5kIHVubGlrZSBpdHMgc2libGluZ3MgaXQgaXMgKipsb3NzbGVzcyBpbiBib3RoIG1vZGVzKiogKGl0XG4gICAqIGNoYW5nZXMgdGhlIGxvZydzIGVuY29kaW5nLCBuZXZlciBpdHMgaW5mb3JtYXRpb24pLlxuICAgKlxuICAgKiAtIGAnZnVsbCdgIChkZWZhdWx0KSDigJQgZXZlcnkgc3Vydml2aW5nIGBzZXRgIHBhdGggc3RvcmVzIHRoZSBmdWxsIGZpbmFsXG4gICAqICAgdmFsdWU7IGJ5dGUtaWRlbnRpY2FsIHRvIHRoZSBoaXN0b3JpY2FsIGJlaGF2aW9yLlxuICAgKiAtIGAnZGVsdGEnYCDigJQgYXJyYXkgbmV0LWNoYW5nZXMgdGhhdCBhcmUgXCJiYXNlIHBsdXMgYSB0YWlsXCIgY29tbWl0IGFzIGFuXG4gICAqICAgYGFwcGVuZGAgdHJhY2UgdmVyYiBzdG9yaW5nIE9OTFkgdGhlIHRhaWwgKHRoZSBncm93aW5nLWhpc3RvcnkgY29tbWl0XG4gICAqICAgbG9nIGJlY29tZXMgbGluZWFyIGluc3RlYWQgb2YgTyhOwrIpIHJldGFpbmVkKTsgYGRlbGV0ZVZhbHVlKClgIGNvbW1pdHNcbiAgICogICBhcyBhIHJlYWwgYGRlbGV0ZWAgdmVyYiAocmVwbGF5IHJlbW92ZXMgdGhlIGtleSBpbnN0ZWFkIG9mIGxlYXZpbmdcbiAgICogICBga2V5OiB1bmRlZmluZWRgKTsgYnVuZGxlcyBjYXJyeSBleGFjdGx5IE9ORSB0cmFjZSBlbnRyeSBwZXIgc3Vydml2aW5nXG4gICAqICAgcGF0aC4gUmVwbGF5ICh0aGUgb25lIHZlcmIgbGF3IOKAlCBsaXZlIHN0YXRlLCBgbWF0ZXJpYWxpc2UoKWAsIHRoZVxuICAgKiAgIHJlZGFjdGVkIG1pcnJvciwgYHN0YXRlQXRgKSByZWNvbnN0cnVjdHMgZXZlcnkgc3RlcCdzIGZ1bGwgc3RhdGVcbiAgICogICBleGFjdGx5LlxuICAgKlxuICAgKiBDb25zdW1lcnMgdGhhdCByZWFkIGBidW5kbGUub3ZlcndyaXRlW2tleV1gIGFzIFwidGhlIGZ1bGwgdmFsdWUgd3JpdHRlblwiXG4gICAqIG11c3Qgc3dpdGNoIHRvIGBjb21taXRWYWx1ZUF0KGNvbW1pdExvZywgaWR4LCBrZXkpYCBmcm9tXG4gICAqIGBmb290cHJpbnRqcy90cmFjZWAg4oCUIHVuZGVyIGAnZGVsdGEnYCB0aGF0IHZhbHVlIGlzIHZlcmItcXVhbGlmaWVkIChhblxuICAgKiBgYXBwZW5kYCBidW5kbGUgaG9sZHMgb25seSB0aGUgdGFpbCkuIFBhdGgtdGllciBjb25zdW1lcnNcbiAgICogKGBmaW5kTGFzdFdyaXRlcmAsIGBjYXVzYWxDaGFpbmAsIG5hcnJhdGl2ZSwgbGVucyBoaWdobGlnaHRzKSBhcmVcbiAgICogdW5hZmZlY3RlZC4gVGhlIGFjdGl2ZSBtb2RlIGlzIHN1cmZhY2VkIGFzXG4gICAqIGBnZXRTbmFwc2hvdCgpLmNvbW1pdFZhbHVlc2AuXG4gICAqXG4gICAqIEhvbmVzdCBjb3N0IG5vdGU6IGFwcGVuZCBkZXRlY3Rpb24gaXMgbmV3IHdhbGwgd29yayDigJQgYW4gTyh8YmFzZSBhcnJheXwpXG4gICAqIHN0cnVjdHVyYWwgcHJlZml4IGNvbXBhcmUgcGVyIGFycmF5LXNldCBwYXRoIHBlciBjb21taXQuIE9uIGEgaGl0IHRoZVxuICAgKiBjb21taXQgZ2V0cyBjaGVhcGVyIGluIGJvdGggd2FsbCBhbmQgaGVhcDsgb24gYSBtaXNzIChwcmVmaXggZGl2ZXJnZXMpXG4gICAqIGl0IHBheXMgY29tcGFyZSArIGZ1bGwgY2xvbmUuIGAnZnVsbCdgIHBheXMgemVyby5cbiAgICogRXF1aXZhbGVudCB0byBjYWxsaW5nIGBleGVjdXRvci5zZXRDb21taXRWYWx1ZXMobW9kZSlgIGJlZm9yZSBgcnVuKClgLlxuICAgKi9cbiAgY29tbWl0VmFsdWVzPzogQ29tbWl0VmFsdWVzTW9kZTtcblxuICAvKipcbiAgICogUGVyLXdyaXRlIHJlYWQgcHJvdmVuYW5jZSAoI1AxKSDigJQgdGhlIGZvdXJ0aCBkaWFsIG9mIHRoZSBmYW1pbHkuIERlZmF1bHRcbiAgICogYCdvZmYnYDogemVybyBjb3N0LCBieXRlLWlkZW50aWNhbCBjb21taXQgbG9ncy4gYCdyZWFkcy1wcmVmaXgnYDogZXZlcnlcbiAgICogY29tbWl0dGVkIGBUcmFjZUVudHJ5YCBjYXJyaWVzIGByZWFkS2V5c2Ag4oCUIHRoZSBrZXlzIHRyYWNrZWQtcmVhZCBCRUZPUkVcbiAgICogdGhhdCB3cml0ZSDigJQgZW5hYmxpbmcgcGVyLXdyaXRlIGNhdXNhbCBhdHRyaWJ1dGlvbiAoYGNhdXNhbENoYWluYCdzXG4gICAqIGBlZGdlQXR0cmlidXRpb246ICdwZXItd3JpdGUnYCBhbmQgdmFyaWFibGUgc2xpY2VzKS4gQ29zdDogb25lIHNtYWxsXG4gICAqIGFycmF5IGNvcHkgcGVyIHdyaXRlLiBTbmFwc2hvdCBkaXNjcmltaW5hbnQ6XG4gICAqIGBnZXRTbmFwc2hvdCgpLndyaXRlUHJvdmVuYW5jZWAuXG4gICAqL1xuICB3cml0ZVByb3ZlbmFuY2U/OiBXcml0ZVByb3ZlbmFuY2VNb2RlO1xufVxuXG4vKiogVGhlIHJ1bidzIHBvbGljeTogZXZlcnkgZGlhbCByZXNvbHZlZCwgcGx1cyB0aGUgcmVkYWN0aW9uIHJ1bGUgYW5kIHRoZSBtaXJyb3IgZmxhZy4gRnJvemVuLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSdW5Qb2xpY3kgZXh0ZW5kcyBSZWFkb25seTxSZXF1aXJlZDxSdW5EaWFscz4+IHtcbiAgLyoqIFRoZSBydW4ncyByZWRhY3Rpb24gcnVsZSDigJQgdGhlIE9ORSBvd25lciBvZiB0aGUgdmVyZGljdCAoYHJlZGFjdGlvbi50c2ApLiBBYnNlbnQgb24gYmFyZSBmcmFtZXMuICovXG4gIHJlYWRvbmx5IHJlZGFjdGlvbj86IFJlZGFjdGlvblJ1bGU7XG4gIC8qKiBLZWVwIGEgcmVkYWN0ZWQgbWlycm9yIG9mIHRoZSBoZWFwIChhIHJ1biB3aXRoIGEgcmVkYWN0aW9uIHBvbGljeSkuIEVhY2ggcnVudGltZSBvd25zIGl0cyBvd24gc3RvcmUuICovXG4gIHJlYWRvbmx5IG1pcnJvcjogYm9vbGVhbjtcbn1cblxuLyoqIEVhY2ggZGlhbCdzIGRlZmF1bHQg4oCUIHRoZSB2YWx1ZSBhIHJ1biBnZXRzIHdoZW4gdGhlIG9wdGlvbiBpcyBhYnNlbnQuIFRoZSBkaWFsIGxpc3QgSVMgdGhlc2Uga2V5cy4gKi9cbmV4cG9ydCBjb25zdCBESUFMX0RFRkFVTFRTOiBSZWFkb25seTxSZXF1aXJlZDxSdW5EaWFscz4+ID0gT2JqZWN0LmZyZWV6ZSh7XG4gIHJlYWRUcmFja2luZzogJ2Z1bGwnLFxuICB3cml0ZVRyYWNraW5nOiAnZnVsbCcsXG4gIGNvbW1pdFZhbHVlczogJ2Z1bGwnLFxuICB3cml0ZVByb3ZlbmFuY2U6ICdvZmYnLFxufSk7XG5cbmNvbnN0IERJQUxfTkFNRVMgPSBPYmplY3Qua2V5cyhESUFMX0RFRkFVTFRTKSBhcyBBcnJheTxrZXlvZiBSdW5EaWFscz47XG5cbi8qKiBFdmVyeSBkZWZhdWx0LCBubyBydWxlLCBubyBtaXJyb3Ig4oCUIHdoYXQgYSBiYXJlIGZyYW1lIChhIHVuaXQgdGVzdCdzIGBuZXcgU3RhZ2VDb250ZXh0YCkgcnVucyB1bmRlci4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX1JVTl9QT0xJQ1k6IFJ1blBvbGljeSA9IE9iamVjdC5mcmVlemUoeyAuLi5ESUFMX0RFRkFVTFRTLCBtaXJyb3I6IGZhbHNlIH0pO1xuXG4vKiogQnVpbGQgYSBydW4ncyBwb2xpY3k6IGFic2VudCBkaWFscyB0YWtlIHRoZWlyIGRlZmF1bHQ7IHRoZSByZXN1bHQgaXMgZnJvemVuLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJ1blBvbGljeShkaWFsczogUnVuRGlhbHMgPSB7fSwgcmVkYWN0aW9uPzogUmVkYWN0aW9uUnVsZSwgbWlycm9yID0gZmFsc2UpOiBSdW5Qb2xpY3kge1xuICBjb25zdCByZXNvbHZlZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7IC4uLkRJQUxfREVGQVVMVFMsIC4uLnBpY2tEaWFscyhkaWFscyksIG1pcnJvciB9O1xuICBpZiAocmVkYWN0aW9uKSByZXNvbHZlZC5yZWRhY3Rpb24gPSByZWRhY3Rpb247XG4gIHJldHVybiBPYmplY3QuZnJlZXplKHJlc29sdmVkKSBhcyB1bmtub3duIGFzIFJ1blBvbGljeTtcbn1cblxuLyoqIFRoZSBkaWFscyBzZXQgb24gYHNvdXJjZWAgKGFuIG9wdGlvbnMgb2JqZWN0LCBzYXkpIOKAlCBhbmQgbm90aGluZyBlbHNlIGZyb20gaXQuICovXG5leHBvcnQgZnVuY3Rpb24gcGlja0RpYWxzKHNvdXJjZTogUnVuRGlhbHMpOiBSdW5EaWFscyB7XG4gIGNvbnN0IGRpYWxzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICBmb3IgKGNvbnN0IG5hbWUgb2YgRElBTF9OQU1FUykgaWYgKHNvdXJjZVtuYW1lXSAhPT0gdW5kZWZpbmVkKSBkaWFsc1tuYW1lXSA9IHNvdXJjZVtuYW1lXTtcbiAgcmV0dXJuIGRpYWxzIGFzIFJ1bkRpYWxzO1xufVxuXG4vKiogVGhlIHNhbWUgcG9saWN5IHVuZGVyIGFub3RoZXIgcnVsZSDigJQgYSBORVcgZnJvemVuIG9iamVjdDsgdGhlIG9sZCBvbmUgaXMgbmV2ZXIgZWRpdGVkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhSZWRhY3Rpb24ocG9saWN5OiBSdW5Qb2xpY3ksIHJlZGFjdGlvbjogUmVkYWN0aW9uUnVsZSk6IFJ1blBvbGljeSB7XG4gIHJldHVybiBkZXJpdmVQb2xpY3kocG9saWN5LCB7IHJlZGFjdGlvbiB9KTtcbn1cblxuLyoqXG4gKiBUaGUgc2FtZSBwb2xpY3kgd2l0aCBzb21lIHNldHRpbmdzIGNoYW5nZWQg4oCUIGEgTkVXIGZyb3plbiBvYmplY3Q7IHRoZSBvbGQgb25lIGlzIG5ldmVyXG4gKiBlZGl0ZWQuIEEgZnJhbWUgb3IgcnVudGltZSBjaGFuZ2VzIGEgc2V0dGluZyBieSBzd2FwcGluZyBpbiBhIGRlcml2ZWQgcG9saWN5IChgdXNlUG9saWN5YCksIHNvXG4gKiBubyBtdXRhYmxlIGRpYWwgZmllbGQgZXhpc3RzIGFueXdoZXJlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVyaXZlUG9saWN5KHBvbGljeTogUnVuUG9saWN5LCBwYXRjaDogUGFydGlhbDxSdW5Qb2xpY3k+KTogUnVuUG9saWN5IHtcbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoeyAuLi5wb2xpY3ksIC4uLnBhdGNoIH0pO1xufVxuIl19
|
|
69
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVuUG9saWN5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvcnVuUG9saWN5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4Qkc7QUFnSEgseUdBQXlHO0FBQ3pHLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBaUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUN2RSxZQUFZLEVBQUUsTUFBTTtJQUNwQixhQUFhLEVBQUUsTUFBTTtJQUNyQixZQUFZLEVBQUUsTUFBTTtJQUNwQixlQUFlLEVBQUUsS0FBSztDQUN2QixDQUFDLENBQUM7QUFFSCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBMEIsQ0FBQztBQUV2RSwyR0FBMkc7QUFDM0csTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQWMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsYUFBYSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0FBRWhHLG1GQUFtRjtBQUNuRixNQUFNLFVBQVUsU0FBUyxDQUFDLFFBQWtCLEVBQUUsRUFBRSxTQUF5QixFQUFFLE1BQU0sR0FBRyxLQUFLO0lBQ3ZGLE1BQU0sUUFBUSxHQUE0QixFQUFFLEdBQUcsYUFBYSxFQUFFLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDO0lBQzVGLElBQUksU0FBUztRQUFFLFFBQVEsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO0lBQzlDLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQXlCLENBQUM7QUFDekQsQ0FBQztBQUVELHFGQUFxRjtBQUNyRixNQUFNLFVBQVUsU0FBUyxDQUFDLE1BQWdCO0lBQ3hDLE1BQU0sS0FBSyxHQUE0QixFQUFFLENBQUM7SUFDMUMsS0FBSyxNQUFNLElBQUksSUFBSSxVQUFVO1FBQUUsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssU0FBUztZQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDMUYsT0FBTyxLQUFpQixDQUFDO0FBQzNCLENBQUM7QUFFRCw2RkFBNkY7QUFDN0YsTUFBTSxVQUFVLGFBQWEsQ0FBQyxNQUFpQixFQUFFLFNBQXdCO0lBQ3ZFLE9BQU8sWUFBWSxDQUFDLE1BQU0sRUFBRSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7QUFDN0MsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUFDLE1BQWlCLEVBQUUsS0FBeUI7SUFDdkUsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxNQUFNLEVBQUUsR0FBRyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0FBQ2hELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFJ1blBvbGljeSDigJQgd2hhdCBhIHJ1biByZXRhaW5zLCBlbmNvZGVzIGFuZCBzY3J1YnMsIGFzIE9ORSBpbW11dGFibGUgb2JqZWN0IChGNSkuXG4gKlxuICogV0hZLiBBIHJ1biBjYXJyaWVzIHNpeCBzZXR0aW5ncyB0aGF0IGV2ZXJ5IHN0YWdlIGZyYW1lIG11c3QgYWdyZWUgb246IHRoZSBmb3VyXG4gKiBvYnNlcnZhYmlsaXR5IGRpYWxzIChgcmVhZFRyYWNraW5nYCwgYHdyaXRlVHJhY2tpbmdgLCBgY29tbWl0VmFsdWVzYCwgYHdyaXRlUHJvdmVuYW5jZWApLFxuICogdGhlIHJlZGFjdGlvbiBydWxlLCBhbmQgd2hldGhlciBhIHJlZGFjdGVkIG1pcnJvciBpcyBrZXB0LiBVbnRpbCA5LjM0LjAgZWFjaCBvbmUgd2FzXG4gKiBjb3BpZWQgZmllbGQgYnkgZmllbGQgZG93biB0aHJlZSBzZXBhcmF0ZSBwYXRocyDigJQgYEV4ZWN1dGlvblJ1bnRpbWUudXNlKmAgb24gdGhlIHJvb3QsXG4gKiBgU3RhZ2VDb250ZXh0LmNyZWF0ZU5leHRgL2BjcmVhdGVDaGlsZGAgKHNpeCBhc3NpZ25tZW50cyBlYWNoKSwgYW5kIGEgZHVjay10eXBlZCBwdXNoIHBlclxuICogZGlhbCBpbiBgU3ViZmxvd0V4ZWN1dG9yYCDigJQgc28gYSBuZXcgZGlhbCBtZWFudCBzaXggZWRpdHMsIGFuZCBhIG1pc3NlZCBvbmUgcmFuIGEgc3ViZmxvd1xuICogb24gdGhlIGRlZmF1bHQgc2lsZW50bHkuIE5vdyB0aGUgZXhlY3V0b3IgYnVpbGRzIE9ORSBwb2xpY3kgcGVyIHJ1biAoYW5kIHBlciByZXN1bWUpLCB0aGVcbiAqIHJ1bnRpbWUgaW5zdGFsbHMgaXQgb24gaXRzIHJvb3QgZnJhbWUsIGFuZCBldmVyeSBmcmFtZSBob2xkcyBpdCBCWSBSRUZFUkVOQ0U6IGEgY2hpbGQsIGFcbiAqIGNvbnRpbnVhdGlvbiBhbmQgYSBzdWJmbG93J3Mgcm9vdCAoaXRzIHNlZWQgZnJhbWUgaW5jbHVkZWQpIGFsbCBwb2ludCBhdCB0aGUgc2FtZSBvYmplY3QuXG4gKiBUaGUgYm9ycm93ZWQgaWRlYSBpcyBHbydzIGBjb250ZXh0LkNvbnRleHRgIC8gT3BlblRlbGVtZXRyeSdzIGBDb250ZXh0YDogYW4gaW1tdXRhYmxlIHZhbHVlXG4gKiBoYW5kZWQgZG93biwgbmV2ZXIgY29waWVkIGFwYXJ0LlxuICpcbiAqIEFERElORyBBIERJQUwgaXMgdHdvIGZpbGVzOiBhIGZpZWxkICsgaXRzIGRlZmF1bHQgaGVyZSAoe0BsaW5rIFJ1bkRpYWxzfSxcbiAqIHtAbGluayBESUFMX0RFRkFVTFRTfSksIGFuZCB0aGUgZnJhbWUgY29kZSB0aGF0IHJlYWRzIGBwb2xpY3kuPGRpYWw+YCAoYFN0YWdlQ29udGV4dGApLiBUaGVcbiAqIGV4ZWN1dG9yJ3Mgb3B0aW9ucyBpbmhlcml0IHtAbGluayBSdW5EaWFsc30sIHBpY2tzIHRoZW0gd2l0aCB7QGxpbmsgcGlja0RpYWxzfSwgYW5kIGV2ZXJ5XG4gKiBwcm9wYWdhdGlvbiBwYXRoIGNhcnJpZXMgdGhlIHdob2xlIG9iamVjdCDigJQgbm9uZSBvZiB0aGVtIG5hbWVzIGEgZGlhbC5cbiAqXG4gKiBgYGB0c1xuICogY29uc3QgcG9saWN5ID0gcnVuUG9saWN5KHsgY29tbWl0VmFsdWVzOiAnZGVsdGEnIH0sIHJ1bGUsIHRydWUpO1xuICogcG9saWN5LnJlYWRUcmFja2luZzsgLy8gJ2Z1bGwnIOKAlCBhbiBhYnNlbnQgZGlhbCBpcyBpdHMgZGVmYXVsdFxuICogT2JqZWN0LmlzRnJvemVuKHBvbGljeSk7IC8vIHRydWUg4oCUIGEgZnJhbWUgY2FuIG5ldmVyIGVkaXQgd2hhdCBpdHMgc2libGluZ3Mgc2hhcmVcbiAqIGBgYFxuICpcbiAqIFRoZSBSVUxFIGluc2lkZSBpcyBzaGFyZWQgdG9vLCBhbmQgaXMgaXRzZWxmIHN0YXRlZnVsIGJ5IGRlc2lnbiAocGVyLWNhbGwgYHNldFZhbHVlKGssIHYsXG4gKiB0cnVlKWAgbWFya3MgYSBrZXkgb24gaXQgZm9yIHRoZSByZXN0IG9mIHRoZSBydW4pOyB0aGUgcG9saWN5IGZyZWV6ZXMgd2hpY2ggcnVsZSwgbm90IHRoZVxuICogcnVsZSdzIG1hcmtzLiBUaGUgbWlycm9yIFNUT1JFIGlzIG5vdCBwb2xpY3kg4oCUIGVhY2ggcnVudGltZSAoYSBzdWJmbG93IGhhcyBpdHMgb3duKSBrZWVwc1xuICogaXRzIG93biBzdG9yZSB3aGVuIGBtaXJyb3JgIGlzIHNldC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFJlYWRUcmFja2luZ01vZGUsIFdyaXRlVHJhY2tpbmdNb2RlIH0gZnJvbSAnLi9mcmFtZVR5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgUmVkYWN0aW9uUnVsZSB9IGZyb20gJy4vcmVkYWN0aW9uLmpzJztcbmltcG9ydCB0eXBlIHsgQ29tbWl0VmFsdWVzTW9kZSwgV3JpdGVQcm92ZW5hbmNlTW9kZSB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vKipcbiAqIFRoZSBmb3VyIG9ic2VydmFiaWxpdHkgZGlhbHMgYXMgYW4gZXhlY3V0b3IgdGFrZXMgdGhlbSDigJQgZXZlcnkgZmllbGQgb3B0aW9uYWwsIGFuIGFic2VudFxuICogb25lIGlzIGl0cyBkZWZhdWx0LiBgRmxvd0NoYXJ0RXhlY3V0b3JPcHRpb25zYCBleHRlbmRzIHRoaXMgaW50ZXJmYWNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJ1bkRpYWxzIHtcbiAgLyoqXG4gICAqIFBvbGljeSBmb3IgYFN0YWdlU25hcHNob3Quc3RhZ2VSZWFkc2AgKCMxNCkuIERlZmF1bHQgYCdmdWxsJ2Ag4oCUIGV2ZXJ5XG4gICAqIHRyYWNrZWQgcmVhZCBgc3RydWN0dXJlZENsb25lYHMgdGhlIHZhbHVlIGludG8gdGhlIHN0YWdlJ3MgcmVhZCB2aWV3XG4gICAqICh0aGUgaGlzdG9yaWNhbCBiZWhhdmlvcjsgd2hhdCBsZW5zL2FnZW50Zm9vdHByaW50IHNuYXBzaG90cyBzaG93KS5cbiAgICogYCdzdW1tYXJ5J2AgcmVjb3JkcyBhIGNoZWFwIHR5cGUvc2l6ZS9wcmV2aWV3IG1hcmtlciBwZXIgcmVhZDsgYCdvZmYnYFxuICAgKiByZWNvcmRzIG5vdGhpbmcg4oCUIHplcm8gcGVyLXJlYWQgY2xvbmUgY29zdCAocmVhZHMgb2YgbGFyZ2UgdmFsdWVzIGJlY29tZVxuICAgKiB+ZnJlZSkuIE5hcnJhdGl2ZSBhbmQgYFNjb3BlUmVjb3JkZXIub25SZWFkYCBhcmUgaWRlbnRpY2FsIGluIGV2ZXJ5IG1vZGUuXG4gICAqIENhdmVhdDogdW5kZXIgYCdvZmYnYCBhIHN0YWdlJ3Mgc25hcHNob3QgaXMgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSBvbmVcbiAgICogdGhhdCByZWFkIG5vdGhpbmcg4oCUIGF1ZGl0aW5nIGNvbnN1bWVycyB0aGF0IG5lZWQgXCJkaWQgaXQgcmVhZD9cIiB3aXRob3V0XG4gICAqIHRoZSB2YWx1ZSBjb3N0IHNob3VsZCBwcmVmZXIgYCdzdW1tYXJ5J2AuXG4gICAqIEVxdWl2YWxlbnQgdG8gY2FsbGluZyBgZXhlY3V0b3Iuc2V0UmVhZFRyYWNraW5nKG1vZGUpYCBiZWZvcmUgYHJ1bigpYC5cbiAgICovXG4gIHJlYWRUcmFja2luZz86IFJlYWRUcmFja2luZ01vZGU7XG5cbiAgLyoqXG4gICAqIFBvbGljeSBmb3IgYFN0YWdlU25hcHNob3Quc3RhZ2VXcml0ZXNgICgjMTNjLUEpIOKAlCB0aGUgc2libGluZyBvZlxuICAgKiB7QGxpbmsgcmVhZFRyYWNraW5nfTsgdGhlIHR3byBkaWFscyBhcmUgaW5kZXBlbmRlbnQuIERlZmF1bHQgYCdmdWxsJ2Ag4oCUXG4gICAqIGV2ZXJ5IHRyYWNrZWQgd3JpdGUgYHN0cnVjdHVyZWRDbG9uZWBzIHRoZSB2YWx1ZSBpbnRvIHRoZSBzdGFnZSdzIHdyaXRlXG4gICAqIHZpZXcgKHRoZSBoaXN0b3JpY2FsIGJlaGF2aW9yKS4gYCdzdW1tYXJ5J2AgcmVjb3JkcyBhIGNoZWFwXG4gICAqIGBXcml0ZVN1bW1hcnlNYXJrZXJgICh0eXBlL3NpemUvcHJldmlldykgcGVyIHdyaXRlOyBgJ29mZidgIHJlY29yZHNcbiAgICogbm90aGluZyDigJQgYHN0YWdlV3JpdGVzYCBpcyBhYnNlbnQgZnJvbSB0aGUgc25hcHNob3QuXG4gICAqXG4gICAqIE9ic2VydmFibGUgY29uc2VxdWVuY2VzIOKAlCB3aGF0IHRoZSBwb2xpY3kgRE9FUyBnb3Zlcm46XG4gICAqIC0gYFN0YWdlU25hcHNob3Quc3RhZ2VXcml0ZXNgIChtYXJrZXJzIHVuZGVyIGAnc3VtbWFyeSdgLCBhYnNlbnQgdW5kZXJcbiAgICogICBgJ29mZidgKS5cbiAgICogLSBUaGUgY29tbWl0IG9ic2VydmVyIHBheWxvYWQ6IGBTY29wZVJlY29yZGVyLm9uQ29tbWl0KG11dGF0aW9ucylgXG4gICAqICAgcmVjZWl2ZXMgdGhlIHJldGFpbmVkIGBfc3RhZ2VXcml0ZXNgIGVudHJpZXMsIHNvIGl0IGNhcnJpZXMgdGhlIHNhbWVcbiAgICogICBtYXJrZXJzIHVuZGVyIGAnc3VtbWFyeSdgIGFuZCBhbiBlbXB0eSBtdXRhdGlvbnMgYmFnIHVuZGVyIGAnb2ZmJ2Ag4oCUXG4gICAqICAgZGVmZXJyZWQvb2JzZXJ2ZXIgY29uc3VtZXJzIHNlZSBleGFjdGx5IHdoYXQgcmV0ZW50aW9uIHN0b3JlZC5cbiAgICpcbiAgICogV2hhdCBpdCBkb2VzIE5PVCBnb3Zlcm46XG4gICAqIC0gVGhlIHdyaXRlcyB0aGVtc2VsdmVzOiBzaGFyZWQgc3RhdGUsIHRoZSB0cmFuc2FjdGlvbiBidWZmZXIsIGFuZCB0aGVcbiAgICogICBDT01NSVQgTE9HIGFyZSBpZGVudGljYWwgaW4gZXZlcnkgbW9kZSAoY29tbWl0TG9nIHZhbHVlcyBrZWVwIHRoZWlyXG4gICAqICAgZnVsbCBwYXlsb2FkcyDigJQgdGhlIGxvc3NsZXNzIGxpbmVhci1jb3N0IGZpeCBmb3IgdGhvc2UgaXMgdGhlXG4gICAqICAge0BsaW5rIGNvbW1pdFZhbHVlc30gZGlhbCwgIzEzYy1CKS5cbiAgICogLSBQZXItb3AgYFNjb3BlUmVjb3JkZXIub25Xcml0ZWAgZXZlbnRzIOKAlCB0aGV5IGZpcmUgd2l0aCBsaXZlIHZhbHVlc1xuICAgKiAgIHJlZ2FyZGxlc3MgKGRlbGl2ZXJ5IHRpZXIsIFJGQy0wMDEncyBjb25jZXJuKSwgc28gbmFycmF0aXZlIG91dHB1dCBpc1xuICAgKiAgIGlkZW50aWNhbCBpbiBldmVyeSBtb2RlLlxuICAgKiAtIFJlZGFjdGlvbjogYSBwb2xpY3kvcGVyLWNhbGwtcmVkYWN0ZWQgd3JpdGUgc3RvcmVzIGAnW1JFREFDVEVEXSdgXG4gICAqICAgdW5kZXIgYCdmdWxsJ2AgQU5EIGAnc3VtbWFyeSdgIChyZWRhY3Rpb24gdGFrZXMgcHJlY2VkZW5jZSBvdmVyIHRoZVxuICAgKiAgIGRpYWw7IGEgbWFya2VyIHdvdWxkIGxlYWsgc2l6ZS9wcmV2aWV3KSwgYW5kIG5vdGhpbmcgdW5kZXIgYCdvZmYnYC5cbiAgICpcbiAgICogQ2F2ZWF0OiB1bmRlciBgJ29mZidgIGEgc3RhZ2UncyBTTkFQU0hPVCBpcyBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIG9uZVxuICAgKiB0aGF0IHdyb3RlIG5vdGhpbmcg4oCUIGJ1dCB1bmxpa2UgYHJlYWRUcmFja2luZzogJ29mZidgLCB0aGUgY29tbWl0IGxvZ1xuICAgKiBzdGlsbCByZWNvcmRzIGV2ZXJ5IG5ldCBjaGFuZ2UsIHNvIFwiZGlkIGl0IHdyaXRlP1wiIHN0YXlzIGFuc3dlcmFibGUuXG4gICAqIEVxdWl2YWxlbnQgdG8gY2FsbGluZyBgZXhlY3V0b3Iuc2V0V3JpdGVUcmFja2luZyhtb2RlKWAgYmVmb3JlIGBydW4oKWAuXG4gICAqL1xuICB3cml0ZVRyYWNraW5nPzogV3JpdGVUcmFja2luZ01vZGU7XG5cbiAgLyoqXG4gICAqIEVuY29kaW5nIHBvbGljeSBmb3IgQ09NTUlUIExPRyB2YWx1ZXMgKCMxM2MtQikg4oCUIHRoZSB0aGlyZCBkaWFsIG9mIHRoZVxuICAgKiBmYW1pbHksIGFuZCB1bmxpa2UgaXRzIHNpYmxpbmdzIGl0IGlzICoqbG9zc2xlc3MgaW4gYm90aCBtb2RlcyoqIChpdFxuICAgKiBjaGFuZ2VzIHRoZSBsb2cncyBlbmNvZGluZywgbmV2ZXIgaXRzIGluZm9ybWF0aW9uKS5cbiAgICpcbiAgICogLSBgJ2Z1bGwnYCAoZGVmYXVsdCkg4oCUIGV2ZXJ5IHN1cnZpdmluZyBgc2V0YCBwYXRoIHN0b3JlcyB0aGUgZnVsbCBmaW5hbFxuICAgKiAgIHZhbHVlOyBieXRlLWlkZW50aWNhbCB0byB0aGUgaGlzdG9yaWNhbCBiZWhhdmlvci5cbiAgICogLSBgJ2RlbHRhJ2Ag4oCUIGFycmF5IG5ldC1jaGFuZ2VzIHRoYXQgYXJlIFwiYmFzZSBwbHVzIGEgdGFpbFwiIGNvbW1pdCBhcyBhblxuICAgKiAgIGBhcHBlbmRgIHRyYWNlIHZlcmIgc3RvcmluZyBPTkxZIHRoZSB0YWlsICh0aGUgZ3Jvd2luZy1oaXN0b3J5IGNvbW1pdFxuICAgKiAgIGxvZyBiZWNvbWVzIGxpbmVhciBpbnN0ZWFkIG9mIE8oTsKyKSByZXRhaW5lZCk7IGBkZWxldGVWYWx1ZSgpYCBjb21taXRzXG4gICAqICAgYXMgYSByZWFsIGBkZWxldGVgIHZlcmIgKHJlcGxheSByZW1vdmVzIHRoZSBrZXkgaW5zdGVhZCBvZiBsZWF2aW5nXG4gICAqICAgYGtleTogdW5kZWZpbmVkYCk7IGJ1bmRsZXMgY2FycnkgZXhhY3RseSBPTkUgdHJhY2UgZW50cnkgcGVyIHN1cnZpdmluZ1xuICAgKiAgIHBhdGguIFJlcGxheSAodGhlIG9uZSB2ZXJiIGxhdyDigJQgbGl2ZSBzdGF0ZSwgYG1hdGVyaWFsaXNlKClgLCB0aGVcbiAgICogICByZWRhY3RlZCBtaXJyb3IsIGBzdGF0ZUF0YCkgcmVjb25zdHJ1Y3RzIGV2ZXJ5IHN0ZXAncyBmdWxsIHN0YXRlXG4gICAqICAgZXhhY3RseS5cbiAgICpcbiAgICogQ29uc3VtZXJzIHRoYXQgcmVhZCBgYnVuZGxlLm92ZXJ3cml0ZVtrZXldYCBhcyBcInRoZSBmdWxsIHZhbHVlIHdyaXR0ZW5cIlxuICAgKiBtdXN0IHN3aXRjaCB0byBgY29tbWl0VmFsdWVBdChjb21taXRMb2csIGlkeCwga2V5KWAgZnJvbVxuICAgKiBgZm9vdHByaW50anMvdHJhY2VgIOKAlCB1bmRlciBgJ2RlbHRhJ2AgdGhhdCB2YWx1ZSBpcyB2ZXJiLXF1YWxpZmllZCAoYW5cbiAgICogYGFwcGVuZGAgYnVuZGxlIGhvbGRzIG9ubHkgdGhlIHRhaWwpLiBQYXRoLXRpZXIgY29uc3VtZXJzXG4gICAqIChgZmluZExhc3RXcml0ZXJgLCBgY2F1c2FsQ2hhaW5gLCBuYXJyYXRpdmUsIGxlbnMgaGlnaGxpZ2h0cykgYXJlXG4gICAqIHVuYWZmZWN0ZWQuIFRoZSBhY3RpdmUgbW9kZSBpcyBzdXJmYWNlZCBhc1xuICAgKiBgZ2V0U25hcHNob3QoKS5jb21taXRWYWx1ZXNgLlxuICAgKlxuICAgKiBIb25lc3QgY29zdCBub3RlOiBhcHBlbmQgZGV0ZWN0aW9uIGlzIG5ldyB3YWxsIHdvcmsg4oCUIGFuIE8ofGJhc2UgYXJyYXl8KVxuICAgKiBzdHJ1Y3R1cmFsIHByZWZpeCBjb21wYXJlIHBlciBhcnJheS1zZXQgcGF0aCBwZXIgY29tbWl0LiBPbiBhIGhpdCB0aGVcbiAgICogY29tbWl0IGdldHMgY2hlYXBlciBpbiBib3RoIHdhbGwgYW5kIGhlYXA7IG9uIGEgbWlzcyAocHJlZml4IGRpdmVyZ2VzKVxuICAgKiBpdCBwYXlzIGNvbXBhcmUgKyBmdWxsIGNsb25lLiBgJ2Z1bGwnYCBwYXlzIHplcm8uXG4gICAqIEVxdWl2YWxlbnQgdG8gY2FsbGluZyBgZXhlY3V0b3Iuc2V0Q29tbWl0VmFsdWVzKG1vZGUpYCBiZWZvcmUgYHJ1bigpYC5cbiAgICovXG4gIGNvbW1pdFZhbHVlcz86IENvbW1pdFZhbHVlc01vZGU7XG5cbiAgLyoqXG4gICAqIFBlci13cml0ZSByZWFkIHByb3ZlbmFuY2UgKCNQMSkg4oCUIHRoZSBmb3VydGggZGlhbCBvZiB0aGUgZmFtaWx5LiBEZWZhdWx0XG4gICAqIGAnb2ZmJ2A6IHplcm8gY29zdCwgYnl0ZS1pZGVudGljYWwgY29tbWl0IGxvZ3MuIGAncmVhZHMtcHJlZml4J2A6IGV2ZXJ5XG4gICAqIGNvbW1pdHRlZCBgVHJhY2VFbnRyeWAgY2FycmllcyBgcmVhZEtleXNgIOKAlCB0aGUga2V5cyB0cmFja2VkLXJlYWQgQkVGT1JFXG4gICAqIHRoYXQgd3JpdGUg4oCUIGVuYWJsaW5nIHBlci13cml0ZSBjYXVzYWwgYXR0cmlidXRpb24gKGBjYXVzYWxDaGFpbmAnc1xuICAgKiBgZWRnZUF0dHJpYnV0aW9uOiAncGVyLXdyaXRlJ2AgYW5kIHZhcmlhYmxlIHNsaWNlcykuIENvc3Q6IG9uZSBzbWFsbFxuICAgKiBhcnJheSBjb3B5IHBlciB3cml0ZS4gU25hcHNob3QgZGlzY3JpbWluYW50OlxuICAgKiBgZ2V0U25hcHNob3QoKS53cml0ZVByb3ZlbmFuY2VgLlxuICAgKi9cbiAgd3JpdGVQcm92ZW5hbmNlPzogV3JpdGVQcm92ZW5hbmNlTW9kZTtcbn1cblxuLyoqIFRoZSBydW4ncyBwb2xpY3k6IGV2ZXJ5IGRpYWwgcmVzb2x2ZWQsIHBsdXMgdGhlIHJlZGFjdGlvbiBydWxlIGFuZCB0aGUgbWlycm9yIGZsYWcuIEZyb3plbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnVuUG9saWN5IGV4dGVuZHMgUmVhZG9ubHk8UmVxdWlyZWQ8UnVuRGlhbHM+PiB7XG4gIC8qKiBUaGUgcnVuJ3MgcmVkYWN0aW9uIHJ1bGUg4oCUIHRoZSBPTkUgb3duZXIgb2YgdGhlIHZlcmRpY3QgKGByZWRhY3Rpb24udHNgKS4gQWJzZW50IG9uIGJhcmUgZnJhbWVzLiAqL1xuICByZWFkb25seSByZWRhY3Rpb24/OiBSZWRhY3Rpb25SdWxlO1xuICAvKiogS2VlcCBhIHJlZGFjdGVkIG1pcnJvciBvZiB0aGUgaGVhcCAoYSBydW4gd2l0aCBhIHJlZGFjdGlvbiBwb2xpY3kpLiBFYWNoIHJ1bnRpbWUgb3ducyBpdHMgb3duIHN0b3JlLiAqL1xuICByZWFkb25seSBtaXJyb3I6IGJvb2xlYW47XG59XG5cbi8qKiBFYWNoIGRpYWwncyBkZWZhdWx0IOKAlCB0aGUgdmFsdWUgYSBydW4gZ2V0cyB3aGVuIHRoZSBvcHRpb24gaXMgYWJzZW50LiBUaGUgZGlhbCBsaXN0IElTIHRoZXNlIGtleXMuICovXG5leHBvcnQgY29uc3QgRElBTF9ERUZBVUxUUzogUmVhZG9ubHk8UmVxdWlyZWQ8UnVuRGlhbHM+PiA9IE9iamVjdC5mcmVlemUoe1xuICByZWFkVHJhY2tpbmc6ICdmdWxsJyxcbiAgd3JpdGVUcmFja2luZzogJ2Z1bGwnLFxuICBjb21taXRWYWx1ZXM6ICdmdWxsJyxcbiAgd3JpdGVQcm92ZW5hbmNlOiAnb2ZmJyxcbn0pO1xuXG5jb25zdCBESUFMX05BTUVTID0gT2JqZWN0LmtleXMoRElBTF9ERUZBVUxUUykgYXMgQXJyYXk8a2V5b2YgUnVuRGlhbHM+O1xuXG4vKiogRXZlcnkgZGVmYXVsdCwgbm8gcnVsZSwgbm8gbWlycm9yIOKAlCB3aGF0IGEgYmFyZSBmcmFtZSAoYSB1bml0IHRlc3QncyBgbmV3IFN0YWdlQ29udGV4dGApIHJ1bnMgdW5kZXIuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9SVU5fUE9MSUNZOiBSdW5Qb2xpY3kgPSBPYmplY3QuZnJlZXplKHsgLi4uRElBTF9ERUZBVUxUUywgbWlycm9yOiBmYWxzZSB9KTtcblxuLyoqIEJ1aWxkIGEgcnVuJ3MgcG9saWN5OiBhYnNlbnQgZGlhbHMgdGFrZSB0aGVpciBkZWZhdWx0OyB0aGUgcmVzdWx0IGlzIGZyb3plbi4gKi9cbmV4cG9ydCBmdW5jdGlvbiBydW5Qb2xpY3koZGlhbHM6IFJ1bkRpYWxzID0ge30sIHJlZGFjdGlvbj86IFJlZGFjdGlvblJ1bGUsIG1pcnJvciA9IGZhbHNlKTogUnVuUG9saWN5IHtcbiAgY29uc3QgcmVzb2x2ZWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0geyAuLi5ESUFMX0RFRkFVTFRTLCAuLi5waWNrRGlhbHMoZGlhbHMpLCBtaXJyb3IgfTtcbiAgaWYgKHJlZGFjdGlvbikgcmVzb2x2ZWQucmVkYWN0aW9uID0gcmVkYWN0aW9uO1xuICByZXR1cm4gT2JqZWN0LmZyZWV6ZShyZXNvbHZlZCkgYXMgdW5rbm93biBhcyBSdW5Qb2xpY3k7XG59XG5cbi8qKiBUaGUgZGlhbHMgc2V0IG9uIGBzb3VyY2VgIChhbiBvcHRpb25zIG9iamVjdCwgc2F5KSDigJQgYW5kIG5vdGhpbmcgZWxzZSBmcm9tIGl0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBpY2tEaWFscyhzb3VyY2U6IFJ1bkRpYWxzKTogUnVuRGlhbHMge1xuICBjb25zdCBkaWFsczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgZm9yIChjb25zdCBuYW1lIG9mIERJQUxfTkFNRVMpIGlmIChzb3VyY2VbbmFtZV0gIT09IHVuZGVmaW5lZCkgZGlhbHNbbmFtZV0gPSBzb3VyY2VbbmFtZV07XG4gIHJldHVybiBkaWFscyBhcyBSdW5EaWFscztcbn1cblxuLyoqIFRoZSBzYW1lIHBvbGljeSB1bmRlciBhbm90aGVyIHJ1bGUg4oCUIGEgTkVXIGZyb3plbiBvYmplY3Q7IHRoZSBvbGQgb25lIGlzIG5ldmVyIGVkaXRlZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRoUmVkYWN0aW9uKHBvbGljeTogUnVuUG9saWN5LCByZWRhY3Rpb246IFJlZGFjdGlvblJ1bGUpOiBSdW5Qb2xpY3kge1xuICByZXR1cm4gZGVyaXZlUG9saWN5KHBvbGljeSwgeyByZWRhY3Rpb24gfSk7XG59XG5cbi8qKlxuICogVGhlIHNhbWUgcG9saWN5IHdpdGggc29tZSBzZXR0aW5ncyBjaGFuZ2VkIOKAlCBhIE5FVyBmcm96ZW4gb2JqZWN0OyB0aGUgb2xkIG9uZSBpcyBuZXZlclxuICogZWRpdGVkLiBBIGZyYW1lIG9yIHJ1bnRpbWUgY2hhbmdlcyBhIHNldHRpbmcgYnkgc3dhcHBpbmcgaW4gYSBkZXJpdmVkIHBvbGljeSAoYHVzZVBvbGljeWApLCBzb1xuICogbm8gbXV0YWJsZSBkaWFsIGZpZWxkIGV4aXN0cyBhbnl3aGVyZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlcml2ZVBvbGljeShwb2xpY3k6IFJ1blBvbGljeSwgcGF0Y2g6IFBhcnRpYWw8UnVuUG9saWN5Pik6IFJ1blBvbGljeSB7XG4gIHJldHVybiBPYmplY3QuZnJlZXplKHsgLi4ucG9saWN5LCAuLi5wYXRjaCB9KTtcbn1cbiJdfQ==
|