@sumaris-net/ngx-components 1.23.53 → 1.23.55
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/bundles/sumaris-net.ngx-components.umd.js +55 -36
- package/bundles/sumaris-net.ngx-components.umd.js.map +1 -1
- package/bundles/sumaris-net.ngx-components.umd.min.js +2 -2
- package/bundles/sumaris-net.ngx-components.umd.min.js.map +1 -1
- package/esm2015/src/app/core/form/editor.class.js +2 -2
- package/esm2015/src/app/core/form/form.class.js +2 -2
- package/esm2015/src/app/core/home/home.js +1 -1
- package/esm2015/src/app/core/services/storage/entity-store.class.js +15 -9
- package/esm2015/src/app/core/table/table.class.js +4 -12
- package/esm2015/src/app/core/text-popover/text-form.component.js +2 -2
- package/esm2015/src/app/shared/upload-file/upload-file-popover.component.js +1 -1
- package/esm2015/src/app/social/job/progression/job-progression.list.js +1 -1
- package/esm2015/src/app/social/user-event/notification/user-event-notification.list.js +1 -1
- package/fesm2015/sumaris-net.ngx-components.js +23 -25
- package/fesm2015/sumaris-net.ngx-components.js.map +1 -1
- package/package.json +1 -1
- package/src/app/core/form/editor.class.d.ts +1 -1
- package/src/app/core/form/form.class.d.ts +1 -1
- package/src/app/core/table/table.class.d.ts +1 -1
- package/sumaris-net.ngx-components.metadata.json +1 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { __awaiter } from "tslib";
|
|
2
2
|
import { BehaviorSubject } from 'rxjs';
|
|
3
|
-
import { map, mergeMap } from 'rxjs/operators';
|
|
3
|
+
import { filter, map, mergeMap } from 'rxjs/operators';
|
|
4
4
|
import { EntityUtils } from '../model/entity.model';
|
|
5
5
|
import { isEmptyArray, isNil, isNotEmptyArray, isNotNil } from '../../../shared/functions';
|
|
6
6
|
import { chainPromises } from '../../../shared/observables';
|
|
@@ -10,7 +10,7 @@ export class EntityStore {
|
|
|
10
10
|
constructor(name, storage, policy) {
|
|
11
11
|
this.name = name;
|
|
12
12
|
this.storage = storage;
|
|
13
|
-
this._onChange = new BehaviorSubject(
|
|
13
|
+
this._onChange = new BehaviorSubject(false);
|
|
14
14
|
this._dirty = false;
|
|
15
15
|
this.policy = policy || {};
|
|
16
16
|
this.reset({ emitEvent: false });
|
|
@@ -63,7 +63,9 @@ export class EntityStore {
|
|
|
63
63
|
console.warn('[entity-store] WARN: Watching full entities, splited by id in entity store. This can be long! Please make sure you need full entities here.');
|
|
64
64
|
return this._onChange
|
|
65
65
|
.pipe(
|
|
66
|
-
//
|
|
66
|
+
// Wait data loaded
|
|
67
|
+
filter(_ => this._loaded),
|
|
68
|
+
// Apply filter and sort
|
|
67
69
|
map((_) => this.reduceAndSort(this._cache, variables)),
|
|
68
70
|
// Then convert into full entities (using parallel jobs - /!\ can use lot of memory)
|
|
69
71
|
mergeMap((res) => Promise.all((res.data || [])
|
|
@@ -74,7 +76,11 @@ export class EntityStore {
|
|
|
74
76
|
}
|
|
75
77
|
// Load using entities array
|
|
76
78
|
return this._onChange
|
|
77
|
-
.pipe(
|
|
79
|
+
.pipe(
|
|
80
|
+
// Wait data loaded
|
|
81
|
+
filter(_ => this._loaded),
|
|
82
|
+
// Apply filter and sort
|
|
83
|
+
map((_) => this.reduceAndSort(this._cache, variables)));
|
|
78
84
|
}
|
|
79
85
|
/**
|
|
80
86
|
* WIll apply a filter, then a sort, then a page slice
|
|
@@ -131,7 +137,7 @@ export class EntityStore {
|
|
|
131
137
|
let result;
|
|
132
138
|
console.info(`[entity-storage] Saving ${entities.length} ${this.name}(s)`);
|
|
133
139
|
// First save, or reset using given entities
|
|
134
|
-
if (
|
|
140
|
+
if (!this._loaded || !this._cache || (opts === null || opts === void 0 ? void 0 : opts.reset)) {
|
|
135
141
|
this.setEntities(entities, { emitEvent: false });
|
|
136
142
|
}
|
|
137
143
|
else {
|
|
@@ -355,11 +361,11 @@ export class EntityStore {
|
|
|
355
361
|
console.debug(`[entity-storage] Full reloading ${this.name}#${id}...`);
|
|
356
362
|
const fullData = yield this.storage.get(this._storageKey + '#' + id);
|
|
357
363
|
if (fullData)
|
|
358
|
-
return fullData;
|
|
364
|
+
return Object.freeze(fullData);
|
|
359
365
|
// Not found by id, continue from cache (version prior to 1.5.3)
|
|
360
366
|
}
|
|
361
|
-
// Load from the cache, if dirty OR if storage is not
|
|
362
|
-
return this._cache[index];
|
|
367
|
+
// Load from the cache, if dirty OR if storage is not splitted by id
|
|
368
|
+
return Object.freeze(this._cache[index]);
|
|
363
369
|
});
|
|
364
370
|
}
|
|
365
371
|
setEntities(entities, opts) {
|
|
@@ -458,4 +464,4 @@ export class EntityStore {
|
|
|
458
464
|
this._onChange.next(true);
|
|
459
465
|
}
|
|
460
466
|
}
|
|
461
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LXN0b3JlLmNsYXNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb3JlL3NlcnZpY2VzL3N0b3JhZ2UvZW50aXR5LXN0b3JlLmNsYXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsZUFBZSxFQUFhLE1BQU0sTUFBTSxDQUFDO0FBRWpELE9BQU8sRUFBQyxHQUFHLEVBQUUsUUFBUSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFTLFdBQVcsRUFBVSxNQUFNLHVCQUF1QixDQUFDO0FBQ25FLE9BQU8sRUFBQyxZQUFZLEVBQUUsS0FBSyxFQUFFLGVBQWUsRUFBRSxRQUFRLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQztBQUV6RixPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sNkJBQTZCLENBQUM7QUFDMUQsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUVyQyxNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBRyxVQUFVLENBQUM7QUFtQnRELE1BQU0sT0FBTyxXQUFXO0lBb0N0QixZQUNxQixJQUFZLEVBQ1osT0FBZ0IsRUFDbkMsTUFBaUM7UUFGZCxTQUFJLEdBQUosSUFBSSxDQUFRO1FBQ1osWUFBTyxHQUFQLE9BQU8sQ0FBUztRQWhDcEIsY0FBUyxHQUFHLElBQUksZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBSy9DLFdBQU0sR0FBRyxLQUFLLENBQUM7UUE2QnJCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxJQUFJLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUMsU0FBUyxFQUFFLEtBQUssRUFBQyxDQUFDLENBQUM7UUFDL0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDcEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7UUFDckIsSUFBSSxDQUFDLFdBQVcsR0FBRywy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K0Q7UUFDL0QsTUFBTSxxQkFBcUIsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFO1lBQy9GLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxTQUFTLENBQUM7WUFDdEIsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDLEVBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztRQUVYLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBSSxFQUFFLEVBQUUsTUFBTSxFQUFFLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUM5RixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxTQUFTO1FBQ2YsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDNUIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGV9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtTdG9yYWdlfSBmcm9tICdAaW9uaWMvc3RvcmFnZSc7XG5pbXBvcnQge21hcCwgbWVyZ2VNYXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7RW50aXR5LCBFbnRpdHlVdGlscywgSUVudGl0eX0gZnJvbSAnLi4vbW9kZWwvZW50aXR5Lm1vZGVsJztcbmltcG9ydCB7aXNFbXB0eUFycmF5LCBpc05pbCwgaXNOb3RFbXB0eUFycmF5LCBpc05vdE5pbH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL2Z1bmN0aW9ucyc7XG5pbXBvcnQge0lFbnRpdGllc1NlcnZpY2UsIExvYWRSZXN1bHR9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9zZXJ2aWNlcy9lbnRpdHktc2VydmljZS5jbGFzcyc7XG5pbXBvcnQge2NoYWluUHJvbWlzZXN9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9vYnNlcnZhYmxlcyc7XG5pbXBvcnQge0Vycm9yQ29kZXN9IGZyb20gJy4uL2Vycm9ycyc7XG5cbmV4cG9ydCBjb25zdCBFTlRJVElFU19TVE9SQUdFX0tFWV9QUkVGSVggPSAnZW50aXRpZXMnO1xuXG5leHBvcnQgdHlwZSBFbnRpdHlTdG9yZVR5cGVQb2xpY3lNb2RlID0gJ2RlZmF1bHQnIHwgJ2J5LWlkJztcblxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIEVudGl0eVN0b3JlVHlwZVBvbGljeTxUIGV4dGVuZHMgRW50aXR5PFQsIGFueT4gPSBFbnRpdHk8YW55LCBhbnk+LCBLID0ga2V5b2YgVD4gIHtcbiAgbW9kZT86IEVudGl0eVN0b3JlVHlwZVBvbGljeU1vZGU7IC8vICdkZWZhdWx0JyBieSBkZWZhdWx0XG4gIHNraXBOb25Mb2NhbEVudGl0aWVzPzogYm9vbGVhbjsgLy8gRmFsc2UgYnkgZGVmYXVsdFxuICBsaWdodEZpZWxkc0V4Y2x1ZGVzPzogS1tdOyAvLyBub25lIGJ5IGRlZmF1bHRcbn1cblxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIEVudGl0eVN0b3JhZ2VMb2FkT3B0aW9ucyB7XG4gIGZ1bGxMb2FkPzogYm9vbGVhbjtcbn1cblxuZGVjbGFyZSBpbnRlcmZhY2UgRW50aXR5U3RhdHVzIHtcbiAgaW5kZXg6IG51bWJlcjtcbiAgZGlydHk/OiBib29sZWFuO1xufVxuXG5leHBvcnQgY2xhc3MgRW50aXR5U3RvcmU8XG4gIFQgZXh0ZW5kcyBJRW50aXR5PFQsIElEPixcbiAgSUQgPSBudW1iZXIsXG4gIE8gZXh0ZW5kcyBFbnRpdHlTdG9yYWdlTG9hZE9wdGlvbnMgPSBFbnRpdHlTdG9yYWdlTG9hZE9wdGlvbnM+IHtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9zdG9yYWdlS2V5OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgX29uQ2hhbmdlID0gbmV3IEJlaGF2aW9yU3ViamVjdCh0cnVlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfbWFwVG9MaWdodEVudGl0eTogKFQpID0+IFQ7XG4gIHByaXZhdGUgX2NhY2hlOiBUW107XG4gIHByaXZhdGUgX3N0YXR1c0J5SWQ6IE1hcDxJRCwgRW50aXR5U3RhdHVzPjtcbiAgcHJpdmF0ZSBfc2VxdWVuY2U6IG51bWJlcjtcbiAgcHJpdmF0ZSBfZGlydHkgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfbG9hZGVkOiBib29sZWFuO1xuXG4gIHJlYWRvbmx5IHBvbGljeTogRW50aXR5U3RvcmVUeXBlUG9saWN5PFQ+O1xuXG4gIGdldCBsZW5ndGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fY2FjaGU/Lmxlbmd0aCB8fCAwO1xuICB9XG5cbiAgZ2V0IGNhY2hlKCk6IFRbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2NhY2hlO1xuICB9XG5cbiAgZ2V0IGRpcnR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9kaXJ0eTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgaXNCeUlkTW9kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5wb2xpY3kubW9kZSA9PT0gJ2J5LWlkJztcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgc3RvcmFnZUtleUJ5SWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc3RvcmFnZUtleSArICcjaWRzJztcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCByZWFkb25seSBuYW1lOiBzdHJpbmcsXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHN0b3JhZ2U6IFN0b3JhZ2UsXG4gICAgcG9saWN5PzogRW50aXR5U3RvcmVUeXBlUG9saWN5PFQ+KSB7XG4gICAgdGhpcy5wb2xpY3kgPSBwb2xpY3kgfHwge307XG4gICAgdGhpcy5yZXNldCh7ZW1pdEV2ZW50OiBmYWxzZX0pO1xuICAgIHRoaXMuX2RpcnR5ID0gZmFsc2U7XG4gICAgdGhpcy5fbG9hZGVkID0gZmFsc2U7XG4gICAgdGhpcy5fc3RvcmFnZUtleSA9IEVOVElUSUVTX1NUT1JBR0VfS0VZX1BSRUZJWCArICcjJyArIG5hbWU7XG4gICAgdGhpcy5fbWFwVG9MaWdodEVudGl0eSA9IHRoaXMuY3JlYXRlTGlnaHRFbnRpdHlNYXBGbih0aGlzLnBvbGljeSk7XG4gIH1cblxuICBuZXh0VmFsdWUoKTogSUQge1xuICAgIHRoaXMuX3NlcXVlbmNlID0gdGhpcy5fc2VxdWVuY2UgLSAxO1xuICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcy5fc2VxdWVuY2UgYXMgdW5rbm93biBhcyBJRDtcbiAgfVxuXG4gIGN1cnJlbnRWYWx1ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9zZXF1ZW5jZTtcbiAgfVxuXG4gIGFzeW5jIGxvYWQoaWQ6IElELCBvcHRzPzogRW50aXR5U3RvcmFnZUxvYWRPcHRpb25zKTogUHJvbWlzZTxUPiB7XG4gICAgaWYgKHRoaXMuX21hcFRvTGlnaHRFbnRpdHkgJiYgKCFvcHRzIHx8IG9wdHMuZnVsbExvYWQgIT09IGZhbHNlKSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubG9hZEZ1bGxFbnRpdHkoaWQsIG9wdHMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5sb2FkQ2FjaGVkRW50aXR5KGlkLCBvcHRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXYXRjaCBhIHNldCBvZiBlbnRpdGllc1xuICAgKlxuICAgKiBAcGFyYW0gdmFyaWFibGVzXG4gICAqIEBwYXJhbSBvcHRzXG4gICAqL1xuICB3YXRjaEFsbCh2YXJpYWJsZXM6IHtcbiAgICAgICAgICAgIG9mZnNldD86IG51bWJlcjtcbiAgICAgICAgICAgIHNpemU/OiBudW1iZXI7XG4gICAgICAgICAgICBzb3J0Qnk/OiBzdHJpbmc7XG4gICAgICAgICAgICBzb3J0RGlyZWN0aW9uPzogc3RyaW5nO1xuICAgICAgICAgICAgZmlsdGVyPzogKFQpID0+IGJvb2xlYW47XG4gICAgICAgICAgfSwgb3B0cz86IE8pOiBPYnNlcnZhYmxlPExvYWRSZXN1bHQ8VD4+IHtcblxuICAgIC8vIElmIG5lZWQgZnVsbCBlbnRpdGllcywgYnV0IHVzZSBsaWdodCBlbnRpdGllcyBpbiB0aGUgZW50aXRpZXMgYXJyYXlcbiAgICBpZiAodGhpcy5fbWFwVG9MaWdodEVudGl0eSAmJiAob3B0cyAmJiBvcHRzLmZ1bGxMb2FkID09PSB0cnVlKSkge1xuICAgICAgY29uc29sZS53YXJuKCdbZW50aXR5LXN0b3JlXSBXQVJOOiBXYXRjaGluZyBmdWxsIGVudGl0aWVzLCBzcGxpdGVkIGJ5IGlkIGluIGVudGl0eSBzdG9yZS4gVGhpcyBjYW4gYmUgbG9uZyEgUGxlYXNlIG1ha2Ugc3VyZSB5b3UgbmVlZCBmdWxsIGVudGl0aWVzIGhlcmUuJyk7XG4gICAgICByZXR1cm4gdGhpcy5fb25DaGFuZ2VcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgLy8gQXBwbHkgZmlsdGVyIG9uIGNhY2hlXG4gICAgICAgICAgbWFwKChfKSA9PiB0aGlzLnJlZHVjZUFuZFNvcnQodGhpcy5fY2FjaGUsIHZhcmlhYmxlcykpLFxuXG4gICAgICAgICAgLy8gVGhlbiBjb252ZXJ0IGludG8gZnVsbCBlbnRpdGllcyAodXNpbmcgcGFyYWxsZWwgam9icyAtIC8hXFwgY2FuIHVzZSBsb3Qgb2YgbWVtb3J5KVxuICAgICAgICAgIG1lcmdlTWFwKChyZXMpID0+IFByb21pc2UuYWxsKChyZXMuZGF0YSB8fCBbXSlcbiAgICAgICAgICAgIC5tYXAoZSA9PiB0aGlzLmxvYWRGdWxsRW50aXR5KGUuaWQsIG9wdHMpKSkudGhlbihkYXRhID0+ICh7XG4gICAgICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgICAgICB0b3RhbDogcmVzLnRvdGFsXG4gICAgICAgICAgICAgIH0pKVxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBMb2FkIHVzaW5nIGVudGl0aWVzIGFycmF5XG4gICAgcmV0dXJuIHRoaXMuX29uQ2hhbmdlXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKChfKSA9PiB0aGlzLnJlZHVjZUFuZFNvcnQodGhpcy5fY2FjaGUsIHZhcmlhYmxlcykpXG4gICAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFdJbGwgYXBwbHkgYSBmaWx0ZXIsIHRoZW4gYSBzb3J0LCB0aGVuIGEgcGFnZSBzbGljZVxuICAgKlxuICAgKiBAcGFyYW0gdmFyaWFibGVzXG4gICAqIEBwYXJhbSBvcHRzXG4gICAqL1xuICBhc3luYyBsb2FkQWxsKHZhcmlhYmxlczoge1xuICAgIG9mZnNldD86IG51bWJlcjtcbiAgICBzaXplPzogbnVtYmVyO1xuICAgIHNvcnRCeT86IHN0cmluZztcbiAgICBzb3J0RGlyZWN0aW9uPzogc3RyaW5nO1xuICAgIGZpbHRlcj86IChUKSA9PiBib29sZWFuO1xuICB9LCBvcHRzPzogTyk6IFByb21pc2U8TG9hZFJlc3VsdDxUPj4ge1xuXG4gICAgY29uc3QgcmVzID0gdGhpcy5yZWR1Y2VBbmRTb3J0KHRoaXMuX2NhY2hlLCB2YXJpYWJsZXMpO1xuXG4gICAgLy8gSWYgc3RvcmUgYnkgSUQ6IG1ha2Ugc3VyZSB0byBmdWxsIHRoZSBmdWxsIGVudGl0aWVzXG4gICAgaWYgKHRoaXMuX21hcFRvTGlnaHRFbnRpdHkgJiYgaXNOb3RFbXB0eUFycmF5KHJlcy5kYXRhKSAmJiAob3B0cyAmJiBvcHRzLmZ1bGxMb2FkID09PSB0cnVlKSkge1xuICAgICAgLy8gTG9hZCBmdWxsIGVudGl0aWVzLCBvbmUgYnkgb25lXG4gICAgICByZXMuZGF0YSA9IGF3YWl0IGNoYWluUHJvbWlzZXMoKHJlcy5kYXRhIHx8IFtdKS5tYXAoZSA9PiAoKSA9PiB0aGlzLmxvYWQoZS5pZCkpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzIDtcbiAgfVxuXG4gIHNhdmUoZW50aXR5OiBULCBvcHRzPzoge2VtaXRFdmVudD86IGJvb2xlYW59KTogVCB7XG4gICAgY29uc3Qgc3RhdHVzID0gaXNOb3ROaWwoZW50aXR5LmlkKSAmJiB0aGlzLl9zdGF0dXNCeUlkLmdldChlbnRpdHkuaWQpIHx8IHtpbmRleDogdW5kZWZpbmVkfTtcbiAgICBjb25zdCBpc05ldyA9IGlzTmlsKHN0YXR1cy5pbmRleCk7XG4gICAgaWYgKGlzTmV3KSB7XG4gICAgICBpZiAoaXNOaWwoZW50aXR5LmlkKSkge1xuICAgICAgICBlbnRpdHkuaWQgPSB0aGlzLm5leHRWYWx1ZSgpO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoK2VudGl0eS5pZCA8IDAgJiYgK2VudGl0eS5pZCA+IHRoaXMuX3NlcXVlbmNlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignVHJ5aW5nIHRvIHNhdmUgYSBsb2NhbCBlbnRpdHkgd2l0aCBhbiBpZCA+IHNlcXVlbmNlLiBXaWxsIHJlcGxhY2UgaWQgYnkgc2VxdWVuY2UgbmV4dCB2YWx1ZScpO1xuICAgICAgICBlbnRpdHkuaWQgPSB0aGlzLm5leHRWYWx1ZSgpO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIC8vIE9LOiB1c2UgYSB2YWxpZCBpZCA6XG4gICAgICAgIC8vIC0gaWQgPj0gMCAoc2hvdWxkIGJlIGEgcmVtb3RlIGlkKVxuICAgICAgICAvLyAtIE9SIDwgc2VxdWVuY2UsIGFuZCBub3QgZXhpc3RzIGluIHRoZSBpbmRleCBtYXBcbiAgICAgIH1cblxuICAgICAgdGhpcy5fc3RhdHVzQnlJZC5zZXQoZW50aXR5LmlkLCBzdGF0dXMpO1xuICAgICAgc3RhdHVzLmluZGV4ID0gdGhpcy5fY2FjaGUucHVzaChlbnRpdHkpIC0gMTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLl9jYWNoZVtzdGF0dXMuaW5kZXhdID0gZW50aXR5O1xuICAgIH1cblxuICAgIC8vIE1hcmsgZW50aXR5IGFzIGRpcnR5XG4gICAgc3RhdHVzLmRpcnR5ID0gdHJ1ZTtcblxuICAgIC8vIE1hcmsgc3RvcmFnZSBhcyBkaXJ0eVxuICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcblxuICAgIC8vIEVtaXQgdXBkYXRlIGV2ZW50XG4gICAgaWYgKCFvcHRzIHx8IG9wdHMuZW1pdEV2ZW50ICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy5lbWl0RXZlbnQoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZW50aXR5O1xuICB9XG5cbiAgc2F2ZUFsbChlbnRpdGllczogVFtdLCBvcHRzPzogeyBlbWl0RXZlbnQ/OiBib29sZWFuOyByZXNldD86IGJvb2xlYW4gfSk6IFRbXSB7XG4gICAgaWYgKGlzRW1wdHlBcnJheShlbnRpdGllcykgJiYgKCFvcHRzIHx8IG9wdHMucmVzZXQgIT09IHRydWUpKSByZXR1cm4gZW50aXRpZXM7IC8vIFNraXAgKE5vdGhpbmcgdG8gc2F2ZSlcblxuICAgIGxldCByZXN1bHQ6IFRbXTtcblxuICAgIGNvbnNvbGUuaW5mbyhgW2VudGl0eS1zdG9yYWdlXSBTYXZpbmcgJHtlbnRpdGllcy5sZW5ndGh9ICR7dGhpcy5uYW1lfShzKWApO1xuXG4gICAgLy8gRmlyc3Qgc2F2ZSwgb3IgcmVzZXQgdXNpbmcgZ2l2ZW4gZW50aXRpZXNcbiAgICBpZiAoaXNFbXB0eUFycmF5KHRoaXMuX2NhY2hlKSB8fCAob3B0cyAmJiBvcHRzLnJlc2V0KSkge1xuICAgICAgdGhpcy5zZXRFbnRpdGllcyhlbnRpdGllcywge2VtaXRFdmVudDogZmFsc2V9KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICByZXN1bHQgPSBlbnRpdGllcy5tYXAoKGVudGl0eSkgPT4gdGhpcy5zYXZlKGVudGl0eSwge2VtaXRFdmVudDogZmFsc2V9KSk7XG4gICAgfVxuXG4gICAgLy8gTWFyayBhcyBkaXJ0eVxuICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcblxuICAgIC8vIEVtaXQgdXBkYXRlIGV2ZW50XG4gICAgaWYgKCFvcHRzIHx8IG9wdHMuZW1pdEV2ZW50ICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy5lbWl0RXZlbnQoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0IHx8IHRoaXMuX2NhY2hlLnNsaWNlKCk7XG4gIH1cblxuICBkZWxldGUoaWQ6IElELCBvcHRzPzogeyBlbWl0RXZlbnQ/OiBib29sZWFuIH0pOiBUIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBzdGF0dXMgPSBpc05vdE5pbChpZCkgPyB0aGlzLl9zdGF0dXNCeUlkLmdldChpZCkgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgaW5kZXggPSBzdGF0dXMgPyBzdGF0dXMuaW5kZXggOiB1bmRlZmluZWQ7XG4gICAgaWYgKGlzTmlsKGluZGV4KSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IGVudGl0eSA9IHRoaXMuX2NhY2hlW2luZGV4XTtcbiAgICBpZiAoIWVudGl0eSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIC8vIFJlbW92ZSBmcm9tIGNhY2hlXG4gICAgdGhpcy5fY2FjaGVbaW5kZXhdID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX3N0YXR1c0J5SWQuZGVsZXRlKGVudGl0eS5pZCk7XG5cbiAgICAvLyBSZW1vdmUgZnVsbCBlbnRpdHksIGJ5IGlkXG4gICAgaWYgKHRoaXMuaXNCeUlkTW9kZSkge1xuICAgICAgdGhpcy5zdG9yYWdlLnJlbW92ZSh0aGlzLl9zdG9yYWdlS2V5ICsgJyMnICsgaWQpO1xuICAgIH1cblxuICAgIC8vIE1hcmsgYXMgZGlydHlcbiAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG5cbiAgICAvLyBFbWl0IHVwZGF0ZSBldmVudFxuICAgIGlmICghb3B0cyB8fCBvcHRzLmVtaXRFdmVudCAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuZW1pdEV2ZW50KCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVudGl0eSBhcyBUO1xuICB9XG5cbiAgZGVsZXRlTWFueShpZHM6IElEW10sIG9wdHM/OiB7ZW1pdEV2ZW50PzogYm9vbGVhbn0pOiBUW10ge1xuXG4gICAgLy8gRGVsZXRlIGJ5IGlkLCBidXQgTk9UIGVtaXQgZXZlbnQgb24gZWFjaCBkZWxldGlvblxuICAgIGNvbnN0IGRlbGV0ZWRFbnRpdGllcyA9IChpZHMgfHwgW10pXG4gICAgICAubWFwKGlkID0+IHRoaXMuZGVsZXRlKGlkLCB7ZW1pdEV2ZW50OiBmYWxzZX0pKVxuICAgICAgLmZpbHRlcihpc05vdE5pbCk7XG5cbiAgICAvLyBObyBjaGFuZ2VzOiBleGl0XG4gICAgaWYgKCFkZWxldGVkRW50aXRpZXMubGVuZ3RoKSByZXR1cm4gW107XG5cbiAgICAvLyBFbWl0IHVwZGF0ZSBldmVudFxuICAgIGlmICghb3B0cyB8fCBvcHRzLmVtaXRFdmVudCAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuZW1pdEV2ZW50KCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlbGV0ZWRFbnRpdGllcztcbiAgfVxuXG4gIHJlc2V0KG9wdHM/OiB7ZW1pdEV2ZW50PzogYm9vbGVhbn0pIHtcbiAgICB0aGlzLl9jYWNoZSA9IFtdO1xuICAgIHRoaXMuX3NlcXVlbmNlID0gMDtcbiAgICB0aGlzLl9zdGF0dXNCeUlkID0gbmV3IE1hcDxJRCwgYW55PigpO1xuXG4gICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgIHRoaXMuX2xvYWRlZCA9IHRydWU7XG5cbiAgICAvLyBFbWl0IHVwZGF0ZSBldmVudFxuICAgIGlmICghb3B0cyB8fCBvcHRzLmVtaXRFdmVudCAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuZW1pdEV2ZW50KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBvcHRzXG4gICAqICBvcHRzLnNraXBJZlByaXN0aW5lID0gZmFsc2UgcGVyc2lzdCBhbGwgZW50aXRpZXMsIGV2ZW4gaWYgbm90IGRpcnR5XG4gICAqL1xuICBhc3luYyBwZXJzaXN0KG9wdHMgPSB7IHNraXBJZlByaXN0aW5lOiB0cnVlIH0pOiBQcm9taXNlPG51bWJlcj4ge1xuXG4gICAgLy8gU2tpcCBpcyBub3QgZGlydHlcbiAgICBpZiAob3B0cy5za2lwSWZQcmlzdGluZSAmJiAhdGhpcy5fZGlydHkpIHtcbiAgICAgIGNvbnNvbGUuZGVidWcoYFtlbnRpdHktc3RvcmFnZV0gUGVyc2lzdGluZyAke3RoaXMubmFtZX0gbm90IG5lZWQuIFNraXBgKTtcbiAgICAgIHJldHVybiB0aGlzLl9jYWNoZS5sZW5ndGg7XG4gICAgfVxuXG4gICAgLy8gQ29weSBzb21lIGRhdGEsIEJFRk9SRSB0byBjYWxsIG1hcmtBc1ByaXN0aW5lKCkgdG8gYWxsb3cgcGFyYWxsZWwgY2hhbmdlc1xuICAgIGNvbnN0IGRpcnR5SW5kZXhlcyA9IHRoaXMuaXNCeUlkTW9kZSAmJiBBcnJheS5mcm9tKHRoaXMuX3N0YXR1c0J5SWQudmFsdWVzKCkpXG4gICAgICAuZmlsdGVyKHMgPT4gIW9wdHMuc2tpcElmUHJpc3RpbmUgfHwgKHMgJiYgcy5kaXJ0eSkpXG4gICAgICAubWFwKHMgPT4gcy5pbmRleCk7XG4gICAgY29uc3QgZW50aXRpZXMgPSB0aGlzLl9jYWNoZS5zbGljZSgpOyAvLyBDb3B5IGNhY2hlZCBlbnRpdGllc1xuXG4gICAgLy8gTWFyayBhbGwgKGVudGl0aWVzIGFuZCBzdGF0dXMpIGFzIHByaXN0aW5lXG4gICAgdGhpcy5tYXJrQXNQcmlzdGluZSh7ZW1pdEV2ZW50OiBmYWxzZX0pO1xuXG4gICAgLy8gQ29udmVydCBkaXJ0eSBlbnRpdGllcyBpbnRvIGxpZ2h0IGVudGl0aWVzICgvIVxcIEFGVEVSIHRoZSBwcmV2aW91cyBjb3B5KVxuICAgIC8vIGFuZCB1cGRhdGUgdGhlIGNhY2hlIChidXQgTk9UIHRoZSAnZW50aXRpZXMnIHZhcmlhYmxlKVxuICAgIGlmIChkaXJ0eUluZGV4ZXMgJiYgdGhpcy5fbWFwVG9MaWdodEVudGl0eSkge1xuICAgICAgZGlydHlJbmRleGVzLmZvckVhY2goaW5kZXggPT4gdGhpcy5fY2FjaGVbaW5kZXhdID0gdGhpcy5fbWFwVG9MaWdodEVudGl0eShlbnRpdGllc1tpbmRleF0pKTtcbiAgICB9XG5cbiAgICAvLyBJZiBubyBlbnRpdHkgZm91bmRcbiAgICBpZiAoaXNFbXB0eUFycmF5KGVudGl0aWVzKSkge1xuXG4gICAgICAvLyBDbGVhbiB0aGUgbG9jYWwgc3RvcmFnZVxuICAgICAgYXdhaXQgdGhpcy5zdG9yYWdlLnJlbW92ZSh0aGlzLl9zdG9yYWdlS2V5KTtcbiAgICB9XG4gICAgZWxzZSB7XG5cbiAgICAgIC8vIFNhdmUgZWFjaCBlbnRpdHkgaW50byBhIHVuaXF1ZSBrZXkgKGFkdmFuY2VkIG1vZGUpXG4gICAgICBpZiAodGhpcy5pc0J5SWRNb2RlKSB7XG4gICAgICAgIC8vIFNhdmUgaWRzXG4gICAgICAgIGF3YWl0IHRoaXMuc3RvcmFnZS5zZXQodGhpcy5zdG9yYWdlS2V5QnlJZCwgZW50aXRpZXMuZmlsdGVyKGlzTm90TmlsKS5tYXAoZSA9PiBlLmlkKSk7XG5cbiAgICAgICAgLy8gU2F2ZWQgZGlydHkgZW50aXRpZXNcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgZGlydHlJbmRleGVzXG4gICAgICAgICAgICAubWFwKGluZGV4ID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgZW50aXR5ID0gZW50aXRpZXNbaW5kZXhdO1xuICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKGBbZW50aXR5LXN0b3JhZ2VdIFBlcnNpc3RpbmcgJHt0aGlzLm5hbWV9IyR7ZW50aXR5LmlkfS4uLmApO1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zdG9yYWdlLnNldCh0aGlzLl9zdG9yYWdlS2V5ICsgJyMnICsgZW50aXR5LmlkLCBlbnRpdHkpO1xuICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgIGNvbnNvbGUuaW5mbyhgW2VudGl0eS1zdG9yYWdlXSBQZXJzaXN0aW5nICR7ZGlydHlJbmRleGVzLmxlbmd0aH0vJHtlbnRpdGllcy5sZW5ndGh9ICR7dGhpcy5uYW1lfShzKS4uLmApO1xuICAgICAgfVxuXG4gICAgICAvLyBTYXZlIGFsbCBlbnRpdGllcyBpbiBhIHNpbmdsZSBrZXkgKGRlZmF1bHQpXG4gICAgICBlbHNlIHtcblxuICAgICAgICBjb25zb2xlLmluZm8oYFtlbnRpdHktc3RvcmFnZV0gUGVyc2lzdGluZyAke2VudGl0aWVzLmxlbmd0aH0gJHt0aGlzLm5hbWV9KHMpLi4uYCk7XG4gICAgICAgIGF3YWl0IHRoaXMuc3RvcmFnZS5zZXQodGhpcy5fc3RvcmFnZUtleSwgZW50aXRpZXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBlbnRpdGllcy5sZW5ndGg7XG4gIH1cblxuICBhc3luYyByZXN0b3JlKG9wdHM/OiB7IGVtaXRFdmVudD86IGJvb2xlYW4gfSk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgbGV0IGVudGl0aWVzOiBUW107XG5cbiAgICBjb25zdCByZXMgPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICB0aGlzLnN0b3JhZ2UuZ2V0KHRoaXMuX3N0b3JhZ2VLZXkpLFxuICAgICAgdGhpcy5zdG9yYWdlLmdldCh0aGlzLnN0b3JhZ2VLZXlCeUlkKVxuICAgIF0pO1xuICAgIGNvbnN0IHZhbHVlcyA9IHJlc1swXSAmJiBBcnJheS5pc0FycmF5KHJlc1swXSkgPyByZXNbMF0gOiBudWxsO1xuICAgIGNvbnN0IGlkcyA9IHJlc1sxXSAmJiBBcnJheS5pc0FycmF5KHJlc1sxXSkgPyByZXNbMV0gOiBudWxsO1xuICAgIGxldCBtaWdyYXRpb24gPSBmYWxzZTtcbiAgICBsZXQgb2xkS2V5c1RvQ2xlYW46IHN0cmluZ1tdO1xuXG4gICAgLy8gXCJTcGxpdCBieSBpZFwiIG1vZGVcbiAgICBpZiAodGhpcy5pc0J5SWRNb2RlKSB7XG4gICAgICBpZiAoaXNOb3ROaWwoaWRzKSkge1xuICAgICAgICAvLyBMb2FkIGVudGl0eSBieSBpZCAob25lIGJ5IG9uZSlcbiAgICAgICAgY29uc3Qgc3RvcmFnZUtleXMgPSBpZHMubWFwKGlkID0+IHRoaXMuX3N0b3JhZ2VLZXkgKyAnIycgKyBpZCk7XG4gICAgICAgIGVudGl0aWVzID0gYXdhaXQgY2hhaW5Qcm9taXNlczxUPihzdG9yYWdlS2V5cy5tYXAoa2V5ID0+ICgpID0+IHRoaXMuc3RvcmFnZS5nZXQoa2V5KSkpO1xuICAgICAgfVxuICAgICAgLy8gTWlncmF0ZSBmcm9tIHRoZSBzdGFuZGFyZCBtb2RlXG4gICAgICBlbHNlIGlmIChpc05vdE5pbCh2YWx1ZXMpKSB7XG4gICAgICAgIGVudGl0aWVzID0gdmFsdWVzLmZpbHRlcihlID0+IGUgJiYgaXNOb3ROaWwoZS5pZCkpO1xuICAgICAgICBtaWdyYXRpb24gPSB0cnVlO1xuICAgICAgICBvbGRLZXlzVG9DbGVhbiA9IFt0aGlzLl9zdG9yYWdlS2V5XTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBFbHNlIChkZWZhdWx0IG1vZGUpXG4gICAgZWxzZSB7XG4gICAgICBpZiAoaXNOb3ROaWwodmFsdWVzKSkge1xuICAgICAgICBlbnRpdGllcyA9IHZhbHVlcy5maWx0ZXIoZSA9PiBlICYmIGlzTm90TmlsKGUuaWQpKTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKGlzTm90TmlsKGlkcykpIHtcbiAgICAgICAgY29uc3Qgc3RvcmFnZUtleXMgPSBpZHMubWFwKGlkID0+IHRoaXMuX3N0b3JhZ2VLZXkgKyAnIycgKyBpZCk7XG4gICAgICAgIC8vIExvYWQgZW50aXR5IGJ5IGlkIChvbmUgYnkgb25lKVxuICAgICAgICBlbnRpdGllcyA9IGF3YWl0IGNoYWluUHJvbWlzZXM8VD4oc3RvcmFnZUtleXMubWFwKGtleSA9PiAoKSA9PiB0aGlzLnN0b3JhZ2UuZ2V0KGtleSkpKTtcbiAgICAgICAgbWlncmF0aW9uID0gdHJ1ZTtcbiAgICAgICAgb2xkS2V5c1RvQ2xlYW4gPSBbLi4uc3RvcmFnZUtleXMsIHRoaXMuc3RvcmFnZUtleUJ5SWRdO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIE9LLCB0aGVyZSBpcyBzb21ldGhpbmcgaW4gc3RvcmFnZS4uLlxuICAgIGlmIChpc05vdEVtcHR5QXJyYXkoZW50aXRpZXMpKSB7XG4gICAgICBpZiAoZW50aXRpZXMubGVuZ3RoID49IDEwMDApIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBbZW50aXR5LXN0b3JhZ2VdIC0gUmVzdG9yaW5nICR7ZW50aXRpZXMubGVuZ3RofSAke3RoaXMubmFtZX0uIENoZWNrIGlmIG5vdCB0b28gbWFueSBlbGVtZW50cz8hYCk7XG4gICAgICB9XG5cbiAgICAgIC8vIE1hcCBlbnRpdGllcyBpbnRvIGxpZ2h0IGVsZW1lbnQgKGlmIGlmIG5vdCBuZWVkIHRvIHBlcnNpc3QsIGJlY2F1c2Ugb2YgbWlncmF0aW9uXG4gICAgICBpZiAodGhpcy5fbWFwVG9MaWdodEVudGl0eSAmJiAhbWlncmF0aW9uKSB7XG4gICAgICAgIGVudGl0aWVzID0gZW50aXRpZXMubWFwKHRoaXMuX21hcFRvTGlnaHRFbnRpdHkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc2V0RW50aXRpZXMoZW50aXRpZXMgfHwgW10sIHsuLi5vcHRzLCBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIHRoaXMuX2RpcnR5ID0gZmFsc2U7XG5cbiAgICAvLyBGaW5pc2ggdGhlIG1pZ3JhdGlvblxuICAgIGlmIChtaWdyYXRpb24pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgW2VudGl0eS1zdG9yYWdlXSAtIE1pZ3JhdGUgJHt0aGlzLm5hbWV9IGludG8ge21vZGU6ICcke3RoaXMucG9saWN5Lm1vZGV9J30uLi5gKTtcblxuICAgICAgICAvLyBGb3JjZSB0byBwZXJzaXN0LCB1c2luZyB0aGUgbmV3IG1vZGVcbiAgICAgICAgYXdhaXQgdGhpcy5wZXJzaXN0KHtza2lwSWZQcmlzdGluZTogZmFsc2UgLyogZm9yY2UgcGVyc2lzdCB1c2luZyB0aGUgbmV3IG1vZGUgKi8gfSk7XG5cbiAgICAgICAgLy8gQ2xlYW4gb2xkIHN0b3JhZ2Uga2V5cyAob25lIGJ5IG9uZSlcbiAgICAgICAgaWYgKGlzTm90RW1wdHlBcnJheShvbGRLZXlzVG9DbGVhbikpIGF3YWl0IGNoYWluUHJvbWlzZXMob2xkS2V5c1RvQ2xlYW4ubWFwKGtleSA9PiAoKSA9PiB0aGlzLnN0b3JhZ2UucmVtb3ZlKGtleSkpKTtcbiAgICAgIH1cbiAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgICB0aHJvdyB7Y29kZTogRXJyb3JDb2Rlcy5FTlRJVFlfU1RPUkFHRV9NSUdSQVRJT05fRkFJTEVELCBtZXNzYWdlOiAnRVJST1IuRU5USVRZX1NUT1JBR0VfTUlHUkFUSU9OX0ZBSUxFRCcsIGRldGFpbHM6IGVycn07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRW1pdCB1cGRhdGUgZXZlbnRcbiAgICBpZiAoIW9wdHMgfHwgb3B0cy5lbWl0RXZlbnQgIT09IGZhbHNlKSB7XG4gICAgICB0aGlzLmVtaXRFdmVudCgpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9jYWNoZS5sZW5ndGg7XG4gIH1cblxuICBtYXJrQXNEaXJ0eShvcHRzPzogeyBlbWl0RXZlbnQ/OiBib29sZWFuIH0pIHtcbiAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG5cbiAgICAvLyBFbWl0IHVwZGF0ZSBldmVudFxuICAgIGlmICghb3B0cyB8fCBvcHRzLmVtaXRFdmVudCAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuZW1pdEV2ZW50KCk7XG4gICAgfVxuICB9XG5cbiAgbWFya0FzUHJpc3RpbmUob3B0cz86IHsgZW1pdEV2ZW50PzogYm9vbGVhbiB9KSB7XG5cbiAgICBmb3IgKGNvbnN0IHMgb2YgdGhpcy5fc3RhdHVzQnlJZC52YWx1ZXMoKSkge1xuICAgICAgaWYgKGlzTm90TmlsKHMpKSB7XG4gICAgICAgIHMuZGlydHkgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fZGlydHkgPSBmYWxzZTtcblxuICAgIC8vIEVtaXQgdXBkYXRlIGV2ZW50XG4gICAgaWYgKCFvcHRzIHx8IG9wdHMuZW1pdEV2ZW50ICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy5lbWl0RXZlbnQoKTtcbiAgICB9XG4gIH1cblxuICAvKiAtLSBwcm90ZWN0ZWQgbWV0aG9kcyAtLSAqL1xuXG4gIHByaXZhdGUgbG9hZENhY2hlZEVudGl0eShpZDogSUQsIG9wdHM/OiBFbnRpdHlTdG9yYWdlTG9hZE9wdGlvbnMpOiBUIHtcbiAgICBjb25zdCBzdGF0dXMgPSB0aGlzLl9zdGF0dXNCeUlkLmdldChpZCk7XG4gICAgY29uc3QgaW5kZXggPSBzdGF0dXMgJiYgc3RhdHVzLmluZGV4O1xuICAgIGlmIChpc05pbChpbmRleCkpIHJldHVybiB1bmRlZmluZWQ7IC8vIG5vdCBleGlzdHNcbiAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh0aGlzLl9jYWNoZVtpbmRleF0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBsb2FkRnVsbEVudGl0eShpZDogSUQsIG9wdHM/OiBFbnRpdHlTdG9yYWdlTG9hZE9wdGlvbnMpOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCBzdGF0dXMgPSB0aGlzLl9zdGF0dXNCeUlkLmdldChpZCk7XG4gICAgY29uc3QgaW5kZXggPSBzdGF0dXMgJiYgc3RhdHVzLmluZGV4O1xuICAgIGlmIChpc05pbChpbmRleCkpIHJldHVybiB1bmRlZmluZWQ7IC8vIG5vdCBleGlzdHNcblxuICAgIC8vIFJlbG9hZCBmcm9tIHN0b3JhZ2UsIGlmIG5lZWQgKGUuZy4gc29tZSBhdHRyaWJ1dGVzIGhhcyBiZWVuIGV4Y2x1ZGVkIGluIGxpZ2h0IGVsZW1lbnRzKVxuICAgIGlmIChzdGF0dXMuZGlydHkgPT09IGZhbHNlKSB7XG4gICAgICBjb25zb2xlLmRlYnVnKGBbZW50aXR5LXN0b3JhZ2VdIEZ1bGwgcmVsb2FkaW5nICR7dGhpcy5uYW1lfSMke2lkfS4uLmApO1xuICAgICAgY29uc3QgZnVsbERhdGEgPSBhd2FpdCB0aGlzLnN0b3JhZ2UuZ2V0KHRoaXMuX3N0b3JhZ2VLZXkgKyAnIycgKyBpZCk7XG4gICAgICBpZiAoZnVsbERhdGEpIHJldHVybiBmdWxsRGF0YTtcbiAgICAgIC8vIE5vdCBmb3VuZCBieSBpZCwgY29udGludWUgZnJvbSBjYWNoZSAodmVyc2lvbiBwcmlvciB0byAxLjUuMylcbiAgICB9XG5cbiAgICAvLyBMb2FkIGZyb20gdGhlIGNhY2hlLCBpZiBkaXJ0eSBPUiBpZiBzdG9yYWdlIGlzIG5vdCBzcGxpdGVkIGJ5IGlkXG4gICAgcmV0dXJuIHRoaXMuX2NhY2hlW2luZGV4XTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0RW50aXRpZXMoZW50aXRpZXM6IFRbXSwgb3B0cz86IHtlbWl0RXZlbnQ/OiBib29sZWFuIH0pIHtcbiAgICAvLyBGaWx0ZXIgbm9uIG5pbCAoYW5kIGlmIG5lZWQgbm9uIGxvY2FsKSBlbnRpdGllc1xuICAgIGVudGl0aWVzID0gKGVudGl0aWVzIHx8IFtdKVxuICAgICAgICAuZmlsdGVyKGl0ZW0gPT4gaXNOb3ROaWwoaXRlbSlcbiAgICAgICAgICAmJiAoIXRoaXMucG9saWN5LnNraXBOb25Mb2NhbEVudGl0aWVzIHx8ICtpdGVtLmlkIDwgMClcbiAgICAgICAgKTtcblxuICAgIHRoaXMuX2NhY2hlID0gZW50aXRpZXM7XG5cbiAgICAvLyBVcGRhdGUgdGhlIHNlcXVlbmNlIHdpdGggbWluKGlkKSBvZiBhbGwgdGVtcG9yYXJ5IGlkc1xuICAgIHRoaXMuX3NlcXVlbmNlID0gdGhpcy5fY2FjaGUucmVkdWNlKChyZXMsIGl0ZW0pID0+ICtpdGVtLmlkIDwgMCA/IE1hdGgubWluKHJlcywgK2l0ZW0uaWQpIDogcmVzLCAwKTtcblxuICAgIHRoaXMuX3N0YXR1c0J5SWQuY2xlYXIoKTtcbiAgICB0aGlzLl9jYWNoZS5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgdGhpcy5fc3RhdHVzQnlJZC5zZXQoaXRlbS5pZCwgPEVudGl0eVN0YXR1cz57XG4gICAgICAgIGluZGV4LFxuICAgICAgICBkaXJ0eTogZmFsc2VcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgdGhpcy5fbG9hZGVkID0gdHJ1ZTtcblxuICAgIC8vIEVtaXQgdXBkYXRlIGV2ZW50XG4gICAgaWYgKCFvcHRzIHx8IG9wdHMuZW1pdEV2ZW50ICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy5lbWl0RXZlbnQoKTtcbiAgICB9XG4gIH1cblxuXG4gIC8qKlxuICAgKiBXSWxsIGFwcGx5IGEgZmlsdGVyLCB0aGVuIGEgc29ydCwgdGhlbiBhIHBhZ2Ugc2xpY2VcbiAgICpcbiAgICogQHBhcmFtIGRhdGFcbiAgICogQHBhcmFtIHZhcmlhYmxlc1xuICAgKi9cbiAgcHJpdmF0ZSByZWR1Y2VBbmRTb3J0KGRhdGE6IFRbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ/OiBudW1iZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU/OiBudW1iZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRCeT86IHN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc29ydERpcmVjdGlvbj86IHN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyPzogKFQpID0+IGJvb2xlYW47XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTogTG9hZFJlc3VsdDxUPiB7XG4gICAgaWYgKGlzRW1wdHlBcnJheShkYXRhKSkge1xuICAgICAgcmV0dXJuIHtkYXRhOiBbXSwgdG90YWw6IDB9O1xuICAgIH1cblxuICAgIC8vIFJlbW92ZSBuaWwgdmFsdWVzXG4gICAgZGF0YSA9IGRhdGEuZmlsdGVyKGlzTm90TmlsKTtcblxuICAgIGlmICghdmFyaWFibGVzKSB7XG4gICAgICAvLyBSZXR1cm4gYWxsIChidXQgYXJyYXkgaGFzIGJlZW4gZmlsdGVyZWQsIGFuZCBjb3BpZWQpXG4gICAgICByZXR1cm4ge2RhdGEsIHRvdGFsOiBkYXRhLmxlbmd0aH07XG4gICAgfVxuXG4gICAgLy8gQXBwbHkgdGhlIGZpbHRlciwgaWYgYW55XG4gICAgaWYgKHZhcmlhYmxlcy5maWx0ZXIpIHtcbiAgICAgIGRhdGEgPSBkYXRhLmZpbHRlcih2YXJpYWJsZXMuZmlsdGVyKTtcbiAgICB9XG5cbiAgICAvLyBDb21wdXRlIHRoZSB0b3RhbCBsZW5ndGhcbiAgICBjb25zdCB0b3RhbCA9IGRhdGEubGVuZ3RoO1xuXG4gICAgLy8gSWYgcGFnZSBzaXplPTAgKGUuZy4gb25seSBuZWVkIHRvdGFsKVxuICAgIGlmICh2YXJpYWJsZXMuc2l6ZSA9PT0gMCkgcmV0dXJuIHtkYXRhOiBbXSwgdG90YWx9O1xuXG4gICAgLy8gU29ydCBieVxuICAgIGlmICh2YXJpYWJsZXMuc29ydEJ5KSB7XG4gICAgICBFbnRpdHlVdGlscy5zb3J0KGRhdGEsIHZhcmlhYmxlcy5zb3J0QnksIHZhcmlhYmxlcy5zb3J0RGlyZWN0aW9uKTtcbiAgICB9XG5cbiAgICAvLyBTbGljZSBpbiBhIHBhZ2UgKHVzaW5nIG9mZnNldCBhbmQgc2l6ZSlcbiAgICBpZiAodmFyaWFibGVzLm9mZnNldCA+IDApIHtcblxuICAgICAgLy8gT2Zmc2V0IGFmdGVyIHRoZSBlbmQ6IG5vIHJlc3VsdFxuICAgICAgaWYgKHZhcmlhYmxlcy5vZmZzZXQgPj0gZGF0YS5sZW5ndGggfHwgdmFyaWFibGVzLnNpemUgPT09IDApIHtcbiAgICAgICAgZGF0YSA9IFtdO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIGRhdGEgPSAodmFyaWFibGVzLnNpemUgPiAwICYmICgodmFyaWFibGVzLm9mZnNldCArIHZhcmlhYmxlcy5zaXplKSA8IGRhdGEubGVuZ3RoKSkgP1xuICAgICAgICAgIC8vIFNsaWNlIHVzaW5nIGxpbWl0IHRvIHNpemVcbiAgICAgICAgICBkYXRhLnNsaWNlKHZhcmlhYmxlcy5vZmZzZXQsIHZhcmlhYmxlcy5vZmZzZXQgKyB2YXJpYWJsZXMuc2l6ZSkgOlxuICAgICAgICAgIC8vIFNsaWNlIHdpdGhvdXQgbGltaXRcbiAgICAgICAgICBkYXRhLnNsaWNlKHZhcmlhYmxlcy5vZmZzZXQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFwcGx5IGEgbGltaXRcbiAgICBlbHNlIGlmICh2YXJpYWJsZXMuc2l6ZSA+IDApe1xuICAgICAgZGF0YSA9IGRhdGEuc2xpY2UoMCwgdmFyaWFibGVzLnNpemUpO1xuICAgIH1cbiAgICAvLyBObyBsaW1pdDpcbiAgICBlbHNlIGlmICh2YXJpYWJsZXMuc2l6ZSA9PT0gLTEpe1xuICAgICAgLy8gS2VlcCBhbGwgZGF0YVxuICAgIH1cblxuICAgIHJldHVybiB7ZGF0YSwgdG90YWx9O1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVMaWdodEVudGl0eU1hcEZuKHBvbGljeTogRW50aXR5U3RvcmVUeXBlUG9saWN5PFQ+KTogKFQpID0+IFQge1xuICAgIGlmIChwb2xpY3kubW9kZSAhPT0gJ2J5LWlkJykgcmV0dXJuIHVuZGVmaW5lZDsgLy8gT25seSBuZWVkIGZvciB0aGUgJ2J5LWlkJyBtb2RlXG4gICAgaWYgKGlzRW1wdHlBcnJheShwb2xpY3kubGlnaHRGaWVsZHNFeGNsdWRlcykpIHJldHVybiB1bmRlZmluZWQ7IC8vIHNraXBcblxuICAgIC8vIENyZWF0ZSBhIGltbXV0YWJsZSBtYXNrIG9iamVjdCwgdXNlIHRvIGNsZWFuIHNvbWUgcHJvcGVydGllc1xuICAgIGNvbnN0IGV4Y2x1ZGVBdHRyaWJ1dGVzTWFzayA9IE9iamVjdC5mcmVlemUodGhpcy5wb2xpY3kubGlnaHRGaWVsZHNFeGNsdWRlcy5yZWR1Y2UoKHJlcywgYXR0cikgPT4ge1xuICAgICAgcmVzW2F0dHJdID0gdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIHJlcztcbiAgICB9LCA8VD57fSkpO1xuXG4gICAgcmV0dXJuIChlbnRpdHkpID0+IGVudGl0eSA/IE9iamVjdC5hc3NpZ24oPFQ+e30sIGVudGl0eSwgZXhjbHVkZUF0dHJpYnV0ZXNNYXNrKSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgdGhlIGVudGl0aWVzU3ViamVjdC5cbiAgICpcbiAgICogQmVmb3JlIHdlbmRpbmcgaXRlbXMsIGEgZmlsdGVyIGlzIGFwcGx5LCB0byByZW1vdmUgbnVsbCB2YWx1ZS5cbiAgICogVGhpcyBmaWx0ZXIgd2lsbCBjcmVhdGUgYSBhcnJheSBjb3B5LlxuICAgKi9cbiAgcHJpdmF0ZSBlbWl0RXZlbnQoKSB7XG4gICAgdGhpcy5fb25DaGFuZ2UubmV4dCh0cnVlKTtcbiAgfVxufVxuIl19
|
|
467
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LXN0b3JlLmNsYXNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb3JlL3NlcnZpY2VzL3N0b3JhZ2UvZW50aXR5LXN0b3JlLmNsYXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsZUFBZSxFQUFhLE1BQU0sTUFBTSxDQUFDO0FBRWpELE9BQU8sRUFBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3JELE9BQU8sRUFBUyxXQUFXLEVBQVUsTUFBTSx1QkFBdUIsQ0FBQztBQUNuRSxPQUFPLEVBQUMsWUFBWSxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsUUFBUSxFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFFekYsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLDZCQUE2QixDQUFDO0FBQzFELE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFFckMsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQUcsVUFBVSxDQUFDO0FBbUJ0RCxNQUFNLE9BQU8sV0FBVztJQW9DdEIsWUFDcUIsSUFBWSxFQUNaLE9BQWdCLEVBQ25DLE1BQWlDO1FBRmQsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUNaLFlBQU8sR0FBUCxPQUFPLENBQVM7UUFoQ3BCLGNBQVMsR0FBRyxJQUFJLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUtoRCxXQUFNLEdBQUcsS0FBSyxDQUFDO1FBNkJyQixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sSUFBSSxFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFDO1FBQy9CLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxX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QkFBZ0I7U0FDakI7UUFFRCxPQUFPLEVBQUMsSUFBSSxFQUFFLEtBQUssRUFBQyxDQUFDO0lBQ3ZCLENBQUM7SUFFTyxzQkFBc0IsQ0FBQyxNQUFnQztRQUM3RCxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssT0FBTztZQUFFLE9BQU8sU0FBUyxDQUFDLENBQUMsaUNBQWlDO1FBQ2hGLElBQUksWUFBWSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQztZQUFFLE9BQU8sU0FBUyxDQUFDLENBQUMsT0FBTztRQUV2RSwrREFBK0Q7UUFDL0QsTUFBTSxxQkFBcUIsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFO1lBQy9GLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxTQUFTLENBQUM7WUFDdEIsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDLEVBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztRQUVYLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBSSxFQUFFLEVBQUUsTUFBTSxFQUFFLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUM5RixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxTQUFTO1FBQ2YsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDNUIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGV9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtTdG9yYWdlfSBmcm9tICdAaW9uaWMvc3RvcmFnZSc7XG5pbXBvcnQge2ZpbHRlciwgbWFwLCBtZXJnZU1hcH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtFbnRpdHksIEVudGl0eVV0aWxzLCBJRW50aXR5fSBmcm9tICcuLi9tb2RlbC9lbnRpdHkubW9kZWwnO1xuaW1wb3J0IHtpc0VtcHR5QXJyYXksIGlzTmlsLCBpc05vdEVtcHR5QXJyYXksIGlzTm90TmlsfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvZnVuY3Rpb25zJztcbmltcG9ydCB7SUVudGl0aWVzU2VydmljZSwgTG9hZFJlc3VsdH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL3NlcnZpY2VzL2VudGl0eS1zZXJ2aWNlLmNsYXNzJztcbmltcG9ydCB7Y2hhaW5Qcm9taXNlc30gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL29ic2VydmFibGVzJztcbmltcG9ydCB7RXJyb3JDb2Rlc30gZnJvbSAnLi4vZXJyb3JzJztcblxuZXhwb3J0IGNvbnN0IEVOVElUSUVTX1NUT1JBR0VfS0VZX1BSRUZJWCA9ICdlbnRpdGllcyc7XG5cbmV4cG9ydCB0eXBlIEVudGl0eVN0b3JlVHlwZVBvbGljeU1vZGUgPSAnZGVmYXVsdCcgfCAnYnktaWQnO1xuXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgRW50aXR5U3RvcmVUeXBlUG9saWN5PFQgZXh0ZW5kcyBFbnRpdHk8VCwgYW55PiA9IEVudGl0eTxhbnksIGFueT4sIEsgPSBrZXlvZiBUPiAge1xuICBtb2RlPzogRW50aXR5U3RvcmVUeXBlUG9saWN5TW9kZTsgLy8gJ2RlZmF1bHQnIGJ5IGRlZmF1bHRcbiAgc2tpcE5vbkxvY2FsRW50aXRpZXM/OiBib29sZWFuOyAvLyBGYWxzZSBieSBkZWZhdWx0XG4gIGxpZ2h0RmllbGRzRXhjbHVkZXM/OiBLW107IC8vIG5vbmUgYnkgZGVmYXVsdFxufVxuXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgRW50aXR5U3RvcmFnZUxvYWRPcHRpb25zIHtcbiAgZnVsbExvYWQ/OiBib29sZWFuO1xufVxuXG5kZWNsYXJlIGludGVyZmFjZSBFbnRpdHlTdGF0dXMge1xuICBpbmRleDogbnVtYmVyO1xuICBkaXJ0eT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjbGFzcyBFbnRpdHlTdG9yZTxcbiAgVCBleHRlbmRzIElFbnRpdHk8VCwgSUQ+LFxuICBJRCA9IG51bWJlcixcbiAgTyBleHRlbmRzIEVudGl0eVN0b3JhZ2VMb2FkT3B0aW9ucyA9IEVudGl0eVN0b3JhZ2VMb2FkT3B0aW9ucz4ge1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX3N0b3JhZ2VLZXk6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBfb25DaGFuZ2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfbWFwVG9MaWdodEVudGl0eTogKFQpID0+IFQ7XG4gIHByaXZhdGUgX2NhY2hlOiBUW107XG4gIHByaXZhdGUgX3N0YXR1c0J5SWQ6IE1hcDxJRCwgRW50aXR5U3RhdHVzPjtcbiAgcHJpdmF0ZSBfc2VxdWVuY2U6IG51bWJlcjtcbiAgcHJpdmF0ZSBfZGlydHkgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfbG9hZGVkOiBib29sZWFuO1xuXG4gIHJlYWRvbmx5IHBvbGljeTogRW50aXR5U3RvcmVUeXBlUG9saWN5PFQ+O1xuXG4gIGdldCBsZW5ndGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fY2FjaGU/Lmxlbmd0aCB8fCAwO1xuICB9XG5cbiAgZ2V0IGNhY2hlKCk6IFRbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2NhY2hlO1xuICB9XG5cbiAgZ2V0IGRpcnR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9kaXJ0eTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgaXNCeUlkTW9kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5wb2xpY3kubW9kZSA9PT0gJ2J5LWlkJztcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgc3RvcmFnZUtleUJ5SWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc3RvcmFnZUtleSArICcjaWRzJztcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCByZWFkb25seSBuYW1lOiBzdHJpbmcsXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHN0b3JhZ2U6IFN0b3JhZ2UsXG4gICAgcG9saWN5PzogRW50aXR5U3RvcmVUeXBlUG9saWN5PFQ+KSB7XG4gICAgdGhpcy5wb2xpY3kgPSBwb2xpY3kgfHwge307XG4gICAgdGhpcy5yZXNldCh7ZW1pdEV2ZW50OiBmYWxzZX0pO1xuICAgIHRoaXMuX2RpcnR5ID0gZmFsc2U7XG4gICAgdGhpcy5fbG9hZGVkID0gZmFsc2U7XG4gICAgdGhpcy5fc3RvcmFnZUtleSA9IEVOVElUSUVTX1NUT1JBR0VfS0VZX1BSRUZJWCArICcjJyArIG5hbWU7XG4gICAgdGhpcy5fbWFwVG9MaWdodEVudGl0eSA9IHRoaXMuY3JlYXRlTGlnaHRFbnRpdHlNYXBGbih0aGlzLnBvbGljeSk7XG4gIH1cblxuICBuZXh0VmFsdWUoKTogSUQge1xuICAgIHRoaXMuX3NlcXVlbmNlID0gdGhpcy5fc2VxdWVuY2UgLSAxO1xuICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcy5fc2VxdWVuY2UgYXMgdW5rbm93biBhcyBJRDtcbiAgfVxuXG4gIGN1cnJlbnRWYWx1ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9zZXF1ZW5jZTtcbiAgfVxuXG4gIGFzeW5jIGxvYWQoaWQ6IElELCBvcHRzPzogRW50aXR5U3RvcmFnZUxvYWRPcHRpb25zKTogUHJvbWlzZTxUPiB7XG4gICAgaWYgKHRoaXMuX21hcFRvTGlnaHRFbnRpdHkgJiYgKCFvcHRzIHx8IG9wdHMuZnVsbExvYWQgIT09IGZhbHNlKSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubG9hZEZ1bGxFbnRpdHkoaWQsIG9wdHMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5sb2FkQ2FjaGVkRW50aXR5KGlkLCBvcHRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXYXRjaCBhIHNldCBvZiBlbnRpdGllc1xuICAgKlxuICAgKiBAcGFyYW0gdmFyaWFibGVzXG4gICAqIEBwYXJhbSBvcHRzXG4gICAqL1xuICB3YXRjaEFsbCh2YXJpYWJsZXM6IHtcbiAgICAgICAgICAgIG9mZnNldD86IG51bWJlcjtcbiAgICAgICAgICAgIHNpemU/OiBudW1iZXI7XG4gICAgICAgICAgICBzb3J0Qnk/OiBzdHJpbmc7XG4gICAgICAgICAgICBzb3J0RGlyZWN0aW9uPzogc3RyaW5nO1xuICAgICAgICAgICAgZmlsdGVyPzogKFQpID0+IGJvb2xlYW47XG4gICAgICAgICAgfSwgb3B0cz86IE8pOiBPYnNlcnZhYmxlPExvYWRSZXN1bHQ8VD4+IHtcblxuICAgIC8vIElmIG5lZWQgZnVsbCBlbnRpdGllcywgYnV0IHVzZSBsaWdodCBlbnRpdGllcyBpbiB0aGUgZW50aXRpZXMgYXJyYXlcbiAgICBpZiAodGhpcy5fbWFwVG9MaWdodEVudGl0eSAmJiAob3B0cyAmJiBvcHRzLmZ1bGxMb2FkID09PSB0cnVlKSkge1xuICAgICAgY29uc29sZS53YXJuKCdbZW50aXR5LXN0b3JlXSBXQVJOOiBXYXRjaGluZyBmdWxsIGVudGl0aWVzLCBzcGxpdGVkIGJ5IGlkIGluIGVudGl0eSBzdG9yZS4gVGhpcyBjYW4gYmUgbG9uZyEgUGxlYXNlIG1ha2Ugc3VyZSB5b3UgbmVlZCBmdWxsIGVudGl0aWVzIGhlcmUuJyk7XG4gICAgICByZXR1cm4gdGhpcy5fb25DaGFuZ2VcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgLy8gV2FpdCBkYXRhIGxvYWRlZFxuICAgICAgICAgIGZpbHRlcihfID0+IHRoaXMuX2xvYWRlZCksXG4gICAgICAgICAgLy8gQXBwbHkgZmlsdGVyIGFuZCBzb3J0XG4gICAgICAgICAgbWFwKChfKSA9PiB0aGlzLnJlZHVjZUFuZFNvcnQodGhpcy5fY2FjaGUsIHZhcmlhYmxlcykpLFxuXG4gICAgICAgICAgLy8gVGhlbiBjb252ZXJ0IGludG8gZnVsbCBlbnRpdGllcyAodXNpbmcgcGFyYWxsZWwgam9icyAtIC8hXFwgY2FuIHVzZSBsb3Qgb2YgbWVtb3J5KVxuICAgICAgICAgIG1lcmdlTWFwKChyZXMpID0+IFByb21pc2UuYWxsKChyZXMuZGF0YSB8fCBbXSlcbiAgICAgICAgICAgIC5tYXAoZSA9PiB0aGlzLmxvYWRGdWxsRW50aXR5KGUuaWQsIG9wdHMpKSkudGhlbihkYXRhID0+ICh7XG4gICAgICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgICAgICB0b3RhbDogcmVzLnRvdGFsXG4gICAgICAgICAgICAgIH0pKVxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBMb2FkIHVzaW5nIGVudGl0aWVzIGFycmF5XG4gICAgcmV0dXJuIHRoaXMuX29uQ2hhbmdlXG4gICAgICAucGlwZShcbiAgICAgICAgLy8gV2FpdCBkYXRhIGxvYWRlZFxuICAgICAgICBmaWx0ZXIoXyA9PiB0aGlzLl9sb2FkZWQpLFxuICAgICAgICAvLyBBcHBseSBmaWx0ZXIgYW5kIHNvcnRcbiAgICAgICAgbWFwKChfKSA9PiB0aGlzLnJlZHVjZUFuZFNvcnQodGhpcy5fY2FjaGUsIHZhcmlhYmxlcykpXG4gICAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFdJbGwgYXBwbHkgYSBmaWx0ZXIsIHRoZW4gYSBzb3J0LCB0aGVuIGEgcGFnZSBzbGljZVxuICAgKlxuICAgKiBAcGFyYW0gdmFyaWFibGVzXG4gICAqIEBwYXJhbSBvcHRzXG4gICAqL1xuICBhc3luYyBsb2FkQWxsKHZhcmlhYmxlczoge1xuICAgIG9mZnNldD86IG51bWJlcjtcbiAgICBzaXplPzogbnVtYmVyO1xuICAgIHNvcnRCeT86IHN0cmluZztcbiAgICBzb3J0RGlyZWN0aW9uPzogc3RyaW5nO1xuICAgIGZpbHRlcj86IChUKSA9PiBib29sZWFuO1xuICB9LCBvcHRzPzogTyk6IFByb21pc2U8TG9hZFJlc3VsdDxUPj4ge1xuXG4gICAgY29uc3QgcmVzID0gdGhpcy5yZWR1Y2VBbmRTb3J0KHRoaXMuX2NhY2hlLCB2YXJpYWJsZXMpO1xuXG4gICAgLy8gSWYgc3RvcmUgYnkgSUQ6IG1ha2Ugc3VyZSB0byBmdWxsIHRoZSBmdWxsIGVudGl0aWVzXG4gICAgaWYgKHRoaXMuX21hcFRvTGlnaHRFbnRpdHkgJiYgaXNOb3RFbXB0eUFycmF5KHJlcy5kYXRhKSAmJiAob3B0cyAmJiBvcHRzLmZ1bGxMb2FkID09PSB0cnVlKSkge1xuICAgICAgLy8gTG9hZCBmdWxsIGVudGl0aWVzLCBvbmUgYnkgb25lXG4gICAgICByZXMuZGF0YSA9IGF3YWl0IGNoYWluUHJvbWlzZXMoKHJlcy5kYXRhIHx8IFtdKS5tYXAoZSA9PiAoKSA9PiB0aGlzLmxvYWQoZS5pZCkpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzIDtcbiAgfVxuXG4gIHNhdmUoZW50aXR5OiBULCBvcHRzPzoge2VtaXRFdmVudD86IGJvb2xlYW59KTogVCB7XG4gICAgY29uc3Qgc3RhdHVzID0gaXNOb3ROaWwoZW50aXR5LmlkKSAmJiB0aGlzLl9zdGF0dXNCeUlkLmdldChlbnRpdHkuaWQpIHx8IHtpbmRleDogdW5kZWZpbmVkfTtcbiAgICBjb25zdCBpc05ldyA9IGlzTmlsKHN0YXR1cy5pbmRleCk7XG4gICAgaWYgKGlzTmV3KSB7XG4gICAgICBpZiAoaXNOaWwoZW50aXR5LmlkKSkge1xuICAgICAgICBlbnRpdHkuaWQgPSB0aGlzLm5leHRWYWx1ZSgpO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoK2VudGl0eS5pZCA8IDAgJiYgK2VudGl0eS5pZCA+IHRoaXMuX3NlcXVlbmNlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignVHJ5aW5nIHRvIHNhdmUgYSBsb2NhbCBlbnRpdHkgd2l0aCBhbiBpZCA+IHNlcXVlbmNlLiBXaWxsIHJlcGxhY2UgaWQgYnkgc2VxdWVuY2UgbmV4dCB2YWx1ZScpO1xuICAgICAgICBlbnRpdHkuaWQgPSB0aGlzLm5leHRWYWx1ZSgpO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIC8vIE9LOiB1c2UgYSB2YWxpZCBpZCA6XG4gICAgICAgIC8vIC0gaWQgPj0gMCAoc2hvdWxkIGJlIGEgcmVtb3RlIGlkKVxuICAgICAgICAvLyAtIE9SIDwgc2VxdWVuY2UsIGFuZCBub3QgZXhpc3RzIGluIHRoZSBpbmRleCBtYXBcbiAgICAgIH1cblxuICAgICAgdGhpcy5fc3RhdHVzQnlJZC5zZXQoZW50aXR5LmlkLCBzdGF0dXMpO1xuICAgICAgc3RhdHVzLmluZGV4ID0gdGhpcy5fY2FjaGUucHVzaChlbnRpdHkpIC0gMTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLl9jYWNoZVtzdGF0dXMuaW5kZXhdID0gZW50aXR5O1xuICAgIH1cblxuICAgIC8vIE1hcmsgZW50aXR5IGFzIGRpcnR5XG4gICAgc3RhdHVzLmRpcnR5ID0gdHJ1ZTtcblxuICAgIC8vIE1hcmsgc3RvcmFnZSBhcyBkaXJ0eVxuICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcblxuICAgIC8vIEVtaXQgdXBkYXRlIGV2ZW50XG4gICAgaWYgKCFvcHRzIHx8IG9wdHMuZW1pdEV2ZW50ICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy5lbWl0RXZlbnQoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZW50aXR5O1xuICB9XG5cbiAgc2F2ZUFsbChlbnRpdGllczogVFtdLCBvcHRzPzogeyBlbWl0RXZlbnQ/OiBib29sZWFuOyByZXNldD86IGJvb2xlYW4gfSk6IFRbXSB7XG4gICAgaWYgKGlzRW1wdHlBcnJheShlbnRpdGllcykgJiYgKCFvcHRzIHx8IG9wdHMucmVzZXQgIT09IHRydWUpKSByZXR1cm4gZW50aXRpZXM7IC8vIFNraXAgKE5vdGhpbmcgdG8gc2F2ZSlcblxuICAgIGxldCByZXN1bHQ6IFRbXTtcblxuICAgIGNvbnNvbGUuaW5mbyhgW2VudGl0eS1zdG9yYWdlXSBTYXZpbmcgJHtlbnRpdGllcy5sZW5ndGh9ICR7dGhpcy5uYW1lfShzKWApO1xuXG4gICAgLy8gRmlyc3Qgc2F2ZSwgb3IgcmVzZXQgdXNpbmcgZ2l2ZW4gZW50aXRpZXNcbiAgICBpZiAoIXRoaXMuX2xvYWRlZCB8fCAhdGhpcy5fY2FjaGUgfHwgKG9wdHM/LnJlc2V0KSkge1xuICAgICAgdGhpcy5zZXRFbnRpdGllcyhlbnRpdGllcywge2VtaXRFdmVudDogZmFsc2V9KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICByZXN1bHQgPSBlbnRpdGllcy5tYXAoKGVudGl0eSkgPT4gdGhpcy5zYXZlKGVudGl0eSwge2VtaXRFdmVudDogZmFsc2V9KSk7XG4gICAgfVxuXG4gICAgLy8gTWFyayBhcyBkaXJ0eVxuICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcblxuICAgIC8vIEVtaXQgdXBkYXRlIGV2ZW50XG4gICAgaWYgKCFvcHRzIHx8IG9wdHMuZW1pdEV2ZW50ICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy5lbWl0RXZlbnQoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0IHx8IHRoaXMuX2NhY2hlLnNsaWNlKCk7XG4gIH1cblxuICBkZWxldGUoaWQ6IElELCBvcHRzPzogeyBlbWl0RXZlbnQ/OiBib29sZWFuIH0pOiBUIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBzdGF0dXMgPSBpc05vdE5pbChpZCkgPyB0aGlzLl9zdGF0dXNCeUlkLmdldChpZCkgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgaW5kZXggPSBzdGF0dXMgPyBzdGF0dXMuaW5kZXggOiB1bmRlZmluZWQ7XG4gICAgaWYgKGlzTmlsKGluZGV4KSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IGVudGl0eSA9IHRoaXMuX2NhY2hlW2luZGV4XTtcbiAgICBpZiAoIWVudGl0eSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIC8vIFJlbW92ZSBmcm9tIGNhY2hlXG4gICAgdGhpcy5fY2FjaGVbaW5kZXhdID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX3N0YXR1c0J5SWQuZGVsZXRlKGVudGl0eS5pZCk7XG5cbiAgICAvLyBSZW1vdmUgZnVsbCBlbnRpdHksIGJ5IGlkXG4gICAgaWYgKHRoaXMuaXNCeUlkTW9kZSkge1xuICAgICAgdGhpcy5zdG9yYWdlLnJlbW92ZSh0aGlzLl9zdG9yYWdlS2V5ICsgJyMnICsgaWQpO1xuICAgIH1cblxuICAgIC8vIE1hcmsgYXMgZGlydHlcbiAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG5cbiAgICAvLyBFbWl0IHVwZGF0ZSBldmVudFxuICAgIGlmICghb3B0cyB8fCBvcHRzLmVtaXRFdmVudCAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuZW1pdEV2ZW50KCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVudGl0eSBhcyBUO1xuICB9XG5cbiAgZGVsZXRlTWFueShpZHM6IElEW10sIG9wdHM/OiB7ZW1pdEV2ZW50PzogYm9vbGVhbn0pOiBUW10ge1xuXG4gICAgLy8gRGVsZXRlIGJ5IGlkLCBidXQgTk9UIGVtaXQgZXZlbnQgb24gZWFjaCBkZWxldGlvblxuICAgIGNvbnN0IGRlbGV0ZWRFbnRpdGllcyA9IChpZHMgfHwgW10pXG4gICAgICAubWFwKGlkID0+IHRoaXMuZGVsZXRlKGlkLCB7ZW1pdEV2ZW50OiBmYWxzZX0pKVxuICAgICAgLmZpbHRlcihpc05vdE5pbCk7XG5cbiAgICAvLyBObyBjaGFuZ2VzOiBleGl0XG4gICAgaWYgKCFkZWxldGVkRW50aXRpZXMubGVuZ3RoKSByZXR1cm4gW107XG5cbiAgICAvLyBFbWl0IHVwZGF0ZSBldmVudFxuICAgIGlmICghb3B0cyB8fCBvcHRzLmVtaXRFdmVudCAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuZW1pdEV2ZW50KCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlbGV0ZWRFbnRpdGllcztcbiAgfVxuXG4gIHJlc2V0KG9wdHM/OiB7ZW1pdEV2ZW50PzogYm9vbGVhbn0pIHtcbiAgICB0aGlzLl9jYWNoZSA9IFtdO1xuICAgIHRoaXMuX3NlcXVlbmNlID0gMDtcbiAgICB0aGlzLl9zdGF0dXNCeUlkID0gbmV3IE1hcDxJRCwgYW55PigpO1xuXG4gICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgIHRoaXMuX2xvYWRlZCA9IHRydWU7XG5cbiAgICAvLyBFbWl0IHVwZGF0ZSBldmVudFxuICAgIGlmICghb3B0cyB8fCBvcHRzLmVtaXRFdmVudCAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuZW1pdEV2ZW50KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBvcHRzXG4gICAqICBvcHRzLnNraXBJZlByaXN0aW5lID0gZmFsc2UgcGVyc2lzdCBhbGwgZW50aXRpZXMsIGV2ZW4gaWYgbm90IGRpcnR5XG4gICAqL1xuICBhc3luYyBwZXJzaXN0KG9wdHMgPSB7IHNraXBJZlByaXN0aW5lOiB0cnVlIH0pOiBQcm9taXNlPG51bWJlcj4ge1xuXG4gICAgLy8gU2tpcCBpcyBub3QgZGlydHlcbiAgICBpZiAob3B0cy5za2lwSWZQcmlzdGluZSAmJiAhdGhpcy5fZGlydHkpIHtcbiAgICAgIGNvbnNvbGUuZGVidWcoYFtlbnRpdHktc3RvcmFnZV0gUGVyc2lzdGluZyAke3RoaXMubmFtZX0gbm90IG5lZWQuIFNraXBgKTtcbiAgICAgIHJldHVybiB0aGlzLl9jYWNoZS5sZW5ndGg7XG4gICAgfVxuXG4gICAgLy8gQ29weSBzb21lIGRhdGEsIEJFRk9SRSB0byBjYWxsIG1hcmtBc1ByaXN0aW5lKCkgdG8gYWxsb3cgcGFyYWxsZWwgY2hhbmdlc1xuICAgIGNvbnN0IGRpcnR5SW5kZXhlcyA9IHRoaXMuaXNCeUlkTW9kZSAmJiBBcnJheS5mcm9tKHRoaXMuX3N0YXR1c0J5SWQudmFsdWVzKCkpXG4gICAgICAuZmlsdGVyKHMgPT4gIW9wdHMuc2tpcElmUHJpc3RpbmUgfHwgKHMgJiYgcy5kaXJ0eSkpXG4gICAgICAubWFwKHMgPT4gcy5pbmRleCk7XG4gICAgY29uc3QgZW50aXRpZXMgPSB0aGlzLl9jYWNoZS5zbGljZSgpOyAvLyBDb3B5IGNhY2hlZCBlbnRpdGllc1xuXG4gICAgLy8gTWFyayBhbGwgKGVudGl0aWVzIGFuZCBzdGF0dXMpIGFzIHByaXN0aW5lXG4gICAgdGhpcy5tYXJrQXNQcmlzdGluZSh7ZW1pdEV2ZW50OiBmYWxzZX0pO1xuXG4gICAgLy8gQ29udmVydCBkaXJ0eSBlbnRpdGllcyBpbnRvIGxpZ2h0IGVudGl0aWVzICgvIVxcIEFGVEVSIHRoZSBwcmV2aW91cyBjb3B5KVxuICAgIC8vIGFuZCB1cGRhdGUgdGhlIGNhY2hlIChidXQgTk9UIHRoZSAnZW50aXRpZXMnIHZhcmlhYmxlKVxuICAgIGlmIChkaXJ0eUluZGV4ZXMgJiYgdGhpcy5fbWFwVG9MaWdodEVudGl0eSkge1xuICAgICAgZGlydHlJbmRleGVzLmZvckVhY2goaW5kZXggPT4gdGhpcy5fY2FjaGVbaW5kZXhdID0gdGhpcy5fbWFwVG9MaWdodEVudGl0eShlbnRpdGllc1tpbmRleF0pKTtcbiAgICB9XG5cbiAgICAvLyBJZiBubyBlbnRpdHkgZm91bmRcbiAgICBpZiAoaXNFbXB0eUFycmF5KGVudGl0aWVzKSkge1xuXG4gICAgICAvLyBDbGVhbiB0aGUgbG9jYWwgc3RvcmFnZVxuICAgICAgYXdhaXQgdGhpcy5zdG9yYWdlLnJlbW92ZSh0aGlzLl9zdG9yYWdlS2V5KTtcbiAgICB9XG4gICAgZWxzZSB7XG5cbiAgICAgIC8vIFNhdmUgZWFjaCBlbnRpdHkgaW50byBhIHVuaXF1ZSBrZXkgKGFkdmFuY2VkIG1vZGUpXG4gICAgICBpZiAodGhpcy5pc0J5SWRNb2RlKSB7XG4gICAgICAgIC8vIFNhdmUgaWRzXG4gICAgICAgIGF3YWl0IHRoaXMuc3RvcmFnZS5zZXQodGhpcy5zdG9yYWdlS2V5QnlJZCwgZW50aXRpZXMuZmlsdGVyKGlzTm90TmlsKS5tYXAoZSA9PiBlLmlkKSk7XG5cbiAgICAgICAgLy8gU2F2ZWQgZGlydHkgZW50aXRpZXNcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgZGlydHlJbmRleGVzXG4gICAgICAgICAgICAubWFwKGluZGV4ID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgZW50aXR5ID0gZW50aXRpZXNbaW5kZXhdO1xuICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKGBbZW50aXR5LXN0b3JhZ2VdIFBlcnNpc3RpbmcgJHt0aGlzLm5hbWV9IyR7ZW50aXR5LmlkfS4uLmApO1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zdG9yYWdlLnNldCh0aGlzLl9zdG9yYWdlS2V5ICsgJyMnICsgZW50aXR5LmlkLCBlbnRpdHkpO1xuICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgIGNvbnNvbGUuaW5mbyhgW2VudGl0eS1zdG9yYWdlXSBQZXJzaXN0aW5nICR7ZGlydHlJbmRleGVzLmxlbmd0aH0vJHtlbnRpdGllcy5sZW5ndGh9ICR7dGhpcy5uYW1lfShzKS4uLmApO1xuICAgICAgfVxuXG4gICAgICAvLyBTYXZlIGFsbCBlbnRpdGllcyBpbiBhIHNpbmdsZSBrZXkgKGRlZmF1bHQpXG4gICAgICBlbHNlIHtcblxuICAgICAgICBjb25zb2xlLmluZm8oYFtlbnRpdHktc3RvcmFnZV0gUGVyc2lzdGluZyAke2VudGl0aWVzLmxlbmd0aH0gJHt0aGlzLm5hbWV9KHMpLi4uYCk7XG4gICAgICAgIGF3YWl0IHRoaXMuc3RvcmFnZS5zZXQodGhpcy5fc3RvcmFnZUtleSwgZW50aXRpZXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBlbnRpdGllcy5sZW5ndGg7XG4gIH1cblxuICBhc3luYyByZXN0b3JlKG9wdHM/OiB7IGVtaXRFdmVudD86IGJvb2xlYW4gfSk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgbGV0IGVudGl0aWVzOiBUW107XG5cbiAgICBjb25zdCByZXMgPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICB0aGlzLnN0b3JhZ2UuZ2V0KHRoaXMuX3N0b3JhZ2VLZXkpLFxuICAgICAgdGhpcy5zdG9yYWdlLmdldCh0aGlzLnN0b3JhZ2VLZXlCeUlkKVxuICAgIF0pO1xuICAgIGNvbnN0IHZhbHVlcyA9IHJlc1swXSAmJiBBcnJheS5pc0FycmF5KHJlc1swXSkgPyByZXNbMF0gOiBudWxsO1xuICAgIGNvbnN0IGlkcyA9IHJlc1sxXSAmJiBBcnJheS5pc0FycmF5KHJlc1sxXSkgPyByZXNbMV0gOiBudWxsO1xuICAgIGxldCBtaWdyYXRpb24gPSBmYWxzZTtcbiAgICBsZXQgb2xkS2V5c1RvQ2xlYW46IHN0cmluZ1tdO1xuXG4gICAgLy8gXCJTcGxpdCBieSBpZFwiIG1vZGVcbiAgICBpZiAodGhpcy5pc0J5SWRNb2RlKSB7XG4gICAgICBpZiAoaXNOb3ROaWwoaWRzKSkge1xuICAgICAgICAvLyBMb2FkIGVudGl0eSBieSBpZCAob25lIGJ5IG9uZSlcbiAgICAgICAgY29uc3Qgc3RvcmFnZUtleXMgPSBpZHMubWFwKGlkID0+IHRoaXMuX3N0b3JhZ2VLZXkgKyAnIycgKyBpZCk7XG4gICAgICAgIGVudGl0aWVzID0gYXdhaXQgY2hhaW5Qcm9taXNlczxUPihzdG9yYWdlS2V5cy5tYXAoa2V5ID0+ICgpID0+IHRoaXMuc3RvcmFnZS5nZXQoa2V5KSkpO1xuICAgICAgfVxuICAgICAgLy8gTWlncmF0ZSBmcm9tIHRoZSBzdGFuZGFyZCBtb2RlXG4gICAgICBlbHNlIGlmIChpc05vdE5pbCh2YWx1ZXMpKSB7XG4gICAgICAgIGVudGl0aWVzID0gdmFsdWVzLmZpbHRlcihlID0+IGUgJiYgaXNOb3ROaWwoZS5pZCkpO1xuICAgICAgICBtaWdyYXRpb24gPSB0cnVlO1xuICAgICAgICBvbGRLZXlzVG9DbGVhbiA9IFt0aGlzLl9zdG9yYWdlS2V5XTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBFbHNlIChkZWZhdWx0IG1vZGUpXG4gICAgZWxzZSB7XG4gICAgICBpZiAoaXNOb3ROaWwodmFsdWVzKSkge1xuICAgICAgICBlbnRpdGllcyA9IHZhbHVlcy5maWx0ZXIoZSA9PiBlICYmIGlzTm90TmlsKGUuaWQpKTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKGlzTm90TmlsKGlkcykpIHtcbiAgICAgICAgY29uc3Qgc3RvcmFnZUtleXMgPSBpZHMubWFwKGlkID0+IHRoaXMuX3N0b3JhZ2VLZXkgKyAnIycgKyBpZCk7XG4gICAgICAgIC8vIExvYWQgZW50aXR5IGJ5IGlkIChvbmUgYnkgb25lKVxuICAgICAgICBlbnRpdGllcyA9IGF3YWl0IGNoYWluUHJvbWlzZXM8VD4oc3RvcmFnZUtleXMubWFwKGtleSA9PiAoKSA9PiB0aGlzLnN0b3JhZ2UuZ2V0KGtleSkpKTtcbiAgICAgICAgbWlncmF0aW9uID0gdHJ1ZTtcbiAgICAgICAgb2xkS2V5c1RvQ2xlYW4gPSBbLi4uc3RvcmFnZUtleXMsIHRoaXMuc3RvcmFnZUtleUJ5SWRdO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIE9LLCB0aGVyZSBpcyBzb21ldGhpbmcgaW4gc3RvcmFnZS4uLlxuICAgIGlmIChpc05vdEVtcHR5QXJyYXkoZW50aXRpZXMpKSB7XG4gICAgICBpZiAoZW50aXRpZXMubGVuZ3RoID49IDEwMDApIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBbZW50aXR5LXN0b3JhZ2VdIC0gUmVzdG9yaW5nICR7ZW50aXRpZXMubGVuZ3RofSAke3RoaXMubmFtZX0uIENoZWNrIGlmIG5vdCB0b28gbWFueSBlbGVtZW50cz8hYCk7XG4gICAgICB9XG5cbiAgICAgIC8vIE1hcCBlbnRpdGllcyBpbnRvIGxpZ2h0IGVsZW1lbnQgKGlmIGlmIG5vdCBuZWVkIHRvIHBlcnNpc3QsIGJlY2F1c2Ugb2YgbWlncmF0aW9uXG4gICAgICBpZiAodGhpcy5fbWFwVG9MaWdodEVudGl0eSAmJiAhbWlncmF0aW9uKSB7XG4gICAgICAgIGVudGl0aWVzID0gZW50aXRpZXMubWFwKHRoaXMuX21hcFRvTGlnaHRFbnRpdHkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc2V0RW50aXRpZXMoZW50aXRpZXMgfHwgW10sIHsuLi5vcHRzLCBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIHRoaXMuX2RpcnR5ID0gZmFsc2U7XG5cbiAgICAvLyBGaW5pc2ggdGhlIG1pZ3JhdGlvblxuICAgIGlmIChtaWdyYXRpb24pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgW2VudGl0eS1zdG9yYWdlXSAtIE1pZ3JhdGUgJHt0aGlzLm5hbWV9IGludG8ge21vZGU6ICcke3RoaXMucG9saWN5Lm1vZGV9J30uLi5gKTtcblxuICAgICAgICAvLyBGb3JjZSB0byBwZXJzaXN0LCB1c2luZyB0aGUgbmV3IG1vZGVcbiAgICAgICAgYXdhaXQgdGhpcy5wZXJzaXN0KHtza2lwSWZQcmlzdGluZTogZmFsc2UgLyogZm9yY2UgcGVyc2lzdCB1c2luZyB0aGUgbmV3IG1vZGUgKi8gfSk7XG5cbiAgICAgICAgLy8gQ2xlYW4gb2xkIHN0b3JhZ2Uga2V5cyAob25lIGJ5IG9uZSlcbiAgICAgICAgaWYgKGlzTm90RW1wdHlBcnJheShvbGRLZXlzVG9DbGVhbikpIGF3YWl0IGNoYWluUHJvbWlzZXMob2xkS2V5c1RvQ2xlYW4ubWFwKGtleSA9PiAoKSA9PiB0aGlzLnN0b3JhZ2UucmVtb3ZlKGtleSkpKTtcbiAgICAgIH1cbiAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgICB0aHJvdyB7Y29kZTogRXJyb3JDb2Rlcy5FTlRJVFlfU1RPUkFHRV9NSUdSQVRJT05fRkFJTEVELCBtZXNzYWdlOiAnRVJST1IuRU5USVRZX1NUT1JBR0VfTUlHUkFUSU9OX0ZBSUxFRCcsIGRldGFpbHM6IGVycn07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRW1pdCB1cGRhdGUgZXZlbnRcbiAgICBpZiAoIW9wdHMgfHwgb3B0cy5lbWl0RXZlbnQgIT09IGZhbHNlKSB7XG4gICAgICB0aGlzLmVtaXRFdmVudCgpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9jYWNoZS5sZW5ndGg7XG4gIH1cblxuICBtYXJrQXNEaXJ0eShvcHRzPzogeyBlbWl0RXZlbnQ/OiBib29sZWFuIH0pIHtcbiAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG5cbiAgICAvLyBFbWl0IHVwZGF0ZSBldmVudFxuICAgIGlmICghb3B0cyB8fCBvcHRzLmVtaXRFdmVudCAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuZW1pdEV2ZW50KCk7XG4gICAgfVxuICB9XG5cbiAgbWFya0FzUHJpc3RpbmUob3B0cz86IHsgZW1pdEV2ZW50PzogYm9vbGVhbiB9KSB7XG5cbiAgICBmb3IgKGNvbnN0IHMgb2YgdGhpcy5fc3RhdHVzQnlJZC52YWx1ZXMoKSkge1xuICAgICAgaWYgKGlzTm90TmlsKHMpKSB7XG4gICAgICAgIHMuZGlydHkgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fZGlydHkgPSBmYWxzZTtcblxuICAgIC8vIEVtaXQgdXBkYXRlIGV2ZW50XG4gICAgaWYgKCFvcHRzIHx8IG9wdHMuZW1pdEV2ZW50ICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy5lbWl0RXZlbnQoKTtcbiAgICB9XG4gIH1cblxuICAvKiAtLSBwcm90ZWN0ZWQgbWV0aG9kcyAtLSAqL1xuXG4gIHByaXZhdGUgbG9hZENhY2hlZEVudGl0eShpZDogSUQsIG9wdHM/OiBFbnRpdHlTdG9yYWdlTG9hZE9wdGlvbnMpOiBUIHtcbiAgICBjb25zdCBzdGF0dXMgPSB0aGlzLl9zdGF0dXNCeUlkLmdldChpZCk7XG4gICAgY29uc3QgaW5kZXggPSBzdGF0dXMgJiYgc3RhdHVzLmluZGV4O1xuICAgIGlmIChpc05pbChpbmRleCkpIHJldHVybiB1bmRlZmluZWQ7IC8vIG5vdCBleGlzdHNcbiAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh0aGlzLl9jYWNoZVtpbmRleF0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBsb2FkRnVsbEVudGl0eShpZDogSUQsIG9wdHM/OiBFbnRpdHlTdG9yYWdlTG9hZE9wdGlvbnMpOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCBzdGF0dXMgPSB0aGlzLl9zdGF0dXNCeUlkLmdldChpZCk7XG4gICAgY29uc3QgaW5kZXggPSBzdGF0dXMgJiYgc3RhdHVzLmluZGV4O1xuICAgIGlmIChpc05pbChpbmRleCkpIHJldHVybiB1bmRlZmluZWQ7IC8vIG5vdCBleGlzdHNcblxuICAgIC8vIFJlbG9hZCBmcm9tIHN0b3JhZ2UsIGlmIG5lZWQgKGUuZy4gc29tZSBhdHRyaWJ1dGVzIGhhcyBiZWVuIGV4Y2x1ZGVkIGluIGxpZ2h0IGVsZW1lbnRzKVxuICAgIGlmIChzdGF0dXMuZGlydHkgPT09IGZhbHNlKSB7XG4gICAgICBjb25zb2xlLmRlYnVnKGBbZW50aXR5LXN0b3JhZ2VdIEZ1bGwgcmVsb2FkaW5nICR7dGhpcy5uYW1lfSMke2lkfS4uLmApO1xuICAgICAgY29uc3QgZnVsbERhdGEgPSBhd2FpdCB0aGlzLnN0b3JhZ2UuZ2V0KHRoaXMuX3N0b3JhZ2VLZXkgKyAnIycgKyBpZCk7XG4gICAgICBpZiAoZnVsbERhdGEpIHJldHVybiBPYmplY3QuZnJlZXplKGZ1bGxEYXRhKTtcbiAgICAgIC8vIE5vdCBmb3VuZCBieSBpZCwgY29udGludWUgZnJvbSBjYWNoZSAodmVyc2lvbiBwcmlvciB0byAxLjUuMylcbiAgICB9XG5cbiAgICAvLyBMb2FkIGZyb20gdGhlIGNhY2hlLCBpZiBkaXJ0eSBPUiBpZiBzdG9yYWdlIGlzIG5vdCBzcGxpdHRlZCBieSBpZFxuICAgIHJldHVybiBPYmplY3QuZnJlZXplKHRoaXMuX2NhY2hlW2luZGV4XSk7XG4gIH1cblxuICBwcml2YXRlIHNldEVudGl0aWVzKGVudGl0aWVzOiBUW10sIG9wdHM/OiB7ZW1pdEV2ZW50PzogYm9vbGVhbiB9KSB7XG4gICAgLy8gRmlsdGVyIG5vbiBuaWwgKGFuZCBpZiBuZWVkIG5vbiBsb2NhbCkgZW50aXRpZXNcbiAgICBlbnRpdGllcyA9IChlbnRpdGllcyB8fCBbXSlcbiAgICAgICAgLmZpbHRlcihpdGVtID0+IGlzTm90TmlsKGl0ZW0pXG4gICAgICAgICAgJiYgKCF0aGlzLnBvbGljeS5za2lwTm9uTG9jYWxFbnRpdGllcyB8fCAraXRlbS5pZCA8IDApXG4gICAgICAgICk7XG5cbiAgICB0aGlzLl9jYWNoZSA9IGVudGl0aWVzO1xuXG4gICAgLy8gVXBkYXRlIHRoZSBzZXF1ZW5jZSB3aXRoIG1pbihpZCkgb2YgYWxsIHRlbXBvcmFyeSBpZHNcbiAgICB0aGlzLl9zZXF1ZW5jZSA9IHRoaXMuX2NhY2hlLnJlZHVjZSgocmVzLCBpdGVtKSA9PiAraXRlbS5pZCA8IDAgPyBNYXRoLm1pbihyZXMsICtpdGVtLmlkKSA6IHJlcywgMCk7XG5cbiAgICB0aGlzLl9zdGF0dXNCeUlkLmNsZWFyKCk7XG4gICAgdGhpcy5fY2FjaGUuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgIHRoaXMuX3N0YXR1c0J5SWQuc2V0KGl0ZW0uaWQsIDxFbnRpdHlTdGF0dXM+e1xuICAgICAgICBpbmRleCxcbiAgICAgICAgZGlydHk6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHRoaXMuX2xvYWRlZCA9IHRydWU7XG5cbiAgICAvLyBFbWl0IHVwZGF0ZSBldmVudFxuICAgIGlmICghb3B0cyB8fCBvcHRzLmVtaXRFdmVudCAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuZW1pdEV2ZW50KCk7XG4gICAgfVxuICB9XG5cblxuICAvKipcbiAgICogV0lsbCBhcHBseSBhIGZpbHRlciwgdGhlbiBhIHNvcnQsIHRoZW4gYSBwYWdlIHNsaWNlXG4gICAqXG4gICAqIEBwYXJhbSBkYXRhXG4gICAqIEBwYXJhbSB2YXJpYWJsZXNcbiAgICovXG4gIHByaXZhdGUgcmVkdWNlQW5kU29ydChkYXRhOiBUW10sXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0PzogbnVtYmVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplPzogbnVtYmVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzb3J0Qnk/OiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNvcnREaXJlY3Rpb24/OiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcj86IChUKSA9PiBib29sZWFuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk6IExvYWRSZXN1bHQ8VD4ge1xuICAgIGlmIChpc0VtcHR5QXJyYXkoZGF0YSkpIHtcbiAgICAgIHJldHVybiB7ZGF0YTogW10sIHRvdGFsOiAwfTtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgbmlsIHZhbHVlc1xuICAgIGRhdGEgPSBkYXRhLmZpbHRlcihpc05vdE5pbCk7XG5cbiAgICBpZiAoIXZhcmlhYmxlcykge1xuICAgICAgLy8gUmV0dXJuIGFsbCAoYnV0IGFycmF5IGhhcyBiZWVuIGZpbHRlcmVkLCBhbmQgY29waWVkKVxuICAgICAgcmV0dXJuIHtkYXRhLCB0b3RhbDogZGF0YS5sZW5ndGh9O1xuICAgIH1cblxuICAgIC8vIEFwcGx5IHRoZSBmaWx0ZXIsIGlmIGFueVxuICAgIGlmICh2YXJpYWJsZXMuZmlsdGVyKSB7XG4gICAgICBkYXRhID0gZGF0YS5maWx0ZXIodmFyaWFibGVzLmZpbHRlcik7XG4gICAgfVxuXG4gICAgLy8gQ29tcHV0ZSB0aGUgdG90YWwgbGVuZ3RoXG4gICAgY29uc3QgdG90YWwgPSBkYXRhLmxlbmd0aDtcblxuICAgIC8vIElmIHBhZ2Ugc2l6ZT0wIChlLmcuIG9ubHkgbmVlZCB0b3RhbClcbiAgICBpZiAodmFyaWFibGVzLnNpemUgPT09IDApIHJldHVybiB7ZGF0YTogW10sIHRvdGFsfTtcblxuICAgIC8vIFNvcnQgYnlcbiAgICBpZiAodmFyaWFibGVzLnNvcnRCeSkge1xuICAgICAgRW50aXR5VXRpbHMuc29ydChkYXRhLCB2YXJpYWJsZXMuc29ydEJ5LCB2YXJpYWJsZXMuc29ydERpcmVjdGlvbik7XG4gICAgfVxuXG4gICAgLy8gU2xpY2UgaW4gYSBwYWdlICh1c2luZyBvZmZzZXQgYW5kIHNpemUpXG4gICAgaWYgKHZhcmlhYmxlcy5vZmZzZXQgPiAwKSB7XG5cbiAgICAgIC8vIE9mZnNldCBhZnRlciB0aGUgZW5kOiBubyByZXN1bHRcbiAgICAgIGlmICh2YXJpYWJsZXMub2Zmc2V0ID49IGRhdGEubGVuZ3RoIHx8IHZhcmlhYmxlcy5zaXplID09PSAwKSB7XG4gICAgICAgIGRhdGEgPSBbXTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBkYXRhID0gKHZhcmlhYmxlcy5zaXplID4gMCAmJiAoKHZhcmlhYmxlcy5vZmZzZXQgKyB2YXJpYWJsZXMuc2l6ZSkgPCBkYXRhLmxlbmd0aCkpID9cbiAgICAgICAgICAvLyBTbGljZSB1c2luZyBsaW1pdCB0byBzaXplXG4gICAgICAgICAgZGF0YS5zbGljZSh2YXJpYWJsZXMub2Zmc2V0LCB2YXJpYWJsZXMub2Zmc2V0ICsgdmFyaWFibGVzLnNpemUpIDpcbiAgICAgICAgICAvLyBTbGljZSB3aXRob3V0IGxpbWl0XG4gICAgICAgICAgZGF0YS5zbGljZSh2YXJpYWJsZXMub2Zmc2V0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBcHBseSBhIGxpbWl0XG4gICAgZWxzZSBpZiAodmFyaWFibGVzLnNpemUgPiAwKXtcbiAgICAgIGRhdGEgPSBkYXRhLnNsaWNlKDAsIHZhcmlhYmxlcy5zaXplKTtcbiAgICB9XG4gICAgLy8gTm8gbGltaXQ6XG4gICAgZWxzZSBpZiAodmFyaWFibGVzLnNpemUgPT09IC0xKXtcbiAgICAgIC8vIEtlZXAgYWxsIGRhdGFcbiAgICB9XG5cbiAgICByZXR1cm4ge2RhdGEsIHRvdGFsfTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlTGlnaHRFbnRpdHlNYXBGbihwb2xpY3k6IEVudGl0eVN0b3JlVHlwZVBvbGljeTxUPik6IChUKSA9PiBUIHtcbiAgICBpZiAocG9saWN5Lm1vZGUgIT09ICdieS1pZCcpIHJldHVybiB1bmRlZmluZWQ7IC8vIE9ubHkgbmVlZCBmb3IgdGhlICdieS1pZCcgbW9kZVxuICAgIGlmIChpc0VtcHR5QXJyYXkocG9saWN5LmxpZ2h0RmllbGRzRXhjbHVkZXMpKSByZXR1cm4gdW5kZWZpbmVkOyAvLyBza2lwXG5cbiAgICAvLyBDcmVhdGUgYSBpbW11dGFibGUgbWFzayBvYmplY3QsIHVzZSB0byBjbGVhbiBzb21lIHByb3BlcnRpZXNcbiAgICBjb25zdCBleGNsdWRlQXR0cmlidXRlc01hc2sgPSBPYmplY3QuZnJlZXplKHRoaXMucG9saWN5LmxpZ2h0RmllbGRzRXhjbHVkZXMucmVkdWNlKChyZXMsIGF0dHIpID0+IHtcbiAgICAgIHJlc1thdHRyXSA9IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiByZXM7XG4gICAgfSwgPFQ+e30pKTtcblxuICAgIHJldHVybiAoZW50aXR5KSA9PiBlbnRpdHkgPyBPYmplY3QuYXNzaWduKDxUPnt9LCBlbnRpdHksIGV4Y2x1ZGVBdHRyaWJ1dGVzTWFzaykgOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIHRoZSBlbnRpdGllc1N1YmplY3QuXG4gICAqXG4gICAqIEJlZm9yZSB3ZW5kaW5nIGl0ZW1zLCBhIGZpbHRlciBpcyBhcHBseSwgdG8gcmVtb3ZlIG51bGwgdmFsdWUuXG4gICAqIFRoaXMgZmlsdGVyIHdpbGwgY3JlYXRlIGEgYXJyYXkgY29weS5cbiAgICovXG4gIHByaXZhdGUgZW1pdEV2ZW50KCkge1xuICAgIHRoaXMuX29uQ2hhbmdlLm5leHQodHJ1ZSk7XG4gIH1cbn1cbiJdfQ==
|