@media-quest/engine 0.0.7 → 0.0.8
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/dist/public-api.d.mts +35 -5
- package/dist/public-api.d.ts +35 -5
- package/dist/public-api.js +45 -3
- package/dist/public-api.mjs +41 -2
- package/package.json +2 -2
- package/src/commands/DCommand.ts +35 -34
- package/src/dto/SchemaDto.ts +45 -45
- package/src/player/dplayer.spec.ts +70 -69
- package/src/player/history-que.spec.ts +20 -19
- package/src/player/next-que.spec.ts +84 -83
- package/src/public-api.ts +1 -0
- package/src/rules/__test__/rule-engine.spec.ts +317 -316
- package/src/utils/ID.spec.ts +39 -0
- package/src/utils/ID.ts +71 -0
package/dist/public-api.js
CHANGED
|
@@ -27,10 +27,13 @@ __export(public_api_exports, {
|
|
|
27
27
|
DState: () => DState,
|
|
28
28
|
DStyle: () => DStyle,
|
|
29
29
|
DUtil: () => DUtil,
|
|
30
|
+
PageID: () => PageID,
|
|
30
31
|
Rule: () => Rule,
|
|
31
32
|
RuleEngine: () => RuleEngine,
|
|
32
33
|
SchemaDto: () => SchemaDto,
|
|
33
|
-
SchemaEngine: () => SchemaEngine
|
|
34
|
+
SchemaEngine: () => SchemaEngine,
|
|
35
|
+
SchemaID: () => SchemaID,
|
|
36
|
+
createTypedIdSingleton: () => createTypedIdSingleton
|
|
34
37
|
});
|
|
35
38
|
module.exports = __toCommonJS(public_api_exports);
|
|
36
39
|
|
|
@@ -2186,6 +2189,42 @@ var BooleanStateProperty = class _BooleanStateProperty {
|
|
|
2186
2189
|
};
|
|
2187
2190
|
}
|
|
2188
2191
|
};
|
|
2192
|
+
|
|
2193
|
+
// src/utils/ID.ts
|
|
2194
|
+
var ID_LENGTH = 32;
|
|
2195
|
+
var MIN_LENGTH = 10;
|
|
2196
|
+
var isID = (idName, id) => {
|
|
2197
|
+
if (typeof id !== "string")
|
|
2198
|
+
return false;
|
|
2199
|
+
return id.length >= MIN_LENGTH;
|
|
2200
|
+
};
|
|
2201
|
+
var createID = (idName) => {
|
|
2202
|
+
const letters = "abcdefghijklmnopqrstuvyz";
|
|
2203
|
+
const all = letters + letters.toUpperCase();
|
|
2204
|
+
let result = "";
|
|
2205
|
+
for (let i = 0; i < ID_LENGTH; i++) {
|
|
2206
|
+
const char = all.charAt(Math.floor(Math.random() * all.length));
|
|
2207
|
+
result += char;
|
|
2208
|
+
}
|
|
2209
|
+
return result;
|
|
2210
|
+
};
|
|
2211
|
+
var createTypedIdSingleton = (idName) => {
|
|
2212
|
+
const create = () => createID(idName);
|
|
2213
|
+
const is = (id) => isID(idName, id);
|
|
2214
|
+
const validateOrThrow = (id) => {
|
|
2215
|
+
if (!is(id)) {
|
|
2216
|
+
throw new Error(`Invalid id: ${id}`);
|
|
2217
|
+
}
|
|
2218
|
+
return id;
|
|
2219
|
+
};
|
|
2220
|
+
const name = idName;
|
|
2221
|
+
const ensure = (id) => {
|
|
2222
|
+
return is(id) ? id : create();
|
|
2223
|
+
};
|
|
2224
|
+
return Object.freeze({ create, is, ensure, validateOrThrow, name });
|
|
2225
|
+
};
|
|
2226
|
+
var SchemaID = createTypedIdSingleton("SCHEMA");
|
|
2227
|
+
var PageID = createTypedIdSingleton("PAGE");
|
|
2189
2228
|
// Annotate the CommonJS export names for ESM import in node:
|
|
2190
2229
|
0 && (module.exports = {
|
|
2191
2230
|
BooleanStateProperty,
|
|
@@ -2195,9 +2234,12 @@ var BooleanStateProperty = class _BooleanStateProperty {
|
|
|
2195
2234
|
DState,
|
|
2196
2235
|
DStyle,
|
|
2197
2236
|
DUtil,
|
|
2237
|
+
PageID,
|
|
2198
2238
|
Rule,
|
|
2199
2239
|
RuleEngine,
|
|
2200
2240
|
SchemaDto,
|
|
2201
|
-
SchemaEngine
|
|
2241
|
+
SchemaEngine,
|
|
2242
|
+
SchemaID,
|
|
2243
|
+
createTypedIdSingleton
|
|
2202
2244
|
});
|
|
2203
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3B1YmxpYy1hcGkudHMiLCAiLi4vc3JjL2R0by9TY2hlbWFEdG8udHMiLCAiLi4vc3JjL2NvbW1vbi9EVGltZXN0YW1wLnRzIiwgIi4uL3NyYy91dGlscy9EVXRpbC50cyIsICIuLi9zcmMvRGVsZW1lbnQvY3NzLnRzIiwgIi4uL3NyYy9EZWxlbWVudC9EU3R5bGUudHMiLCAiLi4vc3JjL0RlbGVtZW50L1ZpZGVvQ29udGFpbmVyLnRzIiwgIi4uL3NyYy9EZWxlbWVudC9BdWRpb0NvbnRhaW5lci50cyIsICIuLi9zcmMvc2VydmljZXMvRE1lZGlhLW1hbmFnZXIudHMiLCAiLi4vc3JjL2NvbW1hbmRzL0RDb21tYW5kQnVzLnRzIiwgIi4uL3NyYy9ldmVudHMvZXZlbnQtYnVzLnRzIiwgIi4uL3NyYy9wbGF5ZXIvaGlzdG9yeS1xdWUudHMiLCAiLi4vc3JjL3J1bGVzL2NvbmRpdGlvbi50cyIsICIuLi9zcmMvcnVsZXMvcnVsZS50cyIsICIuLi9zcmMvcnVsZXMvcnVsZS1lbmdpbmUudHMiLCAiLi4vc3JjL3BsYXllci9uZXh0LXF1ZS50cyIsICIuLi9zcmMvcGxheWVyL2RwbGF5ZXIudHMiLCAiLi4vc3JjL2V2ZW50LWhhbmRsZXJzL0RFdmVudEhhbmRsZXIudHMiLCAiLi4vc3JjL0RlbGVtZW50L0RFbGVtZW50LnRzIiwgIi4uL3NyYy9EZWxlbWVudC9EZGl2LnRzIiwgIi4uL3NyYy9EZWxlbWVudC9ESW1nLnRzIiwgIi4uL3NyYy9EZWxlbWVudC9EVGV4dC50cyIsICIuLi9zcmMvZW5naW5lL2VsZW1lbnQtZmFjdG9yeS50cyIsICIuLi9zcmMvZW5naW5lL0RQYWdlLnRzIiwgIi4uL3NyYy9lbmdpbmUvc2NhbGUudHMiLCAiLi4vc3JjL3NlcnZpY2VzL3Jlc291cmNlLXByb3ZpZGVyLnRzIiwgIi4uL3NyYy9jb21tb24vcmVzdWx0LnRzIiwgIi4uL3NyYy9zdGF0ZS9Ec3RhdGUudHMiLCAiLi4vc3JjL3N0YXRlL3N0YXRlLXNlcnZpY2UudHMiLCAiLi4vc3JjL2VuZ2luZS9TY2hlbWFFbmdpbmUudHMiLCAiLi4vc3JjL3N0YXRlL2Jvb2xlYW4tcHJvcGVydHkudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImV4cG9ydCB7IFNjaGVtYUVuZ2luZSB9IGZyb20gXCIuL2VuZ2luZS9TY2hlbWFFbmdpbmVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2R0by9TY2hlbWFEdG9cIjtcbmV4cG9ydCAqIGZyb20gXCIuL2R0by9BbmltYXRpb25EdG9cIjtcbmV4cG9ydCAqIGZyb20gXCIuL2R0by9ERWxlbWVudC5kdG9cIjtcbmV4cG9ydCAqIGZyb20gXCIuL2V2ZW50LWhhbmRsZXJzL0RFdmVudEhhbmRsZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NvbW1hbmRzL0RDb21tYW5kXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9ldmVudHMvREV2ZW50c1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vcnVsZXMvcnVsZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vcnVsZXMvZmFjdFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vcnVsZXMvcnVsZS1lbmdpbmVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3J1bGVzL2NvbmRpdGlvblwiO1xuZXhwb3J0ICogZnJvbSBcIi4vc3RhdGUvYm9vbGVhbi1wcm9wZXJ0eVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vc3RhdGUvRHN0YXRlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9EZWxlbWVudC9EU3R5bGVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL0RlbGVtZW50L0RBdXRvLXBsYXlcIjtcbmV4cG9ydCAqIGZyb20gXCIuL0RlbGVtZW50L2Nzc1wiO1xuXG5leHBvcnQgKiBmcm9tIFwiLi91dGlscy9EVXRpbFwiO1xuIiwgImltcG9ydCB7IERBdXRvUGxheVNlcXVlbmNlIH0gZnJvbSBcIi4uL0RlbGVtZW50L0RBdXRvLXBsYXlcIjtcbmltcG9ydCB7IERBdWRpb0R0bywgREVsZW1lbnREdG8sIERJbWdEdG8sIERWaWRlb0R0byB9IGZyb20gXCIuL0RFbGVtZW50LmR0b1wiO1xuaW1wb3J0IHsgUnVsZSB9IGZyb20gXCIuLi9ydWxlcy9ydWxlXCI7XG5pbXBvcnQgeyBGYWN0IH0gZnJvbSBcIi4uL3J1bGVzL2ZhY3RcIjtcbmltcG9ydCB7IFBhZ2VRdWVDb21tYW5kIH0gZnJvbSBcIi4uL2NvbW1hbmRzL0RDb21tYW5kXCI7XG5pbXBvcnQgeyBEU3RhdGUgfSBmcm9tIFwiLi4vc3RhdGUvRHN0YXRlXCI7XG5cbmV4cG9ydCB0eXBlIFBhZ2VRdWVSdWxlcyA9IFJ1bGU8UGFnZVF1ZUNvbW1hbmQsIG5ldmVyPjtcbmV4cG9ydCBpbnRlcmZhY2UgUGFnZUR0byB7XG4gICAgcmVhZG9ubHkgaWQ6IHN0cmluZztcbiAgICByZWFkb25seSBlbGVtZW50czogQXJyYXk8REVsZW1lbnREdG8+O1xuICAgIHJlYWRvbmx5IHRhZ3M/OiBzdHJpbmdbXTtcbiAgICByZWFkb25seSBtYWluVmlkZW9JZD86IHN0cmluZztcbiAgICByZWFkb25seSBiYWNrZ3JvdW5kQ29sb3I/OiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgdmlkZW8/OiBBcnJheTxEVmlkZW9EdG8+O1xuICAgIHJlYWRvbmx5IGF1ZGlvPzogQXJyYXk8REF1ZGlvRHRvPjtcbiAgICByZWFkb25seSBhdXRvUGxheVNlcXVlbmNlPzogREF1dG9QbGF5U2VxdWVuY2U7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFnZVNlcXVlbmNlRHRvIHtcbiAgICByZWFkb25seSBpZDogc3RyaW5nO1xuICAgIHJlYWRvbmx5IHJ1bGVzOiBBcnJheTxQYWdlUXVlUnVsZXM+O1xuICAgIHJlYWRvbmx5IHBhZ2VzOiBBcnJheTxQYWdlRHRvPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTY2hlbWFEdG8ge1xuICAgIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgcHJlZml4OiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgYmFzZUhlaWdodDogbnVtYmVyO1xuICAgIHJlYWRvbmx5IGJhc2VXaWR0aDogbnVtYmVyO1xuICAgIHJlYWRvbmx5IGJhY2tncm91bmRDb2xvcjogc3RyaW5nO1xuICAgIHJlYWRvbmx5IHBhZ2VzOiBQYWdlRHRvW107XG4gICAgcmVhZG9ubHkgcnVsZXM6IEFycmF5PFBhZ2VRdWVSdWxlcz47XG4gICAgcmVhZG9ubHkgc3RhdGVQcm9wcz86IFJlYWRvbmx5QXJyYXk8RFN0YXRlLlByb3A+O1xuICAgIHJlYWRvbmx5IHN0YXRlUXVlcmllcz86IFJlYWRvbmx5QXJyYXk8RFN0YXRlLlN0YXRlUXVlcnk+O1xuICAgIHJlYWRvbmx5IHN0YXRlRnJvbUV2ZW50OiBSZWFkb25seUFycmF5PERTdGF0ZS5mcm9tRXZlbnRIYW5kbGVyPjtcbiAgICByZWFkb25seSBwYWdlU2VxdWVuY2VzPzogQXJyYXk8UGFnZVNlcXVlbmNlRHRvPjtcbiAgICByZWFkb25seSBwcmVkZWZpbmVkRmFjdHM/OiBSZWFkb25seUFycmF5PEZhY3Q+O1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIFNjaGVtYUR0byB7XG4gICAgZXhwb3J0IGNvbnN0IGdldFJlc291cmNlcyA9IChcbiAgICAgICAgc2NoZW1hOiBTY2hlbWFEdG9cbiAgICApOiB7XG4gICAgICAgIHZpZGVvTGlzdDogUmVhZG9ubHlBcnJheTxEVmlkZW9EdG8+O1xuICAgICAgICBhdWRpb0xpc3Q6IFJlYWRvbmx5QXJyYXk8REF1ZGlvRHRvPjtcbiAgICAgICAgaW1hZ2VMaXN0OiBSZWFkb25seUFycmF5PERJbWdEdG8+O1xuICAgIH0gPT4ge1xuICAgICAgICBjb25zdCB7IHBhZ2VzIH0gPSBzY2hlbWE7XG4gICAgICAgIGNvbnN0IHZpZGVvTGlzdCA9IHBhZ2VzLnJlZHVjZTxBcnJheTxEVmlkZW9EdG8+PigoYWNjLCBjdXJyKSA9PiB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjdXJyLnZpZGVvKSkge1xuICAgICAgICAgICAgICAgIGFjYy5wdXNoKC4uLmN1cnIudmlkZW8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSwgW10pO1xuICAgICAgICBjb25zdCBhdWRpb0xpc3Q6IEFycmF5PERBdWRpb0R0bz4gPSBwYWdlcy5yZWR1Y2U8QXJyYXk8REF1ZGlvRHRvPj4oKGFjYywgY3VycikgPT4ge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY3Vyci5hdWRpbykpIHtcbiAgICAgICAgICAgICAgICBhY2MucHVzaCguLi5jdXJyLmF1ZGlvKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH0sIFtdKTtcblxuICAgICAgICByZXR1cm4geyB2aWRlb0xpc3QsIGF1ZGlvTGlzdCwgaW1hZ2VMaXN0OiBbXSB9O1xuICAgIH07XG59XG4iLCAiZXhwb3J0IHR5cGUgRFRpbWVzdGFtcCA9IG51bWJlciAmIHsgX190aW1lc3RhbXBfXzogdHJ1ZSB9O1xuZXhwb3J0IG5hbWVzcGFjZSBEVGltZXN0YW1wIHtcbiAgICBleHBvcnQgY29uc3Qgbm93ID0gKCkgPT4gRGF0ZS5ub3coKSBhcyBEVGltZXN0YW1wO1xuICAgIGV4cG9ydCB0eXBlIERpZmYgPSBudW1iZXIgJiB7IF9fZGlmZl9fOiB0cnVlIH07XG5cbiAgICBleHBvcnQgY29uc3QgYWRkTWlsbHMgPSAodDogRFRpbWVzdGFtcCwgbXM6IG51bWJlcik6IERUaW1lc3RhbXAgPT4ge1xuICAgICAgICBjb25zdCByZXMgPSB0ICsgTWF0aC5hYnMobXMpO1xuICAgICAgICByZXR1cm4gcmVzIGFzIERUaW1lc3RhbXA7XG4gICAgfTtcblxuICAgIGV4cG9ydCBjb25zdCBkaWZmID0gKHQxOiBEVGltZXN0YW1wLCB0MjogRFRpbWVzdGFtcCk6IERpZmYgPT4ge1xuICAgICAgICBjb25zdCB0MUFicyA9IE1hdGguYWJzKHQxKTtcbiAgICAgICAgY29uc3QgdDJBYnMgPSBNYXRoLmFicyh0Mik7XG4gICAgICAgIHJldHVybiBNYXRoLmFicyh0MUFicyAtIHQyQWJzKSBhcyBEaWZmO1xuICAgIH07XG5cbiAgICBleHBvcnQgY29uc3QgZGlmZk5vdyA9ICh0OiBEVGltZXN0YW1wKTogRGlmZiA9PiB7XG4gICAgICAgIHJldHVybiBkaWZmKHQsIG5vdygpKTtcbiAgICB9O1xufVxuIiwgImV4cG9ydCB0eXBlIFJhbmRvbU9iamVjdElkID0gc3RyaW5nICYgeyByYW5kb21PYmplY3RJZDogdHJ1ZSB9O1xuZXhwb3J0IG5hbWVzcGFjZSBEVXRpbCB7XG4gICAgZXhwb3J0IGNvbnN0IHJhbmRvbVN0cmluZyA9IChsZW5ndGg6IG51bWJlcik6IHN0cmluZyA9PiB7XG4gICAgICAgIGNvbnN0IGxldHRlcnMgPSBcImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ4eXpcIjtcbiAgICAgICAgY29uc3QgdXBwZXJjYXNlID0gbGV0dGVycy50b1VwcGVyQ2FzZSgpO1xuICAgICAgICBjb25zdCBhbGwgPSBsZXR0ZXJzICsgdXBwZXJjYXNlO1xuICAgICAgICBjb25zdCBhYnMgPSBNYXRoLmFicyhsZW5ndGgpO1xuICAgICAgICBsZXQgcmVzdWx0ID0gXCJcIjtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFiczsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBjaGFyID0gYWxsLmNoYXJBdChNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBhbGwubGVuZ3RoKSk7XG4gICAgICAgICAgICByZXN1bHQgKz0gY2hhcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICBleHBvcnQgY29uc3QgcmFuZG9tT2JqZWN0SWQgPSAoKSA9PiByYW5kb21TdHJpbmcoMzIpIGFzIFJhbmRvbU9iamVjdElkO1xuXG4gICAgZXhwb3J0IGNvbnN0IGRlbGV0ZVByb3AgPSA8T2JqLCBLZXkgZXh0ZW5kcyBrZXlvZiBPYmo+KG9iajogT2JqLCBrZXk6IEtleSk6IE9taXQ8T2JqLCBLZXk+ID0+IHtcbiAgICAgICAgZGVsZXRlIG9ialtrZXldO1xuICAgICAgICByZXR1cm4gb2JqO1xuICAgIH07XG5cbiAgICBleHBvcnQgY29uc3QgaXNJblJhbmdlID0gKG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcikgPT4ge1xuICAgICAgICByZXR1cm4gKHZhbHVlOiBudW1iZXIpID0+IHZhbHVlID49IG1pbiAmJiB2YWx1ZSA8PSBtYXg7XG4gICAgfTtcbiAgICBleHBvcnQgY29uc3QgaXNJbmZpbml0eSA9IChudW1iZXI6IG51bWJlcikgPT4ge1xuICAgICAgICByZXR1cm4gbnVtYmVyID09PSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkgfHwgbnVtYmVyID09PSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkgfHwgbnVtYmVyID09PSBJbmZpbml0eTtcbiAgICB9O1xuICAgIGV4cG9ydCB0eXBlIE5vbkVtcHR5QXJyYXk8VD4gPSBbVCwgLi4uVFtdXTtcbiAgICBleHBvcnQgY29uc3QgaXNOb25FbXB0eUFycmF5ID0gPFQ+KGFycmF5OiBBcnJheTxUPik6IGFycmF5IGlzIE5vbkVtcHR5QXJyYXk8VD4gPT4ge1xuICAgICAgICByZXR1cm4gYXJyYXkubGVuZ3RoID4gMDtcbiAgICB9O1xuXG4gICAgZXhwb3J0IGNvbnN0IG5ldmVyQ2hlY2sgPSAoYXJnczogbmV2ZXIpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coXCJPT1BTOiBUaGlzIHZhbHVlIHNsaXBwZWQgdGhyb3VnaCB0aGUgbmV2ZXItY2hlY2tcIiwgYXJncyk7XG4gICAgfTtcblxuICAgIGV4cG9ydCBjb25zdCBpc1N0cmluZyA9IChzdHI6IHVua25vd24pOiBzdHIgaXMgc3RyaW5nID0+IHR5cGVvZiBzdHIgPT09IFwic3RyaW5nXCI7XG5cbiAgICBleHBvcnQgY29uc3QgaGFzS2V5ID0gPFQgZXh0ZW5kcyBzdHJpbmc+KG9iajogdW5rbm93biwga2V5OiBUKTogb2JqIGlzIFJlY29yZDx0eXBlb2Yga2V5LCB1bmtub3duPiA9PiB7XG4gICAgICAgIGlmICghaXNSZWNvcmQob2JqKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpO1xuICAgIH07XG5cbiAgICBleHBvcnQgY29uc3QgaXNSZWNvcmQgPSAob2JqOiB1bmtub3duKTogb2JqIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+IHtcbiAgICAgICAgaWYgKCFvYmopIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2Ygb2JqICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob2JqID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcblxuICAgIGV4cG9ydCBjb25zdCBpc0Jvb2wgPSAob2JqOiBib29sZWFuKTogb2JqIGlzIGJvb2xlYW4gPT4gdHlwZW9mIG9iaiA9PT0gXCJib29sZWFuXCI7XG5cbiAgICBleHBvcnQgY29uc3QgaXNUcnVlID0gKGJvb2w6IGJvb2xlYW4pOiBib29sIGlzIHRydWUgPT4gYm9vbCA9PT0gdHJ1ZTtcblxuICAgIGV4cG9ydCBjb25zdCBpc0ZhbHNlID0gKGJvb2w6IGJvb2xlYW4pOiBib29sIGlzIGZhbHNlID0+IGJvb2wgPT09IGZhbHNlO1xuXG4gICAgZXhwb3J0IGNvbnN0IGlzRGVmaW5lZCA9IChvYmo6IHVua25vd24pOiBib29sZWFuID0+IHtcbiAgICAgICAgY29uc3Qgbm90TnVsbCA9IG9iaiAhPT0gbnVsbDtcbiAgICAgICAgY29uc3Qgbm90VW5kZWZpbmVkID0gb2JqICE9PSB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiBub3ROdWxsICYmIG5vdFVuZGVmaW5lZDtcbiAgICB9O1xuXG4gICAgZXhwb3J0IGNvbnN0IGhhc0tpbmQgPSAob2JqOiB1bmtub3duKTogb2JqIGlzIHsgcmVhZG9ubHkga2luZDogc3RyaW5nIH0gPT4ge1xuICAgICAgICBpZiAoIWhhc0tleShvYmosIFwia2luZFwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygb2JqLmtpbmQgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqLmtpbmQubGVuZ3RoID4gMDtcbiAgICB9O1xuXG4gICAgZXhwb3J0IGNvbnN0IGhhc1ZhbHVlID0gKG9iajogdW5rbm93bik6IG9iaiBpcyB7IHZhbHVlOiB1bmtub3duIH0gPT4ge1xuICAgICAgICByZXR1cm4gaGFzS2V5KG9iaiwgXCJ2YWx1ZVwiKTtcbiAgICB9O1xuICAgIGV4cG9ydCBjb25zdCBpc051bWJlciA9ICh2YWx1ZT86IG51bWJlcik6IHZhbHVlIGlzIG51bWJlciA9PiB7XG4gICAgICAgIGNvbnN0IGlzTnVtYmVyID0gdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiO1xuICAgICAgICBjb25zdCBub3ROYU4gPSAhTnVtYmVyLmlzTmFOKHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIGlzTnVtYmVyICYmIG5vdE5hTjtcbiAgICB9O1xuXG4gICAgZXhwb3J0IGNvbnN0IG1heEZuID0gKHVwcGVyTGltaXQ6IG51bWJlcikgPT4ge1xuICAgICAgICByZXR1cm4gKHZhbHVlOiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLm1pbih2YWx1ZSwgdXBwZXJMaW1pdCk7XG4gICAgICAgIH07XG4gICAgfTtcblxuICAgIGV4cG9ydCBjb25zdCBtaW5GbiA9IChsb3dlckxpbWl0OiBudW1iZXIpID0+IHtcbiAgICAgICAgcmV0dXJuICh2YWx1ZTogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5taW4odmFsdWUsIGxvd2VyTGltaXQpO1xuICAgICAgICB9O1xuICAgIH07XG59XG4iLCAiaW1wb3J0IHsgRFV0aWwgfSBmcm9tIFwiLi4vdXRpbHMvRFV0aWxcIjtcblxuZXhwb3J0IG5hbWVzcGFjZSBEQ3NzIHtcbiAgICBleHBvcnQgaW50ZXJmYWNlIFB4IHtcbiAgICAgICAgcmVhZG9ubHkgX3VuaXQ6IFwicHhcIjtcbiAgICAgICAgcmVhZG9ubHkgdmFsdWU6IG51bWJlcjtcbiAgICB9XG5cbiAgICBleHBvcnQgdHlwZSBMZW5ndGhTdHJpbmcgPSBgJHtudW1iZXJ9cHhgIHwgYCR7bnVtYmVyfSVgO1xuICAgIGV4cG9ydCBpbnRlcmZhY2UgUGVyY2VudCB7XG4gICAgICAgIHJlYWRvbmx5IF91bml0OiBcInBlcmNlbnRcIjtcbiAgICAgICAgcmVhZG9ubHkgdmFsdWU6IG51bWJlcjtcbiAgICB9XG5cbiAgICBleHBvcnQgdHlwZSBMZW5ndGhVbml0ID0gUHggfCBQZXJjZW50O1xuXG4gICAgLyoqXG4gICAgICogV2lsbCBzY2FsZSB0byAzJSBvZiBiYXNlU2NhbGVcbiAgICAgKiBAcGFyYW0gdW5pdFxuICAgICAqIEBwYXJhbSBzY2FsZVxuICAgICAqL1xuICAgIGV4cG9ydCBjb25zdCB0b1N0cmluZyA9ICh1bml0OiBSZWFkb25seTxMZW5ndGhVbml0Piwgc2NhbGU6IG51bWJlcik6IExlbmd0aFN0cmluZyA9PiB7XG4gICAgICAgIGNvbnN0IGNsYW1wZWRTY2FsZSA9IE1hdGgubWF4KHNjYWxlLCAwLjAzKTtcbiAgICAgICAgaWYgKHVuaXQuX3VuaXQgPT09IFwicHhcIikge1xuICAgICAgICAgICAgaWYgKHVuaXQudmFsdWUgPCAwLjEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCIwcHhcIjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgcm91bmRlZCA9IE1hdGgucm91bmQodW5pdC52YWx1ZSAqIGNsYW1wZWRTY2FsZSk7XG4gICAgICAgICAgICBjb25zdCBjbGFtcGVkID0gTWF0aC5tYXgocm91bmRlZCwgMSk7XG4gICAgICAgICAgICByZXR1cm4gKGNsYW1wZWQgKyBcInB4XCIpIGFzIExlbmd0aFN0cmluZztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKHVuaXQudmFsdWUgKyBcIiVcIikgYXMgTGVuZ3RoU3RyaW5nO1xuICAgIH07XG5cbiAgICBleHBvcnQgY29uc3QgaXNMZW5ndGhVbml0ID0gKHVuaXQ/OiBMZW5ndGhVbml0KTogdW5pdCBpcyBMZW5ndGhVbml0ID0+IHtcbiAgICAgICAgaWYgKCF1bml0KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdW5pdEtleToga2V5b2YgTGVuZ3RoVW5pdCA9IFwiX3VuaXRcIjtcbiAgICAgICAgY29uc3QgdmFsdWVLZXk6IGtleW9mIExlbmd0aFVuaXQgPSBcInZhbHVlXCI7XG4gICAgICAgIGNvbnN0IGhhc1VuaXRLZXkgPSBEVXRpbC5oYXNLZXkodW5pdCwgdW5pdEtleSk7XG4gICAgICAgIGNvbnN0IGhhc1ZhbHVlS2V5ID0gRFV0aWwuaGFzS2V5KHVuaXQsIHZhbHVlS2V5KTtcbiAgICAgICAgcmV0dXJuIGhhc1VuaXRLZXkgJiYgaGFzVmFsdWVLZXk7XG4gICAgfTtcbn1cbiIsICJpbXBvcnQgeyBEQ3NzIH0gZnJvbSBcIi4vY3NzXCI7XG5pbXBvcnQgeyBFbGVtZW50S2V5TmFtZXMgfSBmcm9tIFwiLi9EU3R5bGUtdXRpbHNcIjtcbmltcG9ydCB7IERVdGlsIH0gZnJvbSBcIi4uL3V0aWxzL0RVdGlsXCI7XG5cbnR5cGUgRFN0eWxlMiA9IENTU1N0eWxlRGVjbGFyYXRpb247XG5leHBvcnQgaW50ZXJmYWNlIERTdHlsZSB7XG4gICAgb3BhY2l0eTogbnVtYmVyO1xuICAgIGJhY2tncm91bmRDb2xvcjogc3RyaW5nO1xuICAgIHZpc2liaWxpdHk6IFwidmlzaWJsZVwiIHwgXCJoaWRkZW5cIjtcbiAgICBjdXJzb3I6XG4gICAgICAgIHwgXCJwb2ludGVyXCJcbiAgICAgICAgfCBcImhlbHBcIlxuICAgICAgICB8IFwiY29weVwiXG4gICAgICAgIHwgXCJ3YWl0XCJcbiAgICAgICAgfCBcIm5vdC1hbGxvd2VkXCJcbiAgICAgICAgfCBcImNvbnRleHQtbWVudVwiXG4gICAgICAgIHwgXCJtb3ZlXCJcbiAgICAgICAgfCBcImdyYWJiaW5nXCJcbiAgICAgICAgfCBcImdyYWJcIlxuICAgICAgICB8IFwiem9vbS1pblwiXG4gICAgICAgIHwgXCJ6b29tLW91dFwiXG4gICAgICAgIHwgXCJub25lXCJcbiAgICAgICAgfCBcImF1dG9cIlxuICAgICAgICB8IFwiZGVmYXVsdFwiO1xuXG4gICAgLy8gUE9TSVRJT05cbiAgICBoOiBudW1iZXI7XG4gICAgdzogbnVtYmVyO1xuICAgIHg6IG51bWJlcjtcbiAgICB5OiBudW1iZXI7XG5cbiAgICAvLyBCT1JERVJTXG4gICAgYm9yZGVyU3R5bGU6IFwic29saWRcIiB8IFwibm9uZVwiIHwgXCJkb3R0ZWRcIiB8IFwiZGFzaGVkXCI7XG4gICAgYm9yZGVyUmFkaXVzOiBEQ3NzLlB4IHwgRENzcy5QZXJjZW50O1xuICAgIGJvcmRlcldpZHRoOiBEQ3NzLlB4O1xuICAgIGJvcmRlckNvbG9yOiBzdHJpbmc7XG5cbiAgICBtYXJnaW46IERDc3MuUHggfCBEQ3NzLlBlcmNlbnQ7XG4gICAgcGFkZGluZzogRENzcy5QeCB8IERDc3MuUGVyY2VudDtcblxuICAgIC8vIFRyYW5zbGF0ZVxuICAgIHRyYW5zZm9ybTogc3RyaW5nO1xuICAgIHRyYW5zbGF0ZTogc3RyaW5nO1xuXG4gICAgLy8gVEVYVFxuICAgIGZvbnRTaXplOiBEQ3NzLlB4O1xuICAgIHRleHRDb2xvcjogc3RyaW5nO1xuICAgIGZvbnRXZWlnaHQ6IDEwMCB8IDIwMCB8IDMwMCB8IDQwMCB8IDUwMCB8IDYwMCB8IDcwMCB8IDgwMCB8IDkwMDtcbiAgICB0ZXh0QWxpZ246IFwicmlnaHRcIiB8IFwibGVmdFwiIHwgXCJjZW50ZXJcIjtcbiAgICBsZXR0ZXJTcGFjaW5nOiBEQ3NzLlB4O1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIERTdHlsZSB7XG4gICAgZXhwb3J0IGNvbnN0IG5vcm1hbGl6ZSA9IDxUIGV4dGVuZHMgSFRNTEVsZW1lbnQ+KGVsOiBUKTogVCA9PiB7XG4gICAgICAgIGVsLnN0eWxlLnBhZGRpbmcgPSBcIjBcIjtcbiAgICAgICAgZWwuc3R5bGUubWFyZ2luID0gXCIwXCI7XG4gICAgICAgIGVsLnN0eWxlLnBvc2l0aW9uID0gXCJhYnNvbHV0ZVwiO1xuICAgICAgICBlbC5zdHlsZS5ib3hTaXppbmcgPSBcImJvcmRlci1ib3hcIjtcbiAgICAgICAgcmV0dXJuIGVsO1xuICAgIH07XG5cbiAgICBleHBvcnQgY29uc3QgYXBwbHlTdHlsZXMgPSA8VCBleHRlbmRzIEhUTUxFbGVtZW50PihlbDogVCwgc3R5bGU6IFBhcnRpYWw8RFN0eWxlPiwgc2NhbGU6IG51bWJlcik6IFQgPT4ge1xuICAgICAgICAvLyBjb25zdCBzY2FsZVB4ID0gRENzcy50b1N0cmluZ0NyZSh0aGlzLnNjYWxlKTtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgeCxcbiAgICAgICAgICAgIHksXG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3IsXG4gICAgICAgICAgICBib3JkZXJDb2xvcixcbiAgICAgICAgICAgIGJvcmRlcldpZHRoLFxuICAgICAgICAgICAgYm9yZGVyUmFkaXVzLFxuICAgICAgICAgICAgYm9yZGVyU3R5bGUsXG4gICAgICAgICAgICB3LFxuICAgICAgICAgICAgb3BhY2l0eSxcbiAgICAgICAgICAgIGN1cnNvcixcbiAgICAgICAgICAgIGZvbnRTaXplLFxuICAgICAgICAgICAgZm9udFdlaWdodCxcbiAgICAgICAgICAgIHRleHRDb2xvcixcbiAgICAgICAgICAgIHRleHRBbGlnbixcbiAgICAgICAgICAgIHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIG1hcmdpbixcbiAgICAgICAgICAgIHBhZGRpbmcsXG4gICAgICAgICAgICBsZXR0ZXJTcGFjaW5nLFxuICAgICAgICAgICAgaCxcbiAgICAgICAgICAgIHRyYW5zZm9ybSxcbiAgICAgICAgICAgIHZpc2liaWxpdHksXG4gICAgICAgIH0gPSBzdHlsZTtcblxuICAgICAgICAvLyB0aGlzLmVsLnN0eWxlLmZvbnRXZWlnaHQgPSAnOTAwJztcbiAgICAgICAgaWYgKGJhY2tncm91bmRDb2xvcikge1xuICAgICAgICAgICAgZWwuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gYmFja2dyb3VuZENvbG9yO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGN1cnNvcikge1xuICAgICAgICAgICAgZWwuc3R5bGUuY3Vyc29yID0gY3Vyc29yO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRyYW5zZm9ybSkge1xuICAgICAgICAgICAgZWwuc3R5bGUudHJhbnNmb3JtID0gdHJhbnNmb3JtO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRleHRDb2xvcikge1xuICAgICAgICAgICAgZWwuc3R5bGUuY29sb3IgPSB0ZXh0Q29sb3I7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRleHRBbGlnbikge1xuICAgICAgICAgICAgZWwuc3R5bGUudGV4dEFsaWduID0gdGV4dEFsaWduO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGJvcmRlckNvbG9yKSB7XG4gICAgICAgICAgICBlbC5zdHlsZS5ib3JkZXJDb2xvciA9IGJvcmRlckNvbG9yO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGJvcmRlcldpZHRoKSB7XG4gICAgICAgICAgICBlbC5zdHlsZS5ib3JkZXJXaWR0aCA9IERDc3MudG9TdHJpbmcoYm9yZGVyV2lkdGgsIHNjYWxlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZm9udFdlaWdodCkge1xuICAgICAgICAgICAgZWwuc3R5bGUuZm9udFdlaWdodCA9IGZvbnRXZWlnaHQgKyBcIlwiO1xuICAgICAgICB9XG4gICAgICAgIGlmIChib3JkZXJTdHlsZSkge1xuICAgICAgICAgICAgZWwuc3R5bGUuYm9yZGVyU3R5bGUgPSBib3JkZXJTdHlsZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZm9udFNpemUpIHtcbiAgICAgICAgICAgIGVsLnN0eWxlLmZvbnRTaXplID0gRENzcy50b1N0cmluZyhmb250U2l6ZSwgc2NhbGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKERVdGlsLmlzTnVtYmVyKHgpKSB7XG4gICAgICAgICAgICBlbC5zdHlsZS5sZWZ0ID0geCArIFwiJVwiO1xuICAgICAgICB9XG4gICAgICAgIGlmIChEVXRpbC5pc051bWJlcih5KSkge1xuICAgICAgICAgICAgZWwuc3R5bGUuYm90dG9tID0geSArIFwiJVwiO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKERVdGlsLmlzTnVtYmVyKGgpKSB7XG4gICAgICAgICAgICBlbC5zdHlsZS5oZWlnaHQgPSBoICsgXCIlXCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKERVdGlsLmlzTnVtYmVyKHcpKSB7XG4gICAgICAgICAgICBlbC5zdHlsZS53aWR0aCA9IHcgKyBcIiVcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChEQ3NzLmlzTGVuZ3RoVW5pdChib3JkZXJSYWRpdXMpKSB7XG4gICAgICAgICAgICBlbC5zdHlsZS5ib3JkZXJSYWRpdXMgPSBEQ3NzLnRvU3RyaW5nKGJvcmRlclJhZGl1cywgc2NhbGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxldHRlclNwYWNpbmcpIHtcbiAgICAgICAgICAgIGVsLnN0eWxlLmxldHRlclNwYWNpbmcgPSBEQ3NzLnRvU3RyaW5nKGxldHRlclNwYWNpbmcsIHNjYWxlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWFyZ2luKSB7XG4gICAgICAgICAgICBlbC5zdHlsZS5tYXJnaW4gPSBEQ3NzLnRvU3RyaW5nKG1hcmdpbiwgc2NhbGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYWRkaW5nKSB7XG4gICAgICAgICAgICBlbC5zdHlsZS5wYWRkaW5nID0gRENzcy50b1N0cmluZyhwYWRkaW5nLCBzY2FsZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoRFV0aWwuaXNOdW1iZXIob3BhY2l0eSkpIHtcbiAgICAgICAgICAgIGVsLnN0eWxlLm9wYWNpdHkgPSBvcGFjaXR5ICsgXCJcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2aXNpYmlsaXR5KSB7XG4gICAgICAgICAgICBlbC5zdHlsZS52aXNpYmlsaXR5ID0gdmlzaWJpbGl0eTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlbDtcbiAgICB9O1xuICAgIC8vIGNvbnN0IHByb3BOYW1lcyA9IG5ldyBTZXQoLi4uRWxlbWVudEtleU5hbWVzKTtcbiAgICAvLyBleHBvcnQgY29uc3QgdmFsaWRLZXkgPSAoa2V5TmFtZTogc3RyaW5nKSA9PiBwcm9wTmFtZXMuaGFzKGtleU5hbWUpO1xufVxuIiwgImltcG9ydCB7IERWaWRlb0R0byB9IGZyb20gXCIuLi9kdG8vREVsZW1lbnQuZHRvXCI7XG5pbXBvcnQgeyBEVGltZXN0YW1wIH0gZnJvbSBcIi4uL2NvbW1vbi9EVGltZXN0YW1wXCI7XG5pbXBvcnQgeyBERXZlbnREaXNwYXRjaGVyIH0gZnJvbSBcIi4uL2V2ZW50cy9ldmVudC1idXNcIjtcbmltcG9ydCB7IFNjYWxlU2VydmljZSB9IGZyb20gXCIuLi9lbmdpbmUvc2NhbGVcIjtcbmltcG9ydCB7IERTdHlsZSB9IGZyb20gXCIuL0RTdHlsZVwiO1xuaW1wb3J0IHsgRFV0aWwgfSBmcm9tIFwiLi4vdXRpbHMvRFV0aWxcIjtcblxuY29uc3QgQUJPUlRfUExBWV9UT19FTkQgPSBcIkFCT1JUX1BMQVlfVE9fRU5EXCI7XG5leHBvcnQgaW50ZXJmYWNlIENhblBsYXlUb0VuZCB7XG4gICAgcGxheVRvRW5kKCk6IFByb21pc2U8Ym9vbGVhbj47XG59XG5cbmV4cG9ydCBjbGFzcyBWaWRlb0NvbnRhaW5lciBpbXBsZW1lbnRzIENhblBsYXlUb0VuZCB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBUQUc6IHN0cmluZztcbiAgICBwcml2YXRlIGR0bz86IERWaWRlb0R0bztcbiAgICBwcml2YXRlIGRlZmF1bHRTdHlsZXM6IFBhcnRpYWw8RFN0eWxlPiA9IHsgaDogNDUsIHc6IDEwMCwgdmlzaWJpbGl0eTogXCJoaWRkZW5cIiwgeTogNTUgfTtcblxuICAgIHBhdXNlKCkge1xuICAgICAgICB0aGlzLmV2ZW50QnVzLmVtaXQoe1xuICAgICAgICAgICAga2luZDogXCJWSURFT19QQVVTRURfRVZFTlRcIixcbiAgICAgICAgICAgIGRhdGE6IHt9LFxuICAgICAgICAgICAgcHJvZHVjZXI6IFwiRFZpZGVvXCIsXG4gICAgICAgICAgICBwcm9kdWNlcklkOiB0aGlzLmlkLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBEVGltZXN0YW1wLm5vdygpLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5lbC5wYXVzZSgpO1xuICAgIH1cblxuICAgIHBsYXkodXJsOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKHRoaXMuZWwuc3JjICE9PSB1cmwpIHtcbiAgICAgICAgICAgIHRoaXMuZWwuc3JjID0gdXJsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByb2R1Y2VySWQgPSB0aGlzLmR0bz8uaWQgPz8gXCJEVmlkZW9cIjtcbiAgICAgICAgdGhpcy5ldmVudEJ1cy5lbWl0KHtcbiAgICAgICAgICAgIGtpbmQ6IFwiVklERU9fUExBWV9FVkVOVFwiLFxuICAgICAgICAgICAgZGF0YToge30sXG4gICAgICAgICAgICBwcm9kdWNlcjogXCJEVmlkZW9cIixcbiAgICAgICAgICAgIHByb2R1Y2VySWQsXG4gICAgICAgICAgICB0aW1lc3RhbXA6IERUaW1lc3RhbXAubm93KCksXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmVsXG4gICAgICAgICAgICAucGxheSgpXG4gICAgICAgICAgICAudGhlbigocmVzKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2cocmVzKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAvLyBpZih0aGlzLmVsLnNyYyAhPT0gdXJsKSB7XG4gICAgICAgIC8vICAgICB0aGlzLlxuICAgICAgICAvLyB9XG4gICAgfVxuXG4gICAgYXN5bmMgcGxheVRvRW5kKCkge1xuICAgICAgICB0aGlzLmVsLnZvbHVtZSA9IDE7XG4gICAgICAgIGNvbnN0IHVybCA9IHRoaXMuZHRvPy51cmw7XG4gICAgICAgIGlmICghdXJsKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZW5kZWRPckVycm9yZWQgPSBuZXcgUHJvbWlzZTxib29sZWFuPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgICAgICAgICAgICBcImVuZGVkXCIsXG4gICAgICAgICAgICAgICAgICAgIChfKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7IG9uY2U6IHRydWUgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgdGhpcy5lbC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgICAgICAgICAgICBcImVycm9yXCIsXG4gICAgICAgICAgICAgICAgICAgIChfKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgeyBvbmNlOiB0cnVlIH1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHRoaXMuZWwuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICAgICAgICAgICAgQUJPUlRfUExBWV9UT19FTkQsXG4gICAgICAgICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiQ0FUQ0hFRCBBQkJPUlQuXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KFwiQWJvcnRlZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgeyBvbmNlOiB0cnVlIH1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIlBMQVlcIik7XG4gICAgICAgICAgICB0aGlzLnBsYXkodXJsKTtcbiAgICAgICAgICAgIGF3YWl0IGVuZGVkT3JFcnJvcmVkO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGUpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgY29uc29sZS5sb2codGhpcy5UQUcgKyBcIiBmaW5hbGx5IGJsb2NrIHBsYXlUb0VuZCgpIGNvbXBsZXRlZCB2aWRlb0lkOiBcIiArIHRoaXMuZHRvPy5pZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBlbDogSFRNTFZpZGVvRWxlbWVudCxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBldmVudEJ1czogREV2ZW50RGlzcGF0Y2hlcixcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBzY2FsZTogU2NhbGVTZXJ2aWNlIC8vIGR0bz86IERWaWRlb0R0b1xuICAgICkge1xuICAgICAgICB0aGlzLlRBRyA9IFwiWyBEX1ZpZGVvIF0gOiBcIjtcbiAgICAgICAgdGhpcy5lbC5jb250cm9scyA9IGZhbHNlO1xuICAgICAgICBEU3R5bGUubm9ybWFsaXplKHRoaXMuZWwpO1xuICAgICAgICBEU3R5bGUuYXBwbHlTdHlsZXModGhpcy5lbCwgdGhpcy5kZWZhdWx0U3R5bGVzLCB0aGlzLnNjYWxlLnNjYWxlKTtcblxuICAgICAgICB0aGlzLmVsLm9uZW5kZWQgPSAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmV2ZW50QnVzLmVtaXQoe1xuICAgICAgICAgICAgICAgIGtpbmQ6IFwiVklERU9fRU5ERURfRVZFTlRcIixcbiAgICAgICAgICAgICAgICB0aW1lc3RhbXA6IERUaW1lc3RhbXAubm93KCksXG4gICAgICAgICAgICAgICAgcHJvZHVjZXI6IFwiRFZpZGVvXCIsXG4gICAgICAgICAgICAgICAgcHJvZHVjZXJJZDogdGhpcy5pZCxcbiAgICAgICAgICAgICAgICBkYXRhOiB7fSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmVsLm9ucGxheSA9ICgpID0+IHtcbiAgICAgICAgICAgIC8vIFRPRE8gTE9HRyBJTlRFUk5BTCBTVEFURV9DSEFOR0VTLlxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuZWwub25wYXVzZSA9ICgpID0+IHt9O1xuICAgICAgICB0aGlzLmVsLm9uZXJyb3IgPSAoKSA9PiB7fTtcbiAgICAgICAgdGhpcy5lbC5vbmNhbnBsYXkgPSAoKSA9PiB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmdyb3VwQ29sbGFwc2VkKHRoaXMuVEFHICsgXCJSRUFEWSBUTyBQTEFZXCIpO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJEdXJhdGlvbjogXCIgKyB0aGlzLmVsLmR1cmF0aW9uKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiSWQ6IFwiICsgdGhpcy5pZCk7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkN1cnJlbnQgVGltZTogXCIgKyB0aGlzLmVsLmN1cnJlbnRUaW1lKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiQXVkb1BsYXk6IFwiICsgdGhpcy5lbC5hdXRvcGxheSk7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmdyb3VwRW5kKCk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZWwub25sb2FkZWRtZXRhZGF0YSA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGR1cmF0aW9uID0gdGhpcy5lbC5kdXJhdGlvbjtcbiAgICAgICAgICAgIGNvbnN0IGlzSW5maW5pdHkgPSBEVXRpbC5pc0luZmluaXR5KGR1cmF0aW9uKTtcbiAgICAgICAgICAgIHRoaXMuZXZlbnRCdXMuZW1pdCh7XG4gICAgICAgICAgICAgICAga2luZDogXCJWSURFT19MT0FERURfTUVUQURBVEFfRVZFTlRcIixcbiAgICAgICAgICAgICAgICB0aW1lc3RhbXA6IERUaW1lc3RhbXAubm93KCksXG4gICAgICAgICAgICAgICAgcHJvZHVjZXI6IFwiRFZpZGVvXCIsXG4gICAgICAgICAgICAgICAgcHJvZHVjZXJJZDogdGhpcy5pZCxcbiAgICAgICAgICAgICAgICBkYXRhOiB7IGR1cmF0aW9uLCBpc0luZmluaXR5IH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgLy8gVE9ETyBVU0UgVEhJUyBTWU5UQVg/XG4gICAgICAgIHRoaXMuZWwub25kdXJhdGlvbmNoYW5nZSA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGR1cmF0aW9uID0gdGhpcy5lbC5kdXJhdGlvbjtcbiAgICAgICAgICAgIGNvbnN0IGlzSW5maW5pdHkgPSBEVXRpbC5pc0luZmluaXR5KGR1cmF0aW9uKTtcbiAgICAgICAgICAgIHRoaXMuZXZlbnRCdXMuZW1pdCh7XG4gICAgICAgICAgICAgICAga2luZDogXCJWSURFT19EVVJBVElPTl9DSEFOR0VfRVZFTlRcIixcbiAgICAgICAgICAgICAgICBwcm9kdWNlcjogXCJEVmlkZW9cIixcbiAgICAgICAgICAgICAgICBwcm9kdWNlcklkOiB0aGlzLmlkLFxuICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogRFRpbWVzdGFtcC5ub3coKSxcbiAgICAgICAgICAgICAgICBkYXRhOiB7IGR1cmF0aW9uLCBpc0luZmluaXR5IH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBnZXRTdGF0cygpIHtcbiAgICAgICAgY29uc3QgZHVyYXRpb24gPSB0aGlzLmVsLmR1cmF0aW9uO1xuICAgICAgICBjb25zdCBjdXJyZW50VGltZSA9IHRoaXMuZWwuY3VycmVudFRpbWU7XG4gICAgICAgIGNvbnN0IHZvbHVtZSA9IHRoaXMuZWwudm9sdW1lO1xuICAgICAgICBjb25zdCBpc0Nvbm5lY3RlZCA9IHRoaXMuZWwuaXNDb25uZWN0ZWQ7XG4gICAgICAgIGNvbnN0IHBsYXliYWNrUXVhbGl0eSA9IHRoaXMuZWwuZ2V0VmlkZW9QbGF5YmFja1F1YWxpdHkoKTtcbiAgICAgICAgY29uc3QgZGVmYXVsdFBsYXliYWNrUmF0ZSA9IHRoaXMuZWwuZGVmYXVsdFBsYXliYWNrUmF0ZTtcbiAgICAgICAgY29uc3QgcGF1c2VkID0gdGhpcy5lbC5wYXVzZWQ7XG4gICAgICAgIGNvbnN0IHBsYXllZCA9IHRoaXMuZWwucGxheWVkO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkdXJhdGlvbixcbiAgICAgICAgICAgIHBhdXNlZCxcbiAgICAgICAgICAgIHBsYXllZCxcbiAgICAgICAgICAgIGN1cnJlbnRUaW1lLFxuICAgICAgICAgICAgdm9sdW1lLFxuICAgICAgICAgICAgaXNDb25uZWN0ZWQsXG4gICAgICAgICAgICBwbGF5YmFja1F1YWxpdHksXG4gICAgICAgICAgICBkZWZhdWx0UGxheWJhY2tSYXRlLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHNldER0byhkdG86IERWaWRlb0R0bykge1xuICAgICAgICB0aGlzLmR0byA9IGR0bztcbiAgICAgICAgdGhpcy5lbC52b2x1bWUgPSAxO1xuICAgICAgICB0aGlzLnNldFN0eWxlKGR0by5zdHlsZSk7XG4gICAgICAgIHRoaXMuZWwuc3JjID0gZHRvLnVybDtcbiAgICAgICAgdGhpcy5lbC5sb2FkKCk7XG4gICAgfVxuXG4gICAgZ2V0Q3VycmVudER0bygpOiBEVmlkZW9EdG8gfCBmYWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmR0byA/PyBmYWxzZTtcbiAgICB9XG5cbiAgICBzZXRTdHlsZShzdHlsZXM6IFBhcnRpYWw8RFN0eWxlPikge1xuICAgICAgICBEU3R5bGUuYXBwbHlTdHlsZXModGhpcy5lbCwgc3R5bGVzLCB0aGlzLnNjYWxlLnNjYWxlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldCBpZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZHRvPy5pZCA/PyBcIkRWaWRlb1wiO1xuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7fVxufVxuIiwgImltcG9ydCB7IENhblBsYXlUb0VuZCB9IGZyb20gXCIuL1ZpZGVvQ29udGFpbmVyXCI7XG5pbXBvcnQgeyBEQXVkaW9EdG8gfSBmcm9tIFwiLi4vZHRvL0RFbGVtZW50LmR0b1wiO1xuaW1wb3J0IHsgREV2ZW50RGlzcGF0Y2hlciB9IGZyb20gXCIuLi9ldmVudHMvZXZlbnQtYnVzXCI7XG5pbXBvcnQgeyBEVGltZXN0YW1wIH0gZnJvbSBcIi4uL2NvbW1vbi9EVGltZXN0YW1wXCI7XG5cbmV4cG9ydCBjbGFzcyBBdWRpb0NvbnRhaW5lciBpbXBsZW1lbnRzIENhblBsYXlUb0VuZCB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBUQUcgPSBcIlsgREF1ZGlvIF06IFwiO1xuICAgIHByb3RlY3RlZCBkdG86IERBdWRpb0R0byB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgZWw6IEhUTUxBdWRpb0VsZW1lbnQ7XG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBldmVudEJ1czogREV2ZW50RGlzcGF0Y2hlcikge1xuICAgICAgICB0aGlzLmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImF1ZGlvXCIpO1xuICAgICAgICB0aGlzLmVsLnN0eWxlLnBvc2l0aW9uID0gXCJhYnNvbHV0ZVwiO1xuICAgICAgICB0aGlzLmVsLnN0eWxlLnZpc2liaWxpdHkgPSBcImhpZGRlblwiO1xuICAgICAgICAvLyB0aGlzLmVsLm9uXG4gICAgICAgIHRoaXMub25Mb2FkID0gdGhpcy5vbkxvYWQuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5lbC5vbmxvYWQgPSB0aGlzLm9uTG9hZDtcbiAgICAgICAgdGhpcy5vbkxvYWRlZE1ldGFkYXRhID0gdGhpcy5vbkxvYWRlZE1ldGFkYXRhLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuZWwub25sb2FkZWRtZXRhZGF0YSA9IHRoaXMub25Mb2FkZWRNZXRhZGF0YTtcbiAgICAgICAgdGhpcy5lbC5vbnBsYXkgPSAoKSA9PiB7XG4gICAgICAgICAgICAvLyBUT0RPXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMub25DYW5QbGF5VGhyb3VnaCA9IHRoaXMub25DYW5QbGF5VGhyb3VnaC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmVsLm9uY2FucGxheXRocm91Z2ggPSB0aGlzLm9uQ2FuUGxheVRocm91Z2g7XG4gICAgICAgIHRoaXMuZWwub25lbmRlZCA9IChfKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB1cmwgPSB0aGlzLmVsLnNyYztcbiAgICAgICAgICAgIHRoaXMuZXZlbnRCdXMuZW1pdCh7XG4gICAgICAgICAgICAgICAga2luZDogXCJBVURJT19FTkRFRF9FVkVOVFwiLFxuICAgICAgICAgICAgICAgIGRhdGE6IHsgdXJsIH0sXG4gICAgICAgICAgICAgICAgcHJvZHVjZXI6IFwiREF1ZGlvXCIsXG4gICAgICAgICAgICAgICAgdGltZXN0YW1wOiBEVGltZXN0YW1wLm5vdygpLFxuICAgICAgICAgICAgICAgIHByb2R1Y2VySWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5lbC5vbmR1cmF0aW9uY2hhbmdlID0gKF86IEV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkdXJhdGlvbiA9IHRoaXMuZWwuZHVyYXRpb247XG4gICAgICAgICAgICBjb25zdCBpc0luZmluaXR5ID0gZHVyYXRpb24gPT09IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgICAgICAgICAgIHRoaXMuZXZlbnRCdXMuZW1pdCh7XG4gICAgICAgICAgICAgICAga2luZDogXCJBVURJT19EVVJBVElPTl9DSEFOR0VfRVZFTlRcIixcbiAgICAgICAgICAgICAgICB0aW1lc3RhbXA6IERUaW1lc3RhbXAubm93KCksXG4gICAgICAgICAgICAgICAgcHJvZHVjZXI6IFwiREF1ZGlvXCIsXG4gICAgICAgICAgICAgICAgcHJvZHVjZXJJZDogdGhpcy5pZCxcbiAgICAgICAgICAgICAgICBkYXRhOiB7IGR1cmF0aW9uOiB0aGlzLmVsLmR1cmF0aW9uLCBpc0luZmluaXR5IH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBzZXRBdWRpbyhkdG86IERBdWRpb0R0bykge1xuICAgICAgICB0aGlzLmR0byA9IGR0bztcbiAgICAgICAgdGhpcy5lbC5zcmMgPSBkdG8udXJsO1xuICAgICAgICB0aGlzLmVsLmxvYWQoKTtcbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5lbC5wYXVzZSgpO1xuICAgICAgICAgICAgdGhpcy5lbC5zcmMgPSBcIlwiO1xuICAgICAgICAgICAgdGhpcy5lbC5sb2FkKCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcGF1c2UoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLmVsLnBhdXNlKCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIFRPRE8gRU1JVCBFUlJPUiBFVkVOVC5cbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcGxheSh1cmw6IHN0cmluZykge1xuICAgICAgICBpZiAodGhpcy5lbC5zcmMgIT09IHVybCkge1xuICAgICAgICAgICAgdGhpcy5lbC5zcmMgPSB1cmw7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ldmVudEJ1cy5lbWl0KHtcbiAgICAgICAgICAgIGtpbmQ6IFwiQVVESU9fUExBWV9FVkVOVFwiLFxuICAgICAgICAgICAgcHJvZHVjZXJJZDogdGhpcy5pZCxcbiAgICAgICAgICAgIGRhdGE6IHt9LFxuICAgICAgICAgICAgcHJvZHVjZXI6IFwiREF1ZGlvXCIsXG4gICAgICAgICAgICB0aW1lc3RhbXA6IERUaW1lc3RhbXAubm93KCksXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmVsXG4gICAgICAgICAgICAucGxheSgpXG4gICAgICAgICAgICAudGhlbigocmVzKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2cocmVzKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIG9uTG9hZGVkTWV0YWRhdGEoXzogRXZlbnQpIHtcbiAgICAgICAgdGhpcy5ldmVudEJ1cy5lbWl0KHtcbiAgICAgICAgICAgIGtpbmQ6IFwiQVVESU9fTUVUQURBVEFfTE9BREVEX0VWRU5UXCIsXG4gICAgICAgICAgICB0aW1lc3RhbXA6IERUaW1lc3RhbXAubm93KCksXG4gICAgICAgICAgICBwcm9kdWNlcjogXCJEQXVkaW9cIixcbiAgICAgICAgICAgIHByb2R1Y2VySWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICBkYXRhOiB7fSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb25Mb2FkKF86IEV2ZW50KSB7XG4gICAgICAgIHRoaXMuZXZlbnRCdXMuZW1pdCh7XG4gICAgICAgICAgICBraW5kOiBcIkFVRElPX0xPQURfRVZFTlRcIixcbiAgICAgICAgICAgIHRpbWVzdGFtcDogRFRpbWVzdGFtcC5ub3coKSxcbiAgICAgICAgICAgIHByb2R1Y2VyOiBcIkRBdWRpb1wiLFxuICAgICAgICAgICAgcHJvZHVjZXJJZDogdGhpcy5pZCxcbiAgICAgICAgICAgIGRhdGE6IHt9LFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gY29uc29sZS5sb2codGhpcy5UQUcgKyBldmVudC50eXBlKTtcbiAgICB9XG5cbiAgICBnZXQgaWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmR0bz8uaWQgPz8gXCJEQXVkaW9cIjtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uQ2FuUGxheVRocm91Z2goXzogRXZlbnQpIHtcbiAgICAgICAgdGhpcy5ldmVudEJ1cy5lbWl0KHtcbiAgICAgICAgICAgIGtpbmQ6IFwiQVVESU9fQ0FOX1BMQVlfVEhST1VHSF9FVkVOVFwiLFxuICAgICAgICAgICAgZGF0YToge30sXG4gICAgICAgICAgICBwcm9kdWNlcjogXCJEQXVkaW9cIixcbiAgICAgICAgICAgIHRpbWVzdGFtcDogRFRpbWVzdGFtcC5ub3coKSxcbiAgICAgICAgICAgIHByb2R1Y2VySWQ6IHRoaXMuaWQsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIHByaXZhdGUgb25QbGF5KF86IEV2ZW50KSB7fVxuXG4gICAgYXN5bmMgcGxheVRvRW5kKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBjb25zdCBlbmRlZE9yRXJyb3JlZCA9IG5ldyBQcm9taXNlPGJvb2xlYW4+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmVsLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgICAgICAgXCJlbmRlZFwiLFxuICAgICAgICAgICAgICAgIChfKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGUpO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgeyBvbmNlOiB0cnVlIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLmVsLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgICAgICAgXCJlcnJvclwiLFxuICAgICAgICAgICAgICAgIChfKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGUpO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHsgb25jZTogdHJ1ZSB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMucGxheSh0aGlzLmVsLnNyYyk7XG4gICAgICAgICAgICBhd2FpdCBlbmRlZE9yRXJyb3JlZDtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBUT0RPIExFVCBQQVJFTlQgREVBTCBXSVRIIEVSUk9SUz8gVEhFIE1BTkFHRVI/PyBNQU5BR0VSUyBDQUxMIEFCT1JULlxuICAgICAgICAgICAgY29uc29sZS5sb2coZSk7XG4gICAgICAgICAgICB0aGlzLmV2ZW50QnVzLmVtaXQoe1xuICAgICAgICAgICAgICAgIGtpbmQ6IFwiQVVESU9fRVJST1JfRVZFTlRcIixcbiAgICAgICAgICAgICAgICB0aW1lc3RhbXA6IERUaW1lc3RhbXAubm93KCksXG4gICAgICAgICAgICAgICAgcHJvZHVjZXI6IFwiREF1ZGlvXCIsXG4gICAgICAgICAgICAgICAgcHJvZHVjZXJJZDogdGhpcy5pZCxcbiAgICAgICAgICAgICAgICBkYXRhOiB7IGVycm9yOiBlIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBQYWdlRHRvIH0gZnJvbSBcIi4uL2R0by9TY2hlbWFEdG9cIjtcbmltcG9ydCB7IFZpZGVvQ29udGFpbmVyIH0gZnJvbSBcIi4uL0RlbGVtZW50L1ZpZGVvQ29udGFpbmVyXCI7XG5pbXBvcnQgeyBBdWRpb0NvbnRhaW5lciB9IGZyb20gXCIuLi9EZWxlbWVudC9BdWRpb0NvbnRhaW5lclwiO1xuaW1wb3J0IHsgQXV0b1BsYXlFbGVtZW50LCBEQXV0b1BsYXlTZXF1ZW5jZSB9IGZyb20gXCIuLi9EZWxlbWVudC9EQXV0by1wbGF5XCI7XG5pbXBvcnQgeyBEQ29tbWFuZEJ1cyB9IGZyb20gXCIuLi9jb21tYW5kcy9EQ29tbWFuZEJ1c1wiO1xuaW1wb3J0IHsgRENvbW1hbmQgfSBmcm9tIFwiLi4vY29tbWFuZHMvRENvbW1hbmRcIjtcbmltcG9ydCB7IERUaW1lc3RhbXAgfSBmcm9tIFwiLi4vY29tbW9uL0RUaW1lc3RhbXBcIjtcbmltcG9ydCB7IEV2ZW50QnVzIH0gZnJvbSBcIi4uL2V2ZW50cy9ldmVudC1idXNcIjtcbmltcG9ydCB7IFNjYWxlU2VydmljZSB9IGZyb20gXCIuLi9lbmdpbmUvc2NhbGVcIjtcbmltcG9ydCB7IFJlc291cmNlUHJvdmlkZXIgfSBmcm9tIFwiLi9yZXNvdXJjZS1wcm92aWRlclwiO1xuaW1wb3J0IHsgQXV0b3BsYXlUYXNrLCBTZXF1ZW5jZU1hbmFnZXIgfSBmcm9tIFwiLi9zZXF1ZW5jZS1tYW5hZ2VyXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU1lZGlhTWFuYWdlciB7XG4gIHNldFBhZ2UocGFnZTogUGFnZUR0byk6IHZvaWQ7XG4gIGRlc3Ryb3koKTogdm9pZDtcbn1cblxuZXhwb3J0IGNsYXNzIERNZWRpYU1hbmFnZXIgaW1wbGVtZW50cyBJTWVkaWFNYW5hZ2VyIHtcbiAgcHJpdmF0ZSBzdGF0aWMgSU5TVEFOQ0VfQ09VTlQgPSAwO1xuICBwcml2YXRlIHJlYWRvbmx5IGluc3RhbmNlTnVtYmVyOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgVEFHID0gXCJbIE1FRElBX01BTkFHRVIgXSA6IFwiO1xuICBwcml2YXRlIHJlYWRvbmx5IHZpZGVvQ29udGFpbmVyOiBWaWRlb0NvbnRhaW5lcjtcbiAgcHJpdmF0ZSByZWFkb25seSBhdWRpb0NvbnRhaW5lcjogQXVkaW9Db250YWluZXI7XG4gIHByaXZhdGUgcGFnZUVudGVyOiBEVGltZXN0YW1wO1xuICBwcml2YXRlIHNpbmNlUGFnZUVudGVyOiBEVGltZXN0YW1wLkRpZmY7XG4gIHByaXZhdGUgY3VycmVudFBhZ2U6IFBhZ2VEdG8gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSB1bnN1YnNjcmliZUNvbW1hbmRzOiAoKSA9PiB2b2lkO1xuICBwcml2YXRlIHJlYWRvbmx5IHRpY2tlclJlZjogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IHNlcXVlbmNlTWFuYWdlcjogU2VxdWVuY2VNYW5hZ2VyIHwgZmFsc2UgPSBmYWxzZTtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBob3N0RWw6IEhUTUxEaXZFbGVtZW50LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY29tbWFuZEJ1czogRENvbW1hbmRCdXMsXG4gICAgcHJpdmF0ZSByZWFkb25seSBldmVudEJ1czogRXZlbnRCdXMsXG4gICAgcHJpdmF0ZSByZWFkb25seSByZXNvdXJjZVByb3ZpZGVyOiBSZXNvdXJjZVByb3ZpZGVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc2NhbGU6IFNjYWxlU2VydmljZSxcbiAgKSB7XG4gICAgRE1lZGlhTWFuYWdlci5JTlNUQU5DRV9DT1VOVCA9IERNZWRpYU1hbmFnZXIuSU5TVEFOQ0VfQ09VTlQgKyAxO1xuICAgIHRoaXMuaW5zdGFuY2VOdW1iZXIgPSBETWVkaWFNYW5hZ2VyLklOU1RBTkNFX0NPVU5UO1xuICAgIGNvbnN0IHZpZGVvRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidmlkZW9cIik7XG4gICAgdGhpcy5ob3N0RWwuYXBwZW5kKHZpZGVvRWwpO1xuICAgIHRoaXMudmlkZW9Db250YWluZXIgPSBuZXcgVmlkZW9Db250YWluZXIodmlkZW9FbCwgZXZlbnRCdXMsIHRoaXMuc2NhbGUpO1xuICAgIHRoaXMuYXVkaW9Db250YWluZXIgPSBuZXcgQXVkaW9Db250YWluZXIodGhpcy5ldmVudEJ1cyk7XG4gICAgdGhpcy50aWNrID0gdGhpcy50aWNrLmJpbmQodGhpcyk7XG4gICAgdGhpcy52aWRlb0NvbnRhaW5lci5zZXRTdHlsZSh7IHZpc2liaWxpdHk6IFwiaGlkZGVuXCIgfSk7XG4gICAgY29uc3Qgbm93ID0gRFRpbWVzdGFtcC5ub3coKTtcbiAgICB0aGlzLnBhZ2VFbnRlciA9IG5vdztcbiAgICB0aGlzLnNpbmNlUGFnZUVudGVyID0gRFRpbWVzdGFtcC5kaWZmKG5vdywgbm93KTtcbiAgICB0aGlzLnVuc3Vic2NyaWJlQ29tbWFuZHMgPSB0aGlzLmNvbW1hbmRCdXMuc3Vic2NyaWJlKChhY3Rpb24pID0+IHtcbiAgICAgIHRoaXMuY29tbWFuZEhhbmRsZXIoYWN0aW9uKTtcbiAgICB9LCB0aGlzLlRBRyk7XG5cbiAgICB0aGlzLnRpY2tlclJlZiA9IHdpbmRvdy5zZXRJbnRlcnZhbCgoKSA9PiB7fSwgMTAwMCk7XG4gIH1cblxuICAvKipcbiAgICogU3RvcCBhbGwgbWVkaWEgdGhhdCBpcyBwbGF5aW5nXG4gICAqL1xuICBjbGVhckFsbE1lZGlhKCkge1xuICAgIHRoaXMudmlkZW9Db250YWluZXIucGF1c2UoKTtcbiAgICB0aGlzLmF1ZGlvQ29udGFpbmVyLnBhdXNlKCk7XG4gIH1cbiAgZGVzdHJveSgpIHtcbiAgICBjb25zb2xlLmxvZyhcIlRPRE8gREVTVFJPWSBBTEwgTUVESUFcIik7XG4gICAgdGhpcy51bnN1YnNjcmliZUNvbW1hbmRzKCk7XG4gICAgLy8gY29uc29sZS5sb2codGhpcy50aWNrZXJSZWYpO1xuICAgIHdpbmRvdy5jbGVhckludGVydmFsKHRoaXMudGlja2VyUmVmKTtcbiAgICB0aGlzLmF1ZGlvQ29udGFpbmVyLmRlc3Ryb3koKTtcbiAgICB0aGlzLnZpZGVvQ29udGFpbmVyLmRlc3Ryb3koKTtcbiAgfVxuXG4gIHNldFBhZ2UocGFnZTogUGFnZUR0bykge1xuICAgIC8vIFRPRE8gU1RPUCBWSURFTy9BVURJTyBUSEFUIE1JR0hUIEJFIFBMQVlJTkcgSU4gVEhFIERPTT8/XG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IHBhZ2U7XG4gICAgdGhpcy52aWRlb0NvbnRhaW5lci5wYXVzZSgpO1xuICAgIHRoaXMucGFnZUVudGVyID0gRFRpbWVzdGFtcC5ub3coKTtcbiAgICAvLyBUT0RPIFRIaXMgbWlnaHQgYmUgYSBidWcgaWYgc29tZW9uZVxuXG4gICAgY29uc3Qgc2VxID0gcGFnZS5hdXRvUGxheVNlcXVlbmNlO1xuICAgIC8vIHRoaXMuc2VxdWVuY2UgPSBzZXEgPyBbLi4uc2VxLml0ZW1zXSA6IFtdO1xuICAgIGNvbnN0IHsgbWFpblZpZGVvSWQsIGF1ZGlvIH0gPSBwYWdlO1xuICAgIGNvbnN0IGF1ZGlvRWxlbWVudHMgPSBwYWdlLmF1ZGlvO1xuXG4gICAgaWYgKG1haW5WaWRlb0lkKSB7XG4gICAgICBjb25zdCBkdG8gPSB0aGlzLnJlc291cmNlUHJvdmlkZXIuZ2V0VmlkZW9CeUlkKG1haW5WaWRlb0lkKTtcbiAgICAgIGlmIChkdG8pIHtcbiAgICAgICAgdGhpcy52aWRlb0NvbnRhaW5lci5zZXREdG8oZHRvKTtcbiAgICAgICAgdGhpcy52aWRlb0NvbnRhaW5lci5zZXRTdHlsZSh7IC4uLmR0by5zdHlsZSwgdmlzaWJpbGl0eTogXCJ2aXNpYmxlXCIgfSk7XG4gICAgICB9XG4gICAgICAvLyB0aGlzLnZpZGVvQ29udGFpbmVyLnBsYXlUb0VuZCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnZpZGVvQ29udGFpbmVyLnNldFN0eWxlKHsgdmlzaWJpbGl0eTogXCJoaWRkZW5cIiB9KTtcbiAgICAgIC8vIEhJREU/XG4gICAgfVxuICAgIGlmIChhdWRpb0VsZW1lbnRzKSB7XG4gICAgICBjb25zdCBmaXJzdCA9IGF1ZGlvRWxlbWVudHNbMF07XG4gICAgICBpZiAoZmlyc3QpIHtcbiAgICAgICAgdGhpcy5hdWRpb0NvbnRhaW5lci5zZXRBdWRpbyhmaXJzdCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzZXEpIHtcbiAgICAgIHRoaXMucGxheVNlcXVlbmNlKHNlcSk7XG4gICAgfVxuICAgIC8vIGNvbnN0IGhhc1ZpZGVvID1cbiAgfVxuXG4gIHByaXZhdGUgY29tbWFuZEhhbmRsZXIoY29tbWFuZDogRENvbW1hbmQpIHtcbiAgICBpZiAoY29tbWFuZC5raW5kID09PSBcIlZJREVPX1BMQVlfQ09NTUFORFwiKSB7XG4gICAgICBjb25zdCB2aWRlbyA9IGNvbW1hbmQudGFyZ2V0SWQ7XG4gICAgICBjb25zdCBkdG8gPSB0aGlzLnZpZGVvQ29udGFpbmVyLmdldEN1cnJlbnREdG8oKTtcblxuICAgICAgaWYgKGR0byAmJiBkdG8uaWQgPT09IGNvbW1hbmQudGFyZ2V0SWQpIHtcbiAgICAgICAgY29uc29sZS5sb2codmlkZW8pO1xuICAgICAgICB0aGlzLnZpZGVvQ29udGFpbmVyLnBsYXkoZHRvLnVybCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjb21tYW5kLmtpbmQgPT09IFwiVklERU9fUEFVU0VfQ09NTUFORFwiKSB7XG4gICAgICB0aGlzLnZpZGVvQ29udGFpbmVyLnBhdXNlKCk7XG4gICAgfVxuICAgIGlmIChjb21tYW5kLmtpbmQgPT09IFwiQVVESU9fUExBWV9DT01NQU5EXCIpIHtcbiAgICAgIHRoaXMuYXVkaW9Db250YWluZXJcbiAgICAgICAgLnBsYXlUb0VuZCgpXG4gICAgICAgIC50aGVuKCgpID0+IHt9KVxuICAgICAgICAuY2F0Y2goKVxuICAgICAgICAuZmluYWxseSgoKSA9PiB7fSk7XG4gICAgfVxuXG4gICAgaWYgKGNvbW1hbmQua2luZCA9PT0gXCJBVURJT19QQVVTRV9DT01NQU5EXCIpIHtcbiAgICAgIC8vIHRoaXMuYXVkaW9Db250YWluZXIuXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBwbGF5U2VxdWVuY2Uoc2VxOiBEQXV0b1BsYXlTZXF1ZW5jZSkge1xuICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuVEFHICsgXCJTRVFVRU5DRSBTVEFSVEVEIC0tIFRPRE8gRVZFTlQgRk9SIFRISVM/P1wiKTtcblxuICAgIGNvbnN0IGVsZW1lbnRzID0gc2VxLml0ZW1zO1xuICAgIGNvbnN0IHRlc3RDbG9uZSA9IFsuLi5lbGVtZW50c107XG4gICAgY29uc3QgZmlyc3QgPSB0ZXN0Q2xvbmUucG9wKCk7XG5cbiAgICBpZiAoIWZpcnN0KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IG5vdyA9IERUaW1lc3RhbXAubm93KCk7XG4gICAgc2VxLnN0YXJ0Q29tbWFuZHMuZm9yRWFjaCgoYykgPT4ge1xuICAgICAgY29uc29sZS5sb2coYyk7XG4gICAgICB0aGlzLmNvbW1hbmRCdXMuZW1pdChjKTtcbiAgICB9KTtcbiAgICAvLyB0aGlzLmNvbW1hbmRCdXMuZW1pdChEU3RhdGVQcm9wcy5tZWRpYUJsb2NrZWRCeVNlcXVlbmNlLnNldFRydWVDb21tYW5kKTtcbiAgICAvLyBpZiAoc2VxLmJsb2NrVXNlcklucHV0KSB7XG4gICAgLy8gICAgIHRoaXMuY29tbWFuZEJ1cy5lbWl0KERTdGF0ZVByb3BzLmlucHV0QmxvY2tpbmdCeVNlcXVlbmNlLmdldFNldFRydWVDb21tYW5kKCkpO1xuICAgIC8vIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBpdGVtID0gZWxlbWVudHNbaV07XG4gICAgICBpZiAoaXRlbS5raW5kID09PSBcImF1dG9wbGF5LXZpZGVvXCIpIHtcbiAgICAgICAgY29uc3QgZHRvID0gdGhpcy5yZXNvdXJjZVByb3ZpZGVyLmdldFZpZGVvQnlJZChpdGVtLnZpZGVvSWQpO1xuICAgICAgICBpZiAoZHRvKSB0aGlzLnZpZGVvQ29udGFpbmVyLnNldER0byhkdG8pO1xuICAgICAgICBhd2FpdCB0aGlzLnZpZGVvQ29udGFpbmVyLnBsYXlUb0VuZCgpO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZW0ua2luZCA9PT0gXCJhdXRvcGxheS1hdWRpb1wiKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGl0ZW0pO1xuICAgICAgICBjb25zdCBkdG8gPSB0aGlzLnJlc291cmNlUHJvdmlkZXIuZ2V0QXVkaW9CeUlkKGl0ZW0uYXVkaW9JZCk7XG4gICAgICAgIGlmIChkdG8pIHRoaXMuYXVkaW9Db250YWluZXIuc2V0QXVkaW8oZHRvKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hdWRpb0NvbnRhaW5lci5wbGF5VG9FbmQoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgc2VxLmVuZENvbW1hbmRzLmZvckVhY2goKGMpID0+IHtcbiAgICAgIHRoaXMuY29tbWFuZEJ1cy5lbWl0KGMpO1xuICAgIH0pO1xuICAgIC8vIHRoaXMuYWN0aW9uU2VydmljZS5lbWl0KERTdGF0ZVByb3BzLm1lZGlhQmxvY2tlZEJ5U2VxdWVuY2Uuc2V0RmFsc2VDb21tYW5kKTtcbiAgICAvLyB0aGlzLmFjdGlvblNlcnZpY2UuZW1pdChEU3RhdGVQcm9wcy5pbnB1dEJsb2NraW5nQnlTZXF1ZW5jZS5zZXRGYWxzZUNvbW1hbmQpO1xuICAgIGNvbnNvbGUubG9nKHRoaXMuVEFHICsgXCJTRVFVRU5DRSBFTkRFRFwiKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIHNldFBhZ2UoKVxuXG4gIHByaXZhdGUgdGljaygpIHtcbiAgICAvLyBjb25zb2xlLmxvZyh0aGlzLnZpZGVvMS5nZXRTdGF0cygpKTtcbiAgfVxufVxuIiwgImltcG9ydCB7IERDb21tYW5kIH0gZnJvbSBcIi4vRENvbW1hbmRcIjtcbmltcG9ydCB7IERUaW1lc3RhbXAgfSBmcm9tIFwiLi4vY29tbW9uL0RUaW1lc3RhbXBcIjtcblxuZXhwb3J0IGludGVyZmFjZSBEQ29tbWFuZFN0b3JlIHtcbiAgc3Vic2NyaWJlKGNhbGxiYWNrOiAoKSA9PiB2b2lkLCBzdWJzY3JpYmVySWQ6IHN0cmluZyk6IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRENvbW1hbmREaXNwYXRjaGVyIHtcbiAgZW1pdChjb21tYW5kOiBEQ29tbWFuZCk6IHZvaWQ7XG59XG5cbmludGVyZmFjZSBDb21tYW5kU3Vic2NyaWJlckRhdGEge1xuICByZWFkb25seSBzdWJzY3JpYmVySWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgY2FsbGJhY2s6IChjb21tYW5kOiBEQ29tbWFuZCkgPT4gdm9pZDtcbn1cbmV4cG9ydCBjbGFzcyBEQ29tbWFuZEJ1cyBpbXBsZW1lbnRzIERDb21tYW5kU3RvcmUsIERDb21tYW5kRGlzcGF0Y2hlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgVEFHID0gXCJbIENPTU1BTkRfQlVTIF0gXCI7XG4gIGxvZ0NvbW1hbmRzID0gZmFsc2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29tbWFuZExvZzogQXJyYXk8RENvbW1hbmQgJiB7IHRpbWVzdGFtcDogRFRpbWVzdGFtcCB9PiA9IFtdO1xuICByZWFkb25seSBzdWJzY3JpYmVycyA9IG5ldyBTZXQ8Q29tbWFuZFN1YnNjcmliZXJEYXRhPigpO1xuICAvLyByZWFkb25seSBzdWJcblxuICBzdWJzY3JpYmUoY2I6IChjb21tYW5kOiBEQ29tbWFuZCkgPT4gdm9pZCwgc3Vic2NyaWJlcklkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBzdWI6IENvbW1hbmRTdWJzY3JpYmVyRGF0YSA9IHtcbiAgICAgIHN1YnNjcmliZXJJZCxcbiAgICAgIGNhbGxiYWNrOiBjYixcbiAgICB9O1xuXG4gICAgdGhpcy5zdWJzY3JpYmVycy5hZGQoc3ViKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgdGhpcy5zdWJzY3JpYmVycy5kZWxldGUoc3ViKTtcbiAgICB9O1xuICB9XG5cbiAgZW1pdChjb21tYW5kOiBEQ29tbWFuZCkge1xuICAgIGNvbnN0IHRpbWVzdGFtcCA9IERUaW1lc3RhbXAubm93KCk7XG4gICAgdGhpcy5jb21tYW5kTG9nLnB1c2goeyAuLi5jb21tYW5kLCB0aW1lc3RhbXAgfSk7XG4gICAgaWYgKHRoaXMubG9nQ29tbWFuZHMpIHtcbiAgICAgIHRoaXMubG9nQ29tbWFuZChjb21tYW5kKTtcbiAgICB9XG4gICAgdGhpcy5zdWJzY3JpYmVycy5mb3JFYWNoKChzdWJzY3JpYmVyKSA9PiB7XG4gICAgICBzdWJzY3JpYmVyLmNhbGxiYWNrKGNvbW1hbmQpO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0U3RhdHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbW1hbmRzOiBbLi4udGhpcy5jb21tYW5kTG9nXSxcbiAgICAgIHN1YnNjcmliZXJzOiBbLi4udGhpcy5zdWJzY3JpYmVyc10sXG4gICAgICBzdWJzY3JpYmVyc0NvdW50OiB0aGlzLnN1YnNjcmliZXJzLnNpemUsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgbG9nQ29tbWFuZChjb21tYW5kOiBEQ29tbWFuZCkge1xuICAgIGNvbnNvbGUuZ3JvdXBDb2xsYXBzZWQodGhpcy5UQUcgKyBcIiBcIiArIGNvbW1hbmQua2luZCk7XG4gICAgY29uc29sZS5sb2coXCJUYXJnZXRJRCA6IFwiICsgY29tbWFuZC50YXJnZXRJZCk7XG4gICAgY29uc29sZS5sb2coY29tbWFuZC5wYXlsb2FkKTtcbiAgICBjb25zb2xlLmdyb3VwRW5kKCk7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBERXZlbnQgfSBmcm9tIFwiLi9ERXZlbnRzXCI7XG5cbmludGVyZmFjZSBTdWJzY3JpYmVyRGF0YSB7XG4gICAgcmVhZG9ubHkgc3Vic2NyaWJlcklkOiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgY2I6IChldmVudDogREV2ZW50KSA9PiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERFdmVudFN0b3JlIHtcbiAgICBzdWJzY3JpYmUoY2I6IChldmVudDogREV2ZW50KSA9PiB2b2lkLCBzdWJzY3JpYmVySWQ6IHN0cmluZyk6IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgREV2ZW50RGlzcGF0Y2hlciB7XG4gICAgZW1pdChldmVudDogREV2ZW50KTogdm9pZDtcbn1cbmV4cG9ydCBjbGFzcyBFdmVudEJ1cyBpbXBsZW1lbnRzIERFdmVudFN0b3JlLCBERXZlbnREaXNwYXRjaGVyIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IFRBRyA9IFwiWyAgRVZFTlRfQlVTICBdIDpcIjtcbiAgICAvLyBwcml2YXRlIHJlYWRvbmx5IHN1YnNjcmliZXJzID0gbmV3IFNldDwoZXZlbnQ6IERFdmVudCkgPT4gdm9pZD4oKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHN1YnNjcmliZXJzID0gbmV3IFNldDxTdWJzY3JpYmVyRGF0YT4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXQgb24gbW9kdWxlIGVuZC5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZXZlbnRMb2c6IERFdmVudFtdID0gW107XG4gICAgY29uc29sZUxvZ0V2ZW50cyA9IGZhbHNlO1xuICAgIC8vIHJlYWRvbmx5IHN1YlxuXG4gICAgc3Vic2NyaWJlKGNiOiAoZXZlbnQ6IERFdmVudCkgPT4gdm9pZCwgc3Vic2NyaWJlcklkOiBzdHJpbmcpIHtcbiAgICAgICAgLy8gdGhpcy5zdWJzY3JpYmVycy5hZGQoY2IpO1xuICAgICAgICBjb25zdCBzdWJzY3JpYmVyRGF0YTogU3Vic2NyaWJlckRhdGEgPSB7XG4gICAgICAgICAgICBzdWJzY3JpYmVySWQsXG4gICAgICAgICAgICBjYixcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5zdWJzY3JpYmVycy5hZGQoc3Vic2NyaWJlckRhdGEpO1xuICAgICAgICBpZiAodGhpcy5jb25zb2xlTG9nRXZlbnRzKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyh0aGlzLlRBRyArIFwic3Vic2NyaXB0aW9uIGFkZGVkOiBcIiArIHN1YnNjcmliZXJJZCk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyh0aGlzLlRBRyArIFwic3Vic2NyaXB0aW9uIGNvdW50OiBcIiArIHRoaXMuc3Vic2NyaWJlcnMuc2l6ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbnNvbGVMb2dFdmVudHMpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyh0aGlzLlRBRyArIFwic3Vic2NyaXB0aW9uIHJlbW92ZWQ6IFwiICsgc3Vic2NyaWJlcklkKTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyh0aGlzLlRBRyArIFwic3Vic2NyaXB0aW9uIGNvdW50ICA6IFwiICsgdGhpcy5zdWJzY3JpYmVycy5zaXplKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHRoaXMuc3Vic2NyaWJlcnMuZGVsZXRlKGNiKTtcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaWJlcnMuZGVsZXRlKHN1YnNjcmliZXJEYXRhKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBnZXRTdGF0cygpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN1YnNjcmliZXJzQ291bnQ6IHRoaXMuc3Vic2NyaWJlcnMuc2l6ZSxcbiAgICAgICAgICAgIGV2ZW50TG9nOiBbLi4udGhpcy5ldmVudExvZ10sXG4gICAgICAgICAgICBzdWJzY3JpYmVyczogWy4uLnRoaXMuc3Vic2NyaWJlcnNdLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGVtaXQoZXZlbnQ6IERFdmVudCkge1xuICAgICAgICBpZiAodGhpcy5jb25zb2xlTG9nRXZlbnRzKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ0V2ZW50KGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmV2ZW50TG9nLnB1c2goZXZlbnQpO1xuICAgICAgICB0aGlzLnN1YnNjcmliZXJzLmZvckVhY2goKGRhdGEpID0+IHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdDQUxMSU5HIEVNSVQnKTtcbiAgICAgICAgICAgIGRhdGEuY2IoZXZlbnQpO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gdGhpcy5sb2dFdmVudHMoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGxvZ0V2ZW50KGV2ZW50OiBERXZlbnQpIHtcbiAgICAgICAgY29uc29sZS5ncm91cENvbGxhcHNlZCh0aGlzLlRBRyArIFwiIFwiICsgZXZlbnQua2luZCk7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiUHJvZHVjZXJJZDogXCIgKyBldmVudC5wcm9kdWNlcklkKTtcbiAgICAgICAgY29uc29sZS5sb2coZXZlbnQuZGF0YSk7XG4gICAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGxvZ0V2ZW50cygpIHtcbiAgICAgICAgY29uc29sZS5ncm91cCh0aGlzLlRBRyArIFwiTE9HR1wiKTtcbiAgICAgICAgY29uc29sZS50YWJsZSh0aGlzLmV2ZW50TG9nKTtcbiAgICAgICAgY29uc29sZS5ncm91cEVuZCgpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBGYWN0IH0gZnJvbSBcIi4uL3J1bGVzL2ZhY3RcIjtcbmltcG9ydCB7IERUaW1lc3RhbXAgfSBmcm9tIFwiLi4vY29tbW9uL0RUaW1lc3RhbXBcIjtcblxuZXhwb3J0IGludGVyZmFjZSBBbnN3ZXJlZFF1ZXN0aW9uIHtcbiAgICByZWFkb25seSB0aW1lc3RhbXA6IERUaW1lc3RhbXA7XG4gICAgcmVhZG9ubHkgZmFjdDogRmFjdDtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBBbnN3ZXJlZFF1ZXN0aW9uIHtcbiAgICBleHBvcnQgY29uc3QgZXEgPSAoYTogQW5zd2VyZWRRdWVzdGlvbiwgYjogQW5zd2VyZWRRdWVzdGlvbik6IGJvb2xlYW4gPT4ge1xuICAgICAgICByZXR1cm4gYS5mYWN0ID09PSBiLmZhY3Q7XG4gICAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQYWdlSGlzdG9yeSB7XG4gICAgcmVhZG9ubHkgcGFnZUlkOiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgYW5zd2VyZWRRdWVzdGlvbnM6IEFuc3dlcmVkUXVlc3Rpb25bXTtcbn1cblxuZXhwb3J0IGNsYXNzIEhpc3RvcnlRdWUge1xuICAgIHByaXZhdGUgaGlzdG9yeTogUGFnZUhpc3RvcnlbXSA9IFtdO1xuXG4gICAgZ2V0RmFjdHMoKTogQXJyYXk8RmFjdD4ge1xuICAgICAgICBjb25zdCBhbnN3ZXJzID0gdGhpcy5oaXN0b3J5Lm1hcCgoaCkgPT4gaC5hbnN3ZXJlZFF1ZXN0aW9ucykuZmxhdCgxKTtcbiAgICAgICAgY29uc3QgZmFjdHMgPSBhbnN3ZXJzLm1hcCgoYSkgPT4gYS5mYWN0KTtcbiAgICAgICAgLy8gVE9ETyBGSU5EIExBVEVTVCBGQUNUIChhbnN3ZXIpIGlmIGhhdmUgbXVsdGlwbGUuXG4gICAgICAgIHJldHVybiBmYWN0cztcbiAgICB9XG5cbiAgICBnZXRBbnN3ZXJzKCk6IEFycmF5PEFuc3dlcmVkUXVlc3Rpb24+IHtcbiAgICAgICAgY29uc3QgYW5zd2VycyA9IHRoaXMuaGlzdG9yeS5tYXAoKGgpID0+IGguYW5zd2VyZWRRdWVzdGlvbnMpLmZsYXQoMSk7XG4gICAgICAgIHJldHVybiBhbnN3ZXJzO1xuICAgIH1cblxuICAgIGFkZFRvSGlzdG9yeShwYWdlOiBQYWdlSGlzdG9yeSkge1xuICAgICAgICB0aGlzLmhpc3RvcnkucHVzaChwYWdlKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgRmFjdCB9IGZyb20gXCIuL2ZhY3RcIjtcbmltcG9ydCB7IERVdGlsIH0gZnJvbSBcIi4uL3V0aWxzL0RVdGlsXCI7XG5leHBvcnQgdHlwZSBDb25kaXRpb24gPSBDb25kaXRpb24uU3RyaW5nIHwgQ29uZGl0aW9uLk51bWVyaWMgfCBDb25kaXRpb24uQ29tcGxleDtcblxuZXhwb3J0IG5hbWVzcGFjZSBDb25kaXRpb24ge1xuICAgIGV4cG9ydCB0eXBlIFN0cmluZ09wZXJhdG9yID0gXCJlcVwiIHwgXCJub3QtZXFcIiB8IFwibG9uZ2VyLXRoZW5cIiB8IFwic2hvcnRlci10aGVuXCI7XG5cbiAgICBleHBvcnQgdHlwZSBOdW1lcmljT3BlcmF0b3IgPVxuICAgICAgICB8IFwiZXFcIlxuICAgICAgICB8IFwibm90LWVxXCJcbiAgICAgICAgfCBcImdyZWF0ZXItdGhlblwiXG4gICAgICAgIHwgXCJsZXNzLXRoZW5cIlxuICAgICAgICB8IFwiZ3JlYXRlci10aGVuLWluY2x1c2l2ZVwiXG4gICAgICAgIHwgXCJsZXNzLXRoZW4taW5jbHVzaXZlXCI7XG5cbiAgICBleHBvcnQgaW50ZXJmYWNlIE51bWVyaWMge1xuICAgICAgICByZWFkb25seSByZWZlcmVuY2VJZDogc3RyaW5nO1xuICAgICAgICByZWFkb25seSByZWZlcmVuY2VMYWJlbDogc3RyaW5nO1xuICAgICAgICByZWFkb25seSB2YWx1ZUxhYmVsOiBzdHJpbmc7XG4gICAgICAgIHJlYWRvbmx5IGtpbmQ6IFwibnVtZXJpYy1jb25kaXRpb25cIjtcbiAgICAgICAgcmVhZG9ubHkgb3BlcmF0b3I6IE51bWVyaWNPcGVyYXRvcjtcbiAgICAgICAgcmVhZG9ubHkgdmFsdWU6IG51bWJlcjtcbiAgICB9XG4gICAgZXhwb3J0IGludGVyZmFjZSBTdHJpbmcge1xuICAgICAgICByZWFkb25seSByZWZlcmVuY2VJZDogc3RyaW5nO1xuICAgICAgICByZWFkb25seSByZWZlcmVuY2VMYWJlbDogc3RyaW5nO1xuICAgICAgICByZWFkb25seSB2YWx1ZUxhYmVsOiBzdHJpbmc7XG4gICAgICAgIHJlYWRvbmx5IGtpbmQ6IFwic3RyaW5nLWNvbmRpdGlvblwiO1xuICAgICAgICByZWFkb25seSBvcGVyYXRvcjogU3RyaW5nT3BlcmF0b3I7XG4gICAgICAgIHJlYWRvbmx5IHZhbHVlOiBzdHJpbmc7XG4gICAgfVxuXG4gICAgZXhwb3J0IGludGVyZmFjZSBDb21wbGV4IHtcbiAgICAgICAgcmVhZG9ubHkga2luZDogXCJjb21wbGV4LWNvbmRpdGlvblwiO1xuICAgICAgICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gICAgICAgIHJlYWRvbmx5IGFsbDogUmVhZG9ubHlBcnJheTxDb25kaXRpb24uU2ltcGxlPjtcbiAgICAgICAgcmVhZG9ubHkgc29tZTogUmVhZG9ubHlBcnJheTxDb25kaXRpb24uU2ltcGxlPjtcbiAgICB9XG5cbiAgICBleHBvcnQgdHlwZSBTaW1wbGUgPSBDb25kaXRpb24uU3RyaW5nIHwgQ29uZGl0aW9uLk51bWVyaWM7XG5cbiAgICAvKipcbiAgICAgKiBBbiBlbXB0eSBjb25kaXRpb24gd2lsbCBldmFsdWF0ZSB0byBmYWxzZSxcbiAgICAgKiBAcGFyYW0gY29uZGl0aW9uOiBDb25kaXRpb24uQW55XG4gICAgICogQHBhcmFtIGZhY3RzXG4gICAgICovXG4gICAgZXhwb3J0IGNvbnN0IGV2YWx1YXRlID0gKGNvbmRpdGlvbjogQ29uZGl0aW9uLCBmYWN0czogUmVhZG9ubHlBcnJheTxGYWN0PikgPT4ge1xuICAgICAgICBsZXQgcmVzdWx0OiBib29sZWFuID0gZmFsc2U7XG4gICAgICAgIHN3aXRjaCAoY29uZGl0aW9uLmtpbmQpIHtcbiAgICAgICAgICAgIGNhc2UgXCJzdHJpbmctY29uZGl0aW9uXCI6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gZXZhbHVhdGVTaW1wbGUoY29uZGl0aW9uLCBmYWN0cyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwibnVtZXJpYy1jb25kaXRpb25cIjpcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBldmFsdWF0ZVNpbXBsZShjb25kaXRpb24sIGZhY3RzKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJjb21wbGV4LWNvbmRpdGlvblwiOlxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGV2YWx1YXRlQ29tcGxleChjb25kaXRpb24sIGZhY3RzKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgY29uc3QgY2hlY2s6IG5ldmVyID0gY29uZGl0aW9uO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICAgIGNvbnN0IGV2YWx1YXRlQ29tcGxleCA9IChjb25kaXRpb246IENvbmRpdGlvbi5Db21wbGV4LCBmYWN0czogUmVhZG9ubHlBcnJheTxGYWN0Pik6IGJvb2xlYW4gPT4ge1xuICAgICAgICBpZiAoY29uZGl0aW9uLnNvbWUubGVuZ3RoID09PSAwICYmIGNvbmRpdGlvbi5hbGwubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYWxsU29sdmVkID0gY29uZGl0aW9uLmFsbC5tYXAoKGNvbmRpdGlvbikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGV2YWx1YXRlU2ltcGxlKGNvbmRpdGlvbiwgZmFjdHMpO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBzb21lRXZhbHVhdGVkID0gY29uZGl0aW9uLnNvbWUubWFwKChjb25kaXRpb24pID0+IHtcbiAgICAgICAgICAgIHJldHVybiBldmFsdWF0ZVNpbXBsZShjb25kaXRpb24sIGZhY3RzKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGFsbFJlc3VsdCA9IGFsbFNvbHZlZC5ldmVyeShEVXRpbC5pc1RydWUpO1xuICAgICAgICBjb25zdCBzb21lUmVzdWx0ID0gc29tZUV2YWx1YXRlZC5sZW5ndGggPT09IDAgfHwgc29tZUV2YWx1YXRlZC5zb21lKERVdGlsLmlzVHJ1ZSk7XG4gICAgICAgIHJldHVybiBzb21lUmVzdWx0ICYmIGFsbFJlc3VsdDtcbiAgICB9O1xuXG4gICAgY29uc3QgZXZhbHVhdGVTaW1wbGUgPSAoY29uZGl0aW9uOiBDb25kaXRpb24uU2ltcGxlLCBmYWN0czogUmVhZG9ubHlBcnJheTxGYWN0Pik6IGJvb2xlYW4gPT4ge1xuICAgICAgICBjb25zdCBmYWN0ID0gZmFjdHMuZmluZCgoZikgPT4gZi5yZWZlcmVuY2VJZCA9PT0gY29uZGl0aW9uLnJlZmVyZW5jZUlkKTtcbiAgICAgICAgaWYgKCFmYWN0KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJlcyA9IGZhbHNlO1xuICAgICAgICBzd2l0Y2ggKGNvbmRpdGlvbi5raW5kKSB7XG4gICAgICAgICAgICBjYXNlIFwibnVtZXJpYy1jb25kaXRpb25cIjpcbiAgICAgICAgICAgICAgICBpZiAoZmFjdC5raW5kID09PSBcIm51bWVyaWMtZmFjdFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcyA9IGV2YWx1YXRlTnVtZXJpYyhjb25kaXRpb24sIGZhY3QudmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJzdHJpbmctY29uZGl0aW9uXCI6XG4gICAgICAgICAgICAgICAgaWYgKGZhY3Qua2luZCA9PT0gXCJzdHJpbmctZmFjdFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcyA9IGV2YWx1YXRlU3RyaW5nKGNvbmRpdGlvbiwgZmFjdC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBjb25zdCBjaGVjazogbmV2ZXIgPSBjb25kaXRpb247XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9O1xuXG4gICAgZXhwb3J0IGNvbnN0IGlzRW1wdHkgPSAoY29tcGxleDogQ29tcGxleCkgPT4ge1xuICAgICAgICByZXR1cm4gY29tcGxleC5hbGwubGVuZ3RoID09PSAwICYmIGNvbXBsZXguc29tZS5sZW5ndGggPT09IDA7XG4gICAgfTtcblxuICAgIGNvbnN0IGV2YWx1YXRlU3RyaW5nID0gKGNvbmRpdGlvbjogUmVhZG9ubHk8Q29uZGl0aW9uLlN0cmluZz4sIHZhbHVlOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgICAgICAgY29uc3Qgb3BlcmF0b3IgPSBjb25kaXRpb24ub3BlcmF0b3I7XG4gICAgICAgIGxldCByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgc3dpdGNoIChvcGVyYXRvcikge1xuICAgICAgICAgICAgY2FzZSBcImVxXCI6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gY29uZGl0aW9uLnZhbHVlID09PSB2YWx1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJub3QtZXFcIjpcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBjb25kaXRpb24udmFsdWUgIT09IHZhbHVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcInNob3J0ZXItdGhlblwiOlxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNvbmRpdGlvbi52YWx1ZSAhPT0gdmFsdWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwibG9uZ2VyLXRoZW5cIjpcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBjb25kaXRpb24udmFsdWUgIT09IHZhbHVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBjb25zdCBjaGVjazogbmV2ZXIgPSBvcGVyYXRvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICBjb25zdCBldmFsdWF0ZU51bWVyaWMgPSAoY29uZGl0aW9uOiBOdW1lcmljLCB2YWx1ZTogbnVtYmVyKTogYm9vbGVhbiA9PiB7XG4gICAgICAgIGNvbnN0IG9wID0gY29uZGl0aW9uLm9wZXJhdG9yO1xuICAgICAgICBjb25zdCBjb25kaXRpb25WYWx1ZSA9IGNvbmRpdGlvbi52YWx1ZTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IGZhbHNlO1xuICAgICAgICBzd2l0Y2ggKG9wKSB7XG4gICAgICAgICAgICBjYXNlIFwiZXFcIjpcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB2YWx1ZSA9PT0gY29uZGl0aW9uVmFsdWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwibm90LWVxXCI6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWUgIT09IGNvbmRpdGlvblZhbHVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcImdyZWF0ZXItdGhlblwiOlxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHZhbHVlID4gY29uZGl0aW9uVmFsdWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiZ3JlYXRlci10aGVuLWluY2x1c2l2ZVwiOlxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHZhbHVlID49IGNvbmRpdGlvblZhbHVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcImxlc3MtdGhlblwiOlxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHZhbHVlIDwgY29uZGl0aW9uVmFsdWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwibGVzcy10aGVuLWluY2x1c2l2ZVwiOlxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHZhbHVlIDw9IGNvbmRpdGlvblZhbHVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBjb25zdCBjaGVjazogbmV2ZXIgPSBvcDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICBjb25zdCBfZ2V0QWxsU2ltcGxlID0gKGNvbmRpdGlvbjogQ29uZGl0aW9uKTogUmVhZG9ubHlBcnJheTxDb25kaXRpb24uU2ltcGxlPiA9PiB7XG4gICAgICAgIGNvbnN0IHNpbXBsZTogQXJyYXk8Q29uZGl0aW9uLlNpbXBsZT4gPSBbXTtcbiAgICAgICAgc3dpdGNoIChjb25kaXRpb24ua2luZCkge1xuICAgICAgICAgICAgY2FzZSBcImNvbXBsZXgtY29uZGl0aW9uXCI6XG4gICAgICAgICAgICAgICAgc2ltcGxlLnB1c2goLi4uY29uZGl0aW9uLmFsbCk7XG4gICAgICAgICAgICAgICAgc2ltcGxlLnB1c2goLi4uY29uZGl0aW9uLnNvbWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIm51bWVyaWMtY29uZGl0aW9uXCI6XG4gICAgICAgICAgICAgICAgc2ltcGxlLnB1c2goY29uZGl0aW9uKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJzdHJpbmctY29uZGl0aW9uXCI6XG4gICAgICAgICAgICAgICAgc2ltcGxlLnB1c2goY29uZGl0aW9uKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgRFV0aWwubmV2ZXJDaGVjayhjb25kaXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzaW1wbGU7XG4gICAgfTtcblxuICAgIGV4cG9ydCBjb25zdCBnZXRBbGxTaW1wbGVDb25kaXRpb25zID0gKFxuICAgICAgICBjb25kaXRpb246IENvbmRpdGlvbiB8IEFycmF5PENvbmRpdGlvbj5cbiAgICApOiBSZWFkb25seUFycmF5PENvbmRpdGlvbi5TaW1wbGU+ID0+IHtcbiAgICAgICAgY29uc3Qgc2ltcGxlOiBBcnJheTxDb25kaXRpb24uU2ltcGxlPiA9IFtdO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjb25kaXRpb24pKSB7XG4gICAgICAgICAgICBjb25kaXRpb24uZm9yRWFjaCgoYykgPT4ge1xuICAgICAgICAgICAgICAgIHNpbXBsZS5wdXNoKC4uLl9nZXRBbGxTaW1wbGUoYykpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzaW1wbGUucHVzaCguLi5fZ2V0QWxsU2ltcGxlKGNvbmRpdGlvbikpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzaW1wbGU7XG4gICAgfTtcbn1cbiIsICJpbXBvcnQgeyBDb25kaXRpb24gfSBmcm9tIFwiLi9jb25kaXRpb25cIjtcbmltcG9ydCB7IEZhY3QgfSBmcm9tIFwiLi9mYWN0XCI7XG5pbXBvcnQgeyBEVXRpbCB9IGZyb20gXCIuLi91dGlscy9EVXRpbFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJ1bGU8T25TdWNjZXNzQWN0aW9uLCBPbkZhaWx1cmVBY3Rpb24+IHtcbiAgcmVhZG9ubHkgaWQ/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGFsbDogUmVhZG9ubHlBcnJheTxDb25kaXRpb24+O1xuICByZWFkb25seSBzb21lOiBSZWFkb25seUFycmF5PENvbmRpdGlvbj47XG4gIHJlYWRvbmx5IG9uU3VjY2VzczogUmVhZG9ubHlBcnJheTxPblN1Y2Nlc3NBY3Rpb24+O1xuICByZWFkb25seSBvbkZhaWx1cmU6IFJlYWRvbmx5QXJyYXk8T25GYWlsdXJlQWN0aW9uPjtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBSdWxlIHtcbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGF0IHRoZSBydWxlIGlzIHZhbGlkLlxuICAgKiBAcGFyYW0gcnVsZVxuICAgKi9cblxuICBleHBvcnQgY29uc3QgaXNFbXB0eSA9IChydWxlOiBSdWxlPGFueSwgYW55Pik6IGJvb2xlYW4gPT4ge1xuICAgIGNvbnN0IGVtcHR5Q29uZGl0aW9ucyA9IHJ1bGUuYWxsLmxlbmd0aCA9PT0gMCAmJiBydWxlLnNvbWUubGVuZ3RoID09PSAwO1xuICAgIGNvbnN0IGVtcHR5QWN0aW9ucyA9IHJ1bGUub25TdWNjZXNzLmxlbmd0aCA9PT0gMCAmJiBydWxlLm9uRmFpbHVyZS5sZW5ndGggPT09IDA7XG4gICAgcmV0dXJuIGVtcHR5Q29uZGl0aW9ucyB8fCBlbXB0eUFjdGlvbnM7XG4gIH07XG5cbiAgZXhwb3J0IGNvbnN0IHNvbHZlID0gKHJ1bGU6IFJ1bGU8YW55LCBhbnk+LCBmYWN0czogUmVhZG9ubHlBcnJheTxGYWN0Pik6IGJvb2xlYW4gPT4ge1xuICAgIGlmIChydWxlLnNvbWUubGVuZ3RoID09PSAwICYmIHJ1bGUuYWxsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy8gVE9ETyBSRVRVUk4gV0FSTklORz8gT1IgTE9HR0lORyA/XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3Qgc29tZVNvbHZlZCA9IHJ1bGUuc29tZS5tYXAoKGNvbmRpdGlvbikgPT4gQ29uZGl0aW9uLmV2YWx1YXRlKGNvbmRpdGlvbiwgZmFjdHMpKTtcblxuICAgIGNvbnN0IHNvbWVSZXN1bHQgPSBzb21lU29sdmVkLmxlbmd0aCA9PT0gMCB8fCBzb21lU29sdmVkLnNvbWUoRFV0aWwuaXNUcnVlKTtcblxuICAgIGNvbnN0IGFsbFNvbHZlZCA9IHJ1bGUuYWxsLm1hcCgoY29uZGl0aW9uKSA9PiBDb25kaXRpb24uZXZhbHVhdGUoY29uZGl0aW9uLCBmYWN0cykpLmV2ZXJ5KERVdGlsLmlzVHJ1ZSk7XG5cbiAgICByZXR1cm4gYWxsU29sdmVkICYmIHNvbWVSZXN1bHQ7XG4gIH07XG59XG4iLCAiaW1wb3J0IHsgRmFjdCB9IGZyb20gXCIuL2ZhY3RcIjtcbmltcG9ydCB7IFJ1bGUgfSBmcm9tIFwiLi9ydWxlXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU29sdmVSZXN1bHQ8UywgRj4ge1xuICBtYXRjaGluZzogUmVhZG9ubHlBcnJheTxNYXRjaDxTLCBGPj47XG4gIGVycm9yczogUmVhZG9ubHlBcnJheTxSdWxlRW5naW5lRXJyb3I+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1hdGNoPFMsIEY+IHtcbiAgcmVhZG9ubHkgbWF0Y2hpbmdSdWxlSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgcnVsZURlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGFjdGlvbkxpc3Q6IFJlYWRvbmx5QXJyYXk8Uz4gfCBSZWFkb25seUFycmF5PEY+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJ1bGVFbmdpbmVFcnJvciB7XG4gIHJlYWRvbmx5IGtpbmQ/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IG1lc3NhZ2U6IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIFJ1bGVFbmdpbmU8UywgRj4ge1xuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgc29sdmVBbGwocnVsZXM6IFJ1bGU8UywgRj5bXSwgZmFjdHM6IEZhY3RbXSk6IFNvbHZlUmVzdWx0PFMsIEY+IHtcbiAgICBjb25zdCBlcnJvcnM6IFJ1bGVFbmdpbmVFcnJvcltdID0gW107XG4gICAgY29uc3QgbWF0Y2hpbmc6IE1hdGNoPFMsIEY+W10gPSBbXTtcbiAgICBydWxlcy5mb3JFYWNoKChydWxlKSA9PiB7XG4gICAgICBpZiAoUnVsZS5pc0VtcHR5KHJ1bGUpKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKHsgbWVzc2FnZTogXCJFbXB0eSBydWxlOiBcIiArIHJ1bGUuaWQgfSk7XG4gICAgICB9IGVsc2UgaWYgKFJ1bGUuc29sdmUocnVsZSwgZmFjdHMpKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoOiBNYXRjaDxTLCBGPiA9IHtcbiAgICAgICAgICBydWxlRGVzY3JpcHRpb246IHJ1bGUuZGVzY3JpcHRpb24sXG4gICAgICAgICAgbWF0Y2hpbmdSdWxlSWQ6IHJ1bGUuaWQgPz8gXCJuby1pZC1naXZlblwiLFxuICAgICAgICAgIGFjdGlvbkxpc3Q6IFsuLi5ydWxlLm9uU3VjY2Vzc10sXG4gICAgICAgIH07XG4gICAgICAgIG1hdGNoaW5nLnB1c2gobWF0Y2gpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB7IG1hdGNoaW5nLCBlcnJvcnMgfTtcbiAgfVxuXG4gIHNvbHZlKHJ1bGU6IFJ1bGU8UywgRj4sIGZhY3RzOiBGYWN0W10pOiBib29sZWFuIHtcbiAgICAvLyBUT0RPIFZhbGlkYXRlLCBhbmQgUmV0dXJuIHJlc3VsdFxuICAgIHJldHVybiBSdWxlLnNvbHZlKHJ1bGUsIGZhY3RzKTtcbiAgfVxufVxuIiwgImltcG9ydCB7IFBhZ2VEdG8gfSBmcm9tIFwiLi4vZHRvL1NjaGVtYUR0b1wiO1xuXG5leHBvcnQgY2xhc3MgTmV4dFF1ZSB7XG4gICAgcHJpdmF0ZSBvcmlnaW5hbE9yZGVyOiBSZWFkb25seUFycmF5PHN0cmluZz4gPSBbXTtcbiAgICBwcml2YXRlIGFsbFBhZ2VzOiBQYWdlRHRvW10gPSBbXTtcbiAgICBwcml2YXRlIGV4Y2x1ZGVkVGFncyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIHByaXZhdGUgZXhjbHVkZWRCeVBhZ2VJZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIHByaXZhdGUgcmVtYWluaW5nOiBQYWdlRHRvW10gPSBbXTtcbiAgICBjb25zdHJ1Y3RvcihwYWdlczogUGFnZUR0b1tdID0gW10pIHtcbiAgICAgICAgdGhpcy5yZXNldFF1ZShwYWdlcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2lsbCByZXNldCBxdWUgd2l0aCB0aGUgbmV3IHBhZ2VzLlxuICAgICAqIEBwYXJhbSBwYWdlc1xuICAgICAqL1xuICAgIHJlc2V0UXVlKHBhZ2VzOiBQYWdlRHRvW10pIHtcbiAgICAgICAgdGhpcy5hbGxQYWdlcyA9IFsuLi5wYWdlc107XG4gICAgICAgIHRoaXMucmVtYWluaW5nID0gWy4uLnBhZ2VzXTtcbiAgICAgICAgdGhpcy5leGNsdWRlZFRhZ3MgPSBuZXcgU2V0KCk7XG4gICAgICAgIHRoaXMuZXhjbHVkZWRCeVBhZ2VJZCA9IG5ldyBTZXQoKTtcbiAgICAgICAgdGhpcy5vcmlnaW5hbE9yZGVyID0gdGhpcy5hbGxQYWdlcy5tYXAoKHApID0+IHAuaWQpO1xuICAgIH1cblxuICAgIHBvcCgpOiBQYWdlRHRvIHwgZmFsc2Uge1xuICAgICAgICBjb25zdCBuZXh0ID0gdGhpcy5yZW1haW5pbmcuc2hpZnQoKTtcbiAgICAgICAgLy8gVE9ETyBDTE9ORT8/XG4gICAgICAgIHJldHVybiBuZXh0ID8/IGZhbHNlO1xuICAgIH1cblxuICAgIHBlZWsoKTogUGFnZUR0byB8IGZhbHNlIHtcbiAgICAgICAgY29uc3QgbmV4dCA9IHRoaXMucmVtYWluaW5nWzBdO1xuICAgICAgICByZXR1cm4gbmV4dCA/PyBmYWxzZTtcbiAgICB9XG5cbiAgICBqdW1wVG9QYWdlQnlJZChwYWdlSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMucmVtYWluaW5nLmZpbmRJbmRleCgocCkgPT4gcC5pZCA9PT0gcGFnZUlkKTtcbiAgICAgICAgaWYgKGluZGV4IDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVtYWluaW5nID0gdGhpcy5yZW1haW5pbmcuc2xpY2UoaW5kZXgpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZW1vdmVCeVRhZyh0YWc6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRhZykpIHtcbiAgICAgICAgICAgIHRhZy5mb3JFYWNoKCh0YWcpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmV4Y2x1ZGVkVGFncy5hZGQodGFnKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5leGNsdWRlZFRhZ3MuYWRkKHRhZyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5maWx0ZXJSZW1haW5pbmcoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaWxsIG5vdCBiZSBpbmNsdWRlZFxuICAgICAqIEBwYXJhbSBwYWdlc1xuICAgICAqL1xuICAgIGluc2VydEFzTmV4dEJ5Rm9yY2UocGFnZXM6IFBhZ2VEdG9bXSkge1xuICAgICAgICB0aGlzLnJlbWFpbmluZy51bnNoaWZ0KC4uLnBhZ2VzKTtcbiAgICB9XG5cbiAgICByZW1vdmVCeVBhZ2VJZChwYWdlSWQ6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHBhZ2VJZCkpIHtcbiAgICAgICAgICAgIHBhZ2VJZC5mb3JFYWNoKChpZCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZXhjbHVkZWRCeVBhZ2VJZC5hZGQoaWQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmV4Y2x1ZGVkQnlQYWdlSWQuYWRkKHBhZ2VJZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5maWx0ZXJSZW1haW5pbmcoKTtcbiAgICAgICAgLy8gdGhpcy5leGNsdWRlZEJ5UGFnZUlkLmFkZChwYWdlSWQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZmlsdGVyUmVtYWluaW5nKCkge1xuICAgICAgICB0aGlzLnJlbWFpbmluZyA9IHRoaXMucmVtYWluaW5nLmZpbHRlcigocCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdGFncyA9IHAudGFncyA/PyBbXTtcbiAgICAgICAgICAgIGNvbnN0IGlzSW5jbHVlZGVkQnlUYWcgPSAhdGFncy5zb21lKCh0YWcpID0+IHRoaXMuZXhjbHVkZWRUYWdzLmhhcyh0YWcpKTtcbiAgICAgICAgICAgIGNvbnN0IGlzSW5jbHVkZWRCeVBhZ2VJZCA9ICF0aGlzLmV4Y2x1ZGVkQnlQYWdlSWQuaGFzKHAuaWQpO1xuICAgICAgICAgICAgcmV0dXJuIGlzSW5jbHVkZWRCeVBhZ2VJZCAmJiBpc0luY2x1ZWRlZEJ5VGFnO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZ2V0IGlzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlbWFpbmluZy5sZW5ndGggPT09IDA7XG4gICAgfVxuICAgIGdldCBzaXplKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlbWFpbmluZy5sZW5ndGg7XG4gICAgfVxuICAgIGdldCBwYWdlQ291bnQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxPcmRlci5sZW5ndGg7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IEFuc3dlcmVkUXVlc3Rpb24sIEhpc3RvcnlRdWUsIFBhZ2VIaXN0b3J5IH0gZnJvbSBcIi4vaGlzdG9yeS1xdWVcIjtcbmltcG9ydCB7IFJ1bGVFbmdpbmUgfSBmcm9tIFwiLi4vcnVsZXMvcnVsZS1lbmdpbmVcIjtcbmltcG9ydCB7IE5leHRRdWUgfSBmcm9tIFwiLi9uZXh0LXF1ZVwiO1xuaW1wb3J0IHsgUGFnZUR0bywgU2NoZW1hRHRvIH0gZnJvbSBcIi4uL2R0by9TY2hlbWFEdG9cIjtcbmltcG9ydCB7IE5hdmlnYXRpb25Db21tYW5kLCBQYWdlUXVlQ29tbWFuZCB9IGZyb20gXCIuLi9jb21tYW5kcy9EQ29tbWFuZFwiO1xuaW1wb3J0IHsgRFV0aWwgfSBmcm9tIFwiLi4vdXRpbHMvRFV0aWxcIjtcblxuZXhwb3J0IHR5cGUgRFBsYXllckRhdGEgPSBQaWNrPFNjaGVtYUR0bywgXCJwYWdlc1wiIHwgXCJwYWdlU2VxdWVuY2VzXCIgfCBcInJ1bGVzXCI+O1xuZXhwb3J0IGNsYXNzIERQbGF5ZXIge1xuICBwcml2YXRlIGhpc3RvcnkgPSBuZXcgSGlzdG9yeVF1ZSgpO1xuICBwcml2YXRlIHJ1bGVFbmdpbmUgPSBuZXcgUnVsZUVuZ2luZTxQYWdlUXVlQ29tbWFuZCwgUGFnZVF1ZUNvbW1hbmQ+KCk7XG4gIHByaXZhdGUgbmV4dFF1ZSA9IG5ldyBOZXh0UXVlKCk7XG4gIHByaXZhdGUgZGF0YTogRFBsYXllckRhdGE7XG5cbiAgY29uc3RydWN0b3IoZGF0YTogRFBsYXllckRhdGEpIHtcbiAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIHRoaXMubmV4dFF1ZS5yZXNldFF1ZShkYXRhLnBhZ2VzKTtcbiAgfVxuXG4gIHNhdmVIaXN0b3J5KHBhZ2VIaXN0b3J5OiBQYWdlSGlzdG9yeSkge1xuICAgIGNvbnNvbGUubG9nKFwiU0FWRSBISVNUT1JZXCIsIHBhZ2VIaXN0b3J5KTtcbiAgICB0aGlzLmhpc3RvcnkuYWRkVG9IaXN0b3J5KHBhZ2VIaXN0b3J5KTtcbiAgICBjb25zdCBmYWN0cyA9IHRoaXMuaGlzdG9yeS5nZXRGYWN0cygpO1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMucnVsZUVuZ2luZS5zb2x2ZUFsbCh0aGlzLmRhdGEucnVsZXMsIGZhY3RzKTtcbiAgICBjb25zdCBtYXRjaGluZ1J1bGVzID0gcmVzdWx0Lm1hdGNoaW5nO1xuICAgIGNvbnN0IGFjdGlvbnMgPSBtYXRjaGluZ1J1bGVzLm1hcCgocikgPT4gci5hY3Rpb25MaXN0KS5mbGF0KDEpO1xuICAgIGFjdGlvbnMuZm9yRWFjaCgoYSkgPT4ge1xuICAgICAgY29uc29sZS5sb2coYS5wYXlsb2FkKTtcbiAgICAgIHN3aXRjaCAoYS5raW5kKSB7XG4gICAgICAgIGNhc2UgXCJQQUdFX1FVRV9KVU1QX1RPX1BBR0VfQ09NTUFORFwiOlxuICAgICAgICAgIHRoaXMubmV4dFF1ZS5qdW1wVG9QYWdlQnlJZChhLnBheWxvYWQucGFnZUlkKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIlBBR0VfUVVFX0VYQ0xVREVfQllfUEFHRV9JRF9DT01NQU5EXCI6XG4gICAgICAgICAgdGhpcy5uZXh0UXVlLnJlbW92ZUJ5UGFnZUlkKGEucGF5bG9hZC5wYWdlSWRzKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIlBBR0VfUVVFX0VYQ0xVREVfQllfVEFHX0NPTU1BTkRcIjpcbiAgICAgICAgICB0aGlzLm5leHRRdWUucmVtb3ZlQnlUYWcoYS5wYXlsb2FkLnRhZ0lkcyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgY29uc29sZS5sb2coXCJVTktOT1dOIEFDVElPTlwiLCBhKTtcbiAgICAgICAgICBjb25zdCBjaGVjazogbmV2ZXIgPSBhO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnNvbGUubG9nKGFjdGlvbnMpO1xuICB9XG5cbiAgZ2V0UmVzdWx0cygpOiBBbnN3ZXJlZFF1ZXN0aW9uW10ge1xuICAgIHJldHVybiB0aGlzLmhpc3RvcnkuZ2V0QW5zd2VycygpO1xuICB9XG5cbiAgcHJpdmF0ZSBnb1RvUGFnZUJ5SWQocGFnZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLm5leHRRdWUuanVtcFRvUGFnZUJ5SWQocGFnZUlkKTtcbiAgfVxuXG4gIGhhbmRsZU5hdmlnYXRpb25Db21tYW5kKGNvbW1hbmQ6IE5hdmlnYXRpb25Db21tYW5kKSB7XG4gICAgc3dpdGNoIChjb21tYW5kLmtpbmQpIHtcbiAgICAgIGNhc2UgXCJQQUdFX1FVRV9ORVhUX1BBR0VfQ09NTUFORFwiOlxuICAgICAgICAvLyBOTyBORUVEIFRPIERPIEFOWVRISU5HXG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIlBBR0VfUVVFX0dPX1RPX1BBR0VfQ09NTUFORFwiOlxuICAgICAgICB0aGlzLmdvVG9QYWdlQnlJZChjb21tYW5kLnBheWxvYWQucGFnZUlkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiUEFHRV9RVUVfR09fVE9fU0VRVUVOQ0VfQ09NTUFORFwiOlxuICAgICAgICB0aGlzLmluc2VydFNlcXVlbmNlQnlJZChjb21tYW5kLnBheWxvYWQuc2VxdWVuY2VJZCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBEVXRpbC5uZXZlckNoZWNrKGNvbW1hbmQpO1xuICAgIH1cbiAgfVxuXG4gIGdldE5leHRQYWdlKCk6IFBhZ2VEdG8gfCBmYWxzZSB7XG4gICAgLy8gVE9ETyBIQU5ETEUgUlVMRVMhIVxuICAgIHJldHVybiB0aGlzLm5leHRRdWUucG9wKCk7XG4gIH1cblxuICBwcml2YXRlIGluc2VydFNlcXVlbmNlQnlJZChpZDogc3RyaW5nKSB7XG4gICAgY29uc3Qgc2VxID0gdGhpcy5kYXRhLnBhZ2VTZXF1ZW5jZXM/LmZpbmQoKHMpID0+IHMuaWQgPT09IGlkKTtcbiAgICBpZiAoc2VxKSB7XG4gICAgICB0aGlzLm5leHRRdWUuaW5zZXJ0QXNOZXh0QnlGb3JjZShbLi4uc2VxLnBhZ2VzXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEhPVyBUTyBIQU5ETEUgSU5WQUxJRCBJRF9SRUZTPz8gTE9HR0VSPz9cbiAgICAgIC8vIExPRyBJTlZBTElEIENPTU1BTkQuXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRvdGFsIG51bWJlciBvZiBwYWdlcy5cbiAgICovXG4gIGdldCBwYWdlQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5uZXh0UXVlLnBhZ2VDb3VudDtcbiAgfVxufVxuIiwgImltcG9ydCB7IERDb21tYW5kLCBFbGVtZW50Q29tbWFuZCwgU3RhdGVDb21tYW5kIH0gZnJvbSBcIi4uL2NvbW1hbmRzL0RDb21tYW5kXCI7XG5pbXBvcnQgeyBERXZlbnQgfSBmcm9tIFwiLi4vZXZlbnRzL0RFdmVudHNcIjtcbmltcG9ydCB7IENvbmRpdGlvbiB9IGZyb20gXCIuLi9ydWxlcy9jb25kaXRpb25cIjtcblxuZXhwb3J0IGludGVyZmFjZSBERXZlbnRIYW5kbGVyPEUgZXh0ZW5kcyBERXZlbnQgPSBERXZlbnQ+IHtcbiAgICByZWFkb25seSBvbkV2ZW50OiBFW1wia2luZFwiXTtcbiAgICByZWFkb25seSB3aGVuPzogeyBwcm9kdWNlcklkPzogc3RyaW5nOyBjb25kaXRpb24/OiBDb25kaXRpb24gfTtcbiAgICByZWFkb25seSB0aGVuRXhlY3V0ZTogUmVhZG9ubHlBcnJheTxEQ29tbWFuZD47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlDaGFuZ2VkSGFuZGxlciB7XG4gICAgcmVhZG9ubHkgcXVlcnlOYW1lOiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgd2hlblRydWU6IFJlYWRvbmx5QXJyYXk8RWxlbWVudENvbW1hbmQ+O1xuICAgIHJlYWRvbmx5IHdoZW5GYWxzZTogUmVhZG9ubHlBcnJheTxFbGVtZW50Q29tbWFuZD47XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgREV2ZW50SGFuZGxlciB7XG4gICAgZXhwb3J0IHR5cGUgTG9va1VwID0gTWFwPERFdmVudEhhbmRsZXJbXCJvbkV2ZW50XCJdLCBBcnJheTxERXZlbnRIYW5kbGVyPj47XG4gICAgZXhwb3J0IGNvbnN0IGNyZWF0ZUxvb2tVcCA9IChoYW5kbGVycz86IFJlYWRvbmx5QXJyYXk8REV2ZW50SGFuZGxlcj4pOiBMb29rVXAgPT4ge1xuICAgICAgICBjb25zdCBtYXAgPSBuZXcgTWFwPERFdmVudEhhbmRsZXJbXCJvbkV2ZW50XCJdLCBBcnJheTxERXZlbnRIYW5kbGVyPj4oKTtcbiAgICAgICAgaGFuZGxlcnM/LmZvckVhY2goKGgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGtpbmQgPSBoLm9uRXZlbnQ7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50ID0gbWFwLmdldChraW5kKTtcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbnMgPSBjdXJyZW50ID8gWy4uLmN1cnJlbnQsIGhdIDogW2hdO1xuICAgICAgICAgICAgbWFwLnNldChraW5kLCBhY3Rpb25zKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBtYXA7XG4gICAgfTtcbn1cbiIsICJpbXBvcnQgeyBEU3R5bGUgfSBmcm9tIFwiLi9EU3R5bGVcIjtcbmltcG9ydCB7IERFbGVtZW50QmFzZUR0byB9IGZyb20gXCIuLi9kdG8vREVsZW1lbnQuZHRvXCI7XG5pbXBvcnQgeyBEQ29tbWFuZCwgRWxlbWVudENvbW1hbmQgfSBmcm9tIFwiLi4vY29tbWFuZHMvRENvbW1hbmRcIjtcbmltcG9ydCB7IERDb21tYW5kQnVzIH0gZnJvbSBcIi4uL2NvbW1hbmRzL0RDb21tYW5kQnVzXCI7XG5pbXBvcnQgeyBERXZlbnRIYW5kbGVyIH0gZnJvbSBcIi4uL2V2ZW50LWhhbmRsZXJzL0RFdmVudEhhbmRsZXJcIjtcbmltcG9ydCB7IERVdGlsIH0gZnJvbSBcIi4uL3V0aWxzL0RVdGlsXCI7XG5pbXBvcnQgeyBFdmVudEJ1cyB9IGZyb20gXCIuLi9ldmVudHMvZXZlbnQtYnVzXCI7XG5pbXBvcnQgeyBEVGltZXN0YW1wIH0gZnJvbSBcIi4uL2NvbW1vbi9EVGltZXN0YW1wXCI7XG5pbXBvcnQgeyBBbmltYXRpb25EdG8gfSBmcm9tIFwiLi4vZHRvL0FuaW1hdGlvbkR0b1wiO1xuaW1wb3J0IHsgU2NhbGVTZXJ2aWNlIH0gZnJvbSBcIi4uL2VuZ2luZS9zY2FsZVwiO1xuaW1wb3J0IHsgRFN0YXRlIH0gZnJvbSBcIi4uL3N0YXRlL0RzdGF0ZVwiO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgREVsZW1lbnQ8VCBleHRlbmRzIEhUTUxFbGVtZW50PiB7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGVsOiBUO1xuICAgIHByaXZhdGUgY2xpY2tIYW5kbGVySXNFbmFibGVkID0gdHJ1ZTtcbiAgICByZWFkb25seSBpZDogc3RyaW5nO1xuICAgIHByaXZhdGUgaXNBbmltYXRpbmdTZWxmID0gZmFsc2U7XG4gICAgcHJvdGVjdGVkIGN1cnJTdHlsZTogUGFydGlhbDxEU3R5bGU+ID0ge1xuICAgICAgICBmb250U2l6ZTogeyBfdW5pdDogXCJweFwiLCB2YWx1ZTogMTAwIH0sXG4gICAgICAgIGZvbnRXZWlnaHQ6IDUwMCxcbiAgICAgICAgdGV4dENvbG9yOiBcImJsYWNrXCIsXG4gICAgICAgIG9wYWNpdHk6IDEsXG4gICAgfTtcblxuICAgIC8vIHByaXZhdGUgcmVhZG9ubHkgb25RdWVyeUNoYW5nZWRIYW5kbGVycyA9XG4gICAgcHJpdmF0ZSByZWFkb25seSBldmVudEhhbmRsZXJzOiBERXZlbnRIYW5kbGVyLkxvb2tVcDtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgY29tbWFuZEJ1czogRENvbW1hbmRCdXM7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGV2ZW50QnVzOiBFdmVudEJ1cztcbiAgICBwcm90ZWN0ZWQgc2NhbGU6IFNjYWxlU2VydmljZTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGJhc2VEdG86IERFbGVtZW50QmFzZUR0bztcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgc3Vic2NyaXB0aW9ucyA9IG5ldyBTZXQ8KCkgPT4gdm9pZD4oKTtcblxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihcbiAgICAgICAgZWw6IFQsXG4gICAgICAgIGV2ZW50QnVzOiBFdmVudEJ1cyxcbiAgICAgICAgY29tbWFuZEJ1czogRENvbW1hbmRCdXMsXG4gICAgICAgIGR0bzogREVsZW1lbnRCYXNlRHRvLFxuICAgICAgICBzY2FsZTogU2NhbGVTZXJ2aWNlXG4gICAgKSB7XG4gICAgICAgIHRoaXMuZWwgPSBlbDtcbiAgICAgICAgdGhpcy5pZCA9IGR0by5pZDtcbiAgICAgICAgdGhpcy5iYXNlRHRvID0gZHRvO1xuICAgICAgICAvLyB0aGlzLmVsLnN0eWxlLnBvc2l0aW9uID0gXCJhYnNvbHV0ZVwiO1xuICAgICAgICB0aGlzLmNvbW1hbmRCdXMgPSBjb21tYW5kQnVzO1xuICAgICAgICB0aGlzLmV2ZW50QnVzID0gZXZlbnRCdXM7XG4gICAgICAgIHRoaXMuZXZlbnRIYW5kbGVycyA9IERFdmVudEhhbmRsZXIuY3JlYXRlTG9va1VwKGR0by5ldmVudEhhbmRsZXJzKTtcbiAgICAgICAgdGhpcy5zY2FsZSA9IHNjYWxlO1xuICAgICAgICAvLyBDTElDS1xuICAgICAgICB0aGlzLm9uQ2xpY2tIYW5kbGVyID0gdGhpcy5vbkNsaWNrSGFuZGxlci5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmVsLm9uY2xpY2sgPSB0aGlzLm9uQ2xpY2tIYW5kbGVyO1xuXG4gICAgICAgIC8vIEhPVkVSXG4gICAgICAgIHRoaXMub25Nb3VzZU92ZXIgPSB0aGlzLm9uTW91c2VPdmVyLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuZWwub25tb3VzZW92ZXIgPSB0aGlzLm9uTW91c2VPdmVyO1xuXG4gICAgICAgIGlmIChkdG8pIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlU3R5bGVzKGR0bz8uc3R5bGUpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbW1hbmRTdWJzY3JpcHRpb24gPSB0aGlzLmNvbW1hbmRCdXMuc3Vic2NyaWJlKChjKSA9PiB7XG4gICAgICAgICAgICBpZiAoYy5raW5kID09PSBcIkVMRU1FTlRfU1RZTEVfQ09NTUFORFwiICYmIGMudGFyZ2V0SWQgPT09IHRoaXMuaWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFN0eWxlKGMucGF5bG9hZC5jaGFuZ2VzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjLmtpbmQgPT09IFwiRUxFTUVOVF9ESVNBQkxFX0NMSUNLX0NPTU1BTkRcIiAmJiBjLnRhcmdldElkID09PSB0aGlzLmlkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jbGlja0hhbmRsZXJJc0VuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjLmtpbmQgPT09IFwiRUxFTUVOVF9FTkFCTEVfQ0xJQ0tfQ09NTUFORFwiICYmIGMudGFyZ2V0SWQgPT09IHRoaXMuaWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNsaWNrSGFuZGxlcklzRW5hYmxlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYy5raW5kID09PSBcIkVMRU1FTlRfQU5JTUFURV9DT01NQU5EXCIgJiYgYy50YXJnZXRJZCA9PT0gdGhpcy5pZCkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiVE9ETyBJTVBMRU1FTlQgQU5JTUFUSU9OX0hBTkRMRVIgSU4gREVsZW1lbnQuXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCB0aGlzLmlkKTtcbiAgICAgICAgLy8gVE9ETyBNRU1PUlkgTEVBS1xuICAgICAgICBjb25zdCBldmVudFN1YnNjcmlwdGlvbiA9IHRoaXMuZXZlbnRCdXMuc3Vic2NyaWJlKChldmVudCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlcnMgPSB0aGlzLmV2ZW50SGFuZGxlcnMuZ2V0KGV2ZW50LmtpbmQpID8/IFtdO1xuICAgICAgICAgICAgLy8gVE9ETyBBcHBseSBDb25kaXRpb25zIGluIFdIRU4uXG4gICAgICAgICAgICBjb25zdCBjb21tYW5kcyA9IGhhbmRsZXJzLm1hcCgoaCkgPT4gaC50aGVuRXhlY3V0ZSkuZmxhdCgxKTtcbiAgICAgICAgICAgIGNvbW1hbmRzLmZvckVhY2goKGNvbW1hbmQpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbW1hbmRCdXMuZW1pdChjb21tYW5kKTtcbiAgICAgICAgICAgICAgICAvLyB0aGlzLmRvQWN0aW9uKGNvbW1hbmQpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmIChldmVudC5raW5kID09PSBcIkhPU1RfU0NBTEVfQ0hBTkdFRF9FVkVOVFwiKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJIQU5ETEUgVEhJUyBTQ0FMRSBDSEFOR0UhIVwiKTtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVN0eWxlcyh7fSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChldmVudC5raW5kID09PSBcIlNUQVRFX1FVRVJZX1JFU1VMVF9DSEFOR0VEX0VWRU5UXCIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXJ5Q2hhbmdlZEhhbmRsZXIoZXZlbnQuZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIFwiRUxFTUVOVDogXCIpO1xuICAgICAgICB0aGlzLm5vcm1hbGl6ZSgpO1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKGNvbW1hbmRTdWJzY3JpcHRpb24pO1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKGV2ZW50U3Vic2NyaXB0aW9uKTtcbiAgICB9XG5cbiAgICBhYnN0cmFjdCBkZXN0cm95KCk6IHZvaWQ7XG5cbiAgICAvLyBhYnN0cmFjdCBzZXRTY2FsZShzY2FsZTogbnVtYmVyKTogdm9pZDtcblxuICAgIC8vIC8qKlxuICAgIC8vICAqIFRoZSBwdXJwb3NlIG9mIHRoaXMgZnVuY3Rpb24gaXMgdG8gcmUtZW1pdCBjb21tYW5kcyBmcm9tIGV2ZW50LWhhbmRsZXJzP1xuICAgIC8vICAqIEBwYXJhbSBjb21tYW5kXG4gICAgLy8gICogQHByaXZhdGVcbiAgICAvLyAgKi9cbiAgICAvLyBwcml2YXRlIGhhbmRsZUNvbW1hbmRzRW1pdHRlZEJ5UHJpdmF0ZUV2ZW50SGFuZGxlcnMoY29tbWFuZDogRENvbW1hbmQpIHtcbiAgICAvLyAgICAgY29uc29sZS5sb2coY29tbWFuZCk7XG4gICAgLy8gICAgIHN3aXRjaCAoY29tbWFuZC5raW5kKSB7XG4gICAgLy8gICAgICAgICBjYXNlIFwiRUxFTUVOVF9TVFlMRV9DT01NQU5EXCI6XG4gICAgLy8gICAgICAgICAgICAgaWYgKGNvbW1hbmQudGFyZ2V0SWQgPT09IHRoaXMuaWQpIHtcbiAgICAvLyAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTdHlsZXMoY29tbWFuZC5wYXlsb2FkLmNoYW5nZXMpO1xuICAgIC8vICAgICAgICAgICAgIH1cbiAgICAvLyAgICAgICAgICAgICBicmVhaztcbiAgICAvLyAgICAgICAgIGNhc2UgXCJFTEVNRU5UX0FOSU1BVEVfQ09NTUFORFwiOlxuICAgIC8vICAgICAgICAgICAgIC8vIFRPRE8gQ0hFQ0sgRk9SIFRBUkdFVCBJRFxuICAgIC8vICAgICAgICAgICAgIHRoaXMuaGFuZGxlQW5pbWF0ZVNlbGZBY3Rpb24oY29tbWFuZC5wYXlsb2FkKTtcbiAgICAvLyAgICAgICAgICAgICBicmVhaztcbiAgICAvLyAgICAgICAgIGNhc2UgXCJFTEVNRU5UX0VOQUJMRV9DTElDS19DT01NQU5EXCI6XG4gICAgLy8gICAgICAgICAgICAgdGhpcy5jbGlja0hhbmRsZXJJc0VuYWJsZWQgPSB0cnVlO1xuICAgIC8vICAgICAgICAgICAgIC8vIHRoaXMudXBkYXRlU3R5bGVzKGNvbW1hbmQucGF5bG9hZC5jaGFuZ2VzKTtcbiAgICAvLyAgICAgICAgICAgICBicmVhaztcbiAgICAvLyAgICAgICAgIGNhc2UgXCJFTEVNRU5UX0RJU0FCTEVfQ0xJQ0tfQ09NTUFORFwiOlxuICAgIC8vICAgICAgICAgICAgIHRoaXMuY2xpY2tIYW5kbGVySXNFbmFibGVkID0gZmFsc2U7XG4gICAgLy8gICAgICAgICAgICAgLy8gdGhpcy5oYW5kbGVBbmltYXRlU2VsZkFjdGlvbihjb21tYW5kLnBheWxvYWQpO1xuICAgIC8vICAgICAgICAgICAgIGJyZWFrO1xuICAgIC8vICAgICAgICAgY2FzZSBcIlZJREVPX1BMQVlfQ09NTUFORFwiOlxuICAgIC8vICAgICAgICAgICAgIHRoaXMuY29tbWFuZEJ1cy5lbWl0KGNvbW1hbmQpO1xuICAgIC8vICAgICAgICAgICAgIGJyZWFrO1xuICAgIC8vICAgICAgICAgY2FzZSBcIlZJREVPX1BBVVNFX0NPTU1BTkRcIjpcbiAgICAvLyAgICAgICAgICAgICB0aGlzLmNvbW1hbmRCdXMuZW1pdChjb21tYW5kKTtcbiAgICAvLyAgICAgICAgICAgICBicmVhaztcbiAgICAvLyAgICAgICAgIGNhc2UgXCJFTkdJTkVfTEVBVkVfUEFHRV9DT01NQU5EXCI6XG4gICAgLy8gICAgICAgICAgICAgdGhpcy5jb21tYW5kQnVzLmVtaXQoY29tbWFuZCk7XG4gICAgLy8gICAgICAgICAgICAgYnJlYWs7XG4gICAgLy8gICAgICAgICBjYXNlIFwiVklERU9fSlVNUF9UT19DT01NQU5EXCI6XG4gICAgLy8gICAgICAgICAgICAgdGhpcy5jb21tYW5kQnVzLmVtaXQoY29tbWFuZCk7XG4gICAgLy8gICAgICAgICAgICAgYnJlYWs7XG4gICAgLy8gICAgICAgICBjYXNlIFwiVklERU9fU0VUX1ZPTFVNRV9DT01NQU5EXCI6XG4gICAgLy8gICAgICAgICAgICAgdGhpcy5jb21tYW5kQnVzLmVtaXQoY29tbWFuZCk7XG4gICAgLy8gICAgICAgICAgICAgYnJlYWs7XG4gICAgLy8gICAgICAgICBjYXNlIFwiQVVESU9fUExBWV9DT01NQU5EXCI6XG4gICAgLy8gICAgICAgICAgICAgdGhpcy5jb21tYW5kQnVzLmVtaXQoY29tbWFuZCk7XG4gICAgLy8gICAgICAgICAgICAgYnJlYWs7XG4gICAgLy8gICAgICAgICBjYXNlIFwiQVVESU9fUEFVU0VfQ09NTUFORFwiOlxuICAgIC8vICAgICAgICAgICAgIHRoaXMuY29tbWFuZEJ1cy5lbWl0KGNvbW1hbmQpO1xuICAgIC8vICAgICAgICAgICAgIGJyZWFrO1xuICAgIC8vICAgICAgICAgY2FzZSBcIkFVRElPX1NFVF9WT0xVTUVfQ09NTUFORFwiOlxuICAgIC8vICAgICAgICAgICAgIHRoaXMuY29tbWFuZEJ1cy5lbWl0KGNvbW1hbmQpO1xuICAgIC8vICAgICAgICAgICAgIGJyZWFrO1xuICAgIC8vICAgICAgICAgY2FzZSBcIlBBR0VfUVVFX05FWFRfUEFHRV9DT01NQU5EXCI6XG4gICAgLy8gICAgICAgICAgICAgdGhpcy5jb21tYW5kQnVzLmVtaXQoY29tbWFuZCk7XG4gICAgLy8gICAgICAgICAgICAgYnJlYWs7XG4gICAgLy8gICAgICAgICBjYXNlIFwiUEFHRV9RVUVfR09fVE9fU0VRVUVOQ0VfQ09NTUFORFwiOlxuICAgIC8vICAgICAgICAgICAgIHRoaXMuY29tbWFuZEJ1cy5lbWl0KGNvbW1hbmQpO1xuICAgIC8vICAgICAgICAgICAgIGJyZWFrO1xuICAgIC8vICAgICAgICAgY2FzZSBcIlBBR0VfUVVFX0dPX1RPX1BBR0VfQ09NTUFORFwiOlxuICAgIC8vICAgICAgICAgICAgIHRoaXMuY29tbWFuZEJ1cy5lbWl0KGNvbW1hbmQpO1xuICAgIC8vICAgICAgICAgICAgIGJyZWFrO1xuICAgIC8vICAgICAgICAgY2FzZSBcIlBBR0VfUVVFX0VYQ0xVREVfQllfUEFHRV9JRF9DT01NQU5EXCI6XG4gICAgLy8gICAgICAgICAgICAgdGhpcy5jb21tYW5kQnVzLmVtaXQoY29tbWFuZCk7XG4gICAgLy8gICAgICAgICAgICAgYnJlYWs7XG4gICAgLy8gICAgICAgICBjYXNlIFwiUEFHRV9RVUVfSlVNUF9UT19QQUdFX0NPTU1BTkRcIjpcbiAgICAvLyAgICAgICAgICAgICB0aGlzLmNvbW1hbmRCdXMuZW1pdChjb21tYW5kKTtcbiAgICAvLyAgICAgICAgICAgICBicmVhaztcbiAgICAvLyAgICAgICAgIGNhc2UgXCJQQUdFX1FVRV9FWENMVURFX0JZX1RBR19DT01NQU5EXCI6XG4gICAgLy8gICAgICAgICAgICAgdGhpcy5jb21tYW5kQnVzLmVtaXQoY29tbWFuZCk7XG4gICAgLy8gICAgICAgICAgICAgYnJlYWs7XG4gICAgLy8gICAgICAgICBjYXNlIFwiU1RBVEVfTVVUQVRFX0NPTU1BTkRcIjpcbiAgICAvLyAgICAgICAgICAgICB0aGlzLmNvbW1hbmRCdXMuZW1pdChjb21tYW5kKTtcbiAgICAvLyAgICAgICAgICAgICBicmVhaztcbiAgICAvLyAgICAgICAgIGRlZmF1bHQ6XG4gICAgLy8gICAgICAgICAgICAgRFV0aWwubmV2ZXJDaGVjayhjb21tYW5kKTtcbiAgICAvLyAgICAgfVxuICAgIC8vIH1cblxuICAgIHByaXZhdGUgcXVlcnlDaGFuZ2VkSGFuZGxlcihyZXN1bHQ6IERTdGF0ZS5TdGF0ZVF1ZXJ5UmVzdWx0KSB7XG4gICAgICAgIGNvbnN0IG1heWJlSGFuZGxlcnMgPSB0aGlzLmJhc2VEdG8ub25TdGF0ZUNoYW5nZTtcbiAgICAgICAgaWYgKCFtYXliZUhhbmRsZXJzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcXVlcnlIYW5kbGVycyA9IG1heWJlSGFuZGxlcnMuZmlsdGVyKChoKSA9PiBoLnF1ZXJ5TmFtZSA9PT0gcmVzdWx0LnF1ZXJ5TmFtZSk7XG4gICAgICAgIHF1ZXJ5SGFuZGxlcnMuZm9yRWFjaCgoaCkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3VsdC5jdXJyKSB7XG4gICAgICAgICAgICAgICAgaC53aGVuVHJ1ZS5mb3JFYWNoKChjb21tYW5kKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuZG9BY3Rpb24oY29tbWFuZCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29tbWFuZEJ1cy5lbWl0KGNvbW1hbmQpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBoLndoZW5GYWxzZS5mb3JFYWNoKChjb21tYW5kKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuZG9BY3Rpb24oY29tbWFuZCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29tbWFuZEJ1cy5lbWl0KGNvbW1hbmQpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coZmluZEJ5UXVlcnksIHZhbHVlKTtcbiAgICAgICAgLy8gY29uc3QgYWxsID0gdGhpcy5iYXNlRHRvLnN0YXRlUXVlcnlDaGFuZ2UgPz8gW107XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbkNsaWNrSGFuZGxlcihfOiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCk7XG4gICAgICAgIGlmICghdGhpcy5jbGlja0hhbmRsZXJJc0VuYWJsZWQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHRoaXMuaWQgKyBcIkNsaWNrIGRpc2FibGVkXCIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNsaWNrQWN0aW9uID0gdGhpcy5iYXNlRHRvLm9uQ2xpY2s7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiTkFUSVZFIENMSUNLIEVMRU1FTlQ6IEhhbmRsZXJzIFwiICsgY2xpY2tBY3Rpb24/Lmxlbmd0aCk7XG4gICAgICAgIGlmIChjbGlja0FjdGlvbiAmJiBjbGlja0FjdGlvbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIlRBUkdFVElEOiBcIiArIGNsaWNrQWN0aW9uWzBdLnRhcmdldElkICsgXCIgXCIgKyB0aGlzLmlkKTtcbiAgICAgICAgICAgIHRoaXMuZXZlbnRCdXMuZW1pdCh7XG4gICAgICAgICAgICAgICAga2luZDogXCJVU0VSX0NMSUNLRURfRVZFTlRcIixcbiAgICAgICAgICAgICAgICBwcm9kdWNlcjogXCJEVXNlclwiLFxuICAgICAgICAgICAgICAgIHByb2R1Y2VySWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICAgICAgZGF0YTogeyBlbGVtZW50SWQ6IHRoaXMuaWQgfSxcbiAgICAgICAgICAgICAgICB0aW1lc3RhbXA6IERUaW1lc3RhbXAubm93KCksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNsaWNrQWN0aW9uLmZvckVhY2goKGNvbW1hbmQpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbW1hbmRCdXMuZW1pdChjb21tYW5kKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbk1vdXNlT3ZlcihfOiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGV2KTtcbiAgICB9XG5cbiAgICBzZXRTdHlsZShzdHlsZTogUGFydGlhbDxEU3R5bGU+KSB7XG4gICAgICAgIHRoaXMudXBkYXRlU3R5bGVzKHN0eWxlKTtcbiAgICB9XG5cbiAgICBhcHBlbmRZb3Vyc2VsZihwYXJlbnQ6IEhUTUxFbGVtZW50KSB7XG4gICAgICAgIHBhcmVudC5hcHBlbmQodGhpcy5lbCk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKHBhcmVudCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYW5kbGVBbmltYXRlU2VsZkFjdGlvbihkdG86IEFuaW1hdGlvbkR0bykge1xuICAgICAgICB0aGlzLmlzQW5pbWF0aW5nU2VsZiA9IHRydWU7XG4gICAgICAgIGNvbnN0IHsga2V5ZnJhbWVzLCBvcHRpb25zIH0gPSBkdG87XG5cbiAgICAgICAgY29uc3QgYW5pbWF0aW9uID0gdGhpcy5lbC5hbmltYXRlKGtleWZyYW1lcywgb3B0aW9ucy5kdXJhdGlvbik7XG4gICAgICAgIGFuaW1hdGlvbi5vbmZpbmlzaCA9IChlOiBBbmltYXRpb25QbGF5YmFja0V2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlLnR5cGUpO1xuICAgICAgICAgICAgdGhpcy5pc0FuaW1hdGluZ1NlbGYgPSBmYWxzZTtcbiAgICAgICAgfTtcbiAgICAgICAgYW5pbWF0aW9uLm9ucmVtb3ZlID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKFwiQU5JTUFUSU9OIFJFTU9WRUQ6IFwiICsgYW5pbWF0aW9uLmlkKTtcbiAgICAgICAgICAgIHRoaXMuaXNBbmltYXRpbmdTZWxmID0gZmFsc2U7XG4gICAgICAgIH07XG4gICAgICAgIGFuaW1hdGlvbi5vbmNhbmNlbCA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcIkFOSU1BVElPTiBDQU5DRUxFRDogXCIgKyBhbmltYXRpb24uaWQpO1xuICAgICAgICAgICAgdGhpcy5pc0FuaW1hdGluZ1NlbGYgPSBmYWxzZTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG5vcm1hbGl6ZSgpIHtcbiAgICAgICAgRFN0eWxlLm5vcm1hbGl6ZSh0aGlzLmVsKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgdXBkYXRlU3R5bGVzKHN0eWxlOiBQYXJ0aWFsPERTdHlsZT4pIHtcbiAgICAgICAgdGhpcy5jdXJyU3R5bGUgPSBPYmplY3QuYXNzaWduKHRoaXMuY3VyclN0eWxlLCBzdHlsZSk7XG4gICAgICAgIERTdHlsZS5hcHBseVN0eWxlcyh0aGlzLmVsLCB0aGlzLmN1cnJTdHlsZSwgdGhpcy5zY2FsZS5zY2FsZSk7XG4gICAgICAgIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMuZWwpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBERWxlbWVudCB9IGZyb20gXCIuL0RFbGVtZW50XCI7XG5pbXBvcnQgeyBERGl2RHRvIH0gZnJvbSBcIi4uL2R0by9ERWxlbWVudC5kdG9cIjtcbmltcG9ydCB7IERUZXh0IH0gZnJvbSBcIi4vRFRleHRcIjtcbmltcG9ydCB7IERJbWcgfSBmcm9tIFwiLi9ESW1nXCI7XG5pbXBvcnQgeyBEQ29tbWFuZEJ1cyB9IGZyb20gXCIuLi9jb21tYW5kcy9EQ29tbWFuZEJ1c1wiO1xuaW1wb3J0IHsgRXZlbnRCdXMgfSBmcm9tIFwiLi4vZXZlbnRzL2V2ZW50LWJ1c1wiO1xuaW1wb3J0IHsgU2NhbGVTZXJ2aWNlIH0gZnJvbSBcIi4uL2VuZ2luZS9zY2FsZVwiO1xuXG5leHBvcnQgY2xhc3MgRERpdiBleHRlbmRzIERFbGVtZW50PEhUTUxEaXZFbGVtZW50PiB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBUQUcgPSBcIlsgRERpdiBdOiBcIjtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGVmYXVsdFN0eWxlID0geyB4OiAyMiwgeTogNCB9O1xuICAgIHByaXZhdGUgY2hpbGRyZW46IEFycmF5PERUZXh0IHwgREltZz4gPSBbXTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBkdG86IEREaXZEdG8sXG4gICAgICAgIGV2ZW50QnVzOiBFdmVudEJ1cyxcbiAgICAgICAgYWN0aW9uU2VydmljZTogRENvbW1hbmRCdXMsXG4gICAgICAgIHNjYWxlOiBTY2FsZVNlcnZpY2UsXG4gICAgICAgIGNoaWxkcmVuOiBBcnJheTxEVGV4dCB8IERJbWc+XG4gICAgKSB7XG4gICAgICAgIGNvbnN0IGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICBzdXBlcihkLCBldmVudEJ1cywgYWN0aW9uU2VydmljZSwgZHRvLCBzY2FsZSk7XG4gICAgICAgIHRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcblxuICAgICAgICB0aGlzLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkKSA9PiB7XG4gICAgICAgICAgICBjaGlsZC5hcHBlbmRZb3Vyc2VsZih0aGlzLmVsKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmZvckVhY2goKHVuc3Vic2NyaWJlKSA9PiB7XG4gICAgICAgICAgICB1bnN1YnNjcmliZSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZCkgPT4ge1xuICAgICAgICAgICAgY2hpbGQuZGVzdHJveSgpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgREVsZW1lbnQgfSBmcm9tIFwiLi9ERWxlbWVudFwiO1xuaW1wb3J0IHsgREltZ0R0byB9IGZyb20gXCIuLi9kdG8vREVsZW1lbnQuZHRvXCI7XG5pbXBvcnQgeyBEQ29tbWFuZEJ1cyB9IGZyb20gXCIuLi9jb21tYW5kcy9EQ29tbWFuZEJ1c1wiO1xuaW1wb3J0IHsgRXZlbnRCdXMgfSBmcm9tIFwiLi4vZXZlbnRzL2V2ZW50LWJ1c1wiO1xuaW1wb3J0IHsgU2NhbGVTZXJ2aWNlIH0gZnJvbSBcIi4uL2VuZ2luZS9zY2FsZVwiO1xuaW1wb3J0IHsgRFRpbWVzdGFtcCB9IGZyb20gXCIuLi9jb21tb24vRFRpbWVzdGFtcFwiO1xuXG5leHBvcnQgY2xhc3MgREltZyBleHRlbmRzIERFbGVtZW50PEhUTUxJbWFnZUVsZW1lbnQ+IHtcbiAgICBwcml2YXRlIHN0YXRpYyBJTUFHRV9DT1VOVCA9IDA7XG4gICAgcHJpdmF0ZSByZWFkb25seSBpbWFnZUNvdW50OiBudW1iZXI7XG4gICAgcmVhZG9ubHkgVEFHOiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgVElNSU5HX1RBRzogc3RyaW5nO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbG9hZFN0YXJ0OiBEVGltZXN0YW1wO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgZHRvOiBESW1nRHRvLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGFjdGlvblN1YmplY3Q6IERDb21tYW5kQnVzLFxuICAgICAgICByZWFkb25seSBldmVudEJ1czogRXZlbnRCdXMsXG4gICAgICAgIHJlYWRvbmx5IHNjYWxlU2VydmljZTogU2NhbGVTZXJ2aWNlXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIiksIGV2ZW50QnVzLCBhY3Rpb25TdWJqZWN0LCBkdG8sIHNjYWxlU2VydmljZSk7XG4gICAgICAgIERJbWcuSU1BR0VfQ09VTlQgKz0gMTtcbiAgICAgICAgdGhpcy5pbWFnZUNvdW50ID0gREltZy5JTUFHRV9DT1VOVDtcbiAgICAgICAgdGhpcy5UQUcgPSBcIltEX0lNRyBcIiArIERJbWcuSU1BR0VfQ09VTlQgKyBcIiBdOiBcIjtcbiAgICAgICAgdGhpcy5USU1JTkdfVEFHID0gXCJsb2FkLXRpbWUgKFwiICsgREltZy5JTUFHRV9DT1VOVCArIFwiKSBcIjtcbiAgICAgICAgdGhpcy5lbC5sb2FkaW5nID0gXCJlYWdlclwiO1xuICAgICAgICB0aGlzLmVsLnN0eWxlLnBvc2l0aW9uID0gXCJhYnNvbHV0ZVwiO1xuICAgICAgICB0aGlzLnNldFN0eWxlKGR0by5zdHlsZSk7XG4gICAgICAgIHRoaXMubG9hZFN0YXJ0ID0gRFRpbWVzdGFtcC5ub3coKTtcbiAgICAgICAgLy8gQmluZCBIYW5kbGVyc1xuICAgICAgICB0aGlzLm9uRXJyb3IgPSB0aGlzLm9uRXJyb3IuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5vbkxvYWQgPSB0aGlzLm9uTG9hZC5iaW5kKHRoaXMpO1xuICAgICAgICAvLyB0aGlzLm9uQ2xpY2sgPSB0aGlzLm9uQ2xpY2suYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5lbC5vbmxvYWQgPSB0aGlzLm9uTG9hZDtcbiAgICAgICAgdGhpcy5lbC5vbmVycm9yID0gdGhpcy5vbkVycm9yO1xuICAgICAgICAvLyB0aGlzLmVsLm9uY2xpY2sgPSB0aGlzLm9uQ2xpY2s7XG4gICAgICAgIHRoaXMuZWwuc3JjID0gZHRvLnVybDtcbiAgICAgICAgY29uc29sZS50aW1lKHRoaXMuVElNSU5HX1RBRyk7XG4gICAgfVxuXG4gICAgbG9nKCk6IHZvaWQge31cblxuICAgIHNldFNjYWxlKHNjYWxlOiBudW1iZXIpIHtcbiAgICAgICAgY29uc29sZS5sb2coc2NhbGUpO1xuICAgICAgICB0aGlzLnNldFN0eWxlKHRoaXMuY3VyclN0eWxlKTtcbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmZvckVhY2goKHVuc3Vic2NyaWJlKSA9PiB7XG4gICAgICAgICAgICB1bnN1YnNjcmliZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uRXJyb3IoZXY6IEV2ZW50IHwgc3RyaW5nKSB7XG4gICAgICAgIGlmIChldiBpbnN0YW5jZW9mIEV2ZW50KSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyh0aGlzLlRBRyArIFwiIFwiICsgZXYudHlwZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyh0aGlzLlRBRyArIGV2KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgb25Mb2FkKF86IEV2ZW50KSB7XG4gICAgICAgIGNvbnN0IGxvYWRUaW1lID0gRFRpbWVzdGFtcC5kaWZmTm93KHRoaXMubG9hZFN0YXJ0KTtcblxuICAgICAgICB0aGlzLmV2ZW50QnVzLmVtaXQoe1xuICAgICAgICAgICAga2luZDogXCJJTUFHRV9MT0FERURfRVZFTlRcIixcbiAgICAgICAgICAgIHByb2R1Y2VyOiBcIkRJbWFnZVwiLFxuICAgICAgICAgICAgcHJvZHVjZXJJZDogdGhpcy5pZCxcbiAgICAgICAgICAgIHRpbWVzdGFtcDogRFRpbWVzdGFtcC5ub3coKSxcbiAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICBsb2FkVGltZSxcbiAgICAgICAgICAgICAgICBuYXR1cmFsSGVpZ2h0OiB0aGlzLmVsLm5hdHVyYWxIZWlnaHQsXG4gICAgICAgICAgICAgICAgbmF0dXJhbFdpZHRoOiB0aGlzLmVsLm5hdHVyYWxXaWR0aCxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IHRoaXMuZWwuaGVpZ2h0LFxuICAgICAgICAgICAgICAgIHdpZHRoOiB0aGlzLmVsLndpZHRoLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IERFbGVtZW50IH0gZnJvbSBcIi4vREVsZW1lbnRcIjtcbmltcG9ydCB7IERUZXh0RHRvIH0gZnJvbSBcIi4uL2R0by9ERWxlbWVudC5kdG9cIjtcbmltcG9ydCB7IERDb21tYW5kQnVzIH0gZnJvbSBcIi4uL2NvbW1hbmRzL0RDb21tYW5kQnVzXCI7XG5pbXBvcnQgeyBFdmVudEJ1cyB9IGZyb20gXCIuLi9ldmVudHMvZXZlbnQtYnVzXCI7XG5pbXBvcnQgeyBTY2FsZVNlcnZpY2UgfSBmcm9tIFwiLi4vZW5naW5lL3NjYWxlXCI7XG5cbmV4cG9ydCBjbGFzcyBEVGV4dCBleHRlbmRzIERFbGVtZW50PEhUTUxQYXJhZ3JhcGhFbGVtZW50PiB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBUQUcgPSBcIlsgRFBhcmFncmFwaCBdOiBcIjtcbiAgICBwcm90ZWN0ZWQgZGVmYXVsdFN0eWxlID0ge307XG5cbiAgICBjb25zdHJ1Y3RvcihkdG86IERUZXh0RHRvLCBldmVudEJ1czogRXZlbnRCdXMsIGFjdGlvblNlcnZpY2U6IERDb21tYW5kQnVzLCBzY2FsZTogU2NhbGVTZXJ2aWNlKSB7XG4gICAgICAgIHN1cGVyKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJwXCIpLCBldmVudEJ1cywgYWN0aW9uU2VydmljZSwgZHRvLCBzY2FsZSk7XG4gICAgICAgIHRoaXMuZWwuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG4gICAgICAgIHRoaXMuZWwuaW5uZXJUZXh0ID0gXCJcIiArIGR0by50ZXh0O1xuICAgICAgICB0aGlzLnNldFN0eWxlKGR0by5zdHlsZSk7XG4gICAgfVxuXG4gICAgc2V0U2NhbGUoc2NhbGU6IG51bWJlcikge1xuICAgICAgICB0aGlzLnNldFN0eWxlKHRoaXMuY3VyclN0eWxlKTtcbiAgICAgICAgY29uc3QgZm9udFNpemUgPSB0aGlzLmVsLnN0eWxlLmZvbnRTaXplO1xuICAgICAgICBjb25zb2xlLmxvZyh0aGlzLlRBRyArIFwic2NhbGU6IFwiICsgc2NhbGUgKyBcIiBGb250c2l6ZTogXCIgKyBmb250U2l6ZSk7XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmZvckVhY2goKHVuc3Vic2NyaWJlKSA9PiB7XG4gICAgICAgICAgICB1bnN1YnNjcmliZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgREVsZW1lbnQgfSBmcm9tIFwiLi4vRGVsZW1lbnQvREVsZW1lbnRcIjtcbmltcG9ydCB7IEREaXYgfSBmcm9tIFwiLi4vRGVsZW1lbnQvRGRpdlwiO1xuaW1wb3J0IHsgREltZyB9IGZyb20gXCIuLi9EZWxlbWVudC9ESW1nXCI7XG5pbXBvcnQgeyBEVGV4dCB9IGZyb20gXCIuLi9EZWxlbWVudC9EVGV4dFwiO1xuaW1wb3J0IHsgRERpdkR0bywgREVsZW1lbnREdG8gfSBmcm9tIFwiLi4vZHRvL0RFbGVtZW50LmR0b1wiO1xuaW1wb3J0IHsgRENvbW1hbmRCdXMgfSBmcm9tIFwiLi4vY29tbWFuZHMvRENvbW1hbmRCdXNcIjtcbmltcG9ydCB7IEV2ZW50QnVzIH0gZnJvbSBcIi4uL2V2ZW50cy9ldmVudC1idXNcIjtcbmltcG9ydCB7IFNjYWxlU2VydmljZSB9IGZyb20gXCIuL3NjYWxlXCI7XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVERWxlbWVudCA9IChcbiAgICBkdG86IERFbGVtZW50RHRvLFxuICAgIGFjdGlvbkJ1czogRENvbW1hbmRCdXMsXG4gICAgZXZlbnRCdXM6IEV2ZW50QnVzLFxuICAgIHNjYWxlOiBTY2FsZVNlcnZpY2Vcbik6IERFbGVtZW50PGFueT4gPT4ge1xuICAgIHN3aXRjaCAoZHRvLl90YWcpIHtcbiAgICAgICAgY2FzZSBcImRpdlwiOlxuICAgICAgICAgICAgY29uc3QgY2hpbGRFbHMgPSBjcmVhdGVDaGlsZHJlbkZvckRpdihkdG8sIGFjdGlvbkJ1cywgZXZlbnRCdXMsIHNjYWxlKTtcbiAgICAgICAgICAgIGNvbnN0IG5ld0RpdiA9IG5ldyBERGl2KGR0bywgZXZlbnRCdXMsIGFjdGlvbkJ1cywgc2NhbGUsIGNoaWxkRWxzKTtcbiAgICAgICAgICAgIHJldHVybiBuZXdEaXY7XG4gICAgICAgIGNhc2UgXCJpbWdcIjpcbiAgICAgICAgICAgIHJldHVybiBuZXcgREltZyhkdG8sIGFjdGlvbkJ1cywgZXZlbnRCdXMsIHNjYWxlKTtcbiAgICAgICAgY2FzZSBcInBcIjpcbiAgICAgICAgICAgIHJldHVybiBuZXcgRFRleHQoZHRvLCBldmVudEJ1cywgYWN0aW9uQnVzLCBzY2FsZSk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBjb25zdCBjaGVjazogbmV2ZXIgPSBkdG87XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIGR0byBnaXZlbiB0byB0aGUgY3JlYXRlREVsZW1lbnQgZnVuY3Rpb24uXCIpO1xuICAgICAgICAvLyBUT0RPIExPR0dJTkcgb3IgY3JlYXRlIGFueSBIVE1MLUVMRU1FTlQ/P1xuICAgIH1cbn07XG5cbmNvbnN0IGNyZWF0ZUNoaWxkcmVuRm9yRGl2ID0gKFxuICAgIGR0bzogRERpdkR0byxcbiAgICBhY3Rpb25TdWJqZWN0OiBEQ29tbWFuZEJ1cyxcbiAgICBldmVudEJ1czogRXZlbnRCdXMsXG4gICAgc2NhbGU6IFNjYWxlU2VydmljZVxuKTogRERpdltcImNoaWxkcmVuXCJdID0+IHtcbiAgICBjb25zdCBjaGlsZER0byA9IGR0by5jaGlsZHJlbjtcbiAgICBjb25zdCBjaGlsZEVsczogQXJyYXk8REltZyB8IERUZXh0PiA9IFtdO1xuICAgIC8vIGNvbnNvbGUubG9nKGNoaWxkRWxlbWVudHMpO1xuICAgIGNoaWxkRHRvLmZvckVhY2goKGR0bykgPT4ge1xuICAgICAgICBpZiAoZHRvLl90YWcgPT09IFwicFwiKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdUZXh0ID0gbmV3IERUZXh0KGR0bywgZXZlbnRCdXMsIGFjdGlvblN1YmplY3QsIHNjYWxlKTtcbiAgICAgICAgICAgIGNoaWxkRWxzLnB1c2gobmV3VGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGR0by5fdGFnID09PSBcImltZ1wiKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdJbWFnZSA9IG5ldyBESW1nKGR0bywgYWN0aW9uU3ViamVjdCwgZXZlbnRCdXMsIHNjYWxlKTtcbiAgICAgICAgICAgIGNoaWxkRWxzLnB1c2gobmV3SW1hZ2UpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGNoaWxkRWxzO1xufTtcbiIsICJpbXBvcnQgeyBERWxlbWVudCB9IGZyb20gXCIuLi9EZWxlbWVudC9ERWxlbWVudFwiO1xuaW1wb3J0IHsgUGFnZUR0byB9IGZyb20gXCIuLi9kdG8vU2NoZW1hRHRvXCI7XG5pbXBvcnQgeyBjcmVhdGVERWxlbWVudCB9IGZyb20gXCIuL2VsZW1lbnQtZmFjdG9yeVwiO1xuaW1wb3J0IHsgRXZlbnRCdXMgfSBmcm9tIFwiLi4vZXZlbnRzL2V2ZW50LWJ1c1wiO1xuaW1wb3J0IHsgRENvbW1hbmRCdXMgfSBmcm9tIFwiLi4vY29tbWFuZHMvRENvbW1hbmRCdXNcIjtcbmltcG9ydCB7IERUaW1lc3RhbXAgfSBmcm9tIFwiLi4vY29tbW9uL0RUaW1lc3RhbXBcIjtcbmltcG9ydCB7IFNjYWxlU2VydmljZSB9IGZyb20gXCIuL3NjYWxlXCI7XG5cbmV4cG9ydCBjbGFzcyBEUGFnZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgVEFHID0gXCJbIERQYWdlIF06IFwiO1xuICBwcml2YXRlIGVsZW1lbnRzOiBERWxlbWVudDxIVE1MRWxlbWVudD5bXSA9IFtdO1xuICBwcml2YXRlIHJlYWRvbmx5IGV2ZW50QnVzO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbW1hbmRCdXM7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2NhbGU6IFNjYWxlU2VydmljZTtcbiAgLy8gVG9kbyBHTE9CQUwgRVZFTlRfQlVTUyBBTkQgUEFHRSBFVkVOVFM6XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBkdG86IFBhZ2VEdG8sXG4gICAgZXZlbnRCdXM6IEV2ZW50QnVzLFxuICAgIGNvbW1hbmRCdXM6IERDb21tYW5kQnVzLFxuICAgIHNjYWxlOiBTY2FsZVNlcnZpY2UsXG4gICkge1xuICAgIHRoaXMuZXZlbnRCdXMgPSBldmVudEJ1cztcbiAgICB0aGlzLmNvbW1hbmRCdXMgPSBjb21tYW5kQnVzO1xuICAgIHRoaXMuc2NhbGUgPSBzY2FsZTtcbiAgICB0aGlzLmVsZW1lbnRzID0gZHRvLmVsZW1lbnRzLm1hcCgoZHRvKSA9PiBjcmVhdGVERWxlbWVudChkdG8sIHRoaXMuY29tbWFuZEJ1cywgdGhpcy5ldmVudEJ1cywgdGhpcy5zY2FsZSkpO1xuICB9XG5cbiAgYXBwZW5kWW91cnNlbGYocGFyZW50OiBIVE1MRWxlbWVudCkge1xuICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuVEFHICsgXCIgQVBQRU5ESU5HIFRPIFBBUkVOVFwiKTtcbiAgICB0aGlzLmVsZW1lbnRzLmZvckVhY2goKGVsKSA9PiB7XG4gICAgICBlbC5hcHBlbmRZb3Vyc2VsZihwYXJlbnQpO1xuICAgICAgLy8gcGFyZW50LmFwcGVuZENoaWxkKGVsLmVsKTtcbiAgICB9KTtcblxuICAgIC8vIGlmICghcHJlbG9hZE1vZGUpIHtcbiAgICB0aGlzLmV2ZW50QnVzLmVtaXQoe1xuICAgICAga2luZDogXCJQQUdFX0VOVEVSX0VWRU5UXCIsXG4gICAgICB0aW1lc3RhbXA6IERUaW1lc3RhbXAubm93KCksXG4gICAgICBwcm9kdWNlcjogXCJEUGFnZVwiLFxuICAgICAgcHJvZHVjZXJJZDogdGhpcy5pZCxcbiAgICAgIGRhdGE6IHsgcGFnZUlkOiB0aGlzLmlkIH0sXG4gICAgfSk7XG4gICAgLy8gfVxuICB9XG5cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLmVsZW1lbnRzLmZvckVhY2goKGVsKSA9PiB7XG4gICAgICBlbC5kZXN0cm95KCk7XG4gICAgfSk7XG4gIH1cblxuICBsb2coKTogdm9pZCB7XG4gICAgLy8gY29uc29sZS5sb2codGhpcy5UQUcgKyAnc2NhbGUgLSAnICsgdGhpcy5zY2FsZSk7XG4gIH1cblxuICBnZXQgaWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZHRvLmlkO1xuICB9XG59XG4iLCAiZXhwb3J0IGNsYXNzIFNjYWxlU2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYmFzZUhlaWdodDtcbiAgcHJpdmF0ZSByZWFkb25seSBiYXNlV2lkdGg7XG4gIHByaXZhdGUgY29udGFpbmVySGVpZ2h0ID0gMTMwMDtcbiAgcHJpdmF0ZSBjb250YWluZXJXaWR0aCA9IDEzMDA7XG5cbiAgZ2V0IHNjYWxlKCkge1xuICAgIHJldHVybiB0aGlzLl9zY2FsZTtcbiAgfVxuXG4gIGdldCBwYWdlSGVpZ2h0KCkge1xuICAgIHJldHVybiB0aGlzLmJhc2VIZWlnaHQgKiB0aGlzLnNjYWxlO1xuICB9XG4gIGdldCBwYWdlV2lkdGgoKSB7XG4gICAgcmV0dXJuIHRoaXMuYmFzZVdpZHRoICogdGhpcy5fc2NhbGU7XG4gIH1cblxuICBwcml2YXRlIF9zY2FsZSA9IDE7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBzdWJzY3JpYmVycyA9IG5ldyBTZXQ8KHNjYWxlOiBudW1iZXIpID0+IHZvaWQ+KCk7XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiB7IGJhc2VIZWlnaHQ6IG51bWJlcjsgYmFzZVdpZHRoOiBudW1iZXI7IGNvbnRhaW5lckhlaWdodDogbnVtYmVyOyBjb250YWluZXJXaWR0aDogbnVtYmVyIH0pIHtcbiAgICB0aGlzLmJhc2VIZWlnaHQgPSBjb25maWcuYmFzZUhlaWdodDtcbiAgICB0aGlzLmJhc2VXaWR0aCA9IGNvbmZpZy5iYXNlV2lkdGg7XG4gICAgdGhpcy5jb250YWluZXJIZWlnaHQgPSBjb25maWcuY29udGFpbmVySGVpZ2h0O1xuICAgIHRoaXMuY29udGFpbmVyV2lkdGggPSBjb25maWcuY29udGFpbmVyV2lkdGg7XG4gICAgdGhpcy51cGRhdGVTY2FsZSgpO1xuICB9XG5cbiAgc2V0Q29udGFpbmVyQm91bmRzKGJvdW5kczogeyBoZWlnaHQ6IG51bWJlcjsgd2lkdGg6IG51bWJlciB9KSB7XG4gICAgdGhpcy5jb250YWluZXJXaWR0aCA9IGJvdW5kcy53aWR0aDtcbiAgICB0aGlzLmNvbnRhaW5lckhlaWdodCA9IGJvdW5kcy5oZWlnaHQ7XG4gICAgdGhpcy51cGRhdGVTY2FsZSgpO1xuICB9XG4gIHByaXZhdGUgdXBkYXRlU2NhbGUoKSB7XG4gICAgY29uc3Qgc2NhbGVGbiA9IFNjYWxlLmNhbGModGhpcy5iYXNlSGVpZ2h0LCB0aGlzLmJhc2VXaWR0aCk7XG4gICAgY29uc3Qgc2NhbGUgPSBzY2FsZUZuKHsgaGVpZ2h0OiB0aGlzLmNvbnRhaW5lckhlaWdodCwgd2lkdGg6IHRoaXMuY29udGFpbmVyV2lkdGggfSk7XG4gICAgY29uc3QgaGFzQ2hhbmdlZCA9IHRoaXMuc2NhbGUgIT09IHNjYWxlO1xuICAgIHRoaXMuX3NjYWxlID0gc2NhbGU7XG4gICAgaWYgKGhhc0NoYW5nZWQpIHtcbiAgICAgIHRoaXMuc3Vic2NyaWJlcnMuZm9yRWFjaCgoZm4pID0+IHtcbiAgICAgICAgZm4odGhpcy5fc2NhbGUpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgb25DaGFuZ2Uoc2NhbGVDaGFuZ2VIYW5kbGVyOiAoc2NhbGU6IG51bWJlcikgPT4gdm9pZCwgc3Vic2NyaWJlcklkOiBzdHJpbmcpIHtcbiAgICAvLyBjb25zb2xlLmxvZyhzdWJzY3JpYmVySWQpO1xuICAgIHRoaXMuc3Vic2NyaWJlcnMuYWRkKHNjYWxlQ2hhbmdlSGFuZGxlcik7XG4gICAgc2NhbGVDaGFuZ2VIYW5kbGVyKHRoaXMuX3NjYWxlKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgdGhpcy5zdWJzY3JpYmVycy5kZWxldGUoc2NhbGVDaGFuZ2VIYW5kbGVyKTtcbiAgICB9O1xuICB9XG59XG5leHBvcnQgbmFtZXNwYWNlIFNjYWxlIHtcbiAgZXhwb3J0IGNvbnN0IGNhbGMgPSAoYmFzZUhlaWdodDogbnVtYmVyLCBiYXNlV2lkdGg6IG51bWJlcikgPT4ge1xuICAgIHJldHVybiAoY29udGFpbmVyOiB7IGhlaWdodDogbnVtYmVyOyB3aWR0aDogbnVtYmVyIH0pID0+IHtcbiAgICAgIGNvbnN0IGhlaWdodFJhdGlvID0gY29udGFpbmVyLmhlaWdodCAvIGJhc2VIZWlnaHQ7XG4gICAgICBjb25zdCB3aWR0aFJhdGlvID0gY29udGFpbmVyLndpZHRoIC8gYmFzZVdpZHRoO1xuICAgICAgcmV0dXJuIE1hdGgubWluKGhlaWdodFJhdGlvLCB3aWR0aFJhdGlvKTtcbiAgICB9O1xuICB9O1xuXG4gIHR5cGUgU2NhbGVQb3NJbnB1dCA9IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IGg6IG51bWJlcjsgdzogbnVtYmVyIH07XG5cbiAgZXhwb3J0IGNvbnN0IHNjYWxlRnVuY3Rpb25DcmVhdG9yID0gKHNjYWxlOiBudW1iZXIpID0+IHtcbiAgICByZXR1cm4gKHZhbHVlOiBudW1iZXIpID0+IHZhbHVlICogc2NhbGU7XG4gIH07XG59XG4iLCAiaW1wb3J0IHsgREF1ZGlvRHRvLCBESW1nRHRvLCBEVmlkZW9EdG8gfSBmcm9tIFwiLi4vZHRvL0RFbGVtZW50LmR0b1wiO1xuXG5leHBvcnQgY2xhc3MgUmVzb3VyY2VQcm92aWRlciB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBUQUcgPSBcIlsgUkVTT1VSQ0VfUFJPVklERVIgXTogXCI7XG4gICAgcHJpdmF0ZSByZWFkb25seSB2aWRlb01hcCA9IG5ldyBNYXA8c3RyaW5nLCBEVmlkZW9EdG8+KCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBhdWRpb01hcCA9IG5ldyBNYXA8c3RyaW5nLCBEQXVkaW9EdG8+KCk7XG4gICAgY29uc3RydWN0b3IoZGF0YTogeyB2aWRlb3M6IFJlYWRvbmx5QXJyYXk8RFZpZGVvRHRvPjsgYXVkaW86IFJlYWRvbmx5QXJyYXk8REF1ZGlvRHRvPiB9KSB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuVEFHICsgXCJWSURFT19DT1VOVCBcIiArIGRhdGEudmlkZW9zLmxlbmd0aCk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuVEFHICsgXCJBVURJT19DT1VOVCBcIiArIGRhdGEuYXVkaW8ubGVuZ3RoKTtcbiAgICAgICAgZGF0YS52aWRlb3MuZm9yRWFjaCgodmlkZW8pID0+IHtcbiAgICAgICAgICAgIHRoaXMudmlkZW9NYXAuc2V0KHZpZGVvLmlkLCB2aWRlbyk7XG4gICAgICAgIH0pO1xuICAgICAgICBkYXRhLmF1ZGlvLmZvckVhY2goKGF1ZGlvKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmF1ZGlvTWFwLnNldChhdWRpby5pZCwgYXVkaW8pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXRBdWRpb0J5SWQoaWQ6IHN0cmluZyk6IERBdWRpb0R0byB8IGZhbHNlIHtcbiAgICAgICAgY29uc3QgbWF5YmVBdWRpbyA9IHRoaXMuYXVkaW9NYXAuZ2V0KGlkKTtcbiAgICAgICAgaWYgKCFtYXliZUF1ZGlvKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKHRoaXMuVEFHICsgXCJBdWRpbyBieSBpZCBcIiArIGlkICsgXCIgZG9udCBleGlzdFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWF5YmVBdWRpbyA/PyBmYWxzZTtcbiAgICB9XG5cbiAgICBnZXRWaWRlb0J5SWQoaWQ6IHN0cmluZyk6IERWaWRlb0R0byB8IGZhbHNlIHtcbiAgICAgICAgY29uc3QgbWF5YmVWaWRlbyA9IHRoaXMudmlkZW9NYXAuZ2V0KGlkKTtcbiAgICAgICAgaWYgKCFtYXliZVZpZGVvKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKHRoaXMuVEFHICsgXCJWaWRlbyBieSBpZCBcIiArIGlkICsgXCIgZG9udCBleGlzdFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWF5YmVWaWRlbyA/PyBmYWxzZTtcbiAgICB9XG59XG4iLCAiZXhwb3J0IGNsYXNzIE9rPFQ+IGltcGxlbWVudHMgSVJlc3VsdDxUPiB7XG4gICAgY29uc3RydWN0b3IocmVhZG9ubHkgdmFsdWU6IFQpIHt9XG4gICAgaXNPaygpOiB0aGlzIGlzIE9rPFQ+IHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlzRmFpbHVyZSgpOiB0aGlzIGlzIEZhaWx1cmU8VD4ge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgbWFwPEE+KGY6ICh0OiBUKSA9PiBBKTogSVJlc3VsdDxBPiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gZih0aGlzLnZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBPazxBPih2YWx1ZSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRmFpbHVyZTxUPiBpbXBsZW1lbnRzIElSZXN1bHQ8VD4ge1xuICAgIGNvbnN0cnVjdG9yKHJlYWRvbmx5IG1lc3NhZ2U6IHN0cmluZykge31cbiAgICBpc0ZhaWx1cmUoKTogdGhpcyBpcyBGYWlsdXJlPFQ+IHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaXNPaygpOiB0aGlzIGlzIE9rPFQ+IHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIG1hcDxBPihfZjogKHQ6IFQpID0+IEEpOiBJUmVzdWx0PEE+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBGYWlsdXJlPEE+KHRoaXMubWVzc2FnZSk7XG4gICAgfVxufVxuXG5pbnRlcmZhY2UgSVJlc3VsdDxUPiB7XG4gICAgaXNPaygpOiB0aGlzIGlzIE9rPFQ+O1xuICAgIGlzRmFpbHVyZSgpOiB0aGlzIGlzIEZhaWx1cmU8VD47XG4gICAgbWFwPEE+KGY6ICh0OiBUKSA9PiBBKTogSVJlc3VsdDxBPjtcbn1cblxuZXhwb3J0IHR5cGUgUmVzdWx0PFQ+ID0gRmFpbHVyZTxUPiB8IE9rPFQ+O1xuZXhwb3J0IG5hbWVzcGFjZSBSZXN1bHQge1xuICAgIGV4cG9ydCBjb25zdCBvayA9IDxUPih2YWx1ZTogVCkgPT4gbmV3IE9rPFQ+KHZhbHVlKTtcbiAgICBleHBvcnQgY29uc3QgZmFpbHVyZSA9IDxUPihtZXNzYWdlOiBzdHJpbmcpID0+IG5ldyBGYWlsdXJlPFQ+KG1lc3NhZ2UpO1xufVxuIiwgImltcG9ydCB7IEZhY3QgfSBmcm9tIFwiLi4vcnVsZXMvZmFjdFwiO1xuaW1wb3J0IHsgQ29uZGl0aW9uIH0gZnJvbSBcIi4uL3J1bGVzL2NvbmRpdGlvblwiO1xuaW1wb3J0IHsgREV2ZW50IH0gZnJvbSBcIi4uL2V2ZW50cy9ERXZlbnRzXCI7XG5pbXBvcnQgeyBTdGF0ZUNvbW1hbmQgfSBmcm9tIFwiLi4vY29tbWFuZHMvRENvbW1hbmRcIjtcblxuZXhwb3J0IG5hbWVzcGFjZSBEU3RhdGUge1xuICAgIGludGVyZmFjZSBQcm9wRGVmaW5pdGlvbjxUeXBlTmFtZSwgVHlwZSBleHRlbmRzIHN0cmluZyB8IG51bWJlcj4ge1xuICAgICAgICByZWFkb25seSBfdHlwZTogVHlwZU5hbWU7XG4gICAgICAgIHJlYWRvbmx5IHByb3BOYW1lOiBzdHJpbmc7XG4gICAgICAgIHJlYWRvbmx5IHByb3BEZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgICAgICByZWFkb25seSBpbml0aWFsVmFsdWU/OiBUeXBlO1xuICAgICAgICByZWFkb25seSBvcHRpb25zPzogUmVhZG9ubHlBcnJheTxQcm9wVmFsdWU8VHlwZT4+O1xuICAgIH1cblxuICAgIGV4cG9ydCB0eXBlIE51bWVyaWNQcm9wID0gUHJvcERlZmluaXRpb248XCJudW1iZXJcIiwgbnVtYmVyPjtcbiAgICBleHBvcnQgdHlwZSBTdHJpbmdQcm9wID0gUHJvcERlZmluaXRpb248XCJzdHJpbmdcIiwgc3RyaW5nPjtcblxuICAgIGV4cG9ydCBpbnRlcmZhY2UgZnJvbUV2ZW50SGFuZGxlciB7XG4gICAgICAgIHJlYWRvbmx5IG9uRXZlbnQ6IERFdmVudFtcImtpbmRcIl07XG4gICAgICAgIHJlYWRvbmx5IHRoZW5FeGVjdXRlOiBSZWFkb25seUFycmF5PFN0YXRlQ29tbWFuZD47XG4gICAgfVxuXG4gICAgZXhwb3J0IGludGVyZmFjZSBQcm9wVmFsdWU8VD4ge1xuICAgICAgICByZWFkb25seSB2YWx1ZTogVDtcbiAgICAgICAgcmVhZG9ubHkgdmFsdWVMYWJlbDogc3RyaW5nO1xuICAgIH1cbiAgICBleHBvcnQgdHlwZSBQcm9wID0gTnVtZXJpY1Byb3AgfCBTdHJpbmdQcm9wO1xuXG4gICAgZXhwb3J0IGludGVyZmFjZSBTZXRTdHJpbmdNdXRhdGlvbiB7XG4gICAgICAgIHJlYWRvbmx5IGtpbmQ6IFwic2V0LXN0cmluZ1wiO1xuICAgICAgICByZWFkb25seSBwcm9wTmFtZTogc3RyaW5nO1xuICAgICAgICByZWFkb25seSB2YWx1ZTogc3RyaW5nO1xuICAgIH1cblxuICAgIGV4cG9ydCBpbnRlcmZhY2UgSW5jcmVtZW50TnVtYmVyTXV0YXRpb24ge1xuICAgICAgICByZWFkb25seSBraW5kOiBcImluY3JlbWVudC1udW1iZXJcIjtcbiAgICAgICAgcmVhZG9ubHkgcHJvcE5hbWU6IHN0cmluZztcbiAgICAgICAgcmVhZG9ubHkgc3RlcFNpemU6IG51bWJlcjtcbiAgICAgICAgcmVhZG9ubHkgaWZOb3RFeGlzdFRoZW5TZXRUbzogbnVtYmVyO1xuICAgIH1cbiAgICBleHBvcnQgaW50ZXJmYWNlIERlY3JlbWVudE51bWJlck11dGF0aW9uIHtcbiAgICAgICAgcmVhZG9ubHkga2luZDogXCJkZWNyZW1lbnQtbnVtYmVyXCI7XG4gICAgICAgIHJlYWRvbmx5IHByb3BOYW1lOiBzdHJpbmc7XG4gICAgICAgIHJlYWRvbmx5IHN0ZXBTaXplOiBudW1iZXI7XG4gICAgICAgIHJlYWRvbmx5IGlmTm90RXhpc3RUaGVuU2V0VG86IG51bWJlcjtcbiAgICB9XG5cbiAgICBleHBvcnQgaW50ZXJmYWNlIFNldE51bWJlck11dGF0aW9uIHtcbiAgICAgICAgcmVhZG9ubHkga2luZDogXCJzZXQtbnVtYmVyXCI7XG4gICAgICAgIHJlYWRvbmx5IHByb3BOYW1lOiBzdHJpbmc7XG4gICAgICAgIHJlYWRvbmx5IHZhbHVlOiBudW1iZXI7XG4gICAgfVxuICAgIGV4cG9ydCB0eXBlIE51bWJlck11dGF0aW9ucyA9IEluY3JlbWVudE51bWJlck11dGF0aW9uIHwgRGVjcmVtZW50TnVtYmVyTXV0YXRpb24gfCBTZXROdW1iZXJNdXRhdGlvbjtcblxuICAgIGV4cG9ydCB0eXBlIFN0YXRlTXV0YXRpb24gPSBTZXRTdHJpbmdNdXRhdGlvbiB8IE51bWJlck11dGF0aW9ucztcblxuICAgIGV4cG9ydCBjb25zdCBpc051bWJlck11dGF0aW9uID0gKG11dGF0aW9uczogU3RhdGVNdXRhdGlvbik6IG11dGF0aW9ucyBpcyBOdW1iZXJNdXRhdGlvbnMgPT4ge1xuICAgICAgICBpZiAoIW11dGF0aW9ucykge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIG11dGF0aW9ucy5raW5kID09PSBcInNldC1udW1iZXJcIiB8fFxuICAgICAgICAgICAgbXV0YXRpb25zLmtpbmQgPT09IFwiZGVjcmVtZW50LW51bWJlclwiIHx8XG4gICAgICAgICAgICBtdXRhdGlvbnMua2luZCA9PT0gXCJpbmNyZW1lbnQtbnVtYmVyXCJcbiAgICAgICAgKTtcbiAgICB9O1xuXG4gICAgZXhwb3J0IGNvbnN0IGlzU3RyaW5nTXV0YXRpb24gPSAobXV0YXRpb246IFN0YXRlTXV0YXRpb24pOiBtdXRhdGlvbiBpcyBTZXRTdHJpbmdNdXRhdGlvbiA9PiB7XG4gICAgICAgIHJldHVybiBtdXRhdGlvbiAmJiBtdXRhdGlvbi5raW5kID09PSBcInNldC1zdHJpbmdcIjtcbiAgICB9O1xuXG4gICAgZXhwb3J0IGludGVyZmFjZSBTdGF0ZVF1ZXJ5IHtcbiAgICAgICAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICAgICAgICByZWFkb25seSBjb25kaXRpb246IENvbmRpdGlvbjtcbiAgICB9XG5cbiAgICBleHBvcnQgaW50ZXJmYWNlIFN0YXRlUXVlcnlSZXN1bHQge1xuICAgICAgICByZWFkb25seSBxdWVyeU5hbWU6IHN0cmluZztcbiAgICAgICAgcmVhZG9ubHkgcHJldjogYm9vbGVhbjtcbiAgICAgICAgcmVhZG9ubHkgY3VycjogYm9vbGVhbjtcbiAgICB9XG5cbiAgICBleHBvcnQgY29uc3QgbnVtZXJpY1Byb3BUb0ZhY3QgPSAocHJvcDogTnVtZXJpY1Byb3AsIHZhbHVlOiBudW1iZXIpID0+IHtcbiAgICAgICAgY29uc3QgZmFjdDogRmFjdC5OdW1lcmljID0ge1xuICAgICAgICAgICAga2luZDogXCJudW1lcmljLWZhY3RcIixcbiAgICAgICAgICAgIHJlZmVyZW5jZUlkOiBwcm9wLnByb3BOYW1lLFxuICAgICAgICAgICAgcmVmZXJlbmNlTGFiZWw6IHByb3AucHJvcERlc2NyaXB0aW9uID8/IFwiIFtTVEFURV9QUk9QRVJUWV0gOiBcIiArIHByb3AucHJvcE5hbWUsXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIGxhYmVsOiBcIiBbVkFMVUVdIDogXCIgKyB2YWx1ZSxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGZhY3Q7XG4gICAgfTtcblxuICAgIGV4cG9ydCBjb25zdCBzdHJpbmdQcm9wVG9GYWN0ID0gKHByb3A6IFN0cmluZ1Byb3AsIHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3QgZmFjdDogRmFjdC5TdHJpbmcgPSB7XG4gICAgICAgICAgICBraW5kOiBcInN0cmluZy1mYWN0XCIsXG4gICAgICAgICAgICByZWZlcmVuY2VJZDogcHJvcC5wcm9wTmFtZSxcbiAgICAgICAgICAgIHJlZmVyZW5jZUxhYmVsOiBcIiBbU1RBVEVfUFJPUEVSVFldIDogXCIgKyBwcm9wLnByb3BOYW1lLFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICBsYWJlbDogXCIgW1ZBTFVFXSA6IFwiICsgdmFsdWUsXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBmYWN0O1xuICAgIH07XG59XG4iLCAiaW1wb3J0IHsgRmFjdCB9IGZyb20gXCIuLi9ydWxlcy9mYWN0XCI7XG5pbXBvcnQgeyBSZXN1bHQgfSBmcm9tIFwiLi4vY29tbW9uL3Jlc3VsdFwiO1xuaW1wb3J0IHsgQ29uZGl0aW9uIH0gZnJvbSBcIi4uL3J1bGVzL2NvbmRpdGlvblwiO1xuaW1wb3J0IHsgRFN0YXRlIH0gZnJvbSBcIi4vRHN0YXRlXCI7XG5pbXBvcnQgeyBERXZlbnREaXNwYXRjaGVyIH0gZnJvbSBcIi4uL2V2ZW50cy9ldmVudC1idXNcIjtcbmltcG9ydCB7IERUaW1lc3RhbXAgfSBmcm9tIFwiLi4vY29tbW9uL0RUaW1lc3RhbXBcIjtcbmltcG9ydCB7IFF1ZXJ5Q2hhbmdlZEV2ZW50IH0gZnJvbSBcIi4uL2V2ZW50cy9ERXZlbnRzXCI7XG5pbXBvcnQgeyBEQ29tbWFuZEJ1cyB9IGZyb20gXCIuLi9jb21tYW5kcy9EQ29tbWFuZEJ1c1wiO1xuXG5leHBvcnQgY2xhc3MgU3RhdGVTZXJ2aWNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBUQUcgPSBcIiBbIFNUQVRFX1NFUlZJQ0UgXSA6XCI7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmFjdHNTdHJpbmcgPSBuZXcgTWFwPHN0cmluZywgRmFjdC5TdHJpbmc+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmFjdHNOdW1lcmljID0gbmV3IE1hcDxzdHJpbmcsIEZhY3QuTnVtZXJpYz4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBwcm9wRGVmaW5pdGlvbnMgPSBuZXcgTWFwPHN0cmluZywgRFN0YXRlLlByb3A+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcXVlcmllcyA9IG5ldyBNYXA8c3RyaW5nLCB7IHF1ZXJ5OiBEU3RhdGUuU3RhdGVRdWVyeTsgbGFzdFJlc3VsdDogYm9vbGVhbiB9PigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHVuc3Vic2NyaWJlQ29tbWFuZHM6ICgpID0+IHZvaWQ7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZXZlbnRCdXM6IERFdmVudERpc3BhdGNoZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb21tYW5kQnVzOiBEQ29tbWFuZEJ1cyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHByb3BzOiBSZWFkb25seUFycmF5PERTdGF0ZS5Qcm9wPixcbiAgICBwcml2YXRlIHJlYWRvbmx5IHF1ZXJ5TGlzdDogUmVhZG9ubHlBcnJheTxEU3RhdGUuU3RhdGVRdWVyeT4gPSBbXSxcbiAgKSB7XG4gICAgcHJvcHMuZm9yRWFjaCgocHJvcCkgPT4ge1xuICAgICAgdGhpcy5yZWdpc3RlclByb3BlcnR5KHByb3ApO1xuICAgIH0pO1xuICAgIGNvbnN0IGZhY3RzID0gdGhpcy5nZXRBbGxGYWN0cygpO1xuICAgIHF1ZXJ5TGlzdC5mb3JFYWNoKChkZWZpbml0aW9uKSA9PiB7XG4gICAgICB0aGlzLnJlZ2lzdGVyUXVlcnkoZGVmaW5pdGlvbiwgZmFjdHMpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5ldmFsdWF0ZVF1ZXJpZXMoKTtcbiAgICB0aGlzLnVuc3Vic2NyaWJlQ29tbWFuZHMgPSB0aGlzLmNvbW1hbmRCdXMuc3Vic2NyaWJlKChjb21tYW5kKSA9PiB7XG4gICAgICBpZiAoY29tbWFuZC5raW5kID09PSBcIlNUQVRFX01VVEFURV9DT01NQU5EXCIpIHtcbiAgICAgICAgdGhpcy5tdXRhdGlvbihjb21tYW5kLnBheWxvYWQubXV0YXRpb24pO1xuICAgICAgfVxuICAgIH0sIHRoaXMuVEFHKTtcbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy51bnN1YnNjcmliZUNvbW1hbmRzKCk7XG4gIH1cblxuICBwcml2YXRlIHJlZ2lzdGVyUXVlcnkocXVlcnk6IERTdGF0ZS5TdGF0ZVF1ZXJ5LCBjdXJyZW50RmFjdHM6IFJlYWRvbmx5QXJyYXk8RmFjdD4pIHtcbiAgICBjb25zdCByZXN1bHQgPSBDb25kaXRpb24uZXZhbHVhdGUocXVlcnkuY29uZGl0aW9uLCBjdXJyZW50RmFjdHMpO1xuICAgIHRoaXMucXVlcmllcy5zZXQocXVlcnkubmFtZSwgeyBxdWVyeTogcXVlcnksIGxhc3RSZXN1bHQ6IHJlc3VsdCB9KTtcbiAgICB0aGlzLmVtaXRRdWVyeUNoYW5nZWRFdmVudCh7IHF1ZXJ5TmFtZTogcXVlcnkubmFtZSwgcHJldjogcmVzdWx0LCBjdXJyOiByZXN1bHQgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlZ2lzdGVyUHJvcGVydHkocHJvcDogRFN0YXRlLlByb3ApIHtcbiAgICBpZiAodGhpcy5wcm9wRGVmaW5pdGlvbnMuaGFzKHByb3AucHJvcE5hbWUpKSB7XG4gICAgICAvLyBMT0dHSU5HXG4gICAgICBjb25zb2xlLndhcm4oXCJQcm9wIGV4Y2lzdHMgYWxyZWFkeS5cIiwgcHJvcC5wcm9wTmFtZSk7XG4gICAgfVxuXG4gICAgdGhpcy5wcm9wRGVmaW5pdGlvbnMuc2V0KHByb3AucHJvcE5hbWUsIHByb3ApO1xuXG4gICAgaWYgKHByb3AuaW5pdGlhbFZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAocHJvcC5fdHlwZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgY29uc3QgZmFjdCA9IERTdGF0ZS5zdHJpbmdQcm9wVG9GYWN0KHByb3AsIHByb3AuaW5pdGlhbFZhbHVlKTtcbiAgICAgIHRoaXMuZmFjdHNTdHJpbmcuc2V0KGZhY3QucmVmZXJlbmNlSWQsIGZhY3QpO1xuICAgIH1cbiAgICBpZiAocHJvcC5fdHlwZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgY29uc3QgZmFjdCA9IERTdGF0ZS5udW1lcmljUHJvcFRvRmFjdChwcm9wLCBwcm9wLmluaXRpYWxWYWx1ZSk7XG4gICAgICB0aGlzLmZhY3RzTnVtZXJpYy5zZXQoZmFjdC5yZWZlcmVuY2VJZCwgZmFjdCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBtdXRhdGVTdHJpbmcocHJvcDogRFN0YXRlLlN0cmluZ1Byb3AsIHZhbHVlOiBzdHJpbmcpIHtcbiAgICBjb25zdCBjdXJyID0gdGhpcy5mYWN0c1N0cmluZy5nZXQocHJvcC5wcm9wTmFtZSk7XG4gICAgaWYgKGN1cnIpIHtcbiAgICAgIGNvbnN0IHVwZGF0ZWQ6IEZhY3QuU3RyaW5nID0geyAuLi5jdXJyLCB2YWx1ZSB9O1xuICAgICAgdGhpcy5zZXRGYWN0KHVwZGF0ZWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjcmVhdGVkOiBGYWN0LlN0cmluZyA9IHtcbiAgICAgICAga2luZDogXCJzdHJpbmctZmFjdFwiLFxuICAgICAgICByZWZlcmVuY2VJZDogcHJvcC5wcm9wTmFtZSxcbiAgICAgICAgcmVmZXJlbmNlTGFiZWw6IFwibGFiZWwgZm9yOiBcIiArIHByb3AucHJvcE5hbWUsXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBsYWJlbDogXCJWYWx1ZTogXCIgKyB2YWx1ZSxcbiAgICAgIH07XG4gICAgICB0aGlzLnNldEZhY3QoY3JlYXRlZCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBtdXRhdGVOdW1iZXIocHJvcDogRFN0YXRlLk51bWVyaWNQcm9wLCBtdXRhdGlvbjogRFN0YXRlLk51bWJlck11dGF0aW9ucykge1xuICAgIGNvbnN0IGN1cnIgPSB0aGlzLmZhY3RzTnVtZXJpYy5nZXQocHJvcC5wcm9wTmFtZSk7XG4gICAgaWYgKCFjdXJyKSB7XG4gICAgICBzd2l0Y2ggKG11dGF0aW9uLmtpbmQpIHtcbiAgICAgICAgY2FzZSBcInNldC1udW1iZXJcIjpcbiAgICAgICAgICB0aGlzLnNldEZhY3QoRFN0YXRlLm51bWVyaWNQcm9wVG9GYWN0KHByb3AsIG11dGF0aW9uLnZhbHVlKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJkZWNyZW1lbnQtbnVtYmVyXCI6XG4gICAgICAgICAgdGhpcy5zZXRGYWN0KERTdGF0ZS5udW1lcmljUHJvcFRvRmFjdChwcm9wLCBtdXRhdGlvbi5pZk5vdEV4aXN0VGhlblNldFRvKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJpbmNyZW1lbnQtbnVtYmVyXCI6XG4gICAgICAgICAgdGhpcy5zZXRGYWN0KERTdGF0ZS5udW1lcmljUHJvcFRvRmFjdChwcm9wLCBtdXRhdGlvbi5pZk5vdEV4aXN0VGhlblNldFRvKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgY29uc3QgY2hlY2s6IG5ldmVyID0gbXV0YXRpb247XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjdXJyKSB7XG4gICAgICBzd2l0Y2ggKG11dGF0aW9uLmtpbmQpIHtcbiAgICAgICAgY2FzZSBcInNldC1udW1iZXJcIjpcbiAgICAgICAgICB0aGlzLnNldEZhY3QoeyAuLi5jdXJyLCB2YWx1ZTogbXV0YXRpb24udmFsdWUgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJkZWNyZW1lbnQtbnVtYmVyXCI6XG4gICAgICAgICAgdGhpcy5zZXRGYWN0KHsgLi4uY3VyciwgdmFsdWU6IGN1cnIudmFsdWUgLSBtdXRhdGlvbi5zdGVwU2l6ZSB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImluY3JlbWVudC1udW1iZXJcIjpcbiAgICAgICAgICB0aGlzLnNldEZhY3QoeyAuLi5jdXJyLCB2YWx1ZTogY3Vyci52YWx1ZSArIG11dGF0aW9uLnN0ZXBTaXplIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGNvbnN0IGNoZWNrOiBuZXZlciA9IG11dGF0aW9uO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZXZhbHVhdGVRdWVyaWVzKCk6IFJlYWRvbmx5QXJyYXk8eyBxdWVyeU5hbWU6IHN0cmluZzsgcHJldjogYm9vbGVhbjsgY3VycjogYm9vbGVhbjsgZGlkQ2hhbmdlOiBib29sZWFuIH0+IHtcbiAgICBjb25zdCBmYWN0cyA9IHRoaXMuZ2V0QWxsRmFjdHMoKTtcbiAgICBjb25zdCBhbGw6IEFycmF5PHsgcXVlcnlOYW1lOiBzdHJpbmc7IHByZXY6IGJvb2xlYW47IGN1cnI6IGJvb2xlYW47IGRpZENoYW5nZTogYm9vbGVhbiB9PiA9IFtdO1xuICAgIHRoaXMucXVlcmllcy5mb3JFYWNoKChxKSA9PiB7XG4gICAgICBjb25zdCBwcmV2ID0gcS5sYXN0UmVzdWx0O1xuXG4gICAgICBjb25zdCBjdXJyID0gQ29uZGl0aW9uLmV2YWx1YXRlKHEucXVlcnkuY29uZGl0aW9uLCBmYWN0cyk7XG4gICAgICBjb25zdCBkaWRDaGFuZ2UgPSBwcmV2ICE9PSBjdXJyO1xuICAgICAgcS5sYXN0UmVzdWx0ID0gY3VycjtcbiAgICAgIGFsbC5wdXNoKHsgcXVlcnlOYW1lOiBxLnF1ZXJ5Lm5hbWUsIHByZXYsIGN1cnIsIGRpZENoYW5nZSB9KTtcbiAgICAgIC8vIGRlZi52YWx1ZSA9IHZhbHVlO1xuICAgIH0pO1xuICAgIHJldHVybiBhbGw7XG4gIH1cblxuICBwcml2YXRlIG11dGF0aW9uKG11dGF0aW9uOiBEU3RhdGUuU3RhdGVNdXRhdGlvbik6IHsgc3VjY2VzczogYm9vbGVhbiB9IHtcbiAgICBjb25zdCBwcm9wRGVmID0gdGhpcy5wcm9wRGVmaW5pdGlvbnMuZ2V0KG11dGF0aW9uLnByb3BOYW1lKTtcbiAgICBpZiAoIXByb3BEZWYpIHtcbiAgICAgIC8vIFRPRE8gTE9HR0lOR1xuICAgICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UgfTtcbiAgICB9XG5cbiAgICBpZiAocHJvcERlZi5fdHlwZSA9PT0gXCJzdHJpbmdcIiAmJiBEU3RhdGUuaXNTdHJpbmdNdXRhdGlvbihtdXRhdGlvbikpIHtcbiAgICAgIHRoaXMubXV0YXRlU3RyaW5nKHByb3BEZWYsIG11dGF0aW9uLnZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAocHJvcERlZi5fdHlwZSA9PT0gXCJudW1iZXJcIiAmJiBEU3RhdGUuaXNOdW1iZXJNdXRhdGlvbihtdXRhdGlvbikpIHtcbiAgICAgIHRoaXMubXV0YXRlTnVtYmVyKHByb3BEZWYsIG11dGF0aW9uKTtcbiAgICB9XG4gICAgY29uc3QgcXVlcnlSZXN1bHRzID0gdGhpcy5ldmFsdWF0ZVF1ZXJpZXMoKTtcbiAgICBjb25zdCBjaGFuZ2VkUmVzdWx0ID0gcXVlcnlSZXN1bHRzLmZpbHRlcigocikgPT4gci5kaWRDaGFuZ2UpO1xuICAgIGNoYW5nZWRSZXN1bHQuZm9yRWFjaCgocmVzKSA9PiB7XG4gICAgICB0aGlzLmVtaXRRdWVyeUNoYW5nZWRFdmVudCh7IHF1ZXJ5TmFtZTogcmVzLnF1ZXJ5TmFtZSwgcHJldjogcmVzLnByZXYsIGN1cnI6IHJlcy5jdXJyIH0pO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0UXVlcnlDaGFuZ2VkRXZlbnQoZGF0YTogeyBxdWVyeU5hbWU6IHN0cmluZzsgcHJldjogYm9vbGVhbjsgY3VycjogYm9vbGVhbiB9KSB7XG4gICAgY29uc3QgcXVlcnlDaGFuZ2VkRXZlbnQ6IFF1ZXJ5Q2hhbmdlZEV2ZW50ID0ge1xuICAgICAga2luZDogXCJTVEFURV9RVUVSWV9SRVNVTFRfQ0hBTkdFRF9FVkVOVFwiLFxuICAgICAgcHJvZHVjZXI6IFwiU1RBVEUtU0VSVklDRVwiLFxuICAgICAgcHJvZHVjZXJJZDogXCJTVEFURS1TRVJWSUNFXCIsXG4gICAgICB0aW1lc3RhbXA6IERUaW1lc3RhbXAubm93KCksXG4gICAgICBkYXRhLFxuICAgIH07XG4gICAgY29uc3QgeyBxdWVyeU5hbWUsIGN1cnIsIHByZXYgfSA9IHF1ZXJ5Q2hhbmdlZEV2ZW50LmRhdGE7XG4gICAgLy8gY29uc29sZS5sb2coXCJbIFFVRVJZX0NIQU5HRUQgXCIgKyBxdWVyeU5hbWUgKyBcIl0gOiBcIiArIHByZXYgKyBcIiAtPiBcIiArIGN1cnIpO1xuICAgIHRoaXMuZXZlbnRCdXMuZW1pdChxdWVyeUNoYW5nZWRFdmVudCk7XG4gIH1cblxuICBnZXRQcm9wQXNGYWN0KHByb3BOYW1lOiBzdHJpbmcpOiBSZXN1bHQ8RmFjdD4ge1xuICAgIGNvbnN0IHByb3BEZWYgPSB0aGlzLnByb3BEZWZpbml0aW9ucy5nZXQocHJvcE5hbWUpO1xuICAgIGlmICghcHJvcERlZikge1xuICAgICAgcmV0dXJuIFJlc3VsdC5mYWlsdXJlKFxuICAgICAgICBcIk5vIGRlZmluaXRpb24gZm9ybSBwcm9wZXJ0eSBueSBuYW1lIFwiICsgcHJvcE5hbWUgKyBcIiBpcyByZWdpc3RlcmVkLiAoUGFzcyBpbiBjb25zdHJ1Y3Rvci4pXCIsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZmFjdHNTdHJpbmcuZ2V0KHByb3BOYW1lKSA/PyB0aGlzLmZhY3RzTnVtZXJpYy5nZXQocHJvcE5hbWUpO1xuXG4gICAgcmV0dXJuIHZhbHVlID8gUmVzdWx0Lm9rKHZhbHVlKSA6IFJlc3VsdC5mYWlsdXJlKFwiUHJvcGVydHkgXCIgKyBwcm9wTmFtZSArIFwiIGhhcyBubyB2YWx1ZS5cIik7XG4gIH1cblxuICBwcml2YXRlIHNldEZhY3QoZmFjdDogRmFjdCkge1xuICAgIHN3aXRjaCAoZmFjdC5raW5kKSB7XG4gICAgICBjYXNlIFwibnVtZXJpYy1mYWN0XCI6XG4gICAgICAgIHRoaXMuZmFjdHNOdW1lcmljLnNldChmYWN0LnJlZmVyZW5jZUlkLCBmYWN0KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwic3RyaW5nLWZhY3RcIjpcbiAgICAgICAgdGhpcy5mYWN0c1N0cmluZy5zZXQoZmFjdC5yZWZlcmVuY2VJZCwgZmFjdCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgY29uc3QgY2hlY2s6IG5ldmVyID0gZmFjdDtcbiAgICB9XG4gIH1cblxuICBnZXRTdGF0ZSgpIHtcbiAgICBjb25zdCBwcm9wczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCB8IGJvb2xlYW4+ID0ge307XG4gICAgdGhpcy5wcm9wRGVmaW5pdGlvbnMuZm9yRWFjaCgoZGVmKSA9PiB7XG4gICAgICBsZXQgdmFsdWU6IHN0cmluZyB8IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAgICAgY29uc3QgbWF5YmVGYWN0ID0gdGhpcy5nZXRBbnlGYWN0KGRlZi5wcm9wTmFtZSk7XG4gICAgICBpZiAobWF5YmVGYWN0KSB7XG4gICAgICAgIHZhbHVlID0gbWF5YmVGYWN0LnZhbHVlO1xuICAgICAgfVxuICAgICAgcHJvcHNbZGVmLnByb3BOYW1lXSA9IHZhbHVlO1xuICAgIH0pO1xuICAgIHRoaXMucXVlcmllcy5mb3JFYWNoKChxdWVyeSkgPT4ge1xuICAgICAgcHJvcHNbcXVlcnkucXVlcnkubmFtZV0gPSBxdWVyeS5sYXN0UmVzdWx0O1xuICAgIH0pO1xuXG4gICAgY29uc3QgcHJvcE5hbWVzID0gT2JqZWN0LmtleXMocHJvcHMpO1xuICAgIGNvbnN0IHByb3BDb3VudCA9IHByb3BOYW1lcy5sZW5ndGg7XG4gICAgY29uc3QgcHJvcEFycmF5ID0gWy4uLnRoaXMucHJvcERlZmluaXRpb25zLnZhbHVlcygpXTtcblxuICAgIHJldHVybiB7IHByb3BDb3VudCwgcHJvcE5hbWVzLCBwcm9wQXJyYXksIHN0YXRlOiBwcm9wcyB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRBbnlGYWN0KHByb3BOYW1lOiBzdHJpbmcpOiBGYWN0IHwgZmFsc2Uge1xuICAgIHJldHVybiB0aGlzLmZhY3RzU3RyaW5nLmdldChwcm9wTmFtZSkgPz8gdGhpcy5mYWN0c051bWVyaWMuZ2V0KHByb3BOYW1lKSA/PyBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0QWxsRmFjdHMoKTogUmVhZG9ubHlBcnJheTxGYWN0PiB7XG4gICAgcmV0dXJuIFsuLi50aGlzLmZhY3RzTnVtZXJpYy52YWx1ZXMoKSwgLi4udGhpcy5mYWN0c1N0cmluZy52YWx1ZXMoKV07XG4gIH1cblxuICAvKipcbiAgICogV2lsbCBjaGVjayB0aGF0IGFsbCByZWZlcmVuY2VJZHMgdXNlZCBpbiBDb25kaXRpb24gaXMgcmVnaXN0ZXJlZCBhcyBhIHZhbGlkIHByb3BlcnR5IGluIHN0YXRlLlxuICAgKiBAcGFyYW0gY29uZGl0aW9uXG4gICAqL1xuICBjYW5CZU1hdGNoZWQoY29uZGl0aW9uOiBDb25kaXRpb24pOiBib29sZWFuIHtcbiAgICBjb25zdCBzaW1wbGVDb25kaXRpb25zID0gQ29uZGl0aW9uLmdldEFsbFNpbXBsZUNvbmRpdGlvbnMoY29uZGl0aW9uKTtcbiAgICBsZXQgaGFzQWxsID0gdHJ1ZTtcblxuICAgIGNvbnN0IGFsbElkcyA9IHNpbXBsZUNvbmRpdGlvbnMubWFwKChjKSA9PiBjLnJlZmVyZW5jZUlkKTtcblxuICAgIGNvbnN0IG1pc3NpbmdJZHM6IHN0cmluZ1tdID0gW107XG4gICAgYWxsSWRzLmZvckVhY2goKGlkKSA9PiB7XG4gICAgICBpZiAoIXRoaXMucHJvcERlZmluaXRpb25zLmhhcyhpZCkpIHtcbiAgICAgICAgaGFzQWxsID0gZmFsc2U7XG4gICAgICAgIG1pc3NpbmdJZHMucHVzaChpZCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc29sZS5sb2codGhpcy5UQUcsIG1pc3NpbmdJZHMpO1xuXG4gICAgcmV0dXJuIGhhc0FsbDtcbiAgfVxuICBpc01hdGNoZWQoY29uZGl0aW9uOiBDb25kaXRpb24pIHtcbiAgICByZXR1cm4gQ29uZGl0aW9uLmV2YWx1YXRlKGNvbmRpdGlvbiwgdGhpcy5nZXRBbGxGYWN0cygpKTtcbiAgfVxufVxuIiwgImltcG9ydCB7IFNjaGVtYUR0byB9IGZyb20gXCIuLi9kdG8vU2NoZW1hRHRvXCI7XG5pbXBvcnQgeyBETWVkaWFNYW5hZ2VyIH0gZnJvbSBcIi4uL3NlcnZpY2VzL0RNZWRpYS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyBEQ29tbWFuZEJ1cyB9IGZyb20gXCIuLi9jb21tYW5kcy9EQ29tbWFuZEJ1c1wiO1xuaW1wb3J0IHsgRXZlbnRCdXMgfSBmcm9tIFwiLi4vZXZlbnRzL2V2ZW50LWJ1c1wiO1xuaW1wb3J0IHsgRFBsYXllciB9IGZyb20gXCIuLi9wbGF5ZXIvZHBsYXllclwiO1xuaW1wb3J0IHsgQW5zd2VyZWRRdWVzdGlvbiB9IGZyb20gXCIuLi9wbGF5ZXIvaGlzdG9yeS1xdWVcIjtcbmltcG9ydCB7IERUaW1lc3RhbXAgfSBmcm9tIFwiLi4vY29tbW9uL0RUaW1lc3RhbXBcIjtcbmltcG9ydCB7IERQYWdlIH0gZnJvbSBcIi4vRFBhZ2VcIjtcbmltcG9ydCB7IFNjYWxlU2VydmljZSB9IGZyb20gXCIuL3NjYWxlXCI7XG5pbXBvcnQgeyBSZXNvdXJjZVByb3ZpZGVyIH0gZnJvbSBcIi4uL3NlcnZpY2VzL3Jlc291cmNlLXByb3ZpZGVyXCI7XG5pbXBvcnQgeyBTdGF0ZVNlcnZpY2UgfSBmcm9tIFwiLi4vc3RhdGUvc3RhdGUtc2VydmljZVwiO1xuaW1wb3J0IHsgRENvbW1hbmQsIFN0YXRlQ29tbWFuZCB9IGZyb20gXCIuLi9jb21tYW5kcy9EQ29tbWFuZFwiO1xuaW1wb3J0IHsgREV2ZW50IH0gZnJvbSBcIi4uL2V2ZW50cy9ERXZlbnRzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRW5naW5lTG9nZ2VyIHtcbiAgZXJyb3IobWVzc2FnZTogc3RyaW5nKTogdm9pZDtcbiAgd2FybihtZXNzYWdlOiBzdHJpbmcpOiB2b2lkO1xuICBhcHBFdmVudChldmVudDogREV2ZW50KTogdm9pZDtcbiAgYXBwQ29tbWFuZChjb21tYW5kOiBEQ29tbWFuZCk6IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2NoZW1hUmVzdWx0IHtcbiAgcmVhZG9ubHkgZXZlbnRMb2c6IFJlYWRvbmx5QXJyYXk8REV2ZW50PjtcbiAgcmVhZG9ubHkgY29tbWFuZExvZzogUmVhZG9ubHlBcnJheTxEQ29tbWFuZD47XG4gIHJlYWRvbmx5IGFuc3dlcnM6IFJlYWRvbmx5QXJyYXk8YW55Pjtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgSVNjaGVtYUVuZ2luZSB7XG4gIG9uQ29tcGxldGUoaGFuZGxlcjogKHJlc3VsdDogU2NoZW1hUmVzdWx0KSA9PiB2b2lkKTogdm9pZDtcbiAgb25Db21tYW5kT3JFdmVudChpdGVtOiBERXZlbnQgfCBEQ29tbWFuZCk6IHZvaWQ7XG4gIHNldFNjaGVtYShzY2hlbWE6IFNjaGVtYUR0byk6IHZvaWQ7XG4gIG9uRmF0YWxFcnJvcihoYW5kbGVyOiAoZXJyb3I6IHsgbWVzc2FnZTogc3RyaW5nIH0pID0+IHZvaWQpOiB2b2lkO1xufVxuXG5leHBvcnQgY2xhc3MgU2NoZW1hRW5naW5lIGltcGxlbWVudHMgSVNjaGVtYUVuZ2luZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgVEFHID0gXCJbIFNDSEVNQV9FTkdJTkUgXSA6XCI7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29tbWFuZEJ1cyA9IG5ldyBEQ29tbWFuZEJ1cygpO1xuICBwcml2YXRlIHJlYWRvbmx5IGV2ZW50QnVzID0gbmV3IEV2ZW50QnVzKCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWVkaWFNYW5hZ2VyOiBETWVkaWFNYW5hZ2VyO1xuICBwcml2YXRlIHJlYWRvbmx5IHNjYWxlOiBTY2FsZVNlcnZpY2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgaG9zdEVsZW1lbnQ6IEhUTUxEaXZFbGVtZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IHVpQ29udGFpbmVyOiBIVE1MRGl2RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWVkaWFDb250YWluZXI6IEhUTUxEaXZFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgcHJpdmF0ZSByZWFkb25seSByZXNvdXJjZVByb3ZpZGVyOiBSZXNvdXJjZVByb3ZpZGVyO1xuICBwcml2YXRlIHJlYWRvbmx5IHN0YXRlU2VydmljZTogU3RhdGVTZXJ2aWNlO1xuICBwcml2YXRlIHJlYWRvbmx5IGdsb2JhbEV2ZW50VG9TdGF0ZUhhbmRsZXJzID0gbmV3IE1hcDxzdHJpbmcsIFJlYWRvbmx5QXJyYXk8U3RhdGVDb21tYW5kPj4oKTtcbiAgcHJpdmF0ZSBwbGF5ZXI6IERQbGF5ZXI7XG4gIHByaXZhdGUgY3VycmVudFBhZ2U6IERQYWdlIHwgZmFsc2UgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZWFkb25seSBzdWJzOiBBcnJheTwoKSA9PiB2b2lkPiA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGhvc3RFbDogSFRNTERpdkVsZW1lbnQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBoZWlnaHQ6IG51bWJlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IHdpZHRoOiBudW1iZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBzY2hlbWE6IFNjaGVtYUR0byxcbiAgKSB7XG4gICAgdGhpcy5ob3N0RWxlbWVudCA9IGhvc3RFbDtcbiAgICB0aGlzLmhvc3RFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMudWlDb250YWluZXIpO1xuICAgIHRoaXMuaG9zdEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5tZWRpYUNvbnRhaW5lcik7XG4gICAgY29uc3Qgc3RhdGVQcm9wcyA9IHRoaXMuc2NoZW1hLnN0YXRlUHJvcHMgPz8gW107XG4gICAgY29uc3Qgc3RhdGVRdWVyaWVzID0gdGhpcy5zY2hlbWEuc3RhdGVRdWVyaWVzID8/IFtdO1xuICAgIHRoaXMuc3RhdGVTZXJ2aWNlID0gbmV3IFN0YXRlU2VydmljZSh0aGlzLmV2ZW50QnVzLCB0aGlzLmNvbW1hbmRCdXMsIHN0YXRlUHJvcHMsIHN0YXRlUXVlcmllcyk7XG4gICAgdGhpcy5zY2FsZSA9IG5ldyBTY2FsZVNlcnZpY2Uoe1xuICAgICAgYmFzZUhlaWdodDogc2NoZW1hLmJhc2VIZWlnaHQsXG4gICAgICBiYXNlV2lkdGg6IHNjaGVtYS5iYXNlV2lkdGgsXG4gICAgICBjb250YWluZXJXaWR0aDogd2lkdGgsXG4gICAgICBjb250YWluZXJIZWlnaHQ6IGhlaWdodCxcbiAgICB9KTtcbiAgICAvLyB0aGlzLmNvbW1hbmRCdXMubG9nQ29tbWFuZHMgPSB0cnVlO1xuICAgIGNvbnN0IGdsb2JhbEV2ZW50SGFuZGxlcnMgPSBzY2hlbWEuc3RhdGVGcm9tRXZlbnQgPz8gW107XG5cbiAgICBnbG9iYWxFdmVudEhhbmRsZXJzLmZvckVhY2goKGgpID0+IHtcbiAgICAgIHRoaXMuZ2xvYmFsRXZlbnRUb1N0YXRlSGFuZGxlcnMuc2V0KGgub25FdmVudCwgaC50aGVuRXhlY3V0ZSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCByZXNvdXJjZXMgPSBTY2hlbWFEdG8uZ2V0UmVzb3VyY2VzKHRoaXMuc2NoZW1hKTtcbiAgICB0aGlzLnJlc291cmNlUHJvdmlkZXIgPSBuZXcgUmVzb3VyY2VQcm92aWRlcih7IHZpZGVvczogcmVzb3VyY2VzLnZpZGVvTGlzdCwgYXVkaW86IHJlc291cmNlcy5hdWRpb0xpc3QgfSk7XG4gICAgdGhpcy5tZWRpYU1hbmFnZXIgPSBuZXcgRE1lZGlhTWFuYWdlcihcbiAgICAgIHRoaXMubWVkaWFDb250YWluZXIsXG4gICAgICB0aGlzLmNvbW1hbmRCdXMsXG4gICAgICB0aGlzLmV2ZW50QnVzLFxuICAgICAgdGhpcy5yZXNvdXJjZVByb3ZpZGVyLFxuICAgICAgdGhpcy5zY2FsZSxcbiAgICApO1xuICAgIHRoaXMucGxheWVyID0gbmV3IERQbGF5ZXIodGhpcy5zY2hlbWEpO1xuICAgIHRoaXMuc3R5bGVTZWxmKCk7XG4gICAgdGhpcy5uZXh0UGFnZSgpO1xuICAgIHRoaXMuaG9va1VwTGlzdGVuZXJzKCk7XG4gIH1cblxuICBwcml2YXRlIGhvb2tVcExpc3RlbmVycygpIHtcbiAgICBjb25zdCBldmVudFN1YnNjcmlwdGlvbiA9IHRoaXMuZXZlbnRCdXMuc3Vic2NyaWJlKChldikgPT4ge1xuICAgICAgdGhpcy5vbkNvbW1hbmRPckV2ZW50KGV2KTtcbiAgICAgIGNvbnN0IGdsb2JhbEhhbmRsZXJzID0gdGhpcy5nbG9iYWxFdmVudFRvU3RhdGVIYW5kbGVycy5nZXQoZXYua2luZCkgPz8gW107XG4gICAgICBnbG9iYWxIYW5kbGVycy5mb3JFYWNoKChzdGF0ZUNvbW1hbmQpID0+IHtcbiAgICAgICAgdGhpcy5jb21tYW5kQnVzLmVtaXQoc3RhdGVDb21tYW5kKTtcbiAgICAgIH0pO1xuICAgIH0sIHRoaXMuVEFHICsgXCJIT09LX1VQX0xJU1RFTkVSU1wiKTtcbiAgICBjb25zdCBjb21tYW5kU3Vic2NyaXB0aW9uID0gdGhpcy5jb21tYW5kQnVzLnN1YnNjcmliZSgoY29tbWFuZCkgPT4ge1xuICAgICAgLy8gc3dpdGNoIChjb21tYW5kLmtpbmQpIHtcbiAgICAgIC8vXG4gICAgICAvLyB9XG4gICAgICB0aGlzLm9uQ29tbWFuZE9yRXZlbnQoY29tbWFuZCk7XG4gICAgICBpZiAoY29tbWFuZC5raW5kID09PSBcIlBBR0VfUVVFX05FWFRfUEFHRV9DT01NQU5EXCIpIHtcbiAgICAgICAgdGhpcy5uZXh0UGFnZSgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29tbWFuZC5raW5kID09PSBcIkVOR0lORV9MRUFWRV9QQUdFX0NPTU1BTkRcIikge1xuICAgICAgICBjb25zb2xlLmxvZyh0aGlzLlRBRyArIFwiU0VRVUVOQ0UgU1RBUlRFRCAtLSBUT0RPIEVWRU5UIEZPUiBUSElTPz9cIik7XG4gICAgICAgIGNvbnNvbGUubG9nKGNvbW1hbmQpO1xuICAgICAgICBjb25zdCBwYWdlSWQgPSBjb21tYW5kLnBheWxvYWQucGFnZUlkO1xuICAgICAgICBjb25zdCBmYWN0cyA9IGNvbW1hbmQucGF5bG9hZC5mYWN0c0NvbGxlY3RlZDtcbiAgICAgICAgY29uc3QgdGltZXN0YW1wID0gRFRpbWVzdGFtcC5ub3coKTtcbiAgICAgICAgY29uc3QgYW5zOiBBbnN3ZXJlZFF1ZXN0aW9uW10gPSBmYWN0cy5tYXAoKGYpID0+ICh7XG4gICAgICAgICAgdGltZXN0YW1wLFxuICAgICAgICAgIGZhY3Q6IGYsXG4gICAgICAgIH0pKTtcbiAgICAgICAgdGhpcy5wbGF5ZXIuc2F2ZUhpc3Rvcnkoe1xuICAgICAgICAgIGFuc3dlcmVkUXVlc3Rpb25zOiBhbnMsXG4gICAgICAgICAgcGFnZUlkLFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLm5leHRQYWdlKCk7XG4gICAgICAgIC8vIGNvbnN0IGhpc3Rvcnk6IFBhZ2VIaXN0b3J5ID0geyBwYWdlOiB7fSwgYW5zd2VyZWRRdWVzdGlvbnM6IFtdIH07XG4gICAgICB9XG4gICAgfSwgdGhpcy5UQUcpO1xuXG4gICAgdGhpcy5zdWJzLnB1c2goY29tbWFuZFN1YnNjcmlwdGlvbik7XG4gICAgdGhpcy5zdWJzLnB1c2goZXZlbnRTdWJzY3JpcHRpb24pO1xuICB9XG5cbiAgcHJpdmF0ZSBzdHlsZVNlbGYoKSB7XG4gICAgdGhpcy5ob3N0RWxlbWVudC5zdHlsZS5oZWlnaHQgPSB0aGlzLnNjYWxlLnBhZ2VIZWlnaHQgKyBcInB4XCI7XG4gICAgdGhpcy5ob3N0RWxlbWVudC5zdHlsZS53aWR0aCA9IHRoaXMuc2NhbGUucGFnZVdpZHRoICsgXCJweFwiO1xuICAgIHRoaXMuaG9zdEVsZW1lbnQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdGhpcy5zY2hlbWEuYmFja2dyb3VuZENvbG9yID8/IFwid2hpdGVcIjtcbiAgICB0aGlzLmhvc3RFbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gXCJyZWxhdGl2ZVwiO1xuICAgIC8vIHRoaXMuaG9zdEVsZW1lbnQuc3R5bGUub3ZlcmZsb3cgPSBcImhpZGRlblwiO1xuICAgIGNvbnN0IG1ha2VTdGF0aWMgPSAoZGl2OiBIVE1MRGl2RWxlbWVudCkgPT4ge1xuICAgICAgZGl2LnN0eWxlLmhlaWdodCA9IFwiMHB4XCI7XG4gICAgICBkaXYuc3R5bGUud2lkdGggPSBcIjBweFwiO1xuICAgICAgZGl2LnN0eWxlLnBvc2l0aW9uID0gXCJzdGF0aWNcIjtcbiAgICB9O1xuXG4gICAgbWFrZVN0YXRpYyh0aGlzLnVpQ29udGFpbmVyKTtcbiAgICBtYWtlU3RhdGljKHRoaXMubWVkaWFDb250YWluZXIpO1xuICB9XG5cbiAgcHJpdmF0ZSBuZXh0UGFnZSgpIHtcbiAgICAvLyBUT0RPIFNIT1VMRCBUSElTIEJFIFBBUlQgT0YgVEhFIFNDSEVNQT8/IFRISVMgSVMgQ0xFQU5VUCBMT0dJQ1xuICAgIC8vIHRoaXMuY29tbWFuZEJ1cy5lbWl0KHsga2luZDogXCJWSURFT19QQVVTRV9DT01NQU5EXCIsIHRhcmdldDogXCJWSURFT1wiLCB0YXJnZXRJZDogXCJWSURFT1wiLCBwYXlsb2FkOiB7fSB9KTtcbiAgICAvLyB0aGlzLmNvbW1hbmRCdXMuZW1pdCh7IGtpbmQ6IFwiQVVESU9fUEFVU0VfQ09NTUFORFwiLCB0YXJnZXQ6IFwiQVVESU9cIiwgdGFyZ2V0SWQ6IFwiQVVESU9cIiwgcGF5bG9hZDoge30gfSk7XG4gICAgLy8gY29uc3QgY3VyclBhZ2VJZCA9IHRoaXMuY3VycmVudFBhZ2UgPyB0aGlzLmN1cnJlbnRQYWdlLmlkIDogXCJOT19QQUdFXCI7XG4gICAgLy8gY29uc29sZS5ncm91cENvbGxhcHNlZChcIk5FWFRfUEFHRSBGUk9NOiBcIiArIGN1cnJQYWdlSWQpO1xuICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuVEFHICsgXCIgTkVYVF9QQUdFIFNUQVJURUQgQVQ6IFwiICsgY3VyclBhZ2VJZCk7XG4gICAgdGhpcy5tZWRpYU1hbmFnZXIuY2xlYXJBbGxNZWRpYSgpO1xuICAgIGNvbnN0IG5leHRQYWdlID0gdGhpcy5wbGF5ZXIuZ2V0TmV4dFBhZ2UoKTtcbiAgICAvLyBjb25zdCBzdGF0ZSA9IHRoaXMuc3RhdGVTZXJ2aWNlLmdldFN0YXRlKCk7XG4gICAgLy8gY29uc29sZS5sb2coc3RhdGUpO1xuICAgIC8vIFRPRE8gQ0xFQU4gVVAgUEFHRSBDT01QT05FTlRTIHRoaXMucGFnZS5DbGVhblVwKClcbiAgICBpZiAodGhpcy5jdXJyZW50UGFnZSkge1xuICAgICAgdGhpcy5jdXJyZW50UGFnZS5kZXN0cm95KCk7XG4gICAgICB0aGlzLnVpQ29udGFpbmVyLmlubmVySFRNTCA9IFwiXCI7XG4gICAgfVxuICAgIGlmICghbmV4dFBhZ2UpIHtcbiAgICAgIC8vIFRPRE8gRklHVVJFIE9VVCBXSEFRVCBUTyBETyBBVCBFTkQgT0YgVEVTVCEhIFN0YXJ0IG92ZXI/P1xuICAgICAgdGhpcy5wbGF5ZXIgPSBuZXcgRFBsYXllcih0aGlzLnNjaGVtYSk7XG4gICAgICBpZiAodGhpcy5zY2hlbWEucGFnZXMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLm5leHRQYWdlKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IG5ld1BhZ2UgPSBuZXcgRFBhZ2UobmV4dFBhZ2UsIHRoaXMuZXZlbnRCdXMsIHRoaXMuY29tbWFuZEJ1cywgdGhpcy5zY2FsZSk7XG5cbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gbmV3UGFnZTtcbiAgICBuZXdQYWdlLmFwcGVuZFlvdXJzZWxmKHRoaXMudWlDb250YWluZXIpO1xuXG4gICAgdGhpcy5tZWRpYU1hbmFnZXIuc2V0UGFnZShuZXh0UGFnZSk7XG4gICAgY29uc3QgczEgPSB0aGlzLnN0YXRlU2VydmljZS5nZXRTdGF0ZSgpO1xuICAgIC8vIGNvbnNvbGUubG9nKHMxKTtcbiAgICAvLyBjb25zb2xlLmxvZyhcIk5leHQtcGFnZTogXCIgKyBuZXdQYWdlLmlkKTtcbiAgICAvLyBjb25zb2xlLmdyb3VwRW5kKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBkZXN0cm95KCkge1xuICAgIGlmICh0aGlzLmN1cnJlbnRQYWdlKSB7XG4gICAgICB0aGlzLmN1cnJlbnRQYWdlLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMudWlDb250YWluZXIuaW5uZXJIVE1MID0gXCJcIjtcbiAgICB9XG4gICAgdGhpcy5tZWRpYU1hbmFnZXIuZGVzdHJveSgpO1xuICAgIHRoaXMuc3RhdGVTZXJ2aWNlLmRlc3Ryb3koKTtcbiAgICB0aGlzLnN1YnMuZm9yRWFjaCgoc3ViKSA9PiB7XG4gICAgICBzdWIoKTtcbiAgICB9KTtcbiAgICBjb25zdCBldlN0YXRzID0gdGhpcy5ldmVudEJ1cy5nZXRTdGF0cygpO1xuICAgIGNvbnN0IGNtZFN0YXRzID0gdGhpcy5jb21tYW5kQnVzLmdldFN0YXRzKCk7XG4gICAgY29uc29sZS5hc3NlcnQoZXZTdGF0cy5zdWJzY3JpYmVyc0NvdW50ID09PSAwLCB0aGlzLlRBRyArIFwiIEV2ZW50YnVzIHNob3VsZCBoYXZlIG5vIHN1YnNjcmliZXJzIFwiLCBldlN0YXRzKTtcbiAgICBjb25zb2xlLmFzc2VydChjbWRTdGF0cy5zdWJzY3JpYmVyc0NvdW50ID09PSAwLCB0aGlzLlRBRyArIFwiQ29tbWFuZGJ1cyBzaG91bGQgaGF2ZSBubyBzdWJzY3JpYmVyc1wiLCBjbWRTdGF0cyk7XG4gIH1cbiAgb25Db21wbGV0ZShoYW5kbGVyOiAocmVzdWx0OiBTY2hlbWFSZXN1bHQpID0+IHZvaWQpIHtcbiAgICBjb25zb2xlLmxvZyhoYW5kbGVyKTtcbiAgfVxuXG4gIG9uRmF0YWxFcnJvcihoYW5kbGVyOiAoZXJyb3I6IHsgbWVzc2FnZTogc3RyaW5nIH0pID0+IHZvaWQpOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZyhoYW5kbGVyKTtcbiAgfVxuXG4gIG9uQ29tbWFuZE9yRXZlbnQoX2V2ZW50X29yX2NvbW1hbmQ6IERFdmVudCB8IERDb21tYW5kKSB7fVxuXG4gIHNldFNjaGVtYShzY2hlbWE6IFNjaGVtYUR0byk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKHNjaGVtYSk7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBEU3RhdGUgfSBmcm9tIFwiLi9Ec3RhdGVcIjtcbmltcG9ydCB7IENvbmRpdGlvbiB9IGZyb20gXCIuLi9ydWxlcy9jb25kaXRpb25cIjtcbmltcG9ydCB7IFN0YXRlQ29tbWFuZCB9IGZyb20gXCIuLi9jb21tYW5kcy9EQ29tbWFuZFwiO1xuXG5leHBvcnQgY2xhc3MgQm9vbGVhblN0YXRlUHJvcGVydHk8UHJvcE5hbWUgZXh0ZW5kcyBzdHJpbmc+IHtcbiAgICByZWFkb25seSBwcm9wTmFtZTogUHJvcE5hbWU7XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVFJVRSA9IHsgdmFsdWU6IDEsIGxhYmVsOiBcIlRSVUVcIiB9O1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEZBTFNFID0geyB2YWx1ZTogMCwgbGFiZWw6IFwiRkFMU0VcIiB9O1xuICAgIHJlYWRvbmx5IHByb3BEZWZpbml0aW9uOiBEU3RhdGUuTnVtZXJpY1Byb3A7XG5cbiAgICBnZXRJc1RydWVDb25kaXRpb24oKTogQ29uZGl0aW9uLk51bWVyaWMge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAga2luZDogXCJudW1lcmljLWNvbmRpdGlvblwiLFxuICAgICAgICAgICAgcmVmZXJlbmNlSWQ6IHRoaXMucHJvcE5hbWUsXG4gICAgICAgICAgICByZWZlcmVuY2VMYWJlbDogdGhpcy5wcm9wTmFtZSArIFwiWyBCT09MRUFOIF1cIixcbiAgICAgICAgICAgIHZhbHVlTGFiZWw6IEJvb2xlYW5TdGF0ZVByb3BlcnR5LlRSVUUubGFiZWwsXG4gICAgICAgICAgICB2YWx1ZTogQm9vbGVhblN0YXRlUHJvcGVydHkuVFJVRS52YWx1ZSxcbiAgICAgICAgICAgIG9wZXJhdG9yOiBcImVxXCIsXG4gICAgICAgIH07XG4gICAgfVxuICAgIGdldElzRmFsc2VDb25kaXRpb24oKTogQ29uZGl0aW9uLk51bWVyaWMge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAga2luZDogXCJudW1lcmljLWNvbmRpdGlvblwiLFxuICAgICAgICAgICAgcmVmZXJlbmNlSWQ6IHRoaXMucHJvcE5hbWUsXG4gICAgICAgICAgICByZWZlcmVuY2VMYWJlbDogdGhpcy5wcm9wTmFtZSArIFwiWyBCT09MRUFOIF1cIixcbiAgICAgICAgICAgIHZhbHVlTGFiZWw6IEJvb2xlYW5TdGF0ZVByb3BlcnR5LkZBTFNFLmxhYmVsLFxuICAgICAgICAgICAgdmFsdWU6IEJvb2xlYW5TdGF0ZVByb3BlcnR5LkZBTFNFLnZhbHVlLFxuICAgICAgICAgICAgb3BlcmF0b3I6IFwiZXFcIixcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBnZXRTZXRUcnVlQ29tbWFuZCgpOiBTdGF0ZUNvbW1hbmQge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAga2luZDogXCJTVEFURV9NVVRBVEVfQ09NTUFORFwiLFxuICAgICAgICAgICAgdGFyZ2V0OiBcIlNUQVRFXCIsXG4gICAgICAgICAgICB0YXJnZXRJZDogXCJTVEFURVwiLFxuICAgICAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgICAgIG11dGF0aW9uOiB7IHByb3BOYW1lOiB0aGlzLnByb3BOYW1lLCBraW5kOiBcInNldC1udW1iZXJcIiwgdmFsdWU6IDEgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZ2V0U2V0RmFsc2VDb21tYW5kKCk6IFN0YXRlQ29tbWFuZCB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBraW5kOiBcIlNUQVRFX01VVEFURV9DT01NQU5EXCIsXG4gICAgICAgICAgICB0YXJnZXQ6IFwiU1RBVEVcIixcbiAgICAgICAgICAgIHRhcmdldElkOiBcIlNUQVRFXCIsXG4gICAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICAgICAgbXV0YXRpb246IHsgcHJvcE5hbWU6IHRoaXMucHJvcE5hbWUsIGtpbmQ6IFwic2V0LW51bWJlclwiLCB2YWx1ZTogMCB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm9wTmFtZTogUHJvcE5hbWUsIHByaXZhdGUgcmVhZG9ubHkgaW5pdGlhbFZhbHVlOiBib29sZWFuLCBkZXNjcmlwdGlvbjogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMucHJvcE5hbWUgPSBwcm9wTmFtZTtcbiAgICAgICAgY29uc3QgaW5pdGlhbCA9IGluaXRpYWxWYWx1ZSA/IDEgOiAwO1xuICAgICAgICBjb25zdCBwcm9wRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbiA/IGRlc2NyaXB0aW9uIDogXCJObyBkZXNjcmlwdGlvbiBnaXZlblwiO1xuICAgICAgICB0aGlzLnByb3BEZWZpbml0aW9uID0ge1xuICAgICAgICAgICAgcHJvcERlc2NyaXB0aW9uLFxuICAgICAgICAgICAgcHJvcE5hbWU6IHByb3BOYW1lLFxuICAgICAgICAgICAgaW5pdGlhbFZhbHVlOiBpbml0aWFsLFxuICAgICAgICAgICAgb3B0aW9uczogW1xuICAgICAgICAgICAgICAgIHsgdmFsdWU6IEJvb2xlYW5TdGF0ZVByb3BlcnR5LkZBTFNFLnZhbHVlLCB2YWx1ZUxhYmVsOiBCb29sZWFuU3RhdGVQcm9wZXJ0eS5GQUxTRS5sYWJlbCB9LFxuICAgICAgICAgICAgICAgIHsgdmFsdWU6IEJvb2xlYW5TdGF0ZVByb3BlcnR5LlRSVUUudmFsdWUsIHZhbHVlTGFiZWw6IEJvb2xlYW5TdGF0ZVByb3BlcnR5LlRSVUUubGFiZWwgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBfdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgfTtcbiAgICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7O0FDd0NPLElBQVU7QUFBQSxDQUFWLENBQVVBLGVBQVY7QUFDSSxFQUFNQSxXQUFBLGVBQWUsQ0FDeEIsV0FLQztBQUNELFVBQU0sRUFBRSxNQUFNLElBQUk7QUFDbEIsVUFBTSxZQUFZLE1BQU0sT0FBeUIsQ0FBQyxLQUFLLFNBQVM7QUFDNUQsVUFBSSxNQUFNLFFBQVEsS0FBSyxLQUFLLEdBQUc7QUFDM0IsWUFBSSxLQUFLLEdBQUcsS0FBSyxLQUFLO0FBQUEsTUFDMUI7QUFDQSxhQUFPO0FBQUEsSUFDWCxHQUFHLENBQUMsQ0FBQztBQUNMLFVBQU0sWUFBOEIsTUFBTSxPQUF5QixDQUFDLEtBQUssU0FBUztBQUM5RSxVQUFJLE1BQU0sUUFBUSxLQUFLLEtBQUssR0FBRztBQUMzQixZQUFJLEtBQUssR0FBRyxLQUFLLEtBQUs7QUFBQSxNQUMxQjtBQUNBLGFBQU87QUFBQSxJQUNYLEdBQUcsQ0FBQyxDQUFDO0FBRUwsV0FBTyxFQUFFLFdBQVcsV0FBVyxXQUFXLENBQUMsRUFBRTtBQUFBLEVBQ2pEO0FBQUEsR0F2QmE7OztBQ3ZDVixJQUFVO0FBQUEsQ0FBVixDQUFVQyxnQkFBVjtBQUNJLEVBQU1BLFlBQUEsTUFBTSxNQUFNLEtBQUssSUFBSTtBQUczQixF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QVUsS0FBSyxVQUFVLE1BQU0sY0FBYyxPQUFPLEVBQUU7QUFBQSxNQUN0RTtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQUEsRUFFQSxxQkFBbUM7QUFDL0IsV0FBTztBQUFBLE1BQ0gsTUFBTTtBQUFBLE1BQ04sUUFBUTtBQUFBLE1BQ1IsVUFBVTtBQUFBLE1BQ1YsU0FBUztBQUFBLFFBQ0wsVUFBVSxFQUFFLFVBQVUsS0FBSyxVQUFVLE1BQU0sY0FBYyxPQUFPLEVBQUU7QUFBQSxNQUN0RTtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBaUJKOyIsCiAgIm5hbWVzIjogWyJTY2hlbWFEdG8iLCAiRFRpbWVzdGFtcCIsICJEVXRpbCIsICJpc051bWJlciIsICJEQ3NzIiwgIkRTdHlsZSIsICJBbnN3ZXJlZFF1ZXN0aW9uIiwgIkNvbmRpdGlvbiIsICJjb25kaXRpb24iLCAiUnVsZSIsICJ0YWciLCAiREV2ZW50SGFuZGxlciIsICJkdG8iLCAiZHRvIiwgIlNjYWxlIiwgIlJlc3VsdCIsICJEU3RhdGUiXQp9Cg==
|
|
2245
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3B1YmxpYy1hcGkudHMiLCAiLi4vc3JjL2R0by9TY2hlbWFEdG8udHMiLCAiLi4vc3JjL2NvbW1vbi9EVGltZXN0YW1wLnRzIiwgIi4uL3NyYy91dGlscy9EVXRpbC50cyIsICIuLi9zcmMvRGVsZW1lbnQvY3NzLnRzIiwgIi4uL3NyYy9EZWxlbWVudC9EU3R5bGUudHMiLCAiLi4vc3JjL0RlbGVtZW50L1ZpZGVvQ29udGFpbmVyLnRzIiwgIi4uL3NyYy9EZWxlbWVudC9BdWRpb0NvbnRhaW5lci50cyIsICIuLi9zcmMvc2VydmljZXMvRE1lZGlhLW1hbmFnZXIudHMiLCAiLi4vc3JjL2NvbW1hbmRzL0RDb21tYW5kQnVzLnRzIiwgIi4uL3NyYy9ldmVudHMvZXZlbnQtYnVzLnRzIiwgIi4uL3NyYy9wbGF5ZXIvaGlzdG9yeS1xdWUudHMiLCAiLi4vc3JjL3J1bGVzL2NvbmRpdGlvbi50cyIsICIuLi9zcmMvcnVsZXMvcnVsZS50cyIsICIuLi9zcmMvcnVsZXMvcnVsZS1lbmdpbmUudHMiLCAiLi4vc3JjL3BsYXllci9uZXh0LXF1ZS50cyIsICIuLi9zcmMvcGxheWVyL2RwbGF5ZXIudHMiLCAiLi4vc3JjL2V2ZW50LWhhbmRsZXJzL0RFdmVudEhhbmRsZXIudHMiLCAiLi4vc3JjL0RlbGVtZW50L0RFbGVtZW50LnRzIiwgIi4uL3NyYy9EZWxlbWVudC9EZGl2LnRzIiwgIi4uL3NyYy9EZWxlbWVudC9ESW1nLnRzIiwgIi4uL3NyYy9EZWxlbWVudC9EVGV4dC50cyIsICIuLi9zcmMvZW5naW5lL2VsZW1lbnQtZmFjdG9yeS50cyIsICIuLi9zcmMvZW5naW5lL0RQYWdlLnRzIiwgIi4uL3NyYy9lbmdpbmUvc2NhbGUudHMiLCAiLi4vc3JjL3NlcnZpY2VzL3Jlc291cmNlLXByb3ZpZGVyLnRzIiwgIi4uL3NyYy9jb21tb24vcmVzdWx0LnRzIiwgIi4uL3NyYy9zdGF0ZS9Ec3RhdGUudHMiLCAiLi4vc3JjL3N0YXRlL3N0YXRlLXNlcnZpY2UudHMiLCAiLi4vc3JjL2VuZ2luZS9TY2hlbWFFbmdpbmUudHMiLCAiLi4vc3JjL3N0YXRlL2Jvb2xlYW4tcHJvcGVydHkudHMiLCAiLi4vc3JjL3V0aWxzL0lELnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJleHBvcnQgeyBTY2hlbWFFbmdpbmUgfSBmcm9tIFwiLi9lbmdpbmUvU2NoZW1hRW5naW5lXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kdG8vU2NoZW1hRHRvXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kdG8vQW5pbWF0aW9uRHRvXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kdG8vREVsZW1lbnQuZHRvXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9ldmVudC1oYW5kbGVycy9ERXZlbnRIYW5kbGVyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9jb21tYW5kcy9EQ29tbWFuZFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZXZlbnRzL0RFdmVudHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3J1bGVzL3J1bGVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3J1bGVzL2ZhY3RcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3J1bGVzL3J1bGUtZW5naW5lXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9ydWxlcy9jb25kaXRpb25cIjtcbmV4cG9ydCAqIGZyb20gXCIuL3N0YXRlL2Jvb2xlYW4tcHJvcGVydHlcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3N0YXRlL0RzdGF0ZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vRGVsZW1lbnQvRFN0eWxlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9EZWxlbWVudC9EQXV0by1wbGF5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9EZWxlbWVudC9jc3NcIjtcblxuZXhwb3J0ICogZnJvbSBcIi4vdXRpbHMvRFV0aWxcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3V0aWxzL0lEXCI7XG4iLCAiaW1wb3J0IHsgREF1dG9QbGF5U2VxdWVuY2UgfSBmcm9tIFwiLi4vRGVsZW1lbnQvREF1dG8tcGxheVwiO1xuaW1wb3J0IHsgREF1ZGlvRHRvLCBERWxlbWVudER0bywgREltZ0R0bywgRFZpZGVvRHRvIH0gZnJvbSBcIi4vREVsZW1lbnQuZHRvXCI7XG5pbXBvcnQgeyBSdWxlIH0gZnJvbSBcIi4uL3J1bGVzL3J1bGVcIjtcbmltcG9ydCB7IEZhY3QgfSBmcm9tIFwiLi4vcnVsZXMvZmFjdFwiO1xuaW1wb3J0IHsgUGFnZVF1ZUNvbW1hbmQgfSBmcm9tIFwiLi4vY29tbWFuZHMvRENvbW1hbmRcIjtcbmltcG9ydCB7IERTdGF0ZSB9IGZyb20gXCIuLi9zdGF0ZS9Ec3RhdGVcIjtcbmltcG9ydCB7IFBhZ2VJRCwgU2NoZW1hSUQgfSBmcm9tIFwiLi4vdXRpbHMvSURcIjtcblxuZXhwb3J0IHR5cGUgUGFnZVF1ZVJ1bGVzID0gUnVsZTxQYWdlUXVlQ29tbWFuZCwgbmV2ZXI+O1xuZXhwb3J0IGludGVyZmFjZSBQYWdlRHRvIHtcbiAgcmVhZG9ubHkgaWQ6IFBhZ2VJRDtcbiAgcmVhZG9ubHkgZWxlbWVudHM6IEFycmF5PERFbGVtZW50RHRvPjtcbiAgcmVhZG9ubHkgdGFncz86IHN0cmluZ1tdO1xuICByZWFkb25seSBtYWluVmlkZW9JZD86IHN0cmluZztcbiAgcmVhZG9ubHkgYmFja2dyb3VuZENvbG9yPzogc3RyaW5nO1xuICByZWFkb25seSB2aWRlbz86IEFycmF5PERWaWRlb0R0bz47XG4gIHJlYWRvbmx5IGF1ZGlvPzogQXJyYXk8REF1ZGlvRHRvPjtcbiAgcmVhZG9ubHkgYXV0b1BsYXlTZXF1ZW5jZT86IERBdXRvUGxheVNlcXVlbmNlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VTZXF1ZW5jZUR0byB7XG4gIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJ1bGVzOiBBcnJheTxQYWdlUXVlUnVsZXM+O1xuICByZWFkb25seSBwYWdlczogQXJyYXk8UGFnZUR0bz47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2NoZW1hRHRvIHtcbiAgcmVhZG9ubHkgaWQ6IFNjaGVtYUlEO1xuICByZWFkb25seSBiYXNlSGVpZ2h0OiBudW1iZXI7XG4gIHJlYWRvbmx5IGJhc2VXaWR0aDogbnVtYmVyO1xuICByZWFkb25seSBiYWNrZ3JvdW5kQ29sb3I6IHN0cmluZztcbiAgcmVhZG9ubHkgcGFnZXM6IFBhZ2VEdG9bXTtcbiAgcmVhZG9ubHkgcnVsZXM6IEFycmF5PFBhZ2VRdWVSdWxlcz47XG4gIHJlYWRvbmx5IHN0YXRlUHJvcHM/OiBSZWFkb25seUFycmF5PERTdGF0ZS5Qcm9wPjtcbiAgcmVhZG9ubHkgc3RhdGVRdWVyaWVzPzogUmVhZG9ubHlBcnJheTxEU3RhdGUuU3RhdGVRdWVyeT47XG4gIHJlYWRvbmx5IHN0YXRlRnJvbUV2ZW50OiBSZWFkb25seUFycmF5PERTdGF0ZS5mcm9tRXZlbnRIYW5kbGVyPjtcbiAgcmVhZG9ubHkgcGFnZVNlcXVlbmNlcz86IEFycmF5PFBhZ2VTZXF1ZW5jZUR0bz47XG4gIHJlYWRvbmx5IHByZWRlZmluZWRGYWN0cz86IFJlYWRvbmx5QXJyYXk8RmFjdD47XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgU2NoZW1hRHRvIHtcbiAgZXhwb3J0IGNvbnN0IGdldFJlc291cmNlcyA9IChcbiAgICBzY2hlbWE6IFNjaGVtYUR0byxcbiAgKToge1xuICAgIHZpZGVvTGlzdDogUmVhZG9ubHlBcnJheTxEVmlkZW9EdG8+O1xuICAgIGF1ZGlvTGlzdDogUmVhZG9ubHlBcnJheTxEQXVkaW9EdG8+O1xuICAgIGltYWdlTGlzdDogUmVhZG9ubHlBcnJheTxESW1nRHRvPjtcbiAgfSA9PiB7XG4gICAgY29uc3QgeyBwYWdlcyB9ID0gc2NoZW1hO1xuICAgIGNvbnN0IHZpZGVvTGlzdCA9IHBhZ2VzLnJlZHVjZTxBcnJheTxEVmlkZW9EdG8+PigoYWNjLCBjdXJyKSA9PiB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShjdXJyLnZpZGVvKSkge1xuICAgICAgICBhY2MucHVzaCguLi5jdXJyLnZpZGVvKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwgW10pO1xuICAgIGNvbnN0IGF1ZGlvTGlzdDogQXJyYXk8REF1ZGlvRHRvPiA9IHBhZ2VzLnJlZHVjZTxBcnJheTxEQXVkaW9EdG8+PigoYWNjLCBjdXJyKSA9PiB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShjdXJyLmF1ZGlvKSkge1xuICAgICAgICBhY2MucHVzaCguLi5jdXJyLmF1ZGlvKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwgW10pO1xuXG4gICAgcmV0dXJuIHsgdmlkZW9MaXN0LCBhdWRpb0xpc3QsIGltYWdlTGlzdDogW10gfTtcbiAgfTtcbn1cbiIsICJleHBvcnQgdHlwZSBEVGltZXN0YW1wID0gbnVtYmVyICYgeyBfX3RpbWVzdGFtcF9fOiB0cnVlIH07XG5leHBvcnQgbmFtZXNwYWNlIERUaW1lc3RhbXAge1xuICAgIGV4cG9ydCBjb25zdCBub3cgPSAoKSA9PiBEYXRlLm5vdygpIGFzIERUaW1lc3RhbXA7XG4gICAgZXhwb3J0IHR5cGUgRGlmZiA9IG51bWJlciAmIHsgX19kaWZmX186IHRydWUgfTtcblxuICAgIGV4cG9ydCBjb25zdCBhZGRNaWxscyA9ICh0OiBEVGltZXN0YW1wLCBtczogbnVtYmVyKTogRFRpbWVzdGFtcCA9PiB7XG4gICAgICAgIGNvbnN0IHJlcyA9IHQgKyBNYXRoLmFicyhtcyk7XG4gICAgICAgIHJldHVybiByZXMgYXMgRFRpbWVzdGFtcDtcbiAgICB9O1xuXG4gICAgZXhwb3J0IGNvbnN0IGRpZmYgPSAodDE6IERUaW1lc3RhbXAsIHQyOiBEVGltZXN0YW1wKTogRGlmZiA9PiB7XG4gICAgICAgIGNvbnN0IHQxQWJzID0gTWF0aC5hYnModDEpO1xuICAgICAgICBjb25zdCB0MkFicyA9IE1hdGguYWJzKHQyKTtcbiAgICAgICAgcmV0dXJuIE1hdGguYWJzKHQxQWJzIC0gdDJBYnMpIGFzIERpZmY7XG4gICAgfTtcblxuICAgIGV4cG9ydCBjb25zdCBkaWZmTm93ID0gKHQ6IERUaW1lc3RhbXApOiBEaWZmID0+IHtcbiAgICAgICAgcmV0dXJuIGRpZmYodCwgbm93KCkpO1xuICAgIH07XG59XG4iLCAiZXhwb3J0IHR5cGUgUmFuZG9tT2JqZWN0SWQgPSBzdHJpbmcgJiB7IHJhbmRvbU9iamVjdElkOiB0cnVlIH07XG5leHBvcnQgbmFtZXNwYWNlIERVdGlsIHtcbiAgICBleHBvcnQgY29uc3QgcmFuZG9tU3RyaW5nID0gKGxlbmd0aDogbnVtYmVyKTogc3RyaW5nID0+IHtcbiAgICAgICAgY29uc3QgbGV0dGVycyA9IFwiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnh5elwiO1xuICAgICAgICBjb25zdCB1cHBlcmNhc2UgPSBsZXR0ZXJzLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgIGNvbnN0IGFsbCA9IGxldHRlcnMgKyB1cHBlcmNhc2U7XG4gICAgICAgIGNvbnN0IGFicyA9IE1hdGguYWJzKGxlbmd0aCk7XG4gICAgICAgIGxldCByZXN1bHQgPSBcIlwiO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWJzOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNoYXIgPSBhbGwuY2hhckF0KE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGFsbC5sZW5ndGgpKTtcbiAgICAgICAgICAgIHJlc3VsdCArPSBjaGFyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICAgIGV4cG9ydCBjb25zdCByYW5kb21PYmplY3RJZCA9ICgpID0+IHJhbmRvbVN0cmluZygzMikgYXMgUmFuZG9tT2JqZWN0SWQ7XG5cbiAgICBleHBvcnQgY29uc3QgZGVsZXRlUHJvcCA9IDxPYmosIEtleSBleHRlbmRzIGtleW9mIE9iaj4ob2JqOiBPYmosIGtleTogS2V5KTogT21pdDxPYmosIEtleT4gPT4ge1xuICAgICAgICBkZWxldGUgb2JqW2tleV07XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfTtcblxuICAgIGV4cG9ydCBjb25zdCBpc0luUmFuZ2UgPSAobWluOiBudW1iZXIsIG1heDogbnVtYmVyKSA9PiB7XG4gICAgICAgIHJldHVybiAodmFsdWU6IG51bWJlcikgPT4gdmFsdWUgPj0gbWluICYmIHZhbHVlIDw9IG1heDtcbiAgICB9O1xuICAgIGV4cG9ydCBjb25zdCBpc0luZmluaXR5ID0gKG51bWJlcjogbnVtYmVyKSA9PiB7XG4gICAgICAgIHJldHVybiBudW1iZXIgPT09IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSB8fCBudW1iZXIgPT09IE51bWJlci5ORUdBVElWRV9JTkZJTklUWSB8fCBudW1iZXIgPT09IEluZmluaXR5O1xuICAgIH07XG4gICAgZXhwb3J0IHR5cGUgTm9uRW1wdHlBcnJheTxUPiA9IFtULCAuLi5UW11dO1xuICAgIGV4cG9ydCBjb25zdCBpc05vbkVtcHR5QXJyYXkgPSA8VD4oYXJyYXk6IEFycmF5PFQ+KTogYXJyYXkgaXMgTm9uRW1wdHlBcnJheTxUPiA9PiB7XG4gICAgICAgIHJldHVybiBhcnJheS5sZW5ndGggPiAwO1xuICAgIH07XG5cbiAgICBleHBvcnQgY29uc3QgbmV2ZXJDaGVjayA9IChhcmdzOiBuZXZlcikgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhcIk9PUFM6IFRoaXMgdmFsdWUgc2xpcHBlZCB0aHJvdWdoIHRoZSBuZXZlci1jaGVja1wiLCBhcmdzKTtcbiAgICB9O1xuXG4gICAgZXhwb3J0IGNvbnN0IGlzU3RyaW5nID0gKHN0cjogdW5rbm93bik6IHN0ciBpcyBzdHJpbmcgPT4gdHlwZW9mIHN0ciA9PT0gXCJzdHJpbmdcIjtcblxuICAgIGV4cG9ydCBjb25zdCBoYXNLZXkgPSA8VCBleHRlbmRzIHN0cmluZz4ob2JqOiB1bmtub3duLCBrZXk6IFQpOiBvYmogaXMgUmVjb3JkPHR5cGVvZiBrZXksIHVua25vd24+ID0+IHtcbiAgICAgICAgaWYgKCFpc1JlY29yZChvYmopKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSk7XG4gICAgfTtcblxuICAgIGV4cG9ydCBjb25zdCBpc1JlY29yZCA9IChvYmo6IHVua25vd24pOiBvYmogaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4ge1xuICAgICAgICBpZiAoIW9iaikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBvYmogIT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvYmogPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuXG4gICAgZXhwb3J0IGNvbnN0IGlzQm9vbCA9IChvYmo6IGJvb2xlYW4pOiBvYmogaXMgYm9vbGVhbiA9PiB0eXBlb2Ygb2JqID09PSBcImJvb2xlYW5cIjtcblxuICAgIGV4cG9ydCBjb25zdCBpc1RydWUgPSAoYm9vbDogYm9vbGVhbik6IGJvb2wgaXMgdHJ1ZSA9PiBib29sID09PSB0cnVlO1xuXG4gICAgZXhwb3J0IGNvbnN0IGlzRmFsc2UgPSAoYm9vbDogYm9vbGVhbik6IGJvb2wgaXMgZmFsc2UgPT4gYm9vbCA9PT0gZmFsc2U7XG5cbiAgICBleHBvcnQgY29uc3QgaXNEZWZpbmVkID0gKG9iajogdW5rbm93bik6IGJvb2xlYW4gPT4ge1xuICAgICAgICBjb25zdCBub3ROdWxsID0gb2JqICE9PSBudWxsO1xuICAgICAgICBjb25zdCBub3RVbmRlZmluZWQgPSBvYmogIT09IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIG5vdE51bGwgJiYgbm90VW5kZWZpbmVkO1xuICAgIH07XG5cbiAgICBleHBvcnQgY29uc3QgaGFzS2luZCA9IChvYmo6IHVua25vd24pOiBvYmogaXMgeyByZWFkb25seSBraW5kOiBzdHJpbmcgfSA9PiB7XG4gICAgICAgIGlmICghaGFzS2V5KG9iaiwgXCJraW5kXCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBvYmoua2luZCAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvYmoua2luZC5sZW5ndGggPiAwO1xuICAgIH07XG5cbiAgICBleHBvcnQgY29uc3QgaGFzVmFsdWUgPSAob2JqOiB1bmtub3duKTogb2JqIGlzIHsgdmFsdWU6IHVua25vd24gfSA9PiB7XG4gICAgICAgIHJldHVybiBoYXNLZXkob2JqLCBcInZhbHVlXCIpO1xuICAgIH07XG4gICAgZXhwb3J0IGNvbnN0IGlzTnVtYmVyID0gKHZhbHVlPzogbnVtYmVyKTogdmFsdWUgaXMgbnVtYmVyID0+IHtcbiAgICAgICAgY29uc3QgaXNOdW1iZXIgPSB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCI7XG4gICAgICAgIGNvbnN0IG5vdE5hTiA9ICFOdW1iZXIuaXNOYU4odmFsdWUpO1xuICAgICAgICByZXR1cm4gaXNOdW1iZXIgJiYgbm90TmFOO1xuICAgIH07XG5cbiAgICBleHBvcnQgY29uc3QgbWF4Rm4gPSAodXBwZXJMaW1pdDogbnVtYmVyKSA9PiB7XG4gICAgICAgIHJldHVybiAodmFsdWU6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGgubWluKHZhbHVlLCB1cHBlckxpbWl0KTtcbiAgICAgICAgfTtcbiAgICB9O1xuXG4gICAgZXhwb3J0IGNvbnN0IG1pbkZuID0gKGxvd2VyTGltaXQ6IG51bWJlcikgPT4ge1xuICAgICAgICByZXR1cm4gKHZhbHVlOiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLm1pbih2YWx1ZSwgbG93ZXJMaW1pdCk7XG4gICAgICAgIH07XG4gICAgfTtcbn1cbiIsICJpbXBvcnQgeyBEVXRpbCB9IGZyb20gXCIuLi91dGlscy9EVXRpbFwiO1xuXG5leHBvcnQgbmFtZXNwYWNlIERDc3Mge1xuICAgIGV4cG9ydCBpbnRlcmZhY2UgUHgge1xuICAgICAgICByZWFkb25seSBfdW5pdDogXCJweFwiO1xuICAgICAgICByZWFkb25seSB2YWx1ZTogbnVtYmVyO1xuICAgIH1cblxuICAgIGV4cG9ydCB0eXBlIExlbmd0aFN0cmluZyA9IGAke251bWJlcn1weGAgfCBgJHtudW1iZXJ9JWA7XG4gICAgZXhwb3J0IGludGVyZmFjZSBQZXJjZW50IHtcbiAgICAgICAgcmVhZG9ubHkgX3VuaXQ6IFwicGVyY2VudFwiO1xuICAgICAgICByZWFkb25seSB2YWx1ZTogbnVtYmVyO1xuICAgIH1cblxuICAgIGV4cG9ydCB0eXBlIExlbmd0aFVuaXQgPSBQeCB8IFBlcmNlbnQ7XG5cbiAgICAvKipcbiAgICAgKiBXaWxsIHNjYWxlIHRvIDMlIG9mIGJhc2VTY2FsZVxuICAgICAqIEBwYXJhbSB1bml0XG4gICAgICogQHBhcmFtIHNjYWxlXG4gICAgICovXG4gICAgZXhwb3J0IGNvbnN0IHRvU3RyaW5nID0gKHVuaXQ6IFJlYWRvbmx5PExlbmd0aFVuaXQ+LCBzY2FsZTogbnVtYmVyKTogTGVuZ3RoU3RyaW5nID0+IHtcbiAgICAgICAgY29uc3QgY2xhbXBlZFNjYWxlID0gTWF0aC5tYXgoc2NhbGUsIDAuMDMpO1xuICAgICAgICBpZiAodW5pdC5fdW5pdCA9PT0gXCJweFwiKSB7XG4gICAgICAgICAgICBpZiAodW5pdC52YWx1ZSA8IDAuMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcIjBweFwiO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCByb3VuZGVkID0gTWF0aC5yb3VuZCh1bml0LnZhbHVlICogY2xhbXBlZFNjYWxlKTtcbiAgICAgICAgICAgIGNvbnN0IGNsYW1wZWQgPSBNYXRoLm1heChyb3VuZGVkLCAxKTtcbiAgICAgICAgICAgIHJldHVybiAoY2xhbXBlZCArIFwicHhcIikgYXMgTGVuZ3RoU3RyaW5nO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAodW5pdC52YWx1ZSArIFwiJVwiKSBhcyBMZW5ndGhTdHJpbmc7XG4gICAgfTtcblxuICAgIGV4cG9ydCBjb25zdCBpc0xlbmd0aFVuaXQgPSAodW5pdD86IExlbmd0aFVuaXQpOiB1bml0IGlzIExlbmd0aFVuaXQgPT4ge1xuICAgICAgICBpZiAoIXVuaXQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1bml0S2V5OiBrZXlvZiBMZW5ndGhVbml0ID0gXCJfdW5pdFwiO1xuICAgICAgICBjb25zdCB2YWx1ZUtleToga2V5b2YgTGVuZ3RoVW5pdCA9IFwidmFsdWVcIjtcbiAgICAgICAgY29uc3QgaGFzVW5pdEtleSA9IERVdGlsLmhhc0tleSh1bml0LCB1bml0S2V5KTtcbiAgICAgICAgY29uc3QgaGFzVmFsdWVLZXkgPSBEVXRpbC5oYXNLZXkodW5pdCwgdmFsdWVLZXkpO1xuICAgICAgICByZXR1cm4gaGFzVW5pdEtleSAmJiBoYXNWYWx1ZUtleTtcbiAgICB9O1xufVxuIiwgImltcG9ydCB7IERDc3MgfSBmcm9tIFwiLi9jc3NcIjtcbmltcG9ydCB7IEVsZW1lbnRLZXlOYW1lcyB9IGZyb20gXCIuL0RTdHlsZS11dGlsc1wiO1xuaW1wb3J0IHsgRFV0aWwgfSBmcm9tIFwiLi4vdXRpbHMvRFV0aWxcIjtcblxudHlwZSBEU3R5bGUyID0gQ1NTU3R5bGVEZWNsYXJhdGlvbjtcbmV4cG9ydCBpbnRlcmZhY2UgRFN0eWxlIHtcbiAgICBvcGFjaXR5OiBudW1iZXI7XG4gICAgYmFja2dyb3VuZENvbG9yOiBzdHJpbmc7XG4gICAgdmlzaWJpbGl0eTogXCJ2aXNpYmxlXCIgfCBcImhpZGRlblwiO1xuICAgIGN1cnNvcjpcbiAgICAgICAgfCBcInBvaW50ZXJcIlxuICAgICAgICB8IFwiaGVscFwiXG4gICAgICAgIHwgXCJjb3B5XCJcbiAgICAgICAgfCBcIndhaXRcIlxuICAgICAgICB8IFwibm90LWFsbG93ZWRcIlxuICAgICAgICB8IFwiY29udGV4dC1tZW51XCJcbiAgICAgICAgfCBcIm1vdmVcIlxuICAgICAgICB8IFwiZ3JhYmJpbmdcIlxuICAgICAgICB8IFwiZ3JhYlwiXG4gICAgICAgIHwgXCJ6b29tLWluXCJcbiAgICAgICAgfCBcInpvb20tb3V0XCJcbiAgICAgICAgfCBcIm5vbmVcIlxuICAgICAgICB8IFwiYXV0b1wiXG4gICAgICAgIHwgXCJkZWZhdWx0XCI7XG5cbiAgICAvLyBQT1NJVElPTlxuICAgIGg6IG51bWJlcjtcbiAgICB3OiBudW1iZXI7XG4gICAgeDogbnVtYmVyO1xuICAgIHk6IG51bWJlcjtcblxuICAgIC8vIEJPUkRFUlNcbiAgICBib3JkZXJTdHlsZTogXCJzb2xpZFwiIHwgXCJub25lXCIgfCBcImRvdHRlZFwiIHwgXCJkYXNoZWRcIjtcbiAgICBib3JkZXJSYWRpdXM6IERDc3MuUHggfCBEQ3NzLlBlcmNlbnQ7XG4gICAgYm9yZGVyV2lkdGg6IERDc3MuUHg7XG4gICAgYm9yZGVyQ29sb3I6IHN0cmluZztcblxuICAgIG1hcmdpbjogRENzcy5QeCB8IERDc3MuUGVyY2VudDtcbiAgICBwYWRkaW5nOiBEQ3NzLlB4IHwgRENzcy5QZXJjZW50O1xuXG4gICAgLy8gVHJhbnNsYXRlXG4gICAgdHJhbnNmb3JtOiBzdHJpbmc7XG4gICAgdHJhbnNsYXRlOiBzdHJpbmc7XG5cbiAgICAvLyBURVhUXG4gICAgZm9udFNpemU6IERDc3MuUHg7XG4gICAgdGV4dENvbG9yOiBzdHJpbmc7XG4gICAgZm9udFdlaWdodDogMTAwIHwgMjAwIHwgMzAwIHwgNDAwIHwgNTAwIHwgNjAwIHwgNzAwIHwgODAwIHwgOTAwO1xuICAgIHRleHRBbGlnbjogXCJyaWdodFwiIHwgXCJsZWZ0XCIgfCBcImNlbnRlclwiO1xuICAgIGxldHRlclNwYWNpbmc6IERDc3MuUHg7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgRFN0eWxlIHtcbiAgICBleHBvcnQgY29uc3Qgbm9ybWFsaXplID0gPFQgZXh0ZW5kcyBIVE1MRWxlbWVudD4oZWw6IFQpOiBUID0+IHtcbiAgICAgICAgZWwuc3R5bGUucGFkZGluZyA9IFwiMFwiO1xuICAgICAgICBlbC5zdHlsZS5tYXJnaW4gPSBcIjBcIjtcbiAgICAgICAgZWwuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG4gICAgICAgIGVsLnN0eWxlLmJveFNpemluZyA9IFwiYm9yZGVyLWJveFwiO1xuICAgICAgICByZXR1cm4gZWw7XG4gICAgfTtcblxuICAgIGV4cG9ydCBjb25zdCBhcHBseVN0eWxlcyA9IDxUIGV4dGVuZHMgSFRNTEVsZW1lbnQ+KGVsOiBULCBzdHlsZTogUGFydGlhbDxEU3R5bGU+LCBzY2FsZTogbnVtYmVyKTogVCA9PiB7XG4gICAgICAgIC8vIGNvbnN0IHNjYWxlUHggPSBEQ3NzLnRvU3RyaW5nQ3JlKHRoaXMuc2NhbGUpO1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICB4LFxuICAgICAgICAgICAgeSxcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcixcbiAgICAgICAgICAgIGJvcmRlckNvbG9yLFxuICAgICAgICAgICAgYm9yZGVyV2lkdGgsXG4gICAgICAgICAgICBib3JkZXJSYWRpdXMsXG4gICAgICAgICAgICBib3JkZXJTdHlsZSxcbiAgICAgICAgICAgIHcsXG4gICAgICAgICAgICBvcGFjaXR5LFxuICAgICAgICAgICAgY3Vyc29yLFxuICAgICAgICAgICAgZm9udFNpemUsXG4gICAgICAgICAgICBmb250V2VpZ2h0LFxuICAgICAgICAgICAgdGV4dENvbG9yLFxuICAgICAgICAgICAgdGV4dEFsaWduLFxuICAgICAgICAgICAgdHJhbnNsYXRlLFxuICAgICAgICAgICAgbWFyZ2luLFxuICAgICAgICAgICAgcGFkZGluZyxcbiAgICAgICAgICAgIGxldHRlclNwYWNpbmcsXG4gICAgICAgICAgICBoLFxuICAgICAgICAgICAgdHJhbnNmb3JtLFxuICAgICAgICAgICAgdmlzaWJpbGl0eSxcbiAgICAgICAgfSA9IHN0eWxlO1xuXG4gICAgICAgIC8vIHRoaXMuZWwuc3R5bGUuZm9udFdlaWdodCA9ICc5MDAnO1xuICAgICAgICBpZiAoYmFja2dyb3VuZENvbG9yKSB7XG4gICAgICAgICAgICBlbC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBiYWNrZ3JvdW5kQ29sb3I7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY3Vyc29yKSB7XG4gICAgICAgICAgICBlbC5zdHlsZS5jdXJzb3IgPSBjdXJzb3I7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHJhbnNmb3JtKSB7XG4gICAgICAgICAgICBlbC5zdHlsZS50cmFuc2Zvcm0gPSB0cmFuc2Zvcm07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGV4dENvbG9yKSB7XG4gICAgICAgICAgICBlbC5zdHlsZS5jb2xvciA9IHRleHRDb2xvcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGV4dEFsaWduKSB7XG4gICAgICAgICAgICBlbC5zdHlsZS50ZXh0QWxpZ24gPSB0ZXh0QWxpZ247XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYm9yZGVyQ29sb3IpIHtcbiAgICAgICAgICAgIGVsLnN0eWxlLmJvcmRlckNvbG9yID0gYm9yZGVyQ29sb3I7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYm9yZGVyV2lkdGgpIHtcbiAgICAgICAgICAgIGVsLnN0eWxlLmJvcmRlcldpZHRoID0gRENzcy50b1N0cmluZyhib3JkZXJXaWR0aCwgc2NhbGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmb250V2VpZ2h0KSB7XG4gICAgICAgICAgICBlbC5zdHlsZS5mb250V2VpZ2h0ID0gZm9udFdlaWdodCArIFwiXCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJvcmRlclN0eWxlKSB7XG4gICAgICAgICAgICBlbC5zdHlsZS5ib3JkZXJTdHlsZSA9IGJvcmRlclN0eWxlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmb250U2l6ZSkge1xuICAgICAgICAgICAgZWwuc3R5bGUuZm9udFNpemUgPSBEQ3NzLnRvU3RyaW5nKGZvbnRTaXplLCBzY2FsZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoRFV0aWwuaXNOdW1iZXIoeCkpIHtcbiAgICAgICAgICAgIGVsLnN0eWxlLmxlZnQgPSB4ICsgXCIlXCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKERVdGlsLmlzTnVtYmVyKHkpKSB7XG4gICAgICAgICAgICBlbC5zdHlsZS5ib3R0b20gPSB5ICsgXCIlXCI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoRFV0aWwuaXNOdW1iZXIoaCkpIHtcbiAgICAgICAgICAgIGVsLnN0eWxlLmhlaWdodCA9IGggKyBcIiVcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoRFV0aWwuaXNOdW1iZXIodykpIHtcbiAgICAgICAgICAgIGVsLnN0eWxlLndpZHRoID0gdyArIFwiJVwiO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKERDc3MuaXNMZW5ndGhVbml0KGJvcmRlclJhZGl1cykpIHtcbiAgICAgICAgICAgIGVsLnN0eWxlLmJvcmRlclJhZGl1cyA9IERDc3MudG9TdHJpbmcoYm9yZGVyUmFkaXVzLCBzY2FsZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGV0dGVyU3BhY2luZykge1xuICAgICAgICAgICAgZWwuc3R5bGUubGV0dGVyU3BhY2luZyA9IERDc3MudG9TdHJpbmcobGV0dGVyU3BhY2luZywgc2NhbGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtYXJnaW4pIHtcbiAgICAgICAgICAgIGVsLnN0eWxlLm1hcmdpbiA9IERDc3MudG9TdHJpbmcobWFyZ2luLCBzY2FsZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhZGRpbmcpIHtcbiAgICAgICAgICAgIGVsLnN0eWxlLnBhZGRpbmcgPSBEQ3NzLnRvU3RyaW5nKHBhZGRpbmcsIHNjYWxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChEVXRpbC5pc051bWJlcihvcGFjaXR5KSkge1xuICAgICAgICAgICAgZWwuc3R5bGUub3BhY2l0eSA9IG9wYWNpdHkgKyBcIlwiO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZpc2liaWxpdHkpIHtcbiAgICAgICAgICAgIGVsLnN0eWxlLnZpc2liaWxpdHkgPSB2aXNpYmlsaXR5O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVsO1xuICAgIH07XG4gICAgLy8gY29uc3QgcHJvcE5hbWVzID0gbmV3IFNldCguLi5FbGVtZW50S2V5TmFtZXMpO1xuICAgIC8vIGV4cG9ydCBjb25zdCB2YWxpZEtleSA9IChrZXlOYW1lOiBzdHJpbmcpID0+IHByb3BOYW1lcy5oYXMoa2V5TmFtZSk7XG59XG4iLCAiaW1wb3J0IHsgRFZpZGVvRHRvIH0gZnJvbSBcIi4uL2R0by9ERWxlbWVudC5kdG9cIjtcbmltcG9ydCB7IERUaW1lc3RhbXAgfSBmcm9tIFwiLi4vY29tbW9uL0RUaW1lc3RhbXBcIjtcbmltcG9ydCB7IERFdmVudERpc3BhdGNoZXIgfSBmcm9tIFwiLi4vZXZlbnRzL2V2ZW50LWJ1c1wiO1xuaW1wb3J0IHsgU2NhbGVTZXJ2aWNlIH0gZnJvbSBcIi4uL2VuZ2luZS9zY2FsZVwiO1xuaW1wb3J0IHsgRFN0eWxlIH0gZnJvbSBcIi4vRFN0eWxlXCI7XG5pbXBvcnQgeyBEVXRpbCB9IGZyb20gXCIuLi91dGlscy9EVXRpbFwiO1xuXG5jb25zdCBBQk9SVF9QTEFZX1RPX0VORCA9IFwiQUJPUlRfUExBWV9UT19FTkRcIjtcbmV4cG9ydCBpbnRlcmZhY2UgQ2FuUGxheVRvRW5kIHtcbiAgICBwbGF5VG9FbmQoKTogUHJvbWlzZTxib29sZWFuPjtcbn1cblxuZXhwb3J0IGNsYXNzIFZpZGVvQ29udGFpbmVyIGltcGxlbWVudHMgQ2FuUGxheVRvRW5kIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IFRBRzogc3RyaW5nO1xuICAgIHByaXZhdGUgZHRvPzogRFZpZGVvRHRvO1xuICAgIHByaXZhdGUgZGVmYXVsdFN0eWxlczogUGFydGlhbDxEU3R5bGU+ID0geyBoOiA0NSwgdzogMTAwLCB2aXNpYmlsaXR5OiBcImhpZGRlblwiLCB5OiA1NSB9O1xuXG4gICAgcGF1c2UoKSB7XG4gICAgICAgIHRoaXMuZXZlbnRCdXMuZW1pdCh7XG4gICAgICAgICAgICBraW5kOiBcIlZJREVPX1BBVVNFRF9FVkVOVFwiLFxuICAgICAgICAgICAgZGF0YToge30sXG4gICAgICAgICAgICBwcm9kdWNlcjogXCJEVmlkZW9cIixcbiAgICAgICAgICAgIHByb2R1Y2VySWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICB0aW1lc3RhbXA6IERUaW1lc3RhbXAubm93KCksXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmVsLnBhdXNlKCk7XG4gICAgfVxuXG4gICAgcGxheSh1cmw6IHN0cmluZykge1xuICAgICAgICBpZiAodGhpcy5lbC5zcmMgIT09IHVybCkge1xuICAgICAgICAgICAgdGhpcy5lbC5zcmMgPSB1cmw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJvZHVjZXJJZCA9IHRoaXMuZHRvPy5pZCA/PyBcIkRWaWRlb1wiO1xuICAgICAgICB0aGlzLmV2ZW50QnVzLmVtaXQoe1xuICAgICAgICAgICAga2luZDogXCJWSURFT19QTEFZX0VWRU5UXCIsXG4gICAgICAgICAgICBkYXRhOiB7fSxcbiAgICAgICAgICAgIHByb2R1Y2VyOiBcIkRWaWRlb1wiLFxuICAgICAgICAgICAgcHJvZHVjZXJJZCxcbiAgICAgICAgICAgIHRpbWVzdGFtcDogRFRpbWVzdGFtcC5ub3coKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZWxcbiAgICAgICAgICAgIC5wbGF5KClcbiAgICAgICAgICAgIC50aGVuKChyZXMpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhyZXMpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaCgoZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIC8vIGlmKHRoaXMuZWwuc3JjICE9PSB1cmwpIHtcbiAgICAgICAgLy8gICAgIHRoaXMuXG4gICAgICAgIC8vIH1cbiAgICB9XG5cbiAgICBhc3luYyBwbGF5VG9FbmQoKSB7XG4gICAgICAgIHRoaXMuZWwudm9sdW1lID0gMTtcbiAgICAgICAgY29uc3QgdXJsID0gdGhpcy5kdG8/LnVybDtcbiAgICAgICAgaWYgKCF1cmwpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBlbmRlZE9yRXJyb3JlZCA9IG5ldyBQcm9taXNlPGJvb2xlYW4+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmVsLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgICAgICAgICAgIFwiZW5kZWRcIixcbiAgICAgICAgICAgICAgICAgICAgKF8pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgb25jZTogdHJ1ZSB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0aGlzLmVsLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgICAgICAgICAgIFwiZXJyb3JcIixcbiAgICAgICAgICAgICAgICAgICAgKF8pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7IG9uY2U6IHRydWUgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgdGhpcy5lbC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgICAgICAgICAgICBBQk9SVF9QTEFZX1RPX0VORCxcbiAgICAgICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJDQVRDSEVEIEFCQk9SVC5cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoXCJBYm9ydGVkXCIpO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7IG9uY2U6IHRydWUgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiUExBWVwiKTtcbiAgICAgICAgICAgIHRoaXMucGxheSh1cmwpO1xuICAgICAgICAgICAgYXdhaXQgZW5kZWRPckVycm9yZWQ7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coZSk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyh0aGlzLlRBRyArIFwiIGZpbmFsbHkgYmxvY2sgcGxheVRvRW5kKCkgY29tcGxldGVkIHZpZGVvSWQ6IFwiICsgdGhpcy5kdG8/LmlkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGVsOiBIVE1MVmlkZW9FbGVtZW50LFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGV2ZW50QnVzOiBERXZlbnREaXNwYXRjaGVyLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHNjYWxlOiBTY2FsZVNlcnZpY2UgLy8gZHRvPzogRFZpZGVvRHRvXG4gICAgKSB7XG4gICAgICAgIHRoaXMuVEFHID0gXCJbIERfVmlkZW8gXSA6IFwiO1xuICAgICAgICB0aGlzLmVsLmNvbnRyb2xzID0gZmFsc2U7XG4gICAgICAgIERTdHlsZS5ub3JtYWxpemUodGhpcy5lbCk7XG4gICAgICAgIERTdHlsZS5hcHBseVN0eWxlcyh0aGlzLmVsLCB0aGlzLmRlZmF1bHRTdHlsZXMsIHRoaXMuc2NhbGUuc2NhbGUpO1xuXG4gICAgICAgIHRoaXMuZWwub25lbmRlZCA9ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZXZlbnRCdXMuZW1pdCh7XG4gICAgICAgICAgICAgICAga2luZDogXCJWSURFT19FTkRFRF9FVkVOVFwiLFxuICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogRFRpbWVzdGFtcC5ub3coKSxcbiAgICAgICAgICAgICAgICBwcm9kdWNlcjogXCJEVmlkZW9cIixcbiAgICAgICAgICAgICAgICBwcm9kdWNlcklkOiB0aGlzLmlkLFxuICAgICAgICAgICAgICAgIGRhdGE6IHt9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZWwub25wbGF5ID0gKCkgPT4ge1xuICAgICAgICAgICAgLy8gVE9ETyBMT0dHIElOVEVSTkFMIFNUQVRFX0NIQU5HRVMuXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5lbC5vbnBhdXNlID0gKCkgPT4ge307XG4gICAgICAgIHRoaXMuZWwub25lcnJvciA9ICgpID0+IHt9O1xuICAgICAgICB0aGlzLmVsLm9uY2FucGxheSA9ICgpID0+IHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUuZ3JvdXBDb2xsYXBzZWQodGhpcy5UQUcgKyBcIlJFQURZIFRPIFBMQVlcIik7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkR1cmF0aW9uOiBcIiArIHRoaXMuZWwuZHVyYXRpb24pO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJJZDogXCIgKyB0aGlzLmlkKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiQ3VycmVudCBUaW1lOiBcIiArIHRoaXMuZWwuY3VycmVudFRpbWUpO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJBdWRvUGxheTogXCIgKyB0aGlzLmVsLmF1dG9wbGF5KTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5lbC5vbmxvYWRlZG1ldGFkYXRhID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZHVyYXRpb24gPSB0aGlzLmVsLmR1cmF0aW9uO1xuICAgICAgICAgICAgY29uc3QgaXNJbmZpbml0eSA9IERVdGlsLmlzSW5maW5pdHkoZHVyYXRpb24pO1xuICAgICAgICAgICAgdGhpcy5ldmVudEJ1cy5lbWl0KHtcbiAgICAgICAgICAgICAgICBraW5kOiBcIlZJREVPX0xPQURFRF9NRVRBREFUQV9FVkVOVFwiLFxuICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogRFRpbWVzdGFtcC5ub3coKSxcbiAgICAgICAgICAgICAgICBwcm9kdWNlcjogXCJEVmlkZW9cIixcbiAgICAgICAgICAgICAgICBwcm9kdWNlcklkOiB0aGlzLmlkLFxuICAgICAgICAgICAgICAgIGRhdGE6IHsgZHVyYXRpb24sIGlzSW5maW5pdHkgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICAvLyBUT0RPIFVTRSBUSElTIFNZTlRBWD9cbiAgICAgICAgdGhpcy5lbC5vbmR1cmF0aW9uY2hhbmdlID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZHVyYXRpb24gPSB0aGlzLmVsLmR1cmF0aW9uO1xuICAgICAgICAgICAgY29uc3QgaXNJbmZpbml0eSA9IERVdGlsLmlzSW5maW5pdHkoZHVyYXRpb24pO1xuICAgICAgICAgICAgdGhpcy5ldmVudEJ1cy5lbWl0KHtcbiAgICAgICAgICAgICAgICBraW5kOiBcIlZJREVPX0RVUkFUSU9OX0NIQU5HRV9FVkVOVFwiLFxuICAgICAgICAgICAgICAgIHByb2R1Y2VyOiBcIkRWaWRlb1wiLFxuICAgICAgICAgICAgICAgIHByb2R1Y2VySWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICAgICAgdGltZXN0YW1wOiBEVGltZXN0YW1wLm5vdygpLFxuICAgICAgICAgICAgICAgIGRhdGE6IHsgZHVyYXRpb24sIGlzSW5maW5pdHkgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGdldFN0YXRzKCkge1xuICAgICAgICBjb25zdCBkdXJhdGlvbiA9IHRoaXMuZWwuZHVyYXRpb247XG4gICAgICAgIGNvbnN0IGN1cnJlbnRUaW1lID0gdGhpcy5lbC5jdXJyZW50VGltZTtcbiAgICAgICAgY29uc3Qgdm9sdW1lID0gdGhpcy5lbC52b2x1bWU7XG4gICAgICAgIGNvbnN0IGlzQ29ubmVjdGVkID0gdGhpcy5lbC5pc0Nvbm5lY3RlZDtcbiAgICAgICAgY29uc3QgcGxheWJhY2tRdWFsaXR5ID0gdGhpcy5lbC5nZXRWaWRlb1BsYXliYWNrUXVhbGl0eSgpO1xuICAgICAgICBjb25zdCBkZWZhdWx0UGxheWJhY2tSYXRlID0gdGhpcy5lbC5kZWZhdWx0UGxheWJhY2tSYXRlO1xuICAgICAgICBjb25zdCBwYXVzZWQgPSB0aGlzLmVsLnBhdXNlZDtcbiAgICAgICAgY29uc3QgcGxheWVkID0gdGhpcy5lbC5wbGF5ZWQ7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGR1cmF0aW9uLFxuICAgICAgICAgICAgcGF1c2VkLFxuICAgICAgICAgICAgcGxheWVkLFxuICAgICAgICAgICAgY3VycmVudFRpbWUsXG4gICAgICAgICAgICB2b2x1bWUsXG4gICAgICAgICAgICBpc0Nvbm5lY3RlZCxcbiAgICAgICAgICAgIHBsYXliYWNrUXVhbGl0eSxcbiAgICAgICAgICAgIGRlZmF1bHRQbGF5YmFja1JhdGUsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgc2V0RHRvKGR0bzogRFZpZGVvRHRvKSB7XG4gICAgICAgIHRoaXMuZHRvID0gZHRvO1xuICAgICAgICB0aGlzLmVsLnZvbHVtZSA9IDE7XG4gICAgICAgIHRoaXMuc2V0U3R5bGUoZHRvLnN0eWxlKTtcbiAgICAgICAgdGhpcy5lbC5zcmMgPSBkdG8udXJsO1xuICAgICAgICB0aGlzLmVsLmxvYWQoKTtcbiAgICB9XG5cbiAgICBnZXRDdXJyZW50RHRvKCk6IERWaWRlb0R0byB8IGZhbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZHRvID8/IGZhbHNlO1xuICAgIH1cblxuICAgIHNldFN0eWxlKHN0eWxlczogUGFydGlhbDxEU3R5bGU+KSB7XG4gICAgICAgIERTdHlsZS5hcHBseVN0eWxlcyh0aGlzLmVsLCBzdHlsZXMsIHRoaXMuc2NhbGUuc2NhbGUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0IGlkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kdG8/LmlkID8/IFwiRFZpZGVvXCI7XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHt9XG59XG4iLCAiaW1wb3J0IHsgQ2FuUGxheVRvRW5kIH0gZnJvbSBcIi4vVmlkZW9Db250YWluZXJcIjtcbmltcG9ydCB7IERBdWRpb0R0byB9IGZyb20gXCIuLi9kdG8vREVsZW1lbnQuZHRvXCI7XG5pbXBvcnQgeyBERXZlbnREaXNwYXRjaGVyIH0gZnJvbSBcIi4uL2V2ZW50cy9ldmVudC1idXNcIjtcbmltcG9ydCB7IERUaW1lc3RhbXAgfSBmcm9tIFwiLi4vY29tbW9uL0RUaW1lc3RhbXBcIjtcblxuZXhwb3J0IGNsYXNzIEF1ZGlvQ29udGFpbmVyIGltcGxlbWVudHMgQ2FuUGxheVRvRW5kIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IFRBRyA9IFwiWyBEQXVkaW8gXTogXCI7XG4gICAgcHJvdGVjdGVkIGR0bzogREF1ZGlvRHRvIHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSBlbDogSFRNTEF1ZGlvRWxlbWVudDtcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGV2ZW50QnVzOiBERXZlbnREaXNwYXRjaGVyKSB7XG4gICAgICAgIHRoaXMuZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYXVkaW9cIik7XG4gICAgICAgIHRoaXMuZWwuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG4gICAgICAgIHRoaXMuZWwuc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XG4gICAgICAgIC8vIHRoaXMuZWwub25cbiAgICAgICAgdGhpcy5vbkxvYWQgPSB0aGlzLm9uTG9hZC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmVsLm9ubG9hZCA9IHRoaXMub25Mb2FkO1xuICAgICAgICB0aGlzLm9uTG9hZGVkTWV0YWRhdGEgPSB0aGlzLm9uTG9hZGVkTWV0YWRhdGEuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5lbC5vbmxvYWRlZG1ldGFkYXRhID0gdGhpcy5vbkxvYWRlZE1ldGFkYXRhO1xuICAgICAgICB0aGlzLmVsLm9ucGxheSA9ICgpID0+IHtcbiAgICAgICAgICAgIC8vIFRPRE9cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5vbkNhblBsYXlUaHJvdWdoID0gdGhpcy5vbkNhblBsYXlUaHJvdWdoLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuZWwub25jYW5wbGF5dGhyb3VnaCA9IHRoaXMub25DYW5QbGF5VGhyb3VnaDtcbiAgICAgICAgdGhpcy5lbC5vbmVuZGVkID0gKF8pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHVybCA9IHRoaXMuZWwuc3JjO1xuICAgICAgICAgICAgdGhpcy5ldmVudEJ1cy5lbWl0KHtcbiAgICAgICAgICAgICAgICBraW5kOiBcIkFVRElPX0VOREVEX0VWRU5UXCIsXG4gICAgICAgICAgICAgICAgZGF0YTogeyB1cmwgfSxcbiAgICAgICAgICAgICAgICBwcm9kdWNlcjogXCJEQXVkaW9cIixcbiAgICAgICAgICAgICAgICB0aW1lc3RhbXA6IERUaW1lc3RhbXAubm93KCksXG4gICAgICAgICAgICAgICAgcHJvZHVjZXJJZDogdGhpcy5pZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmVsLm9uZHVyYXRpb25jaGFuZ2UgPSAoXzogRXZlbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGR1cmF0aW9uID0gdGhpcy5lbC5kdXJhdGlvbjtcbiAgICAgICAgICAgIGNvbnN0IGlzSW5maW5pdHkgPSBkdXJhdGlvbiA9PT0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuICAgICAgICAgICAgdGhpcy5ldmVudEJ1cy5lbWl0KHtcbiAgICAgICAgICAgICAgICBraW5kOiBcIkFVRElPX0RVUkFUSU9OX0NIQU5HRV9FVkVOVFwiLFxuICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogRFRpbWVzdGFtcC5ub3coKSxcbiAgICAgICAgICAgICAgICBwcm9kdWNlcjogXCJEQXVkaW9cIixcbiAgICAgICAgICAgICAgICBwcm9kdWNlcklkOiB0aGlzLmlkLFxuICAgICAgICAgICAgICAgIGRhdGE6IHsgZHVyYXRpb246IHRoaXMuZWwuZHVyYXRpb24sIGlzSW5maW5pdHkgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHNldEF1ZGlvKGR0bzogREF1ZGlvRHRvKSB7XG4gICAgICAgIHRoaXMuZHRvID0gZHRvO1xuICAgICAgICB0aGlzLmVsLnNyYyA9IGR0by51cmw7XG4gICAgICAgIHRoaXMuZWwubG9hZCgpO1xuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLmVsLnBhdXNlKCk7XG4gICAgICAgICAgICB0aGlzLmVsLnNyYyA9IFwiXCI7XG4gICAgICAgICAgICB0aGlzLmVsLmxvYWQoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwYXVzZSgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuZWwucGF1c2UoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gVE9ETyBFTUlUIEVSUk9SIEVWRU5ULlxuICAgICAgICAgICAgY29uc29sZS5sb2coZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwbGF5KHVybDogc3RyaW5nKSB7XG4gICAgICAgIGlmICh0aGlzLmVsLnNyYyAhPT0gdXJsKSB7XG4gICAgICAgICAgICB0aGlzLmVsLnNyYyA9IHVybDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmV2ZW50QnVzLmVtaXQoe1xuICAgICAgICAgICAga2luZDogXCJBVURJT19QTEFZX0VWRU5UXCIsXG4gICAgICAgICAgICBwcm9kdWNlcklkOiB0aGlzLmlkLFxuICAgICAgICAgICAgZGF0YToge30sXG4gICAgICAgICAgICBwcm9kdWNlcjogXCJEQXVkaW9cIixcbiAgICAgICAgICAgIHRpbWVzdGFtcDogRFRpbWVzdGFtcC5ub3coKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZWxcbiAgICAgICAgICAgIC5wbGF5KClcbiAgICAgICAgICAgIC50aGVuKChyZXMpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhyZXMpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaCgoZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGUpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb25Mb2FkZWRNZXRhZGF0YShfOiBFdmVudCkge1xuICAgICAgICB0aGlzLmV2ZW50QnVzLmVtaXQoe1xuICAgICAgICAgICAga2luZDogXCJBVURJT19NRVRBREFUQV9MT0FERURfRVZFTlRcIixcbiAgICAgICAgICAgIHRpbWVzdGFtcDogRFRpbWVzdGFtcC5ub3coKSxcbiAgICAgICAgICAgIHByb2R1Y2VyOiBcIkRBdWRpb1wiLFxuICAgICAgICAgICAgcHJvZHVjZXJJZDogdGhpcy5pZCxcbiAgICAgICAgICAgIGRhdGE6IHt9LFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBvbkxvYWQoXzogRXZlbnQpIHtcbiAgICAgICAgdGhpcy5ldmVudEJ1cy5lbWl0KHtcbiAgICAgICAgICAgIGtpbmQ6IFwiQVVESU9fTE9BRF9FVkVOVFwiLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBEVGltZXN0YW1wLm5vdygpLFxuICAgICAgICAgICAgcHJvZHVjZXI6IFwiREF1ZGlvXCIsXG4gICAgICAgICAgICBwcm9kdWNlcklkOiB0aGlzLmlkLFxuICAgICAgICAgICAgZGF0YToge30sXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyh0aGlzLlRBRyArIGV2ZW50LnR5cGUpO1xuICAgIH1cblxuICAgIGdldCBpZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZHRvPy5pZCA/PyBcIkRBdWRpb1wiO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25DYW5QbGF5VGhyb3VnaChfOiBFdmVudCkge1xuICAgICAgICB0aGlzLmV2ZW50QnVzLmVtaXQoe1xuICAgICAgICAgICAga2luZDogXCJBVURJT19DQU5fUExBWV9USFJPVUdIX0VWRU5UXCIsXG4gICAgICAgICAgICBkYXRhOiB7fSxcbiAgICAgICAgICAgIHByb2R1Y2VyOiBcIkRBdWRpb1wiLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBEVGltZXN0YW1wLm5vdygpLFxuICAgICAgICAgICAgcHJvZHVjZXJJZDogdGhpcy5pZCxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gcHJpdmF0ZSBvblBsYXkoXzogRXZlbnQpIHt9XG5cbiAgICBhc3luYyBwbGF5VG9FbmQoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGNvbnN0IGVuZGVkT3JFcnJvcmVkID0gbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZWwuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICAgICAgICBcImVuZGVkXCIsXG4gICAgICAgICAgICAgICAgKF8pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coZSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7IG9uY2U6IHRydWUgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuZWwuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICAgICAgICBcImVycm9yXCIsXG4gICAgICAgICAgICAgICAgKF8pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coZSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgeyBvbmNlOiB0cnVlIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5wbGF5KHRoaXMuZWwuc3JjKTtcbiAgICAgICAgICAgIGF3YWl0IGVuZGVkT3JFcnJvcmVkO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIFRPRE8gTEVUIFBBUkVOVCBERUFMIFdJVEggRVJST1JTPyBUSEUgTUFOQUdFUj8/IE1BTkFHRVJTIENBTEwgQUJPUlQuXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlKTtcbiAgICAgICAgICAgIHRoaXMuZXZlbnRCdXMuZW1pdCh7XG4gICAgICAgICAgICAgICAga2luZDogXCJBVURJT19FUlJPUl9FVkVOVFwiLFxuICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogRFRpbWVzdGFtcC5ub3coKSxcbiAgICAgICAgICAgICAgICBwcm9kdWNlcjogXCJEQXVkaW9cIixcbiAgICAgICAgICAgICAgICBwcm9kdWNlcklkOiB0aGlzLmlkLFxuICAgICAgICAgICAgICAgIGRhdGE6IHsgZXJyb3I6IGUgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IFBhZ2VEdG8gfSBmcm9tIFwiLi4vZHRvL1NjaGVtYUR0b1wiO1xuaW1wb3J0IHsgVmlkZW9Db250YWluZXIgfSBmcm9tIFwiLi4vRGVsZW1lbnQvVmlkZW9Db250YWluZXJcIjtcbmltcG9ydCB7IEF1ZGlvQ29udGFpbmVyIH0gZnJvbSBcIi4uL0RlbGVtZW50L0F1ZGlvQ29udGFpbmVyXCI7XG5pbXBvcnQgeyBBdXRvUGxheUVsZW1lbnQsIERBdXRvUGxheVNlcXVlbmNlIH0gZnJvbSBcIi4uL0RlbGVtZW50L0RBdXRvLXBsYXlcIjtcbmltcG9ydCB7IERDb21tYW5kQnVzIH0gZnJvbSBcIi4uL2NvbW1hbmRzL0RDb21tYW5kQnVzXCI7XG5pbXBvcnQgeyBEQ29tbWFuZCB9IGZyb20gXCIuLi9jb21tYW5kcy9EQ29tbWFuZFwiO1xuaW1wb3J0IHsgRFRpbWVzdGFtcCB9IGZyb20gXCIuLi9jb21tb24vRFRpbWVzdGFtcFwiO1xuaW1wb3J0IHsgRXZlbnRCdXMgfSBmcm9tIFwiLi4vZXZlbnRzL2V2ZW50LWJ1c1wiO1xuaW1wb3J0IHsgU2NhbGVTZXJ2aWNlIH0gZnJvbSBcIi4uL2VuZ2luZS9zY2FsZVwiO1xuaW1wb3J0IHsgUmVzb3VyY2VQcm92aWRlciB9IGZyb20gXCIuL3Jlc291cmNlLXByb3ZpZGVyXCI7XG5pbXBvcnQgeyBBdXRvcGxheVRhc2ssIFNlcXVlbmNlTWFuYWdlciB9IGZyb20gXCIuL3NlcXVlbmNlLW1hbmFnZXJcIjtcblxuZXhwb3J0IGludGVyZmFjZSBJTWVkaWFNYW5hZ2VyIHtcbiAgc2V0UGFnZShwYWdlOiBQYWdlRHRvKTogdm9pZDtcbiAgZGVzdHJveSgpOiB2b2lkO1xufVxuXG5leHBvcnQgY2xhc3MgRE1lZGlhTWFuYWdlciBpbXBsZW1lbnRzIElNZWRpYU1hbmFnZXIge1xuICBwcml2YXRlIHN0YXRpYyBJTlNUQU5DRV9DT1VOVCA9IDA7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW5zdGFuY2VOdW1iZXI6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBUQUcgPSBcIlsgTUVESUFfTUFOQUdFUiBdIDogXCI7XG4gIHByaXZhdGUgcmVhZG9ubHkgdmlkZW9Db250YWluZXI6IFZpZGVvQ29udGFpbmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IGF1ZGlvQ29udGFpbmVyOiBBdWRpb0NvbnRhaW5lcjtcbiAgcHJpdmF0ZSBwYWdlRW50ZXI6IERUaW1lc3RhbXA7XG4gIHByaXZhdGUgc2luY2VQYWdlRW50ZXI6IERUaW1lc3RhbXAuRGlmZjtcbiAgcHJpdmF0ZSBjdXJyZW50UGFnZTogUGFnZUR0byB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IHVuc3Vic2NyaWJlQ29tbWFuZHM6ICgpID0+IHZvaWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgdGlja2VyUmVmOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2VxdWVuY2VNYW5hZ2VyOiBTZXF1ZW5jZU1hbmFnZXIgfCBmYWxzZSA9IGZhbHNlO1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGhvc3RFbDogSFRNTERpdkVsZW1lbnQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb21tYW5kQnVzOiBEQ29tbWFuZEJ1cyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGV2ZW50QnVzOiBFdmVudEJ1cyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlc291cmNlUHJvdmlkZXI6IFJlc291cmNlUHJvdmlkZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBzY2FsZTogU2NhbGVTZXJ2aWNlLFxuICApIHtcbiAgICBETWVkaWFNYW5hZ2VyLklOU1RBTkNFX0NPVU5UID0gRE1lZGlhTWFuYWdlci5JTlNUQU5DRV9DT1VOVCArIDE7XG4gICAgdGhpcy5pbnN0YW5jZU51bWJlciA9IERNZWRpYU1hbmFnZXIuSU5TVEFOQ0VfQ09VTlQ7XG4gICAgY29uc3QgdmlkZW9FbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ2aWRlb1wiKTtcbiAgICB0aGlzLmhvc3RFbC5hcHBlbmQodmlkZW9FbCk7XG4gICAgdGhpcy52aWRlb0NvbnRhaW5lciA9IG5ldyBWaWRlb0NvbnRhaW5lcih2aWRlb0VsLCBldmVudEJ1cywgdGhpcy5zY2FsZSk7XG4gICAgdGhpcy5hdWRpb0NvbnRhaW5lciA9IG5ldyBBdWRpb0NvbnRhaW5lcih0aGlzLmV2ZW50QnVzKTtcbiAgICB0aGlzLnRpY2sgPSB0aGlzLnRpY2suYmluZCh0aGlzKTtcbiAgICB0aGlzLnZpZGVvQ29udGFpbmVyLnNldFN0eWxlKHsgdmlzaWJpbGl0eTogXCJoaWRkZW5cIiB9KTtcbiAgICBjb25zdCBub3cgPSBEVGltZXN0YW1wLm5vdygpO1xuICAgIHRoaXMucGFnZUVudGVyID0gbm93O1xuICAgIHRoaXMuc2luY2VQYWdlRW50ZXIgPSBEVGltZXN0YW1wLmRpZmYobm93LCBub3cpO1xuICAgIHRoaXMudW5zdWJzY3JpYmVDb21tYW5kcyA9IHRoaXMuY29tbWFuZEJ1cy5zdWJzY3JpYmUoKGFjdGlvbikgPT4ge1xuICAgICAgdGhpcy5jb21tYW5kSGFuZGxlcihhY3Rpb24pO1xuICAgIH0sIHRoaXMuVEFHKTtcblxuICAgIHRoaXMudGlja2VyUmVmID0gd2luZG93LnNldEludGVydmFsKCgpID0+IHt9LCAxMDAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wIGFsbCBtZWRpYSB0aGF0IGlzIHBsYXlpbmdcbiAgICovXG4gIGNsZWFyQWxsTWVkaWEoKSB7XG4gICAgdGhpcy52aWRlb0NvbnRhaW5lci5wYXVzZSgpO1xuICAgIHRoaXMuYXVkaW9Db250YWluZXIucGF1c2UoKTtcbiAgfVxuICBkZXN0cm95KCkge1xuICAgIGNvbnNvbGUubG9nKFwiVE9ETyBERVNUUk9ZIEFMTCBNRURJQVwiKTtcbiAgICB0aGlzLnVuc3Vic2NyaWJlQ29tbWFuZHMoKTtcbiAgICAvLyBjb25zb2xlLmxvZyh0aGlzLnRpY2tlclJlZik7XG4gICAgd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy50aWNrZXJSZWYpO1xuICAgIHRoaXMuYXVkaW9Db250YWluZXIuZGVzdHJveSgpO1xuICAgIHRoaXMudmlkZW9Db250YWluZXIuZGVzdHJveSgpO1xuICB9XG5cbiAgc2V0UGFnZShwYWdlOiBQYWdlRHRvKSB7XG4gICAgLy8gVE9ETyBTVE9QIFZJREVPL0FVRElPIFRIQVQgTUlHSFQgQkUgUExBWUlORyBJTiBUSEUgRE9NPz9cbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gcGFnZTtcbiAgICB0aGlzLnZpZGVvQ29udGFpbmVyLnBhdXNlKCk7XG4gICAgdGhpcy5wYWdlRW50ZXIgPSBEVGltZXN0YW1wLm5vdygpO1xuICAgIC8vIFRPRE8gVEhpcyBtaWdodCBiZSBhIGJ1ZyBpZiBzb21lb25lXG5cbiAgICBjb25zdCBzZXEgPSBwYWdlLmF1dG9QbGF5U2VxdWVuY2U7XG4gICAgLy8gdGhpcy5zZXF1ZW5jZSA9IHNlcSA/IFsuLi5zZXEuaXRlbXNdIDogW107XG4gICAgY29uc3QgeyBtYWluVmlkZW9JZCwgYXVkaW8gfSA9IHBhZ2U7XG4gICAgY29uc3QgYXVkaW9FbGVtZW50cyA9IHBhZ2UuYXVkaW87XG5cbiAgICBpZiAobWFpblZpZGVvSWQpIHtcbiAgICAgIGNvbnN0IGR0byA9IHRoaXMucmVzb3VyY2VQcm92aWRlci5nZXRWaWRlb0J5SWQobWFpblZpZGVvSWQpO1xuICAgICAgaWYgKGR0bykge1xuICAgICAgICB0aGlzLnZpZGVvQ29udGFpbmVyLnNldER0byhkdG8pO1xuICAgICAgICB0aGlzLnZpZGVvQ29udGFpbmVyLnNldFN0eWxlKHsgLi4uZHRvLnN0eWxlLCB2aXNpYmlsaXR5OiBcInZpc2libGVcIiB9KTtcbiAgICAgIH1cbiAgICAgIC8vIHRoaXMudmlkZW9Db250YWluZXIucGxheVRvRW5kKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudmlkZW9Db250YWluZXIuc2V0U3R5bGUoeyB2aXNpYmlsaXR5OiBcImhpZGRlblwiIH0pO1xuICAgICAgLy8gSElERT9cbiAgICB9XG4gICAgaWYgKGF1ZGlvRWxlbWVudHMpIHtcbiAgICAgIGNvbnN0IGZpcnN0ID0gYXVkaW9FbGVtZW50c1swXTtcbiAgICAgIGlmIChmaXJzdCkge1xuICAgICAgICB0aGlzLmF1ZGlvQ29udGFpbmVyLnNldEF1ZGlvKGZpcnN0KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHNlcSkge1xuICAgICAgdGhpcy5wbGF5U2VxdWVuY2Uoc2VxKTtcbiAgICB9XG4gICAgLy8gY29uc3QgaGFzVmlkZW8gPVxuICB9XG5cbiAgcHJpdmF0ZSBjb21tYW5kSGFuZGxlcihjb21tYW5kOiBEQ29tbWFuZCkge1xuICAgIGlmIChjb21tYW5kLmtpbmQgPT09IFwiVklERU9fUExBWV9DT01NQU5EXCIpIHtcbiAgICAgIGNvbnN0IHZpZGVvID0gY29tbWFuZC50YXJnZXRJZDtcbiAgICAgIGNvbnN0IGR0byA9IHRoaXMudmlkZW9Db250YWluZXIuZ2V0Q3VycmVudER0bygpO1xuXG4gICAgICBpZiAoZHRvICYmIGR0by5pZCA9PT0gY29tbWFuZC50YXJnZXRJZCkge1xuICAgICAgICBjb25zb2xlLmxvZyh2aWRlbyk7XG4gICAgICAgIHRoaXMudmlkZW9Db250YWluZXIucGxheShkdG8udXJsKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNvbW1hbmQua2luZCA9PT0gXCJWSURFT19QQVVTRV9DT01NQU5EXCIpIHtcbiAgICAgIHRoaXMudmlkZW9Db250YWluZXIucGF1c2UoKTtcbiAgICB9XG4gICAgaWYgKGNvbW1hbmQua2luZCA9PT0gXCJBVURJT19QTEFZX0NPTU1BTkRcIikge1xuICAgICAgdGhpcy5hdWRpb0NvbnRhaW5lclxuICAgICAgICAucGxheVRvRW5kKClcbiAgICAgICAgLnRoZW4oKCkgPT4ge30pXG4gICAgICAgIC5jYXRjaCgpXG4gICAgICAgIC5maW5hbGx5KCgpID0+IHt9KTtcbiAgICB9XG5cbiAgICBpZiAoY29tbWFuZC5raW5kID09PSBcIkFVRElPX1BBVVNFX0NPTU1BTkRcIikge1xuICAgICAgLy8gdGhpcy5hdWRpb0NvbnRhaW5lci5cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHBsYXlTZXF1ZW5jZShzZXE6IERBdXRvUGxheVNlcXVlbmNlKSB7XG4gICAgLy8gY29uc29sZS5sb2codGhpcy5UQUcgKyBcIlNFUVVFTkNFIFNUQVJURUQgLS0gVE9ETyBFVkVOVCBGT1IgVEhJUz8/XCIpO1xuXG4gICAgY29uc3QgZWxlbWVudHMgPSBzZXEuaXRlbXM7XG4gICAgY29uc3QgdGVzdENsb25lID0gWy4uLmVsZW1lbnRzXTtcbiAgICBjb25zdCBmaXJzdCA9IHRlc3RDbG9uZS5wb3AoKTtcblxuICAgIGlmICghZmlyc3QpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3Qgbm93ID0gRFRpbWVzdGFtcC5ub3coKTtcbiAgICBzZXEuc3RhcnRDb21tYW5kcy5mb3JFYWNoKChjKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZyhjKTtcbiAgICAgIHRoaXMuY29tbWFuZEJ1cy5lbWl0KGMpO1xuICAgIH0pO1xuICAgIC8vIHRoaXMuY29tbWFuZEJ1cy5lbWl0KERTdGF0ZVByb3BzLm1lZGlhQmxvY2tlZEJ5U2VxdWVuY2Uuc2V0VHJ1ZUNvbW1hbmQpO1xuICAgIC8vIGlmIChzZXEuYmxvY2tVc2VySW5wdXQpIHtcbiAgICAvLyAgICAgdGhpcy5jb21tYW5kQnVzLmVtaXQoRFN0YXRlUHJvcHMuaW5wdXRCbG9ja2luZ0J5U2VxdWVuY2UuZ2V0U2V0VHJ1ZUNvbW1hbmQoKSk7XG4gICAgLy8gfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGl0ZW0gPSBlbGVtZW50c1tpXTtcbiAgICAgIGlmIChpdGVtLmtpbmQgPT09IFwiYXV0b3BsYXktdmlkZW9cIikge1xuICAgICAgICBjb25zdCBkdG8gPSB0aGlzLnJlc291cmNlUHJvdmlkZXIuZ2V0VmlkZW9CeUlkKGl0ZW0udmlkZW9JZCk7XG4gICAgICAgIGlmIChkdG8pIHRoaXMudmlkZW9Db250YWluZXIuc2V0RHRvKGR0byk7XG4gICAgICAgIGF3YWl0IHRoaXMudmlkZW9Db250YWluZXIucGxheVRvRW5kKCk7XG4gICAgICB9XG4gICAgICBpZiAoaXRlbS5raW5kID09PSBcImF1dG9wbGF5LWF1ZGlvXCIpIHtcbiAgICAgICAgY29uc29sZS5sb2coaXRlbSk7XG4gICAgICAgIGNvbnN0IGR0byA9IHRoaXMucmVzb3VyY2VQcm92aWRlci5nZXRBdWRpb0J5SWQoaXRlbS5hdWRpb0lkKTtcbiAgICAgICAgaWYgKGR0bykgdGhpcy5hdWRpb0NvbnRhaW5lci5zZXRBdWRpbyhkdG8pO1xuICAgICAgICBhd2FpdCB0aGlzLmF1ZGlvQ29udGFpbmVyLnBsYXlUb0VuZCgpO1xuICAgICAgfVxuICAgIH1cbiAgICBzZXEuZW5kQ29tbWFuZHMuZm9yRWFjaCgoYykgPT4ge1xuICAgICAgdGhpcy5jb21tYW5kQnVzLmVtaXQoYyk7XG4gICAgfSk7XG4gICAgLy8gdGhpcy5hY3Rpb25TZXJ2aWNlLmVtaXQoRFN0YXRlUHJvcHMubWVkaWFCbG9ja2VkQnlTZXF1ZW5jZS5zZXRGYWxzZUNvbW1hbmQpO1xuICAgIC8vIHRoaXMuYWN0aW9uU2VydmljZS5lbWl0KERTdGF0ZVByb3BzLmlucHV0QmxvY2tpbmdCeVNlcXVlbmNlLnNldEZhbHNlQ29tbWFuZCk7XG4gICAgY29uc29sZS5sb2codGhpcy5UQUcgKyBcIlNFUVVFTkNFIEVOREVEXCIpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gc2V0UGFnZSgpXG5cbiAgcHJpdmF0ZSB0aWNrKCkge1xuICAgIC8vIGNvbnNvbGUubG9nKHRoaXMudmlkZW8xLmdldFN0YXRzKCkpO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgRENvbW1hbmQgfSBmcm9tIFwiLi9EQ29tbWFuZFwiO1xuaW1wb3J0IHsgRFRpbWVzdGFtcCB9IGZyb20gXCIuLi9jb21tb24vRFRpbWVzdGFtcFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIERDb21tYW5kU3RvcmUge1xuICBzdWJzY3JpYmUoY2FsbGJhY2s6ICgpID0+IHZvaWQsIHN1YnNjcmliZXJJZDogc3RyaW5nKTogdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEQ29tbWFuZERpc3BhdGNoZXIge1xuICBlbWl0KGNvbW1hbmQ6IERDb21tYW5kKTogdm9pZDtcbn1cblxuaW50ZXJmYWNlIENvbW1hbmRTdWJzY3JpYmVyRGF0YSB7XG4gIHJlYWRvbmx5IHN1YnNjcmliZXJJZDogc3RyaW5nO1xuICByZWFkb25seSBjYWxsYmFjazogKGNvbW1hbmQ6IERDb21tYW5kKSA9PiB2b2lkO1xufVxuZXhwb3J0IGNsYXNzIERDb21tYW5kQnVzIGltcGxlbWVudHMgRENvbW1hbmRTdG9yZSwgRENvbW1hbmREaXNwYXRjaGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBUQUcgPSBcIlsgQ09NTUFORF9CVVMgXSBcIjtcbiAgbG9nQ29tbWFuZHMgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZWFkb25seSBjb21tYW5kTG9nOiBBcnJheTxEQ29tbWFuZCAmIHsgdGltZXN0YW1wOiBEVGltZXN0YW1wIH0+ID0gW107XG4gIHJlYWRvbmx5IHN1YnNjcmliZXJzID0gbmV3IFNldDxDb21tYW5kU3Vic2NyaWJlckRhdGE+KCk7XG4gIC8vIHJlYWRvbmx5IHN1YlxuXG4gIHN1YnNjcmliZShjYjogKGNvbW1hbmQ6IERDb21tYW5kKSA9PiB2b2lkLCBzdWJzY3JpYmVySWQ6IHN0cmluZykge1xuICAgIGNvbnN0IHN1YjogQ29tbWFuZFN1YnNjcmliZXJEYXRhID0ge1xuICAgICAgc3Vic2NyaWJlcklkLFxuICAgICAgY2FsbGJhY2s6IGNiLFxuICAgIH07XG5cbiAgICB0aGlzLnN1YnNjcmliZXJzLmFkZChzdWIpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICB0aGlzLnN1YnNjcmliZXJzLmRlbGV0ZShzdWIpO1xuICAgIH07XG4gIH1cblxuICBlbWl0KGNvbW1hbmQ6IERDb21tYW5kKSB7XG4gICAgY29uc3QgdGltZXN0YW1wID0gRFRpbWVzdGFtcC5ub3coKTtcbiAgICB0aGlzLmNvbW1hbmRMb2cucHVzaCh7IC4uLmNvbW1hbmQsIHRpbWVzdGFtcCB9KTtcbiAgICBpZiAodGhpcy5sb2dDb21tYW5kcykge1xuICAgICAgdGhpcy5sb2dDb21tYW5kKGNvbW1hbmQpO1xuICAgIH1cbiAgICB0aGlzLnN1YnNjcmliZXJzLmZvckVhY2goKHN1YnNjcmliZXIpID0+IHtcbiAgICAgIHN1YnNjcmliZXIuY2FsbGJhY2soY29tbWFuZCk7XG4gICAgfSk7XG4gIH1cblxuICBnZXRTdGF0cygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29tbWFuZHM6IFsuLi50aGlzLmNvbW1hbmRMb2ddLFxuICAgICAgc3Vic2NyaWJlcnM6IFsuLi50aGlzLnN1YnNjcmliZXJzXSxcbiAgICAgIHN1YnNjcmliZXJzQ291bnQ6IHRoaXMuc3Vic2NyaWJlcnMuc2l6ZSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBsb2dDb21tYW5kKGNvbW1hbmQ6IERDb21tYW5kKSB7XG4gICAgY29uc29sZS5ncm91cENvbGxhcHNlZCh0aGlzLlRBRyArIFwiIFwiICsgY29tbWFuZC5raW5kKTtcbiAgICBjb25zb2xlLmxvZyhcIlRhcmdldElEIDogXCIgKyBjb21tYW5kLnRhcmdldElkKTtcbiAgICBjb25zb2xlLmxvZyhjb21tYW5kLnBheWxvYWQpO1xuICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgfVxufVxuIiwgImltcG9ydCB7IERFdmVudCB9IGZyb20gXCIuL0RFdmVudHNcIjtcblxuaW50ZXJmYWNlIFN1YnNjcmliZXJEYXRhIHtcbiAgICByZWFkb25seSBzdWJzY3JpYmVySWQ6IHN0cmluZztcbiAgICByZWFkb25seSBjYjogKGV2ZW50OiBERXZlbnQpID0+IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgREV2ZW50U3RvcmUge1xuICAgIHN1YnNjcmliZShjYjogKGV2ZW50OiBERXZlbnQpID0+IHZvaWQsIHN1YnNjcmliZXJJZDogc3RyaW5nKTogdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBERXZlbnREaXNwYXRjaGVyIHtcbiAgICBlbWl0KGV2ZW50OiBERXZlbnQpOiB2b2lkO1xufVxuZXhwb3J0IGNsYXNzIEV2ZW50QnVzIGltcGxlbWVudHMgREV2ZW50U3RvcmUsIERFdmVudERpc3BhdGNoZXIge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgVEFHID0gXCJbICBFVkVOVF9CVVMgIF0gOlwiO1xuICAgIC8vIHByaXZhdGUgcmVhZG9ubHkgc3Vic2NyaWJlcnMgPSBuZXcgU2V0PChldmVudDogREV2ZW50KSA9PiB2b2lkPigpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgc3Vic2NyaWJlcnMgPSBuZXcgU2V0PFN1YnNjcmliZXJEYXRhPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdCBvbiBtb2R1bGUgZW5kLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBldmVudExvZzogREV2ZW50W10gPSBbXTtcbiAgICBjb25zb2xlTG9nRXZlbnRzID0gZmFsc2U7XG4gICAgLy8gcmVhZG9ubHkgc3ViXG5cbiAgICBzdWJzY3JpYmUoY2I6IChldmVudDogREV2ZW50KSA9PiB2b2lkLCBzdWJzY3JpYmVySWQ6IHN0cmluZykge1xuICAgICAgICAvLyB0aGlzLnN1YnNjcmliZXJzLmFkZChjYik7XG4gICAgICAgIGNvbnN0IHN1YnNjcmliZXJEYXRhOiBTdWJzY3JpYmVyRGF0YSA9IHtcbiAgICAgICAgICAgIHN1YnNjcmliZXJJZCxcbiAgICAgICAgICAgIGNiLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnN1YnNjcmliZXJzLmFkZChzdWJzY3JpYmVyRGF0YSk7XG4gICAgICAgIGlmICh0aGlzLmNvbnNvbGVMb2dFdmVudHMpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHRoaXMuVEFHICsgXCJzdWJzY3JpcHRpb24gYWRkZWQ6IFwiICsgc3Vic2NyaWJlcklkKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHRoaXMuVEFHICsgXCJzdWJzY3JpcHRpb24gY291bnQ6IFwiICsgdGhpcy5zdWJzY3JpYmVycy5zaXplKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuY29uc29sZUxvZ0V2ZW50cykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHRoaXMuVEFHICsgXCJzdWJzY3JpcHRpb24gcmVtb3ZlZDogXCIgKyBzdWJzY3JpYmVySWQpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHRoaXMuVEFHICsgXCJzdWJzY3JpcHRpb24gY291bnQgIDogXCIgKyB0aGlzLnN1YnNjcmliZXJzLnNpemUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gdGhpcy5zdWJzY3JpYmVycy5kZWxldGUoY2IpO1xuICAgICAgICAgICAgdGhpcy5zdWJzY3JpYmVycy5kZWxldGUoc3Vic2NyaWJlckRhdGEpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGdldFN0YXRzKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3Vic2NyaWJlcnNDb3VudDogdGhpcy5zdWJzY3JpYmVycy5zaXplLFxuICAgICAgICAgICAgZXZlbnRMb2c6IFsuLi50aGlzLmV2ZW50TG9nXSxcbiAgICAgICAgICAgIHN1YnNjcmliZXJzOiBbLi4udGhpcy5zdWJzY3JpYmVyc10sXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZW1pdChldmVudDogREV2ZW50KSB7XG4gICAgICAgIGlmICh0aGlzLmNvbnNvbGVMb2dFdmVudHMpIHtcbiAgICAgICAgICAgIHRoaXMubG9nRXZlbnQoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZXZlbnRMb2cucHVzaChldmVudCk7XG4gICAgICAgIHRoaXMuc3Vic2NyaWJlcnMuZm9yRWFjaCgoZGF0YSkgPT4ge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ0NBTExJTkcgRU1JVCcpO1xuICAgICAgICAgICAgZGF0YS5jYihldmVudCk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyB0aGlzLmxvZ0V2ZW50cygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgbG9nRXZlbnQoZXZlbnQ6IERFdmVudCkge1xuICAgICAgICBjb25zb2xlLmdyb3VwQ29sbGFwc2VkKHRoaXMuVEFHICsgXCIgXCIgKyBldmVudC5raW5kKTtcbiAgICAgICAgY29uc29sZS5sb2coXCJQcm9kdWNlcklkOiBcIiArIGV2ZW50LnByb2R1Y2VySWQpO1xuICAgICAgICBjb25zb2xlLmxvZyhldmVudC5kYXRhKTtcbiAgICAgICAgY29uc29sZS5ncm91cEVuZCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgbG9nRXZlbnRzKCkge1xuICAgICAgICBjb25zb2xlLmdyb3VwKHRoaXMuVEFHICsgXCJMT0dHXCIpO1xuICAgICAgICBjb25zb2xlLnRhYmxlKHRoaXMuZXZlbnRMb2cpO1xuICAgICAgICBjb25zb2xlLmdyb3VwRW5kKCk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IEZhY3QgfSBmcm9tIFwiLi4vcnVsZXMvZmFjdFwiO1xuaW1wb3J0IHsgRFRpbWVzdGFtcCB9IGZyb20gXCIuLi9jb21tb24vRFRpbWVzdGFtcFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFuc3dlcmVkUXVlc3Rpb24ge1xuICAgIHJlYWRvbmx5IHRpbWVzdGFtcDogRFRpbWVzdGFtcDtcbiAgICByZWFkb25seSBmYWN0OiBGYWN0O1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIEFuc3dlcmVkUXVlc3Rpb24ge1xuICAgIGV4cG9ydCBjb25zdCBlcSA9IChhOiBBbnN3ZXJlZFF1ZXN0aW9uLCBiOiBBbnN3ZXJlZFF1ZXN0aW9uKTogYm9vbGVhbiA9PiB7XG4gICAgICAgIHJldHVybiBhLmZhY3QgPT09IGIuZmFjdDtcbiAgICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VIaXN0b3J5IHtcbiAgICByZWFkb25seSBwYWdlSWQ6IHN0cmluZztcbiAgICByZWFkb25seSBhbnN3ZXJlZFF1ZXN0aW9uczogQW5zd2VyZWRRdWVzdGlvbltdO1xufVxuXG5leHBvcnQgY2xhc3MgSGlzdG9yeVF1ZSB7XG4gICAgcHJpdmF0ZSBoaXN0b3J5OiBQYWdlSGlzdG9yeVtdID0gW107XG5cbiAgICBnZXRGYWN0cygpOiBBcnJheTxGYWN0PiB7XG4gICAgICAgIGNvbnN0IGFuc3dlcnMgPSB0aGlzLmhpc3RvcnkubWFwKChoKSA9PiBoLmFuc3dlcmVkUXVlc3Rpb25zKS5mbGF0KDEpO1xuICAgICAgICBjb25zdCBmYWN0cyA9IGFuc3dlcnMubWFwKChhKSA9PiBhLmZhY3QpO1xuICAgICAgICAvLyBUT0RPIEZJTkQgTEFURVNUIEZBQ1QgKGFuc3dlcikgaWYgaGF2ZSBtdWx0aXBsZS5cbiAgICAgICAgcmV0dXJuIGZhY3RzO1xuICAgIH1cblxuICAgIGdldEFuc3dlcnMoKTogQXJyYXk8QW5zd2VyZWRRdWVzdGlvbj4ge1xuICAgICAgICBjb25zdCBhbnN3ZXJzID0gdGhpcy5oaXN0b3J5Lm1hcCgoaCkgPT4gaC5hbnN3ZXJlZFF1ZXN0aW9ucykuZmxhdCgxKTtcbiAgICAgICAgcmV0dXJuIGFuc3dlcnM7XG4gICAgfVxuXG4gICAgYWRkVG9IaXN0b3J5KHBhZ2U6IFBhZ2VIaXN0b3J5KSB7XG4gICAgICAgIHRoaXMuaGlzdG9yeS5wdXNoKHBhZ2UpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBGYWN0IH0gZnJvbSBcIi4vZmFjdFwiO1xuaW1wb3J0IHsgRFV0aWwgfSBmcm9tIFwiLi4vdXRpbHMvRFV0aWxcIjtcbmV4cG9ydCB0eXBlIENvbmRpdGlvbiA9IENvbmRpdGlvbi5TdHJpbmcgfCBDb25kaXRpb24uTnVtZXJpYyB8IENvbmRpdGlvbi5Db21wbGV4O1xuXG5leHBvcnQgbmFtZXNwYWNlIENvbmRpdGlvbiB7XG4gICAgZXhwb3J0IHR5cGUgU3RyaW5nT3BlcmF0b3IgPSBcImVxXCIgfCBcIm5vdC1lcVwiIHwgXCJsb25nZXItdGhlblwiIHwgXCJzaG9ydGVyLXRoZW5cIjtcblxuICAgIGV4cG9ydCB0eXBlIE51bWVyaWNPcGVyYXRvciA9XG4gICAgICAgIHwgXCJlcVwiXG4gICAgICAgIHwgXCJub3QtZXFcIlxuICAgICAgICB8IFwiZ3JlYXRlci10aGVuXCJcbiAgICAgICAgfCBcImxlc3MtdGhlblwiXG4gICAgICAgIHwgXCJncmVhdGVyLXRoZW4taW5jbHVzaXZlXCJcbiAgICAgICAgfCBcImxlc3MtdGhlbi1pbmNsdXNpdmVcIjtcblxuICAgIGV4cG9ydCBpbnRlcmZhY2UgTnVtZXJpYyB7XG4gICAgICAgIHJlYWRvbmx5IHJlZmVyZW5jZUlkOiBzdHJpbmc7XG4gICAgICAgIHJlYWRvbmx5IHJlZmVyZW5jZUxhYmVsOiBzdHJpbmc7XG4gICAgICAgIHJlYWRvbmx5IHZhbHVlTGFiZWw6IHN0cmluZztcbiAgICAgICAgcmVhZG9ubHkga2luZDogXCJudW1lcmljLWNvbmRpdGlvblwiO1xuICAgICAgICByZWFkb25seSBvcGVyYXRvcjogTnVtZXJpY09wZXJhdG9yO1xuICAgICAgICByZWFkb25seSB2YWx1ZTogbnVtYmVyO1xuICAgIH1cbiAgICBleHBvcnQgaW50ZXJmYWNlIFN0cmluZyB7XG4gICAgICAgIHJlYWRvbmx5IHJlZmVyZW5jZUlkOiBzdHJpbmc7XG4gICAgICAgIHJlYWRvbmx5IHJlZmVyZW5jZUxhYmVsOiBzdHJpbmc7XG4gICAgICAgIHJlYWRvbmx5IHZhbHVlTGFiZWw6IHN0cmluZztcbiAgICAgICAgcmVhZG9ubHkga2luZDogXCJzdHJpbmctY29uZGl0aW9uXCI7XG4gICAgICAgIHJlYWRvbmx5IG9wZXJhdG9yOiBTdHJpbmdPcGVyYXRvcjtcbiAgICAgICAgcmVhZG9ubHkgdmFsdWU6IHN0cmluZztcbiAgICB9XG5cbiAgICBleHBvcnQgaW50ZXJmYWNlIENvbXBsZXgge1xuICAgICAgICByZWFkb25seSBraW5kOiBcImNvbXBsZXgtY29uZGl0aW9uXCI7XG4gICAgICAgIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgICAgICAgcmVhZG9ubHkgYWxsOiBSZWFkb25seUFycmF5PENvbmRpdGlvbi5TaW1wbGU+O1xuICAgICAgICByZWFkb25seSBzb21lOiBSZWFkb25seUFycmF5PENvbmRpdGlvbi5TaW1wbGU+O1xuICAgIH1cblxuICAgIGV4cG9ydCB0eXBlIFNpbXBsZSA9IENvbmRpdGlvbi5TdHJpbmcgfCBDb25kaXRpb24uTnVtZXJpYztcblxuICAgIC8qKlxuICAgICAqIEFuIGVtcHR5IGNvbmRpdGlvbiB3aWxsIGV2YWx1YXRlIHRvIGZhbHNlLFxuICAgICAqIEBwYXJhbSBjb25kaXRpb246IENvbmRpdGlvbi5BbnlcbiAgICAgKiBAcGFyYW0gZmFjdHNcbiAgICAgKi9cbiAgICBleHBvcnQgY29uc3QgZXZhbHVhdGUgPSAoY29uZGl0aW9uOiBDb25kaXRpb24sIGZhY3RzOiBSZWFkb25seUFycmF5PEZhY3Q+KSA9PiB7XG4gICAgICAgIGxldCByZXN1bHQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICAgICAgc3dpdGNoIChjb25kaXRpb24ua2luZCkge1xuICAgICAgICAgICAgY2FzZSBcInN0cmluZy1jb25kaXRpb25cIjpcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBldmFsdWF0ZVNpbXBsZShjb25kaXRpb24sIGZhY3RzKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJudW1lcmljLWNvbmRpdGlvblwiOlxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGV2YWx1YXRlU2ltcGxlKGNvbmRpdGlvbiwgZmFjdHMpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcImNvbXBsZXgtY29uZGl0aW9uXCI6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gZXZhbHVhdGVDb21wbGV4KGNvbmRpdGlvbiwgZmFjdHMpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBjb25zdCBjaGVjazogbmV2ZXIgPSBjb25kaXRpb247XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgY29uc3QgZXZhbHVhdGVDb21wbGV4ID0gKGNvbmRpdGlvbjogQ29uZGl0aW9uLkNvbXBsZXgsIGZhY3RzOiBSZWFkb25seUFycmF5PEZhY3Q+KTogYm9vbGVhbiA9PiB7XG4gICAgICAgIGlmIChjb25kaXRpb24uc29tZS5sZW5ndGggPT09IDAgJiYgY29uZGl0aW9uLmFsbC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhbGxTb2x2ZWQgPSBjb25kaXRpb24uYWxsLm1hcCgoY29uZGl0aW9uKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZXZhbHVhdGVTaW1wbGUoY29uZGl0aW9uLCBmYWN0cyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHNvbWVFdmFsdWF0ZWQgPSBjb25kaXRpb24uc29tZS5tYXAoKGNvbmRpdGlvbikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGV2YWx1YXRlU2ltcGxlKGNvbmRpdGlvbiwgZmFjdHMpO1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgYWxsUmVzdWx0ID0gYWxsU29sdmVkLmV2ZXJ5KERVdGlsLmlzVHJ1ZSk7XG4gICAgICAgIGNvbnN0IHNvbWVSZXN1bHQgPSBzb21lRXZhbHVhdGVkLmxlbmd0aCA9PT0gMCB8fCBzb21lRXZhbHVhdGVkLnNvbWUoRFV0aWwuaXNUcnVlKTtcbiAgICAgICAgcmV0dXJuIHNvbWVSZXN1bHQgJiYgYWxsUmVzdWx0O1xuICAgIH07XG5cbiAgICBjb25zdCBldmFsdWF0ZVNpbXBsZSA9IChjb25kaXRpb246IENvbmRpdGlvbi5TaW1wbGUsIGZhY3RzOiBSZWFkb25seUFycmF5PEZhY3Q+KTogYm9vbGVhbiA9PiB7XG4gICAgICAgIGNvbnN0IGZhY3QgPSBmYWN0cy5maW5kKChmKSA9PiBmLnJlZmVyZW5jZUlkID09PSBjb25kaXRpb24ucmVmZXJlbmNlSWQpO1xuICAgICAgICBpZiAoIWZhY3QpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVzID0gZmFsc2U7XG4gICAgICAgIHN3aXRjaCAoY29uZGl0aW9uLmtpbmQpIHtcbiAgICAgICAgICAgIGNhc2UgXCJudW1lcmljLWNvbmRpdGlvblwiOlxuICAgICAgICAgICAgICAgIGlmIChmYWN0LmtpbmQgPT09IFwibnVtZXJpYy1mYWN0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzID0gZXZhbHVhdGVOdW1lcmljKGNvbmRpdGlvbiwgZmFjdC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcInN0cmluZy1jb25kaXRpb25cIjpcbiAgICAgICAgICAgICAgICBpZiAoZmFjdC5raW5kID09PSBcInN0cmluZy1mYWN0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzID0gZXZhbHVhdGVTdHJpbmcoY29uZGl0aW9uLCBmYWN0LnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGNvbnN0IGNoZWNrOiBuZXZlciA9IGNvbmRpdGlvbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH07XG5cbiAgICBleHBvcnQgY29uc3QgaXNFbXB0eSA9IChjb21wbGV4OiBDb21wbGV4KSA9PiB7XG4gICAgICAgIHJldHVybiBjb21wbGV4LmFsbC5sZW5ndGggPT09IDAgJiYgY29tcGxleC5zb21lLmxlbmd0aCA9PT0gMDtcbiAgICB9O1xuXG4gICAgY29uc3QgZXZhbHVhdGVTdHJpbmcgPSAoY29uZGl0aW9uOiBSZWFkb25seTxDb25kaXRpb24uU3RyaW5nPiwgdmFsdWU6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICAgICAgICBjb25zdCBvcGVyYXRvciA9IGNvbmRpdGlvbi5vcGVyYXRvcjtcbiAgICAgICAgbGV0IHJlc3VsdCA9IGZhbHNlO1xuICAgICAgICBzd2l0Y2ggKG9wZXJhdG9yKSB7XG4gICAgICAgICAgICBjYXNlIFwiZXFcIjpcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBjb25kaXRpb24udmFsdWUgPT09IHZhbHVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIm5vdC1lcVwiOlxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNvbmRpdGlvbi52YWx1ZSAhPT0gdmFsdWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwic2hvcnRlci10aGVuXCI6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gY29uZGl0aW9uLnZhbHVlICE9PSB2YWx1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJsb25nZXItdGhlblwiOlxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNvbmRpdGlvbi52YWx1ZSAhPT0gdmFsdWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGNvbnN0IGNoZWNrOiBuZXZlciA9IG9wZXJhdG9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICAgIGNvbnN0IGV2YWx1YXRlTnVtZXJpYyA9IChjb25kaXRpb246IE51bWVyaWMsIHZhbHVlOiBudW1iZXIpOiBib29sZWFuID0+IHtcbiAgICAgICAgY29uc3Qgb3AgPSBjb25kaXRpb24ub3BlcmF0b3I7XG4gICAgICAgIGNvbnN0IGNvbmRpdGlvblZhbHVlID0gY29uZGl0aW9uLnZhbHVlO1xuICAgICAgICBsZXQgcmVzdWx0ID0gZmFsc2U7XG4gICAgICAgIHN3aXRjaCAob3ApIHtcbiAgICAgICAgICAgIGNhc2UgXCJlcVwiOlxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHZhbHVlID09PSBjb25kaXRpb25WYWx1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJub3QtZXFcIjpcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB2YWx1ZSAhPT0gY29uZGl0aW9uVmFsdWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiZ3JlYXRlci10aGVuXCI6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWUgPiBjb25kaXRpb25WYWx1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJncmVhdGVyLXRoZW4taW5jbHVzaXZlXCI6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWUgPj0gY29uZGl0aW9uVmFsdWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwibGVzcy10aGVuXCI6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWUgPCBjb25kaXRpb25WYWx1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJsZXNzLXRoZW4taW5jbHVzaXZlXCI6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWUgPD0gY29uZGl0aW9uVmFsdWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGNvbnN0IGNoZWNrOiBuZXZlciA9IG9wO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICAgIGNvbnN0IF9nZXRBbGxTaW1wbGUgPSAoY29uZGl0aW9uOiBDb25kaXRpb24pOiBSZWFkb25seUFycmF5PENvbmRpdGlvbi5TaW1wbGU+ID0+IHtcbiAgICAgICAgY29uc3Qgc2ltcGxlOiBBcnJheTxDb25kaXRpb24uU2ltcGxlPiA9IFtdO1xuICAgICAgICBzd2l0Y2ggKGNvbmRpdGlvbi5raW5kKSB7XG4gICAgICAgICAgICBjYXNlIFwiY29tcGxleC1jb25kaXRpb25cIjpcbiAgICAgICAgICAgICAgICBzaW1wbGUucHVzaCguLi5jb25kaXRpb24uYWxsKTtcbiAgICAgICAgICAgICAgICBzaW1wbGUucHVzaCguLi5jb25kaXRpb24uc29tZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwibnVtZXJpYy1jb25kaXRpb25cIjpcbiAgICAgICAgICAgICAgICBzaW1wbGUucHVzaChjb25kaXRpb24pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcInN0cmluZy1jb25kaXRpb25cIjpcbiAgICAgICAgICAgICAgICBzaW1wbGUucHVzaChjb25kaXRpb24pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBEVXRpbC5uZXZlckNoZWNrKGNvbmRpdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNpbXBsZTtcbiAgICB9O1xuXG4gICAgZXhwb3J0IGNvbnN0IGdldEFsbFNpbXBsZUNvbmRpdGlvbnMgPSAoXG4gICAgICAgIGNvbmRpdGlvbjogQ29uZGl0aW9uIHwgQXJyYXk8Q29uZGl0aW9uPlxuICAgICk6IFJlYWRvbmx5QXJyYXk8Q29uZGl0aW9uLlNpbXBsZT4gPT4ge1xuICAgICAgICBjb25zdCBzaW1wbGU6IEFycmF5PENvbmRpdGlvbi5TaW1wbGU+ID0gW107XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvbmRpdGlvbikpIHtcbiAgICAgICAgICAgIGNvbmRpdGlvbi5mb3JFYWNoKChjKSA9PiB7XG4gICAgICAgICAgICAgICAgc2ltcGxlLnB1c2goLi4uX2dldEFsbFNpbXBsZShjKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNpbXBsZS5wdXNoKC4uLl9nZXRBbGxTaW1wbGUoY29uZGl0aW9uKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNpbXBsZTtcbiAgICB9O1xufVxuIiwgImltcG9ydCB7IENvbmRpdGlvbiB9IGZyb20gXCIuL2NvbmRpdGlvblwiO1xuaW1wb3J0IHsgRmFjdCB9IGZyb20gXCIuL2ZhY3RcIjtcbmltcG9ydCB7IERVdGlsIH0gZnJvbSBcIi4uL3V0aWxzL0RVdGlsXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUnVsZTxPblN1Y2Nlc3NBY3Rpb24sIE9uRmFpbHVyZUFjdGlvbj4ge1xuICByZWFkb25seSBpZD86IHN0cmluZztcbiAgcmVhZG9ubHkgZGVzY3JpcHRpb246IHN0cmluZztcbiAgcmVhZG9ubHkgYWxsOiBSZWFkb25seUFycmF5PENvbmRpdGlvbj47XG4gIHJlYWRvbmx5IHNvbWU6IFJlYWRvbmx5QXJyYXk8Q29uZGl0aW9uPjtcbiAgcmVhZG9ubHkgb25TdWNjZXNzOiBSZWFkb25seUFycmF5PE9uU3VjY2Vzc0FjdGlvbj47XG4gIHJlYWRvbmx5IG9uRmFpbHVyZTogUmVhZG9ubHlBcnJheTxPbkZhaWx1cmVBY3Rpb24+O1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIFJ1bGUge1xuICAvKipcbiAgICogVmFsaWRhdGVzIHRoYXQgdGhlIHJ1bGUgaXMgdmFsaWQuXG4gICAqIEBwYXJhbSBydWxlXG4gICAqL1xuXG4gIGV4cG9ydCBjb25zdCBpc0VtcHR5ID0gKHJ1bGU6IFJ1bGU8YW55LCBhbnk+KTogYm9vbGVhbiA9PiB7XG4gICAgY29uc3QgZW1wdHlDb25kaXRpb25zID0gcnVsZS5hbGwubGVuZ3RoID09PSAwICYmIHJ1bGUuc29tZS5sZW5ndGggPT09IDA7XG4gICAgY29uc3QgZW1wdHlBY3Rpb25zID0gcnVsZS5vblN1Y2Nlc3MubGVuZ3RoID09PSAwICYmIHJ1bGUub25GYWlsdXJlLmxlbmd0aCA9PT0gMDtcbiAgICByZXR1cm4gZW1wdHlDb25kaXRpb25zIHx8IGVtcHR5QWN0aW9ucztcbiAgfTtcblxuICBleHBvcnQgY29uc3Qgc29sdmUgPSAocnVsZTogUnVsZTxhbnksIGFueT4sIGZhY3RzOiBSZWFkb25seUFycmF5PEZhY3Q+KTogYm9vbGVhbiA9PiB7XG4gICAgaWYgKHJ1bGUuc29tZS5sZW5ndGggPT09IDAgJiYgcnVsZS5hbGwubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyBUT0RPIFJFVFVSTiBXQVJOSU5HPyBPUiBMT0dHSU5HID9cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBzb21lU29sdmVkID0gcnVsZS5zb21lLm1hcCgoY29uZGl0aW9uKSA9PiBDb25kaXRpb24uZXZhbHVhdGUoY29uZGl0aW9uLCBmYWN0cykpO1xuXG4gICAgY29uc3Qgc29tZVJlc3VsdCA9IHNvbWVTb2x2ZWQubGVuZ3RoID09PSAwIHx8IHNvbWVTb2x2ZWQuc29tZShEVXRpbC5pc1RydWUpO1xuXG4gICAgY29uc3QgYWxsU29sdmVkID0gcnVsZS5hbGwubWFwKChjb25kaXRpb24pID0+IENvbmRpdGlvbi5ldmFsdWF0ZShjb25kaXRpb24sIGZhY3RzKSkuZXZlcnkoRFV0aWwuaXNUcnVlKTtcblxuICAgIHJldHVybiBhbGxTb2x2ZWQgJiYgc29tZVJlc3VsdDtcbiAgfTtcbn1cbiIsICJpbXBvcnQgeyBGYWN0IH0gZnJvbSBcIi4vZmFjdFwiO1xuaW1wb3J0IHsgUnVsZSB9IGZyb20gXCIuL3J1bGVcIjtcblxuZXhwb3J0IGludGVyZmFjZSBTb2x2ZVJlc3VsdDxTLCBGPiB7XG4gIG1hdGNoaW5nOiBSZWFkb25seUFycmF5PE1hdGNoPFMsIEY+PjtcbiAgZXJyb3JzOiBSZWFkb25seUFycmF5PFJ1bGVFbmdpbmVFcnJvcj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWF0Y2g8UywgRj4ge1xuICByZWFkb25seSBtYXRjaGluZ1J1bGVJZDogc3RyaW5nO1xuICByZWFkb25seSBydWxlRGVzY3JpcHRpb246IHN0cmluZztcbiAgcmVhZG9ubHkgYWN0aW9uTGlzdDogUmVhZG9ubHlBcnJheTxTPiB8IFJlYWRvbmx5QXJyYXk8Rj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUnVsZUVuZ2luZUVycm9yIHtcbiAgcmVhZG9ubHkga2luZD86IHN0cmluZztcbiAgcmVhZG9ubHkgbWVzc2FnZTogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgUnVsZUVuZ2luZTxTLCBGPiB7XG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBzb2x2ZUFsbChydWxlczogUnVsZTxTLCBGPltdLCBmYWN0czogRmFjdFtdKTogU29sdmVSZXN1bHQ8UywgRj4ge1xuICAgIGNvbnN0IGVycm9yczogUnVsZUVuZ2luZUVycm9yW10gPSBbXTtcbiAgICBjb25zdCBtYXRjaGluZzogTWF0Y2g8UywgRj5bXSA9IFtdO1xuICAgIHJ1bGVzLmZvckVhY2goKHJ1bGUpID0+IHtcbiAgICAgIGlmIChSdWxlLmlzRW1wdHkocnVsZSkpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goeyBtZXNzYWdlOiBcIkVtcHR5IHJ1bGU6IFwiICsgcnVsZS5pZCB9KTtcbiAgICAgIH0gZWxzZSBpZiAoUnVsZS5zb2x2ZShydWxlLCBmYWN0cykpIHtcbiAgICAgICAgY29uc3QgbWF0Y2g6IE1hdGNoPFMsIEY+ID0ge1xuICAgICAgICAgIHJ1bGVEZXNjcmlwdGlvbjogcnVsZS5kZXNjcmlwdGlvbixcbiAgICAgICAgICBtYXRjaGluZ1J1bGVJZDogcnVsZS5pZCA/PyBcIm5vLWlkLWdpdmVuXCIsXG4gICAgICAgICAgYWN0aW9uTGlzdDogWy4uLnJ1bGUub25TdWNjZXNzXSxcbiAgICAgICAgfTtcbiAgICAgICAgbWF0Y2hpbmcucHVzaChtYXRjaCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHsgbWF0Y2hpbmcsIGVycm9ycyB9O1xuICB9XG5cbiAgc29sdmUocnVsZTogUnVsZTxTLCBGPiwgZmFjdHM6IEZhY3RbXSk6IGJvb2xlYW4ge1xuICAgIC8vIFRPRE8gVmFsaWRhdGUsIGFuZCBSZXR1cm4gcmVzdWx0XG4gICAgcmV0dXJuIFJ1bGUuc29sdmUocnVsZSwgZmFjdHMpO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgUGFnZUR0byB9IGZyb20gXCIuLi9kdG8vU2NoZW1hRHRvXCI7XG5cbmV4cG9ydCBjbGFzcyBOZXh0UXVlIHtcbiAgICBwcml2YXRlIG9yaWdpbmFsT3JkZXI6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPiA9IFtdO1xuICAgIHByaXZhdGUgYWxsUGFnZXM6IFBhZ2VEdG9bXSA9IFtdO1xuICAgIHByaXZhdGUgZXhjbHVkZWRUYWdzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgcHJpdmF0ZSBleGNsdWRlZEJ5UGFnZUlkID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgcHJpdmF0ZSByZW1haW5pbmc6IFBhZ2VEdG9bXSA9IFtdO1xuICAgIGNvbnN0cnVjdG9yKHBhZ2VzOiBQYWdlRHRvW10gPSBbXSkge1xuICAgICAgICB0aGlzLnJlc2V0UXVlKHBhZ2VzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaWxsIHJlc2V0IHF1ZSB3aXRoIHRoZSBuZXcgcGFnZXMuXG4gICAgICogQHBhcmFtIHBhZ2VzXG4gICAgICovXG4gICAgcmVzZXRRdWUocGFnZXM6IFBhZ2VEdG9bXSkge1xuICAgICAgICB0aGlzLmFsbFBhZ2VzID0gWy4uLnBhZ2VzXTtcbiAgICAgICAgdGhpcy5yZW1haW5pbmcgPSBbLi4ucGFnZXNdO1xuICAgICAgICB0aGlzLmV4Y2x1ZGVkVGFncyA9IG5ldyBTZXQoKTtcbiAgICAgICAgdGhpcy5leGNsdWRlZEJ5UGFnZUlkID0gbmV3IFNldCgpO1xuICAgICAgICB0aGlzLm9yaWdpbmFsT3JkZXIgPSB0aGlzLmFsbFBhZ2VzLm1hcCgocCkgPT4gcC5pZCk7XG4gICAgfVxuXG4gICAgcG9wKCk6IFBhZ2VEdG8gfCBmYWxzZSB7XG4gICAgICAgIGNvbnN0IG5leHQgPSB0aGlzLnJlbWFpbmluZy5zaGlmdCgpO1xuICAgICAgICAvLyBUT0RPIENMT05FPz9cbiAgICAgICAgcmV0dXJuIG5leHQgPz8gZmFsc2U7XG4gICAgfVxuXG4gICAgcGVlaygpOiBQYWdlRHRvIHwgZmFsc2Uge1xuICAgICAgICBjb25zdCBuZXh0ID0gdGhpcy5yZW1haW5pbmdbMF07XG4gICAgICAgIHJldHVybiBuZXh0ID8/IGZhbHNlO1xuICAgIH1cblxuICAgIGp1bXBUb1BhZ2VCeUlkKHBhZ2VJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5yZW1haW5pbmcuZmluZEluZGV4KChwKSA9PiBwLmlkID09PSBwYWdlSWQpO1xuICAgICAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZW1haW5pbmcgPSB0aGlzLnJlbWFpbmluZy5zbGljZShpbmRleCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJlbW92ZUJ5VGFnKHRhZzogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGFnKSkge1xuICAgICAgICAgICAgdGFnLmZvckVhY2goKHRhZykgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZXhjbHVkZWRUYWdzLmFkZCh0YWcpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmV4Y2x1ZGVkVGFncy5hZGQodGFnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZpbHRlclJlbWFpbmluZygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdpbGwgbm90IGJlIGluY2x1ZGVkXG4gICAgICogQHBhcmFtIHBhZ2VzXG4gICAgICovXG4gICAgaW5zZXJ0QXNOZXh0QnlGb3JjZShwYWdlczogUGFnZUR0b1tdKSB7XG4gICAgICAgIHRoaXMucmVtYWluaW5nLnVuc2hpZnQoLi4ucGFnZXMpO1xuICAgIH1cblxuICAgIHJlbW92ZUJ5UGFnZUlkKHBhZ2VJZDogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGFnZUlkKSkge1xuICAgICAgICAgICAgcGFnZUlkLmZvckVhY2goKGlkKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5leGNsdWRlZEJ5UGFnZUlkLmFkZChpZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZXhjbHVkZWRCeVBhZ2VJZC5hZGQocGFnZUlkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZpbHRlclJlbWFpbmluZygpO1xuICAgICAgICAvLyB0aGlzLmV4Y2x1ZGVkQnlQYWdlSWQuYWRkKHBhZ2VJZCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmaWx0ZXJSZW1haW5pbmcoKSB7XG4gICAgICAgIHRoaXMucmVtYWluaW5nID0gdGhpcy5yZW1haW5pbmcuZmlsdGVyKChwKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0YWdzID0gcC50YWdzID8/IFtdO1xuICAgICAgICAgICAgY29uc3QgaXNJbmNsdWVkZWRCeVRhZyA9ICF0YWdzLnNvbWUoKHRhZykgPT4gdGhpcy5leGNsdWRlZFRhZ3MuaGFzKHRhZykpO1xuICAgICAgICAgICAgY29uc3QgaXNJbmNsdWRlZEJ5UGFnZUlkID0gIXRoaXMuZXhjbHVkZWRCeVBhZ2VJZC5oYXMocC5pZCk7XG4gICAgICAgICAgICByZXR1cm4gaXNJbmNsdWRlZEJ5UGFnZUlkICYmIGlzSW5jbHVlZGVkQnlUYWc7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBnZXQgaXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVtYWluaW5nLmxlbmd0aCA9PT0gMDtcbiAgICB9XG4gICAgZ2V0IHNpemUoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVtYWluaW5nLmxlbmd0aDtcbiAgICB9XG4gICAgZ2V0IHBhZ2VDb3VudCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbE9yZGVyLmxlbmd0aDtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgQW5zd2VyZWRRdWVzdGlvbiwgSGlzdG9yeVF1ZSwgUGFnZUhpc3RvcnkgfSBmcm9tIFwiLi9oaXN0b3J5LXF1ZVwiO1xuaW1wb3J0IHsgUnVsZUVuZ2luZSB9IGZyb20gXCIuLi9ydWxlcy9ydWxlLWVuZ2luZVwiO1xuaW1wb3J0IHsgTmV4dFF1ZSB9IGZyb20gXCIuL25leHQtcXVlXCI7XG5pbXBvcnQgeyBQYWdlRHRvLCBTY2hlbWFEdG8gfSBmcm9tIFwiLi4vZHRvL1NjaGVtYUR0b1wiO1xuaW1wb3J0IHsgTmF2aWdhdGlvbkNvbW1hbmQsIFBhZ2VRdWVDb21tYW5kIH0gZnJvbSBcIi4uL2NvbW1hbmRzL0RDb21tYW5kXCI7XG5pbXBvcnQgeyBEVXRpbCB9IGZyb20gXCIuLi91dGlscy9EVXRpbFwiO1xuXG5leHBvcnQgdHlwZSBEUGxheWVyRGF0YSA9IFBpY2s8U2NoZW1hRHRvLCBcInBhZ2VzXCIgfCBcInBhZ2VTZXF1ZW5jZXNcIiB8IFwicnVsZXNcIj47XG5leHBvcnQgY2xhc3MgRFBsYXllciB7XG4gIHByaXZhdGUgaGlzdG9yeSA9IG5ldyBIaXN0b3J5UXVlKCk7XG4gIHByaXZhdGUgcnVsZUVuZ2luZSA9IG5ldyBSdWxlRW5naW5lPFBhZ2VRdWVDb21tYW5kLCBQYWdlUXVlQ29tbWFuZD4oKTtcbiAgcHJpdmF0ZSBuZXh0UXVlID0gbmV3IE5leHRRdWUoKTtcbiAgcHJpdmF0ZSBkYXRhOiBEUGxheWVyRGF0YTtcblxuICBjb25zdHJ1Y3RvcihkYXRhOiBEUGxheWVyRGF0YSkge1xuICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgdGhpcy5uZXh0UXVlLnJlc2V0UXVlKGRhdGEucGFnZXMpO1xuICB9XG5cbiAgc2F2ZUhpc3RvcnkocGFnZUhpc3Rvcnk6IFBhZ2VIaXN0b3J5KSB7XG4gICAgY29uc29sZS5sb2coXCJTQVZFIEhJU1RPUllcIiwgcGFnZUhpc3RvcnkpO1xuICAgIHRoaXMuaGlzdG9yeS5hZGRUb0hpc3RvcnkocGFnZUhpc3RvcnkpO1xuICAgIGNvbnN0IGZhY3RzID0gdGhpcy5oaXN0b3J5LmdldEZhY3RzKCk7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5ydWxlRW5naW5lLnNvbHZlQWxsKHRoaXMuZGF0YS5ydWxlcywgZmFjdHMpO1xuICAgIGNvbnN0IG1hdGNoaW5nUnVsZXMgPSByZXN1bHQubWF0Y2hpbmc7XG4gICAgY29uc3QgYWN0aW9ucyA9IG1hdGNoaW5nUnVsZXMubWFwKChyKSA9PiByLmFjdGlvbkxpc3QpLmZsYXQoMSk7XG4gICAgYWN0aW9ucy5mb3JFYWNoKChhKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZyhhLnBheWxvYWQpO1xuICAgICAgc3dpdGNoIChhLmtpbmQpIHtcbiAgICAgICAgY2FzZSBcIlBBR0VfUVVFX0pVTVBfVE9fUEFHRV9DT01NQU5EXCI6XG4gICAgICAgICAgdGhpcy5uZXh0UXVlLmp1bXBUb1BhZ2VCeUlkKGEucGF5bG9hZC5wYWdlSWQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiUEFHRV9RVUVfRVhDTFVERV9CWV9QQUdFX0lEX0NPTU1BTkRcIjpcbiAgICAgICAgICB0aGlzLm5leHRRdWUucmVtb3ZlQnlQYWdlSWQoYS5wYXlsb2FkLnBhZ2VJZHMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiUEFHRV9RVUVfRVhDTFVERV9CWV9UQUdfQ09NTUFORFwiOlxuICAgICAgICAgIHRoaXMubmV4dFF1ZS5yZW1vdmVCeVRhZyhhLnBheWxvYWQudGFnSWRzKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIlVOS05PV04gQUNUSU9OXCIsIGEpO1xuICAgICAgICAgIGNvbnN0IGNoZWNrOiBuZXZlciA9IGE7XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc29sZS5sb2coYWN0aW9ucyk7XG4gIH1cblxuICBnZXRSZXN1bHRzKCk6IEFuc3dlcmVkUXVlc3Rpb25bXSB7XG4gICAgcmV0dXJuIHRoaXMuaGlzdG9yeS5nZXRBbnN3ZXJzKCk7XG4gIH1cblxuICBwcml2YXRlIGdvVG9QYWdlQnlJZChwYWdlSWQ6IHN0cmluZykge1xuICAgIHRoaXMubmV4dFF1ZS5qdW1wVG9QYWdlQnlJZChwYWdlSWQpO1xuICB9XG5cbiAgaGFuZGxlTmF2aWdhdGlvbkNvbW1hbmQoY29tbWFuZDogTmF2aWdhdGlvbkNvbW1hbmQpIHtcbiAgICBzd2l0Y2ggKGNvbW1hbmQua2luZCkge1xuICAgICAgY2FzZSBcIlBBR0VfUVVFX05FWFRfUEFHRV9DT01NQU5EXCI6XG4gICAgICAgIC8vIE5PIE5FRUQgVE8gRE8gQU5ZVEhJTkdcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiUEFHRV9RVUVfR09fVE9fUEFHRV9DT01NQU5EXCI6XG4gICAgICAgIHRoaXMuZ29Ub1BhZ2VCeUlkKGNvbW1hbmQucGF5bG9hZC5wYWdlSWQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJQQUdFX1FVRV9HT19UT19TRVFVRU5DRV9DT01NQU5EXCI6XG4gICAgICAgIHRoaXMuaW5zZXJ0U2VxdWVuY2VCeUlkKGNvbW1hbmQucGF5bG9hZC5zZXF1ZW5jZUlkKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIERVdGlsLm5ldmVyQ2hlY2soY29tbWFuZCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0TmV4dFBhZ2UoKTogUGFnZUR0byB8IGZhbHNlIHtcbiAgICAvLyBUT0RPIEhBTkRMRSBSVUxFUyEhXG4gICAgcmV0dXJuIHRoaXMubmV4dFF1ZS5wb3AoKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5zZXJ0U2VxdWVuY2VCeUlkKGlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBzZXEgPSB0aGlzLmRhdGEucGFnZVNlcXVlbmNlcz8uZmluZCgocykgPT4gcy5pZCA9PT0gaWQpO1xuICAgIGlmIChzZXEpIHtcbiAgICAgIHRoaXMubmV4dFF1ZS5pbnNlcnRBc05leHRCeUZvcmNlKFsuLi5zZXEucGFnZXNdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSE9XIFRPIEhBTkRMRSBJTlZBTElEIElEX1JFRlM/PyBMT0dHRVI/P1xuICAgICAgLy8gTE9HIElOVkFMSUQgQ09NTUFORC5cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVG90YWwgbnVtYmVyIG9mIHBhZ2VzLlxuICAgKi9cbiAgZ2V0IHBhZ2VDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLm5leHRRdWUucGFnZUNvdW50O1xuICB9XG59XG4iLCAiaW1wb3J0IHsgRENvbW1hbmQsIEVsZW1lbnRDb21tYW5kLCBTdGF0ZUNvbW1hbmQgfSBmcm9tIFwiLi4vY29tbWFuZHMvRENvbW1hbmRcIjtcbmltcG9ydCB7IERFdmVudCB9IGZyb20gXCIuLi9ldmVudHMvREV2ZW50c1wiO1xuaW1wb3J0IHsgQ29uZGl0aW9uIH0gZnJvbSBcIi4uL3J1bGVzL2NvbmRpdGlvblwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIERFdmVudEhhbmRsZXI8RSBleHRlbmRzIERFdmVudCA9IERFdmVudD4ge1xuICAgIHJlYWRvbmx5IG9uRXZlbnQ6IEVbXCJraW5kXCJdO1xuICAgIHJlYWRvbmx5IHdoZW4/OiB7IHByb2R1Y2VySWQ/OiBzdHJpbmc7IGNvbmRpdGlvbj86IENvbmRpdGlvbiB9O1xuICAgIHJlYWRvbmx5IHRoZW5FeGVjdXRlOiBSZWFkb25seUFycmF5PERDb21tYW5kPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBRdWVyeUNoYW5nZWRIYW5kbGVyIHtcbiAgICByZWFkb25seSBxdWVyeU5hbWU6IHN0cmluZztcbiAgICByZWFkb25seSB3aGVuVHJ1ZTogUmVhZG9ubHlBcnJheTxFbGVtZW50Q29tbWFuZD47XG4gICAgcmVhZG9ubHkgd2hlbkZhbHNlOiBSZWFkb25seUFycmF5PEVsZW1lbnRDb21tYW5kPjtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBERXZlbnRIYW5kbGVyIHtcbiAgICBleHBvcnQgdHlwZSBMb29rVXAgPSBNYXA8REV2ZW50SGFuZGxlcltcIm9uRXZlbnRcIl0sIEFycmF5PERFdmVudEhhbmRsZXI+PjtcbiAgICBleHBvcnQgY29uc3QgY3JlYXRlTG9va1VwID0gKGhhbmRsZXJzPzogUmVhZG9ubHlBcnJheTxERXZlbnRIYW5kbGVyPik6IExvb2tVcCA9PiB7XG4gICAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXA8REV2ZW50SGFuZGxlcltcIm9uRXZlbnRcIl0sIEFycmF5PERFdmVudEhhbmRsZXI+PigpO1xuICAgICAgICBoYW5kbGVycz8uZm9yRWFjaCgoaCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qga2luZCA9IGgub25FdmVudDtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnQgPSBtYXAuZ2V0KGtpbmQpO1xuICAgICAgICAgICAgY29uc3QgYWN0aW9ucyA9IGN1cnJlbnQgPyBbLi4uY3VycmVudCwgaF0gOiBbaF07XG4gICAgICAgICAgICBtYXAuc2V0KGtpbmQsIGFjdGlvbnMpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG1hcDtcbiAgICB9O1xufVxuIiwgImltcG9ydCB7IERTdHlsZSB9IGZyb20gXCIuL0RTdHlsZVwiO1xuaW1wb3J0IHsgREVsZW1lbnRCYXNlRHRvIH0gZnJvbSBcIi4uL2R0by9ERWxlbWVudC5kdG9cIjtcbmltcG9ydCB7IERDb21tYW5kLCBFbGVtZW50Q29tbWFuZCB9IGZyb20gXCIuLi9jb21tYW5kcy9EQ29tbWFuZFwiO1xuaW1wb3J0IHsgRENvbW1hbmRCdXMgfSBmcm9tIFwiLi4vY29tbWFuZHMvRENvbW1hbmRCdXNcIjtcbmltcG9ydCB7IERFdmVudEhhbmRsZXIgfSBmcm9tIFwiLi4vZXZlbnQtaGFuZGxlcnMvREV2ZW50SGFuZGxlclwiO1xuaW1wb3J0IHsgRFV0aWwgfSBmcm9tIFwiLi4vdXRpbHMvRFV0aWxcIjtcbmltcG9ydCB7IEV2ZW50QnVzIH0gZnJvbSBcIi4uL2V2ZW50cy9ldmVudC1idXNcIjtcbmltcG9ydCB7IERUaW1lc3RhbXAgfSBmcm9tIFwiLi4vY29tbW9uL0RUaW1lc3RhbXBcIjtcbmltcG9ydCB7IEFuaW1hdGlvbkR0byB9IGZyb20gXCIuLi9kdG8vQW5pbWF0aW9uRHRvXCI7XG5pbXBvcnQgeyBTY2FsZVNlcnZpY2UgfSBmcm9tIFwiLi4vZW5naW5lL3NjYWxlXCI7XG5pbXBvcnQgeyBEU3RhdGUgfSBmcm9tIFwiLi4vc3RhdGUvRHN0YXRlXCI7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBERWxlbWVudDxUIGV4dGVuZHMgSFRNTEVsZW1lbnQ+IHtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZWw6IFQ7XG4gICAgcHJpdmF0ZSBjbGlja0hhbmRsZXJJc0VuYWJsZWQgPSB0cnVlO1xuICAgIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBpc0FuaW1hdGluZ1NlbGYgPSBmYWxzZTtcbiAgICBwcm90ZWN0ZWQgY3VyclN0eWxlOiBQYXJ0aWFsPERTdHlsZT4gPSB7XG4gICAgICAgIGZvbnRTaXplOiB7IF91bml0OiBcInB4XCIsIHZhbHVlOiAxMDAgfSxcbiAgICAgICAgZm9udFdlaWdodDogNTAwLFxuICAgICAgICB0ZXh0Q29sb3I6IFwiYmxhY2tcIixcbiAgICAgICAgb3BhY2l0eTogMSxcbiAgICB9O1xuXG4gICAgLy8gcHJpdmF0ZSByZWFkb25seSBvblF1ZXJ5Q2hhbmdlZEhhbmRsZXJzID1cbiAgICBwcml2YXRlIHJlYWRvbmx5IGV2ZW50SGFuZGxlcnM6IERFdmVudEhhbmRsZXIuTG9va1VwO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBjb21tYW5kQnVzOiBEQ29tbWFuZEJ1cztcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZXZlbnRCdXM6IEV2ZW50QnVzO1xuICAgIHByb3RlY3RlZCBzY2FsZTogU2NhbGVTZXJ2aWNlO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgYmFzZUR0bzogREVsZW1lbnRCYXNlRHRvO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBzdWJzY3JpcHRpb25zID0gbmV3IFNldDwoKSA9PiB2b2lkPigpO1xuXG4gICAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKFxuICAgICAgICBlbDogVCxcbiAgICAgICAgZXZlbnRCdXM6IEV2ZW50QnVzLFxuICAgICAgICBjb21tYW5kQnVzOiBEQ29tbWFuZEJ1cyxcbiAgICAgICAgZHRvOiBERWxlbWVudEJhc2VEdG8sXG4gICAgICAgIHNjYWxlOiBTY2FsZVNlcnZpY2VcbiAgICApIHtcbiAgICAgICAgdGhpcy5lbCA9IGVsO1xuICAgICAgICB0aGlzLmlkID0gZHRvLmlkO1xuICAgICAgICB0aGlzLmJhc2VEdG8gPSBkdG87XG4gICAgICAgIC8vIHRoaXMuZWwuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG4gICAgICAgIHRoaXMuY29tbWFuZEJ1cyA9IGNvbW1hbmRCdXM7XG4gICAgICAgIHRoaXMuZXZlbnRCdXMgPSBldmVudEJ1cztcbiAgICAgICAgdGhpcy5ldmVudEhhbmRsZXJzID0gREV2ZW50SGFuZGxlci5jcmVhdGVMb29rVXAoZHRvLmV2ZW50SGFuZGxlcnMpO1xuICAgICAgICB0aGlzLnNjYWxlID0gc2NhbGU7XG4gICAgICAgIC8vIENMSUNLXG4gICAgICAgIHRoaXMub25DbGlja0hhbmRsZXIgPSB0aGlzLm9uQ2xpY2tIYW5kbGVyLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuZWwub25jbGljayA9IHRoaXMub25DbGlja0hhbmRsZXI7XG5cbiAgICAgICAgLy8gSE9WRVJcbiAgICAgICAgdGhpcy5vbk1vdXNlT3ZlciA9IHRoaXMub25Nb3VzZU92ZXIuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5lbC5vbm1vdXNlb3ZlciA9IHRoaXMub25Nb3VzZU92ZXI7XG5cbiAgICAgICAgaWYgKGR0bykge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVTdHlsZXMoZHRvPy5zdHlsZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29tbWFuZFN1YnNjcmlwdGlvbiA9IHRoaXMuY29tbWFuZEJ1cy5zdWJzY3JpYmUoKGMpID0+IHtcbiAgICAgICAgICAgIGlmIChjLmtpbmQgPT09IFwiRUxFTUVOVF9TVFlMRV9DT01NQU5EXCIgJiYgYy50YXJnZXRJZCA9PT0gdGhpcy5pZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0U3R5bGUoYy5wYXlsb2FkLmNoYW5nZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGMua2luZCA9PT0gXCJFTEVNRU5UX0RJU0FCTEVfQ0xJQ0tfQ09NTUFORFwiICYmIGMudGFyZ2V0SWQgPT09IHRoaXMuaWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNsaWNrSGFuZGxlcklzRW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGMua2luZCA9PT0gXCJFTEVNRU5UX0VOQUJMRV9DTElDS19DT01NQU5EXCIgJiYgYy50YXJnZXRJZCA9PT0gdGhpcy5pZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2xpY2tIYW5kbGVySXNFbmFibGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjLmtpbmQgPT09IFwiRUxFTUVOVF9BTklNQVRFX0NPTU1BTkRcIiAmJiBjLnRhcmdldElkID09PSB0aGlzLmlkKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJUT0RPIElNUExFTUVOVCBBTklNQVRJT05fSEFORExFUiBJTiBERWxlbWVudC5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHRoaXMuaWQpO1xuICAgICAgICAvLyBUT0RPIE1FTU9SWSBMRUFLXG4gICAgICAgIGNvbnN0IGV2ZW50U3Vic2NyaXB0aW9uID0gdGhpcy5ldmVudEJ1cy5zdWJzY3JpYmUoKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVycyA9IHRoaXMuZXZlbnRIYW5kbGVycy5nZXQoZXZlbnQua2luZCkgPz8gW107XG4gICAgICAgICAgICAvLyBUT0RPIEFwcGx5IENvbmRpdGlvbnMgaW4gV0hFTi5cbiAgICAgICAgICAgIGNvbnN0IGNvbW1hbmRzID0gaGFuZGxlcnMubWFwKChoKSA9PiBoLnRoZW5FeGVjdXRlKS5mbGF0KDEpO1xuICAgICAgICAgICAgY29tbWFuZHMuZm9yRWFjaCgoY29tbWFuZCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY29tbWFuZEJ1cy5lbWl0KGNvbW1hbmQpO1xuICAgICAgICAgICAgICAgIC8vIHRoaXMuZG9BY3Rpb24oY29tbWFuZCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKGV2ZW50LmtpbmQgPT09IFwiSE9TVF9TQ0FMRV9DSEFOR0VEX0VWRU5UXCIpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkhBTkRMRSBUSElTIFNDQUxFIENIQU5HRSEhXCIpO1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU3R5bGVzKHt9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGV2ZW50LmtpbmQgPT09IFwiU1RBVEVfUVVFUllfUkVTVUxUX0NIQU5HRURfRVZFTlRcIikge1xuICAgICAgICAgICAgICAgIHRoaXMucXVlcnlDaGFuZ2VkSGFuZGxlcihldmVudC5kYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgXCJFTEVNRU5UOiBcIik7XG4gICAgICAgIHRoaXMubm9ybWFsaXplKCk7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoY29tbWFuZFN1YnNjcmlwdGlvbik7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoZXZlbnRTdWJzY3JpcHRpb24pO1xuICAgIH1cblxuICAgIGFic3RyYWN0IGRlc3Ryb3koKTogdm9pZDtcblxuICAgIC8vIGFic3RyYWN0IHNldFNjYWxlKHNjYWxlOiBudW1iZXIpOiB2b2lkO1xuXG4gICAgLy8gLyoqXG4gICAgLy8gICogVGhlIHB1cnBvc2Ugb2YgdGhpcyBmdW5jdGlvbiBpcyB0byByZS1lbWl0IGNvbW1hbmRzIGZyb20gZXZlbnQtaGFuZGxlcnM/XG4gICAgLy8gICogQHBhcmFtIGNvbW1hbmRcbiAgICAvLyAgKiBAcHJpdmF0ZVxuICAgIC8vICAqL1xuICAgIC8vIHByaXZhdGUgaGFuZGxlQ29tbWFuZHNFbWl0dGVkQnlQcml2YXRlRXZlbnRIYW5kbGVycyhjb21tYW5kOiBEQ29tbWFuZCkge1xuICAgIC8vICAgICBjb25zb2xlLmxvZyhjb21tYW5kKTtcbiAgICAvLyAgICAgc3dpdGNoIChjb21tYW5kLmtpbmQpIHtcbiAgICAvLyAgICAgICAgIGNhc2UgXCJFTEVNRU5UX1NUWUxFX0NPTU1BTkRcIjpcbiAgICAvLyAgICAgICAgICAgICBpZiAoY29tbWFuZC50YXJnZXRJZCA9PT0gdGhpcy5pZCkge1xuICAgIC8vICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVN0eWxlcyhjb21tYW5kLnBheWxvYWQuY2hhbmdlcyk7XG4gICAgLy8gICAgICAgICAgICAgfVxuICAgIC8vICAgICAgICAgICAgIGJyZWFrO1xuICAgIC8vICAgICAgICAgY2FzZSBcIkVMRU1FTlRfQU5JTUFURV9DT01NQU5EXCI6XG4gICAgLy8gICAgICAgICAgICAgLy8gVE9ETyBDSEVDSyBGT1IgVEFSR0VUIElEXG4gICAgLy8gICAgICAgICAgICAgdGhpcy5oYW5kbGVBbmltYXRlU2VsZkFjdGlvbihjb21tYW5kLnBheWxvYWQpO1xuICAgIC8vICAgICAgICAgICAgIGJyZWFrO1xuICAgIC8vICAgICAgICAgY2FzZSBcIkVMRU1FTlRfRU5BQkxFX0NMSUNLX0NPTU1BTkRcIjpcbiAgICAvLyAgICAgICAgICAgICB0aGlzLmNsaWNrSGFuZGxlcklzRW5hYmxlZCA9IHRydWU7XG4gICAgLy8gICAgICAgICAgICAgLy8gdGhpcy51cGRhdGVTdHlsZXMoY29tbWFuZC5wYXlsb2FkLmNoYW5nZXMpO1xuICAgIC8vICAgICAgICAgICAgIGJyZWFrO1xuICAgIC8vICAgICAgICAgY2FzZSBcIkVMRU1FTlRfRElTQUJMRV9DTElDS19DT01NQU5EXCI6XG4gICAgLy8gICAgICAgICAgICAgdGhpcy5jbGlja0hhbmRsZXJJc0VuYWJsZWQgPSBmYWxzZTtcbiAgICAvLyAgICAgICAgICAgICAvLyB0aGlzLmhhbmRsZUFuaW1hdGVTZWxmQWN0aW9uKGNvbW1hbmQucGF5bG9hZCk7XG4gICAgLy8gICAgICAgICAgICAgYnJlYWs7XG4gICAgLy8gICAgICAgICBjYXNlIFwiVklERU9fUExBWV9DT01NQU5EXCI6XG4gICAgLy8gICAgICAgICAgICAgdGhpcy5jb21tYW5kQnVzLmVtaXQoY29tbWFuZCk7XG4gICAgLy8gICAgICAgICAgICAgYnJlYWs7XG4gICAgLy8gICAgICAgICBjYXNlIFwiVklERU9fUEFVU0VfQ09NTUFORFwiOlxuICAgIC8vICAgICAgICAgICAgIHRoaXMuY29tbWFuZEJ1cy5lbWl0KGNvbW1hbmQpO1xuICAgIC8vICAgICAgICAgICAgIGJyZWFrO1xuICAgIC8vICAgICAgICAgY2FzZSBcIkVOR0lORV9MRUFWRV9QQUdFX0NPTU1BTkRcIjpcbiAgICAvLyAgICAgICAgICAgICB0aGlzLmNvbW1hbmRCdXMuZW1pdChjb21tYW5kKTtcbiAgICAvLyAgICAgICAgICAgICBicmVhaztcbiAgICAvLyAgICAgICAgIGNhc2UgXCJWSURFT19KVU1QX1RPX0NPTU1BTkRcIjpcbiAgICAvLyAgICAgICAgICAgICB0aGlzLmNvbW1hbmRCdXMuZW1pdChjb21tYW5kKTtcbiAgICAvLyAgICAgICAgICAgICBicmVhaztcbiAgICAvLyAgICAgICAgIGNhc2UgXCJWSURFT19TRVRfVk9MVU1FX0NPTU1BTkRcIjpcbiAgICAvLyAgICAgICAgICAgICB0aGlzLmNvbW1hbmRCdXMuZW1pdChjb21tYW5kKTtcbiAgICAvLyAgICAgICAgICAgICBicmVhaztcbiAgICAvLyAgICAgICAgIGNhc2UgXCJBVURJT19QTEFZX0NPTU1BTkRcIjpcbiAgICAvLyAgICAgICAgICAgICB0aGlzLmNvbW1hbmRCdXMuZW1pdChjb21tYW5kKTtcbiAgICAvLyAgICAgICAgICAgICBicmVhaztcbiAgICAvLyAgICAgICAgIGNhc2UgXCJBVURJT19QQVVTRV9DT01NQU5EXCI6XG4gICAgLy8gICAgICAgICAgICAgdGhpcy5jb21tYW5kQnVzLmVtaXQoY29tbWFuZCk7XG4gICAgLy8gICAgICAgICAgICAgYnJlYWs7XG4gICAgLy8gICAgICAgICBjYXNlIFwiQVVESU9fU0VUX1ZPTFVNRV9DT01NQU5EXCI6XG4gICAgLy8gICAgICAgICAgICAgdGhpcy5jb21tYW5kQnVzLmVtaXQoY29tbWFuZCk7XG4gICAgLy8gICAgICAgICAgICAgYnJlYWs7XG4gICAgLy8gICAgICAgICBjYXNlIFwiUEFHRV9RVUVfTkVYVF9QQUdFX0NPTU1BTkRcIjpcbiAgICAvLyAgICAgICAgICAgICB0aGlzLmNvbW1hbmRCdXMuZW1pdChjb21tYW5kKTtcbiAgICAvLyAgICAgICAgICAgICBicmVhaztcbiAgICAvLyAgICAgICAgIGNhc2UgXCJQQUdFX1FVRV9HT19UT19TRVFVRU5DRV9DT01NQU5EXCI6XG4gICAgLy8gICAgICAgICAgICAgdGhpcy5jb21tYW5kQnVzLmVtaXQoY29tbWFuZCk7XG4gICAgLy8gICAgICAgICAgICAgYnJlYWs7XG4gICAgLy8gICAgICAgICBjYXNlIFwiUEFHRV9RVUVfR09fVE9fUEFHRV9DT01NQU5EXCI6XG4gICAgLy8gICAgICAgICAgICAgdGhpcy5jb21tYW5kQnVzLmVtaXQoY29tbWFuZCk7XG4gICAgLy8gICAgICAgICAgICAgYnJlYWs7XG4gICAgLy8gICAgICAgICBjYXNlIFwiUEFHRV9RVUVfRVhDTFVERV9CWV9QQUdFX0lEX0NPTU1BTkRcIjpcbiAgICAvLyAgICAgICAgICAgICB0aGlzLmNvbW1hbmRCdXMuZW1pdChjb21tYW5kKTtcbiAgICAvLyAgICAgICAgICAgICBicmVhaztcbiAgICAvLyAgICAgICAgIGNhc2UgXCJQQUdFX1FVRV9KVU1QX1RPX1BBR0VfQ09NTUFORFwiOlxuICAgIC8vICAgICAgICAgICAgIHRoaXMuY29tbWFuZEJ1cy5lbWl0KGNvbW1hbmQpO1xuICAgIC8vICAgICAgICAgICAgIGJyZWFrO1xuICAgIC8vICAgICAgICAgY2FzZSBcIlBBR0VfUVVFX0VYQ0xVREVfQllfVEFHX0NPTU1BTkRcIjpcbiAgICAvLyAgICAgICAgICAgICB0aGlzLmNvbW1hbmRCdXMuZW1pdChjb21tYW5kKTtcbiAgICAvLyAgICAgICAgICAgICBicmVhaztcbiAgICAvLyAgICAgICAgIGNhc2UgXCJTVEFURV9NVVRBVEVfQ09NTUFORFwiOlxuICAgIC8vICAgICAgICAgICAgIHRoaXMuY29tbWFuZEJ1cy5lbWl0KGNvbW1hbmQpO1xuICAgIC8vICAgICAgICAgICAgIGJyZWFrO1xuICAgIC8vICAgICAgICAgZGVmYXVsdDpcbiAgICAvLyAgICAgICAgICAgICBEVXRpbC5uZXZlckNoZWNrKGNvbW1hbmQpO1xuICAgIC8vICAgICB9XG4gICAgLy8gfVxuXG4gICAgcHJpdmF0ZSBxdWVyeUNoYW5nZWRIYW5kbGVyKHJlc3VsdDogRFN0YXRlLlN0YXRlUXVlcnlSZXN1bHQpIHtcbiAgICAgICAgY29uc3QgbWF5YmVIYW5kbGVycyA9IHRoaXMuYmFzZUR0by5vblN0YXRlQ2hhbmdlO1xuICAgICAgICBpZiAoIW1heWJlSGFuZGxlcnMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBxdWVyeUhhbmRsZXJzID0gbWF5YmVIYW5kbGVycy5maWx0ZXIoKGgpID0+IGgucXVlcnlOYW1lID09PSByZXN1bHQucXVlcnlOYW1lKTtcbiAgICAgICAgcXVlcnlIYW5kbGVycy5mb3JFYWNoKChoKSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzdWx0LmN1cnIpIHtcbiAgICAgICAgICAgICAgICBoLndoZW5UcnVlLmZvckVhY2goKGNvbW1hbmQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5kb0FjdGlvbihjb21tYW5kKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21tYW5kQnVzLmVtaXQoY29tbWFuZCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGgud2hlbkZhbHNlLmZvckVhY2goKGNvbW1hbmQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5kb0FjdGlvbihjb21tYW5kKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21tYW5kQnVzLmVtaXQoY29tbWFuZCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhmaW5kQnlRdWVyeSwgdmFsdWUpO1xuICAgICAgICAvLyBjb25zdCBhbGwgPSB0aGlzLmJhc2VEdG8uc3RhdGVRdWVyeUNoYW5nZSA/PyBbXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uQ2xpY2tIYW5kbGVyKF86IE1vdXNlRXZlbnQpIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coKTtcbiAgICAgICAgaWYgKCF0aGlzLmNsaWNrSGFuZGxlcklzRW5hYmxlZCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2codGhpcy5pZCArIFwiQ2xpY2sgZGlzYWJsZWRcIik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2xpY2tBY3Rpb24gPSB0aGlzLmJhc2VEdG8ub25DbGljaztcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJOQVRJVkUgQ0xJQ0sgRUxFTUVOVDogSGFuZGxlcnMgXCIgKyBjbGlja0FjdGlvbj8ubGVuZ3RoKTtcbiAgICAgICAgaWYgKGNsaWNrQWN0aW9uICYmIGNsaWNrQWN0aW9uLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiVEFSR0VUSUQ6IFwiICsgY2xpY2tBY3Rpb25bMF0udGFyZ2V0SWQgKyBcIiBcIiArIHRoaXMuaWQpO1xuICAgICAgICAgICAgdGhpcy5ldmVudEJ1cy5lbWl0KHtcbiAgICAgICAgICAgICAgICBraW5kOiBcIlVTRVJfQ0xJQ0tFRF9FVkVOVFwiLFxuICAgICAgICAgICAgICAgIHByb2R1Y2VyOiBcIkRVc2VyXCIsXG4gICAgICAgICAgICAgICAgcHJvZHVjZXJJZDogdGhpcy5pZCxcbiAgICAgICAgICAgICAgICBkYXRhOiB7IGVsZW1lbnRJZDogdGhpcy5pZCB9LFxuICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogRFRpbWVzdGFtcC5ub3coKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY2xpY2tBY3Rpb24uZm9yRWFjaCgoY29tbWFuZCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY29tbWFuZEJ1cy5lbWl0KGNvbW1hbmQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIG9uTW91c2VPdmVyKF86IE1vdXNlRXZlbnQpIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coZXYpO1xuICAgIH1cblxuICAgIHNldFN0eWxlKHN0eWxlOiBQYXJ0aWFsPERTdHlsZT4pIHtcbiAgICAgICAgdGhpcy51cGRhdGVTdHlsZXMoc3R5bGUpO1xuICAgIH1cblxuICAgIGFwcGVuZFlvdXJzZWxmKHBhcmVudDogSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgcGFyZW50LmFwcGVuZCh0aGlzLmVsKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2cocGFyZW50KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhbmRsZUFuaW1hdGVTZWxmQWN0aW9uKGR0bzogQW5pbWF0aW9uRHRvKSB7XG4gICAgICAgIHRoaXMuaXNBbmltYXRpbmdTZWxmID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgeyBrZXlmcmFtZXMsIG9wdGlvbnMgfSA9IGR0bztcblxuICAgICAgICBjb25zdCBhbmltYXRpb24gPSB0aGlzLmVsLmFuaW1hdGUoa2V5ZnJhbWVzLCBvcHRpb25zLmR1cmF0aW9uKTtcbiAgICAgICAgYW5pbWF0aW9uLm9uZmluaXNoID0gKGU6IEFuaW1hdGlvblBsYXliYWNrRXZlbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGUudHlwZSk7XG4gICAgICAgICAgICB0aGlzLmlzQW5pbWF0aW5nU2VsZiA9IGZhbHNlO1xuICAgICAgICB9O1xuICAgICAgICBhbmltYXRpb24ub25yZW1vdmUgPSAoKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXCJBTklNQVRJT04gUkVNT1ZFRDogXCIgKyBhbmltYXRpb24uaWQpO1xuICAgICAgICAgICAgdGhpcy5pc0FuaW1hdGluZ1NlbGYgPSBmYWxzZTtcbiAgICAgICAgfTtcbiAgICAgICAgYW5pbWF0aW9uLm9uY2FuY2VsID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKFwiQU5JTUFUSU9OIENBTkNFTEVEOiBcIiArIGFuaW1hdGlvbi5pZCk7XG4gICAgICAgICAgICB0aGlzLmlzQW5pbWF0aW5nU2VsZiA9IGZhbHNlO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgbm9ybWFsaXplKCkge1xuICAgICAgICBEU3R5bGUubm9ybWFsaXplKHRoaXMuZWwpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCB1cGRhdGVTdHlsZXMoc3R5bGU6IFBhcnRpYWw8RFN0eWxlPikge1xuICAgICAgICB0aGlzLmN1cnJTdHlsZSA9IE9iamVjdC5hc3NpZ24odGhpcy5jdXJyU3R5bGUsIHN0eWxlKTtcbiAgICAgICAgRFN0eWxlLmFwcGx5U3R5bGVzKHRoaXMuZWwsIHRoaXMuY3VyclN0eWxlLCB0aGlzLnNjYWxlLnNjYWxlKTtcbiAgICAgICAgd2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy5lbCk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IERFbGVtZW50IH0gZnJvbSBcIi4vREVsZW1lbnRcIjtcbmltcG9ydCB7IEREaXZEdG8gfSBmcm9tIFwiLi4vZHRvL0RFbGVtZW50LmR0b1wiO1xuaW1wb3J0IHsgRFRleHQgfSBmcm9tIFwiLi9EVGV4dFwiO1xuaW1wb3J0IHsgREltZyB9IGZyb20gXCIuL0RJbWdcIjtcbmltcG9ydCB7IERDb21tYW5kQnVzIH0gZnJvbSBcIi4uL2NvbW1hbmRzL0RDb21tYW5kQnVzXCI7XG5pbXBvcnQgeyBFdmVudEJ1cyB9IGZyb20gXCIuLi9ldmVudHMvZXZlbnQtYnVzXCI7XG5pbXBvcnQgeyBTY2FsZVNlcnZpY2UgfSBmcm9tIFwiLi4vZW5naW5lL3NjYWxlXCI7XG5cbmV4cG9ydCBjbGFzcyBERGl2IGV4dGVuZHMgREVsZW1lbnQ8SFRNTERpdkVsZW1lbnQ+IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IFRBRyA9IFwiWyBERGl2IF06IFwiO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBkZWZhdWx0U3R5bGUgPSB7IHg6IDIyLCB5OiA0IH07XG4gICAgcHJpdmF0ZSBjaGlsZHJlbjogQXJyYXk8RFRleHQgfCBESW1nPiA9IFtdO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIGR0bzogRERpdkR0byxcbiAgICAgICAgZXZlbnRCdXM6IEV2ZW50QnVzLFxuICAgICAgICBhY3Rpb25TZXJ2aWNlOiBEQ29tbWFuZEJ1cyxcbiAgICAgICAgc2NhbGU6IFNjYWxlU2VydmljZSxcbiAgICAgICAgY2hpbGRyZW46IEFycmF5PERUZXh0IHwgREltZz5cbiAgICApIHtcbiAgICAgICAgY29uc3QgZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHN1cGVyKGQsIGV2ZW50QnVzLCBhY3Rpb25TZXJ2aWNlLCBkdG8sIHNjYWxlKTtcbiAgICAgICAgdGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuXG4gICAgICAgIHRoaXMuY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQpID0+IHtcbiAgICAgICAgICAgIGNoaWxkLmFwcGVuZFlvdXJzZWxmKHRoaXMuZWwpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBkZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMuZm9yRWFjaCgodW5zdWJzY3JpYmUpID0+IHtcbiAgICAgICAgICAgIHVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkKSA9PiB7XG4gICAgICAgICAgICBjaGlsZC5kZXN0cm95KCk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBERWxlbWVudCB9IGZyb20gXCIuL0RFbGVtZW50XCI7XG5pbXBvcnQgeyBESW1nRHRvIH0gZnJvbSBcIi4uL2R0by9ERWxlbWVudC5kdG9cIjtcbmltcG9ydCB7IERDb21tYW5kQnVzIH0gZnJvbSBcIi4uL2NvbW1hbmRzL0RDb21tYW5kQnVzXCI7XG5pbXBvcnQgeyBFdmVudEJ1cyB9IGZyb20gXCIuLi9ldmVudHMvZXZlbnQtYnVzXCI7XG5pbXBvcnQgeyBTY2FsZVNlcnZpY2UgfSBmcm9tIFwiLi4vZW5naW5lL3NjYWxlXCI7XG5pbXBvcnQgeyBEVGltZXN0YW1wIH0gZnJvbSBcIi4uL2NvbW1vbi9EVGltZXN0YW1wXCI7XG5cbmV4cG9ydCBjbGFzcyBESW1nIGV4dGVuZHMgREVsZW1lbnQ8SFRNTEltYWdlRWxlbWVudD4ge1xuICAgIHByaXZhdGUgc3RhdGljIElNQUdFX0NPVU5UID0gMDtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGltYWdlQ291bnQ6IG51bWJlcjtcbiAgICByZWFkb25seSBUQUc6IHN0cmluZztcbiAgICByZWFkb25seSBUSU1JTkdfVEFHOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSByZWFkb25seSBsb2FkU3RhcnQ6IERUaW1lc3RhbXA7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBkdG86IERJbWdEdG8sXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgYWN0aW9uU3ViamVjdDogRENvbW1hbmRCdXMsXG4gICAgICAgIHJlYWRvbmx5IGV2ZW50QnVzOiBFdmVudEJ1cyxcbiAgICAgICAgcmVhZG9ubHkgc2NhbGVTZXJ2aWNlOiBTY2FsZVNlcnZpY2VcbiAgICApIHtcbiAgICAgICAgc3VwZXIoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImltZ1wiKSwgZXZlbnRCdXMsIGFjdGlvblN1YmplY3QsIGR0bywgc2NhbGVTZXJ2aWNlKTtcbiAgICAgICAgREltZy5JTUFHRV9DT1VOVCArPSAxO1xuICAgICAgICB0aGlzLmltYWdlQ291bnQgPSBESW1nLklNQUdFX0NPVU5UO1xuICAgICAgICB0aGlzLlRBRyA9IFwiW0RfSU1HIFwiICsgREltZy5JTUFHRV9DT1VOVCArIFwiIF06IFwiO1xuICAgICAgICB0aGlzLlRJTUlOR19UQUcgPSBcImxvYWQtdGltZSAoXCIgKyBESW1nLklNQUdFX0NPVU5UICsgXCIpIFwiO1xuICAgICAgICB0aGlzLmVsLmxvYWRpbmcgPSBcImVhZ2VyXCI7XG4gICAgICAgIHRoaXMuZWwuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG4gICAgICAgIHRoaXMuc2V0U3R5bGUoZHRvLnN0eWxlKTtcbiAgICAgICAgdGhpcy5sb2FkU3RhcnQgPSBEVGltZXN0YW1wLm5vdygpO1xuICAgICAgICAvLyBCaW5kIEhhbmRsZXJzXG4gICAgICAgIHRoaXMub25FcnJvciA9IHRoaXMub25FcnJvci5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLm9uTG9hZCA9IHRoaXMub25Mb2FkLmJpbmQodGhpcyk7XG4gICAgICAgIC8vIHRoaXMub25DbGljayA9IHRoaXMub25DbGljay5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmVsLm9ubG9hZCA9IHRoaXMub25Mb2FkO1xuICAgICAgICB0aGlzLmVsLm9uZXJyb3IgPSB0aGlzLm9uRXJyb3I7XG4gICAgICAgIC8vIHRoaXMuZWwub25jbGljayA9IHRoaXMub25DbGljaztcbiAgICAgICAgdGhpcy5lbC5zcmMgPSBkdG8udXJsO1xuICAgICAgICBjb25zb2xlLnRpbWUodGhpcy5USU1JTkdfVEFHKTtcbiAgICB9XG5cbiAgICBsb2coKTogdm9pZCB7fVxuXG4gICAgc2V0U2NhbGUoc2NhbGU6IG51bWJlcikge1xuICAgICAgICBjb25zb2xlLmxvZyhzY2FsZSk7XG4gICAgICAgIHRoaXMuc2V0U3R5bGUodGhpcy5jdXJyU3R5bGUpO1xuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMuZm9yRWFjaCgodW5zdWJzY3JpYmUpID0+IHtcbiAgICAgICAgICAgIHVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25FcnJvcihldjogRXZlbnQgfCBzdHJpbmcpIHtcbiAgICAgICAgaWYgKGV2IGluc3RhbmNlb2YgRXZlbnQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHRoaXMuVEFHICsgXCIgXCIgKyBldi50eXBlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHRoaXMuVEFHICsgZXYpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbkxvYWQoXzogRXZlbnQpIHtcbiAgICAgICAgY29uc3QgbG9hZFRpbWUgPSBEVGltZXN0YW1wLmRpZmZOb3codGhpcy5sb2FkU3RhcnQpO1xuXG4gICAgICAgIHRoaXMuZXZlbnRCdXMuZW1pdCh7XG4gICAgICAgICAgICBraW5kOiBcIklNQUdFX0xPQURFRF9FVkVOVFwiLFxuICAgICAgICAgICAgcHJvZHVjZXI6IFwiREltYWdlXCIsXG4gICAgICAgICAgICBwcm9kdWNlcklkOiB0aGlzLmlkLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBEVGltZXN0YW1wLm5vdygpLFxuICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgIGxvYWRUaW1lLFxuICAgICAgICAgICAgICAgIG5hdHVyYWxIZWlnaHQ6IHRoaXMuZWwubmF0dXJhbEhlaWdodCxcbiAgICAgICAgICAgICAgICBuYXR1cmFsV2lkdGg6IHRoaXMuZWwubmF0dXJhbFdpZHRoLFxuICAgICAgICAgICAgICAgIGhlaWdodDogdGhpcy5lbC5oZWlnaHQsXG4gICAgICAgICAgICAgICAgd2lkdGg6IHRoaXMuZWwud2lkdGgsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgREVsZW1lbnQgfSBmcm9tIFwiLi9ERWxlbWVudFwiO1xuaW1wb3J0IHsgRFRleHREdG8gfSBmcm9tIFwiLi4vZHRvL0RFbGVtZW50LmR0b1wiO1xuaW1wb3J0IHsgRENvbW1hbmRCdXMgfSBmcm9tIFwiLi4vY29tbWFuZHMvRENvbW1hbmRCdXNcIjtcbmltcG9ydCB7IEV2ZW50QnVzIH0gZnJvbSBcIi4uL2V2ZW50cy9ldmVudC1idXNcIjtcbmltcG9ydCB7IFNjYWxlU2VydmljZSB9IGZyb20gXCIuLi9lbmdpbmUvc2NhbGVcIjtcblxuZXhwb3J0IGNsYXNzIERUZXh0IGV4dGVuZHMgREVsZW1lbnQ8SFRNTFBhcmFncmFwaEVsZW1lbnQ+IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IFRBRyA9IFwiWyBEUGFyYWdyYXBoIF06IFwiO1xuICAgIHByb3RlY3RlZCBkZWZhdWx0U3R5bGUgPSB7fTtcblxuICAgIGNvbnN0cnVjdG9yKGR0bzogRFRleHREdG8sIGV2ZW50QnVzOiBFdmVudEJ1cywgYWN0aW9uU2VydmljZTogRENvbW1hbmRCdXMsIHNjYWxlOiBTY2FsZVNlcnZpY2UpIHtcbiAgICAgICAgc3VwZXIoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInBcIiksIGV2ZW50QnVzLCBhY3Rpb25TZXJ2aWNlLCBkdG8sIHNjYWxlKTtcbiAgICAgICAgdGhpcy5lbC5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcbiAgICAgICAgdGhpcy5lbC5pbm5lclRleHQgPSBcIlwiICsgZHRvLnRleHQ7XG4gICAgICAgIHRoaXMuc2V0U3R5bGUoZHRvLnN0eWxlKTtcbiAgICB9XG5cbiAgICBzZXRTY2FsZShzY2FsZTogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2V0U3R5bGUodGhpcy5jdXJyU3R5bGUpO1xuICAgICAgICBjb25zdCBmb250U2l6ZSA9IHRoaXMuZWwuc3R5bGUuZm9udFNpemU7XG4gICAgICAgIGNvbnNvbGUubG9nKHRoaXMuVEFHICsgXCJzY2FsZTogXCIgKyBzY2FsZSArIFwiIEZvbnRzaXplOiBcIiArIGZvbnRTaXplKTtcbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMuZm9yRWFjaCgodW5zdWJzY3JpYmUpID0+IHtcbiAgICAgICAgICAgIHVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBERWxlbWVudCB9IGZyb20gXCIuLi9EZWxlbWVudC9ERWxlbWVudFwiO1xuaW1wb3J0IHsgRERpdiB9IGZyb20gXCIuLi9EZWxlbWVudC9EZGl2XCI7XG5pbXBvcnQgeyBESW1nIH0gZnJvbSBcIi4uL0RlbGVtZW50L0RJbWdcIjtcbmltcG9ydCB7IERUZXh0IH0gZnJvbSBcIi4uL0RlbGVtZW50L0RUZXh0XCI7XG5pbXBvcnQgeyBERGl2RHRvLCBERWxlbWVudER0byB9IGZyb20gXCIuLi9kdG8vREVsZW1lbnQuZHRvXCI7XG5pbXBvcnQgeyBEQ29tbWFuZEJ1cyB9IGZyb20gXCIuLi9jb21tYW5kcy9EQ29tbWFuZEJ1c1wiO1xuaW1wb3J0IHsgRXZlbnRCdXMgfSBmcm9tIFwiLi4vZXZlbnRzL2V2ZW50LWJ1c1wiO1xuaW1wb3J0IHsgU2NhbGVTZXJ2aWNlIH0gZnJvbSBcIi4vc2NhbGVcIjtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZURFbGVtZW50ID0gKFxuICAgIGR0bzogREVsZW1lbnREdG8sXG4gICAgYWN0aW9uQnVzOiBEQ29tbWFuZEJ1cyxcbiAgICBldmVudEJ1czogRXZlbnRCdXMsXG4gICAgc2NhbGU6IFNjYWxlU2VydmljZVxuKTogREVsZW1lbnQ8YW55PiA9PiB7XG4gICAgc3dpdGNoIChkdG8uX3RhZykge1xuICAgICAgICBjYXNlIFwiZGl2XCI6XG4gICAgICAgICAgICBjb25zdCBjaGlsZEVscyA9IGNyZWF0ZUNoaWxkcmVuRm9yRGl2KGR0bywgYWN0aW9uQnVzLCBldmVudEJ1cywgc2NhbGUpO1xuICAgICAgICAgICAgY29uc3QgbmV3RGl2ID0gbmV3IEREaXYoZHRvLCBldmVudEJ1cywgYWN0aW9uQnVzLCBzY2FsZSwgY2hpbGRFbHMpO1xuICAgICAgICAgICAgcmV0dXJuIG5ld0RpdjtcbiAgICAgICAgY2FzZSBcImltZ1wiOlxuICAgICAgICAgICAgcmV0dXJuIG5ldyBESW1nKGR0bywgYWN0aW9uQnVzLCBldmVudEJ1cywgc2NhbGUpO1xuICAgICAgICBjYXNlIFwicFwiOlxuICAgICAgICAgICAgcmV0dXJuIG5ldyBEVGV4dChkdG8sIGV2ZW50QnVzLCBhY3Rpb25CdXMsIHNjYWxlKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGNvbnN0IGNoZWNrOiBuZXZlciA9IGR0bztcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gZHRvIGdpdmVuIHRvIHRoZSBjcmVhdGVERWxlbWVudCBmdW5jdGlvbi5cIik7XG4gICAgICAgIC8vIFRPRE8gTE9HR0lORyBvciBjcmVhdGUgYW55IEhUTUwtRUxFTUVOVD8/XG4gICAgfVxufTtcblxuY29uc3QgY3JlYXRlQ2hpbGRyZW5Gb3JEaXYgPSAoXG4gICAgZHRvOiBERGl2RHRvLFxuICAgIGFjdGlvblN1YmplY3Q6IERDb21tYW5kQnVzLFxuICAgIGV2ZW50QnVzOiBFdmVudEJ1cyxcbiAgICBzY2FsZTogU2NhbGVTZXJ2aWNlXG4pOiBERGl2W1wiY2hpbGRyZW5cIl0gPT4ge1xuICAgIGNvbnN0IGNoaWxkRHRvID0gZHRvLmNoaWxkcmVuO1xuICAgIGNvbnN0IGNoaWxkRWxzOiBBcnJheTxESW1nIHwgRFRleHQ+ID0gW107XG4gICAgLy8gY29uc29sZS5sb2coY2hpbGRFbGVtZW50cyk7XG4gICAgY2hpbGREdG8uZm9yRWFjaCgoZHRvKSA9PiB7XG4gICAgICAgIGlmIChkdG8uX3RhZyA9PT0gXCJwXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld1RleHQgPSBuZXcgRFRleHQoZHRvLCBldmVudEJ1cywgYWN0aW9uU3ViamVjdCwgc2NhbGUpO1xuICAgICAgICAgICAgY2hpbGRFbHMucHVzaChuZXdUZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZHRvLl90YWcgPT09IFwiaW1nXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld0ltYWdlID0gbmV3IERJbWcoZHRvLCBhY3Rpb25TdWJqZWN0LCBldmVudEJ1cywgc2NhbGUpO1xuICAgICAgICAgICAgY2hpbGRFbHMucHVzaChuZXdJbWFnZSk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gY2hpbGRFbHM7XG59O1xuIiwgImltcG9ydCB7IERFbGVtZW50IH0gZnJvbSBcIi4uL0RlbGVtZW50L0RFbGVtZW50XCI7XG5pbXBvcnQgeyBQYWdlRHRvIH0gZnJvbSBcIi4uL2R0by9TY2hlbWFEdG9cIjtcbmltcG9ydCB7IGNyZWF0ZURFbGVtZW50IH0gZnJvbSBcIi4vZWxlbWVudC1mYWN0b3J5XCI7XG5pbXBvcnQgeyBFdmVudEJ1cyB9IGZyb20gXCIuLi9ldmVudHMvZXZlbnQtYnVzXCI7XG5pbXBvcnQgeyBEQ29tbWFuZEJ1cyB9IGZyb20gXCIuLi9jb21tYW5kcy9EQ29tbWFuZEJ1c1wiO1xuaW1wb3J0IHsgRFRpbWVzdGFtcCB9IGZyb20gXCIuLi9jb21tb24vRFRpbWVzdGFtcFwiO1xuaW1wb3J0IHsgU2NhbGVTZXJ2aWNlIH0gZnJvbSBcIi4vc2NhbGVcIjtcblxuZXhwb3J0IGNsYXNzIERQYWdlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBUQUcgPSBcIlsgRFBhZ2UgXTogXCI7XG4gIHByaXZhdGUgZWxlbWVudHM6IERFbGVtZW50PEhUTUxFbGVtZW50PltdID0gW107XG4gIHByaXZhdGUgcmVhZG9ubHkgZXZlbnRCdXM7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29tbWFuZEJ1cztcbiAgcHJpdmF0ZSByZWFkb25seSBzY2FsZTogU2NhbGVTZXJ2aWNlO1xuICAvLyBUb2RvIEdMT0JBTCBFVkVOVF9CVVNTIEFORCBQQUdFIEVWRU5UUzpcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGR0bzogUGFnZUR0byxcbiAgICBldmVudEJ1czogRXZlbnRCdXMsXG4gICAgY29tbWFuZEJ1czogRENvbW1hbmRCdXMsXG4gICAgc2NhbGU6IFNjYWxlU2VydmljZSxcbiAgKSB7XG4gICAgdGhpcy5ldmVudEJ1cyA9IGV2ZW50QnVzO1xuICAgIHRoaXMuY29tbWFuZEJ1cyA9IGNvbW1hbmRCdXM7XG4gICAgdGhpcy5zY2FsZSA9IHNjYWxlO1xuICAgIHRoaXMuZWxlbWVudHMgPSBkdG8uZWxlbWVudHMubWFwKChkdG8pID0+IGNyZWF0ZURFbGVtZW50KGR0bywgdGhpcy5jb21tYW5kQnVzLCB0aGlzLmV2ZW50QnVzLCB0aGlzLnNjYWxlKSk7XG4gIH1cblxuICBhcHBlbmRZb3Vyc2VsZihwYXJlbnQ6IEhUTUxFbGVtZW50KSB7XG4gICAgLy8gY29uc29sZS5sb2codGhpcy5UQUcgKyBcIiBBUFBFTkRJTkcgVE8gUEFSRU5UXCIpO1xuICAgIHRoaXMuZWxlbWVudHMuZm9yRWFjaCgoZWwpID0+IHtcbiAgICAgIGVsLmFwcGVuZFlvdXJzZWxmKHBhcmVudCk7XG4gICAgICAvLyBwYXJlbnQuYXBwZW5kQ2hpbGQoZWwuZWwpO1xuICAgIH0pO1xuXG4gICAgLy8gaWYgKCFwcmVsb2FkTW9kZSkge1xuICAgIHRoaXMuZXZlbnRCdXMuZW1pdCh7XG4gICAgICBraW5kOiBcIlBBR0VfRU5URVJfRVZFTlRcIixcbiAgICAgIHRpbWVzdGFtcDogRFRpbWVzdGFtcC5ub3coKSxcbiAgICAgIHByb2R1Y2VyOiBcIkRQYWdlXCIsXG4gICAgICBwcm9kdWNlcklkOiB0aGlzLmlkLFxuICAgICAgZGF0YTogeyBwYWdlSWQ6IHRoaXMuaWQgfSxcbiAgICB9KTtcbiAgICAvLyB9XG4gIH1cblxuICBkZXN0cm95KCkge1xuICAgIHRoaXMuZWxlbWVudHMuZm9yRWFjaCgoZWwpID0+IHtcbiAgICAgIGVsLmRlc3Ryb3koKTtcbiAgICB9KTtcbiAgfVxuXG4gIGxvZygpOiB2b2lkIHtcbiAgICAvLyBjb25zb2xlLmxvZyh0aGlzLlRBRyArICdzY2FsZSAtICcgKyB0aGlzLnNjYWxlKTtcbiAgfVxuXG4gIGdldCBpZCgpIHtcbiAgICByZXR1cm4gdGhpcy5kdG8uaWQ7XG4gIH1cbn1cbiIsICJleHBvcnQgY2xhc3MgU2NhbGVTZXJ2aWNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBiYXNlSGVpZ2h0O1xuICBwcml2YXRlIHJlYWRvbmx5IGJhc2VXaWR0aDtcbiAgcHJpdmF0ZSBjb250YWluZXJIZWlnaHQgPSAxMzAwO1xuICBwcml2YXRlIGNvbnRhaW5lcldpZHRoID0gMTMwMDtcblxuICBnZXQgc2NhbGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NjYWxlO1xuICB9XG5cbiAgZ2V0IHBhZ2VIZWlnaHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuYmFzZUhlaWdodCAqIHRoaXMuc2NhbGU7XG4gIH1cbiAgZ2V0IHBhZ2VXaWR0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5iYXNlV2lkdGggKiB0aGlzLl9zY2FsZTtcbiAgfVxuXG4gIHByaXZhdGUgX3NjYWxlID0gMTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHN1YnNjcmliZXJzID0gbmV3IFNldDwoc2NhbGU6IG51bWJlcikgPT4gdm9pZD4oKTtcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IHsgYmFzZUhlaWdodDogbnVtYmVyOyBiYXNlV2lkdGg6IG51bWJlcjsgY29udGFpbmVySGVpZ2h0OiBudW1iZXI7IGNvbnRhaW5lcldpZHRoOiBudW1iZXIgfSkge1xuICAgIHRoaXMuYmFzZUhlaWdodCA9IGNvbmZpZy5iYXNlSGVpZ2h0O1xuICAgIHRoaXMuYmFzZVdpZHRoID0gY29uZmlnLmJhc2VXaWR0aDtcbiAgICB0aGlzLmNvbnRhaW5lckhlaWdodCA9IGNvbmZpZy5jb250YWluZXJIZWlnaHQ7XG4gICAgdGhpcy5jb250YWluZXJXaWR0aCA9IGNvbmZpZy5jb250YWluZXJXaWR0aDtcbiAgICB0aGlzLnVwZGF0ZVNjYWxlKCk7XG4gIH1cblxuICBzZXRDb250YWluZXJCb3VuZHMoYm91bmRzOiB7IGhlaWdodDogbnVtYmVyOyB3aWR0aDogbnVtYmVyIH0pIHtcbiAgICB0aGlzLmNvbnRhaW5lcldpZHRoID0gYm91bmRzLndpZHRoO1xuICAgIHRoaXMuY29udGFpbmVySGVpZ2h0ID0gYm91bmRzLmhlaWdodDtcbiAgICB0aGlzLnVwZGF0ZVNjYWxlKCk7XG4gIH1cbiAgcHJpdmF0ZSB1cGRhdGVTY2FsZSgpIHtcbiAgICBjb25zdCBzY2FsZUZuID0gU2NhbGUuY2FsYyh0aGlzLmJhc2VIZWlnaHQsIHRoaXMuYmFzZVdpZHRoKTtcbiAgICBjb25zdCBzY2FsZSA9IHNjYWxlRm4oeyBoZWlnaHQ6IHRoaXMuY29udGFpbmVySGVpZ2h0LCB3aWR0aDogdGhpcy5jb250YWluZXJXaWR0aCB9KTtcbiAgICBjb25zdCBoYXNDaGFuZ2VkID0gdGhpcy5zY2FsZSAhPT0gc2NhbGU7XG4gICAgdGhpcy5fc2NhbGUgPSBzY2FsZTtcbiAgICBpZiAoaGFzQ2hhbmdlZCkge1xuICAgICAgdGhpcy5zdWJzY3JpYmVycy5mb3JFYWNoKChmbikgPT4ge1xuICAgICAgICBmbih0aGlzLl9zY2FsZSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBvbkNoYW5nZShzY2FsZUNoYW5nZUhhbmRsZXI6IChzY2FsZTogbnVtYmVyKSA9PiB2b2lkLCBzdWJzY3JpYmVySWQ6IHN0cmluZykge1xuICAgIC8vIGNvbnNvbGUubG9nKHN1YnNjcmliZXJJZCk7XG4gICAgdGhpcy5zdWJzY3JpYmVycy5hZGQoc2NhbGVDaGFuZ2VIYW5kbGVyKTtcbiAgICBzY2FsZUNoYW5nZUhhbmRsZXIodGhpcy5fc2NhbGUpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICB0aGlzLnN1YnNjcmliZXJzLmRlbGV0ZShzY2FsZUNoYW5nZUhhbmRsZXIpO1xuICAgIH07XG4gIH1cbn1cbmV4cG9ydCBuYW1lc3BhY2UgU2NhbGUge1xuICBleHBvcnQgY29uc3QgY2FsYyA9IChiYXNlSGVpZ2h0OiBudW1iZXIsIGJhc2VXaWR0aDogbnVtYmVyKSA9PiB7XG4gICAgcmV0dXJuIChjb250YWluZXI6IHsgaGVpZ2h0OiBudW1iZXI7IHdpZHRoOiBudW1iZXIgfSkgPT4ge1xuICAgICAgY29uc3QgaGVpZ2h0UmF0aW8gPSBjb250YWluZXIuaGVpZ2h0IC8gYmFzZUhlaWdodDtcbiAgICAgIGNvbnN0IHdpZHRoUmF0aW8gPSBjb250YWluZXIud2lkdGggLyBiYXNlV2lkdGg7XG4gICAgICByZXR1cm4gTWF0aC5taW4oaGVpZ2h0UmF0aW8sIHdpZHRoUmF0aW8pO1xuICAgIH07XG4gIH07XG5cbiAgdHlwZSBTY2FsZVBvc0lucHV0ID0geyB4OiBudW1iZXI7IHk6IG51bWJlcjsgaDogbnVtYmVyOyB3OiBudW1iZXIgfTtcblxuICBleHBvcnQgY29uc3Qgc2NhbGVGdW5jdGlvbkNyZWF0b3IgPSAoc2NhbGU6IG51bWJlcikgPT4ge1xuICAgIHJldHVybiAodmFsdWU6IG51bWJlcikgPT4gdmFsdWUgKiBzY2FsZTtcbiAgfTtcbn1cbiIsICJpbXBvcnQgeyBEQXVkaW9EdG8sIERJbWdEdG8sIERWaWRlb0R0byB9IGZyb20gXCIuLi9kdG8vREVsZW1lbnQuZHRvXCI7XG5cbmV4cG9ydCBjbGFzcyBSZXNvdXJjZVByb3ZpZGVyIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IFRBRyA9IFwiWyBSRVNPVVJDRV9QUk9WSURFUiBdOiBcIjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHZpZGVvTWFwID0gbmV3IE1hcDxzdHJpbmcsIERWaWRlb0R0bz4oKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGF1ZGlvTWFwID0gbmV3IE1hcDxzdHJpbmcsIERBdWRpb0R0bz4oKTtcbiAgICBjb25zdHJ1Y3RvcihkYXRhOiB7IHZpZGVvczogUmVhZG9ubHlBcnJheTxEVmlkZW9EdG8+OyBhdWRpbzogUmVhZG9ubHlBcnJheTxEQXVkaW9EdG8+IH0pIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2codGhpcy5UQUcgKyBcIlZJREVPX0NPVU5UIFwiICsgZGF0YS52aWRlb3MubGVuZ3RoKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2codGhpcy5UQUcgKyBcIkFVRElPX0NPVU5UIFwiICsgZGF0YS5hdWRpby5sZW5ndGgpO1xuICAgICAgICBkYXRhLnZpZGVvcy5mb3JFYWNoKCh2aWRlbykgPT4ge1xuICAgICAgICAgICAgdGhpcy52aWRlb01hcC5zZXQodmlkZW8uaWQsIHZpZGVvKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGRhdGEuYXVkaW8uZm9yRWFjaCgoYXVkaW8pID0+IHtcbiAgICAgICAgICAgIHRoaXMuYXVkaW9NYXAuc2V0KGF1ZGlvLmlkLCBhdWRpbyk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldEF1ZGlvQnlJZChpZDogc3RyaW5nKTogREF1ZGlvRHRvIHwgZmFsc2Uge1xuICAgICAgICBjb25zdCBtYXliZUF1ZGlvID0gdGhpcy5hdWRpb01hcC5nZXQoaWQpO1xuICAgICAgICBpZiAoIW1heWJlQXVkaW8pIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IodGhpcy5UQUcgKyBcIkF1ZGlvIGJ5IGlkIFwiICsgaWQgKyBcIiBkb250IGV4aXN0XCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYXliZUF1ZGlvID8/IGZhbHNlO1xuICAgIH1cblxuICAgIGdldFZpZGVvQnlJZChpZDogc3RyaW5nKTogRFZpZGVvRHRvIHwgZmFsc2Uge1xuICAgICAgICBjb25zdCBtYXliZVZpZGVvID0gdGhpcy52aWRlb01hcC5nZXQoaWQpO1xuICAgICAgICBpZiAoIW1heWJlVmlkZW8pIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IodGhpcy5UQUcgKyBcIlZpZGVvIGJ5IGlkIFwiICsgaWQgKyBcIiBkb250IGV4aXN0XCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYXliZVZpZGVvID8/IGZhbHNlO1xuICAgIH1cbn1cbiIsICJleHBvcnQgY2xhc3MgT2s8VD4gaW1wbGVtZW50cyBJUmVzdWx0PFQ+IHtcbiAgICBjb25zdHJ1Y3RvcihyZWFkb25seSB2YWx1ZTogVCkge31cbiAgICBpc09rKCk6IHRoaXMgaXMgT2s8VD4ge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaXNGYWlsdXJlKCk6IHRoaXMgaXMgRmFpbHVyZTxUPiB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBtYXA8QT4oZjogKHQ6IFQpID0+IEEpOiBJUmVzdWx0PEE+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBmKHRoaXMudmFsdWUpO1xuICAgICAgICByZXR1cm4gbmV3IE9rPEE+KHZhbHVlKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBGYWlsdXJlPFQ+IGltcGxlbWVudHMgSVJlc3VsdDxUPiB7XG4gICAgY29uc3RydWN0b3IocmVhZG9ubHkgbWVzc2FnZTogc3RyaW5nKSB7fVxuICAgIGlzRmFpbHVyZSgpOiB0aGlzIGlzIEZhaWx1cmU8VD4ge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpc09rKCk6IHRoaXMgaXMgT2s8VD4ge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgbWFwPEE+KF9mOiAodDogVCkgPT4gQSk6IElSZXN1bHQ8QT4ge1xuICAgICAgICByZXR1cm4gbmV3IEZhaWx1cmU8QT4odGhpcy5tZXNzYWdlKTtcbiAgICB9XG59XG5cbmludGVyZmFjZSBJUmVzdWx0PFQ+IHtcbiAgICBpc09rKCk6IHRoaXMgaXMgT2s8VD47XG4gICAgaXNGYWlsdXJlKCk6IHRoaXMgaXMgRmFpbHVyZTxUPjtcbiAgICBtYXA8QT4oZjogKHQ6IFQpID0+IEEpOiBJUmVzdWx0PEE+O1xufVxuXG5leHBvcnQgdHlwZSBSZXN1bHQ8VD4gPSBGYWlsdXJlPFQ+IHwgT2s8VD47XG5leHBvcnQgbmFtZXNwYWNlIFJlc3VsdCB7XG4gICAgZXhwb3J0IGNvbnN0IG9rID0gPFQ+KHZhbHVlOiBUKSA9PiBuZXcgT2s8VD4odmFsdWUpO1xuICAgIGV4cG9ydCBjb25zdCBmYWlsdXJlID0gPFQ+KG1lc3NhZ2U6IHN0cmluZykgPT4gbmV3IEZhaWx1cmU8VD4obWVzc2FnZSk7XG59XG4iLCAiaW1wb3J0IHsgRmFjdCB9IGZyb20gXCIuLi9ydWxlcy9mYWN0XCI7XG5pbXBvcnQgeyBDb25kaXRpb24gfSBmcm9tIFwiLi4vcnVsZXMvY29uZGl0aW9uXCI7XG5pbXBvcnQgeyBERXZlbnQgfSBmcm9tIFwiLi4vZXZlbnRzL0RFdmVudHNcIjtcbmltcG9ydCB7IFN0YXRlQ29tbWFuZCB9IGZyb20gXCIuLi9jb21tYW5kcy9EQ29tbWFuZFwiO1xuXG5leHBvcnQgbmFtZXNwYWNlIERTdGF0ZSB7XG4gICAgaW50ZXJmYWNlIFByb3BEZWZpbml0aW9uPFR5cGVOYW1lLCBUeXBlIGV4dGVuZHMgc3RyaW5nIHwgbnVtYmVyPiB7XG4gICAgICAgIHJlYWRvbmx5IF90eXBlOiBUeXBlTmFtZTtcbiAgICAgICAgcmVhZG9ubHkgcHJvcE5hbWU6IHN0cmluZztcbiAgICAgICAgcmVhZG9ubHkgcHJvcERlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgICAgIHJlYWRvbmx5IGluaXRpYWxWYWx1ZT86IFR5cGU7XG4gICAgICAgIHJlYWRvbmx5IG9wdGlvbnM/OiBSZWFkb25seUFycmF5PFByb3BWYWx1ZTxUeXBlPj47XG4gICAgfVxuXG4gICAgZXhwb3J0IHR5cGUgTnVtZXJpY1Byb3AgPSBQcm9wRGVmaW5pdGlvbjxcIm51bWJlclwiLCBudW1iZXI+O1xuICAgIGV4cG9ydCB0eXBlIFN0cmluZ1Byb3AgPSBQcm9wRGVmaW5pdGlvbjxcInN0cmluZ1wiLCBzdHJpbmc+O1xuXG4gICAgZXhwb3J0IGludGVyZmFjZSBmcm9tRXZlbnRIYW5kbGVyIHtcbiAgICAgICAgcmVhZG9ubHkgb25FdmVudDogREV2ZW50W1wia2luZFwiXTtcbiAgICAgICAgcmVhZG9ubHkgdGhlbkV4ZWN1dGU6IFJlYWRvbmx5QXJyYXk8U3RhdGVDb21tYW5kPjtcbiAgICB9XG5cbiAgICBleHBvcnQgaW50ZXJmYWNlIFByb3BWYWx1ZTxUPiB7XG4gICAgICAgIHJlYWRvbmx5IHZhbHVlOiBUO1xuICAgICAgICByZWFkb25seSB2YWx1ZUxhYmVsOiBzdHJpbmc7XG4gICAgfVxuICAgIGV4cG9ydCB0eXBlIFByb3AgPSBOdW1lcmljUHJvcCB8IFN0cmluZ1Byb3A7XG5cbiAgICBleHBvcnQgaW50ZXJmYWNlIFNldFN0cmluZ011dGF0aW9uIHtcbiAgICAgICAgcmVhZG9ubHkga2luZDogXCJzZXQtc3RyaW5nXCI7XG4gICAgICAgIHJlYWRvbmx5IHByb3BOYW1lOiBzdHJpbmc7XG4gICAgICAgIHJlYWRvbmx5IHZhbHVlOiBzdHJpbmc7XG4gICAgfVxuXG4gICAgZXhwb3J0IGludGVyZmFjZSBJbmNyZW1lbnROdW1iZXJNdXRhdGlvbiB7XG4gICAgICAgIHJlYWRvbmx5IGtpbmQ6IFwiaW5jcmVtZW50LW51bWJlclwiO1xuICAgICAgICByZWFkb25seSBwcm9wTmFtZTogc3RyaW5nO1xuICAgICAgICByZWFkb25seSBzdGVwU2l6ZTogbnVtYmVyO1xuICAgICAgICByZWFkb25seSBpZk5vdEV4aXN0VGhlblNldFRvOiBudW1iZXI7XG4gICAgfVxuICAgIGV4cG9ydCBpbnRlcmZhY2UgRGVjcmVtZW50TnVtYmVyTXV0YXRpb24ge1xuICAgICAgICByZWFkb25seSBraW5kOiBcImRlY3JlbWVudC1udW1iZXJcIjtcbiAgICAgICAgcmVhZG9ubHkgcHJvcE5hbWU6IHN0cmluZztcbiAgICAgICAgcmVhZG9ubHkgc3RlcFNpemU6IG51bWJlcjtcbiAgICAgICAgcmVhZG9ubHkgaWZOb3RFeGlzdFRoZW5TZXRUbzogbnVtYmVyO1xuICAgIH1cblxuICAgIGV4cG9ydCBpbnRlcmZhY2UgU2V0TnVtYmVyTXV0YXRpb24ge1xuICAgICAgICByZWFkb25seSBraW5kOiBcInNldC1udW1iZXJcIjtcbiAgICAgICAgcmVhZG9ubHkgcHJvcE5hbWU6IHN0cmluZztcbiAgICAgICAgcmVhZG9ubHkgdmFsdWU6IG51bWJlcjtcbiAgICB9XG4gICAgZXhwb3J0IHR5cGUgTnVtYmVyTXV0YXRpb25zID0gSW5jcmVtZW50TnVtYmVyTXV0YXRpb24gfCBEZWNyZW1lbnROdW1iZXJNdXRhdGlvbiB8IFNldE51bWJlck11dGF0aW9uO1xuXG4gICAgZXhwb3J0IHR5cGUgU3RhdGVNdXRhdGlvbiA9IFNldFN0cmluZ011dGF0aW9uIHwgTnVtYmVyTXV0YXRpb25zO1xuXG4gICAgZXhwb3J0IGNvbnN0IGlzTnVtYmVyTXV0YXRpb24gPSAobXV0YXRpb25zOiBTdGF0ZU11dGF0aW9uKTogbXV0YXRpb25zIGlzIE51bWJlck11dGF0aW9ucyA9PiB7XG4gICAgICAgIGlmICghbXV0YXRpb25zKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgbXV0YXRpb25zLmtpbmQgPT09IFwic2V0LW51bWJlclwiIHx8XG4gICAgICAgICAgICBtdXRhdGlvbnMua2luZCA9PT0gXCJkZWNyZW1lbnQtbnVtYmVyXCIgfHxcbiAgICAgICAgICAgIG11dGF0aW9ucy5raW5kID09PSBcImluY3JlbWVudC1udW1iZXJcIlxuICAgICAgICApO1xuICAgIH07XG5cbiAgICBleHBvcnQgY29uc3QgaXNTdHJpbmdNdXRhdGlvbiA9IChtdXRhdGlvbjogU3RhdGVNdXRhdGlvbik6IG11dGF0aW9uIGlzIFNldFN0cmluZ011dGF0aW9uID0+IHtcbiAgICAgICAgcmV0dXJuIG11dGF0aW9uICYmIG11dGF0aW9uLmtpbmQgPT09IFwic2V0LXN0cmluZ1wiO1xuICAgIH07XG5cbiAgICBleHBvcnQgaW50ZXJmYWNlIFN0YXRlUXVlcnkge1xuICAgICAgICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gICAgICAgIHJlYWRvbmx5IGNvbmRpdGlvbjogQ29uZGl0aW9uO1xuICAgIH1cblxuICAgIGV4cG9ydCBpbnRlcmZhY2UgU3RhdGVRdWVyeVJlc3VsdCB7XG4gICAgICAgIHJlYWRvbmx5IHF1ZXJ5TmFtZTogc3RyaW5nO1xuICAgICAgICByZWFkb25seSBwcmV2OiBib29sZWFuO1xuICAgICAgICByZWFkb25seSBjdXJyOiBib29sZWFuO1xuICAgIH1cblxuICAgIGV4cG9ydCBjb25zdCBudW1lcmljUHJvcFRvRmFjdCA9IChwcm9wOiBOdW1lcmljUHJvcCwgdmFsdWU6IG51bWJlcikgPT4ge1xuICAgICAgICBjb25zdCBmYWN0OiBGYWN0Lk51bWVyaWMgPSB7XG4gICAgICAgICAgICBraW5kOiBcIm51bWVyaWMtZmFjdFwiLFxuICAgICAgICAgICAgcmVmZXJlbmNlSWQ6IHByb3AucHJvcE5hbWUsXG4gICAgICAgICAgICByZWZlcmVuY2VMYWJlbDogcHJvcC5wcm9wRGVzY3JpcHRpb24gPz8gXCIgW1NUQVRFX1BST1BFUlRZXSA6IFwiICsgcHJvcC5wcm9wTmFtZSxcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgbGFiZWw6IFwiIFtWQUxVRV0gOiBcIiArIHZhbHVlLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gZmFjdDtcbiAgICB9O1xuXG4gICAgZXhwb3J0IGNvbnN0IHN0cmluZ1Byb3BUb0ZhY3QgPSAocHJvcDogU3RyaW5nUHJvcCwgdmFsdWU6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCBmYWN0OiBGYWN0LlN0cmluZyA9IHtcbiAgICAgICAgICAgIGtpbmQ6IFwic3RyaW5nLWZhY3RcIixcbiAgICAgICAgICAgIHJlZmVyZW5jZUlkOiBwcm9wLnByb3BOYW1lLFxuICAgICAgICAgICAgcmVmZXJlbmNlTGFiZWw6IFwiIFtTVEFURV9QUk9QRVJUWV0gOiBcIiArIHByb3AucHJvcE5hbWUsXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIGxhYmVsOiBcIiBbVkFMVUVdIDogXCIgKyB2YWx1ZSxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGZhY3Q7XG4gICAgfTtcbn1cbiIsICJpbXBvcnQgeyBGYWN0IH0gZnJvbSBcIi4uL3J1bGVzL2ZhY3RcIjtcbmltcG9ydCB7IFJlc3VsdCB9IGZyb20gXCIuLi9jb21tb24vcmVzdWx0XCI7XG5pbXBvcnQgeyBDb25kaXRpb24gfSBmcm9tIFwiLi4vcnVsZXMvY29uZGl0aW9uXCI7XG5pbXBvcnQgeyBEU3RhdGUgfSBmcm9tIFwiLi9Ec3RhdGVcIjtcbmltcG9ydCB7IERFdmVudERpc3BhdGNoZXIgfSBmcm9tIFwiLi4vZXZlbnRzL2V2ZW50LWJ1c1wiO1xuaW1wb3J0IHsgRFRpbWVzdGFtcCB9IGZyb20gXCIuLi9jb21tb24vRFRpbWVzdGFtcFwiO1xuaW1wb3J0IHsgUXVlcnlDaGFuZ2VkRXZlbnQgfSBmcm9tIFwiLi4vZXZlbnRzL0RFdmVudHNcIjtcbmltcG9ydCB7IERDb21tYW5kQnVzIH0gZnJvbSBcIi4uL2NvbW1hbmRzL0RDb21tYW5kQnVzXCI7XG5cbmV4cG9ydCBjbGFzcyBTdGF0ZVNlcnZpY2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IFRBRyA9IFwiIFsgU1RBVEVfU0VSVklDRSBdIDpcIjtcbiAgcHJpdmF0ZSByZWFkb25seSBmYWN0c1N0cmluZyA9IG5ldyBNYXA8c3RyaW5nLCBGYWN0LlN0cmluZz4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBmYWN0c051bWVyaWMgPSBuZXcgTWFwPHN0cmluZywgRmFjdC5OdW1lcmljPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHByb3BEZWZpbml0aW9ucyA9IG5ldyBNYXA8c3RyaW5nLCBEU3RhdGUuUHJvcD4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBxdWVyaWVzID0gbmV3IE1hcDxzdHJpbmcsIHsgcXVlcnk6IERTdGF0ZS5TdGF0ZVF1ZXJ5OyBsYXN0UmVzdWx0OiBib29sZWFuIH0+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgdW5zdWJzY3JpYmVDb21tYW5kczogKCkgPT4gdm9pZDtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBldmVudEJ1czogREV2ZW50RGlzcGF0Y2hlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbW1hbmRCdXM6IERDb21tYW5kQnVzLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcHJvcHM6IFJlYWRvbmx5QXJyYXk8RFN0YXRlLlByb3A+LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcXVlcnlMaXN0OiBSZWFkb25seUFycmF5PERTdGF0ZS5TdGF0ZVF1ZXJ5PiA9IFtdLFxuICApIHtcbiAgICBwcm9wcy5mb3JFYWNoKChwcm9wKSA9PiB7XG4gICAgICB0aGlzLnJlZ2lzdGVyUHJvcGVydHkocHJvcCk7XG4gICAgfSk7XG4gICAgY29uc3QgZmFjdHMgPSB0aGlzLmdldEFsbEZhY3RzKCk7XG4gICAgcXVlcnlMaXN0LmZvckVhY2goKGRlZmluaXRpb24pID0+IHtcbiAgICAgIHRoaXMucmVnaXN0ZXJRdWVyeShkZWZpbml0aW9uLCBmYWN0cyk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmV2YWx1YXRlUXVlcmllcygpO1xuICAgIHRoaXMudW5zdWJzY3JpYmVDb21tYW5kcyA9IHRoaXMuY29tbWFuZEJ1cy5zdWJzY3JpYmUoKGNvbW1hbmQpID0+IHtcbiAgICAgIGlmIChjb21tYW5kLmtpbmQgPT09IFwiU1RBVEVfTVVUQVRFX0NPTU1BTkRcIikge1xuICAgICAgICB0aGlzLm11dGF0aW9uKGNvbW1hbmQucGF5bG9hZC5tdXRhdGlvbik7XG4gICAgICB9XG4gICAgfSwgdGhpcy5UQUcpO1xuICB9XG5cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLnVuc3Vic2NyaWJlQ29tbWFuZHMoKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVnaXN0ZXJRdWVyeShxdWVyeTogRFN0YXRlLlN0YXRlUXVlcnksIGN1cnJlbnRGYWN0czogUmVhZG9ubHlBcnJheTxGYWN0Pikge1xuICAgIGNvbnN0IHJlc3VsdCA9IENvbmRpdGlvbi5ldmFsdWF0ZShxdWVyeS5jb25kaXRpb24sIGN1cnJlbnRGYWN0cyk7XG4gICAgdGhpcy5xdWVyaWVzLnNldChxdWVyeS5uYW1lLCB7IHF1ZXJ5OiBxdWVyeSwgbGFzdFJlc3VsdDogcmVzdWx0IH0pO1xuICAgIHRoaXMuZW1pdFF1ZXJ5Q2hhbmdlZEV2ZW50KHsgcXVlcnlOYW1lOiBxdWVyeS5uYW1lLCBwcmV2OiByZXN1bHQsIGN1cnI6IHJlc3VsdCB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVnaXN0ZXJQcm9wZXJ0eShwcm9wOiBEU3RhdGUuUHJvcCkge1xuICAgIGlmICh0aGlzLnByb3BEZWZpbml0aW9ucy5oYXMocHJvcC5wcm9wTmFtZSkpIHtcbiAgICAgIC8vIExPR0dJTkdcbiAgICAgIGNvbnNvbGUud2FybihcIlByb3AgZXhjaXN0cyBhbHJlYWR5LlwiLCBwcm9wLnByb3BOYW1lKTtcbiAgICB9XG5cbiAgICB0aGlzLnByb3BEZWZpbml0aW9ucy5zZXQocHJvcC5wcm9wTmFtZSwgcHJvcCk7XG5cbiAgICBpZiAocHJvcC5pbml0aWFsVmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChwcm9wLl90eXBlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBjb25zdCBmYWN0ID0gRFN0YXRlLnN0cmluZ1Byb3BUb0ZhY3QocHJvcCwgcHJvcC5pbml0aWFsVmFsdWUpO1xuICAgICAgdGhpcy5mYWN0c1N0cmluZy5zZXQoZmFjdC5yZWZlcmVuY2VJZCwgZmFjdCk7XG4gICAgfVxuICAgIGlmIChwcm9wLl90eXBlID09PSBcIm51bWJlclwiKSB7XG4gICAgICBjb25zdCBmYWN0ID0gRFN0YXRlLm51bWVyaWNQcm9wVG9GYWN0KHByb3AsIHByb3AuaW5pdGlhbFZhbHVlKTtcbiAgICAgIHRoaXMuZmFjdHNOdW1lcmljLnNldChmYWN0LnJlZmVyZW5jZUlkLCBmYWN0KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG11dGF0ZVN0cmluZyhwcm9wOiBEU3RhdGUuU3RyaW5nUHJvcCwgdmFsdWU6IHN0cmluZykge1xuICAgIGNvbnN0IGN1cnIgPSB0aGlzLmZhY3RzU3RyaW5nLmdldChwcm9wLnByb3BOYW1lKTtcbiAgICBpZiAoY3Vycikge1xuICAgICAgY29uc3QgdXBkYXRlZDogRmFjdC5TdHJpbmcgPSB7IC4uLmN1cnIsIHZhbHVlIH07XG4gICAgICB0aGlzLnNldEZhY3QodXBkYXRlZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGNyZWF0ZWQ6IEZhY3QuU3RyaW5nID0ge1xuICAgICAgICBraW5kOiBcInN0cmluZy1mYWN0XCIsXG4gICAgICAgIHJlZmVyZW5jZUlkOiBwcm9wLnByb3BOYW1lLFxuICAgICAgICByZWZlcmVuY2VMYWJlbDogXCJsYWJlbCBmb3I6IFwiICsgcHJvcC5wcm9wTmFtZSxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIGxhYmVsOiBcIlZhbHVlOiBcIiArIHZhbHVlLFxuICAgICAgfTtcbiAgICAgIHRoaXMuc2V0RmFjdChjcmVhdGVkKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG11dGF0ZU51bWJlcihwcm9wOiBEU3RhdGUuTnVtZXJpY1Byb3AsIG11dGF0aW9uOiBEU3RhdGUuTnVtYmVyTXV0YXRpb25zKSB7XG4gICAgY29uc3QgY3VyciA9IHRoaXMuZmFjdHNOdW1lcmljLmdldChwcm9wLnByb3BOYW1lKTtcbiAgICBpZiAoIWN1cnIpIHtcbiAgICAgIHN3aXRjaCAobXV0YXRpb24ua2luZCkge1xuICAgICAgICBjYXNlIFwic2V0LW51bWJlclwiOlxuICAgICAgICAgIHRoaXMuc2V0RmFjdChEU3RhdGUubnVtZXJpY1Byb3BUb0ZhY3QocHJvcCwgbXV0YXRpb24udmFsdWUpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImRlY3JlbWVudC1udW1iZXJcIjpcbiAgICAgICAgICB0aGlzLnNldEZhY3QoRFN0YXRlLm51bWVyaWNQcm9wVG9GYWN0KHByb3AsIG11dGF0aW9uLmlmTm90RXhpc3RUaGVuU2V0VG8pKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImluY3JlbWVudC1udW1iZXJcIjpcbiAgICAgICAgICB0aGlzLnNldEZhY3QoRFN0YXRlLm51bWVyaWNQcm9wVG9GYWN0KHByb3AsIG11dGF0aW9uLmlmTm90RXhpc3RUaGVuU2V0VG8pKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBjb25zdCBjaGVjazogbmV2ZXIgPSBtdXRhdGlvbjtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGN1cnIpIHtcbiAgICAgIHN3aXRjaCAobXV0YXRpb24ua2luZCkge1xuICAgICAgICBjYXNlIFwic2V0LW51bWJlclwiOlxuICAgICAgICAgIHRoaXMuc2V0RmFjdCh7IC4uLmN1cnIsIHZhbHVlOiBtdXRhdGlvbi52YWx1ZSB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImRlY3JlbWVudC1udW1iZXJcIjpcbiAgICAgICAgICB0aGlzLnNldEZhY3QoeyAuLi5jdXJyLCB2YWx1ZTogY3Vyci52YWx1ZSAtIG11dGF0aW9uLnN0ZXBTaXplIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiaW5jcmVtZW50LW51bWJlclwiOlxuICAgICAgICAgIHRoaXMuc2V0RmFjdCh7IC4uLmN1cnIsIHZhbHVlOiBjdXJyLnZhbHVlICsgbXV0YXRpb24uc3RlcFNpemUgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgY29uc3QgY2hlY2s6IG5ldmVyID0gbXV0YXRpb247XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBldmFsdWF0ZVF1ZXJpZXMoKTogUmVhZG9ubHlBcnJheTx7IHF1ZXJ5TmFtZTogc3RyaW5nOyBwcmV2OiBib29sZWFuOyBjdXJyOiBib29sZWFuOyBkaWRDaGFuZ2U6IGJvb2xlYW4gfT4ge1xuICAgIGNvbnN0IGZhY3RzID0gdGhpcy5nZXRBbGxGYWN0cygpO1xuICAgIGNvbnN0IGFsbDogQXJyYXk8eyBxdWVyeU5hbWU6IHN0cmluZzsgcHJldjogYm9vbGVhbjsgY3VycjogYm9vbGVhbjsgZGlkQ2hhbmdlOiBib29sZWFuIH0+ID0gW107XG4gICAgdGhpcy5xdWVyaWVzLmZvckVhY2goKHEpID0+IHtcbiAgICAgIGNvbnN0IHByZXYgPSBxLmxhc3RSZXN1bHQ7XG5cbiAgICAgIGNvbnN0IGN1cnIgPSBDb25kaXRpb24uZXZhbHVhdGUocS5xdWVyeS5jb25kaXRpb24sIGZhY3RzKTtcbiAgICAgIGNvbnN0IGRpZENoYW5nZSA9IHByZXYgIT09IGN1cnI7XG4gICAgICBxLmxhc3RSZXN1bHQgPSBjdXJyO1xuICAgICAgYWxsLnB1c2goeyBxdWVyeU5hbWU6IHEucXVlcnkubmFtZSwgcHJldiwgY3VyciwgZGlkQ2hhbmdlIH0pO1xuICAgICAgLy8gZGVmLnZhbHVlID0gdmFsdWU7XG4gICAgfSk7XG4gICAgcmV0dXJuIGFsbDtcbiAgfVxuXG4gIHByaXZhdGUgbXV0YXRpb24obXV0YXRpb246IERTdGF0ZS5TdGF0ZU11dGF0aW9uKTogeyBzdWNjZXNzOiBib29sZWFuIH0ge1xuICAgIGNvbnN0IHByb3BEZWYgPSB0aGlzLnByb3BEZWZpbml0aW9ucy5nZXQobXV0YXRpb24ucHJvcE5hbWUpO1xuICAgIGlmICghcHJvcERlZikge1xuICAgICAgLy8gVE9ETyBMT0dHSU5HXG4gICAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIGlmIChwcm9wRGVmLl90eXBlID09PSBcInN0cmluZ1wiICYmIERTdGF0ZS5pc1N0cmluZ011dGF0aW9uKG11dGF0aW9uKSkge1xuICAgICAgdGhpcy5tdXRhdGVTdHJpbmcocHJvcERlZiwgbXV0YXRpb24udmFsdWUpO1xuICAgIH1cblxuICAgIGlmIChwcm9wRGVmLl90eXBlID09PSBcIm51bWJlclwiICYmIERTdGF0ZS5pc051bWJlck11dGF0aW9uKG11dGF0aW9uKSkge1xuICAgICAgdGhpcy5tdXRhdGVOdW1iZXIocHJvcERlZiwgbXV0YXRpb24pO1xuICAgIH1cbiAgICBjb25zdCBxdWVyeVJlc3VsdHMgPSB0aGlzLmV2YWx1YXRlUXVlcmllcygpO1xuICAgIGNvbnN0IGNoYW5nZWRSZXN1bHQgPSBxdWVyeVJlc3VsdHMuZmlsdGVyKChyKSA9PiByLmRpZENoYW5nZSk7XG4gICAgY2hhbmdlZFJlc3VsdC5mb3JFYWNoKChyZXMpID0+IHtcbiAgICAgIHRoaXMuZW1pdFF1ZXJ5Q2hhbmdlZEV2ZW50KHsgcXVlcnlOYW1lOiByZXMucXVlcnlOYW1lLCBwcmV2OiByZXMucHJldiwgY3VycjogcmVzLmN1cnIgfSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlIH07XG4gIH1cblxuICBwcml2YXRlIGVtaXRRdWVyeUNoYW5nZWRFdmVudChkYXRhOiB7IHF1ZXJ5TmFtZTogc3RyaW5nOyBwcmV2OiBib29sZWFuOyBjdXJyOiBib29sZWFuIH0pIHtcbiAgICBjb25zdCBxdWVyeUNoYW5nZWRFdmVudDogUXVlcnlDaGFuZ2VkRXZlbnQgPSB7XG4gICAgICBraW5kOiBcIlNUQVRFX1FVRVJZX1JFU1VMVF9DSEFOR0VEX0VWRU5UXCIsXG4gICAgICBwcm9kdWNlcjogXCJTVEFURS1TRVJWSUNFXCIsXG4gICAgICBwcm9kdWNlcklkOiBcIlNUQVRFLVNFUlZJQ0VcIixcbiAgICAgIHRpbWVzdGFtcDogRFRpbWVzdGFtcC5ub3coKSxcbiAgICAgIGRhdGEsXG4gICAgfTtcbiAgICBjb25zdCB7IHF1ZXJ5TmFtZSwgY3VyciwgcHJldiB9ID0gcXVlcnlDaGFuZ2VkRXZlbnQuZGF0YTtcbiAgICAvLyBjb25zb2xlLmxvZyhcIlsgUVVFUllfQ0hBTkdFRCBcIiArIHF1ZXJ5TmFtZSArIFwiXSA6IFwiICsgcHJldiArIFwiIC0+IFwiICsgY3Vycik7XG4gICAgdGhpcy5ldmVudEJ1cy5lbWl0KHF1ZXJ5Q2hhbmdlZEV2ZW50KTtcbiAgfVxuXG4gIGdldFByb3BBc0ZhY3QocHJvcE5hbWU6IHN0cmluZyk6IFJlc3VsdDxGYWN0PiB7XG4gICAgY29uc3QgcHJvcERlZiA9IHRoaXMucHJvcERlZmluaXRpb25zLmdldChwcm9wTmFtZSk7XG4gICAgaWYgKCFwcm9wRGVmKSB7XG4gICAgICByZXR1cm4gUmVzdWx0LmZhaWx1cmUoXG4gICAgICAgIFwiTm8gZGVmaW5pdGlvbiBmb3JtIHByb3BlcnR5IG55IG5hbWUgXCIgKyBwcm9wTmFtZSArIFwiIGlzIHJlZ2lzdGVyZWQuIChQYXNzIGluIGNvbnN0cnVjdG9yLilcIixcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5mYWN0c1N0cmluZy5nZXQocHJvcE5hbWUpID8/IHRoaXMuZmFjdHNOdW1lcmljLmdldChwcm9wTmFtZSk7XG5cbiAgICByZXR1cm4gdmFsdWUgPyBSZXN1bHQub2sodmFsdWUpIDogUmVzdWx0LmZhaWx1cmUoXCJQcm9wZXJ0eSBcIiArIHByb3BOYW1lICsgXCIgaGFzIG5vIHZhbHVlLlwiKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0RmFjdChmYWN0OiBGYWN0KSB7XG4gICAgc3dpdGNoIChmYWN0LmtpbmQpIHtcbiAgICAgIGNhc2UgXCJudW1lcmljLWZhY3RcIjpcbiAgICAgICAgdGhpcy5mYWN0c051bWVyaWMuc2V0KGZhY3QucmVmZXJlbmNlSWQsIGZhY3QpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJzdHJpbmctZmFjdFwiOlxuICAgICAgICB0aGlzLmZhY3RzU3RyaW5nLnNldChmYWN0LnJlZmVyZW5jZUlkLCBmYWN0KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBjb25zdCBjaGVjazogbmV2ZXIgPSBmYWN0O1xuICAgIH1cbiAgfVxuXG4gIGdldFN0YXRlKCkge1xuICAgIGNvbnN0IHByb3BzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXIgfCBudWxsIHwgYm9vbGVhbj4gPSB7fTtcbiAgICB0aGlzLnByb3BEZWZpbml0aW9ucy5mb3JFYWNoKChkZWYpID0+IHtcbiAgICAgIGxldCB2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgICBjb25zdCBtYXliZUZhY3QgPSB0aGlzLmdldEFueUZhY3QoZGVmLnByb3BOYW1lKTtcbiAgICAgIGlmIChtYXliZUZhY3QpIHtcbiAgICAgICAgdmFsdWUgPSBtYXliZUZhY3QudmFsdWU7XG4gICAgICB9XG4gICAgICBwcm9wc1tkZWYucHJvcE5hbWVdID0gdmFsdWU7XG4gICAgfSk7XG4gICAgdGhpcy5xdWVyaWVzLmZvckVhY2goKHF1ZXJ5KSA9PiB7XG4gICAgICBwcm9wc1txdWVyeS5xdWVyeS5uYW1lXSA9IHF1ZXJ5Lmxhc3RSZXN1bHQ7XG4gICAgfSk7XG5cbiAgICBjb25zdCBwcm9wTmFtZXMgPSBPYmplY3Qua2V5cyhwcm9wcyk7XG4gICAgY29uc3QgcHJvcENvdW50ID0gcHJvcE5hbWVzLmxlbmd0aDtcbiAgICBjb25zdCBwcm9wQXJyYXkgPSBbLi4udGhpcy5wcm9wRGVmaW5pdGlvbnMudmFsdWVzKCldO1xuXG4gICAgcmV0dXJuIHsgcHJvcENvdW50LCBwcm9wTmFtZXMsIHByb3BBcnJheSwgc3RhdGU6IHByb3BzIH07XG4gIH1cblxuICBwcml2YXRlIGdldEFueUZhY3QocHJvcE5hbWU6IHN0cmluZyk6IEZhY3QgfCBmYWxzZSB7XG4gICAgcmV0dXJuIHRoaXMuZmFjdHNTdHJpbmcuZ2V0KHByb3BOYW1lKSA/PyB0aGlzLmZhY3RzTnVtZXJpYy5nZXQocHJvcE5hbWUpID8/IGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRBbGxGYWN0cygpOiBSZWFkb25seUFycmF5PEZhY3Q+IHtcbiAgICByZXR1cm4gWy4uLnRoaXMuZmFjdHNOdW1lcmljLnZhbHVlcygpLCAuLi50aGlzLmZhY3RzU3RyaW5nLnZhbHVlcygpXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaWxsIGNoZWNrIHRoYXQgYWxsIHJlZmVyZW5jZUlkcyB1c2VkIGluIENvbmRpdGlvbiBpcyByZWdpc3RlcmVkIGFzIGEgdmFsaWQgcHJvcGVydHkgaW4gc3RhdGUuXG4gICAqIEBwYXJhbSBjb25kaXRpb25cbiAgICovXG4gIGNhbkJlTWF0Y2hlZChjb25kaXRpb246IENvbmRpdGlvbik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHNpbXBsZUNvbmRpdGlvbnMgPSBDb25kaXRpb24uZ2V0QWxsU2ltcGxlQ29uZGl0aW9ucyhjb25kaXRpb24pO1xuICAgIGxldCBoYXNBbGwgPSB0cnVlO1xuXG4gICAgY29uc3QgYWxsSWRzID0gc2ltcGxlQ29uZGl0aW9ucy5tYXAoKGMpID0+IGMucmVmZXJlbmNlSWQpO1xuXG4gICAgY29uc3QgbWlzc2luZ0lkczogc3RyaW5nW10gPSBbXTtcbiAgICBhbGxJZHMuZm9yRWFjaCgoaWQpID0+IHtcbiAgICAgIGlmICghdGhpcy5wcm9wRGVmaW5pdGlvbnMuaGFzKGlkKSkge1xuICAgICAgICBoYXNBbGwgPSBmYWxzZTtcbiAgICAgICAgbWlzc2luZ0lkcy5wdXNoKGlkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zb2xlLmxvZyh0aGlzLlRBRywgbWlzc2luZ0lkcyk7XG5cbiAgICByZXR1cm4gaGFzQWxsO1xuICB9XG4gIGlzTWF0Y2hlZChjb25kaXRpb246IENvbmRpdGlvbikge1xuICAgIHJldHVybiBDb25kaXRpb24uZXZhbHVhdGUoY29uZGl0aW9uLCB0aGlzLmdldEFsbEZhY3RzKCkpO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgU2NoZW1hRHRvIH0gZnJvbSBcIi4uL2R0by9TY2hlbWFEdG9cIjtcbmltcG9ydCB7IERNZWRpYU1hbmFnZXIgfSBmcm9tIFwiLi4vc2VydmljZXMvRE1lZGlhLW1hbmFnZXJcIjtcbmltcG9ydCB7IERDb21tYW5kQnVzIH0gZnJvbSBcIi4uL2NvbW1hbmRzL0RDb21tYW5kQnVzXCI7XG5pbXBvcnQgeyBFdmVudEJ1cyB9IGZyb20gXCIuLi9ldmVudHMvZXZlbnQtYnVzXCI7XG5pbXBvcnQgeyBEUGxheWVyIH0gZnJvbSBcIi4uL3BsYXllci9kcGxheWVyXCI7XG5pbXBvcnQgeyBBbnN3ZXJlZFF1ZXN0aW9uIH0gZnJvbSBcIi4uL3BsYXllci9oaXN0b3J5LXF1ZVwiO1xuaW1wb3J0IHsgRFRpbWVzdGFtcCB9IGZyb20gXCIuLi9jb21tb24vRFRpbWVzdGFtcFwiO1xuaW1wb3J0IHsgRFBhZ2UgfSBmcm9tIFwiLi9EUGFnZVwiO1xuaW1wb3J0IHsgU2NhbGVTZXJ2aWNlIH0gZnJvbSBcIi4vc2NhbGVcIjtcbmltcG9ydCB7IFJlc291cmNlUHJvdmlkZXIgfSBmcm9tIFwiLi4vc2VydmljZXMvcmVzb3VyY2UtcHJvdmlkZXJcIjtcbmltcG9ydCB7IFN0YXRlU2VydmljZSB9IGZyb20gXCIuLi9zdGF0ZS9zdGF0ZS1zZXJ2aWNlXCI7XG5pbXBvcnQgeyBEQ29tbWFuZCwgU3RhdGVDb21tYW5kIH0gZnJvbSBcIi4uL2NvbW1hbmRzL0RDb21tYW5kXCI7XG5pbXBvcnQgeyBERXZlbnQgfSBmcm9tIFwiLi4vZXZlbnRzL0RFdmVudHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBFbmdpbmVMb2dnZXIge1xuICBlcnJvcihtZXNzYWdlOiBzdHJpbmcpOiB2b2lkO1xuICB3YXJuKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQ7XG4gIGFwcEV2ZW50KGV2ZW50OiBERXZlbnQpOiB2b2lkO1xuICBhcHBDb21tYW5kKGNvbW1hbmQ6IERDb21tYW5kKTogdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTY2hlbWFSZXN1bHQge1xuICByZWFkb25seSBldmVudExvZzogUmVhZG9ubHlBcnJheTxERXZlbnQ+O1xuICByZWFkb25seSBjb21tYW5kTG9nOiBSZWFkb25seUFycmF5PERDb21tYW5kPjtcbiAgcmVhZG9ubHkgYW5zd2VyczogUmVhZG9ubHlBcnJheTxhbnk+O1xufVxuZXhwb3J0IGludGVyZmFjZSBJU2NoZW1hRW5naW5lIHtcbiAgb25Db21wbGV0ZShoYW5kbGVyOiAocmVzdWx0OiBTY2hlbWFSZXN1bHQpID0+IHZvaWQpOiB2b2lkO1xuICBvbkNvbW1hbmRPckV2ZW50KGl0ZW06IERFdmVudCB8IERDb21tYW5kKTogdm9pZDtcbiAgc2V0U2NoZW1hKHNjaGVtYTogU2NoZW1hRHRvKTogdm9pZDtcbiAgb25GYXRhbEVycm9yKGhhbmRsZXI6IChlcnJvcjogeyBtZXNzYWdlOiBzdHJpbmcgfSkgPT4gdm9pZCk6IHZvaWQ7XG59XG5cbmV4cG9ydCBjbGFzcyBTY2hlbWFFbmdpbmUgaW1wbGVtZW50cyBJU2NoZW1hRW5naW5lIHtcbiAgcHJpdmF0ZSByZWFkb25seSBUQUcgPSBcIlsgU0NIRU1BX0VOR0lORSBdIDpcIjtcbiAgcHJpdmF0ZSByZWFkb25seSBjb21tYW5kQnVzID0gbmV3IERDb21tYW5kQnVzKCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZXZlbnRCdXMgPSBuZXcgRXZlbnRCdXMoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBtZWRpYU1hbmFnZXI6IERNZWRpYU1hbmFnZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2NhbGU6IFNjYWxlU2VydmljZTtcbiAgcHJpdmF0ZSByZWFkb25seSBob3N0RWxlbWVudDogSFRNTERpdkVsZW1lbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgdWlDb250YWluZXI6IEhUTUxEaXZFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgcHJpdmF0ZSByZWFkb25seSBtZWRpYUNvbnRhaW5lcjogSFRNTERpdkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlc291cmNlUHJvdmlkZXI6IFJlc291cmNlUHJvdmlkZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3RhdGVTZXJ2aWNlOiBTdGF0ZVNlcnZpY2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgZ2xvYmFsRXZlbnRUb1N0YXRlSGFuZGxlcnMgPSBuZXcgTWFwPHN0cmluZywgUmVhZG9ubHlBcnJheTxTdGF0ZUNvbW1hbmQ+PigpO1xuICBwcml2YXRlIHBsYXllcjogRFBsYXllcjtcbiAgcHJpdmF0ZSBjdXJyZW50UGFnZTogRFBhZ2UgfCBmYWxzZSA9IGZhbHNlO1xuICBwcml2YXRlIHJlYWRvbmx5IHN1YnM6IEFycmF5PCgpID0+IHZvaWQ+ID0gW107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgaG9zdEVsOiBIVE1MRGl2RWxlbWVudCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGhlaWdodDogbnVtYmVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgd2lkdGg6IG51bWJlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNjaGVtYTogU2NoZW1hRHRvLFxuICApIHtcbiAgICB0aGlzLmhvc3RFbGVtZW50ID0gaG9zdEVsO1xuICAgIHRoaXMuaG9zdEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy51aUNvbnRhaW5lcik7XG4gICAgdGhpcy5ob3N0RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLm1lZGlhQ29udGFpbmVyKTtcbiAgICBjb25zdCBzdGF0ZVByb3BzID0gdGhpcy5zY2hlbWEuc3RhdGVQcm9wcyA/PyBbXTtcbiAgICBjb25zdCBzdGF0ZVF1ZXJpZXMgPSB0aGlzLnNjaGVtYS5zdGF0ZVF1ZXJpZXMgPz8gW107XG4gICAgdGhpcy5zdGF0ZVNlcnZpY2UgPSBuZXcgU3RhdGVTZXJ2aWNlKHRoaXMuZXZlbnRCdXMsIHRoaXMuY29tbWFuZEJ1cywgc3RhdGVQcm9wcywgc3RhdGVRdWVyaWVzKTtcbiAgICB0aGlzLnNjYWxlID0gbmV3IFNjYWxlU2VydmljZSh7XG4gICAgICBiYXNlSGVpZ2h0OiBzY2hlbWEuYmFzZUhlaWdodCxcbiAgICAgIGJhc2VXaWR0aDogc2NoZW1hLmJhc2VXaWR0aCxcbiAgICAgIGNvbnRhaW5lcldpZHRoOiB3aWR0aCxcbiAgICAgIGNvbnRhaW5lckhlaWdodDogaGVpZ2h0LFxuICAgIH0pO1xuICAgIC8vIHRoaXMuY29tbWFuZEJ1cy5sb2dDb21tYW5kcyA9IHRydWU7XG4gICAgY29uc3QgZ2xvYmFsRXZlbnRIYW5kbGVycyA9IHNjaGVtYS5zdGF0ZUZyb21FdmVudCA/PyBbXTtcblxuICAgIGdsb2JhbEV2ZW50SGFuZGxlcnMuZm9yRWFjaCgoaCkgPT4ge1xuICAgICAgdGhpcy5nbG9iYWxFdmVudFRvU3RhdGVIYW5kbGVycy5zZXQoaC5vbkV2ZW50LCBoLnRoZW5FeGVjdXRlKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHJlc291cmNlcyA9IFNjaGVtYUR0by5nZXRSZXNvdXJjZXModGhpcy5zY2hlbWEpO1xuICAgIHRoaXMucmVzb3VyY2VQcm92aWRlciA9IG5ldyBSZXNvdXJjZVByb3ZpZGVyKHsgdmlkZW9zOiByZXNvdXJjZXMudmlkZW9MaXN0LCBhdWRpbzogcmVzb3VyY2VzLmF1ZGlvTGlzdCB9KTtcbiAgICB0aGlzLm1lZGlhTWFuYWdlciA9IG5ldyBETWVkaWFNYW5hZ2VyKFxuICAgICAgdGhpcy5tZWRpYUNvbnRhaW5lcixcbiAgICAgIHRoaXMuY29tbWFuZEJ1cyxcbiAgICAgIHRoaXMuZXZlbnRCdXMsXG4gICAgICB0aGlzLnJlc291cmNlUHJvdmlkZXIsXG4gICAgICB0aGlzLnNjYWxlLFxuICAgICk7XG4gICAgdGhpcy5wbGF5ZXIgPSBuZXcgRFBsYXllcih0aGlzLnNjaGVtYSk7XG4gICAgdGhpcy5zdHlsZVNlbGYoKTtcbiAgICB0aGlzLm5leHRQYWdlKCk7XG4gICAgdGhpcy5ob29rVXBMaXN0ZW5lcnMoKTtcbiAgfVxuXG4gIHByaXZhdGUgaG9va1VwTGlzdGVuZXJzKCkge1xuICAgIGNvbnN0IGV2ZW50U3Vic2NyaXB0aW9uID0gdGhpcy5ldmVudEJ1cy5zdWJzY3JpYmUoKGV2KSA9PiB7XG4gICAgICB0aGlzLm9uQ29tbWFuZE9yRXZlbnQoZXYpO1xuICAgICAgY29uc3QgZ2xvYmFsSGFuZGxlcnMgPSB0aGlzLmdsb2JhbEV2ZW50VG9TdGF0ZUhhbmRsZXJzLmdldChldi5raW5kKSA/PyBbXTtcbiAgICAgIGdsb2JhbEhhbmRsZXJzLmZvckVhY2goKHN0YXRlQ29tbWFuZCkgPT4ge1xuICAgICAgICB0aGlzLmNvbW1hbmRCdXMuZW1pdChzdGF0ZUNvbW1hbmQpO1xuICAgICAgfSk7XG4gICAgfSwgdGhpcy5UQUcgKyBcIkhPT0tfVVBfTElTVEVORVJTXCIpO1xuICAgIGNvbnN0IGNvbW1hbmRTdWJzY3JpcHRpb24gPSB0aGlzLmNvbW1hbmRCdXMuc3Vic2NyaWJlKChjb21tYW5kKSA9PiB7XG4gICAgICAvLyBzd2l0Y2ggKGNvbW1hbmQua2luZCkge1xuICAgICAgLy9cbiAgICAgIC8vIH1cbiAgICAgIHRoaXMub25Db21tYW5kT3JFdmVudChjb21tYW5kKTtcbiAgICAgIGlmIChjb21tYW5kLmtpbmQgPT09IFwiUEFHRV9RVUVfTkVYVF9QQUdFX0NPTU1BTkRcIikge1xuICAgICAgICB0aGlzLm5leHRQYWdlKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb21tYW5kLmtpbmQgPT09IFwiRU5HSU5FX0xFQVZFX1BBR0VfQ09NTUFORFwiKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKHRoaXMuVEFHICsgXCJTRVFVRU5DRSBTVEFSVEVEIC0tIFRPRE8gRVZFTlQgRk9SIFRISVM/P1wiKTtcbiAgICAgICAgY29uc29sZS5sb2coY29tbWFuZCk7XG4gICAgICAgIGNvbnN0IHBhZ2VJZCA9IGNvbW1hbmQucGF5bG9hZC5wYWdlSWQ7XG4gICAgICAgIGNvbnN0IGZhY3RzID0gY29tbWFuZC5wYXlsb2FkLmZhY3RzQ29sbGVjdGVkO1xuICAgICAgICBjb25zdCB0aW1lc3RhbXAgPSBEVGltZXN0YW1wLm5vdygpO1xuICAgICAgICBjb25zdCBhbnM6IEFuc3dlcmVkUXVlc3Rpb25bXSA9IGZhY3RzLm1hcCgoZikgPT4gKHtcbiAgICAgICAgICB0aW1lc3RhbXAsXG4gICAgICAgICAgZmFjdDogZixcbiAgICAgICAgfSkpO1xuICAgICAgICB0aGlzLnBsYXllci5zYXZlSGlzdG9yeSh7XG4gICAgICAgICAgYW5zd2VyZWRRdWVzdGlvbnM6IGFucyxcbiAgICAgICAgICBwYWdlSWQsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMubmV4dFBhZ2UoKTtcbiAgICAgICAgLy8gY29uc3QgaGlzdG9yeTogUGFnZUhpc3RvcnkgPSB7IHBhZ2U6IHt9LCBhbnN3ZXJlZFF1ZXN0aW9uczogW10gfTtcbiAgICAgIH1cbiAgICB9LCB0aGlzLlRBRyk7XG5cbiAgICB0aGlzLnN1YnMucHVzaChjb21tYW5kU3Vic2NyaXB0aW9uKTtcbiAgICB0aGlzLnN1YnMucHVzaChldmVudFN1YnNjcmlwdGlvbik7XG4gIH1cblxuICBwcml2YXRlIHN0eWxlU2VsZigpIHtcbiAgICB0aGlzLmhvc3RFbGVtZW50LnN0eWxlLmhlaWdodCA9IHRoaXMuc2NhbGUucGFnZUhlaWdodCArIFwicHhcIjtcbiAgICB0aGlzLmhvc3RFbGVtZW50LnN0eWxlLndpZHRoID0gdGhpcy5zY2FsZS5wYWdlV2lkdGggKyBcInB4XCI7XG4gICAgdGhpcy5ob3N0RWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLnNjaGVtYS5iYWNrZ3JvdW5kQ29sb3IgPz8gXCJ3aGl0ZVwiO1xuICAgIHRoaXMuaG9zdEVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSBcInJlbGF0aXZlXCI7XG4gICAgLy8gdGhpcy5ob3N0RWxlbWVudC5zdHlsZS5vdmVyZmxvdyA9IFwiaGlkZGVuXCI7XG4gICAgY29uc3QgbWFrZVN0YXRpYyA9IChkaXY6IEhUTUxEaXZFbGVtZW50KSA9PiB7XG4gICAgICBkaXYuc3R5bGUuaGVpZ2h0ID0gXCIwcHhcIjtcbiAgICAgIGRpdi5zdHlsZS53aWR0aCA9IFwiMHB4XCI7XG4gICAgICBkaXYuc3R5bGUucG9zaXRpb24gPSBcInN0YXRpY1wiO1xuICAgIH07XG5cbiAgICBtYWtlU3RhdGljKHRoaXMudWlDb250YWluZXIpO1xuICAgIG1ha2VTdGF0aWModGhpcy5tZWRpYUNvbnRhaW5lcik7XG4gIH1cblxuICBwcml2YXRlIG5leHRQYWdlKCkge1xuICAgIC8vIFRPRE8gU0hPVUxEIFRISVMgQkUgUEFSVCBPRiBUSEUgU0NIRU1BPz8gVEhJUyBJUyBDTEVBTlVQIExPR0lDXG4gICAgLy8gdGhpcy5jb21tYW5kQnVzLmVtaXQoeyBraW5kOiBcIlZJREVPX1BBVVNFX0NPTU1BTkRcIiwgdGFyZ2V0OiBcIlZJREVPXCIsIHRhcmdldElkOiBcIlZJREVPXCIsIHBheWxvYWQ6IHt9IH0pO1xuICAgIC8vIHRoaXMuY29tbWFuZEJ1cy5lbWl0KHsga2luZDogXCJBVURJT19QQVVTRV9DT01NQU5EXCIsIHRhcmdldDogXCJBVURJT1wiLCB0YXJnZXRJZDogXCJBVURJT1wiLCBwYXlsb2FkOiB7fSB9KTtcbiAgICAvLyBjb25zdCBjdXJyUGFnZUlkID0gdGhpcy5jdXJyZW50UGFnZSA/IHRoaXMuY3VycmVudFBhZ2UuaWQgOiBcIk5PX1BBR0VcIjtcbiAgICAvLyBjb25zb2xlLmdyb3VwQ29sbGFwc2VkKFwiTkVYVF9QQUdFIEZST006IFwiICsgY3VyclBhZ2VJZCk7XG4gICAgLy8gY29uc29sZS5sb2codGhpcy5UQUcgKyBcIiBORVhUX1BBR0UgU1RBUlRFRCBBVDogXCIgKyBjdXJyUGFnZUlkKTtcbiAgICB0aGlzLm1lZGlhTWFuYWdlci5jbGVhckFsbE1lZGlhKCk7XG4gICAgY29uc3QgbmV4dFBhZ2UgPSB0aGlzLnBsYXllci5nZXROZXh0UGFnZSgpO1xuICAgIC8vIGNvbnN0IHN0YXRlID0gdGhpcy5zdGF0ZVNlcnZpY2UuZ2V0U3RhdGUoKTtcbiAgICAvLyBjb25zb2xlLmxvZyhzdGF0ZSk7XG4gICAgLy8gVE9ETyBDTEVBTiBVUCBQQUdFIENPTVBPTkVOVFMgdGhpcy5wYWdlLkNsZWFuVXAoKVxuICAgIGlmICh0aGlzLmN1cnJlbnRQYWdlKSB7XG4gICAgICB0aGlzLmN1cnJlbnRQYWdlLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMudWlDb250YWluZXIuaW5uZXJIVE1MID0gXCJcIjtcbiAgICB9XG4gICAgaWYgKCFuZXh0UGFnZSkge1xuICAgICAgLy8gVE9ETyBGSUdVUkUgT1VUIFdIQVFUIFRPIERPIEFUIEVORCBPRiBURVNUISEgU3RhcnQgb3Zlcj8/XG4gICAgICB0aGlzLnBsYXllciA9IG5ldyBEUGxheWVyKHRoaXMuc2NoZW1hKTtcbiAgICAgIGlmICh0aGlzLnNjaGVtYS5wYWdlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMubmV4dFBhZ2UoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgbmV3UGFnZSA9IG5ldyBEUGFnZShuZXh0UGFnZSwgdGhpcy5ldmVudEJ1cywgdGhpcy5jb21tYW5kQnVzLCB0aGlzLnNjYWxlKTtcblxuICAgIHRoaXMuY3VycmVudFBhZ2UgPSBuZXdQYWdlO1xuICAgIG5ld1BhZ2UuYXBwZW5kWW91cnNlbGYodGhpcy51aUNvbnRhaW5lcik7XG5cbiAgICB0aGlzLm1lZGlhTWFuYWdlci5zZXRQYWdlKG5leHRQYWdlKTtcbiAgICBjb25zdCBzMSA9IHRoaXMuc3RhdGVTZXJ2aWNlLmdldFN0YXRlKCk7XG4gICAgLy8gY29uc29sZS5sb2coczEpO1xuICAgIC8vIGNvbnNvbGUubG9nKFwiTmV4dC1wYWdlOiBcIiArIG5ld1BhZ2UuaWQpO1xuICAgIC8vIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMuY3VycmVudFBhZ2UpIHtcbiAgICAgIHRoaXMuY3VycmVudFBhZ2UuZGVzdHJveSgpO1xuICAgICAgdGhpcy51aUNvbnRhaW5lci5pbm5lckhUTUwgPSBcIlwiO1xuICAgIH1cbiAgICB0aGlzLm1lZGlhTWFuYWdlci5kZXN0cm95KCk7XG4gICAgdGhpcy5zdGF0ZVNlcnZpY2UuZGVzdHJveSgpO1xuICAgIHRoaXMuc3Vicy5mb3JFYWNoKChzdWIpID0+IHtcbiAgICAgIHN1YigpO1xuICAgIH0pO1xuICAgIGNvbnN0IGV2U3RhdHMgPSB0aGlzLmV2ZW50QnVzLmdldFN0YXRzKCk7XG4gICAgY29uc3QgY21kU3RhdHMgPSB0aGlzLmNvbW1hbmRCdXMuZ2V0U3RhdHMoKTtcbiAgICBjb25zb2xlLmFzc2VydChldlN0YXRzLnN1YnNjcmliZXJzQ291bnQgPT09IDAsIHRoaXMuVEFHICsgXCIgRXZlbnRidXMgc2hvdWxkIGhhdmUgbm8gc3Vic2NyaWJlcnMgXCIsIGV2U3RhdHMpO1xuICAgIGNvbnNvbGUuYXNzZXJ0KGNtZFN0YXRzLnN1YnNjcmliZXJzQ291bnQgPT09IDAsIHRoaXMuVEFHICsgXCJDb21tYW5kYnVzIHNob3VsZCBoYXZlIG5vIHN1YnNjcmliZXJzXCIsIGNtZFN0YXRzKTtcbiAgfVxuICBvbkNvbXBsZXRlKGhhbmRsZXI6IChyZXN1bHQ6IFNjaGVtYVJlc3VsdCkgPT4gdm9pZCkge1xuICAgIGNvbnNvbGUubG9nKGhhbmRsZXIpO1xuICB9XG5cbiAgb25GYXRhbEVycm9yKGhhbmRsZXI6IChlcnJvcjogeyBtZXNzYWdlOiBzdHJpbmcgfSkgPT4gdm9pZCk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKGhhbmRsZXIpO1xuICB9XG5cbiAgb25Db21tYW5kT3JFdmVudChfZXZlbnRfb3JfY29tbWFuZDogREV2ZW50IHwgRENvbW1hbmQpIHt9XG5cbiAgc2V0U2NoZW1hKHNjaGVtYTogU2NoZW1hRHRvKTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coc2NoZW1hKTtcbiAgfVxufVxuIiwgImltcG9ydCB7IERTdGF0ZSB9IGZyb20gXCIuL0RzdGF0ZVwiO1xuaW1wb3J0IHsgQ29uZGl0aW9uIH0gZnJvbSBcIi4uL3J1bGVzL2NvbmRpdGlvblwiO1xuaW1wb3J0IHsgU3RhdGVDb21tYW5kIH0gZnJvbSBcIi4uL2NvbW1hbmRzL0RDb21tYW5kXCI7XG5cbmV4cG9ydCBjbGFzcyBCb29sZWFuU3RhdGVQcm9wZXJ0eTxQcm9wTmFtZSBleHRlbmRzIHN0cmluZz4ge1xuICAgIHJlYWRvbmx5IHByb3BOYW1lOiBQcm9wTmFtZTtcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUUlVFID0geyB2YWx1ZTogMSwgbGFiZWw6IFwiVFJVRVwiIH07XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgRkFMU0UgPSB7IHZhbHVlOiAwLCBsYWJlbDogXCJGQUxTRVwiIH07XG4gICAgcmVhZG9ubHkgcHJvcERlZmluaXRpb246IERTdGF0ZS5OdW1lcmljUHJvcDtcblxuICAgIGdldElzVHJ1ZUNvbmRpdGlvbigpOiBDb25kaXRpb24uTnVtZXJpYyB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBraW5kOiBcIm51bWVyaWMtY29uZGl0aW9uXCIsXG4gICAgICAgICAgICByZWZlcmVuY2VJZDogdGhpcy5wcm9wTmFtZSxcbiAgICAgICAgICAgIHJlZmVyZW5jZUxhYmVsOiB0aGlzLnByb3BOYW1lICsgXCJbIEJPT0xFQU4gXVwiLFxuICAgICAgICAgICAgdmFsdWVMYWJlbDogQm9vbGVhblN0YXRlUHJvcGVydHkuVFJVRS5sYWJlbCxcbiAgICAgICAgICAgIHZhbHVlOiBCb29sZWFuU3RhdGVQcm9wZXJ0eS5UUlVFLnZhbHVlLFxuICAgICAgICAgICAgb3BlcmF0b3I6IFwiZXFcIixcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZ2V0SXNGYWxzZUNvbmRpdGlvbigpOiBDb25kaXRpb24uTnVtZXJpYyB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBraW5kOiBcIm51bWVyaWMtY29uZGl0aW9uXCIsXG4gICAgICAgICAgICByZWZlcmVuY2VJZDogdGhpcy5wcm9wTmFtZSxcbiAgICAgICAgICAgIHJlZmVyZW5jZUxhYmVsOiB0aGlzLnByb3BOYW1lICsgXCJbIEJPT0xFQU4gXVwiLFxuICAgICAgICAgICAgdmFsdWVMYWJlbDogQm9vbGVhblN0YXRlUHJvcGVydHkuRkFMU0UubGFiZWwsXG4gICAgICAgICAgICB2YWx1ZTogQm9vbGVhblN0YXRlUHJvcGVydHkuRkFMU0UudmFsdWUsXG4gICAgICAgICAgICBvcGVyYXRvcjogXCJlcVwiLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGdldFNldFRydWVDb21tYW5kKCk6IFN0YXRlQ29tbWFuZCB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBraW5kOiBcIlNUQVRFX01VVEFURV9DT01NQU5EXCIsXG4gICAgICAgICAgICB0YXJnZXQ6IFwiU1RBVEVcIixcbiAgICAgICAgICAgIHRhcmdldElkOiBcIlNUQVRFXCIsXG4gICAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICAgICAgbXV0YXRpb246IHsgcHJvcE5hbWU6IHRoaXMucHJvcE5hbWUsIGtpbmQ6IFwic2V0LW51bWJlclwiLCB2YWx1ZTogMSB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBnZXRTZXRGYWxzZUNvbW1hbmQoKTogU3RhdGVDb21tYW5kIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGtpbmQ6IFwiU1RBVEVfTVVUQVRFX0NPTU1BTkRcIixcbiAgICAgICAgICAgIHRhcmdldDogXCJTVEFURVwiLFxuICAgICAgICAgICAgdGFyZ2V0SWQ6IFwiU1RBVEVcIixcbiAgICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgICAgICBtdXRhdGlvbjogeyBwcm9wTmFtZTogdGhpcy5wcm9wTmFtZSwga2luZDogXCJzZXQtbnVtYmVyXCIsIHZhbHVlOiAwIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKHByb3BOYW1lOiBQcm9wTmFtZSwgcHJpdmF0ZSByZWFkb25seSBpbml0aWFsVmFsdWU6IGJvb2xlYW4sIGRlc2NyaXB0aW9uOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5wcm9wTmFtZSA9IHByb3BOYW1lO1xuICAgICAgICBjb25zdCBpbml0aWFsID0gaW5pdGlhbFZhbHVlID8gMSA6IDA7XG4gICAgICAgIGNvbnN0IHByb3BEZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uID8gZGVzY3JpcHRpb24gOiBcIk5vIGRlc2NyaXB0aW9uIGdpdmVuXCI7XG4gICAgICAgIHRoaXMucHJvcERlZmluaXRpb24gPSB7XG4gICAgICAgICAgICBwcm9wRGVzY3JpcHRpb24sXG4gICAgICAgICAgICBwcm9wTmFtZTogcHJvcE5hbWUsXG4gICAgICAgICAgICBpbml0aWFsVmFsdWU6IGluaXRpYWwsXG4gICAgICAgICAgICBvcHRpb25zOiBbXG4gICAgICAgICAgICAgICAgeyB2YWx1ZTogQm9vbGVhblN0YXRlUHJvcGVydHkuRkFMU0UudmFsdWUsIHZhbHVlTGFiZWw6IEJvb2xlYW5TdGF0ZVByb3BlcnR5LkZBTFNFLmxhYmVsIH0sXG4gICAgICAgICAgICAgICAgeyB2YWx1ZTogQm9vbGVhblN0YXRlUHJvcGVydHkuVFJVRS52YWx1ZSwgdmFsdWVMYWJlbDogQm9vbGVhblN0YXRlUHJvcGVydHkuVFJVRS5sYWJlbCB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIF90eXBlOiBcIm51bWJlclwiLFxuICAgICAgICB9O1xuICAgIH1cbn1cbiIsICIvLyBUaGUgZGVmYXVsdCBsZW5ndGggb2YgYW4gSURcbmNvbnN0IElEX0xFTkdUSCA9IDMyO1xuXG4vLyBUaGUgbWluaW11bSBsZW5ndGggb2YgYW4gSURcbmNvbnN0IE1JTl9MRU5HVEggPSAxMDtcblxuZXhwb3J0IHR5cGUgSUQ8QiBleHRlbmRzIHN0cmluZz4gPSBzdHJpbmcgJiB7IF9fSURfXzogQiB9O1xuXG5jb25zdCBpc0lEID0gPGNvbnN0IEIgZXh0ZW5kcyBzdHJpbmc+KGlkTmFtZTogQiwgaWQ/OiBzdHJpbmcpOiBpZCBpcyBJRDxCPiA9PiB7XG4gIGlmICh0eXBlb2YgaWQgIT09IFwic3RyaW5nXCIpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIGlkLmxlbmd0aCA+PSBNSU5fTEVOR1RIO1xufTtcblxuY29uc3QgY3JlYXRlSUQgPSA8Y29uc3QgQiBleHRlbmRzIHN0cmluZz4oaWROYW1lOiBCKTogSUQ8Qj4gPT4ge1xuICBjb25zdCBsZXR0ZXJzID0gXCJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2eXpcIjtcbiAgY29uc3QgYWxsID0gbGV0dGVycyArIGxldHRlcnMudG9VcHBlckNhc2UoKTtcbiAgbGV0IHJlc3VsdCA9IFwiXCI7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgSURfTEVOR1RIOyBpKyspIHtcbiAgICBjb25zdCBjaGFyID0gYWxsLmNoYXJBdChNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBhbGwubGVuZ3RoKSk7XG4gICAgcmVzdWx0ICs9IGNoYXI7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdCBhcyBJRDxCPjtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIG9iamVjdCB3aXRoIGhlbHBlciBmdW5jdGlvbnMgZm9yIGEgc3BlY2lmaWMgSUQgdHlwZVxuICogQHBhcmFtIGlkTmFtZVxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlVHlwZWRJZFNpbmdsZXRvbiA9IDxjb25zdCBCIGV4dGVuZHMgc3RyaW5nPihpZE5hbWU6IEIpID0+IHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgSUQgb2YgdGhlIGNvcnJlY3QgdHlwZVxuICAgKi9cbiAgY29uc3QgY3JlYXRlID0gKCk6IElEPEI+ID0+IGNyZWF0ZUlEKGlkTmFtZSk7XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgaWQgaXMgb2YgdGhlIGNvcnJlY3QgdHlwZVxuICAgKiBAcGFyYW0gaWRcbiAgICovXG4gIGNvbnN0IGlzID0gKGlkOiBzdHJpbmcpOiBpZCBpcyBJRDxCPiA9PiBpc0lEKGlkTmFtZSwgaWQpO1xuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIGlkIGlzIG9mIHRoZSBjb3JyZWN0IHR5cGUsIGlmIG5vdCBpdCB0aHJvd3MgYW4gZXJyb3JcbiAgICogQHBhcmFtIGlkXG4gICAqL1xuICBjb25zdCB2YWxpZGF0ZU9yVGhyb3cgPSAoaWQ6IHN0cmluZyk6IElEPEI+ID0+IHtcbiAgICBpZiAoIWlzKGlkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGlkOiAke2lkfWApO1xuICAgIH1cbiAgICByZXR1cm4gaWQ7XG4gIH07XG5cbiAgLyoqXG4gICAqIFRoZSBsb3dlcmNhc2UgbmFtZSBvZiB0aGUgaWQgKFNDSEVNQSwgUEFHRSwgZXRjKVxuICAgKi9cbiAgY29uc3QgbmFtZTogQiA9IGlkTmFtZTtcblxuICAvKipcbiAgICogRW5zdXJlcyB0aGF0IHRoZSBpZCBpcyBvZiB0aGUgY29ycmVjdCB0eXBlLCBpZiBub3QgaXQgY3JlYXRlcyBhIG5ldyBvbmVcbiAgICogQHBhcmFtIGlkXG4gICAqL1xuICBjb25zdCBlbnN1cmUgPSAoaWQ6IHN0cmluZyk6IElEPEI+ID0+IHtcbiAgICByZXR1cm4gaXMoaWQpID8gaWQgOiBjcmVhdGUoKTtcbiAgfTtcblxuICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh7IGNyZWF0ZSwgaXMsIGVuc3VyZSwgdmFsaWRhdGVPclRocm93LCBuYW1lIH0pO1xufTtcblxuZXhwb3J0IHR5cGUgU2NoZW1hSUQgPSBJRDxcIlNDSEVNQVwiPjtcbmV4cG9ydCBjb25zdCBTY2hlbWFJRCA9IGNyZWF0ZVR5cGVkSWRTaW5nbGV0b24oXCJTQ0hFTUFcIik7XG5leHBvcnQgdHlwZSBQYWdlSUQgPSBJRDxcIlBBR0VcIj47XG5leHBvcnQgY29uc3QgUGFnZUlEID0gY3JlYXRlVHlwZWRJZFNpbmdsZXRvbihcIlBBR0VcIik7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7O0FDd0NPLElBQVU7QUFBQSxDQUFWLENBQVVBLGVBQVY7QUFDRSxFQUFNQSxXQUFBLGVBQWUsQ0FDMUIsV0FLRztBQUNILFVBQU0sRUFBRSxNQUFNLElBQUk7QUFDbEIsVUFBTSxZQUFZLE1BQU0sT0FBeUIsQ0FBQyxLQUFLLFNBQVM7QUFDOUQsVUFBSSxNQUFNLFFBQVEsS0FBSyxLQUFLLEdBQUc7QUFDN0IsWUFBSSxLQUFLLEdBQUcsS0FBSyxLQUFLO0FBQUEsTUFDeEI7QUFDQSxhQUFPO0FBQUEsSUFDVCxHQUFHLENBQUMsQ0FBQztBQUNMLFVBQU0sWUFBOEIsTUFBTSxPQUF5QixDQUFDLEtBQUssU0FBUztBQUNoRixVQUFJLE1BQU0sUUFBUSxLQUFLLEtBQUssR0FBRztBQUM3QixZQUFJLEtBQUssR0FBRyxLQUFLLEtBQUs7QUFBQSxNQUN4QjtBQUNBLGFBQU87QUFBQSxJQUNULEdBQUcsQ0FBQyxDQUFDO0FBRUwsV0FBTyxFQUFFLFdBQVcsV0FBVyxXQUFXLENBQUMsRUFBRTtBQUFBLEVBQy9D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OUIsV0FBTztBQUFBLE1BQ0gsTUFBTTtBQUFBLE1BQ04sUUFBUTtBQUFBLE1BQ1IsVUFBVTtBQUFBLE1BQ1YsU0FBUztBQUFBLFFBQ0wsVUFBVSxFQUFFLFVBQVUsS0FBSyxVQUFVLE1BQU0sY0FBYyxPQUFPLEVBQUU7QUFBQSxNQUN0RTtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQUEsRUFFQSxxQkFBbUM7QUFDL0IsV0FBTztBQUFBLE1BQ0gsTUFBTTtBQUFBLE1BQ04sUUFBUTtBQUFBLE1BQ1IsVUFBVTtBQUFBLE1BQ1YsU0FBUztBQUFBLFFBQ0wsVUFBVSxFQUFFLFVBQVUsS0FBSyxVQUFVLE1BQU0sY0FBYyxPQUFPLEVBQUU7QUFBQSxNQUN0RTtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBaUJKOzs7QUNuRUEsSUFBTSxZQUFZO0FBR2xCLElBQU0sYUFBYTtBQUluQixJQUFNLE9BQU8sQ0FBeUIsUUFBVyxPQUE2QjtBQUM1RSxNQUFJLE9BQU8sT0FBTztBQUFVLFdBQU87QUFDbkMsU0FBTyxHQUFHLFVBQVU7QUFDdEI7QUFFQSxJQUFNLFdBQVcsQ0FBeUIsV0FBcUI7QUFDN0QsUUFBTSxVQUFVO0FBQ2hCLFFBQU0sTUFBTSxVQUFVLFFBQVEsWUFBWTtBQUMxQyxNQUFJLFNBQVM7QUFDYixXQUFTLElBQUksR0FBRyxJQUFJLFdBQVcsS0FBSztBQUNsQyxVQUFNLE9BQU8sSUFBSSxPQUFPLEtBQUssTUFBTSxLQUFLLE9BQU8sSUFBSSxJQUFJLE1BQU0sQ0FBQztBQUM5RCxjQUFVO0FBQUEsRUFDWjtBQUNBLFNBQU87QUFDVDtBQU1PLElBQU0seUJBQXlCLENBQXlCLFdBQWM7QUFJM0UsUUFBTSxTQUFTLE1BQWEsU0FBUyxNQUFNO0FBTTNDLFFBQU0sS0FBSyxDQUFDLE9BQTRCLEtBQUssUUFBUSxFQUFFO0FBTXZELFFBQU0sa0JBQWtCLENBQUMsT0FBc0I7QUFDN0MsUUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHO0FBQ1gsWUFBTSxJQUFJLE1BQU0sZUFBZSxFQUFFLEVBQUU7QUFBQSxJQUNyQztBQUNBLFdBQU87QUFBQSxFQUNUO0FBS0EsUUFBTSxPQUFVO0FBTWhCLFFBQU0sU0FBUyxDQUFDLE9BQXNCO0FBQ3BDLFdBQU8sR0FBRyxFQUFFLElBQUksS0FBSyxPQUFPO0FBQUEsRUFDOUI7QUFFQSxTQUFPLE9BQU8sT0FBTyxFQUFFLFFBQVEsSUFBSSxRQUFRLGlCQUFpQixLQUFLLENBQUM7QUFDcEU7QUFHTyxJQUFNLFdBQVcsdUJBQXVCLFFBQVE7QUFFaEQsSUFBTSxTQUFTLHVCQUF1QixNQUFNOyIsCiAgIm5hbWVzIjogWyJTY2hlbWFEdG8iLCAiRFRpbWVzdGFtcCIsICJEVXRpbCIsICJpc051bWJlciIsICJEQ3NzIiwgIkRTdHlsZSIsICJBbnN3ZXJlZFF1ZXN0aW9uIiwgIkNvbmRpdGlvbiIsICJjb25kaXRpb24iLCAiUnVsZSIsICJ0YWciLCAiREV2ZW50SGFuZGxlciIsICJkdG8iLCAiZHRvIiwgIlNjYWxlIiwgIlJlc3VsdCIsICJEU3RhdGUiXQp9Cg==
|