localspace 1.0.0 → 1.0.1
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/README.md +12 -10
- package/dist/drivers/localstorage.d.ts.map +1 -1
- package/dist/drivers/localstorage.js +13 -2
- package/dist/index.cjs.js +1 -1
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.esm.js +1 -1
- package/dist/index.esm.js.map +1 -1
- package/dist/index.umd.js +1 -1
- package/dist/index.umd.js.map +1 -1
- package/dist/localspace.d.ts.map +1 -1
- package/dist/localspace.js +10 -4
- package/package.json +1 -1
- package/src/drivers/localstorage.ts +11 -1
- package/src/localspace.ts +17 -7
package/README.md
CHANGED
|
@@ -456,7 +456,7 @@ const store = localspace.createInstance({
|
|
|
456
456
|
- **Lifecycle events** – `onInit(context)` is invoked after `ready()`, and `onDestroy` lets you tear down timers or channels. Call `await instance.destroy()` when disposing of an instance to run every `onDestroy` hook (executed in reverse priority order). Context exposes the active driver, db info, config, and a shared `metadata` bag for cross-plugin coordination.
|
|
457
457
|
- **Interceptors** – hook into `beforeSet/afterSet`, `beforeGet/afterGet`, `beforeRemove/afterRemove`, plus batch-specific methods such as `beforeSetItems` or `beforeGetItems`. Hooks run sequentially: `before*` hooks execute from highest to lowest priority, while `after*` hooks unwind in reverse order so layered transformations (TTL → compression → encryption) remain invertible. Returning a value passes it to the next plugin, while throwing a `LocalSpaceError` aborts the operation.
|
|
458
458
|
- **Per-call state** – plugins can stash data on `context.operationState` (e.g., capture the original value in `beforeSet` and reuse it in `afterSet`). For batch operations, `context.operationState.isBatch` is `true` and `context.operationState.batchSize` provides the total count.
|
|
459
|
-
- **Error handling & policies** – unexpected exceptions are reported through `plugin.onError`. Throw a `LocalSpaceError` if you need to stop the pipeline (quota violations, failed decryptions, etc.). Init policy: default fail-fast; set `pluginInitPolicy: 'disable-and-continue'` to log and skip the failing plugin. Runtime policy: default `pluginErrorPolicy: '
|
|
459
|
+
- **Error handling & policies** – unexpected exceptions are reported through `plugin.onError`. Throw a `LocalSpaceError` if you need to stop the pipeline (quota violations, failed decryptions, etc.). Init policy: default fail-fast; set `pluginInitPolicy: 'disable-and-continue'` to log and skip the failing plugin. Runtime policy: default `pluginErrorPolicy: 'lenient'` reports and continues; use `strict` for encryption/compression/ttl or any correctness-critical plugin.
|
|
460
460
|
|
|
461
461
|
### Plugin execution order
|
|
462
462
|
|
|
@@ -658,6 +658,7 @@ await quotaStore.setItems([
|
|
|
658
658
|
### Plugin combination best practices
|
|
659
659
|
|
|
660
660
|
1. **Recommended plugin order** (from highest to lowest priority):
|
|
661
|
+
|
|
661
662
|
```ts
|
|
662
663
|
plugins: [
|
|
663
664
|
ttlPlugin({ ... }), // priority: 10
|
|
@@ -670,7 +671,8 @@ await quotaStore.setItems([
|
|
|
670
671
|
|
|
671
672
|
2. **Always compress before encrypting**: Encrypted data has high entropy and compresses poorly. The default priorities handle this automatically.
|
|
672
673
|
|
|
673
|
-
3. **Use strict error policy with security-critical plugins
|
|
674
|
+
3. **Use strict error policy with security-critical plugins** (default is lenient):
|
|
675
|
+
|
|
674
676
|
```ts
|
|
675
677
|
// DON'T do this - encryption failures will be silently swallowed
|
|
676
678
|
const bad = localspace.createInstance({
|
|
@@ -681,7 +683,7 @@ await quotaStore.setItems([
|
|
|
681
683
|
// DO this - encryption failures will propagate
|
|
682
684
|
const good = localspace.createInstance({
|
|
683
685
|
plugins: [encryptionPlugin({ key })],
|
|
684
|
-
pluginErrorPolicy: 'strict', // Safe (
|
|
686
|
+
pluginErrorPolicy: 'strict', // Safe (recommended)
|
|
685
687
|
});
|
|
686
688
|
```
|
|
687
689
|
|
|
@@ -689,14 +691,14 @@ await quotaStore.setItems([
|
|
|
689
691
|
|
|
690
692
|
### Plugin troubleshooting
|
|
691
693
|
|
|
692
|
-
| Issue
|
|
693
|
-
|
|
694
|
-
| TTL items not expiring
|
|
695
|
-
| Encryption fails silently
|
|
696
|
-
| Compression not working
|
|
697
|
-
| Sync not updating other tabs | Check `channelName` matches and `syncKeys` includes your key
|
|
694
|
+
| Issue | Solution |
|
|
695
|
+
| ---------------------------- | ---------------------------------------------------------------------- |
|
|
696
|
+
| TTL items not expiring | Ensure `cleanupInterval` is set, or read items to trigger expiration |
|
|
697
|
+
| Encryption fails silently | Set `pluginErrorPolicy: 'strict'` for encryption/compression/ttl |
|
|
698
|
+
| Compression not working | Verify payload exceeds `threshold` |
|
|
699
|
+
| Sync not updating other tabs | Check `channelName` matches and `syncKeys` includes your key |
|
|
698
700
|
| Quota errors on small writes | Other plugins (TTL, encryption) add overhead; account for wrapper size |
|
|
699
|
-
| Plugin order seems wrong
|
|
701
|
+
| Plugin order seems wrong | Check `priority` values; higher = runs first in `before*` hooks |
|
|
700
702
|
|
|
701
703
|
## Compatibility & environments
|
|
702
704
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"localstorage.d.ts","sourceRoot":"","sources":["../../src/drivers/localstorage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,MAAM,EASP,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"localstorage.d.ts","sourceRoot":"","sources":["../../src/drivers/localstorage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,MAAM,EASP,MAAM,UAAU,CAAC;AAohBlB,QAAA,MAAM,mBAAmB,EAAE,MAuE1B,CAAC;AAEF,eAAe,mBAAmB,CAAC"}
|
|
@@ -41,7 +41,18 @@ function checkIfLocalStorageThrows() {
|
|
|
41
41
|
}
|
|
42
42
|
}
|
|
43
43
|
function isLocalStorageUsable() {
|
|
44
|
-
|
|
44
|
+
if (!checkIfLocalStorageThrows()) {
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
// localStorage.setItem threw, but there may still be existing data
|
|
48
|
+
// (e.g., quota exceeded). Wrap the length check since it can also throw
|
|
49
|
+
// in privacy modes.
|
|
50
|
+
try {
|
|
51
|
+
return localStorage.length > 0;
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
45
56
|
}
|
|
46
57
|
async function _initStorage(config) {
|
|
47
58
|
const dbInfo = {
|
|
@@ -342,4 +353,4 @@ const localStorageWrapper = {
|
|
|
342
353
|
dropInstance,
|
|
343
354
|
};
|
|
344
355
|
export default localStorageWrapper;
|
|
345
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWxzdG9yYWdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RyaXZlcnMvbG9jYWxzdG9yYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVlBLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNyRSxPQUFPLEVBQ0wsZUFBZSxFQUNmLHFCQUFxQixFQUNyQixZQUFZLEVBQ1osVUFBVSxHQUNYLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxVQUFVLE1BQU0scUJBQXFCLENBQUM7QUFlN0MsTUFBTSxXQUFXLEdBQUcscUJBQXFCLENBQUM7QUFFMUMsTUFBTSw0QkFBNEIsR0FBRyxDQUNuQyxPQUFtQixFQUNuQixTQUFpQixFQUNqQixPQUFnQyxFQUNoQyxPQUE0QixrQkFBa0IsRUFDbEMsRUFBRSxDQUNkLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtJQUN0QixNQUFNLE9BQU8sR0FDWCxLQUFLLFlBQVksS0FBSyxJQUFJLEtBQUssQ0FBQyxPQUFPO1FBQ3JDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTztRQUNmLENBQUMsQ0FBQyxnQkFBZ0IsU0FBUyxTQUFTLENBQUM7SUFDekMsTUFBTSxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRTtRQUM1QyxNQUFNLEVBQUUsV0FBVztRQUNuQixTQUFTO1FBQ1QsR0FBRyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUM7S0FDbkIsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUM7QUFFTCxTQUFTLG1CQUFtQjtJQUMxQixJQUFJLENBQUM7UUFDSCxPQUFPLENBQ0wsT0FBTyxZQUFZLEtBQUssV0FBVztZQUNuQyxTQUFTLElBQUksWUFBWTtZQUN6QixDQUFDLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FDdkIsQ0FBQztJQUNKLENBQUM7SUFBQyxPQUFPLENBQUMsRUFBRSxDQUFD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LENBQUM7UUFFRixlQUFlLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ25DLE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFDRCxZQUFZO0NBQ2IsQ0FBQztBQUVGLGVBQWUsbUJBQW1CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7XG4gIERyaXZlcixcbiAgRGJJbmZvLFxuICBMb2NhbFNwYWNlQ29uZmlnLFxuICBDYWxsYmFjayxcbiAgU2VyaWFsaXplcixcbiAgTG9jYWxTcGFjZUluc3RhbmNlLFxuICBCYXRjaEl0ZW1zLFxuICBCYXRjaFJlc3BvbnNlLFxuICBUcmFuc2FjdGlvblNjb3BlLFxufSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgdHlwZSB7IExvY2FsU3BhY2VFcnJvckNvZGUsIExvY2FsU3BhY2VFcnJvckRldGFpbHMgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgY3JlYXRlTG9jYWxTcGFjZUVycm9yLCB0b0xvY2FsU3BhY2VFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQge1xuICBleGVjdXRlQ2FsbGJhY2ssXG4gIG5vcm1hbGl6ZUJhdGNoRW50cmllcyxcbiAgbm9ybWFsaXplS2V5LFxuICBjaHVua0FycmF5LFxufSBmcm9tICcuLi91dGlscy9oZWxwZXJzJztcbmltcG9ydCBzZXJpYWxpemVyIGZyb20gJy4uL3V0aWxzL3NlcmlhbGl6ZXInO1xuXG50eXBlIExvY2FsU3RvcmFnZURiSW5mbyA9IERiSW5mbyAmIHtcbiAga2V5UHJlZml4OiBzdHJpbmc7XG4gIHNlcmlhbGl6ZXI6IFNlcmlhbGl6ZXI7XG59O1xuXG50eXBlIExvY2FsU3RvcmFnZURyaXZlckNvbnRleHQgPSBMb2NhbFNwYWNlSW5zdGFuY2UgJlxuICBQYXJ0aWFsPERyaXZlcj4gJiB7XG4gICAgX2RiSW5mbzogTG9jYWxTdG9yYWdlRGJJbmZvO1xuICAgIF9kZWZhdWx0Q29uZmlnOiBMb2NhbFNwYWNlQ29uZmlnO1xuICAgIHJlYWR5KCk6IFByb21pc2U8dm9pZD47XG4gICAgY29uZmlnKCk6IExvY2FsU3BhY2VDb25maWc7XG4gIH07XG5cbmNvbnN0IERSSVZFUl9OQU1FID0gJ2xvY2FsU3RvcmFnZVdyYXBwZXInO1xuXG5jb25zdCB3aXRoTG9jYWxTdG9yYWdlRXJyb3JDb250ZXh0ID0gPFQ+KFxuICBwcm9taXNlOiBQcm9taXNlPFQ+LFxuICBvcGVyYXRpb246IHN0cmluZyxcbiAgZGV0YWlscz86IExvY2FsU3BhY2VFcnJvckRldGFpbHMsXG4gIGNvZGU6IExvY2FsU3BhY2VFcnJvckNvZGUgPSAnT1BFUkFUSU9OX0ZBSUxFRCdcbik6IFByb21pc2U8VD4gPT5cbiAgcHJvbWlzZS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICBjb25zdCBtZXNzYWdlID1cbiAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyb3IubWVzc2FnZVxuICAgICAgICA/IGVycm9yLm1lc3NhZ2VcbiAgICAgICAgOiBgbG9jYWxTdG9yYWdlICR7b3BlcmF0aW9ufSBmYWlsZWRgO1xuICAgIHRocm93IHRvTG9jYWxTcGFjZUVycm9yKGVycm9yLCBjb2RlLCBtZXNzYWdlLCB7XG4gICAgICBkcml2ZXI6IERSSVZFUl9OQU1FLFxuICAgICAgb3BlcmF0aW9uLFxuICAgICAgLi4uKGRldGFpbHMgPz8ge30pLFxuICAgIH0pO1xuICB9KTtcblxuZnVuY3Rpb24gaXNMb2NhbFN0b3JhZ2VWYWxpZCgpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gKFxuICAgICAgdHlwZW9mIGxvY2FsU3RvcmFnZSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICdzZXRJdGVtJyBpbiBsb2NhbFN0b3JhZ2UgJiZcbiAgICAgICEhbG9jYWxTdG9yYWdlLnNldEl0ZW1cbiAgICApO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldEtleVByZWZpeChcbiAgb3B0aW9uczogTG9jYWxTcGFjZUNvbmZpZyxcbiAgZGVmYXVsdENvbmZpZzogTG9jYWxTcGFjZUNvbmZpZ1xuKTogc3RyaW5nIHtcbiAgbGV0IGtleVByZWZpeCA9IG9wdGlvbnMubmFtZSArICcvJztcblxuICBpZiAob3B0aW9ucy5zdG9yZU5hbWUgIT09IGRlZmF1bHRDb25maWcuc3RvcmVOYW1lKSB7XG4gICAga2V5UHJlZml4ICs9IG9wdGlvbnMuc3RvcmVOYW1lICsgJy8nO1xuICB9XG4gIHJldHVybiBrZXlQcmVmaXg7XG59XG5cbmZ1bmN0aW9uIGNoZWNrSWZMb2NhbFN0b3JhZ2VUaHJvd3MoKTogYm9vbGVhbiB7XG4gIGNvbnN0IGxvY2FsU3RvcmFnZVRlc3RLZXkgPSAnX2xvY2FsZm9yYWdlX3N1cHBvcnRfdGVzdCc7XG5cbiAgdHJ5IHtcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShsb2NhbFN0b3JhZ2VUZXN0S2V5LCAndHJ1ZScpO1xuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGxvY2FsU3RvcmFnZVRlc3RLZXkpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzTG9jYWxTdG9yYWdlVXNhYmxlKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gIWNoZWNrSWZMb2NhbFN0b3JhZ2VUaHJvd3MoKSB8fCBsb2NhbFN0b3JhZ2UubGVuZ3RoID4gMDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gX2luaXRTdG9yYWdlKFxuICB0aGlzOiBMb2NhbFN0b3JhZ2VEcml2ZXJDb250ZXh0LFxuICBjb25maWc6IExvY2FsU3BhY2VDb25maWdcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkYkluZm86IExvY2FsU3RvcmFnZURiSW5mbyA9IHtcbiAgICAuLi5jb25maWcsXG4gICAga2V5UHJlZml4OiBnZXRLZXlQcmVmaXgoY29uZmlnLCB0aGlzLl9kZWZhdWx0Q29uZmlnKSxcbiAgICBzZXJpYWxpemVyLFxuICB9O1xuXG4gIGlmICghaXNMb2NhbFN0b3JhZ2VVc2FibGUoKSkge1xuICAgIHRocm93IGNyZWF0ZUxvY2FsU3BhY2VFcnJvcihcbiAgICAgICdEUklWRVJfVU5BVkFJTEFCTEUnLFxuICAgICAgJ2xvY2FsU3RvcmFnZSBub3QgdXNhYmxlJyxcbiAgICAgIHsgZHJpdmVyOiBEUklWRVJfTkFNRSB9XG4gICAgKTtcbiAgfVxuXG4gIHRoaXMuX2RiSW5mbyA9IGRiSW5mbztcbn1cblxuZnVuY3Rpb24gY2xlYXIoXG4gIHRoaXM6IExvY2FsU3RvcmFnZURyaXZlckNvbnRleHQsXG4gIGNhbGxiYWNrPzogQ2FsbGJhY2s8dm9pZD5cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9taXNlID0gd2l0aExvY2FsU3RvcmFnZUVycm9yQ29udGV4dChcbiAgICB0aGlzLnJlYWR5KCkudGhlbigoKSA9PiB7XG4gICAgICBjb25zdCBrZXlQcmVmaXggPSB0aGlzLl9kYkluZm8ua2V5UHJlZml4O1xuXG4gICAgICBmb3IgKGxldCBpID0gbG9jYWxTdG9yYWdlLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGxvY2FsU3RvcmFnZS5rZXkoaSk7XG4gICAgICAgIGlmIChrZXkgJiYga2V5LmluZGV4T2Yoa2V5UHJlZml4KSA9PT0gMCkge1xuICAgICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KSxcbiAgICAnY2xlYXInXG4gICk7XG5cbiAgZXhlY3V0ZUNhbGxiYWNrKHByb21pc2UsIGNhbGxiYWNrKTtcbiAgcmV0dXJuIHByb21pc2U7XG59XG5cbmZ1bmN0aW9uIGdldEl0ZW08VD4oXG4gIHRoaXM6IExvY2FsU3RvcmFnZURyaXZlckNvbnRleHQsXG4gIGtleTogc3RyaW5nLFxuICBjYWxsYmFjaz86IENhbGxiYWNrPFQ+XG4pOiBQcm9taXNlPFQgfCBudWxsPiB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRLZXkgPSBub3JtYWxpemVLZXkoa2V5KTtcblxuICBjb25zdCBwcm9taXNlID0gd2l0aExvY2FsU3RvcmFnZUVycm9yQ29udGV4dChcbiAgICB0aGlzLnJlYWR5KCkudGhlbigoKSA9PiB7XG4gICAgICBjb25zdCBkYkluZm8gPSB0aGlzLl9kYkluZm87XG4gICAgICBjb25zdCByYXcgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShkYkluZm8ua2V5UHJlZml4ICsgbm9ybWFsaXplZEtleSk7XG5cbiAgICAgIGlmIChyYXcgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkYkluZm8uc2VyaWFsaXplci5kZXNlcmlhbGl6ZShyYXcpIGFzIFQ7XG4gICAgfSksXG4gICAgJ2dldEl0ZW0nLFxuICAgIHsga2V5OiBub3JtYWxpemVkS2V5IH1cbiAgKTtcblxuICBleGVjdXRlQ2FsbGJhY2soXG4gICAgcHJvbWlzZSBhcyBQcm9taXNlPFQgfCBudWxsPixcbiAgICBjYWxsYmFjayBhcyBDYWxsYmFjazxUIHwgbnVsbD4gfCB1bmRlZmluZWRcbiAgKTtcbiAgcmV0dXJuIHByb21pc2U7XG59XG5cbmZ1bmN0aW9uIGl0ZXJhdGU8VCwgVT4oXG4gIHRoaXM6IExvY2FsU3RvcmFnZURyaXZlckNvbnRleHQsXG4gIGl0ZXJhdG9yOiAodmFsdWU6IFQsIGtleTogc3RyaW5nLCBpdGVyYXRpb25OdW1iZXI6IG51bWJlcikgPT4gVSxcbiAgY2FsbGJhY2s/OiBDYWxsYmFjazxVPlxuKTogUHJvbWlzZTxVPiB7XG4gIGNvbnN0IHByb21pc2UgPSB3aXRoTG9jYWxTdG9yYWdlRXJyb3JDb250ZXh0KFxuICAgIHRoaXMucmVhZHkoKS50aGVuKCgpID0+IHtcbiAgICAgIGNvbnN0IGRiSW5mbyA9IHRoaXMuX2RiSW5mbztcbiAgICAgIGNvbnN0IGtleVByZWZpeCA9IGRiSW5mby5rZXlQcmVmaXg7XG4gICAgICBjb25zdCBrZXlQcmVmaXhMZW5ndGggPSBrZXlQcmVmaXgubGVuZ3RoO1xuICAgICAgY29uc3QgbGVuZ3RoID0gbG9jYWxTdG9yYWdlLmxlbmd0aDtcbiAgICAgIGxldCBpdGVyYXRpb25OdW1iZXIgPSAxO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGxvY2FsU3RvcmFnZS5rZXkoaSk7XG4gICAgICAgIGlmICgha2V5IHx8IGtleS5pbmRleE9mKGtleVByZWZpeCkgIT09IDApIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJhd1ZhbHVlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KTtcbiAgICAgICAgbGV0IHZhbHVlOiBUIHwgbnVsbCA9IG51bGw7XG4gICAgICAgIGlmIChyYXdWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIHZhbHVlID0gZGJJbmZvLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUocmF3VmFsdWUpIGFzIFQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHQgPSBpdGVyYXRvcihcbiAgICAgICAgICB2YWx1ZSBhcyBULFxuICAgICAgICAgIGtleS5zdWJzdHJpbmcoa2V5UHJlZml4TGVuZ3RoKSxcbiAgICAgICAgICBpdGVyYXRpb25OdW1iZXIrK1xuICAgICAgICApO1xuXG4gICAgICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHVuZGVmaW5lZCBhcyB1bmtub3duIGFzIFU7XG4gICAgfSksXG4gICAgJ2l0ZXJhdGUnXG4gICk7XG5cbiAgZXhlY3V0ZUNhbGxiYWNrKHByb21pc2UsIGNhbGxiYWNrKTtcbiAgcmV0dXJuIHByb21pc2U7XG59XG5cbmZ1bmN0aW9uIGtleShcbiAgdGhpczogTG9jYWxTdG9yYWdlRHJpdmVyQ29udGV4dCxcbiAgbjogbnVtYmVyLFxuICBjYWxsYmFjaz86IENhbGxiYWNrPHN0cmluZz5cbik6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICBjb25zdCBwcm9taXNlID0gd2l0aExvY2FsU3RvcmFnZUVycm9yQ29udGV4dChcbiAgICB0aGlzLnJlYWR5KCkudGhlbigoKSA9PiB7XG4gICAgICBjb25zdCBkYkluZm8gPSB0aGlzLl9kYkluZm87XG4gICAgICBjb25zdCBrZXlQcmVmaXggPSBkYkluZm8ua2V5UHJlZml4O1xuICAgICAgY29uc3Qga2V5czogc3RyaW5nW10gPSBbXTtcblxuICAgICAgLy8gQ29sbGVjdCBrZXlzIHRoYXQgbWF0Y2ggdGhlIHByZWZpeDsga2VlcCBuYXRpdmUgc3RvcmFnZSBpdGVyYXRpb24gb3JkZXJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbG9jYWxTdG9yYWdlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGl0ZW1LZXkgPSBsb2NhbFN0b3JhZ2Uua2V5KGkpO1xuICAgICAgICBpZiAoaXRlbUtleSAmJiBpdGVtS2V5LmluZGV4T2Yoa2V5UHJlZml4KSA9PT0gMCkge1xuICAgICAgICAgIGtleXMucHVzaChpdGVtS2V5LnN1YnN0cmluZyhrZXlQcmVmaXgubGVuZ3RoKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKG4gPCAwIHx8IG4gPj0ga2V5cy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBrZXlzW25dO1xuICAgIH0pLFxuICAgICdrZXknLFxuICAgIHsga2V5SW5kZXg6IG4gfVxuICApO1xuXG4gIGV4ZWN1dGVDYWxsYmFjayhwcm9taXNlLCBjYWxsYmFjayBhcyBDYWxsYmFjazxzdHJpbmcgfCBudWxsPiB8IHVuZGVmaW5lZCk7XG4gIHJldHVybiBwcm9taXNlO1xufVxuXG5mdW5jdGlvbiBrZXlzKFxuICB0aGlzOiBMb2NhbFN0b3JhZ2VEcml2ZXJDb250ZXh0LFxuICBjYWxsYmFjaz86IENhbGxiYWNrPHN0cmluZ1tdPlxuKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCBwcm9taXNlID0gd2l0aExvY2FsU3RvcmFnZUVycm9yQ29udGV4dChcbiAgICB0aGlzLnJlYWR5KCkudGhlbigoKSA9PiB7XG4gICAgICBjb25zdCBkYkluZm8gPSB0aGlzLl9kYkluZm87XG4gICAgICBjb25zdCBsZW5ndGggPSBsb2NhbFN0b3JhZ2UubGVuZ3RoO1xuICAgICAgY29uc3Qga2V5czogc3RyaW5nW10gPSBbXTtcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBpdGVtS2V5ID0gbG9jYWxTdG9yYWdlLmtleShpKTtcbiAgICAgICAgaWYgKGl0ZW1LZXkgJiYgaXRlbUtleS5pbmRleE9mKGRiSW5mby5rZXlQcmVmaXgpID09PSAwKSB7XG4gICAgICAgICAga2V5cy5wdXNoKGl0ZW1LZXkuc3Vic3RyaW5nKGRiSW5mby5rZXlQcmVmaXgubGVuZ3RoKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGtleXM7XG4gICAgfSksXG4gICAgJ2tleXMnXG4gICk7XG5cbiAgZXhlY3V0ZUNhbGxiYWNrKHByb21pc2UsIGNhbGxiYWNrKTtcbiAgcmV0dXJuIHByb21pc2U7XG59XG5cbmZ1bmN0aW9uIGxlbmd0aChcbiAgdGhpczogTG9jYWxTdG9yYWdlRHJpdmVyQ29udGV4dCxcbiAgY2FsbGJhY2s/OiBDYWxsYmFjazxudW1iZXI+XG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCBwcm9taXNlID0gd2l0aExvY2FsU3RvcmFnZUVycm9yQ29udGV4dChcbiAgICBrZXlzLmNhbGwodGhpcykudGhlbigoZGVyaXZlZEtleXMpID0+IGRlcml2ZWRLZXlzLmxlbmd0aCksXG4gICAgJ2xlbmd0aCdcbiAgKTtcblxuICBleGVjdXRlQ2FsbGJhY2socHJvbWlzZSwgY2FsbGJhY2spO1xuICByZXR1cm4gcHJvbWlzZTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlSXRlbShcbiAgdGhpczogTG9jYWxTdG9yYWdlRHJpdmVyQ29udGV4dCxcbiAga2V5OiBzdHJpbmcsXG4gIGNhbGxiYWNrPzogQ2FsbGJhY2s8dm9pZD5cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBub3JtYWxpemVkS2V5ID0gbm9ybWFsaXplS2V5KGtleSk7XG5cbiAgY29uc3QgcHJvbWlzZSA9IHdpdGhMb2NhbFN0b3JhZ2VFcnJvckNvbnRleHQoXG4gICAgdGhpcy5yZWFkeSgpLnRoZW4oKCkgPT4ge1xuICAgICAgY29uc3QgZGJJbmZvID0gdGhpcy5fZGJJbmZvO1xuICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oZGJJbmZvLmtleVByZWZpeCArIG5vcm1hbGl6ZWRLZXkpO1xuICAgIH0pLFxuICAgICdyZW1vdmVJdGVtJyxcbiAgICB7IGtleTogbm9ybWFsaXplZEtleSB9XG4gICk7XG5cbiAgZXhlY3V0ZUNhbGxiYWNrKHByb21pc2UsIGNhbGxiYWNrKTtcbiAgcmV0dXJuIHByb21pc2U7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUl0ZW1zKFxuICB0aGlzOiBMb2NhbFN0b3JhZ2VEcml2ZXJDb250ZXh0LFxuICBrZXlzOiBzdHJpbmdbXSxcbiAgY2FsbGJhY2s/OiBDYWxsYmFjazx2b2lkPlxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRLZXlzID0ga2V5cy5tYXAoKGtleSkgPT4gbm9ybWFsaXplS2V5KGtleSkpO1xuXG4gIGNvbnN0IHByb21pc2UgPSB3aXRoTG9jYWxTdG9yYWdlRXJyb3JDb250ZXh0KFxuICAgIHRoaXMucmVhZHkoKS50aGVuKCgpID0+IHtcbiAgICAgIGNvbnN0IGRiSW5mbyA9IHRoaXMuX2RiSW5mbztcbiAgICAgIGNvbnN0IGJhdGNoU2l6ZSA9IGRiSW5mby5tYXhCYXRjaFNpemUgPz8gbm9ybWFsaXplZEtleXMubGVuZ3RoO1xuXG4gICAgICBmb3IgKGNvbnN0IGJhdGNoIG9mIGNodW5rQXJyYXkobm9ybWFsaXplZEtleXMsIGJhdGNoU2l6ZSkpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgYmF0Y2gpIHtcbiAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShkYkluZm8ua2V5UHJlZml4ICsga2V5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pLFxuICAgICdyZW1vdmVJdGVtcycsXG4gICAgeyBrZXlzOiBub3JtYWxpemVkS2V5cyB9XG4gICk7XG5cbiAgZXhlY3V0ZUNhbGxiYWNrKHByb21pc2UsIGNhbGxiYWNrKTtcbiAgcmV0dXJuIHByb21pc2U7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNldEl0ZW08VD4oXG4gIHRoaXM6IExvY2FsU3RvcmFnZURyaXZlckNvbnRleHQsXG4gIGtleTogc3RyaW5nLFxuICB2YWx1ZTogVCxcbiAgY2FsbGJhY2s/OiBDYWxsYmFjazxUPlxuKTogUHJvbWlzZTxUPiB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRLZXkgPSBub3JtYWxpemVLZXkoa2V5KTtcblxuICBjb25zdCBwcm9taXNlID0gd2l0aExvY2FsU3RvcmFnZUVycm9yQ29udGV4dChcbiAgICB0aGlzLnJlYWR5KCkudGhlbihhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBub3JtYWxpemVkVmFsdWUgPSAodmFsdWUgPT09IHVuZGVmaW5lZCA/IG51bGwgOiB2YWx1ZSkgYXMgVDtcbiAgICAgIGNvbnN0IHNlcmlhbGl6ZWRWYWx1ZSA9XG4gICAgICAgIGF3YWl0IHRoaXMuX2RiSW5mby5zZXJpYWxpemVyLnNlcmlhbGl6ZShub3JtYWxpemVkVmFsdWUpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcbiAgICAgICAgICB0aGlzLl9kYkluZm8ua2V5UHJlZml4ICsgbm9ybWFsaXplZEtleSxcbiAgICAgICAgICBzZXJpYWxpemVkVmFsdWVcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRWYWx1ZTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmXG4gICAgICAgICAgKGVycm9yLm5hbWUgPT09ICdRdW90YUV4Y2VlZGVkRXJyb3InIHx8XG4gICAgICAgICAgICBlcnJvci5uYW1lID09PSAnTlNfRVJST1JfRE9NX1FVT1RBX1JFQUNIRUQnKVxuICAgICAgICApIHtcbiAgICAgICAgICB0aHJvdyB0b0xvY2FsU3BhY2VFcnJvcihcbiAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgJ1FVT1RBX0VYQ0VFREVEJyxcbiAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UgfHwgJ1N0b3JhZ2UgcXVvdGEgZXhjZWVkZWQnLFxuICAgICAgICAgICAgeyBkcml2ZXI6IERSSVZFUl9OQU1FLCBvcGVyYXRpb246ICdzZXRJdGVtJywga2V5OiBub3JtYWxpemVkS2V5IH1cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IHRvTG9jYWxTcGFjZUVycm9yKFxuICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICdPUEVSQVRJT05fRkFJTEVEJyxcbiAgICAgICAgICAnRmFpbGVkIHRvIHNldCBpdGVtIGluIGxvY2FsU3RvcmFnZScsXG4gICAgICAgICAgeyBkcml2ZXI6IERSSVZFUl9OQU1FLCBvcGVyYXRpb246ICdzZXRJdGVtJywga2V5OiBub3JtYWxpemVkS2V5IH1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KSxcbiAgICAnc2V0SXRlbScsXG4gICAgeyBrZXk6IG5vcm1hbGl6ZWRLZXkgfVxuICApO1xuXG4gIGV4ZWN1dGVDYWxsYmFjayhwcm9taXNlLCBjYWxsYmFjayk7XG4gIHJldHVybiBwcm9taXNlO1xufVxuXG5mdW5jdGlvbiBzZXRJdGVtczxUPihcbiAgdGhpczogTG9jYWxTdG9yYWdlRHJpdmVyQ29udGV4dCxcbiAgaXRlbXM6IEJhdGNoSXRlbXM8VD4sXG4gIGNhbGxiYWNrPzogQ2FsbGJhY2s8QmF0Y2hSZXNwb25zZTxUPj5cbik6IFByb21pc2U8QmF0Y2hSZXNwb25zZTxUPj4ge1xuICBjb25zdCBub3JtYWxpemVkID0gbm9ybWFsaXplQmF0Y2hFbnRyaWVzKGl0ZW1zKTtcbiAgY29uc3QgaXRlbUtleXMgPSBub3JtYWxpemVkLm1hcCgoZW50cnkpID0+IGVudHJ5LmtleSk7XG5cbiAgY29uc3QgcHJvbWlzZSA9IHdpdGhMb2NhbFN0b3JhZ2VFcnJvckNvbnRleHQoXG4gICAgdGhpcy5yZWFkeSgpLnRoZW4oYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZGJJbmZvID0gdGhpcy5fZGJJbmZvO1xuICAgICAgY29uc3Qgc3RvcmVkOiBCYXRjaFJlc3BvbnNlPFQ+ID0gW107XG4gICAgICBjb25zdCBiYXRjaFNpemUgPSBkYkluZm8ubWF4QmF0Y2hTaXplID8/IG5vcm1hbGl6ZWQubGVuZ3RoO1xuICAgICAgY29uc3Qgb3JpZ2luYWxzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZyB8IG51bGw+KCk7XG5cbiAgICAgIGZvciAoY29uc3QgYmF0Y2ggb2YgY2h1bmtBcnJheShub3JtYWxpemVkLCBiYXRjaFNpemUpKSB7XG4gICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgYmF0Y2gpIHtcbiAgICAgICAgICBjb25zdCBub3JtYWxpemVkVmFsdWUgPSAoXG4gICAgICAgICAgICBlbnRyeS52YWx1ZSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGVudHJ5LnZhbHVlXG4gICAgICAgICAgKSBhcyBUO1xuICAgICAgICAgIGNvbnN0IHNlcmlhbGl6ZWRWYWx1ZSA9XG4gICAgICAgICAgICBhd2FpdCBkYkluZm8uc2VyaWFsaXplci5zZXJpYWxpemUobm9ybWFsaXplZFZhbHVlKTtcblxuICAgICAgICAgIGlmICghb3JpZ2luYWxzLmhhcyhlbnRyeS5rZXkpKSB7XG4gICAgICAgICAgICBvcmlnaW5hbHMuc2V0KFxuICAgICAgICAgICAgICBlbnRyeS5rZXksXG4gICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5nZXRJdGVtKGRiSW5mby5rZXlQcmVmaXggKyBlbnRyeS5rZXkpXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShkYkluZm8ua2V5UHJlZml4ICsgZW50cnkua2V5LCBzZXJpYWxpemVkVmFsdWUpO1xuICAgICAgICAgICAgc3RvcmVkLnB1c2goeyBrZXk6IGVudHJ5LmtleSwgdmFsdWU6IG5vcm1hbGl6ZWRWYWx1ZSB9KTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICAgICAgLy8gUm9sbCBiYWNrIGtleXMgd3JpdHRlbiBpbiB0aGlzIGludm9jYXRpb25cbiAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgcHJldl0gb2Ygb3JpZ2luYWxzLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgICBjb25zdCBmdWxsS2V5ID0gZGJJbmZvLmtleVByZWZpeCArIGtleTtcbiAgICAgICAgICAgICAgaWYgKHByZXYgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShmdWxsS2V5KTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShmdWxsS2V5LCBwcmV2KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiZcbiAgICAgICAgICAgICAgKGVycm9yLm5hbWUgPT09ICdRdW90YUV4Y2VlZGVkRXJyb3InIHx8XG4gICAgICAgICAgICAgICAgZXJyb3IubmFtZSA9PT0gJ05TX0VSUk9SX0RPTV9RVU9UQV9SRUFDSEVEJylcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICB0aHJvdyB0b0xvY2FsU3BhY2VFcnJvcihcbiAgICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgICAgICAnUVVPVEFfRVhDRUVERUQnLFxuICAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UgfHwgJ1N0b3JhZ2UgcXVvdGEgZXhjZWVkZWQnLFxuICAgICAgICAgICAgICAgIHsgZHJpdmVyOiBEUklWRVJfTkFNRSwgb3BlcmF0aW9uOiAnc2V0SXRlbXMnLCBrZXk6IGVudHJ5LmtleSB9XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyB0b0xvY2FsU3BhY2VFcnJvcihcbiAgICAgICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgICAgICdPUEVSQVRJT05fRkFJTEVEJyxcbiAgICAgICAgICAgICAgJ0ZhaWxlZCB0byBzZXQgaXRlbXMgaW4gbG9jYWxTdG9yYWdlJyxcbiAgICAgICAgICAgICAgeyBkcml2ZXI6IERSSVZFUl9OQU1FLCBvcGVyYXRpb246ICdzZXRJdGVtcycsIGtleTogZW50cnkua2V5IH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzdG9yZWQ7XG4gICAgfSksXG4gICAgJ3NldEl0ZW1zJyxcbiAgICB7IGtleXM6IGl0ZW1LZXlzIH1cbiAgKTtcblxuICBleGVjdXRlQ2FsbGJhY2socHJvbWlzZSwgY2FsbGJhY2spO1xuICByZXR1cm4gcHJvbWlzZTtcbn1cblxuZnVuY3Rpb24gZ2V0SXRlbXM8VD4oXG4gIHRoaXM6IExvY2FsU3RvcmFnZURyaXZlckNvbnRleHQsXG4gIGtleXM6IHN0cmluZ1tdLFxuICBjYWxsYmFjaz86IENhbGxiYWNrPEJhdGNoUmVzcG9uc2U8VD4+XG4pOiBQcm9taXNlPEJhdGNoUmVzcG9uc2U8VD4+IHtcbiAgY29uc3Qgbm9ybWFsaXplZEtleXMgPSBrZXlzLm1hcCgoa2V5KSA9PiBub3JtYWxpemVLZXkoa2V5KSk7XG5cbiAgY29uc3QgcHJvbWlzZSA9IHdpdGhMb2NhbFN0b3JhZ2VFcnJvckNvbnRleHQoXG4gICAgdGhpcy5yZWFkeSgpLnRoZW4oKCkgPT4ge1xuICAgICAgY29uc3QgZGJJbmZvID0gdGhpcy5fZGJJbmZvO1xuICAgICAgY29uc3QgcmVzdWx0czogQmF0Y2hSZXNwb25zZTxUPiA9IFtdO1xuICAgICAgY29uc3QgYmF0Y2hTaXplID0gZGJJbmZvLm1heEJhdGNoU2l6ZSA/PyBub3JtYWxpemVkS2V5cy5sZW5ndGg7XG5cbiAgICAgIGZvciAoY29uc3QgYmF0Y2ggb2YgY2h1bmtBcnJheShub3JtYWxpemVkS2V5cywgYmF0Y2hTaXplKSkge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBiYXRjaCkge1xuICAgICAgICAgIGNvbnN0IHJhdyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGRiSW5mby5rZXlQcmVmaXggKyBrZXkpO1xuICAgICAgICAgIGlmIChyYXcgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaCh7IGtleSwgdmFsdWU6IG51bGwgfSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBkYkluZm8uc2VyaWFsaXplci5kZXNlcmlhbGl6ZShyYXcpIGFzIFQ7XG4gICAgICAgICAgcmVzdWx0cy5wdXNoKHsga2V5LCB2YWx1ZSB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9KSxcbiAgICAnZ2V0SXRlbXMnLFxuICAgIHsga2V5czogbm9ybWFsaXplZEtleXMgfVxuICApO1xuXG4gIGV4ZWN1dGVDYWxsYmFjayhwcm9taXNlLCBjYWxsYmFjayk7XG4gIHJldHVybiBwcm9taXNlO1xufVxuXG5mdW5jdGlvbiBkcm9wSW5zdGFuY2UoXG4gIHRoaXM6IExvY2FsU3RvcmFnZURyaXZlckNvbnRleHQsXG4gIG9wdGlvbnM/OiBMb2NhbFNwYWNlQ29uZmlnLFxuICBjYWxsYmFjaz86IENhbGxiYWNrPHZvaWQ+XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZWZmZWN0aXZlT3B0aW9uczogTG9jYWxTcGFjZUNvbmZpZyA9IHsgLi4uKG9wdGlvbnMgfHwge30pIH07XG5cbiAgaWYgKCFlZmZlY3RpdmVPcHRpb25zLm5hbWUpIHtcbiAgICBjb25zdCBjdXJyZW50Q29uZmlnID0gdGhpcy5jb25maWcoKTtcbiAgICBlZmZlY3RpdmVPcHRpb25zLm5hbWUgPSBjdXJyZW50Q29uZmlnLm5hbWU7XG4gICAgZWZmZWN0aXZlT3B0aW9ucy5zdG9yZU5hbWUgPSBjdXJyZW50Q29uZmlnLnN0b3JlTmFtZTtcbiAgfVxuXG4gIGNvbnN0IHByb21pc2UgPSAhZWZmZWN0aXZlT3B0aW9ucy5uYW1lXG4gICAgPyBQcm9taXNlLnJlamVjdChcbiAgICAgICAgY3JlYXRlTG9jYWxTcGFjZUVycm9yKCdJTlZBTElEX0FSR1VNRU5UJywgJ0ludmFsaWQgYXJndW1lbnRzJywge1xuICAgICAgICAgIGRyaXZlcjogRFJJVkVSX05BTUUsXG4gICAgICAgICAgb3BlcmF0aW9uOiAnZHJvcEluc3RhbmNlJyxcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICA6IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgIGNvbnN0IGtleVByZWZpeCA9ICFlZmZlY3RpdmVPcHRpb25zLnN0b3JlTmFtZVxuICAgICAgICAgID8gYCR7ZWZmZWN0aXZlT3B0aW9ucy5uYW1lfS9gXG4gICAgICAgICAgOiBnZXRLZXlQcmVmaXgoZWZmZWN0aXZlT3B0aW9ucywgdGhpcy5fZGVmYXVsdENvbmZpZyk7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IGxvY2FsU3RvcmFnZS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgIGNvbnN0IGtleSA9IGxvY2FsU3RvcmFnZS5rZXkoaSk7XG4gICAgICAgICAgaWYgKGtleSAmJiBrZXkuaW5kZXhPZihrZXlQcmVmaXgpID09PSAwKSB7XG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9KTtcblxuICBjb25zdCB3cmFwcGVkID0gd2l0aExvY2FsU3RvcmFnZUVycm9yQ29udGV4dChwcm9taXNlLCAnZHJvcEluc3RhbmNlJywge1xuICAgIG5hbWU6IGVmZmVjdGl2ZU9wdGlvbnMubmFtZSxcbiAgICBzdG9yZU5hbWU6IGVmZmVjdGl2ZU9wdGlvbnMuc3RvcmVOYW1lID8/IHRoaXMuX2RlZmF1bHRDb25maWcuc3RvcmVOYW1lLFxuICB9KTtcblxuICBleGVjdXRlQ2FsbGJhY2sod3JhcHBlZCwgY2FsbGJhY2spO1xuICByZXR1cm4gd3JhcHBlZDtcbn1cblxuY29uc3QgbG9jYWxTdG9yYWdlV3JhcHBlcjogRHJpdmVyID0ge1xuICBfZHJpdmVyOiAnbG9jYWxTdG9yYWdlV3JhcHBlcicsXG4gIF9pbml0U3RvcmFnZSxcbiAgX3N1cHBvcnQ6IGFzeW5jICgpID0+IGlzTG9jYWxTdG9yYWdlVmFsaWQoKSxcbiAgaXRlcmF0ZSxcbiAgZ2V0SXRlbSxcbiAgZ2V0SXRlbXMsXG4gIHNldEl0ZW0sXG4gIHNldEl0ZW1zLFxuICByZW1vdmVJdGVtLFxuICByZW1vdmVJdGVtcyxcbiAgY2xlYXIsXG4gIGxlbmd0aCxcbiAga2V5LFxuICBrZXlzLFxuICBydW5UcmFuc2FjdGlvbjxUPihcbiAgICB0aGlzOiBMb2NhbFN0b3JhZ2VEcml2ZXJDb250ZXh0LFxuICAgIG1vZGU6IElEQlRyYW5zYWN0aW9uTW9kZSxcbiAgICBydW5uZXI6IChzY29wZTogVHJhbnNhY3Rpb25TY29wZSkgPT4gUHJvbWlzZTxUPiB8IFQsXG4gICAgY2FsbGJhY2s/OiBDYWxsYmFjazxUPlxuICApOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCBtYWtlUmVhZE9ubHlHdWFyZCA9ICgpID0+IHtcbiAgICAgIGlmIChtb2RlID09PSAncmVhZG9ubHknKSB7XG4gICAgICAgIHRocm93IGNyZWF0ZUxvY2FsU3BhY2VFcnJvcihcbiAgICAgICAgICAnVFJBTlNBQ1RJT05fUkVBRE9OTFknLFxuICAgICAgICAgICdUcmFuc2FjdGlvbiBpcyByZWFkb25seScsXG4gICAgICAgICAge1xuICAgICAgICAgICAgZHJpdmVyOiBEUklWRVJfTkFNRSxcbiAgICAgICAgICAgIG9wZXJhdGlvbjogJ3J1blRyYW5zYWN0aW9uJyxcbiAgICAgICAgICAgIHRyYW5zYWN0aW9uTW9kZTogbW9kZSxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IHNjb3BlOiBUcmFuc2FjdGlvblNjb3BlID0ge1xuICAgICAgZ2V0OiA8Vj4oa2V5OiBzdHJpbmcpID0+IGdldEl0ZW0uY2FsbCh0aGlzLCBrZXkpIGFzIFByb21pc2U8ViB8IG51bGw+LFxuICAgICAgc2V0OiA8Vj4oa2V5OiBzdHJpbmcsIHZhbHVlOiBWKSA9PiB7XG4gICAgICAgIG1ha2VSZWFkT25seUd1YXJkKCk7XG4gICAgICAgIHJldHVybiBzZXRJdGVtLmNhbGwodGhpcywga2V5LCB2YWx1ZSkgYXMgUHJvbWlzZTxWPjtcbiAgICAgIH0sXG4gICAgICByZW1vdmU6IChrZXk6IHN0cmluZykgPT4ge1xuICAgICAgICBtYWtlUmVhZE9ubHlHdWFyZCgpO1xuICAgICAgICByZXR1cm4gcmVtb3ZlSXRlbS5jYWxsKHRoaXMsIGtleSk7XG4gICAgICB9LFxuICAgICAga2V5czogKCkgPT4ga2V5cy5jYWxsKHRoaXMpLFxuICAgICAgaXRlcmF0ZTogPFYsIFU+KGZuOiAodmFsdWU6IFYsIGtleTogc3RyaW5nLCBpdGVyYXRpb246IG51bWJlcikgPT4gVSkgPT5cbiAgICAgICAgaXRlcmF0ZS5jYWxsKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgZm4gYXMgKHZhbHVlOiB1bmtub3duLCBrZXk6IHN0cmluZywgaXRlcmF0aW9uOiBudW1iZXIpID0+IHVua25vd25cbiAgICAgICAgKSBhcyBQcm9taXNlPFU+LFxuICAgICAgY2xlYXI6ICgpID0+IHtcbiAgICAgICAgbWFrZVJlYWRPbmx5R3VhcmQoKTtcbiAgICAgICAgcmV0dXJuIGNsZWFyLmNhbGwodGhpcyk7XG4gICAgICB9LFxuICAgIH07XG5cbiAgICBjb25zdCBwcm9taXNlID0gd2l0aExvY2FsU3RvcmFnZUVycm9yQ29udGV4dChcbiAgICAgIFByb21pc2UucmVzb2x2ZSgpXG4gICAgICAgIC50aGVuKCgpID0+IHJ1bm5lcihzY29wZSkpXG4gICAgICAgIC5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9KSxcbiAgICAgICdydW5UcmFuc2FjdGlvbicsXG4gICAgICB7IHRyYW5zYWN0aW9uTW9kZTogbW9kZSB9XG4gICAgKTtcblxuICAgIGV4ZWN1dGVDYWxsYmFjayhwcm9taXNlLCBjYWxsYmFjayk7XG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH0sXG4gIGRyb3BJbnN0YW5jZSxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGxvY2FsU3RvcmFnZVdyYXBwZXI7XG4iXX0=
|
|
356
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWxzdG9yYWdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RyaXZlcnMvbG9jYWxzdG9yYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVlBLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNyRSxPQUFPLEVBQ0wsZUFBZSxFQUNmLHFCQUFxQixFQUNyQixZQUFZLEVBQ1osVUFBVSxHQUNYLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxVQUFVLE1BQU0scUJBQXFCLENBQUM7QUFlN0MsTUFBTSxXQUFXLEdBQUcscUJBQXFCLENBQUM7QUFFMUMsTUFBTSw0QkFBNEIsR0FBRyxDQUNuQyxPQUFtQixFQUNuQixTQUFpQixFQUNqQixPQUFnQyxFQUNoQyxPQUE0QixrQkFBa0IsRUFDbEMsRUFBRSxDQUNkLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtJQUN0QixNQUFNLE9BQU8sR0FDWCxLQUFLLFlBQVksS0FBSyxJQUFJLEtBQUssQ0FBQyxPQUFPO1FBQ3JDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTztRQUNmLENBQUMsQ0FBQyxnQkFBZ0IsU0FBUyxTQUFTLENBQUM7SUFDekMsTUFBTSxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRTtRQUM1QyxNQUFNLEVBQUUsV0FBVztRQUNuQixTQUFTO1FBQ1QsR0FBRyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUM7S0FDbkIsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUM7QUFFTCxTQUFTLG1CQUFtQjtJQUMxQixJQUFJLENBQUM7UUFDSCxPQUFPLENBQ0wsT0FBTyxZQUFZLEtBQUssV0FBVztZQUNuQyxTQUFTLElBQUksWUFBWTtZQUN6QixDQUFDLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FDdkIsQ0FBQztJQUNKLENBQUM7SUFBQyxPQUFPLENBQUMsRUFBRSxDQUFD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LEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDekIsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDYixNQUFNLEdBQUcsQ0FBQztRQUNaLENBQUMsQ0FBQyxFQUNKLGdCQUFnQixFQUNoQixFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUsQ0FDMUIsQ0FBQztRQUVGLGVBQWUsQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDbkMsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUNELFlBQVk7Q0FDYixDQUFDO0FBRUYsZUFBZSxtQkFBbUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHtcbiAgRHJpdmVyLFxuICBEYkluZm8sXG4gIExvY2FsU3BhY2VDb25maWcsXG4gIENhbGxiYWNrLFxuICBTZXJpYWxpemVyLFxuICBMb2NhbFNwYWNlSW5zdGFuY2UsXG4gIEJhdGNoSXRlbXMsXG4gIEJhdGNoUmVzcG9uc2UsXG4gIFRyYW5zYWN0aW9uU2NvcGUsXG59IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgTG9jYWxTcGFjZUVycm9yQ29kZSwgTG9jYWxTcGFjZUVycm9yRGV0YWlscyB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBjcmVhdGVMb2NhbFNwYWNlRXJyb3IsIHRvTG9jYWxTcGFjZUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7XG4gIGV4ZWN1dGVDYWxsYmFjayxcbiAgbm9ybWFsaXplQmF0Y2hFbnRyaWVzLFxuICBub3JtYWxpemVLZXksXG4gIGNodW5rQXJyYXksXG59IGZyb20gJy4uL3V0aWxzL2hlbHBlcnMnO1xuaW1wb3J0IHNlcmlhbGl6ZXIgZnJvbSAnLi4vdXRpbHMvc2VyaWFsaXplcic7XG5cbnR5cGUgTG9jYWxTdG9yYWdlRGJJbmZvID0gRGJJbmZvICYge1xuICBrZXlQcmVmaXg6IHN0cmluZztcbiAgc2VyaWFsaXplcjogU2VyaWFsaXplcjtcbn07XG5cbnR5cGUgTG9jYWxTdG9yYWdlRHJpdmVyQ29udGV4dCA9IExvY2FsU3BhY2VJbnN0YW5jZSAmXG4gIFBhcnRpYWw8RHJpdmVyPiAmIHtcbiAgICBfZGJJbmZvOiBMb2NhbFN0b3JhZ2VEYkluZm87XG4gICAgX2RlZmF1bHRDb25maWc6IExvY2FsU3BhY2VDb25maWc7XG4gICAgcmVhZHkoKTogUHJvbWlzZTx2b2lkPjtcbiAgICBjb25maWcoKTogTG9jYWxTcGFjZUNvbmZpZztcbiAgfTtcblxuY29uc3QgRFJJVkVSX05BTUUgPSAnbG9jYWxTdG9yYWdlV3JhcHBlcic7XG5cbmNvbnN0IHdpdGhMb2NhbFN0b3JhZ2VFcnJvckNvbnRleHQgPSA8VD4oXG4gIHByb21pc2U6IFByb21pc2U8VD4sXG4gIG9wZXJhdGlvbjogc3RyaW5nLFxuICBkZXRhaWxzPzogTG9jYWxTcGFjZUVycm9yRGV0YWlscyxcbiAgY29kZTogTG9jYWxTcGFjZUVycm9yQ29kZSA9ICdPUEVSQVRJT05fRkFJTEVEJ1xuKTogUHJvbWlzZTxUPiA9PlxuICBwcm9taXNlLmNhdGNoKChlcnJvcikgPT4ge1xuICAgIGNvbnN0IG1lc3NhZ2UgPVxuICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiBlcnJvci5tZXNzYWdlXG4gICAgICAgID8gZXJyb3IubWVzc2FnZVxuICAgICAgICA6IGBsb2NhbFN0b3JhZ2UgJHtvcGVyYXRpb259IGZhaWxlZGA7XG4gICAgdGhyb3cgdG9Mb2NhbFNwYWNlRXJyb3IoZXJyb3IsIGNvZGUsIG1lc3NhZ2UsIHtcbiAgICAgIGRyaXZlcjogRFJJVkVSX05BTUUsXG4gICAgICBvcGVyYXRpb24sXG4gICAgICAuLi4oZGV0YWlscyA/PyB7fSksXG4gICAgfSk7XG4gIH0pO1xuXG5mdW5jdGlvbiBpc0xvY2FsU3RvcmFnZVZhbGlkKCk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIHJldHVybiAoXG4gICAgICB0eXBlb2YgbG9jYWxTdG9yYWdlICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgJ3NldEl0ZW0nIGluIGxvY2FsU3RvcmFnZSAmJlxuICAgICAgISFsb2NhbFN0b3JhZ2Uuc2V0SXRlbVxuICAgICk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0S2V5UHJlZml4KFxuICBvcHRpb25zOiBMb2NhbFNwYWNlQ29uZmlnLFxuICBkZWZhdWx0Q29uZmlnOiBMb2NhbFNwYWNlQ29uZmlnXG4pOiBzdHJpbmcge1xuICBsZXQga2V5UHJlZml4ID0gb3B0aW9ucy5uYW1lICsgJy8nO1xuXG4gIGlmIChvcHRpb25zLnN0b3JlTmFtZSAhPT0gZGVmYXVsdENvbmZpZy5zdG9yZU5hbWUpIHtcbiAgICBrZXlQcmVmaXggKz0gb3B0aW9ucy5zdG9yZU5hbWUgKyAnLyc7XG4gIH1cbiAgcmV0dXJuIGtleVByZWZpeDtcbn1cblxuZnVuY3Rpb24gY2hlY2tJZkxvY2FsU3RvcmFnZVRocm93cygpOiBib29sZWFuIHtcbiAgY29uc3QgbG9jYWxTdG9yYWdlVGVzdEtleSA9ICdfbG9jYWxmb3JhZ2Vfc3VwcG9ydF90ZXN0JztcblxuICB0cnkge1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGxvY2FsU3RvcmFnZVRlc3RLZXksICd0cnVlJyk7XG4gICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0obG9jYWxTdG9yYWdlVGVzdEtleSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNMb2NhbFN0b3JhZ2VVc2FibGUoKTogYm9vbGVhbiB7XG4gIGlmICghY2hlY2tJZkxvY2FsU3RvcmFnZVRocm93cygpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLy8gbG9jYWxTdG9yYWdlLnNldEl0ZW0gdGhyZXcsIGJ1dCB0aGVyZSBtYXkgc3RpbGwgYmUgZXhpc3RpbmcgZGF0YVxuICAvLyAoZS5nLiwgcXVvdGEgZXhjZWVkZWQpLiBXcmFwIHRoZSBsZW5ndGggY2hlY2sgc2luY2UgaXQgY2FuIGFsc28gdGhyb3dcbiAgLy8gaW4gcHJpdmFjeSBtb2Rlcy5cbiAgdHJ5IHtcbiAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmxlbmd0aCA+IDA7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBfaW5pdFN0b3JhZ2UoXG4gIHRoaXM6IExvY2FsU3RvcmFnZURyaXZlckNvbnRleHQsXG4gIGNvbmZpZzogTG9jYWxTcGFjZUNvbmZpZ1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGRiSW5mbzogTG9jYWxTdG9yYWdlRGJJbmZvID0ge1xuICAgIC4uLmNvbmZpZyxcbiAgICBrZXlQcmVmaXg6IGdldEtleVByZWZpeChjb25maWcsIHRoaXMuX2RlZmF1bHRDb25maWcpLFxuICAgIHNlcmlhbGl6ZXIsXG4gIH07XG5cbiAgaWYgKCFpc0xvY2FsU3RvcmFnZVVzYWJsZSgpKSB7XG4gICAgdGhyb3cgY3JlYXRlTG9jYWxTcGFjZUVycm9yKFxuICAgICAgJ0RSSVZFUl9VTkFWQUlMQUJMRScsXG4gICAgICAnbG9jYWxTdG9yYWdlIG5vdCB1c2FibGUnLFxuICAgICAgeyBkcml2ZXI6IERSSVZFUl9OQU1FIH1cbiAgICApO1xuICB9XG5cbiAgdGhpcy5fZGJJbmZvID0gZGJJbmZvO1xufVxuXG5mdW5jdGlvbiBjbGVhcihcbiAgdGhpczogTG9jYWxTdG9yYWdlRHJpdmVyQ29udGV4dCxcbiAgY2FsbGJhY2s/OiBDYWxsYmFjazx2b2lkPlxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByb21pc2UgPSB3aXRoTG9jYWxTdG9yYWdlRXJyb3JDb250ZXh0KFxuICAgIHRoaXMucmVhZHkoKS50aGVuKCgpID0+IHtcbiAgICAgIGNvbnN0IGtleVByZWZpeCA9IHRoaXMuX2RiSW5mby5rZXlQcmVmaXg7XG5cbiAgICAgIGZvciAobGV0IGkgPSBsb2NhbFN0b3JhZ2UubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgY29uc3Qga2V5ID0gbG9jYWxTdG9yYWdlLmtleShpKTtcbiAgICAgICAgaWYgKGtleSAmJiBrZXkuaW5kZXhPZihrZXlQcmVmaXgpID09PSAwKSB7XG4gICAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pLFxuICAgICdjbGVhcidcbiAgKTtcblxuICBleGVjdXRlQ2FsbGJhY2socHJvbWlzZSwgY2FsbGJhY2spO1xuICByZXR1cm4gcHJvbWlzZTtcbn1cblxuZnVuY3Rpb24gZ2V0SXRlbTxUPihcbiAgdGhpczogTG9jYWxTdG9yYWdlRHJpdmVyQ29udGV4dCxcbiAga2V5OiBzdHJpbmcsXG4gIGNhbGxiYWNrPzogQ2FsbGJhY2s8VD5cbik6IFByb21pc2U8VCB8IG51bGw+IHtcbiAgY29uc3Qgbm9ybWFsaXplZEtleSA9IG5vcm1hbGl6ZUtleShrZXkpO1xuXG4gIGNvbnN0IHByb21pc2UgPSB3aXRoTG9jYWxTdG9yYWdlRXJyb3JDb250ZXh0KFxuICAgIHRoaXMucmVhZHkoKS50aGVuKCgpID0+IHtcbiAgICAgIGNvbnN0IGRiSW5mbyA9IHRoaXMuX2RiSW5mbztcbiAgICAgIGNvbnN0IHJhdyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGRiSW5mby5rZXlQcmVmaXggKyBub3JtYWxpemVkS2V5KTtcblxuICAgICAgaWYgKHJhdyA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRiSW5mby5zZXJpYWxpemVyLmRlc2VyaWFsaXplKHJhdykgYXMgVDtcbiAgICB9KSxcbiAgICAnZ2V0SXRlbScsXG4gICAgeyBrZXk6IG5vcm1hbGl6ZWRLZXkgfVxuICApO1xuXG4gIGV4ZWN1dGVDYWxsYmFjayhcbiAgICBwcm9taXNlIGFzIFByb21pc2U8VCB8IG51bGw+LFxuICAgIGNhbGxiYWNrIGFzIENhbGxiYWNrPFQgfCBudWxsPiB8IHVuZGVmaW5lZFxuICApO1xuICByZXR1cm4gcHJvbWlzZTtcbn1cblxuZnVuY3Rpb24gaXRlcmF0ZTxULCBVPihcbiAgdGhpczogTG9jYWxTdG9yYWdlRHJpdmVyQ29udGV4dCxcbiAgaXRlcmF0b3I6ICh2YWx1ZTogVCwga2V5OiBzdHJpbmcsIGl0ZXJhdGlvbk51bWJlcjogbnVtYmVyKSA9PiBVLFxuICBjYWxsYmFjaz86IENhbGxiYWNrPFU+XG4pOiBQcm9taXNlPFU+IHtcbiAgY29uc3QgcHJvbWlzZSA9IHdpdGhMb2NhbFN0b3JhZ2VFcnJvckNvbnRleHQoXG4gICAgdGhpcy5yZWFkeSgpLnRoZW4oKCkgPT4ge1xuICAgICAgY29uc3QgZGJJbmZvID0gdGhpcy5fZGJJbmZvO1xuICAgICAgY29uc3Qga2V5UHJlZml4ID0gZGJJbmZvLmtleVByZWZpeDtcbiAgICAgIGNvbnN0IGtleVByZWZpeExlbmd0aCA9IGtleVByZWZpeC5sZW5ndGg7XG4gICAgICBjb25zdCBsZW5ndGggPSBsb2NhbFN0b3JhZ2UubGVuZ3RoO1xuICAgICAgbGV0IGl0ZXJhdGlvbk51bWJlciA9IDE7XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qga2V5ID0gbG9jYWxTdG9yYWdlLmtleShpKTtcbiAgICAgICAgaWYgKCFrZXkgfHwga2V5LmluZGV4T2Yoa2V5UHJlZml4KSAhPT0gMCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmF3VmFsdWUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xuICAgICAgICBsZXQgdmFsdWU6IFQgfCBudWxsID0gbnVsbDtcbiAgICAgICAgaWYgKHJhd1ZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgdmFsdWUgPSBkYkluZm8uc2VyaWFsaXplci5kZXNlcmlhbGl6ZShyYXdWYWx1ZSkgYXMgVDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGl0ZXJhdG9yKFxuICAgICAgICAgIHZhbHVlIGFzIFQsXG4gICAgICAgICAga2V5LnN1YnN0cmluZyhrZXlQcmVmaXhMZW5ndGgpLFxuICAgICAgICAgIGl0ZXJhdGlvbk51bWJlcisrXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdW5kZWZpbmVkIGFzIHVua25vd24gYXMgVTtcbiAgICB9KSxcbiAgICAnaXRlcmF0ZSdcbiAgKTtcblxuICBleGVjdXRlQ2FsbGJhY2socHJvbWlzZSwgY2FsbGJhY2spO1xuICByZXR1cm4gcHJvbWlzZTtcbn1cblxuZnVuY3Rpb24ga2V5KFxuICB0aGlzOiBMb2NhbFN0b3JhZ2VEcml2ZXJDb250ZXh0LFxuICBuOiBudW1iZXIsXG4gIGNhbGxiYWNrPzogQ2FsbGJhY2s8c3RyaW5nPlxuKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gIGNvbnN0IHByb21pc2UgPSB3aXRoTG9jYWxTdG9yYWdlRXJyb3JDb250ZXh0KFxuICAgIHRoaXMucmVhZHkoKS50aGVuKCgpID0+IHtcbiAgICAgIGNvbnN0IGRiSW5mbyA9IHRoaXMuX2RiSW5mbztcbiAgICAgIGNvbnN0IGtleVByZWZpeCA9IGRiSW5mby5rZXlQcmVmaXg7XG4gICAgICBjb25zdCBrZXlzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICAvLyBDb2xsZWN0IGtleXMgdGhhdCBtYXRjaCB0aGUgcHJlZml4OyBrZWVwIG5hdGl2ZSBzdG9yYWdlIGl0ZXJhdGlvbiBvcmRlclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb2NhbFN0b3JhZ2UubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgaXRlbUtleSA9IGxvY2FsU3RvcmFnZS5rZXkoaSk7XG4gICAgICAgIGlmIChpdGVtS2V5ICYmIGl0ZW1LZXkuaW5kZXhPZihrZXlQcmVmaXgpID09PSAwKSB7XG4gICAgICAgICAga2V5cy5wdXNoKGl0ZW1LZXkuc3Vic3RyaW5nKGtleVByZWZpeC5sZW5ndGgpKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAobiA8IDAgfHwgbiA+PSBrZXlzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGtleXNbbl07XG4gICAgfSksXG4gICAgJ2tleScsXG4gICAgeyBrZXlJbmRleDogbiB9XG4gICk7XG5cbiAgZXhlY3V0ZUNhbGxiYWNrKHByb21pc2UsIGNhbGxiYWNrIGFzIENhbGxiYWNrPHN0cmluZyB8IG51bGw+IHwgdW5kZWZpbmVkKTtcbiAgcmV0dXJuIHByb21pc2U7XG59XG5cbmZ1bmN0aW9uIGtleXMoXG4gIHRoaXM6IExvY2FsU3RvcmFnZURyaXZlckNvbnRleHQsXG4gIGNhbGxiYWNrPzogQ2FsbGJhY2s8c3RyaW5nW10+XG4pOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHByb21pc2UgPSB3aXRoTG9jYWxTdG9yYWdlRXJyb3JDb250ZXh0KFxuICAgIHRoaXMucmVhZHkoKS50aGVuKCgpID0+IHtcbiAgICAgIGNvbnN0IGRiSW5mbyA9IHRoaXMuX2RiSW5mbztcbiAgICAgIGNvbnN0IGxlbmd0aCA9IGxvY2FsU3RvcmFnZS5sZW5ndGg7XG4gICAgICBjb25zdCBrZXlzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGl0ZW1LZXkgPSBsb2NhbFN0b3JhZ2Uua2V5KGkpO1xuICAgICAgICBpZiAoaXRlbUtleSAmJiBpdGVtS2V5LmluZGV4T2YoZGJJbmZvLmtleVByZWZpeCkgPT09IDApIHtcbiAgICAgICAgICBrZXlzLnB1c2goaXRlbUtleS5zdWJzdHJpbmcoZGJJbmZvLmtleVByZWZpeC5sZW5ndGgpKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ga2V5cztcbiAgICB9KSxcbiAgICAna2V5cydcbiAgKTtcblxuICBleGVjdXRlQ2FsbGJhY2socHJvbWlzZSwgY2FsbGJhY2spO1xuICByZXR1cm4gcHJvbWlzZTtcbn1cblxuZnVuY3Rpb24gbGVuZ3RoKFxuICB0aGlzOiBMb2NhbFN0b3JhZ2VEcml2ZXJDb250ZXh0LFxuICBjYWxsYmFjaz86IENhbGxiYWNrPG51bWJlcj5cbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IHByb21pc2UgPSB3aXRoTG9jYWxTdG9yYWdlRXJyb3JDb250ZXh0KFxuICAgIGtleXMuY2FsbCh0aGlzKS50aGVuKChkZXJpdmVkS2V5cykgPT4gZGVyaXZlZEtleXMubGVuZ3RoKSxcbiAgICAnbGVuZ3RoJ1xuICApO1xuXG4gIGV4ZWN1dGVDYWxsYmFjayhwcm9taXNlLCBjYWxsYmFjayk7XG4gIHJldHVybiBwcm9taXNlO1xufVxuXG5mdW5jdGlvbiByZW1vdmVJdGVtKFxuICB0aGlzOiBMb2NhbFN0b3JhZ2VEcml2ZXJDb250ZXh0LFxuICBrZXk6IHN0cmluZyxcbiAgY2FsbGJhY2s/OiBDYWxsYmFjazx2b2lkPlxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRLZXkgPSBub3JtYWxpemVLZXkoa2V5KTtcblxuICBjb25zdCBwcm9taXNlID0gd2l0aExvY2FsU3RvcmFnZUVycm9yQ29udGV4dChcbiAgICB0aGlzLnJlYWR5KCkudGhlbigoKSA9PiB7XG4gICAgICBjb25zdCBkYkluZm8gPSB0aGlzLl9kYkluZm87XG4gICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShkYkluZm8ua2V5UHJlZml4ICsgbm9ybWFsaXplZEtleSk7XG4gICAgfSksXG4gICAgJ3JlbW92ZUl0ZW0nLFxuICAgIHsga2V5OiBub3JtYWxpemVkS2V5IH1cbiAgKTtcblxuICBleGVjdXRlQ2FsbGJhY2socHJvbWlzZSwgY2FsbGJhY2spO1xuICByZXR1cm4gcHJvbWlzZTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlSXRlbXMoXG4gIHRoaXM6IExvY2FsU3RvcmFnZURyaXZlckNvbnRleHQsXG4gIGtleXM6IHN0cmluZ1tdLFxuICBjYWxsYmFjaz86IENhbGxiYWNrPHZvaWQ+XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgbm9ybWFsaXplZEtleXMgPSBrZXlzLm1hcCgoa2V5KSA9PiBub3JtYWxpemVLZXkoa2V5KSk7XG5cbiAgY29uc3QgcHJvbWlzZSA9IHdpdGhMb2NhbFN0b3JhZ2VFcnJvckNvbnRleHQoXG4gICAgdGhpcy5yZWFkeSgpLnRoZW4oKCkgPT4ge1xuICAgICAgY29uc3QgZGJJbmZvID0gdGhpcy5fZGJJbmZvO1xuICAgICAgY29uc3QgYmF0Y2hTaXplID0gZGJJbmZvLm1heEJhdGNoU2l6ZSA/PyBub3JtYWxpemVkS2V5cy5sZW5ndGg7XG5cbiAgICAgIGZvciAoY29uc3QgYmF0Y2ggb2YgY2h1bmtBcnJheShub3JtYWxpemVkS2V5cywgYmF0Y2hTaXplKSkge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBiYXRjaCkge1xuICAgICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGRiSW5mby5rZXlQcmVmaXggKyBrZXkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSksXG4gICAgJ3JlbW92ZUl0ZW1zJyxcbiAgICB7IGtleXM6IG5vcm1hbGl6ZWRLZXlzIH1cbiAgKTtcblxuICBleGVjdXRlQ2FsbGJhY2socHJvbWlzZSwgY2FsbGJhY2spO1xuICByZXR1cm4gcHJvbWlzZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0SXRlbTxUPihcbiAgdGhpczogTG9jYWxTdG9yYWdlRHJpdmVyQ29udGV4dCxcbiAga2V5OiBzdHJpbmcsXG4gIHZhbHVlOiBULFxuICBjYWxsYmFjaz86IENhbGxiYWNrPFQ+XG4pOiBQcm9taXNlPFQ+IHtcbiAgY29uc3Qgbm9ybWFsaXplZEtleSA9IG5vcm1hbGl6ZUtleShrZXkpO1xuXG4gIGNvbnN0IHByb21pc2UgPSB3aXRoTG9jYWxTdG9yYWdlRXJyb3JDb250ZXh0KFxuICAgIHRoaXMucmVhZHkoKS50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRWYWx1ZSA9ICh2YWx1ZSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHZhbHVlKSBhcyBUO1xuICAgICAgY29uc3Qgc2VyaWFsaXplZFZhbHVlID1cbiAgICAgICAgYXdhaXQgdGhpcy5fZGJJbmZvLnNlcmlhbGl6ZXIuc2VyaWFsaXplKG5vcm1hbGl6ZWRWYWx1ZSk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFxuICAgICAgICAgIHRoaXMuX2RiSW5mby5rZXlQcmVmaXggKyBub3JtYWxpemVkS2V5LFxuICAgICAgICAgIHNlcmlhbGl6ZWRWYWx1ZVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gbm9ybWFsaXplZFZhbHVlO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiZcbiAgICAgICAgICAoZXJyb3IubmFtZSA9PT0gJ1F1b3RhRXhjZWVkZWRFcnJvcicgfHxcbiAgICAgICAgICAgIGVycm9yLm5hbWUgPT09ICdOU19FUlJPUl9ET01fUVVPVEFfUkVBQ0hFRCcpXG4gICAgICAgICkge1xuICAgICAgICAgIHRocm93IHRvTG9jYWxTcGFjZUVycm9yKFxuICAgICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgICAnUVVPVEFfRVhDRUVERUQnLFxuICAgICAgICAgICAgZXJyb3IubWVzc2FnZSB8fCAnU3RvcmFnZSBxdW90YSBleGNlZWRlZCcsXG4gICAgICAgICAgICB7IGRyaXZlcjogRFJJVkVSX05BTUUsIG9wZXJhdGlvbjogJ3NldEl0ZW0nLCBrZXk6IG5vcm1hbGl6ZWRLZXkgfVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgdG9Mb2NhbFNwYWNlRXJyb3IoXG4gICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgJ09QRVJBVElPTl9GQUlMRUQnLFxuICAgICAgICAgICdGYWlsZWQgdG8gc2V0IGl0ZW0gaW4gbG9jYWxTdG9yYWdlJyxcbiAgICAgICAgICB7IGRyaXZlcjogRFJJVkVSX05BTUUsIG9wZXJhdGlvbjogJ3NldEl0ZW0nLCBrZXk6IG5vcm1hbGl6ZWRLZXkgfVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pLFxuICAgICdzZXRJdGVtJyxcbiAgICB7IGtleTogbm9ybWFsaXplZEtleSB9XG4gICk7XG5cbiAgZXhlY3V0ZUNhbGxiYWNrKHByb21pc2UsIGNhbGxiYWNrKTtcbiAgcmV0dXJuIHByb21pc2U7XG59XG5cbmZ1bmN0aW9uIHNldEl0ZW1zPFQ+KFxuICB0aGlzOiBMb2NhbFN0b3JhZ2VEcml2ZXJDb250ZXh0LFxuICBpdGVtczogQmF0Y2hJdGVtczxUPixcbiAgY2FsbGJhY2s/OiBDYWxsYmFjazxCYXRjaFJlc3BvbnNlPFQ+PlxuKTogUHJvbWlzZTxCYXRjaFJlc3BvbnNlPFQ+PiB7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBub3JtYWxpemVCYXRjaEVudHJpZXMoaXRlbXMpO1xuICBjb25zdCBpdGVtS2V5cyA9IG5vcm1hbGl6ZWQubWFwKChlbnRyeSkgPT4gZW50cnkua2V5KTtcblxuICBjb25zdCBwcm9taXNlID0gd2l0aExvY2FsU3RvcmFnZUVycm9yQ29udGV4dChcbiAgICB0aGlzLnJlYWR5KCkudGhlbihhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBkYkluZm8gPSB0aGlzLl9kYkluZm87XG4gICAgICBjb25zdCBzdG9yZWQ6IEJhdGNoUmVzcG9uc2U8VD4gPSBbXTtcbiAgICAgIGNvbnN0IGJhdGNoU2l6ZSA9IGRiSW5mby5tYXhCYXRjaFNpemUgPz8gbm9ybWFsaXplZC5sZW5ndGg7XG4gICAgICBjb25zdCBvcmlnaW5hbHMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nIHwgbnVsbD4oKTtcblxuICAgICAgZm9yIChjb25zdCBiYXRjaCBvZiBjaHVua0FycmF5KG5vcm1hbGl6ZWQsIGJhdGNoU2l6ZSkpIHtcbiAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBiYXRjaCkge1xuICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRWYWx1ZSA9IChcbiAgICAgICAgICAgIGVudHJ5LnZhbHVlID09PSB1bmRlZmluZWQgPyBudWxsIDogZW50cnkudmFsdWVcbiAgICAgICAgICApIGFzIFQ7XG4gICAgICAgICAgY29uc3Qgc2VyaWFsaXplZFZhbHVlID1cbiAgICAgICAgICAgIGF3YWl0IGRiSW5mby5zZXJpYWxpemVyLnNlcmlhbGl6ZShub3JtYWxpemVkVmFsdWUpO1xuXG4gICAgICAgICAgaWYgKCFvcmlnaW5hbHMuaGFzKGVudHJ5LmtleSkpIHtcbiAgICAgICAgICAgIG9yaWdpbmFscy5zZXQoXG4gICAgICAgICAgICAgIGVudHJ5LmtleSxcbiAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLmdldEl0ZW0oZGJJbmZvLmtleVByZWZpeCArIGVudHJ5LmtleSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGRiSW5mby5rZXlQcmVmaXggKyBlbnRyeS5rZXksIHNlcmlhbGl6ZWRWYWx1ZSk7XG4gICAgICAgICAgICBzdG9yZWQucHVzaCh7IGtleTogZW50cnkua2V5LCB2YWx1ZTogbm9ybWFsaXplZFZhbHVlIH0pO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgICAgICAvLyBSb2xsIGJhY2sga2V5cyB3cml0dGVuIGluIHRoaXMgaW52b2NhdGlvblxuICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCBwcmV2XSBvZiBvcmlnaW5hbHMuZW50cmllcygpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGZ1bGxLZXkgPSBkYkluZm8ua2V5UHJlZml4ICsga2V5O1xuICAgICAgICAgICAgICBpZiAocHJldiA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGZ1bGxLZXkpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGZ1bGxLZXksIHByZXYpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJlxuICAgICAgICAgICAgICAoZXJyb3IubmFtZSA9PT0gJ1F1b3RhRXhjZWVkZWRFcnJvcicgfHxcbiAgICAgICAgICAgICAgICBlcnJvci5uYW1lID09PSAnTlNfRVJST1JfRE9NX1FVT1RBX1JFQUNIRUQnKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHRocm93IHRvTG9jYWxTcGFjZUVycm9yKFxuICAgICAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgICAgICdRVU9UQV9FWENFRURFRCcsXG4gICAgICAgICAgICAgICAgZXJyb3IubWVzc2FnZSB8fCAnU3RvcmFnZSBxdW90YSBleGNlZWRlZCcsXG4gICAgICAgICAgICAgICAgeyBkcml2ZXI6IERSSVZFUl9OQU1FLCBvcGVyYXRpb246ICdzZXRJdGVtcycsIGtleTogZW50cnkua2V5IH1cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IHRvTG9jYWxTcGFjZUVycm9yKFxuICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgICAgJ09QRVJBVElPTl9GQUlMRUQnLFxuICAgICAgICAgICAgICAnRmFpbGVkIHRvIHNldCBpdGVtcyBpbiBsb2NhbFN0b3JhZ2UnLFxuICAgICAgICAgICAgICB7IGRyaXZlcjogRFJJVkVSX05BTUUsIG9wZXJhdGlvbjogJ3NldEl0ZW1zJywga2V5OiBlbnRyeS5rZXkgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHN0b3JlZDtcbiAgICB9KSxcbiAgICAnc2V0SXRlbXMnLFxuICAgIHsga2V5czogaXRlbUtleXMgfVxuICApO1xuXG4gIGV4ZWN1dGVDYWxsYmFjayhwcm9taXNlLCBjYWxsYmFjayk7XG4gIHJldHVybiBwcm9taXNlO1xufVxuXG5mdW5jdGlvbiBnZXRJdGVtczxUPihcbiAgdGhpczogTG9jYWxTdG9yYWdlRHJpdmVyQ29udGV4dCxcbiAga2V5czogc3RyaW5nW10sXG4gIGNhbGxiYWNrPzogQ2FsbGJhY2s8QmF0Y2hSZXNwb25zZTxUPj5cbik6IFByb21pc2U8QmF0Y2hSZXNwb25zZTxUPj4ge1xuICBjb25zdCBub3JtYWxpemVkS2V5cyA9IGtleXMubWFwKChrZXkpID0+IG5vcm1hbGl6ZUtleShrZXkpKTtcblxuICBjb25zdCBwcm9taXNlID0gd2l0aExvY2FsU3RvcmFnZUVycm9yQ29udGV4dChcbiAgICB0aGlzLnJlYWR5KCkudGhlbigoKSA9PiB7XG4gICAgICBjb25zdCBkYkluZm8gPSB0aGlzLl9kYkluZm87XG4gICAgICBjb25zdCByZXN1bHRzOiBCYXRjaFJlc3BvbnNlPFQ+ID0gW107XG4gICAgICBjb25zdCBiYXRjaFNpemUgPSBkYkluZm8ubWF4QmF0Y2hTaXplID8/IG5vcm1hbGl6ZWRLZXlzLmxlbmd0aDtcblxuICAgICAgZm9yIChjb25zdCBiYXRjaCBvZiBjaHVua0FycmF5KG5vcm1hbGl6ZWRLZXlzLCBiYXRjaFNpemUpKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIGJhdGNoKSB7XG4gICAgICAgICAgY29uc3QgcmF3ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oZGJJbmZvLmtleVByZWZpeCArIGtleSk7XG4gICAgICAgICAgaWYgKHJhdyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHsga2V5LCB2YWx1ZTogbnVsbCB9KTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IGRiSW5mby5zZXJpYWxpemVyLmRlc2VyaWFsaXplKHJhdykgYXMgVDtcbiAgICAgICAgICByZXN1bHRzLnB1c2goeyBrZXksIHZhbHVlIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH0pLFxuICAgICdnZXRJdGVtcycsXG4gICAgeyBrZXlzOiBub3JtYWxpemVkS2V5cyB9XG4gICk7XG5cbiAgZXhlY3V0ZUNhbGxiYWNrKHByb21pc2UsIGNhbGxiYWNrKTtcbiAgcmV0dXJuIHByb21pc2U7XG59XG5cbmZ1bmN0aW9uIGRyb3BJbnN0YW5jZShcbiAgdGhpczogTG9jYWxTdG9yYWdlRHJpdmVyQ29udGV4dCxcbiAgb3B0aW9ucz86IExvY2FsU3BhY2VDb25maWcsXG4gIGNhbGxiYWNrPzogQ2FsbGJhY2s8dm9pZD5cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBlZmZlY3RpdmVPcHRpb25zOiBMb2NhbFNwYWNlQ29uZmlnID0geyAuLi4ob3B0aW9ucyB8fCB7fSkgfTtcblxuICBpZiAoIWVmZmVjdGl2ZU9wdGlvbnMubmFtZSkge1xuICAgIGNvbnN0IGN1cnJlbnRDb25maWcgPSB0aGlzLmNvbmZpZygpO1xuICAgIGVmZmVjdGl2ZU9wdGlvbnMubmFtZSA9IGN1cnJlbnRDb25maWcubmFtZTtcbiAgICBlZmZlY3RpdmVPcHRpb25zLnN0b3JlTmFtZSA9IGN1cnJlbnRDb25maWcuc3RvcmVOYW1lO1xuICB9XG5cbiAgY29uc3QgcHJvbWlzZSA9ICFlZmZlY3RpdmVPcHRpb25zLm5hbWVcbiAgICA/IFByb21pc2UucmVqZWN0KFxuICAgICAgICBjcmVhdGVMb2NhbFNwYWNlRXJyb3IoJ0lOVkFMSURfQVJHVU1FTlQnLCAnSW52YWxpZCBhcmd1bWVudHMnLCB7XG4gICAgICAgICAgZHJpdmVyOiBEUklWRVJfTkFNRSxcbiAgICAgICAgICBvcGVyYXRpb246ICdkcm9wSW5zdGFuY2UnLFxuICAgICAgICB9KVxuICAgICAgKVxuICAgIDogbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgY29uc3Qga2V5UHJlZml4ID0gIWVmZmVjdGl2ZU9wdGlvbnMuc3RvcmVOYW1lXG4gICAgICAgICAgPyBgJHtlZmZlY3RpdmVPcHRpb25zLm5hbWV9L2BcbiAgICAgICAgICA6IGdldEtleVByZWZpeChlZmZlY3RpdmVPcHRpb25zLCB0aGlzLl9kZWZhdWx0Q29uZmlnKTtcblxuICAgICAgICBmb3IgKGxldCBpID0gbG9jYWxTdG9yYWdlLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgY29uc3Qga2V5ID0gbG9jYWxTdG9yYWdlLmtleShpKTtcbiAgICAgICAgICBpZiAoa2V5ICYmIGtleS5pbmRleE9mKGtleVByZWZpeCkgPT09IDApIHtcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0pO1xuXG4gIGNvbnN0IHdyYXBwZWQgPSB3aXRoTG9jYWxTdG9yYWdlRXJyb3JDb250ZXh0KHByb21pc2UsICdkcm9wSW5zdGFuY2UnLCB7XG4gICAgbmFtZTogZWZmZWN0aXZlT3B0aW9ucy5uYW1lLFxuICAgIHN0b3JlTmFtZTogZWZmZWN0aXZlT3B0aW9ucy5zdG9yZU5hbWUgPz8gdGhpcy5fZGVmYXVsdENvbmZpZy5zdG9yZU5hbWUsXG4gIH0pO1xuXG4gIGV4ZWN1dGVDYWxsYmFjayh3cmFwcGVkLCBjYWxsYmFjayk7XG4gIHJldHVybiB3cmFwcGVkO1xufVxuXG5jb25zdCBsb2NhbFN0b3JhZ2VXcmFwcGVyOiBEcml2ZXIgPSB7XG4gIF9kcml2ZXI6ICdsb2NhbFN0b3JhZ2VXcmFwcGVyJyxcbiAgX2luaXRTdG9yYWdlLFxuICBfc3VwcG9ydDogYXN5bmMgKCkgPT4gaXNMb2NhbFN0b3JhZ2VWYWxpZCgpLFxuICBpdGVyYXRlLFxuICBnZXRJdGVtLFxuICBnZXRJdGVtcyxcbiAgc2V0SXRlbSxcbiAgc2V0SXRlbXMsXG4gIHJlbW92ZUl0ZW0sXG4gIHJlbW92ZUl0ZW1zLFxuICBjbGVhcixcbiAgbGVuZ3RoLFxuICBrZXksXG4gIGtleXMsXG4gIHJ1blRyYW5zYWN0aW9uPFQ+KFxuICAgIHRoaXM6IExvY2FsU3RvcmFnZURyaXZlckNvbnRleHQsXG4gICAgbW9kZTogSURCVHJhbnNhY3Rpb25Nb2RlLFxuICAgIHJ1bm5lcjogKHNjb3BlOiBUcmFuc2FjdGlvblNjb3BlKSA9PiBQcm9taXNlPFQ+IHwgVCxcbiAgICBjYWxsYmFjaz86IENhbGxiYWNrPFQ+XG4gICk6IFByb21pc2U8VD4ge1xuICAgIGNvbnN0IG1ha2VSZWFkT25seUd1YXJkID0gKCkgPT4ge1xuICAgICAgaWYgKG1vZGUgPT09ICdyZWFkb25seScpIHtcbiAgICAgICAgdGhyb3cgY3JlYXRlTG9jYWxTcGFjZUVycm9yKFxuICAgICAgICAgICdUUkFOU0FDVElPTl9SRUFET05MWScsXG4gICAgICAgICAgJ1RyYW5zYWN0aW9uIGlzIHJlYWRvbmx5JyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBkcml2ZXI6IERSSVZFUl9OQU1FLFxuICAgICAgICAgICAgb3BlcmF0aW9uOiAncnVuVHJhbnNhY3Rpb24nLFxuICAgICAgICAgICAgdHJhbnNhY3Rpb25Nb2RlOiBtb2RlLFxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3Qgc2NvcGU6IFRyYW5zYWN0aW9uU2NvcGUgPSB7XG4gICAgICBnZXQ6IDxWPihrZXk6IHN0cmluZykgPT4gZ2V0SXRlbS5jYWxsKHRoaXMsIGtleSkgYXMgUHJvbWlzZTxWIHwgbnVsbD4sXG4gICAgICBzZXQ6IDxWPihrZXk6IHN0cmluZywgdmFsdWU6IFYpID0+IHtcbiAgICAgICAgbWFrZVJlYWRPbmx5R3VhcmQoKTtcbiAgICAgICAgcmV0dXJuIHNldEl0ZW0uY2FsbCh0aGlzLCBrZXksIHZhbHVlKSBhcyBQcm9taXNlPFY+O1xuICAgICAgfSxcbiAgICAgIHJlbW92ZTogKGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgIG1ha2VSZWFkT25seUd1YXJkKCk7XG4gICAgICAgIHJldHVybiByZW1vdmVJdGVtLmNhbGwodGhpcywga2V5KTtcbiAgICAgIH0sXG4gICAgICBrZXlzOiAoKSA9PiBrZXlzLmNhbGwodGhpcyksXG4gICAgICBpdGVyYXRlOiA8ViwgVT4oZm46ICh2YWx1ZTogViwga2V5OiBzdHJpbmcsIGl0ZXJhdGlvbjogbnVtYmVyKSA9PiBVKSA9PlxuICAgICAgICBpdGVyYXRlLmNhbGwoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBmbiBhcyAodmFsdWU6IHVua25vd24sIGtleTogc3RyaW5nLCBpdGVyYXRpb246IG51bWJlcikgPT4gdW5rbm93blxuICAgICAgICApIGFzIFByb21pc2U8VT4sXG4gICAgICBjbGVhcjogKCkgPT4ge1xuICAgICAgICBtYWtlUmVhZE9ubHlHdWFyZCgpO1xuICAgICAgICByZXR1cm4gY2xlYXIuY2FsbCh0aGlzKTtcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIGNvbnN0IHByb21pc2UgPSB3aXRoTG9jYWxTdG9yYWdlRXJyb3JDb250ZXh0KFxuICAgICAgUHJvbWlzZS5yZXNvbHZlKClcbiAgICAgICAgLnRoZW4oKCkgPT4gcnVubmVyKHNjb3BlKSlcbiAgICAgICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH0pLFxuICAgICAgJ3J1blRyYW5zYWN0aW9uJyxcbiAgICAgIHsgdHJhbnNhY3Rpb25Nb2RlOiBtb2RlIH1cbiAgICApO1xuXG4gICAgZXhlY3V0ZUNhbGxiYWNrKHByb21pc2UsIGNhbGxiYWNrKTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfSxcbiAgZHJvcEluc3RhbmNlLFxufTtcblxuZXhwb3J0IGRlZmF1bHQgbG9jYWxTdG9yYWdlV3JhcHBlcjtcbiJdfQ==
|