sliftutils 1.7.119 → 1.7.120
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/index.d.ts +1 -0
- package/package.json +1 -1
- package/storage/BulkDatabase2/LoadedIndex.ts +3 -2
- package/storage/BulkDatabase2/dist/LoadedIndex.ts.cache +7 -4
- package/storage/PrivateFileSystemStorage.d.ts +1 -0
- package/storage/PrivateFileSystemStorage.ts +40 -45
- package/storage/dist/PrivateFileSystemStorage.ts.cache +42 -47
package/index.d.ts
CHANGED
|
@@ -2580,6 +2580,7 @@ declare module "sliftutils/storage/PrivateFileSystemStorage" {
|
|
|
2580
2580
|
private ensureInitialized;
|
|
2581
2581
|
private directoryExists;
|
|
2582
2582
|
private getDirectoryHandle;
|
|
2583
|
+
private resolveKey;
|
|
2583
2584
|
private getFileHandle;
|
|
2584
2585
|
private fileExists;
|
|
2585
2586
|
get(key: string): Promise<Buffer | undefined>;
|
package/package.json
CHANGED
|
@@ -173,8 +173,9 @@ export class LoadedIndex<T extends { key: string }> {
|
|
|
173
173
|
this.baseColumnsLoading.delete(column);
|
|
174
174
|
onLoaded();
|
|
175
175
|
} catch (e) {
|
|
176
|
+
// No scheduled retry exists: clearing the loading flag makes the NEXT read re-attempt the load, and until one happens the value stays missing/stale
|
|
176
177
|
this.baseColumnsLoading.delete(column);
|
|
177
|
-
console.
|
|
178
|
+
console.error(`${this.name}.getColumnSync(${JSON.stringify(column)}) load failed (the next read re-attempts it): ${(e as Error).stack ?? e}`);
|
|
178
179
|
}
|
|
179
180
|
})();
|
|
180
181
|
}
|
|
@@ -192,7 +193,7 @@ export class LoadedIndex<T extends { key: string }> {
|
|
|
192
193
|
onLoaded();
|
|
193
194
|
} catch (e) {
|
|
194
195
|
this.baseFieldsLoading.delete(ck);
|
|
195
|
-
console.
|
|
196
|
+
console.error(`${this.name}.getSingleFieldSync(${JSON.stringify(key)}, ${JSON.stringify(column)}) load failed (the next read re-attempts it): ${(e as Error).stack ?? e}`);
|
|
196
197
|
}
|
|
197
198
|
})();
|
|
198
199
|
}
|
|
@@ -127,6 +127,7 @@ class LoadedIndex {
|
|
|
127
127
|
return;
|
|
128
128
|
this.baseColumnsLoading.add(column);
|
|
129
129
|
void (async () => {
|
|
130
|
+
var _a;
|
|
130
131
|
try {
|
|
131
132
|
const value = await this.reader.getColumn(column);
|
|
132
133
|
this.baseColumns.set(column, value);
|
|
@@ -135,8 +136,9 @@ class LoadedIndex {
|
|
|
135
136
|
onLoaded();
|
|
136
137
|
}
|
|
137
138
|
catch (e) {
|
|
139
|
+
// No scheduled retry exists: clearing the loading flag makes the NEXT read re-attempt the load, and until one happens the value stays missing/stale
|
|
138
140
|
this.baseColumnsLoading.delete(column);
|
|
139
|
-
console.
|
|
141
|
+
console.error(`${this.name}.getColumnSync(${JSON.stringify(column)}) load failed (the next read re-attempts it): ${(_a = e.stack) !== null && _a !== void 0 ? _a : e}`);
|
|
140
142
|
}
|
|
141
143
|
})();
|
|
142
144
|
}
|
|
@@ -146,6 +148,7 @@ class LoadedIndex {
|
|
|
146
148
|
return;
|
|
147
149
|
this.baseFieldsLoading.add(ck);
|
|
148
150
|
void (async () => {
|
|
151
|
+
var _a;
|
|
149
152
|
try {
|
|
150
153
|
const value = await this.reader.getSingleField(key, column);
|
|
151
154
|
this.baseFields.set(ck, value);
|
|
@@ -155,7 +158,7 @@ class LoadedIndex {
|
|
|
155
158
|
}
|
|
156
159
|
catch (e) {
|
|
157
160
|
this.baseFieldsLoading.delete(ck);
|
|
158
|
-
console.
|
|
161
|
+
console.error(`${this.name}.getSingleFieldSync(${JSON.stringify(key)}, ${JSON.stringify(column)}) load failed (the next read re-attempts it): ${(_a = e.stack) !== null && _a !== void 0 ? _a : e}`);
|
|
159
162
|
}
|
|
160
163
|
})();
|
|
161
164
|
}
|
|
@@ -419,5 +422,5 @@ function joinBulkDatabases(databases) {
|
|
|
419
422
|
},
|
|
420
423
|
};
|
|
421
424
|
}
|
|
422
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTG9hZGVkSW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJMb2FkZWRJbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSw2REFBa0g7QUFDbEgsNkNBQW9EO0FBQ3BELDJDQUFrRztBQUNsRyxrRUFBaUY7QUFDakYsd0VBQXFFO0FBRXJFLG9JQUFvSTtBQUNwSSxNQUFNLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDO0FBTTFDLE1BQWEsZ0JBQWlCLFNBQVEsS0FBSztDQUFJO0FBQS9DLDRDQUErQztBQUMvQyxNQUFNLGlCQUFrQixTQUFRLEtBQUs7Q0FBSTtBQW9CekMsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLENBQUM7QUFFNUIsU0FBUyxRQUFRLENBQUMsQ0FBUyxFQUFFLENBQVM7SUFDbEMsT0FBTyxDQUFDLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDMUMsQ0FBQztBQUVELG9XQUFvVztBQUNwVyxNQUFhLFdBQVc7SUFDcEIsWUFDb0IsSUFBWSxFQUNaLE9BQW9CLEVBQ3BCLFNBQXlCLEVBQ3pCLFdBQTZCLEVBQzdCLE1BQXNCLEVBQ3RCLFdBQWdDLEVBQ2hDLFdBQWdDLEVBQ2hDLGdCQUF3QixFQUN4QixpQkFBeUIsRUFDekIsU0FBMEI7UUFUMUIsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUNaLFlBQU8sR0FBUCxPQUFPLENBQWE7UUFDcEIsY0FBUyxHQUFULFNBQVMsQ0FBZ0I7UUFDekIsZ0JBQVcsR0FBWCxXQUFXLENBQWtCO1FBQzdCLFdBQU0sR0FBTixNQUFNLENBQWdCO1FBQ3RCLGdCQUFXLEdBQVgsV0FBVyxDQUFxQjtRQUNoQyxnQkFBVyxHQUFYLFdBQVcsQ0FBcUI7UUFDaEMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFRO1FBQ3hCLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBUTtRQUN6QixjQUFTLEdBQVQsU0FBUyxDQUFpQjtRQVN0QyxnQkFBVyxHQUFHLElBQUks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RSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQy9CLFNBQVM7Z0JBQ2IsQ0FBQztnQkFDRCxJQUFJLENBQUMsS0FBSywyQkFBTTtvQkFBRSxTQUFTO2dCQUMzQixJQUFJLENBQUMsQ0FBQyxJQUFJLEdBQUcsUUFBUSxFQUFFLENBQUM7b0JBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7b0JBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUM7b0JBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztnQkFBQyxDQUFDO1lBQ2xGLENBQUM7WUFDRCxNQUFNLElBQUksR0FBRyxLQUFLLElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM1QyxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUM3RSxDQUFDO0tBQ0osQ0FBQztBQUNOLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEZpbGVTdG9yYWdlIH0gZnJvbSBcIi4uL0ZpbGVGb2xkZXJBUElcIjtcbmltcG9ydCB7IEFCU0VOVCwgQmFzZUJ1bGtEYXRhYmFzZVJlYWRlciwgRU1QVFlfQlVGRkVSLCBLRVlfQ09MVU1OLCBsb2FkQnVsa0RhdGFiYXNlIH0gZnJvbSBcIi4vQnVsa0RhdGFiYXNlRm9ybWF0XCI7XG5pbXBvcnQgeyBibG9ja0NhY2hlLCBHZXRSYW5nZSB9IGZyb20gXCIuL2Jsb2NrQ2FjaGVcIjtcbmltcG9ydCB7IFNUUkVBTV9FWFRFTlNJT04sIFN0cmVhbUVudHJ5LCBwYXJzZVN0cmVhbSwgc3RyZWFtUmVhZGVyRnJvbUVudHJpZXMgfSBmcm9tIFwiLi9zdHJlYW1Mb2dcIjtcbmltcG9ydCB7IGZvcm1hdE51bWJlciwgZm9ybWF0VGltZSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2Zvcm1hdHRpbmcvZm9ybWF0XCI7XG5pbXBvcnQgeyBibHVlLCByZWQgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9mb3JtYXR0aW5nL2xvZ0NvbG9yc1wiO1xuXG4vLyBEdXBsaWNhdGVkIGZyb20gQnVsa0RhdGFiYXNlQmFzZSB0byBhdm9pZCBhIGNpcmN1bGFyIGltcG9ydCDigJQgdXNlZCBvbmx5IHRvIGJ1aWxkIGEgZnVsbGVyIHN0b3JhZ2UtcmVsYXRpdmUgcGF0aCBmb3IgbG9nIG1lc3NhZ2VzLlxuY29uc3QgQlVMS19ST09UX0ZPTERFUiA9IFwiYnVsa0RhdGFiYXNlczJcIjtcblxuZXhwb3J0IHR5cGUgQnVsa0ZpbGVJbmZvID0geyBmaWxlTmFtZTogc3RyaW5nOyBsZXZlbDogbnVtYmVyOyB0aW1lc3RhbXA6IG51bWJlciB9O1xuZXhwb3J0IHR5cGUgU3RyZWFtRmlsZUluZm8gPSB7IGZpbGVOYW1lOiBzdHJpbmc7IHRpbWVzdGFtcDogbnVtYmVyIH07XG5leHBvcnQgdHlwZSBTdHJlYW1SZWFkZXJDYWNoZUVudHJ5ID0geyByZWFkU2l6ZTogbnVtYmVyOyBwYXJzZWRQb3M6IG51bWJlcjsgZW50cmllczogU3RyZWFtRW50cnlbXSB9O1xuXG5leHBvcnQgY2xhc3MgTWlzc2luZ0ZpbGVFcnJvciBleHRlbmRzIEVycm9yIHsgfVxuY2xhc3MgRmlsZXNDaGFuZ2VkRXJyb3IgZXh0ZW5kcyBFcnJvciB7IH1cblxuZXhwb3J0IHR5cGUgUmVzb2x2ZWRSZWFkZXIgPSB7XG4gICAgcm93Q291bnQ6IG51bWJlcjtcbiAgICB0b3RhbEJ5dGVzOiBudW1iZXI7XG4gICAga2V5czogc3RyaW5nW107XG4gICAgcmF3S2V5Q291bnQ6IG51bWJlcjtcbiAgICByZWFkZXJDb3VudDogbnVtYmVyO1xuICAgIGNvbHVtbnM6IHsgY29sdW1uOiBzdHJpbmc7IGJ5dGVTaXplOiBudW1iZXIgfVtdO1xuICAgIGtleVRpbWVzOiBNYXA8c3RyaW5nLCBudW1iZXI+O1xuICAgIGRlbGV0ZVRpbWVzOiBNYXA8c3RyaW5nLCBudW1iZXI+O1xuICAgIGdldENvbHVtbjogKGNvbHVtbjogc3RyaW5nKSA9PiBQcm9taXNlPHsga2V5OiBzdHJpbmc7IHZhbHVlOiB1bmtub3duOyB0aW1lOiBudW1iZXIgfVtdPjtcbiAgICBnZXRTaW5nbGVGaWVsZDogKGtleTogc3RyaW5nLCBjb2x1bW46IHN0cmluZykgPT4gUHJvbWlzZTx7IHZhbHVlOiB1bmtub3duOyB0aW1lOiBudW1iZXIgfSB8IHVuZGVmaW5lZD47XG59O1xuXG5leHBvcnQgdHlwZSBTdWJSZWFkZXJDYWNoZXMgPSB7XG4gICAgYnVsazogTWFwPHN0cmluZywgQmFzZUJ1bGtEYXRhYmFzZVJlYWRlcj47XG4gICAgc3RyZWFtOiBNYXA8c3RyaW5nLCBTdHJlYW1SZWFkZXJDYWNoZUVudHJ5Pjtcbn07XG5cbmNvbnN0IE1BWF9SRUFEX0FUVEVNUFRTID0gODtcblxuZnVuY3Rpb24gbnVsbEpvaW4oYTogc3RyaW5nLCBiOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBhICsgU3RyaW5nLmZyb21DaGFyQ29kZSgwKSArIGI7XG59XG5cbi8vIEEgbG9hZGVkIHNuYXBzaG90IG9mIG9uZSBjb2xsZWN0aW9uJ3Mgb24tZGlzayBzdGF0ZTogdGhlIHJlc29sdmVkIHJlYWRlciArIHRoZSBwZXItZmlsZSBkZWNvZGVkIHN1Yi0gcmVhZGVycyBpdCBzdGl0Y2hlZCwgdGhlIHN0cmVhbSBmaWxlIHNpemVzL3RpbWVzIGl0IG9ic2VydmVkLCBhbmQgdGhlIHN5bmMgKHJlYWN0aXZlKSBjYWNoZXMgdGhhdCBzdXJmYWNlIGNvbHVtbi9maWVsZCByZWFkcy4gQnVpbHQgb25jZSB2aWEgTG9hZGVkSW5kZXguYnVpbGQg4oCUIGVhZ2VybHksIHNvIHRoZSBzd2FwIGludG8gYSBmcmVzaCBMb2FkZWRJbmRleCBuZXZlciBibG9ja3MgYSByZWFkIG9uIGEgc3luY2hyb25vdXMgcmVidWlsZC5cbmV4cG9ydCBjbGFzcyBMb2FkZWRJbmRleDxUIGV4dGVuZHMgeyBrZXk6IHN0cmluZyB9PiB7XG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZyxcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IHN0b3JhZ2U6IEZpbGVTdG9yYWdlLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgYnVsa0ZpbGVzOiBCdWxrRmlsZUluZm9bXSxcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IHN0cmVhbUZpbGVzOiBTdHJlYW1GaWxlSW5mb1tdLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgcmVhZGVyOiBSZXNvbHZlZFJlYWRlcixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IHN0cmVhbVRpbWVzOiBNYXA8c3RyaW5nLCBudW1iZXI+LFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgc3RyZWFtU2l6ZXM6IE1hcDxzdHJpbmcsIG51bWJlcj4sXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBzdHJlYW1Sb3dzT25EaXNrOiBudW1iZXIsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBzdHJlYW1CeXRlc09uRGlzazogbnVtYmVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgc3ViQ2FjaGVzOiBTdWJSZWFkZXJDYWNoZXMsXG4gICAgKSB7XG4gICAgICAgIHRoaXMua2V5cyA9IG5ldyBTZXQocmVhZGVyLmtleXMpO1xuICAgICAgICB0aGlzLmZpbGVTZXQgPSBuZXcgU2V0KFsuLi5idWxrRmlsZXMubWFwKGYgPT4gZi5maWxlTmFtZSksIC4uLnN0cmVhbUZpbGVzLm1hcChmID0+IGYuZmlsZU5hbWUpXSk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRvbmx5IGtleXM6IFNldDxzdHJpbmc+O1xuICAgIHB1YmxpYyByZWFkb25seSBmaWxlU2V0OiBTZXQ8c3RyaW5nPjtcblxuICAgIHByaXZhdGUgYmFzZUNvbHVtbnMgPSBuZXcgTWFwPHN0cmluZywgeyBrZXk6IHN0cmluZzsgdmFsdWU6IHVua25vd247IHRpbWU6IG51bWJlciB9W10+KCk7XG4gICAgcHJpdmF0ZSBiYXNlQ29sdW1uc0xvYWRpbmcgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBwcml2YXRlIGJhc2VGaWVsZHMgPSBuZXcgTWFwPHN0cmluZywgeyB2YWx1ZTogdW5rbm93bjsgdGltZTogbnVtYmVyIH0gfCB1bmRlZmluZWQ+KCk7XG4gICAgcHJpdmF0ZSBiYXNlRmllbGRzTG9hZGluZyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIC8vIExhc3Qta25vd24gdmFsdWVzIGZyb20gdGhlIHByZXZpb3VzIGluZGV4LCBzZXJ2ZWQgdW50aWwgdGhpcyBpbmRleCBsb2FkcyBpdHMgb3duIGZyZXNoIHZhbHVlLCBzbyBhIHN3YXAgZG9lc24ndCBmbGFzaCBlbXB0eSBpbiBzeW5jIHJlYWRzLiBDbGVhcmVkIHBlci1lbnRyeSB3aGVuIHRoZSBmcmVzaCB2YWx1ZSBsYW5kcy5cbiAgICBwcml2YXRlIHN0YWxlQmFzZUNvbHVtbnMgPSBuZXcgTWFwPHN0cmluZywgeyBrZXk6IHN0cmluZzsgdmFsdWU6IHVua25vd247IHRpbWU6IG51bWJlciB9W10+KCk7XG4gICAgcHJpdmF0ZSBzdGFsZUJhc2VGaWVsZHMgPSBuZXcgTWFwPHN0cmluZywgeyB2YWx1ZTogdW5rbm93bjsgdGltZTogbnVtYmVyIH0gfCB1bmRlZmluZWQ+KCk7XG5cbiAgICBnZXQgdG90YWxCeXRlcygpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5yZWFkZXIudG90YWxCeXRlczsgfVxuICAgIGdldCByb3dDb3VudCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5yZWFkZXIucm93Q291bnQ7IH1cblxuICAgIGlzTGl2ZShrZXk6IHN0cmluZyk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5rZXlzLmhhcyhrZXkpOyB9XG5cbiAgICBzdGF0aWMgYXN5bmMgYnVpbGQ8VCBleHRlbmRzIHsga2V5OiBzdHJpbmcgfT4oY29uZmlnOiB7XG4gICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgc3RvcmFnZTogRmlsZVN0b3JhZ2U7XG4gICAgICAgIGJ1bGtGaWxlczogQnVsa0ZpbGVJbmZvW107XG4gICAgICAgIHN0cmVhbUZpbGVzOiBTdHJlYW1GaWxlSW5mb1tdO1xuICAgICAgICBzdWJDYWNoZXM6IFN1YlJlYWRlckNhY2hlcztcbiAgICAgICAgb25VbnJlYWRhYmxlRmlsZT86IChmaWxlOiBCdWxrRmlsZUluZm8sIG1lc3NhZ2U6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPjtcbiAgICB9KTogUHJvbWlzZTxMb2FkZWRJbmRleDxUPj4ge1xuICAgICAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XG4gICAgICAgIGxldCB7IGJ1bGtGaWxlcywgc3RyZWFtRmlsZXMgfSA9IGNvbmZpZztcbiAgICAgICAgbGV0IGF0dGVtcHQgPSAwO1xuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgY29uc3QgdG9sZXJhdGVNaXNzaW5nID0gYXR0ZW1wdCA+PSBNQVhfUkVBRF9BVFRFTVBUUztcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGV0IGZpbGVzQ2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGNvbnN0IFtidWxrUmVhZGVyc1Jhdywgc3RyZWFtRGF0YV0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgICAgICAgIFByb21pc2UuYWxsKGJ1bGtGaWxlcy5tYXAoYXN5bmMgZiA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBsb2FkRmlsZVJlYWRlcihjb25maWcubmFtZSwgY29uZmlnLnN0b3JhZ2UsIGYsIGNvbmZpZy5zdWJDYWNoZXMuYnVsayk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBNaXNzaW5nRmlsZUVycm9yKSB7IGZpbGVzQ2hhbmdlZCA9IHRydWU7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLm9uVW5yZWFkYWJsZUZpbGUpIGF3YWl0IGNvbmZpZy5vblVucmVhZGFibGVGaWxlKGYsIChlIGFzIEVycm9yKS5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAgICAgICAgIGxvYWRTdHJlYW1FbnRyaWVzKGNvbmZpZy5uYW1lLCBjb25maWcuc3RvcmFnZSwgc3RyZWFtRmlsZXMsIGNvbmZpZy5zdWJDYWNoZXMuc3RyZWFtKSxcbiAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgICBpZiAoc3RyZWFtRGF0YS5taXNzaW5nKSBmaWxlc0NoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmIChmaWxlc0NoYW5nZWQgJiYgIXRvbGVyYXRlTWlzc2luZykgdGhyb3cgbmV3IEZpbGVzQ2hhbmdlZEVycm9yKCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBidWxrUmVhZGVycyA9IGJ1bGtSZWFkZXJzUmF3LmZpbHRlcigocik6IHIgaXMgQmFzZUJ1bGtEYXRhYmFzZVJlYWRlciA9PiAhIXIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlYWRlcnM6IEJhc2VCdWxrRGF0YWJhc2VSZWFkZXJbXSA9IFtdO1xuICAgICAgICAgICAgICAgIGxldCBzdHJlYW1UaW1lcyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3JkZXJlZCA9IG9yZGVyU3RyZWFtRW50cmllcyhzdHJlYW1EYXRhLmVudHJpZXMpO1xuICAgICAgICAgICAgICAgIGlmIChvcmRlcmVkLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJlYW0gPSBzdHJlYW1SZWFkZXJGcm9tRW50cmllcyhvcmRlcmVkLCBzdHJlYW1EYXRhLnRvdGFsQnl0ZXMpO1xuICAgICAgICAgICAgICAgICAgICByZWFkZXJzLnB1c2goc3RyZWFtLnJlYWRlcik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbVRpbWVzID0gc3RyZWFtLnRpbWVzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZWFkZXJzLnB1c2goLi4uYnVsa1JlYWRlcnMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlYWRlciA9IGpvaW5CdWxrRGF0YWJhc2VzKHJlYWRlcnMpO1xuXG4gICAgICAgICAgICAgICAgcHJ1bmVTdWJDYWNoZXMoYnVsa0ZpbGVzLCBzdHJlYW1GaWxlcywgY29uZmlnLnN1YkNhY2hlcyk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBlbGFwc2VkID0gRGF0ZS5ub3coKSAtIHN0YXJ0O1xuICAgICAgICAgICAgICAgIGlmIChlbGFwc2VkID4gNTApIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGJ5dGVzUmVhZCA9IHN0cmVhbURhdGEudG90YWxCeXRlcztcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCByIG9mIGJ1bGtSZWFkZXJzKSBieXRlc1JlYWQgKz0gci5jb2x1bW5zLmZpbmQoYyA9PiBjLmNvbHVtbiA9PT0gS0VZX0NPTFVNTik/LmJ5dGVTaXplID8/IDA7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGAke2JsdWUoY29uZmlnLm5hbWUpfSBsb2FkZWQgaW4gJHtyZWQoZm9ybWF0VGltZShlbGFwc2VkKSl9ICgke2JsdWUoZm9ybWF0TnVtYmVyKHJlYWRlci5yb3dDb3VudCkpfSByb3dzLCAke2J1bGtGaWxlcy5sZW5ndGh9IGJ1bGsgKyAke3N0cmVhbUZpbGVzLmxlbmd0aH0gc3RyZWFtIGZpbGVzLCByZWFkICR7Ymx1ZShmb3JtYXROdW1iZXIoYnl0ZXNSZWFkKSl9QilgKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IExvYWRlZEluZGV4PFQ+KFxuICAgICAgICAgICAgICAgICAgICBjb25maWcubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnLnN0b3JhZ2UsXG4gICAgICAgICAgICAgICAgICAgIGJ1bGtGaWxlcyxcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtRmlsZXMsXG4gICAgICAgICAgICAgICAgICAgIHJlYWRlcixcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtVGltZXMsXG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbURhdGEuc2l6ZXMsXG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbURhdGEuZW50cmllcy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbURhdGEudG90YWxCeXRlcyxcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnLnN1YkNhY2hlcyxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgRmlsZXNDaGFuZ2VkRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgYXR0ZW1wdCsrO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFkb3B0cyB0aGUgcHJldmlvdXMgaW5kZXgncyBsb2FkZWQgYmFzZSB2YWx1ZXMgYXMgU1RBTEUgb24gdGhpcyBvbmUsIHNvIGEgc3luYyByZWFkIG1pZC1zd2FwIGNhbiBzZXJ2ZSB0aGUgb2xkIHZhbHVlIChwYXRjaGVkIHdpdGggdGhlIGN1cnJlbnQgb3ZlcmxheSkgaW5zdGVhZCBvZiBmbGFzaGluZyBlbXB0eSB3aGlsZSB0aGUgZnJlc2ggbG9hZCBydW5zLiBQZXItZW50cnk6IGRyb3BwZWQgd2hlbiB0aGUgZnJlc2ggdmFsdWUgbGFuZHMgaGVyZS5cbiAgICBpbmhlcml0U3RhbGVGcm9tKHByZXY6IExvYWRlZEluZGV4PFQ+KTogdm9pZCB7XG4gICAgICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIHByZXYuYmFzZUNvbHVtbnMpIHRoaXMuc3RhbGVCYXNlQ29sdW1ucy5zZXQoaywgdik7XG4gICAgICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIHByZXYuc3RhbGVCYXNlQ29sdW1ucykgaWYgKCF0aGlzLnN0YWxlQmFzZUNvbHVtbnMuaGFzKGspKSB0aGlzLnN0YWxlQmFzZUNvbHVtbnMuc2V0KGssIHYpO1xuICAgICAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBwcmV2LmJhc2VGaWVsZHMpIHRoaXMuc3RhbGVCYXNlRmllbGRzLnNldChrLCB2KTtcbiAgICAgICAgZm9yIChjb25zdCBbaywgdl0gb2YgcHJldi5zdGFsZUJhc2VGaWVsZHMpIGlmICghdGhpcy5zdGFsZUJhc2VGaWVsZHMuaGFzKGspKSB0aGlzLnN0YWxlQmFzZUZpZWxkcy5zZXQoaywgdik7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0Q29sdW1uKGNvbHVtbjogc3RyaW5nKTogUHJvbWlzZTx7IGtleTogc3RyaW5nOyB2YWx1ZTogdW5rbm93bjsgdGltZTogbnVtYmVyIH1bXT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWFkZXIuZ2V0Q29sdW1uKGNvbHVtbik7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0U2luZ2xlRmllbGQoa2V5OiBzdHJpbmcsIGNvbHVtbjogc3RyaW5nKTogUHJvbWlzZTx7IHZhbHVlOiB1bmtub3duOyB0aW1lOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWFkZXIuZ2V0U2luZ2xlRmllbGQoa2V5LCBjb2x1bW4pO1xuICAgIH1cblxuICAgIGVuc3VyZUJhc2VDb2x1bW4oY29sdW1uOiBzdHJpbmcsIG9uTG9hZGVkOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmJhc2VDb2x1bW5zLmhhcyhjb2x1bW4pIHx8IHRoaXMuYmFzZUNvbHVtbnNMb2FkaW5nLmhhcyhjb2x1bW4pKSByZXR1cm47XG4gICAgICAgIHRoaXMuYmFzZUNvbHVtbnNMb2FkaW5nLmFkZChjb2x1bW4pO1xuICAgICAgICB2b2lkIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgdGhpcy5yZWFkZXIuZ2V0Q29sdW1uKGNvbHVtbik7XG4gICAgICAgICAgICAgICAgdGhpcy5iYXNlQ29sdW1ucy5zZXQoY29sdW1uLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGFsZUJhc2VDb2x1bW5zLmRlbGV0ZShjb2x1bW4pO1xuICAgICAgICAgICAgICAgIHRoaXMuYmFzZUNvbHVtbnNMb2FkaW5nLmRlbGV0ZShjb2x1bW4pO1xuICAgICAgICAgICAgICAgIG9uTG9hZGVkKCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5iYXNlQ29sdW1uc0xvYWRpbmcuZGVsZXRlKGNvbHVtbik7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGAke3RoaXMubmFtZX0uZ2V0Q29sdW1uU3luYygke0pTT04uc3RyaW5naWZ5KGNvbHVtbil9KSBsb2FkIGZhaWxlZCwgd2lsbCByZXRyeTogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkoKTtcbiAgICB9XG5cbiAgICBlbnN1cmVCYXNlRmllbGQoa2V5OiBzdHJpbmcsIGNvbHVtbjogc3RyaW5nLCBvbkxvYWRlZDogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgICBjb25zdCBjayA9IG51bGxKb2luKGNvbHVtbiwga2V5KTtcbiAgICAgICAgaWYgKHRoaXMuYmFzZUZpZWxkcy5oYXMoY2spIHx8IHRoaXMuYmFzZUZpZWxkc0xvYWRpbmcuaGFzKGNrKSkgcmV0dXJuO1xuICAgICAgICB0aGlzLmJhc2VGaWVsZHNMb2FkaW5nLmFkZChjayk7XG4gICAgICAgIHZvaWQgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCB0aGlzLnJlYWRlci5nZXRTaW5nbGVGaWVsZChrZXksIGNvbHVtbik7XG4gICAgICAgICAgICAgICAgdGhpcy5iYXNlRmllbGRzLnNldChjaywgdmFsdWUpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhbGVCYXNlRmllbGRzLmRlbGV0ZShjayk7XG4gICAgICAgICAgICAgICAgdGhpcy5iYXNlRmllbGRzTG9hZGluZy5kZWxldGUoY2spO1xuICAgICAgICAgICAgICAgIG9uTG9hZGVkKCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5iYXNlRmllbGRzTG9hZGluZy5kZWxldGUoY2spO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgJHt0aGlzLm5hbWV9LmdldFNpbmdsZUZpZWxkU3luYygke0pTT04uc3RyaW5naWZ5KGtleSl9LCAke0pTT04uc3RyaW5naWZ5KGNvbHVtbil9KSBsb2FkIGZhaWxlZCwgd2lsbCByZXRyeTogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkoKTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm5zIHRoZSBsb2FkZWQgdmFsdWUgKGZyZXNoIGlmIGF2YWlsYWJsZSwgZWxzZSBsYXN0LWtub3duIHN0YWxlKSBmb3IgdGhlIGNvbHVtbiwgb3IgdW5kZWZpbmVkIGlmIG5laXRoZXIgaXMgcHJlc2VudCB5ZXQuIFRoZSBib29sZWFuIGluZGljYXRlcyB3aGV0aGVyIHRoZSByZXR1cm5lZCB2YWx1ZSBpcyBmcmVzaDsgY2FsbGVycyBtYXkgc2tpcCBjYWNoaW5nIGEgc3RhbGUgdmFsdWUuXG4gICAgZ2V0QmFzZUNvbHVtbihjb2x1bW46IHN0cmluZyk6IHsgZW50cmllczogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHVua25vd247IHRpbWU6IG51bWJlciB9W107IGZyZXNoOiBib29sZWFuIH0gfCB1bmRlZmluZWQge1xuICAgICAgICBjb25zdCBmcmVzaCA9IHRoaXMuYmFzZUNvbHVtbnMuZ2V0KGNvbHVtbik7XG4gICAgICAgIGlmIChmcmVzaCkgcmV0dXJuIHsgZW50cmllczogZnJlc2gsIGZyZXNoOiB0cnVlIH07XG4gICAgICAgIGNvbnN0IHN0YWxlID0gdGhpcy5zdGFsZUJhc2VDb2x1bW5zLmdldChjb2x1bW4pO1xuICAgICAgICBpZiAoc3RhbGUpIHJldHVybiB7IGVudHJpZXM6IHN0YWxlLCBmcmVzaDogZmFsc2UgfTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBnZXRCYXNlRmllbGQoa2V5OiBzdHJpbmcsIGNvbHVtbjogc3RyaW5nKTogeyB2YWx1ZTogeyB2YWx1ZTogdW5rbm93bjsgdGltZTogbnVtYmVyIH0gfCB1bmRlZmluZWQ7IGZyZXNoOiBib29sZWFuOyBsb2FkZWQ6IGJvb2xlYW4gfSB7XG4gICAgICAgIGNvbnN0IGNrID0gbnVsbEpvaW4oY29sdW1uLCBrZXkpO1xuICAgICAgICBpZiAodGhpcy5iYXNlRmllbGRzLmhhcyhjaykpIHJldHVybiB7IHZhbHVlOiB0aGlzLmJhc2VGaWVsZHMuZ2V0KGNrKSwgZnJlc2g6IHRydWUsIGxvYWRlZDogdHJ1ZSB9O1xuICAgICAgICBpZiAodGhpcy5zdGFsZUJhc2VGaWVsZHMuaGFzKGNrKSkgcmV0dXJuIHsgdmFsdWU6IHRoaXMuc3RhbGVCYXNlRmllbGRzLmdldChjayksIGZyZXNoOiBmYWxzZSwgbG9hZGVkOiB0cnVlIH07XG4gICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGZyZXNoOiBmYWxzZSwgbG9hZGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIGlzQmFzZUNvbHVtbkxvYWRlZChjb2x1bW46IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5iYXNlQ29sdW1ucy5oYXMoY29sdW1uKSB8fCB0aGlzLnN0YWxlQmFzZUNvbHVtbnMuaGFzKGNvbHVtbik7XG4gICAgfVxuXG4gICAgaXNCYXNlRmllbGRMb2FkZWQoa2V5OiBzdHJpbmcsIGNvbHVtbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGNrID0gbnVsbEpvaW4oY29sdW1uLCBrZXkpO1xuICAgICAgICByZXR1cm4gdGhpcy5iYXNlRmllbGRzLmhhcyhjaykgfHwgdGhpcy5zdGFsZUJhc2VGaWVsZHMuaGFzKGNrKTtcbiAgICB9XG5cbiAgICAvLyBEcm9wcyBpbi1tZW1vcnkgbG9hZGVkIHZhbHVlcyBmb3IgdGhpcyBpbmRleCwgc28gYSBzdWJzZXF1ZW50IHJlYWQgcmVsb2FkcyBmcmVzaCBmcm9tIGRpc2suIFVzZWQgYnkgcmVsb2FkRnJvbURpc2soKSDigJQgYSBoYXJkIHJlc2V0LCBubyBzdGFsZSBmYWxsYmFjayBzdXJ2aXZlcy5cbiAgICBkcm9wTG9hZGVkVmFsdWVzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmJhc2VDb2x1bW5zLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuYmFzZUNvbHVtbnNMb2FkaW5nLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuYmFzZUZpZWxkcy5jbGVhcigpO1xuICAgICAgICB0aGlzLmJhc2VGaWVsZHNMb2FkaW5nLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuc3RhbGVCYXNlQ29sdW1ucy5jbGVhcigpO1xuICAgICAgICB0aGlzLnN0YWxlQmFzZUZpZWxkcy5jbGVhcigpO1xuICAgIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG1ha2VSYXdHZXRSYW5nZShzdG9yYWdlOiBGaWxlU3RvcmFnZSwgZmlsZU5hbWU6IHN0cmluZyk6IFByb21pc2U8eyByYXdHZXRSYW5nZTogR2V0UmFuZ2U7IHNpemU6IG51bWJlciB9PiB7XG4gICAgY29uc3QgaW5mbyA9IGF3YWl0IHN0b3JhZ2UuZ2V0SW5mbyhmaWxlTmFtZSk7XG4gICAgaWYgKCFpbmZvKSB0aHJvdyBuZXcgTWlzc2luZ0ZpbGVFcnJvcihgYnVsayBmaWxlICR7ZmlsZU5hbWV9IGlzIG1pc3NpbmdgKTtcbiAgICBjb25zdCByYXdHZXRSYW5nZTogR2V0UmFuZ2UgPSBhc3luYyAoc3RhcnQsIGVuZCkgPT4ge1xuICAgICAgICBpZiAoZW5kIDw9IHN0YXJ0KSByZXR1cm4gRU1QVFlfQlVGRkVSO1xuICAgICAgICBjb25zdCBidWYgPSBhd2FpdCBzdG9yYWdlLmdldFJhbmdlKGZpbGVOYW1lLCB7IHN0YXJ0LCBlbmQgfSk7XG4gICAgICAgIGlmICghYnVmKSB0aHJvdyBuZXcgTWlzc2luZ0ZpbGVFcnJvcihgcmFuZ2UgWyR7c3RhcnR9LCAke2VuZH0pIG9mICR7ZmlsZU5hbWV9IGlzIG1pc3NpbmdgKTtcbiAgICAgICAgcmV0dXJuIGJ1ZjtcbiAgICB9O1xuICAgIHJldHVybiB7IHJhd0dldFJhbmdlLCBzaXplOiBpbmZvLnNpemUgfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRGaWxlUmVhZGVyKG5hbWU6IHN0cmluZywgc3RvcmFnZTogRmlsZVN0b3JhZ2UsIGY6IEJ1bGtGaWxlSW5mbywgY2FjaGU6IE1hcDxzdHJpbmcsIEJhc2VCdWxrRGF0YWJhc2VSZWFkZXI+KTogUHJvbWlzZTxCYXNlQnVsa0RhdGFiYXNlUmVhZGVyPiB7XG4gICAgY29uc3QgY2FjaGVkID0gY2FjaGUuZ2V0KGYuZmlsZU5hbWUpO1xuICAgIGlmIChjYWNoZWQpIHJldHVybiBjYWNoZWQ7XG4gICAgY29uc3QgcmF3ID0gYXdhaXQgbWFrZVJhd0dldFJhbmdlKHN0b3JhZ2UsIGYuZmlsZU5hbWUpO1xuICAgIGNvbnN0IGZpbGVJZCA9IG51bGxKb2luKG5hbWUsIGYuZmlsZU5hbWUpO1xuICAgIGNvbnN0IG9wZW5lZCA9IGF3YWl0IGJsb2NrQ2FjaGUub3BlbihmaWxlSWQsIHJhdy5zaXplLCByYXcucmF3R2V0UmFuZ2UpO1xuICAgIGNvbnN0IHJlYWRlciA9IGF3YWl0IGxvYWRCdWxrRGF0YWJhc2UoeyB0b3RhbEJ5dGVzOiBvcGVuZWQudW5jb21wcmVzc2VkU2l6ZSwgZ2V0UmFuZ2U6IG9wZW5lZC5nZXRSYW5nZSwgbmFtZTogYCR7QlVMS19ST09UX0ZPTERFUn0vJHtuYW1lfS8ke2YuZmlsZU5hbWV9YCB9KTtcbiAgICBjYWNoZS5zZXQoZi5maWxlTmFtZSwgcmVhZGVyKTtcbiAgICByZXR1cm4gcmVhZGVyO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZFN0cmVhbUVudHJpZXMoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHN0b3JhZ2U6IEZpbGVTdG9yYWdlLFxuICAgIHN0cmVhbUZpbGVzOiBTdHJlYW1GaWxlSW5mb1tdLFxuICAgIGNhY2hlOiBNYXA8c3RyaW5nLCBTdHJlYW1SZWFkZXJDYWNoZUVudHJ5Pixcbik6IFByb21pc2U8eyBlbnRyaWVzOiB7IHRpbWU6IG51bWJlcjsgZmlsZU5hbWU6IHN0cmluZzsgZW50cnk6IFN0cmVhbUVudHJ5IH1bXTsgdG90YWxCeXRlczogbnVtYmVyOyBtaXNzaW5nOiBib29sZWFuOyBzaXplczogTWFwPHN0cmluZywgbnVtYmVyPiB9PiB7XG4gICAgY29uc3Qgc2l6ZXMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgIGlmICghc3RyZWFtRmlsZXMubGVuZ3RoKSByZXR1cm4geyBlbnRyaWVzOiBbXSwgdG90YWxCeXRlczogMCwgbWlzc2luZzogZmFsc2UsIHNpemVzIH07XG4gICAgbGV0IG1pc3NpbmcgPSBmYWxzZTtcbiAgICBjb25zdCBwZXJGaWxlID0gYXdhaXQgUHJvbWlzZS5hbGwoc3RyZWFtRmlsZXMubWFwKGFzeW5jIChmKTogUHJvbWlzZTx7IGZpbGVOYW1lOiBzdHJpbmc7IHNpemU6IG51bWJlcjsgZW50cmllczogU3RyZWFtRW50cnlbXSB9IHwgdW5kZWZpbmVkPiA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBpbmZvID0gYXdhaXQgc3RvcmFnZS5nZXRJbmZvKGYuZmlsZU5hbWUpO1xuICAgICAgICAgICAgaWYgKCFpbmZvKSB7IG1pc3NpbmcgPSB0cnVlOyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gICAgICAgICAgICBjb25zdCBzaXplID0gaW5mby5zaXplO1xuICAgICAgICAgICAgc2l6ZXMuc2V0KGYuZmlsZU5hbWUsIHNpemUpO1xuICAgICAgICAgICAgY29uc3QgY2FjaGVkID0gY2FjaGUuZ2V0KGYuZmlsZU5hbWUpO1xuICAgICAgICAgICAgaWYgKGNhY2hlZCAmJiBjYWNoZWQucmVhZFNpemUgPT09IHNpemUpIHJldHVybiB7IGZpbGVOYW1lOiBmLmZpbGVOYW1lLCBzaXplLCBlbnRyaWVzOiBjYWNoZWQuZW50cmllcyB9O1xuICAgICAgICAgICAgaWYgKHNpemUgPT09IDApIHsgY2FjaGUuc2V0KGYuZmlsZU5hbWUsIHsgcmVhZFNpemU6IDAsIHBhcnNlZFBvczogMCwgZW50cmllczogW10gfSk7IHJldHVybiB7IGZpbGVOYW1lOiBmLmZpbGVOYW1lLCBzaXplOiAwLCBlbnRyaWVzOiBbXSB9OyB9XG4gICAgICAgICAgICAvLyBBcHBlbmQtb25seTogYSBsYXJnZXIgc2l6ZSBtZWFucyBuZXcgYnl0ZXMgYXQgdGhlIHRhaWwsIHBhcnNlIG9ubHkgdGhvc2UuXG4gICAgICAgICAgICBpZiAoY2FjaGVkICYmIHNpemUgPiBjYWNoZWQucmVhZFNpemUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdWZmaXggPSBhd2FpdCBzdG9yYWdlLmdldFJhbmdlKGYuZmlsZU5hbWUsIHsgc3RhcnQ6IGNhY2hlZC5wYXJzZWRQb3MsIGVuZDogc2l6ZSB9KTtcbiAgICAgICAgICAgICAgICBpZiAoIXN1ZmZpeCkgeyBtaXNzaW5nID0gdHJ1ZTsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlU3RyZWFtKHN1ZmZpeCk7XG4gICAgICAgICAgICAgICAgaWYgKHBhcnNlZC5iYWRCeXRlcyA+IDApIGNvbnNvbGUud2FybihgJHtuYW1lfSBzdHJlYW0gZmlsZSAke2YuZmlsZU5hbWV9IGhhZCAke3BhcnNlZC5iYWRCeXRlc30gdHJhaWxpbmcgYmFkL2luY29tcGxldGUgYnl0ZXMgKHN0b3BwZWQgcmVhZGluZyB0aGVyZSlgKTtcbiAgICAgICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gcGFyc2VkLmVudHJpZXMubGVuZ3RoID8gY2FjaGVkLmVudHJpZXMuY29uY2F0KHBhcnNlZC5lbnRyaWVzKSA6IGNhY2hlZC5lbnRyaWVzO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZFBvcyA9IGNhY2hlZC5wYXJzZWRQb3MgKyAoc3VmZml4Lmxlbmd0aCAtIHBhcnNlZC5iYWRCeXRlcyk7XG4gICAgICAgICAgICAgICAgY2FjaGUuc2V0KGYuZmlsZU5hbWUsIHsgcmVhZFNpemU6IHNpemUsIHBhcnNlZFBvcywgZW50cmllcyB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBmaWxlTmFtZTogZi5maWxlTmFtZSwgc2l6ZSwgZW50cmllcyB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYnVmZmVyID0gYXdhaXQgc3RvcmFnZS5nZXRSYW5nZShmLmZpbGVOYW1lLCB7IHN0YXJ0OiAwLCBlbmQ6IHNpemUgfSk7XG4gICAgICAgICAgICBpZiAoIWJ1ZmZlcikgeyBtaXNzaW5nID0gdHJ1ZTsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gcGFyc2VTdHJlYW0oYnVmZmVyKTtcbiAgICAgICAgICAgIGlmIChwYXJzZWQuYmFkQnl0ZXMgPiAwKSBjb25zb2xlLndhcm4oYCR7bmFtZX0gc3RyZWFtIGZpbGUgJHtmLmZpbGVOYW1lfSBoYWQgJHtwYXJzZWQuYmFkQnl0ZXN9IHRyYWlsaW5nIGJhZC9pbmNvbXBsZXRlIGJ5dGVzIChzdG9wcGVkIHJlYWRpbmcgdGhlcmUpYCk7XG4gICAgICAgICAgICBjYWNoZS5zZXQoZi5maWxlTmFtZSwgeyByZWFkU2l6ZTogc2l6ZSwgcGFyc2VkUG9zOiBzaXplIC0gcGFyc2VkLmJhZEJ5dGVzLCBlbnRyaWVzOiBwYXJzZWQuZW50cmllcyB9KTtcbiAgICAgICAgICAgIHJldHVybiB7IGZpbGVOYW1lOiBmLmZpbGVOYW1lLCBzaXplLCBlbnRyaWVzOiBwYXJzZWQuZW50cmllcyB9O1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIG1pc3NpbmcgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH0pKTtcbiAgICBjb25zdCBlbnRyaWVzOiB7IHRpbWU6IG51bWJlcjsgZmlsZU5hbWU6IHN0cmluZzsgZW50cnk6IFN0cmVhbUVudHJ5IH1bXSA9IFtdO1xuICAgIGxldCB0b3RhbEJ5dGVzID0gMDtcbiAgICBmb3IgKGNvbnN0IHBmIG9mIHBlckZpbGUpIHtcbiAgICAgICAgaWYgKCFwZikgY29udGludWU7XG4gICAgICAgIHRvdGFsQnl0ZXMgKz0gcGYuc2l6ZTtcbiAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBwZi5lbnRyaWVzKSBlbnRyaWVzLnB1c2goeyB0aW1lOiBlbnRyeS50aW1lLCBmaWxlTmFtZTogcGYuZmlsZU5hbWUsIGVudHJ5IH0pO1xuICAgIH1cbiAgICByZXR1cm4geyBlbnRyaWVzLCB0b3RhbEJ5dGVzLCBtaXNzaW5nLCBzaXplcyB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gb3JkZXJTdHJlYW1FbnRyaWVzKGVudHJpZXM6IHsgdGltZTogbnVtYmVyOyBmaWxlTmFtZTogc3RyaW5nOyBlbnRyeTogU3RyZWFtRW50cnkgfVtdKTogU3RyZWFtRW50cnlbXSB7XG4gICAgZW50cmllcy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgIGlmIChhLnRpbWUgIT09IGIudGltZSkgcmV0dXJuIGEudGltZSAtIGIudGltZTtcbiAgICAgICAgcmV0dXJuIGEuZmlsZU5hbWUgPCBiLmZpbGVOYW1lICYmIC0xIHx8IGEuZmlsZU5hbWUgPiBiLmZpbGVOYW1lICYmIDEgfHwgMDtcbiAgICB9KTtcbiAgICByZXR1cm4gZW50cmllcy5tYXAoZSA9PiBlLmVudHJ5KTtcbn1cblxuZnVuY3Rpb24gcHJ1bmVTdWJDYWNoZXMoYnVsa0ZpbGVzOiBCdWxrRmlsZUluZm9bXSwgc3RyZWFtRmlsZXM6IFN0cmVhbUZpbGVJbmZvW10sIHN1YkNhY2hlczogU3ViUmVhZGVyQ2FjaGVzKSB7XG4gICAgY29uc3QgbGl2ZUJ1bGsgPSBuZXcgU2V0KGJ1bGtGaWxlcy5tYXAoZiA9PiBmLmZpbGVOYW1lKSk7XG4gICAgY29uc3QgbGl2ZVN0cmVhbSA9IG5ldyBTZXQoc3RyZWFtRmlsZXMubWFwKGYgPT4gZi5maWxlTmFtZSkpO1xuICAgIGZvciAoY29uc3QgbiBvZiBzdWJDYWNoZXMuYnVsay5rZXlzKCkpIGlmICghbGl2ZUJ1bGsuaGFzKG4pKSBzdWJDYWNoZXMuYnVsay5kZWxldGUobik7XG4gICAgZm9yIChjb25zdCBuIG9mIHN1YkNhY2hlcy5zdHJlYW0ua2V5cygpKSBpZiAoIWxpdmVTdHJlYW0uaGFzKG4pKSBzdWJDYWNoZXMuc3RyZWFtLmRlbGV0ZShuKTtcbn1cblxuLy8gQSBjb3JydXB0L3VucmVhZGFibGUgY29sdW1uIGluIE9ORSB1bmRlcmx5aW5nIGZpbGUgbXVzdCBub3QgYnJlYWsgdGhlIHdob2xlIGpvaW5lZCByZWFkLiBXaGVuIGEgc291cmNlJ3MgY29sdW1uIHJlYWQgdGhyb3dzLCB3ZSBkcm9wIHRoYXQgc291cmNlIGZvciB0aGF0IGNvbHVtbiAoZmFsbGluZyB0aHJvdWdoIHRvIG9sZGVyIHJlYWRlcnMsIGV4YWN0bHkgYXMgaWYgdGhlIGZpbGUgbmV2ZXIgc2V0IHRoZSBjb2x1bW4pIGFuZCB3YXJuIG9uY2UgcGVyIChmaWxlLCBjb2x1bW4pIHNvIHRoZSBjb3JydXB0aW9uIGlzIHZpc2libGUgd2l0aG91dCBmbG9vZGluZyB0aGUgbG9nIG9uIGV2ZXJ5IHJlYnVpbGQuXG5jb25zdCB3YXJuZWRDb3JydXB0UmVhZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbmZ1bmN0aW9uIHdhcm5Db3JydXB0UmVhZChkYjogQmFzZUJ1bGtEYXRhYmFzZVJlYWRlciwgY29sdW1uOiBzdHJpbmcsIGU6IHVua25vd24pOiB2b2lkIHtcbiAgICBjb25zdCBwYXRoID0gZGIubmFtZSB8fCBcIih1bmtub3duIHNvdXJjZSlcIjtcbiAgICBjb25zdCBkZWR1cGVLZXkgPSBudWxsSm9pbihwYXRoLCBjb2x1bW4pO1xuICAgIGlmICh3YXJuZWRDb3JydXB0UmVhZHMuaGFzKGRlZHVwZUtleSkpIHJldHVybjtcbiAgICB3YXJuZWRDb3JydXB0UmVhZHMuYWRkKGRlZHVwZUtleSk7XG4gICAgY29uc29sZS53YXJuKGAke3JlZChcImNvcnJ1cHQgcmVhZFwiKX06IGZpbGUgJHtwYXRofSBjb2x1bW4gJHtKU09OLnN0cmluZ2lmeShjb2x1bW4pfSBjb3VsZCBub3QgYmUgcmVhZCAtIHNraXBwaW5nIGl0IChpdHMgZGF0YSBpcyBkcm9wcGVkIGZyb20gcmVzdWx0cyk6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG59XG5cbmZ1bmN0aW9uIGpvaW5CdWxrRGF0YWJhc2VzKGRhdGFiYXNlczogQmFzZUJ1bGtEYXRhYmFzZVJlYWRlcltdKTogUmVzb2x2ZWRSZWFkZXIge1xuICAgIGNvbnN0IGRlbGV0ZVRpbWUgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgIGZvciAoY29uc3QgZGIgb2YgZGF0YWJhc2VzKSB7XG4gICAgICAgIGlmICghZGIuZGVsZXRlVGltZXMpIGNvbnRpbnVlO1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHRdIG9mIGRiLmRlbGV0ZVRpbWVzKSBkZWxldGVUaW1lLnNldChrZXksIE1hdGgubWF4KGRlbGV0ZVRpbWUuZ2V0KGtleSkgPz8gLUluZmluaXR5LCB0KSk7XG4gICAgfVxuICAgIGNvbnN0IGtleVRpbWUgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgIGZvciAoY29uc3QgZGIgb2YgZGF0YWJhc2VzKSB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdF0gb2YgZGIua2V5VGltZXMpIGtleVRpbWUuc2V0KGtleSwgTWF0aC5tYXgoa2V5VGltZS5nZXQoa2V5KSA/PyAtSW5maW5pdHksIHQpKTtcbiAgICB9XG4gICAgY29uc3QgZGVsT2YgPSAoa2V5OiBzdHJpbmcpID0+IGRlbGV0ZVRpbWUuZ2V0KGtleSkgPz8gLUluZmluaXR5O1xuICAgIGNvbnN0IGtleXM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCBba2V5LCB0XSBvZiBrZXlUaW1lKSBpZiAodCA+IGRlbE9mKGtleSkpIGtleXMucHVzaChrZXkpO1xuXG4gICAgY29uc3QgY29sdW1uczogeyBjb2x1bW46IHN0cmluZzsgYnl0ZVNpemU6IG51bWJlciB9W10gPSBbXTtcbiAgICBjb25zdCBjb2x1bW5CeU5hbWUgPSBuZXcgTWFwPHN0cmluZywgeyBjb2x1bW46IHN0cmluZzsgYnl0ZVNpemU6IG51bWJlciB9PigpO1xuICAgIGZvciAoY29uc3QgZGIgb2YgZGF0YWJhc2VzKSB7XG4gICAgICAgIGZvciAoY29uc3QgY29sIG9mIGRiLmNvbHVtbnMpIHtcbiAgICAgICAgICAgIGxldCBleGlzdGluZyA9IGNvbHVtbkJ5TmFtZS5nZXQoY29sLmNvbHVtbik7XG4gICAgICAgICAgICBpZiAoIWV4aXN0aW5nKSB7XG4gICAgICAgICAgICAgICAgZXhpc3RpbmcgPSB7IGNvbHVtbjogY29sLmNvbHVtbiwgYnl0ZVNpemU6IDAgfTtcbiAgICAgICAgICAgICAgICBjb2x1bW5CeU5hbWUuc2V0KGNvbC5jb2x1bW4sIGV4aXN0aW5nKTtcbiAgICAgICAgICAgICAgICBjb2x1bW5zLnB1c2goZXhpc3RpbmcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZXhpc3RpbmcuYnl0ZVNpemUgKz0gY29sLmJ5dGVTaXplO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgdG90YWxCeXRlczogZGF0YWJhc2VzLnJlZHVjZSgoYWNjLCBkYikgPT4gYWNjICsgZGIudG90YWxCeXRlcywgMCksXG4gICAgICAgIHJvd0NvdW50OiBrZXlzLmxlbmd0aCxcbiAgICAgICAga2V5cyxcbiAgICAgICAgcmF3S2V5Q291bnQ6IGRhdGFiYXNlcy5yZWR1Y2UoKGFjYywgZGIpID0+IGFjYyArIGRiLmtleVRpbWVzLnNpemUgKyAoZGIuZGVsZXRlVGltZXM/LnNpemUgPz8gMCksIDApLFxuICAgICAgICByZWFkZXJDb3VudDogZGF0YWJhc2VzLmxlbmd0aCxcbiAgICAgICAgY29sdW1ucyxcbiAgICAgICAga2V5VGltZXM6IGtleVRpbWUsXG4gICAgICAgIGRlbGV0ZVRpbWVzOiBkZWxldGVUaW1lLFxuICAgICAgICBhc3luYyBnZXRDb2x1bW4oY29sdW1uKSB7XG4gICAgICAgICAgICBjb25zdCBwZXJSZWFkZXIgPSBhd2FpdCBQcm9taXNlLmFsbChkYXRhYmFzZXMubWFwKGFzeW5jIGRiID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWRiLmNvbHVtbnMuc29tZShjID0+IGMuY29sdW1uID09PSBjb2x1bW4pKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVudHJpZXMgPSBhd2FpdCBkYi5nZXRDb2x1bW4oY29sdW1uKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBNYXAoZW50cmllcy5tYXAoZSA9PiBbZS5rZXksIHsgdmFsdWU6IGUudmFsdWUsIHRpbWU6IGUudGltZSB9XSkpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgd2FybkNvcnJ1cHRSZWFkKGRiLCBjb2x1bW4sIGUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIHJldHVybiBrZXlzLm1hcChrZXkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBiZXN0VGltZSA9IC1JbmZpbml0eTtcbiAgICAgICAgICAgICAgICBsZXQgYmVzdFZhbDogdW5rbm93bjtcbiAgICAgICAgICAgICAgICBsZXQgZm91bmQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IG0gb2YgcGVyUmVhZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNlbGwgPSBtICYmIG0uZ2V0KGtleSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY2VsbCB8fCBjZWxsLnZhbHVlID09PSBBQlNFTlQpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2VsbC50aW1lID4gYmVzdFRpbWUpIHsgYmVzdFRpbWUgPSBjZWxsLnRpbWU7IGJlc3RWYWwgPSBjZWxsLnZhbHVlOyBmb3VuZCA9IHRydWU7IH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgbGl2ZSA9IGZvdW5kICYmIGJlc3RUaW1lID4gZGVsT2Yoa2V5KTtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBrZXksIHZhbHVlOiBsaXZlID8gYmVzdFZhbCA6IHVuZGVmaW5lZCwgdGltZTogbGl2ZSA/IGJlc3RUaW1lIDogKGtleVRpbWUuZ2V0KGtleSkgPz8gMCkgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBhc3luYyBnZXRTaW5nbGVGaWVsZChrZXksIGNvbHVtbikge1xuICAgICAgICAgICAgY29uc3Qga3QgPSBrZXlUaW1lLmdldChrZXkpO1xuICAgICAgICAgICAgaWYgKGt0ID09PSB1bmRlZmluZWQgfHwga3QgPD0gZGVsT2Yoa2V5KSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGxldCBiZXN0VGltZSA9IC1JbmZpbml0eTtcbiAgICAgICAgICAgIGxldCBiZXN0VmFsOiB1bmtub3duO1xuICAgICAgICAgICAgbGV0IGZvdW5kID0gZmFsc2U7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGRiIG9mIGRhdGFiYXNlcykge1xuICAgICAgICAgICAgICAgIGlmICghZGIuY29sdW1ucy5zb21lKGMgPT4gYy5jb2x1bW4gPT09IGNvbHVtbikpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGxldCByO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHIgPSBhd2FpdCBkYi5nZXRTaW5nbGVGaWVsZChrZXksIGNvbHVtbik7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICB3YXJuQ29ycnVwdFJlYWQoZGIsIGNvbHVtbiwgZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAociA9PT0gQUJTRU5UKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBpZiAoci50aW1lID4gYmVzdFRpbWUpIHsgYmVzdFRpbWUgPSByLnRpbWU7IGJlc3RWYWwgPSByLnZhbHVlOyBmb3VuZCA9IHRydWU7IH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGxpdmUgPSBmb3VuZCAmJiBiZXN0VGltZSA+IGRlbE9mKGtleSk7XG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbGl2ZSA/IGJlc3RWYWwgOiB1bmRlZmluZWQsIHRpbWU6IGxpdmUgPyBiZXN0VGltZSA6IGt0IH07XG4gICAgICAgIH0sXG4gICAgfTtcbn1cbiJdfQ==
|
|
423
|
-
/* _JS_SOURCE_HASH = "
|
|
425
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTG9hZGVkSW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJMb2FkZWRJbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSw2REFBa0g7QUFDbEgsNkNBQW9EO0FBQ3BELDJDQUFrRztBQUNsRyxrRUFBaUY7QUFDakYsd0VBQXFFO0FBRXJFLG9JQUFvSTtBQUNwSSxNQUFNLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDO0FBTTFDLE1BQWEsZ0JBQWlCLFNBQVEsS0FBSztDQUFJO0FBQS9DLDRDQUErQztBQUMvQyxNQUFNLGlCQUFrQixTQUFRLEtBQUs7Q0FBSTtBQW9CekMsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLENBQUM7QUFFNUIsU0FBUyxRQUFRLENBQUMsQ0FBUyxFQUFFLENBQVM7SUFDbEMsT0FBTyxDQUFDLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDMUMsQ0FBQztBQUVELG9XQUFvVztBQUNwVyxNQUFhLFdBQVc7SUFDcEIsWUFDb0IsSUFBWSxFQUNaLE9BQW9CLEVBQ3BCLFNBQXlCLEVBQ3pCLFdBQTZCLEVBQzdCLE1BQXNCLEVBQ3RCLFdBQWdDLEVBQ2hDLFdBQWdDLEVBQ2hDLGdCQUF3QixFQUN4QixpQkFBeUIsRUFDekIsU0FBMEI7UUFUMUIsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUNaLFlBQU8sR0FBUCxPQUFPLENBQWE7UUFDcEIsY0FBUyxHQUFULFNBQVMsQ0FBZ0I7UUFDekIsZ0JBQVcsR0FBWCxXQUFXLENBQWtCO1FBQzdCLFdBQU0sR0FBTixNQUFNLENBQWdCO1FBQ3RCLGdCQUFXLEdBQVgsV0FBVyxDQUFxQjtRQUNoQyxnQkFBVyxHQUFYLFdBQVcsQ0FBcUI7UUFDaEMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFRO1FBQ3hCLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBUTtRQUN6QixjQUFTLEdBQVQsU0FBUyxDQUFpQjtRQVN0QyxnQkFBVyxHQUFHLElBQUks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QUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7b0JBQ1QsZUFBZSxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQy9CLFNBQVM7Z0JBQ2IsQ0FBQztnQkFDRCxJQUFJLENBQUMsS0FBSywyQkFBTTtvQkFBRSxTQUFTO2dCQUMzQixJQUFJLENBQUMsQ0FBQyxJQUFJLEdBQUcsUUFBUSxFQUFFLENBQUM7b0JBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7b0JBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUM7b0JBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztnQkFBQyxDQUFDO1lBQ2xGLENBQUM7WUFDRCxNQUFNLElBQUksR0FBRyxLQUFLLElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM1QyxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUM3RSxDQUFDO0tBQ0osQ0FBQztBQUNOLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEZpbGVTdG9yYWdlIH0gZnJvbSBcIi4uL0ZpbGVGb2xkZXJBUElcIjtcbmltcG9ydCB7IEFCU0VOVCwgQmFzZUJ1bGtEYXRhYmFzZVJlYWRlciwgRU1QVFlfQlVGRkVSLCBLRVlfQ09MVU1OLCBsb2FkQnVsa0RhdGFiYXNlIH0gZnJvbSBcIi4vQnVsa0RhdGFiYXNlRm9ybWF0XCI7XG5pbXBvcnQgeyBibG9ja0NhY2hlLCBHZXRSYW5nZSB9IGZyb20gXCIuL2Jsb2NrQ2FjaGVcIjtcbmltcG9ydCB7IFNUUkVBTV9FWFRFTlNJT04sIFN0cmVhbUVudHJ5LCBwYXJzZVN0cmVhbSwgc3RyZWFtUmVhZGVyRnJvbUVudHJpZXMgfSBmcm9tIFwiLi9zdHJlYW1Mb2dcIjtcbmltcG9ydCB7IGZvcm1hdE51bWJlciwgZm9ybWF0VGltZSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2Zvcm1hdHRpbmcvZm9ybWF0XCI7XG5pbXBvcnQgeyBibHVlLCByZWQgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9mb3JtYXR0aW5nL2xvZ0NvbG9yc1wiO1xuXG4vLyBEdXBsaWNhdGVkIGZyb20gQnVsa0RhdGFiYXNlQmFzZSB0byBhdm9pZCBhIGNpcmN1bGFyIGltcG9ydCDigJQgdXNlZCBvbmx5IHRvIGJ1aWxkIGEgZnVsbGVyIHN0b3JhZ2UtcmVsYXRpdmUgcGF0aCBmb3IgbG9nIG1lc3NhZ2VzLlxuY29uc3QgQlVMS19ST09UX0ZPTERFUiA9IFwiYnVsa0RhdGFiYXNlczJcIjtcblxuZXhwb3J0IHR5cGUgQnVsa0ZpbGVJbmZvID0geyBmaWxlTmFtZTogc3RyaW5nOyBsZXZlbDogbnVtYmVyOyB0aW1lc3RhbXA6IG51bWJlciB9O1xuZXhwb3J0IHR5cGUgU3RyZWFtRmlsZUluZm8gPSB7IGZpbGVOYW1lOiBzdHJpbmc7IHRpbWVzdGFtcDogbnVtYmVyIH07XG5leHBvcnQgdHlwZSBTdHJlYW1SZWFkZXJDYWNoZUVudHJ5ID0geyByZWFkU2l6ZTogbnVtYmVyOyBwYXJzZWRQb3M6IG51bWJlcjsgZW50cmllczogU3RyZWFtRW50cnlbXSB9O1xuXG5leHBvcnQgY2xhc3MgTWlzc2luZ0ZpbGVFcnJvciBleHRlbmRzIEVycm9yIHsgfVxuY2xhc3MgRmlsZXNDaGFuZ2VkRXJyb3IgZXh0ZW5kcyBFcnJvciB7IH1cblxuZXhwb3J0IHR5cGUgUmVzb2x2ZWRSZWFkZXIgPSB7XG4gICAgcm93Q291bnQ6IG51bWJlcjtcbiAgICB0b3RhbEJ5dGVzOiBudW1iZXI7XG4gICAga2V5czogc3RyaW5nW107XG4gICAgcmF3S2V5Q291bnQ6IG51bWJlcjtcbiAgICByZWFkZXJDb3VudDogbnVtYmVyO1xuICAgIGNvbHVtbnM6IHsgY29sdW1uOiBzdHJpbmc7IGJ5dGVTaXplOiBudW1iZXIgfVtdO1xuICAgIGtleVRpbWVzOiBNYXA8c3RyaW5nLCBudW1iZXI+O1xuICAgIGRlbGV0ZVRpbWVzOiBNYXA8c3RyaW5nLCBudW1iZXI+O1xuICAgIGdldENvbHVtbjogKGNvbHVtbjogc3RyaW5nKSA9PiBQcm9taXNlPHsga2V5OiBzdHJpbmc7IHZhbHVlOiB1bmtub3duOyB0aW1lOiBudW1iZXIgfVtdPjtcbiAgICBnZXRTaW5nbGVGaWVsZDogKGtleTogc3RyaW5nLCBjb2x1bW46IHN0cmluZykgPT4gUHJvbWlzZTx7IHZhbHVlOiB1bmtub3duOyB0aW1lOiBudW1iZXIgfSB8IHVuZGVmaW5lZD47XG59O1xuXG5leHBvcnQgdHlwZSBTdWJSZWFkZXJDYWNoZXMgPSB7XG4gICAgYnVsazogTWFwPHN0cmluZywgQmFzZUJ1bGtEYXRhYmFzZVJlYWRlcj47XG4gICAgc3RyZWFtOiBNYXA8c3RyaW5nLCBTdHJlYW1SZWFkZXJDYWNoZUVudHJ5Pjtcbn07XG5cbmNvbnN0IE1BWF9SRUFEX0FUVEVNUFRTID0gODtcblxuZnVuY3Rpb24gbnVsbEpvaW4oYTogc3RyaW5nLCBiOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBhICsgU3RyaW5nLmZyb21DaGFyQ29kZSgwKSArIGI7XG59XG5cbi8vIEEgbG9hZGVkIHNuYXBzaG90IG9mIG9uZSBjb2xsZWN0aW9uJ3Mgb24tZGlzayBzdGF0ZTogdGhlIHJlc29sdmVkIHJlYWRlciArIHRoZSBwZXItZmlsZSBkZWNvZGVkIHN1Yi0gcmVhZGVycyBpdCBzdGl0Y2hlZCwgdGhlIHN0cmVhbSBmaWxlIHNpemVzL3RpbWVzIGl0IG9ic2VydmVkLCBhbmQgdGhlIHN5bmMgKHJlYWN0aXZlKSBjYWNoZXMgdGhhdCBzdXJmYWNlIGNvbHVtbi9maWVsZCByZWFkcy4gQnVpbHQgb25jZSB2aWEgTG9hZGVkSW5kZXguYnVpbGQg4oCUIGVhZ2VybHksIHNvIHRoZSBzd2FwIGludG8gYSBmcmVzaCBMb2FkZWRJbmRleCBuZXZlciBibG9ja3MgYSByZWFkIG9uIGEgc3luY2hyb25vdXMgcmVidWlsZC5cbmV4cG9ydCBjbGFzcyBMb2FkZWRJbmRleDxUIGV4dGVuZHMgeyBrZXk6IHN0cmluZyB9PiB7XG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZyxcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IHN0b3JhZ2U6IEZpbGVTdG9yYWdlLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgYnVsa0ZpbGVzOiBCdWxrRmlsZUluZm9bXSxcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IHN0cmVhbUZpbGVzOiBTdHJlYW1GaWxlSW5mb1tdLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgcmVhZGVyOiBSZXNvbHZlZFJlYWRlcixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IHN0cmVhbVRpbWVzOiBNYXA8c3RyaW5nLCBudW1iZXI+LFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgc3RyZWFtU2l6ZXM6IE1hcDxzdHJpbmcsIG51bWJlcj4sXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBzdHJlYW1Sb3dzT25EaXNrOiBudW1iZXIsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBzdHJlYW1CeXRlc09uRGlzazogbnVtYmVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgc3ViQ2FjaGVzOiBTdWJSZWFkZXJDYWNoZXMsXG4gICAgKSB7XG4gICAgICAgIHRoaXMua2V5cyA9IG5ldyBTZXQocmVhZGVyLmtleXMpO1xuICAgICAgICB0aGlzLmZpbGVTZXQgPSBuZXcgU2V0KFsuLi5idWxrRmlsZXMubWFwKGYgPT4gZi5maWxlTmFtZSksIC4uLnN0cmVhbUZpbGVzLm1hcChmID0+IGYuZmlsZU5hbWUpXSk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRvbmx5IGtleXM6IFNldDxzdHJpbmc+O1xuICAgIHB1YmxpYyByZWFkb25seSBmaWxlU2V0OiBTZXQ8c3RyaW5nPjtcblxuICAgIHByaXZhdGUgYmFzZUNvbHVtbnMgPSBuZXcgTWFwPHN0cmluZywgeyBrZXk6IHN0cmluZzsgdmFsdWU6IHVua25vd247IHRpbWU6IG51bWJlciB9W10+KCk7XG4gICAgcHJpdmF0ZSBiYXNlQ29sdW1uc0xvYWRpbmcgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBwcml2YXRlIGJhc2VGaWVsZHMgPSBuZXcgTWFwPHN0cmluZywgeyB2YWx1ZTogdW5rbm93bjsgdGltZTogbnVtYmVyIH0gfCB1bmRlZmluZWQ+KCk7XG4gICAgcHJpdmF0ZSBiYXNlRmllbGRzTG9hZGluZyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIC8vIExhc3Qta25vd24gdmFsdWVzIGZyb20gdGhlIHByZXZpb3VzIGluZGV4LCBzZXJ2ZWQgdW50aWwgdGhpcyBpbmRleCBsb2FkcyBpdHMgb3duIGZyZXNoIHZhbHVlLCBzbyBhIHN3YXAgZG9lc24ndCBmbGFzaCBlbXB0eSBpbiBzeW5jIHJlYWRzLiBDbGVhcmVkIHBlci1lbnRyeSB3aGVuIHRoZSBmcmVzaCB2YWx1ZSBsYW5kcy5cbiAgICBwcml2YXRlIHN0YWxlQmFzZUNvbHVtbnMgPSBuZXcgTWFwPHN0cmluZywgeyBrZXk6IHN0cmluZzsgdmFsdWU6IHVua25vd247IHRpbWU6IG51bWJlciB9W10+KCk7XG4gICAgcHJpdmF0ZSBzdGFsZUJhc2VGaWVsZHMgPSBuZXcgTWFwPHN0cmluZywgeyB2YWx1ZTogdW5rbm93bjsgdGltZTogbnVtYmVyIH0gfCB1bmRlZmluZWQ+KCk7XG5cbiAgICBnZXQgdG90YWxCeXRlcygpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5yZWFkZXIudG90YWxCeXRlczsgfVxuICAgIGdldCByb3dDb3VudCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5yZWFkZXIucm93Q291bnQ7IH1cblxuICAgIGlzTGl2ZShrZXk6IHN0cmluZyk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5rZXlzLmhhcyhrZXkpOyB9XG5cbiAgICBzdGF0aWMgYXN5bmMgYnVpbGQ8VCBleHRlbmRzIHsga2V5OiBzdHJpbmcgfT4oY29uZmlnOiB7XG4gICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgc3RvcmFnZTogRmlsZVN0b3JhZ2U7XG4gICAgICAgIGJ1bGtGaWxlczogQnVsa0ZpbGVJbmZvW107XG4gICAgICAgIHN0cmVhbUZpbGVzOiBTdHJlYW1GaWxlSW5mb1tdO1xuICAgICAgICBzdWJDYWNoZXM6IFN1YlJlYWRlckNhY2hlcztcbiAgICAgICAgb25VbnJlYWRhYmxlRmlsZT86IChmaWxlOiBCdWxrRmlsZUluZm8sIG1lc3NhZ2U6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPjtcbiAgICB9KTogUHJvbWlzZTxMb2FkZWRJbmRleDxUPj4ge1xuICAgICAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XG4gICAgICAgIGxldCB7IGJ1bGtGaWxlcywgc3RyZWFtRmlsZXMgfSA9IGNvbmZpZztcbiAgICAgICAgbGV0IGF0dGVtcHQgPSAwO1xuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgY29uc3QgdG9sZXJhdGVNaXNzaW5nID0gYXR0ZW1wdCA+PSBNQVhfUkVBRF9BVFRFTVBUUztcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGV0IGZpbGVzQ2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGNvbnN0IFtidWxrUmVhZGVyc1Jhdywgc3RyZWFtRGF0YV0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgICAgICAgIFByb21pc2UuYWxsKGJ1bGtGaWxlcy5tYXAoYXN5bmMgZiA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBsb2FkRmlsZVJlYWRlcihjb25maWcubmFtZSwgY29uZmlnLnN0b3JhZ2UsIGYsIGNvbmZpZy5zdWJDYWNoZXMuYnVsayk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBNaXNzaW5nRmlsZUVycm9yKSB7IGZpbGVzQ2hhbmdlZCA9IHRydWU7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLm9uVW5yZWFkYWJsZUZpbGUpIGF3YWl0IGNvbmZpZy5vblVucmVhZGFibGVGaWxlKGYsIChlIGFzIEVycm9yKS5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAgICAgICAgIGxvYWRTdHJlYW1FbnRyaWVzKGNvbmZpZy5uYW1lLCBjb25maWcuc3RvcmFnZSwgc3RyZWFtRmlsZXMsIGNvbmZpZy5zdWJDYWNoZXMuc3RyZWFtKSxcbiAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgICBpZiAoc3RyZWFtRGF0YS5taXNzaW5nKSBmaWxlc0NoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmIChmaWxlc0NoYW5nZWQgJiYgIXRvbGVyYXRlTWlzc2luZykgdGhyb3cgbmV3IEZpbGVzQ2hhbmdlZEVycm9yKCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBidWxrUmVhZGVycyA9IGJ1bGtSZWFkZXJzUmF3LmZpbHRlcigocik6IHIgaXMgQmFzZUJ1bGtEYXRhYmFzZVJlYWRlciA9PiAhIXIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlYWRlcnM6IEJhc2VCdWxrRGF0YWJhc2VSZWFkZXJbXSA9IFtdO1xuICAgICAgICAgICAgICAgIGxldCBzdHJlYW1UaW1lcyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3JkZXJlZCA9IG9yZGVyU3RyZWFtRW50cmllcyhzdHJlYW1EYXRhLmVudHJpZXMpO1xuICAgICAgICAgICAgICAgIGlmIChvcmRlcmVkLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJlYW0gPSBzdHJlYW1SZWFkZXJGcm9tRW50cmllcyhvcmRlcmVkLCBzdHJlYW1EYXRhLnRvdGFsQnl0ZXMpO1xuICAgICAgICAgICAgICAgICAgICByZWFkZXJzLnB1c2goc3RyZWFtLnJlYWRlcik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbVRpbWVzID0gc3RyZWFtLnRpbWVzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZWFkZXJzLnB1c2goLi4uYnVsa1JlYWRlcnMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlYWRlciA9IGpvaW5CdWxrRGF0YWJhc2VzKHJlYWRlcnMpO1xuXG4gICAgICAgICAgICAgICAgcHJ1bmVTdWJDYWNoZXMoYnVsa0ZpbGVzLCBzdHJlYW1GaWxlcywgY29uZmlnLnN1YkNhY2hlcyk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBlbGFwc2VkID0gRGF0ZS5ub3coKSAtIHN0YXJ0O1xuICAgICAgICAgICAgICAgIGlmIChlbGFwc2VkID4gNTApIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGJ5dGVzUmVhZCA9IHN0cmVhbURhdGEudG90YWxCeXRlcztcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCByIG9mIGJ1bGtSZWFkZXJzKSBieXRlc1JlYWQgKz0gci5jb2x1bW5zLmZpbmQoYyA9PiBjLmNvbHVtbiA9PT0gS0VZX0NPTFVNTik/LmJ5dGVTaXplID8/IDA7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGAke2JsdWUoY29uZmlnLm5hbWUpfSBsb2FkZWQgaW4gJHtyZWQoZm9ybWF0VGltZShlbGFwc2VkKSl9ICgke2JsdWUoZm9ybWF0TnVtYmVyKHJlYWRlci5yb3dDb3VudCkpfSByb3dzLCAke2J1bGtGaWxlcy5sZW5ndGh9IGJ1bGsgKyAke3N0cmVhbUZpbGVzLmxlbmd0aH0gc3RyZWFtIGZpbGVzLCByZWFkICR7Ymx1ZShmb3JtYXROdW1iZXIoYnl0ZXNSZWFkKSl9QilgKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IExvYWRlZEluZGV4PFQ+KFxuICAgICAgICAgICAgICAgICAgICBjb25maWcubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnLnN0b3JhZ2UsXG4gICAgICAgICAgICAgICAgICAgIGJ1bGtGaWxlcyxcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtRmlsZXMsXG4gICAgICAgICAgICAgICAgICAgIHJlYWRlcixcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtVGltZXMsXG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbURhdGEuc2l6ZXMsXG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbURhdGEuZW50cmllcy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbURhdGEudG90YWxCeXRlcyxcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnLnN1YkNhY2hlcyxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgRmlsZXNDaGFuZ2VkRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgYXR0ZW1wdCsrO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFkb3B0cyB0aGUgcHJldmlvdXMgaW5kZXgncyBsb2FkZWQgYmFzZSB2YWx1ZXMgYXMgU1RBTEUgb24gdGhpcyBvbmUsIHNvIGEgc3luYyByZWFkIG1pZC1zd2FwIGNhbiBzZXJ2ZSB0aGUgb2xkIHZhbHVlIChwYXRjaGVkIHdpdGggdGhlIGN1cnJlbnQgb3ZlcmxheSkgaW5zdGVhZCBvZiBmbGFzaGluZyBlbXB0eSB3aGlsZSB0aGUgZnJlc2ggbG9hZCBydW5zLiBQZXItZW50cnk6IGRyb3BwZWQgd2hlbiB0aGUgZnJlc2ggdmFsdWUgbGFuZHMgaGVyZS5cbiAgICBpbmhlcml0U3RhbGVGcm9tKHByZXY6IExvYWRlZEluZGV4PFQ+KTogdm9pZCB7XG4gICAgICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIHByZXYuYmFzZUNvbHVtbnMpIHRoaXMuc3RhbGVCYXNlQ29sdW1ucy5zZXQoaywgdik7XG4gICAgICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIHByZXYuc3RhbGVCYXNlQ29sdW1ucykgaWYgKCF0aGlzLnN0YWxlQmFzZUNvbHVtbnMuaGFzKGspKSB0aGlzLnN0YWxlQmFzZUNvbHVtbnMuc2V0KGssIHYpO1xuICAgICAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBwcmV2LmJhc2VGaWVsZHMpIHRoaXMuc3RhbGVCYXNlRmllbGRzLnNldChrLCB2KTtcbiAgICAgICAgZm9yIChjb25zdCBbaywgdl0gb2YgcHJldi5zdGFsZUJhc2VGaWVsZHMpIGlmICghdGhpcy5zdGFsZUJhc2VGaWVsZHMuaGFzKGspKSB0aGlzLnN0YWxlQmFzZUZpZWxkcy5zZXQoaywgdik7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0Q29sdW1uKGNvbHVtbjogc3RyaW5nKTogUHJvbWlzZTx7IGtleTogc3RyaW5nOyB2YWx1ZTogdW5rbm93bjsgdGltZTogbnVtYmVyIH1bXT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWFkZXIuZ2V0Q29sdW1uKGNvbHVtbik7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0U2luZ2xlRmllbGQoa2V5OiBzdHJpbmcsIGNvbHVtbjogc3RyaW5nKTogUHJvbWlzZTx7IHZhbHVlOiB1bmtub3duOyB0aW1lOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWFkZXIuZ2V0U2luZ2xlRmllbGQoa2V5LCBjb2x1bW4pO1xuICAgIH1cblxuICAgIGVuc3VyZUJhc2VDb2x1bW4oY29sdW1uOiBzdHJpbmcsIG9uTG9hZGVkOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmJhc2VDb2x1bW5zLmhhcyhjb2x1bW4pIHx8IHRoaXMuYmFzZUNvbHVtbnNMb2FkaW5nLmhhcyhjb2x1bW4pKSByZXR1cm47XG4gICAgICAgIHRoaXMuYmFzZUNvbHVtbnNMb2FkaW5nLmFkZChjb2x1bW4pO1xuICAgICAgICB2b2lkIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgdGhpcy5yZWFkZXIuZ2V0Q29sdW1uKGNvbHVtbik7XG4gICAgICAgICAgICAgICAgdGhpcy5iYXNlQ29sdW1ucy5zZXQoY29sdW1uLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGFsZUJhc2VDb2x1bW5zLmRlbGV0ZShjb2x1bW4pO1xuICAgICAgICAgICAgICAgIHRoaXMuYmFzZUNvbHVtbnNMb2FkaW5nLmRlbGV0ZShjb2x1bW4pO1xuICAgICAgICAgICAgICAgIG9uTG9hZGVkKCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgLy8gTm8gc2NoZWR1bGVkIHJldHJ5IGV4aXN0czogY2xlYXJpbmcgdGhlIGxvYWRpbmcgZmxhZyBtYWtlcyB0aGUgTkVYVCByZWFkIHJlLWF0dGVtcHQgdGhlIGxvYWQsIGFuZCB1bnRpbCBvbmUgaGFwcGVucyB0aGUgdmFsdWUgc3RheXMgbWlzc2luZy9zdGFsZVxuICAgICAgICAgICAgICAgIHRoaXMuYmFzZUNvbHVtbnNMb2FkaW5nLmRlbGV0ZShjb2x1bW4pO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYCR7dGhpcy5uYW1lfS5nZXRDb2x1bW5TeW5jKCR7SlNPTi5zdHJpbmdpZnkoY29sdW1uKX0pIGxvYWQgZmFpbGVkICh0aGUgbmV4dCByZWFkIHJlLWF0dGVtcHRzIGl0KTogJHsoZSBhcyBFcnJvcikuc3RhY2sgPz8gZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkoKTtcbiAgICB9XG5cbiAgICBlbnN1cmVCYXNlRmllbGQoa2V5OiBzdHJpbmcsIGNvbHVtbjogc3RyaW5nLCBvbkxvYWRlZDogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgICBjb25zdCBjayA9IG51bGxKb2luKGNvbHVtbiwga2V5KTtcbiAgICAgICAgaWYgKHRoaXMuYmFzZUZpZWxkcy5oYXMoY2spIHx8IHRoaXMuYmFzZUZpZWxkc0xvYWRpbmcuaGFzKGNrKSkgcmV0dXJuO1xuICAgICAgICB0aGlzLmJhc2VGaWVsZHNMb2FkaW5nLmFkZChjayk7XG4gICAgICAgIHZvaWQgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCB0aGlzLnJlYWRlci5nZXRTaW5nbGVGaWVsZChrZXksIGNvbHVtbik7XG4gICAgICAgICAgICAgICAgdGhpcy5iYXNlRmllbGRzLnNldChjaywgdmFsdWUpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhbGVCYXNlRmllbGRzLmRlbGV0ZShjayk7XG4gICAgICAgICAgICAgICAgdGhpcy5iYXNlRmllbGRzTG9hZGluZy5kZWxldGUoY2spO1xuICAgICAgICAgICAgICAgIG9uTG9hZGVkKCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5iYXNlRmllbGRzTG9hZGluZy5kZWxldGUoY2spO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYCR7dGhpcy5uYW1lfS5nZXRTaW5nbGVGaWVsZFN5bmMoJHtKU09OLnN0cmluZ2lmeShrZXkpfSwgJHtKU09OLnN0cmluZ2lmeShjb2x1bW4pfSkgbG9hZCBmYWlsZWQgKHRoZSBuZXh0IHJlYWQgcmUtYXR0ZW1wdHMgaXQpOiAkeyhlIGFzIEVycm9yKS5zdGFjayA/PyBlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSgpO1xuICAgIH1cblxuICAgIC8vIFJldHVybnMgdGhlIGxvYWRlZCB2YWx1ZSAoZnJlc2ggaWYgYXZhaWxhYmxlLCBlbHNlIGxhc3Qta25vd24gc3RhbGUpIGZvciB0aGUgY29sdW1uLCBvciB1bmRlZmluZWQgaWYgbmVpdGhlciBpcyBwcmVzZW50IHlldC4gVGhlIGJvb2xlYW4gaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHJldHVybmVkIHZhbHVlIGlzIGZyZXNoOyBjYWxsZXJzIG1heSBza2lwIGNhY2hpbmcgYSBzdGFsZSB2YWx1ZS5cbiAgICBnZXRCYXNlQ29sdW1uKGNvbHVtbjogc3RyaW5nKTogeyBlbnRyaWVzOiB7IGtleTogc3RyaW5nOyB2YWx1ZTogdW5rbm93bjsgdGltZTogbnVtYmVyIH1bXTsgZnJlc2g6IGJvb2xlYW4gfSB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGNvbnN0IGZyZXNoID0gdGhpcy5iYXNlQ29sdW1ucy5nZXQoY29sdW1uKTtcbiAgICAgICAgaWYgKGZyZXNoKSByZXR1cm4geyBlbnRyaWVzOiBmcmVzaCwgZnJlc2g6IHRydWUgfTtcbiAgICAgICAgY29uc3Qgc3RhbGUgPSB0aGlzLnN0YWxlQmFzZUNvbHVtbnMuZ2V0KGNvbHVtbik7XG4gICAgICAgIGlmIChzdGFsZSkgcmV0dXJuIHsgZW50cmllczogc3RhbGUsIGZyZXNoOiBmYWxzZSB9O1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGdldEJhc2VGaWVsZChrZXk6IHN0cmluZywgY29sdW1uOiBzdHJpbmcpOiB7IHZhbHVlOiB7IHZhbHVlOiB1bmtub3duOyB0aW1lOiBudW1iZXIgfSB8IHVuZGVmaW5lZDsgZnJlc2g6IGJvb2xlYW47IGxvYWRlZDogYm9vbGVhbiB9IHtcbiAgICAgICAgY29uc3QgY2sgPSBudWxsSm9pbihjb2x1bW4sIGtleSk7XG4gICAgICAgIGlmICh0aGlzLmJhc2VGaWVsZHMuaGFzKGNrKSkgcmV0dXJuIHsgdmFsdWU6IHRoaXMuYmFzZUZpZWxkcy5nZXQoY2spLCBmcmVzaDogdHJ1ZSwgbG9hZGVkOiB0cnVlIH07XG4gICAgICAgIGlmICh0aGlzLnN0YWxlQmFzZUZpZWxkcy5oYXMoY2spKSByZXR1cm4geyB2YWx1ZTogdGhpcy5zdGFsZUJhc2VGaWVsZHMuZ2V0KGNrKSwgZnJlc2g6IGZhbHNlLCBsb2FkZWQ6IHRydWUgfTtcbiAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZnJlc2g6IGZhbHNlLCBsb2FkZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgaXNCYXNlQ29sdW1uTG9hZGVkKGNvbHVtbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmJhc2VDb2x1bW5zLmhhcyhjb2x1bW4pIHx8IHRoaXMuc3RhbGVCYXNlQ29sdW1ucy5oYXMoY29sdW1uKTtcbiAgICB9XG5cbiAgICBpc0Jhc2VGaWVsZExvYWRlZChrZXk6IHN0cmluZywgY29sdW1uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgY2sgPSBudWxsSm9pbihjb2x1bW4sIGtleSk7XG4gICAgICAgIHJldHVybiB0aGlzLmJhc2VGaWVsZHMuaGFzKGNrKSB8fCB0aGlzLnN0YWxlQmFzZUZpZWxkcy5oYXMoY2spO1xuICAgIH1cblxuICAgIC8vIERyb3BzIGluLW1lbW9yeSBsb2FkZWQgdmFsdWVzIGZvciB0aGlzIGluZGV4LCBzbyBhIHN1YnNlcXVlbnQgcmVhZCByZWxvYWRzIGZyZXNoIGZyb20gZGlzay4gVXNlZCBieSByZWxvYWRGcm9tRGlzaygpIOKAlCBhIGhhcmQgcmVzZXQsIG5vIHN0YWxlIGZhbGxiYWNrIHN1cnZpdmVzLlxuICAgIGRyb3BMb2FkZWRWYWx1ZXMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuYmFzZUNvbHVtbnMuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5iYXNlQ29sdW1uc0xvYWRpbmcuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5iYXNlRmllbGRzLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuYmFzZUZpZWxkc0xvYWRpbmcuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5zdGFsZUJhc2VDb2x1bW5zLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuc3RhbGVCYXNlRmllbGRzLmNsZWFyKCk7XG4gICAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbWFrZVJhd0dldFJhbmdlKHN0b3JhZ2U6IEZpbGVTdG9yYWdlLCBmaWxlTmFtZTogc3RyaW5nKTogUHJvbWlzZTx7IHJhd0dldFJhbmdlOiBHZXRSYW5nZTsgc2l6ZTogbnVtYmVyIH0+IHtcbiAgICBjb25zdCBpbmZvID0gYXdhaXQgc3RvcmFnZS5nZXRJbmZvKGZpbGVOYW1lKTtcbiAgICBpZiAoIWluZm8pIHRocm93IG5ldyBNaXNzaW5nRmlsZUVycm9yKGBidWxrIGZpbGUgJHtmaWxlTmFtZX0gaXMgbWlzc2luZ2ApO1xuICAgIGNvbnN0IHJhd0dldFJhbmdlOiBHZXRSYW5nZSA9IGFzeW5jIChzdGFydCwgZW5kKSA9PiB7XG4gICAgICAgIGlmIChlbmQgPD0gc3RhcnQpIHJldHVybiBFTVBUWV9CVUZGRVI7XG4gICAgICAgIGNvbnN0IGJ1ZiA9IGF3YWl0IHN0b3JhZ2UuZ2V0UmFuZ2UoZmlsZU5hbWUsIHsgc3RhcnQsIGVuZCB9KTtcbiAgICAgICAgaWYgKCFidWYpIHRocm93IG5ldyBNaXNzaW5nRmlsZUVycm9yKGByYW5nZSBbJHtzdGFydH0sICR7ZW5kfSkgb2YgJHtmaWxlTmFtZX0gaXMgbWlzc2luZ2ApO1xuICAgICAgICByZXR1cm4gYnVmO1xuICAgIH07XG4gICAgcmV0dXJuIHsgcmF3R2V0UmFuZ2UsIHNpemU6IGluZm8uc2l6ZSB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZEZpbGVSZWFkZXIobmFtZTogc3RyaW5nLCBzdG9yYWdlOiBGaWxlU3RvcmFnZSwgZjogQnVsa0ZpbGVJbmZvLCBjYWNoZTogTWFwPHN0cmluZywgQmFzZUJ1bGtEYXRhYmFzZVJlYWRlcj4pOiBQcm9taXNlPEJhc2VCdWxrRGF0YWJhc2VSZWFkZXI+IHtcbiAgICBjb25zdCBjYWNoZWQgPSBjYWNoZS5nZXQoZi5maWxlTmFtZSk7XG4gICAgaWYgKGNhY2hlZCkgcmV0dXJuIGNhY2hlZDtcbiAgICBjb25zdCByYXcgPSBhd2FpdCBtYWtlUmF3R2V0UmFuZ2Uoc3RvcmFnZSwgZi5maWxlTmFtZSk7XG4gICAgY29uc3QgZmlsZUlkID0gbnVsbEpvaW4obmFtZSwgZi5maWxlTmFtZSk7XG4gICAgY29uc3Qgb3BlbmVkID0gYXdhaXQgYmxvY2tDYWNoZS5vcGVuKGZpbGVJZCwgcmF3LnNpemUsIHJhdy5yYXdHZXRSYW5nZSk7XG4gICAgY29uc3QgcmVhZGVyID0gYXdhaXQgbG9hZEJ1bGtEYXRhYmFzZSh7IHRvdGFsQnl0ZXM6IG9wZW5lZC51bmNvbXByZXNzZWRTaXplLCBnZXRSYW5nZTogb3BlbmVkLmdldFJhbmdlLCBuYW1lOiBgJHtCVUxLX1JPT1RfRk9MREVSfS8ke25hbWV9LyR7Zi5maWxlTmFtZX1gIH0pO1xuICAgIGNhY2hlLnNldChmLmZpbGVOYW1lLCByZWFkZXIpO1xuICAgIHJldHVybiByZWFkZXI7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2FkU3RyZWFtRW50cmllcyhcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgc3RvcmFnZTogRmlsZVN0b3JhZ2UsXG4gICAgc3RyZWFtRmlsZXM6IFN0cmVhbUZpbGVJbmZvW10sXG4gICAgY2FjaGU6IE1hcDxzdHJpbmcsIFN0cmVhbVJlYWRlckNhY2hlRW50cnk+LFxuKTogUHJvbWlzZTx7IGVudHJpZXM6IHsgdGltZTogbnVtYmVyOyBmaWxlTmFtZTogc3RyaW5nOyBlbnRyeTogU3RyZWFtRW50cnkgfVtdOyB0b3RhbEJ5dGVzOiBudW1iZXI7IG1pc3Npbmc6IGJvb2xlYW47IHNpemVzOiBNYXA8c3RyaW5nLCBudW1iZXI+IH0+IHtcbiAgICBjb25zdCBzaXplcyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gICAgaWYgKCFzdHJlYW1GaWxlcy5sZW5ndGgpIHJldHVybiB7IGVudHJpZXM6IFtdLCB0b3RhbEJ5dGVzOiAwLCBtaXNzaW5nOiBmYWxzZSwgc2l6ZXMgfTtcbiAgICBsZXQgbWlzc2luZyA9IGZhbHNlO1xuICAgIGNvbnN0IHBlckZpbGUgPSBhd2FpdCBQcm9taXNlLmFsbChzdHJlYW1GaWxlcy5tYXAoYXN5bmMgKGYpOiBQcm9taXNlPHsgZmlsZU5hbWU6IHN0cmluZzsgc2l6ZTogbnVtYmVyOyBlbnRyaWVzOiBTdHJlYW1FbnRyeVtdIH0gfCB1bmRlZmluZWQ+ID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGluZm8gPSBhd2FpdCBzdG9yYWdlLmdldEluZm8oZi5maWxlTmFtZSk7XG4gICAgICAgICAgICBpZiAoIWluZm8pIHsgbWlzc2luZyA9IHRydWU7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgICAgICAgICAgIGNvbnN0IHNpemUgPSBpbmZvLnNpemU7XG4gICAgICAgICAgICBzaXplcy5zZXQoZi5maWxlTmFtZSwgc2l6ZSk7XG4gICAgICAgICAgICBjb25zdCBjYWNoZWQgPSBjYWNoZS5nZXQoZi5maWxlTmFtZSk7XG4gICAgICAgICAgICBpZiAoY2FjaGVkICYmIGNhY2hlZC5yZWFkU2l6ZSA9PT0gc2l6ZSkgcmV0dXJuIHsgZmlsZU5hbWU6IGYuZmlsZU5hbWUsIHNpemUsIGVudHJpZXM6IGNhY2hlZC5lbnRyaWVzIH07XG4gICAgICAgICAgICBpZiAoc2l6ZSA9PT0gMCkgeyBjYWNoZS5zZXQoZi5maWxlTmFtZSwgeyByZWFkU2l6ZTogMCwgcGFyc2VkUG9zOiAwLCBlbnRyaWVzOiBbXSB9KTsgcmV0dXJuIHsgZmlsZU5hbWU6IGYuZmlsZU5hbWUsIHNpemU6IDAsIGVudHJpZXM6IFtdIH07IH1cbiAgICAgICAgICAgIC8vIEFwcGVuZC1vbmx5OiBhIGxhcmdlciBzaXplIG1lYW5zIG5ldyBieXRlcyBhdCB0aGUgdGFpbCwgcGFyc2Ugb25seSB0aG9zZS5cbiAgICAgICAgICAgIGlmIChjYWNoZWQgJiYgc2l6ZSA+IGNhY2hlZC5yZWFkU2l6ZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN1ZmZpeCA9IGF3YWl0IHN0b3JhZ2UuZ2V0UmFuZ2UoZi5maWxlTmFtZSwgeyBzdGFydDogY2FjaGVkLnBhcnNlZFBvcywgZW5kOiBzaXplIH0pO1xuICAgICAgICAgICAgICAgIGlmICghc3VmZml4KSB7IG1pc3NpbmcgPSB0cnVlOyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gcGFyc2VTdHJlYW0oc3VmZml4KTtcbiAgICAgICAgICAgICAgICBpZiAocGFyc2VkLmJhZEJ5dGVzID4gMCkgY29uc29sZS53YXJuKGAke25hbWV9IHN0cmVhbSBmaWxlICR7Zi5maWxlTmFtZX0gaGFkICR7cGFyc2VkLmJhZEJ5dGVzfSB0cmFpbGluZyBiYWQvaW5jb21wbGV0ZSBieXRlcyAoc3RvcHBlZCByZWFkaW5nIHRoZXJlKWApO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVudHJpZXMgPSBwYXJzZWQuZW50cmllcy5sZW5ndGggPyBjYWNoZWQuZW50cmllcy5jb25jYXQocGFyc2VkLmVudHJpZXMpIDogY2FjaGVkLmVudHJpZXM7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkUG9zID0gY2FjaGVkLnBhcnNlZFBvcyArIChzdWZmaXgubGVuZ3RoIC0gcGFyc2VkLmJhZEJ5dGVzKTtcbiAgICAgICAgICAgICAgICBjYWNoZS5zZXQoZi5maWxlTmFtZSwgeyByZWFkU2l6ZTogc2l6ZSwgcGFyc2VkUG9zLCBlbnRyaWVzIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGZpbGVOYW1lOiBmLmZpbGVOYW1lLCBzaXplLCBlbnRyaWVzIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBidWZmZXIgPSBhd2FpdCBzdG9yYWdlLmdldFJhbmdlKGYuZmlsZU5hbWUsIHsgc3RhcnQ6IDAsIGVuZDogc2l6ZSB9KTtcbiAgICAgICAgICAgIGlmICghYnVmZmVyKSB7IG1pc3NpbmcgPSB0cnVlOyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gICAgICAgICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZVN0cmVhbShidWZmZXIpO1xuICAgICAgICAgICAgaWYgKHBhcnNlZC5iYWRCeXRlcyA+IDApIGNvbnNvbGUud2FybihgJHtuYW1lfSBzdHJlYW0gZmlsZSAke2YuZmlsZU5hbWV9IGhhZCAke3BhcnNlZC5iYWRCeXRlc30gdHJhaWxpbmcgYmFkL2luY29tcGxldGUgYnl0ZXMgKHN0b3BwZWQgcmVhZGluZyB0aGVyZSlgKTtcbiAgICAgICAgICAgIGNhY2hlLnNldChmLmZpbGVOYW1lLCB7IHJlYWRTaXplOiBzaXplLCBwYXJzZWRQb3M6IHNpemUgLSBwYXJzZWQuYmFkQnl0ZXMsIGVudHJpZXM6IHBhcnNlZC5lbnRyaWVzIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHsgZmlsZU5hbWU6IGYuZmlsZU5hbWUsIHNpemUsIGVudHJpZXM6IHBhcnNlZC5lbnRyaWVzIH07XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgbWlzc2luZyA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfSkpO1xuICAgIGNvbnN0IGVudHJpZXM6IHsgdGltZTogbnVtYmVyOyBmaWxlTmFtZTogc3RyaW5nOyBlbnRyeTogU3RyZWFtRW50cnkgfVtdID0gW107XG4gICAgbGV0IHRvdGFsQnl0ZXMgPSAwO1xuICAgIGZvciAoY29uc3QgcGYgb2YgcGVyRmlsZSkge1xuICAgICAgICBpZiAoIXBmKSBjb250aW51ZTtcbiAgICAgICAgdG90YWxCeXRlcyArPSBwZi5zaXplO1xuICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHBmLmVudHJpZXMpIGVudHJpZXMucHVzaCh7IHRpbWU6IGVudHJ5LnRpbWUsIGZpbGVOYW1lOiBwZi5maWxlTmFtZSwgZW50cnkgfSk7XG4gICAgfVxuICAgIHJldHVybiB7IGVudHJpZXMsIHRvdGFsQnl0ZXMsIG1pc3NpbmcsIHNpemVzIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBvcmRlclN0cmVhbUVudHJpZXMoZW50cmllczogeyB0aW1lOiBudW1iZXI7IGZpbGVOYW1lOiBzdHJpbmc7IGVudHJ5OiBTdHJlYW1FbnRyeSB9W10pOiBTdHJlYW1FbnRyeVtdIHtcbiAgICBlbnRyaWVzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgaWYgKGEudGltZSAhPT0gYi50aW1lKSByZXR1cm4gYS50aW1lIC0gYi50aW1lO1xuICAgICAgICByZXR1cm4gYS5maWxlTmFtZSA8IGIuZmlsZU5hbWUgJiYgLTEgfHwgYS5maWxlTmFtZSA+IGIuZmlsZU5hbWUgJiYgMSB8fCAwO1xuICAgIH0pO1xuICAgIHJldHVybiBlbnRyaWVzLm1hcChlID0+IGUuZW50cnkpO1xufVxuXG5mdW5jdGlvbiBwcnVuZVN1YkNhY2hlcyhidWxrRmlsZXM6IEJ1bGtGaWxlSW5mb1tdLCBzdHJlYW1GaWxlczogU3RyZWFtRmlsZUluZm9bXSwgc3ViQ2FjaGVzOiBTdWJSZWFkZXJDYWNoZXMpIHtcbiAgICBjb25zdCBsaXZlQnVsayA9IG5ldyBTZXQoYnVsa0ZpbGVzLm1hcChmID0+IGYuZmlsZU5hbWUpKTtcbiAgICBjb25zdCBsaXZlU3RyZWFtID0gbmV3IFNldChzdHJlYW1GaWxlcy5tYXAoZiA9PiBmLmZpbGVOYW1lKSk7XG4gICAgZm9yIChjb25zdCBuIG9mIHN1YkNhY2hlcy5idWxrLmtleXMoKSkgaWYgKCFsaXZlQnVsay5oYXMobikpIHN1YkNhY2hlcy5idWxrLmRlbGV0ZShuKTtcbiAgICBmb3IgKGNvbnN0IG4gb2Ygc3ViQ2FjaGVzLnN0cmVhbS5rZXlzKCkpIGlmICghbGl2ZVN0cmVhbS5oYXMobikpIHN1YkNhY2hlcy5zdHJlYW0uZGVsZXRlKG4pO1xufVxuXG4vLyBBIGNvcnJ1cHQvdW5yZWFkYWJsZSBjb2x1bW4gaW4gT05FIHVuZGVybHlpbmcgZmlsZSBtdXN0IG5vdCBicmVhayB0aGUgd2hvbGUgam9pbmVkIHJlYWQuIFdoZW4gYSBzb3VyY2UncyBjb2x1bW4gcmVhZCB0aHJvd3MsIHdlIGRyb3AgdGhhdCBzb3VyY2UgZm9yIHRoYXQgY29sdW1uIChmYWxsaW5nIHRocm91Z2ggdG8gb2xkZXIgcmVhZGVycywgZXhhY3RseSBhcyBpZiB0aGUgZmlsZSBuZXZlciBzZXQgdGhlIGNvbHVtbikgYW5kIHdhcm4gb25jZSBwZXIgKGZpbGUsIGNvbHVtbikgc28gdGhlIGNvcnJ1cHRpb24gaXMgdmlzaWJsZSB3aXRob3V0IGZsb29kaW5nIHRoZSBsb2cgb24gZXZlcnkgcmVidWlsZC5cbmNvbnN0IHdhcm5lZENvcnJ1cHRSZWFkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuZnVuY3Rpb24gd2FybkNvcnJ1cHRSZWFkKGRiOiBCYXNlQnVsa0RhdGFiYXNlUmVhZGVyLCBjb2x1bW46IHN0cmluZywgZTogdW5rbm93bik6IHZvaWQge1xuICAgIGNvbnN0IHBhdGggPSBkYi5uYW1lIHx8IFwiKHVua25vd24gc291cmNlKVwiO1xuICAgIGNvbnN0IGRlZHVwZUtleSA9IG51bGxKb2luKHBhdGgsIGNvbHVtbik7XG4gICAgaWYgKHdhcm5lZENvcnJ1cHRSZWFkcy5oYXMoZGVkdXBlS2V5KSkgcmV0dXJuO1xuICAgIHdhcm5lZENvcnJ1cHRSZWFkcy5hZGQoZGVkdXBlS2V5KTtcbiAgICBjb25zb2xlLndhcm4oYCR7cmVkKFwiY29ycnVwdCByZWFkXCIpfTogZmlsZSAke3BhdGh9IGNvbHVtbiAke0pTT04uc3RyaW5naWZ5KGNvbHVtbil9IGNvdWxkIG5vdCBiZSByZWFkIC0gc2tpcHBpbmcgaXQgKGl0cyBkYXRhIGlzIGRyb3BwZWQgZnJvbSByZXN1bHRzKTogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbn1cblxuZnVuY3Rpb24gam9pbkJ1bGtEYXRhYmFzZXMoZGF0YWJhc2VzOiBCYXNlQnVsa0RhdGFiYXNlUmVhZGVyW10pOiBSZXNvbHZlZFJlYWRlciB7XG4gICAgY29uc3QgZGVsZXRlVGltZSA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gICAgZm9yIChjb25zdCBkYiBvZiBkYXRhYmFzZXMpIHtcbiAgICAgICAgaWYgKCFkYi5kZWxldGVUaW1lcykgY29udGludWU7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdF0gb2YgZGIuZGVsZXRlVGltZXMpIGRlbGV0ZVRpbWUuc2V0KGtleSwgTWF0aC5tYXgoZGVsZXRlVGltZS5nZXQoa2V5KSA/PyAtSW5maW5pdHksIHQpKTtcbiAgICB9XG4gICAgY29uc3Qga2V5VGltZSA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gICAgZm9yIChjb25zdCBkYiBvZiBkYXRhYmFzZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB0XSBvZiBkYi5rZXlUaW1lcykga2V5VGltZS5zZXQoa2V5LCBNYXRoLm1heChrZXlUaW1lLmdldChrZXkpID8/IC1JbmZpbml0eSwgdCkpO1xuICAgIH1cbiAgICBjb25zdCBkZWxPZiA9IChrZXk6IHN0cmluZykgPT4gZGVsZXRlVGltZS5nZXQoa2V5KSA/PyAtSW5maW5pdHk7XG4gICAgY29uc3Qga2V5czogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHRdIG9mIGtleVRpbWUpIGlmICh0ID4gZGVsT2Yoa2V5KSkga2V5cy5wdXNoKGtleSk7XG5cbiAgICBjb25zdCBjb2x1bW5zOiB7IGNvbHVtbjogc3RyaW5nOyBieXRlU2l6ZTogbnVtYmVyIH1bXSA9IFtdO1xuICAgIGNvbnN0IGNvbHVtbkJ5TmFtZSA9IG5ldyBNYXA8c3RyaW5nLCB7IGNvbHVtbjogc3RyaW5nOyBieXRlU2l6ZTogbnVtYmVyIH0+KCk7XG4gICAgZm9yIChjb25zdCBkYiBvZiBkYXRhYmFzZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBjb2wgb2YgZGIuY29sdW1ucykge1xuICAgICAgICAgICAgbGV0IGV4aXN0aW5nID0gY29sdW1uQnlOYW1lLmdldChjb2wuY29sdW1uKTtcbiAgICAgICAgICAgIGlmICghZXhpc3RpbmcpIHtcbiAgICAgICAgICAgICAgICBleGlzdGluZyA9IHsgY29sdW1uOiBjb2wuY29sdW1uLCBieXRlU2l6ZTogMCB9O1xuICAgICAgICAgICAgICAgIGNvbHVtbkJ5TmFtZS5zZXQoY29sLmNvbHVtbiwgZXhpc3RpbmcpO1xuICAgICAgICAgICAgICAgIGNvbHVtbnMucHVzaChleGlzdGluZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBleGlzdGluZy5ieXRlU2l6ZSArPSBjb2wuYnl0ZVNpemU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICB0b3RhbEJ5dGVzOiBkYXRhYmFzZXMucmVkdWNlKChhY2MsIGRiKSA9PiBhY2MgKyBkYi50b3RhbEJ5dGVzLCAwKSxcbiAgICAgICAgcm93Q291bnQ6IGtleXMubGVuZ3RoLFxuICAgICAgICBrZXlzLFxuICAgICAgICByYXdLZXlDb3VudDogZGF0YWJhc2VzLnJlZHVjZSgoYWNjLCBkYikgPT4gYWNjICsgZGIua2V5VGltZXMuc2l6ZSArIChkYi5kZWxldGVUaW1lcz8uc2l6ZSA/PyAwKSwgMCksXG4gICAgICAgIHJlYWRlckNvdW50OiBkYXRhYmFzZXMubGVuZ3RoLFxuICAgICAgICBjb2x1bW5zLFxuICAgICAgICBrZXlUaW1lczoga2V5VGltZSxcbiAgICAgICAgZGVsZXRlVGltZXM6IGRlbGV0ZVRpbWUsXG4gICAgICAgIGFzeW5jIGdldENvbHVtbihjb2x1bW4pIHtcbiAgICAgICAgICAgIGNvbnN0IHBlclJlYWRlciA9IGF3YWl0IFByb21pc2UuYWxsKGRhdGFiYXNlcy5tYXAoYXN5bmMgZGIgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghZGIuY29sdW1ucy5zb21lKGMgPT4gYy5jb2x1bW4gPT09IGNvbHVtbikpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW50cmllcyA9IGF3YWl0IGRiLmdldENvbHVtbihjb2x1bW4pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE1hcChlbnRyaWVzLm1hcChlID0+IFtlLmtleSwgeyB2YWx1ZTogZS52YWx1ZSwgdGltZTogZS50aW1lIH1dKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICB3YXJuQ29ycnVwdFJlYWQoZGIsIGNvbHVtbiwgZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgcmV0dXJuIGtleXMubWFwKGtleSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGJlc3RUaW1lID0gLUluZmluaXR5O1xuICAgICAgICAgICAgICAgIGxldCBiZXN0VmFsOiB1bmtub3duO1xuICAgICAgICAgICAgICAgIGxldCBmb3VuZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbSBvZiBwZXJSZWFkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2VsbCA9IG0gJiYgbS5nZXQoa2V5KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjZWxsIHx8IGNlbGwudmFsdWUgPT09IEFCU0VOVCkgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjZWxsLnRpbWUgPiBiZXN0VGltZSkgeyBiZXN0VGltZSA9IGNlbGwudGltZTsgYmVzdFZhbCA9IGNlbGwudmFsdWU7IGZvdW5kID0gdHJ1ZTsgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBsaXZlID0gZm91bmQgJiYgYmVzdFRpbWUgPiBkZWxPZihrZXkpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGtleSwgdmFsdWU6IGxpdmUgPyBiZXN0VmFsIDogdW5kZWZpbmVkLCB0aW1lOiBsaXZlID8gYmVzdFRpbWUgOiAoa2V5VGltZS5nZXQoa2V5KSA/PyAwKSB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIGFzeW5jIGdldFNpbmdsZUZpZWxkKGtleSwgY29sdW1uKSB7XG4gICAgICAgICAgICBjb25zdCBrdCA9IGtleVRpbWUuZ2V0KGtleSk7XG4gICAgICAgICAgICBpZiAoa3QgPT09IHVuZGVmaW5lZCB8fCBrdCA8PSBkZWxPZihrZXkpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgbGV0IGJlc3RUaW1lID0gLUluZmluaXR5O1xuICAgICAgICAgICAgbGV0IGJlc3RWYWw6IHVua25vd247XG4gICAgICAgICAgICBsZXQgZm91bmQgPSBmYWxzZTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZGIgb2YgZGF0YWJhc2VzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFkYi5jb2x1bW5zLnNvbWUoYyA9PiBjLmNvbHVtbiA9PT0gY29sdW1uKSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgbGV0IHI7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgciA9IGF3YWl0IGRiLmdldFNpbmdsZUZpZWxkKGtleSwgY29sdW1uKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHdhcm5Db3JydXB0UmVhZChkYiwgY29sdW1uLCBlKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChyID09PSBBQlNFTlQpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGlmIChyLnRpbWUgPiBiZXN0VGltZSkgeyBiZXN0VGltZSA9IHIudGltZTsgYmVzdFZhbCA9IHIudmFsdWU7IGZvdW5kID0gdHJ1ZTsgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbGl2ZSA9IGZvdW5kICYmIGJlc3RUaW1lID4gZGVsT2Yoa2V5KTtcbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBsaXZlID8gYmVzdFZhbCA6IHVuZGVmaW5lZCwgdGltZTogbGl2ZSA/IGJlc3RUaW1lIDoga3QgfTtcbiAgICAgICAgfSxcbiAgICB9O1xufVxuIl19
|
|
426
|
+
/* _JS_SOURCE_HASH = "39e1136baf086c3deff1c9f39936ce1286fc435a42646007f4c21242d1a95c24"; */
|
|
@@ -8,6 +8,7 @@ export declare class PrivateFileSystemStorage implements IStorageRaw {
|
|
|
8
8
|
private ensureInitialized;
|
|
9
9
|
private directoryExists;
|
|
10
10
|
private getDirectoryHandle;
|
|
11
|
+
private resolveKey;
|
|
11
12
|
private getFileHandle;
|
|
12
13
|
private fileExists;
|
|
13
14
|
get(key: string): Promise<Buffer | undefined>;
|
|
@@ -67,30 +67,37 @@ export class PrivateFileSystemStorage implements IStorageRaw {
|
|
|
67
67
|
return currentHandle;
|
|
68
68
|
}
|
|
69
69
|
|
|
70
|
+
// Keys may contain "/" (nested paths). OPFS handles reject separators in names, so we
|
|
71
|
+
// walk/create the intermediate directories and return the leaf directory + file name.
|
|
72
|
+
private async resolveKey(key: string, create: boolean): Promise<{ dir: FileSystemDirectoryHandle; name: string }> {
|
|
73
|
+
let dir = await this.getDirectoryHandle(create);
|
|
74
|
+
const parts = key.split("/").filter(part => part.length > 0);
|
|
75
|
+
const name = parts.pop();
|
|
76
|
+
if (!name) {
|
|
77
|
+
throw new Error(`Invalid empty key: ${JSON.stringify(key)}`);
|
|
78
|
+
}
|
|
79
|
+
for (const part of parts) {
|
|
80
|
+
dir = await dir.getDirectoryHandle(part, { create });
|
|
81
|
+
}
|
|
82
|
+
return { dir, name };
|
|
83
|
+
}
|
|
84
|
+
|
|
70
85
|
private async getFileHandle(key: string, create: boolean = false): Promise<FileSystemFileHandle | undefined> {
|
|
71
86
|
await this.ensureInitialized();
|
|
87
|
+
if (create) {
|
|
88
|
+
const { dir, name } = await this.resolveKey(key, true);
|
|
89
|
+
return await dir.getFileHandle(name, { create: true });
|
|
90
|
+
}
|
|
72
91
|
try {
|
|
73
|
-
const
|
|
74
|
-
return await
|
|
92
|
+
const { dir, name } = await this.resolveKey(key, false);
|
|
93
|
+
return await dir.getFileHandle(name);
|
|
75
94
|
} catch (error) {
|
|
76
95
|
return undefined;
|
|
77
96
|
}
|
|
78
97
|
}
|
|
79
98
|
|
|
80
99
|
private async fileExists(key: string): Promise<boolean> {
|
|
81
|
-
await this.
|
|
82
|
-
try {
|
|
83
|
-
// First check if directory exists
|
|
84
|
-
if (!(await this.directoryExists())) {
|
|
85
|
-
return false;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
const dirHandle = await this.getDirectoryHandle(false);
|
|
89
|
-
await dirHandle.getFileHandle(key);
|
|
90
|
-
return true;
|
|
91
|
-
} catch (error) {
|
|
92
|
-
return false;
|
|
93
|
-
}
|
|
100
|
+
return !!(await this.getFileHandle(key, false));
|
|
94
101
|
}
|
|
95
102
|
|
|
96
103
|
public async get(key: string): Promise<Buffer | undefined> {
|
|
@@ -126,18 +133,12 @@ export class PrivateFileSystemStorage implements IStorageRaw {
|
|
|
126
133
|
}
|
|
127
134
|
|
|
128
135
|
public async set(key: string, value: Buffer): Promise<void> {
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
const writable = await fileHandle.createWritable();
|
|
136
|
-
await writable.write(value);
|
|
137
|
-
await writable.close();
|
|
138
|
-
} catch (error) {
|
|
139
|
-
throw new Error(`Failed to write file ${key}: ${error}`);
|
|
140
|
-
}
|
|
136
|
+
await this.ensureInitialized();
|
|
137
|
+
const { dir, name } = await this.resolveKey(key, true);
|
|
138
|
+
const fileHandle = await dir.getFileHandle(name, { create: true });
|
|
139
|
+
const writable = await fileHandle.createWritable();
|
|
140
|
+
await writable.write(value);
|
|
141
|
+
await writable.close();
|
|
141
142
|
}
|
|
142
143
|
|
|
143
144
|
public async append(key: string, value: Buffer): Promise<void> {
|
|
@@ -157,10 +158,8 @@ export class PrivateFileSystemStorage implements IStorageRaw {
|
|
|
157
158
|
return; // File doesn't exist, nothing to remove
|
|
158
159
|
}
|
|
159
160
|
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
await dirHandle.removeEntry(key);
|
|
163
|
-
} catch { }
|
|
161
|
+
const { dir, name } = await this.resolveKey(key, false);
|
|
162
|
+
await dir.removeEntry(name);
|
|
164
163
|
}
|
|
165
164
|
|
|
166
165
|
public async getKeys(): Promise<string[]> {
|
|
@@ -169,24 +168,20 @@ export class PrivateFileSystemStorage implements IStorageRaw {
|
|
|
169
168
|
return [];
|
|
170
169
|
}
|
|
171
170
|
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
171
|
+
const dirHandle = await this.getDirectoryHandle(false);
|
|
172
|
+
const keys: string[] = [];
|
|
173
|
+
const walk = async (dir: FileSystemDirectoryHandle, prefix: string) => {
|
|
176
174
|
// Use the async iterator protocol for FileSystemDirectoryHandle
|
|
177
|
-
for await (const [name, handle] of (
|
|
175
|
+
for await (const [name, handle] of (dir as any).entries()) {
|
|
178
176
|
if (handle.kind === "file") {
|
|
179
|
-
keys.push(name);
|
|
177
|
+
keys.push(prefix + name);
|
|
178
|
+
} else if (handle.kind === "directory") {
|
|
179
|
+
await walk(handle, prefix + name + "/");
|
|
180
180
|
}
|
|
181
181
|
}
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
if (error instanceof Error && error.message.includes("Directory not found")) {
|
|
186
|
-
return [];
|
|
187
|
-
}
|
|
188
|
-
throw new Error(`Failed to list files: ${error}`);
|
|
189
|
-
}
|
|
182
|
+
};
|
|
183
|
+
await walk(dirHandle, "");
|
|
184
|
+
return keys.sort();
|
|
190
185
|
}
|
|
191
186
|
public async getInfo(key: string): Promise<undefined | {
|
|
192
187
|
size: number;
|
|
@@ -60,30 +60,36 @@ class PrivateFileSystemStorage {
|
|
|
60
60
|
}
|
|
61
61
|
return currentHandle;
|
|
62
62
|
}
|
|
63
|
+
// Keys may contain "/" (nested paths). OPFS handles reject separators in names, so we
|
|
64
|
+
// walk/create the intermediate directories and return the leaf directory + file name.
|
|
65
|
+
async resolveKey(key, create) {
|
|
66
|
+
let dir = await this.getDirectoryHandle(create);
|
|
67
|
+
const parts = key.split("/").filter(part => part.length > 0);
|
|
68
|
+
const name = parts.pop();
|
|
69
|
+
if (!name) {
|
|
70
|
+
throw new Error(`Invalid empty key: ${JSON.stringify(key)}`);
|
|
71
|
+
}
|
|
72
|
+
for (const part of parts) {
|
|
73
|
+
dir = await dir.getDirectoryHandle(part, { create });
|
|
74
|
+
}
|
|
75
|
+
return { dir, name };
|
|
76
|
+
}
|
|
63
77
|
async getFileHandle(key, create = false) {
|
|
64
78
|
await this.ensureInitialized();
|
|
79
|
+
if (create) {
|
|
80
|
+
const { dir, name } = await this.resolveKey(key, true);
|
|
81
|
+
return await dir.getFileHandle(name, { create: true });
|
|
82
|
+
}
|
|
65
83
|
try {
|
|
66
|
-
const
|
|
67
|
-
return await
|
|
84
|
+
const { dir, name } = await this.resolveKey(key, false);
|
|
85
|
+
return await dir.getFileHandle(name);
|
|
68
86
|
}
|
|
69
87
|
catch (error) {
|
|
70
88
|
return undefined;
|
|
71
89
|
}
|
|
72
90
|
}
|
|
73
91
|
async fileExists(key) {
|
|
74
|
-
await this.
|
|
75
|
-
try {
|
|
76
|
-
// First check if directory exists
|
|
77
|
-
if (!(await this.directoryExists())) {
|
|
78
|
-
return false;
|
|
79
|
-
}
|
|
80
|
-
const dirHandle = await this.getDirectoryHandle(false);
|
|
81
|
-
await dirHandle.getFileHandle(key);
|
|
82
|
-
return true;
|
|
83
|
-
}
|
|
84
|
-
catch (error) {
|
|
85
|
-
return false;
|
|
86
|
-
}
|
|
92
|
+
return !!(await this.getFileHandle(key, false));
|
|
87
93
|
}
|
|
88
94
|
async get(key) {
|
|
89
95
|
// Check if file exists first to avoid unnecessary errors
|
|
@@ -114,18 +120,12 @@ class PrivateFileSystemStorage {
|
|
|
114
120
|
return Buffer.from(arrayBuffer);
|
|
115
121
|
}
|
|
116
122
|
async set(key, value) {
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
await writable.write(value);
|
|
124
|
-
await writable.close();
|
|
125
|
-
}
|
|
126
|
-
catch (error) {
|
|
127
|
-
throw new Error(`Failed to write file ${key}: ${error}`);
|
|
128
|
-
}
|
|
123
|
+
await this.ensureInitialized();
|
|
124
|
+
const { dir, name } = await this.resolveKey(key, true);
|
|
125
|
+
const fileHandle = await dir.getFileHandle(name, { create: true });
|
|
126
|
+
const writable = await fileHandle.createWritable();
|
|
127
|
+
await writable.write(value);
|
|
128
|
+
await writable.close();
|
|
129
129
|
}
|
|
130
130
|
async append(key, value) {
|
|
131
131
|
const existingContent = await this.get(key);
|
|
@@ -143,34 +143,29 @@ class PrivateFileSystemStorage {
|
|
|
143
143
|
if (!(await this.fileExists(key))) {
|
|
144
144
|
return; // File doesn't exist, nothing to remove
|
|
145
145
|
}
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
await dirHandle.removeEntry(key);
|
|
149
|
-
}
|
|
150
|
-
catch (_a) { }
|
|
146
|
+
const { dir, name } = await this.resolveKey(key, false);
|
|
147
|
+
await dir.removeEntry(name);
|
|
151
148
|
}
|
|
152
149
|
async getKeys() {
|
|
153
150
|
// Check if directory exists first to avoid unnecessary errors
|
|
154
151
|
if (!(await this.directoryExists())) {
|
|
155
152
|
return [];
|
|
156
153
|
}
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
154
|
+
const dirHandle = await this.getDirectoryHandle(false);
|
|
155
|
+
const keys = [];
|
|
156
|
+
const walk = async (dir, prefix) => {
|
|
160
157
|
// Use the async iterator protocol for FileSystemDirectoryHandle
|
|
161
|
-
for await (const [name, handle] of
|
|
158
|
+
for await (const [name, handle] of dir.entries()) {
|
|
162
159
|
if (handle.kind === "file") {
|
|
163
|
-
keys.push(name);
|
|
160
|
+
keys.push(prefix + name);
|
|
161
|
+
}
|
|
162
|
+
else if (handle.kind === "directory") {
|
|
163
|
+
await walk(handle, prefix + name + "/");
|
|
164
164
|
}
|
|
165
165
|
}
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
if (error instanceof Error && error.message.includes("Directory not found")) {
|
|
170
|
-
return [];
|
|
171
|
-
}
|
|
172
|
-
throw new Error(`Failed to list files: ${error}`);
|
|
173
|
-
}
|
|
166
|
+
};
|
|
167
|
+
await walk(dirHandle, "");
|
|
168
|
+
return keys.sort();
|
|
174
169
|
}
|
|
175
170
|
async getInfo(key) {
|
|
176
171
|
let fileHandle = await this.getFileHandle(key, false);
|
|
@@ -188,5 +183,5 @@ class PrivateFileSystemStorage {
|
|
|
188
183
|
}
|
|
189
184
|
}
|
|
190
185
|
exports.PrivateFileSystemStorage = PrivateFileSystemStorage;
|
|
191
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHJpdmF0ZUZpbGVTeXN0ZW1TdG9yYWdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiUHJpdmF0ZUZpbGVTeXN0ZW1TdG9yYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBLE1BQWEsd0JBQXdCO0lBR2pDLFlBQW9CLElBQVk7UUFBWixTQUFJLEdBQUosSUFBSSxDQUFRO0lBQUksQ0FBQztJQUU3QixLQUFLLENBQUMsaUJBQWlCOztRQUMzQixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxDQUFBLE1BQUEsU0FBUyxDQUFDLE9BQU8sMENBQUUsWUFBWSxDQUFBLEVBQUUsQ0FBQztnQkFDbkMsTUFBTSxJQUFJLEtBQUssQ0FBQyw4REFBOEQsQ0FBQyxDQUFDO1lBQ3BGLENBQUM7WUFDRCxJQUFJLFFBQVEsQ0FBQyxRQUFRLEtBQUssT0FBTyxFQUFFLENBQUM7Z0JBQ2hDLE1BQU0sSUFBSSxLQUFLLENBQUMsOEtBQThLLENBQUMsQ0FBQztZQUNwTSxDQUFDO1lBQ0QsSUFBSSxDQUFDLFVBQVUsR0FBRyxNQUFNLFNBQVMsQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDN0QsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUMzQixDQUFDO0lBRU8sS0FBSyxDQUFDLGVBQWU7UUFDekIsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUM1QyxJQUFJLENBQUM7WUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLEVBQUUsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLEdBQUcsRUFBRSxDQUFDO2dCQUN0RCxPQUFPLElBQUksQ0FBQyxDQUFDLHFCQUFxQjtZQUN0QyxDQUFDO1lBRUQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFD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QyxPQUFPLENBQUMsUUFBUSxDQUFDLHFCQUFxQixDQUFDLEVBQUUsQ0FBQztnQkFDMUUsT0FBTyxFQUFFLENBQUM7WUFDZCxDQUFDO1lBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUN0RCxDQUFDO0lBQ0wsQ0FBQztJQUNNLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBVztRQUk1QixJQUFJLFVBQVUsR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3RELElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNkLE9BQU8sU0FBUyxDQUFDO1FBQ3JCLENBQUM7UUFDRCxJQUFJLElBQUksR0FBRyxNQUFNLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUN0QyxPQUFPO1lBQ0gsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ2YsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZO1NBQ2xDLENBQUM7SUFDTixDQUFDO0lBQ00sS0FBSyxDQUFDLEtBQUs7UUFDZCxNQUFNLElBQUksS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDdkMsQ0FBQztDQUNKO0FBN01ELDREQTZNQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElTdG9yYWdlUmF3IH0gZnJvbSBcIi4vSVN0b3JhZ2VcIjtcblxuZXhwb3J0IGNsYXNzIFByaXZhdGVGaWxlU3lzdGVtU3RvcmFnZSBpbXBsZW1lbnRzIElTdG9yYWdlUmF3IHtcbiAgICBwcml2YXRlIHJvb3RIYW5kbGU6IEZpbGVTeXN0ZW1EaXJlY3RvcnlIYW5kbGUgfCB1bmRlZmluZWQ7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHBhdGg6IHN0cmluZykgeyB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGVuc3VyZUluaXRpYWxpemVkKCk6IFByb21pc2U8RmlsZVN5c3RlbURpcmVjdG9yeUhhbmRsZT4ge1xuICAgICAgICBpZiAoIXRoaXMucm9vdEhhbmRsZSkge1xuICAgICAgICAgICAgaWYgKCFuYXZpZ2F0b3Iuc3RvcmFnZT8uZ2V0RGlyZWN0b3J5KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUHJpdmF0ZSBGaWxlIFN5c3RlbSBBY2Nlc3MgQVBJIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBicm93c2VyXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGxvY2F0aW9uLnByb3RvY29sID09PSBcImZpbGU6XCIpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFByaXZhdGUgRmlsZSBTeXN0ZW0gQVBJIGlzIGRpc2FsbG93ZWQgaW4gZmlsZTovLyB0eXBlIGxvY2F0aW9ucy4gRWl0aGVyIHVzZSB0aGUgRmlsZSBTeXN0ZW0gQVBJICh0aGUgdXNlIGdpdmVzIHlvdSBhY2Nlc3MgdG8gdGhlaXIgZmlsZSBzeXN0ZW0pLCBvciBob3N0IG9uIGFuIGFjdHVhbCBkb21haW5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucm9vdEhhbmRsZSA9IGF3YWl0IG5hdmlnYXRvci5zdG9yYWdlLmdldERpcmVjdG9yeSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnJvb3RIYW5kbGU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBkaXJlY3RvcnlFeGlzdHMoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGNvbnN0IHJvb3QgPSBhd2FpdCB0aGlzLmVuc3VyZUluaXRpYWxpemVkKCk7XG4gICAgICAgIHRyeSB7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5wYXRoIHx8IHRoaXMucGF0aCA9PT0gXCJcIiB8fCB0aGlzLnBhdGggPT09IFwiL1wiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIFJvb3QgYWx3YXlzIGV4aXN0c1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBwYXRoUGFydHMgPSB0aGlzLnBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcihwYXJ0ID0+IHBhcnQubGVuZ3RoID4gMCk7XG4gICAgICAgICAgICBsZXQgY3VycmVudEhhbmRsZSA9IHJvb3Q7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgcGFydCBvZiBwYXRoUGFydHMpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50SGFuZGxlID0gYXdhaXQgY3VycmVudEhhbmRsZS5nZXREaXJlY3RvcnlIYW5kbGUocGFydCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGdldERpcmVjdG9yeUhhbmRsZShjcmVhdGVQYXRoOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8RmlsZVN5c3RlbURpcmVjdG9yeUhhbmRsZT4ge1xuICAgICAgICBjb25zdCByb290ID0gYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuXG4gICAgICAgIGlmICghdGhpcy5wYXRoIHx8IHRoaXMucGF0aCA9PT0gXCJcIiB8fCB0aGlzLnBhdGggPT09IFwiL1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gcm9vdDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhdGhQYXJ0cyA9IHRoaXMucGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKHBhcnQgPT4gcGFydC5sZW5ndGggPiAwKTtcbiAgICAgICAgbGV0IGN1cnJlbnRIYW5kbGUgPSByb290O1xuXG4gICAgICAgIGZvciAoY29uc3QgcGFydCBvZiBwYXRoUGFydHMpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY3VycmVudEhhbmRsZSA9IGF3YWl0IGN1cnJlbnRIYW5kbGUuZ2V0RGlyZWN0b3J5SGFuZGxlKHBhcnQsIHsgY3JlYXRlOiBjcmVhdGVQYXRoIH0pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWNyZWF0ZVBhdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEaXJlY3Rvcnkgbm90IGZvdW5kOiAke3RoaXMucGF0aH1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY3VycmVudEhhbmRsZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGdldEZpbGVIYW5kbGUoa2V5OiBzdHJpbmcsIGNyZWF0ZTogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTxGaWxlU3lzdGVtRmlsZUhhbmRsZSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmVuc3VyZUluaXRpYWxpemVkKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBkaXJIYW5kbGUgPSBhd2FpdCB0aGlzLmdldERpcmVjdG9yeUhhbmRsZShjcmVhdGUpO1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGRpckhhbmRsZS5nZXRGaWxlSGFuZGxlKGtleSwgeyBjcmVhdGUgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBmaWxlRXhpc3RzKGtleTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIEZpcnN0IGNoZWNrIGlmIGRpcmVjdG9yeSBleGlzdHNcbiAgICAgICAgICAgIGlmICghKGF3YWl0IHRoaXMuZGlyZWN0b3J5RXhpc3RzKCkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBkaXJIYW5kbGUgPSBhd2FpdCB0aGlzLmdldERpcmVjdG9yeUhhbmRsZShmYWxzZSk7XG4gICAgICAgICAgICBhd2FpdCBkaXJIYW5kbGUuZ2V0RmlsZUhhbmRsZShrZXkpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0KGtleTogc3RyaW5nKTogUHJvbWlzZTxCdWZmZXIgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgZmlsZSBleGlzdHMgZmlyc3QgdG8gYXZvaWQgdW5uZWNlc3NhcnkgZXJyb3JzXG4gICAgICAgIGlmICghKGF3YWl0IHRoaXMuZmlsZUV4aXN0cyhrZXkpKSkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBmaWxlSGFuZGxlID0gYXdhaXQgdGhpcy5nZXRGaWxlSGFuZGxlKGtleSwgZmFsc2UpO1xuICAgICAgICAgICAgaWYgKCFmaWxlSGFuZGxlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZmlsZSA9IGF3YWl0IGZpbGVIYW5kbGUuZ2V0RmlsZSgpO1xuICAgICAgICAgICAgY29uc3QgYXJyYXlCdWZmZXIgPSBhd2FpdCBmaWxlLmFycmF5QnVmZmVyKCk7XG4gICAgICAgICAgICByZXR1cm4gQnVmZmVyLmZyb20oYXJyYXlCdWZmZXIpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBFcnJvciByZWFkaW5nIGZpbGUgJHtrZXl9OmAsIGVycm9yKTtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0UmFuZ2Uoa2V5OiBzdHJpbmcsIGNvbmZpZzogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9KTogUHJvbWlzZTxCdWZmZXIgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgY29uc3QgZmlsZUhhbmRsZSA9IGF3YWl0IHRoaXMuZ2V0RmlsZUhhbmRsZShrZXksIGZhbHNlKTtcbiAgICAgICAgaWYgKCFmaWxlSGFuZGxlKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlsZSA9IGF3YWl0IGZpbGVIYW5kbGUuZ2V0RmlsZSgpO1xuICAgICAgICBjb25zdCBhcnJheUJ1ZmZlciA9IGF3YWl0IGZpbGUuc2xpY2UoY29uZmlnLnN0YXJ0LCBjb25maWcuZW5kKS5hcnJheUJ1ZmZlcigpO1xuICAgICAgICByZXR1cm4gQnVmZmVyLmZyb20oYXJyYXlCdWZmZXIpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBCdWZmZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVIYW5kbGUgPSBhd2FpdCB0aGlzLmdldEZpbGVIYW5kbGUoa2V5LCB0cnVlKTtcbiAgICAgICAgICAgIGlmICghZmlsZUhhbmRsZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSBmaWxlIGhhbmRsZSBmb3Iga2V5OiAke2tleX1gKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgd3JpdGFibGUgPSBhd2FpdCBmaWxlSGFuZGxlLmNyZWF0ZVdyaXRhYmxlKCk7XG4gICAgICAgICAgICBhd2FpdCB3cml0YWJsZS53cml0ZSh2YWx1ZSk7XG4gICAgICAgICAgICBhd2FpdCB3cml0YWJsZS5jbG9zZSgpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gd3JpdGUgZmlsZSAke2tleX06ICR7ZXJyb3J9YCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgYXBwZW5kKGtleTogc3RyaW5nLCB2YWx1ZTogQnVmZmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IHRoaXMuZ2V0KGtleSk7XG4gICAgICAgIGxldCBuZXdDb250ZW50OiBCdWZmZXI7XG4gICAgICAgIGlmIChleGlzdGluZ0NvbnRlbnQpIHtcbiAgICAgICAgICAgIG5ld0NvbnRlbnQgPSBCdWZmZXIuY29uY2F0KFtleGlzdGluZ0NvbnRlbnQsIHZhbHVlXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuZXdDb250ZW50ID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5zZXQoa2V5LCBuZXdDb250ZW50KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcmVtb3ZlKGtleTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIC8vIENoZWNrIGlmIGZpbGUgZXhpc3RzIGZpcnN0IHRvIGF2b2lkIHVubmVjZXNzYXJ5IGVycm9yc1xuICAgICAgICBpZiAoIShhd2FpdCB0aGlzLmZpbGVFeGlzdHMoa2V5KSkpIHtcbiAgICAgICAgICAgIHJldHVybjsgLy8gRmlsZSBkb2Vzbid0IGV4aXN0LCBub3RoaW5nIHRvIHJlbW92ZVxuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGRpckhhbmRsZSA9IGF3YWl0IHRoaXMuZ2V0RGlyZWN0b3J5SGFuZGxlKGZhbHNlKTtcbiAgICAgICAgICAgIGF3YWl0IGRpckhhbmRsZS5yZW1vdmVFbnRyeShrZXkpO1xuICAgICAgICB9IGNhdGNoIHsgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXRLZXlzKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgZGlyZWN0b3J5IGV4aXN0cyBmaXJzdCB0byBhdm9pZCB1bm5lY2Vzc2FyeSBlcnJvcnNcbiAgICAgICAgaWYgKCEoYXdhaXQgdGhpcy5kaXJlY3RvcnlFeGlzdHMoKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBkaXJIYW5kbGUgPSBhd2FpdCB0aGlzLmdldERpcmVjdG9yeUhhbmRsZShmYWxzZSk7XG4gICAgICAgICAgICBjb25zdCBrZXlzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICAgICAgICAvLyBVc2UgdGhlIGFzeW5jIGl0ZXJhdG9yIHByb3RvY29sIGZvciBGaWxlU3lzdGVtRGlyZWN0b3J5SGFuZGxlXG4gICAgICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IFtuYW1lLCBoYW5kbGVdIG9mIChkaXJIYW5kbGUgYXMgYW55KS5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoaGFuZGxlLmtpbmQgPT09IFwiZmlsZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGtleXMucHVzaChuYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBrZXlzLnNvcnQoKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoXCJEaXJlY3Rvcnkgbm90IGZvdW5kXCIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gbGlzdCBmaWxlczogJHtlcnJvcn1gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0SW5mbyhrZXk6IHN0cmluZyk6IFByb21pc2U8dW5kZWZpbmVkIHwge1xuICAgICAgICBzaXplOiBudW1iZXI7XG4gICAgICAgIGxhc3RNb2RpZmllZDogbnVtYmVyO1xuICAgIH0+IHtcbiAgICAgICAgbGV0IGZpbGVIYW5kbGUgPSBhd2FpdCB0aGlzLmdldEZpbGVIYW5kbGUoa2V5LCBmYWxzZSk7XG4gICAgICAgIGlmICghZmlsZUhhbmRsZSkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZmlsZSA9IGF3YWl0IGZpbGVIYW5kbGUuZ2V0RmlsZSgpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc2l6ZTogZmlsZS5zaXplLFxuICAgICAgICAgICAgbGFzdE1vZGlmaWVkOiBmaWxlLmxhc3RNb2RpZmllZCxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHJlc2V0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb3QgaW1wbGVtZW50ZWRcIik7XG4gICAgfVxufSJdfQ==
|
|
192
|
-
/* _JS_SOURCE_HASH = "
|
|
186
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHJpdmF0ZUZpbGVTeXN0ZW1TdG9yYWdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiUHJpdmF0ZUZpbGVTeXN0ZW1TdG9yYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBLE1BQWEsd0JBQXdCO0lBR2pDLFlBQW9CLElBQVk7UUFBWixTQUFJLEdBQUosSUFBSSxDQUFRO0lBQUksQ0FBQztJQUU3QixLQUFLLENBQUMsaUJBQWlCOztRQUMzQixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxDQUFBLE1BQUEsU0FBUyxDQUFDLE9BQU8sMENBQUUsWUFBWSxDQUFBLEVBQUUsQ0FBQztnQkFDbkMsTUFBTSxJQUFJLEtBQUssQ0FBQyw4REFBOEQsQ0FBQyxDQUFDO1lBQ3BGLENBQUM7WUFDRCxJQUFJLFFBQVEsQ0FBQyxRQUFRLEtBQUssT0FBTyxFQUFFLENBQUM7Z0JBQ2hDLE1BQU0sSUFBSSxLQUFLLENBQUMsOEtBQThLLENBQUMsQ0FBQztZQUNwTSxDQUFDO1lBQ0QsSUFBSSxDQUFDLFVBQVUsR0FBRyxNQUFNLFNBQVMsQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDN0QsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUMzQixDQUFDO0lBRU8sS0FBSyxDQUFDLGVBQWU7UUFDekIsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUM1QyxJQUFJLENBQUM7WUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLEVBQUUsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLEdBQUcsRUFBRSxDQUFDO2dCQUN0RCxPQUFPLElBQUksQ0FBQyxDQUFDLHFCQUFxQjtZQUN0QyxDQUFDO1lBRUQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFD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QUFZO1NBQ2xDLENBQUM7SUFDTixDQUFDO0lBQ00sS0FBSyxDQUFDLEtBQUs7UUFDZCxNQUFNLElBQUksS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDdkMsQ0FBQztDQUNKO0FBeE1ELDREQXdNQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElTdG9yYWdlUmF3IH0gZnJvbSBcIi4vSVN0b3JhZ2VcIjtcblxuZXhwb3J0IGNsYXNzIFByaXZhdGVGaWxlU3lzdGVtU3RvcmFnZSBpbXBsZW1lbnRzIElTdG9yYWdlUmF3IHtcbiAgICBwcml2YXRlIHJvb3RIYW5kbGU6IEZpbGVTeXN0ZW1EaXJlY3RvcnlIYW5kbGUgfCB1bmRlZmluZWQ7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHBhdGg6IHN0cmluZykgeyB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGVuc3VyZUluaXRpYWxpemVkKCk6IFByb21pc2U8RmlsZVN5c3RlbURpcmVjdG9yeUhhbmRsZT4ge1xuICAgICAgICBpZiAoIXRoaXMucm9vdEhhbmRsZSkge1xuICAgICAgICAgICAgaWYgKCFuYXZpZ2F0b3Iuc3RvcmFnZT8uZ2V0RGlyZWN0b3J5KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUHJpdmF0ZSBGaWxlIFN5c3RlbSBBY2Nlc3MgQVBJIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBicm93c2VyXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGxvY2F0aW9uLnByb3RvY29sID09PSBcImZpbGU6XCIpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFByaXZhdGUgRmlsZSBTeXN0ZW0gQVBJIGlzIGRpc2FsbG93ZWQgaW4gZmlsZTovLyB0eXBlIGxvY2F0aW9ucy4gRWl0aGVyIHVzZSB0aGUgRmlsZSBTeXN0ZW0gQVBJICh0aGUgdXNlIGdpdmVzIHlvdSBhY2Nlc3MgdG8gdGhlaXIgZmlsZSBzeXN0ZW0pLCBvciBob3N0IG9uIGFuIGFjdHVhbCBkb21haW5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucm9vdEhhbmRsZSA9IGF3YWl0IG5hdmlnYXRvci5zdG9yYWdlLmdldERpcmVjdG9yeSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnJvb3RIYW5kbGU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBkaXJlY3RvcnlFeGlzdHMoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGNvbnN0IHJvb3QgPSBhd2FpdCB0aGlzLmVuc3VyZUluaXRpYWxpemVkKCk7XG4gICAgICAgIHRyeSB7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5wYXRoIHx8IHRoaXMucGF0aCA9PT0gXCJcIiB8fCB0aGlzLnBhdGggPT09IFwiL1wiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIFJvb3QgYWx3YXlzIGV4aXN0c1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBwYXRoUGFydHMgPSB0aGlzLnBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcihwYXJ0ID0+IHBhcnQubGVuZ3RoID4gMCk7XG4gICAgICAgICAgICBsZXQgY3VycmVudEhhbmRsZSA9IHJvb3Q7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgcGFydCBvZiBwYXRoUGFydHMpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50SGFuZGxlID0gYXdhaXQgY3VycmVudEhhbmRsZS5nZXREaXJlY3RvcnlIYW5kbGUocGFydCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGdldERpcmVjdG9yeUhhbmRsZShjcmVhdGVQYXRoOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8RmlsZVN5c3RlbURpcmVjdG9yeUhhbmRsZT4ge1xuICAgICAgICBjb25zdCByb290ID0gYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuXG4gICAgICAgIGlmICghdGhpcy5wYXRoIHx8IHRoaXMucGF0aCA9PT0gXCJcIiB8fCB0aGlzLnBhdGggPT09IFwiL1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gcm9vdDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhdGhQYXJ0cyA9IHRoaXMucGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKHBhcnQgPT4gcGFydC5sZW5ndGggPiAwKTtcbiAgICAgICAgbGV0IGN1cnJlbnRIYW5kbGUgPSByb290O1xuXG4gICAgICAgIGZvciAoY29uc3QgcGFydCBvZiBwYXRoUGFydHMpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY3VycmVudEhhbmRsZSA9IGF3YWl0IGN1cnJlbnRIYW5kbGUuZ2V0RGlyZWN0b3J5SGFuZGxlKHBhcnQsIHsgY3JlYXRlOiBjcmVhdGVQYXRoIH0pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWNyZWF0ZVBhdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEaXJlY3Rvcnkgbm90IGZvdW5kOiAke3RoaXMucGF0aH1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY3VycmVudEhhbmRsZTtcbiAgICB9XG5cbiAgICAvLyBLZXlzIG1heSBjb250YWluIFwiL1wiIChuZXN0ZWQgcGF0aHMpLiBPUEZTIGhhbmRsZXMgcmVqZWN0IHNlcGFyYXRvcnMgaW4gbmFtZXMsIHNvIHdlXG4gICAgLy8gd2Fsay9jcmVhdGUgdGhlIGludGVybWVkaWF0ZSBkaXJlY3RvcmllcyBhbmQgcmV0dXJuIHRoZSBsZWFmIGRpcmVjdG9yeSArIGZpbGUgbmFtZS5cbiAgICBwcml2YXRlIGFzeW5jIHJlc29sdmVLZXkoa2V5OiBzdHJpbmcsIGNyZWF0ZTogYm9vbGVhbik6IFByb21pc2U8eyBkaXI6IEZpbGVTeXN0ZW1EaXJlY3RvcnlIYW5kbGU7IG5hbWU6IHN0cmluZyB9PiB7XG4gICAgICAgIGxldCBkaXIgPSBhd2FpdCB0aGlzLmdldERpcmVjdG9yeUhhbmRsZShjcmVhdGUpO1xuICAgICAgICBjb25zdCBwYXJ0cyA9IGtleS5zcGxpdChcIi9cIikuZmlsdGVyKHBhcnQgPT4gcGFydC5sZW5ndGggPiAwKTtcbiAgICAgICAgY29uc3QgbmFtZSA9IHBhcnRzLnBvcCgpO1xuICAgICAgICBpZiAoIW5hbWUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBlbXB0eSBrZXk6ICR7SlNPTi5zdHJpbmdpZnkoa2V5KX1gKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHBhcnQgb2YgcGFydHMpIHtcbiAgICAgICAgICAgIGRpciA9IGF3YWl0IGRpci5nZXREaXJlY3RvcnlIYW5kbGUocGFydCwgeyBjcmVhdGUgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgZGlyLCBuYW1lIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBnZXRGaWxlSGFuZGxlKGtleTogc3RyaW5nLCBjcmVhdGU6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8RmlsZVN5c3RlbUZpbGVIYW5kbGUgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgICAgICBpZiAoY3JlYXRlKSB7XG4gICAgICAgICAgICBjb25zdCB7IGRpciwgbmFtZSB9ID0gYXdhaXQgdGhpcy5yZXNvbHZlS2V5KGtleSwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgZGlyLmdldEZpbGVIYW5kbGUobmFtZSwgeyBjcmVhdGU6IHRydWUgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHsgZGlyLCBuYW1lIH0gPSBhd2FpdCB0aGlzLnJlc29sdmVLZXkoa2V5LCBmYWxzZSk7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgZGlyLmdldEZpbGVIYW5kbGUobmFtZSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBmaWxlRXhpc3RzKGtleTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiAhIShhd2FpdCB0aGlzLmdldEZpbGVIYW5kbGUoa2V5LCBmYWxzZSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXQoa2V5OiBzdHJpbmcpOiBQcm9taXNlPEJ1ZmZlciB8IHVuZGVmaW5lZD4ge1xuICAgICAgICAvLyBDaGVjayBpZiBmaWxlIGV4aXN0cyBmaXJzdCB0byBhdm9pZCB1bm5lY2Vzc2FyeSBlcnJvcnNcbiAgICAgICAgaWYgKCEoYXdhaXQgdGhpcy5maWxlRXhpc3RzKGtleSkpKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVIYW5kbGUgPSBhd2FpdCB0aGlzLmdldEZpbGVIYW5kbGUoa2V5LCBmYWxzZSk7XG4gICAgICAgICAgICBpZiAoIWZpbGVIYW5kbGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBmaWxlID0gYXdhaXQgZmlsZUhhbmRsZS5nZXRGaWxlKCk7XG4gICAgICAgICAgICBjb25zdCBhcnJheUJ1ZmZlciA9IGF3YWl0IGZpbGUuYXJyYXlCdWZmZXIoKTtcbiAgICAgICAgICAgIHJldHVybiBCdWZmZXIuZnJvbShhcnJheUJ1ZmZlcik7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYEVycm9yIHJlYWRpbmcgZmlsZSAke2tleX06YCwgZXJyb3IpO1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXRSYW5nZShrZXk6IHN0cmluZywgY29uZmlnOiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0pOiBQcm9taXNlPEJ1ZmZlciB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBjb25zdCBmaWxlSGFuZGxlID0gYXdhaXQgdGhpcy5nZXRGaWxlSGFuZGxlKGtleSwgZmFsc2UpO1xuICAgICAgICBpZiAoIWZpbGVIYW5kbGUpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaWxlID0gYXdhaXQgZmlsZUhhbmRsZS5nZXRGaWxlKCk7XG4gICAgICAgIGNvbnN0IGFycmF5QnVmZmVyID0gYXdhaXQgZmlsZS5zbGljZShjb25maWcuc3RhcnQsIGNvbmZpZy5lbmQpLmFycmF5QnVmZmVyKCk7XG4gICAgICAgIHJldHVybiBCdWZmZXIuZnJvbShhcnJheUJ1ZmZlcik7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNldChrZXk6IHN0cmluZywgdmFsdWU6IEJ1ZmZlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmVuc3VyZUluaXRpYWxpemVkKCk7XG4gICAgICAgIGNvbnN0IHsgZGlyLCBuYW1lIH0gPSBhd2FpdCB0aGlzLnJlc29sdmVLZXkoa2V5LCB0cnVlKTtcbiAgICAgICAgY29uc3QgZmlsZUhhbmRsZSA9IGF3YWl0IGRpci5nZXRGaWxlSGFuZGxlKG5hbWUsIHsgY3JlYXRlOiB0cnVlIH0pO1xuICAgICAgICBjb25zdCB3cml0YWJsZSA9IGF3YWl0IGZpbGVIYW5kbGUuY3JlYXRlV3JpdGFibGUoKTtcbiAgICAgICAgYXdhaXQgd3JpdGFibGUud3JpdGUodmFsdWUpO1xuICAgICAgICBhd2FpdCB3cml0YWJsZS5jbG9zZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBhcHBlbmQoa2V5OiBzdHJpbmcsIHZhbHVlOiBCdWZmZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgdGhpcy5nZXQoa2V5KTtcbiAgICAgICAgbGV0IG5ld0NvbnRlbnQ6IEJ1ZmZlcjtcbiAgICAgICAgaWYgKGV4aXN0aW5nQ29udGVudCkge1xuICAgICAgICAgICAgbmV3Q29udGVudCA9IEJ1ZmZlci5jb25jYXQoW2V4aXN0aW5nQ29udGVudCwgdmFsdWVdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5ld0NvbnRlbnQgPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLnNldChrZXksIG5ld0NvbnRlbnQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyByZW1vdmUoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgZmlsZSBleGlzdHMgZmlyc3QgdG8gYXZvaWQgdW5uZWNlc3NhcnkgZXJyb3JzXG4gICAgICAgIGlmICghKGF3YWl0IHRoaXMuZmlsZUV4aXN0cyhrZXkpKSkge1xuICAgICAgICAgICAgcmV0dXJuOyAvLyBGaWxlIGRvZXNuJ3QgZXhpc3QsIG5vdGhpbmcgdG8gcmVtb3ZlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IGRpciwgbmFtZSB9ID0gYXdhaXQgdGhpcy5yZXNvbHZlS2V5KGtleSwgZmFsc2UpO1xuICAgICAgICBhd2FpdCBkaXIucmVtb3ZlRW50cnkobmFtZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldEtleXMoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgICAgICAvLyBDaGVjayBpZiBkaXJlY3RvcnkgZXhpc3RzIGZpcnN0IHRvIGF2b2lkIHVubmVjZXNzYXJ5IGVycm9yc1xuICAgICAgICBpZiAoIShhd2FpdCB0aGlzLmRpcmVjdG9yeUV4aXN0cygpKSkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGlySGFuZGxlID0gYXdhaXQgdGhpcy5nZXREaXJlY3RvcnlIYW5kbGUoZmFsc2UpO1xuICAgICAgICBjb25zdCBrZXlzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBjb25zdCB3YWxrID0gYXN5bmMgKGRpcjogRmlsZVN5c3RlbURpcmVjdG9yeUhhbmRsZSwgcHJlZml4OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIC8vIFVzZSB0aGUgYXN5bmMgaXRlcmF0b3IgcHJvdG9jb2wgZm9yIEZpbGVTeXN0ZW1EaXJlY3RvcnlIYW5kbGVcbiAgICAgICAgICAgIGZvciBhd2FpdCAoY29uc3QgW25hbWUsIGhhbmRsZV0gb2YgKGRpciBhcyBhbnkpLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgICAgIGlmIChoYW5kbGUua2luZCA9PT0gXCJmaWxlXCIpIHtcbiAgICAgICAgICAgICAgICAgICAga2V5cy5wdXNoKHByZWZpeCArIG5hbWUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaGFuZGxlLmtpbmQgPT09IFwiZGlyZWN0b3J5XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgd2FsayhoYW5kbGUsIHByZWZpeCArIG5hbWUgKyBcIi9cIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBhd2FpdCB3YWxrKGRpckhhbmRsZSwgXCJcIik7XG4gICAgICAgIHJldHVybiBrZXlzLnNvcnQoKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdldEluZm8oa2V5OiBzdHJpbmcpOiBQcm9taXNlPHVuZGVmaW5lZCB8IHtcbiAgICAgICAgc2l6ZTogbnVtYmVyO1xuICAgICAgICBsYXN0TW9kaWZpZWQ6IG51bWJlcjtcbiAgICB9PiB7XG4gICAgICAgIGxldCBmaWxlSGFuZGxlID0gYXdhaXQgdGhpcy5nZXRGaWxlSGFuZGxlKGtleSwgZmFsc2UpO1xuICAgICAgICBpZiAoIWZpbGVIYW5kbGUpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGZpbGUgPSBhd2FpdCBmaWxlSGFuZGxlLmdldEZpbGUoKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNpemU6IGZpbGUuc2l6ZSxcbiAgICAgICAgICAgIGxhc3RNb2RpZmllZDogZmlsZS5sYXN0TW9kaWZpZWQsXG4gICAgICAgIH07XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZXNldCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm90IGltcGxlbWVudGVkXCIpO1xuICAgIH1cbn0iXX0=
|
|
187
|
+
/* _JS_SOURCE_HASH = "d36140aa01c59609e7b32f01e6afca9fd5be1f57c25820dea2bf3779303d78c0"; */
|