@media-quest/engine 0.0.6 → 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.
@@ -2150,6 +2150,42 @@ var BooleanStateProperty = class _BooleanStateProperty {
2150
2150
  };
2151
2151
  }
2152
2152
  };
2153
+
2154
+ // src/utils/ID.ts
2155
+ var ID_LENGTH = 32;
2156
+ var MIN_LENGTH = 10;
2157
+ var isID = (idName, id) => {
2158
+ if (typeof id !== "string")
2159
+ return false;
2160
+ return id.length >= MIN_LENGTH;
2161
+ };
2162
+ var createID = (idName) => {
2163
+ const letters = "abcdefghijklmnopqrstuvyz";
2164
+ const all = letters + letters.toUpperCase();
2165
+ let result = "";
2166
+ for (let i = 0; i < ID_LENGTH; i++) {
2167
+ const char = all.charAt(Math.floor(Math.random() * all.length));
2168
+ result += char;
2169
+ }
2170
+ return result;
2171
+ };
2172
+ var createTypedIdSingleton = (idName) => {
2173
+ const create = () => createID(idName);
2174
+ const is = (id) => isID(idName, id);
2175
+ const validateOrThrow = (id) => {
2176
+ if (!is(id)) {
2177
+ throw new Error(`Invalid id: ${id}`);
2178
+ }
2179
+ return id;
2180
+ };
2181
+ const name = idName;
2182
+ const ensure = (id) => {
2183
+ return is(id) ? id : create();
2184
+ };
2185
+ return Object.freeze({ create, is, ensure, validateOrThrow, name });
2186
+ };
2187
+ var SchemaID = createTypedIdSingleton("SCHEMA");
2188
+ var PageID = createTypedIdSingleton("PAGE");
2153
2189
  export {
2154
2190
  BooleanStateProperty,
2155
2191
  Condition,
@@ -2158,9 +2194,12 @@ export {
2158
2194
  DState,
2159
2195
  DStyle,
2160
2196
  DUtil,
2197
+ PageID,
2161
2198
  Rule,
2162
2199
  RuleEngine,
2163
2200
  SchemaDto,
2164
- SchemaEngine
2201
+ SchemaEngine,
2202
+ SchemaID,
2203
+ createTypedIdSingleton
2165
2204
  };
2166
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2R0by9TY2hlbWFEdG8udHMiLCAiLi4vc3JjL2NvbW1vbi9EVGltZXN0YW1wLnRzIiwgIi4uL3NyYy91dGlscy9EVXRpbC50cyIsICIuLi9zcmMvRGVsZW1lbnQvY3NzLnRzIiwgIi4uL3NyYy9EZWxlbWVudC9EU3R5bGUudHMiLCAiLi4vc3JjL0RlbGVtZW50L1ZpZGVvQ29udGFpbmVyLnRzIiwgIi4uL3NyYy9EZWxlbWVudC9BdWRpb0NvbnRhaW5lci50cyIsICIuLi9zcmMvc2VydmljZXMvRE1lZGlhLW1hbmFnZXIudHMiLCAiLi4vc3JjL2NvbW1hbmRzL0RDb21tYW5kQnVzLnRzIiwgIi4uL3NyYy9ldmVudHMvZXZlbnQtYnVzLnRzIiwgIi4uL3NyYy9wbGF5ZXIvaGlzdG9yeS1xdWUudHMiLCAiLi4vc3JjL3J1bGVzL2NvbmRpdGlvbi50cyIsICIuLi9zcmMvcnVsZXMvcnVsZS50cyIsICIuLi9zcmMvcnVsZXMvcnVsZS1lbmdpbmUudHMiLCAiLi4vc3JjL3BsYXllci9uZXh0LXF1ZS50cyIsICIuLi9zcmMvcGxheWVyL2RwbGF5ZXIudHMiLCAiLi4vc3JjL2V2ZW50LWhhbmRsZXJzL0RFdmVudEhhbmRsZXIudHMiLCAiLi4vc3JjL0RlbGVtZW50L0RFbGVtZW50LnRzIiwgIi4uL3NyYy9EZWxlbWVudC9EZGl2LnRzIiwgIi4uL3NyYy9EZWxlbWVudC9ESW1nLnRzIiwgIi4uL3NyYy9EZWxlbWVudC9EVGV4dC50cyIsICIuLi9zcmMvZW5naW5lL2VsZW1lbnQtZmFjdG9yeS50cyIsICIuLi9zcmMvZW5naW5lL0RQYWdlLnRzIiwgIi4uL3NyYy9lbmdpbmUvc2NhbGUudHMiLCAiLi4vc3JjL3NlcnZpY2VzL3Jlc291cmNlLXByb3ZpZGVyLnRzIiwgIi4uL3NyYy9jb21tb24vcmVzdWx0LnRzIiwgIi4uL3NyYy9zdGF0ZS9Ec3RhdGUudHMiLCAiLi4vc3JjL3N0YXRlL3N0YXRlLXNlcnZpY2UudHMiLCAiLi4vc3JjL2VuZ2luZS9TY2hlbWFFbmdpbmUudHMiLCAiLi4vc3JjL3N0YXRlL2Jvb2xlYW4tcHJvcGVydHkudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IERBdXRvUGxheVNlcXVlbmNlIH0gZnJvbSBcIi4uL0RlbGVtZW50L0RBdXRvLXBsYXlcIjtcbmltcG9ydCB7IERBdWRpb0R0bywgREVsZW1lbnREdG8sIERJbWdEdG8sIERWaWRlb0R0byB9IGZyb20gXCIuL0RFbGVtZW50LmR0b1wiO1xuaW1wb3J0IHsgUnVsZSB9IGZyb20gXCIuLi9ydWxlcy9ydWxlXCI7XG5pbXBvcnQgeyBGYWN0IH0gZnJvbSBcIi4uL3J1bGVzL2ZhY3RcIjtcbmltcG9ydCB7IFBhZ2VRdWVDb21tYW5kIH0gZnJvbSBcIi4uL2NvbW1hbmRzL0RDb21tYW5kXCI7XG5pbXBvcnQgeyBEU3RhdGUgfSBmcm9tIFwiLi4vc3RhdGUvRHN0YXRlXCI7XG5cbmV4cG9ydCB0eXBlIFBhZ2VRdWVSdWxlcyA9IFJ1bGU8UGFnZVF1ZUNvbW1hbmQsIG5ldmVyPjtcbmV4cG9ydCBpbnRlcmZhY2UgUGFnZUR0byB7XG4gICAgcmVhZG9ubHkgaWQ6IHN0cmluZztcbiAgICByZWFkb25seSBlbGVtZW50czogQXJyYXk8REVsZW1lbnREdG8+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+IHtcbiAgICBjb25zdCBjaGlsZER0byA9IGR0by5jaGlsZHJlbjtcbiAgICBjb25zdCBjaGlsZEVsczogQXJyYXk8REltZyB8IERUZXh0PiA9IFtdO1xuICAgIC8vIGNvbnNvbGUubG9nKGNoaWxkRWxlbWVudHMpO1xuICAgIGNoaWxkRHRvLmZvckVhY2goKGR0bykgPT4ge1xuICAgICAgICBpZiAoZHRvLl90YWcgPT09IFwicFwiKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdUZXh0ID0gbmV3IERUZXh0KGR0bywgZXZlbnRCdXMsIGFjdGlvblN1YmplY3QsIHNjYWxlKTtcbiAgICAgICAgICAgIGNoaWxkRWxzLnB1c2gobmV3VGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGR0by5fdGFnID09PSBcImltZ1wiKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdJbWFnZSA9IG5ldyBESW1nKGR0bywgYWN0aW9uU3ViamVjdCwgZXZlbnRCdXMsIHNjYWxlKTtcbiAgICAgICAgICAgIGNoaWxkRWxzLnB1c2gobmV3SW1hZ2UpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGNoaWxkRWxzO1xufTtcbiIsICJpbXBvcnQgeyBERWxlbWVudCB9IGZyb20gXCIuLi9EZWxlbWVudC9ERWxlbWVudFwiO1xuaW1wb3J0IHsgUGFnZUR0byB9IGZyb20gXCIuLi9kdG8vU2NoZW1hRHRvXCI7XG5pbXBvcnQgeyBjcmVhdGVERWxlbWVudCB9IGZyb20gXCIuL2VsZW1lbnQtZmFjdG9yeVwiO1xuaW1wb3J0IHsgRXZlbnRCdXMgfSBmcm9tIFwiLi4vZXZlbnRzL2V2ZW50LWJ1c1wiO1xuaW1wb3J0IHsgRENvbW1hbmRCdXMgfSBmcm9tIFwiLi4vY29tbWFuZHMvRENvbW1hbmRCdXNcIjtcbmltcG9ydCB7IERUaW1lc3RhbXAgfSBmcm9tIFwiLi4vY29tbW9uL0RUaW1lc3RhbXBcIjtcbmltcG9ydCB7IFNjYWxlU2VydmljZSB9IGZyb20gXCIuL3NjYWxlXCI7XG5cbmV4cG9ydCBjbGFzcyBEUGFnZSB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBUQUcgPSBcIlsgRFBhZ2UgXTogXCI7XG4gICAgcHJpdmF0ZSBlbGVtZW50czogREVsZW1lbnQ8SFRNTEVsZW1lbnQ+W10gPSBbXTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGV2ZW50QnVzO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY29tbWFuZEJ1cztcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNjYWxlOiBTY2FsZVNlcnZpY2U7XG4gICAgLy8gVG9kbyBHTE9CQUwgRVZFTlRfQlVTUyBBTkQgUEFHRSBFVkVOVFM6XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGR0bzogUGFnZUR0bywgZXZlbnRCdXM6IEV2ZW50QnVzLCBjb21tYW5kQnVzOiBEQ29tbWFuZEJ1cywgc2NhbGU6IFNjYWxlU2VydmljZSkge1xuICAgICAgICB0aGlzLmV2ZW50QnVzID0gZXZlbnRCdXM7XG4gICAgICAgIHRoaXMuY29tbWFuZEJ1cyA9IGNvbW1hbmRCdXM7XG4gICAgICAgIHRoaXMuc2NhbGUgPSBzY2FsZTtcbiAgICAgICAgdGhpcy5lbGVtZW50cyA9IGR0by5lbGVtZW50cy5tYXAoKGR0bykgPT4gY3JlYXRlREVsZW1lbnQoZHRvLCB0aGlzLmNvbW1hbmRCdXMsIHRoaXMuZXZlbnRCdXMsIHRoaXMuc2NhbGUpKTtcbiAgICB9XG5cbiAgICBhcHBlbmRZb3Vyc2VsZihwYXJlbnQ6IEhUTUxFbGVtZW50KSB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuVEFHICsgXCIgQVBQRU5ESU5HIFRPIFBBUkVOVFwiKTtcbiAgICAgICAgdGhpcy5lbGVtZW50cy5mb3JFYWNoKChlbCkgPT4ge1xuICAgICAgICAgICAgZWwuYXBwZW5kWW91cnNlbGYocGFyZW50KTtcbiAgICAgICAgICAgIC8vIHBhcmVudC5hcHBlbmRDaGlsZChlbC5lbCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIGlmICghcHJlbG9hZE1vZGUpIHtcbiAgICAgICAgdGhpcy5ldmVudEJ1cy5lbWl0KHtcbiAgICAgICAgICAgIGtpbmQ6IFwiUEFHRV9FTlRFUl9FVkVOVFwiLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBEVGltZXN0YW1wLm5vdygpLFxuICAgICAgICAgICAgcHJvZHVjZXI6IFwiRFBhZ2VcIixcbiAgICAgICAgICAgIHByb2R1Y2VySWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICBkYXRhOiB7IHBhZ2VJZDogdGhpcy5pZCB9LFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gfVxuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuZWxlbWVudHMuZm9yRWFjaCgoZWwpID0+IHtcbiAgICAgICAgICAgIGVsLmRlc3Ryb3koKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbG9nKCk6IHZvaWQge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyh0aGlzLlRBRyArICdzY2FsZSAtICcgKyB0aGlzLnNjYWxlKTtcbiAgICB9XG5cbiAgICBnZXQgaWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmR0by5pZDtcbiAgICB9XG59XG4iLCAiZXhwb3J0IGNsYXNzIFNjYWxlU2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYmFzZUhlaWdodDtcbiAgcHJpdmF0ZSByZWFkb25seSBiYXNlV2lkdGg7XG4gIHByaXZhdGUgY29udGFpbmVySGVpZ2h0ID0gMTMwMDtcbiAgcHJpdmF0ZSBjb250YWluZXJXaWR0aCA9IDEzMDA7XG5cbiAgZ2V0IHNjYWxlKCkge1xuICAgIHJldHVybiB0aGlzLl9zY2FsZTtcbiAgfVxuXG4gIGdldCBwYWdlSGVpZ2h0KCkge1xuICAgIHJldHVybiB0aGlzLmJhc2VIZWlnaHQgKiB0aGlzLnNjYWxlO1xuICB9XG4gIGdldCBwYWdlV2lkdGgoKSB7XG4gICAgcmV0dXJuIHRoaXMuYmFzZVdpZHRoICogdGhpcy5fc2NhbGU7XG4gIH1cblxuICBwcml2YXRlIF9zY2FsZSA9IDE7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBzdWJzY3JpYmVycyA9IG5ldyBTZXQ8KHNjYWxlOiBudW1iZXIpID0+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/IGRlc2NyaXB0aW9uIDogXCJObyBkZXNjcmlwdGlvbiBnaXZlblwiO1xuICAgICAgICB0aGlzLnByb3BEZWZpbml0aW9uID0ge1xuICAgICAgICAgICAgcHJvcERlc2NyaXB0aW9uLFxuICAgICAgICAgICAgcHJvcE5hbWU6IHByb3BOYW1lLFxuICAgICAgICAgICAgaW5pdGlhbFZhbHVlOiBpbml0aWFsLFxuICAgICAgICAgICAgb3B0aW9uczogW1xuICAgICAgICAgICAgICAgIHsgdmFsdWU6IEJvb2xlYW5TdGF0ZVByb3BlcnR5LkZBTFNFLnZhbHVlLCB2YWx1ZUxhYmVsOiBCb29sZWFuU3RhdGVQcm9wZXJ0eS5GQUxTRS5sYWJlbCB9LFxuICAgICAgICAgICAgICAgIHsgdmFsdWU6IEJvb2xlYW5TdGF0ZVByb3BlcnR5LlRSVUUudmFsdWUsIHZhbHVlTGFiZWw6IEJvb2xlYW5TdGF0ZVByb3BlcnR5LlRSVUUubGFiZWwgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBfdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgfTtcbiAgICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiO0FBd0NPLElBQVU7QUFBQSxDQUFWLENBQVVBLGVBQVY7QUFDSSxFQUFNQSxXQUFBLGVBQWUsQ0FDeEIsV0FLQztBQUNELFVBQU0sRUFBRSxNQUFNLElBQUk7QUFDbEIsVUFBTSxZQUFZLE1BQU0sT0FBeUIsQ0FBQyxLQUFLLFNBQVM7QUFDNUQsVUFBSSxNQUFNLFFBQVEsS0FBSyxLQUFLLEdBQUc7QUFDM0IsWUFBSSxLQUFLLEdBQUcsS0FBSyxLQUFLO0FBQUEsTUFDMUI7QUFDQSxhQUFPO0FBQUEsSUFDWCxHQUFHLENBQUMsQ0FBQztBQUNMLFVBQU0sWUFBOEIsTUFBTSxPQUF5QixDQUFDLEtBQUssU0FBUztBQUM5RSxVQUFJLE1BQU0sUUFBUSxLQUFLLEtBQUssR0FBRztB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Z0IsS0FBSyxXQUFXO0FBQUEsTUFDaEMsWUFBWSxzQkFBcUIsTUFBTTtBQUFBLE1BQ3ZDLE9BQU8sc0JBQXFCLE1BQU07QUFBQSxNQUNsQyxVQUFVO0FBQUEsSUFDZDtBQUFBLEVBQ0o7QUFBQSxFQUVBLG9CQUFrQztBQUM5QixXQUFPO0FBQUEsTUFDSCxNQUFNO0FBQUEsTUFDTixRQUFRO0FBQUEsTUFDUixVQUFVO0FBQUEsTUFDVixTQUFTO0FBQUEsUUFDTCxVQUFVLEVBQUUsVUFBVSxLQUFLLFVBQVUsTUFBTSxjQUFjLE9BQU8sRUFBRTtBQUFBLE1BQ3RFO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFBQSxFQUVBLHFCQUFtQztBQUMvQixXQUFPO0FBQUEsTUFDSCxNQUFNO0FBQUEsTUFDTixRQUFRO0FBQUEsTUFDUixVQUFVO0FBQUEsTUFDVixTQUFTO0FBQUEsUUFDTCxVQUFVLEVBQUUsVUFBVSxLQUFLLFVBQVUsTUFBTSxjQUFjLE9BQU8sRUFBRTtBQUFBLE1BQ3RFO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFpQko7IiwKICAibmFtZXMiOiBbIlNjaGVtYUR0byIsICJEVGltZXN0YW1wIiwgIkRVdGlsIiwgImlzTnVtYmVyIiwgIkRDc3MiLCAiRFN0eWxlIiwgIkFuc3dlcmVkUXVlc3Rpb24iLCAiQ29uZGl0aW9uIiwgImNvbmRpdGlvbiIsICJSdWxlIiwgInRhZyIsICJERXZlbnRIYW5kbGVyIiwgImR0byIsICJkdG8iLCAiU2NhbGUiLCAiUmVzdWx0IiwgIkRTdGF0ZSJdCn0K
2205
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2R0by9TY2hlbWFEdG8udHMiLCAiLi4vc3JjL2NvbW1vbi9EVGltZXN0YW1wLnRzIiwgIi4uL3NyYy91dGlscy9EVXRpbC50cyIsICIuLi9zcmMvRGVsZW1lbnQvY3NzLnRzIiwgIi4uL3NyYy9EZWxlbWVudC9EU3R5bGUudHMiLCAiLi4vc3JjL0RlbGVtZW50L1ZpZGVvQ29udGFpbmVyLnRzIiwgIi4uL3NyYy9EZWxlbWVudC9BdWRpb0NvbnRhaW5lci50cyIsICIuLi9zcmMvc2VydmljZXMvRE1lZGlhLW1hbmFnZXIudHMiLCAiLi4vc3JjL2NvbW1hbmRzL0RDb21tYW5kQnVzLnRzIiwgIi4uL3NyYy9ldmVudHMvZXZlbnQtYnVzLnRzIiwgIi4uL3NyYy9wbGF5ZXIvaGlzdG9yeS1xdWUudHMiLCAiLi4vc3JjL3J1bGVzL2NvbmRpdGlvbi50cyIsICIuLi9zcmMvcnVsZXMvcnVsZS50cyIsICIuLi9zcmMvcnVsZXMvcnVsZS1lbmdpbmUudHMiLCAiLi4vc3JjL3BsYXllci9uZXh0LXF1ZS50cyIsICIuLi9zcmMvcGxheWVyL2RwbGF5ZXIudHMiLCAiLi4vc3JjL2V2ZW50LWhhbmRsZXJzL0RFdmVudEhhbmRsZXIudHMiLCAiLi4vc3JjL0RlbGVtZW50L0RFbGVtZW50LnRzIiwgIi4uL3NyYy9EZWxlbWVudC9EZGl2LnRzIiwgIi4uL3NyYy9EZWxlbWVudC9ESW1nLnRzIiwgIi4uL3NyYy9EZWxlbWVudC9EVGV4dC50cyIsICIuLi9zcmMvZW5naW5lL2VsZW1lbnQtZmFjdG9yeS50cyIsICIuLi9zcmMvZW5naW5lL0RQYWdlLnRzIiwgIi4uL3NyYy9lbmdpbmUvc2NhbGUudHMiLCAiLi4vc3JjL3NlcnZpY2VzL3Jlc291cmNlLXByb3ZpZGVyLnRzIiwgIi4uL3NyYy9jb21tb24vcmVzdWx0LnRzIiwgIi4uL3NyYy9zdGF0ZS9Ec3RhdGUudHMiLCAiLi4vc3JjL3N0YXRlL3N0YXRlLXNlcnZpY2UudHMiLCAiLi4vc3JjL2VuZ2luZS9TY2hlbWFFbmdpbmUudHMiLCAiLi4vc3JjL3N0YXRlL2Jvb2xlYW4tcHJvcGVydHkudHMiLCAiLi4vc3JjL3V0aWxzL0lELnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBEQXV0b1BsYXlTZXF1ZW5jZSB9IGZyb20gXCIuLi9EZWxlbWVudC9EQXV0by1wbGF5XCI7XG5pbXBvcnQgeyBEQXVkaW9EdG8sIERFbGVtZW50RHRvLCBESW1nRHRvLCBEVmlkZW9EdG8gfSBmcm9tIFwiLi9ERWxlbWVudC5kdG9cIjtcbmltcG9ydCB7IFJ1bGUgfSBmcm9tIFwiLi4vcnVsZXMvcnVsZVwiO1xuaW1wb3J0IHsgRmFjdCB9IGZyb20gXCIuLi9ydWxlcy9mYWN0XCI7XG5pbXBvcnQgeyBQYWdlUXVlQ29tbWFuZCB9IGZyb20gXCIuLi9jb21tYW5kcy9EQ29tbWFuZFwiO1xuaW1wb3J0IHsgRFN0YXRlIH0gZnJvbSBcIi4uL3N0YXRlL0RzdGF0ZVwiO1xuaW1wb3J0IHsgUGFnZUlELCBTY2hlbWFJRCB9IGZyb20gXCIuLi91dGlscy9JRFwiO1xuXG5leHBvcnQgdHlwZSBQYWdlUXVlUnVsZXMgPSBSdWxlPFBhZ2VRdWVDb21tYW5kLCBuZXZlcj47XG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VEdG8ge1xuICByZWFkb25seSBpZDogUGFnZUlEO1xuICByZWFkb25seSBlbGVtZW50czogQXJyYXk8REVsZW1lbnREdG8+O1xuICByZWFkb25seSB0YWdzPzogc3RyaW5nW107XG4gIHJlYWRvbmx5IG1haW5WaWRlb0lkPzogc3RyaW5nO1xuICByZWFkb25seSBiYWNrZ3JvdW5kQ29sb3I/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHZpZGVvPzogQXJyYXk8RFZpZGVvRHRvPjtcbiAgcmVhZG9ubHkgYXVkaW8/OiBBcnJheTxEQXVkaW9EdG8+O1xuICByZWFkb25seSBhdXRvUGxheVNlcXVlbmNlPzogREF1dG9QbGF5U2VxdWVuY2U7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFnZVNlcXVlbmNlRHRvIHtcbiAgcmVhZG9ubHkgaWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgcnVsZXM6IEFycmF5PFBhZ2VRdWVSdWxlcz47XG4gIHJlYWRvbmx5IHBhZ2VzOiBBcnJheTxQYWdlRHRvPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTY2hlbWFEdG8ge1xuICByZWFkb25seSBpZDogU2NoZW1hSUQ7XG4gIHJlYWRvbmx5IGJhc2VIZWlnaHQ6IG51bWJlcjtcbiAgcmVhZG9ubHkgYmFzZVdpZHRoOiBudW1iZXI7XG4gIHJlYWRvbmx5IGJhY2tncm91bmRDb2xvcjogc3RyaW5nO1xuICByZWFkb25seSBwYWdlczogUGFnZUR0b1tdO1xuICByZWFkb25seSBydWxlczogQXJyYXk8UGFnZVF1ZVJ1bGVzPjtcbiAgcmVhZG9ubHkgc3RhdGVQcm9wcz86IFJlYWRvbmx5QXJyYXk8RFN0YXRlLlByb3A+O1xuICByZWFkb25seSBzdGF0ZVF1ZXJpZXM/OiBSZWFkb25seUFycmF5PERTdGF0ZS5TdGF0ZVF1ZXJ5PjtcbiAgcmVhZG9ubHkgc3RhdGVGcm9tRXZlbnQ6IFJlYWRvbmx5QXJyYXk8RFN0YXRlLmZyb21FdmVudEhhbmRsZXI+O1xuICByZWFkb25seSBwYWdlU2VxdWVuY2VzPzogQXJyYXk8UGFnZVNlcXVlbmNlRHRvPjtcbiAgcmVhZG9ubHkgcHJlZGVmaW5lZEZhY3RzPzogUmVhZG9ubHlBcnJheTxGYWN0Pjtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBTY2hlbWFEdG8ge1xuICBleHBvcnQgY29uc3QgZ2V0UmVzb3VyY2VzID0gKFxuICAgIHNjaGVtYTogU2NoZW1hRHRvLFxuICApOiB7XG4gICAgdmlkZW9MaXN0OiBSZWFkb25seUFycmF5PERWaWRlb0R0bz47XG4gICAgYXVkaW9MaXN0OiBSZWFkb25seUFycmF5PERBdWRpb0R0bz47XG4gICAgaW1hZ2VMaXN0OiBSZWFkb25seUFycmF5PERJbWdEdG8+O1xuICB9ID0+IHtcbiAgICBjb25zdCB7IHBhZ2VzIH0gPSBzY2hlbWE7XG4gICAgY29uc3QgdmlkZW9MaXN0ID0gcGFnZXMucmVkdWNlPEFycmF5PERWaWRlb0R0bz4+KChhY2MsIGN1cnIpID0+IHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGN1cnIudmlkZW8pKSB7XG4gICAgICAgIGFjYy5wdXNoKC4uLmN1cnIudmlkZW8pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCBbXSk7XG4gICAgY29uc3QgYXVkaW9MaXN0OiBBcnJheTxEQXVkaW9EdG8+ID0gcGFnZXMucmVkdWNlPEFycmF5PERBdWRpb0R0bz4+KChhY2MsIGN1cnIpID0+IHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGN1cnIuYXVkaW8pKSB7XG4gICAgICAgIGFjYy5wdXNoKC4uLmN1cnIuYXVkaW8pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCBbXSk7XG5cbiAgICByZXR1cm4geyB2aWRlb0xpc3QsIGF1ZGlvTGlzdCwgaW1hZ2VMaXN0OiBbXSB9O1xuICB9O1xufVxuIiwgImV4cG9ydCB0eXBlIERUaW1lc3RhbXAgPSBudW1iZXIgJiB7IF9fdGltZXN0YW1wX186IHRydWUgfTtcbmV4cG9ydCBuYW1lc3BhY2UgRFRpbWVzdGFtcCB7XG4gICAgZXhwb3J0IGNvbnN0IG5vdyA9ICgpID0+IERhdGUubm93KCkgYXMgRFRpbWVzdGFtcDtcbiAgICBleHBvcnQgdHlwZSBEaWZmID0gbnVtYmVyICYgeyBfX2RpZmZfXzogdHJ1ZSB9O1xuXG4gICAgZXhwb3J0IGNvbnN0IGFkZE1pbGxzID0gKHQ6IERUaW1lc3RhbXAsIG1zOiBudW1iZXIpOiBEVGltZXN0YW1wID0+IHtcbiAgICAgICAgY29uc3QgcmVzID0gdCArIE1hdGguYWJzKG1zKTtcbiAgICAgICAgcmV0dXJuIHJlcyBhcyBEVGltZXN0YW1wO1xuICAgIH07XG5cbiAgICBleHBvcnQgY29uc3QgZGlmZiA9ICh0MTogRFRpbWVzdGFtcCwgdDI6IERUaW1lc3RhbXApOiBEaWZmID0+IHtcbiAgICAgICAgY29uc3QgdDFBYnMgPSBNYXRoLmFicyh0MSk7XG4gICAgICAgIGNvbnN0IHQyQWJzID0gTWF0aC5hYnModDIpO1xuICAgICAgICByZXR1cm4gTWF0aC5hYnModDFBYnMgLSB0MkFicykgYXMgRGlmZjtcbiAgICB9O1xuXG4gICAgZXhwb3J0IGNvbnN0IGRpZmZOb3cgPSAodDogRFRpbWVzdGFtcCk6IERpZmYgPT4ge1xuICAgICAgICByZXR1cm4gZGlmZih0LCBub3coKSk7XG4gICAgfTtcbn1cbiIsICJleHBvcnQgdHlwZSBSYW5kb21PYmplY3RJZCA9IHN0cmluZyAmIHsgcmFuZG9tT2JqZWN0SWQ6IHRydWUgfTtcbmV4cG9ydCBuYW1lc3BhY2UgRFV0aWwge1xuICAgIGV4cG9ydCBjb25zdCByYW5kb21TdHJpbmcgPSAobGVuZ3RoOiBudW1iZXIpOiBzdHJpbmcgPT4ge1xuICAgICAgICBjb25zdCBsZXR0ZXJzID0gXCJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2eHl6XCI7XG4gICAgICAgIGNvbnN0IHVwcGVyY2FzZSA9IGxldHRlcnMudG9VcHBlckNhc2UoKTtcbiAgICAgICAgY29uc3QgYWxsID0gbGV0dGVycyArIHVwcGVyY2FzZTtcbiAgICAgICAgY29uc3QgYWJzID0gTWF0aC5hYnMobGVuZ3RoKTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFwiXCI7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhYnM7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgY2hhciA9IGFsbC5jaGFyQXQoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogYWxsLmxlbmd0aCkpO1xuICAgICAgICAgICAgcmVzdWx0ICs9IGNoYXI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgZXhwb3J0IGNvbnN0IHJhbmRvbU9iamVjdElkID0gKCkgPT4gcmFuZG9tU3RyaW5nKDMyKSBhcyBSYW5kb21PYmplY3RJZDtcblxuICAgIGV4cG9ydCBjb25zdCBkZWxldGVQcm9wID0gPE9iaiwgS2V5IGV4dGVuZHMga2V5b2YgT2JqPihvYmo6IE9iaiwga2V5OiBLZXkpOiBPbWl0PE9iaiwgS2V5PiA9PiB7XG4gICAgICAgIGRlbGV0ZSBvYmpba2V5XTtcbiAgICAgICAgcmV0dXJuIG9iajtcbiAgICB9O1xuXG4gICAgZXhwb3J0IGNvbnN0IGlzSW5SYW5nZSA9IChtaW46IG51bWJlciwgbWF4OiBudW1iZXIpID0+IHtcbiAgICAgICAgcmV0dXJuICh2YWx1ZTogbnVtYmVyKSA9PiB2YWx1ZSA+PSBtaW4gJiYgdmFsdWUgPD0gbWF4O1xuICAgIH07XG4gICAgZXhwb3J0IGNvbnN0IGlzSW5maW5pdHkgPSAobnVtYmVyOiBudW1iZXIpID0+IHtcbiAgICAgICAgcmV0dXJuIG51bWJlciA9PT0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZIHx8IG51bWJlciA9PT0gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZIHx8IG51bWJlciA9PT0gSW5maW5pdHk7XG4gICAgfTtcbiAgICBleHBvcnQgdHlwZSBOb25FbXB0eUFycmF5PFQ+ID0gW1QsIC4uLlRbXV07XG4gICAgZXhwb3J0IGNvbnN0IGlzTm9uRW1wdHlBcnJheSA9IDxUPihhcnJheTogQXJyYXk8VD4pOiBhcnJheSBpcyBOb25FbXB0eUFycmF5PFQ+ID0+IHtcbiAgICAgICAgcmV0dXJuIGFycmF5Lmxlbmd0aCA+IDA7XG4gICAgfTtcblxuICAgIGV4cG9ydCBjb25zdCBuZXZlckNoZWNrID0gKGFyZ3M6IG5ldmVyKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiT09QUzogVGhpcyB2YWx1ZSBzbGlwcGVkIHRocm91Z2ggdGhlIG5ldmVyLWNoZWNrXCIsIGFyZ3MpO1xuICAgIH07XG5cbiAgICBleHBvcnQgY29uc3QgaXNTdHJpbmcgPSAoc3RyOiB1bmtub3duKTogc3RyIGlzIHN0cmluZyA9PiB0eXBlb2Ygc3RyID09PSBcInN0cmluZ1wiO1xuXG4gICAgZXhwb3J0IGNvbnN0IGhhc0tleSA9IDxUIGV4dGVuZHMgc3RyaW5nPihvYmo6IHVua25vd24sIGtleTogVCk6IG9iaiBpcyBSZWNvcmQ8dHlwZW9mIGtleSwgdW5rbm93bj4gPT4ge1xuICAgICAgICBpZiAoIWlzUmVjb3JkKG9iaikpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KTtcbiAgICB9O1xuXG4gICAgZXhwb3J0IGNvbnN0IGlzUmVjb3JkID0gKG9iajogdW5rbm93bik6IG9iaiBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiB7XG4gICAgICAgIGlmICghb2JqKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIG9iaiAhPT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9iaiA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG5cbiAgICBleHBvcnQgY29uc3QgaXNCb29sID0gKG9iajogYm9vbGVhbik6IG9iaiBpcyBib29sZWFuID0+IHR5cGVvZiBvYmogPT09IFwiYm9vbGVhblwiO1xuXG4gICAgZXhwb3J0IGNvbnN0IGlzVHJ1ZSA9IChib29sOiBib29sZWFuKTogYm9vbCBpcyB0cnVlID0+IGJvb2wgPT09IHRydWU7XG5cbiAgICBleHBvcnQgY29uc3QgaXNGYWxzZSA9IChib29sOiBib29sZWFuKTogYm9vbCBpcyBmYWxzZSA9PiBib29sID09PSBmYWxzZTtcblxuICAgIGV4cG9ydCBjb25zdCBpc0RlZmluZWQgPSAob2JqOiB1bmtub3duKTogYm9vbGVhbiA9PiB7XG4gICAgICAgIGNvbnN0IG5vdE51bGwgPSBvYmogIT09IG51bGw7XG4gICAgICAgIGNvbnN0IG5vdFVuZGVmaW5lZCA9IG9iaiAhPT0gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gbm90TnVsbCAmJiBub3RVbmRlZmluZWQ7XG4gICAgfTtcblxuICAgIGV4cG9ydCBjb25zdCBoYXNLaW5kID0gKG9iajogdW5rbm93bik6IG9iaiBpcyB7IHJlYWRvbmx5IGtpbmQ6IHN0cmluZyB9ID0+IHtcbiAgICAgICAgaWYgKCFoYXNLZXkob2JqLCBcImtpbmRcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG9iai5raW5kICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9iai5raW5kLmxlbmd0aCA+IDA7XG4gICAgfTtcblxuICAgIGV4cG9ydCBjb25zdCBoYXNWYWx1ZSA9IChvYmo6IHVua25vd24pOiBvYmogaXMgeyB2YWx1ZTogdW5rbm93biB9ID0+IHtcbiAgICAgICAgcmV0dXJuIGhhc0tleShvYmosIFwidmFsdWVcIik7XG4gICAgfTtcbiAgICBleHBvcnQgY29uc3QgaXNOdW1iZXIgPSAodmFsdWU/OiBudW1iZXIpOiB2YWx1ZSBpcyBudW1iZXIgPT4ge1xuICAgICAgICBjb25zdCBpc051bWJlciA9IHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIjtcbiAgICAgICAgY29uc3Qgbm90TmFOID0gIU51bWJlci5pc05hTih2YWx1ZSk7XG4gICAgICAgIHJldHVybiBpc051bWJlciAmJiBub3ROYU47XG4gICAgfTtcblxuICAgIGV4cG9ydCBjb25zdCBtYXhGbiA9ICh1cHBlckxpbWl0OiBudW1iZXIpID0+IHtcbiAgICAgICAgcmV0dXJuICh2YWx1ZTogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5taW4odmFsdWUsIHVwcGVyTGltaXQpO1xuICAgICAgICB9O1xuICAgIH07XG5cbiAgICBleHBvcnQgY29uc3QgbWluRm4gPSAobG93ZXJMaW1pdDogbnVtYmVyKSA9PiB7XG4gICAgICAgIHJldHVybiAodmFsdWU6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGgubWluKHZhbHVlLCBsb3dlckxpbWl0KTtcbiAgICAgICAgfTtcbiAgICB9O1xufVxuIiwgImltcG9ydCB7IERVdGlsIH0gZnJvbSBcIi4uL3V0aWxzL0RVdGlsXCI7XG5cbmV4cG9ydCBuYW1lc3BhY2UgRENzcyB7XG4gICAgZXhwb3J0IGludGVyZmFjZSBQeCB7XG4gICAgICAgIHJlYWRvbmx5IF91bml0OiBcInB4XCI7XG4gICAgICAgIHJlYWRvbmx5IHZhbHVlOiBudW1iZXI7XG4gICAgfVxuXG4gICAgZXhwb3J0IHR5cGUgTGVuZ3RoU3RyaW5nID0gYCR7bnVtYmVyfXB4YCB8IGAke251bWJlcn0lYDtcbiAgICBleHBvcnQgaW50ZXJmYWNlIFBlcmNlbnQge1xuICAgICAgICByZWFkb25seSBfdW5pdDogXCJwZXJjZW50XCI7XG4gICAgICAgIHJlYWRvbmx5IHZhbHVlOiBudW1iZXI7XG4gICAgfVxuXG4gICAgZXhwb3J0IHR5cGUgTGVuZ3RoVW5pdCA9IFB4IHwgUGVyY2VudDtcblxuICAgIC8qKlxuICAgICAqIFdpbGwgc2NhbGUgdG8gMyUgb2YgYmFzZVNjYWxlXG4gICAgICogQHBhcmFtIHVuaXRcbiAgICAgKiBAcGFyYW0gc2NhbGVcbiAgICAgKi9cbiAgICBleHBvcnQgY29uc3QgdG9TdHJpbmcgPSAodW5pdDogUmVhZG9ubHk8TGVuZ3RoVW5pdD4sIHNjYWxlOiBudW1iZXIpOiBMZW5ndGhTdHJpbmcgPT4ge1xuICAgICAgICBjb25zdCBjbGFtcGVkU2NhbGUgPSBNYXRoLm1heChzY2FsZSwgMC4wMyk7XG4gICAgICAgIGlmICh1bml0Ll91bml0ID09PSBcInB4XCIpIHtcbiAgICAgICAgICAgIGlmICh1bml0LnZhbHVlIDwgMC4xKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiMHB4XCI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHJvdW5kZWQgPSBNYXRoLnJvdW5kKHVuaXQudmFsdWUgKiBjbGFtcGVkU2NhbGUpO1xuICAgICAgICAgICAgY29uc3QgY2xhbXBlZCA9IE1hdGgubWF4KHJvdW5kZWQsIDEpO1xuICAgICAgICAgICAgcmV0dXJuIChjbGFtcGVkICsgXCJweFwiKSBhcyBMZW5ndGhTdHJpbmc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICh1bml0LnZhbHVlICsgXCIlXCIpIGFzIExlbmd0aFN0cmluZztcbiAgICB9O1xuXG4gICAgZXhwb3J0IGNvbnN0IGlzTGVuZ3RoVW5pdCA9ICh1bml0PzogTGVuZ3RoVW5pdCk6IHVuaXQgaXMgTGVuZ3RoVW5pdCA9PiB7XG4gICAgICAgIGlmICghdW5pdCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVuaXRLZXk6IGtleW9mIExlbmd0aFVuaXQgPSBcIl91bml0XCI7XG4gICAgICAgIGNvbnN0IHZhbHVlS2V5OiBrZXlvZiBMZW5ndGhVbml0ID0gXCJ2YWx1ZVwiO1xuICAgICAgICBjb25zdCBoYXNVbml0S2V5ID0gRFV0aWwuaGFzS2V5KHVuaXQsIHVuaXRLZXkpO1xuICAgICAgICBjb25zdCBoYXNWYWx1ZUtleSA9IERVdGlsLmhhc0tleSh1bml0LCB2YWx1ZUtleSk7XG4gICAgICAgIHJldHVybiBoYXNVbml0S2V5ICYmIGhhc1ZhbHVlS2V5O1xuICAgIH07XG59XG4iLCAiaW1wb3J0IHsgRENzcyB9IGZyb20gXCIuL2Nzc1wiO1xuaW1wb3J0IHsgRWxlbWVudEtleU5hbWVzIH0gZnJvbSBcIi4vRFN0eWxlLXV0aWxzXCI7XG5pbXBvcnQgeyBEVXRpbCB9IGZyb20gXCIuLi91dGlscy9EVXRpbFwiO1xuXG50eXBlIERTdHlsZTIgPSBDU1NTdHlsZURlY2xhcmF0aW9uO1xuZXhwb3J0IGludGVyZmFjZSBEU3R5bGUge1xuICAgIG9wYWNpdHk6IG51bWJlcjtcbiAgICBiYWNrZ3JvdW5kQ29sb3I6IHN0cmluZztcbiAgICB2aXNpYmlsaXR5OiBcInZpc2libGVcIiB8IFwiaGlkZGVuXCI7XG4gICAgY3Vyc29yOlxuICAgICAgICB8IFwicG9pbnRlclwiXG4gICAgICAgIHwgXCJoZWxwXCJcbiAgICAgICAgfCBcImNvcHlcIlxuICAgICAgICB8IFwid2FpdFwiXG4gICAgICAgIHwgXCJub3QtYWxsb3dlZFwiXG4gICAgICAgIHwgXCJjb250ZXh0LW1lbnVcIlxuICAgICAgICB8IFwibW92ZVwiXG4gICAgICAgIHwgXCJncmFiYmluZ1wiXG4gICAgICAgIHwgXCJncmFiXCJcbiAgICAgICAgfCBcInpvb20taW5cIlxuICAgICAgICB8IFwiem9vbS1vdXRcIlxuICAgICAgICB8IFwibm9uZVwiXG4gICAgICAgIHwgXCJhdXRvXCJcbiAgICAgICAgfCBcImRlZmF1bHRcIjtcblxuICAgIC8vIFBPU0lUSU9OXG4gICAgaDogbnVtYmVyO1xuICAgIHc6IG51bWJlcjtcbiAgICB4OiBudW1iZXI7XG4gICAgeTogbnVtYmVyO1xuXG4gICAgLy8gQk9SREVSU1xuICAgIGJvcmRlclN0eWxlOiBcInNvbGlkXCIgfCBcIm5vbmVcIiB8IFwiZG90dGVkXCIgfCBcImRhc2hlZFwiO1xuICAgIGJvcmRlclJhZGl1czogRENzcy5QeCB8IERDc3MuUGVyY2VudDtcbiAgICBib3JkZXJXaWR0aDogRENzcy5QeDtcbiAgICBib3JkZXJDb2xvcjogc3RyaW5nO1xuXG4gICAgbWFyZ2luOiBEQ3NzLlB4IHwgRENzcy5QZXJjZW50O1xuICAgIHBhZGRpbmc6IERDc3MuUHggfCBEQ3NzLlBlcmNlbnQ7XG5cbiAgICAvLyBUcmFuc2xhdGVcbiAgICB0cmFuc2Zvcm06IHN0cmluZztcbiAgICB0cmFuc2xhdGU6IHN0cmluZztcblxuICAgIC8vIFRFWFRcbiAgICBmb250U2l6ZTogRENzcy5QeDtcbiAgICB0ZXh0Q29sb3I6IHN0cmluZztcbiAgICBmb250V2VpZ2h0OiAxMDAgfCAyMDAgfCAzMDAgfCA0MDAgfCA1MDAgfCA2MDAgfCA3MDAgfCA4MDAgfCA5MDA7XG4gICAgdGV4dEFsaWduOiBcInJpZ2h0XCIgfCBcImxlZnRcIiB8IFwiY2VudGVyXCI7XG4gICAgbGV0dGVyU3BhY2luZzogRENzcy5QeDtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBEU3R5bGUge1xuICAgIGV4cG9ydCBjb25zdCBub3JtYWxpemUgPSA8VCBleHRlbmRzIEhUTUxFbGVtZW50PihlbDogVCk6IFQgPT4ge1xuICAgICAgICBlbC5zdHlsZS5wYWRkaW5nID0gXCIwXCI7XG4gICAgICAgIGVsLnN0eWxlLm1hcmdpbiA9IFwiMFwiO1xuICAgICAgICBlbC5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcbiAgICAgICAgZWwuc3R5bGUuYm94U2l6aW5nID0gXCJib3JkZXItYm94XCI7XG4gICAgICAgIHJldHVybiBlbDtcbiAgICB9O1xuXG4gICAgZXhwb3J0IGNvbnN0IGFwcGx5U3R5bGVzID0gPFQgZXh0ZW5kcyBIVE1MRWxlbWVudD4oZWw6IFQsIHN0eWxlOiBQYXJ0aWFsPERTdHlsZT4sIHNjYWxlOiBudW1iZXIpOiBUID0+IHtcbiAgICAgICAgLy8gY29uc3Qgc2NhbGVQeCA9IERDc3MudG9TdHJpbmdDcmUodGhpcy5zY2FsZSk7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIHgsXG4gICAgICAgICAgICB5LFxuICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yLFxuICAgICAgICAgICAgYm9yZGVyQ29sb3IsXG4gICAgICAgICAgICBib3JkZXJXaWR0aCxcbiAgICAgICAgICAgIGJvcmRlclJhZGl1cyxcbiAgICAgICAgICAgIGJvcmRlclN0eWxlLFxuICAgICAgICAgICAgdyxcbiAgICAgICAgICAgIG9wYWNpdHksXG4gICAgICAgICAgICBjdXJzb3IsXG4gICAgICAgICAgICBmb250U2l6ZSxcbiAgICAgICAgICAgIGZvbnRXZWlnaHQsXG4gICAgICAgICAgICB0ZXh0Q29sb3IsXG4gICAgICAgICAgICB0ZXh0QWxpZ24sXG4gICAgICAgICAgICB0cmFuc2xhdGUsXG4gICAgICAgICAgICBtYXJnaW4sXG4gICAgICAgICAgICBwYWRkaW5nLFxuICAgICAgICAgICAgbGV0dGVyU3BhY2luZyxcbiAgICAgICAgICAgIGgsXG4gICAgICAgICAgICB0cmFuc2Zvcm0sXG4gICAgICAgICAgICB2aXNpYmlsaXR5LFxuICAgICAgICB9ID0gc3R5bGU7XG5cbiAgICAgICAgLy8gdGhpcy5lbC5zdHlsZS5mb250V2VpZ2h0ID0gJzkwMCc7XG4gICAgICAgIGlmIChiYWNrZ3JvdW5kQ29sb3IpIHtcbiAgICAgICAgICAgIGVsLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IGJhY2tncm91bmRDb2xvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjdXJzb3IpIHtcbiAgICAgICAgICAgIGVsLnN0eWxlLmN1cnNvciA9IGN1cnNvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0cmFuc2Zvcm0pIHtcbiAgICAgICAgICAgIGVsLnN0eWxlLnRyYW5zZm9ybSA9IHRyYW5zZm9ybTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0ZXh0Q29sb3IpIHtcbiAgICAgICAgICAgIGVsLnN0eWxlLmNvbG9yID0gdGV4dENvbG9yO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0ZXh0QWxpZ24pIHtcbiAgICAgICAgICAgIGVsLnN0eWxlLnRleHRBbGlnbiA9IHRleHRBbGlnbjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChib3JkZXJDb2xvcikge1xuICAgICAgICAgICAgZWwuc3R5bGUuYm9yZGVyQ29sb3IgPSBib3JkZXJDb2xvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChib3JkZXJXaWR0aCkge1xuICAgICAgICAgICAgZWwuc3R5bGUuYm9yZGVyV2lkdGggPSBEQ3NzLnRvU3RyaW5nKGJvcmRlcldpZHRoLCBzY2FsZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZvbnRXZWlnaHQpIHtcbiAgICAgICAgICAgIGVsLnN0eWxlLmZvbnRXZWlnaHQgPSBmb250V2VpZ2h0ICsgXCJcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYm9yZGVyU3R5bGUpIHtcbiAgICAgICAgICAgIGVsLnN0eWxlLmJvcmRlclN0eWxlID0gYm9yZGVyU3R5bGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZvbnRTaXplKSB7XG4gICAgICAgICAgICBlbC5zdHlsZS5mb250U2l6ZSA9IERDc3MudG9TdHJpbmcoZm9udFNpemUsIHNjYWxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChEVXRpbC5pc051bWJlcih4KSkge1xuICAgICAgICAgICAgZWwuc3R5bGUubGVmdCA9IHggKyBcIiVcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoRFV0aWwuaXNOdW1iZXIoeSkpIHtcbiAgICAgICAgICAgIGVsLnN0eWxlLmJvdHRvbSA9IHkgKyBcIiVcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChEVXRpbC5pc051bWJlcihoKSkge1xuICAgICAgICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gaCArIFwiJVwiO1xuICAgICAgICB9XG4gICAgICAgIGlmIChEVXRpbC5pc051bWJlcih3KSkge1xuICAgICAgICAgICAgZWwuc3R5bGUud2lkdGggPSB3ICsgXCIlXCI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoRENzcy5pc0xlbmd0aFVuaXQoYm9yZGVyUmFkaXVzKSkge1xuICAgICAgICAgICAgZWwuc3R5bGUuYm9yZGVyUmFkaXVzID0gRENzcy50b1N0cmluZyhib3JkZXJSYWRpdXMsIHNjYWxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsZXR0ZXJTcGFjaW5nKSB7XG4gICAgICAgICAgICBlbC5zdHlsZS5sZXR0ZXJTcGFjaW5nID0gRENzcy50b1N0cmluZyhsZXR0ZXJTcGFjaW5nLCBzY2FsZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1hcmdpbikge1xuICAgICAgICAgICAgZWwuc3R5bGUubWFyZ2luID0gRENzcy50b1N0cmluZyhtYXJnaW4sIHNjYWxlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFkZGluZykge1xuICAgICAgICAgICAgZWwuc3R5bGUucGFkZGluZyA9IERDc3MudG9TdHJpbmcocGFkZGluZywgc2NhbGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKERVdGlsLmlzTnVtYmVyKG9wYWNpdHkpKSB7XG4gICAgICAgICAgICBlbC5zdHlsZS5vcGFjaXR5ID0gb3BhY2l0eSArIFwiXCI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmlzaWJpbGl0eSkge1xuICAgICAgICAgICAgZWwuc3R5bGUudmlzaWJpbGl0eSA9IHZpc2liaWxpdHk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZWw7XG4gICAgfTtcbiAgICAvLyBjb25zdCBwcm9wTmFtZXMgPSBuZXcgU2V0KC4uLkVsZW1lbnRLZXlOYW1lcyk7XG4gICAgLy8gZXhwb3J0IGNvbnN0IHZhbGlkS2V5ID0gKGtleU5hbWU6IHN0cmluZykgPT4gcHJvcE5hbWVzLmhhcyhrZXlOYW1lKTtcbn1cbiIsICJpbXBvcnQgeyBEVmlkZW9EdG8gfSBmcm9tIFwiLi4vZHRvL0RFbGVtZW50LmR0b1wiO1xuaW1wb3J0IHsgRFRpbWVzdGFtcCB9IGZyb20gXCIuLi9jb21tb24vRFRpbWVzdGFtcFwiO1xuaW1wb3J0IHsgREV2ZW50RGlzcGF0Y2hlciB9IGZyb20gXCIuLi9ldmVudHMvZXZlbnQtYnVzXCI7XG5pbXBvcnQgeyBTY2FsZVNlcnZpY2UgfSBmcm9tIFwiLi4vZW5naW5lL3NjYWxlXCI7XG5pbXBvcnQgeyBEU3R5bGUgfSBmcm9tIFwiLi9EU3R5bGVcIjtcbmltcG9ydCB7IERVdGlsIH0gZnJvbSBcIi4uL3V0aWxzL0RVdGlsXCI7XG5cbmNvbnN0IEFCT1JUX1BMQVlfVE9fRU5EID0gXCJBQk9SVF9QTEFZX1RPX0VORFwiO1xuZXhwb3J0IGludGVyZmFjZSBDYW5QbGF5VG9FbmQge1xuICAgIHBsYXlUb0VuZCgpOiBQcm9taXNlPGJvb2xlYW4+O1xufVxuXG5leHBvcnQgY2xhc3MgVmlkZW9Db250YWluZXIgaW1wbGVtZW50cyBDYW5QbGF5VG9FbmQge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgVEFHOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBkdG8/OiBEVmlkZW9EdG87XG4gICAgcHJpdmF0ZSBkZWZhdWx0U3R5bGVzOiBQYXJ0aWFsPERTdHlsZT4gPSB7IGg6IDQ1LCB3OiAxMDAsIHZpc2liaWxpdHk6IFwiaGlkZGVuXCIsIHk6IDU1IH07XG5cbiAgICBwYXVzZSgpIHtcbiAgICAgICAgdGhpcy5ldmVudEJ1cy5lbWl0KHtcbiAgICAgICAgICAgIGtpbmQ6IFwiVklERU9fUEFVU0VEX0VWRU5UXCIsXG4gICAgICAgICAgICBkYXRhOiB7fSxcbiAgICAgICAgICAgIHByb2R1Y2VyOiBcIkRWaWRlb1wiLFxuICAgICAgICAgICAgcHJvZHVjZXJJZDogdGhpcy5pZCxcbiAgICAgICAgICAgIHRpbWVzdGFtcDogRFRpbWVzdGFtcC5ub3coKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZWwucGF1c2UoKTtcbiAgICB9XG5cbiAgICBwbGF5KHVybDogc3RyaW5nKSB7XG4gICAgICAgIGlmICh0aGlzLmVsLnNyYyAhPT0gdXJsKSB7XG4gICAgICAgICAgICB0aGlzLmVsLnNyYyA9IHVybDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcm9kdWNlcklkID0gdGhpcy5kdG8/LmlkID8/IFwiRFZpZGVvXCI7XG4gICAgICAgIHRoaXMuZXZlbnRCdXMuZW1pdCh7XG4gICAgICAgICAgICBraW5kOiBcIlZJREVPX1BMQVlfRVZFTlRcIixcbiAgICAgICAgICAgIGRhdGE6IHt9LFxuICAgICAgICAgICAgcHJvZHVjZXI6IFwiRFZpZGVvXCIsXG4gICAgICAgICAgICBwcm9kdWNlcklkLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBEVGltZXN0YW1wLm5vdygpLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5lbFxuICAgICAgICAgICAgLnBsYXkoKVxuICAgICAgICAgICAgLnRoZW4oKHJlcykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHJlcyk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgLy8gaWYodGhpcy5lbC5zcmMgIT09IHVybCkge1xuICAgICAgICAvLyAgICAgdGhpcy5cbiAgICAgICAgLy8gfVxuICAgIH1cblxuICAgIGFzeW5jIHBsYXlUb0VuZCgpIHtcbiAgICAgICAgdGhpcy5lbC52b2x1bWUgPSAxO1xuICAgICAgICBjb25zdCB1cmwgPSB0aGlzLmR0bz8udXJsO1xuICAgICAgICBpZiAoIXVybCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGVuZGVkT3JFcnJvcmVkID0gbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZWwuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICAgICAgICAgICAgXCJlbmRlZFwiLFxuICAgICAgICAgICAgICAgICAgICAoXykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgeyBvbmNlOiB0cnVlIH1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHRoaXMuZWwuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICAgICAgICAgICAgXCJlcnJvclwiLFxuICAgICAgICAgICAgICAgICAgICAoXykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgb25jZTogdHJ1ZSB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0aGlzLmVsLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgICAgICAgICAgIEFCT1JUX1BMQVlfVE9fRU5ELFxuICAgICAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkNBVENIRUQgQUJCT1JULlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChcIkFib3J0ZWRcIik7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgb25jZTogdHJ1ZSB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJQTEFZXCIpO1xuICAgICAgICAgICAgdGhpcy5wbGF5KHVybCk7XG4gICAgICAgICAgICBhd2FpdCBlbmRlZE9yRXJyb3JlZDtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHRoaXMuVEFHICsgXCIgZmluYWxseSBibG9jayBwbGF5VG9FbmQoKSBjb21wbGV0ZWQgdmlkZW9JZDogXCIgKyB0aGlzLmR0bz8uaWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgZWw6IEhUTUxWaWRlb0VsZW1lbnQsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgZXZlbnRCdXM6IERFdmVudERpc3BhdGNoZXIsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgc2NhbGU6IFNjYWxlU2VydmljZSAvLyBkdG8/OiBEVmlkZW9EdG9cbiAgICApIHtcbiAgICAgICAgdGhpcy5UQUcgPSBcIlsgRF9WaWRlbyBdIDogXCI7XG4gICAgICAgIHRoaXMuZWwuY29udHJvbHMgPSBmYWxzZTtcbiAgICAgICAgRFN0eWxlLm5vcm1hbGl6ZSh0aGlzLmVsKTtcbiAgICAgICAgRFN0eWxlLmFwcGx5U3R5bGVzKHRoaXMuZWwsIHRoaXMuZGVmYXVsdFN0eWxlcywgdGhpcy5zY2FsZS5zY2FsZSk7XG5cbiAgICAgICAgdGhpcy5lbC5vbmVuZGVkID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5ldmVudEJ1cy5lbWl0KHtcbiAgICAgICAgICAgICAgICBraW5kOiBcIlZJREVPX0VOREVEX0VWRU5UXCIsXG4gICAgICAgICAgICAgICAgdGltZXN0YW1wOiBEVGltZXN0YW1wLm5vdygpLFxuICAgICAgICAgICAgICAgIHByb2R1Y2VyOiBcIkRWaWRlb1wiLFxuICAgICAgICAgICAgICAgIHByb2R1Y2VySWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICAgICAgZGF0YToge30sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5lbC5vbnBsYXkgPSAoKSA9PiB7XG4gICAgICAgICAgICAvLyBUT0RPIExPR0cgSU5URVJOQUwgU1RBVEVfQ0hBTkdFUy5cbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmVsLm9ucGF1c2UgPSAoKSA9PiB7fTtcbiAgICAgICAgdGhpcy5lbC5vbmVycm9yID0gKCkgPT4ge307XG4gICAgICAgIHRoaXMuZWwub25jYW5wbGF5ID0gKCkgPT4ge1xuICAgICAgICAgICAgLy8gY29uc29sZS5ncm91cENvbGxhcHNlZCh0aGlzLlRBRyArIFwiUkVBRFkgVE8gUExBWVwiKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiRHVyYXRpb246IFwiICsgdGhpcy5lbC5kdXJhdGlvbik7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIklkOiBcIiArIHRoaXMuaWQpO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJDdXJyZW50IFRpbWU6IFwiICsgdGhpcy5lbC5jdXJyZW50VGltZSk7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkF1ZG9QbGF5OiBcIiArIHRoaXMuZWwuYXV0b3BsYXkpO1xuICAgICAgICAgICAgLy8gY29uc29sZS5ncm91cEVuZCgpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmVsLm9ubG9hZGVkbWV0YWRhdGEgPSAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkdXJhdGlvbiA9IHRoaXMuZWwuZHVyYXRpb247XG4gICAgICAgICAgICBjb25zdCBpc0luZmluaXR5ID0gRFV0aWwuaXNJbmZpbml0eShkdXJhdGlvbik7XG4gICAgICAgICAgICB0aGlzLmV2ZW50QnVzLmVtaXQoe1xuICAgICAgICAgICAgICAgIGtpbmQ6IFwiVklERU9fTE9BREVEX01FVEFEQVRBX0VWRU5UXCIsXG4gICAgICAgICAgICAgICAgdGltZXN0YW1wOiBEVGltZXN0YW1wLm5vdygpLFxuICAgICAgICAgICAgICAgIHByb2R1Y2VyOiBcIkRWaWRlb1wiLFxuICAgICAgICAgICAgICAgIHByb2R1Y2VySWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICAgICAgZGF0YTogeyBkdXJhdGlvbiwgaXNJbmZpbml0eSB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIC8vIFRPRE8gVVNFIFRISVMgU1lOVEFYP1xuICAgICAgICB0aGlzLmVsLm9uZHVyYXRpb25jaGFuZ2UgPSAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkdXJhdGlvbiA9IHRoaXMuZWwuZHVyYXRpb247XG4gICAgICAgICAgICBjb25zdCBpc0luZmluaXR5ID0gRFV0aWwuaXNJbmZpbml0eShkdXJhdGlvbik7XG4gICAgICAgICAgICB0aGlzLmV2ZW50QnVzLmVtaXQoe1xuICAgICAgICAgICAgICAgIGtpbmQ6IFwiVklERU9fRFVSQVRJT05fQ0hBTkdFX0VWRU5UXCIsXG4gICAgICAgICAgICAgICAgcHJvZHVjZXI6IFwiRFZpZGVvXCIsXG4gICAgICAgICAgICAgICAgcHJvZHVjZXJJZDogdGhpcy5pZCxcbiAgICAgICAgICAgICAgICB0aW1lc3RhbXA6IERUaW1lc3RhbXAubm93KCksXG4gICAgICAgICAgICAgICAgZGF0YTogeyBkdXJhdGlvbiwgaXNJbmZpbml0eSB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZ2V0U3RhdHMoKSB7XG4gICAgICAgIGNvbnN0IGR1cmF0aW9uID0gdGhpcy5lbC5kdXJhdGlvbjtcbiAgICAgICAgY29uc3QgY3VycmVudFRpbWUgPSB0aGlzLmVsLmN1cnJlbnRUaW1lO1xuICAgICAgICBjb25zdCB2b2x1bWUgPSB0aGlzLmVsLnZvbHVtZTtcbiAgICAgICAgY29uc3QgaXNDb25uZWN0ZWQgPSB0aGlzLmVsLmlzQ29ubmVjdGVkO1xuICAgICAgICBjb25zdCBwbGF5YmFja1F1YWxpdHkgPSB0aGlzLmVsLmdldFZpZGVvUGxheWJhY2tRdWFsaXR5KCk7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRQbGF5YmFja1JhdGUgPSB0aGlzLmVsLmRlZmF1bHRQbGF5YmFja1JhdGU7XG4gICAgICAgIGNvbnN0IHBhdXNlZCA9IHRoaXMuZWwucGF1c2VkO1xuICAgICAgICBjb25zdCBwbGF5ZWQgPSB0aGlzLmVsLnBsYXllZDtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZHVyYXRpb24sXG4gICAgICAgICAgICBwYXVzZWQsXG4gICAgICAgICAgICBwbGF5ZWQsXG4gICAgICAgICAgICBjdXJyZW50VGltZSxcbiAgICAgICAgICAgIHZvbHVtZSxcbiAgICAgICAgICAgIGlzQ29ubmVjdGVkLFxuICAgICAgICAgICAgcGxheWJhY2tRdWFsaXR5LFxuICAgICAgICAgICAgZGVmYXVsdFBsYXliYWNrUmF0ZSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBzZXREdG8oZHRvOiBEVmlkZW9EdG8pIHtcbiAgICAgICAgdGhpcy5kdG8gPSBkdG87XG4gICAgICAgIHRoaXMuZWwudm9sdW1lID0gMTtcbiAgICAgICAgdGhpcy5zZXRTdHlsZShkdG8uc3R5bGUpO1xuICAgICAgICB0aGlzLmVsLnNyYyA9IGR0by51cmw7XG4gICAgICAgIHRoaXMuZWwubG9hZCgpO1xuICAgIH1cblxuICAgIGdldEN1cnJlbnREdG8oKTogRFZpZGVvRHRvIHwgZmFsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5kdG8gPz8gZmFsc2U7XG4gICAgfVxuXG4gICAgc2V0U3R5bGUoc3R5bGVzOiBQYXJ0aWFsPERTdHlsZT4pIHtcbiAgICAgICAgRFN0eWxlLmFwcGx5U3R5bGVzKHRoaXMuZWwsIHN0eWxlcywgdGhpcy5zY2FsZS5zY2FsZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXQgaWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmR0bz8uaWQgPz8gXCJEVmlkZW9cIjtcbiAgICB9XG5cbiAgICBkZXN0cm95KCkge31cbn1cbiIsICJpbXBvcnQgeyBDYW5QbGF5VG9FbmQgfSBmcm9tIFwiLi9WaWRlb0NvbnRhaW5lclwiO1xuaW1wb3J0IHsgREF1ZGlvRHRvIH0gZnJvbSBcIi4uL2R0by9ERWxlbWVudC5kdG9cIjtcbmltcG9ydCB7IERFdmVudERpc3BhdGNoZXIgfSBmcm9tIFwiLi4vZXZlbnRzL2V2ZW50LWJ1c1wiO1xuaW1wb3J0IHsgRFRpbWVzdGFtcCB9IGZyb20gXCIuLi9jb21tb24vRFRpbWVzdGFtcFwiO1xuXG5leHBvcnQgY2xhc3MgQXVkaW9Db250YWluZXIgaW1wbGVtZW50cyBDYW5QbGF5VG9FbmQge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgVEFHID0gXCJbIERBdWRpbyBdOiBcIjtcbiAgICBwcm90ZWN0ZWQgZHRvOiBEQXVkaW9EdG8gfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIGVsOiBIVE1MQXVkaW9FbGVtZW50O1xuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgZXZlbnRCdXM6IERFdmVudERpc3BhdGNoZXIpIHtcbiAgICAgICAgdGhpcy5lbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhdWRpb1wiKTtcbiAgICAgICAgdGhpcy5lbC5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcbiAgICAgICAgdGhpcy5lbC5zdHlsZS52aXNpYmlsaXR5ID0gXCJoaWRkZW5cIjtcbiAgICAgICAgLy8gdGhpcy5lbC5vblxuICAgICAgICB0aGlzLm9uTG9hZCA9IHRoaXMub25Mb2FkLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuZWwub25sb2FkID0gdGhpcy5vbkxvYWQ7XG4gICAgICAgIHRoaXMub25Mb2FkZWRNZXRhZGF0YSA9IHRoaXMub25Mb2FkZWRNZXRhZGF0YS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmVsLm9ubG9hZGVkbWV0YWRhdGEgPSB0aGlzLm9uTG9hZGVkTWV0YWRhdGE7XG4gICAgICAgIHRoaXMuZWwub25wbGF5ID0gKCkgPT4ge1xuICAgICAgICAgICAgLy8gVE9ET1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLm9uQ2FuUGxheVRocm91Z2ggPSB0aGlzLm9uQ2FuUGxheVRocm91Z2guYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5lbC5vbmNhbnBsYXl0aHJvdWdoID0gdGhpcy5vbkNhblBsYXlUaHJvdWdoO1xuICAgICAgICB0aGlzLmVsLm9uZW5kZWQgPSAoXykgPT4ge1xuICAgICAgICAgICAgY29uc3QgdXJsID0gdGhpcy5lbC5zcmM7XG4gICAgICAgICAgICB0aGlzLmV2ZW50QnVzLmVtaXQoe1xuICAgICAgICAgICAgICAgIGtpbmQ6IFwiQVVESU9fRU5ERURfRVZFTlRcIixcbiAgICAgICAgICAgICAgICBkYXRhOiB7IHVybCB9LFxuICAgICAgICAgICAgICAgIHByb2R1Y2VyOiBcIkRBdWRpb1wiLFxuICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogRFRpbWVzdGFtcC5ub3coKSxcbiAgICAgICAgICAgICAgICBwcm9kdWNlcklkOiB0aGlzLmlkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZWwub25kdXJhdGlvbmNoYW5nZSA9IChfOiBFdmVudCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZHVyYXRpb24gPSB0aGlzLmVsLmR1cmF0aW9uO1xuICAgICAgICAgICAgY29uc3QgaXNJbmZpbml0eSA9IGR1cmF0aW9uID09PSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gICAgICAgICAgICB0aGlzLmV2ZW50QnVzLmVtaXQoe1xuICAgICAgICAgICAgICAgIGtpbmQ6IFwiQVVESU9fRFVSQVRJT05fQ0hBTkdFX0VWRU5UXCIsXG4gICAgICAgICAgICAgICAgdGltZXN0YW1wOiBEVGltZXN0YW1wLm5vdygpLFxuICAgICAgICAgICAgICAgIHByb2R1Y2VyOiBcIkRBdWRpb1wiLFxuICAgICAgICAgICAgICAgIHByb2R1Y2VySWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICAgICAgZGF0YTogeyBkdXJhdGlvbjogdGhpcy5lbC5kdXJhdGlvbiwgaXNJbmZpbml0eSB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgc2V0QXVkaW8oZHRvOiBEQXVkaW9EdG8pIHtcbiAgICAgICAgdGhpcy5kdG8gPSBkdG87XG4gICAgICAgIHRoaXMuZWwuc3JjID0gZHRvLnVybDtcbiAgICAgICAgdGhpcy5lbC5sb2FkKCk7XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuZWwucGF1c2UoKTtcbiAgICAgICAgICAgIHRoaXMuZWwuc3JjID0gXCJcIjtcbiAgICAgICAgICAgIHRoaXMuZWwubG9hZCgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHBhdXNlKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5lbC5wYXVzZSgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBUT0RPIEVNSVQgRVJST1IgRVZFTlQuXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHBsYXkodXJsOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKHRoaXMuZWwuc3JjICE9PSB1cmwpIHtcbiAgICAgICAgICAgIHRoaXMuZWwuc3JjID0gdXJsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZXZlbnRCdXMuZW1pdCh7XG4gICAgICAgICAgICBraW5kOiBcIkFVRElPX1BMQVlfRVZFTlRcIixcbiAgICAgICAgICAgIHByb2R1Y2VySWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICBkYXRhOiB7fSxcbiAgICAgICAgICAgIHByb2R1Y2VyOiBcIkRBdWRpb1wiLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBEVGltZXN0YW1wLm5vdygpLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5lbFxuICAgICAgICAgICAgLnBsYXkoKVxuICAgICAgICAgICAgLnRoZW4oKHJlcykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHJlcyk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZSk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBvbkxvYWRlZE1ldGFkYXRhKF86IEV2ZW50KSB7XG4gICAgICAgIHRoaXMuZXZlbnRCdXMuZW1pdCh7XG4gICAgICAgICAgICBraW5kOiBcIkFVRElPX01FVEFEQVRBX0xPQURFRF9FVkVOVFwiLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBEVGltZXN0YW1wLm5vdygpLFxuICAgICAgICAgICAgcHJvZHVjZXI6IFwiREF1ZGlvXCIsXG4gICAgICAgICAgICBwcm9kdWNlcklkOiB0aGlzLmlkLFxuICAgICAgICAgICAgZGF0YToge30sXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG9uTG9hZChfOiBFdmVudCkge1xuICAgICAgICB0aGlzLmV2ZW50QnVzLmVtaXQoe1xuICAgICAgICAgICAga2luZDogXCJBVURJT19MT0FEX0VWRU5UXCIsXG4gICAgICAgICAgICB0aW1lc3RhbXA6IERUaW1lc3RhbXAubm93KCksXG4gICAgICAgICAgICBwcm9kdWNlcjogXCJEQXVkaW9cIixcbiAgICAgICAgICAgIHByb2R1Y2VySWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICBkYXRhOiB7fSxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuVEFHICsgZXZlbnQudHlwZSk7XG4gICAgfVxuXG4gICAgZ2V0IGlkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kdG8/LmlkID8/IFwiREF1ZGlvXCI7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbkNhblBsYXlUaHJvdWdoKF86IEV2ZW50KSB7XG4gICAgICAgIHRoaXMuZXZlbnRCdXMuZW1pdCh7XG4gICAgICAgICAgICBraW5kOiBcIkFVRElPX0NBTl9QTEFZX1RIUk9VR0hfRVZFTlRcIixcbiAgICAgICAgICAgIGRhdGE6IHt9LFxuICAgICAgICAgICAgcHJvZHVjZXI6IFwiREF1ZGlvXCIsXG4gICAgICAgICAgICB0aW1lc3RhbXA6IERUaW1lc3RhbXAubm93KCksXG4gICAgICAgICAgICBwcm9kdWNlcklkOiB0aGlzLmlkLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBwcml2YXRlIG9uUGxheShfOiBFdmVudCkge31cblxuICAgIGFzeW5jIHBsYXlUb0VuZCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgY29uc3QgZW5kZWRPckVycm9yZWQgPSBuZXcgUHJvbWlzZTxib29sZWFuPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5lbC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgICAgICAgIFwiZW5kZWRcIixcbiAgICAgICAgICAgICAgICAoXykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhlKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHsgb25jZTogdHJ1ZSB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5lbC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgICAgICAgIFwiZXJyb3JcIixcbiAgICAgICAgICAgICAgICAoXykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhlKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7IG9uY2U6IHRydWUgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnBsYXkodGhpcy5lbC5zcmMpO1xuICAgICAgICAgICAgYXdhaXQgZW5kZWRPckVycm9yZWQ7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gVE9ETyBMRVQgUEFSRU5UIERFQUwgV0lUSCBFUlJPUlM/IFRIRSBNQU5BR0VSPz8gTUFOQUdFUlMgQ0FMTCBBQk9SVC5cbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGUpO1xuICAgICAgICAgICAgdGhpcy5ldmVudEJ1cy5lbWl0KHtcbiAgICAgICAgICAgICAgICBraW5kOiBcIkFVRElPX0VSUk9SX0VWRU5UXCIsXG4gICAgICAgICAgICAgICAgdGltZXN0YW1wOiBEVGltZXN0YW1wLm5vdygpLFxuICAgICAgICAgICAgICAgIHByb2R1Y2VyOiBcIkRBdWRpb1wiLFxuICAgICAgICAgICAgICAgIHByb2R1Y2VySWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICAgICAgZGF0YTogeyBlcnJvcjogZSB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgUGFnZUR0byB9IGZyb20gXCIuLi9kdG8vU2NoZW1hRHRvXCI7XG5pbXBvcnQgeyBWaWRlb0NvbnRhaW5lciB9IGZyb20gXCIuLi9EZWxlbWVudC9WaWRlb0NvbnRhaW5lclwiO1xuaW1wb3J0IHsgQXVkaW9Db250YWluZXIgfSBmcm9tIFwiLi4vRGVsZW1lbnQvQXVkaW9Db250YWluZXJcIjtcbmltcG9ydCB7IEF1dG9QbGF5RWxlbWVudCwgREF1dG9QbGF5U2VxdWVuY2UgfSBmcm9tIFwiLi4vRGVsZW1lbnQvREF1dG8tcGxheVwiO1xuaW1wb3J0IHsgRENvbW1hbmRCdXMgfSBmcm9tIFwiLi4vY29tbWFuZHMvRENvbW1hbmRCdXNcIjtcbmltcG9ydCB7IERDb21tYW5kIH0gZnJvbSBcIi4uL2NvbW1hbmRzL0RDb21tYW5kXCI7XG5pbXBvcnQgeyBEVGltZXN0YW1wIH0gZnJvbSBcIi4uL2NvbW1vbi9EVGltZXN0YW1wXCI7XG5pbXBvcnQgeyBFdmVudEJ1cyB9IGZyb20gXCIuLi9ldmVudHMvZXZlbnQtYnVzXCI7XG5pbXBvcnQgeyBTY2FsZVNlcnZpY2UgfSBmcm9tIFwiLi4vZW5naW5lL3NjYWxlXCI7XG5pbXBvcnQgeyBSZXNvdXJjZVByb3ZpZGVyIH0gZnJvbSBcIi4vcmVzb3VyY2UtcHJvdmlkZXJcIjtcbmltcG9ydCB7IEF1dG9wbGF5VGFzaywgU2VxdWVuY2VNYW5hZ2VyIH0gZnJvbSBcIi4vc2VxdWVuY2UtbWFuYWdlclwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIElNZWRpYU1hbmFnZXIge1xuICBzZXRQYWdlKHBhZ2U6IFBhZ2VEdG8pOiB2b2lkO1xuICBkZXN0cm95KCk6IHZvaWQ7XG59XG5cbmV4cG9ydCBjbGFzcyBETWVkaWFNYW5hZ2VyIGltcGxlbWVudHMgSU1lZGlhTWFuYWdlciB7XG4gIHByaXZhdGUgc3RhdGljIElOU1RBTkNFX0NPVU5UID0gMDtcbiAgcHJpdmF0ZSByZWFkb25seSBpbnN0YW5jZU51bWJlcjogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IFRBRyA9IFwiWyBNRURJQV9NQU5BR0VSIF0gOiBcIjtcbiAgcHJpdmF0ZSByZWFkb25seSB2aWRlb0NvbnRhaW5lcjogVmlkZW9Db250YWluZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXVkaW9Db250YWluZXI6IEF1ZGlvQ29udGFpbmVyO1xuICBwcml2YXRlIHBhZ2VFbnRlcjogRFRpbWVzdGFtcDtcbiAgcHJpdmF0ZSBzaW5jZVBhZ2VFbnRlcjogRFRpbWVzdGFtcC5EaWZmO1xuICBwcml2YXRlIGN1cnJlbnRQYWdlOiBQYWdlRHRvIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgdW5zdWJzY3JpYmVDb21tYW5kczogKCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSByZWFkb25seSB0aWNrZXJSZWY6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBzZXF1ZW5jZU1hbmFnZXI6IFNlcXVlbmNlTWFuYWdlciB8IGZhbHNlID0gZmFsc2U7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgaG9zdEVsOiBIVE1MRGl2RWxlbWVudCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbW1hbmRCdXM6IERDb21tYW5kQnVzLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZXZlbnRCdXM6IEV2ZW50QnVzLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVzb3VyY2VQcm92aWRlcjogUmVzb3VyY2VQcm92aWRlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNjYWxlOiBTY2FsZVNlcnZpY2UsXG4gICkge1xuICAgIERNZWRpYU1hbmFnZXIuSU5TVEFOQ0VfQ09VTlQgPSBETWVkaWFNYW5hZ2VyLklOU1RBTkNFX0NPVU5UICsgMTtcbiAgICB0aGlzLmluc3RhbmNlTnVtYmVyID0gRE1lZGlhTWFuYWdlci5JTlNUQU5DRV9DT1VOVDtcbiAgICBjb25zdCB2aWRlb0VsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInZpZGVvXCIpO1xuICAgIHRoaXMuaG9zdEVsLmFwcGVuZCh2aWRlb0VsKTtcbiAgICB0aGlzLnZpZGVvQ29udGFpbmVyID0gbmV3IFZpZGVvQ29udGFpbmVyKHZpZGVvRWwsIGV2ZW50QnVzLCB0aGlzLnNjYWxlKTtcbiAgICB0aGlzLmF1ZGlvQ29udGFpbmVyID0gbmV3IEF1ZGlvQ29udGFpbmVyKHRoaXMuZXZlbnRCdXMpO1xuICAgIHRoaXMudGljayA9IHRoaXMudGljay5iaW5kKHRoaXMpO1xuICAgIHRoaXMudmlkZW9Db250YWluZXIuc2V0U3R5bGUoeyB2aXNpYmlsaXR5OiBcImhpZGRlblwiIH0pO1xuICAgIGNvbnN0IG5vdyA9IERUaW1lc3RhbXAubm93KCk7XG4gICAgdGhpcy5wYWdlRW50ZXIgPSBub3c7XG4gICAgdGhpcy5zaW5jZVBhZ2VFbnRlciA9IERUaW1lc3RhbXAuZGlmZihub3csIG5vdyk7XG4gICAgdGhpcy51bnN1YnNjcmliZUNvbW1hbmRzID0gdGhpcy5jb21tYW5kQnVzLnN1YnNjcmliZSgoYWN0aW9uKSA9PiB7XG4gICAgICB0aGlzLmNvbW1hbmRIYW5kbGVyKGFjdGlvbik7XG4gICAgfSwgdGhpcy5UQUcpO1xuXG4gICAgdGhpcy50aWNrZXJSZWYgPSB3aW5kb3cuc2V0SW50ZXJ2YWwoKCkgPT4ge30sIDEwMDApO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3AgYWxsIG1lZGlhIHRoYXQgaXMgcGxheWluZ1xuICAgKi9cbiAgY2xlYXJBbGxNZWRpYSgpIHtcbiAgICB0aGlzLnZpZGVvQ29udGFpbmVyLnBhdXNlKCk7XG4gICAgdGhpcy5hdWRpb0NvbnRhaW5lci5wYXVzZSgpO1xuICB9XG4gIGRlc3Ryb3koKSB7XG4gICAgY29uc29sZS5sb2coXCJUT0RPIERFU1RST1kgQUxMIE1FRElBXCIpO1xuICAgIHRoaXMudW5zdWJzY3JpYmVDb21tYW5kcygpO1xuICAgIC8vIGNvbnNvbGUubG9nKHRoaXMudGlja2VyUmVmKTtcbiAgICB3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLnRpY2tlclJlZik7XG4gICAgdGhpcy5hdWRpb0NvbnRhaW5lci5kZXN0cm95KCk7XG4gICAgdGhpcy52aWRlb0NvbnRhaW5lci5kZXN0cm95KCk7XG4gIH1cblxuICBzZXRQYWdlKHBhZ2U6IFBhZ2VEdG8pIHtcbiAgICAvLyBUT0RPIFNUT1AgVklERU8vQVVESU8gVEhBVCBNSUdIVCBCRSBQTEFZSU5HIElOIFRIRSBET00/P1xuICAgIHRoaXMuY3VycmVudFBhZ2UgPSBwYWdlO1xuICAgIHRoaXMudmlkZW9Db250YWluZXIucGF1c2UoKTtcbiAgICB0aGlzLnBhZ2VFbnRlciA9IERUaW1lc3RhbXAubm93KCk7XG4gICAgLy8gVE9ETyBUSGlzIG1pZ2h0IGJlIGEgYnVnIGlmIHNvbWVvbmVcblxuICAgIGNvbnN0IHNlcSA9IHBhZ2UuYXV0b1BsYXlTZXF1ZW5jZTtcbiAgICAvLyB0aGlzLnNlcXVlbmNlID0gc2VxID8gWy4uLnNlcS5pdGVtc10gOiBbXTtcbiAgICBjb25zdCB7IG1haW5WaWRlb0lkLCBhdWRpbyB9ID0gcGFnZTtcbiAgICBjb25zdCBhdWRpb0VsZW1lbnRzID0gcGFnZS5hdWRpbztcblxuICAgIGlmIChtYWluVmlkZW9JZCkge1xuICAgICAgY29uc3QgZHRvID0gdGhpcy5yZXNvdXJjZVByb3ZpZGVyLmdldFZpZGVvQnlJZChtYWluVmlkZW9JZCk7XG4gICAgICBpZiAoZHRvKSB7XG4gICAgICAgIHRoaXMudmlkZW9Db250YWluZXIuc2V0RHRvKGR0byk7XG4gICAgICAgIHRoaXMudmlkZW9Db250YWluZXIuc2V0U3R5bGUoeyAuLi5kdG8uc3R5bGUsIHZpc2liaWxpdHk6IFwidmlzaWJsZVwiIH0pO1xuICAgICAgfVxuICAgICAgLy8gdGhpcy52aWRlb0NvbnRhaW5lci5wbGF5VG9FbmQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy52aWRlb0NvbnRhaW5lci5zZXRTdHlsZSh7IHZpc2liaWxpdHk6IFwiaGlkZGVuXCIgfSk7XG4gICAgICAvLyBISURFP1xuICAgIH1cbiAgICBpZiAoYXVkaW9FbGVtZW50cykge1xuICAgICAgY29uc3QgZmlyc3QgPSBhdWRpb0VsZW1lbnRzWzBdO1xuICAgICAgaWYgKGZpcnN0KSB7XG4gICAgICAgIHRoaXMuYXVkaW9Db250YWluZXIuc2V0QXVkaW8oZmlyc3QpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc2VxKSB7XG4gICAgICB0aGlzLnBsYXlTZXF1ZW5jZShzZXEpO1xuICAgIH1cbiAgICAvLyBjb25zdCBoYXNWaWRlbyA9XG4gIH1cblxuICBwcml2YXRlIGNvbW1hbmRIYW5kbGVyKGNvbW1hbmQ6IERDb21tYW5kKSB7XG4gICAgaWYgKGNvbW1hbmQua2luZCA9PT0gXCJWSURFT19QTEFZX0NPTU1BTkRcIikge1xuICAgICAgY29uc3QgdmlkZW8gPSBjb21tYW5kLnRhcmdldElkO1xuICAgICAgY29uc3QgZHRvID0gdGhpcy52aWRlb0NvbnRhaW5lci5nZXRDdXJyZW50RHRvKCk7XG5cbiAgICAgIGlmIChkdG8gJiYgZHRvLmlkID09PSBjb21tYW5kLnRhcmdldElkKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKHZpZGVvKTtcbiAgICAgICAgdGhpcy52aWRlb0NvbnRhaW5lci5wbGF5KGR0by51cmwpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY29tbWFuZC5raW5kID09PSBcIlZJREVPX1BBVVNFX0NPTU1BTkRcIikge1xuICAgICAgdGhpcy52aWRlb0NvbnRhaW5lci5wYXVzZSgpO1xuICAgIH1cbiAgICBpZiAoY29tbWFuZC5raW5kID09PSBcIkFVRElPX1BMQVlfQ09NTUFORFwiKSB7XG4gICAgICB0aGlzLmF1ZGlvQ29udGFpbmVyXG4gICAgICAgIC5wbGF5VG9FbmQoKVxuICAgICAgICAudGhlbigoKSA9PiB7fSlcbiAgICAgICAgLmNhdGNoKClcbiAgICAgICAgLmZpbmFsbHkoKCkgPT4ge30pO1xuICAgIH1cblxuICAgIGlmIChjb21tYW5kLmtpbmQgPT09IFwiQVVESU9fUEFVU0VfQ09NTUFORFwiKSB7XG4gICAgICAvLyB0aGlzLmF1ZGlvQ29udGFpbmVyLlxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcGxheVNlcXVlbmNlKHNlcTogREF1dG9QbGF5U2VxdWVuY2UpIHtcbiAgICAvLyBjb25zb2xlLmxvZyh0aGlzLlRBRyArIFwiU0VRVUVOQ0UgU1RBUlRFRCAtLSBUT0RPIEVWRU5UIEZPUiBUSElTPz9cIik7XG5cbiAgICBjb25zdCBlbGVtZW50cyA9IHNlcS5pdGVtcztcbiAgICBjb25zdCB0ZXN0Q2xvbmUgPSBbLi4uZWxlbWVudHNdO1xuICAgIGNvbnN0IGZpcnN0ID0gdGVzdENsb25lLnBvcCgpO1xuXG4gICAgaWYgKCFmaXJzdCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBub3cgPSBEVGltZXN0YW1wLm5vdygpO1xuICAgIHNlcS5zdGFydENvbW1hbmRzLmZvckVhY2goKGMpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKGMpO1xuICAgICAgdGhpcy5jb21tYW5kQnVzLmVtaXQoYyk7XG4gICAgfSk7XG4gICAgLy8gdGhpcy5jb21tYW5kQnVzLmVtaXQoRFN0YXRlUHJvcHMubWVkaWFCbG9ja2VkQnlTZXF1ZW5jZS5zZXRUcnVlQ29tbWFuZCk7XG4gICAgLy8gaWYgKHNlcS5ibG9ja1VzZXJJbnB1dCkge1xuICAgIC8vICAgICB0aGlzLmNvbW1hbmRCdXMuZW1pdChEU3RhdGVQcm9wcy5pbnB1dEJsb2NraW5nQnlTZXF1ZW5jZS5nZXRTZXRUcnVlQ29tbWFuZCgpKTtcbiAgICAvLyB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgaXRlbSA9IGVsZW1lbnRzW2ldO1xuICAgICAgaWYgKGl0ZW0ua2luZCA9PT0gXCJhdXRvcGxheS12aWRlb1wiKSB7XG4gICAgICAgIGNvbnN0IGR0byA9IHRoaXMucmVzb3VyY2VQcm92aWRlci5nZXRWaWRlb0J5SWQoaXRlbS52aWRlb0lkKTtcbiAgICAgICAgaWYgKGR0bykgdGhpcy52aWRlb0NvbnRhaW5lci5zZXREdG8oZHRvKTtcbiAgICAgICAgYXdhaXQgdGhpcy52aWRlb0NvbnRhaW5lci5wbGF5VG9FbmQoKTtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVtLmtpbmQgPT09IFwiYXV0b3BsYXktYXVkaW9cIikge1xuICAgICAgICBjb25zb2xlLmxvZyhpdGVtKTtcbiAgICAgICAgY29uc3QgZHRvID0gdGhpcy5yZXNvdXJjZVByb3ZpZGVyLmdldEF1ZGlvQnlJZChpdGVtLmF1ZGlvSWQpO1xuICAgICAgICBpZiAoZHRvKSB0aGlzLmF1ZGlvQ29udGFpbmVyLnNldEF1ZGlvKGR0byk7XG4gICAgICAgIGF3YWl0IHRoaXMuYXVkaW9Db250YWluZXIucGxheVRvRW5kKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHNlcS5lbmRDb21tYW5kcy5mb3JFYWNoKChjKSA9PiB7XG4gICAgICB0aGlzLmNvbW1hbmRCdXMuZW1pdChjKTtcbiAgICB9KTtcbiAgICAvLyB0aGlzLmFjdGlvblNlcnZpY2UuZW1pdChEU3RhdGVQcm9wcy5tZWRpYUJsb2NrZWRCeVNlcXVlbmNlLnNldEZhbHNlQ29tbWFuZCk7XG4gICAgLy8gdGhpcy5hY3Rpb25TZXJ2aWNlLmVtaXQoRFN0YXRlUHJvcHMuaW5wdXRCbG9ja2luZ0J5U2VxdWVuY2Uuc2V0RmFsc2VDb21tYW5kKTtcbiAgICBjb25zb2xlLmxvZyh0aGlzLlRBRyArIFwiU0VRVUVOQ0UgRU5ERURcIik7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBzZXRQYWdlKClcblxuICBwcml2YXRlIHRpY2soKSB7XG4gICAgLy8gY29uc29sZS5sb2codGhpcy52aWRlbzEuZ2V0U3RhdHMoKSk7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBEQ29tbWFuZCB9IGZyb20gXCIuL0RDb21tYW5kXCI7XG5pbXBvcnQgeyBEVGltZXN0YW1wIH0gZnJvbSBcIi4uL2NvbW1vbi9EVGltZXN0YW1wXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRENvbW1hbmRTdG9yZSB7XG4gIHN1YnNjcmliZShjYWxsYmFjazogKCkgPT4gdm9pZCwgc3Vic2NyaWJlcklkOiBzdHJpbmcpOiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERDb21tYW5kRGlzcGF0Y2hlciB7XG4gIGVtaXQoY29tbWFuZDogRENvbW1hbmQpOiB2b2lkO1xufVxuXG5pbnRlcmZhY2UgQ29tbWFuZFN1YnNjcmliZXJEYXRhIHtcbiAgcmVhZG9ubHkgc3Vic2NyaWJlcklkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGNhbGxiYWNrOiAoY29tbWFuZDogRENvbW1hbmQpID0+IHZvaWQ7XG59XG5leHBvcnQgY2xhc3MgRENvbW1hbmRCdXMgaW1wbGVtZW50cyBEQ29tbWFuZFN0b3JlLCBEQ29tbWFuZERpc3BhdGNoZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IFRBRyA9IFwiWyBDT01NQU5EX0JVUyBdIFwiO1xuICBsb2dDb21tYW5kcyA9IGZhbHNlO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbW1hbmRMb2c6IEFycmF5PERDb21tYW5kICYgeyB0aW1lc3RhbXA6IERUaW1lc3RhbXAgfT4gPSBbXTtcbiAgcmVhZG9ubHkgc3Vic2NyaWJlcnMgPSBuZXcgU2V0PENvbW1hbmRTdWJzY3JpYmVyRGF0YT4oKTtcbiAgLy8gcmVhZG9ubHkgc3ViXG5cbiAgc3Vic2NyaWJlKGNiOiAoY29tbWFuZDogRENvbW1hbmQpID0+IHZvaWQsIHN1YnNjcmliZXJJZDogc3RyaW5nKSB7XG4gICAgY29uc3Qgc3ViOiBDb21tYW5kU3Vic2NyaWJlckRhdGEgPSB7XG4gICAgICBzdWJzY3JpYmVySWQsXG4gICAgICBjYWxsYmFjazogY2IsXG4gICAgfTtcblxuICAgIHRoaXMuc3Vic2NyaWJlcnMuYWRkKHN1Yik7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHRoaXMuc3Vic2NyaWJlcnMuZGVsZXRlKHN1Yik7XG4gICAgfTtcbiAgfVxuXG4gIGVtaXQoY29tbWFuZDogRENvbW1hbmQpIHtcbiAgICBjb25zdCB0aW1lc3RhbXAgPSBEVGltZXN0YW1wLm5vdygpO1xuICAgIHRoaXMuY29tbWFuZExvZy5wdXNoKHsgLi4uY29tbWFuZCwgdGltZXN0YW1wIH0pO1xuICAgIGlmICh0aGlzLmxvZ0NvbW1hbmRzKSB7XG4gICAgICB0aGlzLmxvZ0NvbW1hbmQoY29tbWFuZCk7XG4gICAgfVxuICAgIHRoaXMuc3Vic2NyaWJlcnMuZm9yRWFjaCgoc3Vic2NyaWJlcikgPT4ge1xuICAgICAgc3Vic2NyaWJlci5jYWxsYmFjayhjb21tYW5kKTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldFN0YXRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjb21tYW5kczogWy4uLnRoaXMuY29tbWFuZExvZ10sXG4gICAgICBzdWJzY3JpYmVyczogWy4uLnRoaXMuc3Vic2NyaWJlcnNdLFxuICAgICAgc3Vic2NyaWJlcnNDb3VudDogdGhpcy5zdWJzY3JpYmVycy5zaXplLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGxvZ0NvbW1hbmQoY29tbWFuZDogRENvbW1hbmQpIHtcbiAgICBjb25zb2xlLmdyb3VwQ29sbGFwc2VkKHRoaXMuVEFHICsgXCIgXCIgKyBjb21tYW5kLmtpbmQpO1xuICAgIGNvbnNvbGUubG9nKFwiVGFyZ2V0SUQgOiBcIiArIGNvbW1hbmQudGFyZ2V0SWQpO1xuICAgIGNvbnNvbGUubG9nKGNvbW1hbmQucGF5bG9hZCk7XG4gICAgY29uc29sZS5ncm91cEVuZCgpO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgREV2ZW50IH0gZnJvbSBcIi4vREV2ZW50c1wiO1xuXG5pbnRlcmZhY2UgU3Vic2NyaWJlckRhdGEge1xuICAgIHJlYWRvbmx5IHN1YnNjcmliZXJJZDogc3RyaW5nO1xuICAgIHJlYWRvbmx5IGNiOiAoZXZlbnQ6IERFdmVudCkgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBERXZlbnRTdG9yZSB7XG4gICAgc3Vic2NyaWJlKGNiOiAoZXZlbnQ6IERFdmVudCkgPT4gdm9pZCwgc3Vic2NyaWJlcklkOiBzdHJpbmcpOiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERFdmVudERpc3BhdGNoZXIge1xuICAgIGVtaXQoZXZlbnQ6IERFdmVudCk6IHZvaWQ7XG59XG5leHBvcnQgY2xhc3MgRXZlbnRCdXMgaW1wbGVtZW50cyBERXZlbnRTdG9yZSwgREV2ZW50RGlzcGF0Y2hlciB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBUQUcgPSBcIlsgIEVWRU5UX0JVUyAgXSA6XCI7XG4gICAgLy8gcHJpdmF0ZSByZWFkb25seSBzdWJzY3JpYmVycyA9IG5ldyBTZXQ8KGV2ZW50OiBERXZlbnQpID0+IHZvaWQ+KCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBzdWJzY3JpYmVycyA9IG5ldyBTZXQ8U3Vic2NyaWJlckRhdGE+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0IG9uIG1vZHVsZSBlbmQuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGV2ZW50TG9nOiBERXZlbnRbXSA9IFtdO1xuICAgIGNvbnNvbGVMb2dFdmVudHMgPSBmYWxzZTtcbiAgICAvLyByZWFkb25seSBzdWJcblxuICAgIHN1YnNjcmliZShjYjogKGV2ZW50OiBERXZlbnQpID0+IHZvaWQsIHN1YnNjcmliZXJJZDogc3RyaW5nKSB7XG4gICAgICAgIC8vIHRoaXMuc3Vic2NyaWJlcnMuYWRkKGNiKTtcbiAgICAgICAgY29uc3Qgc3Vic2NyaWJlckRhdGE6IFN1YnNjcmliZXJEYXRhID0ge1xuICAgICAgICAgICAgc3Vic2NyaWJlcklkLFxuICAgICAgICAgICAgY2IsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuc3Vic2NyaWJlcnMuYWRkKHN1YnNjcmliZXJEYXRhKTtcbiAgICAgICAgaWYgKHRoaXMuY29uc29sZUxvZ0V2ZW50cykge1xuICAgICAgICAgICAgY29uc29sZS5sb2codGhpcy5UQUcgKyBcInN1YnNjcmlwdGlvbiBhZGRlZDogXCIgKyBzdWJzY3JpYmVySWQpO1xuICAgICAgICAgICAgY29uc29sZS5sb2codGhpcy5UQUcgKyBcInN1YnNjcmlwdGlvbiBjb3VudDogXCIgKyB0aGlzLnN1YnNjcmliZXJzLnNpemUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5jb25zb2xlTG9nRXZlbnRzKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2codGhpcy5UQUcgKyBcInN1YnNjcmlwdGlvbiByZW1vdmVkOiBcIiArIHN1YnNjcmliZXJJZCk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2codGhpcy5UQUcgKyBcInN1YnNjcmlwdGlvbiBjb3VudCAgOiBcIiArIHRoaXMuc3Vic2NyaWJlcnMuc2l6ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyB0aGlzLnN1YnNjcmliZXJzLmRlbGV0ZShjYik7XG4gICAgICAgICAgICB0aGlzLnN1YnNjcmliZXJzLmRlbGV0ZShzdWJzY3JpYmVyRGF0YSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZ2V0U3RhdHMoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdWJzY3JpYmVyc0NvdW50OiB0aGlzLnN1YnNjcmliZXJzLnNpemUsXG4gICAgICAgICAgICBldmVudExvZzogWy4uLnRoaXMuZXZlbnRMb2ddLFxuICAgICAgICAgICAgc3Vic2NyaWJlcnM6IFsuLi50aGlzLnN1YnNjcmliZXJzXSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBlbWl0KGV2ZW50OiBERXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuY29uc29sZUxvZ0V2ZW50cykge1xuICAgICAgICAgICAgdGhpcy5sb2dFdmVudChldmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ldmVudExvZy5wdXNoKGV2ZW50KTtcbiAgICAgICAgdGhpcy5zdWJzY3JpYmVycy5mb3JFYWNoKChkYXRhKSA9PiB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnQ0FMTElORyBFTUlUJyk7XG4gICAgICAgICAgICBkYXRhLmNiKGV2ZW50KTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIHRoaXMubG9nRXZlbnRzKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBsb2dFdmVudChldmVudDogREV2ZW50KSB7XG4gICAgICAgIGNvbnNvbGUuZ3JvdXBDb2xsYXBzZWQodGhpcy5UQUcgKyBcIiBcIiArIGV2ZW50LmtpbmQpO1xuICAgICAgICBjb25zb2xlLmxvZyhcIlByb2R1Y2VySWQ6IFwiICsgZXZlbnQucHJvZHVjZXJJZCk7XG4gICAgICAgIGNvbnNvbGUubG9nKGV2ZW50LmRhdGEpO1xuICAgICAgICBjb25zb2xlLmdyb3VwRW5kKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBsb2dFdmVudHMoKSB7XG4gICAgICAgIGNvbnNvbGUuZ3JvdXAodGhpcy5UQUcgKyBcIkxPR0dcIik7XG4gICAgICAgIGNvbnNvbGUudGFibGUodGhpcy5ldmVudExvZyk7XG4gICAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgRmFjdCB9IGZyb20gXCIuLi9ydWxlcy9mYWN0XCI7XG5pbXBvcnQgeyBEVGltZXN0YW1wIH0gZnJvbSBcIi4uL2NvbW1vbi9EVGltZXN0YW1wXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQW5zd2VyZWRRdWVzdGlvbiB7XG4gICAgcmVhZG9ubHkgdGltZXN0YW1wOiBEVGltZXN0YW1wO1xuICAgIHJlYWRvbmx5IGZhY3Q6IEZhY3Q7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgQW5zd2VyZWRRdWVzdGlvbiB7XG4gICAgZXhwb3J0IGNvbnN0IGVxID0gKGE6IEFuc3dlcmVkUXVlc3Rpb24sIGI6IEFuc3dlcmVkUXVlc3Rpb24pOiBib29sZWFuID0+IHtcbiAgICAgICAgcmV0dXJuIGEuZmFjdCA9PT0gYi5mYWN0O1xuICAgIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFnZUhpc3Rvcnkge1xuICAgIHJlYWRvbmx5IHBhZ2VJZDogc3RyaW5nO1xuICAgIHJlYWRvbmx5IGFuc3dlcmVkUXVlc3Rpb25zOiBBbnN3ZXJlZFF1ZXN0aW9uW107XG59XG5cbmV4cG9ydCBjbGFzcyBIaXN0b3J5UXVlIHtcbiAgICBwcml2YXRlIGhpc3Rvcnk6IFBhZ2VIaXN0b3J5W10gPSBbXTtcblxuICAgIGdldEZhY3RzKCk6IEFycmF5PEZhY3Q+IHtcbiAgICAgICAgY29uc3QgYW5zd2VycyA9IHRoaXMuaGlzdG9yeS5tYXAoKGgpID0+IGguYW5zd2VyZWRRdWVzdGlvbnMpLmZsYXQoMSk7XG4gICAgICAgIGNvbnN0IGZhY3RzID0gYW5zd2Vycy5tYXAoKGEpID0+IGEuZmFjdCk7XG4gICAgICAgIC8vIFRPRE8gRklORCBMQVRFU1QgRkFDVCAoYW5zd2VyKSBpZiBoYXZlIG11bHRpcGxlLlxuICAgICAgICByZXR1cm4gZmFjdHM7XG4gICAgfVxuXG4gICAgZ2V0QW5zd2VycygpOiBBcnJheTxBbnN3ZXJlZFF1ZXN0aW9uPiB7XG4gICAgICAgIGNvbnN0IGFuc3dlcnMgPSB0aGlzLmhpc3RvcnkubWFwKChoKSA9PiBoLmFuc3dlcmVkUXVlc3Rpb25zKS5mbGF0KDEpO1xuICAgICAgICByZXR1cm4gYW5zd2VycztcbiAgICB9XG5cbiAgICBhZGRUb0hpc3RvcnkocGFnZTogUGFnZUhpc3RvcnkpIHtcbiAgICAgICAgdGhpcy5oaXN0b3J5LnB1c2gocGFnZSk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IEZhY3QgfSBmcm9tIFwiLi9mYWN0XCI7XG5pbXBvcnQgeyBEVXRpbCB9IGZyb20gXCIuLi91dGlscy9EVXRpbFwiO1xuZXhwb3J0IHR5cGUgQ29uZGl0aW9uID0gQ29uZGl0aW9uLlN0cmluZyB8IENvbmRpdGlvbi5OdW1lcmljIHwgQ29uZGl0aW9uLkNvbXBsZXg7XG5cbmV4cG9ydCBuYW1lc3BhY2UgQ29uZGl0aW9uIHtcbiAgICBleHBvcnQgdHlwZSBTdHJpbmdPcGVyYXRvciA9IFwiZXFcIiB8IFwibm90LWVxXCIgfCBcImxvbmdlci10aGVuXCIgfCBcInNob3J0ZXItdGhlblwiO1xuXG4gICAgZXhwb3J0IHR5cGUgTnVtZXJpY09wZXJhdG9yID1cbiAgICAgICAgfCBcImVxXCJcbiAgICAgICAgfCBcIm5vdC1lcVwiXG4gICAgICAgIHwgXCJncmVhdGVyLXRoZW5cIlxuICAgICAgICB8IFwibGVzcy10aGVuXCJcbiAgICAgICAgfCBcImdyZWF0ZXItdGhlbi1pbmNsdXNpdmVcIlxuICAgICAgICB8IFwibGVzcy10aGVuLWluY2x1c2l2ZVwiO1xuXG4gICAgZXhwb3J0IGludGVyZmFjZSBOdW1lcmljIHtcbiAgICAgICAgcmVhZG9ubHkgcmVmZXJlbmNlSWQ6IHN0cmluZztcbiAgICAgICAgcmVhZG9ubHkgcmVmZXJlbmNlTGFiZWw6IHN0cmluZztcbiAgICAgICAgcmVhZG9ubHkgdmFsdWVMYWJlbDogc3RyaW5nO1xuICAgICAgICByZWFkb25seSBraW5kOiBcIm51bWVyaWMtY29uZGl0aW9uXCI7XG4gICAgICAgIHJlYWRvbmx5IG9wZXJhdG9yOiBOdW1lcmljT3BlcmF0b3I7XG4gICAgICAgIHJlYWRvbmx5IHZhbHVlOiBudW1iZXI7XG4gICAgfVxuICAgIGV4cG9ydCBpbnRlcmZhY2UgU3RyaW5nIHtcbiAgICAgICAgcmVhZG9ubHkgcmVmZXJlbmNlSWQ6IHN0cmluZztcbiAgICAgICAgcmVhZG9ubHkgcmVmZXJlbmNlTGFiZWw6IHN0cmluZztcbiAgICAgICAgcmVhZG9ubHkgdmFsdWVMYWJlbDogc3RyaW5nO1xuICAgICAgICByZWFkb25seSBraW5kOiBcInN0cmluZy1jb25kaXRpb25cIjtcbiAgICAgICAgcmVhZG9ubHkgb3BlcmF0b3I6IFN0cmluZ09wZXJhdG9yO1xuICAgICAgICByZWFkb25seSB2YWx1ZTogc3RyaW5nO1xuICAgIH1cblxuICAgIGV4cG9ydCBpbnRlcmZhY2UgQ29tcGxleCB7XG4gICAgICAgIHJlYWRvbmx5IGtpbmQ6IFwiY29tcGxleC1jb25kaXRpb25cIjtcbiAgICAgICAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICAgICAgICByZWFkb25seSBhbGw6IFJlYWRvbmx5QXJyYXk8Q29uZGl0aW9uLlNpbXBsZT47XG4gICAgICAgIHJlYWRvbmx5IHNvbWU6IFJlYWRvbmx5QXJyYXk8Q29uZGl0aW9uLlNpbXBsZT47XG4gICAgfVxuXG4gICAgZXhwb3J0IHR5cGUgU2ltcGxlID0gQ29uZGl0aW9uLlN0cmluZyB8IENvbmRpdGlvbi5OdW1lcmljO1xuXG4gICAgLyoqXG4gICAgICogQW4gZW1wdHkgY29uZGl0aW9uIHdpbGwgZXZhbHVhdGUgdG8gZmFsc2UsXG4gICAgICogQHBhcmFtIGNvbmRpdGlvbjogQ29uZGl0aW9uLkFueVxuICAgICAqIEBwYXJhbSBmYWN0c1xuICAgICAqL1xuICAgIGV4cG9ydCBjb25zdCBldmFsdWF0ZSA9IChjb25kaXRpb246IENvbmRpdGlvbiwgZmFjdHM6IFJlYWRvbmx5QXJyYXk8RmFjdD4pID0+IHtcbiAgICAgICAgbGV0IHJlc3VsdDogYm9vbGVhbiA9IGZhbHNlO1xuICAgICAgICBzd2l0Y2ggKGNvbmRpdGlvbi5raW5kKSB7XG4gICAgICAgICAgICBjYXNlIFwic3RyaW5nLWNvbmRpdGlvblwiOlxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGV2YWx1YXRlU2ltcGxlKGNvbmRpdGlvbiwgZmFjdHMpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIm51bWVyaWMtY29uZGl0aW9uXCI6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gZXZhbHVhdGVTaW1wbGUoY29uZGl0aW9uLCBmYWN0cyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiY29tcGxleC1jb25kaXRpb25cIjpcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBldmFsdWF0ZUNvbXBsZXgoY29uZGl0aW9uLCBmYWN0cyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGNvbnN0IGNoZWNrOiBuZXZlciA9IGNvbmRpdGlvbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICBjb25zdCBldmFsdWF0ZUNvbXBsZXggPSAoY29uZGl0aW9uOiBDb25kaXRpb24uQ29tcGxleCwgZmFjdHM6IFJlYWRvbmx5QXJyYXk8RmFjdD4pOiBib29sZWFuID0+IHtcbiAgICAgICAgaWYgKGNvbmRpdGlvbi5zb21lLmxlbmd0aCA9PT0gMCAmJiBjb25kaXRpb24uYWxsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFsbFNvbHZlZCA9IGNvbmRpdGlvbi5hbGwubWFwKChjb25kaXRpb24pID0+IHtcbiAgICAgICAgICAgIHJldHVybiBldmFsdWF0ZVNpbXBsZShjb25kaXRpb24sIGZhY3RzKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3Qgc29tZUV2YWx1YXRlZCA9IGNvbmRpdGlvbi5zb21lLm1hcCgoY29uZGl0aW9uKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZXZhbHVhdGVTaW1wbGUoY29uZGl0aW9uLCBmYWN0cyk7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBhbGxSZXN1bHQgPSBhbGxTb2x2ZWQuZXZlcnkoRFV0aWwuaXNUcnVlKTtcbiAgICAgICAgY29uc3Qgc29tZVJlc3VsdCA9IHNvbWVFdmFsdWF0ZWQubGVuZ3RoID09PSAwIHx8IHNvbWVFdmFsdWF0ZWQuc29tZShEVXRpbC5pc1RydWUpO1xuICAgICAgICByZXR1cm4gc29tZVJlc3VsdCAmJiBhbGxSZXN1bHQ7XG4gICAgfTtcblxuICAgIGNvbnN0IGV2YWx1YXRlU2ltcGxlID0gKGNvbmRpdGlvbjogQ29uZGl0aW9uLlNpbXBsZSwgZmFjdHM6IFJlYWRvbmx5QXJyYXk8RmFjdD4pOiBib29sZWFuID0+IHtcbiAgICAgICAgY29uc3QgZmFjdCA9IGZhY3RzLmZpbmQoKGYpID0+IGYucmVmZXJlbmNlSWQgPT09IGNvbmRpdGlvbi5yZWZlcmVuY2VJZCk7XG4gICAgICAgIGlmICghZmFjdCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZXMgPSBmYWxzZTtcbiAgICAgICAgc3dpdGNoIChjb25kaXRpb24ua2luZCkge1xuICAgICAgICAgICAgY2FzZSBcIm51bWVyaWMtY29uZGl0aW9uXCI6XG4gICAgICAgICAgICAgICAgaWYgKGZhY3Qua2luZCA9PT0gXCJudW1lcmljLWZhY3RcIikge1xuICAgICAgICAgICAgICAgICAgICByZXMgPSBldmFsdWF0ZU51bWVyaWMoY29uZGl0aW9uLCBmYWN0LnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwic3RyaW5nLWNvbmRpdGlvblwiOlxuICAgICAgICAgICAgICAgIGlmIChmYWN0LmtpbmQgPT09IFwic3RyaW5nLWZhY3RcIikge1xuICAgICAgICAgICAgICAgICAgICByZXMgPSBldmFsdWF0ZVN0cmluZyhjb25kaXRpb24sIGZhY3QudmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgY29uc3QgY2hlY2s6IG5ldmVyID0gY29uZGl0aW9uO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfTtcblxuICAgIGV4cG9ydCBjb25zdCBpc0VtcHR5ID0gKGNvbXBsZXg6IENvbXBsZXgpID0+IHtcbiAgICAgICAgcmV0dXJuIGNvbXBsZXguYWxsLmxlbmd0aCA9PT0gMCAmJiBjb21wbGV4LnNvbWUubGVuZ3RoID09PSAwO1xuICAgIH07XG5cbiAgICBjb25zdCBldmFsdWF0ZVN0cmluZyA9IChjb25kaXRpb246IFJlYWRvbmx5PENvbmRpdGlvbi5TdHJpbmc+LCB2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gICAgICAgIGNvbnN0IG9wZXJhdG9yID0gY29uZGl0aW9uLm9wZXJhdG9yO1xuICAgICAgICBsZXQgcmVzdWx0ID0gZmFsc2U7XG4gICAgICAgIHN3aXRjaCAob3BlcmF0b3IpIHtcbiAgICAgICAgICAgIGNhc2UgXCJlcVwiOlxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNvbmRpdGlvbi52YWx1ZSA9PT0gdmFsdWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwibm90LWVxXCI6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gY29uZGl0aW9uLnZhbHVlICE9PSB2YWx1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJzaG9ydGVyLXRoZW5cIjpcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBjb25kaXRpb24udmFsdWUgIT09IHZhbHVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcImxvbmdlci10aGVuXCI6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gY29uZGl0aW9uLnZhbHVlICE9PSB2YWx1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgY29uc3QgY2hlY2s6IG5ldmVyID0gb3BlcmF0b3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgY29uc3QgZXZhbHVhdGVOdW1lcmljID0gKGNvbmRpdGlvbjogTnVtZXJpYywgdmFsdWU6IG51bWJlcik6IGJvb2xlYW4gPT4ge1xuICAgICAgICBjb25zdCBvcCA9IGNvbmRpdGlvbi5vcGVyYXRvcjtcbiAgICAgICAgY29uc3QgY29uZGl0aW9uVmFsdWUgPSBjb25kaXRpb24udmFsdWU7XG4gICAgICAgIGxldCByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgc3dpdGNoIChvcCkge1xuICAgICAgICAgICAgY2FzZSBcImVxXCI6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWUgPT09IGNvbmRpdGlvblZhbHVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIm5vdC1lcVwiOlxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHZhbHVlICE9PSBjb25kaXRpb25WYWx1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJncmVhdGVyLXRoZW5cIjpcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB2YWx1ZSA+IGNvbmRpdGlvblZhbHVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcImdyZWF0ZXItdGhlbi1pbmNsdXNpdmVcIjpcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB2YWx1ZSA+PSBjb25kaXRpb25WYWx1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJsZXNzLXRoZW5cIjpcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB2YWx1ZSA8IGNvbmRpdGlvblZhbHVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcImxlc3MtdGhlbi1pbmNsdXNpdmVcIjpcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB2YWx1ZSA8PSBjb25kaXRpb25WYWx1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgY29uc3QgY2hlY2s6IG5ldmVyID0gb3A7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgY29uc3QgX2dldEFsbFNpbXBsZSA9IChjb25kaXRpb246IENvbmRpdGlvbik6IFJlYWRvbmx5QXJyYXk8Q29uZGl0aW9uLlNpbXBsZT4gPT4ge1xuICAgICAgICBjb25zdCBzaW1wbGU6IEFycmF5PENvbmRpdGlvbi5TaW1wbGU+ID0gW107XG4gICAgICAgIHN3aXRjaCAoY29uZGl0aW9uLmtpbmQpIHtcbiAgICAgICAgICAgIGNhc2UgXCJjb21wbGV4LWNvbmRpdGlvblwiOlxuICAgICAgICAgICAgICAgIHNpbXBsZS5wdXNoKC4uLmNvbmRpdGlvbi5hbGwpO1xuICAgICAgICAgICAgICAgIHNpbXBsZS5wdXNoKC4uLmNvbmRpdGlvbi5zb21lKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJudW1lcmljLWNvbmRpdGlvblwiOlxuICAgICAgICAgICAgICAgIHNpbXBsZS5wdXNoKGNvbmRpdGlvbik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwic3RyaW5nLWNvbmRpdGlvblwiOlxuICAgICAgICAgICAgICAgIHNpbXBsZS5wdXNoKGNvbmRpdGlvbik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIERVdGlsLm5ldmVyQ2hlY2soY29uZGl0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2ltcGxlO1xuICAgIH07XG5cbiAgICBleHBvcnQgY29uc3QgZ2V0QWxsU2ltcGxlQ29uZGl0aW9ucyA9IChcbiAgICAgICAgY29uZGl0aW9uOiBDb25kaXRpb24gfCBBcnJheTxDb25kaXRpb24+XG4gICAgKTogUmVhZG9ubHlBcnJheTxDb25kaXRpb24uU2ltcGxlPiA9PiB7XG4gICAgICAgIGNvbnN0IHNpbXBsZTogQXJyYXk8Q29uZGl0aW9uLlNpbXBsZT4gPSBbXTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29uZGl0aW9uKSkge1xuICAgICAgICAgICAgY29uZGl0aW9uLmZvckVhY2goKGMpID0+IHtcbiAgICAgICAgICAgICAgICBzaW1wbGUucHVzaCguLi5fZ2V0QWxsU2ltcGxlKGMpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2ltcGxlLnB1c2goLi4uX2dldEFsbFNpbXBsZShjb25kaXRpb24pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2ltcGxlO1xuICAgIH07XG59XG4iLCAiaW1wb3J0IHsgQ29uZGl0aW9uIH0gZnJvbSBcIi4vY29uZGl0aW9uXCI7XG5pbXBvcnQgeyBGYWN0IH0gZnJvbSBcIi4vZmFjdFwiO1xuaW1wb3J0IHsgRFV0aWwgfSBmcm9tIFwiLi4vdXRpbHMvRFV0aWxcIjtcblxuZXhwb3J0IGludGVyZmFjZSBSdWxlPE9uU3VjY2Vzc0FjdGlvbiwgT25GYWlsdXJlQWN0aW9uPiB7XG4gIHJlYWRvbmx5IGlkPzogc3RyaW5nO1xuICByZWFkb25seSBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICByZWFkb25seSBhbGw6IFJlYWRvbmx5QXJyYXk8Q29uZGl0aW9uPjtcbiAgcmVhZG9ubHkgc29tZTogUmVhZG9ubHlBcnJheTxDb25kaXRpb24+O1xuICByZWFkb25seSBvblN1Y2Nlc3M6IFJlYWRvbmx5QXJyYXk8T25TdWNjZXNzQWN0aW9uPjtcbiAgcmVhZG9ubHkgb25GYWlsdXJlOiBSZWFkb25seUFycmF5PE9uRmFpbHVyZUFjdGlvbj47XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgUnVsZSB7XG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhhdCB0aGUgcnVsZSBpcyB2YWxpZC5cbiAgICogQHBhcmFtIHJ1bGVcbiAgICovXG5cbiAgZXhwb3J0IGNvbnN0IGlzRW1wdHkgPSAocnVsZTogUnVsZTxhbnksIGFueT4pOiBib29sZWFuID0+IHtcbiAgICBjb25zdCBlbXB0eUNvbmRpdGlvbnMgPSBydWxlLmFsbC5sZW5ndGggPT09IDAgJiYgcnVsZS5zb21lLmxlbmd0aCA9PT0gMDtcbiAgICBjb25zdCBlbXB0eUFjdGlvbnMgPSBydWxlLm9uU3VjY2Vzcy5sZW5ndGggPT09IDAgJiYgcnVsZS5vbkZhaWx1cmUubGVuZ3RoID09PSAwO1xuICAgIHJldHVybiBlbXB0eUNvbmRpdGlvbnMgfHwgZW1wdHlBY3Rpb25zO1xuICB9O1xuXG4gIGV4cG9ydCBjb25zdCBzb2x2ZSA9IChydWxlOiBSdWxlPGFueSwgYW55PiwgZmFjdHM6IFJlYWRvbmx5QXJyYXk8RmFjdD4pOiBib29sZWFuID0+IHtcbiAgICBpZiAocnVsZS5zb21lLmxlbmd0aCA9PT0gMCAmJiBydWxlLmFsbC5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIFRPRE8gUkVUVVJOIFdBUk5JTkc/IE9SIExPR0dJTkcgP1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHNvbWVTb2x2ZWQgPSBydWxlLnNvbWUubWFwKChjb25kaXRpb24pID0+IENvbmRpdGlvbi5ldmFsdWF0ZShjb25kaXRpb24sIGZhY3RzKSk7XG5cbiAgICBjb25zdCBzb21lUmVzdWx0ID0gc29tZVNvbHZlZC5sZW5ndGggPT09IDAgfHwgc29tZVNvbHZlZC5zb21lKERVdGlsLmlzVHJ1ZSk7XG5cbiAgICBjb25zdCBhbGxTb2x2ZWQgPSBydWxlLmFsbC5tYXAoKGNvbmRpdGlvbikgPT4gQ29uZGl0aW9uLmV2YWx1YXRlKGNvbmRpdGlvbiwgZmFjdHMpKS5ldmVyeShEVXRpbC5pc1RydWUpO1xuXG4gICAgcmV0dXJuIGFsbFNvbHZlZCAmJiBzb21lUmVzdWx0O1xuICB9O1xufVxuIiwgImltcG9ydCB7IEZhY3QgfSBmcm9tIFwiLi9mYWN0XCI7XG5pbXBvcnQgeyBSdWxlIH0gZnJvbSBcIi4vcnVsZVwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNvbHZlUmVzdWx0PFMsIEY+IHtcbiAgbWF0Y2hpbmc6IFJlYWRvbmx5QXJyYXk8TWF0Y2g8UywgRj4+O1xuICBlcnJvcnM6IFJlYWRvbmx5QXJyYXk8UnVsZUVuZ2luZUVycm9yPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNYXRjaDxTLCBGPiB7XG4gIHJlYWRvbmx5IG1hdGNoaW5nUnVsZUlkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJ1bGVEZXNjcmlwdGlvbjogc3RyaW5nO1xuICByZWFkb25seSBhY3Rpb25MaXN0OiBSZWFkb25seUFycmF5PFM+IHwgUmVhZG9ubHlBcnJheTxGPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSdWxlRW5naW5lRXJyb3Ige1xuICByZWFkb25seSBraW5kPzogc3RyaW5nO1xuICByZWFkb25seSBtZXNzYWdlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBSdWxlRW5naW5lPFMsIEY+IHtcbiAgY29uc3RydWN0b3IoKSB7fVxuXG4gIHNvbHZlQWxsKHJ1bGVzOiBSdWxlPFMsIEY+W10sIGZhY3RzOiBGYWN0W10pOiBTb2x2ZVJlc3VsdDxTLCBGPiB7XG4gICAgY29uc3QgZXJyb3JzOiBSdWxlRW5naW5lRXJyb3JbXSA9IFtdO1xuICAgIGNvbnN0IG1hdGNoaW5nOiBNYXRjaDxTLCBGPltdID0gW107XG4gICAgcnVsZXMuZm9yRWFjaCgocnVsZSkgPT4ge1xuICAgICAgaWYgKFJ1bGUuaXNFbXB0eShydWxlKSkge1xuICAgICAgICBlcnJvcnMucHVzaCh7IG1lc3NhZ2U6IFwiRW1wdHkgcnVsZTogXCIgKyBydWxlLmlkIH0pO1xuICAgICAgfSBlbHNlIGlmIChSdWxlLnNvbHZlKHJ1bGUsIGZhY3RzKSkge1xuICAgICAgICBjb25zdCBtYXRjaDogTWF0Y2g8UywgRj4gPSB7XG4gICAgICAgICAgcnVsZURlc2NyaXB0aW9uOiBydWxlLmRlc2NyaXB0aW9uLFxuICAgICAgICAgIG1hdGNoaW5nUnVsZUlkOiBydWxlLmlkID8/IFwibm8taWQtZ2l2ZW5cIixcbiAgICAgICAgICBhY3Rpb25MaXN0OiBbLi4ucnVsZS5vblN1Y2Nlc3NdLFxuICAgICAgICB9O1xuICAgICAgICBtYXRjaGluZy5wdXNoKG1hdGNoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4geyBtYXRjaGluZywgZXJyb3JzIH07XG4gIH1cblxuICBzb2x2ZShydWxlOiBSdWxlPFMsIEY+LCBmYWN0czogRmFjdFtdKTogYm9vbGVhbiB7XG4gICAgLy8gVE9ETyBWYWxpZGF0ZSwgYW5kIFJldHVybiByZXN1bHRcbiAgICByZXR1cm4gUnVsZS5zb2x2ZShydWxlLCBmYWN0cyk7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBQYWdlRHRvIH0gZnJvbSBcIi4uL2R0by9TY2hlbWFEdG9cIjtcblxuZXhwb3J0IGNsYXNzIE5leHRRdWUge1xuICAgIHByaXZhdGUgb3JpZ2luYWxPcmRlcjogUmVhZG9ubHlBcnJheTxzdHJpbmc+ID0gW107XG4gICAgcHJpdmF0ZSBhbGxQYWdlczogUGFnZUR0b1tdID0gW107XG4gICAgcHJpdmF0ZSBleGNsdWRlZFRhZ3MgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBwcml2YXRlIGV4Y2x1ZGVkQnlQYWdlSWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBwcml2YXRlIHJlbWFpbmluZzogUGFnZUR0b1tdID0gW107XG4gICAgY29uc3RydWN0b3IocGFnZXM6IFBhZ2VEdG9bXSA9IFtdKSB7XG4gICAgICAgIHRoaXMucmVzZXRRdWUocGFnZXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdpbGwgcmVzZXQgcXVlIHdpdGggdGhlIG5ldyBwYWdlcy5cbiAgICAgKiBAcGFyYW0gcGFnZXNcbiAgICAgKi9cbiAgICByZXNldFF1ZShwYWdlczogUGFnZUR0b1tdKSB7XG4gICAgICAgIHRoaXMuYWxsUGFnZXMgPSBbLi4ucGFnZXNdO1xuICAgICAgICB0aGlzLnJlbWFpbmluZyA9IFsuLi5wYWdlc107XG4gICAgICAgIHRoaXMuZXhjbHVkZWRUYWdzID0gbmV3IFNldCgpO1xuICAgICAgICB0aGlzLmV4Y2x1ZGVkQnlQYWdlSWQgPSBuZXcgU2V0KCk7XG4gICAgICAgIHRoaXMub3JpZ2luYWxPcmRlciA9IHRoaXMuYWxsUGFnZXMubWFwKChwKSA9PiBwLmlkKTtcbiAgICB9XG5cbiAgICBwb3AoKTogUGFnZUR0byB8IGZhbHNlIHtcbiAgICAgICAgY29uc3QgbmV4dCA9IHRoaXMucmVtYWluaW5nLnNoaWZ0KCk7XG4gICAgICAgIC8vIFRPRE8gQ0xPTkU/P1xuICAgICAgICByZXR1cm4gbmV4dCA/PyBmYWxzZTtcbiAgICB9XG5cbiAgICBwZWVrKCk6IFBhZ2VEdG8gfCBmYWxzZSB7XG4gICAgICAgIGNvbnN0IG5leHQgPSB0aGlzLnJlbWFpbmluZ1swXTtcbiAgICAgICAgcmV0dXJuIG5leHQgPz8gZmFsc2U7XG4gICAgfVxuXG4gICAganVtcFRvUGFnZUJ5SWQocGFnZUlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnJlbWFpbmluZy5maW5kSW5kZXgoKHApID0+IHAuaWQgPT09IHBhZ2VJZCk7XG4gICAgICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlbWFpbmluZyA9IHRoaXMucmVtYWluaW5nLnNsaWNlKGluZGV4KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmVtb3ZlQnlUYWcodGFnOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0YWcpKSB7XG4gICAgICAgICAgICB0YWcuZm9yRWFjaCgodGFnKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5leGNsdWRlZFRhZ3MuYWRkKHRhZyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZXhjbHVkZWRUYWdzLmFkZCh0YWcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmlsdGVyUmVtYWluaW5nKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2lsbCBub3QgYmUgaW5jbHVkZWRcbiAgICAgKiBAcGFyYW0gcGFnZXNcbiAgICAgKi9cbiAgICBpbnNlcnRBc05leHRCeUZvcmNlKHBhZ2VzOiBQYWdlRHRvW10pIHtcbiAgICAgICAgdGhpcy5yZW1haW5pbmcudW5zaGlmdCguLi5wYWdlcyk7XG4gICAgfVxuXG4gICAgcmVtb3ZlQnlQYWdlSWQocGFnZUlkOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwYWdlSWQpKSB7XG4gICAgICAgICAgICBwYWdlSWQuZm9yRWFjaCgoaWQpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmV4Y2x1ZGVkQnlQYWdlSWQuYWRkKGlkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5leGNsdWRlZEJ5UGFnZUlkLmFkZChwYWdlSWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmlsdGVyUmVtYWluaW5nKCk7XG4gICAgICAgIC8vIHRoaXMuZXhjbHVkZWRCeVBhZ2VJZC5hZGQocGFnZUlkKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbHRlclJlbWFpbmluZygpIHtcbiAgICAgICAgdGhpcy5yZW1haW5pbmcgPSB0aGlzLnJlbWFpbmluZy5maWx0ZXIoKHApID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRhZ3MgPSBwLnRhZ3MgPz8gW107XG4gICAgICAgICAgICBjb25zdCBpc0luY2x1ZWRlZEJ5VGFnID0gIXRhZ3Muc29tZSgodGFnKSA9PiB0aGlzLmV4Y2x1ZGVkVGFncy5oYXModGFnKSk7XG4gICAgICAgICAgICBjb25zdCBpc0luY2x1ZGVkQnlQYWdlSWQgPSAhdGhpcy5leGNsdWRlZEJ5UGFnZUlkLmhhcyhwLmlkKTtcbiAgICAgICAgICAgIHJldHVybiBpc0luY2x1ZGVkQnlQYWdlSWQgJiYgaXNJbmNsdWVkZWRCeVRhZztcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGdldCBpc0VtcHR5KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5yZW1haW5pbmcubGVuZ3RoID09PSAwO1xuICAgIH1cbiAgICBnZXQgc2l6ZSgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5yZW1haW5pbmcubGVuZ3RoO1xuICAgIH1cbiAgICBnZXQgcGFnZUNvdW50KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsT3JkZXIubGVuZ3RoO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBBbnN3ZXJlZFF1ZXN0aW9uLCBIaXN0b3J5UXVlLCBQYWdlSGlzdG9yeSB9IGZyb20gXCIuL2hpc3RvcnktcXVlXCI7XG5pbXBvcnQgeyBSdWxlRW5naW5lIH0gZnJvbSBcIi4uL3J1bGVzL3J1bGUtZW5naW5lXCI7XG5pbXBvcnQgeyBOZXh0UXVlIH0gZnJvbSBcIi4vbmV4dC1xdWVcIjtcbmltcG9ydCB7IFBhZ2VEdG8sIFNjaGVtYUR0byB9IGZyb20gXCIuLi9kdG8vU2NoZW1hRHRvXCI7XG5pbXBvcnQgeyBOYXZpZ2F0aW9uQ29tbWFuZCwgUGFnZVF1ZUNvbW1hbmQgfSBmcm9tIFwiLi4vY29tbWFuZHMvRENvbW1hbmRcIjtcbmltcG9ydCB7IERVdGlsIH0gZnJvbSBcIi4uL3V0aWxzL0RVdGlsXCI7XG5cbmV4cG9ydCB0eXBlIERQbGF5ZXJEYXRhID0gUGljazxTY2hlbWFEdG8sIFwicGFnZXNcIiB8IFwicGFnZVNlcXVlbmNlc1wiIHwgXCJydWxlc1wiPjtcbmV4cG9ydCBjbGFzcyBEUGxheWVyIHtcbiAgcHJpdmF0ZSBoaXN0b3J5ID0gbmV3IEhpc3RvcnlRdWUoKTtcbiAgcHJpdmF0ZSBydWxlRW5naW5lID0gbmV3IFJ1bGVFbmdpbmU8UGFnZVF1ZUNvbW1hbmQsIFBhZ2VRdWVDb21tYW5kPigpO1xuICBwcml2YXRlIG5leHRRdWUgPSBuZXcgTmV4dFF1ZSgpO1xuICBwcml2YXRlIGRhdGE6IERQbGF5ZXJEYXRhO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IERQbGF5ZXJEYXRhKSB7XG4gICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICB0aGlzLm5leHRRdWUucmVzZXRRdWUoZGF0YS5wYWdlcyk7XG4gIH1cblxuICBzYXZlSGlzdG9yeShwYWdlSGlzdG9yeTogUGFnZUhpc3RvcnkpIHtcbiAgICBjb25zb2xlLmxvZyhcIlNBVkUgSElTVE9SWVwiLCBwYWdlSGlzdG9yeSk7XG4gICAgdGhpcy5oaXN0b3J5LmFkZFRvSGlzdG9yeShwYWdlSGlzdG9yeSk7XG4gICAgY29uc3QgZmFjdHMgPSB0aGlzLmhpc3RvcnkuZ2V0RmFjdHMoKTtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLnJ1bGVFbmdpbmUuc29sdmVBbGwodGhpcy5kYXRhLnJ1bGVzLCBmYWN0cyk7XG4gICAgY29uc3QgbWF0Y2hpbmdSdWxlcyA9IHJlc3VsdC5tYXRjaGluZztcbiAgICBjb25zdCBhY3Rpb25zID0gbWF0Y2hpbmdSdWxlcy5tYXAoKHIpID0+IHIuYWN0aW9uTGlzdCkuZmxhdCgxKTtcbiAgICBhY3Rpb25zLmZvckVhY2goKGEpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKGEucGF5bG9hZCk7XG4gICAgICBzd2l0Y2ggKGEua2luZCkge1xuICAgICAgICBjYXNlIFwiUEFHRV9RVUVfSlVNUF9UT19QQUdFX0NPTU1BTkRcIjpcbiAgICAgICAgICB0aGlzLm5leHRRdWUuanVtcFRvUGFnZUJ5SWQoYS5wYXlsb2FkLnBhZ2VJZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJQQUdFX1FVRV9FWENMVURFX0JZX1BBR0VfSURfQ09NTUFORFwiOlxuICAgICAgICAgIHRoaXMubmV4dFF1ZS5yZW1vdmVCeVBhZ2VJZChhLnBheWxvYWQucGFnZUlkcyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJQQUdFX1FVRV9FWENMVURFX0JZX1RBR19DT01NQU5EXCI6XG4gICAgICAgICAgdGhpcy5uZXh0UXVlLnJlbW92ZUJ5VGFnKGEucGF5bG9hZC50YWdJZHMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiVU5LTk9XTiBBQ1RJT05cIiwgYSk7XG4gICAgICAgICAgY29uc3QgY2hlY2s6IG5ldmVyID0gYTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zb2xlLmxvZyhhY3Rpb25zKTtcbiAgfVxuXG4gIGdldFJlc3VsdHMoKTogQW5zd2VyZWRRdWVzdGlvbltdIHtcbiAgICByZXR1cm4gdGhpcy5oaXN0b3J5LmdldEFuc3dlcnMoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ29Ub1BhZ2VCeUlkKHBhZ2VJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5uZXh0UXVlLmp1bXBUb1BhZ2VCeUlkKHBhZ2VJZCk7XG4gIH1cblxuICBoYW5kbGVOYXZpZ2F0aW9uQ29tbWFuZChjb21tYW5kOiBOYXZpZ2F0aW9uQ29tbWFuZCkge1xuICAgIHN3aXRjaCAoY29tbWFuZC5raW5kKSB7XG4gICAgICBjYXNlIFwiUEFHRV9RVUVfTkVYVF9QQUdFX0NPTU1BTkRcIjpcbiAgICAgICAgLy8gTk8gTkVFRCBUTyBETyBBTllUSElOR1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJQQUdFX1FVRV9HT19UT19QQUdFX0NPTU1BTkRcIjpcbiAgICAgICAgdGhpcy5nb1RvUGFnZUJ5SWQoY29tbWFuZC5wYXlsb2FkLnBhZ2VJZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIlBBR0VfUVVFX0dPX1RPX1NFUVVFTkNFX0NPTU1BTkRcIjpcbiAgICAgICAgdGhpcy5pbnNlcnRTZXF1ZW5jZUJ5SWQoY29tbWFuZC5wYXlsb2FkLnNlcXVlbmNlSWQpO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgRFV0aWwubmV2ZXJDaGVjayhjb21tYW5kKTtcbiAgICB9XG4gIH1cblxuICBnZXROZXh0UGFnZSgpOiBQYWdlRHRvIHwgZmFsc2Uge1xuICAgIC8vIFRPRE8gSEFORExFIFJVTEVTISFcbiAgICByZXR1cm4gdGhpcy5uZXh0UXVlLnBvcCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbnNlcnRTZXF1ZW5jZUJ5SWQoaWQ6IHN0cmluZykge1xuICAgIGNvbnN0IHNlcSA9IHRoaXMuZGF0YS5wYWdlU2VxdWVuY2VzPy5maW5kKChzKSA9PiBzLmlkID09PSBpZCk7XG4gICAgaWYgKHNlcSkge1xuICAgICAgdGhpcy5uZXh0UXVlLmluc2VydEFzTmV4dEJ5Rm9yY2UoWy4uLnNlcS5wYWdlc10pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBIT1cgVE8gSEFORExFIElOVkFMSUQgSURfUkVGUz8/IExPR0dFUj8/XG4gICAgICAvLyBMT0cgSU5WQUxJRCBDT01NQU5ELlxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUb3RhbCBudW1iZXIgb2YgcGFnZXMuXG4gICAqL1xuICBnZXQgcGFnZUNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMubmV4dFF1ZS5wYWdlQ291bnQ7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBEQ29tbWFuZCwgRWxlbWVudENvbW1hbmQsIFN0YXRlQ29tbWFuZCB9IGZyb20gXCIuLi9jb21tYW5kcy9EQ29tbWFuZFwiO1xuaW1wb3J0IHsgREV2ZW50IH0gZnJvbSBcIi4uL2V2ZW50cy9ERXZlbnRzXCI7XG5pbXBvcnQgeyBDb25kaXRpb24gfSBmcm9tIFwiLi4vcnVsZXMvY29uZGl0aW9uXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgREV2ZW50SGFuZGxlcjxFIGV4dGVuZHMgREV2ZW50ID0gREV2ZW50PiB7XG4gICAgcmVhZG9ubHkgb25FdmVudDogRVtcImtpbmRcIl07XG4gICAgcmVhZG9ubHkgd2hlbj86IHsgcHJvZHVjZXJJZD86IHN0cmluZzsgY29uZGl0aW9uPzogQ29uZGl0aW9uIH07XG4gICAgcmVhZG9ubHkgdGhlbkV4ZWN1dGU6IFJlYWRvbmx5QXJyYXk8RENvbW1hbmQ+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5Q2hhbmdlZEhhbmRsZXIge1xuICAgIHJlYWRvbmx5IHF1ZXJ5TmFtZTogc3RyaW5nO1xuICAgIHJlYWRvbmx5IHdoZW5UcnVlOiBSZWFkb25seUFycmF5PEVsZW1lbnRDb21tYW5kPjtcbiAgICByZWFkb25seSB3aGVuRmFsc2U6IFJlYWRvbmx5QXJyYXk8RWxlbWVudENvbW1hbmQ+O1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIERFdmVudEhhbmRsZXIge1xuICAgIGV4cG9ydCB0eXBlIExvb2tVcCA9IE1hcDxERXZlbnRIYW5kbGVyW1wib25FdmVudFwiXSwgQXJyYXk8REV2ZW50SGFuZGxlcj4+O1xuICAgIGV4cG9ydCBjb25zdCBjcmVhdGVMb29rVXAgPSAoaGFuZGxlcnM/OiBSZWFkb25seUFycmF5PERFdmVudEhhbmRsZXI+KTogTG9va1VwID0+IHtcbiAgICAgICAgY29uc3QgbWFwID0gbmV3IE1hcDxERXZlbnRIYW5kbGVyW1wib25FdmVudFwiXSwgQXJyYXk8REV2ZW50SGFuZGxlcj4+KCk7XG4gICAgICAgIGhhbmRsZXJzPy5mb3JFYWNoKChoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBraW5kID0gaC5vbkV2ZW50O1xuICAgICAgICAgICAgY29uc3QgY3VycmVudCA9IG1hcC5nZXQoa2luZCk7XG4gICAgICAgICAgICBjb25zdCBhY3Rpb25zID0gY3VycmVudCA/IFsuLi5jdXJyZW50LCBoXSA6IFtoXTtcbiAgICAgICAgICAgIG1hcC5zZXQoa2luZCwgYWN0aW9ucyk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbWFwO1xuICAgIH07XG59XG4iLCAiaW1wb3J0IHsgRFN0eWxlIH0gZnJvbSBcIi4vRFN0eWxlXCI7XG5pbXBvcnQgeyBERWxlbWVudEJhc2VEdG8gfSBmcm9tIFwiLi4vZHRvL0RFbGVtZW50LmR0b1wiO1xuaW1wb3J0IHsgRENvbW1hbmQsIEVsZW1lbnRDb21tYW5kIH0gZnJvbSBcIi4uL2NvbW1hbmRzL0RDb21tYW5kXCI7XG5pbXBvcnQgeyBEQ29tbWFuZEJ1cyB9IGZyb20gXCIuLi9jb21tYW5kcy9EQ29tbWFuZEJ1c1wiO1xuaW1wb3J0IHsgREV2ZW50SGFuZGxlciB9IGZyb20gXCIuLi9ldmVudC1oYW5kbGVycy9ERXZlbnRIYW5kbGVyXCI7XG5pbXBvcnQgeyBEVXRpbCB9IGZyb20gXCIuLi91dGlscy9EVXRpbFwiO1xuaW1wb3J0IHsgRXZlbnRCdXMgfSBmcm9tIFwiLi4vZXZlbnRzL2V2ZW50LWJ1c1wiO1xuaW1wb3J0IHsgRFRpbWVzdGFtcCB9IGZyb20gXCIuLi9jb21tb24vRFRpbWVzdGFtcFwiO1xuaW1wb3J0IHsgQW5pbWF0aW9uRHRvIH0gZnJvbSBcIi4uL2R0by9BbmltYXRpb25EdG9cIjtcbmltcG9ydCB7IFNjYWxlU2VydmljZSB9IGZyb20gXCIuLi9lbmdpbmUvc2NhbGVcIjtcbmltcG9ydCB7IERTdGF0ZSB9IGZyb20gXCIuLi9zdGF0ZS9Ec3RhdGVcIjtcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIERFbGVtZW50PFQgZXh0ZW5kcyBIVE1MRWxlbWVudD4ge1xuICAgIHByb3RlY3RlZCByZWFkb25seSBlbDogVDtcbiAgICBwcml2YXRlIGNsaWNrSGFuZGxlcklzRW5hYmxlZCA9IHRydWU7XG4gICAgcmVhZG9ubHkgaWQ6IHN0cmluZztcbiAgICBwcml2YXRlIGlzQW5pbWF0aW5nU2VsZiA9IGZhbHNlO1xuICAgIHByb3RlY3RlZCBjdXJyU3R5bGU6IFBhcnRpYWw8RFN0eWxlPiA9IHtcbiAgICAgICAgZm9udFNpemU6IHsgX3VuaXQ6IFwicHhcIiwgdmFsdWU6IDEwMCB9LFxuICAgICAgICBmb250V2VpZ2h0OiA1MDAsXG4gICAgICAgIHRleHRDb2xvcjogXCJibGFja1wiLFxuICAgICAgICBvcGFjaXR5OiAxLFxuICAgIH07XG5cbiAgICAvLyBwcml2YXRlIHJlYWRvbmx5IG9uUXVlcnlDaGFuZ2VkSGFuZGxlcnMgPVxuICAgIHByaXZhdGUgcmVhZG9ubHkgZXZlbnRIYW5kbGVyczogREV2ZW50SGFuZGxlci5Mb29rVXA7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGNvbW1hbmRCdXM6IERDb21tYW5kQnVzO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBldmVudEJ1czogRXZlbnRCdXM7XG4gICAgcHJvdGVjdGVkIHNjYWxlOiBTY2FsZVNlcnZpY2U7XG4gICAgcHJpdmF0ZSByZWFkb25seSBiYXNlRHRvOiBERWxlbWVudEJhc2VEdG87XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHN1YnNjcmlwdGlvbnMgPSBuZXcgU2V0PCgpID0+IHZvaWQ+KCk7XG5cbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoXG4gICAgICAgIGVsOiBULFxuICAgICAgICBldmVudEJ1czogRXZlbnRCdXMsXG4gICAgICAgIGNvbW1hbmRCdXM6IERDb21tYW5kQnVzLFxuICAgICAgICBkdG86IERFbGVtZW50QmFzZUR0byxcbiAgICAgICAgc2NhbGU6IFNjYWxlU2VydmljZVxuICAgICkge1xuICAgICAgICB0aGlzLmVsID0gZWw7XG4gICAgICAgIHRoaXMuaWQgPSBkdG8uaWQ7XG4gICAgICAgIHRoaXMuYmFzZUR0byA9IGR0bztcbiAgICAgICAgLy8gdGhpcy5lbC5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcbiAgICAgICAgdGhpcy5jb21tYW5kQnVzID0gY29tbWFuZEJ1cztcbiAgICAgICAgdGhpcy5ldmVudEJ1cyA9IGV2ZW50QnVzO1xuICAgICAgICB0aGlzLmV2ZW50SGFuZGxlcnMgPSBERXZlbnRIYW5kbGVyLmNyZWF0ZUxvb2tVcChkdG8uZXZlbnRIYW5kbGVycyk7XG4gICAgICAgIHRoaXMuc2NhbGUgPSBzY2FsZTtcbiAgICAgICAgLy8gQ0xJQ0tcbiAgICAgICAgdGhpcy5vbkNsaWNrSGFuZGxlciA9IHRoaXMub25DbGlja0hhbmRsZXIuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5lbC5vbmNsaWNrID0gdGhpcy5vbkNsaWNrSGFuZGxlcjtcblxuICAgICAgICAvLyBIT1ZFUlxuICAgICAgICB0aGlzLm9uTW91c2VPdmVyID0gdGhpcy5vbk1vdXNlT3Zlci5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmVsLm9ubW91c2VvdmVyID0gdGhpcy5vbk1vdXNlT3ZlcjtcblxuICAgICAgICBpZiAoZHRvKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVN0eWxlcyhkdG8/LnN0eWxlKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb21tYW5kU3Vic2NyaXB0aW9uID0gdGhpcy5jb21tYW5kQnVzLnN1YnNjcmliZSgoYykgPT4ge1xuICAgICAgICAgICAgaWYgKGMua2luZCA9PT0gXCJFTEVNRU5UX1NUWUxFX0NPTU1BTkRcIiAmJiBjLnRhcmdldElkID09PSB0aGlzLmlkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTdHlsZShjLnBheWxvYWQuY2hhbmdlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYy5raW5kID09PSBcIkVMRU1FTlRfRElTQUJMRV9DTElDS19DT01NQU5EXCIgJiYgYy50YXJnZXRJZCA9PT0gdGhpcy5pZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2xpY2tIYW5kbGVySXNFbmFibGVkID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYy5raW5kID09PSBcIkVMRU1FTlRfRU5BQkxFX0NMSUNLX0NPTU1BTkRcIiAmJiBjLnRhcmdldElkID09PSB0aGlzLmlkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jbGlja0hhbmRsZXJJc0VuYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGMua2luZCA9PT0gXCJFTEVNRU5UX0FOSU1BVEVfQ09NTUFORFwiICYmIGMudGFyZ2V0SWQgPT09IHRoaXMuaWQpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIlRPRE8gSU1QTEVNRU5UIEFOSU1BVElPTl9IQU5ETEVSIElOIERFbGVtZW50LlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgdGhpcy5pZCk7XG4gICAgICAgIC8vIFRPRE8gTUVNT1JZIExFQUtcbiAgICAgICAgY29uc3QgZXZlbnRTdWJzY3JpcHRpb24gPSB0aGlzLmV2ZW50QnVzLnN1YnNjcmliZSgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5ldmVudEhhbmRsZXJzLmdldChldmVudC5raW5kKSA/PyBbXTtcbiAgICAgICAgICAgIC8vIFRPRE8gQXBwbHkgQ29uZGl0aW9ucyBpbiBXSEVOLlxuICAgICAgICAgICAgY29uc3QgY29tbWFuZHMgPSBoYW5kbGVycy5tYXAoKGgpID0+IGgudGhlbkV4ZWN1dGUpLmZsYXQoMSk7XG4gICAgICAgICAgICBjb21tYW5kcy5mb3JFYWNoKChjb21tYW5kKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb21tYW5kQnVzLmVtaXQoY29tbWFuZCk7XG4gICAgICAgICAgICAgICAgLy8gdGhpcy5kb0FjdGlvbihjb21tYW5kKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoZXZlbnQua2luZCA9PT0gXCJIT1NUX1NDQUxFX0NIQU5HRURfRVZFTlRcIikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiSEFORExFIFRISVMgU0NBTEUgQ0hBTkdFISFcIik7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTdHlsZXMoe30pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZXZlbnQua2luZCA9PT0gXCJTVEFURV9RVUVSWV9SRVNVTFRfQ0hBTkdFRF9FVkVOVFwiKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5xdWVyeUNoYW5nZWRIYW5kbGVyKGV2ZW50LmRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCBcIkVMRU1FTlQ6IFwiKTtcbiAgICAgICAgdGhpcy5ub3JtYWxpemUoKTtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChjb21tYW5kU3Vic2NyaXB0aW9uKTtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChldmVudFN1YnNjcmlwdGlvbik7XG4gICAgfVxuXG4gICAgYWJzdHJhY3QgZGVzdHJveSgpOiB2b2lkO1xuXG4gICAgLy8gYWJzdHJhY3Qgc2V0U2NhbGUoc2NhbGU6IG51bWJlcik6IHZvaWQ7XG5cbiAgICAvLyAvKipcbiAgICAvLyAgKiBUaGUgcHVycG9zZSBvZiB0aGlzIGZ1bmN0aW9uIGlzIHRvIHJlLWVtaXQgY29tbWFuZHMgZnJvbSBldmVudC1oYW5kbGVycz9cbiAgICAvLyAgKiBAcGFyYW0gY29tbWFuZFxuICAgIC8vICAqIEBwcml2YXRlXG4gICAgLy8gICovXG4gICAgLy8gcHJpdmF0ZSBoYW5kbGVDb21tYW5kc0VtaXR0ZWRCeVByaXZhdGVFdmVudEhhbmRsZXJzKGNvbW1hbmQ6IERDb21tYW5kKSB7XG4gICAgLy8gICAgIGNvbnNvbGUubG9nKGNvbW1hbmQpO1xuICAgIC8vICAgICBzd2l0Y2ggKGNvbW1hbmQua2luZCkge1xuICAgIC8vICAgICAgICAgY2FzZSBcIkVMRU1FTlRfU1RZTEVfQ09NTUFORFwiOlxuICAgIC8vICAgICAgICAgICAgIGlmIChjb21tYW5kLnRhcmdldElkID09PSB0aGlzLmlkKSB7XG4gICAgLy8gICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU3R5bGVzKGNvbW1hbmQucGF5bG9hZC5jaGFuZ2VzKTtcbiAgICAvLyAgICAgICAgICAgICB9XG4gICAgLy8gICAgICAgICAgICAgYnJlYWs7XG4gICAgLy8gICAgICAgICBjYXNlIFwiRUxFTUVOVF9BTklNQVRFX0NPTU1BTkRcIjpcbiAgICAvLyAgICAgICAgICAgICAvLyBUT0RPIENIRUNLIEZPUiBUQVJHRVQgSURcbiAgICAvLyAgICAgICAgICAgICB0aGlzLmhhbmRsZUFuaW1hdGVTZWxmQWN0aW9uKGNvbW1hbmQucGF5bG9hZCk7XG4gICAgLy8gICAgICAgICAgICAgYnJlYWs7XG4gICAgLy8gICAgICAgICBjYXNlIFwiRUxFTUVOVF9FTkFCTEVfQ0xJQ0tfQ09NTUFORFwiOlxuICAgIC8vICAgICAgICAgICAgIHRoaXMuY2xpY2tIYW5kbGVySXNFbmFibGVkID0gdHJ1ZTtcbiAgICAvLyAgICAgICAgICAgICAvLyB0aGlzLnVwZGF0ZVN0eWxlcyhjb21tYW5kLnBheWxvYWQuY2hhbmdlcyk7XG4gICAgLy8gICAgICAgICAgICAgYnJlYWs7XG4gICAgLy8gICAgICAgICBjYXNlIFwiRUxFTUVOVF9ESVNBQkxFX0NMSUNLX0NPTU1BTkRcIjpcbiAgICAvLyAgICAgICAgICAgICB0aGlzLmNsaWNrSGFuZGxlcklzRW5hYmxlZCA9IGZhbHNlO1xuICAgIC8vICAgICAgICAgICAgIC8vIHRoaXMuaGFuZGxlQW5pbWF0ZVNlbGZBY3Rpb24oY29tbWFuZC5wYXlsb2FkKTtcbiAgICAvLyAgICAgICAgICAgICBicmVhaztcbiAgICAvLyAgICAgICAgIGNhc2UgXCJWSURFT19QTEFZX0NPTU1BTkRcIjpcbiAgICAvLyAgICAgICAgICAgICB0aGlzLmNvbW1hbmRCdXMuZW1pdChjb21tYW5kKTtcbiAgICAvLyAgICAgICAgICAgICBicmVhaztcbiAgICAvLyAgICAgICAgIGNhc2UgXCJWSURFT19QQVVTRV9DT01NQU5EXCI6XG4gICAgLy8gICAgICAgICAgICAgdGhpcy5jb21tYW5kQnVzLmVtaXQoY29tbWFuZCk7XG4gICAgLy8gICAgICAgICAgICAgYnJlYWs7XG4gICAgLy8gICAgICAgICBjYXNlIFwiRU5HSU5FX0xFQVZFX1BBR0VfQ09NTUFORFwiOlxuICAgIC8vICAgICAgICAgICAgIHRoaXMuY29tbWFuZEJ1cy5lbWl0KGNvbW1hbmQpO1xuICAgIC8vICAgICAgICAgICAgIGJyZWFrO1xuICAgIC8vICAgICAgICAgY2FzZSBcIlZJREVPX0pVTVBfVE9fQ09NTUFORFwiOlxuICAgIC8vICAgICAgICAgICAgIHRoaXMuY29tbWFuZEJ1cy5lbWl0KGNvbW1hbmQpO1xuICAgIC8vICAgICAgICAgICAgIGJyZWFrO1xuICAgIC8vICAgICAgICAgY2FzZSBcIlZJREVPX1NFVF9WT0xVTUVfQ09NTUFORFwiOlxuICAgIC8vICAgICAgICAgICAgIHRoaXMuY29tbWFuZEJ1cy5lbWl0KGNvbW1hbmQpO1xuICAgIC8vICAgICAgICAgICAgIGJyZWFrO1xuICAgIC8vICAgICAgICAgY2FzZSBcIkFVRElPX1BMQVlfQ09NTUFORFwiOlxuICAgIC8vICAgICAgICAgICAgIHRoaXMuY29tbWFuZEJ1cy5lbWl0KGNvbW1hbmQpO1xuICAgIC8vICAgICAgICAgICAgIGJyZWFrO1xuICAgIC8vICAgICAgICAgY2FzZSBcIkFVRElPX1BBVVNFX0NPTU1BTkRcIjpcbiAgICAvLyAgICAgICAgICAgICB0aGlzLmNvbW1hbmRCdXMuZW1pdChjb21tYW5kKTtcbiAgICAvLyAgICAgICAgICAgICBicmVhaztcbiAgICAvLyAgICAgICAgIGNhc2UgXCJBVURJT19TRVRfVk9MVU1FX0NPTU1BTkRcIjpcbiAgICAvLyAgICAgICAgICAgICB0aGlzLmNvbW1hbmRCdXMuZW1pdChjb21tYW5kKTtcbiAgICAvLyAgICAgICAgICAgICBicmVhaztcbiAgICAvLyAgICAgICAgIGNhc2UgXCJQQUdFX1FVRV9ORVhUX1BBR0VfQ09NTUFORFwiOlxuICAgIC8vICAgICAgICAgICAgIHRoaXMuY29tbWFuZEJ1cy5lbWl0KGNvbW1hbmQpO1xuICAgIC8vICAgICAgICAgICAgIGJyZWFrO1xuICAgIC8vICAgICAgICAgY2FzZSBcIlBBR0VfUVVFX0dPX1RPX1NFUVVFTkNFX0NPTU1BTkRcIjpcbiAgICAvLyAgICAgICAgICAgICB0aGlzLmNvbW1hbmRCdXMuZW1pdChjb21tYW5kKTtcbiAgICAvLyAgICAgICAgICAgICBicmVhaztcbiAgICAvLyAgICAgICAgIGNhc2UgXCJQQUdFX1FVRV9HT19UT19QQUdFX0NPTU1BTkRcIjpcbiAgICAvLyAgICAgICAgICAgICB0aGlzLmNvbW1hbmRCdXMuZW1pdChjb21tYW5kKTtcbiAgICAvLyAgICAgICAgICAgICBicmVhaztcbiAgICAvLyAgICAgICAgIGNhc2UgXCJQQUdFX1FVRV9FWENMVURFX0JZX1BBR0VfSURfQ09NTUFORFwiOlxuICAgIC8vICAgICAgICAgICAgIHRoaXMuY29tbWFuZEJ1cy5lbWl0KGNvbW1hbmQpO1xuICAgIC8vICAgICAgICAgICAgIGJyZWFrO1xuICAgIC8vICAgICAgICAgY2FzZSBcIlBBR0VfUVVFX0pVTVBfVE9fUEFHRV9DT01NQU5EXCI6XG4gICAgLy8gICAgICAgICAgICAgdGhpcy5jb21tYW5kQnVzLmVtaXQoY29tbWFuZCk7XG4gICAgLy8gICAgICAgICAgICAgYnJlYWs7XG4gICAgLy8gICAgICAgICBjYXNlIFwiUEFHRV9RVUVfRVhDTFVERV9CWV9UQUdfQ09NTUFORFwiOlxuICAgIC8vICAgICAgICAgICAgIHRoaXMuY29tbWFuZEJ1cy5lbWl0KGNvbW1hbmQpO1xuICAgIC8vICAgICAgICAgICAgIGJyZWFrO1xuICAgIC8vICAgICAgICAgY2FzZSBcIlNUQVRFX01VVEFURV9DT01NQU5EXCI6XG4gICAgLy8gICAgICAgICAgICAgdGhpcy5jb21tYW5kQnVzLmVtaXQoY29tbWFuZCk7XG4gICAgLy8gICAgICAgICAgICAgYnJlYWs7XG4gICAgLy8gICAgICAgICBkZWZhdWx0OlxuICAgIC8vICAgICAgICAgICAgIERVdGlsLm5ldmVyQ2hlY2soY29tbWFuZCk7XG4gICAgLy8gICAgIH1cbiAgICAvLyB9XG5cbiAgICBwcml2YXRlIHF1ZXJ5Q2hhbmdlZEhhbmRsZXIocmVzdWx0OiBEU3RhdGUuU3RhdGVRdWVyeVJlc3VsdCkge1xuICAgICAgICBjb25zdCBtYXliZUhhbmRsZXJzID0gdGhpcy5iYXNlRHRvLm9uU3RhdGVDaGFuZ2U7XG4gICAgICAgIGlmICghbWF5YmVIYW5kbGVycykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHF1ZXJ5SGFuZGxlcnMgPSBtYXliZUhhbmRsZXJzLmZpbHRlcigoaCkgPT4gaC5xdWVyeU5hbWUgPT09IHJlc3VsdC5xdWVyeU5hbWUpO1xuICAgICAgICBxdWVyeUhhbmRsZXJzLmZvckVhY2goKGgpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXN1bHQuY3Vycikge1xuICAgICAgICAgICAgICAgIGgud2hlblRydWUuZm9yRWFjaCgoY29tbWFuZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLmRvQWN0aW9uKGNvbW1hbmQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbW1hbmRCdXMuZW1pdChjb21tYW5kKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaC53aGVuRmFsc2UuZm9yRWFjaCgoY29tbWFuZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLmRvQWN0aW9uKGNvbW1hbmQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbW1hbmRCdXMuZW1pdChjb21tYW5kKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGZpbmRCeVF1ZXJ5LCB2YWx1ZSk7XG4gICAgICAgIC8vIGNvbnN0IGFsbCA9IHRoaXMuYmFzZUR0by5zdGF0ZVF1ZXJ5Q2hhbmdlID8/IFtdO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25DbGlja0hhbmRsZXIoXzogTW91c2VFdmVudCkge1xuICAgICAgICAvLyBjb25zb2xlLmxvZygpO1xuICAgICAgICBpZiAoIXRoaXMuY2xpY2tIYW5kbGVySXNFbmFibGVkKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyh0aGlzLmlkICsgXCJDbGljayBkaXNhYmxlZFwiKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjbGlja0FjdGlvbiA9IHRoaXMuYmFzZUR0by5vbkNsaWNrO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIk5BVElWRSBDTElDSyBFTEVNRU5UOiBIYW5kbGVycyBcIiArIGNsaWNrQWN0aW9uPy5sZW5ndGgpO1xuICAgICAgICBpZiAoY2xpY2tBY3Rpb24gJiYgY2xpY2tBY3Rpb24ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJUQVJHRVRJRDogXCIgKyBjbGlja0FjdGlvblswXS50YXJnZXRJZCArIFwiIFwiICsgdGhpcy5pZCk7XG4gICAgICAgICAgICB0aGlzLmV2ZW50QnVzLmVtaXQoe1xuICAgICAgICAgICAgICAgIGtpbmQ6IFwiVVNFUl9DTElDS0VEX0VWRU5UXCIsXG4gICAgICAgICAgICAgICAgcHJvZHVjZXI6IFwiRFVzZXJcIixcbiAgICAgICAgICAgICAgICBwcm9kdWNlcklkOiB0aGlzLmlkLFxuICAgICAgICAgICAgICAgIGRhdGE6IHsgZWxlbWVudElkOiB0aGlzLmlkIH0sXG4gICAgICAgICAgICAgICAgdGltZXN0YW1wOiBEVGltZXN0YW1wLm5vdygpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjbGlja0FjdGlvbi5mb3JFYWNoKChjb21tYW5kKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb21tYW5kQnVzLmVtaXQoY29tbWFuZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgb25Nb3VzZU92ZXIoXzogTW91c2VFdmVudCkge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhldik7XG4gICAgfVxuXG4gICAgc2V0U3R5bGUoc3R5bGU6IFBhcnRpYWw8RFN0eWxlPikge1xuICAgICAgICB0aGlzLnVwZGF0ZVN0eWxlcyhzdHlsZSk7XG4gICAgfVxuXG4gICAgYXBwZW5kWW91cnNlbGYocGFyZW50OiBIVE1MRWxlbWVudCkge1xuICAgICAgICBwYXJlbnQuYXBwZW5kKHRoaXMuZWwpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhwYXJlbnQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaGFuZGxlQW5pbWF0ZVNlbGZBY3Rpb24oZHRvOiBBbmltYXRpb25EdG8pIHtcbiAgICAgICAgdGhpcy5pc0FuaW1hdGluZ1NlbGYgPSB0cnVlO1xuICAgICAgICBjb25zdCB7IGtleWZyYW1lcywgb3B0aW9ucyB9ID0gZHRvO1xuXG4gICAgICAgIGNvbnN0IGFuaW1hdGlvbiA9IHRoaXMuZWwuYW5pbWF0ZShrZXlmcmFtZXMsIG9wdGlvbnMuZHVyYXRpb24pO1xuICAgICAgICBhbmltYXRpb24ub25maW5pc2ggPSAoZTogQW5pbWF0aW9uUGxheWJhY2tFdmVudCkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coZS50eXBlKTtcbiAgICAgICAgICAgIHRoaXMuaXNBbmltYXRpbmdTZWxmID0gZmFsc2U7XG4gICAgICAgIH07XG4gICAgICAgIGFuaW1hdGlvbi5vbnJlbW92ZSA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcIkFOSU1BVElPTiBSRU1PVkVEOiBcIiArIGFuaW1hdGlvbi5pZCk7XG4gICAgICAgICAgICB0aGlzLmlzQW5pbWF0aW5nU2VsZiA9IGZhbHNlO1xuICAgICAgICB9O1xuICAgICAgICBhbmltYXRpb24ub25jYW5jZWwgPSAoKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXCJBTklNQVRJT04gQ0FOQ0VMRUQ6IFwiICsgYW5pbWF0aW9uLmlkKTtcbiAgICAgICAgICAgIHRoaXMuaXNBbmltYXRpbmdTZWxmID0gZmFsc2U7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBub3JtYWxpemUoKSB7XG4gICAgICAgIERTdHlsZS5ub3JtYWxpemUodGhpcy5lbCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHVwZGF0ZVN0eWxlcyhzdHlsZTogUGFydGlhbDxEU3R5bGU+KSB7XG4gICAgICAgIHRoaXMuY3VyclN0eWxlID0gT2JqZWN0LmFzc2lnbih0aGlzLmN1cnJTdHlsZSwgc3R5bGUpO1xuICAgICAgICBEU3R5bGUuYXBwbHlTdHlsZXModGhpcy5lbCwgdGhpcy5jdXJyU3R5bGUsIHRoaXMuc2NhbGUuc2NhbGUpO1xuICAgICAgICB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmVsKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgREVsZW1lbnQgfSBmcm9tIFwiLi9ERWxlbWVudFwiO1xuaW1wb3J0IHsgRERpdkR0byB9IGZyb20gXCIuLi9kdG8vREVsZW1lbnQuZHRvXCI7XG5pbXBvcnQgeyBEVGV4dCB9IGZyb20gXCIuL0RUZXh0XCI7XG5pbXBvcnQgeyBESW1nIH0gZnJvbSBcIi4vREltZ1wiO1xuaW1wb3J0IHsgRENvbW1hbmRCdXMgfSBmcm9tIFwiLi4vY29tbWFuZHMvRENvbW1hbmRCdXNcIjtcbmltcG9ydCB7IEV2ZW50QnVzIH0gZnJvbSBcIi4uL2V2ZW50cy9ldmVudC1idXNcIjtcbmltcG9ydCB7IFNjYWxlU2VydmljZSB9IGZyb20gXCIuLi9lbmdpbmUvc2NhbGVcIjtcblxuZXhwb3J0IGNsYXNzIEREaXYgZXh0ZW5kcyBERWxlbWVudDxIVE1MRGl2RWxlbWVudD4ge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgVEFHID0gXCJbIEREaXYgXTogXCI7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGRlZmF1bHRTdHlsZSA9IHsgeDogMjIsIHk6IDQgfTtcbiAgICBwcml2YXRlIGNoaWxkcmVuOiBBcnJheTxEVGV4dCB8IERJbWc+ID0gW107XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgZHRvOiBERGl2RHRvLFxuICAgICAgICBldmVudEJ1czogRXZlbnRCdXMsXG4gICAgICAgIGFjdGlvblNlcnZpY2U6IERDb21tYW5kQnVzLFxuICAgICAgICBzY2FsZTogU2NhbGVTZXJ2aWNlLFxuICAgICAgICBjaGlsZHJlbjogQXJyYXk8RFRleHQgfCBESW1nPlxuICAgICkge1xuICAgICAgICBjb25zdCBkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgc3VwZXIoZCwgZXZlbnRCdXMsIGFjdGlvblNlcnZpY2UsIGR0bywgc2NhbGUpO1xuICAgICAgICB0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW47XG5cbiAgICAgICAgdGhpcy5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZCkgPT4ge1xuICAgICAgICAgICAgY2hpbGQuYXBwZW5kWW91cnNlbGYodGhpcy5lbCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKCh1bnN1YnNjcmliZSkgPT4ge1xuICAgICAgICAgICAgdW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQpID0+IHtcbiAgICAgICAgICAgIGNoaWxkLmRlc3Ryb3koKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IERFbGVtZW50IH0gZnJvbSBcIi4vREVsZW1lbnRcIjtcbmltcG9ydCB7IERJbWdEdG8gfSBmcm9tIFwiLi4vZHRvL0RFbGVtZW50LmR0b1wiO1xuaW1wb3J0IHsgRENvbW1hbmRCdXMgfSBmcm9tIFwiLi4vY29tbWFuZHMvRENvbW1hbmRCdXNcIjtcbmltcG9ydCB7IEV2ZW50QnVzIH0gZnJvbSBcIi4uL2V2ZW50cy9ldmVudC1idXNcIjtcbmltcG9ydCB7IFNjYWxlU2VydmljZSB9IGZyb20gXCIuLi9lbmdpbmUvc2NhbGVcIjtcbmltcG9ydCB7IERUaW1lc3RhbXAgfSBmcm9tIFwiLi4vY29tbW9uL0RUaW1lc3RhbXBcIjtcblxuZXhwb3J0IGNsYXNzIERJbWcgZXh0ZW5kcyBERWxlbWVudDxIVE1MSW1hZ2VFbGVtZW50PiB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgSU1BR0VfQ09VTlQgPSAwO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgaW1hZ2VDb3VudDogbnVtYmVyO1xuICAgIHJlYWRvbmx5IFRBRzogc3RyaW5nO1xuICAgIHJlYWRvbmx5IFRJTUlOR19UQUc6IHN0cmluZztcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxvYWRTdGFydDogRFRpbWVzdGFtcDtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGR0bzogREltZ0R0byxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBhY3Rpb25TdWJqZWN0OiBEQ29tbWFuZEJ1cyxcbiAgICAgICAgcmVhZG9ubHkgZXZlbnRCdXM6IEV2ZW50QnVzLFxuICAgICAgICByZWFkb25seSBzY2FsZVNlcnZpY2U6IFNjYWxlU2VydmljZVxuICAgICkge1xuICAgICAgICBzdXBlcihkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW1nXCIpLCBldmVudEJ1cywgYWN0aW9uU3ViamVjdCwgZHRvLCBzY2FsZVNlcnZpY2UpO1xuICAgICAgICBESW1nLklNQUdFX0NPVU5UICs9IDE7XG4gICAgICAgIHRoaXMuaW1hZ2VDb3VudCA9IERJbWcuSU1BR0VfQ09VTlQ7XG4gICAgICAgIHRoaXMuVEFHID0gXCJbRF9JTUcgXCIgKyBESW1nLklNQUdFX0NPVU5UICsgXCIgXTogXCI7XG4gICAgICAgIHRoaXMuVElNSU5HX1RBRyA9IFwibG9hZC10aW1lIChcIiArIERJbWcuSU1BR0VfQ09VTlQgKyBcIikgXCI7XG4gICAgICAgIHRoaXMuZWwubG9hZGluZyA9IFwiZWFnZXJcIjtcbiAgICAgICAgdGhpcy5lbC5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcbiAgICAgICAgdGhpcy5zZXRTdHlsZShkdG8uc3R5bGUpO1xuICAgICAgICB0aGlzLmxvYWRTdGFydCA9IERUaW1lc3RhbXAubm93KCk7XG4gICAgICAgIC8vIEJpbmQgSGFuZGxlcnNcbiAgICAgICAgdGhpcy5vbkVycm9yID0gdGhpcy5vbkVycm9yLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMub25Mb2FkID0gdGhpcy5vbkxvYWQuYmluZCh0aGlzKTtcbiAgICAgICAgLy8gdGhpcy5vbkNsaWNrID0gdGhpcy5vbkNsaWNrLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuZWwub25sb2FkID0gdGhpcy5vbkxvYWQ7XG4gICAgICAgIHRoaXMuZWwub25lcnJvciA9IHRoaXMub25FcnJvcjtcbiAgICAgICAgLy8gdGhpcy5lbC5vbmNsaWNrID0gdGhpcy5vbkNsaWNrO1xuICAgICAgICB0aGlzLmVsLnNyYyA9IGR0by51cmw7XG4gICAgICAgIGNvbnNvbGUudGltZSh0aGlzLlRJTUlOR19UQUcpO1xuICAgIH1cblxuICAgIGxvZygpOiB2b2lkIHt9XG5cbiAgICBzZXRTY2FsZShzY2FsZTogbnVtYmVyKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKHNjYWxlKTtcbiAgICAgICAgdGhpcy5zZXRTdHlsZSh0aGlzLmN1cnJTdHlsZSk7XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKCh1bnN1YnNjcmliZSkgPT4ge1xuICAgICAgICAgICAgdW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbkVycm9yKGV2OiBFdmVudCB8IHN0cmluZykge1xuICAgICAgICBpZiAoZXYgaW5zdGFuY2VvZiBFdmVudCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2codGhpcy5UQUcgKyBcIiBcIiArIGV2LnR5cGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5sb2codGhpcy5UQUcgKyBldik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIG9uTG9hZChfOiBFdmVudCkge1xuICAgICAgICBjb25zdCBsb2FkVGltZSA9IERUaW1lc3RhbXAuZGlmZk5vdyh0aGlzLmxvYWRTdGFydCk7XG5cbiAgICAgICAgdGhpcy5ldmVudEJ1cy5lbWl0KHtcbiAgICAgICAgICAgIGtpbmQ6IFwiSU1BR0VfTE9BREVEX0VWRU5UXCIsXG4gICAgICAgICAgICBwcm9kdWNlcjogXCJESW1hZ2VcIixcbiAgICAgICAgICAgIHByb2R1Y2VySWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICB0aW1lc3RhbXA6IERUaW1lc3RhbXAubm93KCksXG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgbG9hZFRpbWUsXG4gICAgICAgICAgICAgICAgbmF0dXJhbEhlaWdodDogdGhpcy5lbC5uYXR1cmFsSGVpZ2h0LFxuICAgICAgICAgICAgICAgIG5hdHVyYWxXaWR0aDogdGhpcy5lbC5uYXR1cmFsV2lkdGgsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiB0aGlzLmVsLmhlaWdodCxcbiAgICAgICAgICAgICAgICB3aWR0aDogdGhpcy5lbC53aWR0aCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBERWxlbWVudCB9IGZyb20gXCIuL0RFbGVtZW50XCI7XG5pbXBvcnQgeyBEVGV4dER0byB9IGZyb20gXCIuLi9kdG8vREVsZW1lbnQuZHRvXCI7XG5pbXBvcnQgeyBEQ29tbWFuZEJ1cyB9IGZyb20gXCIuLi9jb21tYW5kcy9EQ29tbWFuZEJ1c1wiO1xuaW1wb3J0IHsgRXZlbnRCdXMgfSBmcm9tIFwiLi4vZXZlbnRzL2V2ZW50LWJ1c1wiO1xuaW1wb3J0IHsgU2NhbGVTZXJ2aWNlIH0gZnJvbSBcIi4uL2VuZ2luZS9zY2FsZVwiO1xuXG5leHBvcnQgY2xhc3MgRFRleHQgZXh0ZW5kcyBERWxlbWVudDxIVE1MUGFyYWdyYXBoRWxlbWVudD4ge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgVEFHID0gXCJbIERQYXJhZ3JhcGggXTogXCI7XG4gICAgcHJvdGVjdGVkIGRlZmF1bHRTdHlsZSA9IHt9O1xuXG4gICAgY29uc3RydWN0b3IoZHRvOiBEVGV4dER0bywgZXZlbnRCdXM6IEV2ZW50QnVzLCBhY3Rpb25TZXJ2aWNlOiBEQ29tbWFuZEJ1cywgc2NhbGU6IFNjYWxlU2VydmljZSkge1xuICAgICAgICBzdXBlcihkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwicFwiKSwgZXZlbnRCdXMsIGFjdGlvblNlcnZpY2UsIGR0bywgc2NhbGUpO1xuICAgICAgICB0aGlzLmVsLnN0eWxlLnBvc2l0aW9uID0gXCJhYnNvbHV0ZVwiO1xuICAgICAgICB0aGlzLmVsLmlubmVyVGV4dCA9IFwiXCIgKyBkdG8udGV4dDtcbiAgICAgICAgdGhpcy5zZXRTdHlsZShkdG8uc3R5bGUpO1xuICAgIH1cblxuICAgIHNldFNjYWxlKHNjYWxlOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zZXRTdHlsZSh0aGlzLmN1cnJTdHlsZSk7XG4gICAgICAgIGNvbnN0IGZvbnRTaXplID0gdGhpcy5lbC5zdHlsZS5mb250U2l6ZTtcbiAgICAgICAgY29uc29sZS5sb2codGhpcy5UQUcgKyBcInNjYWxlOiBcIiArIHNjYWxlICsgXCIgRm9udHNpemU6IFwiICsgZm9udFNpemUpO1xuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKCh1bnN1YnNjcmliZSkgPT4ge1xuICAgICAgICAgICAgdW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IERFbGVtZW50IH0gZnJvbSBcIi4uL0RlbGVtZW50L0RFbGVtZW50XCI7XG5pbXBvcnQgeyBERGl2IH0gZnJvbSBcIi4uL0RlbGVtZW50L0RkaXZcIjtcbmltcG9ydCB7IERJbWcgfSBmcm9tIFwiLi4vRGVsZW1lbnQvREltZ1wiO1xuaW1wb3J0IHsgRFRleHQgfSBmcm9tIFwiLi4vRGVsZW1lbnQvRFRleHRcIjtcbmltcG9ydCB7IEREaXZEdG8sIERFbGVtZW50RHRvIH0gZnJvbSBcIi4uL2R0by9ERWxlbWVudC5kdG9cIjtcbmltcG9ydCB7IERDb21tYW5kQnVzIH0gZnJvbSBcIi4uL2NvbW1hbmRzL0RDb21tYW5kQnVzXCI7XG5pbXBvcnQgeyBFdmVudEJ1cyB9IGZyb20gXCIuLi9ldmVudHMvZXZlbnQtYnVzXCI7XG5pbXBvcnQgeyBTY2FsZVNlcnZpY2UgfSBmcm9tIFwiLi9zY2FsZVwiO1xuXG5leHBvcnQgY29uc3QgY3JlYXRlREVsZW1lbnQgPSAoXG4gICAgZHRvOiBERWxlbWVudER0byxcbiAgICBhY3Rpb25CdXM6IERDb21tYW5kQnVzLFxuICAgIGV2ZW50QnVzOiBFdmVudEJ1cyxcbiAgICBzY2FsZTogU2NhbGVTZXJ2aWNlXG4pOiBERWxlbWVudDxhbnk+ID0+IHtcbiAgICBzd2l0Y2ggKGR0by5fdGFnKSB7XG4gICAgICAgIGNhc2UgXCJkaXZcIjpcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkRWxzID0gY3JlYXRlQ2hpbGRyZW5Gb3JEaXYoZHRvLCBhY3Rpb25CdXMsIGV2ZW50QnVzLCBzY2FsZSk7XG4gICAgICAgICAgICBjb25zdCBuZXdEaXYgPSBuZXcgRERpdihkdG8sIGV2ZW50QnVzLCBhY3Rpb25CdXMsIHNjYWxlLCBjaGlsZEVscyk7XG4gICAgICAgICAgICByZXR1cm4gbmV3RGl2O1xuICAgICAgICBjYXNlIFwiaW1nXCI6XG4gICAgICAgICAgICByZXR1cm4gbmV3IERJbWcoZHRvLCBhY3Rpb25CdXMsIGV2ZW50QnVzLCBzY2FsZSk7XG4gICAgICAgIGNhc2UgXCJwXCI6XG4gICAgICAgICAgICByZXR1cm4gbmV3IERUZXh0KGR0bywgZXZlbnRCdXMsIGFjdGlvbkJ1cywgc2NhbGUpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgY29uc3QgY2hlY2s6IG5ldmVyID0gZHRvO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBkdG8gZ2l2ZW4gdG8gdGhlIGNyZWF0ZURFbGVtZW50IGZ1bmN0aW9uLlwiKTtcbiAgICAgICAgLy8gVE9ETyBMT0dHSU5HIG9yIGNyZWF0ZSBhbnkgSFRNTC1FTEVNRU5UPz9cbiAgICB9XG59O1xuXG5jb25zdCBjcmVhdGVDaGlsZHJlbkZvckRpdiA9IChcbiAgICBkdG86IEREaXZEdG8sXG4gICAgYWN0aW9uU3ViamVjdDogRENvbW1hbmRCdXMsXG4gICAgZXZlbnRCdXM6IEV2ZW50QnVzLFxuICAgIHNjYWxlOiBTY2FsZVNlcnZpY2Vcbik6IEREaXZbXCJjaGlsZHJlblwiXSA9PiB7XG4gICAgY29uc3QgY2hpbGREdG8gPSBkdG8uY2hpbGRyZW47XG4gICAgY29uc3QgY2hpbGRFbHM6IEFycmF5PERJbWcgfCBEVGV4dD4gPSBbXTtcbiAgICAvLyBjb25zb2xlLmxvZyhjaGlsZEVsZW1lbnRzKTtcbiAgICBjaGlsZER0by5mb3JFYWNoKChkdG8pID0+IHtcbiAgICAgICAgaWYgKGR0by5fdGFnID09PSBcInBcIikge1xuICAgICAgICAgICAgY29uc3QgbmV3VGV4dCA9IG5ldyBEVGV4dChkdG8sIGV2ZW50QnVzLCBhY3Rpb25TdWJqZWN0LCBzY2FsZSk7XG4gICAgICAgICAgICBjaGlsZEVscy5wdXNoKG5ld1RleHQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkdG8uX3RhZyA9PT0gXCJpbWdcIikge1xuICAgICAgICAgICAgY29uc3QgbmV3SW1hZ2UgPSBuZXcgREltZyhkdG8sIGFjdGlvblN1YmplY3QsIGV2ZW50QnVzLCBzY2FsZSk7XG4gICAgICAgICAgICBjaGlsZEVscy5wdXNoKG5ld0ltYWdlKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBjaGlsZEVscztcbn07XG4iLCAiaW1wb3J0IHsgREVsZW1lbnQgfSBmcm9tIFwiLi4vRGVsZW1lbnQvREVsZW1lbnRcIjtcbmltcG9ydCB7IFBhZ2VEdG8gfSBmcm9tIFwiLi4vZHRvL1NjaGVtYUR0b1wiO1xuaW1wb3J0IHsgY3JlYXRlREVsZW1lbnQgfSBmcm9tIFwiLi9lbGVtZW50LWZhY3RvcnlcIjtcbmltcG9ydCB7IEV2ZW50QnVzIH0gZnJvbSBcIi4uL2V2ZW50cy9ldmVudC1idXNcIjtcbmltcG9ydCB7IERDb21tYW5kQnVzIH0gZnJvbSBcIi4uL2NvbW1hbmRzL0RDb21tYW5kQnVzXCI7XG5pbXBvcnQgeyBEVGltZXN0YW1wIH0gZnJvbSBcIi4uL2NvbW1vbi9EVGltZXN0YW1wXCI7XG5pbXBvcnQgeyBTY2FsZVNlcnZpY2UgfSBmcm9tIFwiLi9zY2FsZVwiO1xuXG5leHBvcnQgY2xhc3MgRFBhZ2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IFRBRyA9IFwiWyBEUGFnZSBdOiBcIjtcbiAgcHJpdmF0ZSBlbGVtZW50czogREVsZW1lbnQ8SFRNTEVsZW1lbnQ+W10gPSBbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBldmVudEJ1cztcbiAgcHJpdmF0ZSByZWFkb25seSBjb21tYW5kQnVzO1xuICBwcml2YXRlIHJlYWRvbmx5IHNjYWxlOiBTY2FsZVNlcnZpY2U7XG4gIC8vIFRvZG8gR0xPQkFMIEVWRU5UX0JVU1MgQU5EIFBBR0UgRVZFTlRTOlxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZHRvOiBQYWdlRHRvLFxuICAgIGV2ZW50QnVzOiBFdmVudEJ1cyxcbiAgICBjb21tYW5kQnVzOiBEQ29tbWFuZEJ1cyxcbiAgICBzY2FsZTogU2NhbGVTZXJ2aWNlLFxuICApIHtcbiAgICB0aGlzLmV2ZW50QnVzID0gZXZlbnRCdXM7XG4gICAgdGhpcy5jb21tYW5kQnVzID0gY29tbWFuZEJ1cztcbiAgICB0aGlzLnNjYWxlID0gc2NhbGU7XG4gICAgdGhpcy5lbGVtZW50cyA9IGR0by5lbGVtZW50cy5tYXAoKGR0bykgPT4gY3JlYXRlREVsZW1lbnQoZHRvLCB0aGlzLmNvbW1hbmRCdXMsIHRoaXMuZXZlbnRCdXMsIHRoaXMuc2NhbGUpKTtcbiAgfVxuXG4gIGFwcGVuZFlvdXJzZWxmKHBhcmVudDogSFRNTEVsZW1lbnQpIHtcbiAgICAvLyBjb25zb2xlLmxvZyh0aGlzLlRBRyArIFwiIEFQUEVORElORyBUTyBQQVJFTlRcIik7XG4gICAgdGhpcy5lbGVtZW50cy5mb3JFYWNoKChlbCkgPT4ge1xuICAgICAgZWwuYXBwZW5kWW91cnNlbGYocGFyZW50KTtcbiAgICAgIC8vIHBhcmVudC5hcHBlbmRDaGlsZChlbC5lbCk7XG4gICAgfSk7XG5cbiAgICAvLyBpZiAoIXByZWxvYWRNb2RlKSB7XG4gICAgdGhpcy5ldmVudEJ1cy5lbWl0KHtcbiAgICAgIGtpbmQ6IFwiUEFHRV9FTlRFUl9FVkVOVFwiLFxuICAgICAgdGltZXN0YW1wOiBEVGltZXN0YW1wLm5vdygpLFxuICAgICAgcHJvZHVjZXI6IFwiRFBhZ2VcIixcbiAgICAgIHByb2R1Y2VySWQ6IHRoaXMuaWQsXG4gICAgICBkYXRhOiB7IHBhZ2VJZDogdGhpcy5pZCB9LFxuICAgIH0pO1xuICAgIC8vIH1cbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5lbGVtZW50cy5mb3JFYWNoKChlbCkgPT4ge1xuICAgICAgZWwuZGVzdHJveSgpO1xuICAgIH0pO1xuICB9XG5cbiAgbG9nKCk6IHZvaWQge1xuICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuVEFHICsgJ3NjYWxlIC0gJyArIHRoaXMuc2NhbGUpO1xuICB9XG5cbiAgZ2V0IGlkKCkge1xuICAgIHJldHVybiB0aGlzLmR0by5pZDtcbiAgfVxufVxuIiwgImV4cG9ydCBjbGFzcyBTY2FsZVNlcnZpY2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IGJhc2VIZWlnaHQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgYmFzZVdpZHRoO1xuICBwcml2YXRlIGNvbnRhaW5lckhlaWdodCA9IDEzMDA7XG4gIHByaXZhdGUgY29udGFpbmVyV2lkdGggPSAxMzAwO1xuXG4gIGdldCBzY2FsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fc2NhbGU7XG4gIH1cblxuICBnZXQgcGFnZUhlaWdodCgpIHtcbiAgICByZXR1cm4gdGhpcy5iYXNlSGVpZ2h0ICogdGhpcy5zY2FsZTtcbiAgfVxuICBnZXQgcGFnZVdpZHRoKCkge1xuICAgIHJldHVybiB0aGlzLmJhc2VXaWR0aCAqIHRoaXMuX3NjYWxlO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2NhbGUgPSAxO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgc3Vic2NyaWJlcnMgPSBuZXcgU2V0PChzY2FsZTogbnVtYmVyKSA9PiB2b2lkPigpO1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogeyBiYXNlSGVpZ2h0OiBudW1iZXI7IGJhc2VXaWR0aDogbnVtYmVyOyBjb250YWluZXJIZWlnaHQ6IG51bWJlcjsgY29udGFpbmVyV2lkdGg6IG51bWJlciB9KSB7XG4gICAgdGhpcy5iYXNlSGVpZ2h0ID0gY29uZmlnLmJhc2VIZWlnaHQ7XG4gICAgdGhpcy5iYXNlV2lkdGggPSBjb25maWcuYmFzZVdpZHRoO1xuICAgIHRoaXMuY29udGFpbmVySGVpZ2h0ID0gY29uZmlnLmNvbnRhaW5lckhlaWdodDtcbiAgICB0aGlzLmNvbnRhaW5lcldpZHRoID0gY29uZmlnLmNvbnRhaW5lcldpZHRoO1xuICAgIHRoaXMudXBkYXRlU2NhbGUoKTtcbiAgfVxuXG4gIHNldENvbnRhaW5lckJvdW5kcyhib3VuZHM6IHsgaGVpZ2h0OiBudW1iZXI7IHdpZHRoOiBudW1iZXIgfSkge1xuICAgIHRoaXMuY29udGFpbmVyV2lkdGggPSBib3VuZHMud2lkdGg7XG4gICAgdGhpcy5jb250YWluZXJIZWlnaHQgPSBib3VuZHMuaGVpZ2h0O1xuICAgIHRoaXMudXBkYXRlU2NhbGUoKTtcbiAgfVxuICBwcml2YXRlIHVwZGF0ZVNjYWxlKCkge1xuICAgIGNvbnN0IHNjYWxlRm4gPSBTY2FsZS5jYWxjKHRoaXMuYmFzZUhlaWdodCwgdGhpcy5iYXNlV2lkdGgpO1xuICAgIGNvbnN0IHNjYWxlID0gc2NhbGVGbih7IGhlaWdodDogdGhpcy5jb250YWluZXJIZWlnaHQsIHdpZHRoOiB0aGlzLmNvbnRhaW5lcldpZHRoIH0pO1xuICAgIGNvbnN0IGhhc0NoYW5nZWQgPSB0aGlzLnNjYWxlICE9PSBzY2FsZTtcbiAgICB0aGlzLl9zY2FsZSA9IHNjYWxlO1xuICAgIGlmIChoYXNDaGFuZ2VkKSB7XG4gICAgICB0aGlzLnN1YnNjcmliZXJzLmZvckVhY2goKGZuKSA9PiB7XG4gICAgICAgIGZuKHRoaXMuX3NjYWxlKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG9uQ2hhbmdlKHNjYWxlQ2hhbmdlSGFuZGxlcjogKHNjYWxlOiBudW1iZXIpID0+IHZvaWQsIHN1YnNjcmliZXJJZDogc3RyaW5nKSB7XG4gICAgLy8gY29uc29sZS5sb2coc3Vic2NyaWJlcklkKTtcbiAgICB0aGlzLnN1YnNjcmliZXJzLmFkZChzY2FsZUNoYW5nZUhhbmRsZXIpO1xuICAgIHNjYWxlQ2hhbmdlSGFuZGxlcih0aGlzLl9zY2FsZSk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHRoaXMuc3Vic2NyaWJlcnMuZGVsZXRlKHNjYWxlQ2hhbmdlSGFuZGxlcik7XG4gICAgfTtcbiAgfVxufVxuZXhwb3J0IG5hbWVzcGFjZSBTY2FsZSB7XG4gIGV4cG9ydCBjb25zdCBjYWxjID0gKGJhc2VIZWlnaHQ6IG51bWJlciwgYmFzZVdpZHRoOiBudW1iZXIpID0+IHtcbiAgICByZXR1cm4gKGNvbnRhaW5lcjogeyBoZWlnaHQ6IG51bWJlcjsgd2lkdGg6IG51bWJlciB9KSA9PiB7XG4gICAgICBjb25zdCBoZWlnaHRSYXRpbyA9IGNvbnRhaW5lci5oZWlnaHQgLyBiYXNlSGVpZ2h0O1xuICAgICAgY29uc3Qgd2lkdGhSYXRpbyA9IGNvbnRhaW5lci53aWR0aCAvIGJhc2VXaWR0aDtcbiAgICAgIHJldHVybiBNYXRoLm1pbihoZWlnaHRSYXRpbywgd2lkdGhSYXRpbyk7XG4gICAgfTtcbiAgfTtcblxuICB0eXBlIFNjYWxlUG9zSW5wdXQgPSB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyBoOiBudW1iZXI7IHc6IG51bWJlciB9O1xuXG4gIGV4cG9ydCBjb25zdCBzY2FsZUZ1bmN0aW9uQ3JlYXRvciA9IChzY2FsZTogbnVtYmVyKSA9PiB7XG4gICAgcmV0dXJuICh2YWx1ZTogbnVtYmVyKSA9PiB2YWx1ZSAqIHNjYWxlO1xuICB9O1xufVxuIiwgImltcG9ydCB7IERBdWRpb0R0bywgREltZ0R0bywgRFZpZGVvRHRvIH0gZnJvbSBcIi4uL2R0by9ERWxlbWVudC5kdG9cIjtcblxuZXhwb3J0IGNsYXNzIFJlc291cmNlUHJvdmlkZXIge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgVEFHID0gXCJbIFJFU09VUkNFX1BST1ZJREVSIF06IFwiO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdmlkZW9NYXAgPSBuZXcgTWFwPHN0cmluZywgRFZpZGVvRHRvPigpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgYXVkaW9NYXAgPSBuZXcgTWFwPHN0cmluZywgREF1ZGlvRHRvPigpO1xuICAgIGNvbnN0cnVjdG9yKGRhdGE6IHsgdmlkZW9zOiBSZWFkb25seUFycmF5PERWaWRlb0R0bz47IGF1ZGlvOiBSZWFkb25seUFycmF5PERBdWRpb0R0bz4gfSkge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyh0aGlzLlRBRyArIFwiVklERU9fQ09VTlQgXCIgKyBkYXRhLnZpZGVvcy5sZW5ndGgpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyh0aGlzLlRBRyArIFwiQVVESU9fQ09VTlQgXCIgKyBkYXRhLmF1ZGlvLmxlbmd0aCk7XG4gICAgICAgIGRhdGEudmlkZW9zLmZvckVhY2goKHZpZGVvKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnZpZGVvTWFwLnNldCh2aWRlby5pZCwgdmlkZW8pO1xuICAgICAgICB9KTtcbiAgICAgICAgZGF0YS5hdWRpby5mb3JFYWNoKChhdWRpbykgPT4ge1xuICAgICAgICAgICAgdGhpcy5hdWRpb01hcC5zZXQoYXVkaW8uaWQsIGF1ZGlvKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0QXVkaW9CeUlkKGlkOiBzdHJpbmcpOiBEQXVkaW9EdG8gfCBmYWxzZSB7XG4gICAgICAgIGNvbnN0IG1heWJlQXVkaW8gPSB0aGlzLmF1ZGlvTWFwLmdldChpZCk7XG4gICAgICAgIGlmICghbWF5YmVBdWRpbykge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcih0aGlzLlRBRyArIFwiQXVkaW8gYnkgaWQgXCIgKyBpZCArIFwiIGRvbnQgZXhpc3RcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1heWJlQXVkaW8gPz8gZmFsc2U7XG4gICAgfVxuXG4gICAgZ2V0VmlkZW9CeUlkKGlkOiBzdHJpbmcpOiBEVmlkZW9EdG8gfCBmYWxzZSB7XG4gICAgICAgIGNvbnN0IG1heWJlVmlkZW8gPSB0aGlzLnZpZGVvTWFwLmdldChpZCk7XG4gICAgICAgIGlmICghbWF5YmVWaWRlbykge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcih0aGlzLlRBRyArIFwiVmlkZW8gYnkgaWQgXCIgKyBpZCArIFwiIGRvbnQgZXhpc3RcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1heWJlVmlkZW8gPz8gZmFsc2U7XG4gICAgfVxufVxuIiwgImV4cG9ydCBjbGFzcyBPazxUPiBpbXBsZW1lbnRzIElSZXN1bHQ8VD4ge1xuICAgIGNvbnN0cnVjdG9yKHJlYWRvbmx5IHZhbHVlOiBUKSB7fVxuICAgIGlzT2soKTogdGhpcyBpcyBPazxUPiB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpc0ZhaWx1cmUoKTogdGhpcyBpcyBGYWlsdXJlPFQ+IHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIG1hcDxBPihmOiAodDogVCkgPT4gQSk6IElSZXN1bHQ8QT4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGYodGhpcy52YWx1ZSk7XG4gICAgICAgIHJldHVybiBuZXcgT2s8QT4odmFsdWUpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEZhaWx1cmU8VD4gaW1wbGVtZW50cyBJUmVzdWx0PFQ+IHtcbiAgICBjb25zdHJ1Y3RvcihyZWFkb25seSBtZXNzYWdlOiBzdHJpbmcpIHt9XG4gICAgaXNGYWlsdXJlKCk6IHRoaXMgaXMgRmFpbHVyZTxUPiB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlzT2soKTogdGhpcyBpcyBPazxUPiB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBtYXA8QT4oX2Y6ICh0OiBUKSA9PiBBKTogSVJlc3VsdDxBPiB7XG4gICAgICAgIHJldHVybiBuZXcgRmFpbHVyZTxBPih0aGlzLm1lc3NhZ2UpO1xuICAgIH1cbn1cblxuaW50ZXJmYWNlIElSZXN1bHQ8VD4ge1xuICAgIGlzT2soKTogdGhpcyBpcyBPazxUPjtcbiAgICBpc0ZhaWx1cmUoKTogdGhpcyBpcyBGYWlsdXJlPFQ+O1xuICAgIG1hcDxBPihmOiAodDogVCkgPT4gQSk6IElSZXN1bHQ8QT47XG59XG5cbmV4cG9ydCB0eXBlIFJlc3VsdDxUPiA9IEZhaWx1cmU8VD4gfCBPazxUPjtcbmV4cG9ydCBuYW1lc3BhY2UgUmVzdWx0IHtcbiAgICBleHBvcnQgY29uc3Qgb2sgPSA8VD4odmFsdWU6IFQpID0+IG5ldyBPazxUPih2YWx1ZSk7XG4gICAgZXhwb3J0IGNvbnN0IGZhaWx1cmUgPSA8VD4obWVzc2FnZTogc3RyaW5nKSA9PiBuZXcgRmFpbHVyZTxUPihtZXNzYWdlKTtcbn1cbiIsICJpbXBvcnQgeyBGYWN0IH0gZnJvbSBcIi4uL3J1bGVzL2ZhY3RcIjtcbmltcG9ydCB7IENvbmRpdGlvbiB9IGZyb20gXCIuLi9ydWxlcy9jb25kaXRpb25cIjtcbmltcG9ydCB7IERFdmVudCB9IGZyb20gXCIuLi9ldmVudHMvREV2ZW50c1wiO1xuaW1wb3J0IHsgU3RhdGVDb21tYW5kIH0gZnJvbSBcIi4uL2NvbW1hbmRzL0RDb21tYW5kXCI7XG5cbmV4cG9ydCBuYW1lc3BhY2UgRFN0YXRlIHtcbiAgICBpbnRlcmZhY2UgUHJvcERlZmluaXRpb248VHlwZU5hbWUsIFR5cGUgZXh0ZW5kcyBzdHJpbmcgfCBudW1iZXI+IHtcbiAgICAgICAgcmVhZG9ubHkgX3R5cGU6IFR5cGVOYW1lO1xuICAgICAgICByZWFkb25seSBwcm9wTmFtZTogc3RyaW5nO1xuICAgICAgICByZWFkb25seSBwcm9wRGVzY3JpcHRpb246IHN0cmluZztcbiAgICAgICAgcmVhZG9ubHkgaW5pdGlhbFZhbHVlPzogVHlwZTtcbiAgICAgICAgcmVhZG9ubHkgb3B0aW9ucz86IFJlYWRvbmx5QXJyYXk8UHJvcFZhbHVlPFR5cGU+PjtcbiAgICB9XG5cbiAgICBleHBvcnQgdHlwZSBOdW1lcmljUHJvcCA9IFByb3BEZWZpbml0aW9uPFwibnVtYmVyXCIsIG51bWJlcj47XG4gICAgZXhwb3J0IHR5cGUgU3RyaW5nUHJvcCA9IFByb3BEZWZpbml0aW9uPFwic3RyaW5nXCIsIHN0cmluZz47XG5cbiAgICBleHBvcnQgaW50ZXJmYWNlIGZyb21FdmVudEhhbmRsZXIge1xuICAgICAgICByZWFkb25seSBvbkV2ZW50OiBERXZlbnRbXCJraW5kXCJdO1xuICAgICAgICByZWFkb25seSB0aGVuRXhlY3V0ZTogUmVhZG9ubHlBcnJheTxTdGF0ZUNvbW1hbmQ+O1xuICAgIH1cblxuICAgIGV4cG9ydCBpbnRlcmZhY2UgUHJvcFZhbHVlPFQ+IHtcbiAgICAgICAgcmVhZG9ubHkgdmFsdWU6IFQ7XG4gICAgICAgIHJlYWRvbmx5IHZhbHVlTGFiZWw6IHN0cmluZztcbiAgICB9XG4gICAgZXhwb3J0IHR5cGUgUHJvcCA9IE51bWVyaWNQcm9wIHwgU3RyaW5nUHJvcDtcblxuICAgIGV4cG9ydCBpbnRlcmZhY2UgU2V0U3RyaW5nTXV0YXRpb24ge1xuICAgICAgICByZWFkb25seSBraW5kOiBcInNldC1zdHJpbmdcIjtcbiAgICAgICAgcmVhZG9ubHkgcHJvcE5hbWU6IHN0cmluZztcbiAgICAgICAgcmVhZG9ubHkgdmFsdWU6IHN0cmluZztcbiAgICB9XG5cbiAgICBleHBvcnQgaW50ZXJmYWNlIEluY3JlbWVudE51bWJlck11dGF0aW9uIHtcbiAgICAgICAgcmVhZG9ubHkga2luZDogXCJpbmNyZW1lbnQtbnVtYmVyXCI7XG4gICAgICAgIHJlYWRvbmx5IHByb3BOYW1lOiBzdHJpbmc7XG4gICAgICAgIHJlYWRvbmx5IHN0ZXBTaXplOiBudW1iZXI7XG4gICAgICAgIHJlYWRvbmx5IGlmTm90RXhpc3RUaGVuU2V0VG86IG51bWJlcjtcbiAgICB9XG4gICAgZXhwb3J0IGludGVyZmFjZSBEZWNyZW1lbnROdW1iZXJNdXRhdGlvbiB7XG4gICAgICAgIHJlYWRvbmx5IGtpbmQ6IFwiZGVjcmVtZW50LW51bWJlclwiO1xuICAgICAgICByZWFkb25seSBwcm9wTmFtZTogc3RyaW5nO1xuICAgICAgICByZWFkb25seSBzdGVwU2l6ZTogbnVtYmVyO1xuICAgICAgICByZWFkb25seSBpZk5vdEV4aXN0VGhlblNldFRvOiBudW1iZXI7XG4gICAgfVxuXG4gICAgZXhwb3J0IGludGVyZmFjZSBTZXROdW1iZXJNdXRhdGlvbiB7XG4gICAgICAgIHJlYWRvbmx5IGtpbmQ6IFwic2V0LW51bWJlclwiO1xuICAgICAgICByZWFkb25seSBwcm9wTmFtZTogc3RyaW5nO1xuICAgICAgICByZWFkb25seSB2YWx1ZTogbnVtYmVyO1xuICAgIH1cbiAgICBleHBvcnQgdHlwZSBOdW1iZXJNdXRhdGlvbnMgPSBJbmNyZW1lbnROdW1iZXJNdXRhdGlvbiB8IERlY3JlbWVudE51bWJlck11dGF0aW9uIHwgU2V0TnVtYmVyTXV0YXRpb247XG5cbiAgICBleHBvcnQgdHlwZSBTdGF0ZU11dGF0aW9uID0gU2V0U3RyaW5nTXV0YXRpb24gfCBOdW1iZXJNdXRhdGlvbnM7XG5cbiAgICBleHBvcnQgY29uc3QgaXNOdW1iZXJNdXRhdGlvbiA9IChtdXRhdGlvbnM6IFN0YXRlTXV0YXRpb24pOiBtdXRhdGlvbnMgaXMgTnVtYmVyTXV0YXRpb25zID0+IHtcbiAgICAgICAgaWYgKCFtdXRhdGlvbnMpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBtdXRhdGlvbnMua2luZCA9PT0gXCJzZXQtbnVtYmVyXCIgfHxcbiAgICAgICAgICAgIG11dGF0aW9ucy5raW5kID09PSBcImRlY3JlbWVudC1udW1iZXJcIiB8fFxuICAgICAgICAgICAgbXV0YXRpb25zLmtpbmQgPT09IFwiaW5jcmVtZW50LW51bWJlclwiXG4gICAgICAgICk7XG4gICAgfTtcblxuICAgIGV4cG9ydCBjb25zdCBpc1N0cmluZ011dGF0aW9uID0gKG11dGF0aW9uOiBTdGF0ZU11dGF0aW9uKTogbXV0YXRpb24gaXMgU2V0U3RyaW5nTXV0YXRpb24gPT4ge1xuICAgICAgICByZXR1cm4gbXV0YXRpb24gJiYgbXV0YXRpb24ua2luZCA9PT0gXCJzZXQtc3RyaW5nXCI7XG4gICAgfTtcblxuICAgIGV4cG9ydCBpbnRlcmZhY2UgU3RhdGVRdWVyeSB7XG4gICAgICAgIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgICAgICAgcmVhZG9ubHkgY29uZGl0aW9uOiBDb25kaXRpb247XG4gICAgfVxuXG4gICAgZXhwb3J0IGludGVyZmFjZSBTdGF0ZVF1ZXJ5UmVzdWx0IHtcbiAgICAgICAgcmVhZG9ubHkgcXVlcnlOYW1lOiBzdHJpbmc7XG4gICAgICAgIHJlYWRvbmx5IHByZXY6IGJvb2xlYW47XG4gICAgICAgIHJlYWRvbmx5IGN1cnI6IGJvb2xlYW47XG4gICAgfVxuXG4gICAgZXhwb3J0IGNvbnN0IG51bWVyaWNQcm9wVG9GYWN0ID0gKHByb3A6IE51bWVyaWNQcm9wLCB2YWx1ZTogbnVtYmVyKSA9PiB7XG4gICAgICAgIGNvbnN0IGZhY3Q6IEZhY3QuTnVtZXJpYyA9IHtcbiAgICAgICAgICAgIGtpbmQ6IFwibnVtZXJpYy1mYWN0XCIsXG4gICAgICAgICAgICByZWZlcmVuY2VJZDogcHJvcC5wcm9wTmFtZSxcbiAgICAgICAgICAgIHJlZmVyZW5jZUxhYmVsOiBwcm9wLnByb3BEZXNjcmlwdGlvbiA/PyBcIiBbU1RBVEVfUFJPUEVSVFldIDogXCIgKyBwcm9wLnByb3BOYW1lLFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICBsYWJlbDogXCIgW1ZBTFVFXSA6IFwiICsgdmFsdWUsXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBmYWN0O1xuICAgIH07XG5cbiAgICBleHBvcnQgY29uc3Qgc3RyaW5nUHJvcFRvRmFjdCA9IChwcm9wOiBTdHJpbmdQcm9wLCB2YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IGZhY3Q6IEZhY3QuU3RyaW5nID0ge1xuICAgICAgICAgICAga2luZDogXCJzdHJpbmctZmFjdFwiLFxuICAgICAgICAgICAgcmVmZXJlbmNlSWQ6IHByb3AucHJvcE5hbWUsXG4gICAgICAgICAgICByZWZlcmVuY2VMYWJlbDogXCIgW1NUQVRFX1BST1BFUlRZXSA6IFwiICsgcHJvcC5wcm9wTmFtZSxcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgbGFiZWw6IFwiIFtWQUxVRV0gOiBcIiArIHZhbHVlLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gZmFjdDtcbiAgICB9O1xufVxuIiwgImltcG9ydCB7IEZhY3QgfSBmcm9tIFwiLi4vcnVsZXMvZmFjdFwiO1xuaW1wb3J0IHsgUmVzdWx0IH0gZnJvbSBcIi4uL2NvbW1vbi9yZXN1bHRcIjtcbmltcG9ydCB7IENvbmRpdGlvbiB9IGZyb20gXCIuLi9ydWxlcy9jb25kaXRpb25cIjtcbmltcG9ydCB7IERTdGF0ZSB9IGZyb20gXCIuL0RzdGF0ZVwiO1xuaW1wb3J0IHsgREV2ZW50RGlzcGF0Y2hlciB9IGZyb20gXCIuLi9ldmVudHMvZXZlbnQtYnVzXCI7XG5pbXBvcnQgeyBEVGltZXN0YW1wIH0gZnJvbSBcIi4uL2NvbW1vbi9EVGltZXN0YW1wXCI7XG5pbXBvcnQgeyBRdWVyeUNoYW5nZWRFdmVudCB9IGZyb20gXCIuLi9ldmVudHMvREV2ZW50c1wiO1xuaW1wb3J0IHsgRENvbW1hbmRCdXMgfSBmcm9tIFwiLi4vY29tbWFuZHMvRENvbW1hbmRCdXNcIjtcblxuZXhwb3J0IGNsYXNzIFN0YXRlU2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgVEFHID0gXCIgWyBTVEFURV9TRVJWSUNFIF0gOlwiO1xuICBwcml2YXRlIHJlYWRvbmx5IGZhY3RzU3RyaW5nID0gbmV3IE1hcDxzdHJpbmcsIEZhY3QuU3RyaW5nPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGZhY3RzTnVtZXJpYyA9IG5ldyBNYXA8c3RyaW5nLCBGYWN0Lk51bWVyaWM+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvcERlZmluaXRpb25zID0gbmV3IE1hcDxzdHJpbmcsIERTdGF0ZS5Qcm9wPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHF1ZXJpZXMgPSBuZXcgTWFwPHN0cmluZywgeyBxdWVyeTogRFN0YXRlLlN0YXRlUXVlcnk7IGxhc3RSZXN1bHQ6IGJvb2xlYW4gfT4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSB1bnN1YnNjcmliZUNvbW1hbmRzOiAoKSA9PiB2b2lkO1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGV2ZW50QnVzOiBERXZlbnREaXNwYXRjaGVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY29tbWFuZEJ1czogRENvbW1hbmRCdXMsXG4gICAgcHJpdmF0ZSByZWFkb25seSBwcm9wczogUmVhZG9ubHlBcnJheTxEU3RhdGUuUHJvcD4sXG4gICAgcHJpdmF0ZSByZWFkb25seSBxdWVyeUxpc3Q6IFJlYWRvbmx5QXJyYXk8RFN0YXRlLlN0YXRlUXVlcnk+ID0gW10sXG4gICkge1xuICAgIHByb3BzLmZvckVhY2goKHByb3ApID0+IHtcbiAgICAgIHRoaXMucmVnaXN0ZXJQcm9wZXJ0eShwcm9wKTtcbiAgICB9KTtcbiAgICBjb25zdCBmYWN0cyA9IHRoaXMuZ2V0QWxsRmFjdHMoKTtcbiAgICBxdWVyeUxpc3QuZm9yRWFjaCgoZGVmaW5pdGlvbikgPT4ge1xuICAgICAgdGhpcy5yZWdpc3RlclF1ZXJ5KGRlZmluaXRpb24sIGZhY3RzKTtcbiAgICB9KTtcblxuICAgIHRoaXMuZXZhbHVhdGVRdWVyaWVzKCk7XG4gICAgdGhpcy51bnN1YnNjcmliZUNvbW1hbmRzID0gdGhpcy5jb21tYW5kQnVzLnN1YnNjcmliZSgoY29tbWFuZCkgPT4ge1xuICAgICAgaWYgKGNvbW1hbmQua2luZCA9PT0gXCJTVEFURV9NVVRBVEVfQ09NTUFORFwiKSB7XG4gICAgICAgIHRoaXMubXV0YXRpb24oY29tbWFuZC5wYXlsb2FkLm11dGF0aW9uKTtcbiAgICAgIH1cbiAgICB9LCB0aGlzLlRBRyk7XG4gIH1cblxuICBkZXN0cm95KCkge1xuICAgIHRoaXMudW5zdWJzY3JpYmVDb21tYW5kcygpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWdpc3RlclF1ZXJ5KHF1ZXJ5OiBEU3RhdGUuU3RhdGVRdWVyeSwgY3VycmVudEZhY3RzOiBSZWFkb25seUFycmF5PEZhY3Q+KSB7XG4gICAgY29uc3QgcmVzdWx0ID0gQ29uZGl0aW9uLmV2YWx1YXRlKHF1ZXJ5LmNvbmRpdGlvbiwgY3VycmVudEZhY3RzKTtcbiAgICB0aGlzLnF1ZXJpZXMuc2V0KHF1ZXJ5Lm5hbWUsIHsgcXVlcnk6IHF1ZXJ5LCBsYXN0UmVzdWx0OiByZXN1bHQgfSk7XG4gICAgdGhpcy5lbWl0UXVlcnlDaGFuZ2VkRXZlbnQoeyBxdWVyeU5hbWU6IHF1ZXJ5Lm5hbWUsIHByZXY6IHJlc3VsdCwgY3VycjogcmVzdWx0IH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZWdpc3RlclByb3BlcnR5KHByb3A6IERTdGF0ZS5Qcm9wKSB7XG4gICAgaWYgKHRoaXMucHJvcERlZmluaXRpb25zLmhhcyhwcm9wLnByb3BOYW1lKSkge1xuICAgICAgLy8gTE9HR0lOR1xuICAgICAgY29uc29sZS53YXJuKFwiUHJvcCBleGNpc3RzIGFscmVhZHkuXCIsIHByb3AucHJvcE5hbWUpO1xuICAgIH1cblxuICAgIHRoaXMucHJvcERlZmluaXRpb25zLnNldChwcm9wLnByb3BOYW1lLCBwcm9wKTtcblxuICAgIGlmIChwcm9wLmluaXRpYWxWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHByb3AuX3R5cGUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGNvbnN0IGZhY3QgPSBEU3RhdGUuc3RyaW5nUHJvcFRvRmFjdChwcm9wLCBwcm9wLmluaXRpYWxWYWx1ZSk7XG4gICAgICB0aGlzLmZhY3RzU3RyaW5nLnNldChmYWN0LnJlZmVyZW5jZUlkLCBmYWN0KTtcbiAgICB9XG4gICAgaWYgKHByb3AuX3R5cGUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIGNvbnN0IGZhY3QgPSBEU3RhdGUubnVtZXJpY1Byb3BUb0ZhY3QocHJvcCwgcHJvcC5pbml0aWFsVmFsdWUpO1xuICAgICAgdGhpcy5mYWN0c051bWVyaWMuc2V0KGZhY3QucmVmZXJlbmNlSWQsIGZhY3QpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbXV0YXRlU3RyaW5nKHByb3A6IERTdGF0ZS5TdHJpbmdQcm9wLCB2YWx1ZTogc3RyaW5nKSB7XG4gICAgY29uc3QgY3VyciA9IHRoaXMuZmFjdHNTdHJpbmcuZ2V0KHByb3AucHJvcE5hbWUpO1xuICAgIGlmIChjdXJyKSB7XG4gICAgICBjb25zdCB1cGRhdGVkOiBGYWN0LlN0cmluZyA9IHsgLi4uY3VyciwgdmFsdWUgfTtcbiAgICAgIHRoaXMuc2V0RmFjdCh1cGRhdGVkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY3JlYXRlZDogRmFjdC5TdHJpbmcgPSB7XG4gICAgICAgIGtpbmQ6IFwic3RyaW5nLWZhY3RcIixcbiAgICAgICAgcmVmZXJlbmNlSWQ6IHByb3AucHJvcE5hbWUsXG4gICAgICAgIHJlZmVyZW5jZUxhYmVsOiBcImxhYmVsIGZvcjogXCIgKyBwcm9wLnByb3BOYW1lLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgbGFiZWw6IFwiVmFsdWU6IFwiICsgdmFsdWUsXG4gICAgICB9O1xuICAgICAgdGhpcy5zZXRGYWN0KGNyZWF0ZWQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbXV0YXRlTnVtYmVyKHByb3A6IERTdGF0ZS5OdW1lcmljUHJvcCwgbXV0YXRpb246IERTdGF0ZS5OdW1iZXJNdXRhdGlvbnMpIHtcbiAgICBjb25zdCBjdXJyID0gdGhpcy5mYWN0c051bWVyaWMuZ2V0KHByb3AucHJvcE5hbWUpO1xuICAgIGlmICghY3Vycikge1xuICAgICAgc3dpdGNoIChtdXRhdGlvbi5raW5kKSB7XG4gICAgICAgIGNhc2UgXCJzZXQtbnVtYmVyXCI6XG4gICAgICAgICAgdGhpcy5zZXRGYWN0KERTdGF0ZS5udW1lcmljUHJvcFRvRmFjdChwcm9wLCBtdXRhdGlvbi52YWx1ZSkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiZGVjcmVtZW50LW51bWJlclwiOlxuICAgICAgICAgIHRoaXMuc2V0RmFjdChEU3RhdGUubnVtZXJpY1Byb3BUb0ZhY3QocHJvcCwgbXV0YXRpb24uaWZOb3RFeGlzdFRoZW5TZXRUbykpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiaW5jcmVtZW50LW51bWJlclwiOlxuICAgICAgICAgIHRoaXMuc2V0RmFjdChEU3RhdGUubnVtZXJpY1Byb3BUb0ZhY3QocHJvcCwgbXV0YXRpb24uaWZOb3RFeGlzdFRoZW5TZXRUbykpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGNvbnN0IGNoZWNrOiBuZXZlciA9IG11dGF0aW9uO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY3Vycikge1xuICAgICAgc3dpdGNoIChtdXRhdGlvbi5raW5kKSB7XG4gICAgICAgIGNhc2UgXCJzZXQtbnVtYmVyXCI6XG4gICAgICAgICAgdGhpcy5zZXRGYWN0KHsgLi4uY3VyciwgdmFsdWU6IG11dGF0aW9uLnZhbHVlIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiZGVjcmVtZW50LW51bWJlclwiOlxuICAgICAgICAgIHRoaXMuc2V0RmFjdCh7IC4uLmN1cnIsIHZhbHVlOiBjdXJyLnZhbHVlIC0gbXV0YXRpb24uc3RlcFNpemUgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJpbmNyZW1lbnQtbnVtYmVyXCI6XG4gICAgICAgICAgdGhpcy5zZXRGYWN0KHsgLi4uY3VyciwgdmFsdWU6IGN1cnIudmFsdWUgKyBtdXRhdGlvbi5zdGVwU2l6ZSB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBjb25zdCBjaGVjazogbmV2ZXIgPSBtdXRhdGlvbjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGV2YWx1YXRlUXVlcmllcygpOiBSZWFkb25seUFycmF5PHsgcXVlcnlOYW1lOiBzdHJpbmc7IHByZXY6IGJvb2xlYW47IGN1cnI6IGJvb2xlYW47IGRpZENoYW5nZTogYm9vbGVhbiB9PiB7XG4gICAgY29uc3QgZmFjdHMgPSB0aGlzLmdldEFsbEZhY3RzKCk7XG4gICAgY29uc3QgYWxsOiBBcnJheTx7IHF1ZXJ5TmFtZTogc3RyaW5nOyBwcmV2OiBib29sZWFuOyBjdXJyOiBib29sZWFuOyBkaWRDaGFuZ2U6IGJvb2xlYW4gfT4gPSBbXTtcbiAgICB0aGlzLnF1ZXJpZXMuZm9yRWFjaCgocSkgPT4ge1xuICAgICAgY29uc3QgcHJldiA9IHEubGFzdFJlc3VsdDtcblxuICAgICAgY29uc3QgY3VyciA9IENvbmRpdGlvbi5ldmFsdWF0ZShxLnF1ZXJ5LmNvbmRpdGlvbiwgZmFjdHMpO1xuICAgICAgY29uc3QgZGlkQ2hhbmdlID0gcHJldiAhPT0gY3VycjtcbiAgICAgIHEubGFzdFJlc3VsdCA9IGN1cnI7XG4gICAgICBhbGwucHVzaCh7IHF1ZXJ5TmFtZTogcS5xdWVyeS5uYW1lLCBwcmV2LCBjdXJyLCBkaWRDaGFuZ2UgfSk7XG4gICAgICAvLyBkZWYudmFsdWUgPSB2YWx1ZTtcbiAgICB9KTtcbiAgICByZXR1cm4gYWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBtdXRhdGlvbihtdXRhdGlvbjogRFN0YXRlLlN0YXRlTXV0YXRpb24pOiB7IHN1Y2Nlc3M6IGJvb2xlYW4gfSB7XG4gICAgY29uc3QgcHJvcERlZiA9IHRoaXMucHJvcERlZmluaXRpb25zLmdldChtdXRhdGlvbi5wcm9wTmFtZSk7XG4gICAgaWYgKCFwcm9wRGVmKSB7XG4gICAgICAvLyBUT0RPIExPR0dJTkdcbiAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgaWYgKHByb3BEZWYuX3R5cGUgPT09IFwic3RyaW5nXCIgJiYgRFN0YXRlLmlzU3RyaW5nTXV0YXRpb24obXV0YXRpb24pKSB7XG4gICAgICB0aGlzLm11dGF0ZVN0cmluZyhwcm9wRGVmLCBtdXRhdGlvbi52YWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKHByb3BEZWYuX3R5cGUgPT09IFwibnVtYmVyXCIgJiYgRFN0YXRlLmlzTnVtYmVyTXV0YXRpb24obXV0YXRpb24pKSB7XG4gICAgICB0aGlzLm11dGF0ZU51bWJlcihwcm9wRGVmLCBtdXRhdGlvbik7XG4gICAgfVxuICAgIGNvbnN0IHF1ZXJ5UmVzdWx0cyA9IHRoaXMuZXZhbHVhdGVRdWVyaWVzKCk7XG4gICAgY29uc3QgY2hhbmdlZFJlc3VsdCA9IHF1ZXJ5UmVzdWx0cy5maWx0ZXIoKHIpID0+IHIuZGlkQ2hhbmdlKTtcbiAgICBjaGFuZ2VkUmVzdWx0LmZvckVhY2goKHJlcykgPT4ge1xuICAgICAgdGhpcy5lbWl0UXVlcnlDaGFuZ2VkRXZlbnQoeyBxdWVyeU5hbWU6IHJlcy5xdWVyeU5hbWUsIHByZXY6IHJlcy5wcmV2LCBjdXJyOiByZXMuY3VyciB9KTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUgfTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdFF1ZXJ5Q2hhbmdlZEV2ZW50KGRhdGE6IHsgcXVlcnlOYW1lOiBzdHJpbmc7IHByZXY6IGJvb2xlYW47IGN1cnI6IGJvb2xlYW4gfSkge1xuICAgIGNvbnN0IHF1ZXJ5Q2hhbmdlZEV2ZW50OiBRdWVyeUNoYW5nZWRFdmVudCA9IHtcbiAgICAgIGtpbmQ6IFwiU1RBVEVfUVVFUllfUkVTVUxUX0NIQU5HRURfRVZFTlRcIixcbiAgICAgIHByb2R1Y2VyOiBcIlNUQVRFLVNFUlZJQ0VcIixcbiAgICAgIHByb2R1Y2VySWQ6IFwiU1RBVEUtU0VSVklDRVwiLFxuICAgICAgdGltZXN0YW1wOiBEVGltZXN0YW1wLm5vdygpLFxuICAgICAgZGF0YSxcbiAgICB9O1xuICAgIGNvbnN0IHsgcXVlcnlOYW1lLCBjdXJyLCBwcmV2IH0gPSBxdWVyeUNoYW5nZWRFdmVudC5kYXRhO1xuICAgIC8vIGNvbnNvbGUubG9nKFwiWyBRVUVSWV9DSEFOR0VEIFwiICsgcXVlcnlOYW1lICsgXCJdIDogXCIgKyBwcmV2ICsgXCIgLT4gXCIgKyBjdXJyKTtcbiAgICB0aGlzLmV2ZW50QnVzLmVtaXQocXVlcnlDaGFuZ2VkRXZlbnQpO1xuICB9XG5cbiAgZ2V0UHJvcEFzRmFjdChwcm9wTmFtZTogc3RyaW5nKTogUmVzdWx0PEZhY3Q+IHtcbiAgICBjb25zdCBwcm9wRGVmID0gdGhpcy5wcm9wRGVmaW5pdGlvbnMuZ2V0KHByb3BOYW1lKTtcbiAgICBpZiAoIXByb3BEZWYpIHtcbiAgICAgIHJldHVybiBSZXN1bHQuZmFpbHVyZShcbiAgICAgICAgXCJObyBkZWZpbml0aW9uIGZvcm0gcHJvcGVydHkgbnkgbmFtZSBcIiArIHByb3BOYW1lICsgXCIgaXMgcmVnaXN0ZXJlZC4gKFBhc3MgaW4gY29uc3RydWN0b3IuKVwiLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmZhY3RzU3RyaW5nLmdldChwcm9wTmFtZSkgPz8gdGhpcy5mYWN0c051bWVyaWMuZ2V0KHByb3BOYW1lKTtcblxuICAgIHJldHVybiB2YWx1ZSA/IFJlc3VsdC5vayh2YWx1ZSkgOiBSZXN1bHQuZmFpbHVyZShcIlByb3BlcnR5IFwiICsgcHJvcE5hbWUgKyBcIiBoYXMgbm8gdmFsdWUuXCIpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRGYWN0KGZhY3Q6IEZhY3QpIHtcbiAgICBzd2l0Y2ggKGZhY3Qua2luZCkge1xuICAgICAgY2FzZSBcIm51bWVyaWMtZmFjdFwiOlxuICAgICAgICB0aGlzLmZhY3RzTnVtZXJpYy5zZXQoZmFjdC5yZWZlcmVuY2VJZCwgZmFjdCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInN0cmluZy1mYWN0XCI6XG4gICAgICAgIHRoaXMuZmFjdHNTdHJpbmcuc2V0KGZhY3QucmVmZXJlbmNlSWQsIGZhY3QpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGNvbnN0IGNoZWNrOiBuZXZlciA9IGZhY3Q7XG4gICAgfVxuICB9XG5cbiAgZ2V0U3RhdGUoKSB7XG4gICAgY29uc3QgcHJvcHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlciB8IG51bGwgfCBib29sZWFuPiA9IHt9O1xuICAgIHRoaXMucHJvcERlZmluaXRpb25zLmZvckVhY2goKGRlZikgPT4ge1xuICAgICAgbGV0IHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgICAgIGNvbnN0IG1heWJlRmFjdCA9IHRoaXMuZ2V0QW55RmFjdChkZWYucHJvcE5hbWUpO1xuICAgICAgaWYgKG1heWJlRmFjdCkge1xuICAgICAgICB2YWx1ZSA9IG1heWJlRmFjdC52YWx1ZTtcbiAgICAgIH1cbiAgICAgIHByb3BzW2RlZi5wcm9wTmFtZV0gPSB2YWx1ZTtcbiAgICB9KTtcbiAgICB0aGlzLnF1ZXJpZXMuZm9yRWFjaCgocXVlcnkpID0+IHtcbiAgICAgIHByb3BzW3F1ZXJ5LnF1ZXJ5Lm5hbWVdID0gcXVlcnkubGFzdFJlc3VsdDtcbiAgICB9KTtcblxuICAgIGNvbnN0IHByb3BOYW1lcyA9IE9iamVjdC5rZXlzKHByb3BzKTtcbiAgICBjb25zdCBwcm9wQ291bnQgPSBwcm9wTmFtZXMubGVuZ3RoO1xuICAgIGNvbnN0IHByb3BBcnJheSA9IFsuLi50aGlzLnByb3BEZWZpbml0aW9ucy52YWx1ZXMoKV07XG5cbiAgICByZXR1cm4geyBwcm9wQ291bnQsIHByb3BOYW1lcywgcHJvcEFycmF5LCBzdGF0ZTogcHJvcHMgfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0QW55RmFjdChwcm9wTmFtZTogc3RyaW5nKTogRmFjdCB8IGZhbHNlIHtcbiAgICByZXR1cm4gdGhpcy5mYWN0c1N0cmluZy5nZXQocHJvcE5hbWUpID8/IHRoaXMuZmFjdHNOdW1lcmljLmdldChwcm9wTmFtZSkgPz8gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIGdldEFsbEZhY3RzKCk6IFJlYWRvbmx5QXJyYXk8RmFjdD4ge1xuICAgIHJldHVybiBbLi4udGhpcy5mYWN0c051bWVyaWMudmFsdWVzKCksIC4uLnRoaXMuZmFjdHNTdHJpbmcudmFsdWVzKCldO1xuICB9XG5cbiAgLyoqXG4gICAqIFdpbGwgY2hlY2sgdGhhdCBhbGwgcmVmZXJlbmNlSWRzIHVzZWQgaW4gQ29uZGl0aW9uIGlzIHJlZ2lzdGVyZWQgYXMgYSB2YWxpZCBwcm9wZXJ0eSBpbiBzdGF0ZS5cbiAgICogQHBhcmFtIGNvbmRpdGlvblxuICAgKi9cbiAgY2FuQmVNYXRjaGVkKGNvbmRpdGlvbjogQ29uZGl0aW9uKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc2ltcGxlQ29uZGl0aW9ucyA9IENvbmRpdGlvbi5nZXRBbGxTaW1wbGVDb25kaXRpb25zKGNvbmRpdGlvbik7XG4gICAgbGV0IGhhc0FsbCA9IHRydWU7XG5cbiAgICBjb25zdCBhbGxJZHMgPSBzaW1wbGVDb25kaXRpb25zLm1hcCgoYykgPT4gYy5yZWZlcmVuY2VJZCk7XG5cbiAgICBjb25zdCBtaXNzaW5nSWRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGFsbElkcy5mb3JFYWNoKChpZCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLnByb3BEZWZpbml0aW9ucy5oYXMoaWQpKSB7XG4gICAgICAgIGhhc0FsbCA9IGZhbHNlO1xuICAgICAgICBtaXNzaW5nSWRzLnB1c2goaWQpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnNvbGUubG9nKHRoaXMuVEFHLCBtaXNzaW5nSWRzKTtcblxuICAgIHJldHVybiBoYXNBbGw7XG4gIH1cbiAgaXNNYXRjaGVkKGNvbmRpdGlvbjogQ29uZGl0aW9uKSB7XG4gICAgcmV0dXJuIENvbmRpdGlvbi5ldmFsdWF0ZShjb25kaXRpb24sIHRoaXMuZ2V0QWxsRmFjdHMoKSk7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBTY2hlbWFEdG8gfSBmcm9tIFwiLi4vZHRvL1NjaGVtYUR0b1wiO1xuaW1wb3J0IHsgRE1lZGlhTWFuYWdlciB9IGZyb20gXCIuLi9zZXJ2aWNlcy9ETWVkaWEtbWFuYWdlclwiO1xuaW1wb3J0IHsgRENvbW1hbmRCdXMgfSBmcm9tIFwiLi4vY29tbWFuZHMvRENvbW1hbmRCdXNcIjtcbmltcG9ydCB7IEV2ZW50QnVzIH0gZnJvbSBcIi4uL2V2ZW50cy9ldmVudC1idXNcIjtcbmltcG9ydCB7IERQbGF5ZXIgfSBmcm9tIFwiLi4vcGxheWVyL2RwbGF5ZXJcIjtcbmltcG9ydCB7IEFuc3dlcmVkUXVlc3Rpb24gfSBmcm9tIFwiLi4vcGxheWVyL2hpc3RvcnktcXVlXCI7XG5pbXBvcnQgeyBEVGltZXN0YW1wIH0gZnJvbSBcIi4uL2NvbW1vbi9EVGltZXN0YW1wXCI7XG5pbXBvcnQgeyBEUGFnZSB9IGZyb20gXCIuL0RQYWdlXCI7XG5pbXBvcnQgeyBTY2FsZVNlcnZpY2UgfSBmcm9tIFwiLi9zY2FsZVwiO1xuaW1wb3J0IHsgUmVzb3VyY2VQcm92aWRlciB9IGZyb20gXCIuLi9zZXJ2aWNlcy9yZXNvdXJjZS1wcm92aWRlclwiO1xuaW1wb3J0IHsgU3RhdGVTZXJ2aWNlIH0gZnJvbSBcIi4uL3N0YXRlL3N0YXRlLXNlcnZpY2VcIjtcbmltcG9ydCB7IERDb21tYW5kLCBTdGF0ZUNvbW1hbmQgfSBmcm9tIFwiLi4vY29tbWFuZHMvRENvbW1hbmRcIjtcbmltcG9ydCB7IERFdmVudCB9IGZyb20gXCIuLi9ldmVudHMvREV2ZW50c1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEVuZ2luZUxvZ2dlciB7XG4gIGVycm9yKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQ7XG4gIHdhcm4obWVzc2FnZTogc3RyaW5nKTogdm9pZDtcbiAgYXBwRXZlbnQoZXZlbnQ6IERFdmVudCk6IHZvaWQ7XG4gIGFwcENvbW1hbmQoY29tbWFuZDogRENvbW1hbmQpOiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNjaGVtYVJlc3VsdCB7XG4gIHJlYWRvbmx5IGV2ZW50TG9nOiBSZWFkb25seUFycmF5PERFdmVudD47XG4gIHJlYWRvbmx5IGNvbW1hbmRMb2c6IFJlYWRvbmx5QXJyYXk8RENvbW1hbmQ+O1xuICByZWFkb25seSBhbnN3ZXJzOiBSZWFkb25seUFycmF5PGFueT47XG59XG5leHBvcnQgaW50ZXJmYWNlIElTY2hlbWFFbmdpbmUge1xuICBvbkNvbXBsZXRlKGhhbmRsZXI6IChyZXN1bHQ6IFNjaGVtYVJlc3VsdCkgPT4gdm9pZCk6IHZvaWQ7XG4gIG9uQ29tbWFuZE9yRXZlbnQoaXRlbTogREV2ZW50IHwgRENvbW1hbmQpOiB2b2lkO1xuICBzZXRTY2hlbWEoc2NoZW1hOiBTY2hlbWFEdG8pOiB2b2lkO1xuICBvbkZhdGFsRXJyb3IoaGFuZGxlcjogKGVycm9yOiB7IG1lc3NhZ2U6IHN0cmluZyB9KSA9PiB2b2lkKTogdm9pZDtcbn1cblxuZXhwb3J0IGNsYXNzIFNjaGVtYUVuZ2luZSBpbXBsZW1lbnRzIElTY2hlbWFFbmdpbmUge1xuICBwcml2YXRlIHJlYWRvbmx5IFRBRyA9IFwiWyBTQ0hFTUFfRU5HSU5FIF0gOlwiO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbW1hbmRCdXMgPSBuZXcgRENvbW1hbmRCdXMoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBldmVudEJ1cyA9IG5ldyBFdmVudEJ1cygpO1xuICBwcml2YXRlIHJlYWRvbmx5IG1lZGlhTWFuYWdlcjogRE1lZGlhTWFuYWdlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBzY2FsZTogU2NhbGVTZXJ2aWNlO1xuICBwcml2YXRlIHJlYWRvbmx5IGhvc3RFbGVtZW50OiBIVE1MRGl2RWxlbWVudDtcbiAgcHJpdmF0ZSByZWFkb25seSB1aUNvbnRhaW5lcjogSFRNTERpdkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICBwcml2YXRlIHJlYWRvbmx5IG1lZGlhQ29udGFpbmVyOiBIVE1MRGl2RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVzb3VyY2VQcm92aWRlcjogUmVzb3VyY2VQcm92aWRlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBzdGF0ZVNlcnZpY2U6IFN0YXRlU2VydmljZTtcbiAgcHJpdmF0ZSByZWFkb25seSBnbG9iYWxFdmVudFRvU3RhdGVIYW5kbGVycyA9IG5ldyBNYXA8c3RyaW5nLCBSZWFkb25seUFycmF5PFN0YXRlQ29tbWFuZD4+KCk7XG4gIHByaXZhdGUgcGxheWVyOiBEUGxheWVyO1xuICBwcml2YXRlIGN1cnJlbnRQYWdlOiBEUGFnZSB8IGZhbHNlID0gZmFsc2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3ViczogQXJyYXk8KCkgPT4gdm9pZD4gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBob3N0RWw6IEhUTUxEaXZFbGVtZW50LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgaGVpZ2h0OiBudW1iZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSB3aWR0aDogbnVtYmVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc2NoZW1hOiBTY2hlbWFEdG8sXG4gICkge1xuICAgIHRoaXMuaG9zdEVsZW1lbnQgPSBob3N0RWw7XG4gICAgdGhpcy5ob3N0RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnVpQ29udGFpbmVyKTtcbiAgICB0aGlzLmhvc3RFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMubWVkaWFDb250YWluZXIpO1xuICAgIGNvbnN0IHN0YXRlUHJvcHMgPSB0aGlzLnNjaGVtYS5zdGF0ZVByb3BzID8/IFtdO1xuICAgIGNvbnN0IHN0YXRlUXVlcmllcyA9IHRoaXMuc2NoZW1hLnN0YXRlUXVlcmllcyA/PyBbXTtcbiAgICB0aGlzLnN0YXRlU2VydmljZSA9IG5ldyBTdGF0ZVNlcnZpY2UodGhpcy5ldmVudEJ1cywgdGhpcy5jb21tYW5kQnVzLCBzdGF0ZVByb3BzLCBzdGF0ZVF1ZXJpZXMpO1xuICAgIHRoaXMuc2NhbGUgPSBuZXcgU2NhbGVTZXJ2aWNlKHtcbiAgICAgIGJhc2VIZWlnaHQ6IHNjaGVtYS5iYXNlSGVpZ2h0LFxuICAgICAgYmFzZVdpZHRoOiBzY2hlbWEuYmFzZVdpZHRoLFxuICAgICAgY29udGFpbmVyV2lkdGg6IHdpZHRoLFxuICAgICAgY29udGFpbmVySGVpZ2h0OiBoZWlnaHQsXG4gICAgfSk7XG4gICAgLy8gdGhpcy5jb21tYW5kQnVzLmxvZ0NvbW1hbmRzID0gdHJ1ZTtcbiAgICBjb25zdCBnbG9iYWxFdmVudEhhbmRsZXJzID0gc2NoZW1hLnN0YXRlRnJvbUV2ZW50ID8/IFtdO1xuXG4gICAgZ2xvYmFsRXZlbnRIYW5kbGVycy5mb3JFYWNoKChoKSA9PiB7XG4gICAgICB0aGlzLmdsb2JhbEV2ZW50VG9TdGF0ZUhhbmRsZXJzLnNldChoLm9uRXZlbnQsIGgudGhlbkV4ZWN1dGUpO1xuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzb3VyY2VzID0gU2NoZW1hRHRvLmdldFJlc291cmNlcyh0aGlzLnNjaGVtYSk7XG4gICAgdGhpcy5yZXNvdXJjZVByb3ZpZGVyID0gbmV3IFJlc291cmNlUHJvdmlkZXIoeyB2aWRlb3M6IHJlc291cmNlcy52aWRlb0xpc3QsIGF1ZGlvOiByZXNvdXJjZXMuYXVkaW9MaXN0IH0pO1xuICAgIHRoaXMubWVkaWFNYW5hZ2VyID0gbmV3IERNZWRpYU1hbmFnZXIoXG4gICAgICB0aGlzLm1lZGlhQ29udGFpbmVyLFxuICAgICAgdGhpcy5jb21tYW5kQnVzLFxuICAgICAgdGhpcy5ldmVudEJ1cyxcbiAgICAgIHRoaXMucmVzb3VyY2VQcm92aWRlcixcbiAgICAgIHRoaXMuc2NhbGUsXG4gICAgKTtcbiAgICB0aGlzLnBsYXllciA9IG5ldyBEUGxheWVyKHRoaXMuc2NoZW1hKTtcbiAgICB0aGlzLnN0eWxlU2VsZigpO1xuICAgIHRoaXMubmV4dFBhZ2UoKTtcbiAgICB0aGlzLmhvb2tVcExpc3RlbmVycygpO1xuICB9XG5cbiAgcHJpdmF0ZSBob29rVXBMaXN0ZW5lcnMoKSB7XG4gICAgY29uc3QgZXZlbnRTdWJzY3JpcHRpb24gPSB0aGlzLmV2ZW50QnVzLnN1YnNjcmliZSgoZXYpID0+IHtcbiAgICAgIHRoaXMub25Db21tYW5kT3JFdmVudChldik7XG4gICAgICBjb25zdCBnbG9iYWxIYW5kbGVycyA9IHRoaXMuZ2xvYmFsRXZlbnRUb1N0YXRlSGFuZGxlcnMuZ2V0KGV2LmtpbmQpID8/IFtdO1xuICAgICAgZ2xvYmFsSGFuZGxlcnMuZm9yRWFjaCgoc3RhdGVDb21tYW5kKSA9PiB7XG4gICAgICAgIHRoaXMuY29tbWFuZEJ1cy5lbWl0KHN0YXRlQ29tbWFuZCk7XG4gICAgICB9KTtcbiAgICB9LCB0aGlzLlRBRyArIFwiSE9PS19VUF9MSVNURU5FUlNcIik7XG4gICAgY29uc3QgY29tbWFuZFN1YnNjcmlwdGlvbiA9IHRoaXMuY29tbWFuZEJ1cy5zdWJzY3JpYmUoKGNvbW1hbmQpID0+IHtcbiAgICAgIC8vIHN3aXRjaCAoY29tbWFuZC5raW5kKSB7XG4gICAgICAvL1xuICAgICAgLy8gfVxuICAgICAgdGhpcy5vbkNvbW1hbmRPckV2ZW50KGNvbW1hbmQpO1xuICAgICAgaWYgKGNvbW1hbmQua2luZCA9PT0gXCJQQUdFX1FVRV9ORVhUX1BBR0VfQ09NTUFORFwiKSB7XG4gICAgICAgIHRoaXMubmV4dFBhZ2UoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbW1hbmQua2luZCA9PT0gXCJFTkdJTkVfTEVBVkVfUEFHRV9DT01NQU5EXCIpIHtcbiAgICAgICAgY29uc29sZS5sb2codGhpcy5UQUcgKyBcIlNFUVVFTkNFIFNUQVJURUQgLS0gVE9ETyBFVkVOVCBGT1IgVEhJUz8/XCIpO1xuICAgICAgICBjb25zb2xlLmxvZyhjb21tYW5kKTtcbiAgICAgICAgY29uc3QgcGFnZUlkID0gY29tbWFuZC5wYXlsb2FkLnBhZ2VJZDtcbiAgICAgICAgY29uc3QgZmFjdHMgPSBjb21tYW5kLnBheWxvYWQuZmFjdHNDb2xsZWN0ZWQ7XG4gICAgICAgIGNvbnN0IHRpbWVzdGFtcCA9IERUaW1lc3RhbXAubm93KCk7XG4gICAgICAgIGNvbnN0IGFuczogQW5zd2VyZWRRdWVzdGlvbltdID0gZmFjdHMubWFwKChmKSA9PiAoe1xuICAgICAgICAgIHRpbWVzdGFtcCxcbiAgICAgICAgICBmYWN0OiBmLFxuICAgICAgICB9KSk7XG4gICAgICAgIHRoaXMucGxheWVyLnNhdmVIaXN0b3J5KHtcbiAgICAgICAgICBhbnN3ZXJlZFF1ZXN0aW9uczogYW5zLFxuICAgICAgICAgIHBhZ2VJZCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5uZXh0UGFnZSgpO1xuICAgICAgICAvLyBjb25zdCBoaXN0b3J5OiBQYWdlSGlzdG9yeSA9IHsgcGFnZToge30sIGFuc3dlcmVkUXVlc3Rpb25zOiBbXSB9O1xuICAgICAgfVxuICAgIH0sIHRoaXMuVEFHKTtcblxuICAgIHRoaXMuc3Vicy5wdXNoKGNvbW1hbmRTdWJzY3JpcHRpb24pO1xuICAgIHRoaXMuc3Vicy5wdXNoKGV2ZW50U3Vic2NyaXB0aW9uKTtcbiAgfVxuXG4gIHByaXZhdGUgc3R5bGVTZWxmKCkge1xuICAgIHRoaXMuaG9zdEVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gdGhpcy5zY2FsZS5wYWdlSGVpZ2h0ICsgXCJweFwiO1xuICAgIHRoaXMuaG9zdEVsZW1lbnQuc3R5bGUud2lkdGggPSB0aGlzLnNjYWxlLnBhZ2VXaWR0aCArIFwicHhcIjtcbiAgICB0aGlzLmhvc3RFbGVtZW50LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHRoaXMuc2NoZW1hLmJhY2tncm91bmRDb2xvciA/PyBcIndoaXRlXCI7XG4gICAgdGhpcy5ob3N0RWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9IFwicmVsYXRpdmVcIjtcbiAgICAvLyB0aGlzLmhvc3RFbGVtZW50LnN0eWxlLm92ZXJmbG93ID0gXCJoaWRkZW5cIjtcbiAgICBjb25zdCBtYWtlU3RhdGljID0gKGRpdjogSFRNTERpdkVsZW1lbnQpID0+IHtcbiAgICAgIGRpdi5zdHlsZS5oZWlnaHQgPSBcIjBweFwiO1xuICAgICAgZGl2LnN0eWxlLndpZHRoID0gXCIwcHhcIjtcbiAgICAgIGRpdi5zdHlsZS5wb3NpdGlvbiA9IFwic3RhdGljXCI7XG4gICAgfTtcblxuICAgIG1ha2VTdGF0aWModGhpcy51aUNvbnRhaW5lcik7XG4gICAgbWFrZVN0YXRpYyh0aGlzLm1lZGlhQ29udGFpbmVyKTtcbiAgfVxuXG4gIHByaXZhdGUgbmV4dFBhZ2UoKSB7XG4gICAgLy8gVE9ETyBTSE9VTEQgVEhJUyBCRSBQQVJUIE9GIFRIRSBTQ0hFTUE/PyBUSElTIElTIENMRUFOVVAgTE9HSUNcbiAgICAvLyB0aGlzLmNvbW1hbmRCdXMuZW1pdCh7IGtpbmQ6IFwiVklERU9fUEFVU0VfQ09NTUFORFwiLCB0YXJnZXQ6IFwiVklERU9cIiwgdGFyZ2V0SWQ6IFwiVklERU9cIiwgcGF5bG9hZDoge30gfSk7XG4gICAgLy8gdGhpcy5jb21tYW5kQnVzLmVtaXQoeyBraW5kOiBcIkFVRElPX1BBVVNFX0NPTU1BTkRcIiwgdGFyZ2V0OiBcIkFVRElPXCIsIHRhcmdldElkOiBcIkFVRElPXCIsIHBheWxvYWQ6IHt9IH0pO1xuICAgIC8vIGNvbnN0IGN1cnJQYWdlSWQgPSB0aGlzLmN1cnJlbnRQYWdlID8gdGhpcy5jdXJyZW50UGFnZS5pZCA6IFwiTk9fUEFHRVwiO1xuICAgIC8vIGNvbnNvbGUuZ3JvdXBDb2xsYXBzZWQoXCJORVhUX1BBR0UgRlJPTTogXCIgKyBjdXJyUGFnZUlkKTtcbiAgICAvLyBjb25zb2xlLmxvZyh0aGlzLlRBRyArIFwiIE5FWFRfUEFHRSBTVEFSVEVEIEFUOiBcIiArIGN1cnJQYWdlSWQpO1xuICAgIHRoaXMubWVkaWFNYW5hZ2VyLmNsZWFyQWxsTWVkaWEoKTtcbiAgICBjb25zdCBuZXh0UGFnZSA9IHRoaXMucGxheWVyLmdldE5leHRQYWdlKCk7XG4gICAgLy8gY29uc3Qgc3RhdGUgPSB0aGlzLnN0YXRlU2VydmljZS5nZXRTdGF0ZSgpO1xuICAgIC8vIGNvbnNvbGUubG9nKHN0YXRlKTtcbiAgICAvLyBUT0RPIENMRUFOIFVQIFBBR0UgQ09NUE9ORU5UUyB0aGlzLnBhZ2UuQ2xlYW5VcCgpXG4gICAgaWYgKHRoaXMuY3VycmVudFBhZ2UpIHtcbiAgICAgIHRoaXMuY3VycmVudFBhZ2UuZGVzdHJveSgpO1xuICAgICAgdGhpcy51aUNvbnRhaW5lci5pbm5lckhUTUwgPSBcIlwiO1xuICAgIH1cbiAgICBpZiAoIW5leHRQYWdlKSB7XG4gICAgICAvLyBUT0RPIEZJR1VSRSBPVVQgV0hBUVQgVE8gRE8gQVQgRU5EIE9GIFRFU1QhISBTdGFydCBvdmVyPz9cbiAgICAgIHRoaXMucGxheWVyID0gbmV3IERQbGF5ZXIodGhpcy5zY2hlbWEpO1xuICAgICAgaWYgKHRoaXMuc2NoZW1hLnBhZ2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5uZXh0UGFnZSgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBuZXdQYWdlID0gbmV3IERQYWdlKG5leHRQYWdlLCB0aGlzLmV2ZW50QnVzLCB0aGlzLmNvbW1hbmRCdXMsIHRoaXMuc2NhbGUpO1xuXG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IG5ld1BhZ2U7XG4gICAgbmV3UGFnZS5hcHBlbmRZb3Vyc2VsZih0aGlzLnVpQ29udGFpbmVyKTtcblxuICAgIHRoaXMubWVkaWFNYW5hZ2VyLnNldFBhZ2UobmV4dFBhZ2UpO1xuICAgIGNvbnN0IHMxID0gdGhpcy5zdGF0ZVNlcnZpY2UuZ2V0U3RhdGUoKTtcbiAgICAvLyBjb25zb2xlLmxvZyhzMSk7XG4gICAgLy8gY29uc29sZS5sb2coXCJOZXh0LXBhZ2U6IFwiICsgbmV3UGFnZS5pZCk7XG4gICAgLy8gY29uc29sZS5ncm91cEVuZCgpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgZGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5jdXJyZW50UGFnZSkge1xuICAgICAgdGhpcy5jdXJyZW50UGFnZS5kZXN0cm95KCk7XG4gICAgICB0aGlzLnVpQ29udGFpbmVyLmlubmVySFRNTCA9IFwiXCI7XG4gICAgfVxuICAgIHRoaXMubWVkaWFNYW5hZ2VyLmRlc3Ryb3koKTtcbiAgICB0aGlzLnN0YXRlU2VydmljZS5kZXN0cm95KCk7XG4gICAgdGhpcy5zdWJzLmZvckVhY2goKHN1YikgPT4ge1xuICAgICAgc3ViKCk7XG4gICAgfSk7XG4gICAgY29uc3QgZXZTdGF0cyA9IHRoaXMuZXZlbnRCdXMuZ2V0U3RhdHMoKTtcbiAgICBjb25zdCBjbWRTdGF0cyA9IHRoaXMuY29tbWFuZEJ1cy5nZXRTdGF0cygpO1xuICAgIGNvbnNvbGUuYXNzZXJ0KGV2U3RhdHMuc3Vic2NyaWJlcnNDb3VudCA9PT0gMCwgdGhpcy5UQUcgKyBcIiBFdmVudGJ1cyBzaG91bGQgaGF2ZSBubyBzdWJzY3JpYmVycyBcIiwgZXZTdGF0cyk7XG4gICAgY29uc29sZS5hc3NlcnQoY21kU3RhdHMuc3Vic2NyaWJlcnNDb3VudCA9PT0gMCwgdGhpcy5UQUcgKyBcIkNvbW1hbmRidXMgc2hvdWxkIGhhdmUgbm8gc3Vic2NyaWJlcnNcIiwgY21kU3RhdHMpO1xuICB9XG4gIG9uQ29tcGxldGUoaGFuZGxlcjogKHJlc3VsdDogU2NoZW1hUmVzdWx0KSA9PiB2b2lkKSB7XG4gICAgY29uc29sZS5sb2coaGFuZGxlcik7XG4gIH1cblxuICBvbkZhdGFsRXJyb3IoaGFuZGxlcjogKGVycm9yOiB7IG1lc3NhZ2U6IHN0cmluZyB9KSA9PiB2b2lkKTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coaGFuZGxlcik7XG4gIH1cblxuICBvbkNvbW1hbmRPckV2ZW50KF9ldmVudF9vcl9jb21tYW5kOiBERXZlbnQgfCBEQ29tbWFuZCkge31cblxuICBzZXRTY2hlbWEoc2NoZW1hOiBTY2hlbWFEdG8pOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZyhzY2hlbWEpO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgRFN0YXRlIH0gZnJvbSBcIi4vRHN0YXRlXCI7XG5pbXBvcnQgeyBDb25kaXRpb24gfSBmcm9tIFwiLi4vcnVsZXMvY29uZGl0aW9uXCI7XG5pbXBvcnQgeyBTdGF0ZUNvbW1hbmQgfSBmcm9tIFwiLi4vY29tbWFuZHMvRENvbW1hbmRcIjtcblxuZXhwb3J0IGNsYXNzIEJvb2xlYW5TdGF0ZVByb3BlcnR5PFByb3BOYW1lIGV4dGVuZHMgc3RyaW5nPiB7XG4gICAgcmVhZG9ubHkgcHJvcE5hbWU6IFByb3BOYW1lO1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRSVUUgPSB7IHZhbHVlOiAxLCBsYWJlbDogXCJUUlVFXCIgfTtcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBGQUxTRSA9IHsgdmFsdWU6IDAsIGxhYmVsOiBcIkZBTFNFXCIgfTtcbiAgICByZWFkb25seSBwcm9wRGVmaW5pdGlvbjogRFN0YXRlLk51bWVyaWNQcm9wO1xuXG4gICAgZ2V0SXNUcnVlQ29uZGl0aW9uKCk6IENvbmRpdGlvbi5OdW1lcmljIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGtpbmQ6IFwibnVtZXJpYy1jb25kaXRpb25cIixcbiAgICAgICAgICAgIHJlZmVyZW5jZUlkOiB0aGlzLnByb3BOYW1lLFxuICAgICAgICAgICAgcmVmZXJlbmNlTGFiZWw6IHRoaXMucHJvcE5hbWUgKyBcIlsgQk9PTEVBTiBdXCIsXG4gICAgICAgICAgICB2YWx1ZUxhYmVsOiBCb29sZWFuU3RhdGVQcm9wZXJ0eS5UUlVFLmxhYmVsLFxuICAgICAgICAgICAgdmFsdWU6IEJvb2xlYW5TdGF0ZVByb3BlcnR5LlRSVUUudmFsdWUsXG4gICAgICAgICAgICBvcGVyYXRvcjogXCJlcVwiLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBnZXRJc0ZhbHNlQ29uZGl0aW9uKCk6IENvbmRpdGlvbi5OdW1lcmljIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGtpbmQ6IFwibnVtZXJpYy1jb25kaXRpb25cIixcbiAgICAgICAgICAgIHJlZmVyZW5jZUlkOiB0aGlzLnByb3BOYW1lLFxuICAgICAgICAgICAgcmVmZXJlbmNlTGFiZWw6IHRoaXMucHJvcE5hbWUgKyBcIlsgQk9PTEVBTiBdXCIsXG4gICAgICAgICAgICB2YWx1ZUxhYmVsOiBCb29sZWFuU3RhdGVQcm9wZXJ0eS5GQUxTRS5sYWJlbCxcbiAgICAgICAgICAgIHZhbHVlOiBCb29sZWFuU3RhdGVQcm9wZXJ0eS5GQUxTRS52YWx1ZSxcbiAgICAgICAgICAgIG9wZXJhdG9yOiBcImVxXCIsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZ2V0U2V0VHJ1ZUNvbW1hbmQoKTogU3RhdGVDb21tYW5kIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGtpbmQ6IFwiU1RBVEVfTVVUQVRFX0NPTU1BTkRcIixcbiAgICAgICAgICAgIHRhcmdldDogXCJTVEFURVwiLFxuICAgICAgICAgICAgdGFyZ2V0SWQ6IFwiU1RBVEVcIixcbiAgICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgICAgICBtdXRhdGlvbjogeyBwcm9wTmFtZTogdGhpcy5wcm9wTmFtZSwga2luZDogXCJzZXQtbnVtYmVyXCIsIHZhbHVlOiAxIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGdldFNldEZhbHNlQ29tbWFuZCgpOiBTdGF0ZUNvbW1hbmQge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAga2luZDogXCJTVEFURV9NVVRBVEVfQ09NTUFORFwiLFxuICAgICAgICAgICAgdGFyZ2V0OiBcIlNUQVRFXCIsXG4gICAgICAgICAgICB0YXJnZXRJZDogXCJTVEFURVwiLFxuICAgICAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgICAgIG11dGF0aW9uOiB7IHByb3BOYW1lOiB0aGlzLnByb3BOYW1lLCBraW5kOiBcInNldC1udW1iZXJcIiwgdmFsdWU6IDAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IocHJvcE5hbWU6IFByb3BOYW1lLCBwcml2YXRlIHJlYWRvbmx5IGluaXRpYWxWYWx1ZTogYm9vbGVhbiwgZGVzY3JpcHRpb246IHN0cmluZykge1xuICAgICAgICB0aGlzLnByb3BOYW1lID0gcHJvcE5hbWU7XG4gICAgICAgIGNvbnN0IGluaXRpYWwgPSBpbml0aWFsVmFsdWUgPyAxIDogMDtcbiAgICAgICAgY29uc3QgcHJvcERlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24gPyBkZXNjcmlwdGlvbiA6IFwiTm8gZGVzY3JpcHRpb24gZ2l2ZW5cIjtcbiAgICAgICAgdGhpcy5wcm9wRGVmaW5pdGlvbiA9IHtcbiAgICAgICAgICAgIHByb3BEZXNjcmlwdGlvbixcbiAgICAgICAgICAgIHByb3BOYW1lOiBwcm9wTmFtZSxcbiAgICAgICAgICAgIGluaXRpYWxWYWx1ZTogaW5pdGlhbCxcbiAgICAgICAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgICAgICAgICB7IHZhbHVlOiBCb29sZWFuU3RhdGVQcm9wZXJ0eS5GQUxTRS52YWx1ZSwgdmFsdWVMYWJlbDogQm9vbGVhblN0YXRlUHJvcGVydHkuRkFMU0UubGFiZWwgfSxcbiAgICAgICAgICAgICAgICB7IHZhbHVlOiBCb29sZWFuU3RhdGVQcm9wZXJ0eS5UUlVFLnZhbHVlLCB2YWx1ZUxhYmVsOiBCb29sZWFuU3RhdGVQcm9wZXJ0eS5UUlVFLmxhYmVsIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgX3R5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgIH07XG4gICAgfVxufVxuIiwgIi8vIFRoZSBkZWZhdWx0IGxlbmd0aCBvZiBhbiBJRFxuY29uc3QgSURfTEVOR1RIID0gMzI7XG5cbi8vIFRoZSBtaW5pbXVtIGxlbmd0aCBvZiBhbiBJRFxuY29uc3QgTUlOX0xFTkdUSCA9IDEwO1xuXG5leHBvcnQgdHlwZSBJRDxCIGV4dGVuZHMgc3RyaW5nPiA9IHN0cmluZyAmIHsgX19JRF9fOiBCIH07XG5cbmNvbnN0IGlzSUQgPSA8Y29uc3QgQiBleHRlbmRzIHN0cmluZz4oaWROYW1lOiBCLCBpZD86IHN0cmluZyk6IGlkIGlzIElEPEI+ID0+IHtcbiAgaWYgKHR5cGVvZiBpZCAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gaWQubGVuZ3RoID49IE1JTl9MRU5HVEg7XG59O1xuXG5jb25zdCBjcmVhdGVJRCA9IDxjb25zdCBCIGV4dGVuZHMgc3RyaW5nPihpZE5hbWU6IEIpOiBJRDxCPiA9PiB7XG4gIGNvbnN0IGxldHRlcnMgPSBcImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ5elwiO1xuICBjb25zdCBhbGwgPSBsZXR0ZXJzICsgbGV0dGVycy50b1VwcGVyQ2FzZSgpO1xuICBsZXQgcmVzdWx0ID0gXCJcIjtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBJRF9MRU5HVEg7IGkrKykge1xuICAgIGNvbnN0IGNoYXIgPSBhbGwuY2hhckF0KE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGFsbC5sZW5ndGgpKTtcbiAgICByZXN1bHQgKz0gY2hhcjtcbiAgfVxuICByZXR1cm4gcmVzdWx0IGFzIElEPEI+O1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgb2JqZWN0IHdpdGggaGVscGVyIGZ1bmN0aW9ucyBmb3IgYSBzcGVjaWZpYyBJRCB0eXBlXG4gKiBAcGFyYW0gaWROYW1lXG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVUeXBlZElkU2luZ2xldG9uID0gPGNvbnN0IEIgZXh0ZW5kcyBzdHJpbmc+KGlkTmFtZTogQikgPT4ge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBJRCBvZiB0aGUgY29ycmVjdCB0eXBlXG4gICAqL1xuICBjb25zdCBjcmVhdGUgPSAoKTogSUQ8Qj4gPT4gY3JlYXRlSUQoaWROYW1lKTtcblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBpZCBpcyBvZiB0aGUgY29ycmVjdCB0eXBlXG4gICAqIEBwYXJhbSBpZFxuICAgKi9cbiAgY29uc3QgaXMgPSAoaWQ6IHN0cmluZyk6IGlkIGlzIElEPEI+ID0+IGlzSUQoaWROYW1lLCBpZCk7XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgaWQgaXMgb2YgdGhlIGNvcnJlY3QgdHlwZSwgaWYgbm90IGl0IHRocm93cyBhbiBlcnJvclxuICAgKiBAcGFyYW0gaWRcbiAgICovXG4gIGNvbnN0IHZhbGlkYXRlT3JUaHJvdyA9IChpZDogc3RyaW5nKTogSUQ8Qj4gPT4ge1xuICAgIGlmICghaXMoaWQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgaWQ6ICR7aWR9YCk7XG4gICAgfVxuICAgIHJldHVybiBpZDtcbiAgfTtcblxuICAvKipcbiAgICogVGhlIGxvd2VyY2FzZSBuYW1lIG9mIHRoZSBpZCAoU0NIRU1BLCBQQUdFLCBldGMpXG4gICAqL1xuICBjb25zdCBuYW1lOiBCID0gaWROYW1lO1xuXG4gIC8qKlxuICAgKiBFbnN1cmVzIHRoYXQgdGhlIGlkIGlzIG9mIHRoZSBjb3JyZWN0IHR5cGUsIGlmIG5vdCBpdCBjcmVhdGVzIGEgbmV3IG9uZVxuICAgKiBAcGFyYW0gaWRcbiAgICovXG4gIGNvbnN0IGVuc3VyZSA9IChpZDogc3RyaW5nKTogSUQ8Qj4gPT4ge1xuICAgIHJldHVybiBpcyhpZCkgPyBpZCA6IGNyZWF0ZSgpO1xuICB9O1xuXG4gIHJldHVybiBPYmplY3QuZnJlZXplKHsgY3JlYXRlLCBpcywgZW5zdXJlLCB2YWxpZGF0ZU9yVGhyb3csIG5hbWUgfSk7XG59O1xuXG5leHBvcnQgdHlwZSBTY2hlbWFJRCA9IElEPFwiU0NIRU1BXCI+O1xuZXhwb3J0IGNvbnN0IFNjaGVtYUlEID0gY3JlYXRlVHlwZWRJZFNpbmdsZXRvbihcIlNDSEVNQVwiKTtcbmV4cG9ydCB0eXBlIFBhZ2VJRCA9IElEPFwiUEFHRVwiPjtcbmV4cG9ydCBjb25zdCBQYWdlSUQgPSBjcmVhdGVUeXBlZElkU2luZ2xldG9uKFwiUEFHRVwiKTtcbiJdLAogICJtYXBwaW5ncyI6ICI7QUF3Q08sSUFBVTtBQUFBLENBQVYsQ0FBVUEsZUFBVjtBQUNFLEVBQU1BLFdBQUEsZUFBZSxDQUMxQixXQUtHO0FBQ0gsVUFBTSxFQUFFLE1BQU0sSUFBSTtBQUNsQixVQUFNLFlBQVksTUFBTSxPQUF5QixDQUFDLEtBQUssU0FBUztBQUM5RCxVQUFJLE1BQU0sUUFBUSxLQUFLLEtBQUssR0FBRztBQUM3QixZQUFJLEtBQUssR0FBRyxLQUFLLEtBQUs7QUFBQSxNQUN4QjtBQUNBLGFBQU87QUFBQSxJQUNULEdBQUcsQ0FBQyxDQUFDO0FBQ0wsVUFBTSxZQUE4QixNQUFNLE9BQXlCLENBQUMsS0FBSyxTQUFTO0FBQ2hGLFVBQUksTUFBTSxRQUFRLEtBQUssS0FBSyxHQUFHO0FBQzdCLFlBQUksS0FBSyxHQUFHLEtBQUssS0FBSztBQUFBLE1BQ3hCO0FBQ0EsYUFBTztBQUFBLElBQ1QsR0FBRyxDQUFD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QUc7QUFDWCxZQUFNLElBQUksTUFBTSxlQUFlLEVBQUUsRUFBRTtBQUFBLElBQ3JDO0FBQ0EsV0FBTztBQUFBLEVBQ1Q7QUFLQSxRQUFNLE9BQVU7QUFNaEIsUUFBTSxTQUFTLENBQUMsT0FBc0I7QUFDcEMsV0FBTyxHQUFHLEVBQUUsSUFBSSxLQUFLLE9BQU87QUFBQSxFQUM5QjtBQUVBLFNBQU8sT0FBTyxPQUFPLEVBQUUsUUFBUSxJQUFJLFFBQVEsaUJBQWlCLEtBQUssQ0FBQztBQUNwRTtBQUdPLElBQU0sV0FBVyx1QkFBdUIsUUFBUTtBQUVoRCxJQUFNLFNBQVMsdUJBQXVCLE1BQU07IiwKICAibmFtZXMiOiBbIlNjaGVtYUR0byIsICJEVGltZXN0YW1wIiwgIkRVdGlsIiwgImlzTnVtYmVyIiwgIkRDc3MiLCAiRFN0eWxlIiwgIkFuc3dlcmVkUXVlc3Rpb24iLCAiQ29uZGl0aW9uIiwgImNvbmRpdGlvbiIsICJSdWxlIiwgInRhZyIsICJERXZlbnRIYW5kbGVyIiwgImR0byIsICJkdG8iLCAiU2NhbGUiLCAiUmVzdWx0IiwgIkRTdGF0ZSJdCn0K