footprintjs 9.44.2 → 9.44.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +2 -2
- package/dist/esm/lib/memory/EventLog.d.ts +1 -1
- package/dist/esm/lib/memory/EventLog.js +2 -2
- package/dist/esm/lib/memory/StageContext.d.ts +4 -33
- package/dist/esm/lib/memory/StageContext.js +18 -81
- package/dist/esm/lib/memory/TransactionBuffer.js +2 -2
- package/dist/esm/lib/memory/recordCommit.d.ts +43 -0
- package/dist/esm/lib/memory/recordCommit.js +59 -0
- package/dist/esm/lib/memory/redaction.d.ts +1 -1
- package/dist/esm/lib/memory/redaction.js +2 -2
- package/dist/esm/lib/runner/ExecutionRuntime.d.ts +2 -2
- package/dist/esm/lib/runner/ExecutionRuntime.js +3 -3
- package/dist/lib/memory/EventLog.js +2 -2
- package/dist/lib/memory/StageContext.js +17 -80
- package/dist/lib/memory/TransactionBuffer.js +2 -2
- package/dist/lib/memory/recordCommit.js +63 -0
- package/dist/lib/memory/redaction.js +2 -2
- package/dist/lib/runner/ExecutionRuntime.js +3 -3
- package/dist/types/lib/memory/EventLog.d.ts +1 -1
- package/dist/types/lib/memory/StageContext.d.ts +4 -33
- package/dist/types/lib/memory/recordCommit.d.ts +43 -0
- package/dist/types/lib/memory/redaction.d.ts +1 -1
- package/dist/types/lib/runner/ExecutionRuntime.d.ts +2 -2
- package/package.json +1 -1
|
@@ -1284,7 +1284,7 @@ export class MapperTaint {
|
|
|
1284
1284
|
}
|
|
1285
1285
|
/**
|
|
1286
1286
|
* The commit log's scrub: `patch` with {@link LOG_PLACEHOLDER} at every path in `redactedPaths` that
|
|
1287
|
-
* holds a defined value — the copy `
|
|
1287
|
+
* holds a defined value — the copy `recordCommit` records and feeds the redacted mirror.
|
|
1288
1288
|
*
|
|
1289
1289
|
* CLONE-FREE (9.33.0). The patch is the transaction buffer's commit-time payload, already the record's
|
|
1290
1290
|
* own copy (`TransactionBuffer · commit` clones each surviving path once; the buffer is dropped at
|
|
@@ -1332,4 +1332,4 @@ export function scrubPatch(patch, redactedPaths) {
|
|
|
1332
1332
|
export function redactPatch(patch, redactedSet) {
|
|
1333
1333
|
return scrubPatch(structuredClone(patch), redactedSet);
|
|
1334
1334
|
}
|
|
1335
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkYWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvcmVkYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnREc7QUFFSCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTFDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxVQUFVLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUV0RSxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN0RixPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ25DLE9BQU8sRUFBRSxlQUFlLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQTRFdkUsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFxQixNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBVyxDQUFDLENBQUM7QUFFakY7Ozs7OztHQU1HO0FBQ0gsTUFBTSxtQkFBbUIsR0FBRyxHQUFHLENBQUM7QUFFaEM7Ozs7Ozs7R0FPRztBQUNILFNBQVMsY0FBYyxDQUFDLE1BQTRDLEVBQUUsR0FBVztJQUMvRSxPQUFPLE1BQU0sS0FBSyxTQUFTLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDN0csQ0FBQztBQUVELCtFQUErRTtBQUMvRSxTQUFTLGNBQWMsQ0FBQyxLQUFhLEVBQUUsUUFBdUM7SUFDNUUsSUFBSSxDQUFDLFFBQVE7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUM1QixLQUFLLE1BQU0sT0FBTyxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQy9CLGtFQUFrRTtRQUNsRSxxRUFBcUU7UUFDckUsSUFBSSxPQUFPLENBQUMsTUFBTSxJQUFJLE9BQU8sQ0FBQyxNQUFNO1lBQUUsT0FBTyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7UUFDNUQsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3ZDLENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRCxNQUFNLE9BQU8sYUFBYTtJQUNoQixNQUFNLENBQThCO0lBQ3BDLGNBQWMsQ0FBNEI7SUFDbEQ7d0VBQ29FO0lBQzVELFlBQVksR0FBRyxLQUFLLENBQUM7SUFDN0IsMEdBQTBHO0lBQ2xHLFlBQVksR0FBc0IsRUFBRSxDQUFDO0lBQ3JDLGVBQWUsR0FBRyxLQUFLLENBQUM7SUFDaEM7Ozs7O09BS0c7SUFDSyxNQUFNLENBQWM7SUFDNUI7Ozs7O09BS0c7SUFDSyxTQUFTLENBQTZDO0lBQzlELHVIQUF1SDtJQUMvRyxZQUFZLENBQWdEO0lBRXBFLFlBQVksTUFBd0IsRUFBRSxNQUFvQjtRQUN4RCxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sSUFBSSxJQUFJLEdBQUcsRUFBVSxDQUFDO1FBQzFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVELFNBQVM7UUFDUCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDckIsQ0FBQztJQUVELFNBQVMsQ0FBQyxNQUFtQztRQUMzQyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixNQUFNLFdBQVcsR0FBRyxNQUFNLEVBQUUsV0FBVyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxjQUFjLEdBQUcsV0FBVztZQUMvQixDQUFDLENBQUMsSUFBSSxhQUFhLENBQUMsRUFBRSxJQUFJLEVBQUUsV0FBVyxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsV0FBVyxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzNHLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDZCxJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsTUFBTSxFQUFFLFFBQVEsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDL0QsSUFBSSxDQUFDLFlBQVk7WUFDZixNQUFNLEtBQUssU0FBUztnQkFDcEIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUM7b0JBQzdCLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxNQUFNLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQztvQkFDbEMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsT0FBTztRQUNMLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLFNBQVMsQ0FBQztJQUN0RixDQUFDO0lBRUQsd0ZBQXdGO0lBQ3hGLFVBQVU7UUFDUixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDckIsQ0FBQztJQUVELGFBQWEsQ0FBQyxNQUFtQjtRQUMvQixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztJQUN2QixDQUFDO0lBRUQsSUFBSSxDQUFDLEdBQVc7UUFDZCxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN2QixDQUFDO0lBRUQsNkdBQTZHO0lBQzdHLE1BQU0sQ0FBQyxHQUFXO1FBQ2hCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3hCLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEtBQUssQ0FBQztZQUFFLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO0lBQzNGLENBQUM7SUFFRCxpRkFBaUY7SUFDakYsYUFBYSxDQUFDLEdBQVc7UUFDdkIsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUN0QyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPLEtBQUssQ0FBQztRQUMvQixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUNqRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztRQUN0QyxJQUFJLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ3JELElBQUksR0FBRyxDQUFDLE1BQU0sR0FBRyxtQkFBbUIsRUFBRSxDQUFDO1lBQ3JDLElBQUksU0FBUyxFQUFFLEVBQUUsQ0FBQztnQkFDaEIsc0NBQXNDO2dCQUN0QyxPQUFPLENBQUMsSUFBSSxDQUNWLHFDQUFxQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsU0FBUyxHQUFHLENBQUMsTUFBTSxrQkFBa0I7b0JBQ3hGLG1EQUFtRDtvQkFDbkQsdURBQXVELENBQzFELENBQUM7WUFDSixDQUFDO1lBQ0QsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBQ0QsT0FBTyxjQUFjLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsVUFBVSxDQUFDLElBQVksRUFBRSxPQUFnQjtRQUN2QyxPQUFPLGNBQWMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztJQUN2RixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7OztPQVlHO0lBQ0gsZ0JBQWdCLENBQUMsT0FBMEIsRUFBRSxLQUFjO1FBQ3pELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDaEYsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNoRixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGNBQWMsQ0FBQyxPQUEwQixFQUFFLElBQVk7UUFDckQsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBRSxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUM1RixDQUFDO0lBRUQseUdBQXlHO0lBQ2pHLFdBQVcsQ0FBQyxJQUF1QixFQUFFLEtBQWM7UUFDekQsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUM7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUNwQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNuQyxNQUFNLE9BQU8sR0FDWCxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xHLElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxPQUFPO1lBQUUsT0FBTyxpQkFBaUIsQ0FBQztRQUN2RCxNQUFNLElBQUksR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNqRCxJQUFJLElBQUksS0FBSyxJQUFJLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQzNELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDNUIsT0FBTyxZQUFZLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztJQUN0RyxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7O09BV0c7SUFDSCxnQkFBZ0IsQ0FDZCxLQUFjLEVBQ2QsSUFBWSxFQUNaLElBQWE7UUFFYixNQUFNLElBQUksR0FBRyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyQyxNQUFNLFlBQVksR0FBRyxJQUFJLEtBQUssSUFBSSxDQUFDO1FBQ25DLElBQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDO1lBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxDQUFDO1FBQ3RHLE1BQU0sT0FBTyxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDbkQsTUFBTSxNQUFNLEdBQXdCO1lBQ2xDLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU87WUFDOUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssU0FBUyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNuRCxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxTQUFTLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ25ELEdBQUcsRUFBRSxTQUFTO1NBQ2YsQ0FBQztRQUNGLENBQUMsSUFBSSxDQUFDLFlBQVksS0FBSyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNyRCxPQUFPLEVBQUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLEVBQUUsQ0FBQztJQUM5QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLGtCQUFrQixDQUFDLEtBQWM7UUFDdkMsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDaEYsSUFBSSxDQUFDO1lBQ0gsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDOUMsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLG1GQUFtRjtZQUNuRiw4REFBOEQ7WUFDOUQsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssYUFBYSxDQUFDLEtBQWEsRUFBRSxJQUFpQjtRQUNwRCxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDbEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNoQixJQUFJLGFBQWEsQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRSxJQUFJLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2pILE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUNELE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBVyxFQUFXLEVBQUUsQ0FDbkMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUUsS0FBaUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQ3pHLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM3QixLQUFLLE1BQU0sSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUM1RSxJQUFJLElBQUksS0FBSyxJQUFJLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQztnQkFBRSxPQUFPLElBQUksQ0FBQztRQUMvRixDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSyxTQUFTLENBQUMsV0FBb0I7UUFDcEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUNqQyxPQUFPO1lBQ0wsS0FBSyxFQUFFO2dCQUNMLEtBQUssRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUM7Z0JBQ3pDLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSTtvQkFDdkIsU0FBUyxFQUFFLENBQUMsSUFBWSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLG1CQUFtQixJQUFJLGNBQWMsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDO2lCQUNoRyxDQUFDO2dCQUNGLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7YUFDdEM7WUFDRCxXQUFXO1lBQ1gsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksT0FBTyxFQUFnQyxFQUFFLENBQUM7WUFDakYsTUFBTSxFQUFFLFNBQVM7WUFDakIsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDO1NBQzFDLENBQUM7SUFDSixDQUFDO0lBRUQsNEdBQTRHO0lBQ3BHLGFBQWEsQ0FBQyxRQUEyQjtRQUMvQyxJQUFJLElBQUksQ0FBQyxlQUFlLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFBRSxPQUFPO1FBQ2pELElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1FBQzVCLHNDQUFzQztRQUN0QyxPQUFPLENBQUMsSUFBSSxDQUNWLHVEQUF1RCxTQUFTLG1DQUFtQztZQUNqRyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyx5REFBeUQ7WUFDM0YsdUdBQXVHLENBQzFHLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLGFBQWEsQ0FBQyxJQUF3QjtRQUM1QyxNQUFNLE1BQU0sR0FBRyxJQUFJLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUM7UUFDcEQsTUFBTSxHQUFHLEdBQWEsRUFBRSxDQUFDO1FBQ3pCLE1BQU0sR0FBRyxHQUFHLENBQUMsSUFBWSxFQUFFLEVBQUU7WUFDM0IsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssTUFBTSxDQUFDLE1BQU07Z0JBQUUsT0FBTztZQUM3RixHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ2pELENBQUMsQ0FBQztRQUNGLEtBQUssTUFBTSxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU07WUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUMsS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksSUFBSSxFQUFFO1lBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxXQUFXLENBQUMsS0FBYztRQUN4QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZDLG9FQUFvRTtRQUNwRSxPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRUQsNEZBQTRGO0lBQzVGLGFBQWEsQ0FBQyxLQUFjO1FBQzFCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkMsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQ3hDLENBQUM7SUFFTyxXQUFXLENBQUMsS0FBYztRQUNoQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QyxJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUNwRCxNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsUUFBUSxFQUFFLHFCQUFxQixDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNuRyxPQUFPLElBQUksQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsaUJBQWlCO1FBQ2YsT0FBTyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ2xELENBQUM7SUFFRCwwR0FBMEc7SUFDMUcsZUFBZTtRQUNiLE9BQU8sQ0FBQyxJQUFJLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDL0QsQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNILE9BQU8sQ0FBQyxJQUF1QjtRQUM3QixJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ3BDLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pELElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUNoQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3JDLE1BQU0sR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3BELElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUM7Z0JBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDO1FBQ3hFLENBQUM7UUFDRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDakQsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUM7WUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQztRQUM5RSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNwQyxNQUFNLE1BQU0sR0FBYSxFQUFFLENBQUM7UUFDNUIsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUMzQixxRUFBcUU7WUFDckUsbUVBQW1FO1lBQ25FLDZCQUE2QjtZQUM3QixJQUFJLEtBQUssS0FBSyxHQUFHO2dCQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQztZQUN6RCxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztnQkFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVFLENBQUM7UUFDRCxPQUFPLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUNyRixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFNBQVMsQ0FBQyxJQUF1QixFQUFFLEdBQVc7UUFDNUMsT0FBTyxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDbkYsQ0FBQztJQUVELGdHQUFnRztJQUN4RixZQUFZLENBQUMsR0FBVztRQUM5QixJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDO1lBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUM7UUFDM0QsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNsQyxPQUFPLE1BQU0sS0FBSyxTQUFTLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDcEcsQ0FBQztJQUVELHVHQUF1RztJQUMvRixRQUFRLENBQUMsR0FBVztRQUMxQixNQUFNLFFBQVEsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDMUQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDM0MsSUFBSSxTQUFTLEtBQUssU0FBUztZQUFFLE9BQU8sUUFBUSxDQUFDO1FBQzdDLE9BQU8sUUFBUSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLFFBQVEsRUFBRSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4RixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGtCQUFrQjtRQUNoQixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLFNBQVM7WUFBRSxPQUFPLFNBQVMsQ0FBQztRQUM3RSxPQUFPO1lBQ0wsSUFBSSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQ3RCLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxLQUFLLFNBQVMsSUFBSTtnQkFDbEMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUN6RixDQUFDO1NBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRCwrRkFBK0Y7SUFDL0YsWUFBWSxDQUFDLEtBQXFCO1FBQ2hDLEtBQUssTUFBTSxHQUFHLElBQUksS0FBSyxDQUFDLElBQUk7WUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNuRCxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQztZQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2hHLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsYUFBYSxDQUFDLE1BQWMsRUFBRSxLQUF3QjtRQUNwRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDaEQsQ0FBQyxJQUFJLENBQUMsU0FBUyxLQUFLLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakYsQ0FBQztJQUVELCtHQUErRztJQUMvRyxhQUFhLENBQUMsR0FBVyxFQUFFLEtBQWM7UUFDdkMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN2QyxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssT0FBTyxJQUFJLEdBQUcsS0FBSyxNQUFNLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO1lBQUUsT0FBTyxPQUFPLENBQUM7UUFDOUcsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDekMsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVE7Z0JBQUUsU0FBUztZQUMxRCxLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDdkMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksS0FBSyxPQUFPO29CQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDO1lBQy9FLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILE1BQU0sQ0FBQyxJQUF1QixFQUFFLEtBQWMsRUFBRSxjQUFzQixpQkFBaUI7UUFDckYsT0FBTyxhQUFhLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsWUFBWSxDQUFJLE1BQVMsRUFBRSxjQUFzQixpQkFBaUI7UUFDaEUsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksTUFBTSxLQUFLLElBQUksSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7WUFBRSxPQUFPLE1BQU0sQ0FBQztRQUM1RyxJQUFJLEdBQXdDLENBQUM7UUFDN0MsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBaUMsQ0FBQyxFQUFFLENBQUM7WUFDN0UsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQztZQUNwRCxJQUFJLElBQUksS0FBSyxLQUFLO2dCQUFFLFNBQVM7WUFDN0IsR0FBRyxLQUFLLEVBQUUsR0FBSSxNQUFrQyxFQUFFLENBQUM7WUFDbkQsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQztRQUNsQixDQUFDO1FBQ0QsT0FBTyxDQUFDLEdBQUcsSUFBSSxNQUFNLENBQU0sQ0FBQztJQUM5QixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7OztPQWVHO0lBQ0gsY0FBYyxDQUFJLE1BQVMsRUFBRSxjQUFzQixpQkFBaUI7UUFDbEUseUVBQXlFO1FBQ3pFLHdFQUF3RTtRQUN4RSw4REFBOEQ7UUFDOUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQ3ZGLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLE1BQU0sS0FBSyxJQUFJLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUTtZQUFFLE9BQU8sTUFBTSxDQUFDO1FBQ25GLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBc0IsQ0FBQztRQUN4RSw2RkFBNkY7UUFDN0Ysd0NBQXdDO1FBQ3hDLE9BQU8sWUFBWSxDQUFDLEdBQUcsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLFdBQVcsQ0FBTSxDQUFDO0lBQzdHLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7O09BZUc7SUFDSyxnQkFBZ0IsQ0FBQyxLQUFjO1FBQ3JDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDcEMsSUFBSSxJQUFJLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUTtZQUFFLE9BQU8sSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDdEcsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2xELElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ3ZDLE1BQU0sTUFBTSxHQUFHLElBQUksR0FBRyxFQUFtQyxDQUFDO1FBQzFELE1BQU0sTUFBTSxHQUFHLENBQUMsSUFBWSxFQUEyQixFQUFFO1lBQ3ZELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDL0IsSUFBSSxLQUFLLEtBQUssU0FBUztnQkFBRSxPQUFPLEtBQUssQ0FBQztZQUN0QyxNQUFNLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLElBQUksRUFBRSxDQUE0QixDQUFDO1lBQzNGLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3ZCLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ2hELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3RDLElBQUksTUFBTSxLQUFLLElBQUk7b0JBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQztxQkFDbkMsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQztvQkFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3pHLENBQUM7WUFDRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUMsQ0FBQztRQUNGLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxxR0FBcUc7SUFDN0YsVUFBVSxDQUFDLEtBQWM7UUFDL0IsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksT0FBTyxLQUFLLEtBQUssU0FBUztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3JGLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDOUIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDN0MsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ3ZDLENBQUM7UUFDRCxNQUFNLFNBQVMsR0FBRyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQztRQUN0RyxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDckUsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUN4QyxDQUFDO0lBRUQsa0dBQWtHO0lBQzFGLG9CQUFvQixDQUFDLElBQVk7UUFDdkMsTUFBTSxPQUFPLEdBQUcsSUFBSSxHQUFHLEVBQW9CLENBQUM7UUFDNUMsTUFBTSxPQUFPLEdBQWEsRUFBRSxDQUFDO1FBQzdCLE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxDQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNyQyxNQUFNLEtBQUssR0FBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQy9CLE9BQU8sS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN4QixNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsR0FBRyxFQUFHLENBQUM7WUFDMUIsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ3hDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztvQkFDcEMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDbkIsU0FBUztnQkFDWCxDQUFDO2dCQUNELElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO29CQUFFLFNBQVM7Z0JBQzFELE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzlCLElBQUksRUFBRSxLQUFLLFNBQVM7b0JBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDOztvQkFDNUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDbkIsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDckIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDaEIsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDcEIsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBQ0QsTUFBTSxRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztRQUNuQyxPQUFPLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDMUIsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRyxDQUFDO1lBQzVCLElBQUksUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUM7Z0JBQUUsU0FBUztZQUNqQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ25CLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM3QyxDQUFDO1FBQ0QsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVELDhGQUE4RjtJQUM5RixNQUFNLENBQUMsVUFBVSxDQUFDLEtBQWEsRUFBRSxLQUFvQztRQUNuRSxJQUFJLEtBQUssS0FBSyxTQUFTO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDdEMsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUN6QixJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUN4RyxPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILFdBQVcsQ0FBSSxLQUFRLEVBQUUsY0FBc0IsaUJBQWlCO1FBQzlELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ25ELElBQUksSUFBSSxLQUFLLElBQUksSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDM0QsTUFBTSxJQUFJLEdBQUksSUFBMkIsQ0FBQyxJQUFJLENBQUM7UUFDL0MsSUFBSSxJQUFJLEtBQUssSUFBSSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ2xGLElBQUksWUFBaUQsQ0FBQztRQUN0RCxLQUFLLE1BQU0sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUErQixDQUFDLEVBQUUsQ0FBQztZQUM5RSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQztZQUN2RCxJQUFJLE9BQU8sS0FBSyxNQUFNO2dCQUFFLFNBQVM7WUFDakMsWUFBWSxLQUFLLEVBQUUsR0FBSSxJQUFnQyxFQUFFLENBQUM7WUFDMUQsWUFBWSxDQUFDLEtBQUssQ0FBQyxHQUFHLE9BQU8sQ0FBQztRQUNoQyxDQUFDO1FBQ0QsT0FBTyxZQUFZLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFFLEVBQUUsR0FBSSxJQUFlLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBUSxDQUFDO0lBQ2hHLENBQUM7SUFFRCx1REFBdUQ7SUFDdkQsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUF5QixFQUFFLEtBQWMsRUFBRSxjQUFzQixpQkFBaUI7UUFDN0YsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLE9BQU87WUFBRSxPQUFPLFdBQVcsQ0FBQztRQUNqRCxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssUUFBUTtZQUFFLE9BQU8sYUFBYSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsSUFBSSxLQUFLLENBQUM7UUFDNUcsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gsTUFBTSxDQUFDLFdBQVcsQ0FDaEIsS0FBYyxFQUNkLEtBQXdCLEVBQ3hCLGNBQXNCLGlCQUFpQjtRQUV2QyxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUTtZQUFFLE9BQU8sU0FBUyxDQUFDO1FBQ2xFLDZGQUE2RjtRQUM3RixrR0FBa0c7UUFDbEcsTUFBTSxJQUFJLEdBQUcsZUFBZSxDQUFDLEtBQUssQ0FBVyxDQUFDO1FBQzlDLE9BQU8sWUFBWSxDQUNqQixJQUFJLEVBQ0osU0FBUyxFQUNULFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFDaEIsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLE9BQU8sRUFBZ0MsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEVBQzVGLFdBQVcsQ0FDZSxDQUFDO0lBQy9CLENBQUM7SUFFRCxNQUFNO1FBQ0osMkVBQTJFO1FBQzNFLHlFQUF5RTtRQUN6RSx3RUFBd0U7UUFDeEUsTUFBTSxlQUFlLEdBQUcsSUFBSSxHQUFHLEVBQW9CLENBQUM7UUFDcEQsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxNQUFNLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUN0RSxlQUFlLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUN4QyxDQUFDO1FBQ0QsdUVBQXVFO1FBQ3ZFLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQ2pELGVBQWUsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0YsQ0FBQztRQUNELE9BQU87WUFDTCxZQUFZLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7WUFDOUIsZUFBZSxFQUFFLE1BQU0sQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDO1lBQ3BELFFBQVEsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsUUFBUSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztTQUM3RCxDQUFDO0lBQ0osQ0FBQztDQUNGO0FBZ0REOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsU0FBUyxDQUFDO0FBRXBDLGdHQUFnRztBQUNoRyxJQUFJLFNBQVMsR0FBVyxVQUFVLENBQUM7QUFFbkM7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxZQUFZLENBQUMsS0FBYTtJQUN4QyxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUM7SUFDeEIsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUNsQixPQUFPLEdBQUcsRUFBRTtRQUNWLFNBQVMsR0FBRyxLQUFLLENBQUM7SUFDcEIsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQUMsT0FBZTtJQUN2QyxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDO0lBQzlCLElBQUksb0NBQW9DLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ25FLEtBQUssTUFBTSxJQUFJLElBQUksV0FBVyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDdkMsS0FBSyxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQywwQkFBMEIsQ0FBQyxFQUFFLENBQUM7WUFDdEUsSUFBSSxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksSUFBSSxJQUFJLEdBQUcsQ0FBQztnQkFBRSxPQUFPLElBQUksQ0FBQztRQUNwRixDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBQ0gsTUFBTSxVQUFVLFdBQVcsQ0FBQyxNQUFjO0lBQ3hDLE1BQU0sTUFBTSxHQUFhLEVBQUUsQ0FBQztJQUM1QixJQUFJLElBQUksR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQy9CLE9BQU8sSUFBSSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDbkIsTUFBTSxLQUFLLEdBQUcsY0FBYyxDQUFDLE1BQU0sRUFBRSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDL0MsSUFBSSxLQUFLLEtBQUssQ0FBQyxDQUFDO1lBQUUsTUFBTTtRQUN4QixNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQzNDLElBQUksR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRCwySUFBMkk7QUFDM0ksU0FBUyxjQUFjLENBQUMsTUFBYyxFQUFFLElBQVk7SUFDbEQsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDO0lBQ2QsT0FBTyxFQUFFLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzFCLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN4QixJQUFJLElBQUksS0FBSyxHQUFHO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFDNUIsRUFBRSxJQUFJLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFDRCxPQUFPLENBQUMsQ0FBQyxDQUFDO0FBQ1osQ0FBQztBQUVELDREQUE0RDtBQUM1RCxNQUFNLElBQUksR0FBa0IsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0FBRXBELDRFQUE0RTtBQUM1RSxTQUFTLFNBQVMsQ0FBQyxLQUFvQztJQUNyRCxNQUFNLEdBQUcsR0FBYSxFQUFFLENBQUM7SUFDekIsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLElBQUksRUFBRSxFQUFFLENBQUM7UUFDL0IsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDakIsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQztZQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRCxtREFBbUQ7QUFDbkQsU0FBUyxXQUFXLENBQUMsT0FBMEI7SUFDN0MsT0FBTyxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUM7UUFDekIsQ0FBQyxDQUFDLEVBQUU7UUFDSixDQUFDLENBQUMsT0FBTzthQUNKLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUM1QixJQUFJLEVBQUU7YUFDTixJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDeEIsQ0FBQztBQUVELHFHQUFxRztBQUNyRyxTQUFTLFVBQVUsQ0FDakIsR0FBVyxFQUNYLE1BQTBCLEVBQzFCLE9BQTBCLEVBQzFCLElBQVUsRUFDVixLQUFhO0lBRWIsTUFBTSxLQUFLLEdBQWEsRUFBRSxDQUFDO0lBQzNCLElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQztJQUNuQixLQUFLLE1BQU0sTUFBTSxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQzdCLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUc7WUFBRSxTQUFTO1FBQ2hDLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQUUsTUFBTSxHQUFHLElBQUksQ0FBQzs7WUFDbEMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUNELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxXQUFXLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3ZFLElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ25DLE1BQU07WUFDSixLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQztnQkFDaEIsQ0FBQyxLQUFLLENBQUMsU0FBUyxLQUFLLFNBQVMsSUFBSSxNQUFNLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxTQUFTLENBQUMsR0FBRyxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2pHLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUNELE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUM7QUFDM0IsQ0FBQztBQUVELDhGQUE4RjtBQUM5RixTQUFTLEtBQUssQ0FBQyxJQUFVO0lBQ3ZCLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUNwQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO0lBQ25CLENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxhQUFhLENBQ3BCLElBQVksRUFDWixNQUEwQixFQUMxQixPQUEwQixFQUMxQixJQUFVLEVBQ1YsU0FBOEIsRUFDOUIsS0FBYTtJQUViLG1HQUFtRztJQUNuRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztRQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQztJQUM1RCxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssU0FBUyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQztRQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQztJQUNqRyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNsRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ25ELElBQUksS0FBSyxLQUFLLFNBQVM7UUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLEtBQWdCLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDO0lBQy9FLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzNCLElBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQztJQUNwQixJQUFJLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFDckIsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNoRCxNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzNELElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2hCLFFBQVEsR0FBRyxJQUFJLENBQUM7WUFDaEIsTUFBTTtRQUNSLENBQUM7UUFDRCxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUTtZQUFFLFNBQVM7UUFDMUQsTUFBTSxFQUFFLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNoQyxJQUFJLEVBQUUsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNyQixJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDMUIsU0FBUztRQUNYLENBQUM7UUFDRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUN4RyxNQUFNLEtBQUssR0FBRyxhQUFhLENBQUMsS0FBSyxFQUFFLFNBQVMsSUFBSSxHQUFHLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM3RixJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xDLElBQUksS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ25CLFFBQVEsR0FBRyxJQUFJLENBQUM7WUFDaEIsTUFBTTtRQUNSLENBQUM7SUFDSCxDQUFDO0lBQ0QsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN2QixJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxJQUFJLEtBQUssQ0FBQztRQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEdBQUcsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzdGLE9BQU8sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7QUFDNUQsQ0FBQztBQUVELFNBQVMsUUFBUSxDQUFDLElBQTJDLEVBQUUsSUFBWSxFQUFFLEdBQVcsRUFBRSxLQUFjO0lBQ3RHLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDN0IsSUFBSSxPQUFPLEtBQUssU0FBUztRQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2pFLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQzFCLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILFNBQVMsVUFBVSxDQUNqQixJQUFZLEVBQ1osTUFBMEIsRUFDMUIsT0FBMEIsRUFDMUIsSUFBVSxFQUNWLFdBQW1CLEVBQ25CLFNBQXdFLEVBQ3hFLEtBQWEsRUFDYixLQUFjO0lBRWQsb0ZBQW9GO0lBQ3BGLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO1FBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDO0lBQzlELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksV0FBVyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUN4RCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDN0MsSUFBSSxLQUFLLEtBQUssU0FBUztRQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQztJQUMvRCxNQUFNLEtBQUssR0FBRztRQUNaLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLElBQUksRUFBRSxDQUE0QjtRQUNuRixLQUFLO0tBQ04sQ0FBQztJQUNGLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzNCLElBQUksT0FBTyxHQUFHLEtBQUssQ0FBQztJQUNwQixJQUFJLElBQUksR0FBRyxRQUFRLENBQUM7SUFDcEIsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNoRCxNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzNELElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2hCLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsV0FBVyxDQUFDO1lBQzlCLE9BQU8sR0FBRyxJQUFJLENBQUM7WUFDZixTQUFTO1FBQ1gsQ0FBQztRQUNELElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO1lBQUUsU0FBUztRQUMxRCxNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RDLElBQUksUUFBUSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzNCLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQztZQUNoQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3RDLFNBQVM7UUFDWCxDQUFDO1FBQ0QsSUFBSSxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLFNBQVM7UUFDL0MsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDbEcsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3ZHLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUN4QixLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUM7WUFDNUIsT0FBTyxHQUFHLElBQUksQ0FBQztRQUNqQixDQUFDO1FBQ0QsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBQ0QsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN2QixNQUFNLEdBQUcsR0FBRyxPQUFPLElBQUksSUFBSSxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ3pELElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLElBQUksS0FBSztRQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDcEUsT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztBQUN2RCxDQUFDO0FBRUQsOERBQThEO0FBQzlELFNBQVMsUUFBUSxDQUFDLElBQVk7SUFDNUIsTUFBTSxJQUFJLEdBQUcsSUFBSSxPQUFPLEVBQVUsQ0FBQztJQUNuQyxNQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBQ2pDLE1BQU0sU0FBUyxHQUFHLENBQUMsSUFBWSxFQUFXLEVBQUU7UUFDMUMsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ2xDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUM7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUNqQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pCLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3hDLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksU0FBUyxDQUFDLEtBQUssQ0FBQztnQkFBRSxPQUFPLElBQUksQ0FBQztRQUNuRixDQUFDO1FBQ0QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2YsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDLENBQUM7SUFDRixPQUFPLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN6QixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLFlBQVksQ0FDbkIsSUFBWSxFQUNaLE1BQTBCLEVBQzFCLE9BQTBCLEVBQzFCLElBQVUsRUFDVixXQUFtQjtJQUVuQixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVE7UUFBRSxPQUFPLElBQUksQ0FBQztJQUNwRixJQUFJLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQztJQUN4Qix1RkFBdUY7SUFDdkYsc0ZBQXNGO0lBQ3RGLCtCQUErQjtJQUMvQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxLQUFLLFNBQVMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxRCxPQUFPLFVBQVUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLElBQUksR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQztBQUN2RixDQUFDO0FBRUQscUhBQXFIO0FBQ3JILFNBQVMsYUFBYSxDQUFDLEtBQWM7SUFDbkMsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ3RGLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0MsT0FBTyxLQUFLLEtBQUssTUFBTSxDQUFDLFNBQVMsSUFBSSxLQUFLLEtBQUssSUFBSSxDQUFDO0FBQ3RELENBQUM7QUFFRCxrR0FBa0c7QUFDbEcsU0FBUyxRQUFRLENBQUMsQ0FBK0IsRUFBRSxDQUFtQjtJQUNwRSxJQUFJLENBQUMsS0FBSyxTQUFTLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxPQUFPLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxPQUFPO1FBQUUsT0FBTyxDQUFDLENBQUM7SUFDMUUsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLE9BQU8sSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLE9BQU87UUFBRSxPQUFPLENBQUMsQ0FBQztJQUN2RCxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ3ZGLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0NHO0FBQ0gsTUFBTSxPQUFPLFdBQVc7SUFjZTtJQWJyQyw2RUFBNkU7SUFDNUQsT0FBTyxHQUFHLElBQUksR0FBRyxFQUE0QixDQUFDO0lBQy9ELHFFQUFxRTtJQUNwRCxNQUFNLEdBQUcsSUFBSSxHQUFHLEVBQXFCLENBQUM7SUFDdkQsNEVBQTRFO0lBQzNELEtBQUssR0FBRyxJQUFJLEdBQUcsRUFBc0QsQ0FBQztJQUN2RixzR0FBc0c7SUFDckYsT0FBTyxHQUFHLElBQUksR0FBRyxFQUFtQyxDQUFDO0lBQ3RFLDRHQUE0RztJQUMzRixXQUFXLEdBQWMsRUFBRSxDQUFDO0lBQ3JDLFlBQVksR0FBRyxLQUFLLENBQUM7SUFDckIsSUFBSSxHQUFHLElBQUksQ0FBQztJQUVwQixZQUFxQyxJQUFtQjtRQUFuQixTQUFJLEdBQUosSUFBSSxDQUFlO0lBQUcsQ0FBQztJQUU1RCwwRkFBMEY7SUFDMUYsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUErQjtRQUN2QyxPQUFPLElBQUksS0FBSyxTQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDbkYsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFJLE1BQVM7UUFDaEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUM7WUFBRSxPQUFPLE1BQU0sQ0FBQztRQUMxQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6RSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDL0IsT0FBTyxJQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxPQUFPLENBQUksTUFBUztRQUNsQixJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztRQUNsQixJQUFJLE1BQU0sS0FBSyxJQUFJLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUTtZQUFFLE9BQU8sTUFBTSxDQUFDO1FBQ2pFLElBQUksR0FBd0MsQ0FBQztRQUM3QyxLQUFLLE1BQU0sQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ3JELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ2pELElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUN6QixJQUFJLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxPQUFPLEVBQUUsQ0FBQztvQkFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM3RixDQUFDO2lCQUFNLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxPQUFPO2dCQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2lCQUN0RCxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssUUFBUTtnQkFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2pGLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDL0IsMkVBQTJFO1lBQzNFLDJFQUEyRTtZQUMzRSxrRkFBa0Y7WUFDbEYsSUFBSSxNQUFNLEtBQUssU0FBUyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssT0FBTyxJQUFJLEdBQUcsS0FBSyxJQUFJLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQy9GLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3ZDLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDO29CQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztZQUNuRSxDQUFDO1lBQ0QsSUFBSSxHQUFHLEtBQUssS0FBSyxFQUFFLENBQUM7Z0JBQ2xCLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLE1BQU0sRUFBRSxDQUE0QixDQUFDO2dCQUN6RixHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDO1lBQ3BCLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxDQUFDLEdBQUcsSUFBSSxNQUFNLENBQU0sQ0FBQztJQUM5QixDQUFDO0lBRUQsK0RBQStEO0lBQ3ZELE1BQU0sQ0FBQyxHQUFXLEVBQUUsS0FBYztRQUN4QyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUM3QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNsQyxJQUFJLElBQUksS0FBSyxTQUFTO1lBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQzs7WUFDakQsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDcEQsNkZBQTZGO1FBQzdGLDJEQUEyRDtRQUMzRCxJQUFJLEtBQUssS0FBSyxTQUFTO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDdEMsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzlCLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDbkcsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztZQUN2QyxDQUFDO1lBQ0QsSUFBSSxhQUFhLENBQUMsS0FBSyxDQUFDO2dCQUFFLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDbkUsQ0FBQztRQUNELElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxPQUFPLEVBQUUsQ0FBQztZQUM3QixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztZQUN6QixJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssT0FBTztnQkFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3RCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRU8sUUFBUSxDQUFDLEtBQWMsRUFBRSxPQUF5QjtRQUN4RCxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDaEQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ3RFLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxxSEFBcUg7SUFDN0csVUFBVSxDQUFDLE1BQStCLEVBQUUsT0FBOEM7UUFDaEcsTUFBTSxRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztRQUNuQyxLQUFLLE1BQU0sSUFBSSxJQUFJLE9BQU8sQ0FBQyxLQUFLO1lBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdFLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDdkMsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDbkMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3JDLENBQUM7WUFDRCxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNyQixDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUMvQyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFTyxNQUFNLENBQUMsTUFBK0IsRUFBRSxJQUE4QjtRQUM1RSxNQUFNLElBQUksR0FBNEIsRUFBRSxDQUFDO1FBQ3pDLEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ3RDLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRTtnQkFDL0IsVUFBVSxFQUFFLElBQUk7Z0JBQ2hCLFlBQVksRUFBRSxJQUFJO2dCQUNsQixHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztnQkFDcEIsR0FBRyxFQUFFLENBQUMsS0FBYyxFQUFFLEVBQUU7b0JBQ3RCLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQ3BHLENBQUM7YUFDRixDQUFDLENBQUM7UUFDTCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsOEVBQThFO0lBQ3RFLE1BQU0sQ0FBQyxLQUFjO1FBQzNCLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDOUQsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDO0lBQ3hFLENBQUM7SUFFRDs7O09BR0c7SUFDSyxhQUFhLENBQUMsTUFBYyxFQUFFLEtBQWM7UUFDbEQsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ2hELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ25DLElBQUksSUFBSTtnQkFBRSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7WUFDOUIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdkMsSUFBSSxNQUFNO2dCQUFFLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2pELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3RDLElBQUksS0FBSztnQkFBRSxPQUFPLEtBQUssQ0FBQztRQUMxQixDQUFDO1FBQ0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDckMsT0FBTyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUNyRyxDQUFDO0lBRUQsdUZBQXVGO0lBQy9FLGdCQUFnQixDQUFDLE1BQStCO1FBQ3RELE1BQU0sS0FBSyxHQUFhLEVBQUUsQ0FBQztRQUMzQixLQUFLLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUN0QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDMUQsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLE9BQU87Z0JBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztpQkFDekMsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLFFBQVE7Z0JBQUUsS0FBSyxNQUFNLElBQUksSUFBSSxPQUFPLENBQUMsS0FBSztvQkFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUM7UUFDckcsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUM7SUFDekUsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNLLFlBQVksQ0FBQyxJQUFZO1FBQy9CLE1BQU0sT0FBTyxHQUFHLElBQUksR0FBRyxFQUFXLENBQUM7UUFDbkMsTUFBTSxPQUFPLEdBQUcsQ0FBQyxLQUFjLEVBQUUsSUFBaUIsRUFBUSxFQUFFO1lBQzFELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO2dCQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQ3ZHLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3pFLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2hCLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7b0JBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNqRSxDQUFDO1FBQ0gsQ0FBQyxDQUFDO1FBQ0YsS0FBSyxNQUFNLEtBQUssSUFBSSxJQUFJLENBQUMsV0FBVztZQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ2hFLElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxDQUFDO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFDbEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQW9CLENBQUM7UUFDekMsTUFBTSxNQUFNLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztRQUNqQyxNQUFNLE1BQU0sR0FBRyxDQUFDLElBQVksRUFBWSxFQUFFO1lBQ3hDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDN0IsSUFBSSxLQUFLLEtBQUssU0FBUztnQkFBRSxPQUFPLEtBQUssQ0FBQztZQUN0QyxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO2dCQUFFLE9BQU8sRUFBRSxDQUFDO1lBQ2hDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDakIsTUFBTSxLQUFLLEdBQWEsRUFBRSxDQUFDO1lBQzNCLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ2hELElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO29CQUFFLEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQzt3QkFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUM7cUJBQ3pHLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUM7b0JBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMvQyxDQUFDO1lBQ0QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNwQixJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN0QixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUMsQ0FBQztRQUNGLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3RCLENBQUM7SUFFRCxrR0FBa0c7SUFDMUYsY0FBYyxDQUFDLEtBQWMsRUFBRSxJQUFxQjtRQUMxRCxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDakYsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNoQixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3ZDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZDLElBQUksTUFBTTtZQUFFLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksS0FBSyxPQUFPLENBQUM7UUFDbEUsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEMsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssT0FBTztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQy9ELEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7WUFBRSxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQztnQkFBRSxPQUFPLElBQUksQ0FBQztRQUM1RixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7Q0FDRjtBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBQ0gsTUFBTSxVQUFVLFVBQVUsQ0FBQyxLQUFrQixFQUFFLGFBQStCO0lBQzVFLElBQUksR0FBNEIsQ0FBQztJQUNqQyxJQUFJLEtBQWtDLENBQUM7SUFDdkMsS0FBSyxNQUFNLElBQUksSUFBSSxhQUFhLEVBQUUsQ0FBQztRQUNqQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQy9CLE1BQU0sT0FBTyxHQUFHLEdBQUcsSUFBSSxLQUFLLENBQUM7UUFDN0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUksU0FBUyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsS0FBSyxTQUFTO1lBQUUsU0FBUztRQUNsRixJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN0QixLQUFLLEdBQUcsSUFBSSxPQUFPLEVBQVUsQ0FBQztZQUM5QixHQUFHLEdBQUcsV0FBVyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQWdCLENBQUM7UUFDakQsQ0FBQztRQUNELFFBQVEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEtBQU0sQ0FBQyxDQUFDO1FBQzVCLFNBQVMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFDRCxPQUFPLEdBQUcsSUFBSSxLQUFLLENBQUM7QUFDdEIsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQUMsS0FBa0IsRUFBRSxXQUF3QjtJQUN0RSxPQUFPLFVBQVUsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUM7QUFDekQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogcmVkYWN0aW9uLnRzIOKAlCBUaGUgT05FIG93bmVyIG9mIHdoYXQgYSByZWRhY3Rpb24gcG9saWN5IHNheXMgYWJvdXQgYSB2YWx1ZS5cbiAqXG4gKiBUSEUgTEFXIChvd25lciBydWxpbmcgKGEpKS4gQSByZWRhY3Rpb24gcG9saWN5IGNvdmVycyBFVkVSWVRISU5HIHRoZSBsaWJyYXJ5XG4gKiByZXRhaW5zIG9yIHNlcnZlcyDigJQgdGhlIGNvbW1pdCBsb2cgKGJvdGggZW5jb2RpbmdzKSwgdGhlIHJlZGFjdGVkIG1pcnJvcixcbiAqIHRyYWNrZWQgcmVhZHMvd3JpdGVzLCBldmVyeSByZWNvcmRlciBldmVudCAoaW5saW5lIGFuZCBkZWZlcnJlZCkgYW5kIHRoZVxuICogcmVjb3JkZXIgcm93cyBidWlsdCBmcm9tIHRoZW0sIHRoZSBuYXJyYXRpdmUsIHNuYXBzaG90cywgZGlhZ25vc3RpY3MsIHBhdXNlXG4gKiBwYXlsb2FkcywgYm91bmRhcnkgcmVjb3JkcyBhbmQgbG9nIGxpbmVzIOKAlCBhbmQgTkVWRVIgdGhlIGxpdmUgaGVhcCBvciB0aGVcbiAqIHJlc3VtZSBjaGVja3BvaW50LiBUd28gdmFsdWVzIGFyZSB0aGUgY2FsbGVyJ3Mgb3duIGFuZCBzdGF5IHJlYWw6IHRoZVxuICogYHJ1bigpYCByZWplY3Rpb24gKHRoZSB0aHJvd24gdmFsdWUgaXRzZWxmKSBhbmQgdGhlIGxpdmUgZm9yayByZXN1bHQuXG4gKlxuICogQSBwb2xpY3kgc2VsZWN0cyBieSBOQU1FIOKAlCBhIGtleSwgYSBkb3R0ZWQgcGF0aCwgYSBmaWVsZCDigJQgbmV2ZXIgYnlcbiAqIHNjYW5uaW5nIGNvbnRlbnQuIFdoYXQgY2FycmllcyBhIG5hbWU6XG4gKiAgIC0gc3RhdGUg4oCUIGl0cyB1c2VyLWxldmVsIHBhdGggKHtAbGluayBSZWRhY3Rpb25SdWxlLnZlcmRpY3R9KTtcbiAqICAgLSBhIHJlY29yZCBoYW5kZWQgb3V0IHdob2xlIOKAlCByb290IGlucHV0L291dHB1dCwgYSBzdWJmbG93J3MgbWFwcGVkIHNlZWRcbiAqICAgICBhbmQgZXhpdCBzdGF0ZSwgYSBwYXVzZSBwYXlsb2FkLCBhIHRocm93biB2YWx1ZSDigJQgaXRzIGtleXMgYXQgZXZlcnlcbiAqICAgICBkZXB0aCAoe0BsaW5rIFJlZGFjdGlvblJ1bGUucmV0YWluQm91bmRhcnl9KTtcbiAqICAgLSBhIGRpYWdub3N0aWMgZW50cnkg4oCUIGAkZGVidWdgL2AkZXJyb3JgL2AkbWV0cmljYC9gJGV2YWxgL2AkbG9nYCBhbmQgdGhlXG4gKiAgICAgZW5naW5lJ3Mgb3duIOKAlCB0aGUgcmVjb3JkIGB7IFtuYW1lXTogdmFsdWUgfWA6IGl0cyBuYW1lIElTIGEgc3RhdGUga2V5XG4gKiAgICAgKHtAbGluayBSZWRhY3Rpb25SdWxlLnJldGFpbkRpYWdub3N0aWN9KS4gYHBvbGljeS5kaWFnbm9zdGljc2AgYWRkc1xuICogICAgIGRpYWdub3N0aWMtb25seSBzZWxlY3RvcnMgb24gdG9wOyBmbG93LW1lc3NhZ2UgdGV4dCBoYXMgbm8gbmFtZSBvZiBpdHNcbiAqICAgICBvd24sIHNvIG9ubHkgdGhleSBzZWxlY3QgaXQ7XG4gKiAgIC0gYSBzdWJmbG93IG1hcHBlcidzIGNvcHkg4oCUIGEga2V5IGFuIGBpbnB1dE1hcHBlcmAvYG91dHB1dE1hcHBlcmAgKG9yIGFcbiAqICAgICBgcGFyYWxsZWxGb3JFYWNoYCBpdGVtcyBzZWxlY3Rvcikgd3JvdGUgaW5oZXJpdHMgdGhlIHJlZGFjdGlvbiBvZiB0aGVcbiAqICAgICBzZWxlY3RlZCB2YWx1ZSBpdCBjb3BpZWQgKHtAbGluayBNYXBwZXJUYWludH0pLlxuICogQSBtYXJrIGlzIGEgTkFNRSwgcnVuLXdpZGUsIHVudGlsIHRoZSBrZXkgaXMgZGVsZXRlZDsgYSBwYXVzZSBjYXJyaWVzIHRoZVxuICogbWFya3Mg4oCUIG5hbWVzIG9ubHkg4oCUIHRvIHRoZSByZXN1bWVkIHJ1biAoe0BsaW5rIFJlZGFjdGlvblJ1bGUubWFya3NGb3JDaGVja3BvaW50fSkuXG4gKiBBIHZhbHVlIHdpdGggbm8gbmFtZSDigJQgYSBzY2FsYXIgcm9vdCBpbnB1dC9vdXRwdXQgb3IgcGF1c2UgcGF5bG9hZCwgZnJlZVxuICogZXJyb3IgdGV4dCDigJQgaXMgc2VsZWN0ZWQgYnkgbm90aGluZy4gYGVtaXRQYXR0ZXJuc2AgaXMgdGhlIG9uZSBzZXBhcmF0ZVxuICogc2NydWI6IGEgYCRlbWl0YCBwYXlsb2FkIGlzIHNlbGVjdGVkIGJ5IGl0cyBldmVudCBuYW1lLlxuICpcbiAqIEhPVyBPTkUgT1dORVIgS0VFUFMgSVQuIEV2ZXJ5IHN0YWdlZCB3cml0ZSBhbmQgZXZlcnkgdHJhY2tlZCByZWFkIHBhc3Nlc1xuICogdGhyb3VnaCBgU3RhZ2VDb250ZXh0YCwgc28gYFN0YWdlQ29udGV4dGAgYXNrcyBUSElTIHJ1bGUg4oCUIG5vdCB0aGUgY2FsbGVyIOKAlFxuICogd2hhdCB0aGUgcG9saWN5IHNheXMgYWJvdXQgdGhlIHBhdGggaXQgaXMgYWJvdXQgdG8gcmV0YWluLiBBIGBTY29wZUZhY2FkZWBcbiAqIHdyaXRlLCBhIHN1YmZsb3cgYGlucHV0TWFwcGVyYCBzZWVkLCBhbiBgb3V0cHV0TWFwcGVyYCBtZXJnZS1iYWNrIGFuZCBhXG4gKiByZXN1bWUgcmUtc2VlZCBhcmUgdGhlbiBhbGwgdGhlIHNhbWUgY2FzZTogdGhlIGZ1bm5lbCBkZWNpZGVzLCB0aGUgY2FsbGVyXG4gKiBjYW5ub3QgZm9yZ2V0IHRvLiBUaGUgZmFjYWRlIHVzZXMgdGhlIHNhbWUgcnVsZSBmb3IgdGhlIHZhbHVlcyBpdCBoYW5kcyB0b1xuICogcmVjb3JkZXJzOyBgU3ViZmxvd0V4ZWN1dG9yYCB1c2VzIGl0IGZvciB0aGUgbmFycmF0ZWQgc2VlZCBhbmRcbiAqIGBGbG93Y2hhcnRUcmF2ZXJzZXIuZXhlY3V0ZWAgZm9yIHJvb3QgaW5wdXQvb3V0cHV0IGJlZm9yZSBkaXNwYXRjaC4gQmVmb3JlIDkuMTkuMFxuICogdGhlIGZhY2FkZSBoZWxkIHRoZSB2ZXJkaWN0IGFsb25lLCBhbmQgZXZlcnkgcGF0aCB0aGF0IHdyb3RlIG9yIHJlYWQgcGFzdFxuICogdGhlIGZhY2FkZSDigJQgZml2ZSBvZiB0aGVtIOKAlCByZXRhaW5lZCBwbGFpbnRleHQgdW5kZXIgYSBwb2xpY3kuXG4gKlxuICogVFdPIFBMQUNFSE9MREVSUywgQk9USCBISVNUT1JJQ0FMOiB0aGUgY29tbWl0IGxvZyBhbmQgdGhlIG1pcnJvciBjYXJyeVxuICogYCdSRURBQ1RFRCdgIChgc2NydWJQYXRjaGAgLyBgcmVkYWN0UGF0Y2hgLCBiZWxvdyDigJQgdGhlIHN0cmluZ3MgdW5jaGFuZ2VkIHNpbmNlIDQueCk7IGV2ZXJ5IHNjb3BlLXRpZXIgdmlldyDigJRcbiAqIHNjb3BlIHJlY29yZGVyIGV2ZW50cywgYHN0YWdlUmVhZHNgL2BzdGFnZVdyaXRlc2AsIG5hcnJhdGl2ZSDigJQgY2Fycmllc1xuICogYCdbUkVEQUNURURdJ2AuIE5laXRoZXIgc3RyaW5nIGNoYW5nZWQgaW4gOS4xOS4wLiBUaGUgc3RyaW5ncyB0aGVtc2VsdmVzIGFyZVxuICogb3duZWQgYnkgYG1lbW9yeS9wbGFjZWhvbGRlcnMudHNgIChgTE9HX1BMQUNFSE9MREVSYCAvIGBTQ09QRV9QTEFDRUhPTERFUmApXG4gKiBhbmQgc3BlbGxlZCBub3doZXJlIGVsc2UgaW4gYHNyYy9gIOKAlCB0aGlzIHJ1bGUgYXNrcyBmb3IgdGhlIHNjb3BlIG9uZSBieSBuYW1lLlxuICovXG5cbmltcG9ydCB7IGlzRGV2TW9kZSB9IGZyb20gJy4uL2Rldk1vZGUuanMnO1xuaW1wb3J0IHR5cGUgeyBTdHJ1Y3R1cmVkRXJyb3JJbmZvIH0gZnJvbSAnLi4vZXJyb3JzL2Vycm9ySW5mby5qcyc7XG5pbXBvcnQgeyBleHRyYWN0RXJyb3JJbmZvLCB0aHJvd25UZXh0IH0gZnJvbSAnLi4vZXJyb3JzL2Vycm9ySW5mby5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlZGFjdGlvbk1hcmtzIH0gZnJvbSAnLi4vcGF1c2UvdHlwZXMuanMnO1xuaW1wb3J0IHsgbmF0aXZlR2V0LCBuYXRpdmVIYXMsIG5hdGl2ZVNldCwgb3duZWRSb290T2YsIG93blNwaW5lIH0gZnJvbSAnLi9wYXRoT3BzLmpzJztcbmltcG9ydCB7IERFTElNIH0gZnJvbSAnLi9wYXRocy5qcyc7XG5pbXBvcnQgeyBMT0dfUExBQ0VIT0xERVIsIFNDT1BFX1BMQUNFSE9MREVSIH0gZnJvbSAnLi9wbGFjZWhvbGRlcnMuanMnO1xuaW1wb3J0IHR5cGUgeyBNZW1vcnlQYXRjaCB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vKipcbiAqIERlY2xhcmF0aXZlIGtleS9wYXRoIHJlZGFjdGlvbiBmb3IgcmVjb3JkZWQgc3RhdGUgYW5kIGJvdW5kYXJ5IHJlY29yZHMuXG4gKlxuICogQ29uZmlndXJlIGF0IHRoZSBzY29wZSBjbGFzcyBsZXZlbCAoc3RhdGljIHByb3BlcnR5KSBvciBwYXNzIHRvXG4gKiBGbG93Q2hhcnRFeGVjdXRvciB0byBhcHBseSBhY3Jvc3MgYWxsIHN0YWdlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWRhY3Rpb25Qb2xpY3kge1xuICAvKiogRXhhY3Qga2V5IG5hbWVzIHRvIGFsd2F5cyByZWRhY3QgKGUuZy4gWydzc24nLCAnY3JlZGl0Q2FyZCddKS4gKi9cbiAga2V5cz86IHN0cmluZ1tdO1xuICAvKipcbiAgICogUmVnZXggcGF0dGVybnMg4oCUIGFueSBrZXkgbWF0Y2hpbmcgYSBwYXR0ZXJuIGlzIGF1dG8tcmVkYWN0ZWQuXG4gICAqXG4gICAqIFBhdHRlcm4gbWF0Y2hpbmcgaXMgc2tpcHBlZCBmb3Iga2V5cyB0aGF0IGV4Y2VlZCBhbiBpbnRlcm5hbCBsZW5ndGggY2FwXG4gICAqIChkZXNpZ25lZCB0byBwcmV2ZW50IFJlRG9TIG9uIHBhdGhvbG9naWNhbCBwYXR0ZXJucykuIEZvciB2ZXJ5IGxvbmcga2V5XG4gICAqIG5hbWVzLCB1c2UgYGtleXNgIChleGFjdCBtYXRjaCkgaW5zdGVhZCBvZiBwYXR0ZXJucy5cbiAgICovXG4gIHBhdHRlcm5zPzogUmVnRXhwW107XG4gIC8qKiBGaWVsZC1sZXZlbCByZWRhY3Rpb24gd2l0aGluIG9iamVjdHMg4oCUIGtleSDihpIgYXJyYXkgb2YgZmllbGRzIHRvIHNjcnViLlxuICAgKiAgU3VwcG9ydHMgZG90LW5vdGF0aW9uIGZvciBuZXN0ZWQgcGF0aHMgKGUuZy4gJ2FkZHJlc3MuemlwJykuICovXG4gIGZpZWxkcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPjtcbiAgLyoqXG4gICAqIERpYWdub3N0aWMtb25seSBzZWxlY3RvcnMsIElOIEFERElUSU9OIHRvIHRoZSBzdGF0ZSBzZWxlY3RvcnMgYWJvdmUgKHdoaWNoXG4gICAqIGFscmVhZHkgY292ZXIgYSBkaWFnbm9zdGljIGVudHJ5IGJ5IGl0cyBuYW1lOiBga2V5czogWyd0b2tlbiddYCBtYXNrc1xuICAgKiBgJGRlYnVnKCd0b2tlbicsIOKApilgKS4gVXNlIHRoZXNlIGZvciBuYW1lcyB5b3UgbWFzayBpbiBkaWFnbm9zdGljcyBidXRcbiAgICogbm90IGluIHN0YXRlLiBQYXRocyBzdGFydCB3aXRoIGxvZ3MvZXJyb3JzL21ldHJpY3MvZXZhbHMsIGUuZy5cbiAgICogYGxvZ3MucHJvZmlsZS50b2tlbmAuIE9ubHkgZmxvd01lc3NhZ2VzLmRlc2NyaXB0aW9uIGFuZFxuICAgKiBmbG93TWVzc2FnZXMucmF0aW9uYWxlIGFyZSBwYXlsb2FkczsgZmxvdyB0b3BvbG9neS90aW1pbmcgbWV0YWRhdGEgc3RheXNcbiAgICogaW50YWN0LiBBcHBsaWVkIGJlZm9yZSByZXRlbnRpb24sIG5vdCByZXRyb2FjdGl2ZWx5IHRvIGV4aXN0aW5nIGJhZ3MuXG4gICAqL1xuICBkaWFnbm9zdGljcz86IFBpY2s8UmVkYWN0aW9uUG9saWN5LCAna2V5cycgfCAncGF0dGVybnMnIHwgJ2ZpZWxkcyc+O1xuICAvKipcbiAgICogUmVnZXggcGF0dGVybnMgbWF0Y2hlZCBhZ2FpbnN0IGBFbWl0RXZlbnQubmFtZWAgZm9yIGBzY29wZS4kZW1pdCguLi4pYFxuICAgKiBjYWxscy4gQW55IGVtaXQgZXZlbnQgd2hvc2UgbmFtZSBtYXRjaGVzIGhhcyBpdHMgcGF5bG9hZCByZXBsYWNlZCB3aXRoXG4gICAqIHRoZSBzdHJpbmcgYCdbUkVEQUNURURdJ2AgYmVmb3JlIGRpc3BhdGNoIHRvIHJlY29yZGVycy5cbiAgICogR2xvYmFsL3N0aWNreSBwYXR0ZXJucyBzdGFydCBhdCBpbmRleCB6ZXJvIG9uIGV2ZXJ5IHRlc3Q7IHRoZWlyIGZsYWdzXG4gICAqIHJldGFpbiB0aGVpciB1c3VhbCBtZWFuaW5nLiBUaGlzIGRvZXMgbm90IHNjcnViIGRpYWdub3N0aWMgc2lkZSBiYWdzLlxuICAgKlxuICAgKiBFeGFtcGxlOlxuICAgKiBgYGB0c1xuICAgKiB7IGVtaXRQYXR0ZXJuczogWy9cXC5hdXRoXFwuLywgL1xcLmJpbGxpbmdcXC4vXSB9XG4gICAqIC8vIEhpZGVzIHBheWxvYWRzIG9mIGV2ZW50cyBsaWtlICdteWFwcC5hdXRoLmNoZWNrJyBhbmQgJ215YXBwLmJpbGxpbmcuc3BlbmQnXG4gICAqIGBgYFxuICAgKi9cbiAgZW1pdFBhdHRlcm5zPzogUmVnRXhwW107XG59XG5cbi8qKlxuICogU3RhdGUgcmVkYWN0aW9uIHJlcG9ydC4gTmV2ZXIgaW5jbHVkZXMgdmFsdWVzOyBlbWl0IGFuZCBkaWFnbm9zdGljXG4gKiBzZWxlY3RvcnMvYWN0aXZpdHkgYXJlIG5vdCByZXByZXNlbnRlZCBoZXJlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlZGFjdGlvblJlcG9ydCB7XG4gIC8qKiBLZXlzIGZ1bGx5IHJlZGFjdGVkIChleGFjdCBtYXRjaCBvciBwYXR0ZXJuIG1hdGNoKS4gKi9cbiAgcmVkYWN0ZWRLZXlzOiBzdHJpbmdbXTtcbiAgLyoqIEtleXMgd2l0aCBmaWVsZC1sZXZlbCByZWRhY3Rpb24g4oaSIHdoaWNoIGZpZWxkcyB3ZXJlIHNjcnViYmVkLiAqL1xuICBmaWVsZFJlZGFjdGlvbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPjtcbiAgLyoqIFBhdHRlcm4gc291cmNlcyB0aGF0IHdlcmUgYWN0aXZlIChlLmcuIFsncGFzc3dvcmR8c2VjcmV0J10pLiAqL1xuICBwYXR0ZXJuczogc3RyaW5nW107XG59XG5cbi8qKlxuICogV2hhdCB0aGUgcG9saWN5IHNheXMgYWJvdXQgdGhlIHZhbHVlIGF0IG9uZSB1c2VyLWxldmVsIHBhdGguXG4gKlxuICogLSBgJ2NsZWFyJ2AgIOKAlCBub3RoaW5nIHRvIHNjcnViOyByZXRhaW4gYW5kIHNlcnZlIHRoZSB2YWx1ZSBhcyBpdCBpcy5cbiAqIC0gYCd3aG9sZSdgICDigJQgdGhlIGVudGlyZSB2YWx1ZSBpcyBzZWNyZXQuIGBrZXlgIGlzIHRoZSBwb2xpY3kgb3IgbWFya2VkXG4gKiAgIGtleSB0aGF0IGRlY2lkZWQgaXQgKHRoZSBwYXRoIGl0c2VsZiBvciBvbmUgb2YgaXRzIGFuY2VzdG9ycykuXG4gKiAtIGAnZmllbGRzJ2Ag4oCUIHRoZSB2YWx1ZSBpcyBhbiBvYmplY3Qgd2hvc2UgYHBhdGhzYCAoZG90LXBhdGhzIElOU0lERSB0aGVcbiAqICAgdmFsdWUsIHJlbGF0aXZlIHRvIGl0KSBhcmUgc2VjcmV0OyBldmVyeXRoaW5nIGVsc2UgaW4gaXQgaXMgbm90LlxuICovXG5leHBvcnQgdHlwZSBSZWRhY3Rpb25WZXJkaWN0ID1cbiAgfCB7IHJlYWRvbmx5IGtpbmQ6ICdjbGVhcicgfVxuICB8IHsgcmVhZG9ubHkga2luZDogJ3dob2xlJzsgcmVhZG9ubHkga2V5OiBzdHJpbmcgfVxuICB8IHsgcmVhZG9ubHkga2luZDogJ2ZpZWxkcyc7IHJlYWRvbmx5IGtleTogc3RyaW5nOyByZWFkb25seSBwYXRoczogcmVhZG9ubHkgc3RyaW5nW10gfTtcblxuZXhwb3J0IGNvbnN0IENMRUFSOiBSZWRhY3Rpb25WZXJkaWN0ID0gT2JqZWN0LmZyZWV6ZSh7IGtpbmQ6ICdjbGVhcicgfSBhcyBjb25zdCk7XG5cbi8qKlxuICogTWF4aW11bSBrZXkgbGVuZ3RoIChjaGFyYWN0ZXJzKSB0aGF0IHdpbGwgYmUgdGVzdGVkIGFnYWluc3QgcmVnZXggcmVkYWN0aW9uXG4gKiBwYXR0ZXJucy4gS2V5cyBsb25nZXIgdGhhbiB0aGlzIGFyZSBza2lwcGVkIGZvciBwYXR0ZXJuIG1hdGNoaW5nIHRvIHByZXZlbnRcbiAqIFJlRG9TOiBhIHBhdGhvbG9naWNhbCByZWdleCB0ZXN0ZWQgYWdhaW5zdCBhbiB1bmJvdW5kZWRseSBsb25nIGtleSBzdHJpbmdcbiAqIGNhbiBjYXVzZSBjYXRhc3Ryb3BoaWMgYmFja3RyYWNraW5nLiAyNTYgY2hhcmFjdGVycyBjb21mb3J0YWJseSBleGNlZWRzIGFueVxuICogcmVhbGlzdGljIHNjb3BlLXN0YXRlIGtleSBuYW1lLlxuICovXG5jb25zdCBNQVhfUEFUVEVSTl9LRVlfTEVOID0gMjU2O1xuXG4vKipcbiAqIFRoZSBmaWVsZHMgYSBwb2xpY3kgZGVjbGFyZXMgdW5kZXIgYGtleWAg4oCUIG9ubHkgd2hlbiBgZmllbGRzYCBPV05TIGBrZXlgLlxuICogVGhlIGtleSBpcyBhIG5hbWUgZnJvbSBkYXRhIChhIHN0YXRlIGtleSwgYSBuZXN0ZWQga2V5IG9mIGEgcmVjb3JkIGhhbmRlZFxuICogb3V0IHdob2xlKSwgYW5kIGEgcGxhaW4tb2JqZWN0IGxvb2t1cCByZWFkcyB0aGUgcHJvdG90eXBlIGNoYWluOlxuICogYGZpZWxkc1snY29uc3RydWN0b3InXWAgaXMgYE9iamVjdGAsIGBmaWVsZHNbJ19fcHJvdG9fXyddYCBpc1xuICogYE9iamVjdC5wcm90b3R5cGVgLiBUaGUgd2FsayB0aGVuIGl0ZXJhdGVkIHRoZW0sIHNvIGFueSBgZmllbGRzYCBwb2xpY3lcbiAqIGZhaWxlZCB0aGUgcnVuIHdpdGggYSBUeXBlRXJyb3Igb24gZGF0YSBob2xkaW5nIHN1Y2ggYSBrZXkuXG4gKi9cbmZ1bmN0aW9uIGRlY2xhcmVkRmllbGRzKGZpZWxkczogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+IHwgdW5kZWZpbmVkLCBrZXk6IHN0cmluZyk6IHJlYWRvbmx5IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGZpZWxkcyAhPT0gdW5kZWZpbmVkICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChmaWVsZHMsIGtleSkgPyBmaWVsZHNba2V5XSA6IHVuZGVmaW5lZDtcbn1cblxuLyoqIFBvbGljeSBwYXR0ZXJucyBhcmUgcHJlZGljYXRlcywgbm90IGN1cnNvcnMgb3ZlciBzdWNjZXNzaXZlIGtleXMvZXZlbnRzLiAqL1xuZnVuY3Rpb24gbWF0Y2hlc1BhdHRlcm4odmFsdWU6IHN0cmluZywgcGF0dGVybnM6IHJlYWRvbmx5IFJlZ0V4cFtdIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIGlmICghcGF0dGVybnMpIHJldHVybiBmYWxzZTtcbiAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIHBhdHRlcm5zKSB7XG4gICAgLy8gT25seSB0aGVzZSBmbGFncyBjb25zdW1lIGxhc3RJbmRleC4gT3JkaW5hcnkgKGluY2x1ZGluZyBmcm96ZW4pXG4gICAgLy8gcmVnZXhlcyBuZWVkIG5vIHdyaXRhYmxlIGN1cnNvciB0byBtYXRjaC4gS2VlcCBhbGwgb3JpZ2luYWwgZmxhZ3MuXG4gICAgaWYgKHBhdHRlcm4uZ2xvYmFsIHx8IHBhdHRlcm4uc3RpY2t5KSBwYXR0ZXJuLmxhc3RJbmRleCA9IDA7XG4gICAgaWYgKHBhdHRlcm4udGVzdCh2YWx1ZSkpIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGNsYXNzIFJlZGFjdGlvblJ1bGUge1xuICBwcml2YXRlIHBvbGljeTogUmVkYWN0aW9uUG9saWN5IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIGRpYWdub3N0aWNSdWxlOiBSZWRhY3Rpb25SdWxlIHwgdW5kZWZpbmVkO1xuICAvKiogV2hldGhlciBgcG9saWN5YCBuYW1lcyBhbnl0aGluZyBhIHN0YXRlIHZlcmRpY3QgY2FuIGFjdCBvbiDigJQgY29tcHV0ZWRcbiAgICogIG9uY2UgcGVyIGBzZXRQb2xpY3lgIHNvIHtAbGluayBpc0luZXJ0fSBpcyBhIHR3by1maWVsZCBjaGVjay4gKi9cbiAgcHJpdmF0ZSBwb2xpY3lBY3RpdmUgPSBmYWxzZTtcbiAgLyoqIFRoZSBwb2xpY3kncyBwYXR0ZXJucyB0aGF0IGNhbiBkZXBlbmQgb24gYSB3aG9sZSBkb3R0ZWQgcGF0aCAoe0BsaW5rIG5lZWRzUGF0aH0pIOKAlCBwZXIgYHNldFBvbGljeWAuICovXG4gIHByaXZhdGUgcGF0aFBhdHRlcm5zOiByZWFkb25seSBSZWdFeHBbXSA9IFtdO1xuICBwcml2YXRlIHdhbGtMaW1pdFdhcm5lZCA9IGZhbHNlO1xuICAvKipcbiAgICogS2V5cyBtYXJrZWQgc2VjcmV0IGZvciB0aGUgcmVzdCBvZiB0aGUgcnVuIOKAlCBieSBhIHBlci1jYWxsXG4gICAqIGBzZXRWYWx1ZShrZXksIHZhbHVlLCB0cnVlKWAsIG9yIGJ5IGFueSB3cml0ZSB0aGUgcG9saWN5IHJlZGFjdGVkIHdob2xlLlxuICAgKiBPTkUgc2V0IHBlciBydW4sIHNoYXJlZCBieSBldmVyeSBzY29wZSBhbmQgY29udGV4dCAodGhlIGV4ZWN1dG9yIGJ1aWxkc1xuICAgKiB0aGUgcnVsZSBvbmNlIHBlciBydW4gYW5kIGluc3RhbGxzIGl0IG9uIHRoZSBydW50aW1lIHJvb3QpLlxuICAgKi9cbiAgcHJpdmF0ZSBtYXJrZWQ6IFNldDxzdHJpbmc+O1xuICAvKipcbiAgICogRmllbGRzIGEgc3ViZmxvdyBtYXBwZXIgaGFuZGVkIHRvIGEgTkVXIGtleSBhbG9uZyB3aXRoIHRoZSB2YWx1ZSB0aGV5XG4gICAqIGJlbG9uZyB0byDigJQgdGFyZ2V0IGtleSDihpIgdGhlIHNvdXJjZSBrZXkncyBmaWVsZCBwYXRocyAoYW4gb2JqZWN0IGNvcGllZFxuICAgKiBieSByZWZlcmVuY2UgZnJvbSBhIGBmaWVsZHNgLXNlbGVjdGVkIGtleTsge0BsaW5rIE1hcHBlclRhaW50fSkuXG4gICAqIFJ1bi13aWRlLCBieSBuYW1lLCBsaWtlIHtAbGluayBtYXJrZWR9LlxuICAgKi9cbiAgcHJpdmF0ZSBpbmhlcml0ZWQ6IE1hcDxzdHJpbmcsIHJlYWRvbmx5IHN0cmluZ1tdPiB8IHVuZGVmaW5lZDtcbiAgLyoqIFRoaXMgcnVuJ3MgdGhyb3duIHZhbHVlcyBzZXJ2ZWQgbWFza2VkICh0aGVpciB0ZXh0IHNlbGVjdGVkLCBvciBhIHNlbGVjdGVkIGtleSBpbnNpZGUgdGhlbSkg4oaSIHRoZWlyIHNlcnZlZCBmb3JtLiAqL1xuICBwcml2YXRlIG1hc2tlZEVycm9yczogTWFwPHVua25vd24sIFN0cnVjdHVyZWRFcnJvckluZm8+IHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKHBvbGljeT86IFJlZGFjdGlvblBvbGljeSwgbWFya2VkPzogU2V0PHN0cmluZz4pIHtcbiAgICB0aGlzLm1hcmtlZCA9IG1hcmtlZCA/PyBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICB0aGlzLnNldFBvbGljeShwb2xpY3kpO1xuICB9XG5cbiAgZ2V0UG9saWN5KCk6IFJlZGFjdGlvblBvbGljeSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucG9saWN5O1xuICB9XG5cbiAgc2V0UG9saWN5KHBvbGljeTogUmVkYWN0aW9uUG9saWN5IHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgdGhpcy5wb2xpY3kgPSBwb2xpY3k7XG4gICAgY29uc3QgZGlhZ25vc3RpY3MgPSBwb2xpY3k/LmRpYWdub3N0aWNzO1xuICAgIHRoaXMuZGlhZ25vc3RpY1J1bGUgPSBkaWFnbm9zdGljc1xuICAgICAgPyBuZXcgUmVkYWN0aW9uUnVsZSh7IGtleXM6IGRpYWdub3N0aWNzLmtleXMsIHBhdHRlcm5zOiBkaWFnbm9zdGljcy5wYXR0ZXJucywgZmllbGRzOiBkaWFnbm9zdGljcy5maWVsZHMgfSlcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIHRoaXMucGF0aFBhdHRlcm5zID0gKHBvbGljeT8ucGF0dGVybnMgPz8gW10pLmZpbHRlcihuZWVkc1BhdGgpO1xuICAgIHRoaXMucG9saWN5QWN0aXZlID1cbiAgICAgIHBvbGljeSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAoKHBvbGljeS5rZXlzPy5sZW5ndGggPz8gMCkgPiAwIHx8XG4gICAgICAgIChwb2xpY3kucGF0dGVybnM/Lmxlbmd0aCA/PyAwKSA+IDAgfHxcbiAgICAgICAgT2JqZWN0LmtleXMocG9saWN5LmZpZWxkcyA/PyB7fSkubGVuZ3RoID4gMCk7XG4gIH1cblxuICAvKipcbiAgICogVHJ1ZSB3aGVuIHRoaXMgcnVsZSBoYXMgbm90aGluZyB0byBzYXkgYWJvdXQgQU5ZIHBhdGgg4oCUIG5vIGtleSwgcGF0dGVyblxuICAgKiBvciBmaWVsZCBpbiB0aGUgcG9saWN5IGFuZCBubyBrZXkgbWFya2VkIHNvIGZhci4gVGhlIG5vLXBvbGljeSBmYXN0XG4gICAqIHBhdGg6IGBTdGFnZUNvbnRleHRgIHNraXBzIHRoZSB2ZXJkaWN0IChhbmQgaXRzIHBhdGggYWxsb2NhdGlvbikgb25cbiAgICogZXZlcnkgdHJhY2tlZCByZWFkIGFuZCBzdGFnZWQgd3JpdGUgd2hpbGUgdGhpcyBob2xkcy4gQSBwZXItY2FsbFxuICAgKiBgc2V0VmFsdWUoa2V5LCB2YWx1ZSwgdHJ1ZSlgIG1hcmtzIGEga2V5IGFuZCBlbmRzIGl0LlxuICAgKi9cbiAgaXNJbmVydCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5tYXJrZWQuc2l6ZSA9PT0gMCAmJiAhdGhpcy5wb2xpY3lBY3RpdmUgJiYgdGhpcy5pbmhlcml0ZWQgPT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBUaGUgc2hhcmVkIG1hcmtlZC1rZXlzIHNldCDigJQgZm9yIHRoZSBgQGludGVybmFsYCBzaGFyaW5nIHByb3RvY29sIGFuZCBgZGVjaWRlKClgLiAqL1xuICBtYXJrZWRLZXlzKCk6IFNldDxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5tYXJrZWQ7XG4gIH1cblxuICB1c2VNYXJrZWRLZXlzKHNoYXJlZDogU2V0PHN0cmluZz4pOiB2b2lkIHtcbiAgICB0aGlzLm1hcmtlZCA9IHNoYXJlZDtcbiAgfVxuXG4gIG1hcmsoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm1hcmtlZC5hZGQoa2V5KTtcbiAgfVxuXG4gIC8qKiBEZWxldGluZyBhIGtleSBjbGVhcnMgaXRzIHBlci1jYWxsIG1hcmsgYW5kIGFueSBmaWVsZHMgYSBtYXBwZXIgZ2F2ZSBpdDsgYSBwb2xpY3kgdmVyZGljdCBzdXJ2aXZlcyBpdC4gKi9cbiAgdW5tYXJrKGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5tYXJrZWQuZGVsZXRlKGtleSk7XG4gICAgaWYgKHRoaXMuaW5oZXJpdGVkPy5kZWxldGUoa2V5KSAmJiB0aGlzLmluaGVyaXRlZC5zaXplID09PSAwKSB0aGlzLmluaGVyaXRlZCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBLZXktbGV2ZWwgdmVyZGljdDogbWFya2VkLCBsaXN0ZWQgaW4gYHBvbGljeS5rZXlzYCwgb3IgbWF0Y2hpbmcgYSBwYXR0ZXJuLiAqL1xuICBpc0tleVJlZGFjdGVkKGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMubWFya2VkLmhhcyhrZXkpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoIXRoaXMucG9saWN5KSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHRoaXMucG9saWN5LmtleXM/LmluY2x1ZGVzKGtleSkpIHJldHVybiB0cnVlO1xuICAgIGNvbnN0IHBhdHRlcm5zID0gdGhpcy5wb2xpY3kucGF0dGVybnM7XG4gICAgaWYgKCFwYXR0ZXJucyB8fCBwYXR0ZXJucy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcbiAgICBpZiAoa2V5Lmxlbmd0aCA+IE1BWF9QQVRURVJOX0tFWV9MRU4pIHtcbiAgICAgIGlmIChpc0Rldk1vZGUoKSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYFtmb290cHJpbnRdIFJlZGFjdGlvblBvbGljeToga2V5ICcke2tleS5zbGljZSgwLCA0MCl9Li4uJyAoJHtrZXkubGVuZ3RofSBjaGFycykgZXhjZWVkcyBgICtcbiAgICAgICAgICAgICd0aGUgcGF0dGVybi1tYXRjaGluZyBsZW5ndGggY2FwIGFuZCB3YXMgc2tpcHBlZC4gJyArXG4gICAgICAgICAgICAnVXNlIHBvbGljeS5rZXlzIGZvciBleGFjdCBtYXRjaGluZyBvZiBsb25nIGtleSBuYW1lcy4nLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gbWF0Y2hlc1BhdHRlcm4oa2V5LCBwYXR0ZXJucyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0YWluIGFuIGVtaXR0ZWQgcGF5bG9hZCBCRUZPUkUgZGlzcGF0Y2gvY2FwdHVyZS4gRW1pdCBuYW1lcyBhcmUgbm90XG4gICAqIHN0YXRlIHBhdGhzOiBubyBrZXktbGVuZ3RoIGNhcCwgbWFya3Mgb3IgZmllbGQgc2NydWIgYXBwbGllcyBoZXJlLlxuICAgKiBBIGNsZWFyIHBheWxvYWQga2VlcHMgaXRzIGlkZW50aXR5OyBkaWFnbm9zdGljIGJhZ3MgYXJlIHVudG91Y2hlZC5cbiAgICovXG4gIHJldGFpbkVtaXQobmFtZTogc3RyaW5nLCBwYXlsb2FkOiB1bmtub3duKTogdW5rbm93biB7XG4gICAgcmV0dXJuIG1hdGNoZXNQYXR0ZXJuKG5hbWUsIHRoaXMucG9saWN5Py5lbWl0UGF0dGVybnMpID8gU0NPUEVfUExBQ0VIT0xERVIgOiBwYXlsb2FkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldGFpbiBhIE5BTUVEIGRpYWdub3N0aWMgZW50cnkg4oCUIGBhZGRyZXNzYCBpcyBgW2NoYW5uZWwsIC4uLnBhdGgsIG5hbWVdYFxuICAgKiAoYCRkZWJ1ZygndG9rZW4nLCB2KWAg4oaSIGBbJ2xvZ3MnLCAndG9rZW4nXWA7IGAkbG9nKHYpYCDihpIgYFsnbG9ncycsXG4gICAqICdtZXNzYWdlcyddYCkuIFRIRSBNQVBQSU5HOiB0aGUgZW50cnkgaXMgdGhlIHJlY29yZCBgeyBbbmFtZV06IHZhbHVlIH1gXG4gICAqIGhhbmRlZCBvdXQgd2hvbGUsIHNvIGl0IGlzIHJldGFpbmVkIGFzIGEgYm91bmRhcnkgcmVjb3JkIGhvbGRpbmcgdGhlXG4gICAqIHN0YXRlIGtleSBgbmFtZWAgd291bGQgYmUg4oCUIHRoZSBzdGF0ZSB2ZXJkaWN0IGF0IGBbLi4ucGF0aCwgbmFtZV1gIChrZXlzLFxuICAgKiBwYXR0ZXJucyBhbmQgbWFya3MgYXQgZXZlcnkgZG90dGVkIHByZWZpeCBhbmQgYXQgdGhlIG5hbWUgaXRzZWxmOyB0aGUgdG9wXG4gICAqIGtleSdzIGBmaWVsZHNgKSwgdGhlbiBldmVyeSBuZXN0ZWQgb3duIGtleSB3aG9zZSBuYW1lIG9yIGRvdHRlZCBwYXRoIGlzXG4gICAqIHNlbGVjdGVkICh7QGxpbmsgcmV0YWluQm91bmRhcnl9J3Mgd2FsaykuIFRoZSBjaGFubmVsIHRha2VzIG5vIHBhcnQ6XG4gICAqIGBsb2dzLnRva2VuYCwgYGVycm9ycy50b2tlbmAgYW5kIGBtZXRyaWNzLnRva2VuYCBhcmUgYWxsIHRoZSBzdGF0ZSBrZXlcbiAgICogYHRva2VuYC4gYHBvbGljeS5kaWFnbm9zdGljc2AgKGRpYWdub3N0aWMtb25seSBzZWxlY3RvcnMsIHJvb3RlZCBhdCB0aGVcbiAgICogY2hhbm5lbCkgYXBwbGllcyBvbiB0b3AuIENsZWFyIHZhbHVlcyBrZWVwIHRoZWlyIGlkZW50aXR5LlxuICAgKi9cbiAgcmV0YWluRGlhZ25vc3RpYyhhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSwgdmFsdWU6IHVua25vd24pOiB1bmtub3duIHtcbiAgICBjb25zdCBrZXB0ID0gdGhpcy5pc0luZXJ0KCkgPyB2YWx1ZSA6IHRoaXMucmV0YWluTmFtZWQoYWRkcmVzcy5zbGljZSgxKSwgdmFsdWUpO1xuICAgIHJldHVybiB0aGlzLmRpYWdub3N0aWNSdWxlID8gdGhpcy5kaWFnbm9zdGljUnVsZS5yZXRhaW4oYWRkcmVzcywga2VwdCkgOiBrZXB0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldGFpbiBmbG93LW1lc3NhZ2UgdGV4dCAoYGZsb3dNZXNzYWdlcy5kZXNjcmlwdGlvbmAgLyBgLnJhdGlvbmFsZWApOiB0ZXh0XG4gICAqIHRoZSBlbmdpbmUgY29tcG9zZXMgaGFzIG5vIG5hbWUgb2YgaXRzIG93biwgc28gbm8gc3RhdGUgc2VsZWN0b3IgcmVhY2hlc1xuICAgKiBpdCDigJQgb25seSBgcG9saWN5LmRpYWdub3N0aWNzYCBzZWxlY3RzIGl0LlxuICAgKi9cbiAgcmV0YWluRmxvd1RleHQoYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW10sIHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZGlhZ25vc3RpY1J1bGUgPyAodGhpcy5kaWFnbm9zdGljUnVsZS5yZXRhaW4oYWRkcmVzcywgdGV4dCkgYXMgc3RyaW5nKSA6IHRleHQ7XG4gIH1cblxuICAvKioge0BsaW5rIHJldGFpbkRpYWdub3N0aWN9J3Mgc3RhdGUgaGFsZjogdGhlIHZhbHVlIG5hbWVkIGJ5IGBwYXRoYCAoaXRzIGxhc3Qgc2VnbWVudCksIHNlcnZlZCB3aG9sZS4gKi9cbiAgcHJpdmF0ZSByZXRhaW5OYW1lZChwYXRoOiByZWFkb25seSBzdHJpbmdbXSwgdmFsdWU6IHVua25vd24pOiB1bmtub3duIHtcbiAgICBpZiAocGF0aC5sZW5ndGggPT09IDApIHJldHVybiB2YWx1ZTtcbiAgICBjb25zdCBuYW1lID0gcGF0aFtwYXRoLmxlbmd0aCAtIDFdO1xuICAgIGNvbnN0IHZlcmRpY3Q6IFJlZGFjdGlvblZlcmRpY3QgPVxuICAgICAgcGF0aC5sZW5ndGggPiAxICYmIHRoaXMuaXNLZXlSZWRhY3RlZChuYW1lKSA/IHsga2luZDogJ3dob2xlJywga2V5OiBuYW1lIH0gOiB0aGlzLnZlcmRpY3QocGF0aCk7XG4gICAgaWYgKHZlcmRpY3Qua2luZCA9PT0gJ3dob2xlJykgcmV0dXJuIFNDT1BFX1BMQUNFSE9MREVSO1xuICAgIGNvbnN0IGtlcHQgPSBSZWRhY3Rpb25SdWxlLmFwcGx5KHZlcmRpY3QsIHZhbHVlKTtcbiAgICBpZiAoa2VwdCA9PT0gbnVsbCB8fCB0eXBlb2Yga2VwdCAhPT0gJ29iamVjdCcpIHJldHVybiBrZXB0O1xuICAgIGNvbnN0IGJhc2UgPSBwYXRoLmpvaW4oJy4nKTtcbiAgICByZXR1cm4gc2VydmVkQnlQYXRoKGtlcHQsIGJhc2UsIHRoaXMuZG90dGVkVGFyZ2V0cyhiYXNlKSwgdGhpcy5uYW1lc1dhbGsoZmFsc2UpLCBTQ09QRV9QTEFDRUhPTERFUik7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHNlcnZlZCBmb3JtIG9mIGEgdGhyb3duIHZhbHVlLCBkZWNpZGVkIE9OQ0UgYXQgaXRzIGVycm9yIHNpdGUgZnJvbSB0aGVcbiAgICogdGV4dCB0aGUgZGlhZ25vc3RpYyBjb2xsZWN0b3IgcmV0YWluZWQgZm9yIGBlcnJvcnMuc3RhZ2VFeGVjdXRpb25FcnJvcmBcbiAgICogKGBrZXB0YCkgYW5kIGZyb20gdGhlIHZhbHVlIGl0c2VsZiDigJQgYSByZWNvcmQgaGFuZGVkIG91dCB3aG9sZSwgbWFza2VkXG4gICAqIHdoZW4gb25lIG9mIGl0cyBvd24ga2V5cywgYXQgYW55IGRlcHRoLCBjYXJyaWVzIGEgc2VsZWN0ZWQgbmFtZS5cbiAgICogVW5tYXNrZWQ6IHRvZGF5J3Mgc3RydWN0dXJlZCBpbmZvLiBNYXNrZWQ6IHRoZSBlcnJvcidzIGBuYW1lYC9gY29kZWAga2VwdCxcbiAgICogbm8gYGlzc3Vlc2AgKHRoZXkgcXVvdGUgdGhlIGlucHV0KSBhbmQgbm8gYHJhd2AgZXJyb3IgKGl0IGhvbGRzIHRoZSB0ZXh0XG4gICAqIGFuZCB0aGUga2V5cyk7IHRoZSBtZXNzYWdlIGlzIHRoZSBwbGFjZWhvbGRlciB3aGVuIHRoZSB0ZXh0IHdhcyBzZWxlY3RlZCxcbiAgICogdGhlIHRleHQgaXRzZWxmIHdoZW4gb25seSBhIGtleSB3YXMg4oCUIHJlbWVtYmVyZWQgc28gYG9uUnVuRmFpbGVkYCwgdGhlXG4gICAqIGxvZ2dlciBhbmQgYSBmb3JrIGVudmVsb3BlIHNlcnZlIHRoZSBzYW1lIGZvcm0gKHtAbGluayBzZXJ2ZWRFcnJvcn0pLiBUaGVcbiAgICogdGhyb3duIHZhbHVlIGl0c2VsZiBzdGF5cyByZWFsLlxuICAgKi9cbiAgcmV0YWluU3RhZ2VFcnJvcihcbiAgICBlcnJvcjogdW5rbm93bixcbiAgICB0ZXh0OiBzdHJpbmcsXG4gICAga2VwdDogdW5rbm93bixcbiAgKTogeyBtZXNzYWdlOiBzdHJpbmc7IHN0cnVjdHVyZWRFcnJvcjogU3RydWN0dXJlZEVycm9ySW5mbyB9IHtcbiAgICBjb25zdCBpbmZvID0gZXh0cmFjdEVycm9ySW5mbyhlcnJvcik7XG4gICAgY29uc3QgdGV4dFNlbGVjdGVkID0ga2VwdCAhPT0gdGV4dDtcbiAgICBpZiAoIXRleHRTZWxlY3RlZCAmJiAhdGhpcy5jYXJyaWVzU2VsZWN0ZWRLZXkoZXJyb3IpKSByZXR1cm4geyBtZXNzYWdlOiB0ZXh0LCBzdHJ1Y3R1cmVkRXJyb3I6IGluZm8gfTtcbiAgICBjb25zdCBtZXNzYWdlID0gdGV4dFNlbGVjdGVkID8gU3RyaW5nKGtlcHQpIDogdGV4dDtcbiAgICBjb25zdCBtYXNrZWQ6IFN0cnVjdHVyZWRFcnJvckluZm8gPSB7XG4gICAgICBtZXNzYWdlOiB0ZXh0U2VsZWN0ZWQgPyBtZXNzYWdlIDogaW5mby5tZXNzYWdlLFxuICAgICAgLi4uKGluZm8ubmFtZSAhPT0gdW5kZWZpbmVkICYmIHsgbmFtZTogaW5mby5uYW1lIH0pLFxuICAgICAgLi4uKGluZm8uY29kZSAhPT0gdW5kZWZpbmVkICYmIHsgY29kZTogaW5mby5jb2RlIH0pLFxuICAgICAgcmF3OiB1bmRlZmluZWQsXG4gICAgfTtcbiAgICAodGhpcy5tYXNrZWRFcnJvcnMgPz89IG5ldyBNYXAoKSkuc2V0KGVycm9yLCBtYXNrZWQpO1xuICAgIHJldHVybiB7IG1lc3NhZ2UsIHN0cnVjdHVyZWRFcnJvcjogbWFza2VkIH07XG4gIH1cblxuICAvKipcbiAgICogRG9lcyBhIHRocm93biB2YWx1ZSBjYXJyeSBhIHNlbGVjdGVkIG5hbWUg4oCUIGFuIG93biBrZXksIGF0IGFueSBkZXB0aCwgdGhhdFxuICAgKiB0aGUgcG9saWN5IG9yIGEgbWFyayBzZWxlY3RzPyBUb3RhbDogYSB2YWx1ZSB3aG9zZSBrZXlzIGNhbm5vdCBiZSByZWFkIGlzXG4gICAqIHNlcnZlZCBtYXNrZWQgKHRoZSBzYWZlIHNpZGUpLCBuZXZlciBhIHNlY29uZCB0aHJvdyBmcm9tIGFuIGVycm9yIHBhdGguXG4gICAqL1xuICBwcml2YXRlIGNhcnJpZXNTZWxlY3RlZEtleSh2YWx1ZTogdW5rbm93bik6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmlzSW5lcnQoKSB8fCB2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLnRocm93bkNhcnJpZXModmFsdWUsIG5ldyBTZXQoKSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBLZXlzIHRoYXQgY2Fubm90IGJlIHJlYWQgKGEgdGhyb3dpbmcgZ2V0dGVyLCBhIHJldm9rZWQgUHJveHkpIG9yIGEgd2FsayBwYXN0IGl0c1xuICAgICAgLy8gbGltaXQ6IHNlcnZlZCBpbiB0aGUgbWFza2VkIGZvcm0g4oCUIGl0cyB0ZXh0IGtlcHQsIG5vIGByYXdgLlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE9uZSB0aHJvd24gdmFsdWUgYW5kIHdoYXQgYSBsb2dnZXIgb3IgYSBzZXJpYWxpemVyIHByaW50cyB3aXRoIGl0OiBpdHMgb3duXG4gICAqIGtleXMgYXQgZXZlcnkgZGVwdGgsIGFuZCBpdHMgYGNhdXNlYCAvIGFuIGBBZ2dyZWdhdGVFcnJvcmAncyBgZXJyb3JzYCDigJQgb3duXG4gICAqIE5PTi1lbnVtZXJhYmxlIGtleXMgbm8ga2V5IHdhbGsgc2VlcyDigJQgZWFjaCB3YWxrZWQgdGhlIHNhbWUgd2F5IChhIGN5Y2xlXG4gICAqIGFtb25nIHRoZW0gaXMgZm9sbG93ZWQgb25jZSkuXG4gICAqL1xuICBwcml2YXRlIHRocm93bkNhcnJpZXModmFsdWU6IG9iamVjdCwgc2VlbjogU2V0PG9iamVjdD4pOiBib29sZWFuIHtcbiAgICBpZiAoc2Vlbi5oYXModmFsdWUpKSByZXR1cm4gZmFsc2U7XG4gICAgc2Vlbi5hZGQodmFsdWUpO1xuICAgIGlmIChzZWxlY3RzQnlQYXRoKHZhbHVlLCB1bmRlZmluZWQsIHRoaXMuZG90dGVkVGFyZ2V0cyh1bmRlZmluZWQpLCB0aGlzLm5hbWVzV2FsayhmYWxzZSksIG5ldyBNYXAoKSwgMCkuc2VsZWN0ZWQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBvd24gPSAoa2V5OiBzdHJpbmcpOiB1bmtub3duID0+XG4gICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIGtleSkgPyAodmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0gOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgZXJyb3JzID0gb3duKCdlcnJvcnMnKTtcbiAgICBmb3IgKGNvbnN0IHBhcnQgb2YgW293bignY2F1c2UnKSwgLi4uKEFycmF5LmlzQXJyYXkoZXJyb3JzKSA/IGVycm9ycyA6IFtdKV0pIHtcbiAgICAgIGlmIChwYXJ0ICE9PSBudWxsICYmIHR5cGVvZiBwYXJ0ID09PSAnb2JqZWN0JyAmJiB0aGlzLnRocm93bkNhcnJpZXMocGFydCwgc2VlbikpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGtleS1sZXZlbCBydWxlcyBhcyB0aGUgcGF0aCB3YWxrIGFza3MgdGhlbSAoe0BsaW5rIHNlcnZlZEJ5UGF0aH0pOiBhXG4gICAqIG5lc3RlZCBrZXkgaXMgc2VsZWN0ZWQgYnkgaXRzIG93biBOQU1FIChtYXJrcywga2V5cywgcGF0dGVybnMpLCBhbmQg4oCUIHVuZGVyXG4gICAqIHBhdHRlcm5zIG9ubHkg4oCUIGJ5IGl0cyBkb3R0ZWQgcGF0aDsgYSBkZWNsYXJlZCAob3IgaW5oZXJpdGVkKSBmaWVsZCBiZWxvdyBhXG4gICAqIGtleSBvZiBpdHMgbmFtZSBpcyBhIHRhcmdldC4gRG90dGVkIGtleXMgYW5kIG1hcmtzIGFyZSBUQVJHRVRTIGZyb20gdGhlXG4gICAqIHdhbGsncyByb290ICh7QGxpbmsgZG90dGVkVGFyZ2V0c30pLCBzbyB3aXRob3V0IHBhdHRlcm5zIG5vIGRlY2lzaW9uXG4gICAqIGRlcGVuZHMgb24gdGhlIHBhdGggYW5kIHRoZSB3YWxrIHNoYXJlcyB0aGVtIHBlciBvYmplY3QgKGxpbmVhciBvbiBhIERBRykuXG4gICAqIGByb290RGVjaWRlZGA6IHRoZSByb290J3Mgb3duIGtleXMgd2VyZSBhbHJlYWR5IGRlY2lkZWQgKGByZXRhaW5SZWNvcmRgKS5cbiAgICovXG4gIHByaXZhdGUgbmFtZXNXYWxrKHJvb3REZWNpZGVkOiBib29sZWFuKTogV2FsayB7XG4gICAgY29uc3QgYnlQYXRoID0gdGhpcy5wYXRoUGF0dGVybnM7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWVzOiB7XG4gICAgICAgIG1hc2tzOiAobmFtZSkgPT4gdGhpcy5pc0tleVJlZGFjdGVkKG5hbWUpLFxuICAgICAgICAuLi4oYnlQYXRoLmxlbmd0aCA+IDAgJiYge1xuICAgICAgICAgIHBhdGhNYXNrczogKHBhdGg6IHN0cmluZykgPT4gcGF0aC5sZW5ndGggPD0gTUFYX1BBVFRFUk5fS0VZX0xFTiAmJiBtYXRjaGVzUGF0dGVybihwYXRoLCBieVBhdGgpLFxuICAgICAgICB9KSxcbiAgICAgICAgZmllbGRzOiAobmFtZSkgPT4gdGhpcy5maWVsZHNPZihuYW1lKSxcbiAgICAgIH0sXG4gICAgICByb290RGVjaWRlZCxcbiAgICAgIC4uLihieVBhdGgubGVuZ3RoID09PSAwICYmIHsgbWVtbzogbmV3IFdlYWtNYXA8b2JqZWN0LCBNYXA8c3RyaW5nLCB1bmtub3duPj4oKSB9KSxcbiAgICAgIGJ1ZGdldDogd2Fsa0xpbWl0LFxuICAgICAgb25MaW1pdDogKCkgPT4gdGhpcy53YXJuV2Fsa0xpbWl0KGJ5UGF0aCksXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBPbmNlIHBlciBydWxlLCBpbiBkZXYgbW9kZTogYSBwYXRoIHdhbGsgcGFzc2VkIGl0cyBsaW1pdCBhbmQgc2VydmVkIGl0cyByZW1haW5kZXIgYXMgdGhlIHBsYWNlaG9sZGVyLiAqL1xuICBwcml2YXRlIHdhcm5XYWxrTGltaXQocGF0dGVybnM6IHJlYWRvbmx5IFJlZ0V4cFtdKTogdm9pZCB7XG4gICAgaWYgKHRoaXMud2Fsa0xpbWl0V2FybmVkIHx8ICFpc0Rldk1vZGUoKSkgcmV0dXJuO1xuICAgIHRoaXMud2Fsa0xpbWl0V2FybmVkID0gdHJ1ZTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgIGNvbnNvbGUud2FybihcbiAgICAgIGBbZm9vdHByaW50XSBSZWRhY3Rpb25Qb2xpY3k6IGEgdmFsdWUgd2l0aCBtb3JlIHRoYW4gJHt3YWxrTGltaXR9IHBhdGhzIHVuZGVyIHRoZSBwYXRoIHBhdHRlcm4ocykgYCArXG4gICAgICAgIGAke3BhdHRlcm5zLm1hcChTdHJpbmcpLmpvaW4oJywgJyl9IOKAlCB0aGUgcGF0aHMgcGFzdCB0aGF0IHdlcmUgc2VydmVkIGFzIHRoZSBwbGFjZWhvbGRlci4gYCArXG4gICAgICAgICdBIHBhdHRlcm4gdGhhdCBuYW1lcyBhIEtFWSAobm8gZG90LCBubyBsb29rYXJvdW5kKSBpcyBkZWNpZGVkIHBlciBvYmplY3Q7IHByZWZlciBvbmUsIG9yIGtleXMvZmllbGRzLicsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZG90dGVkIGtleXMgYW5kIG1hcmtzIHRoYXQgbmFtZSBhIHBhdGggdW5kZXIgYGJhc2VgICh0aGUgd2FsaydzIHJvb3Q6XG4gICAqIGB1bmRlZmluZWRgIGZvciBhIHJlY29yZCdzIG93biBrZXlzLCBhbiBlbnRyeSdzIG5hbWUgZm9yIGEgZGlhZ25vc3RpYyksXG4gICAqIGFzIHRhcmdldHMgcmVsYXRpdmUgdG8gaXQg4oCUIGEgZG90dGVkIHJ1bGUgaXMgZXhhY3QgdG8gaXRzIHBhdGguXG4gICAqL1xuICBwcml2YXRlIGRvdHRlZFRhcmdldHMoYmFzZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogVGFyZ2V0W10ge1xuICAgIGNvbnN0IHByZWZpeCA9IGJhc2UgPT09IHVuZGVmaW5lZCA/ICcnIDogYCR7YmFzZX0uYDtcbiAgICBjb25zdCBvdXQ6IFRhcmdldFtdID0gW107XG4gICAgY29uc3QgYWRkID0gKG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKCFuYW1lLmluY2x1ZGVzKCcuJykgfHwgIW5hbWUuc3RhcnRzV2l0aChwcmVmaXgpIHx8IG5hbWUubGVuZ3RoID09PSBwcmVmaXgubGVuZ3RoKSByZXR1cm47XG4gICAgICBvdXQucHVzaChuYW1lLnNsaWNlKHByZWZpeC5sZW5ndGgpLnNwbGl0KCcuJykpO1xuICAgIH07XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIHRoaXMubWFya2VkKSBhZGQobmFtZSk7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIHRoaXMucG9saWN5Py5rZXlzID8/IFtdKSBhZGQobmFtZSk7XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGF0IGFueSBvYnNlcnZlciBpcyBzZXJ2ZWQgZm9yIGEgdGhyb3duIHZhbHVlIOKAlCByZXRyeSwgdGhyb3R0bGUsIHJ1blxuICAgKiBmYWlsdXJlLCBhIGZvcmsgZW52ZWxvcGUsIHRoZSBsb2dnZXI6IGl0cyByZW1lbWJlcmVkIHN0YWdlIGZvcm0sIGVsc2UgdGhlXG4gICAqIHNhbWUgZGVjaXNpb24gbWFkZSBub3cgKGFuZCByZW1lbWJlcmVkKSwgZWxzZSBpdHMgc3RydWN0dXJlZCBpbmZvLlxuICAgKi9cbiAgc2VydmVkRXJyb3IoZXJyb3I6IHVua25vd24pOiBTdHJ1Y3R1cmVkRXJyb3JJbmZvIHtcbiAgICBjb25zdCBtYXNrZWQgPSB0aGlzLm1hc2tlZEVycm9yKGVycm9yKTtcbiAgICAvLyBFYWNoIGV2ZW50IGdldHMgaXRzIG93biBvYmplY3QsIGFzIGV4dHJhY3RFcnJvckluZm8gZ2l2ZXMgaXQgb25lLlxuICAgIHJldHVybiBtYXNrZWQgPyB7IC4uLm1hc2tlZCB9IDogZXh0cmFjdEVycm9ySW5mbyhlcnJvcik7XG4gIH1cblxuICAvKiogV2hhdCB0aGUgbG9nZ2VyIGlzIGhhbmRlZDogdGhlIHRocm93biB2YWx1ZSBpdHNlbGYgdW5sZXNzIHRoZSBwb2xpY3kgbWFza2VkIGl0cyB0ZXh0LiAqL1xuICBsb2dnYWJsZUVycm9yKGVycm9yOiB1bmtub3duKTogdW5rbm93biB7XG4gICAgY29uc3QgbWFza2VkID0gdGhpcy5tYXNrZWRFcnJvcihlcnJvcik7XG4gICAgcmV0dXJuIG1hc2tlZCA/IHsgLi4ubWFza2VkIH0gOiBlcnJvcjtcbiAgfVxuXG4gIHByaXZhdGUgbWFza2VkRXJyb3IoZXJyb3I6IHVua25vd24pOiBTdHJ1Y3R1cmVkRXJyb3JJbmZvIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBrbm93biA9IHRoaXMubWFza2VkRXJyb3JzPy5nZXQoZXJyb3IpO1xuICAgIGlmIChrbm93biB8fCB0aGlzLmlzRGlhZ25vc3RpY0luZXJ0KCkpIHJldHVybiBrbm93bjtcbiAgICBjb25zdCB0ZXh0ID0gdGhyb3duVGV4dChlcnJvcik7XG4gICAgdGhpcy5yZXRhaW5TdGFnZUVycm9yKGVycm9yLCB0ZXh0LCB0aGlzLnJldGFpbkRpYWdub3N0aWMoWydlcnJvcnMnLCAnc3RhZ2VFeGVjdXRpb25FcnJvciddLCB0ZXh0KSk7XG4gICAgcmV0dXJuIHRoaXMubWFza2VkRXJyb3JzPy5nZXQoZXJyb3IpO1xuICB9XG5cbiAgLyoqXG4gICAqIE5vdGhpbmcgY2FuIG1hc2sgYSBkaWFnbm9zdGljIGVudHJ5IG9yIGEgdGhyb3duIHZhbHVlIOKAlCBubyBzdGF0ZSBzZWxlY3RvcixcbiAgICogbm8gbWFyaywgbm8gZGlhZ25vc3RpYyBzZWxlY3RvcjogdGhlIGNvbGxlY3RvcnMnIGFuZCB0aGUgZXJyb3IgcGF0aHMnIGZhc3RcbiAgICogcGF0aCAoYSBuby1wb2xpY3kgcnVuIG5ldmVyIHJlYWRzIGEgcGF5bG9hZCwgaW5jbHVkaW5nIGJvcnJvd2VkIGdldHRlcnMpLlxuICAgKi9cbiAgaXNEaWFnbm9zdGljSW5lcnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNJbmVydCgpICYmIHRoaXMuaXNGbG93VGV4dEluZXJ0KCk7XG4gIH1cblxuICAvKiogTm90aGluZyBjYW4gbWFzayBmbG93LW1lc3NhZ2UgdGV4dCDigJQgb25seSBgcG9saWN5LmRpYWdub3N0aWNzYCBzZWxlY3RzIGl0ICh7QGxpbmsgcmV0YWluRmxvd1RleHR9KS4gKi9cbiAgaXNGbG93VGV4dEluZXJ0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5kaWFnbm9zdGljUnVsZSB8fCB0aGlzLmRpYWdub3N0aWNSdWxlLmlzSW5lcnQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdmVyZGljdCBmb3IgYSB1c2VyLWxldmVsIHBhdGgg4oCUIGBbJ3Byb2ZpbGUnXWAgZm9yIGEgc2NvcGUga2V5LFxuICAgKiBgWydwcm9maWxlJywgJ2F1dGgnXWAgZm9yIGEgbmVzdGVkIHdyaXRlIHN1Y2ggYXMgYSBzdWJmbG93IHNlZWQuXG4gICAqXG4gICAqIEV2ZXJ5IGRvdHRlZCBwcmVmaXggaXMgdGVzdGVkIGF0IGtleSBsZXZlbCAoYHByb2ZpbGVgLCB0aGVuXG4gICAqIGBwcm9maWxlLmF1dGhgKSwgc28gYSBwb2xpY3kgdGhhdCBuYW1lcyBhIGtleSBjb3ZlcnMgZXZlcnl0aGluZyB3cml0dGVuXG4gICAqIGJlbmVhdGggaXQuIGBmaWVsZHNgIGFyZSBkZWNsYXJlZCByZWxhdGl2ZSB0byB0aGUgVE9QIGtleTsgZm9yIGEgbmVzdGVkXG4gICAqIHBhdGggdGhleSBhcmUgcmUtYmFzZWQgb250byB0aGUgdmFsdWUgYmVpbmcgd3JpdHRlbiwgYW5kIGEgZmllbGQgdGhhdFxuICAgKiBuYW1lcyB0aGUgd3JpdHRlbiBwYXRoIGV4YWN0bHkgbWFrZXMgdGhlIHdob2xlIHZhbHVlIHNlY3JldC5cbiAgICovXG4gIHZlcmRpY3QocGF0aDogcmVhZG9ubHkgc3RyaW5nW10pOiBSZWRhY3Rpb25WZXJkaWN0IHtcbiAgICBpZiAocGF0aC5sZW5ndGggPT09IDApIHJldHVybiBDTEVBUjtcbiAgICBpZiAocGF0aC5sZW5ndGggPT09IDEpIHJldHVybiB0aGlzLnZlcmRpY3RPZktleShwYXRoWzBdKTtcbiAgICBsZXQgZG90dGVkID0gJyc7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgICBkb3R0ZWQgPSBpID09PSAwID8gcGF0aFswXSA6IGAke2RvdHRlZH0uJHtwYXRoW2ldfWA7XG4gICAgICBpZiAodGhpcy5pc0tleVJlZGFjdGVkKGRvdHRlZCkpIHJldHVybiB7IGtpbmQ6ICd3aG9sZScsIGtleTogZG90dGVkIH07XG4gICAgfVxuICAgIGNvbnN0IGZpZWxkcyA9IHRoaXMuZmllbGRzT2YocGF0aFswXSk7XG4gICAgaWYgKCFmaWVsZHMgfHwgZmllbGRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIENMRUFSO1xuICAgIGlmIChwYXRoLmxlbmd0aCA9PT0gMSkgcmV0dXJuIHsga2luZDogJ2ZpZWxkcycsIGtleTogcGF0aFswXSwgcGF0aHM6IGZpZWxkcyB9O1xuICAgIGNvbnN0IHJlbCA9IHBhdGguc2xpY2UoMSkuam9pbignLicpO1xuICAgIGNvbnN0IGluc2lkZTogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIGZpZWxkcykge1xuICAgICAgLy8gVGhlIHdyaXR0ZW4gcGF0aCBJUyBhIHNlY3JldCBmaWVsZDogdGhlIHdob2xlIHZhbHVlIGlzIHNlY3JldCwgYW5kXG4gICAgICAvLyB0aGUga2V5IHRoYXQgZGVjaWRlZCBpdCBpcyB0aGF0IGRvdHRlZCBwYXRoIOKAlCBuZXZlciB0aGUgdG9wIGtleSxcbiAgICAgIC8vIHdob3NlIHNpYmxpbmdzIHN0YXkgY2xlYXIuXG4gICAgICBpZiAoZmllbGQgPT09IHJlbCkgcmV0dXJuIHsga2luZDogJ3dob2xlJywga2V5OiBkb3R0ZWQgfTtcbiAgICAgIGlmIChmaWVsZC5zdGFydHNXaXRoKGAke3JlbH0uYCkpIGluc2lkZS5wdXNoKGZpZWxkLnNsaWNlKHJlbC5sZW5ndGggKyAxKSk7XG4gICAgfVxuICAgIHJldHVybiBpbnNpZGUubGVuZ3RoID4gMCA/IHsga2luZDogJ2ZpZWxkcycsIGtleTogcGF0aFswXSwgcGF0aHM6IGluc2lkZSB9IDogQ0xFQVI7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHZlcmRpY3QgZm9yIGBrZXlgIHdyaXR0ZW4gb3IgcmVhZCB1bmRlciBgcGF0aGAg4oCUIHRoZSBjb21tb25cbiAgICogc2luZ2xlLXNlZ21lbnQgY2FzZSAoYHBhdGhgIGVtcHR5OiBldmVyeSBmYWNhZGUgd3JpdGUgYW5kIHJlYWQpIGRlY2lkZXNcbiAgICogb24gdGhlIGtleSBzdHJpbmcgYWxvbmUsIG5vIGFycmF5IGFsbG9jYXRlZC5cbiAgICovXG4gIHZlcmRpY3RBdChwYXRoOiByZWFkb25seSBzdHJpbmdbXSwga2V5OiBzdHJpbmcpOiBSZWRhY3Rpb25WZXJkaWN0IHtcbiAgICByZXR1cm4gcGF0aC5sZW5ndGggPT09IDAgPyB0aGlzLnZlcmRpY3RPZktleShrZXkpIDogdGhpcy52ZXJkaWN0KFsuLi5wYXRoLCBrZXldKTtcbiAgfVxuXG4gIC8qKiBUaGUgc2luZ2xlLXNlZ21lbnQgdmVyZGljdDoga2V5LWxldmVsIGhpdCDihpIgd2hvbGU7IGRlY2xhcmVkIG9yIGluaGVyaXRlZCBmaWVsZHMg4oaSIGZpZWxkcy4gKi9cbiAgcHJpdmF0ZSB2ZXJkaWN0T2ZLZXkoa2V5OiBzdHJpbmcpOiBSZWRhY3Rpb25WZXJkaWN0IHtcbiAgICBpZiAodGhpcy5pc0tleVJlZGFjdGVkKGtleSkpIHJldHVybiB7IGtpbmQ6ICd3aG9sZScsIGtleSB9O1xuICAgIGNvbnN0IGZpZWxkcyA9IHRoaXMuZmllbGRzT2Yoa2V5KTtcbiAgICByZXR1cm4gZmllbGRzICE9PSB1bmRlZmluZWQgJiYgZmllbGRzLmxlbmd0aCA+IDAgPyB7IGtpbmQ6ICdmaWVsZHMnLCBrZXksIHBhdGhzOiBmaWVsZHMgfSA6IENMRUFSO1xuICB9XG5cbiAgLyoqIFRoZSBzZWNyZXQgZmllbGRzIG9mIGEgdG9wIGtleTogdGhlIHBvbGljeSdzLCBwbHVzIGFueSBhIG1hcHBlciBoYW5kZWQgaXQgKHtAbGluayBNYXBwZXJUYWludH0pLiAqL1xuICBwcml2YXRlIGZpZWxkc09mKGtleTogc3RyaW5nKTogcmVhZG9ubHkgc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGRlY2xhcmVkID0gZGVjbGFyZWRGaWVsZHModGhpcy5wb2xpY3k/LmZpZWxkcywga2V5KTtcbiAgICBjb25zdCBpbmhlcml0ZWQgPSB0aGlzLmluaGVyaXRlZD8uZ2V0KGtleSk7XG4gICAgaWYgKGluaGVyaXRlZCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZGVjbGFyZWQ7XG4gICAgcmV0dXJuIGRlY2xhcmVkID09PSB1bmRlZmluZWQgPyBpbmhlcml0ZWQgOiBbLi4ubmV3IFNldChbLi4uZGVjbGFyZWQsIC4uLmluaGVyaXRlZF0pXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcnVuJ3MgbWFya3MgYW5kIHRoZSBmaWVsZHMgbWFwcGVycyBoYW5kZWQgdG8gbmV3IGtleXMsIGFzIE5BTUVTIOKAlCB3aGF0XG4gICAqIGEgcGF1c2UgY2FycmllcyB0byB0aGUgcmVzdW1lZCBydW4gKGBGbG93Y2hhcnRDaGVja3BvaW50LnJlZGFjdGlvbk1hcmtzYCkuXG4gICAqIGB1bmRlZmluZWRgIHdoZW4gdGhlcmUgYXJlIG5vbmUgKG5vIHBvbGljeSwgbm8gcGVyLWNhbGwgbWFyaykuXG4gICAqL1xuICBtYXJrc0ZvckNoZWNrcG9pbnQoKTogUmVkYWN0aW9uTWFya3MgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLm1hcmtlZC5zaXplID09PSAwICYmIHRoaXMuaW5oZXJpdGVkID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtleXM6IFsuLi50aGlzLm1hcmtlZF0sXG4gICAgICAuLi4odGhpcy5pbmhlcml0ZWQgIT09IHVuZGVmaW5lZCAmJiB7XG4gICAgICAgIGZpZWxkczogT2JqZWN0LmZyb21FbnRyaWVzKFsuLi50aGlzLmluaGVyaXRlZF0ubWFwKChba2V5LCBwYXRoc10pID0+IFtrZXksIFsuLi5wYXRoc11dKSksXG4gICAgICB9KSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIFNlZWQgYSByZXN1bWVkIHJ1bidzIHJ1bGUgd2l0aCB0aGUgbWFya3MgaXRzIHBhdXNlIGNhcnJpZWQgKHtAbGluayBtYXJrc0ZvckNoZWNrcG9pbnR9KS4gKi9cbiAgcmVzdG9yZU1hcmtzKG1hcmtzOiBSZWRhY3Rpb25NYXJrcyk6IHZvaWQge1xuICAgIGZvciAoY29uc3Qga2V5IG9mIG1hcmtzLmtleXMpIHRoaXMubWFya2VkLmFkZChrZXkpO1xuICAgIGZvciAoY29uc3QgW2tleSwgcGF0aHNdIG9mIE9iamVjdC5lbnRyaWVzKG1hcmtzLmZpZWxkcyA/PyB7fSkpIHRoaXMuaW5oZXJpdEZpZWxkcyhrZXksIHBhdGhzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHN1YmZsb3cgbWFwcGVyJ3MgY29weSBpbmhlcml0cyB0aGUgZmllbGRzIG9mIHRoZSB2YWx1ZSBpdCBjb3BpZWQ6XG4gICAqIGB0YXJnZXRgIGlzIGEga2V5IHRoZSBtYXBwZXIgd3JvdGU7IGBwYXRoc2AgdGhlIHNvdXJjZSBrZXkncyBmaWVsZCBwYXRoc1xuICAgKiAoZGVjbGFyZWQgb3IgdGhlbXNlbHZlcyBpbmhlcml0ZWQpLiBSdW4td2lkZSwgYnkgbmFtZSwgbGlrZSBhIG1hcmsuXG4gICAqL1xuICBpbmhlcml0RmllbGRzKHRhcmdldDogc3RyaW5nLCBwYXRoczogcmVhZG9ubHkgc3RyaW5nW10pOiB2b2lkIHtcbiAgICBjb25zdCBwcmlvciA9IHRoaXMuaW5oZXJpdGVkPy5nZXQodGFyZ2V0KSA/PyBbXTtcbiAgICAodGhpcy5pbmhlcml0ZWQgPz89IG5ldyBNYXAoKSkuc2V0KHRhcmdldCwgWy4uLm5ldyBTZXQoWy4uLnByaW9yLCAuLi5wYXRoc10pXSk7XG4gIH1cblxuICAvKiogVGhlIHZlcmRpY3Qgb2YgYSBrZXkgYSBtYXBwZXIgcmVhZCDigJQgYHJ1bnNgICh0aGUgcnVuIG5hbWVzcGFjZXMpIGlzIHNlbGVjdGVkIHdoZW4gYW55IG5hbWVzcGFjZWQga2V5IGlzLiAqL1xuICB2ZXJkaWN0T2ZSZWFkKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IFJlZGFjdGlvblZlcmRpY3Qge1xuICAgIGNvbnN0IHZlcmRpY3QgPSB0aGlzLnZlcmRpY3RPZktleShrZXkpO1xuICAgIGlmICh2ZXJkaWN0LmtpbmQgIT09ICdjbGVhcicgfHwga2V5ICE9PSAncnVucycgfHwgdmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgcmV0dXJuIHZlcmRpY3Q7XG4gICAgZm9yIChjb25zdCBzcGFjZSBvZiBPYmplY3QudmFsdWVzKHZhbHVlKSkge1xuICAgICAgaWYgKHNwYWNlID09PSBudWxsIHx8IHR5cGVvZiBzcGFjZSAhPT0gJ29iamVjdCcpIGNvbnRpbnVlO1xuICAgICAgZm9yIChjb25zdCBpbm5lciBvZiBPYmplY3Qua2V5cyhzcGFjZSkpIHtcbiAgICAgICAgaWYgKHRoaXMudmVyZGljdE9mS2V5KGlubmVyKS5raW5kICE9PSAnY2xlYXInKSByZXR1cm4geyBraW5kOiAnd2hvbGUnLCBrZXkgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZlcmRpY3Q7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHJldGFpbmVkIC8gc2VydmVkIGZvcm0gb2YgYSB2YWx1ZSBhdCBhIHBhdGg6IHRoZSBwbGFjZWhvbGRlciwgYVxuICAgKiBzY3J1YmJlZCBDTE9ORSwgb3IgdGhlIHZhbHVlIGl0c2VsZiAoc2FtZSByZWZlcmVuY2Ug4oCUIHJlY29yZGVycyByZWNlaXZlXG4gICAqIGJvcnJvd2VkIGxpdmUgcmVmZXJlbmNlcyBmb3IgY2xlYXIgdmFsdWVzLCBhcyB0aGV5IGFsd2F5cyBoYXZlKS5cbiAgICogYHBsYWNlaG9sZGVyYCBkZWZhdWx0cyB0byB0aGUgc2NvcGUtdGllciBgJ1tSRURBQ1RFRF0nYDsgdGhlIG1pcnJvciBzZWVkXG4gICAqIHBhc3NlcyB0aGUgbG9nJ3MgYCdSRURBQ1RFRCdgLlxuICAgKi9cbiAgcmV0YWluKHBhdGg6IHJlYWRvbmx5IHN0cmluZ1tdLCB2YWx1ZTogdW5rbm93biwgcGxhY2Vob2xkZXI6IHN0cmluZyA9IFNDT1BFX1BMQUNFSE9MREVSKTogdW5rbm93biB7XG4gICAgcmV0dXJuIFJlZGFjdGlvblJ1bGUuYXBwbHkodGhpcy52ZXJkaWN0KHBhdGgpLCB2YWx1ZSwgcGxhY2Vob2xkZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSByZXRhaW5lZCBmb3JtIG9mIGEgU1RBVEUgcmVjb3JkIChzdGF0ZSByZWFkLCBtaXJyb3Igc2VlZCk6IGVhY2ggb3duXG4gICAqIGVudW1lcmFibGUgc3RyaW5nIGtleSB0aHJvdWdoIHtAbGluayByZXRhaW59LiBGaWVsZHMgYXJlIHBhdGhzIGluc2lkZSB0aGF0XG4gICAqIGtleWVkIHZhbHVlLiBTY2FsYXJzIGFuZCByb290IGFycmF5cyBwYXNzIHRocm91Z2guIEJvdW5kYXJ5IHJlY29yZHMgYWRkXG4gICAqIHRoZSBuZXN0ZWQta2V5IHdhbGs6IHtAbGluayByZXRhaW5Cb3VuZGFyeX0uXG4gICAqIFJldHVybnMgdGhlIFNBTUUgb2JqZWN0IHdoZW4gdW5jaGFuZ2VkLiBBbiBpbmVydCBydWxlIGRvZXMgbm90IGVudW1lcmF0ZVxuICAgKiB0aGUgdmFsdWUsIHNvIGV2ZW4gYW4gYWNjZXNzb3IgaXMgdW50b3VjaGVkIG9uIHRoZSBuby1wb2xpY3kgZmFzdCBwYXRoLlxuICAgKi9cbiAgcmV0YWluUmVjb3JkPFQ+KHJlY29yZDogVCwgcGxhY2Vob2xkZXI6IHN0cmluZyA9IFNDT1BFX1BMQUNFSE9MREVSKTogVCB7XG4gICAgaWYgKHRoaXMuaXNJbmVydCgpIHx8IHJlY29yZCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVjb3JkICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHJlY29yZCkpIHJldHVybiByZWNvcmQ7XG4gICAgbGV0IG91dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocmVjb3JkIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSkge1xuICAgICAgY29uc3Qga2VwdCA9IHRoaXMucmV0YWluKFtrZXldLCB2YWx1ZSwgcGxhY2Vob2xkZXIpO1xuICAgICAgaWYgKGtlcHQgPT09IHZhbHVlKSBjb250aW51ZTtcbiAgICAgIG91dCA/Pz0geyAuLi4ocmVjb3JkIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSB9O1xuICAgICAgb3V0W2tleV0gPSBrZXB0O1xuICAgIH1cbiAgICByZXR1cm4gKG91dCA/PyByZWNvcmQpIGFzIFQ7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHJldGFpbmVkIGZvcm0gb2YgYSBCT1VOREFSWSByZWNvcmQg4oCUIHJvb3QgaW5wdXQvb3V0cHV0IGFuZCBhIHN1YmZsb3cnc1xuICAgKiBtYXBwZWQgc2VlZCwgYmVmb3JlIGFueSBvYnNlcnZlciBzZWVzIGl0LiB7QGxpbmsgcmV0YWluUmVjb3JkfSBkZWNpZGVzIGVhY2hcbiAgICogdG9wIGtleTsgdGhlbiBldmVyeSBORVNURUQgb3duIGtleSBpcyBhIGtleSB0b286IHNlY3JldCB3aGVuIGl0cyBvd24gbmFtZVxuICAgKiBvciBpdHMgZG90dGVkIHBhdGggaXMgcmVkYWN0ZWQgYXQga2V5IGxldmVsIChga2V5czogWydzZWNyZXQnXWAgY292ZXJzXG4gICAqIGB7IHdyYXBwZXI6IHsgc2VjcmV0IH0gfWA7IGEgcm9vdCBhcnJheSdzIGVsZW1lbnRzIGFyZSB3YWxrZWQgdGhlIHNhbWVcbiAgICogd2F5KSwgYW5kIGl0cyBkZWNsYXJlZCBgZmllbGRzYCBzY3J1YmJlZCBpbnNpZGUgaXQgKGBmaWVsZHM6IHsgcHJvZmlsZTpcbiAgICogWyd0b2tlbiddIH1gIGNvdmVycyBgeyB3cmFwcGVyOiB7IHByb2ZpbGU6IHsgdG9rZW4gfSB9IH1gKS4gRGVjaWRlZCBwZXJcbiAgICogUEFUSCwgY29weS1vbi13cml0ZSBwZXIgcGF0aCAoe0BsaW5rIHNlcnZlZEJ5UGF0aH0pOiBhbiBvYmplY3Qgc2hhcmVkIGJ5XG4gICAqIHR3byBwYXRocyBpcyBtYXNrZWQgYXQgdGhlIG9uZSBhIHBhdGggcnVsZSBuYW1lcyBhbmQgc2VydmVkIGFzIGl0IGlzIGF0XG4gICAqIHRoZSBvdGhlcjsgYSBjeWNsZSBlZGdlIGxhbmRzIG9uIHRoZSBzZXJ2ZWQgY29weSwgbmV2ZXIgb24gYW4gdW5zY3J1YmJlZFxuICAgKiBvcmlnaW5hbDsgdGhlIGxpdmUgdmFsdWUgaXMgbmV2ZXIgdG91Y2hlZC4gUmV0dXJucyB0aGUgU0FNRSBvYmplY3Qgd2hlblxuICAgKiBub3RoaW5nIG5lc3RlZCBpcyBzZWNyZXQsIGFuZCBhbiBpbmVydCBydWxlIGVudW1lcmF0ZXMgbm90aGluZy4gU3RhdGVcbiAgICoga2VlcHMgaXRzIG93biBwYXRoIHZlcmRpY3RzICh7QGxpbmsgdmVyZGljdH0pOyB0aGlzIHdhbGsgaXMgZm9yIHJlY29yZHNcbiAgICogaGFuZGVkIG91dCB3aG9sZS5cbiAgICovXG4gIHJldGFpbkJvdW5kYXJ5PFQ+KHJlY29yZDogVCwgcGxhY2Vob2xkZXI6IHN0cmluZyA9IFNDT1BFX1BMQUNFSE9MREVSKTogVCB7XG4gICAgLy8gQSBtYXNrZWQgc3RhZ2UgZXJyb3IgaW5zaWRlIHRoZSByZWNvcmQgKGEgZm9yayBlbnZlbG9wZSdzIGByZXN1bHRgKSBpc1xuICAgIC8vIHNlcnZlZCBpbiBpdHMgbWFza2VkIGZvcm06IGFuIEVycm9yJ3MgbWVzc2FnZSBpcyBub24tZW51bWVyYWJsZSBhbmQgYVxuICAgIC8vIHRocm93biBzdHJpbmcgaXMgYSBwbGFpbiB2YWx1ZSwgc28gbm8ga2V5IHdhbGsgc2VlcyBlaXRoZXIuXG4gICAgY29uc3Qgc2VydmVkID0gdGhpcy5tYXNrZWRFcnJvcnM/LnNpemUgPyAodGhpcy53aXRoU2VydmVkRXJyb3JzKHJlY29yZCkgYXMgVCkgOiByZWNvcmQ7XG4gICAgaWYgKHRoaXMuaXNJbmVydCgpIHx8IHNlcnZlZCA9PT0gbnVsbCB8fCB0eXBlb2Ygc2VydmVkICE9PSAnb2JqZWN0JykgcmV0dXJuIHNlcnZlZDtcbiAgICBjb25zdCB0b3AgPSB0aGlzLnJldGFpblJlY29yZChzZXJ2ZWQsIHBsYWNlaG9sZGVyKSBhcyB1bmtub3duIGFzIG9iamVjdDtcbiAgICAvLyBCZWxvdyB0aGUgdG9wIGtleXMsIG9uZSBkZWNpc2lvbiBwZXIgUEFUSCAodGhlIHdob2xlIHJlY29yZCBpcyB0aGUgd2FsaydzIHJvb3QsIHNvIGEgY3ljbGVcbiAgICAvLyBiYWNrIHRvIGl0IGxhbmRzIG9uIHRoZSBzZXJ2ZWQgY29weSkuXG4gICAgcmV0dXJuIHNlcnZlZEJ5UGF0aCh0b3AsIHVuZGVmaW5lZCwgdGhpcy5kb3R0ZWRUYXJnZXRzKHVuZGVmaW5lZCksIHRoaXMubmFtZXNXYWxrKHRydWUpLCBwbGFjZWhvbGRlcikgYXMgVDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb3B5LW9uLXdyaXRlIG92ZXIgY29udGFpbmVyczogZXZlcnkgcmVtZW1iZXJlZCBtYXNrZWQgZXJyb3IgYmVjb21lcyBpdHNcbiAgICogc2VydmVkIGZvcm0g4oCUIGFuIG9iamVjdCBlcnJvciBpdHMgbWFza2VkIHN0cnVjdHVyZWQgaW5mbywgYSB0aHJvd25cbiAgICogc3RyaW5nL251bWJlciBpdHMgbWFza2VkIHRleHQgKHRoZSB2YWx1ZSBrZWVwcyBiZWluZyBhIHNjYWxhcikuIEEgc2NhbGFyIGlzXG4gICAqIG1hdGNoZWQgYnkgVkFMVUUsIHNvIGFuIHVucmVsYXRlZCBmaWVsZCB0aGF0IGhhcHBlbnMgdG8gZXF1YWwgYSBtYXNrZWRcbiAgICogdGhyb3duIHN0cmluZyBpcyBtYXNrZWQgdG9vOiBvdmVyLW1hc2tpbmcgaXMgdGhlIHNhZmUgZGlyZWN0aW9uLlxuICAgKiBgdW5kZWZpbmVkYC9gbnVsbGAvYm9vbGVhbnMgYXJlIG5ldmVyIHN3YXBwZWQg4oCUIHRoZXkgY2Fycnkgbm8gdGV4dCwgYW5kXG4gICAqIHN3YXBwaW5nIHRoZW0gd291bGQgcmV3cml0ZSBvcmRpbmFyeSBkYXRhIHNoYXBlcy5cbiAgICpcbiAgICogQ1lDTEUtU0FGRSAocmV2aWV3IGZpbmRpbmcgMikuIFRoZSBjb250YWluZXJzIHRoYXQgY2FuIFJFQUNIIGEgbWFza2VkXG4gICAqIGVycm9yIGFyZSBmb3VuZCBmaXJzdCAoe0BsaW5rIHJlYWNoaW5nTWFza2VkRXJyb3JzfSDigJQgdGhlIHdob2xlIHJlYWNoYWJsZVxuICAgKiBncmFwaCwgY3ljbGVzIGluY2x1ZGVkKTsgZWFjaCBvZiB0aGVtIGlzIGNvcGllZCwgaXRzIGNvcHkgYWxsb2NhdGVkIGFuZFxuICAgKiByZW1lbWJlcmVkIEJFRk9SRSBpdHMgY2hpbGRyZW4gYXJlIGZpbGxlZCwgc28gYW4gZWRnZSBiYWNrIHRvIGl0IOKAlCBhIGN5Y2xlXG4gICAqIOKAlCBsYW5kcyBvbiB0aGUgY29weSwgbmV2ZXIgb24gdGhlIG9yaWdpbmFsIHRoYXQgc3RpbGwgaG9sZHMgdGhlIHJhdyBlcnJvci5cbiAgICogRXZlcnkgb3RoZXIgY29udGFpbmVyIGtlZXBzIGl0cyBpZGVudGl0eS5cbiAgICovXG4gIHByaXZhdGUgd2l0aFNlcnZlZEVycm9ycyh2YWx1ZTogdW5rbm93bik6IHVua25vd24ge1xuICAgIGNvbnN0IGxlYWYgPSB0aGlzLnNlcnZlZExlYWYodmFsdWUpO1xuICAgIGlmIChsZWFmICE9PSBLRUVQIHx8IHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHJldHVybiBsZWFmID09PSBLRUVQID8gdmFsdWUgOiBsZWFmO1xuICAgIGNvbnN0IHJlYWNoaW5nID0gdGhpcy5yZWFjaGluZ01hc2tlZEVycm9ycyh2YWx1ZSk7XG4gICAgaWYgKCFyZWFjaGluZy5oYXModmFsdWUpKSByZXR1cm4gdmFsdWU7XG4gICAgY29uc3QgY29waWVzID0gbmV3IE1hcDxvYmplY3QsIFJlY29yZDxzdHJpbmcsIHVua25vd24+PigpO1xuICAgIGNvbnN0IGNvcHlPZiA9IChub2RlOiBvYmplY3QpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiB7XG4gICAgICBjb25zdCBrbm93biA9IGNvcGllcy5nZXQobm9kZSk7XG4gICAgICBpZiAoa25vd24gIT09IHVuZGVmaW5lZCkgcmV0dXJuIGtub3duO1xuICAgICAgY29uc3QgY29weSA9IChBcnJheS5pc0FycmF5KG5vZGUpID8gbm9kZS5zbGljZSgpIDogeyAuLi5ub2RlIH0pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgY29waWVzLnNldChub2RlLCBjb3B5KTtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgY2hpbGRdIG9mIE9iamVjdC5lbnRyaWVzKG5vZGUpKSB7XG4gICAgICAgIGNvbnN0IHNlcnZlZCA9IHRoaXMuc2VydmVkTGVhZihjaGlsZCk7XG4gICAgICAgIGlmIChzZXJ2ZWQgIT09IEtFRVApIGNvcHlba2V5XSA9IHNlcnZlZDtcbiAgICAgICAgZWxzZSBpZiAoY2hpbGQgIT09IG51bGwgJiYgdHlwZW9mIGNoaWxkID09PSAnb2JqZWN0JyAmJiByZWFjaGluZy5oYXMoY2hpbGQpKSBjb3B5W2tleV0gPSBjb3B5T2YoY2hpbGQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvcHk7XG4gICAgfTtcbiAgICByZXR1cm4gY29weU9mKHZhbHVlKTtcbiAgfVxuXG4gIC8qKiBBIG1hc2tlZCBlcnJvcidzIHNlcnZlZCBmb3JtIOKAlCBgS0VFUGAgZm9yIGFueXRoaW5nIGVsc2UgKGEgc2NhbGFyIG5ldmVyIHN3YXBwZWQsIGEgY29udGFpbmVyKS4gKi9cbiAgcHJpdmF0ZSBzZXJ2ZWRMZWFmKHZhbHVlOiB1bmtub3duKTogdW5rbm93biB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHJldHVybiBLRUVQO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICBjb25zdCBtYXNrZWQgPSB0aGlzLm1hc2tlZEVycm9ycz8uZ2V0KHZhbHVlKTtcbiAgICAgIHJldHVybiBtYXNrZWQgPyB7IC4uLm1hc2tlZCB9IDogS0VFUDtcbiAgICB9XG4gICAgY29uc3Qgc3dhcHBhYmxlID0gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2JpZ2ludCc7XG4gICAgY29uc3QgbWFza2VkID0gc3dhcHBhYmxlID8gdGhpcy5tYXNrZWRFcnJvcnM/LmdldCh2YWx1ZSkgOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIG1hc2tlZCA/IG1hc2tlZC5tZXNzYWdlIDogS0VFUDtcbiAgfVxuXG4gIC8qKiBFdmVyeSBjb250YWluZXIgdW5kZXIgYHJvb3RgIChpdHNlbGYgaW5jbHVkZWQpIGZyb20gd2hpY2ggc29tZSBwYXRoIHJlYWNoZXMgYSBtYXNrZWQgZXJyb3IuICovXG4gIHByaXZhdGUgcmVhY2hpbmdNYXNrZWRFcnJvcnMocm9vdDogb2JqZWN0KTogU2V0PG9iamVjdD4ge1xuICAgIGNvbnN0IHBhcmVudHMgPSBuZXcgTWFwPG9iamVjdCwgb2JqZWN0W10+KCk7XG4gICAgY29uc3QgaG9sZGVyczogb2JqZWN0W10gPSBbXTtcbiAgICBjb25zdCBzZWVuID0gbmV3IFNldDxvYmplY3Q+KFtyb290XSk7XG4gICAgY29uc3Qgc3RhY2s6IG9iamVjdFtdID0gW3Jvb3RdO1xuICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBub2RlID0gc3RhY2sucG9wKCkhO1xuICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBPYmplY3QudmFsdWVzKG5vZGUpKSB7XG4gICAgICAgIGlmICh0aGlzLnNlcnZlZExlYWYoY2hpbGQpICE9PSBLRUVQKSB7XG4gICAgICAgICAgaG9sZGVycy5wdXNoKG5vZGUpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGlsZCA9PT0gbnVsbCB8fCB0eXBlb2YgY2hpbGQgIT09ICdvYmplY3QnKSBjb250aW51ZTtcbiAgICAgICAgY29uc3Qgb2YgPSBwYXJlbnRzLmdldChjaGlsZCk7XG4gICAgICAgIGlmIChvZiA9PT0gdW5kZWZpbmVkKSBwYXJlbnRzLnNldChjaGlsZCwgW25vZGVdKTtcbiAgICAgICAgZWxzZSBvZi5wdXNoKG5vZGUpO1xuICAgICAgICBpZiAoIXNlZW4uaGFzKGNoaWxkKSkge1xuICAgICAgICAgIHNlZW4uYWRkKGNoaWxkKTtcbiAgICAgICAgICBzdGFjay5wdXNoKGNoaWxkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByZWFjaGluZyA9IG5ldyBTZXQ8b2JqZWN0PigpO1xuICAgIHdoaWxlIChob2xkZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG5vZGUgPSBob2xkZXJzLnBvcCgpITtcbiAgICAgIGlmIChyZWFjaGluZy5oYXMobm9kZSkpIGNvbnRpbnVlO1xuICAgICAgcmVhY2hpbmcuYWRkKG5vZGUpO1xuICAgICAgaG9sZGVycy5wdXNoKC4uLihwYXJlbnRzLmdldChub2RlKSA/PyBbXSkpO1xuICAgIH1cbiAgICByZXR1cm4gcmVhY2hpbmc7XG4gIH1cblxuICAvKiogRG9lcyBgdmFsdWVgIGhvbGQgb25lIG9mIGBwYXRoc2Ag4oCUIGFuIG93biBrZXkgb2YgdGhhdCBuYW1lLCBvciBhIGRvdHRlZCBwYXRoIGluc2lkZSBpdD8gKi9cbiAgc3RhdGljIGhvbGRzUGF0aHModmFsdWU6IG9iamVjdCwgcGF0aHM6IHJlYWRvbmx5IHN0cmluZ1tdIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gICAgaWYgKHBhdGhzID09PSB1bmRlZmluZWQpIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IHBhdGggb2YgcGF0aHMpIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIHBhdGgpIHx8IChwYXRoLmluY2x1ZGVzKCcuJykgJiYgbmF0aXZlSGFzKHZhbHVlLCBwYXRoKSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmV0YWluZWQgZm9ybSBvZiBhIHdob2xlIFNUQVRFIOKAlCB7QGxpbmsgcmV0YWluUmVjb3JkfSBvdmVyIHRoZSByb290XG4gICAqIGtleXMgQU5EIG92ZXIgZXZlcnkgcnVuIG5hbWVzcGFjZSB1bmRlciBgcnVuc2AgKGZvcmsgY2hpbGRyZW4gd3JpdGVcbiAgICogdGhlcmU7IGEgY2hlY2twb2ludCdzIGBzaGFyZWRTdGF0ZWAgY2FycmllcyBpdCBiYWNrIGFzIGEgc2VlZCkuIFRoaXMgaXNcbiAgICogd2hhdCBzZWVkcyB0aGUgcmVkYWN0ZWQgbWlycm9yOiB0aGUgc3RvcmUncyBzdGFydGluZyBzdGF0ZSwgc2NydWJiZWRcbiAgICogd2l0aCB0aGUgbG9nJ3MgcGxhY2Vob2xkZXIsIHNvIGEgcG9saWN5IGtleSB0aGF0IGFycml2ZXMgYnkgc2VlZCBhbmQgaXNcbiAgICogbmV2ZXIgcmUtd3JpdHRlbiBpcyBzdGlsbCBzZXJ2ZWQgYXMgdGhlIHBsYWNlaG9sZGVyLlxuICAgKi9cbiAgcmV0YWluU3RhdGU8VD4oc3RhdGU6IFQsIHBsYWNlaG9sZGVyOiBzdHJpbmcgPSBTQ09QRV9QTEFDRUhPTERFUik6IFQge1xuICAgIGNvbnN0IGtlcHQgPSB0aGlzLnJldGFpblJlY29yZChzdGF0ZSwgcGxhY2Vob2xkZXIpO1xuICAgIGlmIChrZXB0ID09PSBudWxsIHx8IHR5cGVvZiBrZXB0ICE9PSAnb2JqZWN0JykgcmV0dXJuIGtlcHQ7XG4gICAgY29uc3QgcnVucyA9IChrZXB0IGFzIHsgcnVucz86IHVua25vd24gfSkucnVucztcbiAgICBpZiAocnVucyA9PT0gbnVsbCB8fCB0eXBlb2YgcnVucyAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShydW5zKSkgcmV0dXJuIGtlcHQ7XG4gICAgbGV0IHNjcnViYmVkUnVuczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgZm9yIChjb25zdCBbcnVuSWQsIHJlY29yZF0gb2YgT2JqZWN0LmVudHJpZXMocnVucyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikpIHtcbiAgICAgIGNvbnN0IGtlcHRSdW4gPSB0aGlzLnJldGFpblJlY29yZChyZWNvcmQsIHBsYWNlaG9sZGVyKTtcbiAgICAgIGlmIChrZXB0UnVuID09PSByZWNvcmQpIGNvbnRpbnVlO1xuICAgICAgc2NydWJiZWRSdW5zID8/PSB7IC4uLihydW5zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSB9O1xuICAgICAgc2NydWJiZWRSdW5zW3J1bklkXSA9IGtlcHRSdW47XG4gICAgfVxuICAgIHJldHVybiBzY3J1YmJlZFJ1bnMgPT09IHVuZGVmaW5lZCA/IGtlcHQgOiAoeyAuLi4oa2VwdCBhcyBvYmplY3QpLCBydW5zOiBzY3J1YmJlZFJ1bnMgfSBhcyBUKTtcbiAgfVxuXG4gIC8qKiBBcHBseSBhIHZlcmRpY3QgdG8gYSB2YWx1ZSDigJQgc2VlIHtAbGluayByZXRhaW59LiAqL1xuICBzdGF0aWMgYXBwbHkodmVyZGljdDogUmVkYWN0aW9uVmVyZGljdCwgdmFsdWU6IHVua25vd24sIHBsYWNlaG9sZGVyOiBzdHJpbmcgPSBTQ09QRV9QTEFDRUhPTERFUik6IHVua25vd24ge1xuICAgIGlmICh2ZXJkaWN0LmtpbmQgPT09ICd3aG9sZScpIHJldHVybiBwbGFjZWhvbGRlcjtcbiAgICBpZiAodmVyZGljdC5raW5kID09PSAnZmllbGRzJykgcmV0dXJuIFJlZGFjdGlvblJ1bGUuc2NydWJGaWVsZHModmFsdWUsIHZlcmRpY3QucGF0aHMsIHBsYWNlaG9sZGVyKSA/PyB2YWx1ZTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogQSBkZWVwIGNsb25lIG9mIGB2YWx1ZWAgd2l0aCB0aGUgZ2l2ZW4gZG90LXBhdGhzIHJlcGxhY2VkIGJ5IHRoZVxuICAgKiBwbGFjZWhvbGRlciDigJQgYHVuZGVmaW5lZGAgd2hlbiBgdmFsdWVgIGlzIG5vdCBhbiBvYmplY3QgKHRoZXJlIGlzIG5vdGhpbmdcbiAgICogdG8gc2NydWIgaW4gYSBzY2FsYXI7IHRoZSBjYWxsZXIga2VlcHMgdGhlIHZhbHVlKS4gVGhlIGNsb25lIHJlZnVzZXMgYW5cbiAgICogdW5jbG9uZWFibGUgdmFsdWUuIEEgcGF0aCBuYW1lcyBhIGxpdGVyYWwga2V5IChgJ2EuYidgIGFzIG9uZSBwcm9wZXJ0eSlcbiAgICogYW5kLCB3aGVuIGRvdHRlZCwgdGhlIG5lc3RlZCBwYXRoOyBlYWNoIGlzIHNjcnViYmVkIHdoZXJlIGl0IGV4aXN0cywgcGVyXG4gICAqIFBBVEgg4oCUIGEgbm9kZSB0aGUgY2xvbmUgc2hhcmVzIGJldHdlZW4gdHdvIHBhdGhzIGlzIG1hc2tlZCBhdCB0aGUgbmFtZWRcbiAgICogb25lIG9ubHkgKHtAbGluayBzZXJ2ZWRCeVBhdGh9KS4gUGF0aHMgdGhhdCBkbyBub3QgZXhpc3QgYXJlIGlnbm9yZWQg4oCUXG4gICAqIHNjcnViYmluZyBuZXZlciBpbnZlbnRzIGEgZmllbGQuXG4gICAqL1xuICBzdGF0aWMgc2NydWJGaWVsZHMoXG4gICAgdmFsdWU6IHVua25vd24sXG4gICAgcGF0aHM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICAgIHBsYWNlaG9sZGVyOiBzdHJpbmcgPSBTQ09QRV9QTEFDRUhPTERFUixcbiAgKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIC8vIFRoZSBjbG9uZSBkZXRhY2hlcyB0aGUgcmV0YWluZWQgdmFsdWUgKGFuZCByZWZ1c2VzIGFuIHVuY2xvbmVhYmxlIG9uZSk7IHRoZSBzY3J1YiBvbiBpdCBpc1xuICAgIC8vIGRlY2lkZWQgcGVyIFBBVEgsIHNvIGEgbm9kZSB0aGUgY2xvbmUgc2hhcmVzIGJldHdlZW4gdHdvIHBhdGhzIGlzIG1hc2tlZCBhdCB0aGUgbmFtZWQgb25lIG9ubHkuXG4gICAgY29uc3QgY29weSA9IHN0cnVjdHVyZWRDbG9uZSh2YWx1ZSkgYXMgb2JqZWN0O1xuICAgIHJldHVybiBzZXJ2ZWRCeVBhdGgoXG4gICAgICBjb3B5LFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdGFyZ2V0c09mKHBhdGhzKSxcbiAgICAgIHsgcm9vdERlY2lkZWQ6IGZhbHNlLCBtZW1vOiBuZXcgV2Vha01hcDxvYmplY3QsIE1hcDxzdHJpbmcsIHVua25vd24+PigpLCBidWRnZXQ6IHdhbGtMaW1pdCB9LFxuICAgICAgcGxhY2Vob2xkZXIsXG4gICAgKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgfVxuXG4gIHJlcG9ydCgpOiBSZWRhY3Rpb25SZXBvcnQge1xuICAgIC8vIEtleWVkIGJ5IGEgTWFwLCB0aGVuIG1hZGUgb3duIGRhdGEga2V5cyBieSBgZnJvbUVudHJpZXNgOiBhIGtleSBhIG1hcHBlclxuICAgIC8vIHdyb3RlIGlzIGEgbmFtZSBmcm9tIGRhdGEsIGFuZCBvbiBhIHBsYWluIG9iamVjdCBgdG9TdHJpbmdgIHdvdWxkIHJlYWRcbiAgICAvLyB0aGUgaW5oZXJpdGVkIG1ldGhvZCBhbmQgYF9fcHJvdG9fX2Agd291bGQgY2FsbCB0aGUgcHJvdG90eXBlIHNldHRlci5cbiAgICBjb25zdCBmaWVsZFJlZGFjdGlvbnMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nW10+KCk7XG4gICAgZm9yIChjb25zdCBba2V5LCBmaWVsZHNdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMucG9saWN5Py5maWVsZHMgPz8ge30pKSB7XG4gICAgICBmaWVsZFJlZGFjdGlvbnMuc2V0KGtleSwgWy4uLmZpZWxkc10pO1xuICAgIH1cbiAgICAvLyBGaWVsZHMgYSBtYXBwZXIgaGFuZGVkIHRvIGEgbmV3IGtleSBhcmUgc2NydWJiZWQgdW5kZXIgdGhhdCBrZXkgdG9vLlxuICAgIGZvciAoY29uc3QgW2tleSwgZmllbGRzXSBvZiB0aGlzLmluaGVyaXRlZCA/PyBbXSkge1xuICAgICAgZmllbGRSZWRhY3Rpb25zLnNldChrZXksIFsuLi5uZXcgU2V0KFsuLi4oZmllbGRSZWRhY3Rpb25zLmdldChrZXkpID8/IFtdKSwgLi4uZmllbGRzXSldKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlZGFjdGVkS2V5czogWy4uLnRoaXMubWFya2VkXSxcbiAgICAgIGZpZWxkUmVkYWN0aW9uczogT2JqZWN0LmZyb21FbnRyaWVzKGZpZWxkUmVkYWN0aW9ucyksXG4gICAgICBwYXR0ZXJuczogKHRoaXMucG9saWN5Py5wYXR0ZXJucyA/PyBbXSkubWFwKChwKSA9PiBwLnNvdXJjZSksXG4gICAgfTtcbiAgfVxufVxuXG4vLyDilIDilIDilIAgVGhlIHBhdGggd2FsayDigJQgb25lIGRlY2lzaW9uIHBlciBQQVRIIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy9cbi8vIEEgcnVsZSB0aGF0IG5hbWVzIGEgUEFUSCAoYSBkb3R0ZWQga2V5LCBhIHBhdHRlcm4sIGEgZmllbGQpIG11c3QgYmUgZXhhY3Rcbi8vIGV2ZW4gd2hlbiBvbmUgb2JqZWN0IGlzIHJlYWNoYWJsZSBhdCB0d28gcGF0aHM6IHRoZSBkZWNpc2lvbiBpcyBtYWRlIHBlclxuLy8gcGF0aCwgbmV2ZXIgcGVyIG9iamVjdCwgYW5kIGEgY29weSBpcyBtYWRlIHBlciBwYXRoIChjb3B5LW9uLXdyaXRlKSDigJQgbmV2ZXJcbi8vIGEgc2NydWIgaW4gcGxhY2Ugb24gYSBub2RlIGFub3RoZXIgcGF0aCBzdGlsbCBzaG93cy4gQSBrZXktTkFNRSBydWxlIGlzIHRoZVxuLy8gc2FtZSBhdCBldmVyeSBwYXRoLCBzbyBhIHNoYXJlZCBub2RlIGl0IG1hc2tzIGlzIG1hc2tlZCBldmVyeXdoZXJlIOKAlCB0aGVcbi8vIHNhZmUgc2lkZS4gQSBjeWNsZSBlZGdlIGlzIG5vdCBmb2xsb3dlZDogaXQgaXMgcG9pbnRlZCBhdCB0aGUgYW5jZXN0b3Inc1xuLy8gc2VydmVkIGNvcHkuXG4vL1xuLy8gTElORUFSIE9OIEEgREFHLiBEb3R0ZWQga2V5cyBhbmQgbWFya3MgYXJlIHdhbGtlZCBhcyBUQVJHRVRTIChwYXRoLXJlbGF0aXZlXG4vLyBzdGF0ZSwgbGlrZSBmaWVsZHMpLCBhbmQgYSBwYXR0ZXJuIHRoYXQgY2FuIG9ubHkgbWF0Y2ggd2l0aGluIGEga2V5IE5BTUVcbi8vICh7QGxpbmsgbmVlZHNQYXRofSDigJQgdGhlIGNvbW1vbiBjYXNlLCBgL3Bhc3N3b3JkL2lgKSBpcyBkZWNpZGVkIGJ5IHRoZSBuYW1lLFxuLy8gc28gYSBkZWNpc2lvbiBkZXBlbmRzIG9ubHkgb24gdGhlIG9iamVjdCBhbmQgdGhlIHRhcmdldHMgc3RpbGwgbGl2ZSBhdCBpdCDigJRcbi8vIG1lbW9pemVkIHBlciAob2JqZWN0LCB0YXJnZXRzKTogYW4gb2JqZWN0IHNoYXJlZCBieSBtYW55IHBhdGhzIChhbiBhZ2VudCdzXG4vLyBsaW5rZWQgaGlzdG9yeSkgaXMgZGVjaWRlZCBvbmNlLCBhbmQgaXRzIHNlcnZlZCBjb3B5IGlzIHNoYXJlZCB0b28uIE9ubHkgYVxuLy8gZ2VudWluZWx5IFBBVEgtZGVwZW5kZW50IHBhdHRlcm4gKGAvXmFcXC5iJC9gKSB3YWxrcyBwYXRoczsgcGFzdFxuLy8ge0BsaW5rIFdBTEtfTElNSVR9IHBhdGggdmlzaXRzIHN1Y2ggYSB3YWxrIHNlcnZlcyB0aGUgdW52aXNpdGVkIHJlbWFpbmRlciBhc1xuLy8gdGhlIHBsYWNlaG9sZGVyICh0aGUgc2FmZSBzaWRlKSwgd2FybnMgb25jZSBpbiBkZXYgbW9kZSwgYW5kIG5ldmVyIGZhaWxzLlxuXG4vKiogQSBmaWVsZCBzdGlsbCB0byByZWFjaCBiZWxvdyBhIG5vZGU6IHRoZSBwYXRoIHNlZ21lbnRzIGxlZnQgdG8gd2Fsay4gKi9cbnR5cGUgVGFyZ2V0ID0gcmVhZG9ubHkgc3RyaW5nW107XG5cbi8qKiBIb3cgYSB3YWxrIGRlY2lkZXMgYW4gZWRnZS4gKi9cbmludGVyZmFjZSBXYWxrIHtcbiAgLyoqIEtleS1sZXZlbCBydWxlcyBhdCBldmVyeSBuZXN0ZWQga2V5IOKAlCBhYnNlbnQgZm9yIGEgYmFyZSBmaWVsZCBzY3J1YiAodGFyZ2V0cyBvbmx5KS4gKi9cbiAgcmVhZG9ubHkgbmFtZXM/OiB7XG4gICAgLyoqIFNlbGVjdGVkIHdob2xlIGF0IHRoaXMgbmVzdGVkIGtleSBieSBpdHMgb3duIE5BTUUgKG1hcmtzLCBrZXlzLCBwYXR0ZXJucykuICovXG4gICAgbWFza3MobmFtZTogc3RyaW5nKTogYm9vbGVhbjtcbiAgICAvKiogU2VsZWN0ZWQgd2hvbGUgYnkgdGhlIGRvdHRlZCBQQVRIIOKAlCBwcmVzZW50IG9ubHkgdW5kZXIgcGF0dGVybnMgKGEgcGF0dGVybiBpcyB0ZXN0ZWQgb24gdGhlIHBhdGgpLiAqL1xuICAgIHBhdGhNYXNrcz8ocGF0aDogc3RyaW5nKTogYm9vbGVhbjtcbiAgICAvKiogVGhlIGRlY2xhcmVkIGZpZWxkcyBiZWxvdyBhIGtleSBvZiB0aGlzIG5hbWUuICovXG4gICAgZmllbGRzKG5hbWU6IHN0cmluZyk6IHJlYWRvbmx5IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuICB9O1xuICAvKiogVGhlIHJvb3QncyBvd24ga2V5cyB3ZXJlIGRlY2lkZWQgYnkgdGhlIGNhbGxlciAoYHJldGFpblJlY29yZGApOiB3YWxrIGJlbG93IHRoZW0gb25seS4gKi9cbiAgcmVhZG9ubHkgcm9vdERlY2lkZWQ6IGJvb2xlYW47XG4gIC8qKiBEZWNpc2lvbnMgc2hhcmVkIHBlciAob2JqZWN0LCB0YXJnZXRzKSDigJQgYWJzZW50IHdoZW4gYSBkZWNpc2lvbiBkZXBlbmRzIG9uIHRoZSBwYXRoLiAqL1xuICByZWFkb25seSBtZW1vPzogV2Vha01hcDxvYmplY3QsIE1hcDxzdHJpbmcsIHVua25vd24+PjtcbiAgLyoqIFBhdGggdmlzaXRzIGxlZnQuICovXG4gIGJ1ZGdldDogbnVtYmVyO1xuICAvKiogVG9sZCBvbmNlIHdoZW4gdGhlIHdhbGsgcGFzc2VzIGl0cyBsaW1pdC4gKi9cbiAgcmVhZG9ubHkgb25MaW1pdD86ICgpID0+IHZvaWQ7XG4gIC8qKiBUaGUgd2FsayBoYXMgcGFzc2VkIGl0cyBsaW1pdDogd2hhdCBpdCBoYXMgbm90IHZpc2l0ZWQgaXMgc2VydmVkIGFzIHRoZSBwbGFjZWhvbGRlci4gKi9cbiAgbGltaXRlZD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGF0aCB2aXNpdHMgb25lIHdhbGsgbWF5IG1ha2Ug4oCUIHJlYWNoYWJsZSBvbmx5IHVuZGVyIGEgUEFUSC1kZXBlbmRlbnRcbiAqIHBhdHRlcm4gb3ZlciBhIHZhbHVlIHdob3NlIHBhdGhzIG91dG51bWJlciBpdHMgb2JqZWN0cyAoYSBsaW5rZWQgaGlzdG9yeSwgYVxuICogREFHKTogZXZlcnkgb3RoZXIgd2FsayBzaGFyZXMgaXRzIGRlY2lzaW9ucyBwZXIgb2JqZWN0IGFuZCBzdGF5cyBsaW5lYXIuXG4gKi9cbmV4cG9ydCBjb25zdCBXQUxLX0xJTUlUID0gMV8wMDBfMDAwO1xuXG4vKiogVGhlIGxpbWl0IHdhbGtzIHVzZToge0BsaW5rIFdBTEtfTElNSVR9LCB1bmxlc3MgYSB0ZXN0IGxvd2VyZWQgaXQgKHtAbGluayB1c2VXYWxrTGltaXR9KS4gKi9cbmxldCB3YWxrTGltaXQ6IG51bWJlciA9IFdBTEtfTElNSVQ7XG5cbi8qKlxuICogQGludGVybmFsIFRlc3RzIG9ubHkg4oCUIG5vdCBvbiBhbnkgcHVibGljIGRvb3I6IHdhbGtzIHVzZSBgbGltaXRgIHVudGlsIHRoZVxuICogcmV0dXJuZWQgcmVzdG9yZSBpcyBjYWxsZWQsIHNvIGEgdGVzdCByZWFjaGVzIHRoZSBvdmVyLWxpbWl0IHBhdGggaW4gYVxuICogdGhvdXNhbmQgdmlzaXRzIGluc3RlYWQgb2YgYSBtaWxsaW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlV2Fsa0xpbWl0KGxpbWl0OiBudW1iZXIpOiAoKSA9PiB2b2lkIHtcbiAgY29uc3QgcHJpb3IgPSB3YWxrTGltaXQ7XG4gIHdhbGtMaW1pdCA9IGxpbWl0O1xuICByZXR1cm4gKCkgPT4ge1xuICAgIHdhbGtMaW1pdCA9IHByaW9yO1xuICB9O1xufVxuXG4vKipcbiAqIENhbiBgcGF0dGVybmAgbWF0Y2ggYSBkb3R0ZWQgUEFUSCB3aGVyZSBpdCBtYXRjaGVzIG5vbmUgb2YgdGhlIHBhdGgnc1xuICogc2VnbWVudCBOQU1FUz8gT25seSB0aHJvdWdoIGEgY29uc3RydWN0IHRoYXQgY2FuIG1hdGNoIG9yIHRlc3QgdGhlIGAuYFxuICogYmV0d2VlbiBzZWdtZW50czogYC5gIGl0c2VsZiwgYW4gZXNjYXBlIHRoYXQgY2FuIHN0YW5kIGZvciBpdCAoYFxcVyBcXFMgXFxEXG4gKiBcXEIgXFxwIFxcUCBcXHUgXFx4IFxcY2AsIGEgZGlnaXQgZXNjYXBlKSwgYSBuZWdhdGVkIGNsYXNzLCBhIGNsYXNzIHJhbmdlIHRoYXRcbiAqIHNwYW5zIGAuYCwgYSBsb29rYXJvdW5kIG9yIGEgbmFtZWQgZ3JvdXAuIEFueXRoaW5nIGVsc2UgbWF0Y2hlcyBhIHBhdGggb25seVxuICogaW5zaWRlIG9uZSBzZWdtZW50IOKAlCBhbmQgYW4gYW5jZXN0b3Igd2hvc2UgTkFNRSBtYXRjaGVzIGlzIG1hc2tlZCB3aG9sZVxuICogYmVmb3JlIHRoZSB3YWxrIGdvZXMgYmVsb3cgaXQsIHNvIHRoZSBuYW1lIGRlY2lkZXMuIENvbnNlcnZhdGl2ZTogYHRydWVgXG4gKiB3aGVuZXZlciBpbiBkb3VidC5cbiAqXG4gKiBMaW5lYXIgaW4gdGhlIGxlbmd0aCBvZiBgcGF0dGVybi5zb3VyY2VgOiBldmVyeSBzY2FuIGhlcmUgaXMgb25lIGZvcndhcmRcbiAqIHBhc3MgKHtAbGluayBjbGFzc0JvZGllc30pIG9yIGEgcmVnZXggdGhhdCBkb2VzIGNvbnN0YW50IHdvcmsgcGVyIHBvc2l0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbmVlZHNQYXRoKHBhdHRlcm46IFJlZ0V4cCk6IGJvb2xlYW4ge1xuICBjb25zdCBzb3VyY2UgPSBwYXR0ZXJuLnNvdXJjZTtcbiAgaWYgKC9cXC58XFxcXFtXU0RCcFB1eGMwLTldfFxcW1xcXnxcXChcXD9bPSE8XS8udGVzdChzb3VyY2UpKSByZXR1cm4gdHJ1ZTtcbiAgZm9yIChjb25zdCBib2R5IG9mIGNsYXNzQm9kaWVzKHNvdXJjZSkpIHtcbiAgICBmb3IgKGNvbnN0IFssIGxvdywgaGlnaF0gb2YgYm9keS5tYXRjaEFsbCgvKFxcXFw/W1xcc1xcU10pLShcXFxcP1tcXHNcXFNdKS9nKSkge1xuICAgICAgaWYgKGxvdy5sZW5ndGggPiAxIHx8IGhpZ2gubGVuZ3RoID4gMSB8fCAobG93IDw9ICcuJyAmJiBoaWdoID49ICcuJykpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogVGhlIGJvZHkgb2YgZWFjaCBjaGFyYWN0ZXIgY2xhc3MgaW4gYHNvdXJjZWAsIGxlZnQgdG8gcmlnaHQ6IHRoZSB0ZXh0XG4gKiBiZXR3ZWVuIGEgYFtgIGFuZCB0aGUgZmlyc3QgYF1gIGFmdGVyIGl0IHRoYXQgbm8gYFxcYCBlc2NhcGVzIChhIGBcXGAgdGFrZXNcbiAqIHRoZSBjaGFyYWN0ZXIgYWZ0ZXIgaXQgYWxvbmcpLiBPTkUgZm9yd2FyZCBwYXNzLlxuICpcbiAqIEl0IHJlcGxhY2VzIGBzb3VyY2UubWF0Y2hBbGwoL1xcWygoPzpcXFxcW1xcc1xcU118W15cXF1cXFxcXSkqKVxcXS9nKWAgYW5kIGdpdmVzIHRoZVxuICogc2FtZSBib2RpZXMgZm9yIGV2ZXJ5IHN0cmluZyAocGlubmVkIGFnYWluc3QgdGhhdCByZWdleCBhcyB0aGUgY29udHJvbCxcbiAqIHRlc3QvbGliL21lbW9yeS9zZWN1cml0eS9uZWVkcy1wYXRoLWxpbmVhci5zZWN1cml0eS50ZXN0LnRzKS4gVGhlIHJlZ2V4IHdhc1xuICogcXVhZHJhdGljOiBhZnRlciBhIGBbYCB0aGF0IG5ldmVyIGNsb3NlZCBpdCByZXRyaWVkIGF0IGV2ZXJ5IGxhdGVyIGBbYCxcbiAqIGVhY2ggcmV0cnkgcmVzY2FubmluZyB0byB0aGUgZW5kIOKAlCBgXFxbYCByZXBlYXRlZCAzMiwwMDAgdGltZXMgdG9vayAwLjcgcyxcbiAqIGFuZCBgc2V0UG9saWN5YCBydW5zIG9uY2UgcGVyIHN0YWdlJ3Mgc2NvcGUgKENvZGVRTCBqcy9wb2x5bm9taWFsLXJlZG9zKS5cbiAqIFRoZSBwYXNzIHN0b3BzIGF0IHRoZSBmaXJzdCBgW2AgdGhhdCBuZXZlciBjbG9zZXMgaW5zdGVhZDogYSBsYXRlciBgW2BcbiAqIHN0YXJ0cyBpdHMgYm9keSB3aGVyZSB0aGUgZmFpbGVkIHNjYW4gd2FzIGFsc28gYmV0d2VlbiB0d28gdG9rZW5zLCBzbyBpdFxuICogcmVhZHMgdGhlIHNhbWUgdGFpbCB0aGUgc2FtZSB3YXkgYW5kIGNsb3NlcyBub3doZXJlIGVpdGhlci5cbiAqXG4gKiBAaW50ZXJuYWwgRXhwb3J0ZWQgZm9yIHRoYXQgdGVzdCBvbmx5IOKAlCBub3Qgb24gYW55IHB1YmxpYyBkb29yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xhc3NCb2RpZXMoc291cmNlOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGJvZGllczogc3RyaW5nW10gPSBbXTtcbiAgbGV0IG9wZW4gPSBzb3VyY2UuaW5kZXhPZignWycpO1xuICB3aGlsZSAob3BlbiAhPT0gLTEpIHtcbiAgICBjb25zdCBjbG9zZSA9IGNsb3NpbmdCcmFja2V0KHNvdXJjZSwgb3BlbiArIDEpO1xuICAgIGlmIChjbG9zZSA9PT0gLTEpIGJyZWFrO1xuICAgIGJvZGllcy5wdXNoKHNvdXJjZS5zbGljZShvcGVuICsgMSwgY2xvc2UpKTtcbiAgICBvcGVuID0gc291cmNlLmluZGV4T2YoJ1snLCBjbG9zZSArIDEpO1xuICB9XG4gIHJldHVybiBib2RpZXM7XG59XG5cbi8qKiBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IGBdYCBhdCBvciBhZnRlciBgZnJvbWAgdGhhdCBubyBgXFxgIGVzY2FwZXMsIGVsc2UgLTEgKGEgdHJhaWxpbmcgbG9uZSBgXFxgIGVzY2FwZXMgbm90aGluZyBhbmQgY2xvc2VzIG5vdGhpbmcpLiAqL1xuZnVuY3Rpb24gY2xvc2luZ0JyYWNrZXQoc291cmNlOiBzdHJpbmcsIGZyb206IG51bWJlcik6IG51bWJlciB7XG4gIGxldCBhdCA9IGZyb207XG4gIHdoaWxlIChhdCA8IHNvdXJjZS5sZW5ndGgpIHtcbiAgICBjb25zdCBjaGFyID0gc291cmNlW2F0XTtcbiAgICBpZiAoY2hhciA9PT0gJ10nKSByZXR1cm4gYXQ7XG4gICAgYXQgKz0gY2hhciA9PT0gJ1xcXFwnID8gMiA6IDE7XG4gIH1cbiAgcmV0dXJuIC0xO1xufVxuXG4vKiogYHNlcnZlZExlYWZgJ3MgYW5zd2VyIGZvciBhIHZhbHVlIGl0IGxlYXZlcyBhcyBpdCBpcy4gKi9cbmNvbnN0IEtFRVA6IHVuaXF1ZSBzeW1ib2wgPSBTeW1ib2woJ2tlcHQgYXMgaXQgaXMnKTtcblxuLyoqIEVhY2ggZmllbGQgcGF0aCBhcyBvbmUgbGl0ZXJhbCBrZXkgYW5kLCB3aGVuIGRvdHRlZCwgYXMgaXRzIHNlZ21lbnRzLiAqL1xuZnVuY3Rpb24gdGFyZ2V0c09mKHBhdGhzOiByZWFkb25seSBzdHJpbmdbXSB8IHVuZGVmaW5lZCk6IFRhcmdldFtdIHtcbiAgY29uc3Qgb3V0OiBUYXJnZXRbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHBhdGggb2YgcGF0aHMgPz8gW10pIHtcbiAgICBvdXQucHVzaChbcGF0aF0pO1xuICAgIGlmIChwYXRoLmluY2x1ZGVzKCcuJykpIG91dC5wdXNoKHBhdGguc3BsaXQoJy4nKSk7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqIFRoZSBtZW1vIGtleSBvZiBhIHRhcmdldCBzdGF0ZSDigJQgb3JkZXItZnJlZS4gKi9cbmZ1bmN0aW9uIHNpZ25hdHVyZU9mKHRhcmdldHM6IHJlYWRvbmx5IFRhcmdldFtdKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRhcmdldHMubGVuZ3RoID09PSAwXG4gICAgPyAnJ1xuICAgIDogdGFyZ2V0c1xuICAgICAgICAubWFwKCh0KSA9PiB0LmpvaW4oJ1xcdTAwMWYnKSlcbiAgICAgICAgLnNvcnQoKVxuICAgICAgICAuam9pbignXFx1MDAxZScpO1xufVxuXG4vKiogT25lIGVkZ2UncyBkZWNpc2lvbjogdGhlIHZhbHVlIHVuZGVyIGBrZXlgIGlzIG1hc2tlZCBoZXJlLCBvciB0aGVzZSB0YXJnZXRzIGNvbnRpbnVlIGJlbG93IGl0LiAqL1xuZnVuY3Rpb24gZGVjaWRlRWRnZShcbiAga2V5OiBzdHJpbmcsXG4gIGRvdHRlZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICB0YXJnZXRzOiByZWFkb25seSBUYXJnZXRbXSxcbiAgd2FsazogV2FsayxcbiAgZGVwdGg6IG51bWJlcixcbik6IHsgbWFza2VkOiBib29sZWFuOyBiZWxvdzogVGFyZ2V0W10gfSB7XG4gIGNvbnN0IGJlbG93OiBUYXJnZXRbXSA9IFtdO1xuICBsZXQgbWFza2VkID0gZmFsc2U7XG4gIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcbiAgICBpZiAodGFyZ2V0WzBdICE9PSBrZXkpIGNvbnRpbnVlO1xuICAgIGlmICh0YXJnZXQubGVuZ3RoID09PSAxKSBtYXNrZWQgPSB0cnVlO1xuICAgIGVsc2UgYmVsb3cucHVzaCh0YXJnZXQuc2xpY2UoMSkpO1xuICB9XG4gIGNvbnN0IG5hbWVzID0gd2Fsay5yb290RGVjaWRlZCAmJiBkZXB0aCA9PT0gMCA/IHVuZGVmaW5lZCA6IHdhbGsubmFtZXM7XG4gIGlmIChuYW1lcyAhPT0gdW5kZWZpbmVkICYmICFtYXNrZWQpIHtcbiAgICBtYXNrZWQgPVxuICAgICAgbmFtZXMubWFza3Moa2V5KSB8fFxuICAgICAgKG5hbWVzLnBhdGhNYXNrcyAhPT0gdW5kZWZpbmVkICYmIGRvdHRlZCAhPT0gdW5kZWZpbmVkICYmIG5hbWVzLnBhdGhNYXNrcyhgJHtkb3R0ZWR9LiR7a2V5fWApKTtcbiAgICBiZWxvdy5wdXNoKC4uLnRhcmdldHNPZihuYW1lcy5maWVsZHMoa2V5KSkpO1xuICB9XG4gIHJldHVybiB7IG1hc2tlZCwgYmVsb3cgfTtcbn1cblxuLyoqIE9uZSBzdGVwIGRvd24gYSB3YWxrJ3MgcGF0aDogY291bnQgdGhlIHZpc2l0IOKAlCBgZmFsc2VgIG9uY2UgdGhlIHdhbGsgaXMgcGFzdCBpdHMgbGltaXQuICovXG5mdW5jdGlvbiB2aXNpdCh3YWxrOiBXYWxrKTogYm9vbGVhbiB7XG4gIGlmICgtLXdhbGsuYnVkZ2V0ID49IDApIHJldHVybiB0cnVlO1xuICBpZiAoIXdhbGsubGltaXRlZCkge1xuICAgIHdhbGsubGltaXRlZCA9IHRydWU7XG4gICAgd2Fsay5vbkxpbWl0Py4oKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogSXMgYW55dGhpbmcgc2VsZWN0ZWQgb24gc29tZSBQQVRIIHVuZGVyIGBub2RlYD8gUmVhZC1vbmx5OyBhIGN5Y2xlIGVkZ2UgaXNcbiAqIG5vdCBmb2xsb3dlZC4gYGJhY2tgIGlzIHRoZSBzaGFsbG93ZXN0IGFuY2VzdG9yIGEgc2tpcHBlZCBjeWNsZSBlZGdlIGJlbG93XG4gKiByZWFjaGVkIOKAlCBhIGBmYWxzZWAgdGhhdCByZXN0cyBvbiBvbmUgaXMgbm90IHNoYXJlZCAobWVtbykuXG4gKi9cbmZ1bmN0aW9uIHNlbGVjdHNCeVBhdGgoXG4gIG5vZGU6IG9iamVjdCxcbiAgZG90dGVkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHRhcmdldHM6IHJlYWRvbmx5IFRhcmdldFtdLFxuICB3YWxrOiBXYWxrLFxuICBhbmNlc3RvcnM6IE1hcDxvYmplY3QsIG51bWJlcj4sXG4gIGRlcHRoOiBudW1iZXIsXG4pOiB7IHNlbGVjdGVkOiBib29sZWFuOyBiYWNrOiBudW1iZXIgfSB7XG4gIC8vIFBhc3QgdGhlIGxpbWl0OiBhc3N1bWUgYSBzZWxlY3Rpb24g4oCUIHRoZSBjb3B5IHNlcnZlcyB0aGUgdW52aXNpdGVkIHJlbWFpbmRlciBhcyB0aGUgcGxhY2Vob2xkZXIuXG4gIGlmICghdmlzaXQod2FsaykpIHJldHVybiB7IHNlbGVjdGVkOiB0cnVlLCBiYWNrOiBJbmZpbml0eSB9O1xuICBpZiAod2Fsay5uYW1lcyA9PT0gdW5kZWZpbmVkICYmIHRhcmdldHMubGVuZ3RoID09PSAwKSByZXR1cm4geyBzZWxlY3RlZDogZmFsc2UsIGJhY2s6IEluZmluaXR5IH07XG4gIGNvbnN0IHNpZyA9IHdhbGsubWVtbyA/IHNpZ25hdHVyZU9mKHRhcmdldHMpIDogJyc7XG4gIGNvbnN0IGtub3duID0gd2Fsay5tZW1vPy5nZXQobm9kZSk/LmdldChgcyR7c2lnfWApO1xuICBpZiAoa25vd24gIT09IHVuZGVmaW5lZCkgcmV0dXJuIHsgc2VsZWN0ZWQ6IGtub3duIGFzIGJvb2xlYW4sIGJhY2s6IEluZmluaXR5IH07XG4gIGFuY2VzdG9ycy5zZXQobm9kZSwgZGVwdGgpO1xuICBsZXQgYmFjayA9IEluZmluaXR5O1xuICBsZXQgc2VsZWN0ZWQgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBba2V5LCBjaGlsZF0gb2YgT2JqZWN0LmVudHJpZXMobm9kZSkpIHtcbiAgICBjb25zdCBlZGdlID0gZGVjaWRlRWRnZShrZXksIGRvdHRlZCwgdGFyZ2V0cywgd2FsaywgZGVwdGgpO1xuICAgIGlmIChlZGdlLm1hc2tlZCkge1xuICAgICAgc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGlmIChjaGlsZCA9PT0gbnVsbCB8fCB0eXBlb2YgY2hpbGQgIT09ICdvYmplY3QnKSBjb250aW51ZTtcbiAgICBjb25zdCBhdCA9IGFuY2VzdG9ycy5nZXQoY2hpbGQpO1xuICAgIGlmIChhdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBiYWNrID0gTWF0aC5taW4oYmFjaywgYXQpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGNoaWxkUGF0aCA9IHdhbGsubmFtZXM/LnBhdGhNYXNrcyA/IChkb3R0ZWQgPT09IHVuZGVmaW5lZCA/IGtleSA6IGAke2RvdHRlZH0uJHtrZXl9YCkgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgYmVsb3cgPSBzZWxlY3RzQnlQYXRoKGNoaWxkLCBjaGlsZFBhdGggPz8ga2V5LCBlZGdlLmJlbG93LCB3YWxrLCBhbmNlc3RvcnMsIGRlcHRoICsgMSk7XG4gICAgYmFjayA9IE1hdGgubWluKGJhY2ssIGJlbG93LmJhY2spO1xuICAgIGlmIChiZWxvdy5zZWxlY3RlZCkge1xuICAgICAgc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIGFuY2VzdG9ycy5kZWxldGUobm9kZSk7XG4gIGlmICh3YWxrLm1lbW8gJiYgKHNlbGVjdGVkIHx8IGJhY2sgPj0gZGVwdGgpKSByZW1lbWJlcih3YWxrLm1lbW8sIG5vZGUsIGBzJHtzaWd9YCwgc2VsZWN0ZWQpO1xuICByZXR1cm4geyBzZWxlY3RlZCwgYmFjazogYmFjayA8IGRlcHRoID8gYmFjayA6IEluZmluaXR5IH07XG59XG5cbmZ1bmN0aW9uIHJlbWVtYmVyKG1lbW86IFdlYWtNYXA8b2JqZWN0LCBNYXA8c3RyaW5nLCB1bmtub3duPj4sIG5vZGU6IG9iamVjdCwga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gIGxldCBlbnRyaWVzID0gbWVtby5nZXQobm9kZSk7XG4gIGlmIChlbnRyaWVzID09PSB1bmRlZmluZWQpIG1lbW8uc2V0KG5vZGUsIChlbnRyaWVzID0gbmV3IE1hcCgpKSk7XG4gIGVudHJpZXMuc2V0KGtleSwgdmFsdWUpO1xufVxuXG4vKipcbiAqIFRoZSBzZXJ2ZWQgY29weSBvZiBgbm9kZWAsIGNvcHktb24td3JpdGUgUEVSIFBBVEguIEV2ZXJ5IGNvbnRhaW5lciBlbnRlcmVkXG4gKiBnZXRzIGl0cyBjb3B5IEJFRk9SRSBpdHMgY2hpbGRyZW4gYXJlIHdhbGtlZCwgc28gYSBjeWNsZSBlZGdlIGlzIHBvaW50ZWQgYXRcbiAqIHRoZSBhbmNlc3RvcidzIGNvcHkg4oCUIG5ldmVyIGJhY2sgYXQgYW4gdW5zY3J1YmJlZCBvcmlnaW5hbDsgYSBjb250YWluZXIgaXNcbiAqIHNlcnZlZCBhcyBpdHNlbGYgd2hlbiBub3RoaW5nIHVuZGVyIGl0IGNoYW5nZWQgYW5kIG5vIGN5Y2xlIHBhc3NlcyB0aHJvdWdoXG4gKiBpdC4gQSBwcnVuZWQgZGVzY2VudCAoYSBiYXJlIGZpZWxkIHNjcnViIG9mIGFuIGFjeWNsaWMgdmFsdWUpIHNraXBzIHN1YnRyZWVzXG4gKiBubyB0YXJnZXQgcmVhY2hlcy4gYGJhY2tgIGlzIHRoZSBzaGFsbG93ZXN0IGFuY2VzdG9yIGEgY3ljbGUgZWRnZSBiZWxvd1xuICogcmVhY2hlZCAoYEluZmluaXR5YDogbm9uZSk7IGEgY29weSB0aGF0IHJlc3RzIG9uIG5vbmUgaXMgc2hhcmVkIChtZW1vKS5cbiAqL1xuZnVuY3Rpb24gY29weUJ5UGF0aChcbiAgbm9kZTogb2JqZWN0LFxuICBkb3R0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgdGFyZ2V0czogcmVhZG9ubHkgVGFyZ2V0W10sXG4gIHdhbGs6IFdhbGssXG4gIHBsYWNlaG9sZGVyOiBzdHJpbmcsXG4gIGFuY2VzdG9yczogTWFwPG9iamVjdCwgeyBjb3B5OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjsgZGVwdGg6IG51bWJlciB9PixcbiAgZGVwdGg6IG51bWJlcixcbiAgcHJ1bmU6IGJvb2xlYW4sXG4pOiB7IG91dDogdW5rbm93bjsgYmFjazogbnVtYmVyIH0ge1xuICAvLyBQYXN0IHRoZSBsaW1pdDogdGhlIHVudmlzaXRlZCByZW1haW5kZXIgaXMgc2VydmVkIGFzIHRoZSBwbGFjZWhvbGRlciDigJQgbmV2ZXIgcmF3LlxuICBpZiAoIXZpc2l0KHdhbGspKSByZXR1cm4geyBvdXQ6IHBsYWNlaG9sZGVyLCBiYWNrOiBJbmZpbml0eSB9O1xuICBjb25zdCBzaWcgPSB3YWxrLm1lbW8gPyBgYyR7c2lnbmF0dXJlT2YodGFyZ2V0cyl9YCA6ICcnO1xuICBjb25zdCBrbm93biA9IHdhbGsubWVtbz8uZ2V0KG5vZGUpPy5nZXQoc2lnKTtcbiAgaWYgKGtub3duICE9PSB1bmRlZmluZWQpIHJldHVybiB7IG91dDoga25vd24sIGJhY2s6IEluZmluaXR5IH07XG4gIGNvbnN0IGZyYW1lID0ge1xuICAgIGNvcHk6IChBcnJheS5pc0FycmF5KG5vZGUpID8gbm9kZS5zbGljZSgpIDogeyAuLi5ub2RlIH0pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIGRlcHRoLFxuICB9O1xuICBhbmNlc3RvcnMuc2V0KG5vZGUsIGZyYW1lKTtcbiAgbGV0IGNoYW5nZWQgPSBmYWxzZTtcbiAgbGV0IGJhY2sgPSBJbmZpbml0eTtcbiAgZm9yIChjb25zdCBba2V5LCBjaGlsZF0gb2YgT2JqZWN0LmVudHJpZXMobm9kZSkpIHtcbiAgICBjb25zdCBlZGdlID0gZGVjaWRlRWRnZShrZXksIGRvdHRlZCwgdGFyZ2V0cywgd2FsaywgZGVwdGgpO1xuICAgIGlmIChlZGdlLm1hc2tlZCkge1xuICAgICAgZnJhbWUuY29weVtrZXldID0gcGxhY2Vob2xkZXI7XG4gICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoY2hpbGQgPT09IG51bGwgfHwgdHlwZW9mIGNoaWxkICE9PSAnb2JqZWN0JykgY29udGludWU7XG4gICAgY29uc3QgYW5jZXN0b3IgPSBhbmNlc3RvcnMuZ2V0KGNoaWxkKTtcbiAgICBpZiAoYW5jZXN0b3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZnJhbWUuY29weVtrZXldID0gYW5jZXN0b3IuY29weTtcbiAgICAgIGJhY2sgPSBNYXRoLm1pbihiYWNrLCBhbmNlc3Rvci5kZXB0aCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKHBydW5lICYmIGVkZ2UuYmVsb3cubGVuZ3RoID09PSAwKSBjb250aW51ZTtcbiAgICBjb25zdCBjaGlsZFBhdGggPSB3YWxrLm5hbWVzPy5wYXRoTWFza3MgPyAoZG90dGVkID09PSB1bmRlZmluZWQgPyBrZXkgOiBgJHtkb3R0ZWR9LiR7a2V5fWApIDoga2V5O1xuICAgIGNvbnN0IGJlbG93ID0gY29weUJ5UGF0aChjaGlsZCwgY2hpbGRQYXRoLCBlZGdlLmJlbG93LCB3YWxrLCBwbGFjZWhvbGRlciwgYW5jZXN0b3JzLCBkZXB0aCArIDEsIHBydW5lKTtcbiAgICBpZiAoYmVsb3cub3V0ICE9PSBjaGlsZCkge1xuICAgICAgZnJhbWUuY29weVtrZXldID0gYmVsb3cub3V0O1xuICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgfVxuICAgIGJhY2sgPSBNYXRoLm1pbihiYWNrLCBiZWxvdy5iYWNrKTtcbiAgfVxuICBhbmNlc3RvcnMuZGVsZXRlKG5vZGUpO1xuICBjb25zdCBvdXQgPSBjaGFuZ2VkIHx8IGJhY2sgPD0gZGVwdGggPyBmcmFtZS5jb3B5IDogbm9kZTtcbiAgaWYgKHdhbGsubWVtbyAmJiBiYWNrID49IGRlcHRoKSByZW1lbWJlcih3YWxrLm1lbW8sIG5vZGUsIHNpZywgb3V0KTtcbiAgcmV0dXJuIHsgb3V0LCBiYWNrOiBiYWNrIDwgZGVwdGggPyBiYWNrIDogSW5maW5pdHkgfTtcbn1cblxuLyoqIERvZXMgYW55IHBhdGggZnJvbSBgcm9vdGAgY29tZSBiYWNrIHRvIGFuIG9iamVjdCBvbiBpdD8gKi9cbmZ1bmN0aW9uIGhhc0N5Y2xlKHJvb3Q6IG9iamVjdCk6IGJvb2xlYW4ge1xuICBjb25zdCBkb25lID0gbmV3IFdlYWtTZXQ8b2JqZWN0PigpO1xuICBjb25zdCBvblBhdGggPSBuZXcgU2V0PG9iamVjdD4oKTtcbiAgY29uc3QgdmlzaXROb2RlID0gKG5vZGU6IG9iamVjdCk6IGJvb2xlYW4gPT4ge1xuICAgIGlmIChvblBhdGguaGFzKG5vZGUpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoZG9uZS5oYXMobm9kZSkpIHJldHVybiBmYWxzZTtcbiAgICBvblBhdGguYWRkKG5vZGUpO1xuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgT2JqZWN0LnZhbHVlcyhub2RlKSkge1xuICAgICAgaWYgKGNoaWxkICE9PSBudWxsICYmIHR5cGVvZiBjaGlsZCA9PT0gJ29iamVjdCcgJiYgdmlzaXROb2RlKGNoaWxkKSkgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIG9uUGF0aC5kZWxldGUobm9kZSk7XG4gICAgZG9uZS5hZGQobm9kZSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuICByZXR1cm4gdmlzaXROb2RlKHJvb3QpO1xufVxuXG4vKipcbiAqIFRoZSBzZXJ2ZWQgZm9ybSBvZiBgcm9vdGAgdW5kZXIgYSB3YWxrOiBgcm9vdGAgaXRzZWxmIHdoZW4gbm8gcGF0aCBzZWxlY3RzXG4gKiBhbnl0aGluZywgZWxzZSBpdHMgY29weS1vbi13cml0ZSBjb3B5IChwYXN0IHRoZSB3YWxrIGxpbWl0LCBpdHMgdW52aXNpdGVkXG4gKiByZW1haW5kZXIgc2VydmVkIGFzIHRoZSBwbGFjZWhvbGRlcikuIFRocm93cyDigJQgdGhlIGNhbGxlciByZWZ1c2VzIHRvIHNlcnZlXG4gKiDigJQgb24gYW4gZW51bWVyYWJsZSBnZXR0ZXIgdGhhdCB0aHJvd3MuXG4gKi9cbmZ1bmN0aW9uIHNlcnZlZEJ5UGF0aChcbiAgcm9vdDogb2JqZWN0LFxuICBkb3R0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgdGFyZ2V0czogcmVhZG9ubHkgVGFyZ2V0W10sXG4gIHdhbGs6IFdhbGssXG4gIHBsYWNlaG9sZGVyOiBzdHJpbmcsXG4pOiB1bmtub3duIHtcbiAgaWYgKCFzZWxlY3RzQnlQYXRoKHJvb3QsIGRvdHRlZCwgdGFyZ2V0cywgd2FsaywgbmV3IE1hcCgpLCAwKS5zZWxlY3RlZCkgcmV0dXJuIHJvb3Q7XG4gIHdhbGsuYnVkZ2V0ID0gd2Fsa0xpbWl0O1xuICAvLyBBIGJhcmUgZmllbGQgc2NydWIgb2YgYW4gYWN5Y2xpYyB2YWx1ZSB3YWxrcyBpdHMgdGFyZ2V0cyBvbmx5OiBubyBjeWNsZSBjYW4gYnJpbmcgYW5cbiAgLy8gdW5zY3J1YmJlZCBvcmlnaW5hbCBiYWNrLiBFdmVyeSBvdGhlciB3YWxrIHZpc2l0cyBldmVyeSBwYXRoIChhIGN5Y2xlIGVkZ2UgYW55d2hlcmVcbiAgLy8gbXVzdCBsYW5kIG9uIGEgc2VydmVkIGNvcHkpLlxuICBjb25zdCBwcnVuZSA9IHdhbGsubmFtZXMgPT09IHVuZGVmaW5lZCAmJiAhaGFzQ3ljbGUocm9vdCk7XG4gIHJldHVybiBjb3B5QnlQYXRoKHJvb3QsIGRvdHRlZCwgdGFyZ2V0cywgd2FsaywgcGxhY2Vob2xkZXIsIG5ldyBNYXAoKSwgMCwgcHJ1bmUpLm91dDtcbn1cblxuLyoqIEEgcGxhaW4gcmVjb3JkIOKAlCB0aGUgb25seSBzaGFwZSBhIG1hcHBlciBpcyBoYW5kZWQgYXMgYSByZWNvcmRpbmcgdmlldyAoYSBjbGFzcyBpbnN0YW5jZSBrZWVwcyBpdHMgcHJvdG90eXBlKS4gKi9cbmZ1bmN0aW9uIGlzUGxhaW5SZWNvcmQodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKTtcbiAgcmV0dXJuIHByb3RvID09PSBPYmplY3QucHJvdG90eXBlIHx8IHByb3RvID09PSBudWxsO1xufVxuXG4vKiogVGhlIHN0cmljdGVyIG9mIHR3byB2ZXJkaWN0cyBvbiB0aGUgc2FtZSB2YWx1ZTogd2hvbGUgb3ZlciBmaWVsZHMgb3ZlciBjbGVhcjsgZmllbGRzIHVuaXRlLiAqL1xuZnVuY3Rpb24gc3RyaWN0ZXIoYTogUmVkYWN0aW9uVmVyZGljdCB8IHVuZGVmaW5lZCwgYjogUmVkYWN0aW9uVmVyZGljdCk6IFJlZGFjdGlvblZlcmRpY3Qge1xuICBpZiAoYSA9PT0gdW5kZWZpbmVkIHx8IGEua2luZCA9PT0gJ2NsZWFyJyB8fCBiLmtpbmQgPT09ICd3aG9sZScpIHJldHVybiBiO1xuICBpZiAoYS5raW5kID09PSAnd2hvbGUnIHx8IGIua2luZCA9PT0gJ2NsZWFyJykgcmV0dXJuIGE7XG4gIHJldHVybiB7IGtpbmQ6ICdmaWVsZHMnLCBrZXk6IGEua2V5LCBwYXRoczogWy4uLm5ldyBTZXQoWy4uLmEucGF0aHMsIC4uLmIucGF0aHNdKV0gfTtcbn1cblxuLyoqXG4gKiBUSEUgVEFJTlQgUlVMRSBhdCBhIHN1YmZsb3cgbWFwcGVyIGJvdW5kYXJ5IChhbiBgaW5wdXRNYXBwZXJgIHNlZWRpbmcgYVxuICogc3ViZmxvdywgYW4gYG91dHB1dE1hcHBlcmAgbWVyZ2luZyBpdCBiYWNrKTogYSBrZXkgdGhlIG1hcHBlciB3cml0ZXNcbiAqIGluaGVyaXRzIHRoZSByZWRhY3Rpb24gb2YgdGhlIFNFTEVDVEVEIHZhbHVlIGl0IGNvcGllZCDigJQgYSBtYXJrIChvclxuICogaW5oZXJpdGVkIGZpZWxkcyksIGJ5IG5hbWUsIGxpa2UgYSBwZXItY2FsbCBgc2V0VmFsdWUoa2V5LCB2YWx1ZSwgdHJ1ZSlgIOKAlFxuICogc28gdGhlIHN1YmZsb3cncyBzZWVkLCBsb2csIG1pcnJvciwgcmVhZHMsIG5hcnJhdGl2ZSBhbmQgcmVzdWx0cywgYW5kIHRoZVxuICogcGFyZW50J3MgbWVyZ2UtYmFjaywgcmV0YWluIHRoZSBjb3B5IGFzIHRoZXkgcmV0YWluIGl0cyBzb3VyY2UuIERlY2lkZWQgYnlcbiAqIHdoaWNoIHZhbHVlcyB0aGUgbWFwcGVyIFJFQUQ6XG4gKlxuICogICAtIFNBTUUgTkFNRSDigJQgYSB2YWx1ZSBwYXNzZWQgb24gdW5kZXIgdGhlIG5hbWUgaXQgd2FzIHJlYWQgdW5kZXIga2VlcHNcbiAqICAgICB0aGF0IG5hbWUncyB2ZXJkaWN0IChgeyBjb3VudDogcC5jb3VudCB9YCwgYHsgLi4ucCB9YCk6IGEgY2xlYXIgdmFsdWVcbiAqICAgICBzdGF5cyBjbGVhciwgd2hlcmV2ZXIgZWxzZSB0aGUgbWFwcGVyIHJlYWQgYSBzZWNyZXQuXG4gKiAgIC0gRVhBQ1Qg4oCUIGFuIG91dHB1dCBPQkpFQ1QgdGhhdCBJUyAoYnkgcmVmZXJlbmNlKSBhIHZhbHVlIHRoZSBtYXBwZXIgcmVhZFxuICogICAgIGluaGVyaXRzIHRoYXQga2V5J3MgdmVyZGljdDogd2hvbGUgc3RheXMgd2hvbGUsIGBmaWVsZHNgIGhhbmQgdGhlaXIgcGF0aHNcbiAqICAgICB0byB0aGUgbmV3IGtleSwgY2xlYXIgc3RheXMgY2xlYXIuIFRoZSByZWNvcmQgdGhlIG1hcHBlciB3YXMgSEFOREVELFxuICogICAgIHBhc3NlZCBvbiB3aG9sZSAoYChwKSA9PiAoeyBjdHg6IHAgfSlgKSwgaGFuZHMgZXZlcnkgc2VsZWN0ZWQga2V5IG9mIGl0XG4gKiAgICAgdG8gdGhlIG5ldyBrZXkgYXMgYSBmaWVsZCAoYGN0eC50b2tlbmApLlxuICogICAtIENPTlNFUlZBVElWRSDigJQgYW55IG90aGVyIG91dHB1dCAoYSBwcmltaXRpdmUgdW5kZXIgYSBuZXcgbmFtZSwgb3IgYW5cbiAqICAgICBvYmplY3QgdGhlIG1hcHBlciBidWlsdCkgaXMgc2VsZWN0ZWQgV0hPTEUgd2hlbiB0aGUgbWFwcGVyIHJlYWQgYVxuICogICAgIHNlbGVjdGVkIHZhbHVlIOKAlCBhIHdob2xlLXNlbGVjdGVkIGtleSwgb3IgYSBzZWxlY3RlZCBGSUVMRCBvZiBhXG4gKiAgICAgYGZpZWxkc2Atc2VsZWN0ZWQgcmVjb3JkIOKAlCBvciB3aGVuIGl0IGVtYmVkcyBhIHNlbGVjdGVkIHJlY29yZCBieVxuICogICAgIHJlZmVyZW5jZTsgdGhlIGxpYnJhcnkgY2Fubm90IHRlbGwgd2hhdCBhIGNvbXB1dGVkIHZhbHVlIGNhcnJpZXMuXG4gKiAgICAgKFZhbHVlcyBhcmUgbmV2ZXIgbWF0Y2hlZCBieSBFUVVBTElUWSBhY3Jvc3MgbmFtZXM6IGFuIGVxdWFsIHByaW1pdGl2ZVxuICogICAgIHdvdWxkIG92ZXItbWF0Y2ggdW5yZWxhdGVkIGtleXMuKVxuICpcbiAqIEhPVyBGQVIgQSBNQVJLIFJFQUNIRVM6IGEgTkFNRSwgcnVuLXdpZGUsIGZyb20gdGhlIG1vbWVudCBpdCBpcyBtYWRlIOKAlCBldmVyeVxuICoga2V5IG9mIHRoYXQgbmFtZSBpbiB0aGUgc3ViZmxvdywgdGhlIHBhcmVudCwgYSBzaWJsaW5nIGFuZCBldmVyeSBsYXRlciBzdGFnZVxuICogaXMgc2VsZWN0ZWQgaW4gd2hhdGV2ZXIgaXMgc2VydmVkLCB1bnRpbCB0aGUga2V5IGlzIGRlbGV0ZWQ7IGEgcGF1c2UgY2Fycmllc1xuICogaXQgdG8gdGhlIHJlc3VtZWQgcnVuIChgRmxvd2NoYXJ0Q2hlY2twb2ludC5yZWRhY3Rpb25NYXJrc2ApLlxuICpcbiAqIEEgYGZpZWxkc2Atc2VsZWN0ZWQgcmVjb3JkIHRoYXQgaG9sZHMgYSBzZWxlY3RlZCBmaWVsZCBpcyBoYW5kZWQgdG8gdGhlXG4gKiBtYXBwZXIgYXMgYSB2aWV3IG9mIGl0cyBvd24sIHNvIHJlYWRpbmcgdGhlIHJlY29yZCAodG8gcGFzcyBpdCBvbiwgb3IgdG9cbiAqIHRlc3QgaXRzIHR5cGUpIGlzIG5vdCByZWFkaW5nIHRoZSBmaWVsZC4gUmVhZGluZyBgcnVuc2AgKHRoZSBuYW1lc3BhY2Ugcm9vdFxuICogZm9yayBjaGlsZHJlbiB3cml0ZSB1bmRlcikgcmVhZHMgZXZlcnkgbmFtZXNwYWNlZCBrZXkuIFJlY29yZGluZyBzdG9wcyB3aGVuXG4gKiB0aGUgbWFwcGVyIHJldHVybnM7IHtAbGluayBpbmhlcml0fSBoYW5kcyBiYWNrIHRoZSBvdXRwdXQgd2l0aCBldmVyeSB2aWV3IGl0XG4gKiByZXR1cm5lZCBzd2FwcGVkIGZvciB0aGUgcmVjb3JkIGJlaGluZCBpdC5cbiAqL1xuZXhwb3J0IGNsYXNzIE1hcHBlclRhaW50IHtcbiAgLyoqIEVhY2ggb2JqZWN0IHRoZSBtYXBwZXIgcmVhZCDihpIgdGhlIHZlcmRpY3Qgb2YgdGhlIGtleSBpdCByZWFkIGl0IHVuZGVyLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHNvdXJjZXMgPSBuZXcgTWFwPG9iamVjdCwgUmVkYWN0aW9uVmVyZGljdD4oKTtcbiAgLyoqIEVhY2gga2V5IHRoZSBtYXBwZXIgcmVhZCDihpIgdGhlIHZhbHVlcyBpdCByZWFkIHVuZGVyIHRoYXQgbmFtZS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBieU5hbWUgPSBuZXcgTWFwPHN0cmluZywgdW5rbm93bltdPigpO1xuICAvKiogRWFjaCBgZmllbGRzYCB2aWV3IGhhbmRlZCBvdXQg4oaSIHRoZSByZWNvcmQgYmVoaW5kIGl0IGFuZCBpdHMgdmVyZGljdC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSB2aWV3cyA9IG5ldyBNYXA8b2JqZWN0LCB7IHJhdzogb2JqZWN0OyB2ZXJkaWN0OiBSZWRhY3Rpb25WZXJkaWN0IH0+KCk7XG4gIC8qKiBFYWNoIHJlY29yZCB0aGUgbWFwcGVyIHdhcyBoYW5kZWQg4oaSIGFzIGEgdmlldyAocGFzc2VkIG9uIHdob2xlLCBpdCBoYW5kcyBvbiBpdHMgc2VsZWN0ZWQga2V5cykuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVjb3JkcyA9IG5ldyBNYXA8b2JqZWN0LCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oKTtcbiAgLyoqIFRoZSBzZWxlY3RlZCB2YWx1ZXMgdGhlIG1hcHBlciByZWFkICh3aG9sZSBrZXlzLCBzZWxlY3RlZCBmaWVsZHMpIOKAlCB3aGF0IGl0IGNvdWxkIHBsYW50IGJ5IHJlZmVyZW5jZS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBzZWNyZXRSZWFkczogdW5rbm93bltdID0gW107XG4gIHByaXZhdGUgc2VsZWN0ZWRSZWFkID0gZmFsc2U7XG4gIHByaXZhdGUgb3BlbiA9IHRydWU7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHJ1bGU6IFJlZGFjdGlvblJ1bGUpIHt9XG5cbiAgLyoqIGB1bmRlZmluZWRgIHdoaWxlIHRoZSBydW4ncyBydWxlIGlzIGluZXJ0IOKAlCBub3RoaW5nIGEgbWFwcGVyIHJlYWRzIGNhbiBiZSBzZWxlY3RlZC4gKi9cbiAgc3RhdGljIG9mKHJ1bGU6IFJlZGFjdGlvblJ1bGUgfCB1bmRlZmluZWQpOiBNYXBwZXJUYWludCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHJ1bGUgIT09IHVuZGVmaW5lZCAmJiAhcnVsZS5pc0luZXJ0KCkgPyBuZXcgTWFwcGVyVGFpbnQocnVsZSkgOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHJlY29yZCBhIG1hcHBlciBpcyBoYW5kZWQ6IHRoZSBzYW1lIG93biBrZXlzIGFuZCB2YWx1ZXMsIGVhY2ggcmVhZFxuICAgKiByZWNvcmRlZC4gQW4gYWNjZXNzb3IgcGVyIGtleSwgbm90IGEgUHJveHkg4oCUIGEgbWFwcGVyIG1heSBzcHJlYWQsIGNsb25lIG9yXG4gICAqIHNlcmlhbGl6ZSB3aGF0IGl0IGlzIGhhbmRlZC4gQW4gYXNzaWdubWVudCBsYW5kcyBvbiB0aGUgdmlldywgbmV2ZXIgb24gdGhlXG4gICAqIGxpdmUgcmVjb3JkIGJlaGluZCBpdC4gQW55dGhpbmcgYnV0IGEgcGxhaW4gcmVjb3JkIGlzIGhhbmRlZCBvdmVyIGFzIGl0IGlzLlxuICAgKi9cbiAgd2F0Y2g8VD4ocmVjb3JkOiBUKTogVCB7XG4gICAgaWYgKCFpc1BsYWluUmVjb3JkKHJlY29yZCkpIHJldHVybiByZWNvcmQ7XG4gICAgY29uc3QgdmlldyA9IHRoaXMudmlld09mKHJlY29yZCwgKGtleSkgPT4gdGhpcy5zZXJ2ZWQoa2V5LCByZWNvcmRba2V5XSkpO1xuICAgIHRoaXMucmVjb3Jkcy5zZXQodmlldywgcmVjb3JkKTtcbiAgICByZXR1cm4gdmlldyBhcyBUO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBtYXBwZXIgcmV0dXJuZWQgYG91dHB1dGA6IGV2ZXJ5IGtleSBpdCB3cm90ZSBpbmhlcml0cyB3aGF0IGl0IGNvcGllZFxuICAgKiAoc2VlIHRoZSBjbGFzcykuIFJldHVybnMgdGhlIG91dHB1dCB0byB1c2Ug4oCUIHRoZSBzYW1lIG9iamVjdCB1bmxlc3MgYSB2aWV3XG4gICAqIGhhZCB0byBiZSBzd2FwcGVkIGJhY2sgZm9yIHRoZSByZWNvcmQgYmVoaW5kIGl0LlxuICAgKi9cbiAgaW5oZXJpdDxUPihvdXRwdXQ6IFQpOiBUIHtcbiAgICB0aGlzLm9wZW4gPSBmYWxzZTtcbiAgICBpZiAob3V0cHV0ID09PSBudWxsIHx8IHR5cGVvZiBvdXRwdXQgIT09ICdvYmplY3QnKSByZXR1cm4gb3V0cHV0O1xuICAgIGxldCBvdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICAgIGZvciAoY29uc3QgW3RhcmdldCwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG91dHB1dCkpIHtcbiAgICAgIGNvbnN0IGNvcGllZCA9IHRoaXMuY29waWVkVmVyZGljdCh0YXJnZXQsIHZhbHVlKTtcbiAgICAgIGlmIChjb3BpZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZFJlYWQgfHwgdGhpcy5lbWJlZHNTZWxlY3RlZCh2YWx1ZSwgbmV3IFdlYWtTZXQoKSkpIHRoaXMucnVsZS5tYXJrKHRhcmdldCk7XG4gICAgICB9IGVsc2UgaWYgKGNvcGllZC5raW5kID09PSAnd2hvbGUnKSB0aGlzLnJ1bGUubWFyayh0YXJnZXQpO1xuICAgICAgZWxzZSBpZiAoY29waWVkLmtpbmQgPT09ICdmaWVsZHMnKSB0aGlzLnJ1bGUuaW5oZXJpdEZpZWxkcyh0YXJnZXQsIGNvcGllZC5wYXRocyk7XG4gICAgICBjb25zdCByYXcgPSB0aGlzLmJlaGluZCh2YWx1ZSk7XG4gICAgICAvLyBBbiBvYmplY3QgcGFzc2VkIG9uIEJZIFJFRkVSRU5DRSBtYXkgY2Fycnkgd2hhdCB0aGUgbWFwcGVyIHBsYW50ZWQgaW4gaXRcbiAgICAgIC8vIChgT2JqZWN0LmFzc2lnbihwLnJlcXVlc3QsIHsgYXV0aDogcC50b2tlbiB9KWAsIGBwLmxpc3QucHVzaChwLnRva2VuKWApOlxuICAgICAgLy8gZWFjaCBwbGFjZSBpdCBob2xkcyBhIHNlbGVjdGVkIHZhbHVlIHRoZSBtYXBwZXIgcmVhZCBpcyBhIGZpZWxkIG9mIHRoZSBuZXcga2V5LlxuICAgICAgaWYgKGNvcGllZCAhPT0gdW5kZWZpbmVkICYmIGNvcGllZC5raW5kICE9PSAnd2hvbGUnICYmIHJhdyAhPT0gbnVsbCAmJiB0eXBlb2YgcmF3ID09PSAnb2JqZWN0Jykge1xuICAgICAgICBjb25zdCBwbGFudGVkID0gdGhpcy5wbGFudGVkUGF0aHMocmF3KTtcbiAgICAgICAgaWYgKHBsYW50ZWQubGVuZ3RoID4gMCkgdGhpcy5ydWxlLmluaGVyaXRGaWVsZHModGFyZ2V0LCBwbGFudGVkKTtcbiAgICAgIH1cbiAgICAgIGlmIChyYXcgIT09IHZhbHVlKSB7XG4gICAgICAgIG91dCA/Pz0gKEFycmF5LmlzQXJyYXkob3V0cHV0KSA/IFsuLi5vdXRwdXRdIDogeyAuLi5vdXRwdXQgfSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgIG91dFt0YXJnZXRdID0gcmF3O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gKG91dCA/PyBvdXRwdXQpIGFzIFQ7XG4gIH1cblxuICAvKiogV2hhdCBvbmUgcmVjb3JkZWQgcmVhZCBoYW5kcyB0aGUgbWFwcGVyIChzZWUgdGhlIGNsYXNzKS4gKi9cbiAgcHJpdmF0ZSBzZXJ2ZWQoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdW5rbm93biB7XG4gICAgaWYgKCF0aGlzLm9wZW4pIHJldHVybiB2YWx1ZTtcbiAgICBjb25zdCByZWFkID0gdGhpcy5ieU5hbWUuZ2V0KGtleSk7XG4gICAgaWYgKHJlYWQgPT09IHVuZGVmaW5lZCkgdGhpcy5ieU5hbWUuc2V0KGtleSwgW3ZhbHVlXSk7XG4gICAgZWxzZSByZWFkLnB1c2godmFsdWUpO1xuICAgIGNvbnN0IHZlcmRpY3QgPSB0aGlzLnJ1bGUudmVyZGljdE9mUmVhZChrZXksIHZhbHVlKTtcbiAgICAvLyBBbiBhYnNlbnQga2V5IGNhcnJpZXMgbm8gc2VjcmV0OyBuZWl0aGVyIGRvZXMgYSB2YWx1ZSB3aXRoIG5vIGZpZWxkcyAoYSBzY2FsYXIpIG9yIG5vbmUgb2ZcbiAgICAvLyBpdHMgc2VsZWN0ZWQgb25lcyDigJQgc3RhdGUgcmV0YWlucyB0aG9zZSBhcyB0aGV5IGFyZSB0b28uXG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiB2YWx1ZTtcbiAgICBpZiAodmVyZGljdC5raW5kID09PSAnZmllbGRzJykge1xuICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgIVJlZGFjdGlvblJ1bGUuaG9sZHNQYXRocyh2YWx1ZSwgdmVyZGljdC5wYXRocykpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVtZW1iZXIodmFsdWUsIHZlcmRpY3QpO1xuICAgICAgfVxuICAgICAgaWYgKGlzUGxhaW5SZWNvcmQodmFsdWUpKSByZXR1cm4gdGhpcy5maWVsZHNWaWV3KHZhbHVlLCB2ZXJkaWN0KTtcbiAgICB9XG4gICAgaWYgKHZlcmRpY3Qua2luZCAhPT0gJ2NsZWFyJykge1xuICAgICAgdGhpcy5zZWxlY3RlZFJlYWQgPSB0cnVlO1xuICAgICAgaWYgKHZlcmRpY3Qua2luZCA9PT0gJ3dob2xlJykgdGhpcy5zZWNyZXRSZWFkcy5wdXNoKHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucmVtZW1iZXIodmFsdWUsIHZlcmRpY3QpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1lbWJlcih2YWx1ZTogdW5rbm93biwgdmVyZGljdDogUmVkYWN0aW9uVmVyZGljdCk6IHVua25vd24ge1xuICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICB0aGlzLnNvdXJjZXMuc2V0KHZhbHVlLCBzdHJpY3Rlcih0aGlzLnNvdXJjZXMuZ2V0KHZhbHVlKSwgdmVyZGljdCkpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvKiogQSBgZmllbGRzYC1zZWxlY3RlZCByZWNvcmQ6IHJlYWRpbmcgb25lIG9mIGl0cyBzZWxlY3RlZCBmaWVsZHMgKG9yIGEgcGF0aCdzIGZpcnN0IHNlZ21lbnQpIGlzIGEgc2VsZWN0ZWQgcmVhZC4gKi9cbiAgcHJpdmF0ZSBmaWVsZHNWaWV3KHJlY29yZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIHZlcmRpY3Q6IFJlZGFjdGlvblZlcmRpY3QgJiB7IGtpbmQ6ICdmaWVsZHMnIH0pOiBvYmplY3Qge1xuICAgIGNvbnN0IHNlbGVjdGVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgZm9yIChjb25zdCBwYXRoIG9mIHZlcmRpY3QucGF0aHMpIHNlbGVjdGVkLmFkZChwYXRoKS5hZGQocGF0aC5zcGxpdCgnLicpWzBdKTtcbiAgICBjb25zdCB2aWV3ID0gdGhpcy52aWV3T2YocmVjb3JkLCAoa2V5KSA9PiB7XG4gICAgICBpZiAodGhpcy5vcGVuICYmIHNlbGVjdGVkLmhhcyhrZXkpKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRSZWFkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zZWNyZXRSZWFkcy5wdXNoKHJlY29yZFtrZXldKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZWNvcmRba2V5XTtcbiAgICB9KTtcbiAgICB0aGlzLnZpZXdzLnNldCh2aWV3LCB7IHJhdzogcmVjb3JkLCB2ZXJkaWN0IH0pO1xuICAgIHJldHVybiB2aWV3O1xuICB9XG5cbiAgcHJpdmF0ZSB2aWV3T2YocmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgcmVhZDogKGtleTogc3RyaW5nKSA9PiB1bmtub3duKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIGNvbnN0IHZpZXc6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMocmVjb3JkKSkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHZpZXcsIGtleSwge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGdldDogKCkgPT4gcmVhZChrZXkpLFxuICAgICAgICBzZXQ6ICh2YWx1ZTogdW5rbm93bikgPT4ge1xuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh2aWV3LCBrZXksIHsgdmFsdWUsIHdyaXRhYmxlOiB0cnVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHZpZXc7XG4gIH1cblxuICAvKiogVGhlIHJlY29yZCBiZWhpbmQgYSB2aWV3IHRoZSBtYXBwZXIgcmV0dXJuZWQ7IGFueSBvdGhlciB2YWx1ZSBhcyBpdCBpcy4gKi9cbiAgcHJpdmF0ZSBiZWhpbmQodmFsdWU6IHVua25vd24pOiB1bmtub3duIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgcmV0dXJuIHZhbHVlO1xuICAgIHJldHVybiB0aGlzLnZpZXdzLmdldCh2YWx1ZSk/LnJhdyA/PyB0aGlzLnJlY29yZHMuZ2V0KHZhbHVlKSA/PyB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdmVyZGljdCBgdGFyZ2V0YCBpbmhlcml0cyBmcm9tIGB2YWx1ZWAg4oCUIGB1bmRlZmluZWRgIHdoZW4gaXQgaXNcbiAgICogbmVpdGhlciBhIHZhbHVlIHRoZSBtYXBwZXIgcmVhZCBub3Igb25lIHBhc3NlZCB1bmRlciBpdHMgb3duIG5hbWUuXG4gICAqL1xuICBwcml2YXRlIGNvcGllZFZlcmRpY3QodGFyZ2V0OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogUmVkYWN0aW9uVmVyZGljdCB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLnZpZXdzLmdldCh2YWx1ZSk7XG4gICAgICBpZiAodmlldykgcmV0dXJuIHZpZXcudmVyZGljdDtcbiAgICAgIGNvbnN0IHJlY29yZCA9IHRoaXMucmVjb3Jkcy5nZXQodmFsdWUpO1xuICAgICAgaWYgKHJlY29yZCkgcmV0dXJuIHRoaXMuc2VsZWN0ZWRGaWVsZHNPZihyZWNvcmQpO1xuICAgICAgY29uc3Qga25vd24gPSB0aGlzLnNvdXJjZXMuZ2V0KHZhbHVlKTtcbiAgICAgIGlmIChrbm93bikgcmV0dXJuIGtub3duO1xuICAgIH1cbiAgICBjb25zdCByZWFkID0gdGhpcy5ieU5hbWUuZ2V0KHRhcmdldCk7XG4gICAgcmV0dXJuIHJlYWQ/LnNvbWUoKHYpID0+IE9iamVjdC5pcyh2LCB2YWx1ZSkpID8gdGhpcy5ydWxlLnZlcmRpY3RPZlJlYWQodGFyZ2V0LCB2YWx1ZSkgOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiogQSB3aG9sZSByZWNvcmQncyBzZWxlY3RlZCBrZXlzLCBhcyBmaWVsZHMgb2Ygd2hhdGV2ZXIga2V5IGl0IGlzIHBhc3NlZCBvbiB1bmRlci4gKi9cbiAgcHJpdmF0ZSBzZWxlY3RlZEZpZWxkc09mKHJlY29yZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBSZWRhY3Rpb25WZXJkaWN0IHtcbiAgICBjb25zdCBwYXRoczogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhyZWNvcmQpKSB7XG4gICAgICBjb25zdCB2ZXJkaWN0ID0gdGhpcy5ydWxlLnZlcmRpY3RPZlJlYWQoa2V5LCByZWNvcmRba2V5XSk7XG4gICAgICBpZiAodmVyZGljdC5raW5kID09PSAnd2hvbGUnKSBwYXRocy5wdXNoKGtleSk7XG4gICAgICBlbHNlIGlmICh2ZXJkaWN0LmtpbmQgPT09ICdmaWVsZHMnKSBmb3IgKGNvbnN0IHBhdGggb2YgdmVyZGljdC5wYXRocykgcGF0aHMucHVzaChgJHtrZXl9LiR7cGF0aH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhdGhzLmxlbmd0aCA9PT0gMCA/IENMRUFSIDogeyBraW5kOiAnZmllbGRzJywga2V5OiAnJywgcGF0aHMgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGVyZSBgcm9vdGAgKGFuIG9iamVjdCB0aGUgbWFwcGVyIHBhc3NlZCBvbiBieSByZWZlcmVuY2UpIGhvbGRzIG9uZSBvZiB0aGVcbiAgICogc2VsZWN0ZWQgUFJJTUlUSVZFUyBpdCByZWFkIOKAlCBtYXRjaGVkIGJ5IHZhbHVlLCBvbmx5IGFnYWluc3Qgd2hhdCB0aGlzXG4gICAqIG1hcHBlciByZWFkIGFuZCBvbmx5IGluc2lkZSB3aGF0IGl0IHBhc3NlZCBvbiwgc28gb3Zlci1tYXRjaGluZyBhbiBlcXVhbFxuICAgKiB2YWx1ZSBpcyB0aGUgc2FmZSBzaWRlLiBPbmUgcmVsYXRpdmUgcGF0aCBwZXIgcGxhY2UsIGEgc2hhcmVkIG9iamVjdCBhdFxuICAgKiBlYWNoIG9mIGl0cyBwYXRoczsgYSBjeWNsZSBlZGdlIGlzIG5vdCBmb2xsb3dlZC5cbiAgICovXG4gIHByaXZhdGUgcGxhbnRlZFBhdGhzKHJvb3Q6IG9iamVjdCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBzZWNyZXRzID0gbmV3IFNldDx1bmtub3duPigpO1xuICAgIGNvbnN0IGNvbGxlY3QgPSAodmFsdWU6IHVua25vd24sIHNlZW46IFNldDxvYmplY3Q+KTogdm9pZCA9PiB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2JpZ2ludCcpIHNlY3JldHMuYWRkKHZhbHVlKTtcbiAgICAgIGVsc2UgaWYgKHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgIXNlZW4uaGFzKHZhbHVlKSkge1xuICAgICAgICBzZWVuLmFkZCh2YWx1ZSk7XG4gICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgT2JqZWN0LnZhbHVlcyh2YWx1ZSkpIGNvbGxlY3QoY2hpbGQsIHNlZW4pO1xuICAgICAgfVxuICAgIH07XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiB0aGlzLnNlY3JldFJlYWRzKSBjb2xsZWN0KHZhbHVlLCBuZXcgU2V0KCkpO1xuICAgIGlmIChzZWNyZXRzLnNpemUgPT09IDApIHJldHVybiBbXTtcbiAgICBjb25zdCBtZW1vID0gbmV3IE1hcDxvYmplY3QsIHN0cmluZ1tdPigpO1xuICAgIGNvbnN0IG9uUGF0aCA9IG5ldyBTZXQ8b2JqZWN0PigpO1xuICAgIGNvbnN0IGluc2lkZSA9IChub2RlOiBvYmplY3QpOiBzdHJpbmdbXSA9PiB7XG4gICAgICBjb25zdCBrbm93biA9IG1lbW8uZ2V0KG5vZGUpO1xuICAgICAgaWYgKGtub3duICE9PSB1bmRlZmluZWQpIHJldHVybiBrbm93bjtcbiAgICAgIGlmIChvblBhdGguaGFzKG5vZGUpKSByZXR1cm4gW107XG4gICAgICBvblBhdGguYWRkKG5vZGUpO1xuICAgICAgY29uc3QgZm91bmQ6IHN0cmluZ1tdID0gW107XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIGNoaWxkXSBvZiBPYmplY3QuZW50cmllcyhub2RlKSkge1xuICAgICAgICBpZiAoY2hpbGQgIT09IG51bGwgJiYgdHlwZW9mIGNoaWxkID09PSAnb2JqZWN0JykgZm9yIChjb25zdCBzdWIgb2YgaW5zaWRlKGNoaWxkKSkgZm91bmQucHVzaChgJHtrZXl9LiR7c3VifWApO1xuICAgICAgICBlbHNlIGlmIChzZWNyZXRzLmhhcyhjaGlsZCkpIGZvdW5kLnB1c2goa2V5KTtcbiAgICAgIH1cbiAgICAgIG9uUGF0aC5kZWxldGUobm9kZSk7XG4gICAgICBtZW1vLnNldChub2RlLCBmb3VuZCk7XG4gICAgICByZXR1cm4gZm91bmQ7XG4gICAgfTtcbiAgICByZXR1cm4gaW5zaWRlKHJvb3QpO1xuICB9XG5cbiAgLyoqIERvZXMgYSB2YWx1ZSB0aGUgbWFwcGVyIEJVSUxUIGVtYmVkLCBieSByZWZlcmVuY2UsIGEgc2VsZWN0ZWQgcmVjb3JkIGl0IHJlYWQgb3Igd2FzIGhhbmRlZD8gKi9cbiAgcHJpdmF0ZSBlbWJlZHNTZWxlY3RlZCh2YWx1ZTogdW5rbm93biwgc2VlbjogV2Vha1NldDxvYmplY3Q+KTogYm9vbGVhbiB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgc2Vlbi5oYXModmFsdWUpKSByZXR1cm4gZmFsc2U7XG4gICAgc2Vlbi5hZGQodmFsdWUpO1xuICAgIGlmICh0aGlzLnZpZXdzLmhhcyh2YWx1ZSkpIHJldHVybiB0cnVlO1xuICAgIGNvbnN0IHJlY29yZCA9IHRoaXMucmVjb3Jkcy5nZXQodmFsdWUpO1xuICAgIGlmIChyZWNvcmQpIHJldHVybiB0aGlzLnNlbGVjdGVkRmllbGRzT2YocmVjb3JkKS5raW5kICE9PSAnY2xlYXInO1xuICAgIGNvbnN0IGtub3duID0gdGhpcy5zb3VyY2VzLmdldCh2YWx1ZSk7XG4gICAgaWYgKGtub3duICE9PSB1bmRlZmluZWQgJiYga25vd24ua2luZCAhPT0gJ2NsZWFyJykgcmV0dXJuIHRydWU7XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBPYmplY3QudmFsdWVzKHZhbHVlKSkgaWYgKHRoaXMuZW1iZWRzU2VsZWN0ZWQoY2hpbGQsIHNlZW4pKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgY29tbWl0IGxvZydzIHNjcnViOiBgcGF0Y2hgIHdpdGgge0BsaW5rIExPR19QTEFDRUhPTERFUn0gYXQgZXZlcnkgcGF0aCBpbiBgcmVkYWN0ZWRQYXRoc2AgdGhhdFxuICogaG9sZHMgYSBkZWZpbmVkIHZhbHVlIOKAlCB0aGUgY29weSBgU3RhZ2VDb250ZXh0IMK3IGNvbW1pdGAgcmVjb3JkcyBhbmQgZmVlZHMgdGhlIHJlZGFjdGVkIG1pcnJvci5cbiAqXG4gKiBDTE9ORS1GUkVFICg5LjMzLjApLiBUaGUgcGF0Y2ggaXMgdGhlIHRyYW5zYWN0aW9uIGJ1ZmZlcidzIGNvbW1pdC10aW1lIHBheWxvYWQsIGFscmVhZHkgdGhlIHJlY29yZCdzXG4gKiBvd24gY29weSAoYFRyYW5zYWN0aW9uQnVmZmVyIMK3IGNvbW1pdGAgY2xvbmVzIGVhY2ggc3Vydml2aW5nIHBhdGggb25jZTsgdGhlIGJ1ZmZlciBpcyBkcm9wcGVkIGF0XG4gKiBjb21taXQpLCBzbyB0aGUgc2NydWIgY29waWVzIG9ubHkgd2hhdCBpdCBtdXN0IG5vdCBlZGl0IGluIHBsYWNlOlxuICogICAtIG5vIHBhdGggdG8gc2NydWIgKG5vIHBvbGljeSwgbm8gcGVyLWNhbGwgbWFyayDigJQgdGhlIGNvbW1vbiBjYXNlKSDihpIgYHBhdGNoYCBJVFNFTEYsIG5vIGNvcHkgYXQgYWxsO1xuICogICAtIG90aGVyd2lzZSDihpIgYSBuZXcgcm9vdCBhbmQgYSBzaGFsbG93IGNvcHkgb2YgZWFjaCBjb250YWluZXIgb24gYSBzY3J1YmJlZCBwYXRoIChgcGF0aE9wcyDCt1xuICogICAgIG93blNwaW5lYCksIGV2ZXJ5IG90aGVyIHN1YnRyZWUgc2hhcmVkIHdpdGggYHBhdGNoYC4gYHBhdGNoYCBpcyBuZXZlciBlZGl0ZWQuXG4gKiBUaGUgZW5naW5lIGNhbGxlZCB0aGUgcHVibGljIHtAbGluayByZWRhY3RQYXRjaH0gKGEgd2hvbGUgYHN0cnVjdHVyZWRDbG9uZWApIHR3aWNlIHBlciBjb21taXQgYmVmb3JlXG4gKiA5LjMzLjAuIFRoZSBieXRlcyBhcmUgdGhlIHNhbWU6IGEgc2NydWJiZWQgcGF0aCBob2xkcyB0aGUgcGxhY2Vob2xkZXIsIGV2ZXJ5IG90aGVyIHBhdGggdGhlIHZhbHVlIHRoZVxuICogYnVmZmVyIGNsb25lZCAocGlubmVkIGJ5IHRoZSA5LjE4LjEgLyA5LjE5LjEgcmVkYWN0aW9uIGJ5dGUgdGVzdHMpLlxuICpcbiAqIFBhdGhzIGFyZSBzY3J1YmJlZCBpbiB0aGUgc2V0J3Mgb3JkZXIsIGFnYWluc3QgdGhlIHRyZWUgYXMgc2NydWJiZWQgc28gZmFyOiBhIHBhdGggdW5kZXIgb25lIGFscmVhZHlcbiAqIHNjcnViYmVkIGZpbmRzIGEgc3RyaW5nLCBub3QgYSBjb250YWluZXIsIGFuZCBpcyBsZWZ0IGFsb25lIChhcyBiZWZvcmUpLlxuICpcbiAqIElOVEVSTkFMIOKAlCB0aGUgcmVzdWx0IHNoYXJlcyBzdHJ1Y3R1cmUgd2l0aCBgcGF0Y2hgLiBBIGNhbGxlciBvdXRzaWRlIHRoZSBjb21taXQgcGF0aCB3YW50c1xuICoge0BsaW5rIHJlZGFjdFBhdGNofS5cbiAqXG4gKiBAcGFyYW0gcmVkYWN0ZWRQYXRocyBERUxJTS1qb2luZWQgcGF0aHMgKGBUcmFuc2FjdGlvbkJ1ZmZlcmAncyBgcmVkYWN0ZWRQYXRoc2A7IGEgYnVuZGxlJ3NcbiAqICAgYHJlZGFjdGVkUGF0aHNgIGFycmF5IHdvcmtzIHRvbykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzY3J1YlBhdGNoKHBhdGNoOiBNZW1vcnlQYXRjaCwgcmVkYWN0ZWRQYXRoczogSXRlcmFibGU8c3RyaW5nPik6IE1lbW9yeVBhdGNoIHtcbiAgbGV0IG91dDogTWVtb3J5UGF0Y2ggfCB1bmRlZmluZWQ7XG4gIGxldCBvd25lZDogV2Vha1NldDxvYmplY3Q+IHwgdW5kZWZpbmVkO1xuICBmb3IgKGNvbnN0IGZsYXQgb2YgcmVkYWN0ZWRQYXRocykge1xuICAgIGNvbnN0IHNlZ3MgPSBmbGF0LnNwbGl0KERFTElNKTtcbiAgICBjb25zdCBjdXJyZW50ID0gb3V0ID8/IHBhdGNoO1xuICAgIGlmICghbmF0aXZlSGFzKGN1cnJlbnQsIHNlZ3MpIHx8IG5hdGl2ZUdldChjdXJyZW50LCBzZWdzKSA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICBpZiAob3V0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIG93bmVkID0gbmV3IFdlYWtTZXQ8b2JqZWN0PigpO1xuICAgICAgb3V0ID0gb3duZWRSb290T2YocGF0Y2gsIG93bmVkKSBhcyBNZW1vcnlQYXRjaDtcbiAgICB9XG4gICAgb3duU3BpbmUob3V0LCBzZWdzLCBvd25lZCEpO1xuICAgIG5hdGl2ZVNldChvdXQsIHNlZ3MsIExPR19QTEFDRUhPTERFUik7XG4gIH1cbiAgcmV0dXJuIG91dCA/PyBwYXRjaDtcbn1cblxuLyoqXG4gKiBSZWRhY3RzIHNlbnNpdGl2ZSB2YWx1ZXMgaW4gYSBwYXRjaCBmb3IgbG9nZ2luZy9kZWJ1Z2dpbmcg4oCUIHRoZSBQVUJMSUMgc2NydWIgKGBmb290cHJpbnRqcy9hZHZhbmNlZGApLFxuICogaXRzIGNvbnRyYWN0IHVuY2hhbmdlZCBzaW5jZSA0Lng6IGEgZnJlc2ggZGVlcCBjb3B5IG9mIGBwYXRjaGAgKGBzdHJ1Y3R1cmVkQ2xvbmVgKSB3aXRoXG4gKiB7QGxpbmsgTE9HX1BMQUNFSE9MREVSfSBhdCBldmVyeSBsaXN0ZWQgcGF0aCB0aGF0IGhvbGRzIGEgZGVmaW5lZCB2YWx1ZS4gU2hhcmVzIG5vdGhpbmcgd2l0aCBgcGF0Y2hgXG4gKiBhbmQgbmV2ZXIgZWRpdHMgaXQuIChNb3ZlZCBoZXJlIGZyb20gYG1lbW9yeS91dGlscy50c2AgaW4gOS4zMy4wOyB0aGUgZW5naW5lJ3Mgb3duIGNvbW1pdCBwYXRoIHVzZXMgdGhlXG4gKiBjbG9uZS1mcmVlIHtAbGluayBzY3J1YlBhdGNofS4pXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWRhY3RQYXRjaChwYXRjaDogTWVtb3J5UGF0Y2gsIHJlZGFjdGVkU2V0OiBTZXQ8c3RyaW5nPik6IE1lbW9yeVBhdGNoIHtcbiAgcmV0dXJuIHNjcnViUGF0Y2goc3RydWN0dXJlZENsb25lKHBhdGNoKSwgcmVkYWN0ZWRTZXQpO1xufVxuIl19
|
|
1335
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkYWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvcmVkYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnREc7QUFFSCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTFDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxVQUFVLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUV0RSxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN0RixPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ25DLE9BQU8sRUFBRSxlQUFlLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQTRFdkUsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFxQixNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBVyxDQUFDLENBQUM7QUFFakY7Ozs7OztHQU1HO0FBQ0gsTUFBTSxtQkFBbUIsR0FBRyxHQUFHLENBQUM7QUFFaEM7Ozs7Ozs7R0FPRztBQUNILFNBQVMsY0FBYyxDQUFDLE1BQTRDLEVBQUUsR0FBVztJQUMvRSxPQUFPLE1BQU0sS0FBSyxTQUFTLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDN0csQ0FBQztBQUVELCtFQUErRTtBQUMvRSxTQUFTLGNBQWMsQ0FBQyxLQUFhLEVBQUUsUUFBdUM7SUFDNUUsSUFBSSxDQUFDLFFBQVE7UUFBRSxPQUFPLEtBQUssQ0FBQztJ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dkMsS0FBSyxNQUFNLElBQUksSUFBSSxhQUFhLEVBQUUsQ0FBQztRQUNqQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQy9CLE1BQU0sT0FBTyxHQUFHLEdBQUcsSUFBSSxLQUFLLENBQUM7UUFDN0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUksU0FBUyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsS0FBSyxTQUFTO1lBQUUsU0FBUztRQUNsRixJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN0QixLQUFLLEdBQUcsSUFBSSxPQUFPLEVBQVUsQ0FBQztZQUM5QixHQUFHLEdBQUcsV0FBVyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQWdCLENBQUM7UUFDakQsQ0FBQztRQUNELFFBQVEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEtBQU0sQ0FBQyxDQUFDO1FBQzVCLFNBQVMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFDRCxPQUFPLEdBQUcsSUFBSSxLQUFLLENBQUM7QUFDdEIsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQUMsS0FBa0IsRUFBRSxXQUF3QjtJQUN0RSxPQUFPLFVBQVUsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUM7QUFDekQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogcmVkYWN0aW9uLnRzIOKAlCBUaGUgT05FIG93bmVyIG9mIHdoYXQgYSByZWRhY3Rpb24gcG9saWN5IHNheXMgYWJvdXQgYSB2YWx1ZS5cbiAqXG4gKiBUSEUgTEFXIChvd25lciBydWxpbmcgKGEpKS4gQSByZWRhY3Rpb24gcG9saWN5IGNvdmVycyBFVkVSWVRISU5HIHRoZSBsaWJyYXJ5XG4gKiByZXRhaW5zIG9yIHNlcnZlcyDigJQgdGhlIGNvbW1pdCBsb2cgKGJvdGggZW5jb2RpbmdzKSwgdGhlIHJlZGFjdGVkIG1pcnJvcixcbiAqIHRyYWNrZWQgcmVhZHMvd3JpdGVzLCBldmVyeSByZWNvcmRlciBldmVudCAoaW5saW5lIGFuZCBkZWZlcnJlZCkgYW5kIHRoZVxuICogcmVjb3JkZXIgcm93cyBidWlsdCBmcm9tIHRoZW0sIHRoZSBuYXJyYXRpdmUsIHNuYXBzaG90cywgZGlhZ25vc3RpY3MsIHBhdXNlXG4gKiBwYXlsb2FkcywgYm91bmRhcnkgcmVjb3JkcyBhbmQgbG9nIGxpbmVzIOKAlCBhbmQgTkVWRVIgdGhlIGxpdmUgaGVhcCBvciB0aGVcbiAqIHJlc3VtZSBjaGVja3BvaW50LiBUd28gdmFsdWVzIGFyZSB0aGUgY2FsbGVyJ3Mgb3duIGFuZCBzdGF5IHJlYWw6IHRoZVxuICogYHJ1bigpYCByZWplY3Rpb24gKHRoZSB0aHJvd24gdmFsdWUgaXRzZWxmKSBhbmQgdGhlIGxpdmUgZm9yayByZXN1bHQuXG4gKlxuICogQSBwb2xpY3kgc2VsZWN0cyBieSBOQU1FIOKAlCBhIGtleSwgYSBkb3R0ZWQgcGF0aCwgYSBmaWVsZCDigJQgbmV2ZXIgYnlcbiAqIHNjYW5uaW5nIGNvbnRlbnQuIFdoYXQgY2FycmllcyBhIG5hbWU6XG4gKiAgIC0gc3RhdGUg4oCUIGl0cyB1c2VyLWxldmVsIHBhdGggKHtAbGluayBSZWRhY3Rpb25SdWxlLnZlcmRpY3R9KTtcbiAqICAgLSBhIHJlY29yZCBoYW5kZWQgb3V0IHdob2xlIOKAlCByb290IGlucHV0L291dHB1dCwgYSBzdWJmbG93J3MgbWFwcGVkIHNlZWRcbiAqICAgICBhbmQgZXhpdCBzdGF0ZSwgYSBwYXVzZSBwYXlsb2FkLCBhIHRocm93biB2YWx1ZSDigJQgaXRzIGtleXMgYXQgZXZlcnlcbiAqICAgICBkZXB0aCAoe0BsaW5rIFJlZGFjdGlvblJ1bGUucmV0YWluQm91bmRhcnl9KTtcbiAqICAgLSBhIGRpYWdub3N0aWMgZW50cnkg4oCUIGAkZGVidWdgL2AkZXJyb3JgL2AkbWV0cmljYC9gJGV2YWxgL2AkbG9nYCBhbmQgdGhlXG4gKiAgICAgZW5naW5lJ3Mgb3duIOKAlCB0aGUgcmVjb3JkIGB7IFtuYW1lXTogdmFsdWUgfWA6IGl0cyBuYW1lIElTIGEgc3RhdGUga2V5XG4gKiAgICAgKHtAbGluayBSZWRhY3Rpb25SdWxlLnJldGFpbkRpYWdub3N0aWN9KS4gYHBvbGljeS5kaWFnbm9zdGljc2AgYWRkc1xuICogICAgIGRpYWdub3N0aWMtb25seSBzZWxlY3RvcnMgb24gdG9wOyBmbG93LW1lc3NhZ2UgdGV4dCBoYXMgbm8gbmFtZSBvZiBpdHNcbiAqICAgICBvd24sIHNvIG9ubHkgdGhleSBzZWxlY3QgaXQ7XG4gKiAgIC0gYSBzdWJmbG93IG1hcHBlcidzIGNvcHkg4oCUIGEga2V5IGFuIGBpbnB1dE1hcHBlcmAvYG91dHB1dE1hcHBlcmAgKG9yIGFcbiAqICAgICBgcGFyYWxsZWxGb3JFYWNoYCBpdGVtcyBzZWxlY3Rvcikgd3JvdGUgaW5oZXJpdHMgdGhlIHJlZGFjdGlvbiBvZiB0aGVcbiAqICAgICBzZWxlY3RlZCB2YWx1ZSBpdCBjb3BpZWQgKHtAbGluayBNYXBwZXJUYWludH0pLlxuICogQSBtYXJrIGlzIGEgTkFNRSwgcnVuLXdpZGUsIHVudGlsIHRoZSBrZXkgaXMgZGVsZXRlZDsgYSBwYXVzZSBjYXJyaWVzIHRoZVxuICogbWFya3Mg4oCUIG5hbWVzIG9ubHkg4oCUIHRvIHRoZSByZXN1bWVkIHJ1biAoe0BsaW5rIFJlZGFjdGlvblJ1bGUubWFya3NGb3JDaGVja3BvaW50fSkuXG4gKiBBIHZhbHVlIHdpdGggbm8gbmFtZSDigJQgYSBzY2FsYXIgcm9vdCBpbnB1dC9vdXRwdXQgb3IgcGF1c2UgcGF5bG9hZCwgZnJlZVxuICogZXJyb3IgdGV4dCDigJQgaXMgc2VsZWN0ZWQgYnkgbm90aGluZy4gYGVtaXRQYXR0ZXJuc2AgaXMgdGhlIG9uZSBzZXBhcmF0ZVxuICogc2NydWI6IGEgYCRlbWl0YCBwYXlsb2FkIGlzIHNlbGVjdGVkIGJ5IGl0cyBldmVudCBuYW1lLlxuICpcbiAqIEhPVyBPTkUgT1dORVIgS0VFUFMgSVQuIEV2ZXJ5IHN0YWdlZCB3cml0ZSBhbmQgZXZlcnkgdHJhY2tlZCByZWFkIHBhc3Nlc1xuICogdGhyb3VnaCBgU3RhZ2VDb250ZXh0YCwgc28gYFN0YWdlQ29udGV4dGAgYXNrcyBUSElTIHJ1bGUg4oCUIG5vdCB0aGUgY2FsbGVyIOKAlFxuICogd2hhdCB0aGUgcG9saWN5IHNheXMgYWJvdXQgdGhlIHBhdGggaXQgaXMgYWJvdXQgdG8gcmV0YWluLiBBIGBTY29wZUZhY2FkZWBcbiAqIHdyaXRlLCBhIHN1YmZsb3cgYGlucHV0TWFwcGVyYCBzZWVkLCBhbiBgb3V0cHV0TWFwcGVyYCBtZXJnZS1iYWNrIGFuZCBhXG4gKiByZXN1bWUgcmUtc2VlZCBhcmUgdGhlbiBhbGwgdGhlIHNhbWUgY2FzZTogdGhlIGZ1bm5lbCBkZWNpZGVzLCB0aGUgY2FsbGVyXG4gKiBjYW5ub3QgZm9yZ2V0IHRvLiBUaGUgZmFjYWRlIHVzZXMgdGhlIHNhbWUgcnVsZSBmb3IgdGhlIHZhbHVlcyBpdCBoYW5kcyB0b1xuICogcmVjb3JkZXJzOyBgU3ViZmxvd0V4ZWN1dG9yYCB1c2VzIGl0IGZvciB0aGUgbmFycmF0ZWQgc2VlZCBhbmRcbiAqIGBGbG93Y2hhcnRUcmF2ZXJzZXIuZXhlY3V0ZWAgZm9yIHJvb3QgaW5wdXQvb3V0cHV0IGJlZm9yZSBkaXNwYXRjaC4gQmVmb3JlIDkuMTkuMFxuICogdGhlIGZhY2FkZSBoZWxkIHRoZSB2ZXJkaWN0IGFsb25lLCBhbmQgZXZlcnkgcGF0aCB0aGF0IHdyb3RlIG9yIHJlYWQgcGFzdFxuICogdGhlIGZhY2FkZSDigJQgZml2ZSBvZiB0aGVtIOKAlCByZXRhaW5lZCBwbGFpbnRleHQgdW5kZXIgYSBwb2xpY3kuXG4gKlxuICogVFdPIFBMQUNFSE9MREVSUywgQk9USCBISVNUT1JJQ0FMOiB0aGUgY29tbWl0IGxvZyBhbmQgdGhlIG1pcnJvciBjYXJyeVxuICogYCdSRURBQ1RFRCdgIChgc2NydWJQYXRjaGAgLyBgcmVkYWN0UGF0Y2hgLCBiZWxvdyDigJQgdGhlIHN0cmluZ3MgdW5jaGFuZ2VkIHNpbmNlIDQueCk7IGV2ZXJ5IHNjb3BlLXRpZXIgdmlldyDigJRcbiAqIHNjb3BlIHJlY29yZGVyIGV2ZW50cywgYHN0YWdlUmVhZHNgL2BzdGFnZVdyaXRlc2AsIG5hcnJhdGl2ZSDigJQgY2Fycmllc1xuICogYCdbUkVEQUNURURdJ2AuIE5laXRoZXIgc3RyaW5nIGNoYW5nZWQgaW4gOS4xOS4wLiBUaGUgc3RyaW5ncyB0aGVtc2VsdmVzIGFyZVxuICogb3duZWQgYnkgYG1lbW9yeS9wbGFjZWhvbGRlcnMudHNgIChgTE9HX1BMQUNFSE9MREVSYCAvIGBTQ09QRV9QTEFDRUhPTERFUmApXG4gKiBhbmQgc3BlbGxlZCBub3doZXJlIGVsc2UgaW4gYHNyYy9gIOKAlCB0aGlzIHJ1bGUgYXNrcyBmb3IgdGhlIHNjb3BlIG9uZSBieSBuYW1lLlxuICovXG5cbmltcG9ydCB7IGlzRGV2TW9kZSB9IGZyb20gJy4uL2Rldk1vZGUuanMnO1xuaW1wb3J0IHR5cGUgeyBTdHJ1Y3R1cmVkRXJyb3JJbmZvIH0gZnJvbSAnLi4vZXJyb3JzL2Vycm9ySW5mby5qcyc7XG5pbXBvcnQgeyBleHRyYWN0RXJyb3JJbmZvLCB0aHJvd25UZXh0IH0gZnJvbSAnLi4vZXJyb3JzL2Vycm9ySW5mby5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlZGFjdGlvbk1hcmtzIH0gZnJvbSAnLi4vcGF1c2UvdHlwZXMuanMnO1xuaW1wb3J0IHsgbmF0aXZlR2V0LCBuYXRpdmVIYXMsIG5hdGl2ZVNldCwgb3duZWRSb290T2YsIG93blNwaW5lIH0gZnJvbSAnLi9wYXRoT3BzLmpzJztcbmltcG9ydCB7IERFTElNIH0gZnJvbSAnLi9wYXRocy5qcyc7XG5pbXBvcnQgeyBMT0dfUExBQ0VIT0xERVIsIFNDT1BFX1BMQUNFSE9MREVSIH0gZnJvbSAnLi9wbGFjZWhvbGRlcnMuanMnO1xuaW1wb3J0IHR5cGUgeyBNZW1vcnlQYXRjaCB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vKipcbiAqIERlY2xhcmF0aXZlIGtleS9wYXRoIHJlZGFjdGlvbiBmb3IgcmVjb3JkZWQgc3RhdGUgYW5kIGJvdW5kYXJ5IHJlY29yZHMuXG4gKlxuICogQ29uZmlndXJlIGF0IHRoZSBzY29wZSBjbGFzcyBsZXZlbCAoc3RhdGljIHByb3BlcnR5KSBvciBwYXNzIHRvXG4gKiBGbG93Q2hhcnRFeGVjdXRvciB0byBhcHBseSBhY3Jvc3MgYWxsIHN0YWdlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWRhY3Rpb25Qb2xpY3kge1xuICAvKiogRXhhY3Qga2V5IG5hbWVzIHRvIGFsd2F5cyByZWRhY3QgKGUuZy4gWydzc24nLCAnY3JlZGl0Q2FyZCddKS4gKi9cbiAga2V5cz86IHN0cmluZ1tdO1xuICAvKipcbiAgICogUmVnZXggcGF0dGVybnMg4oCUIGFueSBrZXkgbWF0Y2hpbmcgYSBwYXR0ZXJuIGlzIGF1dG8tcmVkYWN0ZWQuXG4gICAqXG4gICAqIFBhdHRlcm4gbWF0Y2hpbmcgaXMgc2tpcHBlZCBmb3Iga2V5cyB0aGF0IGV4Y2VlZCBhbiBpbnRlcm5hbCBsZW5ndGggY2FwXG4gICAqIChkZXNpZ25lZCB0byBwcmV2ZW50IFJlRG9TIG9uIHBhdGhvbG9naWNhbCBwYXR0ZXJucykuIEZvciB2ZXJ5IGxvbmcga2V5XG4gICAqIG5hbWVzLCB1c2UgYGtleXNgIChleGFjdCBtYXRjaCkgaW5zdGVhZCBvZiBwYXR0ZXJucy5cbiAgICovXG4gIHBhdHRlcm5zPzogUmVnRXhwW107XG4gIC8qKiBGaWVsZC1sZXZlbCByZWRhY3Rpb24gd2l0aGluIG9iamVjdHMg4oCUIGtleSDihpIgYXJyYXkgb2YgZmllbGRzIHRvIHNjcnViLlxuICAgKiAgU3VwcG9ydHMgZG90LW5vdGF0aW9uIGZvciBuZXN0ZWQgcGF0aHMgKGUuZy4gJ2FkZHJlc3MuemlwJykuICovXG4gIGZpZWxkcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPjtcbiAgLyoqXG4gICAqIERpYWdub3N0aWMtb25seSBzZWxlY3RvcnMsIElOIEFERElUSU9OIHRvIHRoZSBzdGF0ZSBzZWxlY3RvcnMgYWJvdmUgKHdoaWNoXG4gICAqIGFscmVhZHkgY292ZXIgYSBkaWFnbm9zdGljIGVudHJ5IGJ5IGl0cyBuYW1lOiBga2V5czogWyd0b2tlbiddYCBtYXNrc1xuICAgKiBgJGRlYnVnKCd0b2tlbicsIOKApilgKS4gVXNlIHRoZXNlIGZvciBuYW1lcyB5b3UgbWFzayBpbiBkaWFnbm9zdGljcyBidXRcbiAgICogbm90IGluIHN0YXRlLiBQYXRocyBzdGFydCB3aXRoIGxvZ3MvZXJyb3JzL21ldHJpY3MvZXZhbHMsIGUuZy5cbiAgICogYGxvZ3MucHJvZmlsZS50b2tlbmAuIE9ubHkgZmxvd01lc3NhZ2VzLmRlc2NyaXB0aW9uIGFuZFxuICAgKiBmbG93TWVzc2FnZXMucmF0aW9uYWxlIGFyZSBwYXlsb2FkczsgZmxvdyB0b3BvbG9neS90aW1pbmcgbWV0YWRhdGEgc3RheXNcbiAgICogaW50YWN0LiBBcHBsaWVkIGJlZm9yZSByZXRlbnRpb24sIG5vdCByZXRyb2FjdGl2ZWx5IHRvIGV4aXN0aW5nIGJhZ3MuXG4gICAqL1xuICBkaWFnbm9zdGljcz86IFBpY2s8UmVkYWN0aW9uUG9saWN5LCAna2V5cycgfCAncGF0dGVybnMnIHwgJ2ZpZWxkcyc+O1xuICAvKipcbiAgICogUmVnZXggcGF0dGVybnMgbWF0Y2hlZCBhZ2FpbnN0IGBFbWl0RXZlbnQubmFtZWAgZm9yIGBzY29wZS4kZW1pdCguLi4pYFxuICAgKiBjYWxscy4gQW55IGVtaXQgZXZlbnQgd2hvc2UgbmFtZSBtYXRjaGVzIGhhcyBpdHMgcGF5bG9hZCByZXBsYWNlZCB3aXRoXG4gICAqIHRoZSBzdHJpbmcgYCdbUkVEQUNURURdJ2AgYmVmb3JlIGRpc3BhdGNoIHRvIHJlY29yZGVycy5cbiAgICogR2xvYmFsL3N0aWNreSBwYXR0ZXJucyBzdGFydCBhdCBpbmRleCB6ZXJvIG9uIGV2ZXJ5IHRlc3Q7IHRoZWlyIGZsYWdzXG4gICAqIHJldGFpbiB0aGVpciB1c3VhbCBtZWFuaW5nLiBUaGlzIGRvZXMgbm90IHNjcnViIGRpYWdub3N0aWMgc2lkZSBiYWdzLlxuICAgKlxuICAgKiBFeGFtcGxlOlxuICAgKiBgYGB0c1xuICAgKiB7IGVtaXRQYXR0ZXJuczogWy9cXC5hdXRoXFwuLywgL1xcLmJpbGxpbmdcXC4vXSB9XG4gICAqIC8vIEhpZGVzIHBheWxvYWRzIG9mIGV2ZW50cyBsaWtlICdteWFwcC5hdXRoLmNoZWNrJyBhbmQgJ215YXBwLmJpbGxpbmcuc3BlbmQnXG4gICAqIGBgYFxuICAgKi9cbiAgZW1pdFBhdHRlcm5zPzogUmVnRXhwW107XG59XG5cbi8qKlxuICogU3RhdGUgcmVkYWN0aW9uIHJlcG9ydC4gTmV2ZXIgaW5jbHVkZXMgdmFsdWVzOyBlbWl0IGFuZCBkaWFnbm9zdGljXG4gKiBzZWxlY3RvcnMvYWN0aXZpdHkgYXJlIG5vdCByZXByZXNlbnRlZCBoZXJlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlZGFjdGlvblJlcG9ydCB7XG4gIC8qKiBLZXlzIGZ1bGx5IHJlZGFjdGVkIChleGFjdCBtYXRjaCBvciBwYXR0ZXJuIG1hdGNoKS4gKi9cbiAgcmVkYWN0ZWRLZXlzOiBzdHJpbmdbXTtcbiAgLyoqIEtleXMgd2l0aCBmaWVsZC1sZXZlbCByZWRhY3Rpb24g4oaSIHdoaWNoIGZpZWxkcyB3ZXJlIHNjcnViYmVkLiAqL1xuICBmaWVsZFJlZGFjdGlvbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPjtcbiAgLyoqIFBhdHRlcm4gc291cmNlcyB0aGF0IHdlcmUgYWN0aXZlIChlLmcuIFsncGFzc3dvcmR8c2VjcmV0J10pLiAqL1xuICBwYXR0ZXJuczogc3RyaW5nW107XG59XG5cbi8qKlxuICogV2hhdCB0aGUgcG9saWN5IHNheXMgYWJvdXQgdGhlIHZhbHVlIGF0IG9uZSB1c2VyLWxldmVsIHBhdGguXG4gKlxuICogLSBgJ2NsZWFyJ2AgIOKAlCBub3RoaW5nIHRvIHNjcnViOyByZXRhaW4gYW5kIHNlcnZlIHRoZSB2YWx1ZSBhcyBpdCBpcy5cbiAqIC0gYCd3aG9sZSdgICDigJQgdGhlIGVudGlyZSB2YWx1ZSBpcyBzZWNyZXQuIGBrZXlgIGlzIHRoZSBwb2xpY3kgb3IgbWFya2VkXG4gKiAgIGtleSB0aGF0IGRlY2lkZWQgaXQgKHRoZSBwYXRoIGl0c2VsZiBvciBvbmUgb2YgaXRzIGFuY2VzdG9ycykuXG4gKiAtIGAnZmllbGRzJ2Ag4oCUIHRoZSB2YWx1ZSBpcyBhbiBvYmplY3Qgd2hvc2UgYHBhdGhzYCAoZG90LXBhdGhzIElOU0lERSB0aGVcbiAqICAgdmFsdWUsIHJlbGF0aXZlIHRvIGl0KSBhcmUgc2VjcmV0OyBldmVyeXRoaW5nIGVsc2UgaW4gaXQgaXMgbm90LlxuICovXG5leHBvcnQgdHlwZSBSZWRhY3Rpb25WZXJkaWN0ID1cbiAgfCB7IHJlYWRvbmx5IGtpbmQ6ICdjbGVhcicgfVxuICB8IHsgcmVhZG9ubHkga2luZDogJ3dob2xlJzsgcmVhZG9ubHkga2V5OiBzdHJpbmcgfVxuICB8IHsgcmVhZG9ubHkga2luZDogJ2ZpZWxkcyc7IHJlYWRvbmx5IGtleTogc3RyaW5nOyByZWFkb25seSBwYXRoczogcmVhZG9ubHkgc3RyaW5nW10gfTtcblxuZXhwb3J0IGNvbnN0IENMRUFSOiBSZWRhY3Rpb25WZXJkaWN0ID0gT2JqZWN0LmZyZWV6ZSh7IGtpbmQ6ICdjbGVhcicgfSBhcyBjb25zdCk7XG5cbi8qKlxuICogTWF4aW11bSBrZXkgbGVuZ3RoIChjaGFyYWN0ZXJzKSB0aGF0IHdpbGwgYmUgdGVzdGVkIGFnYWluc3QgcmVnZXggcmVkYWN0aW9uXG4gKiBwYXR0ZXJucy4gS2V5cyBsb25nZXIgdGhhbiB0aGlzIGFyZSBza2lwcGVkIGZvciBwYXR0ZXJuIG1hdGNoaW5nIHRvIHByZXZlbnRcbiAqIFJlRG9TOiBhIHBhdGhvbG9naWNhbCByZWdleCB0ZXN0ZWQgYWdhaW5zdCBhbiB1bmJvdW5kZWRseSBsb25nIGtleSBzdHJpbmdcbiAqIGNhbiBjYXVzZSBjYXRhc3Ryb3BoaWMgYmFja3RyYWNraW5nLiAyNTYgY2hhcmFjdGVycyBjb21mb3J0YWJseSBleGNlZWRzIGFueVxuICogcmVhbGlzdGljIHNjb3BlLXN0YXRlIGtleSBuYW1lLlxuICovXG5jb25zdCBNQVhfUEFUVEVSTl9LRVlfTEVOID0gMjU2O1xuXG4vKipcbiAqIFRoZSBmaWVsZHMgYSBwb2xpY3kgZGVjbGFyZXMgdW5kZXIgYGtleWAg4oCUIG9ubHkgd2hlbiBgZmllbGRzYCBPV05TIGBrZXlgLlxuICogVGhlIGtleSBpcyBhIG5hbWUgZnJvbSBkYXRhIChhIHN0YXRlIGtleSwgYSBuZXN0ZWQga2V5IG9mIGEgcmVjb3JkIGhhbmRlZFxuICogb3V0IHdob2xlKSwgYW5kIGEgcGxhaW4tb2JqZWN0IGxvb2t1cCByZWFkcyB0aGUgcHJvdG90eXBlIGNoYWluOlxuICogYGZpZWxkc1snY29uc3RydWN0b3InXWAgaXMgYE9iamVjdGAsIGBmaWVsZHNbJ19fcHJvdG9fXyddYCBpc1xuICogYE9iamVjdC5wcm90b3R5cGVgLiBUaGUgd2FsayB0aGVuIGl0ZXJhdGVkIHRoZW0sIHNvIGFueSBgZmllbGRzYCBwb2xpY3lcbiAqIGZhaWxlZCB0aGUgcnVuIHdpdGggYSBUeXBlRXJyb3Igb24gZGF0YSBob2xkaW5nIHN1Y2ggYSBrZXkuXG4gKi9cbmZ1bmN0aW9uIGRlY2xhcmVkRmllbGRzKGZpZWxkczogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+IHwgdW5kZWZpbmVkLCBrZXk6IHN0cmluZyk6IHJlYWRvbmx5IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGZpZWxkcyAhPT0gdW5kZWZpbmVkICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChmaWVsZHMsIGtleSkgPyBmaWVsZHNba2V5XSA6IHVuZGVmaW5lZDtcbn1cblxuLyoqIFBvbGljeSBwYXR0ZXJucyBhcmUgcHJlZGljYXRlcywgbm90IGN1cnNvcnMgb3ZlciBzdWNjZXNzaXZlIGtleXMvZXZlbnRzLiAqL1xuZnVuY3Rpb24gbWF0Y2hlc1BhdHRlcm4odmFsdWU6IHN0cmluZywgcGF0dGVybnM6IHJlYWRvbmx5IFJlZ0V4cFtdIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIGlmICghcGF0dGVybnMpIHJldHVybiBmYWxzZTtcbiAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIHBhdHRlcm5zKSB7XG4gICAgLy8gT25seSB0aGVzZSBmbGFncyBjb25zdW1lIGxhc3RJbmRleC4gT3JkaW5hcnkgKGluY2x1ZGluZyBmcm96ZW4pXG4gICAgLy8gcmVnZXhlcyBuZWVkIG5vIHdyaXRhYmxlIGN1cnNvciB0byBtYXRjaC4gS2VlcCBhbGwgb3JpZ2luYWwgZmxhZ3MuXG4gICAgaWYgKHBhdHRlcm4uZ2xvYmFsIHx8IHBhdHRlcm4uc3RpY2t5KSBwYXR0ZXJuLmxhc3RJbmRleCA9IDA7XG4gICAgaWYgKHBhdHRlcm4udGVzdCh2YWx1ZSkpIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGNsYXNzIFJlZGFjdGlvblJ1bGUge1xuICBwcml2YXRlIHBvbGljeTogUmVkYWN0aW9uUG9saWN5IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIGRpYWdub3N0aWNSdWxlOiBSZWRhY3Rpb25SdWxlIHwgdW5kZWZpbmVkO1xuICAvKiogV2hldGhlciBgcG9saWN5YCBuYW1lcyBhbnl0aGluZyBhIHN0YXRlIHZlcmRpY3QgY2FuIGFjdCBvbiDigJQgY29tcHV0ZWRcbiAgICogIG9uY2UgcGVyIGBzZXRQb2xpY3lgIHNvIHtAbGluayBpc0luZXJ0fSBpcyBhIHR3by1maWVsZCBjaGVjay4gKi9cbiAgcHJpdmF0ZSBwb2xpY3lBY3RpdmUgPSBmYWxzZTtcbiAgLyoqIFRoZSBwb2xpY3kncyBwYXR0ZXJucyB0aGF0IGNhbiBkZXBlbmQgb24gYSB3aG9sZSBkb3R0ZWQgcGF0aCAoe0BsaW5rIG5lZWRzUGF0aH0pIOKAlCBwZXIgYHNldFBvbGljeWAuICovXG4gIHByaXZhdGUgcGF0aFBhdHRlcm5zOiByZWFkb25seSBSZWdFeHBbXSA9IFtdO1xuICBwcml2YXRlIHdhbGtMaW1pdFdhcm5lZCA9IGZhbHNlO1xuICAvKipcbiAgICogS2V5cyBtYXJrZWQgc2VjcmV0IGZvciB0aGUgcmVzdCBvZiB0aGUgcnVuIOKAlCBieSBhIHBlci1jYWxsXG4gICAqIGBzZXRWYWx1ZShrZXksIHZhbHVlLCB0cnVlKWAsIG9yIGJ5IGFueSB3cml0ZSB0aGUgcG9saWN5IHJlZGFjdGVkIHdob2xlLlxuICAgKiBPTkUgc2V0IHBlciBydW4sIHNoYXJlZCBieSBldmVyeSBzY29wZSBhbmQgY29udGV4dCAodGhlIGV4ZWN1dG9yIGJ1aWxkc1xuICAgKiB0aGUgcnVsZSBvbmNlIHBlciBydW4gYW5kIGluc3RhbGxzIGl0IG9uIHRoZSBydW50aW1lIHJvb3QpLlxuICAgKi9cbiAgcHJpdmF0ZSBtYXJrZWQ6IFNldDxzdHJpbmc+O1xuICAvKipcbiAgICogRmllbGRzIGEgc3ViZmxvdyBtYXBwZXIgaGFuZGVkIHRvIGEgTkVXIGtleSBhbG9uZyB3aXRoIHRoZSB2YWx1ZSB0aGV5XG4gICAqIGJlbG9uZyB0byDigJQgdGFyZ2V0IGtleSDihpIgdGhlIHNvdXJjZSBrZXkncyBmaWVsZCBwYXRocyAoYW4gb2JqZWN0IGNvcGllZFxuICAgKiBieSByZWZlcmVuY2UgZnJvbSBhIGBmaWVsZHNgLXNlbGVjdGVkIGtleTsge0BsaW5rIE1hcHBlclRhaW50fSkuXG4gICAqIFJ1bi13aWRlLCBieSBuYW1lLCBsaWtlIHtAbGluayBtYXJrZWR9LlxuICAgKi9cbiAgcHJpdmF0ZSBpbmhlcml0ZWQ6IE1hcDxzdHJpbmcsIHJlYWRvbmx5IHN0cmluZ1tdPiB8IHVuZGVmaW5lZDtcbiAgLyoqIFRoaXMgcnVuJ3MgdGhyb3duIHZhbHVlcyBzZXJ2ZWQgbWFza2VkICh0aGVpciB0ZXh0IHNlbGVjdGVkLCBvciBhIHNlbGVjdGVkIGtleSBpbnNpZGUgdGhlbSkg4oaSIHRoZWlyIHNlcnZlZCBmb3JtLiAqL1xuICBwcml2YXRlIG1hc2tlZEVycm9yczogTWFwPHVua25vd24sIFN0cnVjdHVyZWRFcnJvckluZm8+IHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKHBvbGljeT86IFJlZGFjdGlvblBvbGljeSwgbWFya2VkPzogU2V0PHN0cmluZz4pIHtcbiAgICB0aGlzLm1hcmtlZCA9IG1hcmtlZCA/PyBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICB0aGlzLnNldFBvbGljeShwb2xpY3kpO1xuICB9XG5cbiAgZ2V0UG9saWN5KCk6IFJlZGFjdGlvblBvbGljeSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucG9saWN5O1xuICB9XG5cbiAgc2V0UG9saWN5KHBvbGljeTogUmVkYWN0aW9uUG9saWN5IHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgdGhpcy5wb2xpY3kgPSBwb2xpY3k7XG4gICAgY29uc3QgZGlhZ25vc3RpY3MgPSBwb2xpY3k/LmRpYWdub3N0aWNzO1xuICAgIHRoaXMuZGlhZ25vc3RpY1J1bGUgPSBkaWFnbm9zdGljc1xuICAgICAgPyBuZXcgUmVkYWN0aW9uUnVsZSh7IGtleXM6IGRpYWdub3N0aWNzLmtleXMsIHBhdHRlcm5zOiBkaWFnbm9zdGljcy5wYXR0ZXJucywgZmllbGRzOiBkaWFnbm9zdGljcy5maWVsZHMgfSlcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIHRoaXMucGF0aFBhdHRlcm5zID0gKHBvbGljeT8ucGF0dGVybnMgPz8gW10pLmZpbHRlcihuZWVkc1BhdGgpO1xuICAgIHRoaXMucG9saWN5QWN0aXZlID1cbiAgICAgIHBvbGljeSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAoKHBvbGljeS5rZXlzPy5sZW5ndGggPz8gMCkgPiAwIHx8XG4gICAgICAgIChwb2xpY3kucGF0dGVybnM/Lmxlbmd0aCA/PyAwKSA+IDAgfHxcbiAgICAgICAgT2JqZWN0LmtleXMocG9saWN5LmZpZWxkcyA/PyB7fSkubGVuZ3RoID4gMCk7XG4gIH1cblxuICAvKipcbiAgICogVHJ1ZSB3aGVuIHRoaXMgcnVsZSBoYXMgbm90aGluZyB0byBzYXkgYWJvdXQgQU5ZIHBhdGgg4oCUIG5vIGtleSwgcGF0dGVyblxuICAgKiBvciBmaWVsZCBpbiB0aGUgcG9saWN5IGFuZCBubyBrZXkgbWFya2VkIHNvIGZhci4gVGhlIG5vLXBvbGljeSBmYXN0XG4gICAqIHBhdGg6IGBTdGFnZUNvbnRleHRgIHNraXBzIHRoZSB2ZXJkaWN0IChhbmQgaXRzIHBhdGggYWxsb2NhdGlvbikgb25cbiAgICogZXZlcnkgdHJhY2tlZCByZWFkIGFuZCBzdGFnZWQgd3JpdGUgd2hpbGUgdGhpcyBob2xkcy4gQSBwZXItY2FsbFxuICAgKiBgc2V0VmFsdWUoa2V5LCB2YWx1ZSwgdHJ1ZSlgIG1hcmtzIGEga2V5IGFuZCBlbmRzIGl0LlxuICAgKi9cbiAgaXNJbmVydCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5tYXJrZWQuc2l6ZSA9PT0gMCAmJiAhdGhpcy5wb2xpY3lBY3RpdmUgJiYgdGhpcy5pbmhlcml0ZWQgPT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBUaGUgc2hhcmVkIG1hcmtlZC1rZXlzIHNldCDigJQgZm9yIHRoZSBgQGludGVybmFsYCBzaGFyaW5nIHByb3RvY29sIGFuZCBgZGVjaWRlKClgLiAqL1xuICBtYXJrZWRLZXlzKCk6IFNldDxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5tYXJrZWQ7XG4gIH1cblxuICB1c2VNYXJrZWRLZXlzKHNoYXJlZDogU2V0PHN0cmluZz4pOiB2b2lkIHtcbiAgICB0aGlzLm1hcmtlZCA9IHNoYXJlZDtcbiAgfVxuXG4gIG1hcmsoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm1hcmtlZC5hZGQoa2V5KTtcbiAgfVxuXG4gIC8qKiBEZWxldGluZyBhIGtleSBjbGVhcnMgaXRzIHBlci1jYWxsIG1hcmsgYW5kIGFueSBmaWVsZHMgYSBtYXBwZXIgZ2F2ZSBpdDsgYSBwb2xpY3kgdmVyZGljdCBzdXJ2aXZlcyBpdC4gKi9cbiAgdW5tYXJrKGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5tYXJrZWQuZGVsZXRlKGtleSk7XG4gICAgaWYgKHRoaXMuaW5oZXJpdGVkPy5kZWxldGUoa2V5KSAmJiB0aGlzLmluaGVyaXRlZC5zaXplID09PSAwKSB0aGlzLmluaGVyaXRlZCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBLZXktbGV2ZWwgdmVyZGljdDogbWFya2VkLCBsaXN0ZWQgaW4gYHBvbGljeS5rZXlzYCwgb3IgbWF0Y2hpbmcgYSBwYXR0ZXJuLiAqL1xuICBpc0tleVJlZGFjdGVkKGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMubWFya2VkLmhhcyhrZXkpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoIXRoaXMucG9saWN5KSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHRoaXMucG9saWN5LmtleXM/LmluY2x1ZGVzKGtleSkpIHJldHVybiB0cnVlO1xuICAgIGNvbnN0IHBhdHRlcm5zID0gdGhpcy5wb2xpY3kucGF0dGVybnM7XG4gICAgaWYgKCFwYXR0ZXJucyB8fCBwYXR0ZXJucy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcbiAgICBpZiAoa2V5Lmxlbmd0aCA+IE1BWF9QQVRURVJOX0tFWV9MRU4pIHtcbiAgICAgIGlmIChpc0Rldk1vZGUoKSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYFtmb290cHJpbnRdIFJlZGFjdGlvblBvbGljeToga2V5ICcke2tleS5zbGljZSgwLCA0MCl9Li4uJyAoJHtrZXkubGVuZ3RofSBjaGFycykgZXhjZWVkcyBgICtcbiAgICAgICAgICAgICd0aGUgcGF0dGVybi1tYXRjaGluZyBsZW5ndGggY2FwIGFuZCB3YXMgc2tpcHBlZC4gJyArXG4gICAgICAgICAgICAnVXNlIHBvbGljeS5rZXlzIGZvciBleGFjdCBtYXRjaGluZyBvZiBsb25nIGtleSBuYW1lcy4nLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gbWF0Y2hlc1BhdHRlcm4oa2V5LCBwYXR0ZXJucyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0YWluIGFuIGVtaXR0ZWQgcGF5bG9hZCBCRUZPUkUgZGlzcGF0Y2gvY2FwdHVyZS4gRW1pdCBuYW1lcyBhcmUgbm90XG4gICAqIHN0YXRlIHBhdGhzOiBubyBrZXktbGVuZ3RoIGNhcCwgbWFya3Mgb3IgZmllbGQgc2NydWIgYXBwbGllcyBoZXJlLlxuICAgKiBBIGNsZWFyIHBheWxvYWQga2VlcHMgaXRzIGlkZW50aXR5OyBkaWFnbm9zdGljIGJhZ3MgYXJlIHVudG91Y2hlZC5cbiAgICovXG4gIHJldGFpbkVtaXQobmFtZTogc3RyaW5nLCBwYXlsb2FkOiB1bmtub3duKTogdW5rbm93biB7XG4gICAgcmV0dXJuIG1hdGNoZXNQYXR0ZXJuKG5hbWUsIHRoaXMucG9saWN5Py5lbWl0UGF0dGVybnMpID8gU0NPUEVfUExBQ0VIT0xERVIgOiBwYXlsb2FkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldGFpbiBhIE5BTUVEIGRpYWdub3N0aWMgZW50cnkg4oCUIGBhZGRyZXNzYCBpcyBgW2NoYW5uZWwsIC4uLnBhdGgsIG5hbWVdYFxuICAgKiAoYCRkZWJ1ZygndG9rZW4nLCB2KWAg4oaSIGBbJ2xvZ3MnLCAndG9rZW4nXWA7IGAkbG9nKHYpYCDihpIgYFsnbG9ncycsXG4gICAqICdtZXNzYWdlcyddYCkuIFRIRSBNQVBQSU5HOiB0aGUgZW50cnkgaXMgdGhlIHJlY29yZCBgeyBbbmFtZV06IHZhbHVlIH1gXG4gICAqIGhhbmRlZCBvdXQgd2hvbGUsIHNvIGl0IGlzIHJldGFpbmVkIGFzIGEgYm91bmRhcnkgcmVjb3JkIGhvbGRpbmcgdGhlXG4gICAqIHN0YXRlIGtleSBgbmFtZWAgd291bGQgYmUg4oCUIHRoZSBzdGF0ZSB2ZXJkaWN0IGF0IGBbLi4ucGF0aCwgbmFtZV1gIChrZXlzLFxuICAgKiBwYXR0ZXJucyBhbmQgbWFya3MgYXQgZXZlcnkgZG90dGVkIHByZWZpeCBhbmQgYXQgdGhlIG5hbWUgaXRzZWxmOyB0aGUgdG9wXG4gICAqIGtleSdzIGBmaWVsZHNgKSwgdGhlbiBldmVyeSBuZXN0ZWQgb3duIGtleSB3aG9zZSBuYW1lIG9yIGRvdHRlZCBwYXRoIGlzXG4gICAqIHNlbGVjdGVkICh7QGxpbmsgcmV0YWluQm91bmRhcnl9J3Mgd2FsaykuIFRoZSBjaGFubmVsIHRha2VzIG5vIHBhcnQ6XG4gICAqIGBsb2dzLnRva2VuYCwgYGVycm9ycy50b2tlbmAgYW5kIGBtZXRyaWNzLnRva2VuYCBhcmUgYWxsIHRoZSBzdGF0ZSBrZXlcbiAgICogYHRva2VuYC4gYHBvbGljeS5kaWFnbm9zdGljc2AgKGRpYWdub3N0aWMtb25seSBzZWxlY3RvcnMsIHJvb3RlZCBhdCB0aGVcbiAgICogY2hhbm5lbCkgYXBwbGllcyBvbiB0b3AuIENsZWFyIHZhbHVlcyBrZWVwIHRoZWlyIGlkZW50aXR5LlxuICAgKi9cbiAgcmV0YWluRGlhZ25vc3RpYyhhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSwgdmFsdWU6IHVua25vd24pOiB1bmtub3duIHtcbiAgICBjb25zdCBrZXB0ID0gdGhpcy5pc0luZXJ0KCkgPyB2YWx1ZSA6IHRoaXMucmV0YWluTmFtZWQoYWRkcmVzcy5zbGljZSgxKSwgdmFsdWUpO1xuICAgIHJldHVybiB0aGlzLmRpYWdub3N0aWNSdWxlID8gdGhpcy5kaWFnbm9zdGljUnVsZS5yZXRhaW4oYWRkcmVzcywga2VwdCkgOiBrZXB0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldGFpbiBmbG93LW1lc3NhZ2UgdGV4dCAoYGZsb3dNZXNzYWdlcy5kZXNjcmlwdGlvbmAgLyBgLnJhdGlvbmFsZWApOiB0ZXh0XG4gICAqIHRoZSBlbmdpbmUgY29tcG9zZXMgaGFzIG5vIG5hbWUgb2YgaXRzIG93biwgc28gbm8gc3RhdGUgc2VsZWN0b3IgcmVhY2hlc1xuICAgKiBpdCDigJQgb25seSBgcG9saWN5LmRpYWdub3N0aWNzYCBzZWxlY3RzIGl0LlxuICAgKi9cbiAgcmV0YWluRmxvd1RleHQoYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW10sIHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZGlhZ25vc3RpY1J1bGUgPyAodGhpcy5kaWFnbm9zdGljUnVsZS5yZXRhaW4oYWRkcmVzcywgdGV4dCkgYXMgc3RyaW5nKSA6IHRleHQ7XG4gIH1cblxuICAvKioge0BsaW5rIHJldGFpbkRpYWdub3N0aWN9J3Mgc3RhdGUgaGFsZjogdGhlIHZhbHVlIG5hbWVkIGJ5IGBwYXRoYCAoaXRzIGxhc3Qgc2VnbWVudCksIHNlcnZlZCB3aG9sZS4gKi9cbiAgcHJpdmF0ZSByZXRhaW5OYW1lZChwYXRoOiByZWFkb25seSBzdHJpbmdbXSwgdmFsdWU6IHVua25vd24pOiB1bmtub3duIHtcbiAgICBpZiAocGF0aC5sZW5ndGggPT09IDApIHJldHVybiB2YWx1ZTtcbiAgICBjb25zdCBuYW1lID0gcGF0aFtwYXRoLmxlbmd0aCAtIDFdO1xuICAgIGNvbnN0IHZlcmRpY3Q6IFJlZGFjdGlvblZlcmRpY3QgPVxuICAgICAgcGF0aC5sZW5ndGggPiAxICYmIHRoaXMuaXNLZXlSZWRhY3RlZChuYW1lKSA/IHsga2luZDogJ3dob2xlJywga2V5OiBuYW1lIH0gOiB0aGlzLnZlcmRpY3QocGF0aCk7XG4gICAgaWYgKHZlcmRpY3Qua2luZCA9PT0gJ3dob2xlJykgcmV0dXJuIFNDT1BFX1BMQUNFSE9MREVSO1xuICAgIGNvbnN0IGtlcHQgPSBSZWRhY3Rpb25SdWxlLmFwcGx5KHZlcmRpY3QsIHZhbHVlKTtcbiAgICBpZiAoa2VwdCA9PT0gbnVsbCB8fCB0eXBlb2Yga2VwdCAhPT0gJ29iamVjdCcpIHJldHVybiBrZXB0O1xuICAgIGNvbnN0IGJhc2UgPSBwYXRoLmpvaW4oJy4nKTtcbiAgICByZXR1cm4gc2VydmVkQnlQYXRoKGtlcHQsIGJhc2UsIHRoaXMuZG90dGVkVGFyZ2V0cyhiYXNlKSwgdGhpcy5uYW1lc1dhbGsoZmFsc2UpLCBTQ09QRV9QTEFDRUhPTERFUik7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHNlcnZlZCBmb3JtIG9mIGEgdGhyb3duIHZhbHVlLCBkZWNpZGVkIE9OQ0UgYXQgaXRzIGVycm9yIHNpdGUgZnJvbSB0aGVcbiAgICogdGV4dCB0aGUgZGlhZ25vc3RpYyBjb2xsZWN0b3IgcmV0YWluZWQgZm9yIGBlcnJvcnMuc3RhZ2VFeGVjdXRpb25FcnJvcmBcbiAgICogKGBrZXB0YCkgYW5kIGZyb20gdGhlIHZhbHVlIGl0c2VsZiDigJQgYSByZWNvcmQgaGFuZGVkIG91dCB3aG9sZSwgbWFza2VkXG4gICAqIHdoZW4gb25lIG9mIGl0cyBvd24ga2V5cywgYXQgYW55IGRlcHRoLCBjYXJyaWVzIGEgc2VsZWN0ZWQgbmFtZS5cbiAgICogVW5tYXNrZWQ6IHRvZGF5J3Mgc3RydWN0dXJlZCBpbmZvLiBNYXNrZWQ6IHRoZSBlcnJvcidzIGBuYW1lYC9gY29kZWAga2VwdCxcbiAgICogbm8gYGlzc3Vlc2AgKHRoZXkgcXVvdGUgdGhlIGlucHV0KSBhbmQgbm8gYHJhd2AgZXJyb3IgKGl0IGhvbGRzIHRoZSB0ZXh0XG4gICAqIGFuZCB0aGUga2V5cyk7IHRoZSBtZXNzYWdlIGlzIHRoZSBwbGFjZWhvbGRlciB3aGVuIHRoZSB0ZXh0IHdhcyBzZWxlY3RlZCxcbiAgICogdGhlIHRleHQgaXRzZWxmIHdoZW4gb25seSBhIGtleSB3YXMg4oCUIHJlbWVtYmVyZWQgc28gYG9uUnVuRmFpbGVkYCwgdGhlXG4gICAqIGxvZ2dlciBhbmQgYSBmb3JrIGVudmVsb3BlIHNlcnZlIHRoZSBzYW1lIGZvcm0gKHtAbGluayBzZXJ2ZWRFcnJvcn0pLiBUaGVcbiAgICogdGhyb3duIHZhbHVlIGl0c2VsZiBzdGF5cyByZWFsLlxuICAgKi9cbiAgcmV0YWluU3RhZ2VFcnJvcihcbiAgICBlcnJvcjogdW5rbm93bixcbiAgICB0ZXh0OiBzdHJpbmcsXG4gICAga2VwdDogdW5rbm93bixcbiAgKTogeyBtZXNzYWdlOiBzdHJpbmc7IHN0cnVjdHVyZWRFcnJvcjogU3RydWN0dXJlZEVycm9ySW5mbyB9IHtcbiAgICBjb25zdCBpbmZvID0gZXh0cmFjdEVycm9ySW5mbyhlcnJvcik7XG4gICAgY29uc3QgdGV4dFNlbGVjdGVkID0ga2VwdCAhPT0gdGV4dDtcbiAgICBpZiAoIXRleHRTZWxlY3RlZCAmJiAhdGhpcy5jYXJyaWVzU2VsZWN0ZWRLZXkoZXJyb3IpKSByZXR1cm4geyBtZXNzYWdlOiB0ZXh0LCBzdHJ1Y3R1cmVkRXJyb3I6IGluZm8gfTtcbiAgICBjb25zdCBtZXNzYWdlID0gdGV4dFNlbGVjdGVkID8gU3RyaW5nKGtlcHQpIDogdGV4dDtcbiAgICBjb25zdCBtYXNrZWQ6IFN0cnVjdHVyZWRFcnJvckluZm8gPSB7XG4gICAgICBtZXNzYWdlOiB0ZXh0U2VsZWN0ZWQgPyBtZXNzYWdlIDogaW5mby5tZXNzYWdlLFxuICAgICAgLi4uKGluZm8ubmFtZSAhPT0gdW5kZWZpbmVkICYmIHsgbmFtZTogaW5mby5uYW1lIH0pLFxuICAgICAgLi4uKGluZm8uY29kZSAhPT0gdW5kZWZpbmVkICYmIHsgY29kZTogaW5mby5jb2RlIH0pLFxuICAgICAgcmF3OiB1bmRlZmluZWQsXG4gICAgfTtcbiAgICAodGhpcy5tYXNrZWRFcnJvcnMgPz89IG5ldyBNYXAoKSkuc2V0KGVycm9yLCBtYXNrZWQpO1xuICAgIHJldHVybiB7IG1lc3NhZ2UsIHN0cnVjdHVyZWRFcnJvcjogbWFza2VkIH07XG4gIH1cblxuICAvKipcbiAgICogRG9lcyBhIHRocm93biB2YWx1ZSBjYXJyeSBhIHNlbGVjdGVkIG5hbWUg4oCUIGFuIG93biBrZXksIGF0IGFueSBkZXB0aCwgdGhhdFxuICAgKiB0aGUgcG9saWN5IG9yIGEgbWFyayBzZWxlY3RzPyBUb3RhbDogYSB2YWx1ZSB3aG9zZSBrZXlzIGNhbm5vdCBiZSByZWFkIGlzXG4gICAqIHNlcnZlZCBtYXNrZWQgKHRoZSBzYWZlIHNpZGUpLCBuZXZlciBhIHNlY29uZCB0aHJvdyBmcm9tIGFuIGVycm9yIHBhdGguXG4gICAqL1xuICBwcml2YXRlIGNhcnJpZXNTZWxlY3RlZEtleSh2YWx1ZTogdW5rbm93bik6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmlzSW5lcnQoKSB8fCB2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLnRocm93bkNhcnJpZXModmFsdWUsIG5ldyBTZXQoKSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBLZXlzIHRoYXQgY2Fubm90IGJlIHJlYWQgKGEgdGhyb3dpbmcgZ2V0dGVyLCBhIHJldm9rZWQgUHJveHkpIG9yIGEgd2FsayBwYXN0IGl0c1xuICAgICAgLy8gbGltaXQ6IHNlcnZlZCBpbiB0aGUgbWFza2VkIGZvcm0g4oCUIGl0cyB0ZXh0IGtlcHQsIG5vIGByYXdgLlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE9uZSB0aHJvd24gdmFsdWUgYW5kIHdoYXQgYSBsb2dnZXIgb3IgYSBzZXJpYWxpemVyIHByaW50cyB3aXRoIGl0OiBpdHMgb3duXG4gICAqIGtleXMgYXQgZXZlcnkgZGVwdGgsIGFuZCBpdHMgYGNhdXNlYCAvIGFuIGBBZ2dyZWdhdGVFcnJvcmAncyBgZXJyb3JzYCDigJQgb3duXG4gICAqIE5PTi1lbnVtZXJhYmxlIGtleXMgbm8ga2V5IHdhbGsgc2VlcyDigJQgZWFjaCB3YWxrZWQgdGhlIHNhbWUgd2F5IChhIGN5Y2xlXG4gICAqIGFtb25nIHRoZW0gaXMgZm9sbG93ZWQgb25jZSkuXG4gICAqL1xuICBwcml2YXRlIHRocm93bkNhcnJpZXModmFsdWU6IG9iamVjdCwgc2VlbjogU2V0PG9iamVjdD4pOiBib29sZWFuIHtcbiAgICBpZiAoc2Vlbi5oYXModmFsdWUpKSByZXR1cm4gZmFsc2U7XG4gICAgc2Vlbi5hZGQodmFsdWUpO1xuICAgIGlmIChzZWxlY3RzQnlQYXRoKHZhbHVlLCB1bmRlZmluZWQsIHRoaXMuZG90dGVkVGFyZ2V0cyh1bmRlZmluZWQpLCB0aGlzLm5hbWVzV2FsayhmYWxzZSksIG5ldyBNYXAoKSwgMCkuc2VsZWN0ZWQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBvd24gPSAoa2V5OiBzdHJpbmcpOiB1bmtub3duID0+XG4gICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIGtleSkgPyAodmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0gOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgZXJyb3JzID0gb3duKCdlcnJvcnMnKTtcbiAgICBmb3IgKGNvbnN0IHBhcnQgb2YgW293bignY2F1c2UnKSwgLi4uKEFycmF5LmlzQXJyYXkoZXJyb3JzKSA/IGVycm9ycyA6IFtdKV0pIHtcbiAgICAgIGlmIChwYXJ0ICE9PSBudWxsICYmIHR5cGVvZiBwYXJ0ID09PSAnb2JqZWN0JyAmJiB0aGlzLnRocm93bkNhcnJpZXMocGFydCwgc2VlbikpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGtleS1sZXZlbCBydWxlcyBhcyB0aGUgcGF0aCB3YWxrIGFza3MgdGhlbSAoe0BsaW5rIHNlcnZlZEJ5UGF0aH0pOiBhXG4gICAqIG5lc3RlZCBrZXkgaXMgc2VsZWN0ZWQgYnkgaXRzIG93biBOQU1FIChtYXJrcywga2V5cywgcGF0dGVybnMpLCBhbmQg4oCUIHVuZGVyXG4gICAqIHBhdHRlcm5zIG9ubHkg4oCUIGJ5IGl0cyBkb3R0ZWQgcGF0aDsgYSBkZWNsYXJlZCAob3IgaW5oZXJpdGVkKSBmaWVsZCBiZWxvdyBhXG4gICAqIGtleSBvZiBpdHMgbmFtZSBpcyBhIHRhcmdldC4gRG90dGVkIGtleXMgYW5kIG1hcmtzIGFyZSBUQVJHRVRTIGZyb20gdGhlXG4gICAqIHdhbGsncyByb290ICh7QGxpbmsgZG90dGVkVGFyZ2V0c30pLCBzbyB3aXRob3V0IHBhdHRlcm5zIG5vIGRlY2lzaW9uXG4gICAqIGRlcGVuZHMgb24gdGhlIHBhdGggYW5kIHRoZSB3YWxrIHNoYXJlcyB0aGVtIHBlciBvYmplY3QgKGxpbmVhciBvbiBhIERBRykuXG4gICAqIGByb290RGVjaWRlZGA6IHRoZSByb290J3Mgb3duIGtleXMgd2VyZSBhbHJlYWR5IGRlY2lkZWQgKGByZXRhaW5SZWNvcmRgKS5cbiAgICovXG4gIHByaXZhdGUgbmFtZXNXYWxrKHJvb3REZWNpZGVkOiBib29sZWFuKTogV2FsayB7XG4gICAgY29uc3QgYnlQYXRoID0gdGhpcy5wYXRoUGF0dGVybnM7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWVzOiB7XG4gICAgICAgIG1hc2tzOiAobmFtZSkgPT4gdGhpcy5pc0tleVJlZGFjdGVkKG5hbWUpLFxuICAgICAgICAuLi4oYnlQYXRoLmxlbmd0aCA+IDAgJiYge1xuICAgICAgICAgIHBhdGhNYXNrczogKHBhdGg6IHN0cmluZykgPT4gcGF0aC5sZW5ndGggPD0gTUFYX1BBVFRFUk5fS0VZX0xFTiAmJiBtYXRjaGVzUGF0dGVybihwYXRoLCBieVBhdGgpLFxuICAgICAgICB9KSxcbiAgICAgICAgZmllbGRzOiAobmFtZSkgPT4gdGhpcy5maWVsZHNPZihuYW1lKSxcbiAgICAgIH0sXG4gICAgICByb290RGVjaWRlZCxcbiAgICAgIC4uLihieVBhdGgubGVuZ3RoID09PSAwICYmIHsgbWVtbzogbmV3IFdlYWtNYXA8b2JqZWN0LCBNYXA8c3RyaW5nLCB1bmtub3duPj4oKSB9KSxcbiAgICAgIGJ1ZGdldDogd2Fsa0xpbWl0LFxuICAgICAgb25MaW1pdDogKCkgPT4gdGhpcy53YXJuV2Fsa0xpbWl0KGJ5UGF0aCksXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBPbmNlIHBlciBydWxlLCBpbiBkZXYgbW9kZTogYSBwYXRoIHdhbGsgcGFzc2VkIGl0cyBsaW1pdCBhbmQgc2VydmVkIGl0cyByZW1haW5kZXIgYXMgdGhlIHBsYWNlaG9sZGVyLiAqL1xuICBwcml2YXRlIHdhcm5XYWxrTGltaXQocGF0dGVybnM6IHJlYWRvbmx5IFJlZ0V4cFtdKTogdm9pZCB7XG4gICAgaWYgKHRoaXMud2Fsa0xpbWl0V2FybmVkIHx8ICFpc0Rldk1vZGUoKSkgcmV0dXJuO1xuICAgIHRoaXMud2Fsa0xpbWl0V2FybmVkID0gdHJ1ZTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgIGNvbnNvbGUud2FybihcbiAgICAgIGBbZm9vdHByaW50XSBSZWRhY3Rpb25Qb2xpY3k6IGEgdmFsdWUgd2l0aCBtb3JlIHRoYW4gJHt3YWxrTGltaXR9IHBhdGhzIHVuZGVyIHRoZSBwYXRoIHBhdHRlcm4ocykgYCArXG4gICAgICAgIGAke3BhdHRlcm5zLm1hcChTdHJpbmcpLmpvaW4oJywgJyl9IOKAlCB0aGUgcGF0aHMgcGFzdCB0aGF0IHdlcmUgc2VydmVkIGFzIHRoZSBwbGFjZWhvbGRlci4gYCArXG4gICAgICAgICdBIHBhdHRlcm4gdGhhdCBuYW1lcyBhIEtFWSAobm8gZG90LCBubyBsb29rYXJvdW5kKSBpcyBkZWNpZGVkIHBlciBvYmplY3Q7IHByZWZlciBvbmUsIG9yIGtleXMvZmllbGRzLicsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZG90dGVkIGtleXMgYW5kIG1hcmtzIHRoYXQgbmFtZSBhIHBhdGggdW5kZXIgYGJhc2VgICh0aGUgd2FsaydzIHJvb3Q6XG4gICAqIGB1bmRlZmluZWRgIGZvciBhIHJlY29yZCdzIG93biBrZXlzLCBhbiBlbnRyeSdzIG5hbWUgZm9yIGEgZGlhZ25vc3RpYyksXG4gICAqIGFzIHRhcmdldHMgcmVsYXRpdmUgdG8gaXQg4oCUIGEgZG90dGVkIHJ1bGUgaXMgZXhhY3QgdG8gaXRzIHBhdGguXG4gICAqL1xuICBwcml2YXRlIGRvdHRlZFRhcmdldHMoYmFzZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogVGFyZ2V0W10ge1xuICAgIGNvbnN0IHByZWZpeCA9IGJhc2UgPT09IHVuZGVmaW5lZCA/ICcnIDogYCR7YmFzZX0uYDtcbiAgICBjb25zdCBvdXQ6IFRhcmdldFtdID0gW107XG4gICAgY29uc3QgYWRkID0gKG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKCFuYW1lLmluY2x1ZGVzKCcuJykgfHwgIW5hbWUuc3RhcnRzV2l0aChwcmVmaXgpIHx8IG5hbWUubGVuZ3RoID09PSBwcmVmaXgubGVuZ3RoKSByZXR1cm47XG4gICAgICBvdXQucHVzaChuYW1lLnNsaWNlKHByZWZpeC5sZW5ndGgpLnNwbGl0KCcuJykpO1xuICAgIH07XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIHRoaXMubWFya2VkKSBhZGQobmFtZSk7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIHRoaXMucG9saWN5Py5rZXlzID8/IFtdKSBhZGQobmFtZSk7XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGF0IGFueSBvYnNlcnZlciBpcyBzZXJ2ZWQgZm9yIGEgdGhyb3duIHZhbHVlIOKAlCByZXRyeSwgdGhyb3R0bGUsIHJ1blxuICAgKiBmYWlsdXJlLCBhIGZvcmsgZW52ZWxvcGUsIHRoZSBsb2dnZXI6IGl0cyByZW1lbWJlcmVkIHN0YWdlIGZvcm0sIGVsc2UgdGhlXG4gICAqIHNhbWUgZGVjaXNpb24gbWFkZSBub3cgKGFuZCByZW1lbWJlcmVkKSwgZWxzZSBpdHMgc3RydWN0dXJlZCBpbmZvLlxuICAgKi9cbiAgc2VydmVkRXJyb3IoZXJyb3I6IHVua25vd24pOiBTdHJ1Y3R1cmVkRXJyb3JJbmZvIHtcbiAgICBjb25zdCBtYXNrZWQgPSB0aGlzLm1hc2tlZEVycm9yKGVycm9yKTtcbiAgICAvLyBFYWNoIGV2ZW50IGdldHMgaXRzIG93biBvYmplY3QsIGFzIGV4dHJhY3RFcnJvckluZm8gZ2l2ZXMgaXQgb25lLlxuICAgIHJldHVybiBtYXNrZWQgPyB7IC4uLm1hc2tlZCB9IDogZXh0cmFjdEVycm9ySW5mbyhlcnJvcik7XG4gIH1cblxuICAvKiogV2hhdCB0aGUgbG9nZ2VyIGlzIGhhbmRlZDogdGhlIHRocm93biB2YWx1ZSBpdHNlbGYgdW5sZXNzIHRoZSBwb2xpY3kgbWFza2VkIGl0cyB0ZXh0LiAqL1xuICBsb2dnYWJsZUVycm9yKGVycm9yOiB1bmtub3duKTogdW5rbm93biB7XG4gICAgY29uc3QgbWFza2VkID0gdGhpcy5tYXNrZWRFcnJvcihlcnJvcik7XG4gICAgcmV0dXJuIG1hc2tlZCA/IHsgLi4ubWFza2VkIH0gOiBlcnJvcjtcbiAgfVxuXG4gIHByaXZhdGUgbWFza2VkRXJyb3IoZXJyb3I6IHVua25vd24pOiBTdHJ1Y3R1cmVkRXJyb3JJbmZvIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBrbm93biA9IHRoaXMubWFza2VkRXJyb3JzPy5nZXQoZXJyb3IpO1xuICAgIGlmIChrbm93biB8fCB0aGlzLmlzRGlhZ25vc3RpY0luZXJ0KCkpIHJldHVybiBrbm93bjtcbiAgICBjb25zdCB0ZXh0ID0gdGhyb3duVGV4dChlcnJvcik7XG4gICAgdGhpcy5yZXRhaW5TdGFnZUVycm9yKGVycm9yLCB0ZXh0LCB0aGlzLnJldGFpbkRpYWdub3N0aWMoWydlcnJvcnMnLCAnc3RhZ2VFeGVjdXRpb25FcnJvciddLCB0ZXh0KSk7XG4gICAgcmV0dXJuIHRoaXMubWFza2VkRXJyb3JzPy5nZXQoZXJyb3IpO1xuICB9XG5cbiAgLyoqXG4gICAqIE5vdGhpbmcgY2FuIG1hc2sgYSBkaWFnbm9zdGljIGVudHJ5IG9yIGEgdGhyb3duIHZhbHVlIOKAlCBubyBzdGF0ZSBzZWxlY3RvcixcbiAgICogbm8gbWFyaywgbm8gZGlhZ25vc3RpYyBzZWxlY3RvcjogdGhlIGNvbGxlY3RvcnMnIGFuZCB0aGUgZXJyb3IgcGF0aHMnIGZhc3RcbiAgICogcGF0aCAoYSBuby1wb2xpY3kgcnVuIG5ldmVyIHJlYWRzIGEgcGF5bG9hZCwgaW5jbHVkaW5nIGJvcnJvd2VkIGdldHRlcnMpLlxuICAgKi9cbiAgaXNEaWFnbm9zdGljSW5lcnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNJbmVydCgpICYmIHRoaXMuaXNGbG93VGV4dEluZXJ0KCk7XG4gIH1cblxuICAvKiogTm90aGluZyBjYW4gbWFzayBmbG93LW1lc3NhZ2UgdGV4dCDigJQgb25seSBgcG9saWN5LmRpYWdub3N0aWNzYCBzZWxlY3RzIGl0ICh7QGxpbmsgcmV0YWluRmxvd1RleHR9KS4gKi9cbiAgaXNGbG93VGV4dEluZXJ0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5kaWFnbm9zdGljUnVsZSB8fCB0aGlzLmRpYWdub3N0aWNSdWxlLmlzSW5lcnQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdmVyZGljdCBmb3IgYSB1c2VyLWxldmVsIHBhdGgg4oCUIGBbJ3Byb2ZpbGUnXWAgZm9yIGEgc2NvcGUga2V5LFxuICAgKiBgWydwcm9maWxlJywgJ2F1dGgnXWAgZm9yIGEgbmVzdGVkIHdyaXRlIHN1Y2ggYXMgYSBzdWJmbG93IHNlZWQuXG4gICAqXG4gICAqIEV2ZXJ5IGRvdHRlZCBwcmVmaXggaXMgdGVzdGVkIGF0IGtleSBsZXZlbCAoYHByb2ZpbGVgLCB0aGVuXG4gICAqIGBwcm9maWxlLmF1dGhgKSwgc28gYSBwb2xpY3kgdGhhdCBuYW1lcyBhIGtleSBjb3ZlcnMgZXZlcnl0aGluZyB3cml0dGVuXG4gICAqIGJlbmVhdGggaXQuIGBmaWVsZHNgIGFyZSBkZWNsYXJlZCByZWxhdGl2ZSB0byB0aGUgVE9QIGtleTsgZm9yIGEgbmVzdGVkXG4gICAqIHBhdGggdGhleSBhcmUgcmUtYmFzZWQgb250byB0aGUgdmFsdWUgYmVpbmcgd3JpdHRlbiwgYW5kIGEgZmllbGQgdGhhdFxuICAgKiBuYW1lcyB0aGUgd3JpdHRlbiBwYXRoIGV4YWN0bHkgbWFrZXMgdGhlIHdob2xlIHZhbHVlIHNlY3JldC5cbiAgICovXG4gIHZlcmRpY3QocGF0aDogcmVhZG9ubHkgc3RyaW5nW10pOiBSZWRhY3Rpb25WZXJkaWN0IHtcbiAgICBpZiAocGF0aC5sZW5ndGggPT09IDApIHJldHVybiBDTEVBUjtcbiAgICBpZiAocGF0aC5sZW5ndGggPT09IDEpIHJldHVybiB0aGlzLnZlcmRpY3RPZktleShwYXRoWzBdKTtcbiAgICBsZXQgZG90dGVkID0gJyc7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgICBkb3R0ZWQgPSBpID09PSAwID8gcGF0aFswXSA6IGAke2RvdHRlZH0uJHtwYXRoW2ldfWA7XG4gICAgICBpZiAodGhpcy5pc0tleVJlZGFjdGVkKGRvdHRlZCkpIHJldHVybiB7IGtpbmQ6ICd3aG9sZScsIGtleTogZG90dGVkIH07XG4gICAgfVxuICAgIGNvbnN0IGZpZWxkcyA9IHRoaXMuZmllbGRzT2YocGF0aFswXSk7XG4gICAgaWYgKCFmaWVsZHMgfHwgZmllbGRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIENMRUFSO1xuICAgIGlmIChwYXRoLmxlbmd0aCA9PT0gMSkgcmV0dXJuIHsga2luZDogJ2ZpZWxkcycsIGtleTogcGF0aFswXSwgcGF0aHM6IGZpZWxkcyB9O1xuICAgIGNvbnN0IHJlbCA9IHBhdGguc2xpY2UoMSkuam9pbignLicpO1xuICAgIGNvbnN0IGluc2lkZTogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIGZpZWxkcykge1xuICAgICAgLy8gVGhlIHdyaXR0ZW4gcGF0aCBJUyBhIHNlY3JldCBmaWVsZDogdGhlIHdob2xlIHZhbHVlIGlzIHNlY3JldCwgYW5kXG4gICAgICAvLyB0aGUga2V5IHRoYXQgZGVjaWRlZCBpdCBpcyB0aGF0IGRvdHRlZCBwYXRoIOKAlCBuZXZlciB0aGUgdG9wIGtleSxcbiAgICAgIC8vIHdob3NlIHNpYmxpbmdzIHN0YXkgY2xlYXIuXG4gICAgICBpZiAoZmllbGQgPT09IHJlbCkgcmV0dXJuIHsga2luZDogJ3dob2xlJywga2V5OiBkb3R0ZWQgfTtcbiAgICAgIGlmIChmaWVsZC5zdGFydHNXaXRoKGAke3JlbH0uYCkpIGluc2lkZS5wdXNoKGZpZWxkLnNsaWNlKHJlbC5sZW5ndGggKyAxKSk7XG4gICAgfVxuICAgIHJldHVybiBpbnNpZGUubGVuZ3RoID4gMCA/IHsga2luZDogJ2ZpZWxkcycsIGtleTogcGF0aFswXSwgcGF0aHM6IGluc2lkZSB9IDogQ0xFQVI7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHZlcmRpY3QgZm9yIGBrZXlgIHdyaXR0ZW4gb3IgcmVhZCB1bmRlciBgcGF0aGAg4oCUIHRoZSBjb21tb25cbiAgICogc2luZ2xlLXNlZ21lbnQgY2FzZSAoYHBhdGhgIGVtcHR5OiBldmVyeSBmYWNhZGUgd3JpdGUgYW5kIHJlYWQpIGRlY2lkZXNcbiAgICogb24gdGhlIGtleSBzdHJpbmcgYWxvbmUsIG5vIGFycmF5IGFsbG9jYXRlZC5cbiAgICovXG4gIHZlcmRpY3RBdChwYXRoOiByZWFkb25seSBzdHJpbmdbXSwga2V5OiBzdHJpbmcpOiBSZWRhY3Rpb25WZXJkaWN0IHtcbiAgICByZXR1cm4gcGF0aC5sZW5ndGggPT09IDAgPyB0aGlzLnZlcmRpY3RPZktleShrZXkpIDogdGhpcy52ZXJkaWN0KFsuLi5wYXRoLCBrZXldKTtcbiAgfVxuXG4gIC8qKiBUaGUgc2luZ2xlLXNlZ21lbnQgdmVyZGljdDoga2V5LWxldmVsIGhpdCDihpIgd2hvbGU7IGRlY2xhcmVkIG9yIGluaGVyaXRlZCBmaWVsZHMg4oaSIGZpZWxkcy4gKi9cbiAgcHJpdmF0ZSB2ZXJkaWN0T2ZLZXkoa2V5OiBzdHJpbmcpOiBSZWRhY3Rpb25WZXJkaWN0IHtcbiAgICBpZiAodGhpcy5pc0tleVJlZGFjdGVkKGtleSkpIHJldHVybiB7IGtpbmQ6ICd3aG9sZScsIGtleSB9O1xuICAgIGNvbnN0IGZpZWxkcyA9IHRoaXMuZmllbGRzT2Yoa2V5KTtcbiAgICByZXR1cm4gZmllbGRzICE9PSB1bmRlZmluZWQgJiYgZmllbGRzLmxlbmd0aCA+IDAgPyB7IGtpbmQ6ICdmaWVsZHMnLCBrZXksIHBhdGhzOiBmaWVsZHMgfSA6IENMRUFSO1xuICB9XG5cbiAgLyoqIFRoZSBzZWNyZXQgZmllbGRzIG9mIGEgdG9wIGtleTogdGhlIHBvbGljeSdzLCBwbHVzIGFueSBhIG1hcHBlciBoYW5kZWQgaXQgKHtAbGluayBNYXBwZXJUYWludH0pLiAqL1xuICBwcml2YXRlIGZpZWxkc09mKGtleTogc3RyaW5nKTogcmVhZG9ubHkgc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGRlY2xhcmVkID0gZGVjbGFyZWRGaWVsZHModGhpcy5wb2xpY3k/LmZpZWxkcywga2V5KTtcbiAgICBjb25zdCBpbmhlcml0ZWQgPSB0aGlzLmluaGVyaXRlZD8uZ2V0KGtleSk7XG4gICAgaWYgKGluaGVyaXRlZCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZGVjbGFyZWQ7XG4gICAgcmV0dXJuIGRlY2xhcmVkID09PSB1bmRlZmluZWQgPyBpbmhlcml0ZWQgOiBbLi4ubmV3IFNldChbLi4uZGVjbGFyZWQsIC4uLmluaGVyaXRlZF0pXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcnVuJ3MgbWFya3MgYW5kIHRoZSBmaWVsZHMgbWFwcGVycyBoYW5kZWQgdG8gbmV3IGtleXMsIGFzIE5BTUVTIOKAlCB3aGF0XG4gICAqIGEgcGF1c2UgY2FycmllcyB0byB0aGUgcmVzdW1lZCBydW4gKGBGbG93Y2hhcnRDaGVja3BvaW50LnJlZGFjdGlvbk1hcmtzYCkuXG4gICAqIGB1bmRlZmluZWRgIHdoZW4gdGhlcmUgYXJlIG5vbmUgKG5vIHBvbGljeSwgbm8gcGVyLWNhbGwgbWFyaykuXG4gICAqL1xuICBtYXJrc0ZvckNoZWNrcG9pbnQoKTogUmVkYWN0aW9uTWFya3MgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLm1hcmtlZC5zaXplID09PSAwICYmIHRoaXMuaW5oZXJpdGVkID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtleXM6IFsuLi50aGlzLm1hcmtlZF0sXG4gICAgICAuLi4odGhpcy5pbmhlcml0ZWQgIT09IHVuZGVmaW5lZCAmJiB7XG4gICAgICAgIGZpZWxkczogT2JqZWN0LmZyb21FbnRyaWVzKFsuLi50aGlzLmluaGVyaXRlZF0ubWFwKChba2V5LCBwYXRoc10pID0+IFtrZXksIFsuLi5wYXRoc11dKSksXG4gICAgICB9KSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIFNlZWQgYSByZXN1bWVkIHJ1bidzIHJ1bGUgd2l0aCB0aGUgbWFya3MgaXRzIHBhdXNlIGNhcnJpZWQgKHtAbGluayBtYXJrc0ZvckNoZWNrcG9pbnR9KS4gKi9cbiAgcmVzdG9yZU1hcmtzKG1hcmtzOiBSZWRhY3Rpb25NYXJrcyk6IHZvaWQge1xuICAgIGZvciAoY29uc3Qga2V5IG9mIG1hcmtzLmtleXMpIHRoaXMubWFya2VkLmFkZChrZXkpO1xuICAgIGZvciAoY29uc3QgW2tleSwgcGF0aHNdIG9mIE9iamVjdC5lbnRyaWVzKG1hcmtzLmZpZWxkcyA/PyB7fSkpIHRoaXMuaW5oZXJpdEZpZWxkcyhrZXksIHBhdGhzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHN1YmZsb3cgbWFwcGVyJ3MgY29weSBpbmhlcml0cyB0aGUgZmllbGRzIG9mIHRoZSB2YWx1ZSBpdCBjb3BpZWQ6XG4gICAqIGB0YXJnZXRgIGlzIGEga2V5IHRoZSBtYXBwZXIgd3JvdGU7IGBwYXRoc2AgdGhlIHNvdXJjZSBrZXkncyBmaWVsZCBwYXRoc1xuICAgKiAoZGVjbGFyZWQgb3IgdGhlbXNlbHZlcyBpbmhlcml0ZWQpLiBSdW4td2lkZSwgYnkgbmFtZSwgbGlrZSBhIG1hcmsuXG4gICAqL1xuICBpbmhlcml0RmllbGRzKHRhcmdldDogc3RyaW5nLCBwYXRoczogcmVhZG9ubHkgc3RyaW5nW10pOiB2b2lkIHtcbiAgICBjb25zdCBwcmlvciA9IHRoaXMuaW5oZXJpdGVkPy5nZXQodGFyZ2V0KSA/PyBbXTtcbiAgICAodGhpcy5pbmhlcml0ZWQgPz89IG5ldyBNYXAoKSkuc2V0KHRhcmdldCwgWy4uLm5ldyBTZXQoWy4uLnByaW9yLCAuLi5wYXRoc10pXSk7XG4gIH1cblxuICAvKiogVGhlIHZlcmRpY3Qgb2YgYSBrZXkgYSBtYXBwZXIgcmVhZCDigJQgYHJ1bnNgICh0aGUgcnVuIG5hbWVzcGFjZXMpIGlzIHNlbGVjdGVkIHdoZW4gYW55IG5hbWVzcGFjZWQga2V5IGlzLiAqL1xuICB2ZXJkaWN0T2ZSZWFkKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IFJlZGFjdGlvblZlcmRpY3Qge1xuICAgIGNvbnN0IHZlcmRpY3QgPSB0aGlzLnZlcmRpY3RPZktleShrZXkpO1xuICAgIGlmICh2ZXJkaWN0LmtpbmQgIT09ICdjbGVhcicgfHwga2V5ICE9PSAncnVucycgfHwgdmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgcmV0dXJuIHZlcmRpY3Q7XG4gICAgZm9yIChjb25zdCBzcGFjZSBvZiBPYmplY3QudmFsdWVzKHZhbHVlKSkge1xuICAgICAgaWYgKHNwYWNlID09PSBudWxsIHx8IHR5cGVvZiBzcGFjZSAhPT0gJ29iamVjdCcpIGNvbnRpbnVlO1xuICAgICAgZm9yIChjb25zdCBpbm5lciBvZiBPYmplY3Qua2V5cyhzcGFjZSkpIHtcbiAgICAgICAgaWYgKHRoaXMudmVyZGljdE9mS2V5KGlubmVyKS5raW5kICE9PSAnY2xlYXInKSByZXR1cm4geyBraW5kOiAnd2hvbGUnLCBrZXkgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZlcmRpY3Q7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHJldGFpbmVkIC8gc2VydmVkIGZvcm0gb2YgYSB2YWx1ZSBhdCBhIHBhdGg6IHRoZSBwbGFjZWhvbGRlciwgYVxuICAgKiBzY3J1YmJlZCBDTE9ORSwgb3IgdGhlIHZhbHVlIGl0c2VsZiAoc2FtZSByZWZlcmVuY2Ug4oCUIHJlY29yZGVycyByZWNlaXZlXG4gICAqIGJvcnJvd2VkIGxpdmUgcmVmZXJlbmNlcyBmb3IgY2xlYXIgdmFsdWVzLCBhcyB0aGV5IGFsd2F5cyBoYXZlKS5cbiAgICogYHBsYWNlaG9sZGVyYCBkZWZhdWx0cyB0byB0aGUgc2NvcGUtdGllciBgJ1tSRURBQ1RFRF0nYDsgdGhlIG1pcnJvciBzZWVkXG4gICAqIHBhc3NlcyB0aGUgbG9nJ3MgYCdSRURBQ1RFRCdgLlxuICAgKi9cbiAgcmV0YWluKHBhdGg6IHJlYWRvbmx5IHN0cmluZ1tdLCB2YWx1ZTogdW5rbm93biwgcGxhY2Vob2xkZXI6IHN0cmluZyA9IFNDT1BFX1BMQUNFSE9MREVSKTogdW5rbm93biB7XG4gICAgcmV0dXJuIFJlZGFjdGlvblJ1bGUuYXBwbHkodGhpcy52ZXJkaWN0KHBhdGgpLCB2YWx1ZSwgcGxhY2Vob2xkZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSByZXRhaW5lZCBmb3JtIG9mIGEgU1RBVEUgcmVjb3JkIChzdGF0ZSByZWFkLCBtaXJyb3Igc2VlZCk6IGVhY2ggb3duXG4gICAqIGVudW1lcmFibGUgc3RyaW5nIGtleSB0aHJvdWdoIHtAbGluayByZXRhaW59LiBGaWVsZHMgYXJlIHBhdGhzIGluc2lkZSB0aGF0XG4gICAqIGtleWVkIHZhbHVlLiBTY2FsYXJzIGFuZCByb290IGFycmF5cyBwYXNzIHRocm91Z2guIEJvdW5kYXJ5IHJlY29yZHMgYWRkXG4gICAqIHRoZSBuZXN0ZWQta2V5IHdhbGs6IHtAbGluayByZXRhaW5Cb3VuZGFyeX0uXG4gICAqIFJldHVybnMgdGhlIFNBTUUgb2JqZWN0IHdoZW4gdW5jaGFuZ2VkLiBBbiBpbmVydCBydWxlIGRvZXMgbm90IGVudW1lcmF0ZVxuICAgKiB0aGUgdmFsdWUsIHNvIGV2ZW4gYW4gYWNjZXNzb3IgaXMgdW50b3VjaGVkIG9uIHRoZSBuby1wb2xpY3kgZmFzdCBwYXRoLlxuICAgKi9cbiAgcmV0YWluUmVjb3JkPFQ+KHJlY29yZDogVCwgcGxhY2Vob2xkZXI6IHN0cmluZyA9IFNDT1BFX1BMQUNFSE9MREVSKTogVCB7XG4gICAgaWYgKHRoaXMuaXNJbmVydCgpIHx8IHJlY29yZCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVjb3JkICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHJlY29yZCkpIHJldHVybiByZWNvcmQ7XG4gICAgbGV0IG91dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocmVjb3JkIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSkge1xuICAgICAgY29uc3Qga2VwdCA9IHRoaXMucmV0YWluKFtrZXldLCB2YWx1ZSwgcGxhY2Vob2xkZXIpO1xuICAgICAgaWYgKGtlcHQgPT09IHZhbHVlKSBjb250aW51ZTtcbiAgICAgIG91dCA/Pz0geyAuLi4ocmVjb3JkIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSB9O1xuICAgICAgb3V0W2tleV0gPSBrZXB0O1xuICAgIH1cbiAgICByZXR1cm4gKG91dCA/PyByZWNvcmQpIGFzIFQ7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHJldGFpbmVkIGZvcm0gb2YgYSBCT1VOREFSWSByZWNvcmQg4oCUIHJvb3QgaW5wdXQvb3V0cHV0IGFuZCBhIHN1YmZsb3cnc1xuICAgKiBtYXBwZWQgc2VlZCwgYmVmb3JlIGFueSBvYnNlcnZlciBzZWVzIGl0LiB7QGxpbmsgcmV0YWluUmVjb3JkfSBkZWNpZGVzIGVhY2hcbiAgICogdG9wIGtleTsgdGhlbiBldmVyeSBORVNURUQgb3duIGtleSBpcyBhIGtleSB0b286IHNlY3JldCB3aGVuIGl0cyBvd24gbmFtZVxuICAgKiBvciBpdHMgZG90dGVkIHBhdGggaXMgcmVkYWN0ZWQgYXQga2V5IGxldmVsIChga2V5czogWydzZWNyZXQnXWAgY292ZXJzXG4gICAqIGB7IHdyYXBwZXI6IHsgc2VjcmV0IH0gfWA7IGEgcm9vdCBhcnJheSdzIGVsZW1lbnRzIGFyZSB3YWxrZWQgdGhlIHNhbWVcbiAgICogd2F5KSwgYW5kIGl0cyBkZWNsYXJlZCBgZmllbGRzYCBzY3J1YmJlZCBpbnNpZGUgaXQgKGBmaWVsZHM6IHsgcHJvZmlsZTpcbiAgICogWyd0b2tlbiddIH1gIGNvdmVycyBgeyB3cmFwcGVyOiB7IHByb2ZpbGU6IHsgdG9rZW4gfSB9IH1gKS4gRGVjaWRlZCBwZXJcbiAgICogUEFUSCwgY29weS1vbi13cml0ZSBwZXIgcGF0aCAoe0BsaW5rIHNlcnZlZEJ5UGF0aH0pOiBhbiBvYmplY3Qgc2hhcmVkIGJ5XG4gICAqIHR3byBwYXRocyBpcyBtYXNrZWQgYXQgdGhlIG9uZSBhIHBhdGggcnVsZSBuYW1lcyBhbmQgc2VydmVkIGFzIGl0IGlzIGF0XG4gICAqIHRoZSBvdGhlcjsgYSBjeWNsZSBlZGdlIGxhbmRzIG9uIHRoZSBzZXJ2ZWQgY29weSwgbmV2ZXIgb24gYW4gdW5zY3J1YmJlZFxuICAgKiBvcmlnaW5hbDsgdGhlIGxpdmUgdmFsdWUgaXMgbmV2ZXIgdG91Y2hlZC4gUmV0dXJucyB0aGUgU0FNRSBvYmplY3Qgd2hlblxuICAgKiBub3RoaW5nIG5lc3RlZCBpcyBzZWNyZXQsIGFuZCBhbiBpbmVydCBydWxlIGVudW1lcmF0ZXMgbm90aGluZy4gU3RhdGVcbiAgICoga2VlcHMgaXRzIG93biBwYXRoIHZlcmRpY3RzICh7QGxpbmsgdmVyZGljdH0pOyB0aGlzIHdhbGsgaXMgZm9yIHJlY29yZHNcbiAgICogaGFuZGVkIG91dCB3aG9sZS5cbiAgICovXG4gIHJldGFpbkJvdW5kYXJ5PFQ+KHJlY29yZDogVCwgcGxhY2Vob2xkZXI6IHN0cmluZyA9IFNDT1BFX1BMQUNFSE9MREVSKTogVCB7XG4gICAgLy8gQSBtYXNrZWQgc3RhZ2UgZXJyb3IgaW5zaWRlIHRoZSByZWNvcmQgKGEgZm9yayBlbnZlbG9wZSdzIGByZXN1bHRgKSBpc1xuICAgIC8vIHNlcnZlZCBpbiBpdHMgbWFza2VkIGZvcm06IGFuIEVycm9yJ3MgbWVzc2FnZSBpcyBub24tZW51bWVyYWJsZSBhbmQgYVxuICAgIC8vIHRocm93biBzdHJpbmcgaXMgYSBwbGFpbiB2YWx1ZSwgc28gbm8ga2V5IHdhbGsgc2VlcyBlaXRoZXIuXG4gICAgY29uc3Qgc2VydmVkID0gdGhpcy5tYXNrZWRFcnJvcnM/LnNpemUgPyAodGhpcy53aXRoU2VydmVkRXJyb3JzKHJlY29yZCkgYXMgVCkgOiByZWNvcmQ7XG4gICAgaWYgKHRoaXMuaXNJbmVydCgpIHx8IHNlcnZlZCA9PT0gbnVsbCB8fCB0eXBlb2Ygc2VydmVkICE9PSAnb2JqZWN0JykgcmV0dXJuIHNlcnZlZDtcbiAgICBjb25zdCB0b3AgPSB0aGlzLnJldGFpblJlY29yZChzZXJ2ZWQsIHBsYWNlaG9sZGVyKSBhcyB1bmtub3duIGFzIG9iamVjdDtcbiAgICAvLyBCZWxvdyB0aGUgdG9wIGtleXMsIG9uZSBkZWNpc2lvbiBwZXIgUEFUSCAodGhlIHdob2xlIHJlY29yZCBpcyB0aGUgd2FsaydzIHJvb3QsIHNvIGEgY3ljbGVcbiAgICAvLyBiYWNrIHRvIGl0IGxhbmRzIG9uIHRoZSBzZXJ2ZWQgY29weSkuXG4gICAgcmV0dXJuIHNlcnZlZEJ5UGF0aCh0b3AsIHVuZGVmaW5lZCwgdGhpcy5kb3R0ZWRUYXJnZXRzKHVuZGVmaW5lZCksIHRoaXMubmFtZXNXYWxrKHRydWUpLCBwbGFjZWhvbGRlcikgYXMgVDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb3B5LW9uLXdyaXRlIG92ZXIgY29udGFpbmVyczogZXZlcnkgcmVtZW1iZXJlZCBtYXNrZWQgZXJyb3IgYmVjb21lcyBpdHNcbiAgICogc2VydmVkIGZvcm0g4oCUIGFuIG9iamVjdCBlcnJvciBpdHMgbWFza2VkIHN0cnVjdHVyZWQgaW5mbywgYSB0aHJvd25cbiAgICogc3RyaW5nL251bWJlciBpdHMgbWFza2VkIHRleHQgKHRoZSB2YWx1ZSBrZWVwcyBiZWluZyBhIHNjYWxhcikuIEEgc2NhbGFyIGlzXG4gICAqIG1hdGNoZWQgYnkgVkFMVUUsIHNvIGFuIHVucmVsYXRlZCBmaWVsZCB0aGF0IGhhcHBlbnMgdG8gZXF1YWwgYSBtYXNrZWRcbiAgICogdGhyb3duIHN0cmluZyBpcyBtYXNrZWQgdG9vOiBvdmVyLW1hc2tpbmcgaXMgdGhlIHNhZmUgZGlyZWN0aW9uLlxuICAgKiBgdW5kZWZpbmVkYC9gbnVsbGAvYm9vbGVhbnMgYXJlIG5ldmVyIHN3YXBwZWQg4oCUIHRoZXkgY2Fycnkgbm8gdGV4dCwgYW5kXG4gICAqIHN3YXBwaW5nIHRoZW0gd291bGQgcmV3cml0ZSBvcmRpbmFyeSBkYXRhIHNoYXBlcy5cbiAgICpcbiAgICogQ1lDTEUtU0FGRSAocmV2aWV3IGZpbmRpbmcgMikuIFRoZSBjb250YWluZXJzIHRoYXQgY2FuIFJFQUNIIGEgbWFza2VkXG4gICAqIGVycm9yIGFyZSBmb3VuZCBmaXJzdCAoe0BsaW5rIHJlYWNoaW5nTWFza2VkRXJyb3JzfSDigJQgdGhlIHdob2xlIHJlYWNoYWJsZVxuICAgKiBncmFwaCwgY3ljbGVzIGluY2x1ZGVkKTsgZWFjaCBvZiB0aGVtIGlzIGNvcGllZCwgaXRzIGNvcHkgYWxsb2NhdGVkIGFuZFxuICAgKiByZW1lbWJlcmVkIEJFRk9SRSBpdHMgY2hpbGRyZW4gYXJlIGZpbGxlZCwgc28gYW4gZWRnZSBiYWNrIHRvIGl0IOKAlCBhIGN5Y2xlXG4gICAqIOKAlCBsYW5kcyBvbiB0aGUgY29weSwgbmV2ZXIgb24gdGhlIG9yaWdpbmFsIHRoYXQgc3RpbGwgaG9sZHMgdGhlIHJhdyBlcnJvci5cbiAgICogRXZlcnkgb3RoZXIgY29udGFpbmVyIGtlZXBzIGl0cyBpZGVudGl0eS5cbiAgICovXG4gIHByaXZhdGUgd2l0aFNlcnZlZEVycm9ycyh2YWx1ZTogdW5rbm93bik6IHVua25vd24ge1xuICAgIGNvbnN0IGxlYWYgPSB0aGlzLnNlcnZlZExlYWYodmFsdWUpO1xuICAgIGlmIChsZWFmICE9PSBLRUVQIHx8IHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHJldHVybiBsZWFmID09PSBLRUVQID8gdmFsdWUgOiBsZWFmO1xuICAgIGNvbnN0IHJlYWNoaW5nID0gdGhpcy5yZWFjaGluZ01hc2tlZEVycm9ycyh2YWx1ZSk7XG4gICAgaWYgKCFyZWFjaGluZy5oYXModmFsdWUpKSByZXR1cm4gdmFsdWU7XG4gICAgY29uc3QgY29waWVzID0gbmV3IE1hcDxvYmplY3QsIFJlY29yZDxzdHJpbmcsIHVua25vd24+PigpO1xuICAgIGNvbnN0IGNvcHlPZiA9IChub2RlOiBvYmplY3QpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiB7XG4gICAgICBjb25zdCBrbm93biA9IGNvcGllcy5nZXQobm9kZSk7XG4gICAgICBpZiAoa25vd24gIT09IHVuZGVmaW5lZCkgcmV0dXJuIGtub3duO1xuICAgICAgY29uc3QgY29weSA9IChBcnJheS5pc0FycmF5KG5vZGUpID8gbm9kZS5zbGljZSgpIDogeyAuLi5ub2RlIH0pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgY29waWVzLnNldChub2RlLCBjb3B5KTtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgY2hpbGRdIG9mIE9iamVjdC5lbnRyaWVzKG5vZGUpKSB7XG4gICAgICAgIGNvbnN0IHNlcnZlZCA9IHRoaXMuc2VydmVkTGVhZihjaGlsZCk7XG4gICAgICAgIGlmIChzZXJ2ZWQgIT09IEtFRVApIGNvcHlba2V5XSA9IHNlcnZlZDtcbiAgICAgICAgZWxzZSBpZiAoY2hpbGQgIT09IG51bGwgJiYgdHlwZW9mIGNoaWxkID09PSAnb2JqZWN0JyAmJiByZWFjaGluZy5oYXMoY2hpbGQpKSBjb3B5W2tleV0gPSBjb3B5T2YoY2hpbGQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvcHk7XG4gICAgfTtcbiAgICByZXR1cm4gY29weU9mKHZhbHVlKTtcbiAgfVxuXG4gIC8qKiBBIG1hc2tlZCBlcnJvcidzIHNlcnZlZCBmb3JtIOKAlCBgS0VFUGAgZm9yIGFueXRoaW5nIGVsc2UgKGEgc2NhbGFyIG5ldmVyIHN3YXBwZWQsIGEgY29udGFpbmVyKS4gKi9cbiAgcHJpdmF0ZSBzZXJ2ZWRMZWFmKHZhbHVlOiB1bmtub3duKTogdW5rbm93biB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHJldHVybiBLRUVQO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICBjb25zdCBtYXNrZWQgPSB0aGlzLm1hc2tlZEVycm9ycz8uZ2V0KHZhbHVlKTtcbiAgICAgIHJldHVybiBtYXNrZWQgPyB7IC4uLm1hc2tlZCB9IDogS0VFUDtcbiAgICB9XG4gICAgY29uc3Qgc3dhcHBhYmxlID0gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2JpZ2ludCc7XG4gICAgY29uc3QgbWFza2VkID0gc3dhcHBhYmxlID8gdGhpcy5tYXNrZWRFcnJvcnM/LmdldCh2YWx1ZSkgOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIG1hc2tlZCA/IG1hc2tlZC5tZXNzYWdlIDogS0VFUDtcbiAgfVxuXG4gIC8qKiBFdmVyeSBjb250YWluZXIgdW5kZXIgYHJvb3RgIChpdHNlbGYgaW5jbHVkZWQpIGZyb20gd2hpY2ggc29tZSBwYXRoIHJlYWNoZXMgYSBtYXNrZWQgZXJyb3IuICovXG4gIHByaXZhdGUgcmVhY2hpbmdNYXNrZWRFcnJvcnMocm9vdDogb2JqZWN0KTogU2V0PG9iamVjdD4ge1xuICAgIGNvbnN0IHBhcmVudHMgPSBuZXcgTWFwPG9iamVjdCwgb2JqZWN0W10+KCk7XG4gICAgY29uc3QgaG9sZGVyczogb2JqZWN0W10gPSBbXTtcbiAgICBjb25zdCBzZWVuID0gbmV3IFNldDxvYmplY3Q+KFtyb290XSk7XG4gICAgY29uc3Qgc3RhY2s6IG9iamVjdFtdID0gW3Jvb3RdO1xuICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBub2RlID0gc3RhY2sucG9wKCkhO1xuICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBPYmplY3QudmFsdWVzKG5vZGUpKSB7XG4gICAgICAgIGlmICh0aGlzLnNlcnZlZExlYWYoY2hpbGQpICE9PSBLRUVQKSB7XG4gICAgICAgICAgaG9sZGVycy5wdXNoKG5vZGUpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGlsZCA9PT0gbnVsbCB8fCB0eXBlb2YgY2hpbGQgIT09ICdvYmplY3QnKSBjb250aW51ZTtcbiAgICAgICAgY29uc3Qgb2YgPSBwYXJlbnRzLmdldChjaGlsZCk7XG4gICAgICAgIGlmIChvZiA9PT0gdW5kZWZpbmVkKSBwYXJlbnRzLnNldChjaGlsZCwgW25vZGVdKTtcbiAgICAgICAgZWxzZSBvZi5wdXNoKG5vZGUpO1xuICAgICAgICBpZiAoIXNlZW4uaGFzKGNoaWxkKSkge1xuICAgICAgICAgIHNlZW4uYWRkKGNoaWxkKTtcbiAgICAgICAgICBzdGFjay5wdXNoKGNoaWxkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByZWFjaGluZyA9IG5ldyBTZXQ8b2JqZWN0PigpO1xuICAgIHdoaWxlIChob2xkZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG5vZGUgPSBob2xkZXJzLnBvcCgpITtcbiAgICAgIGlmIChyZWFjaGluZy5oYXMobm9kZSkpIGNvbnRpbnVlO1xuICAgICAgcmVhY2hpbmcuYWRkKG5vZGUpO1xuICAgICAgaG9sZGVycy5wdXNoKC4uLihwYXJlbnRzLmdldChub2RlKSA/PyBbXSkpO1xuICAgIH1cbiAgICByZXR1cm4gcmVhY2hpbmc7XG4gIH1cblxuICAvKiogRG9lcyBgdmFsdWVgIGhvbGQgb25lIG9mIGBwYXRoc2Ag4oCUIGFuIG93biBrZXkgb2YgdGhhdCBuYW1lLCBvciBhIGRvdHRlZCBwYXRoIGluc2lkZSBpdD8gKi9cbiAgc3RhdGljIGhvbGRzUGF0aHModmFsdWU6IG9iamVjdCwgcGF0aHM6IHJlYWRvbmx5IHN0cmluZ1tdIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gICAgaWYgKHBhdGhzID09PSB1bmRlZmluZWQpIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IHBhdGggb2YgcGF0aHMpIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIHBhdGgpIHx8IChwYXRoLmluY2x1ZGVzKCcuJykgJiYgbmF0aXZlSGFzKHZhbHVlLCBwYXRoKSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmV0YWluZWQgZm9ybSBvZiBhIHdob2xlIFNUQVRFIOKAlCB7QGxpbmsgcmV0YWluUmVjb3JkfSBvdmVyIHRoZSByb290XG4gICAqIGtleXMgQU5EIG92ZXIgZXZlcnkgcnVuIG5hbWVzcGFjZSB1bmRlciBgcnVuc2AgKGZvcmsgY2hpbGRyZW4gd3JpdGVcbiAgICogdGhlcmU7IGEgY2hlY2twb2ludCdzIGBzaGFyZWRTdGF0ZWAgY2FycmllcyBpdCBiYWNrIGFzIGEgc2VlZCkuIFRoaXMgaXNcbiAgICogd2hhdCBzZWVkcyB0aGUgcmVkYWN0ZWQgbWlycm9yOiB0aGUgc3RvcmUncyBzdGFydGluZyBzdGF0ZSwgc2NydWJiZWRcbiAgICogd2l0aCB0aGUgbG9nJ3MgcGxhY2Vob2xkZXIsIHNvIGEgcG9saWN5IGtleSB0aGF0IGFycml2ZXMgYnkgc2VlZCBhbmQgaXNcbiAgICogbmV2ZXIgcmUtd3JpdHRlbiBpcyBzdGlsbCBzZXJ2ZWQgYXMgdGhlIHBsYWNlaG9sZGVyLlxuICAgKi9cbiAgcmV0YWluU3RhdGU8VD4oc3RhdGU6IFQsIHBsYWNlaG9sZGVyOiBzdHJpbmcgPSBTQ09QRV9QTEFDRUhPTERFUik6IFQge1xuICAgIGNvbnN0IGtlcHQgPSB0aGlzLnJldGFpblJlY29yZChzdGF0ZSwgcGxhY2Vob2xkZXIpO1xuICAgIGlmIChrZXB0ID09PSBudWxsIHx8IHR5cGVvZiBrZXB0ICE9PSAnb2JqZWN0JykgcmV0dXJuIGtlcHQ7XG4gICAgY29uc3QgcnVucyA9IChrZXB0IGFzIHsgcnVucz86IHVua25vd24gfSkucnVucztcbiAgICBpZiAocnVucyA9PT0gbnVsbCB8fCB0eXBlb2YgcnVucyAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShydW5zKSkgcmV0dXJuIGtlcHQ7XG4gICAgbGV0IHNjcnViYmVkUnVuczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgZm9yIChjb25zdCBbcnVuSWQsIHJlY29yZF0gb2YgT2JqZWN0LmVudHJpZXMocnVucyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikpIHtcbiAgICAgIGNvbnN0IGtlcHRSdW4gPSB0aGlzLnJldGFpblJlY29yZChyZWNvcmQsIHBsYWNlaG9sZGVyKTtcbiAgICAgIGlmIChrZXB0UnVuID09PSByZWNvcmQpIGNvbnRpbnVlO1xuICAgICAgc2NydWJiZWRSdW5zID8/PSB7IC4uLihydW5zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSB9O1xuICAgICAgc2NydWJiZWRSdW5zW3J1bklkXSA9IGtlcHRSdW47XG4gICAgfVxuICAgIHJldHVybiBzY3J1YmJlZFJ1bnMgPT09IHVuZGVmaW5lZCA/IGtlcHQgOiAoeyAuLi4oa2VwdCBhcyBvYmplY3QpLCBydW5zOiBzY3J1YmJlZFJ1bnMgfSBhcyBUKTtcbiAgfVxuXG4gIC8qKiBBcHBseSBhIHZlcmRpY3QgdG8gYSB2YWx1ZSDigJQgc2VlIHtAbGluayByZXRhaW59LiAqL1xuICBzdGF0aWMgYXBwbHkodmVyZGljdDogUmVkYWN0aW9uVmVyZGljdCwgdmFsdWU6IHVua25vd24sIHBsYWNlaG9sZGVyOiBzdHJpbmcgPSBTQ09QRV9QTEFDRUhPTERFUik6IHVua25vd24ge1xuICAgIGlmICh2ZXJkaWN0LmtpbmQgPT09ICd3aG9sZScpIHJldHVybiBwbGFjZWhvbGRlcjtcbiAgICBpZiAodmVyZGljdC5raW5kID09PSAnZmllbGRzJykgcmV0dXJuIFJlZGFjdGlvblJ1bGUuc2NydWJGaWVsZHModmFsdWUsIHZlcmRpY3QucGF0aHMsIHBsYWNlaG9sZGVyKSA/PyB2YWx1ZTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogQSBkZWVwIGNsb25lIG9mIGB2YWx1ZWAgd2l0aCB0aGUgZ2l2ZW4gZG90LXBhdGhzIHJlcGxhY2VkIGJ5IHRoZVxuICAgKiBwbGFjZWhvbGRlciDigJQgYHVuZGVmaW5lZGAgd2hlbiBgdmFsdWVgIGlzIG5vdCBhbiBvYmplY3QgKHRoZXJlIGlzIG5vdGhpbmdcbiAgICogdG8gc2NydWIgaW4gYSBzY2FsYXI7IHRoZSBjYWxsZXIga2VlcHMgdGhlIHZhbHVlKS4gVGhlIGNsb25lIHJlZnVzZXMgYW5cbiAgICogdW5jbG9uZWFibGUgdmFsdWUuIEEgcGF0aCBuYW1lcyBhIGxpdGVyYWwga2V5IChgJ2EuYidgIGFzIG9uZSBwcm9wZXJ0eSlcbiAgICogYW5kLCB3aGVuIGRvdHRlZCwgdGhlIG5lc3RlZCBwYXRoOyBlYWNoIGlzIHNjcnViYmVkIHdoZXJlIGl0IGV4aXN0cywgcGVyXG4gICAqIFBBVEgg4oCUIGEgbm9kZSB0aGUgY2xvbmUgc2hhcmVzIGJldHdlZW4gdHdvIHBhdGhzIGlzIG1hc2tlZCBhdCB0aGUgbmFtZWRcbiAgICogb25lIG9ubHkgKHtAbGluayBzZXJ2ZWRCeVBhdGh9KS4gUGF0aHMgdGhhdCBkbyBub3QgZXhpc3QgYXJlIGlnbm9yZWQg4oCUXG4gICAqIHNjcnViYmluZyBuZXZlciBpbnZlbnRzIGEgZmllbGQuXG4gICAqL1xuICBzdGF0aWMgc2NydWJGaWVsZHMoXG4gICAgdmFsdWU6IHVua25vd24sXG4gICAgcGF0aHM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICAgIHBsYWNlaG9sZGVyOiBzdHJpbmcgPSBTQ09QRV9QTEFDRUhPTERFUixcbiAgKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIC8vIFRoZSBjbG9uZSBkZXRhY2hlcyB0aGUgcmV0YWluZWQgdmFsdWUgKGFuZCByZWZ1c2VzIGFuIHVuY2xvbmVhYmxlIG9uZSk7IHRoZSBzY3J1YiBvbiBpdCBpc1xuICAgIC8vIGRlY2lkZWQgcGVyIFBBVEgsIHNvIGEgbm9kZSB0aGUgY2xvbmUgc2hhcmVzIGJldHdlZW4gdHdvIHBhdGhzIGlzIG1hc2tlZCBhdCB0aGUgbmFtZWQgb25lIG9ubHkuXG4gICAgY29uc3QgY29weSA9IHN0cnVjdHVyZWRDbG9uZSh2YWx1ZSkgYXMgb2JqZWN0O1xuICAgIHJldHVybiBzZXJ2ZWRCeVBhdGgoXG4gICAgICBjb3B5LFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdGFyZ2V0c09mKHBhdGhzKSxcbiAgICAgIHsgcm9vdERlY2lkZWQ6IGZhbHNlLCBtZW1vOiBuZXcgV2Vha01hcDxvYmplY3QsIE1hcDxzdHJpbmcsIHVua25vd24+PigpLCBidWRnZXQ6IHdhbGtMaW1pdCB9LFxuICAgICAgcGxhY2Vob2xkZXIsXG4gICAgKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgfVxuXG4gIHJlcG9ydCgpOiBSZWRhY3Rpb25SZXBvcnQge1xuICAgIC8vIEtleWVkIGJ5IGEgTWFwLCB0aGVuIG1hZGUgb3duIGRhdGEga2V5cyBieSBgZnJvbUVudHJpZXNgOiBhIGtleSBhIG1hcHBlclxuICAgIC8vIHdyb3RlIGlzIGEgbmFtZSBmcm9tIGRhdGEsIGFuZCBvbiBhIHBsYWluIG9iamVjdCBgdG9TdHJpbmdgIHdvdWxkIHJlYWRcbiAgICAvLyB0aGUgaW5oZXJpdGVkIG1ldGhvZCBhbmQgYF9fcHJvdG9fX2Agd291bGQgY2FsbCB0aGUgcHJvdG90eXBlIHNldHRlci5cbiAgICBjb25zdCBmaWVsZFJlZGFjdGlvbnMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nW10+KCk7XG4gICAgZm9yIChjb25zdCBba2V5LCBmaWVsZHNdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMucG9saWN5Py5maWVsZHMgPz8ge30pKSB7XG4gICAgICBmaWVsZFJlZGFjdGlvbnMuc2V0KGtleSwgWy4uLmZpZWxkc10pO1xuICAgIH1cbiAgICAvLyBGaWVsZHMgYSBtYXBwZXIgaGFuZGVkIHRvIGEgbmV3IGtleSBhcmUgc2NydWJiZWQgdW5kZXIgdGhhdCBrZXkgdG9vLlxuICAgIGZvciAoY29uc3QgW2tleSwgZmllbGRzXSBvZiB0aGlzLmluaGVyaXRlZCA/PyBbXSkge1xuICAgICAgZmllbGRSZWRhY3Rpb25zLnNldChrZXksIFsuLi5uZXcgU2V0KFsuLi4oZmllbGRSZWRhY3Rpb25zLmdldChrZXkpID8/IFtdKSwgLi4uZmllbGRzXSldKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlZGFjdGVkS2V5czogWy4uLnRoaXMubWFya2VkXSxcbiAgICAgIGZpZWxkUmVkYWN0aW9uczogT2JqZWN0LmZyb21FbnRyaWVzKGZpZWxkUmVkYWN0aW9ucyksXG4gICAgICBwYXR0ZXJuczogKHRoaXMucG9saWN5Py5wYXR0ZXJucyA/PyBbXSkubWFwKChwKSA9PiBwLnNvdXJjZSksXG4gICAgfTtcbiAgfVxufVxuXG4vLyDilIDilIDilIAgVGhlIHBhdGggd2FsayDigJQgb25lIGRlY2lzaW9uIHBlciBQQVRIIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy9cbi8vIEEgcnVsZSB0aGF0IG5hbWVzIGEgUEFUSCAoYSBkb3R0ZWQga2V5LCBhIHBhdHRlcm4sIGEgZmllbGQpIG11c3QgYmUgZXhhY3Rcbi8vIGV2ZW4gd2hlbiBvbmUgb2JqZWN0IGlzIHJlYWNoYWJsZSBhdCB0d28gcGF0aHM6IHRoZSBkZWNpc2lvbiBpcyBtYWRlIHBlclxuLy8gcGF0aCwgbmV2ZXIgcGVyIG9iamVjdCwgYW5kIGEgY29weSBpcyBtYWRlIHBlciBwYXRoIChjb3B5LW9uLXdyaXRlKSDigJQgbmV2ZXJcbi8vIGEgc2NydWIgaW4gcGxhY2Ugb24gYSBub2RlIGFub3RoZXIgcGF0aCBzdGlsbCBzaG93cy4gQSBrZXktTkFNRSBydWxlIGlzIHRoZVxuLy8gc2FtZSBhdCBldmVyeSBwYXRoLCBzbyBhIHNoYXJlZCBub2RlIGl0IG1hc2tzIGlzIG1hc2tlZCBldmVyeXdoZXJlIOKAlCB0aGVcbi8vIHNhZmUgc2lkZS4gQSBjeWNsZSBlZGdlIGlzIG5vdCBmb2xsb3dlZDogaXQgaXMgcG9pbnRlZCBhdCB0aGUgYW5jZXN0b3Inc1xuLy8gc2VydmVkIGNvcHkuXG4vL1xuLy8gTElORUFSIE9OIEEgREFHLiBEb3R0ZWQga2V5cyBhbmQgbWFya3MgYXJlIHdhbGtlZCBhcyBUQVJHRVRTIChwYXRoLXJlbGF0aXZlXG4vLyBzdGF0ZSwgbGlrZSBmaWVsZHMpLCBhbmQgYSBwYXR0ZXJuIHRoYXQgY2FuIG9ubHkgbWF0Y2ggd2l0aGluIGEga2V5IE5BTUVcbi8vICh7QGxpbmsgbmVlZHNQYXRofSDigJQgdGhlIGNvbW1vbiBjYXNlLCBgL3Bhc3N3b3JkL2lgKSBpcyBkZWNpZGVkIGJ5IHRoZSBuYW1lLFxuLy8gc28gYSBkZWNpc2lvbiBkZXBlbmRzIG9ubHkgb24gdGhlIG9iamVjdCBhbmQgdGhlIHRhcmdldHMgc3RpbGwgbGl2ZSBhdCBpdCDigJRcbi8vIG1lbW9pemVkIHBlciAob2JqZWN0LCB0YXJnZXRzKTogYW4gb2JqZWN0IHNoYXJlZCBieSBtYW55IHBhdGhzIChhbiBhZ2VudCdzXG4vLyBsaW5rZWQgaGlzdG9yeSkgaXMgZGVjaWRlZCBvbmNlLCBhbmQgaXRzIHNlcnZlZCBjb3B5IGlzIHNoYXJlZCB0b28uIE9ubHkgYVxuLy8gZ2VudWluZWx5IFBBVEgtZGVwZW5kZW50IHBhdHRlcm4gKGAvXmFcXC5iJC9gKSB3YWxrcyBwYXRoczsgcGFzdFxuLy8ge0BsaW5rIFdBTEtfTElNSVR9IHBhdGggdmlzaXRzIHN1Y2ggYSB3YWxrIHNlcnZlcyB0aGUgdW52aXNpdGVkIHJlbWFpbmRlciBhc1xuLy8gdGhlIHBsYWNlaG9sZGVyICh0aGUgc2FmZSBzaWRlKSwgd2FybnMgb25jZSBpbiBkZXYgbW9kZSwgYW5kIG5ldmVyIGZhaWxzLlxuXG4vKiogQSBmaWVsZCBzdGlsbCB0byByZWFjaCBiZWxvdyBhIG5vZGU6IHRoZSBwYXRoIHNlZ21lbnRzIGxlZnQgdG8gd2Fsay4gKi9cbnR5cGUgVGFyZ2V0ID0gcmVhZG9ubHkgc3RyaW5nW107XG5cbi8qKiBIb3cgYSB3YWxrIGRlY2lkZXMgYW4gZWRnZS4gKi9cbmludGVyZmFjZSBXYWxrIHtcbiAgLyoqIEtleS1sZXZlbCBydWxlcyBhdCBldmVyeSBuZXN0ZWQga2V5IOKAlCBhYnNlbnQgZm9yIGEgYmFyZSBmaWVsZCBzY3J1YiAodGFyZ2V0cyBvbmx5KS4gKi9cbiAgcmVhZG9ubHkgbmFtZXM/OiB7XG4gICAgLyoqIFNlbGVjdGVkIHdob2xlIGF0IHRoaXMgbmVzdGVkIGtleSBieSBpdHMgb3duIE5BTUUgKG1hcmtzLCBrZXlzLCBwYXR0ZXJucykuICovXG4gICAgbWFza3MobmFtZTogc3RyaW5nKTogYm9vbGVhbjtcbiAgICAvKiogU2VsZWN0ZWQgd2hvbGUgYnkgdGhlIGRvdHRlZCBQQVRIIOKAlCBwcmVzZW50IG9ubHkgdW5kZXIgcGF0dGVybnMgKGEgcGF0dGVybiBpcyB0ZXN0ZWQgb24gdGhlIHBhdGgpLiAqL1xuICAgIHBhdGhNYXNrcz8ocGF0aDogc3RyaW5nKTogYm9vbGVhbjtcbiAgICAvKiogVGhlIGRlY2xhcmVkIGZpZWxkcyBiZWxvdyBhIGtleSBvZiB0aGlzIG5hbWUuICovXG4gICAgZmllbGRzKG5hbWU6IHN0cmluZyk6IHJlYWRvbmx5IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuICB9O1xuICAvKiogVGhlIHJvb3QncyBvd24ga2V5cyB3ZXJlIGRlY2lkZWQgYnkgdGhlIGNhbGxlciAoYHJldGFpblJlY29yZGApOiB3YWxrIGJlbG93IHRoZW0gb25seS4gKi9cbiAgcmVhZG9ubHkgcm9vdERlY2lkZWQ6IGJvb2xlYW47XG4gIC8qKiBEZWNpc2lvbnMgc2hhcmVkIHBlciAob2JqZWN0LCB0YXJnZXRzKSDigJQgYWJzZW50IHdoZW4gYSBkZWNpc2lvbiBkZXBlbmRzIG9uIHRoZSBwYXRoLiAqL1xuICByZWFkb25seSBtZW1vPzogV2Vha01hcDxvYmplY3QsIE1hcDxzdHJpbmcsIHVua25vd24+PjtcbiAgLyoqIFBhdGggdmlzaXRzIGxlZnQuICovXG4gIGJ1ZGdldDogbnVtYmVyO1xuICAvKiogVG9sZCBvbmNlIHdoZW4gdGhlIHdhbGsgcGFzc2VzIGl0cyBsaW1pdC4gKi9cbiAgcmVhZG9ubHkgb25MaW1pdD86ICgpID0+IHZvaWQ7XG4gIC8qKiBUaGUgd2FsayBoYXMgcGFzc2VkIGl0cyBsaW1pdDogd2hhdCBpdCBoYXMgbm90IHZpc2l0ZWQgaXMgc2VydmVkIGFzIHRoZSBwbGFjZWhvbGRlci4gKi9cbiAgbGltaXRlZD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGF0aCB2aXNpdHMgb25lIHdhbGsgbWF5IG1ha2Ug4oCUIHJlYWNoYWJsZSBvbmx5IHVuZGVyIGEgUEFUSC1kZXBlbmRlbnRcbiAqIHBhdHRlcm4gb3ZlciBhIHZhbHVlIHdob3NlIHBhdGhzIG91dG51bWJlciBpdHMgb2JqZWN0cyAoYSBsaW5rZWQgaGlzdG9yeSwgYVxuICogREFHKTogZXZlcnkgb3RoZXIgd2FsayBzaGFyZXMgaXRzIGRlY2lzaW9ucyBwZXIgb2JqZWN0IGFuZCBzdGF5cyBsaW5lYXIuXG4gKi9cbmV4cG9ydCBjb25zdCBXQUxLX0xJTUlUID0gMV8wMDBfMDAwO1xuXG4vKiogVGhlIGxpbWl0IHdhbGtzIHVzZToge0BsaW5rIFdBTEtfTElNSVR9LCB1bmxlc3MgYSB0ZXN0IGxvd2VyZWQgaXQgKHtAbGluayB1c2VXYWxrTGltaXR9KS4gKi9cbmxldCB3YWxrTGltaXQ6IG51bWJlciA9IFdBTEtfTElNSVQ7XG5cbi8qKlxuICogQGludGVybmFsIFRlc3RzIG9ubHkg4oCUIG5vdCBvbiBhbnkgcHVibGljIGRvb3I6IHdhbGtzIHVzZSBgbGltaXRgIHVudGlsIHRoZVxuICogcmV0dXJuZWQgcmVzdG9yZSBpcyBjYWxsZWQsIHNvIGEgdGVzdCByZWFjaGVzIHRoZSBvdmVyLWxpbWl0IHBhdGggaW4gYVxuICogdGhvdXNhbmQgdmlzaXRzIGluc3RlYWQgb2YgYSBtaWxsaW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlV2Fsa0xpbWl0KGxpbWl0OiBudW1iZXIpOiAoKSA9PiB2b2lkIHtcbiAgY29uc3QgcHJpb3IgPSB3YWxrTGltaXQ7XG4gIHdhbGtMaW1pdCA9IGxpbWl0O1xuICByZXR1cm4gKCkgPT4ge1xuICAgIHdhbGtMaW1pdCA9IHByaW9yO1xuICB9O1xufVxuXG4vKipcbiAqIENhbiBgcGF0dGVybmAgbWF0Y2ggYSBkb3R0ZWQgUEFUSCB3aGVyZSBpdCBtYXRjaGVzIG5vbmUgb2YgdGhlIHBhdGgnc1xuICogc2VnbWVudCBOQU1FUz8gT25seSB0aHJvdWdoIGEgY29uc3RydWN0IHRoYXQgY2FuIG1hdGNoIG9yIHRlc3QgdGhlIGAuYFxuICogYmV0d2VlbiBzZWdtZW50czogYC5gIGl0c2VsZiwgYW4gZXNjYXBlIHRoYXQgY2FuIHN0YW5kIGZvciBpdCAoYFxcVyBcXFMgXFxEXG4gKiBcXEIgXFxwIFxcUCBcXHUgXFx4IFxcY2AsIGEgZGlnaXQgZXNjYXBlKSwgYSBuZWdhdGVkIGNsYXNzLCBhIGNsYXNzIHJhbmdlIHRoYXRcbiAqIHNwYW5zIGAuYCwgYSBsb29rYXJvdW5kIG9yIGEgbmFtZWQgZ3JvdXAuIEFueXRoaW5nIGVsc2UgbWF0Y2hlcyBhIHBhdGggb25seVxuICogaW5zaWRlIG9uZSBzZWdtZW50IOKAlCBhbmQgYW4gYW5jZXN0b3Igd2hvc2UgTkFNRSBtYXRjaGVzIGlzIG1hc2tlZCB3aG9sZVxuICogYmVmb3JlIHRoZSB3YWxrIGdvZXMgYmVsb3cgaXQsIHNvIHRoZSBuYW1lIGRlY2lkZXMuIENvbnNlcnZhdGl2ZTogYHRydWVgXG4gKiB3aGVuZXZlciBpbiBkb3VidC5cbiAqXG4gKiBMaW5lYXIgaW4gdGhlIGxlbmd0aCBvZiBgcGF0dGVybi5zb3VyY2VgOiBldmVyeSBzY2FuIGhlcmUgaXMgb25lIGZvcndhcmRcbiAqIHBhc3MgKHtAbGluayBjbGFzc0JvZGllc30pIG9yIGEgcmVnZXggdGhhdCBkb2VzIGNvbnN0YW50IHdvcmsgcGVyIHBvc2l0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbmVlZHNQYXRoKHBhdHRlcm46IFJlZ0V4cCk6IGJvb2xlYW4ge1xuICBjb25zdCBzb3VyY2UgPSBwYXR0ZXJuLnNvdXJjZTtcbiAgaWYgKC9cXC58XFxcXFtXU0RCcFB1eGMwLTldfFxcW1xcXnxcXChcXD9bPSE8XS8udGVzdChzb3VyY2UpKSByZXR1cm4gdHJ1ZTtcbiAgZm9yIChjb25zdCBib2R5IG9mIGNsYXNzQm9kaWVzKHNvdXJjZSkpIHtcbiAgICBmb3IgKGNvbnN0IFssIGxvdywgaGlnaF0gb2YgYm9keS5tYXRjaEFsbCgvKFxcXFw/W1xcc1xcU10pLShcXFxcP1tcXHNcXFNdKS9nKSkge1xuICAgICAgaWYgKGxvdy5sZW5ndGggPiAxIHx8IGhpZ2gubGVuZ3RoID4gMSB8fCAobG93IDw9ICcuJyAmJiBoaWdoID49ICcuJykpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogVGhlIGJvZHkgb2YgZWFjaCBjaGFyYWN0ZXIgY2xhc3MgaW4gYHNvdXJjZWAsIGxlZnQgdG8gcmlnaHQ6IHRoZSB0ZXh0XG4gKiBiZXR3ZWVuIGEgYFtgIGFuZCB0aGUgZmlyc3QgYF1gIGFmdGVyIGl0IHRoYXQgbm8gYFxcYCBlc2NhcGVzIChhIGBcXGAgdGFrZXNcbiAqIHRoZSBjaGFyYWN0ZXIgYWZ0ZXIgaXQgYWxvbmcpLiBPTkUgZm9yd2FyZCBwYXNzLlxuICpcbiAqIEl0IHJlcGxhY2VzIGBzb3VyY2UubWF0Y2hBbGwoL1xcWygoPzpcXFxcW1xcc1xcU118W15cXF1cXFxcXSkqKVxcXS9nKWAgYW5kIGdpdmVzIHRoZVxuICogc2FtZSBib2RpZXMgZm9yIGV2ZXJ5IHN0cmluZyAocGlubmVkIGFnYWluc3QgdGhhdCByZWdleCBhcyB0aGUgY29udHJvbCxcbiAqIHRlc3QvbGliL21lbW9yeS9zZWN1cml0eS9uZWVkcy1wYXRoLWxpbmVhci5zZWN1cml0eS50ZXN0LnRzKS4gVGhlIHJlZ2V4IHdhc1xuICogcXVhZHJhdGljOiBhZnRlciBhIGBbYCB0aGF0IG5ldmVyIGNsb3NlZCBpdCByZXRyaWVkIGF0IGV2ZXJ5IGxhdGVyIGBbYCxcbiAqIGVhY2ggcmV0cnkgcmVzY2FubmluZyB0byB0aGUgZW5kIOKAlCBgXFxbYCByZXBlYXRlZCAzMiwwMDAgdGltZXMgdG9vayAwLjcgcyxcbiAqIGFuZCBgc2V0UG9saWN5YCBydW5zIG9uY2UgcGVyIHN0YWdlJ3Mgc2NvcGUgKENvZGVRTCBqcy9wb2x5bm9taWFsLXJlZG9zKS5cbiAqIFRoZSBwYXNzIHN0b3BzIGF0IHRoZSBmaXJzdCBgW2AgdGhhdCBuZXZlciBjbG9zZXMgaW5zdGVhZDogYSBsYXRlciBgW2BcbiAqIHN0YXJ0cyBpdHMgYm9keSB3aGVyZSB0aGUgZmFpbGVkIHNjYW4gd2FzIGFsc28gYmV0d2VlbiB0d28gdG9rZW5zLCBzbyBpdFxuICogcmVhZHMgdGhlIHNhbWUgdGFpbCB0aGUgc2FtZSB3YXkgYW5kIGNsb3NlcyBub3doZXJlIGVpdGhlci5cbiAqXG4gKiBAaW50ZXJuYWwgRXhwb3J0ZWQgZm9yIHRoYXQgdGVzdCBvbmx5IOKAlCBub3Qgb24gYW55IHB1YmxpYyBkb29yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xhc3NCb2RpZXMoc291cmNlOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGJvZGllczogc3RyaW5nW10gPSBbXTtcbiAgbGV0IG9wZW4gPSBzb3VyY2UuaW5kZXhPZignWycpO1xuICB3aGlsZSAob3BlbiAhPT0gLTEpIHtcbiAgICBjb25zdCBjbG9zZSA9IGNsb3NpbmdCcmFja2V0KHNvdXJjZSwgb3BlbiArIDEpO1xuICAgIGlmIChjbG9zZSA9PT0gLTEpIGJyZWFrO1xuICAgIGJvZGllcy5wdXNoKHNvdXJjZS5zbGljZShvcGVuICsgMSwgY2xvc2UpKTtcbiAgICBvcGVuID0gc291cmNlLmluZGV4T2YoJ1snLCBjbG9zZSArIDEpO1xuICB9XG4gIHJldHVybiBib2RpZXM7XG59XG5cbi8qKiBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IGBdYCBhdCBvciBhZnRlciBgZnJvbWAgdGhhdCBubyBgXFxgIGVzY2FwZXMsIGVsc2UgLTEgKGEgdHJhaWxpbmcgbG9uZSBgXFxgIGVzY2FwZXMgbm90aGluZyBhbmQgY2xvc2VzIG5vdGhpbmcpLiAqL1xuZnVuY3Rpb24gY2xvc2luZ0JyYWNrZXQoc291cmNlOiBzdHJpbmcsIGZyb206IG51bWJlcik6IG51bWJlciB7XG4gIGxldCBhdCA9IGZyb207XG4gIHdoaWxlIChhdCA8IHNvdXJjZS5sZW5ndGgpIHtcbiAgICBjb25zdCBjaGFyID0gc291cmNlW2F0XTtcbiAgICBpZiAoY2hhciA9PT0gJ10nKSByZXR1cm4gYXQ7XG4gICAgYXQgKz0gY2hhciA9PT0gJ1xcXFwnID8gMiA6IDE7XG4gIH1cbiAgcmV0dXJuIC0xO1xufVxuXG4vKiogYHNlcnZlZExlYWZgJ3MgYW5zd2VyIGZvciBhIHZhbHVlIGl0IGxlYXZlcyBhcyBpdCBpcy4gKi9cbmNvbnN0IEtFRVA6IHVuaXF1ZSBzeW1ib2wgPSBTeW1ib2woJ2tlcHQgYXMgaXQgaXMnKTtcblxuLyoqIEVhY2ggZmllbGQgcGF0aCBhcyBvbmUgbGl0ZXJhbCBrZXkgYW5kLCB3aGVuIGRvdHRlZCwgYXMgaXRzIHNlZ21lbnRzLiAqL1xuZnVuY3Rpb24gdGFyZ2V0c09mKHBhdGhzOiByZWFkb25seSBzdHJpbmdbXSB8IHVuZGVmaW5lZCk6IFRhcmdldFtdIHtcbiAgY29uc3Qgb3V0OiBUYXJnZXRbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHBhdGggb2YgcGF0aHMgPz8gW10pIHtcbiAgICBvdXQucHVzaChbcGF0aF0pO1xuICAgIGlmIChwYXRoLmluY2x1ZGVzKCcuJykpIG91dC5wdXNoKHBhdGguc3BsaXQoJy4nKSk7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqIFRoZSBtZW1vIGtleSBvZiBhIHRhcmdldCBzdGF0ZSDigJQgb3JkZXItZnJlZS4gKi9cbmZ1bmN0aW9uIHNpZ25hdHVyZU9mKHRhcmdldHM6IHJlYWRvbmx5IFRhcmdldFtdKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRhcmdldHMubGVuZ3RoID09PSAwXG4gICAgPyAnJ1xuICAgIDogdGFyZ2V0c1xuICAgICAgICAubWFwKCh0KSA9PiB0LmpvaW4oJ1xcdTAwMWYnKSlcbiAgICAgICAgLnNvcnQoKVxuICAgICAgICAuam9pbignXFx1MDAxZScpO1xufVxuXG4vKiogT25lIGVkZ2UncyBkZWNpc2lvbjogdGhlIHZhbHVlIHVuZGVyIGBrZXlgIGlzIG1hc2tlZCBoZXJlLCBvciB0aGVzZSB0YXJnZXRzIGNvbnRpbnVlIGJlbG93IGl0LiAqL1xuZnVuY3Rpb24gZGVjaWRlRWRnZShcbiAga2V5OiBzdHJpbmcsXG4gIGRvdHRlZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICB0YXJnZXRzOiByZWFkb25seSBUYXJnZXRbXSxcbiAgd2FsazogV2FsayxcbiAgZGVwdGg6IG51bWJlcixcbik6IHsgbWFza2VkOiBib29sZWFuOyBiZWxvdzogVGFyZ2V0W10gfSB7XG4gIGNvbnN0IGJlbG93OiBUYXJnZXRbXSA9IFtdO1xuICBsZXQgbWFza2VkID0gZmFsc2U7XG4gIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcbiAgICBpZiAodGFyZ2V0WzBdICE9PSBrZXkpIGNvbnRpbnVlO1xuICAgIGlmICh0YXJnZXQubGVuZ3RoID09PSAxKSBtYXNrZWQgPSB0cnVlO1xuICAgIGVsc2UgYmVsb3cucHVzaCh0YXJnZXQuc2xpY2UoMSkpO1xuICB9XG4gIGNvbnN0IG5hbWVzID0gd2Fsay5yb290RGVjaWRlZCAmJiBkZXB0aCA9PT0gMCA/IHVuZGVmaW5lZCA6IHdhbGsubmFtZXM7XG4gIGlmIChuYW1lcyAhPT0gdW5kZWZpbmVkICYmICFtYXNrZWQpIHtcbiAgICBtYXNrZWQgPVxuICAgICAgbmFtZXMubWFza3Moa2V5KSB8fFxuICAgICAgKG5hbWVzLnBhdGhNYXNrcyAhPT0gdW5kZWZpbmVkICYmIGRvdHRlZCAhPT0gdW5kZWZpbmVkICYmIG5hbWVzLnBhdGhNYXNrcyhgJHtkb3R0ZWR9LiR7a2V5fWApKTtcbiAgICBiZWxvdy5wdXNoKC4uLnRhcmdldHNPZihuYW1lcy5maWVsZHMoa2V5KSkpO1xuICB9XG4gIHJldHVybiB7IG1hc2tlZCwgYmVsb3cgfTtcbn1cblxuLyoqIE9uZSBzdGVwIGRvd24gYSB3YWxrJ3MgcGF0aDogY291bnQgdGhlIHZpc2l0IOKAlCBgZmFsc2VgIG9uY2UgdGhlIHdhbGsgaXMgcGFzdCBpdHMgbGltaXQuICovXG5mdW5jdGlvbiB2aXNpdCh3YWxrOiBXYWxrKTogYm9vbGVhbiB7XG4gIGlmICgtLXdhbGsuYnVkZ2V0ID49IDApIHJldHVybiB0cnVlO1xuICBpZiAoIXdhbGsubGltaXRlZCkge1xuICAgIHdhbGsubGltaXRlZCA9IHRydWU7XG4gICAgd2Fsay5vbkxpbWl0Py4oKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogSXMgYW55dGhpbmcgc2VsZWN0ZWQgb24gc29tZSBQQVRIIHVuZGVyIGBub2RlYD8gUmVhZC1vbmx5OyBhIGN5Y2xlIGVkZ2UgaXNcbiAqIG5vdCBmb2xsb3dlZC4gYGJhY2tgIGlzIHRoZSBzaGFsbG93ZXN0IGFuY2VzdG9yIGEgc2tpcHBlZCBjeWNsZSBlZGdlIGJlbG93XG4gKiByZWFjaGVkIOKAlCBhIGBmYWxzZWAgdGhhdCByZXN0cyBvbiBvbmUgaXMgbm90IHNoYXJlZCAobWVtbykuXG4gKi9cbmZ1bmN0aW9uIHNlbGVjdHNCeVBhdGgoXG4gIG5vZGU6IG9iamVjdCxcbiAgZG90dGVkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHRhcmdldHM6IHJlYWRvbmx5IFRhcmdldFtdLFxuICB3YWxrOiBXYWxrLFxuICBhbmNlc3RvcnM6IE1hcDxvYmplY3QsIG51bWJlcj4sXG4gIGRlcHRoOiBudW1iZXIsXG4pOiB7IHNlbGVjdGVkOiBib29sZWFuOyBiYWNrOiBudW1iZXIgfSB7XG4gIC8vIFBhc3QgdGhlIGxpbWl0OiBhc3N1bWUgYSBzZWxlY3Rpb24g4oCUIHRoZSBjb3B5IHNlcnZlcyB0aGUgdW52aXNpdGVkIHJlbWFpbmRlciBhcyB0aGUgcGxhY2Vob2xkZXIuXG4gIGlmICghdmlzaXQod2FsaykpIHJldHVybiB7IHNlbGVjdGVkOiB0cnVlLCBiYWNrOiBJbmZpbml0eSB9O1xuICBpZiAod2Fsay5uYW1lcyA9PT0gdW5kZWZpbmVkICYmIHRhcmdldHMubGVuZ3RoID09PSAwKSByZXR1cm4geyBzZWxlY3RlZDogZmFsc2UsIGJhY2s6IEluZmluaXR5IH07XG4gIGNvbnN0IHNpZyA9IHdhbGsubWVtbyA/IHNpZ25hdHVyZU9mKHRhcmdldHMpIDogJyc7XG4gIGNvbnN0IGtub3duID0gd2Fsay5tZW1vPy5nZXQobm9kZSk/LmdldChgcyR7c2lnfWApO1xuICBpZiAoa25vd24gIT09IHVuZGVmaW5lZCkgcmV0dXJuIHsgc2VsZWN0ZWQ6IGtub3duIGFzIGJvb2xlYW4sIGJhY2s6IEluZmluaXR5IH07XG4gIGFuY2VzdG9ycy5zZXQobm9kZSwgZGVwdGgpO1xuICBsZXQgYmFjayA9IEluZmluaXR5O1xuICBsZXQgc2VsZWN0ZWQgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBba2V5LCBjaGlsZF0gb2YgT2JqZWN0LmVudHJpZXMobm9kZSkpIHtcbiAgICBjb25zdCBlZGdlID0gZGVjaWRlRWRnZShrZXksIGRvdHRlZCwgdGFyZ2V0cywgd2FsaywgZGVwdGgpO1xuICAgIGlmIChlZGdlLm1hc2tlZCkge1xuICAgICAgc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGlmIChjaGlsZCA9PT0gbnVsbCB8fCB0eXBlb2YgY2hpbGQgIT09ICdvYmplY3QnKSBjb250aW51ZTtcbiAgICBjb25zdCBhdCA9IGFuY2VzdG9ycy5nZXQoY2hpbGQpO1xuICAgIGlmIChhdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBiYWNrID0gTWF0aC5taW4oYmFjaywgYXQpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGNoaWxkUGF0aCA9IHdhbGsubmFtZXM/LnBhdGhNYXNrcyA/IChkb3R0ZWQgPT09IHVuZGVmaW5lZCA/IGtleSA6IGAke2RvdHRlZH0uJHtrZXl9YCkgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgYmVsb3cgPSBzZWxlY3RzQnlQYXRoKGNoaWxkLCBjaGlsZFBhdGggPz8ga2V5LCBlZGdlLmJlbG93LCB3YWxrLCBhbmNlc3RvcnMsIGRlcHRoICsgMSk7XG4gICAgYmFjayA9IE1hdGgubWluKGJhY2ssIGJlbG93LmJhY2spO1xuICAgIGlmIChiZWxvdy5zZWxlY3RlZCkge1xuICAgICAgc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIGFuY2VzdG9ycy5kZWxldGUobm9kZSk7XG4gIGlmICh3YWxrLm1lbW8gJiYgKHNlbGVjdGVkIHx8IGJhY2sgPj0gZGVwdGgpKSByZW1lbWJlcih3YWxrLm1lbW8sIG5vZGUsIGBzJHtzaWd9YCwgc2VsZWN0ZWQpO1xuICByZXR1cm4geyBzZWxlY3RlZCwgYmFjazogYmFjayA8IGRlcHRoID8gYmFjayA6IEluZmluaXR5IH07XG59XG5cbmZ1bmN0aW9uIHJlbWVtYmVyKG1lbW86IFdlYWtNYXA8b2JqZWN0LCBNYXA8c3RyaW5nLCB1bmtub3duPj4sIG5vZGU6IG9iamVjdCwga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gIGxldCBlbnRyaWVzID0gbWVtby5nZXQobm9kZSk7XG4gIGlmIChlbnRyaWVzID09PSB1bmRlZmluZWQpIG1lbW8uc2V0KG5vZGUsIChlbnRyaWVzID0gbmV3IE1hcCgpKSk7XG4gIGVudHJpZXMuc2V0KGtleSwgdmFsdWUpO1xufVxuXG4vKipcbiAqIFRoZSBzZXJ2ZWQgY29weSBvZiBgbm9kZWAsIGNvcHktb24td3JpdGUgUEVSIFBBVEguIEV2ZXJ5IGNvbnRhaW5lciBlbnRlcmVkXG4gKiBnZXRzIGl0cyBjb3B5IEJFRk9SRSBpdHMgY2hpbGRyZW4gYXJlIHdhbGtlZCwgc28gYSBjeWNsZSBlZGdlIGlzIHBvaW50ZWQgYXRcbiAqIHRoZSBhbmNlc3RvcidzIGNvcHkg4oCUIG5ldmVyIGJhY2sgYXQgYW4gdW5zY3J1YmJlZCBvcmlnaW5hbDsgYSBjb250YWluZXIgaXNcbiAqIHNlcnZlZCBhcyBpdHNlbGYgd2hlbiBub3RoaW5nIHVuZGVyIGl0IGNoYW5nZWQgYW5kIG5vIGN5Y2xlIHBhc3NlcyB0aHJvdWdoXG4gKiBpdC4gQSBwcnVuZWQgZGVzY2VudCAoYSBiYXJlIGZpZWxkIHNjcnViIG9mIGFuIGFjeWNsaWMgdmFsdWUpIHNraXBzIHN1YnRyZWVzXG4gKiBubyB0YXJnZXQgcmVhY2hlcy4gYGJhY2tgIGlzIHRoZSBzaGFsbG93ZXN0IGFuY2VzdG9yIGEgY3ljbGUgZWRnZSBiZWxvd1xuICogcmVhY2hlZCAoYEluZmluaXR5YDogbm9uZSk7IGEgY29weSB0aGF0IHJlc3RzIG9uIG5vbmUgaXMgc2hhcmVkIChtZW1vKS5cbiAqL1xuZnVuY3Rpb24gY29weUJ5UGF0aChcbiAgbm9kZTogb2JqZWN0LFxuICBkb3R0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgdGFyZ2V0czogcmVhZG9ubHkgVGFyZ2V0W10sXG4gIHdhbGs6IFdhbGssXG4gIHBsYWNlaG9sZGVyOiBzdHJpbmcsXG4gIGFuY2VzdG9yczogTWFwPG9iamVjdCwgeyBjb3B5OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjsgZGVwdGg6IG51bWJlciB9PixcbiAgZGVwdGg6IG51bWJlcixcbiAgcHJ1bmU6IGJvb2xlYW4sXG4pOiB7IG91dDogdW5rbm93bjsgYmFjazogbnVtYmVyIH0ge1xuICAvLyBQYXN0IHRoZSBsaW1pdDogdGhlIHVudmlzaXRlZCByZW1haW5kZXIgaXMgc2VydmVkIGFzIHRoZSBwbGFjZWhvbGRlciDigJQgbmV2ZXIgcmF3LlxuICBpZiAoIXZpc2l0KHdhbGspKSByZXR1cm4geyBvdXQ6IHBsYWNlaG9sZGVyLCBiYWNrOiBJbmZpbml0eSB9O1xuICBjb25zdCBzaWcgPSB3YWxrLm1lbW8gPyBgYyR7c2lnbmF0dXJlT2YodGFyZ2V0cyl9YCA6ICcnO1xuICBjb25zdCBrbm93biA9IHdhbGsubWVtbz8uZ2V0KG5vZGUpPy5nZXQoc2lnKTtcbiAgaWYgKGtub3duICE9PSB1bmRlZmluZWQpIHJldHVybiB7IG91dDoga25vd24sIGJhY2s6IEluZmluaXR5IH07XG4gIGNvbnN0IGZyYW1lID0ge1xuICAgIGNvcHk6IChBcnJheS5pc0FycmF5KG5vZGUpID8gbm9kZS5zbGljZSgpIDogeyAuLi5ub2RlIH0pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIGRlcHRoLFxuICB9O1xuICBhbmNlc3RvcnMuc2V0KG5vZGUsIGZyYW1lKTtcbiAgbGV0IGNoYW5nZWQgPSBmYWxzZTtcbiAgbGV0IGJhY2sgPSBJbmZpbml0eTtcbiAgZm9yIChjb25zdCBba2V5LCBjaGlsZF0gb2YgT2JqZWN0LmVudHJpZXMobm9kZSkpIHtcbiAgICBjb25zdCBlZGdlID0gZGVjaWRlRWRnZShrZXksIGRvdHRlZCwgdGFyZ2V0cywgd2FsaywgZGVwdGgpO1xuICAgIGlmIChlZGdlLm1hc2tlZCkge1xuICAgICAgZnJhbWUuY29weVtrZXldID0gcGxhY2Vob2xkZXI7XG4gICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoY2hpbGQgPT09IG51bGwgfHwgdHlwZW9mIGNoaWxkICE9PSAnb2JqZWN0JykgY29udGludWU7XG4gICAgY29uc3QgYW5jZXN0b3IgPSBhbmNlc3RvcnMuZ2V0KGNoaWxkKTtcbiAgICBpZiAoYW5jZXN0b3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZnJhbWUuY29weVtrZXldID0gYW5jZXN0b3IuY29weTtcbiAgICAgIGJhY2sgPSBNYXRoLm1pbihiYWNrLCBhbmNlc3Rvci5kZXB0aCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKHBydW5lICYmIGVkZ2UuYmVsb3cubGVuZ3RoID09PSAwKSBjb250aW51ZTtcbiAgICBjb25zdCBjaGlsZFBhdGggPSB3YWxrLm5hbWVzPy5wYXRoTWFza3MgPyAoZG90dGVkID09PSB1bmRlZmluZWQgPyBrZXkgOiBgJHtkb3R0ZWR9LiR7a2V5fWApIDoga2V5O1xuICAgIGNvbnN0IGJlbG93ID0gY29weUJ5UGF0aChjaGlsZCwgY2hpbGRQYXRoLCBlZGdlLmJlbG93LCB3YWxrLCBwbGFjZWhvbGRlciwgYW5jZXN0b3JzLCBkZXB0aCArIDEsIHBydW5lKTtcbiAgICBpZiAoYmVsb3cub3V0ICE9PSBjaGlsZCkge1xuICAgICAgZnJhbWUuY29weVtrZXldID0gYmVsb3cub3V0O1xuICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgfVxuICAgIGJhY2sgPSBNYXRoLm1pbihiYWNrLCBiZWxvdy5iYWNrKTtcbiAgfVxuICBhbmNlc3RvcnMuZGVsZXRlKG5vZGUpO1xuICBjb25zdCBvdXQgPSBjaGFuZ2VkIHx8IGJhY2sgPD0gZGVwdGggPyBmcmFtZS5jb3B5IDogbm9kZTtcbiAgaWYgKHdhbGsubWVtbyAmJiBiYWNrID49IGRlcHRoKSByZW1lbWJlcih3YWxrLm1lbW8sIG5vZGUsIHNpZywgb3V0KTtcbiAgcmV0dXJuIHsgb3V0LCBiYWNrOiBiYWNrIDwgZGVwdGggPyBiYWNrIDogSW5maW5pdHkgfTtcbn1cblxuLyoqIERvZXMgYW55IHBhdGggZnJvbSBgcm9vdGAgY29tZSBiYWNrIHRvIGFuIG9iamVjdCBvbiBpdD8gKi9cbmZ1bmN0aW9uIGhhc0N5Y2xlKHJvb3Q6IG9iamVjdCk6IGJvb2xlYW4ge1xuICBjb25zdCBkb25lID0gbmV3IFdlYWtTZXQ8b2JqZWN0PigpO1xuICBjb25zdCBvblBhdGggPSBuZXcgU2V0PG9iamVjdD4oKTtcbiAgY29uc3QgdmlzaXROb2RlID0gKG5vZGU6IG9iamVjdCk6IGJvb2xlYW4gPT4ge1xuICAgIGlmIChvblBhdGguaGFzKG5vZGUpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoZG9uZS5oYXMobm9kZSkpIHJldHVybiBmYWxzZTtcbiAgICBvblBhdGguYWRkKG5vZGUpO1xuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgT2JqZWN0LnZhbHVlcyhub2RlKSkge1xuICAgICAgaWYgKGNoaWxkICE9PSBudWxsICYmIHR5cGVvZiBjaGlsZCA9PT0gJ29iamVjdCcgJiYgdmlzaXROb2RlKGNoaWxkKSkgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIG9uUGF0aC5kZWxldGUobm9kZSk7XG4gICAgZG9uZS5hZGQobm9kZSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuICByZXR1cm4gdmlzaXROb2RlKHJvb3QpO1xufVxuXG4vKipcbiAqIFRoZSBzZXJ2ZWQgZm9ybSBvZiBgcm9vdGAgdW5kZXIgYSB3YWxrOiBgcm9vdGAgaXRzZWxmIHdoZW4gbm8gcGF0aCBzZWxlY3RzXG4gKiBhbnl0aGluZywgZWxzZSBpdHMgY29weS1vbi13cml0ZSBjb3B5IChwYXN0IHRoZSB3YWxrIGxpbWl0LCBpdHMgdW52aXNpdGVkXG4gKiByZW1haW5kZXIgc2VydmVkIGFzIHRoZSBwbGFjZWhvbGRlcikuIFRocm93cyDigJQgdGhlIGNhbGxlciByZWZ1c2VzIHRvIHNlcnZlXG4gKiDigJQgb24gYW4gZW51bWVyYWJsZSBnZXR0ZXIgdGhhdCB0aHJvd3MuXG4gKi9cbmZ1bmN0aW9uIHNlcnZlZEJ5UGF0aChcbiAgcm9vdDogb2JqZWN0LFxuICBkb3R0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgdGFyZ2V0czogcmVhZG9ubHkgVGFyZ2V0W10sXG4gIHdhbGs6IFdhbGssXG4gIHBsYWNlaG9sZGVyOiBzdHJpbmcsXG4pOiB1bmtub3duIHtcbiAgaWYgKCFzZWxlY3RzQnlQYXRoKHJvb3QsIGRvdHRlZCwgdGFyZ2V0cywgd2FsaywgbmV3IE1hcCgpLCAwKS5zZWxlY3RlZCkgcmV0dXJuIHJvb3Q7XG4gIHdhbGsuYnVkZ2V0ID0gd2Fsa0xpbWl0O1xuICAvLyBBIGJhcmUgZmllbGQgc2NydWIgb2YgYW4gYWN5Y2xpYyB2YWx1ZSB3YWxrcyBpdHMgdGFyZ2V0cyBvbmx5OiBubyBjeWNsZSBjYW4gYnJpbmcgYW5cbiAgLy8gdW5zY3J1YmJlZCBvcmlnaW5hbCBiYWNrLiBFdmVyeSBvdGhlciB3YWxrIHZpc2l0cyBldmVyeSBwYXRoIChhIGN5Y2xlIGVkZ2UgYW55d2hlcmVcbiAgLy8gbXVzdCBsYW5kIG9uIGEgc2VydmVkIGNvcHkpLlxuICBjb25zdCBwcnVuZSA9IHdhbGsubmFtZXMgPT09IHVuZGVmaW5lZCAmJiAhaGFzQ3ljbGUocm9vdCk7XG4gIHJldHVybiBjb3B5QnlQYXRoKHJvb3QsIGRvdHRlZCwgdGFyZ2V0cywgd2FsaywgcGxhY2Vob2xkZXIsIG5ldyBNYXAoKSwgMCwgcHJ1bmUpLm91dDtcbn1cblxuLyoqIEEgcGxhaW4gcmVjb3JkIOKAlCB0aGUgb25seSBzaGFwZSBhIG1hcHBlciBpcyBoYW5kZWQgYXMgYSByZWNvcmRpbmcgdmlldyAoYSBjbGFzcyBpbnN0YW5jZSBrZWVwcyBpdHMgcHJvdG90eXBlKS4gKi9cbmZ1bmN0aW9uIGlzUGxhaW5SZWNvcmQodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKTtcbiAgcmV0dXJuIHByb3RvID09PSBPYmplY3QucHJvdG90eXBlIHx8IHByb3RvID09PSBudWxsO1xufVxuXG4vKiogVGhlIHN0cmljdGVyIG9mIHR3byB2ZXJkaWN0cyBvbiB0aGUgc2FtZSB2YWx1ZTogd2hvbGUgb3ZlciBmaWVsZHMgb3ZlciBjbGVhcjsgZmllbGRzIHVuaXRlLiAqL1xuZnVuY3Rpb24gc3RyaWN0ZXIoYTogUmVkYWN0aW9uVmVyZGljdCB8IHVuZGVmaW5lZCwgYjogUmVkYWN0aW9uVmVyZGljdCk6IFJlZGFjdGlvblZlcmRpY3Qge1xuICBpZiAoYSA9PT0gdW5kZWZpbmVkIHx8IGEua2luZCA9PT0gJ2NsZWFyJyB8fCBiLmtpbmQgPT09ICd3aG9sZScpIHJldHVybiBiO1xuICBpZiAoYS5raW5kID09PSAnd2hvbGUnIHx8IGIua2luZCA9PT0gJ2NsZWFyJykgcmV0dXJuIGE7XG4gIHJldHVybiB7IGtpbmQ6ICdmaWVsZHMnLCBrZXk6IGEua2V5LCBwYXRoczogWy4uLm5ldyBTZXQoWy4uLmEucGF0aHMsIC4uLmIucGF0aHNdKV0gfTtcbn1cblxuLyoqXG4gKiBUSEUgVEFJTlQgUlVMRSBhdCBhIHN1YmZsb3cgbWFwcGVyIGJvdW5kYXJ5IChhbiBgaW5wdXRNYXBwZXJgIHNlZWRpbmcgYVxuICogc3ViZmxvdywgYW4gYG91dHB1dE1hcHBlcmAgbWVyZ2luZyBpdCBiYWNrKTogYSBrZXkgdGhlIG1hcHBlciB3cml0ZXNcbiAqIGluaGVyaXRzIHRoZSByZWRhY3Rpb24gb2YgdGhlIFNFTEVDVEVEIHZhbHVlIGl0IGNvcGllZCDigJQgYSBtYXJrIChvclxuICogaW5oZXJpdGVkIGZpZWxkcyksIGJ5IG5hbWUsIGxpa2UgYSBwZXItY2FsbCBgc2V0VmFsdWUoa2V5LCB2YWx1ZSwgdHJ1ZSlgIOKAlFxuICogc28gdGhlIHN1YmZsb3cncyBzZWVkLCBsb2csIG1pcnJvciwgcmVhZHMsIG5hcnJhdGl2ZSBhbmQgcmVzdWx0cywgYW5kIHRoZVxuICogcGFyZW50J3MgbWVyZ2UtYmFjaywgcmV0YWluIHRoZSBjb3B5IGFzIHRoZXkgcmV0YWluIGl0cyBzb3VyY2UuIERlY2lkZWQgYnlcbiAqIHdoaWNoIHZhbHVlcyB0aGUgbWFwcGVyIFJFQUQ6XG4gKlxuICogICAtIFNBTUUgTkFNRSDigJQgYSB2YWx1ZSBwYXNzZWQgb24gdW5kZXIgdGhlIG5hbWUgaXQgd2FzIHJlYWQgdW5kZXIga2VlcHNcbiAqICAgICB0aGF0IG5hbWUncyB2ZXJkaWN0IChgeyBjb3VudDogcC5jb3VudCB9YCwgYHsgLi4ucCB9YCk6IGEgY2xlYXIgdmFsdWVcbiAqICAgICBzdGF5cyBjbGVhciwgd2hlcmV2ZXIgZWxzZSB0aGUgbWFwcGVyIHJlYWQgYSBzZWNyZXQuXG4gKiAgIC0gRVhBQ1Qg4oCUIGFuIG91dHB1dCBPQkpFQ1QgdGhhdCBJUyAoYnkgcmVmZXJlbmNlKSBhIHZhbHVlIHRoZSBtYXBwZXIgcmVhZFxuICogICAgIGluaGVyaXRzIHRoYXQga2V5J3MgdmVyZGljdDogd2hvbGUgc3RheXMgd2hvbGUsIGBmaWVsZHNgIGhhbmQgdGhlaXIgcGF0aHNcbiAqICAgICB0byB0aGUgbmV3IGtleSwgY2xlYXIgc3RheXMgY2xlYXIuIFRoZSByZWNvcmQgdGhlIG1hcHBlciB3YXMgSEFOREVELFxuICogICAgIHBhc3NlZCBvbiB3aG9sZSAoYChwKSA9PiAoeyBjdHg6IHAgfSlgKSwgaGFuZHMgZXZlcnkgc2VsZWN0ZWQga2V5IG9mIGl0XG4gKiAgICAgdG8gdGhlIG5ldyBrZXkgYXMgYSBmaWVsZCAoYGN0eC50b2tlbmApLlxuICogICAtIENPTlNFUlZBVElWRSDigJQgYW55IG90aGVyIG91dHB1dCAoYSBwcmltaXRpdmUgdW5kZXIgYSBuZXcgbmFtZSwgb3IgYW5cbiAqICAgICBvYmplY3QgdGhlIG1hcHBlciBidWlsdCkgaXMgc2VsZWN0ZWQgV0hPTEUgd2hlbiB0aGUgbWFwcGVyIHJlYWQgYVxuICogICAgIHNlbGVjdGVkIHZhbHVlIOKAlCBhIHdob2xlLXNlbGVjdGVkIGtleSwgb3IgYSBzZWxlY3RlZCBGSUVMRCBvZiBhXG4gKiAgICAgYGZpZWxkc2Atc2VsZWN0ZWQgcmVjb3JkIOKAlCBvciB3aGVuIGl0IGVtYmVkcyBhIHNlbGVjdGVkIHJlY29yZCBieVxuICogICAgIHJlZmVyZW5jZTsgdGhlIGxpYnJhcnkgY2Fubm90IHRlbGwgd2hhdCBhIGNvbXB1dGVkIHZhbHVlIGNhcnJpZXMuXG4gKiAgICAgKFZhbHVlcyBhcmUgbmV2ZXIgbWF0Y2hlZCBieSBFUVVBTElUWSBhY3Jvc3MgbmFtZXM6IGFuIGVxdWFsIHByaW1pdGl2ZVxuICogICAgIHdvdWxkIG92ZXItbWF0Y2ggdW5yZWxhdGVkIGtleXMuKVxuICpcbiAqIEhPVyBGQVIgQSBNQVJLIFJFQUNIRVM6IGEgTkFNRSwgcnVuLXdpZGUsIGZyb20gdGhlIG1vbWVudCBpdCBpcyBtYWRlIOKAlCBldmVyeVxuICoga2V5IG9mIHRoYXQgbmFtZSBpbiB0aGUgc3ViZmxvdywgdGhlIHBhcmVudCwgYSBzaWJsaW5nIGFuZCBldmVyeSBsYXRlciBzdGFnZVxuICogaXMgc2VsZWN0ZWQgaW4gd2hhdGV2ZXIgaXMgc2VydmVkLCB1bnRpbCB0aGUga2V5IGlzIGRlbGV0ZWQ7IGEgcGF1c2UgY2Fycmllc1xuICogaXQgdG8gdGhlIHJlc3VtZWQgcnVuIChgRmxvd2NoYXJ0Q2hlY2twb2ludC5yZWRhY3Rpb25NYXJrc2ApLlxuICpcbiAqIEEgYGZpZWxkc2Atc2VsZWN0ZWQgcmVjb3JkIHRoYXQgaG9sZHMgYSBzZWxlY3RlZCBmaWVsZCBpcyBoYW5kZWQgdG8gdGhlXG4gKiBtYXBwZXIgYXMgYSB2aWV3IG9mIGl0cyBvd24sIHNvIHJlYWRpbmcgdGhlIHJlY29yZCAodG8gcGFzcyBpdCBvbiwgb3IgdG9cbiAqIHRlc3QgaXRzIHR5cGUpIGlzIG5vdCByZWFkaW5nIHRoZSBmaWVsZC4gUmVhZGluZyBgcnVuc2AgKHRoZSBuYW1lc3BhY2Ugcm9vdFxuICogZm9yayBjaGlsZHJlbiB3cml0ZSB1bmRlcikgcmVhZHMgZXZlcnkgbmFtZXNwYWNlZCBrZXkuIFJlY29yZGluZyBzdG9wcyB3aGVuXG4gKiB0aGUgbWFwcGVyIHJldHVybnM7IHtAbGluayBpbmhlcml0fSBoYW5kcyBiYWNrIHRoZSBvdXRwdXQgd2l0aCBldmVyeSB2aWV3IGl0XG4gKiByZXR1cm5lZCBzd2FwcGVkIGZvciB0aGUgcmVjb3JkIGJlaGluZCBpdC5cbiAqL1xuZXhwb3J0IGNsYXNzIE1hcHBlclRhaW50IHtcbiAgLyoqIEVhY2ggb2JqZWN0IHRoZSBtYXBwZXIgcmVhZCDihpIgdGhlIHZlcmRpY3Qgb2YgdGhlIGtleSBpdCByZWFkIGl0IHVuZGVyLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHNvdXJjZXMgPSBuZXcgTWFwPG9iamVjdCwgUmVkYWN0aW9uVmVyZGljdD4oKTtcbiAgLyoqIEVhY2gga2V5IHRoZSBtYXBwZXIgcmVhZCDihpIgdGhlIHZhbHVlcyBpdCByZWFkIHVuZGVyIHRoYXQgbmFtZS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBieU5hbWUgPSBuZXcgTWFwPHN0cmluZywgdW5rbm93bltdPigpO1xuICAvKiogRWFjaCBgZmllbGRzYCB2aWV3IGhhbmRlZCBvdXQg4oaSIHRoZSByZWNvcmQgYmVoaW5kIGl0IGFuZCBpdHMgdmVyZGljdC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSB2aWV3cyA9IG5ldyBNYXA8b2JqZWN0LCB7IHJhdzogb2JqZWN0OyB2ZXJkaWN0OiBSZWRhY3Rpb25WZXJkaWN0IH0+KCk7XG4gIC8qKiBFYWNoIHJlY29yZCB0aGUgbWFwcGVyIHdhcyBoYW5kZWQg4oaSIGFzIGEgdmlldyAocGFzc2VkIG9uIHdob2xlLCBpdCBoYW5kcyBvbiBpdHMgc2VsZWN0ZWQga2V5cykuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVjb3JkcyA9IG5ldyBNYXA8b2JqZWN0LCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oKTtcbiAgLyoqIFRoZSBzZWxlY3RlZCB2YWx1ZXMgdGhlIG1hcHBlciByZWFkICh3aG9sZSBrZXlzLCBzZWxlY3RlZCBmaWVsZHMpIOKAlCB3aGF0IGl0IGNvdWxkIHBsYW50IGJ5IHJlZmVyZW5jZS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBzZWNyZXRSZWFkczogdW5rbm93bltdID0gW107XG4gIHByaXZhdGUgc2VsZWN0ZWRSZWFkID0gZmFsc2U7XG4gIHByaXZhdGUgb3BlbiA9IHRydWU7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHJ1bGU6IFJlZGFjdGlvblJ1bGUpIHt9XG5cbiAgLyoqIGB1bmRlZmluZWRgIHdoaWxlIHRoZSBydW4ncyBydWxlIGlzIGluZXJ0IOKAlCBub3RoaW5nIGEgbWFwcGVyIHJlYWRzIGNhbiBiZSBzZWxlY3RlZC4gKi9cbiAgc3RhdGljIG9mKHJ1bGU6IFJlZGFjdGlvblJ1bGUgfCB1bmRlZmluZWQpOiBNYXBwZXJUYWludCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHJ1bGUgIT09IHVuZGVmaW5lZCAmJiAhcnVsZS5pc0luZXJ0KCkgPyBuZXcgTWFwcGVyVGFpbnQocnVsZSkgOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHJlY29yZCBhIG1hcHBlciBpcyBoYW5kZWQ6IHRoZSBzYW1lIG93biBrZXlzIGFuZCB2YWx1ZXMsIGVhY2ggcmVhZFxuICAgKiByZWNvcmRlZC4gQW4gYWNjZXNzb3IgcGVyIGtleSwgbm90IGEgUHJveHkg4oCUIGEgbWFwcGVyIG1heSBzcHJlYWQsIGNsb25lIG9yXG4gICAqIHNlcmlhbGl6ZSB3aGF0IGl0IGlzIGhhbmRlZC4gQW4gYXNzaWdubWVudCBsYW5kcyBvbiB0aGUgdmlldywgbmV2ZXIgb24gdGhlXG4gICAqIGxpdmUgcmVjb3JkIGJlaGluZCBpdC4gQW55dGhpbmcgYnV0IGEgcGxhaW4gcmVjb3JkIGlzIGhhbmRlZCBvdmVyIGFzIGl0IGlzLlxuICAgKi9cbiAgd2F0Y2g8VD4ocmVjb3JkOiBUKTogVCB7XG4gICAgaWYgKCFpc1BsYWluUmVjb3JkKHJlY29yZCkpIHJldHVybiByZWNvcmQ7XG4gICAgY29uc3QgdmlldyA9IHRoaXMudmlld09mKHJlY29yZCwgKGtleSkgPT4gdGhpcy5zZXJ2ZWQoa2V5LCByZWNvcmRba2V5XSkpO1xuICAgIHRoaXMucmVjb3Jkcy5zZXQodmlldywgcmVjb3JkKTtcbiAgICByZXR1cm4gdmlldyBhcyBUO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBtYXBwZXIgcmV0dXJuZWQgYG91dHB1dGA6IGV2ZXJ5IGtleSBpdCB3cm90ZSBpbmhlcml0cyB3aGF0IGl0IGNvcGllZFxuICAgKiAoc2VlIHRoZSBjbGFzcykuIFJldHVybnMgdGhlIG91dHB1dCB0byB1c2Ug4oCUIHRoZSBzYW1lIG9iamVjdCB1bmxlc3MgYSB2aWV3XG4gICAqIGhhZCB0byBiZSBzd2FwcGVkIGJhY2sgZm9yIHRoZSByZWNvcmQgYmVoaW5kIGl0LlxuICAgKi9cbiAgaW5oZXJpdDxUPihvdXRwdXQ6IFQpOiBUIHtcbiAgICB0aGlzLm9wZW4gPSBmYWxzZTtcbiAgICBpZiAob3V0cHV0ID09PSBudWxsIHx8IHR5cGVvZiBvdXRwdXQgIT09ICdvYmplY3QnKSByZXR1cm4gb3V0cHV0O1xuICAgIGxldCBvdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICAgIGZvciAoY29uc3QgW3RhcmdldCwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG91dHB1dCkpIHtcbiAgICAgIGNvbnN0IGNvcGllZCA9IHRoaXMuY29waWVkVmVyZGljdCh0YXJnZXQsIHZhbHVlKTtcbiAgICAgIGlmIChjb3BpZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZFJlYWQgfHwgdGhpcy5lbWJlZHNTZWxlY3RlZCh2YWx1ZSwgbmV3IFdlYWtTZXQoKSkpIHRoaXMucnVsZS5tYXJrKHRhcmdldCk7XG4gICAgICB9IGVsc2UgaWYgKGNvcGllZC5raW5kID09PSAnd2hvbGUnKSB0aGlzLnJ1bGUubWFyayh0YXJnZXQpO1xuICAgICAgZWxzZSBpZiAoY29waWVkLmtpbmQgPT09ICdmaWVsZHMnKSB0aGlzLnJ1bGUuaW5oZXJpdEZpZWxkcyh0YXJnZXQsIGNvcGllZC5wYXRocyk7XG4gICAgICBjb25zdCByYXcgPSB0aGlzLmJlaGluZCh2YWx1ZSk7XG4gICAgICAvLyBBbiBvYmplY3QgcGFzc2VkIG9uIEJZIFJFRkVSRU5DRSBtYXkgY2Fycnkgd2hhdCB0aGUgbWFwcGVyIHBsYW50ZWQgaW4gaXRcbiAgICAgIC8vIChgT2JqZWN0LmFzc2lnbihwLnJlcXVlc3QsIHsgYXV0aDogcC50b2tlbiB9KWAsIGBwLmxpc3QucHVzaChwLnRva2VuKWApOlxuICAgICAgLy8gZWFjaCBwbGFjZSBpdCBob2xkcyBhIHNlbGVjdGVkIHZhbHVlIHRoZSBtYXBwZXIgcmVhZCBpcyBhIGZpZWxkIG9mIHRoZSBuZXcga2V5LlxuICAgICAgaWYgKGNvcGllZCAhPT0gdW5kZWZpbmVkICYmIGNvcGllZC5raW5kICE9PSAnd2hvbGUnICYmIHJhdyAhPT0gbnVsbCAmJiB0eXBlb2YgcmF3ID09PSAnb2JqZWN0Jykge1xuICAgICAgICBjb25zdCBwbGFudGVkID0gdGhpcy5wbGFudGVkUGF0aHMocmF3KTtcbiAgICAgICAgaWYgKHBsYW50ZWQubGVuZ3RoID4gMCkgdGhpcy5ydWxlLmluaGVyaXRGaWVsZHModGFyZ2V0LCBwbGFudGVkKTtcbiAgICAgIH1cbiAgICAgIGlmIChyYXcgIT09IHZhbHVlKSB7XG4gICAgICAgIG91dCA/Pz0gKEFycmF5LmlzQXJyYXkob3V0cHV0KSA/IFsuLi5vdXRwdXRdIDogeyAuLi5vdXRwdXQgfSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgIG91dFt0YXJnZXRdID0gcmF3O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gKG91dCA/PyBvdXRwdXQpIGFzIFQ7XG4gIH1cblxuICAvKiogV2hhdCBvbmUgcmVjb3JkZWQgcmVhZCBoYW5kcyB0aGUgbWFwcGVyIChzZWUgdGhlIGNsYXNzKS4gKi9cbiAgcHJpdmF0ZSBzZXJ2ZWQoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdW5rbm93biB7XG4gICAgaWYgKCF0aGlzLm9wZW4pIHJldHVybiB2YWx1ZTtcbiAgICBjb25zdCByZWFkID0gdGhpcy5ieU5hbWUuZ2V0KGtleSk7XG4gICAgaWYgKHJlYWQgPT09IHVuZGVmaW5lZCkgdGhpcy5ieU5hbWUuc2V0KGtleSwgW3ZhbHVlXSk7XG4gICAgZWxzZSByZWFkLnB1c2godmFsdWUpO1xuICAgIGNvbnN0IHZlcmRpY3QgPSB0aGlzLnJ1bGUudmVyZGljdE9mUmVhZChrZXksIHZhbHVlKTtcbiAgICAvLyBBbiBhYnNlbnQga2V5IGNhcnJpZXMgbm8gc2VjcmV0OyBuZWl0aGVyIGRvZXMgYSB2YWx1ZSB3aXRoIG5vIGZpZWxkcyAoYSBzY2FsYXIpIG9yIG5vbmUgb2ZcbiAgICAvLyBpdHMgc2VsZWN0ZWQgb25lcyDigJQgc3RhdGUgcmV0YWlucyB0aG9zZSBhcyB0aGV5IGFyZSB0b28uXG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiB2YWx1ZTtcbiAgICBpZiAodmVyZGljdC5raW5kID09PSAnZmllbGRzJykge1xuICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgIVJlZGFjdGlvblJ1bGUuaG9sZHNQYXRocyh2YWx1ZSwgdmVyZGljdC5wYXRocykpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVtZW1iZXIodmFsdWUsIHZlcmRpY3QpO1xuICAgICAgfVxuICAgICAgaWYgKGlzUGxhaW5SZWNvcmQodmFsdWUpKSByZXR1cm4gdGhpcy5maWVsZHNWaWV3KHZhbHVlLCB2ZXJkaWN0KTtcbiAgICB9XG4gICAgaWYgKHZlcmRpY3Qua2luZCAhPT0gJ2NsZWFyJykge1xuICAgICAgdGhpcy5zZWxlY3RlZFJlYWQgPSB0cnVlO1xuICAgICAgaWYgKHZlcmRpY3Qua2luZCA9PT0gJ3dob2xlJykgdGhpcy5zZWNyZXRSZWFkcy5wdXNoKHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucmVtZW1iZXIodmFsdWUsIHZlcmRpY3QpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1lbWJlcih2YWx1ZTogdW5rbm93biwgdmVyZGljdDogUmVkYWN0aW9uVmVyZGljdCk6IHVua25vd24ge1xuICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICB0aGlzLnNvdXJjZXMuc2V0KHZhbHVlLCBzdHJpY3Rlcih0aGlzLnNvdXJjZXMuZ2V0KHZhbHVlKSwgdmVyZGljdCkpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvKiogQSBgZmllbGRzYC1zZWxlY3RlZCByZWNvcmQ6IHJlYWRpbmcgb25lIG9mIGl0cyBzZWxlY3RlZCBmaWVsZHMgKG9yIGEgcGF0aCdzIGZpcnN0IHNlZ21lbnQpIGlzIGEgc2VsZWN0ZWQgcmVhZC4gKi9cbiAgcHJpdmF0ZSBmaWVsZHNWaWV3KHJlY29yZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIHZlcmRpY3Q6IFJlZGFjdGlvblZlcmRpY3QgJiB7IGtpbmQ6ICdmaWVsZHMnIH0pOiBvYmplY3Qge1xuICAgIGNvbnN0IHNlbGVjdGVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgZm9yIChjb25zdCBwYXRoIG9mIHZlcmRpY3QucGF0aHMpIHNlbGVjdGVkLmFkZChwYXRoKS5hZGQocGF0aC5zcGxpdCgnLicpWzBdKTtcbiAgICBjb25zdCB2aWV3ID0gdGhpcy52aWV3T2YocmVjb3JkLCAoa2V5KSA9PiB7XG4gICAgICBpZiAodGhpcy5vcGVuICYmIHNlbGVjdGVkLmhhcyhrZXkpKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRSZWFkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zZWNyZXRSZWFkcy5wdXNoKHJlY29yZFtrZXldKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZWNvcmRba2V5XTtcbiAgICB9KTtcbiAgICB0aGlzLnZpZXdzLnNldCh2aWV3LCB7IHJhdzogcmVjb3JkLCB2ZXJkaWN0IH0pO1xuICAgIHJldHVybiB2aWV3O1xuICB9XG5cbiAgcHJpdmF0ZSB2aWV3T2YocmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgcmVhZDogKGtleTogc3RyaW5nKSA9PiB1bmtub3duKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIGNvbnN0IHZpZXc6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMocmVjb3JkKSkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHZpZXcsIGtleSwge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGdldDogKCkgPT4gcmVhZChrZXkpLFxuICAgICAgICBzZXQ6ICh2YWx1ZTogdW5rbm93bikgPT4ge1xuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh2aWV3LCBrZXksIHsgdmFsdWUsIHdyaXRhYmxlOiB0cnVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHZpZXc7XG4gIH1cblxuICAvKiogVGhlIHJlY29yZCBiZWhpbmQgYSB2aWV3IHRoZSBtYXBwZXIgcmV0dXJuZWQ7IGFueSBvdGhlciB2YWx1ZSBhcyBpdCBpcy4gKi9cbiAgcHJpdmF0ZSBiZWhpbmQodmFsdWU6IHVua25vd24pOiB1bmtub3duIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgcmV0dXJuIHZhbHVlO1xuICAgIHJldHVybiB0aGlzLnZpZXdzLmdldCh2YWx1ZSk/LnJhdyA/PyB0aGlzLnJlY29yZHMuZ2V0KHZhbHVlKSA/PyB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdmVyZGljdCBgdGFyZ2V0YCBpbmhlcml0cyBmcm9tIGB2YWx1ZWAg4oCUIGB1bmRlZmluZWRgIHdoZW4gaXQgaXNcbiAgICogbmVpdGhlciBhIHZhbHVlIHRoZSBtYXBwZXIgcmVhZCBub3Igb25lIHBhc3NlZCB1bmRlciBpdHMgb3duIG5hbWUuXG4gICAqL1xuICBwcml2YXRlIGNvcGllZFZlcmRpY3QodGFyZ2V0OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogUmVkYWN0aW9uVmVyZGljdCB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLnZpZXdzLmdldCh2YWx1ZSk7XG4gICAgICBpZiAodmlldykgcmV0dXJuIHZpZXcudmVyZGljdDtcbiAgICAgIGNvbnN0IHJlY29yZCA9IHRoaXMucmVjb3Jkcy5nZXQodmFsdWUpO1xuICAgICAgaWYgKHJlY29yZCkgcmV0dXJuIHRoaXMuc2VsZWN0ZWRGaWVsZHNPZihyZWNvcmQpO1xuICAgICAgY29uc3Qga25vd24gPSB0aGlzLnNvdXJjZXMuZ2V0KHZhbHVlKTtcbiAgICAgIGlmIChrbm93bikgcmV0dXJuIGtub3duO1xuICAgIH1cbiAgICBjb25zdCByZWFkID0gdGhpcy5ieU5hbWUuZ2V0KHRhcmdldCk7XG4gICAgcmV0dXJuIHJlYWQ/LnNvbWUoKHYpID0+IE9iamVjdC5pcyh2LCB2YWx1ZSkpID8gdGhpcy5ydWxlLnZlcmRpY3RPZlJlYWQodGFyZ2V0LCB2YWx1ZSkgOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiogQSB3aG9sZSByZWNvcmQncyBzZWxlY3RlZCBrZXlzLCBhcyBmaWVsZHMgb2Ygd2hhdGV2ZXIga2V5IGl0IGlzIHBhc3NlZCBvbiB1bmRlci4gKi9cbiAgcHJpdmF0ZSBzZWxlY3RlZEZpZWxkc09mKHJlY29yZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBSZWRhY3Rpb25WZXJkaWN0IHtcbiAgICBjb25zdCBwYXRoczogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhyZWNvcmQpKSB7XG4gICAgICBjb25zdCB2ZXJkaWN0ID0gdGhpcy5ydWxlLnZlcmRpY3RPZlJlYWQoa2V5LCByZWNvcmRba2V5XSk7XG4gICAgICBpZiAodmVyZGljdC5raW5kID09PSAnd2hvbGUnKSBwYXRocy5wdXNoKGtleSk7XG4gICAgICBlbHNlIGlmICh2ZXJkaWN0LmtpbmQgPT09ICdmaWVsZHMnKSBmb3IgKGNvbnN0IHBhdGggb2YgdmVyZGljdC5wYXRocykgcGF0aHMucHVzaChgJHtrZXl9LiR7cGF0aH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhdGhzLmxlbmd0aCA9PT0gMCA/IENMRUFSIDogeyBraW5kOiAnZmllbGRzJywga2V5OiAnJywgcGF0aHMgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGVyZSBgcm9vdGAgKGFuIG9iamVjdCB0aGUgbWFwcGVyIHBhc3NlZCBvbiBieSByZWZlcmVuY2UpIGhvbGRzIG9uZSBvZiB0aGVcbiAgICogc2VsZWN0ZWQgUFJJTUlUSVZFUyBpdCByZWFkIOKAlCBtYXRjaGVkIGJ5IHZhbHVlLCBvbmx5IGFnYWluc3Qgd2hhdCB0aGlzXG4gICAqIG1hcHBlciByZWFkIGFuZCBvbmx5IGluc2lkZSB3aGF0IGl0IHBhc3NlZCBvbiwgc28gb3Zlci1tYXRjaGluZyBhbiBlcXVhbFxuICAgKiB2YWx1ZSBpcyB0aGUgc2FmZSBzaWRlLiBPbmUgcmVsYXRpdmUgcGF0aCBwZXIgcGxhY2UsIGEgc2hhcmVkIG9iamVjdCBhdFxuICAgKiBlYWNoIG9mIGl0cyBwYXRoczsgYSBjeWNsZSBlZGdlIGlzIG5vdCBmb2xsb3dlZC5cbiAgICovXG4gIHByaXZhdGUgcGxhbnRlZFBhdGhzKHJvb3Q6IG9iamVjdCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBzZWNyZXRzID0gbmV3IFNldDx1bmtub3duPigpO1xuICAgIGNvbnN0IGNvbGxlY3QgPSAodmFsdWU6IHVua25vd24sIHNlZW46IFNldDxvYmplY3Q+KTogdm9pZCA9PiB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2JpZ2ludCcpIHNlY3JldHMuYWRkKHZhbHVlKTtcbiAgICAgIGVsc2UgaWYgKHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgIXNlZW4uaGFzKHZhbHVlKSkge1xuICAgICAgICBzZWVuLmFkZCh2YWx1ZSk7XG4gICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgT2JqZWN0LnZhbHVlcyh2YWx1ZSkpIGNvbGxlY3QoY2hpbGQsIHNlZW4pO1xuICAgICAgfVxuICAgIH07XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiB0aGlzLnNlY3JldFJlYWRzKSBjb2xsZWN0KHZhbHVlLCBuZXcgU2V0KCkpO1xuICAgIGlmIChzZWNyZXRzLnNpemUgPT09IDApIHJldHVybiBbXTtcbiAgICBjb25zdCBtZW1vID0gbmV3IE1hcDxvYmplY3QsIHN0cmluZ1tdPigpO1xuICAgIGNvbnN0IG9uUGF0aCA9IG5ldyBTZXQ8b2JqZWN0PigpO1xuICAgIGNvbnN0IGluc2lkZSA9IChub2RlOiBvYmplY3QpOiBzdHJpbmdbXSA9PiB7XG4gICAgICBjb25zdCBrbm93biA9IG1lbW8uZ2V0KG5vZGUpO1xuICAgICAgaWYgKGtub3duICE9PSB1bmRlZmluZWQpIHJldHVybiBrbm93bjtcbiAgICAgIGlmIChvblBhdGguaGFzKG5vZGUpKSByZXR1cm4gW107XG4gICAgICBvblBhdGguYWRkKG5vZGUpO1xuICAgICAgY29uc3QgZm91bmQ6IHN0cmluZ1tdID0gW107XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIGNoaWxkXSBvZiBPYmplY3QuZW50cmllcyhub2RlKSkge1xuICAgICAgICBpZiAoY2hpbGQgIT09IG51bGwgJiYgdHlwZW9mIGNoaWxkID09PSAnb2JqZWN0JykgZm9yIChjb25zdCBzdWIgb2YgaW5zaWRlKGNoaWxkKSkgZm91bmQucHVzaChgJHtrZXl9LiR7c3VifWApO1xuICAgICAgICBlbHNlIGlmIChzZWNyZXRzLmhhcyhjaGlsZCkpIGZvdW5kLnB1c2goa2V5KTtcbiAgICAgIH1cbiAgICAgIG9uUGF0aC5kZWxldGUobm9kZSk7XG4gICAgICBtZW1vLnNldChub2RlLCBmb3VuZCk7XG4gICAgICByZXR1cm4gZm91bmQ7XG4gICAgfTtcbiAgICByZXR1cm4gaW5zaWRlKHJvb3QpO1xuICB9XG5cbiAgLyoqIERvZXMgYSB2YWx1ZSB0aGUgbWFwcGVyIEJVSUxUIGVtYmVkLCBieSByZWZlcmVuY2UsIGEgc2VsZWN0ZWQgcmVjb3JkIGl0IHJlYWQgb3Igd2FzIGhhbmRlZD8gKi9cbiAgcHJpdmF0ZSBlbWJlZHNTZWxlY3RlZCh2YWx1ZTogdW5rbm93biwgc2VlbjogV2Vha1NldDxvYmplY3Q+KTogYm9vbGVhbiB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgc2Vlbi5oYXModmFsdWUpKSByZXR1cm4gZmFsc2U7XG4gICAgc2Vlbi5hZGQodmFsdWUpO1xuICAgIGlmICh0aGlzLnZpZXdzLmhhcyh2YWx1ZSkpIHJldHVybiB0cnVlO1xuICAgIGNvbnN0IHJlY29yZCA9IHRoaXMucmVjb3Jkcy5nZXQodmFsdWUpO1xuICAgIGlmIChyZWNvcmQpIHJldHVybiB0aGlzLnNlbGVjdGVkRmllbGRzT2YocmVjb3JkKS5raW5kICE9PSAnY2xlYXInO1xuICAgIGNvbnN0IGtub3duID0gdGhpcy5zb3VyY2VzLmdldCh2YWx1ZSk7XG4gICAgaWYgKGtub3duICE9PSB1bmRlZmluZWQgJiYga25vd24ua2luZCAhPT0gJ2NsZWFyJykgcmV0dXJuIHRydWU7XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBPYmplY3QudmFsdWVzKHZhbHVlKSkgaWYgKHRoaXMuZW1iZWRzU2VsZWN0ZWQoY2hpbGQsIHNlZW4pKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgY29tbWl0IGxvZydzIHNjcnViOiBgcGF0Y2hgIHdpdGgge0BsaW5rIExPR19QTEFDRUhPTERFUn0gYXQgZXZlcnkgcGF0aCBpbiBgcmVkYWN0ZWRQYXRoc2AgdGhhdFxuICogaG9sZHMgYSBkZWZpbmVkIHZhbHVlIOKAlCB0aGUgY29weSBgcmVjb3JkQ29tbWl0YCByZWNvcmRzIGFuZCBmZWVkcyB0aGUgcmVkYWN0ZWQgbWlycm9yLlxuICpcbiAqIENMT05FLUZSRUUgKDkuMzMuMCkuIFRoZSBwYXRjaCBpcyB0aGUgdHJhbnNhY3Rpb24gYnVmZmVyJ3MgY29tbWl0LXRpbWUgcGF5bG9hZCwgYWxyZWFkeSB0aGUgcmVjb3JkJ3NcbiAqIG93biBjb3B5IChgVHJhbnNhY3Rpb25CdWZmZXIgwrcgY29tbWl0YCBjbG9uZXMgZWFjaCBzdXJ2aXZpbmcgcGF0aCBvbmNlOyB0aGUgYnVmZmVyIGlzIGRyb3BwZWQgYXRcbiAqIGNvbW1pdCksIHNvIHRoZSBzY3J1YiBjb3BpZXMgb25seSB3aGF0IGl0IG11c3Qgbm90IGVkaXQgaW4gcGxhY2U6XG4gKiAgIC0gbm8gcGF0aCB0byBzY3J1YiAobm8gcG9saWN5LCBubyBwZXItY2FsbCBtYXJrIOKAlCB0aGUgY29tbW9uIGNhc2UpIOKGkiBgcGF0Y2hgIElUU0VMRiwgbm8gY29weSBhdCBhbGw7XG4gKiAgIC0gb3RoZXJ3aXNlIOKGkiBhIG5ldyByb290IGFuZCBhIHNoYWxsb3cgY29weSBvZiBlYWNoIGNvbnRhaW5lciBvbiBhIHNjcnViYmVkIHBhdGggKGBwYXRoT3BzIMK3XG4gKiAgICAgb3duU3BpbmVgKSwgZXZlcnkgb3RoZXIgc3VidHJlZSBzaGFyZWQgd2l0aCBgcGF0Y2hgLiBgcGF0Y2hgIGlzIG5ldmVyIGVkaXRlZC5cbiAqIFRoZSBlbmdpbmUgY2FsbGVkIHRoZSBwdWJsaWMge0BsaW5rIHJlZGFjdFBhdGNofSAoYSB3aG9sZSBgc3RydWN0dXJlZENsb25lYCkgdHdpY2UgcGVyIGNvbW1pdCBiZWZvcmVcbiAqIDkuMzMuMC4gVGhlIGJ5dGVzIGFyZSB0aGUgc2FtZTogYSBzY3J1YmJlZCBwYXRoIGhvbGRzIHRoZSBwbGFjZWhvbGRlciwgZXZlcnkgb3RoZXIgcGF0aCB0aGUgdmFsdWUgdGhlXG4gKiBidWZmZXIgY2xvbmVkIChwaW5uZWQgYnkgdGhlIDkuMTguMSAvIDkuMTkuMSByZWRhY3Rpb24gYnl0ZSB0ZXN0cykuXG4gKlxuICogUGF0aHMgYXJlIHNjcnViYmVkIGluIHRoZSBzZXQncyBvcmRlciwgYWdhaW5zdCB0aGUgdHJlZSBhcyBzY3J1YmJlZCBzbyBmYXI6IGEgcGF0aCB1bmRlciBvbmUgYWxyZWFkeVxuICogc2NydWJiZWQgZmluZHMgYSBzdHJpbmcsIG5vdCBhIGNvbnRhaW5lciwgYW5kIGlzIGxlZnQgYWxvbmUgKGFzIGJlZm9yZSkuXG4gKlxuICogSU5URVJOQUwg4oCUIHRoZSByZXN1bHQgc2hhcmVzIHN0cnVjdHVyZSB3aXRoIGBwYXRjaGAuIEEgY2FsbGVyIG91dHNpZGUgdGhlIGNvbW1pdCBwYXRoIHdhbnRzXG4gKiB7QGxpbmsgcmVkYWN0UGF0Y2h9LlxuICpcbiAqIEBwYXJhbSByZWRhY3RlZFBhdGhzIERFTElNLWpvaW5lZCBwYXRocyAoYFRyYW5zYWN0aW9uQnVmZmVyYCdzIGByZWRhY3RlZFBhdGhzYDsgYSBidW5kbGUnc1xuICogICBgcmVkYWN0ZWRQYXRoc2AgYXJyYXkgd29ya3MgdG9vKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNjcnViUGF0Y2gocGF0Y2g6IE1lbW9yeVBhdGNoLCByZWRhY3RlZFBhdGhzOiBJdGVyYWJsZTxzdHJpbmc+KTogTWVtb3J5UGF0Y2gge1xuICBsZXQgb3V0OiBNZW1vcnlQYXRjaCB8IHVuZGVmaW5lZDtcbiAgbGV0IG93bmVkOiBXZWFrU2V0PG9iamVjdD4gfCB1bmRlZmluZWQ7XG4gIGZvciAoY29uc3QgZmxhdCBvZiByZWRhY3RlZFBhdGhzKSB7XG4gICAgY29uc3Qgc2VncyA9IGZsYXQuc3BsaXQoREVMSU0pO1xuICAgIGNvbnN0IGN1cnJlbnQgPSBvdXQgPz8gcGF0Y2g7XG4gICAgaWYgKCFuYXRpdmVIYXMoY3VycmVudCwgc2VncykgfHwgbmF0aXZlR2V0KGN1cnJlbnQsIHNlZ3MpID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgIGlmIChvdXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgb3duZWQgPSBuZXcgV2Vha1NldDxvYmplY3Q+KCk7XG4gICAgICBvdXQgPSBvd25lZFJvb3RPZihwYXRjaCwgb3duZWQpIGFzIE1lbW9yeVBhdGNoO1xuICAgIH1cbiAgICBvd25TcGluZShvdXQsIHNlZ3MsIG93bmVkISk7XG4gICAgbmF0aXZlU2V0KG91dCwgc2VncywgTE9HX1BMQUNFSE9MREVSKTtcbiAgfVxuICByZXR1cm4gb3V0ID8/IHBhdGNoO1xufVxuXG4vKipcbiAqIFJlZGFjdHMgc2Vuc2l0aXZlIHZhbHVlcyBpbiBhIHBhdGNoIGZvciBsb2dnaW5nL2RlYnVnZ2luZyDigJQgdGhlIFBVQkxJQyBzY3J1YiAoYGZvb3RwcmludGpzL2FkdmFuY2VkYCksXG4gKiBpdHMgY29udHJhY3QgdW5jaGFuZ2VkIHNpbmNlIDQueDogYSBmcmVzaCBkZWVwIGNvcHkgb2YgYHBhdGNoYCAoYHN0cnVjdHVyZWRDbG9uZWApIHdpdGhcbiAqIHtAbGluayBMT0dfUExBQ0VIT0xERVJ9IGF0IGV2ZXJ5IGxpc3RlZCBwYXRoIHRoYXQgaG9sZHMgYSBkZWZpbmVkIHZhbHVlLiBTaGFyZXMgbm90aGluZyB3aXRoIGBwYXRjaGBcbiAqIGFuZCBuZXZlciBlZGl0cyBpdC4gKE1vdmVkIGhlcmUgZnJvbSBgbWVtb3J5L3V0aWxzLnRzYCBpbiA5LjMzLjA7IHRoZSBlbmdpbmUncyBvd24gY29tbWl0IHBhdGggdXNlcyB0aGVcbiAqIGNsb25lLWZyZWUge0BsaW5rIHNjcnViUGF0Y2h9LilcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZGFjdFBhdGNoKHBhdGNoOiBNZW1vcnlQYXRjaCwgcmVkYWN0ZWRTZXQ6IFNldDxzdHJpbmc+KTogTWVtb3J5UGF0Y2gge1xuICByZXR1cm4gc2NydWJQYXRjaChzdHJ1Y3R1cmVkQ2xvbmUocGF0Y2gpLCByZWRhY3RlZFNldCk7XG59XG4iXX0=
|