obsidian-native-mcp 1.0.2 → 1.0.3

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.
@@ -37,6 +37,35 @@ var import_obsidian2 = require("obsidian");
37
37
 
38
38
  // src/mcp/http-transport.ts
39
39
  var import_http = __toESM(require("http"));
40
+
41
+ // src/utils/log.ts
42
+ function createLogger(component) {
43
+ return {
44
+ debug: (message, fields) => writeLog("DEBUG", component, message, fields),
45
+ info: (message, fields) => writeLog("INFO", component, message, fields),
46
+ warn: (message, fields) => writeLog("WARN", component, message, fields),
47
+ error: (message, fields) => writeLog("ERROR", component, message, fields)
48
+ };
49
+ }
50
+ function formatError(err) {
51
+ if (err instanceof Error) return err.stack || err.message;
52
+ return String(err);
53
+ }
54
+ function writeLog(level, component, message, fields = {}) {
55
+ const serializedFields = Object.entries(fields).filter(([, value]) => value !== void 0).map(([key, value]) => `${key}=${JSON.stringify(value)}`).join(" ");
56
+ const line = [
57
+ (/* @__PURE__ */ new Date()).toISOString(),
58
+ level,
59
+ `component=${component}`,
60
+ message,
61
+ serializedFields
62
+ ].filter(Boolean).join(" ");
63
+ process.stderr.write(`${line}
64
+ `);
65
+ }
66
+
67
+ // src/mcp/http-transport.ts
68
+ var log = createLogger("http");
40
69
  var HttpTransport = class {
41
70
  requestHandler = null;
42
71
  server = null;
@@ -54,16 +83,20 @@ var HttpTransport = class {
54
83
  sendMessage(_message) {
55
84
  }
56
85
  start() {
57
- return new Promise((resolve2) => {
86
+ return new Promise((resolve2, reject) => {
58
87
  this.server = import_http.default.createServer((req, res) => {
59
88
  this.handleRequest(req, res);
60
89
  });
90
+ this.server.on("error", (err) => {
91
+ log.error("http transport failed", { error: formatError(err) });
92
+ reject(err);
93
+ });
61
94
  this.server.listen(0, "127.0.0.1", () => {
62
95
  const addr = this.server.address();
63
96
  if (addr && typeof addr === "object") {
64
97
  this.port = addr.port;
65
98
  }
66
- console.error(`MCP HTTP server listening on http://127.0.0.1:${this.port}`);
99
+ log.info("http transport ready", { url: this.url });
67
100
  resolve2();
68
101
  });
69
102
  });
@@ -90,6 +123,10 @@ var HttpTransport = class {
90
123
  } else if (req.method === "POST" && url.pathname === "/message") {
91
124
  this.handleMessage(req, res);
92
125
  } else {
126
+ log.warn("received request for unknown route", {
127
+ method: req.method || "UNKNOWN",
128
+ path: url.pathname
129
+ });
93
130
  res.writeHead(404);
94
131
  res.end("Not found");
95
132
  }
@@ -106,15 +143,18 @@ var HttpTransport = class {
106
143
  data: ${messageUrl}
107
144
 
108
145
  `);
146
+ log.info("sse session opened", { sessionId });
109
147
  this.sessions.set(sessionId, res);
110
148
  req.on("close", () => {
111
149
  this.sessions.delete(sessionId);
150
+ log.info("sse session closed", { sessionId });
112
151
  });
113
152
  }
114
153
  handleMessage(req, res) {
115
154
  const url = new URL(req.url || "/", `http://${req.headers.host || "localhost"}`);
116
155
  const sessionId = url.searchParams.get("session_id");
117
156
  if (!sessionId || !this.sessions.has(sessionId)) {
157
+ log.warn("rejected message for unknown session", { sessionId: sessionId || null });
118
158
  res.writeHead(400);
119
159
  res.end("Invalid or missing session_id");
120
160
  return;
@@ -127,6 +167,7 @@ data: ${messageUrl}
127
167
  try {
128
168
  const msg = JSON.parse(body);
129
169
  if (msg.jsonrpc !== "2.0" || !("method" in msg) || !("id" in msg)) {
170
+ log.warn("rejected invalid json-rpc payload", { sessionId });
130
171
  res.writeHead(400);
131
172
  res.end("Invalid JSON-RPC message");
132
173
  return;
@@ -143,7 +184,11 @@ data: ${JSON.stringify(response)}
143
184
  }
144
185
  res.writeHead(202);
145
186
  res.end();
146
- } catch {
187
+ } catch (err) {
188
+ log.error("failed to handle http message", {
189
+ sessionId,
190
+ error: formatError(err)
191
+ });
147
192
  res.writeHead(400);
148
193
  res.end("Invalid JSON");
149
194
  }
@@ -700,6 +745,7 @@ function parsePromptParameters(content) {
700
745
  }
701
746
 
702
747
  // src/mcp/server.ts
748
+ var log2 = createLogger("server");
703
749
  var vaultParam = {
704
750
  vault: {
705
751
  type: "string",
@@ -870,6 +916,10 @@ function createServer(registry) {
870
916
  switch (method) {
871
917
  case "initialize": {
872
918
  const clientProtocol = params?.protocolVersion;
919
+ log2.info("client initialized", {
920
+ clientProtocol: clientProtocol || "2024-11-05",
921
+ vaultCount: vaultList.length
922
+ });
873
923
  return {
874
924
  jsonrpc: "2.0",
875
925
  id,
@@ -901,6 +951,10 @@ function createServer(registry) {
901
951
  const result = await handler(args);
902
952
  return { jsonrpc: "2.0", id, result };
903
953
  } catch (err) {
954
+ log2.error("tool call failed", {
955
+ tool: String(toolName),
956
+ error: formatError(err)
957
+ });
904
958
  return {
905
959
  jsonrpc: "2.0",
906
960
  id,
@@ -914,6 +968,7 @@ function createServer(registry) {
914
968
  const promptList = await promptHandler.list(promptVault);
915
969
  return { jsonrpc: "2.0", id, result: { prompts: promptList } };
916
970
  } catch (err) {
971
+ log2.error("prompt listing failed", { error: formatError(err) });
917
972
  return {
918
973
  jsonrpc: "2.0",
919
974
  id,
@@ -927,6 +982,10 @@ function createServer(registry) {
927
982
  const result = await promptHandler.get(params?.name, promptVault);
928
983
  return { jsonrpc: "2.0", id, result };
929
984
  } catch (err) {
985
+ log2.error("prompt fetch failed", {
986
+ prompt: typeof params?.name === "string" ? params.name : "",
987
+ error: formatError(err)
988
+ });
930
989
  return {
931
990
  jsonrpc: "2.0",
932
991
  id,
@@ -939,6 +998,7 @@ function createServer(registry) {
939
998
  case "notifications/roots/list_changed":
940
999
  return null;
941
1000
  default:
1001
+ log2.warn("method not found", { method });
942
1002
  return {
943
1003
  jsonrpc: "2.0",
944
1004
  id,
@@ -956,12 +1016,15 @@ var import_fs4 = require("fs");
956
1016
  var IS_WIN = (0, import_os.platform)() === "win32";
957
1017
  var VaultRegistry = class {
958
1018
  vaults = /* @__PURE__ */ new Map();
1019
+ source = "none";
959
1020
  constructor() {
960
1021
  const fromEnv = this.parseEnv();
961
1022
  const fromConfig = this.parseConfigFile();
962
1023
  if (fromEnv.length > 0) {
1024
+ this.source = "env";
963
1025
  for (const v of fromEnv) this.vaults.set(v.name, v.path);
964
1026
  } else if (fromConfig.length > 0) {
1027
+ this.source = "config";
965
1028
  for (const v of fromConfig) this.vaults.set(v.name, v.path);
966
1029
  }
967
1030
  }
@@ -970,6 +1033,7 @@ var VaultRegistry = class {
970
1033
  for (const v of vaults) {
971
1034
  this.vaults.set(v.name, v.path);
972
1035
  }
1036
+ this.source = vaults.length > 0 ? "config" : "none";
973
1037
  }
974
1038
  static discoverFromObsidian() {
975
1039
  const configPath = obsidianConfigPath();
@@ -999,15 +1063,27 @@ var VaultRegistry = class {
999
1063
  if (this.vaults.size === 1) {
1000
1064
  return this.vaults.values().next().value;
1001
1065
  }
1066
+ if (this.vaults.size === 0) {
1067
+ throw new Error(
1068
+ "No vaults configured. Set OBSIDIAN_VAULT_PATHS or ~/.config/obsidian-native-mcp/vaults.json."
1069
+ );
1070
+ }
1002
1071
  const available = this.list().map((v) => v.name).join(", ");
1003
1072
  throw new Error(`Multiple vaults configured but no vault specified. Choose one: ${available}`);
1004
1073
  }
1074
+ getSource() {
1075
+ return this.source;
1076
+ }
1005
1077
  list() {
1006
1078
  return Array.from(this.vaults.entries()).map(([name, path]) => ({
1007
1079
  name,
1008
1080
  path
1009
1081
  }));
1010
1082
  }
1083
+ validate() {
1084
+ const missing = this.list().filter((vault) => !(0, import_fs4.existsSync)(vault.path));
1085
+ return { missing };
1086
+ }
1011
1087
  info(name) {
1012
1088
  const vaultPath = this.resolve(name);
1013
1089
  let fileCount = 0;
@@ -1135,6 +1211,7 @@ var NativeMcpSettingTab = class extends import_obsidian.PluginSettingTab {
1135
1211
  };
1136
1212
 
1137
1213
  // src/plugin/main.ts
1214
+ var log3 = createLogger("plugin");
1138
1215
  var DEFAULT_SETTINGS = {
1139
1216
  selectedVaults: []
1140
1217
  };
@@ -1145,6 +1222,10 @@ var NativeMcpPlugin = class extends import_obsidian2.Plugin {
1145
1222
  async onload() {
1146
1223
  await this.loadSettings();
1147
1224
  const allVaults = VaultRegistry.discoverFromObsidian();
1225
+ log3.info("plugin loading", {
1226
+ discoveredVaultCount: allVaults.length,
1227
+ selectedVaultCount: this.settings.selectedVaults.length
1228
+ });
1148
1229
  if (this.settings.selectedVaults.length > 0) {
1149
1230
  const selected = allVaults.filter((v) => this.settings.selectedVaults.includes(v.name));
1150
1231
  if (selected.length > 0) {
@@ -1153,18 +1234,31 @@ var NativeMcpPlugin = class extends import_obsidian2.Plugin {
1153
1234
  }
1154
1235
  if (this.registry.list().length > 0) {
1155
1236
  await this.startServer();
1237
+ } else {
1238
+ log3.warn("plugin started without active vaults", {
1239
+ hint: "Select at least one vault in plugin settings"
1240
+ });
1156
1241
  }
1157
1242
  this.addSettingTab(new NativeMcpSettingTab(this.app, this));
1158
1243
  }
1159
1244
  async startServer() {
1160
1245
  this.transport?.close();
1246
+ const vaults = this.registry.list();
1247
+ log3.info("starting plugin transport", { vaultCount: vaults.length });
1161
1248
  const server = createServer(this.registry);
1162
1249
  this.transport = new HttpTransport();
1163
1250
  this.transport.onRequest(async (msg) => server.handleRequest(msg));
1164
- await this.transport.start();
1251
+ try {
1252
+ await this.transport.start();
1253
+ } catch (err) {
1254
+ log3.error("failed to start plugin transport", { error: formatError(err) });
1255
+ throw err;
1256
+ }
1165
1257
  }
1166
1258
  restartServer() {
1167
- this.startServer();
1259
+ void this.startServer().catch((err) => {
1260
+ log3.error("failed to restart plugin transport", { error: formatError(err) });
1261
+ });
1168
1262
  }
1169
1263
  getServerUrl() {
1170
1264
  return this.transport?.url ?? null;
@@ -1187,15 +1281,18 @@ var NativeMcpPlugin = class extends import_obsidian2.Plugin {
1187
1281
  const allVaults = VaultRegistry.discoverFromObsidian();
1188
1282
  const selected = allVaults.filter((v) => names.includes(v.name));
1189
1283
  this.registry.configure(selected);
1284
+ log3.info("updated selected vaults", { selectedVaultCount: selected.length });
1190
1285
  if (selected.length > 0) {
1191
1286
  await this.startServer();
1192
1287
  } else {
1193
1288
  this.transport?.close();
1194
1289
  this.transport = null;
1290
+ log3.warn("stopped plugin transport because no vaults are selected");
1195
1291
  }
1196
1292
  }
1197
1293
  onunload() {
1198
1294
  this.transport?.close();
1295
+ log3.info("plugin unloaded");
1199
1296
  }
1200
1297
  };
1201
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL3BsdWdpbi9tYWluLnRzIiwgIi4uLy4uL3NyYy9tY3AvaHR0cC10cmFuc3BvcnQudHMiLCAiLi4vLi4vc3JjL3V0aWxzL2ZzLXV0aWxzLnRzIiwgIi4uLy4uL3NyYy91dGlscy9zZWFyY2gudHMiLCAiLi4vLi4vc3JjL2hhbmRsZXJzL3Rvb2xzLnRzIiwgIi4uLy4uL3NyYy9oYW5kbGVycy9wcm9tcHRzLnRzIiwgIi4uLy4uL3NyYy9tY3Avc2VydmVyLnRzIiwgIi4uLy4uL3NyYy91dGlscy92YXVsdHMudHMiLCAiLi4vLi4vc3JjL3BsdWdpbi9zZXR0aW5ncy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgUGx1Z2luIH0gZnJvbSBcIm9ic2lkaWFuXCI7XG5pbXBvcnQgeyBIdHRwVHJhbnNwb3J0IH0gZnJvbSBcIi4uL21jcC9odHRwLXRyYW5zcG9ydFwiO1xuaW1wb3J0IHsgY3JlYXRlU2VydmVyIH0gZnJvbSBcIi4uL21jcC9zZXJ2ZXJcIjtcbmltcG9ydCB7IFZhdWx0UmVnaXN0cnkgfSBmcm9tIFwiLi4vdXRpbHMvdmF1bHRzXCI7XG5pbXBvcnQgeyBOYXRpdmVNY3BTZXR0aW5nVGFiIH0gZnJvbSBcIi4vc2V0dGluZ3NcIjtcblxuaW50ZXJmYWNlIFBsdWdpblNldHRpbmdzIHtcbiAgc2VsZWN0ZWRWYXVsdHM6IHN0cmluZ1tdO1xufVxuXG5jb25zdCBERUZBVUxUX1NFVFRJTkdTOiBQbHVnaW5TZXR0aW5ncyA9IHtcbiAgc2VsZWN0ZWRWYXVsdHM6IFtdLFxufTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTmF0aXZlTWNwUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHtcbiAgcHJpdmF0ZSB0cmFuc3BvcnQ6IEh0dHBUcmFuc3BvcnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzZXR0aW5nczogUGx1Z2luU2V0dGluZ3MgPSBERUZBVUxUX1NFVFRJTkdTO1xuICBwcml2YXRlIHJlZ2lzdHJ5ID0gbmV3IFZhdWx0UmVnaXN0cnkoKTtcblxuICBhc3luYyBvbmxvYWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5sb2FkU2V0dGluZ3MoKTtcblxuICAgIGNvbnN0IGFsbFZhdWx0cyA9IFZhdWx0UmVnaXN0cnkuZGlzY292ZXJGcm9tT2JzaWRpYW4oKTtcblxuICAgIGlmICh0aGlzLnNldHRpbmdzLnNlbGVjdGVkVmF1bHRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkID0gYWxsVmF1bHRzLmZpbHRlcigodikgPT4gdGhpcy5zZXR0aW5ncy5zZWxlY3RlZFZhdWx0cy5pbmNsdWRlcyh2Lm5hbWUpKTtcbiAgICAgIGlmIChzZWxlY3RlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMucmVnaXN0cnkuY29uZmlndXJlKHNlbGVjdGVkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5yZWdpc3RyeS5saXN0KCkubGVuZ3RoID4gMCkge1xuICAgICAgYXdhaXQgdGhpcy5zdGFydFNlcnZlcigpO1xuICAgIH1cblxuICAgIHRoaXMuYWRkU2V0dGluZ1RhYihuZXcgTmF0aXZlTWNwU2V0dGluZ1RhYih0aGlzLmFwcCwgdGhpcykpO1xuICB9XG5cbiAgYXN5bmMgc3RhcnRTZXJ2ZXIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy50cmFuc3BvcnQ/LmNsb3NlKCk7XG5cbiAgICBjb25zdCBzZXJ2ZXIgPSBjcmVhdGVTZXJ2ZXIodGhpcy5yZWdpc3RyeSk7XG4gICAgdGhpcy50cmFuc3BvcnQgPSBuZXcgSHR0cFRyYW5zcG9ydCgpO1xuICAgIHRoaXMudHJhbnNwb3J0Lm9uUmVxdWVzdChhc3luYyAobXNnKSA9PiBzZXJ2ZXIuaGFuZGxlUmVxdWVzdChtc2cpKTtcbiAgICBhd2FpdCB0aGlzLnRyYW5zcG9ydC5zdGFydCgpO1xuICB9XG5cbiAgcmVzdGFydFNlcnZlcigpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXJ0U2VydmVyKCk7XG4gIH1cblxuICBnZXRTZXJ2ZXJVcmwoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNwb3J0Py51cmwgPz8gbnVsbDtcbiAgfVxuXG4gIGdldFJlZ2lzdHJ5KCk6IFZhdWx0UmVnaXN0cnkge1xuICAgIHJldHVybiB0aGlzLnJlZ2lzdHJ5O1xuICB9XG5cbiAgYXN5bmMgbG9hZFNldHRpbmdzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuc2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKHt9LCBERUZBVUxUX1NFVFRJTkdTLCBhd2FpdCB0aGlzLmxvYWREYXRhKCkpO1xuICB9XG5cbiAgYXN5bmMgc2F2ZVNldHRpbmdzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuc2F2ZURhdGEodGhpcy5zZXR0aW5ncyk7XG4gIH1cblxuICBnZXRTZXR0aW5ncygpOiBQbHVnaW5TZXR0aW5ncyB7XG4gICAgcmV0dXJuIHRoaXMuc2V0dGluZ3M7XG4gIH1cblxuICBhc3luYyB1cGRhdGVTZWxlY3RlZFZhdWx0cyhuYW1lczogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnNldHRpbmdzLnNlbGVjdGVkVmF1bHRzID0gbmFtZXM7XG4gICAgYXdhaXQgdGhpcy5zYXZlU2V0dGluZ3MoKTtcblxuICAgIGNvbnN0IGFsbFZhdWx0cyA9IFZhdWx0UmVnaXN0cnkuZGlzY292ZXJGcm9tT2JzaWRpYW4oKTtcbiAgICBjb25zdCBzZWxlY3RlZCA9IGFsbFZhdWx0cy5maWx0ZXIoKHYpID0+IG5hbWVzLmluY2x1ZGVzKHYubmFtZSkpO1xuICAgIHRoaXMucmVnaXN0cnkuY29uZmlndXJlKHNlbGVjdGVkKTtcblxuICAgIGlmIChzZWxlY3RlZC5sZW5ndGggPiAwKSB7XG4gICAgICBhd2FpdCB0aGlzLnN0YXJ0U2VydmVyKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudHJhbnNwb3J0Py5jbG9zZSgpO1xuICAgICAgdGhpcy50cmFuc3BvcnQgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIG9udW5sb2FkKCk6IHZvaWQge1xuICAgIHRoaXMudHJhbnNwb3J0Py5jbG9zZSgpO1xuICB9XG59XG4iLCAiaW1wb3J0IGh0dHAgZnJvbSBcImh0dHBcIjtcbmltcG9ydCB0eXBlIHsgSlNPTlJQQ1JlcXVlc3QsIEpTT05SUENSZXNwb25zZSB9IGZyb20gXCIuL3Byb3RvY29sXCI7XG5cbmV4cG9ydCBjbGFzcyBIdHRwVHJhbnNwb3J0IHtcbiAgcHJpdmF0ZSByZXF1ZXN0SGFuZGxlcjogKChyZXF1ZXN0OiBKU09OUlBDUmVxdWVzdCkgPT4gUHJvbWlzZTxKU09OUlBDUmVzcG9uc2UgfCBudWxsPikgfCBudWxsID1cbiAgICBudWxsO1xuICBwcml2YXRlIHNlcnZlcjogaHR0cC5TZXJ2ZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzZXNzaW9ucyA9IG5ldyBNYXA8c3RyaW5nLCBodHRwLlNlcnZlclJlc3BvbnNlPigpO1xuICBwcml2YXRlIHBvcnQgPSAwO1xuXG4gIGdldCB1cmwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYGh0dHA6Ly8xMjcuMC4wLjE6JHt0aGlzLnBvcnR9L3NzZWA7XG4gIH1cblxuICBnZXQgYWN0dWFsUG9ydCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnBvcnQ7XG4gIH1cblxuICBvblJlcXVlc3QoaGFuZGxlcjogKHJlcXVlc3Q6IEpTT05SUENSZXF1ZXN0KSA9PiBQcm9taXNlPEpTT05SUENSZXNwb25zZSB8IG51bGw+KTogdm9pZCB7XG4gICAgdGhpcy5yZXF1ZXN0SGFuZGxlciA9IGhhbmRsZXI7XG4gIH1cblxuICBzZW5kTWVzc2FnZShfbWVzc2FnZTogSlNPTlJQQ1Jlc3BvbnNlKTogdm9pZCB7XG4gICAgLy8gTWVzc2FnZXMgc2VudCBiYWNrIHZpYSBTU0UgcmVzcG9uc2UsIG5vdCBkaXJlY3RseVxuICB9XG5cbiAgc3RhcnQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICB0aGlzLnNlcnZlciA9IGh0dHAuY3JlYXRlU2VydmVyKChyZXEsIHJlcykgPT4ge1xuICAgICAgICB0aGlzLmhhbmRsZVJlcXVlc3QocmVxLCByZXMpO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuc2VydmVyLmxpc3RlbigwLCBcIjEyNy4wLjAuMVwiLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGFkZHIgPSB0aGlzLnNlcnZlciEuYWRkcmVzcygpO1xuICAgICAgICBpZiAoYWRkciAmJiB0eXBlb2YgYWRkciA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgIHRoaXMucG9ydCA9IGFkZHIucG9ydDtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmVycm9yKGBNQ1AgSFRUUCBzZXJ2ZXIgbGlzdGVuaW5nIG9uIGh0dHA6Ly8xMjcuMC4wLjE6JHt0aGlzLnBvcnR9YCk7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgY2xvc2UoKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCByZXMgb2YgdGhpcy5zZXNzaW9ucy52YWx1ZXMoKSkge1xuICAgICAgcmVzLmVuZCgpO1xuICAgIH1cbiAgICB0aGlzLnNlc3Npb25zLmNsZWFyKCk7XG4gICAgdGhpcy5zZXJ2ZXI/LmNsb3NlKCk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVJlcXVlc3QocmVxOiBodHRwLkluY29taW5nTWVzc2FnZSwgcmVzOiBodHRwLlNlcnZlclJlc3BvbnNlKTogdm9pZCB7XG4gICAgLy8gQ09SUyBoZWFkZXJzIGZvciBDbGF1ZGUgRGVza3RvcFxuICAgIHJlcy5zZXRIZWFkZXIoXCJBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW5cIiwgXCIqXCIpO1xuICAgIHJlcy5zZXRIZWFkZXIoXCJBY2Nlc3MtQ29udHJvbC1BbGxvdy1NZXRob2RzXCIsIFwiR0VULCBQT1NULCBPUFRJT05TXCIpO1xuICAgIHJlcy5zZXRIZWFkZXIoXCJBY2Nlc3MtQ29udHJvbC1BbGxvdy1IZWFkZXJzXCIsIFwiQ29udGVudC1UeXBlXCIpO1xuXG4gICAgaWYgKHJlcS5tZXRob2QgPT09IFwiT1BUSU9OU1wiKSB7XG4gICAgICByZXMud3JpdGVIZWFkKDIwNCk7XG4gICAgICByZXMuZW5kKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdXJsID0gbmV3IFVSTChyZXEudXJsIHx8IFwiL1wiLCBgaHR0cDovLyR7cmVxLmhlYWRlcnMuaG9zdCB8fCBcImxvY2FsaG9zdFwifWApO1xuXG4gICAgaWYgKHJlcS5tZXRob2QgPT09IFwiR0VUXCIgJiYgdXJsLnBhdGhuYW1lID09PSBcIi9zc2VcIikge1xuICAgICAgdGhpcy5oYW5kbGVTU0UocmVxLCByZXMpO1xuICAgIH0gZWxzZSBpZiAocmVxLm1ldGhvZCA9PT0gXCJQT1NUXCIgJiYgdXJsLnBhdGhuYW1lID09PSBcIi9tZXNzYWdlXCIpIHtcbiAgICAgIHRoaXMuaGFuZGxlTWVzc2FnZShyZXEsIHJlcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcy53cml0ZUhlYWQoNDA0KTtcbiAgICAgIHJlcy5lbmQoXCJOb3QgZm91bmRcIik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVTU0UocmVxOiBodHRwLkluY29taW5nTWVzc2FnZSwgcmVzOiBodHRwLlNlcnZlclJlc3BvbnNlKTogdm9pZCB7XG4gICAgY29uc3Qgc2Vzc2lvbklkID0gZ2VuZXJhdGVJZCgpO1xuXG4gICAgcmVzLndyaXRlSGVhZCgyMDAsIHtcbiAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwidGV4dC9ldmVudC1zdHJlYW1cIixcbiAgICAgIFwiQ2FjaGUtQ29udHJvbFwiOiBcIm5vLWNhY2hlXCIsXG4gICAgICBDb25uZWN0aW9uOiBcImtlZXAtYWxpdmVcIixcbiAgICB9KTtcblxuICAgIGNvbnN0IG1lc3NhZ2VVcmwgPSBgL21lc3NhZ2U/c2Vzc2lvbl9pZD0ke3Nlc3Npb25JZH1gO1xuICAgIHJlcy53cml0ZShgZXZlbnQ6IGVuZHBvaW50XFxuZGF0YTogJHttZXNzYWdlVXJsfVxcblxcbmApO1xuXG4gICAgdGhpcy5zZXNzaW9ucy5zZXQoc2Vzc2lvbklkLCByZXMpO1xuXG4gICAgcmVxLm9uKFwiY2xvc2VcIiwgKCkgPT4ge1xuICAgICAgdGhpcy5zZXNzaW9ucy5kZWxldGUoc2Vzc2lvbklkKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlTWVzc2FnZShyZXE6IGh0dHAuSW5jb21pbmdNZXNzYWdlLCByZXM6IGh0dHAuU2VydmVyUmVzcG9uc2UpOiB2b2lkIHtcbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHJlcS51cmwgfHwgXCIvXCIsIGBodHRwOi8vJHtyZXEuaGVhZGVycy5ob3N0IHx8IFwibG9jYWxob3N0XCJ9YCk7XG4gICAgY29uc3Qgc2Vzc2lvbklkID0gdXJsLnNlYXJjaFBhcmFtcy5nZXQoXCJzZXNzaW9uX2lkXCIpO1xuXG4gICAgaWYgKCFzZXNzaW9uSWQgfHwgIXRoaXMuc2Vzc2lvbnMuaGFzKHNlc3Npb25JZCkpIHtcbiAgICAgIHJlcy53cml0ZUhlYWQoNDAwKTtcbiAgICAgIHJlcy5lbmQoXCJJbnZhbGlkIG9yIG1pc3Npbmcgc2Vzc2lvbl9pZFwiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgYm9keSA9IFwiXCI7XG4gICAgcmVxLm9uKFwiZGF0YVwiLCAoY2h1bms6IEJ1ZmZlcikgPT4ge1xuICAgICAgYm9keSArPSBjaHVuay50b1N0cmluZygpO1xuICAgIH0pO1xuICAgIHJlcS5vbihcImVuZFwiLCBhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBtc2cgPSBKU09OLnBhcnNlKGJvZHkpO1xuICAgICAgICBpZiAobXNnLmpzb25ycGMgIT09IFwiMi4wXCIgfHwgIShcIm1ldGhvZFwiIGluIG1zZykgfHwgIShcImlkXCIgaW4gbXNnKSkge1xuICAgICAgICAgIHJlcy53cml0ZUhlYWQoNDAwKTtcbiAgICAgICAgICByZXMuZW5kKFwiSW52YWxpZCBKU09OLVJQQyBtZXNzYWdlXCIpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5yZXF1ZXN0SGFuZGxlcj8uKG1zZyBhcyBKU09OUlBDUmVxdWVzdCk7XG4gICAgICAgIGlmIChyZXNwb25zZSkge1xuICAgICAgICAgIGNvbnN0IHNzZVJlcyA9IHRoaXMuc2Vzc2lvbnMuZ2V0KHNlc3Npb25JZCk7XG4gICAgICAgICAgaWYgKHNzZVJlcykge1xuICAgICAgICAgICAgc3NlUmVzLndyaXRlKGBldmVudDogbWVzc2FnZVxcbmRhdGE6ICR7SlNPTi5zdHJpbmdpZnkocmVzcG9uc2UpfVxcblxcbmApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJlcy53cml0ZUhlYWQoMjAyKTtcbiAgICAgICAgcmVzLmVuZCgpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJlcy53cml0ZUhlYWQoNDAwKTtcbiAgICAgICAgcmVzLmVuZChcIkludmFsaWQgSlNPTlwiKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUlkKCk6IHN0cmluZyB7XG4gIHJldHVybiBjcnlwdG8ucmFuZG9tVVVJRCgpO1xufVxuIiwgImltcG9ydCB7IHJlYWRkaXJTeW5jLCBzdGF0U3luYywgdW5saW5rU3luYywgbWtkaXJTeW5jLCBleGlzdHNTeW5jIH0gZnJvbSBcImZzXCI7XG5pbXBvcnQgeyByZWFkRmlsZSwgd3JpdGVGaWxlLCBhY2Nlc3MgfSBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCB7IGpvaW4sIGRpcm5hbWUsIHJlbGF0aXZlIH0gZnJvbSBcInBhdGhcIjtcblxuZXhwb3J0IGludGVyZmFjZSBGaWxlRW50cnkge1xuICBuYW1lOiBzdHJpbmc7XG4gIHBhdGg6IHN0cmluZztcbiAgdHlwZTogXCJmaWxlXCIgfCBcImRpcmVjdG9yeVwiO1xuICBzaXplPzogbnVtYmVyO1xuICBtdGltZT86IERhdGU7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZpbGVFeGlzdHMocGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHRyeSB7XG4gICAgYXdhaXQgYWNjZXNzKHBhdGgpO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZFRleHRGaWxlKHBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIHJldHVybiByZWFkRmlsZShwYXRoLCBcInV0Zi04XCIpO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVRleHRGaWxlKHBhdGg6IHN0cmluZywgY29udGVudDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHdyaXRlRmlsZShwYXRoLCBjb250ZW50LCBcInV0Zi04XCIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbGlzdEZpbGVzKHZhdWx0UGF0aDogc3RyaW5nLCBkaXJlY3Rvcnk/OiBzdHJpbmcpOiBGaWxlRW50cnlbXSB7XG4gIGNvbnN0IHRhcmdldERpciA9IGRpcmVjdG9yeSA/IGpvaW4odmF1bHRQYXRoLCBkaXJlY3RvcnkpIDogdmF1bHRQYXRoO1xuXG4gIGlmICghZXhpc3RzU3luYyh0YXJnZXREaXIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBEaXJlY3Rvcnkgbm90IGZvdW5kOiAke3RhcmdldERpcn1gKTtcbiAgfVxuXG4gIGNvbnN0IGVudHJpZXMgPSByZWFkZGlyU3luYyh0YXJnZXREaXIpO1xuICBjb25zdCByZXN1bHQ6IEZpbGVFbnRyeVtdID0gW107XG5cbiAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgY29uc3QgZnVsbFBhdGggPSBqb2luKHRhcmdldERpciwgZW50cnkpO1xuICAgIGNvbnN0IHN0YXQgPSBzdGF0U3luYyhmdWxsUGF0aCk7XG4gICAgcmVzdWx0LnB1c2goe1xuICAgICAgbmFtZTogZW50cnksXG4gICAgICBwYXRoOiByZWxhdGl2ZSh2YXVsdFBhdGgsIGZ1bGxQYXRoKSxcbiAgICAgIHR5cGU6IHN0YXQuaXNEaXJlY3RvcnkoKSA/IFwiZGlyZWN0b3J5XCIgOiBcImZpbGVcIixcbiAgICAgIHNpemU6IHN0YXQuc2l6ZSxcbiAgICAgIG10aW1lOiBzdGF0Lm10aW1lLFxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdC5zb3J0KChhLCBiKSA9PiB7XG4gICAgaWYgKGEudHlwZSAhPT0gYi50eXBlKSByZXR1cm4gYS50eXBlID09PSBcImRpcmVjdG9yeVwiID8gLTEgOiAxO1xuICAgIHJldHVybiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpO1xuICB9KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRGaWxlSGFuZGxlcihcbiAgdmF1bHRQYXRoOiBzdHJpbmcsXG4gIGZpbGVuYW1lOiBzdHJpbmcsXG4pOiBQcm9taXNlPHsgY29udGVudDogc3RyaW5nOyBmcm9udG1hdHRlcj86IFJlY29yZDxzdHJpbmcsIGFueT4gfT4ge1xuICBjb25zdCBmdWxsUGF0aCA9IGpvaW4odmF1bHRQYXRoLCBmaWxlbmFtZSk7XG5cbiAgaWYgKCEoYXdhaXQgZmlsZUV4aXN0cyhmdWxsUGF0aCkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGaWxlIG5vdCBmb3VuZDogJHtmaWxlbmFtZX1gKTtcbiAgfVxuXG4gIGNvbnN0IHN0YXQgPSBzdGF0U3luYyhmdWxsUGF0aCk7XG4gIGlmICghc3RhdC5pc0ZpbGUoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTm90IGEgZmlsZTogJHtmaWxlbmFtZX1gKTtcbiAgfVxuXG4gIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCByZWFkVGV4dEZpbGUoZnVsbFBhdGgpO1xuICBjb25zdCBwYXJzZWQgPSBwYXJzZUZyb250bWF0dGVyKGNvbnRlbnQpO1xuXG4gIHJldHVybiB7XG4gICAgY29udGVudCxcbiAgICBmcm9udG1hdHRlcjogcGFyc2VkPy5mcm9udG1hdHRlcixcbiAgfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUZpbGUoXG4gIHZhdWx0UGF0aDogc3RyaW5nLFxuICBmaWxlbmFtZTogc3RyaW5nLFxuICBjb250ZW50OiBzdHJpbmcsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZnVsbFBhdGggPSBqb2luKHZhdWx0UGF0aCwgZmlsZW5hbWUpO1xuICBjb25zdCBkaXIgPSBkaXJuYW1lKGZ1bGxQYXRoKTtcblxuICBpZiAoIWV4aXN0c1N5bmMoZGlyKSkge1xuICAgIG1rZGlyU3luYyhkaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICB9XG5cbiAgYXdhaXQgd3JpdGVUZXh0RmlsZShmdWxsUGF0aCwgY29udGVudCk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhcHBlbmRGaWxlKFxuICB2YXVsdFBhdGg6IHN0cmluZyxcbiAgZmlsZW5hbWU6IHN0cmluZyxcbiAgY29udGVudDogc3RyaW5nLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGZ1bGxQYXRoID0gam9pbih2YXVsdFBhdGgsIGZpbGVuYW1lKTtcbiAgY29uc3QgZGlyID0gZGlybmFtZShmdWxsUGF0aCk7XG5cbiAgaWYgKCFleGlzdHNTeW5jKGRpcikpIHtcbiAgICBta2RpclN5bmMoZGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIGxldCBleGlzdGluZyA9IFwiXCI7XG4gIGlmIChhd2FpdCBmaWxlRXhpc3RzKGZ1bGxQYXRoKSkge1xuICAgIGV4aXN0aW5nID0gYXdhaXQgcmVhZFRleHRGaWxlKGZ1bGxQYXRoKTtcbiAgfVxuXG4gIGF3YWl0IHdyaXRlVGV4dEZpbGUoZnVsbFBhdGgsIGV4aXN0aW5nICsgY29udGVudCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWxldGVGaWxlSGFuZGxlcih2YXVsdFBhdGg6IHN0cmluZywgZmlsZW5hbWU6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBmdWxsUGF0aCA9IGpvaW4odmF1bHRQYXRoLCBmaWxlbmFtZSk7XG5cbiAgaWYgKCFleGlzdHNTeW5jKGZ1bGxQYXRoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmlsZSBub3QgZm91bmQ6ICR7ZmlsZW5hbWV9YCk7XG4gIH1cblxuICB1bmxpbmtTeW5jKGZ1bGxQYXRoKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBhdGNoRmlsZShcbiAgdmF1bHRQYXRoOiBzdHJpbmcsXG4gIGZpbGVuYW1lOiBzdHJpbmcsXG4gIG9wZXJhdGlvbjogXCJhcHBlbmRcIiB8IFwicHJlcGVuZFwiIHwgXCJyZXBsYWNlXCIsXG4gIHRhcmdldFR5cGU6IFwiaGVhZGluZ1wiIHwgXCJibG9ja1wiIHwgXCJmcm9udG1hdHRlclwiLFxuICB0YXJnZXQ6IHN0cmluZyxcbiAgY29udGVudDogc3RyaW5nLFxuICBvcHRpb25zPzoge1xuICAgIGNvbnRlbnRUeXBlPzogc3RyaW5nO1xuICAgIHRhcmdldERlbGltaXRlcj86IHN0cmluZztcbiAgICB0cmltVGFyZ2V0V2hpdGVzcGFjZT86IGJvb2xlYW47XG4gIH0sXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBmdWxsUGF0aCA9IGpvaW4odmF1bHRQYXRoLCBmaWxlbmFtZSk7XG5cbiAgaWYgKCEoYXdhaXQgZmlsZUV4aXN0cyhmdWxsUGF0aCkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGaWxlIG5vdCBmb3VuZDogJHtmaWxlbmFtZX1gKTtcbiAgfVxuXG4gIGNvbnN0IGZpbGVDb250ZW50ID0gYXdhaXQgcmVhZFRleHRGaWxlKGZ1bGxQYXRoKTtcbiAgbGV0IG1vZGlmaWVkOiBzdHJpbmc7XG5cbiAgaWYgKHRhcmdldFR5cGUgPT09IFwiZnJvbnRtYXR0ZXJcIikge1xuICAgIG1vZGlmaWVkID0gcGF0Y2hGcm9udG1hdHRlcihmaWxlQ29udGVudCwgb3BlcmF0aW9uLCB0YXJnZXQsIGNvbnRlbnQpO1xuICB9IGVsc2UgaWYgKHRhcmdldFR5cGUgPT09IFwiaGVhZGluZ1wiKSB7XG4gICAgbW9kaWZpZWQgPSBwYXRjaEhlYWRpbmcoZmlsZUNvbnRlbnQsIG9wZXJhdGlvbiwgdGFyZ2V0LCBjb250ZW50LCBvcHRpb25zKTtcbiAgfSBlbHNlIGlmICh0YXJnZXRUeXBlID09PSBcImJsb2NrXCIpIHtcbiAgICBtb2RpZmllZCA9IHBhdGNoQmxvY2soZmlsZUNvbnRlbnQsIG9wZXJhdGlvbiwgdGFyZ2V0LCBjb250ZW50KTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHRhcmdldCB0eXBlOiAke3RhcmdldFR5cGV9YCk7XG4gIH1cblxuICBhd2FpdCB3cml0ZVRleHRGaWxlKGZ1bGxQYXRoLCBtb2RpZmllZCk7XG4gIHJldHVybiBtb2RpZmllZDtcbn1cblxuZnVuY3Rpb24gcGFyc2VGcm9udG1hdHRlcihcbiAgY29udGVudDogc3RyaW5nLFxuKTogeyBmcm9udG1hdHRlcjogUmVjb3JkPHN0cmluZywgYW55PjsgYm9keTogc3RyaW5nIH0gfCBudWxsIHtcbiAgaWYgKCFjb250ZW50LnN0YXJ0c1dpdGgoXCItLS1cIikpIHJldHVybiBudWxsO1xuXG4gIGNvbnN0IGVuZEluZGV4ID0gY29udGVudC5pbmRleE9mKFwiLS0tXCIsIDMpO1xuICBpZiAoZW5kSW5kZXggPT09IC0xKSByZXR1cm4gbnVsbDtcblxuICBjb25zdCByYXcgPSBjb250ZW50LnNsaWNlKDMsIGVuZEluZGV4KS50cmltKCk7XG4gIGNvbnN0IGJvZHkgPSBjb250ZW50LnNsaWNlKGVuZEluZGV4ICsgMykudHJpbSgpO1xuICBjb25zdCBmcm9udG1hdHRlcjogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuXG4gIGZvciAoY29uc3QgbGluZSBvZiByYXcuc3BsaXQoXCJcXG5cIikpIHtcbiAgICBjb25zdCBjb2xvbkluZGV4ID0gbGluZS5pbmRleE9mKFwiOlwiKTtcbiAgICBpZiAoY29sb25JbmRleCA9PT0gLTEpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGtleSA9IGxpbmUuc2xpY2UoMCwgY29sb25JbmRleCkudHJpbSgpO1xuICAgIGxldCB2YWx1ZTogYW55ID0gbGluZS5zbGljZShjb2xvbkluZGV4ICsgMSkudHJpbSgpO1xuXG4gICAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoJ1wiJykgJiYgdmFsdWUuZW5kc1dpdGgoJ1wiJykpIHtcbiAgICAgIHZhbHVlID0gdmFsdWUuc2xpY2UoMSwgLTEpO1xuICAgIH0gZWxzZSBpZiAodmFsdWUuc3RhcnRzV2l0aChcIltcIikgJiYgdmFsdWUuZW5kc1dpdGgoXCJdXCIpKSB7XG4gICAgICB2YWx1ZSA9IHZhbHVlXG4gICAgICAgIC5zbGljZSgxLCAtMSlcbiAgICAgICAgLnNwbGl0KFwiLFwiKVxuICAgICAgICAubWFwKChzOiBzdHJpbmcpID0+IHMudHJpbSgpLnJlcGxhY2UoL15bXCInXXxbXCInXSQvZywgXCJcIikpXG4gICAgICAgIC5maWx0ZXIoQm9vbGVhbik7XG4gICAgfVxuXG4gICAgZnJvbnRtYXR0ZXJba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIHsgZnJvbnRtYXR0ZXIsIGJvZHkgfTtcbn1cblxuZnVuY3Rpb24gcGF0Y2hGcm9udG1hdHRlcihcbiAgY29udGVudDogc3RyaW5nLFxuICBvcGVyYXRpb246IFwiYXBwZW5kXCIgfCBcInByZXBlbmRcIiB8IFwicmVwbGFjZVwiLFxuICB0YXJnZXQ6IHN0cmluZyxcbiAgbmV3Q29udGVudDogc3RyaW5nLFxuKTogc3RyaW5nIHtcbiAgY29uc3QgcGFyc2VkID0gcGFyc2VGcm9udG1hdHRlcihjb250ZW50KTtcblxuICBpZiAob3BlcmF0aW9uID09PSBcInJlcGxhY2VcIiAmJiB0YXJnZXQgPT09IFwiYWxsXCIpIHtcbiAgICBpZiAocGFyc2VkKSB7XG4gICAgICByZXR1cm4gYC0tLVxcbiR7bmV3Q29udGVudH1cXG4tLS1cXG5cXG4ke3BhcnNlZC5ib2R5fWA7XG4gICAgfVxuICAgIHJldHVybiBgLS0tXFxuJHtuZXdDb250ZW50fVxcbi0tLVxcblxcbiR7Y29udGVudH1gO1xuICB9XG5cbiAgaWYgKHBhcnNlZCkge1xuICAgIGNvbnN0IGxpbmVzID0gY29udGVudC5zcGxpdChcIlxcblwiKTtcbiAgICBsZXQgZm1FbmQgPSAtMTtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAobGluZXNbaV0udHJpbSgpID09PSBcIi0tLVwiKSB7XG4gICAgICAgIGZtRW5kID0gaTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZm1MaW5lcyA9IGxpbmVzLnNsaWNlKDEsIGZtRW5kKTtcbiAgICBjb25zdCBib2R5TGluZXMgPSBsaW5lcy5zbGljZShmbUVuZCArIDEpO1xuXG4gICAgaWYgKG9wZXJhdGlvbiA9PT0gXCJyZXBsYWNlXCIpIHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gZm1MaW5lcy5maW5kSW5kZXgoKGwpID0+IGwudHJpbSgpLnN0YXJ0c1dpdGgodGFyZ2V0ICsgXCI6XCIpKTtcbiAgICAgIGlmIChleGlzdGluZyAhPT0gLTEpIHtcbiAgICAgICAgZm1MaW5lc1tleGlzdGluZ10gPSBgJHt0YXJnZXR9OiAke25ld0NvbnRlbnR9YDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZtTGluZXMucHVzaChgJHt0YXJnZXR9OiAke25ld0NvbnRlbnR9YCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChvcGVyYXRpb24gPT09IFwiYXBwZW5kXCIpIHtcbiAgICAgIGZtTGluZXMucHVzaChgJHt0YXJnZXR9OiAke25ld0NvbnRlbnR9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFtcIi0tLVwiLCAuLi5mbUxpbmVzLCBcIi0tLVwiLCBcIlwiLCAuLi5ib2R5TGluZXNdLmpvaW4oXCJcXG5cIik7XG4gIH1cblxuICBpZiAob3BlcmF0aW9uID09PSBcInJlcGxhY2VcIiB8fCBvcGVyYXRpb24gPT09IFwiYXBwZW5kXCIpIHtcbiAgICByZXR1cm4gYC0tLVxcbiR7dGFyZ2V0fTogJHtuZXdDb250ZW50fVxcbi0tLVxcblxcbiR7Y29udGVudH1gO1xuICB9XG5cbiAgcmV0dXJuIGNvbnRlbnQ7XG59XG5cbmZ1bmN0aW9uIGZpbmRIZWFkaW5nTGluZShcbiAgbGluZXM6IHN0cmluZ1tdLFxuICB0YXJnZXQ6IHN0cmluZyxcbiAgZGVsaW1pdGVyOiBzdHJpbmcsXG4pOiB7IGxpbmVJbmRleDogbnVtYmVyOyBsZXZlbDogbnVtYmVyIH0gfCBudWxsIHtcbiAgY29uc3QgcGFydHMgPSB0YXJnZXQuc3BsaXQoZGVsaW1pdGVyKS5tYXAoKHMpID0+IHMudHJpbSgpKTtcblxuICBsZXQgY3VycmVudExpbmUgPSAwO1xuICBmb3IgKGNvbnN0IHBhcnQgb2YgcGFydHMpIHtcbiAgICBsZXQgZm91bmQgPSBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gY3VycmVudExpbmU7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgaGVhZGluZ01hdGNoID0gbGluZXNbaV0ubWF0Y2goL14oI3sxLDZ9KVxccysoLispJC8pO1xuICAgICAgaWYgKGhlYWRpbmdNYXRjaCAmJiBoZWFkaW5nTWF0Y2hbMl0udHJpbSgpID09PSBwYXJ0KSB7XG4gICAgICAgIGN1cnJlbnRMaW5lID0gaTtcbiAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFmb3VuZCkgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBtYXRjaCA9IGxpbmVzW2N1cnJlbnRMaW5lXS5tYXRjaCgvXigjezEsNn0pXFxzLyk7XG4gIHJldHVybiB7IGxpbmVJbmRleDogY3VycmVudExpbmUsIGxldmVsOiBtYXRjaCA/IG1hdGNoWzFdLmxlbmd0aCA6IDEgfTtcbn1cblxuZnVuY3Rpb24gZ2V0SGVhZGluZ0NvbnRlbnRFbmQobGluZXM6IHN0cmluZ1tdLCBzdGFydExpbmU6IG51bWJlciwgbGV2ZWw6IG51bWJlcik6IG51bWJlciB7XG4gIGZvciAobGV0IGkgPSBzdGFydExpbmUgKyAxOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBtYXRjaCA9IGxpbmVzW2ldLm1hdGNoKC9eKCN7MSw2fSlcXHMvKTtcbiAgICBpZiAobWF0Y2ggJiYgbWF0Y2hbMV0ubGVuZ3RoIDw9IGxldmVsKSB7XG4gICAgICByZXR1cm4gaTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGxpbmVzLmxlbmd0aDtcbn1cblxuZnVuY3Rpb24gcGF0Y2hIZWFkaW5nKFxuICBjb250ZW50OiBzdHJpbmcsXG4gIG9wZXJhdGlvbjogXCJhcHBlbmRcIiB8IFwicHJlcGVuZFwiIHwgXCJyZXBsYWNlXCIsXG4gIHRhcmdldDogc3RyaW5nLFxuICBuZXdDb250ZW50OiBzdHJpbmcsXG4gIG9wdGlvbnM/OiBhbnksXG4pOiBzdHJpbmcge1xuICBjb25zdCBkZWxpbWl0ZXIgPSBvcHRpb25zPy50YXJnZXREZWxpbWl0ZXIgfHwgXCI6OlwiO1xuICBjb25zdCBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoXCJcXG5cIik7XG4gIGNvbnN0IGhlYWRpbmcgPSBmaW5kSGVhZGluZ0xpbmUobGluZXMsIHRhcmdldCwgZGVsaW1pdGVyKTtcblxuICBpZiAoIWhlYWRpbmcpIHtcbiAgICBpZiAob3BlcmF0aW9uID09PSBcInJlcGxhY2VcIikgcmV0dXJuIGNvbnRlbnQ7XG4gICAgY29uc3QgdGFyZ2V0UGFydHMgPSB0YXJnZXQuc3BsaXQoZGVsaW1pdGVyKS5tYXAoKHMpID0+IHMudHJpbSgpKTtcbiAgICBjb25zdCBsYXN0UGFydCA9IHRhcmdldFBhcnRzW3RhcmdldFBhcnRzLmxlbmd0aCAtIDFdO1xuICAgIHJldHVybiBjb250ZW50ICsgYFxcblxcbiMjICR7bGFzdFBhcnR9XFxuXFxuJHtuZXdDb250ZW50fWA7XG4gIH1cblxuICBjb25zdCBzZWN0aW9uRW5kID0gZ2V0SGVhZGluZ0NvbnRlbnRFbmQobGluZXMsIGhlYWRpbmcubGluZUluZGV4LCBoZWFkaW5nLmxldmVsKTtcblxuICBpZiAob3BlcmF0aW9uID09PSBcInJlcGxhY2VcIikge1xuICAgIGNvbnN0IG5ld0xpbmVzID0gW1xuICAgICAgLi4ubGluZXMuc2xpY2UoMCwgaGVhZGluZy5saW5lSW5kZXggKyAxKSxcbiAgICAgIG5ld0NvbnRlbnQsXG4gICAgICAuLi5saW5lcy5zbGljZShzZWN0aW9uRW5kKSxcbiAgICBdO1xuICAgIHJldHVybiBuZXdMaW5lcy5qb2luKFwiXFxuXCIpO1xuICB9XG5cbiAgaWYgKG9wZXJhdGlvbiA9PT0gXCJhcHBlbmRcIikge1xuICAgIGNvbnN0IG5ld0xpbmVzID0gWy4uLmxpbmVzLnNsaWNlKDAsIHNlY3Rpb25FbmQpLCBuZXdDb250ZW50LCAuLi5saW5lcy5zbGljZShzZWN0aW9uRW5kKV07XG4gICAgcmV0dXJuIG5ld0xpbmVzLmpvaW4oXCJcXG5cIik7XG4gIH1cblxuICBpZiAob3BlcmF0aW9uID09PSBcInByZXBlbmRcIikge1xuICAgIGNvbnN0IG5ld0xpbmVzID0gW1xuICAgICAgLi4ubGluZXMuc2xpY2UoMCwgaGVhZGluZy5saW5lSW5kZXggKyAxKSxcbiAgICAgIG5ld0NvbnRlbnQsXG4gICAgICAuLi5saW5lcy5zbGljZShoZWFkaW5nLmxpbmVJbmRleCArIDEpLFxuICAgIF07XG4gICAgcmV0dXJuIG5ld0xpbmVzLmpvaW4oXCJcXG5cIik7XG4gIH1cblxuICByZXR1cm4gY29udGVudDtcbn1cblxuZnVuY3Rpb24gcGF0Y2hCbG9jayhcbiAgY29udGVudDogc3RyaW5nLFxuICBvcGVyYXRpb246IFwiYXBwZW5kXCIgfCBcInByZXBlbmRcIiB8IFwicmVwbGFjZVwiLFxuICB0YXJnZXQ6IHN0cmluZyxcbiAgbmV3Q29udGVudDogc3RyaW5nLFxuKTogc3RyaW5nIHtcbiAgY29uc3QgYmxvY2tJZCA9IHRhcmdldC5zdGFydHNXaXRoKFwiXlwiKSA/IHRhcmdldCA6IGBeJHt0YXJnZXR9YDtcbiAgY29uc3QgbGluZXMgPSBjb250ZW50LnNwbGl0KFwiXFxuXCIpO1xuICBjb25zdCBibG9ja0luZGV4ID0gbGluZXMuZmluZEluZGV4KChsKSA9PiBsLnRyaW0oKS5lbmRzV2l0aChibG9ja0lkKSk7XG5cbiAgaWYgKGJsb2NrSW5kZXggPT09IC0xKSB7XG4gICAgaWYgKG9wZXJhdGlvbiA9PT0gXCJyZXBsYWNlXCIpIHJldHVybiBjb250ZW50O1xuICAgIHJldHVybiBjb250ZW50ICsgYFxcblxcbiR7bmV3Q29udGVudH0gJHtibG9ja0lkfWA7XG4gIH1cblxuICBpZiAob3BlcmF0aW9uID09PSBcInJlcGxhY2VcIikge1xuICAgIGxpbmVzW2Jsb2NrSW5kZXhdID0gbGluZXNbYmxvY2tJbmRleF0ucmVwbGFjZSgvXiguKj8pKFxccytcXF5cXHcrKT8kLywgYCR7bmV3Q29udGVudH0gJHtibG9ja0lkfWApO1xuICAgIHJldHVybiBsaW5lcy5qb2luKFwiXFxuXCIpO1xuICB9XG5cbiAgaWYgKG9wZXJhdGlvbiA9PT0gXCJhcHBlbmRcIikge1xuICAgIGxpbmVzLnNwbGljZShibG9ja0luZGV4ICsgMSwgMCwgbmV3Q29udGVudCk7XG4gICAgcmV0dXJuIGxpbmVzLmpvaW4oXCJcXG5cIik7XG4gIH1cblxuICBpZiAob3BlcmF0aW9uID09PSBcInByZXBlbmRcIikge1xuICAgIGxpbmVzLnNwbGljZShibG9ja0luZGV4LCAwLCBuZXdDb250ZW50KTtcbiAgICByZXR1cm4gbGluZXMuam9pbihcIlxcblwiKTtcbiAgfVxuXG4gIHJldHVybiBjb250ZW50O1xufVxuIiwgImltcG9ydCB7IHJlYWRkaXJTeW5jLCBzdGF0U3luYyB9IGZyb20gXCJmc1wiO1xuaW1wb3J0IHsgcmVhZEZpbGUgfSBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCB7IGpvaW4sIHJlbGF0aXZlIH0gZnJvbSBcInBhdGhcIjtcblxuZXhwb3J0IGludGVyZmFjZSBTZWFyY2hNYXRjaCB7XG4gIGZpbGU6IHN0cmluZztcbiAgbGluZTogbnVtYmVyO1xuICBjb250ZW50OiBzdHJpbmc7XG4gIGNvbnRleHRCZWZvcmU/OiBzdHJpbmc7XG4gIGNvbnRleHRBZnRlcj86IHN0cmluZztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlYXJjaEluVmF1bHQoXG4gIHZhdWx0UGF0aDogc3RyaW5nLFxuICBxdWVyeTogc3RyaW5nLFxuICBkaXJlY3Rvcnk/OiBzdHJpbmcsXG4gIGNvbnRleHRMZW5ndGg6IG51bWJlciA9IDEwMCxcbik6IFByb21pc2U8U2VhcmNoTWF0Y2hbXT4ge1xuICBjb25zdCBzZWFyY2hEaXIgPSBkaXJlY3RvcnkgPyBqb2luKHZhdWx0UGF0aCwgZGlyZWN0b3J5KSA6IHZhdWx0UGF0aDtcbiAgY29uc3QgcmVzdWx0czogU2VhcmNoTWF0Y2hbXSA9IFtdO1xuICBjb25zdCBzZWFyY2hUZXJtcyA9IHF1ZXJ5LnRvTG93ZXJDYXNlKCkuc3BsaXQoL1xccysvKS5maWx0ZXIoQm9vbGVhbik7XG5cbiAgYXdhaXQgd2Fsa0RpcihzZWFyY2hEaXIsIHZhdWx0UGF0aCwgcmVzdWx0cywgc2VhcmNoVGVybXMsIGNvbnRleHRMZW5ndGgpO1xuICByZXR1cm4gcmVzdWx0cztcbn1cblxuYXN5bmMgZnVuY3Rpb24gd2Fsa0RpcihcbiAgZGlyUGF0aDogc3RyaW5nLFxuICB2YXVsdFBhdGg6IHN0cmluZyxcbiAgcmVzdWx0czogU2VhcmNoTWF0Y2hbXSxcbiAgc2VhcmNoVGVybXM6IHN0cmluZ1tdLFxuICBjb250ZXh0TGVuZ3RoOiBudW1iZXIsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgbGV0IGVudHJpZXM6IHN0cmluZ1tdO1xuICB0cnkge1xuICAgIGVudHJpZXMgPSByZWFkZGlyU3luYyhkaXJQYXRoKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgY29uc3QgZnVsbFBhdGggPSBqb2luKGRpclBhdGgsIGVudHJ5KTtcblxuICAgIGxldCBzdGF0OiBSZXR1cm5UeXBlPHR5cGVvZiBzdGF0U3luYz47XG4gICAgdHJ5IHtcbiAgICAgIHN0YXQgPSBzdGF0U3luYyhmdWxsUGF0aCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdC5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICBpZiAoIWVudHJ5LnN0YXJ0c1dpdGgoXCIuXCIpKSB7XG4gICAgICAgIGF3YWl0IHdhbGtEaXIoZnVsbFBhdGgsIHZhdWx0UGF0aCwgcmVzdWx0cywgc2VhcmNoVGVybXMsIGNvbnRleHRMZW5ndGgpO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKCFlbnRyeS5lbmRzV2l0aChcIi5tZFwiKSkgY29udGludWU7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IHJlYWRGaWxlKGZ1bGxQYXRoLCBcInV0Zi04XCIpO1xuICAgICAgY29uc3QgbGluZXMgPSBjb250ZW50LnNwbGl0KFwiXFxuXCIpO1xuICAgICAgY29uc3QgcmVsUGF0aCA9IHJlbGF0aXZlKHZhdWx0UGF0aCwgZnVsbFBhdGgpO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGxvd2VyTGluZSA9IGxpbmVzW2ldLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGNvbnN0IG1hdGNoZXNBbGwgPSBzZWFyY2hUZXJtcy5ldmVyeSgodGVybSkgPT4gbG93ZXJMaW5lLmluY2x1ZGVzKHRlcm0pKTtcblxuICAgICAgICBpZiAobWF0Y2hlc0FsbCkge1xuICAgICAgICAgIHJlc3VsdHMucHVzaCh7XG4gICAgICAgICAgICBmaWxlOiByZWxQYXRoLFxuICAgICAgICAgICAgbGluZTogaSArIDEsXG4gICAgICAgICAgICBjb250ZW50OiBsaW5lc1tpXS5zdWJzdHJpbmcoMCwgNTAwKSxcbiAgICAgICAgICAgIGNvbnRleHRCZWZvcmU6IGkgPiAwID8gbGluZXNbaSAtIDFdLnN1YnN0cmluZygwLCBjb250ZXh0TGVuZ3RoKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGNvbnRleHRBZnRlcjpcbiAgICAgICAgICAgICAgaSA8IGxpbmVzLmxlbmd0aCAtIDEgPyBsaW5lc1tpICsgMV0uc3Vic3RyaW5nKDAsIGNvbnRleHRMZW5ndGgpIDogdW5kZWZpbmVkLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBza2lwIHVucmVhZGFibGUgZmlsZXNcbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQge1xuICBsaXN0RmlsZXMsXG4gIHJlYWRGaWxlSGFuZGxlcixcbiAgY3JlYXRlRmlsZSxcbiAgYXBwZW5kRmlsZSxcbiAgZGVsZXRlRmlsZUhhbmRsZXIsXG4gIHBhdGNoRmlsZSxcbn0gZnJvbSBcIi4uL3V0aWxzL2ZzLXV0aWxzXCI7XG5pbXBvcnQgeyBzZWFyY2hJblZhdWx0IH0gZnJvbSBcIi4uL3V0aWxzL3NlYXJjaFwiO1xuaW1wb3J0IHR5cGUgeyBWYXVsdFJlZ2lzdHJ5IH0gZnJvbSBcIi4uL3V0aWxzL3ZhdWx0c1wiO1xuaW1wb3J0IHR5cGUgeyBUb29sUmVzdWx0IH0gZnJvbSBcIi4uL21jcC9wcm90b2NvbFwiO1xuXG50eXBlIFRvb2xIYW5kbGVyID0gKGFyZ3M6IFJlY29yZDxzdHJpbmcsIGFueT4pID0+IFByb21pc2U8VG9vbFJlc3VsdD47XG5cbmV4cG9ydCBjbGFzcyBWYXVsdEZpbGVIYW5kbGVyIHtcbiAgcHJpdmF0ZSByZWdpc3RyeTogVmF1bHRSZWdpc3RyeTtcblxuICBjb25zdHJ1Y3RvcihyZWdpc3RyeTogVmF1bHRSZWdpc3RyeSkge1xuICAgIHRoaXMucmVnaXN0cnkgPSByZWdpc3RyeTtcbiAgfVxuXG4gIGdldEhhbmRsZXJzKCk6IFJlY29yZDxzdHJpbmcsIFRvb2xIYW5kbGVyPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxpc3RfdmF1bHRzOiB0aGlzLmhhbmRsZUxpc3RWYXVsdHMuYmluZCh0aGlzKSxcbiAgICAgIGdldF92YXVsdF9pbmZvOiB0aGlzLmhhbmRsZVZhdWx0SW5mby5iaW5kKHRoaXMpLFxuICAgICAgbGlzdF9maWxlczogdGhpcy5oYW5kbGVMaXN0RmlsZXMuYmluZCh0aGlzKSxcbiAgICAgIGdldF9maWxlOiB0aGlzLmhhbmRsZUdldEZpbGUuYmluZCh0aGlzKSxcbiAgICAgIGNyZWF0ZV9maWxlOiB0aGlzLmhhbmRsZUNyZWF0ZUZpbGUuYmluZCh0aGlzKSxcbiAgICAgIGFwcGVuZF90b19maWxlOiB0aGlzLmhhbmRsZUFwcGVuZEZpbGUuYmluZCh0aGlzKSxcbiAgICAgIHBhdGNoX2ZpbGU6IHRoaXMuaGFuZGxlUGF0Y2hGaWxlLmJpbmQodGhpcyksXG4gICAgICBkZWxldGVfZmlsZTogdGhpcy5oYW5kbGVEZWxldGVGaWxlLmJpbmQodGhpcyksXG4gICAgICBzZWFyY2g6IHRoaXMuaGFuZGxlU2VhcmNoLmJpbmQodGhpcyksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZVZhdWx0KGFyZ3M6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJlZ2lzdHJ5LnJlc29sdmUoYXJncy52YXVsdCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGhhbmRsZUxpc3RWYXVsdHMoX2FyZ3M6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBQcm9taXNlPFRvb2xSZXN1bHQ+IHtcbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDogW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogSlNPTi5zdHJpbmdpZnkodGhpcy5yZWdpc3RyeS5saXN0KCksIG51bGwsIDIpLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVWYXVsdEluZm8oYXJnczogUmVjb3JkPHN0cmluZywgYW55Pik6IFByb21pc2U8VG9vbFJlc3VsdD4ge1xuICAgIGNvbnN0IGluZm8gPSB0aGlzLnJlZ2lzdHJ5LmluZm8oYXJncy52YXVsdCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQ6IFt7IHR5cGU6IFwidGV4dFwiLCB0ZXh0OiBKU09OLnN0cmluZ2lmeShpbmZvLCBudWxsLCAyKSB9XSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVMaXN0RmlsZXMoYXJnczogUmVjb3JkPHN0cmluZywgYW55Pik6IFByb21pc2U8VG9vbFJlc3VsdD4ge1xuICAgIGNvbnN0IHZhdWx0UGF0aCA9IHRoaXMucmVzb2x2ZVZhdWx0KGFyZ3MpO1xuICAgIGNvbnN0IGVudHJpZXMgPSBsaXN0RmlsZXModmF1bHRQYXRoLCBhcmdzLmRpcmVjdG9yeSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQ6IFt7IHR5cGU6IFwidGV4dFwiLCB0ZXh0OiBKU09OLnN0cmluZ2lmeShlbnRyaWVzLCBudWxsLCAyKSB9XSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVHZXRGaWxlKGFyZ3M6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBQcm9taXNlPFRvb2xSZXN1bHQ+IHtcbiAgICBjb25zdCB2YXVsdFBhdGggPSB0aGlzLnJlc29sdmVWYXVsdChhcmdzKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZWFkRmlsZUhhbmRsZXIodmF1bHRQYXRoLCBhcmdzLmZpbGVuYW1lKTtcblxuICAgIGlmIChhcmdzLmZvcm1hdCA9PT0gXCJqc29uXCIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IEpTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZmlsZW5hbWU6IGFyZ3MuZmlsZW5hbWUsXG4gICAgICAgICAgICAgICAgZnJvbnRtYXR0ZXI6IHJlc3VsdC5mcm9udG1hdHRlcixcbiAgICAgICAgICAgICAgICBjb250ZW50OiByZXN1bHQuY29udGVudCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgMixcbiAgICAgICAgICAgICksXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY29udGVudDogW3sgdHlwZTogXCJ0ZXh0XCIsIHRleHQ6IHJlc3VsdC5jb250ZW50IH1dIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGhhbmRsZUNyZWF0ZUZpbGUoYXJnczogUmVjb3JkPHN0cmluZywgYW55Pik6IFByb21pc2U8VG9vbFJlc3VsdD4ge1xuICAgIGNvbnN0IHZhdWx0UGF0aCA9IHRoaXMucmVzb2x2ZVZhdWx0KGFyZ3MpO1xuICAgIGF3YWl0IGNyZWF0ZUZpbGUodmF1bHRQYXRoLCBhcmdzLmZpbGVuYW1lLCBhcmdzLmNvbnRlbnQpO1xuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbeyB0eXBlOiBcInRleHRcIiwgdGV4dDogXCJGaWxlIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5XCIgfV0sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlQXBwZW5kRmlsZShhcmdzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogUHJvbWlzZTxUb29sUmVzdWx0PiB7XG4gICAgY29uc3QgdmF1bHRQYXRoID0gdGhpcy5yZXNvbHZlVmF1bHQoYXJncyk7XG4gICAgYXdhaXQgYXBwZW5kRmlsZSh2YXVsdFBhdGgsIGFyZ3MuZmlsZW5hbWUsIGFyZ3MuY29udGVudCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQ6IFt7IHR5cGU6IFwidGV4dFwiLCB0ZXh0OiBcIkNvbnRlbnQgYXBwZW5kZWQgc3VjY2Vzc2Z1bGx5XCIgfV0sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlUGF0Y2hGaWxlKGFyZ3M6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBQcm9taXNlPFRvb2xSZXN1bHQ+IHtcbiAgICBjb25zdCB2YXVsdFBhdGggPSB0aGlzLnJlc29sdmVWYXVsdChhcmdzKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwYXRjaEZpbGUoXG4gICAgICB2YXVsdFBhdGgsXG4gICAgICBhcmdzLmZpbGVuYW1lLFxuICAgICAgYXJncy5vcGVyYXRpb24sXG4gICAgICBhcmdzLnRhcmdldFR5cGUsXG4gICAgICBhcmdzLnRhcmdldCxcbiAgICAgIGFyZ3MuY29udGVudCxcbiAgICAgIHtcbiAgICAgICAgY29udGVudFR5cGU6IGFyZ3MuY29udGVudFR5cGUsXG4gICAgICAgIHRhcmdldERlbGltaXRlcjogYXJncy50YXJnZXREZWxpbWl0ZXIsXG4gICAgICAgIHRyaW1UYXJnZXRXaGl0ZXNwYWNlOiBhcmdzLnRyaW1UYXJnZXRXaGl0ZXNwYWNlLFxuICAgICAgfSxcbiAgICApO1xuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbXG4gICAgICAgIHsgdHlwZTogXCJ0ZXh0XCIsIHRleHQ6IFwiRmlsZSBwYXRjaGVkIHN1Y2Nlc3NmdWxseVwiIH0sXG4gICAgICAgIHsgdHlwZTogXCJ0ZXh0XCIsIHRleHQ6IHJlc3VsdCB9LFxuICAgICAgXSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVEZWxldGVGaWxlKGFyZ3M6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBQcm9taXNlPFRvb2xSZXN1bHQ+IHtcbiAgICBjb25zdCB2YXVsdFBhdGggPSB0aGlzLnJlc29sdmVWYXVsdChhcmdzKTtcbiAgICBkZWxldGVGaWxlSGFuZGxlcih2YXVsdFBhdGgsIGFyZ3MuZmlsZW5hbWUpO1xuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbeyB0eXBlOiBcInRleHRcIiwgdGV4dDogXCJGaWxlIGRlbGV0ZWQgc3VjY2Vzc2Z1bGx5XCIgfV0sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlU2VhcmNoKGFyZ3M6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBQcm9taXNlPFRvb2xSZXN1bHQ+IHtcbiAgICBjb25zdCB2YXVsdFBhdGggPSB0aGlzLnJlc29sdmVWYXVsdChhcmdzKTtcbiAgICBjb25zdCBtYXRjaGVzID0gYXdhaXQgc2VhcmNoSW5WYXVsdCh2YXVsdFBhdGgsIGFyZ3MucXVlcnksIGFyZ3MuZGlyZWN0b3J5LCBhcmdzLmNvbnRleHRMZW5ndGgpO1xuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbeyB0eXBlOiBcInRleHRcIiwgdGV4dDogSlNPTi5zdHJpbmdpZnkobWF0Y2hlcywgbnVsbCwgMikgfV0sXG4gICAgfTtcbiAgfVxufVxuIiwgImltcG9ydCB7IHJlYWRkaXJTeW5jLCBzdGF0U3luYyB9IGZyb20gXCJmc1wiO1xuaW1wb3J0IHsgcmVhZEZpbGUgfSBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCB7IGpvaW4gfSBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHR5cGUgeyBQcm9tcHREZWZpbml0aW9uIH0gZnJvbSBcIi4uL21jcC9wcm90b2NvbFwiO1xuaW1wb3J0IHR5cGUgeyBWYXVsdFJlZ2lzdHJ5IH0gZnJvbSBcIi4uL3V0aWxzL3ZhdWx0c1wiO1xuXG5pbnRlcmZhY2UgRnJvbnRtYXR0ZXIge1xuICBba2V5OiBzdHJpbmddOiBhbnk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlRnJvbnRtYXR0ZXIoY29udGVudDogc3RyaW5nKTogeyBmcm9udG1hdHRlcjogRnJvbnRtYXR0ZXI7IGJvZHk6IHN0cmluZyB9IHwgbnVsbCB7XG4gIGlmICghY29udGVudC5zdGFydHNXaXRoKFwiLS0tXCIpKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgZW5kSW5kZXggPSBjb250ZW50LmluZGV4T2YoXCItLS1cIiwgMyk7XG4gIGlmIChlbmRJbmRleCA9PT0gLTEpIHJldHVybiBudWxsO1xuICBjb25zdCByYXcgPSBjb250ZW50LnNsaWNlKDMsIGVuZEluZGV4KS50cmltKCk7XG4gIGNvbnN0IGJvZHkgPSBjb250ZW50LnNsaWNlKGVuZEluZGV4ICsgMykudHJpbSgpO1xuICBjb25zdCBmcm9udG1hdHRlcjogRnJvbnRtYXR0ZXIgPSB7fTtcbiAgZm9yIChjb25zdCBsaW5lIG9mIHJhdy5zcGxpdChcIlxcblwiKSkge1xuICAgIGNvbnN0IGNvbG9uSW5kZXggPSBsaW5lLmluZGV4T2YoXCI6XCIpO1xuICAgIGlmIChjb2xvbkluZGV4ID09PSAtMSkgY29udGludWU7XG4gICAgY29uc3Qga2V5ID0gbGluZS5zbGljZSgwLCBjb2xvbkluZGV4KS50cmltKCk7XG4gICAgbGV0IHZhbHVlOiBhbnkgPSBsaW5lLnNsaWNlKGNvbG9uSW5kZXggKyAxKS50cmltKCk7XG4gICAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoJ1wiJykgJiYgdmFsdWUuZW5kc1dpdGgoJ1wiJykpIHZhbHVlID0gdmFsdWUuc2xpY2UoMSwgLTEpO1xuICAgIGVsc2UgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoXCJbXCIpICYmIHZhbHVlLmVuZHNXaXRoKFwiXVwiKSkge1xuICAgICAgdmFsdWUgPSB2YWx1ZVxuICAgICAgICAuc2xpY2UoMSwgLTEpXG4gICAgICAgIC5zcGxpdChcIixcIilcbiAgICAgICAgLm1hcCgoczogc3RyaW5nKSA9PiBzLnRyaW0oKS5yZXBsYWNlKC9eW1wiJ118W1wiJ10kL2csIFwiXCIpKVxuICAgICAgICAuZmlsdGVyKEJvb2xlYW4pO1xuICAgIH1cbiAgICBmcm9udG1hdHRlcltrZXldID0gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIHsgZnJvbnRtYXR0ZXIsIGJvZHkgfTtcbn1cblxuZXhwb3J0IGNsYXNzIFByb21wdEhhbmRsZXIge1xuICBwcml2YXRlIHJlZ2lzdHJ5OiBWYXVsdFJlZ2lzdHJ5O1xuICBwcml2YXRlIHByb21wdERpciA9IFwiUHJvbXB0c1wiO1xuXG4gIGNvbnN0cnVjdG9yKHJlZ2lzdHJ5OiBWYXVsdFJlZ2lzdHJ5KSB7XG4gICAgdGhpcy5yZWdpc3RyeSA9IHJlZ2lzdHJ5O1xuICB9XG5cbiAgYXN5bmMgbGlzdCh2YXVsdE5hbWU/OiBzdHJpbmcpOiBQcm9taXNlPFByb21wdERlZmluaXRpb25bXT4ge1xuICAgIGNvbnN0IHZhdWx0UGF0aCA9IHRoaXMucmVnaXN0cnkucmVzb2x2ZSh2YXVsdE5hbWUpO1xuICAgIGNvbnN0IHByb21wdFBhdGggPSBqb2luKHZhdWx0UGF0aCwgdGhpcy5wcm9tcHREaXIpO1xuXG4gICAgbGV0IGVudHJpZXM6IHN0cmluZ1tdO1xuICAgIHRyeSB7XG4gICAgICBlbnRyaWVzID0gcmVhZGRpclN5bmMocHJvbXB0UGF0aCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3QgcHJvbXB0czogUHJvbXB0RGVmaW5pdGlvbltdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIGlmICghZW50cnkuZW5kc1dpdGgoXCIubWRcIikpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBmdWxsUGF0aCA9IGpvaW4ocHJvbXB0UGF0aCwgZW50cnkpO1xuICAgICAgY29uc3Qgc3RhdCA9IHN0YXRTeW5jKGZ1bGxQYXRoKTtcbiAgICAgIGlmICghc3RhdC5pc0ZpbGUoKSkgY29udGludWU7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCByZWFkRmlsZShmdWxsUGF0aCwgXCJ1dGYtOFwiKTtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gcGFyc2VGcm9udG1hdHRlcihjb250ZW50KTtcbiAgICAgICAgY29uc3QgdGFnczogc3RyaW5nW10gPSBwYXJzZWQ/LmZyb250bWF0dGVyPy50YWdzIHx8IFtdO1xuXG4gICAgICAgIGlmICghdGFncy5pbmNsdWRlcyhcIm1jcC10b29scy1wcm9tcHRcIikpIGNvbnRpbnVlO1xuXG4gICAgICAgIGNvbnN0IHByb21wdEFyZ3MgPSBwYXJzZVByb21wdFBhcmFtZXRlcnMocGFyc2VkPy5ib2R5IHx8IGNvbnRlbnQpO1xuICAgICAgICBwcm9tcHRzLnB1c2goe1xuICAgICAgICAgIG5hbWU6IGVudHJ5LFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBwYXJzZWQ/LmZyb250bWF0dGVyPy5kZXNjcmlwdGlvbiB8fCBlbnRyeS5yZXBsYWNlKFwiLm1kXCIsIFwiXCIpLFxuICAgICAgICAgIGFyZ3VtZW50czogcHJvbXB0QXJncyxcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHByb21wdHM7XG4gIH1cblxuICBhc3luYyBnZXQoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHZhdWx0TmFtZT86IHN0cmluZyxcbiAgKTogUHJvbWlzZTx7XG4gICAgbWVzc2FnZXM6IEFycmF5PHsgcm9sZTogc3RyaW5nOyBjb250ZW50OiB7IHR5cGU6IHN0cmluZzsgdGV4dDogc3RyaW5nIH0gfT47XG4gIH0+IHtcbiAgICBjb25zdCB2YXVsdFBhdGggPSB0aGlzLnJlZ2lzdHJ5LnJlc29sdmUodmF1bHROYW1lKTtcbiAgICBjb25zdCBwcm9tcHRQYXRoID0gam9pbih2YXVsdFBhdGgsIHRoaXMucHJvbXB0RGlyLCBuYW1lKTtcblxuICAgIGxldCBjb250ZW50OiBzdHJpbmc7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnRlbnQgPSBhd2FpdCByZWFkRmlsZShwcm9tcHRQYXRoLCBcInV0Zi04XCIpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBQcm9tcHQgbm90IGZvdW5kOiAke25hbWV9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgcGFyc2VkID0gcGFyc2VGcm9udG1hdHRlcihjb250ZW50KTtcbiAgICBjb25zdCBib2R5ID0gcGFyc2VkPy5ib2R5IHx8IGNvbnRlbnQ7XG4gICAgY29uc3Qgd2l0aG91dEZyb250bWF0dGVyID0gYm9keS50cmltKCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgbWVzc2FnZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHJvbGU6IFwidXNlclwiLFxuICAgICAgICAgIGNvbnRlbnQ6IHtcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogd2l0aG91dEZyb250bWF0dGVyLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH07XG4gIH1cbn1cblxuaW50ZXJmYWNlIFByb21wdFBhcmFtZXRlciB7XG4gIG5hbWU6IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIHJlcXVpcmVkPzogYm9vbGVhbjtcbn1cblxuZnVuY3Rpb24gcGFyc2VQcm9tcHRQYXJhbWV0ZXJzKGNvbnRlbnQ6IHN0cmluZyk6IFByb21wdFBhcmFtZXRlcltdIHtcbiAgY29uc3QgcmVnZXggPSAvPCVbLV8qXSpcXHMqdHBcXC5tY3BUb29sc1xcLnByb21wdFxcKChbXildKylcXClcXHMqWy1fXSolPi9nO1xuICBjb25zdCBwYXJhbXM6IFByb21wdFBhcmFtZXRlcltdID0gW107XG4gIGxldCBtYXRjaDogUmVnRXhwRXhlY0FycmF5IHwgbnVsbDtcblxuICB3aGlsZSAoKG1hdGNoID0gcmVnZXguZXhlYyhjb250ZW50KSkgIT09IG51bGwpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgYXJnc1N0ciA9IG1hdGNoWzFdO1xuICAgICAgY29uc3QgYXJncyA9IGFyZ3NTdHIuc3BsaXQoXCIsXCIpLm1hcCgocykgPT4gcy50cmltKCkucmVwbGFjZSgvXltcIiddfFtcIiddJC9nLCBcIlwiKSk7XG5cbiAgICAgIGlmIChhcmdzLmxlbmd0aCA+PSAxKSB7XG4gICAgICAgIHBhcmFtcy5wdXNoKHtcbiAgICAgICAgICBuYW1lOiBhcmdzWzBdLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBhcmdzWzFdLFxuICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwYXJhbXM7XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBKU09OUlBDUmVxdWVzdCwgSlNPTlJQQ1Jlc3BvbnNlLCBUb29sRGVmaW5pdGlvbiB9IGZyb20gXCIuL3Byb3RvY29sXCI7XG5pbXBvcnQgeyBWYXVsdEZpbGVIYW5kbGVyIH0gZnJvbSBcIi4uL2hhbmRsZXJzL3Rvb2xzXCI7XG5pbXBvcnQgeyBQcm9tcHRIYW5kbGVyIH0gZnJvbSBcIi4uL2hhbmRsZXJzL3Byb21wdHNcIjtcbmltcG9ydCB0eXBlIHsgVmF1bHRSZWdpc3RyeSB9IGZyb20gXCIuLi91dGlscy92YXVsdHNcIjtcblxuY29uc3QgdmF1bHRQYXJhbSA9IHtcbiAgdmF1bHQ6IHtcbiAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgXCJWYXVsdCBuYW1lIChkZXJpdmVkIGZyb20gdGhlIGRpcmVjdG9yeSBuYW1lKS4gUmVxdWlyZWQgd2hlbiBtdWx0aXBsZSB2YXVsdHMgYXJlIGNvbmZpZ3VyZWQuXCIsXG4gIH0sXG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZlckluc3RhbmNlIHtcbiAgdG9vbERlZmluaXRpb25zOiBUb29sRGVmaW5pdGlvbltdO1xuICBoYW5kbGVSZXF1ZXN0KG1zZzogSlNPTlJQQ1JlcXVlc3QpOiBQcm9taXNlPEpTT05SUENSZXNwb25zZSB8IG51bGw+O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2VydmVyKHJlZ2lzdHJ5OiBWYXVsdFJlZ2lzdHJ5KTogU2VydmVySW5zdGFuY2Uge1xuICBjb25zdCB2YXVsdExpc3QgPSByZWdpc3RyeS5saXN0KCk7XG4gIGNvbnN0IHZhdWx0TmFtZXMgPSB2YXVsdExpc3QubWFwKCh2KSA9PiB2Lm5hbWUpO1xuICB2YXVsdFBhcmFtLnZhdWx0LmRlc2NyaXB0aW9uID0gYFZhdWx0IG5hbWUuIEF2YWlsYWJsZTogJHt2YXVsdE5hbWVzLmpvaW4oXCIsIFwiKX1gO1xuXG4gIGNvbnN0IGZpbGVIYW5kbGVyID0gbmV3IFZhdWx0RmlsZUhhbmRsZXIocmVnaXN0cnkpO1xuICBjb25zdCBwcm9tcHRIYW5kbGVyID0gbmV3IFByb21wdEhhbmRsZXIocmVnaXN0cnkpO1xuICBjb25zdCB0b29sSGFuZGxlcnMgPSBmaWxlSGFuZGxlci5nZXRIYW5kbGVycygpO1xuXG4gIGNvbnN0IHRvb2xEZWZpbml0aW9uczogVG9vbERlZmluaXRpb25bXSA9IFtcbiAgICB7XG4gICAgICBuYW1lOiBcImxpc3RfdmF1bHRzXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJMaXN0IGFsbCBjb25maWd1cmVkIHZhdWx0cyB3aXRoIHRoZWlyIHBhdGhzLlwiLFxuICAgICAgaW5wdXRTY2hlbWE6IHsgdHlwZTogXCJvYmplY3RcIiwgcHJvcGVydGllczoge30gfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwiZ2V0X3ZhdWx0X2luZm9cIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkdldCBzdGF0cyBmb3IgYSB2YXVsdCAoZmlsZSBjb3VudCwgcGF0aCwgbmFtZSkuXCIsXG4gICAgICBpbnB1dFNjaGVtYToge1xuICAgICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgdmF1bHQ6IHtcbiAgICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogYFZhdWx0IG5hbWUuIEF2YWlsYWJsZTogJHt2YXVsdE5hbWVzLmpvaW4oXCIsIFwiKX1gLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJsaXN0X2ZpbGVzXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJMaXN0IGZpbGVzIGluIHRoZSByb290IGRpcmVjdG9yeSBvciBhIHNwZWNpZmllZCBzdWJkaXJlY3Rvcnkgb2YgeW91ciB2YXVsdC5cIixcbiAgICAgIGlucHV0U2NoZW1hOiB7XG4gICAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAuLi52YXVsdFBhcmFtLFxuICAgICAgICAgIGRpcmVjdG9yeToge1xuICAgICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIk9wdGlvbmFsIHN1YmRpcmVjdG9yeSBwYXRoIHJlbGF0aXZlIHRvIHZhdWx0IHJvb3RcIixcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwiZ2V0X2ZpbGVcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkdldCB0aGUgY29udGVudCBvZiBhIGZpbGUgZnJvbSB5b3VyIHZhdWx0LlwiLFxuICAgICAgaW5wdXRTY2hlbWE6IHtcbiAgICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgIC4uLnZhdWx0UGFyYW0sXG4gICAgICAgICAgZmlsZW5hbWU6IHtcbiAgICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJQYXRoIHRvIHRoZSBmaWxlIHJlbGF0aXZlIHRvIHZhdWx0IHJvb3RcIixcbiAgICAgICAgICB9LFxuICAgICAgICAgIGZvcm1hdDoge1xuICAgICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICAgIGVudW06IFtcIm1hcmtkb3duXCIsIFwianNvblwiXSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIlJldHVybiBmb3JtYXQgKGpzb24gaW5jbHVkZXMgZnJvbnRtYXR0ZXIpXCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgcmVxdWlyZWQ6IFtcImZpbGVuYW1lXCJdLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwiY3JlYXRlX2ZpbGVcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkNyZWF0ZSBhIG5ldyBmaWxlIGluIHlvdXIgdmF1bHQgb3IgdXBkYXRlIGFuIGV4aXN0aW5nIG9uZS5cIixcbiAgICAgIGlucHV0U2NoZW1hOiB7XG4gICAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAuLi52YXVsdFBhcmFtLFxuICAgICAgICAgIGZpbGVuYW1lOiB7XG4gICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiUGF0aCB0byB0aGUgZmlsZSByZWxhdGl2ZSB0byB2YXVsdCByb290XCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjb250ZW50OiB7IHR5cGU6IFwic3RyaW5nXCIsIGRlc2NyaXB0aW9uOiBcIkZpbGUgY29udGVudFwiIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHJlcXVpcmVkOiBbXCJmaWxlbmFtZVwiLCBcImNvbnRlbnRcIl0sXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJhcHBlbmRfdG9fZmlsZVwiLFxuICAgICAgZGVzY3JpcHRpb246IFwiQXBwZW5kIGNvbnRlbnQgdG8gYSBuZXcgb3IgZXhpc3RpbmcgZmlsZS5cIixcbiAgICAgIGlucHV0U2NoZW1hOiB7XG4gICAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAuLi52YXVsdFBhcmFtLFxuICAgICAgICAgIGZpbGVuYW1lOiB7XG4gICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiUGF0aCB0byB0aGUgZmlsZSByZWxhdGl2ZSB0byB2YXVsdCByb290XCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjb250ZW50OiB7XG4gICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiQ29udGVudCB0byBhcHBlbmRcIixcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICByZXF1aXJlZDogW1wiZmlsZW5hbWVcIiwgXCJjb250ZW50XCJdLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwicGF0Y2hfZmlsZVwiLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiSW5zZXJ0IG9yIG1vZGlmeSBjb250ZW50IGluIGEgZmlsZSByZWxhdGl2ZSB0byBhIGhlYWRpbmcsIGJsb2NrIHJlZmVyZW5jZSwgb3IgZnJvbnRtYXR0ZXIgZmllbGQuXCIsXG4gICAgICBpbnB1dFNjaGVtYToge1xuICAgICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgLi4udmF1bHRQYXJhbSxcbiAgICAgICAgICBmaWxlbmFtZTogeyB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgICAgb3BlcmF0aW9uOiB7XG4gICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgZW51bTogW1wiYXBwZW5kXCIsIFwicHJlcGVuZFwiLCBcInJlcGxhY2VcIl0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0YXJnZXRUeXBlOiB7XG4gICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgZW51bTogW1wiaGVhZGluZ1wiLCBcImJsb2NrXCIsIFwiZnJvbnRtYXR0ZXJcIl0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0YXJnZXQ6IHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgICAgIGNvbnRlbnQ6IHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgICAgIGNvbnRlbnRUeXBlOiB7XG4gICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgZW51bTogW1widGV4dC9tYXJrZG93blwiLCBcImFwcGxpY2F0aW9uL2pzb25cIl0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0YXJnZXREZWxpbWl0ZXI6IHsgdHlwZTogXCJzdHJpbmdcIiwgZGVmYXVsdDogXCI6OlwiIH0sXG4gICAgICAgICAgdHJpbVRhcmdldFdoaXRlc3BhY2U6IHsgdHlwZTogXCJib29sZWFuXCIsIGRlZmF1bHQ6IHRydWUgfSxcbiAgICAgICAgfSxcbiAgICAgICAgcmVxdWlyZWQ6IFtcImZpbGVuYW1lXCIsIFwib3BlcmF0aW9uXCIsIFwidGFyZ2V0VHlwZVwiLCBcInRhcmdldFwiLCBcImNvbnRlbnRcIl0sXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJkZWxldGVfZmlsZVwiLFxuICAgICAgZGVzY3JpcHRpb246IFwiRGVsZXRlIGEgZmlsZSBmcm9tIHlvdXIgdmF1bHQuXCIsXG4gICAgICBpbnB1dFNjaGVtYToge1xuICAgICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgLi4udmF1bHRQYXJhbSxcbiAgICAgICAgICBmaWxlbmFtZToge1xuICAgICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIlBhdGggdG8gdGhlIGZpbGUgcmVsYXRpdmUgdG8gdmF1bHQgcm9vdFwiLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHJlcXVpcmVkOiBbXCJmaWxlbmFtZVwiXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcInNlYXJjaFwiLFxuICAgICAgZGVzY3JpcHRpb246IFwiU2VhcmNoIGZvciBkb2N1bWVudHMgbWF0Y2hpbmcgYSB0ZXh0IHF1ZXJ5IGluIHlvdXIgdmF1bHQuXCIsXG4gICAgICBpbnB1dFNjaGVtYToge1xuICAgICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgLi4udmF1bHRQYXJhbSxcbiAgICAgICAgICBxdWVyeTogeyB0eXBlOiBcInN0cmluZ1wiLCBkZXNjcmlwdGlvbjogXCJUZXh0IHRvIHNlYXJjaCBmb3JcIiB9LFxuICAgICAgICAgIGRpcmVjdG9yeToge1xuICAgICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIk9wdGlvbmFsIGRpcmVjdG9yeSB0byBzY29wZSB0aGUgc2VhcmNoXCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjb250ZXh0TGVuZ3RoOiB7XG4gICAgICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiQ2hhcmFjdGVycyBvZiBjb250ZXh0IGFyb3VuZCBlYWNoIG1hdGNoXCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgcmVxdWlyZWQ6IFtcInF1ZXJ5XCJdLFxuICAgICAgfSxcbiAgICB9LFxuICBdO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIGhhbmRsZVJlcXVlc3QobXNnOiBKU09OUlBDUmVxdWVzdCk6IFByb21pc2U8SlNPTlJQQ1Jlc3BvbnNlIHwgbnVsbD4ge1xuICAgIGNvbnN0IHsgbWV0aG9kLCBwYXJhbXMsIGlkIH0gPSBtc2c7XG5cbiAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgY2FzZSBcImluaXRpYWxpemVcIjoge1xuICAgICAgICBjb25zdCBjbGllbnRQcm90b2NvbCA9IHBhcmFtcz8ucHJvdG9jb2xWZXJzaW9uO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGpzb25ycGM6IFwiMi4wXCIsXG4gICAgICAgICAgaWQsXG4gICAgICAgICAgcmVzdWx0OiB7XG4gICAgICAgICAgICBwcm90b2NvbFZlcnNpb246IGNsaWVudFByb3RvY29sIHx8IFwiMjAyNC0xMS0wNVwiLFxuICAgICAgICAgICAgY2FwYWJpbGl0aWVzOiB7IHRvb2xzOiB7fSwgcHJvbXB0czoge30gfSxcbiAgICAgICAgICAgIHNlcnZlckluZm86IHsgbmFtZTogXCJvYnNpZGlhbi1uYXRpdmUtbWNwXCIsIHZlcnNpb246IFwiMC4yLjBcIiB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNhc2UgXCJ0b29scy9saXN0XCI6XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAganNvbnJwYzogXCIyLjBcIixcbiAgICAgICAgICBpZCxcbiAgICAgICAgICByZXN1bHQ6IHsgdG9vbHM6IHRvb2xEZWZpbml0aW9ucyB9LFxuICAgICAgICB9O1xuXG4gICAgICBjYXNlIFwidG9vbHMvY2FsbFwiOiB7XG4gICAgICAgIGNvbnN0IHRvb2xOYW1lID0gcGFyYW1zPy5uYW1lO1xuICAgICAgICBjb25zdCBhcmdzID0gcGFyYW1zPy5hcmd1bWVudHMgfHwge307XG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSB0b29sSGFuZGxlcnNbdG9vbE5hbWUgYXMgc3RyaW5nXTtcbiAgICAgICAgaWYgKCFoYW5kbGVyKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGpzb25ycGM6IFwiMi4wXCIsXG4gICAgICAgICAgICBpZCxcbiAgICAgICAgICAgIGVycm9yOiB7IGNvZGU6IC0zMjYwMSwgbWVzc2FnZTogYFVua25vd24gdG9vbDogJHt0b29sTmFtZX1gIH0sXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGhhbmRsZXIoYXJncyk7XG4gICAgICAgICAgcmV0dXJuIHsganNvbnJwYzogXCIyLjBcIiwgaWQsIHJlc3VsdCB9O1xuICAgICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBqc29ucnBjOiBcIjIuMFwiLFxuICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICBlcnJvcjogeyBjb2RlOiAtMzI2MDMsIG1lc3NhZ2U6IGVyci5tZXNzYWdlIHx8IFN0cmluZyhlcnIpIH0sXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjYXNlIFwicHJvbXB0cy9saXN0XCI6IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBwcm9tcHRWYXVsdCA9IHBhcmFtcz8uYXJndW1lbnRzPy52YXVsdDtcbiAgICAgICAgICBjb25zdCBwcm9tcHRMaXN0ID0gYXdhaXQgcHJvbXB0SGFuZGxlci5saXN0KHByb21wdFZhdWx0KTtcbiAgICAgICAgICByZXR1cm4geyBqc29ucnBjOiBcIjIuMFwiLCBpZCwgcmVzdWx0OiB7IHByb21wdHM6IHByb21wdExpc3QgfSB9O1xuICAgICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBqc29ucnBjOiBcIjIuMFwiLFxuICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICBlcnJvcjogeyBjb2RlOiAtMzI2MDMsIG1lc3NhZ2U6IGVyci5tZXNzYWdlIHx8IFN0cmluZyhlcnIpIH0sXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjYXNlIFwicHJvbXB0cy9nZXRcIjoge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHByb21wdFZhdWx0ID0gcGFyYW1zPy5hcmd1bWVudHM/LnZhdWx0O1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHByb21wdEhhbmRsZXIuZ2V0KHBhcmFtcz8ubmFtZSwgcHJvbXB0VmF1bHQpO1xuICAgICAgICAgIHJldHVybiB7IGpzb25ycGM6IFwiMi4wXCIsIGlkLCByZXN1bHQgfTtcbiAgICAgICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAganNvbnJwYzogXCIyLjBcIixcbiAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgZXJyb3I6IHsgY29kZTogLTMyNjAzLCBtZXNzYWdlOiBlcnIubWVzc2FnZSB8fCBTdHJpbmcoZXJyKSB9LFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY2FzZSBcIm5vdGlmaWNhdGlvbnMvaW5pdGlhbGl6ZWRcIjpcbiAgICAgIGNhc2UgXCJub3RpZmljYXRpb25zL2NhbmNlbGxlZFwiOlxuICAgICAgY2FzZSBcIm5vdGlmaWNhdGlvbnMvcm9vdHMvbGlzdF9jaGFuZ2VkXCI6XG4gICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGpzb25ycGM6IFwiMi4wXCIsXG4gICAgICAgICAgaWQsXG4gICAgICAgICAgZXJyb3I6IHsgY29kZTogLTMyNjAxLCBtZXNzYWdlOiBgTWV0aG9kIG5vdCBmb3VuZDogJHttZXRob2R9YCB9LFxuICAgICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IHRvb2xEZWZpbml0aW9ucywgaGFuZGxlUmVxdWVzdCB9O1xufVxuIiwgImltcG9ydCB7IGhvbWVkaXIsIHBsYXRmb3JtIH0gZnJvbSBcIm9zXCI7XG5pbXBvcnQgeyByZXNvbHZlLCBiYXNlbmFtZSwgam9pbiB9IGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyByZWFkRmlsZVN5bmMsIGV4aXN0c1N5bmMsIHJlYWRkaXJTeW5jLCBzdGF0U3luYyB9IGZyb20gXCJmc1wiO1xuXG5jb25zdCBJU19XSU4gPSBwbGF0Zm9ybSgpID09PSBcIndpbjMyXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmF1bHRDb25maWcge1xuICBuYW1lOiBzdHJpbmc7XG4gIHBhdGg6IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIFZhdWx0UmVnaXN0cnkge1xuICBwcml2YXRlIHZhdWx0czogTWFwPHN0cmluZywgc3RyaW5nPiA9IG5ldyBNYXAoKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBjb25zdCBmcm9tRW52ID0gdGhpcy5wYXJzZUVudigpO1xuICAgIGNvbnN0IGZyb21Db25maWcgPSB0aGlzLnBhcnNlQ29uZmlnRmlsZSgpO1xuXG4gICAgaWYgKGZyb21FbnYubGVuZ3RoID4gMCkge1xuICAgICAgZm9yIChjb25zdCB2IG9mIGZyb21FbnYpIHRoaXMudmF1bHRzLnNldCh2Lm5hbWUsIHYucGF0aCk7XG4gICAgfSBlbHNlIGlmIChmcm9tQ29uZmlnLmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAoY29uc3QgdiBvZiBmcm9tQ29uZmlnKSB0aGlzLnZhdWx0cy5zZXQodi5uYW1lLCB2LnBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIGNvbmZpZ3VyZSh2YXVsdHM6IFZhdWx0Q29uZmlnW10pOiB2b2lkIHtcbiAgICB0aGlzLnZhdWx0cy5jbGVhcigpO1xuICAgIGZvciAoY29uc3QgdiBvZiB2YXVsdHMpIHtcbiAgICAgIHRoaXMudmF1bHRzLnNldCh2Lm5hbWUsIHYucGF0aCk7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGRpc2NvdmVyRnJvbU9ic2lkaWFuKCk6IFZhdWx0Q29uZmlnW10ge1xuICAgIGNvbnN0IGNvbmZpZ1BhdGggPSBvYnNpZGlhbkNvbmZpZ1BhdGgoKTtcbiAgICBpZiAoIWNvbmZpZ1BhdGggfHwgIWV4aXN0c1N5bmMoY29uZmlnUGF0aCkpIHJldHVybiBbXTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByYXcgPSByZWFkRmlsZVN5bmMoY29uZmlnUGF0aCwgXCJ1dGYtOFwiKTtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IEpTT04ucGFyc2UocmF3KTtcbiAgICAgIGNvbnN0IHZhdWx0cyA9IGNvbmZpZy52YXVsdHMgYXMgUmVjb3JkPHN0cmluZywgeyBwYXRoOiBzdHJpbmcgfT47XG4gICAgICBpZiAoIXZhdWx0cykgcmV0dXJuIFtdO1xuXG4gICAgICByZXR1cm4gT2JqZWN0LmVudHJpZXModmF1bHRzKVxuICAgICAgICAuZmlsdGVyKChbLCB2XSkgPT4gdiAmJiB0eXBlb2Ygdi5wYXRoID09PSBcInN0cmluZ1wiKVxuICAgICAgICAubWFwKChbbmFtZSwgdl0pID0+ICh7XG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICBwYXRoOiByZXNvbHZlKHYucGF0aC5yZXBsYWNlKC9efi8sIGhvbWVkaXIoKSkpLFxuICAgICAgICB9KSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG5cbiAgcmVzb2x2ZShuYW1lPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAobmFtZSkge1xuICAgICAgY29uc3QgcGF0aCA9IHRoaXMudmF1bHRzLmdldChuYW1lKTtcbiAgICAgIGlmICghcGF0aCkge1xuICAgICAgICBjb25zdCBhdmFpbGFibGUgPSB0aGlzLmxpc3QoKVxuICAgICAgICAgIC5tYXAoKHYpID0+IHYubmFtZSlcbiAgICAgICAgICAuam9pbihcIiwgXCIpO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gdmF1bHQgXCIke25hbWV9XCIuIEF2YWlsYWJsZSB2YXVsdHM6ICR7YXZhaWxhYmxlfWApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHBhdGg7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudmF1bHRzLnNpemUgPT09IDEpIHtcbiAgICAgIHJldHVybiB0aGlzLnZhdWx0cy52YWx1ZXMoKS5uZXh0KCkudmFsdWUhO1xuICAgIH1cblxuICAgIGNvbnN0IGF2YWlsYWJsZSA9IHRoaXMubGlzdCgpXG4gICAgICAubWFwKCh2KSA9PiB2Lm5hbWUpXG4gICAgICAuam9pbihcIiwgXCIpO1xuICAgIHRocm93IG5ldyBFcnJvcihgTXVsdGlwbGUgdmF1bHRzIGNvbmZpZ3VyZWQgYnV0IG5vIHZhdWx0IHNwZWNpZmllZC4gQ2hvb3NlIG9uZTogJHthdmFpbGFibGV9YCk7XG4gIH1cblxuICBsaXN0KCk6IFZhdWx0Q29uZmlnW10ge1xuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMudmF1bHRzLmVudHJpZXMoKSkubWFwKChbbmFtZSwgcGF0aF0pID0+ICh7XG4gICAgICBuYW1lLFxuICAgICAgcGF0aCxcbiAgICB9KSk7XG4gIH1cblxuICBpbmZvKG5hbWU/OiBzdHJpbmcpOiB7IG5hbWU6IHN0cmluZzsgcGF0aDogc3RyaW5nOyBmaWxlQ291bnQ6IG51bWJlciB9IHtcbiAgICBjb25zdCB2YXVsdFBhdGggPSB0aGlzLnJlc29sdmUobmFtZSk7XG4gICAgbGV0IGZpbGVDb3VudCA9IDA7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHdhbGtEaXIgPSAoZGlyOiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiByZWFkZGlyU3luYyhkaXIpKSB7XG4gICAgICAgICAgY29uc3QgZnVsbCA9IGpvaW4oZGlyLCBlbnRyeSk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXQgPSBzdGF0U3luYyhmdWxsKTtcbiAgICAgICAgICAgIGlmIChzdGF0LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgICAgICAgaWYgKCFlbnRyeS5zdGFydHNXaXRoKFwiLlwiKSkgd2Fsa0RpcihmdWxsKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZW50cnkuZW5kc1dpdGgoXCIubWRcIikpIHtcbiAgICAgICAgICAgICAgZmlsZUNvdW50Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBza2lwIHVucmVhZGFibGUgZW50cmllc1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHdhbGtEaXIodmF1bHRQYXRoKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIHNraXAgdW5yZWFkYWJsZSBkaXJlY3Rvcmllc1xuICAgIH1cbiAgICByZXR1cm4geyBuYW1lOiBiYXNlbmFtZSh2YXVsdFBhdGgpLCBwYXRoOiB2YXVsdFBhdGgsIGZpbGVDb3VudCB9O1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZUVudigpOiBWYXVsdENvbmZpZ1tdIHtcbiAgICBjb25zdCBlbnZWYWwgPSBwcm9jZXNzLmVudi5PQlNJRElBTl9WQVVMVF9QQVRIUztcbiAgICBpZiAoIWVudlZhbCkgcmV0dXJuIFtdO1xuXG4gICAgY29uc3Qgc2VwYXJhdG9yID0gL1s7XFxuXS87XG4gICAgY29uc3QgcGFydHMgPSBlbnZWYWxcbiAgICAgIC5zcGxpdChzZXBhcmF0b3IpXG4gICAgICAubWFwKChzKSA9PiBzLnRyaW0oKSlcbiAgICAgIC5maWx0ZXIoQm9vbGVhbik7XG5cbiAgICByZXR1cm4gcGFydHMubWFwKChwKSA9PiB7XG4gICAgICBjb25zdCByZXNvbHZlZCA9IHJlc29sdmUocC5yZXBsYWNlKC9efi8sIGhvbWVkaXIoKSkpO1xuICAgICAgcmV0dXJuIHsgbmFtZTogYmFzZW5hbWUocmVzb2x2ZWQpLCBwYXRoOiByZXNvbHZlZCB9O1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjb25maWdEaXIoKTogc3RyaW5nIHtcbiAgICBpZiAoSVNfV0lOKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZShcbiAgICAgICAgcHJvY2Vzcy5lbnYuQVBQREFUQSB8fCBqb2luKGhvbWVkaXIoKSwgXCJBcHBEYXRhXCIsIFwiUm9hbWluZ1wiKSxcbiAgICAgICAgXCJvYnNpZGlhbi1uYXRpdmUtbWNwXCIsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCB4ZGcgPSBwcm9jZXNzLmVudi5YREdfQ09ORklHX0hPTUU7XG4gICAgaWYgKHhkZykgcmV0dXJuIHJlc29sdmUoeGRnLCBcIm9ic2lkaWFuLW5hdGl2ZS1tY3BcIik7XG4gICAgcmV0dXJuIHJlc29sdmUoaG9tZWRpcigpLCBcIi5jb25maWdcIiwgXCJvYnNpZGlhbi1uYXRpdmUtbWNwXCIpO1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZUNvbmZpZ0ZpbGUoKTogVmF1bHRDb25maWdbXSB7XG4gICAgY29uc3QgY29uZmlnUGF0aCA9IGpvaW4odGhpcy5jb25maWdEaXIoKSwgXCJ2YXVsdHMuanNvblwiKTtcbiAgICBpZiAoIWV4aXN0c1N5bmMoY29uZmlnUGF0aCkpIHJldHVybiBbXTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByYXcgPSByZWFkRmlsZVN5bmMoY29uZmlnUGF0aCwgXCJ1dGYtOFwiKTtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IEpTT04ucGFyc2UocmF3KTtcbiAgICAgIGNvbnN0IHJlc29sdmVkOiBWYXVsdENvbmZpZ1tdID0gW107XG5cbiAgICAgIGNvbnN0IGVudHJpZXMgPSBjb25maWcudmF1bHRzXG4gICAgICAgID8gKE9iamVjdC5lbnRyaWVzKGNvbmZpZy52YXVsdHMpIGFzIFtzdHJpbmcsIHVua25vd25dW10pXG4gICAgICAgIDogKE9iamVjdC5lbnRyaWVzKGNvbmZpZykuZmlsdGVyKChba10pID0+IGsgIT09IFwiZGVmYXVsdFwiKSBhcyBbc3RyaW5nLCB1bmtub3duXVtdKTtcblxuICAgICAgZm9yIChjb25zdCBbbmFtZSwgcGF0aF0gb2YgZW50cmllcykge1xuICAgICAgICBpZiAodHlwZW9mIHBhdGggPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICByZXNvbHZlZC5wdXNoKHsgbmFtZSwgcGF0aDogcmVzb2x2ZShwYXRoLnJlcGxhY2UoL15+LywgaG9tZWRpcigpKSkgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc29sdmVkO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBvYnNpZGlhbkNvbmZpZ1BhdGgoKTogc3RyaW5nIHwgbnVsbCB7XG4gIGlmIChJU19XSU4pIHtcbiAgICBjb25zdCBhcHBEYXRhID0gcHJvY2Vzcy5lbnYuQVBQREFUQTtcbiAgICBpZiAoIWFwcERhdGEpIHJldHVybiBudWxsO1xuICAgIHJldHVybiByZXNvbHZlKGFwcERhdGEsIFwib2JzaWRpYW5cIiwgXCJvYnNpZGlhbi5qc29uXCIpO1xuICB9XG4gIGlmIChwbGF0Zm9ybSgpID09PSBcImRhcndpblwiKSB7XG4gICAgcmV0dXJuIHJlc29sdmUoaG9tZWRpcigpLCBcIkxpYnJhcnlcIiwgXCJBcHBsaWNhdGlvbiBTdXBwb3J0XCIsIFwib2JzaWRpYW5cIiwgXCJvYnNpZGlhbi5qc29uXCIpO1xuICB9XG4gIGNvbnN0IHhkZyA9IHByb2Nlc3MuZW52LlhER19DT05GSUdfSE9NRTtcbiAgaWYgKHhkZykgcmV0dXJuIHJlc29sdmUoeGRnLCBcIm9ic2lkaWFuXCIsIFwib2JzaWRpYW4uanNvblwiKTtcbiAgcmV0dXJuIHJlc29sdmUoaG9tZWRpcigpLCBcIi5jb25maWdcIiwgXCJvYnNpZGlhblwiLCBcIm9ic2lkaWFuLmpzb25cIik7XG59XG4iLCAiaW1wb3J0IHsgQXBwLCBQbHVnaW5TZXR0aW5nVGFiLCBTZXR0aW5nIH0gZnJvbSBcIm9ic2lkaWFuXCI7XG5pbXBvcnQgeyBWYXVsdFJlZ2lzdHJ5IH0gZnJvbSBcIi4uL3V0aWxzL3ZhdWx0c1wiO1xuaW1wb3J0IHR5cGUgTmF0aXZlTWNwUGx1Z2luIGZyb20gXCIuL21haW5cIjtcblxuZXhwb3J0IGNsYXNzIE5hdGl2ZU1jcFNldHRpbmdUYWIgZXh0ZW5kcyBQbHVnaW5TZXR0aW5nVGFiIHtcbiAgcHJpdmF0ZSBwbHVnaW46IE5hdGl2ZU1jcFBsdWdpbjtcblxuICBjb25zdHJ1Y3RvcihhcHA6IEFwcCwgcGx1Z2luOiBOYXRpdmVNY3BQbHVnaW4pIHtcbiAgICBzdXBlcihhcHAsIHBsdWdpbik7XG4gICAgdGhpcy5wbHVnaW4gPSBwbHVnaW47XG4gIH1cblxuICBkaXNwbGF5KCk6IHZvaWQge1xuICAgIGNvbnN0IHsgY29udGFpbmVyRWwgfSA9IHRoaXM7XG4gICAgY29udGFpbmVyRWwuZW1wdHkoKTtcblxuICAgIGNvbnRhaW5lckVsLmNyZWF0ZUVsKFwiaDJcIiwgeyB0ZXh0OiBcIk9ic2lkaWFuIE5hdGl2ZSBNQ1BcIiB9KTtcblxuICAgIGNvbnN0IHVybCA9IHRoaXMucGx1Z2luLmdldFNlcnZlclVybCgpO1xuICAgIGlmICh1cmwpIHtcbiAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAuc2V0TmFtZShcIk1DUCBTZXJ2ZXIgVVJMXCIpXG4gICAgICAgIC5zZXREZXNjKFwiQWRkIHRoaXMgVVJMIHRvIHlvdXIgQ2xhdWRlIERlc2t0b3AgY29uZmlnXCIpXG4gICAgICAgIC5hZGRUZXh0KCh0ZXh0KSA9PiB7XG4gICAgICAgICAgdGV4dC5zZXRWYWx1ZSh1cmwpLnNldERpc2FibGVkKHRydWUpO1xuICAgICAgICAgIHRleHQuaW5wdXRFbC5zdHlsZS53aWR0aCA9IFwiMTAwJVwiO1xuICAgICAgICB9KVxuICAgICAgICAuYWRkQnV0dG9uKChidG4pID0+IHtcbiAgICAgICAgICBidG4uc2V0QnV0dG9uVGV4dChcIkNvcHlcIikub25DbGljayhhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBhd2FpdCAobmF2aWdhdG9yIGFzIGFueSkuY2xpcGJvYXJkLndyaXRlVGV4dCh1cmwpO1xuICAgICAgICAgICAgYnRuLnNldEJ1dHRvblRleHQoXCJDb3BpZWQhXCIpO1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiBidG4uc2V0QnV0dG9uVGV4dChcIkNvcHlcIiksIDIwMDApO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgIC5zZXROYW1lKFwiU2VydmVyIGluYWN0aXZlXCIpXG4gICAgICAgIC5zZXREZXNjKFwiU2VsZWN0IGF0IGxlYXN0IG9uZSB2YXVsdCBiZWxvdyB0byBzdGFydCB0aGUgTUNQIHNlcnZlci5cIik7XG4gICAgfVxuXG4gICAgY29udGFpbmVyRWwuY3JlYXRlRWwoXCJoM1wiLCB7IHRleHQ6IFwiVmF1bHRzXCIgfSk7XG5cbiAgICBjb25zdCBhbGxWYXVsdHMgPSBWYXVsdFJlZ2lzdHJ5LmRpc2NvdmVyRnJvbU9ic2lkaWFuKCk7XG4gICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLnBsdWdpbi5nZXRTZXR0aW5ncygpLnNlbGVjdGVkVmF1bHRzO1xuXG4gICAgaWYgKGFsbFZhdWx0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnRhaW5lckVsLmNyZWF0ZUVsKFwicFwiLCB7XG4gICAgICAgIHRleHQ6IFwiTm8gT2JzaWRpYW4gdmF1bHRzIGZvdW5kLiBNYWtlIHN1cmUgT2JzaWRpYW4gaGFzIGJlZW4gc3RhcnRlZCBhdCBsZWFzdCBvbmNlLlwiLFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCB2YXVsdCBvZiBhbGxWYXVsdHMpIHtcbiAgICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSBzZWxlY3RlZC5pbmNsdWRlcyh2YXVsdC5uYW1lKTtcbiAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAuc2V0TmFtZSh2YXVsdC5uYW1lKVxuICAgICAgICAuc2V0RGVzYyh2YXVsdC5wYXRoKVxuICAgICAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XG4gICAgICAgICAgdG9nZ2xlLnNldFZhbHVlKGlzU2VsZWN0ZWQpLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbmV3U2VsZWN0ZWQgPSB2YWx1ZVxuICAgICAgICAgICAgICA/IFsuLi5zZWxlY3RlZCwgdmF1bHQubmFtZV1cbiAgICAgICAgICAgICAgOiBzZWxlY3RlZC5maWx0ZXIoKG4pID0+IG4gIT09IHZhdWx0Lm5hbWUpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4udXBkYXRlU2VsZWN0ZWRWYXVsdHMobmV3U2VsZWN0ZWQpO1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5KCk7XG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgfVxuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFBQUEsbUJBQXVCOzs7QUNBdkIsa0JBQWlCO0FBR1YsSUFBTSxnQkFBTixNQUFvQjtBQUFBLEVBQ2pCLGlCQUNOO0FBQUEsRUFDTSxTQUE2QjtBQUFBLEVBQzdCLFdBQVcsb0JBQUksSUFBaUM7QUFBQSxFQUNoRCxPQUFPO0FBQUEsRUFFZixJQUFJLE1BQWM7QUFDaEIsV0FBTyxvQkFBb0IsS0FBSyxJQUFJO0FBQUEsRUFDdEM7QUFBQSxFQUVBLElBQUksYUFBcUI7QUFDdkIsV0FBTyxLQUFLO0FBQUEsRUFDZDtBQUFBLEVBRUEsVUFBVSxTQUE2RTtBQUNyRixT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RUFFQSxNQUFNLHFCQUFxQixPQUFnQztBQUN6RCxTQUFLLFNBQVMsaUJBQWlCO0FBQy9CLFVBQU0sS0FBSyxhQUFhO0FBRXhCLFVBQU0sWUFBWSxjQUFjLHFCQUFxQjtBQUNyRCxVQUFNLFdBQVcsVUFBVSxPQUFPLENBQUMsTUFBTSxNQUFNLFNBQVMsRUFBRSxJQUFJLENBQUM7QUFDL0QsU0FBSyxTQUFTLFVBQVUsUUFBUTtBQUVoQyxRQUFJLFNBQVMsU0FBUyxHQUFHO0FBQ3ZCLFlBQU0sS0FBSyxZQUFZO0FBQUEsSUFDekIsT0FBTztBQUNMLFdBQUssV0FBVyxNQUFNO0FBQ3RCLFdBQUssWUFBWTtBQUFBLElBQ25CO0FBQUEsRUFDRjtBQUFBLEVBRUEsV0FBaUI7QUFDZixTQUFLLFdBQVcsTUFBTTtBQUFBLEVBQ3hCO0FBQ0Y7IiwKICAibmFtZXMiOiBbImltcG9ydF9vYnNpZGlhbiIsICJyZXNvbHZlIiwgImh0dHAiLCAiaW1wb3J0X2ZzIiwgImltcG9ydF9wcm9taXNlcyIsICJpbXBvcnRfcGF0aCIsICJpbXBvcnRfZnMiLCAiaW1wb3J0X3Byb21pc2VzIiwgImltcG9ydF9wYXRoIiwgInBhcnNlRnJvbnRtYXR0ZXIiLCAiaW1wb3J0X3BhdGgiLCAiaW1wb3J0X2ZzIiwgImF2YWlsYWJsZSIsICJ3YWxrRGlyIl0KfQo=
1298
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL3BsdWdpbi9tYWluLnRzIiwgIi4uLy4uL3NyYy9tY3AvaHR0cC10cmFuc3BvcnQudHMiLCAiLi4vLi4vc3JjL3V0aWxzL2xvZy50cyIsICIuLi8uLi9zcmMvdXRpbHMvZnMtdXRpbHMudHMiLCAiLi4vLi4vc3JjL3V0aWxzL3NlYXJjaC50cyIsICIuLi8uLi9zcmMvaGFuZGxlcnMvdG9vbHMudHMiLCAiLi4vLi4vc3JjL2hhbmRsZXJzL3Byb21wdHMudHMiLCAiLi4vLi4vc3JjL21jcC9zZXJ2ZXIudHMiLCAiLi4vLi4vc3JjL3V0aWxzL3ZhdWx0cy50cyIsICIuLi8uLi9zcmMvcGx1Z2luL3NldHRpbmdzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBQbHVnaW4gfSBmcm9tIFwib2JzaWRpYW5cIjtcbmltcG9ydCB7IEh0dHBUcmFuc3BvcnQgfSBmcm9tIFwiLi4vbWNwL2h0dHAtdHJhbnNwb3J0XCI7XG5pbXBvcnQgeyBjcmVhdGVTZXJ2ZXIgfSBmcm9tIFwiLi4vbWNwL3NlcnZlclwiO1xuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyLCBmb3JtYXRFcnJvciB9IGZyb20gXCIuLi91dGlscy9sb2dcIjtcbmltcG9ydCB7IFZhdWx0UmVnaXN0cnkgfSBmcm9tIFwiLi4vdXRpbHMvdmF1bHRzXCI7XG5pbXBvcnQgeyBOYXRpdmVNY3BTZXR0aW5nVGFiIH0gZnJvbSBcIi4vc2V0dGluZ3NcIjtcblxuY29uc3QgbG9nID0gY3JlYXRlTG9nZ2VyKFwicGx1Z2luXCIpO1xuXG5pbnRlcmZhY2UgUGx1Z2luU2V0dGluZ3Mge1xuICBzZWxlY3RlZFZhdWx0czogc3RyaW5nW107XG59XG5cbmNvbnN0IERFRkFVTFRfU0VUVElOR1M6IFBsdWdpblNldHRpbmdzID0ge1xuICBzZWxlY3RlZFZhdWx0czogW10sXG59O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBOYXRpdmVNY3BQbHVnaW4gZXh0ZW5kcyBQbHVnaW4ge1xuICBwcml2YXRlIHRyYW5zcG9ydDogSHR0cFRyYW5zcG9ydCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHNldHRpbmdzOiBQbHVnaW5TZXR0aW5ncyA9IERFRkFVTFRfU0VUVElOR1M7XG4gIHByaXZhdGUgcmVnaXN0cnkgPSBuZXcgVmF1bHRSZWdpc3RyeSgpO1xuXG4gIGFzeW5jIG9ubG9hZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmxvYWRTZXR0aW5ncygpO1xuXG4gICAgY29uc3QgYWxsVmF1bHRzID0gVmF1bHRSZWdpc3RyeS5kaXNjb3ZlckZyb21PYnNpZGlhbigpO1xuICAgIGxvZy5pbmZvKFwicGx1Z2luIGxvYWRpbmdcIiwge1xuICAgICAgZGlzY292ZXJlZFZhdWx0Q291bnQ6IGFsbFZhdWx0cy5sZW5ndGgsXG4gICAgICBzZWxlY3RlZFZhdWx0Q291bnQ6IHRoaXMuc2V0dGluZ3Muc2VsZWN0ZWRWYXVsdHMubGVuZ3RoLFxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuc2V0dGluZ3Muc2VsZWN0ZWRWYXVsdHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgc2VsZWN0ZWQgPSBhbGxWYXVsdHMuZmlsdGVyKCh2KSA9PiB0aGlzLnNldHRpbmdzLnNlbGVjdGVkVmF1bHRzLmluY2x1ZGVzKHYubmFtZSkpO1xuICAgICAgaWYgKHNlbGVjdGVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5yZWdpc3RyeS5jb25maWd1cmUoc2VsZWN0ZWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLnJlZ2lzdHJ5Lmxpc3QoKS5sZW5ndGggPiAwKSB7XG4gICAgICBhd2FpdCB0aGlzLnN0YXJ0U2VydmVyKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZy53YXJuKFwicGx1Z2luIHN0YXJ0ZWQgd2l0aG91dCBhY3RpdmUgdmF1bHRzXCIsIHtcbiAgICAgICAgaGludDogXCJTZWxlY3QgYXQgbGVhc3Qgb25lIHZhdWx0IGluIHBsdWdpbiBzZXR0aW5nc1wiLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5hZGRTZXR0aW5nVGFiKG5ldyBOYXRpdmVNY3BTZXR0aW5nVGFiKHRoaXMuYXBwLCB0aGlzKSk7XG4gIH1cblxuICBhc3luYyBzdGFydFNlcnZlcigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnRyYW5zcG9ydD8uY2xvc2UoKTtcblxuICAgIGNvbnN0IHZhdWx0cyA9IHRoaXMucmVnaXN0cnkubGlzdCgpO1xuICAgIGxvZy5pbmZvKFwic3RhcnRpbmcgcGx1Z2luIHRyYW5zcG9ydFwiLCB7IHZhdWx0Q291bnQ6IHZhdWx0cy5sZW5ndGggfSk7XG5cbiAgICBjb25zdCBzZXJ2ZXIgPSBjcmVhdGVTZXJ2ZXIodGhpcy5yZWdpc3RyeSk7XG4gICAgdGhpcy50cmFuc3BvcnQgPSBuZXcgSHR0cFRyYW5zcG9ydCgpO1xuICAgIHRoaXMudHJhbnNwb3J0Lm9uUmVxdWVzdChhc3luYyAobXNnKSA9PiBzZXJ2ZXIuaGFuZGxlUmVxdWVzdChtc2cpKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy50cmFuc3BvcnQuc3RhcnQoKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZy5lcnJvcihcImZhaWxlZCB0byBzdGFydCBwbHVnaW4gdHJhbnNwb3J0XCIsIHsgZXJyb3I6IGZvcm1hdEVycm9yKGVycikgfSk7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9XG5cbiAgcmVzdGFydFNlcnZlcigpOiB2b2lkIHtcbiAgICB2b2lkIHRoaXMuc3RhcnRTZXJ2ZXIoKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICBsb2cuZXJyb3IoXCJmYWlsZWQgdG8gcmVzdGFydCBwbHVnaW4gdHJhbnNwb3J0XCIsIHsgZXJyb3I6IGZvcm1hdEVycm9yKGVycikgfSk7XG4gICAgfSk7XG4gIH1cblxuICBnZXRTZXJ2ZXJVcmwoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNwb3J0Py51cmwgPz8gbnVsbDtcbiAgfVxuXG4gIGdldFJlZ2lzdHJ5KCk6IFZhdWx0UmVnaXN0cnkge1xuICAgIHJldHVybiB0aGlzLnJlZ2lzdHJ5O1xuICB9XG5cbiAgYXN5bmMgbG9hZFNldHRpbmdzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuc2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKHt9LCBERUZBVUxUX1NFVFRJTkdTLCBhd2FpdCB0aGlzLmxvYWREYXRhKCkpO1xuICB9XG5cbiAgYXN5bmMgc2F2ZVNldHRpbmdzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuc2F2ZURhdGEodGhpcy5zZXR0aW5ncyk7XG4gIH1cblxuICBnZXRTZXR0aW5ncygpOiBQbHVnaW5TZXR0aW5ncyB7XG4gICAgcmV0dXJuIHRoaXMuc2V0dGluZ3M7XG4gIH1cblxuICBhc3luYyB1cGRhdGVTZWxlY3RlZFZhdWx0cyhuYW1lczogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnNldHRpbmdzLnNlbGVjdGVkVmF1bHRzID0gbmFtZXM7XG4gICAgYXdhaXQgdGhpcy5zYXZlU2V0dGluZ3MoKTtcblxuICAgIGNvbnN0IGFsbFZhdWx0cyA9IFZhdWx0UmVnaXN0cnkuZGlzY292ZXJGcm9tT2JzaWRpYW4oKTtcbiAgICBjb25zdCBzZWxlY3RlZCA9IGFsbFZhdWx0cy5maWx0ZXIoKHYpID0+IG5hbWVzLmluY2x1ZGVzKHYubmFtZSkpO1xuICAgIHRoaXMucmVnaXN0cnkuY29uZmlndXJlKHNlbGVjdGVkKTtcbiAgICBsb2cuaW5mbyhcInVwZGF0ZWQgc2VsZWN0ZWQgdmF1bHRzXCIsIHsgc2VsZWN0ZWRWYXVsdENvdW50OiBzZWxlY3RlZC5sZW5ndGggfSk7XG5cbiAgICBpZiAoc2VsZWN0ZWQubGVuZ3RoID4gMCkge1xuICAgICAgYXdhaXQgdGhpcy5zdGFydFNlcnZlcigpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRyYW5zcG9ydD8uY2xvc2UoKTtcbiAgICAgIHRoaXMudHJhbnNwb3J0ID0gbnVsbDtcbiAgICAgIGxvZy53YXJuKFwic3RvcHBlZCBwbHVnaW4gdHJhbnNwb3J0IGJlY2F1c2Ugbm8gdmF1bHRzIGFyZSBzZWxlY3RlZFwiKTtcbiAgICB9XG4gIH1cblxuICBvbnVubG9hZCgpOiB2b2lkIHtcbiAgICB0aGlzLnRyYW5zcG9ydD8uY2xvc2UoKTtcbiAgICBsb2cuaW5mbyhcInBsdWdpbiB1bmxvYWRlZFwiKTtcbiAgfVxufVxuIiwgImltcG9ydCBodHRwIGZyb20gXCJodHRwXCI7XG5pbXBvcnQgdHlwZSB7IEpTT05SUENSZXF1ZXN0LCBKU09OUlBDUmVzcG9uc2UgfSBmcm9tIFwiLi9wcm90b2NvbFwiO1xuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyLCBmb3JtYXRFcnJvciB9IGZyb20gXCIuLi91dGlscy9sb2dcIjtcblxuY29uc3QgbG9nID0gY3JlYXRlTG9nZ2VyKFwiaHR0cFwiKTtcblxuZXhwb3J0IGNsYXNzIEh0dHBUcmFuc3BvcnQge1xuICBwcml2YXRlIHJlcXVlc3RIYW5kbGVyOiAoKHJlcXVlc3Q6IEpTT05SUENSZXF1ZXN0KSA9PiBQcm9taXNlPEpTT05SUENSZXNwb25zZSB8IG51bGw+KSB8IG51bGwgPVxuICAgIG51bGw7XG4gIHByaXZhdGUgc2VydmVyOiBodHRwLlNlcnZlciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHNlc3Npb25zID0gbmV3IE1hcDxzdHJpbmcsIGh0dHAuU2VydmVyUmVzcG9uc2U+KCk7XG4gIHByaXZhdGUgcG9ydCA9IDA7XG5cbiAgZ2V0IHVybCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgaHR0cDovLzEyNy4wLjAuMToke3RoaXMucG9ydH0vc3NlYDtcbiAgfVxuXG4gIGdldCBhY3R1YWxQb3J0KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucG9ydDtcbiAgfVxuXG4gIG9uUmVxdWVzdChoYW5kbGVyOiAocmVxdWVzdDogSlNPTlJQQ1JlcXVlc3QpID0+IFByb21pc2U8SlNPTlJQQ1Jlc3BvbnNlIHwgbnVsbD4pOiB2b2lkIHtcbiAgICB0aGlzLnJlcXVlc3RIYW5kbGVyID0gaGFuZGxlcjtcbiAgfVxuXG4gIHNlbmRNZXNzYWdlKF9tZXNzYWdlOiBKU09OUlBDUmVzcG9uc2UpOiB2b2lkIHtcbiAgICAvLyBNZXNzYWdlcyBzZW50IGJhY2sgdmlhIFNTRSByZXNwb25zZSwgbm90IGRpcmVjdGx5XG4gIH1cblxuICBzdGFydCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5zZXJ2ZXIgPSBodHRwLmNyZWF0ZVNlcnZlcigocmVxLCByZXMpID0+IHtcbiAgICAgICAgdGhpcy5oYW5kbGVSZXF1ZXN0KHJlcSwgcmVzKTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnNlcnZlci5vbihcImVycm9yXCIsIChlcnIpID0+IHtcbiAgICAgICAgbG9nLmVycm9yKFwiaHR0cCB0cmFuc3BvcnQgZmFpbGVkXCIsIHsgZXJyb3I6IGZvcm1hdEVycm9yKGVycikgfSk7XG4gICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuc2VydmVyLmxpc3RlbigwLCBcIjEyNy4wLjAuMVwiLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGFkZHIgPSB0aGlzLnNlcnZlciEuYWRkcmVzcygpO1xuICAgICAgICBpZiAoYWRkciAmJiB0eXBlb2YgYWRkciA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgIHRoaXMucG9ydCA9IGFkZHIucG9ydDtcbiAgICAgICAgfVxuICAgICAgICBsb2cuaW5mbyhcImh0dHAgdHJhbnNwb3J0IHJlYWR5XCIsIHsgdXJsOiB0aGlzLnVybCB9KTtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBjbG9zZSgpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IHJlcyBvZiB0aGlzLnNlc3Npb25zLnZhbHVlcygpKSB7XG4gICAgICByZXMuZW5kKCk7XG4gICAgfVxuICAgIHRoaXMuc2Vzc2lvbnMuY2xlYXIoKTtcbiAgICB0aGlzLnNlcnZlcj8uY2xvc2UoKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlUmVxdWVzdChyZXE6IGh0dHAuSW5jb21pbmdNZXNzYWdlLCByZXM6IGh0dHAuU2VydmVyUmVzcG9uc2UpOiB2b2lkIHtcbiAgICAvLyBDT1JTIGhlYWRlcnMgZm9yIENsYXVkZSBEZXNrdG9wXG4gICAgcmVzLnNldEhlYWRlcihcIkFjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpblwiLCBcIipcIik7XG4gICAgcmVzLnNldEhlYWRlcihcIkFjY2Vzcy1Db250cm9sLUFsbG93LU1ldGhvZHNcIiwgXCJHRVQsIFBPU1QsIE9QVElPTlNcIik7XG4gICAgcmVzLnNldEhlYWRlcihcIkFjY2Vzcy1Db250cm9sLUFsbG93LUhlYWRlcnNcIiwgXCJDb250ZW50LVR5cGVcIik7XG5cbiAgICBpZiAocmVxLm1ldGhvZCA9PT0gXCJPUFRJT05TXCIpIHtcbiAgICAgIHJlcy53cml0ZUhlYWQoMjA0KTtcbiAgICAgIHJlcy5lbmQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHJlcS51cmwgfHwgXCIvXCIsIGBodHRwOi8vJHtyZXEuaGVhZGVycy5ob3N0IHx8IFwibG9jYWxob3N0XCJ9YCk7XG5cbiAgICBpZiAocmVxLm1ldGhvZCA9PT0gXCJHRVRcIiAmJiB1cmwucGF0aG5hbWUgPT09IFwiL3NzZVwiKSB7XG4gICAgICB0aGlzLmhhbmRsZVNTRShyZXEsIHJlcyk7XG4gICAgfSBlbHNlIGlmIChyZXEubWV0aG9kID09PSBcIlBPU1RcIiAmJiB1cmwucGF0aG5hbWUgPT09IFwiL21lc3NhZ2VcIikge1xuICAgICAgdGhpcy5oYW5kbGVNZXNzYWdlKHJlcSwgcmVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLndhcm4oXCJyZWNlaXZlZCByZXF1ZXN0IGZvciB1bmtub3duIHJvdXRlXCIsIHtcbiAgICAgICAgbWV0aG9kOiByZXEubWV0aG9kIHx8IFwiVU5LTk9XTlwiLFxuICAgICAgICBwYXRoOiB1cmwucGF0aG5hbWUsXG4gICAgICB9KTtcbiAgICAgIHJlcy53cml0ZUhlYWQoNDA0KTtcbiAgICAgIHJlcy5lbmQoXCJOb3QgZm91bmRcIik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVTU0UocmVxOiBodHRwLkluY29taW5nTWVzc2FnZSwgcmVzOiBodHRwLlNlcnZlclJlc3BvbnNlKTogdm9pZCB7XG4gICAgY29uc3Qgc2Vzc2lvbklkID0gZ2VuZXJhdGVJZCgpO1xuXG4gICAgcmVzLndyaXRlSGVhZCgyMDAsIHtcbiAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwidGV4dC9ldmVudC1zdHJlYW1cIixcbiAgICAgIFwiQ2FjaGUtQ29udHJvbFwiOiBcIm5vLWNhY2hlXCIsXG4gICAgICBDb25uZWN0aW9uOiBcImtlZXAtYWxpdmVcIixcbiAgICB9KTtcblxuICAgIGNvbnN0IG1lc3NhZ2VVcmwgPSBgL21lc3NhZ2U/c2Vzc2lvbl9pZD0ke3Nlc3Npb25JZH1gO1xuICAgIHJlcy53cml0ZShgZXZlbnQ6IGVuZHBvaW50XFxuZGF0YTogJHttZXNzYWdlVXJsfVxcblxcbmApO1xuXG4gICAgbG9nLmluZm8oXCJzc2Ugc2Vzc2lvbiBvcGVuZWRcIiwgeyBzZXNzaW9uSWQgfSk7XG5cbiAgICB0aGlzLnNlc3Npb25zLnNldChzZXNzaW9uSWQsIHJlcyk7XG5cbiAgICByZXEub24oXCJjbG9zZVwiLCAoKSA9PiB7XG4gICAgICB0aGlzLnNlc3Npb25zLmRlbGV0ZShzZXNzaW9uSWQpO1xuICAgICAgbG9nLmluZm8oXCJzc2Ugc2Vzc2lvbiBjbG9zZWRcIiwgeyBzZXNzaW9uSWQgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZU1lc3NhZ2UocmVxOiBodHRwLkluY29taW5nTWVzc2FnZSwgcmVzOiBodHRwLlNlcnZlclJlc3BvbnNlKTogdm9pZCB7XG4gICAgY29uc3QgdXJsID0gbmV3IFVSTChyZXEudXJsIHx8IFwiL1wiLCBgaHR0cDovLyR7cmVxLmhlYWRlcnMuaG9zdCB8fCBcImxvY2FsaG9zdFwifWApO1xuICAgIGNvbnN0IHNlc3Npb25JZCA9IHVybC5zZWFyY2hQYXJhbXMuZ2V0KFwic2Vzc2lvbl9pZFwiKTtcblxuICAgIGlmICghc2Vzc2lvbklkIHx8ICF0aGlzLnNlc3Npb25zLmhhcyhzZXNzaW9uSWQpKSB7XG4gICAgICBsb2cud2FybihcInJlamVjdGVkIG1lc3NhZ2UgZm9yIHVua25vd24gc2Vzc2lvblwiLCB7IHNlc3Npb25JZDogc2Vzc2lvbklkIHx8IG51bGwgfSk7XG4gICAgICByZXMud3JpdGVIZWFkKDQwMCk7XG4gICAgICByZXMuZW5kKFwiSW52YWxpZCBvciBtaXNzaW5nIHNlc3Npb25faWRcIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IGJvZHkgPSBcIlwiO1xuICAgIHJlcS5vbihcImRhdGFcIiwgKGNodW5rOiBCdWZmZXIpID0+IHtcbiAgICAgIGJvZHkgKz0gY2h1bmsudG9TdHJpbmcoKTtcbiAgICB9KTtcbiAgICByZXEub24oXCJlbmRcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgbXNnID0gSlNPTi5wYXJzZShib2R5KTtcbiAgICAgICAgaWYgKG1zZy5qc29ucnBjICE9PSBcIjIuMFwiIHx8ICEoXCJtZXRob2RcIiBpbiBtc2cpIHx8ICEoXCJpZFwiIGluIG1zZykpIHtcbiAgICAgICAgICBsb2cud2FybihcInJlamVjdGVkIGludmFsaWQganNvbi1ycGMgcGF5bG9hZFwiLCB7IHNlc3Npb25JZCB9KTtcbiAgICAgICAgICByZXMud3JpdGVIZWFkKDQwMCk7XG4gICAgICAgICAgcmVzLmVuZChcIkludmFsaWQgSlNPTi1SUEMgbWVzc2FnZVwiKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMucmVxdWVzdEhhbmRsZXI/Lihtc2cgYXMgSlNPTlJQQ1JlcXVlc3QpO1xuICAgICAgICBpZiAocmVzcG9uc2UpIHtcbiAgICAgICAgICBjb25zdCBzc2VSZXMgPSB0aGlzLnNlc3Npb25zLmdldChzZXNzaW9uSWQpO1xuICAgICAgICAgIGlmIChzc2VSZXMpIHtcbiAgICAgICAgICAgIHNzZVJlcy53cml0ZShgZXZlbnQ6IG1lc3NhZ2VcXG5kYXRhOiAke0pTT04uc3RyaW5naWZ5KHJlc3BvbnNlKX1cXG5cXG5gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXMud3JpdGVIZWFkKDIwMik7XG4gICAgICAgIHJlcy5lbmQoKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBsb2cuZXJyb3IoXCJmYWlsZWQgdG8gaGFuZGxlIGh0dHAgbWVzc2FnZVwiLCB7XG4gICAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICAgIGVycm9yOiBmb3JtYXRFcnJvcihlcnIpLFxuICAgICAgICB9KTtcbiAgICAgICAgcmVzLndyaXRlSGVhZCg0MDApO1xuICAgICAgICByZXMuZW5kKFwiSW52YWxpZCBKU09OXCIpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlSWQoKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNyeXB0by5yYW5kb21VVUlEKCk7XG59XG4iLCAidHlwZSBMb2dMZXZlbCA9IFwiREVCVUdcIiB8IFwiSU5GT1wiIHwgXCJXQVJOXCIgfCBcIkVSUk9SXCI7XG5cbnR5cGUgTG9nVmFsdWUgPSBib29sZWFuIHwgbnVtYmVyIHwgc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZDtcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUxvZ2dlcihjb21wb25lbnQ6IHN0cmluZykge1xuICByZXR1cm4ge1xuICAgIGRlYnVnOiAobWVzc2FnZTogc3RyaW5nLCBmaWVsZHM/OiBSZWNvcmQ8c3RyaW5nLCBMb2dWYWx1ZT4pID0+XG4gICAgICB3cml0ZUxvZyhcIkRFQlVHXCIsIGNvbXBvbmVudCwgbWVzc2FnZSwgZmllbGRzKSxcbiAgICBpbmZvOiAobWVzc2FnZTogc3RyaW5nLCBmaWVsZHM/OiBSZWNvcmQ8c3RyaW5nLCBMb2dWYWx1ZT4pID0+XG4gICAgICB3cml0ZUxvZyhcIklORk9cIiwgY29tcG9uZW50LCBtZXNzYWdlLCBmaWVsZHMpLFxuICAgIHdhcm46IChtZXNzYWdlOiBzdHJpbmcsIGZpZWxkcz86IFJlY29yZDxzdHJpbmcsIExvZ1ZhbHVlPikgPT5cbiAgICAgIHdyaXRlTG9nKFwiV0FSTlwiLCBjb21wb25lbnQsIG1lc3NhZ2UsIGZpZWxkcyksXG4gICAgZXJyb3I6IChtZXNzYWdlOiBzdHJpbmcsIGZpZWxkcz86IFJlY29yZDxzdHJpbmcsIExvZ1ZhbHVlPikgPT5cbiAgICAgIHdyaXRlTG9nKFwiRVJST1JcIiwgY29tcG9uZW50LCBtZXNzYWdlLCBmaWVsZHMpLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0RXJyb3IoZXJyOiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKGVyciBpbnN0YW5jZW9mIEVycm9yKSByZXR1cm4gZXJyLnN0YWNrIHx8IGVyci5tZXNzYWdlO1xuICByZXR1cm4gU3RyaW5nKGVycik7XG59XG5cbmZ1bmN0aW9uIHdyaXRlTG9nKFxuICBsZXZlbDogTG9nTGV2ZWwsXG4gIGNvbXBvbmVudDogc3RyaW5nLFxuICBtZXNzYWdlOiBzdHJpbmcsXG4gIGZpZWxkczogUmVjb3JkPHN0cmluZywgTG9nVmFsdWU+ID0ge30sXG4pOiB2b2lkIHtcbiAgY29uc3Qgc2VyaWFsaXplZEZpZWxkcyA9IE9iamVjdC5lbnRyaWVzKGZpZWxkcylcbiAgICAuZmlsdGVyKChbLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQpXG4gICAgLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBgJHtrZXl9PSR7SlNPTi5zdHJpbmdpZnkodmFsdWUpfWApXG4gICAgLmpvaW4oXCIgXCIpO1xuICBjb25zdCBsaW5lID0gW1xuICAgIG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICBsZXZlbCxcbiAgICBgY29tcG9uZW50PSR7Y29tcG9uZW50fWAsXG4gICAgbWVzc2FnZSxcbiAgICBzZXJpYWxpemVkRmllbGRzLFxuICBdXG4gICAgLmZpbHRlcihCb29sZWFuKVxuICAgIC5qb2luKFwiIFwiKTtcbiAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoYCR7bGluZX1cXG5gKTtcbn1cbiIsICJpbXBvcnQgeyByZWFkZGlyU3luYywgc3RhdFN5bmMsIHVubGlua1N5bmMsIG1rZGlyU3luYywgZXhpc3RzU3luYyB9IGZyb20gXCJmc1wiO1xuaW1wb3J0IHsgcmVhZEZpbGUsIHdyaXRlRmlsZSwgYWNjZXNzIH0gZnJvbSBcImZzL3Byb21pc2VzXCI7XG5pbXBvcnQgeyBqb2luLCBkaXJuYW1lLCByZWxhdGl2ZSB9IGZyb20gXCJwYXRoXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZUVudHJ5IHtcbiAgbmFtZTogc3RyaW5nO1xuICBwYXRoOiBzdHJpbmc7XG4gIHR5cGU6IFwiZmlsZVwiIHwgXCJkaXJlY3RvcnlcIjtcbiAgc2l6ZT86IG51bWJlcjtcbiAgbXRpbWU/OiBEYXRlO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmaWxlRXhpc3RzKHBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICB0cnkge1xuICAgIGF3YWl0IGFjY2VzcyhwYXRoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRUZXh0RmlsZShwYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICByZXR1cm4gcmVhZEZpbGUocGF0aCwgXCJ1dGYtOFwiKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVUZXh0RmlsZShwYXRoOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCB3cml0ZUZpbGUocGF0aCwgY29udGVudCwgXCJ1dGYtOFwiKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxpc3RGaWxlcyh2YXVsdFBhdGg6IHN0cmluZywgZGlyZWN0b3J5Pzogc3RyaW5nKTogRmlsZUVudHJ5W10ge1xuICBjb25zdCB0YXJnZXREaXIgPSBkaXJlY3RvcnkgPyBqb2luKHZhdWx0UGF0aCwgZGlyZWN0b3J5KSA6IHZhdWx0UGF0aDtcblxuICBpZiAoIWV4aXN0c1N5bmModGFyZ2V0RGlyKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRGlyZWN0b3J5IG5vdCBmb3VuZDogJHt0YXJnZXREaXJ9YCk7XG4gIH1cblxuICBjb25zdCBlbnRyaWVzID0gcmVhZGRpclN5bmModGFyZ2V0RGlyKTtcbiAgY29uc3QgcmVzdWx0OiBGaWxlRW50cnlbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgIGNvbnN0IGZ1bGxQYXRoID0gam9pbih0YXJnZXREaXIsIGVudHJ5KTtcbiAgICBjb25zdCBzdGF0ID0gc3RhdFN5bmMoZnVsbFBhdGgpO1xuICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgIG5hbWU6IGVudHJ5LFxuICAgICAgcGF0aDogcmVsYXRpdmUodmF1bHRQYXRoLCBmdWxsUGF0aCksXG4gICAgICB0eXBlOiBzdGF0LmlzRGlyZWN0b3J5KCkgPyBcImRpcmVjdG9yeVwiIDogXCJmaWxlXCIsXG4gICAgICBzaXplOiBzdGF0LnNpemUsXG4gICAgICBtdGltZTogc3RhdC5tdGltZSxcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQuc29ydCgoYSwgYikgPT4ge1xuICAgIGlmIChhLnR5cGUgIT09IGIudHlwZSkgcmV0dXJuIGEudHlwZSA9PT0gXCJkaXJlY3RvcnlcIiA/IC0xIDogMTtcbiAgICByZXR1cm4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkRmlsZUhhbmRsZXIoXG4gIHZhdWx0UGF0aDogc3RyaW5nLFxuICBmaWxlbmFtZTogc3RyaW5nLFxuKTogUHJvbWlzZTx7IGNvbnRlbnQ6IHN0cmluZzsgZnJvbnRtYXR0ZXI/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+IH0+IHtcbiAgY29uc3QgZnVsbFBhdGggPSBqb2luKHZhdWx0UGF0aCwgZmlsZW5hbWUpO1xuXG4gIGlmICghKGF3YWl0IGZpbGVFeGlzdHMoZnVsbFBhdGgpKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmlsZSBub3QgZm91bmQ6ICR7ZmlsZW5hbWV9YCk7XG4gIH1cblxuICBjb25zdCBzdGF0ID0gc3RhdFN5bmMoZnVsbFBhdGgpO1xuICBpZiAoIXN0YXQuaXNGaWxlKCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE5vdCBhIGZpbGU6ICR7ZmlsZW5hbWV9YCk7XG4gIH1cblxuICBjb25zdCBjb250ZW50ID0gYXdhaXQgcmVhZFRleHRGaWxlKGZ1bGxQYXRoKTtcbiAgY29uc3QgcGFyc2VkID0gcGFyc2VGcm9udG1hdHRlcihjb250ZW50KTtcblxuICByZXR1cm4ge1xuICAgIGNvbnRlbnQsXG4gICAgZnJvbnRtYXR0ZXI6IHBhcnNlZD8uZnJvbnRtYXR0ZXIsXG4gIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVGaWxlKFxuICB2YXVsdFBhdGg6IHN0cmluZyxcbiAgZmlsZW5hbWU6IHN0cmluZyxcbiAgY29udGVudDogc3RyaW5nLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGZ1bGxQYXRoID0gam9pbih2YXVsdFBhdGgsIGZpbGVuYW1lKTtcbiAgY29uc3QgZGlyID0gZGlybmFtZShmdWxsUGF0aCk7XG5cbiAgaWYgKCFleGlzdHNTeW5jKGRpcikpIHtcbiAgICBta2RpclN5bmMoZGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIGF3YWl0IHdyaXRlVGV4dEZpbGUoZnVsbFBhdGgsIGNvbnRlbnQpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXBwZW5kRmlsZShcbiAgdmF1bHRQYXRoOiBzdHJpbmcsXG4gIGZpbGVuYW1lOiBzdHJpbmcsXG4gIGNvbnRlbnQ6IHN0cmluZyxcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmdWxsUGF0aCA9IGpvaW4odmF1bHRQYXRoLCBmaWxlbmFtZSk7XG4gIGNvbnN0IGRpciA9IGRpcm5hbWUoZnVsbFBhdGgpO1xuXG4gIGlmICghZXhpc3RzU3luYyhkaXIpKSB7XG4gICAgbWtkaXJTeW5jKGRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIH1cblxuICBsZXQgZXhpc3RpbmcgPSBcIlwiO1xuICBpZiAoYXdhaXQgZmlsZUV4aXN0cyhmdWxsUGF0aCkpIHtcbiAgICBleGlzdGluZyA9IGF3YWl0IHJlYWRUZXh0RmlsZShmdWxsUGF0aCk7XG4gIH1cblxuICBhd2FpdCB3cml0ZVRleHRGaWxlKGZ1bGxQYXRoLCBleGlzdGluZyArIGNvbnRlbnQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVsZXRlRmlsZUhhbmRsZXIodmF1bHRQYXRoOiBzdHJpbmcsIGZpbGVuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgZnVsbFBhdGggPSBqb2luKHZhdWx0UGF0aCwgZmlsZW5hbWUpO1xuXG4gIGlmICghZXhpc3RzU3luYyhmdWxsUGF0aCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgbm90IGZvdW5kOiAke2ZpbGVuYW1lfWApO1xuICB9XG5cbiAgdW5saW5rU3luYyhmdWxsUGF0aCk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwYXRjaEZpbGUoXG4gIHZhdWx0UGF0aDogc3RyaW5nLFxuICBmaWxlbmFtZTogc3RyaW5nLFxuICBvcGVyYXRpb246IFwiYXBwZW5kXCIgfCBcInByZXBlbmRcIiB8IFwicmVwbGFjZVwiLFxuICB0YXJnZXRUeXBlOiBcImhlYWRpbmdcIiB8IFwiYmxvY2tcIiB8IFwiZnJvbnRtYXR0ZXJcIixcbiAgdGFyZ2V0OiBzdHJpbmcsXG4gIGNvbnRlbnQ6IHN0cmluZyxcbiAgb3B0aW9ucz86IHtcbiAgICBjb250ZW50VHlwZT86IHN0cmluZztcbiAgICB0YXJnZXREZWxpbWl0ZXI/OiBzdHJpbmc7XG4gICAgdHJpbVRhcmdldFdoaXRlc3BhY2U/OiBib29sZWFuO1xuICB9LFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgZnVsbFBhdGggPSBqb2luKHZhdWx0UGF0aCwgZmlsZW5hbWUpO1xuXG4gIGlmICghKGF3YWl0IGZpbGVFeGlzdHMoZnVsbFBhdGgpKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmlsZSBub3QgZm91bmQ6ICR7ZmlsZW5hbWV9YCk7XG4gIH1cblxuICBjb25zdCBmaWxlQ29udGVudCA9IGF3YWl0IHJlYWRUZXh0RmlsZShmdWxsUGF0aCk7XG4gIGxldCBtb2RpZmllZDogc3RyaW5nO1xuXG4gIGlmICh0YXJnZXRUeXBlID09PSBcImZyb250bWF0dGVyXCIpIHtcbiAgICBtb2RpZmllZCA9IHBhdGNoRnJvbnRtYXR0ZXIoZmlsZUNvbnRlbnQsIG9wZXJhdGlvbiwgdGFyZ2V0LCBjb250ZW50KTtcbiAgfSBlbHNlIGlmICh0YXJnZXRUeXBlID09PSBcImhlYWRpbmdcIikge1xuICAgIG1vZGlmaWVkID0gcGF0Y2hIZWFkaW5nKGZpbGVDb250ZW50LCBvcGVyYXRpb24sIHRhcmdldCwgY29udGVudCwgb3B0aW9ucyk7XG4gIH0gZWxzZSBpZiAodGFyZ2V0VHlwZSA9PT0gXCJibG9ja1wiKSB7XG4gICAgbW9kaWZpZWQgPSBwYXRjaEJsb2NrKGZpbGVDb250ZW50LCBvcGVyYXRpb24sIHRhcmdldCwgY29udGVudCk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCB0YXJnZXQgdHlwZTogJHt0YXJnZXRUeXBlfWApO1xuICB9XG5cbiAgYXdhaXQgd3JpdGVUZXh0RmlsZShmdWxsUGF0aCwgbW9kaWZpZWQpO1xuICByZXR1cm4gbW9kaWZpZWQ7XG59XG5cbmZ1bmN0aW9uIHBhcnNlRnJvbnRtYXR0ZXIoXG4gIGNvbnRlbnQ6IHN0cmluZyxcbik6IHsgZnJvbnRtYXR0ZXI6IFJlY29yZDxzdHJpbmcsIGFueT47IGJvZHk6IHN0cmluZyB9IHwgbnVsbCB7XG4gIGlmICghY29udGVudC5zdGFydHNXaXRoKFwiLS0tXCIpKSByZXR1cm4gbnVsbDtcblxuICBjb25zdCBlbmRJbmRleCA9IGNvbnRlbnQuaW5kZXhPZihcIi0tLVwiLCAzKTtcbiAgaWYgKGVuZEluZGV4ID09PSAtMSkgcmV0dXJuIG51bGw7XG5cbiAgY29uc3QgcmF3ID0gY29udGVudC5zbGljZSgzLCBlbmRJbmRleCkudHJpbSgpO1xuICBjb25zdCBib2R5ID0gY29udGVudC5zbGljZShlbmRJbmRleCArIDMpLnRyaW0oKTtcbiAgY29uc3QgZnJvbnRtYXR0ZXI6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcblxuICBmb3IgKGNvbnN0IGxpbmUgb2YgcmF3LnNwbGl0KFwiXFxuXCIpKSB7XG4gICAgY29uc3QgY29sb25JbmRleCA9IGxpbmUuaW5kZXhPZihcIjpcIik7XG4gICAgaWYgKGNvbG9uSW5kZXggPT09IC0xKSBjb250aW51ZTtcbiAgICBjb25zdCBrZXkgPSBsaW5lLnNsaWNlKDAsIGNvbG9uSW5kZXgpLnRyaW0oKTtcbiAgICBsZXQgdmFsdWU6IGFueSA9IGxpbmUuc2xpY2UoY29sb25JbmRleCArIDEpLnRyaW0oKTtcblxuICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKCdcIicpICYmIHZhbHVlLmVuZHNXaXRoKCdcIicpKSB7XG4gICAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKDEsIC0xKTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoXCJbXCIpICYmIHZhbHVlLmVuZHNXaXRoKFwiXVwiKSkge1xuICAgICAgdmFsdWUgPSB2YWx1ZVxuICAgICAgICAuc2xpY2UoMSwgLTEpXG4gICAgICAgIC5zcGxpdChcIixcIilcbiAgICAgICAgLm1hcCgoczogc3RyaW5nKSA9PiBzLnRyaW0oKS5yZXBsYWNlKC9eW1wiJ118W1wiJ10kL2csIFwiXCIpKVxuICAgICAgICAuZmlsdGVyKEJvb2xlYW4pO1xuICAgIH1cblxuICAgIGZyb250bWF0dGVyW2tleV0gPSB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiB7IGZyb250bWF0dGVyLCBib2R5IH07XG59XG5cbmZ1bmN0aW9uIHBhdGNoRnJvbnRtYXR0ZXIoXG4gIGNvbnRlbnQ6IHN0cmluZyxcbiAgb3BlcmF0aW9uOiBcImFwcGVuZFwiIHwgXCJwcmVwZW5kXCIgfCBcInJlcGxhY2VcIixcbiAgdGFyZ2V0OiBzdHJpbmcsXG4gIG5ld0NvbnRlbnQ6IHN0cmluZyxcbik6IHN0cmluZyB7XG4gIGNvbnN0IHBhcnNlZCA9IHBhcnNlRnJvbnRtYXR0ZXIoY29udGVudCk7XG5cbiAgaWYgKG9wZXJhdGlvbiA9PT0gXCJyZXBsYWNlXCIgJiYgdGFyZ2V0ID09PSBcImFsbFwiKSB7XG4gICAgaWYgKHBhcnNlZCkge1xuICAgICAgcmV0dXJuIGAtLS1cXG4ke25ld0NvbnRlbnR9XFxuLS0tXFxuXFxuJHtwYXJzZWQuYm9keX1gO1xuICAgIH1cbiAgICByZXR1cm4gYC0tLVxcbiR7bmV3Q29udGVudH1cXG4tLS1cXG5cXG4ke2NvbnRlbnR9YDtcbiAgfVxuXG4gIGlmIChwYXJzZWQpIHtcbiAgICBjb25zdCBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoXCJcXG5cIik7XG4gICAgbGV0IGZtRW5kID0gLTE7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGxpbmVzW2ldLnRyaW0oKSA9PT0gXCItLS1cIikge1xuICAgICAgICBmbUVuZCA9IGk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGZtTGluZXMgPSBsaW5lcy5zbGljZSgxLCBmbUVuZCk7XG4gICAgY29uc3QgYm9keUxpbmVzID0gbGluZXMuc2xpY2UoZm1FbmQgKyAxKTtcblxuICAgIGlmIChvcGVyYXRpb24gPT09IFwicmVwbGFjZVwiKSB7XG4gICAgICBjb25zdCBleGlzdGluZyA9IGZtTGluZXMuZmluZEluZGV4KChsKSA9PiBsLnRyaW0oKS5zdGFydHNXaXRoKHRhcmdldCArIFwiOlwiKSk7XG4gICAgICBpZiAoZXhpc3RpbmcgIT09IC0xKSB7XG4gICAgICAgIGZtTGluZXNbZXhpc3RpbmddID0gYCR7dGFyZ2V0fTogJHtuZXdDb250ZW50fWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmbUxpbmVzLnB1c2goYCR7dGFyZ2V0fTogJHtuZXdDb250ZW50fWApO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAob3BlcmF0aW9uID09PSBcImFwcGVuZFwiKSB7XG4gICAgICBmbUxpbmVzLnB1c2goYCR7dGFyZ2V0fTogJHtuZXdDb250ZW50fWApO1xuICAgIH1cblxuICAgIHJldHVybiBbXCItLS1cIiwgLi4uZm1MaW5lcywgXCItLS1cIiwgXCJcIiwgLi4uYm9keUxpbmVzXS5qb2luKFwiXFxuXCIpO1xuICB9XG5cbiAgaWYgKG9wZXJhdGlvbiA9PT0gXCJyZXBsYWNlXCIgfHwgb3BlcmF0aW9uID09PSBcImFwcGVuZFwiKSB7XG4gICAgcmV0dXJuIGAtLS1cXG4ke3RhcmdldH06ICR7bmV3Q29udGVudH1cXG4tLS1cXG5cXG4ke2NvbnRlbnR9YDtcbiAgfVxuXG4gIHJldHVybiBjb250ZW50O1xufVxuXG5mdW5jdGlvbiBmaW5kSGVhZGluZ0xpbmUoXG4gIGxpbmVzOiBzdHJpbmdbXSxcbiAgdGFyZ2V0OiBzdHJpbmcsXG4gIGRlbGltaXRlcjogc3RyaW5nLFxuKTogeyBsaW5lSW5kZXg6IG51bWJlcjsgbGV2ZWw6IG51bWJlciB9IHwgbnVsbCB7XG4gIGNvbnN0IHBhcnRzID0gdGFyZ2V0LnNwbGl0KGRlbGltaXRlcikubWFwKChzKSA9PiBzLnRyaW0oKSk7XG5cbiAgbGV0IGN1cnJlbnRMaW5lID0gMDtcbiAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgbGV0IGZvdW5kID0gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IGN1cnJlbnRMaW5lOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGhlYWRpbmdNYXRjaCA9IGxpbmVzW2ldLm1hdGNoKC9eKCN7MSw2fSlcXHMrKC4rKSQvKTtcbiAgICAgIGlmIChoZWFkaW5nTWF0Y2ggJiYgaGVhZGluZ01hdGNoWzJdLnRyaW0oKSA9PT0gcGFydCkge1xuICAgICAgICBjdXJyZW50TGluZSA9IGk7XG4gICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghZm91bmQpIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgbWF0Y2ggPSBsaW5lc1tjdXJyZW50TGluZV0ubWF0Y2goL14oI3sxLDZ9KVxccy8pO1xuICByZXR1cm4geyBsaW5lSW5kZXg6IGN1cnJlbnRMaW5lLCBsZXZlbDogbWF0Y2ggPyBtYXRjaFsxXS5sZW5ndGggOiAxIH07XG59XG5cbmZ1bmN0aW9uIGdldEhlYWRpbmdDb250ZW50RW5kKGxpbmVzOiBzdHJpbmdbXSwgc3RhcnRMaW5lOiBudW1iZXIsIGxldmVsOiBudW1iZXIpOiBudW1iZXIge1xuICBmb3IgKGxldCBpID0gc3RhcnRMaW5lICsgMTsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgbWF0Y2ggPSBsaW5lc1tpXS5tYXRjaCgvXigjezEsNn0pXFxzLyk7XG4gICAgaWYgKG1hdGNoICYmIG1hdGNoWzFdLmxlbmd0aCA8PSBsZXZlbCkge1xuICAgICAgcmV0dXJuIGk7XG4gICAgfVxuICB9XG4gIHJldHVybiBsaW5lcy5sZW5ndGg7XG59XG5cbmZ1bmN0aW9uIHBhdGNoSGVhZGluZyhcbiAgY29udGVudDogc3RyaW5nLFxuICBvcGVyYXRpb246IFwiYXBwZW5kXCIgfCBcInByZXBlbmRcIiB8IFwicmVwbGFjZVwiLFxuICB0YXJnZXQ6IHN0cmluZyxcbiAgbmV3Q29udGVudDogc3RyaW5nLFxuICBvcHRpb25zPzogYW55LFxuKTogc3RyaW5nIHtcbiAgY29uc3QgZGVsaW1pdGVyID0gb3B0aW9ucz8udGFyZ2V0RGVsaW1pdGVyIHx8IFwiOjpcIjtcbiAgY29uc3QgbGluZXMgPSBjb250ZW50LnNwbGl0KFwiXFxuXCIpO1xuICBjb25zdCBoZWFkaW5nID0gZmluZEhlYWRpbmdMaW5lKGxpbmVzLCB0YXJnZXQsIGRlbGltaXRlcik7XG5cbiAgaWYgKCFoZWFkaW5nKSB7XG4gICAgaWYgKG9wZXJhdGlvbiA9PT0gXCJyZXBsYWNlXCIpIHJldHVybiBjb250ZW50O1xuICAgIGNvbnN0IHRhcmdldFBhcnRzID0gdGFyZ2V0LnNwbGl0KGRlbGltaXRlcikubWFwKChzKSA9PiBzLnRyaW0oKSk7XG4gICAgY29uc3QgbGFzdFBhcnQgPSB0YXJnZXRQYXJ0c1t0YXJnZXRQYXJ0cy5sZW5ndGggLSAxXTtcbiAgICByZXR1cm4gY29udGVudCArIGBcXG5cXG4jIyAke2xhc3RQYXJ0fVxcblxcbiR7bmV3Q29udGVudH1gO1xuICB9XG5cbiAgY29uc3Qgc2VjdGlvbkVuZCA9IGdldEhlYWRpbmdDb250ZW50RW5kKGxpbmVzLCBoZWFkaW5nLmxpbmVJbmRleCwgaGVhZGluZy5sZXZlbCk7XG5cbiAgaWYgKG9wZXJhdGlvbiA9PT0gXCJyZXBsYWNlXCIpIHtcbiAgICBjb25zdCBuZXdMaW5lcyA9IFtcbiAgICAgIC4uLmxpbmVzLnNsaWNlKDAsIGhlYWRpbmcubGluZUluZGV4ICsgMSksXG4gICAgICBuZXdDb250ZW50LFxuICAgICAgLi4ubGluZXMuc2xpY2Uoc2VjdGlvbkVuZCksXG4gICAgXTtcbiAgICByZXR1cm4gbmV3TGluZXMuam9pbihcIlxcblwiKTtcbiAgfVxuXG4gIGlmIChvcGVyYXRpb24gPT09IFwiYXBwZW5kXCIpIHtcbiAgICBjb25zdCBuZXdMaW5lcyA9IFsuLi5saW5lcy5zbGljZSgwLCBzZWN0aW9uRW5kKSwgbmV3Q29udGVudCwgLi4ubGluZXMuc2xpY2Uoc2VjdGlvbkVuZCldO1xuICAgIHJldHVybiBuZXdMaW5lcy5qb2luKFwiXFxuXCIpO1xuICB9XG5cbiAgaWYgKG9wZXJhdGlvbiA9PT0gXCJwcmVwZW5kXCIpIHtcbiAgICBjb25zdCBuZXdMaW5lcyA9IFtcbiAgICAgIC4uLmxpbmVzLnNsaWNlKDAsIGhlYWRpbmcubGluZUluZGV4ICsgMSksXG4gICAgICBuZXdDb250ZW50LFxuICAgICAgLi4ubGluZXMuc2xpY2UoaGVhZGluZy5saW5lSW5kZXggKyAxKSxcbiAgICBdO1xuICAgIHJldHVybiBuZXdMaW5lcy5qb2luKFwiXFxuXCIpO1xuICB9XG5cbiAgcmV0dXJuIGNvbnRlbnQ7XG59XG5cbmZ1bmN0aW9uIHBhdGNoQmxvY2soXG4gIGNvbnRlbnQ6IHN0cmluZyxcbiAgb3BlcmF0aW9uOiBcImFwcGVuZFwiIHwgXCJwcmVwZW5kXCIgfCBcInJlcGxhY2VcIixcbiAgdGFyZ2V0OiBzdHJpbmcsXG4gIG5ld0NvbnRlbnQ6IHN0cmluZyxcbik6IHN0cmluZyB7XG4gIGNvbnN0IGJsb2NrSWQgPSB0YXJnZXQuc3RhcnRzV2l0aChcIl5cIikgPyB0YXJnZXQgOiBgXiR7dGFyZ2V0fWA7XG4gIGNvbnN0IGxpbmVzID0gY29udGVudC5zcGxpdChcIlxcblwiKTtcbiAgY29uc3QgYmxvY2tJbmRleCA9IGxpbmVzLmZpbmRJbmRleCgobCkgPT4gbC50cmltKCkuZW5kc1dpdGgoYmxvY2tJZCkpO1xuXG4gIGlmIChibG9ja0luZGV4ID09PSAtMSkge1xuICAgIGlmIChvcGVyYXRpb24gPT09IFwicmVwbGFjZVwiKSByZXR1cm4gY29udGVudDtcbiAgICByZXR1cm4gY29udGVudCArIGBcXG5cXG4ke25ld0NvbnRlbnR9ICR7YmxvY2tJZH1gO1xuICB9XG5cbiAgaWYgKG9wZXJhdGlvbiA9PT0gXCJyZXBsYWNlXCIpIHtcbiAgICBsaW5lc1tibG9ja0luZGV4XSA9IGxpbmVzW2Jsb2NrSW5kZXhdLnJlcGxhY2UoL14oLio/KShcXHMrXFxeXFx3Kyk/JC8sIGAke25ld0NvbnRlbnR9ICR7YmxvY2tJZH1gKTtcbiAgICByZXR1cm4gbGluZXMuam9pbihcIlxcblwiKTtcbiAgfVxuXG4gIGlmIChvcGVyYXRpb24gPT09IFwiYXBwZW5kXCIpIHtcbiAgICBsaW5lcy5zcGxpY2UoYmxvY2tJbmRleCArIDEsIDAsIG5ld0NvbnRlbnQpO1xuICAgIHJldHVybiBsaW5lcy5qb2luKFwiXFxuXCIpO1xuICB9XG5cbiAgaWYgKG9wZXJhdGlvbiA9PT0gXCJwcmVwZW5kXCIpIHtcbiAgICBsaW5lcy5zcGxpY2UoYmxvY2tJbmRleCwgMCwgbmV3Q29udGVudCk7XG4gICAgcmV0dXJuIGxpbmVzLmpvaW4oXCJcXG5cIik7XG4gIH1cblxuICByZXR1cm4gY29udGVudDtcbn1cbiIsICJpbXBvcnQgeyByZWFkZGlyU3luYywgc3RhdFN5bmMgfSBmcm9tIFwiZnNcIjtcbmltcG9ydCB7IHJlYWRGaWxlIH0gZnJvbSBcImZzL3Byb21pc2VzXCI7XG5pbXBvcnQgeyBqb2luLCByZWxhdGl2ZSB9IGZyb20gXCJwYXRoXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VhcmNoTWF0Y2gge1xuICBmaWxlOiBzdHJpbmc7XG4gIGxpbmU6IG51bWJlcjtcbiAgY29udGVudDogc3RyaW5nO1xuICBjb250ZXh0QmVmb3JlPzogc3RyaW5nO1xuICBjb250ZXh0QWZ0ZXI/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZWFyY2hJblZhdWx0KFxuICB2YXVsdFBhdGg6IHN0cmluZyxcbiAgcXVlcnk6IHN0cmluZyxcbiAgZGlyZWN0b3J5Pzogc3RyaW5nLFxuICBjb250ZXh0TGVuZ3RoOiBudW1iZXIgPSAxMDAsXG4pOiBQcm9taXNlPFNlYXJjaE1hdGNoW10+IHtcbiAgY29uc3Qgc2VhcmNoRGlyID0gZGlyZWN0b3J5ID8gam9pbih2YXVsdFBhdGgsIGRpcmVjdG9yeSkgOiB2YXVsdFBhdGg7XG4gIGNvbnN0IHJlc3VsdHM6IFNlYXJjaE1hdGNoW10gPSBbXTtcbiAgY29uc3Qgc2VhcmNoVGVybXMgPSBxdWVyeS50b0xvd2VyQ2FzZSgpLnNwbGl0KC9cXHMrLykuZmlsdGVyKEJvb2xlYW4pO1xuXG4gIGF3YWl0IHdhbGtEaXIoc2VhcmNoRGlyLCB2YXVsdFBhdGgsIHJlc3VsdHMsIHNlYXJjaFRlcm1zLCBjb250ZXh0TGVuZ3RoKTtcbiAgcmV0dXJuIHJlc3VsdHM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdhbGtEaXIoXG4gIGRpclBhdGg6IHN0cmluZyxcbiAgdmF1bHRQYXRoOiBzdHJpbmcsXG4gIHJlc3VsdHM6IFNlYXJjaE1hdGNoW10sXG4gIHNlYXJjaFRlcm1zOiBzdHJpbmdbXSxcbiAgY29udGV4dExlbmd0aDogbnVtYmVyLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGxldCBlbnRyaWVzOiBzdHJpbmdbXTtcbiAgdHJ5IHtcbiAgICBlbnRyaWVzID0gcmVhZGRpclN5bmMoZGlyUGF0aCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgIGNvbnN0IGZ1bGxQYXRoID0gam9pbihkaXJQYXRoLCBlbnRyeSk7XG5cbiAgICBsZXQgc3RhdDogUmV0dXJuVHlwZTx0eXBlb2Ygc3RhdFN5bmM+O1xuICAgIHRyeSB7XG4gICAgICBzdGF0ID0gc3RhdFN5bmMoZnVsbFBhdGgpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHN0YXQuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgaWYgKCFlbnRyeS5zdGFydHNXaXRoKFwiLlwiKSkge1xuICAgICAgICBhd2FpdCB3YWxrRGlyKGZ1bGxQYXRoLCB2YXVsdFBhdGgsIHJlc3VsdHMsIHNlYXJjaFRlcm1zLCBjb250ZXh0TGVuZ3RoKTtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICghZW50cnkuZW5kc1dpdGgoXCIubWRcIikpIGNvbnRpbnVlO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCByZWFkRmlsZShmdWxsUGF0aCwgXCJ1dGYtOFwiKTtcbiAgICAgIGNvbnN0IGxpbmVzID0gY29udGVudC5zcGxpdChcIlxcblwiKTtcbiAgICAgIGNvbnN0IHJlbFBhdGggPSByZWxhdGl2ZSh2YXVsdFBhdGgsIGZ1bGxQYXRoKTtcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBsb3dlckxpbmUgPSBsaW5lc1tpXS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBjb25zdCBtYXRjaGVzQWxsID0gc2VhcmNoVGVybXMuZXZlcnkoKHRlcm0pID0+IGxvd2VyTGluZS5pbmNsdWRlcyh0ZXJtKSk7XG5cbiAgICAgICAgaWYgKG1hdGNoZXNBbGwpIHtcbiAgICAgICAgICByZXN1bHRzLnB1c2goe1xuICAgICAgICAgICAgZmlsZTogcmVsUGF0aCxcbiAgICAgICAgICAgIGxpbmU6IGkgKyAxLFxuICAgICAgICAgICAgY29udGVudDogbGluZXNbaV0uc3Vic3RyaW5nKDAsIDUwMCksXG4gICAgICAgICAgICBjb250ZXh0QmVmb3JlOiBpID4gMCA/IGxpbmVzW2kgLSAxXS5zdWJzdHJpbmcoMCwgY29udGV4dExlbmd0aCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBjb250ZXh0QWZ0ZXI6XG4gICAgICAgICAgICAgIGkgPCBsaW5lcy5sZW5ndGggLSAxID8gbGluZXNbaSArIDFdLnN1YnN0cmluZygwLCBjb250ZXh0TGVuZ3RoKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gc2tpcCB1bnJlYWRhYmxlIGZpbGVzXG4gICAgfVxuICB9XG59XG4iLCAiaW1wb3J0IHtcbiAgbGlzdEZpbGVzLFxuICByZWFkRmlsZUhhbmRsZXIsXG4gIGNyZWF0ZUZpbGUsXG4gIGFwcGVuZEZpbGUsXG4gIGRlbGV0ZUZpbGVIYW5kbGVyLFxuICBwYXRjaEZpbGUsXG59IGZyb20gXCIuLi91dGlscy9mcy11dGlsc1wiO1xuaW1wb3J0IHsgc2VhcmNoSW5WYXVsdCB9IGZyb20gXCIuLi91dGlscy9zZWFyY2hcIjtcbmltcG9ydCB0eXBlIHsgVmF1bHRSZWdpc3RyeSB9IGZyb20gXCIuLi91dGlscy92YXVsdHNcIjtcbmltcG9ydCB0eXBlIHsgVG9vbFJlc3VsdCB9IGZyb20gXCIuLi9tY3AvcHJvdG9jb2xcIjtcblxudHlwZSBUb29sSGFuZGxlciA9IChhcmdzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiBQcm9taXNlPFRvb2xSZXN1bHQ+O1xuXG5leHBvcnQgY2xhc3MgVmF1bHRGaWxlSGFuZGxlciB7XG4gIHByaXZhdGUgcmVnaXN0cnk6IFZhdWx0UmVnaXN0cnk7XG5cbiAgY29uc3RydWN0b3IocmVnaXN0cnk6IFZhdWx0UmVnaXN0cnkpIHtcbiAgICB0aGlzLnJlZ2lzdHJ5ID0gcmVnaXN0cnk7XG4gIH1cblxuICBnZXRIYW5kbGVycygpOiBSZWNvcmQ8c3RyaW5nLCBUb29sSGFuZGxlcj4ge1xuICAgIHJldHVybiB7XG4gICAgICBsaXN0X3ZhdWx0czogdGhpcy5oYW5kbGVMaXN0VmF1bHRzLmJpbmQodGhpcyksXG4gICAgICBnZXRfdmF1bHRfaW5mbzogdGhpcy5oYW5kbGVWYXVsdEluZm8uYmluZCh0aGlzKSxcbiAgICAgIGxpc3RfZmlsZXM6IHRoaXMuaGFuZGxlTGlzdEZpbGVzLmJpbmQodGhpcyksXG4gICAgICBnZXRfZmlsZTogdGhpcy5oYW5kbGVHZXRGaWxlLmJpbmQodGhpcyksXG4gICAgICBjcmVhdGVfZmlsZTogdGhpcy5oYW5kbGVDcmVhdGVGaWxlLmJpbmQodGhpcyksXG4gICAgICBhcHBlbmRfdG9fZmlsZTogdGhpcy5oYW5kbGVBcHBlbmRGaWxlLmJpbmQodGhpcyksXG4gICAgICBwYXRjaF9maWxlOiB0aGlzLmhhbmRsZVBhdGNoRmlsZS5iaW5kKHRoaXMpLFxuICAgICAgZGVsZXRlX2ZpbGU6IHRoaXMuaGFuZGxlRGVsZXRlRmlsZS5iaW5kKHRoaXMpLFxuICAgICAgc2VhcmNoOiB0aGlzLmhhbmRsZVNlYXJjaC5iaW5kKHRoaXMpLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVWYXVsdChhcmdzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpc3RyeS5yZXNvbHZlKGFyZ3MudmF1bHQpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVMaXN0VmF1bHRzKF9hcmdzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogUHJvbWlzZTxUb29sUmVzdWx0PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IEpTT04uc3RyaW5naWZ5KHRoaXMucmVnaXN0cnkubGlzdCgpLCBudWxsLCAyKSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlVmF1bHRJbmZvKGFyZ3M6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBQcm9taXNlPFRvb2xSZXN1bHQ+IHtcbiAgICBjb25zdCBpbmZvID0gdGhpcy5yZWdpc3RyeS5pbmZvKGFyZ3MudmF1bHQpO1xuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbeyB0eXBlOiBcInRleHRcIiwgdGV4dDogSlNPTi5zdHJpbmdpZnkoaW5mbywgbnVsbCwgMikgfV0sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlTGlzdEZpbGVzKGFyZ3M6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBQcm9taXNlPFRvb2xSZXN1bHQ+IHtcbiAgICBjb25zdCB2YXVsdFBhdGggPSB0aGlzLnJlc29sdmVWYXVsdChhcmdzKTtcbiAgICBjb25zdCBlbnRyaWVzID0gbGlzdEZpbGVzKHZhdWx0UGF0aCwgYXJncy5kaXJlY3RvcnkpO1xuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbeyB0eXBlOiBcInRleHRcIiwgdGV4dDogSlNPTi5zdHJpbmdpZnkoZW50cmllcywgbnVsbCwgMikgfV0sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlR2V0RmlsZShhcmdzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogUHJvbWlzZTxUb29sUmVzdWx0PiB7XG4gICAgY29uc3QgdmF1bHRQYXRoID0gdGhpcy5yZXNvbHZlVmF1bHQoYXJncyk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVhZEZpbGVIYW5kbGVyKHZhdWx0UGF0aCwgYXJncy5maWxlbmFtZSk7XG5cbiAgICBpZiAoYXJncy5mb3JtYXQgPT09IFwianNvblwiKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGZpbGVuYW1lOiBhcmdzLmZpbGVuYW1lLFxuICAgICAgICAgICAgICAgIGZyb250bWF0dGVyOiByZXN1bHQuZnJvbnRtYXR0ZXIsXG4gICAgICAgICAgICAgICAgY29udGVudDogcmVzdWx0LmNvbnRlbnQsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgIDIsXG4gICAgICAgICAgICApLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IGNvbnRlbnQ6IFt7IHR5cGU6IFwidGV4dFwiLCB0ZXh0OiByZXN1bHQuY29udGVudCB9XSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVDcmVhdGVGaWxlKGFyZ3M6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBQcm9taXNlPFRvb2xSZXN1bHQ+IHtcbiAgICBjb25zdCB2YXVsdFBhdGggPSB0aGlzLnJlc29sdmVWYXVsdChhcmdzKTtcbiAgICBhd2FpdCBjcmVhdGVGaWxlKHZhdWx0UGF0aCwgYXJncy5maWxlbmFtZSwgYXJncy5jb250ZW50KTtcbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDogW3sgdHlwZTogXCJ0ZXh0XCIsIHRleHQ6IFwiRmlsZSBjcmVhdGVkIHN1Y2Nlc3NmdWxseVwiIH1dLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGhhbmRsZUFwcGVuZEZpbGUoYXJnczogUmVjb3JkPHN0cmluZywgYW55Pik6IFByb21pc2U8VG9vbFJlc3VsdD4ge1xuICAgIGNvbnN0IHZhdWx0UGF0aCA9IHRoaXMucmVzb2x2ZVZhdWx0KGFyZ3MpO1xuICAgIGF3YWl0IGFwcGVuZEZpbGUodmF1bHRQYXRoLCBhcmdzLmZpbGVuYW1lLCBhcmdzLmNvbnRlbnQpO1xuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbeyB0eXBlOiBcInRleHRcIiwgdGV4dDogXCJDb250ZW50IGFwcGVuZGVkIHN1Y2Nlc3NmdWxseVwiIH1dLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGhhbmRsZVBhdGNoRmlsZShhcmdzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogUHJvbWlzZTxUb29sUmVzdWx0PiB7XG4gICAgY29uc3QgdmF1bHRQYXRoID0gdGhpcy5yZXNvbHZlVmF1bHQoYXJncyk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGF0Y2hGaWxlKFxuICAgICAgdmF1bHRQYXRoLFxuICAgICAgYXJncy5maWxlbmFtZSxcbiAgICAgIGFyZ3Mub3BlcmF0aW9uLFxuICAgICAgYXJncy50YXJnZXRUeXBlLFxuICAgICAgYXJncy50YXJnZXQsXG4gICAgICBhcmdzLmNvbnRlbnQsXG4gICAgICB7XG4gICAgICAgIGNvbnRlbnRUeXBlOiBhcmdzLmNvbnRlbnRUeXBlLFxuICAgICAgICB0YXJnZXREZWxpbWl0ZXI6IGFyZ3MudGFyZ2V0RGVsaW1pdGVyLFxuICAgICAgICB0cmltVGFyZ2V0V2hpdGVzcGFjZTogYXJncy50cmltVGFyZ2V0V2hpdGVzcGFjZSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDogW1xuICAgICAgICB7IHR5cGU6IFwidGV4dFwiLCB0ZXh0OiBcIkZpbGUgcGF0Y2hlZCBzdWNjZXNzZnVsbHlcIiB9LFxuICAgICAgICB7IHR5cGU6IFwidGV4dFwiLCB0ZXh0OiByZXN1bHQgfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlRGVsZXRlRmlsZShhcmdzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogUHJvbWlzZTxUb29sUmVzdWx0PiB7XG4gICAgY29uc3QgdmF1bHRQYXRoID0gdGhpcy5yZXNvbHZlVmF1bHQoYXJncyk7XG4gICAgZGVsZXRlRmlsZUhhbmRsZXIodmF1bHRQYXRoLCBhcmdzLmZpbGVuYW1lKTtcbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDogW3sgdHlwZTogXCJ0ZXh0XCIsIHRleHQ6IFwiRmlsZSBkZWxldGVkIHN1Y2Nlc3NmdWxseVwiIH1dLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGhhbmRsZVNlYXJjaChhcmdzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogUHJvbWlzZTxUb29sUmVzdWx0PiB7XG4gICAgY29uc3QgdmF1bHRQYXRoID0gdGhpcy5yZXNvbHZlVmF1bHQoYXJncyk7XG4gICAgY29uc3QgbWF0Y2hlcyA9IGF3YWl0IHNlYXJjaEluVmF1bHQodmF1bHRQYXRoLCBhcmdzLnF1ZXJ5LCBhcmdzLmRpcmVjdG9yeSwgYXJncy5jb250ZXh0TGVuZ3RoKTtcbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDogW3sgdHlwZTogXCJ0ZXh0XCIsIHRleHQ6IEpTT04uc3RyaW5naWZ5KG1hdGNoZXMsIG51bGwsIDIpIH1dLFxuICAgIH07XG4gIH1cbn1cbiIsICJpbXBvcnQgeyByZWFkZGlyU3luYywgc3RhdFN5bmMgfSBmcm9tIFwiZnNcIjtcbmltcG9ydCB7IHJlYWRGaWxlIH0gZnJvbSBcImZzL3Byb21pc2VzXCI7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcInBhdGhcIjtcbmltcG9ydCB0eXBlIHsgUHJvbXB0RGVmaW5pdGlvbiB9IGZyb20gXCIuLi9tY3AvcHJvdG9jb2xcIjtcbmltcG9ydCB0eXBlIHsgVmF1bHRSZWdpc3RyeSB9IGZyb20gXCIuLi91dGlscy92YXVsdHNcIjtcblxuaW50ZXJmYWNlIEZyb250bWF0dGVyIHtcbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG5mdW5jdGlvbiBwYXJzZUZyb250bWF0dGVyKGNvbnRlbnQ6IHN0cmluZyk6IHsgZnJvbnRtYXR0ZXI6IEZyb250bWF0dGVyOyBib2R5OiBzdHJpbmcgfSB8IG51bGwge1xuICBpZiAoIWNvbnRlbnQuc3RhcnRzV2l0aChcIi0tLVwiKSkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IGVuZEluZGV4ID0gY29udGVudC5pbmRleE9mKFwiLS0tXCIsIDMpO1xuICBpZiAoZW5kSW5kZXggPT09IC0xKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgcmF3ID0gY29udGVudC5zbGljZSgzLCBlbmRJbmRleCkudHJpbSgpO1xuICBjb25zdCBib2R5ID0gY29udGVudC5zbGljZShlbmRJbmRleCArIDMpLnRyaW0oKTtcbiAgY29uc3QgZnJvbnRtYXR0ZXI6IEZyb250bWF0dGVyID0ge307XG4gIGZvciAoY29uc3QgbGluZSBvZiByYXcuc3BsaXQoXCJcXG5cIikpIHtcbiAgICBjb25zdCBjb2xvbkluZGV4ID0gbGluZS5pbmRleE9mKFwiOlwiKTtcbiAgICBpZiAoY29sb25JbmRleCA9PT0gLTEpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGtleSA9IGxpbmUuc2xpY2UoMCwgY29sb25JbmRleCkudHJpbSgpO1xuICAgIGxldCB2YWx1ZTogYW55ID0gbGluZS5zbGljZShjb2xvbkluZGV4ICsgMSkudHJpbSgpO1xuICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKCdcIicpICYmIHZhbHVlLmVuZHNXaXRoKCdcIicpKSB2YWx1ZSA9IHZhbHVlLnNsaWNlKDEsIC0xKTtcbiAgICBlbHNlIGlmICh2YWx1ZS5zdGFydHNXaXRoKFwiW1wiKSAmJiB2YWx1ZS5lbmRzV2l0aChcIl1cIikpIHtcbiAgICAgIHZhbHVlID0gdmFsdWVcbiAgICAgICAgLnNsaWNlKDEsIC0xKVxuICAgICAgICAuc3BsaXQoXCIsXCIpXG4gICAgICAgIC5tYXAoKHM6IHN0cmluZykgPT4gcy50cmltKCkucmVwbGFjZSgvXltcIiddfFtcIiddJC9nLCBcIlwiKSlcbiAgICAgICAgLmZpbHRlcihCb29sZWFuKTtcbiAgICB9XG4gICAgZnJvbnRtYXR0ZXJba2V5XSA9IHZhbHVlO1xuICB9XG4gIHJldHVybiB7IGZyb250bWF0dGVyLCBib2R5IH07XG59XG5cbmV4cG9ydCBjbGFzcyBQcm9tcHRIYW5kbGVyIHtcbiAgcHJpdmF0ZSByZWdpc3RyeTogVmF1bHRSZWdpc3RyeTtcbiAgcHJpdmF0ZSBwcm9tcHREaXIgPSBcIlByb21wdHNcIjtcblxuICBjb25zdHJ1Y3RvcihyZWdpc3RyeTogVmF1bHRSZWdpc3RyeSkge1xuICAgIHRoaXMucmVnaXN0cnkgPSByZWdpc3RyeTtcbiAgfVxuXG4gIGFzeW5jIGxpc3QodmF1bHROYW1lPzogc3RyaW5nKTogUHJvbWlzZTxQcm9tcHREZWZpbml0aW9uW10+IHtcbiAgICBjb25zdCB2YXVsdFBhdGggPSB0aGlzLnJlZ2lzdHJ5LnJlc29sdmUodmF1bHROYW1lKTtcbiAgICBjb25zdCBwcm9tcHRQYXRoID0gam9pbih2YXVsdFBhdGgsIHRoaXMucHJvbXB0RGlyKTtcblxuICAgIGxldCBlbnRyaWVzOiBzdHJpbmdbXTtcbiAgICB0cnkge1xuICAgICAgZW50cmllcyA9IHJlYWRkaXJTeW5jKHByb21wdFBhdGgpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IHByb21wdHM6IFByb21wdERlZmluaXRpb25bXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICBpZiAoIWVudHJ5LmVuZHNXaXRoKFwiLm1kXCIpKSBjb250aW51ZTtcblxuICAgICAgY29uc3QgZnVsbFBhdGggPSBqb2luKHByb21wdFBhdGgsIGVudHJ5KTtcbiAgICAgIGNvbnN0IHN0YXQgPSBzdGF0U3luYyhmdWxsUGF0aCk7XG4gICAgICBpZiAoIXN0YXQuaXNGaWxlKCkpIGNvbnRpbnVlO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgcmVhZEZpbGUoZnVsbFBhdGgsIFwidXRmLThcIik7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlRnJvbnRtYXR0ZXIoY29udGVudCk7XG4gICAgICAgIGNvbnN0IHRhZ3M6IHN0cmluZ1tdID0gcGFyc2VkPy5mcm9udG1hdHRlcj8udGFncyB8fCBbXTtcblxuICAgICAgICBpZiAoIXRhZ3MuaW5jbHVkZXMoXCJtY3AtdG9vbHMtcHJvbXB0XCIpKSBjb250aW51ZTtcblxuICAgICAgICBjb25zdCBwcm9tcHRBcmdzID0gcGFyc2VQcm9tcHRQYXJhbWV0ZXJzKHBhcnNlZD8uYm9keSB8fCBjb250ZW50KTtcbiAgICAgICAgcHJvbXB0cy5wdXNoKHtcbiAgICAgICAgICBuYW1lOiBlbnRyeSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogcGFyc2VkPy5mcm9udG1hdHRlcj8uZGVzY3JpcHRpb24gfHwgZW50cnkucmVwbGFjZShcIi5tZFwiLCBcIlwiKSxcbiAgICAgICAgICBhcmd1bWVudHM6IHByb21wdEFyZ3MsXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwcm9tcHRzO1xuICB9XG5cbiAgYXN5bmMgZ2V0KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICB2YXVsdE5hbWU/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8e1xuICAgIG1lc3NhZ2VzOiBBcnJheTx7IHJvbGU6IHN0cmluZzsgY29udGVudDogeyB0eXBlOiBzdHJpbmc7IHRleHQ6IHN0cmluZyB9IH0+O1xuICB9PiB7XG4gICAgY29uc3QgdmF1bHRQYXRoID0gdGhpcy5yZWdpc3RyeS5yZXNvbHZlKHZhdWx0TmFtZSk7XG4gICAgY29uc3QgcHJvbXB0UGF0aCA9IGpvaW4odmF1bHRQYXRoLCB0aGlzLnByb21wdERpciwgbmFtZSk7XG5cbiAgICBsZXQgY29udGVudDogc3RyaW5nO1xuICAgIHRyeSB7XG4gICAgICBjb250ZW50ID0gYXdhaXQgcmVhZEZpbGUocHJvbXB0UGF0aCwgXCJ1dGYtOFwiKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUHJvbXB0IG5vdCBmb3VuZDogJHtuYW1lfWApO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlRnJvbnRtYXR0ZXIoY29udGVudCk7XG4gICAgY29uc3QgYm9keSA9IHBhcnNlZD8uYm9keSB8fCBjb250ZW50O1xuICAgIGNvbnN0IHdpdGhvdXRGcm9udG1hdHRlciA9IGJvZHkudHJpbSgpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIG1lc3NhZ2VzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICByb2xlOiBcInVzZXJcIixcbiAgICAgICAgICBjb250ZW50OiB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IHdpdGhvdXRGcm9udG1hdHRlcixcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9O1xuICB9XG59XG5cbmludGVyZmFjZSBQcm9tcHRQYXJhbWV0ZXIge1xuICBuYW1lOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICByZXF1aXJlZD86IGJvb2xlYW47XG59XG5cbmZ1bmN0aW9uIHBhcnNlUHJvbXB0UGFyYW1ldGVycyhjb250ZW50OiBzdHJpbmcpOiBQcm9tcHRQYXJhbWV0ZXJbXSB7XG4gIGNvbnN0IHJlZ2V4ID0gLzwlWy1fKl0qXFxzKnRwXFwubWNwVG9vbHNcXC5wcm9tcHRcXCgoW14pXSspXFwpXFxzKlstX10qJT4vZztcbiAgY29uc3QgcGFyYW1zOiBQcm9tcHRQYXJhbWV0ZXJbXSA9IFtdO1xuICBsZXQgbWF0Y2g6IFJlZ0V4cEV4ZWNBcnJheSB8IG51bGw7XG5cbiAgd2hpbGUgKChtYXRjaCA9IHJlZ2V4LmV4ZWMoY29udGVudCkpICE9PSBudWxsKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGFyZ3NTdHIgPSBtYXRjaFsxXTtcbiAgICAgIGNvbnN0IGFyZ3MgPSBhcmdzU3RyLnNwbGl0KFwiLFwiKS5tYXAoKHMpID0+IHMudHJpbSgpLnJlcGxhY2UoL15bXCInXXxbXCInXSQvZywgXCJcIikpO1xuXG4gICAgICBpZiAoYXJncy5sZW5ndGggPj0gMSkge1xuICAgICAgICBwYXJhbXMucHVzaCh7XG4gICAgICAgICAgbmFtZTogYXJnc1swXSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogYXJnc1sxXSxcbiAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcGFyYW1zO1xufVxuIiwgImltcG9ydCB0eXBlIHsgSlNPTlJQQ1JlcXVlc3QsIEpTT05SUENSZXNwb25zZSwgVG9vbERlZmluaXRpb24gfSBmcm9tIFwiLi9wcm90b2NvbFwiO1xuaW1wb3J0IHsgVmF1bHRGaWxlSGFuZGxlciB9IGZyb20gXCIuLi9oYW5kbGVycy90b29sc1wiO1xuaW1wb3J0IHsgUHJvbXB0SGFuZGxlciB9IGZyb20gXCIuLi9oYW5kbGVycy9wcm9tcHRzXCI7XG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIsIGZvcm1hdEVycm9yIH0gZnJvbSBcIi4uL3V0aWxzL2xvZ1wiO1xuaW1wb3J0IHR5cGUgeyBWYXVsdFJlZ2lzdHJ5IH0gZnJvbSBcIi4uL3V0aWxzL3ZhdWx0c1wiO1xuXG5jb25zdCBsb2cgPSBjcmVhdGVMb2dnZXIoXCJzZXJ2ZXJcIik7XG5cbmNvbnN0IHZhdWx0UGFyYW0gPSB7XG4gIHZhdWx0OiB7XG4gICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiVmF1bHQgbmFtZSAoZGVyaXZlZCBmcm9tIHRoZSBkaXJlY3RvcnkgbmFtZSkuIFJlcXVpcmVkIHdoZW4gbXVsdGlwbGUgdmF1bHRzIGFyZSBjb25maWd1cmVkLlwiLFxuICB9LFxufTtcblxuZXhwb3J0IGludGVyZmFjZSBTZXJ2ZXJJbnN0YW5jZSB7XG4gIHRvb2xEZWZpbml0aW9uczogVG9vbERlZmluaXRpb25bXTtcbiAgaGFuZGxlUmVxdWVzdChtc2c6IEpTT05SUENSZXF1ZXN0KTogUHJvbWlzZTxKU09OUlBDUmVzcG9uc2UgfCBudWxsPjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNlcnZlcihyZWdpc3RyeTogVmF1bHRSZWdpc3RyeSk6IFNlcnZlckluc3RhbmNlIHtcbiAgY29uc3QgdmF1bHRMaXN0ID0gcmVnaXN0cnkubGlzdCgpO1xuICBjb25zdCB2YXVsdE5hbWVzID0gdmF1bHRMaXN0Lm1hcCgodikgPT4gdi5uYW1lKTtcbiAgdmF1bHRQYXJhbS52YXVsdC5kZXNjcmlwdGlvbiA9IGBWYXVsdCBuYW1lLiBBdmFpbGFibGU6ICR7dmF1bHROYW1lcy5qb2luKFwiLCBcIil9YDtcblxuICBjb25zdCBmaWxlSGFuZGxlciA9IG5ldyBWYXVsdEZpbGVIYW5kbGVyKHJlZ2lzdHJ5KTtcbiAgY29uc3QgcHJvbXB0SGFuZGxlciA9IG5ldyBQcm9tcHRIYW5kbGVyKHJlZ2lzdHJ5KTtcbiAgY29uc3QgdG9vbEhhbmRsZXJzID0gZmlsZUhhbmRsZXIuZ2V0SGFuZGxlcnMoKTtcblxuICBjb25zdCB0b29sRGVmaW5pdGlvbnM6IFRvb2xEZWZpbml0aW9uW10gPSBbXG4gICAge1xuICAgICAgbmFtZTogXCJsaXN0X3ZhdWx0c1wiLFxuICAgICAgZGVzY3JpcHRpb246IFwiTGlzdCBhbGwgY29uZmlndXJlZCB2YXVsdHMgd2l0aCB0aGVpciBwYXRocy5cIixcbiAgICAgIGlucHV0U2NoZW1hOiB7IHR5cGU6IFwib2JqZWN0XCIsIHByb3BlcnRpZXM6IHt9IH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImdldF92YXVsdF9pbmZvXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJHZXQgc3RhdHMgZm9yIGEgdmF1bHQgKGZpbGUgY291bnQsIHBhdGgsIG5hbWUpLlwiLFxuICAgICAgaW5wdXRTY2hlbWE6IHtcbiAgICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgIHZhdWx0OiB7XG4gICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IGBWYXVsdCBuYW1lLiBBdmFpbGFibGU6ICR7dmF1bHROYW1lcy5qb2luKFwiLCBcIil9YCxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwibGlzdF9maWxlc1wiLFxuICAgICAgZGVzY3JpcHRpb246IFwiTGlzdCBmaWxlcyBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb3IgYSBzcGVjaWZpZWQgc3ViZGlyZWN0b3J5IG9mIHlvdXIgdmF1bHQuXCIsXG4gICAgICBpbnB1dFNjaGVtYToge1xuICAgICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgLi4udmF1bHRQYXJhbSxcbiAgICAgICAgICBkaXJlY3Rvcnk6IHtcbiAgICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJPcHRpb25hbCBzdWJkaXJlY3RvcnkgcGF0aCByZWxhdGl2ZSB0byB2YXVsdCByb290XCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImdldF9maWxlXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJHZXQgdGhlIGNvbnRlbnQgb2YgYSBmaWxlIGZyb20geW91ciB2YXVsdC5cIixcbiAgICAgIGlucHV0U2NoZW1hOiB7XG4gICAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAuLi52YXVsdFBhcmFtLFxuICAgICAgICAgIGZpbGVuYW1lOiB7XG4gICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiUGF0aCB0byB0aGUgZmlsZSByZWxhdGl2ZSB0byB2YXVsdCByb290XCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBmb3JtYXQ6IHtcbiAgICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgICBlbnVtOiBbXCJtYXJrZG93blwiLCBcImpzb25cIl0sXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJSZXR1cm4gZm9ybWF0IChqc29uIGluY2x1ZGVzIGZyb250bWF0dGVyKVwiLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHJlcXVpcmVkOiBbXCJmaWxlbmFtZVwiXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImNyZWF0ZV9maWxlXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJDcmVhdGUgYSBuZXcgZmlsZSBpbiB5b3VyIHZhdWx0IG9yIHVwZGF0ZSBhbiBleGlzdGluZyBvbmUuXCIsXG4gICAgICBpbnB1dFNjaGVtYToge1xuICAgICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgLi4udmF1bHRQYXJhbSxcbiAgICAgICAgICBmaWxlbmFtZToge1xuICAgICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIlBhdGggdG8gdGhlIGZpbGUgcmVsYXRpdmUgdG8gdmF1bHQgcm9vdFwiLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgY29udGVudDogeyB0eXBlOiBcInN0cmluZ1wiLCBkZXNjcmlwdGlvbjogXCJGaWxlIGNvbnRlbnRcIiB9LFxuICAgICAgICB9LFxuICAgICAgICByZXF1aXJlZDogW1wiZmlsZW5hbWVcIiwgXCJjb250ZW50XCJdLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwiYXBwZW5kX3RvX2ZpbGVcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkFwcGVuZCBjb250ZW50IHRvIGEgbmV3IG9yIGV4aXN0aW5nIGZpbGUuXCIsXG4gICAgICBpbnB1dFNjaGVtYToge1xuICAgICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgLi4udmF1bHRQYXJhbSxcbiAgICAgICAgICBmaWxlbmFtZToge1xuICAgICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIlBhdGggdG8gdGhlIGZpbGUgcmVsYXRpdmUgdG8gdmF1bHQgcm9vdFwiLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgY29udGVudDoge1xuICAgICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIkNvbnRlbnQgdG8gYXBwZW5kXCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgcmVxdWlyZWQ6IFtcImZpbGVuYW1lXCIsIFwiY29udGVudFwiXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcInBhdGNoX2ZpbGVcIixcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIkluc2VydCBvciBtb2RpZnkgY29udGVudCBpbiBhIGZpbGUgcmVsYXRpdmUgdG8gYSBoZWFkaW5nLCBibG9jayByZWZlcmVuY2UsIG9yIGZyb250bWF0dGVyIGZpZWxkLlwiLFxuICAgICAgaW5wdXRTY2hlbWE6IHtcbiAgICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgIC4uLnZhdWx0UGFyYW0sXG4gICAgICAgICAgZmlsZW5hbWU6IHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgICAgIG9wZXJhdGlvbjoge1xuICAgICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICAgIGVudW06IFtcImFwcGVuZFwiLCBcInByZXBlbmRcIiwgXCJyZXBsYWNlXCJdLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdGFyZ2V0VHlwZToge1xuICAgICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICAgIGVudW06IFtcImhlYWRpbmdcIiwgXCJibG9ja1wiLCBcImZyb250bWF0dGVyXCJdLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdGFyZ2V0OiB7IHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgICBjb250ZW50OiB7IHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgICBjb250ZW50VHlwZToge1xuICAgICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICAgIGVudW06IFtcInRleHQvbWFya2Rvd25cIiwgXCJhcHBsaWNhdGlvbi9qc29uXCJdLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdGFyZ2V0RGVsaW1pdGVyOiB7IHR5cGU6IFwic3RyaW5nXCIsIGRlZmF1bHQ6IFwiOjpcIiB9LFxuICAgICAgICAgIHRyaW1UYXJnZXRXaGl0ZXNwYWNlOiB7IHR5cGU6IFwiYm9vbGVhblwiLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHJlcXVpcmVkOiBbXCJmaWxlbmFtZVwiLCBcIm9wZXJhdGlvblwiLCBcInRhcmdldFR5cGVcIiwgXCJ0YXJnZXRcIiwgXCJjb250ZW50XCJdLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwiZGVsZXRlX2ZpbGVcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkRlbGV0ZSBhIGZpbGUgZnJvbSB5b3VyIHZhdWx0LlwiLFxuICAgICAgaW5wdXRTY2hlbWE6IHtcbiAgICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgIC4uLnZhdWx0UGFyYW0sXG4gICAgICAgICAgZmlsZW5hbWU6IHtcbiAgICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJQYXRoIHRvIHRoZSBmaWxlIHJlbGF0aXZlIHRvIHZhdWx0IHJvb3RcIixcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICByZXF1aXJlZDogW1wiZmlsZW5hbWVcIl0sXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJzZWFyY2hcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlNlYXJjaCBmb3IgZG9jdW1lbnRzIG1hdGNoaW5nIGEgdGV4dCBxdWVyeSBpbiB5b3VyIHZhdWx0LlwiLFxuICAgICAgaW5wdXRTY2hlbWE6IHtcbiAgICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgIC4uLnZhdWx0UGFyYW0sXG4gICAgICAgICAgcXVlcnk6IHsgdHlwZTogXCJzdHJpbmdcIiwgZGVzY3JpcHRpb246IFwiVGV4dCB0byBzZWFyY2ggZm9yXCIgfSxcbiAgICAgICAgICBkaXJlY3Rvcnk6IHtcbiAgICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJPcHRpb25hbCBkaXJlY3RvcnkgdG8gc2NvcGUgdGhlIHNlYXJjaFwiLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgY29udGV4dExlbmd0aDoge1xuICAgICAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIkNoYXJhY3RlcnMgb2YgY29udGV4dCBhcm91bmQgZWFjaCBtYXRjaFwiLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHJlcXVpcmVkOiBbXCJxdWVyeVwiXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgXTtcblxuICBhc3luYyBmdW5jdGlvbiBoYW5kbGVSZXF1ZXN0KG1zZzogSlNPTlJQQ1JlcXVlc3QpOiBQcm9taXNlPEpTT05SUENSZXNwb25zZSB8IG51bGw+IHtcbiAgICBjb25zdCB7IG1ldGhvZCwgcGFyYW1zLCBpZCB9ID0gbXNnO1xuXG4gICAgc3dpdGNoIChtZXRob2QpIHtcbiAgICAgIGNhc2UgXCJpbml0aWFsaXplXCI6IHtcbiAgICAgICAgY29uc3QgY2xpZW50UHJvdG9jb2wgPSBwYXJhbXM/LnByb3RvY29sVmVyc2lvbjtcbiAgICAgICAgbG9nLmluZm8oXCJjbGllbnQgaW5pdGlhbGl6ZWRcIiwge1xuICAgICAgICAgIGNsaWVudFByb3RvY29sOiBjbGllbnRQcm90b2NvbCB8fCBcIjIwMjQtMTEtMDVcIixcbiAgICAgICAgICB2YXVsdENvdW50OiB2YXVsdExpc3QubGVuZ3RoLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBqc29ucnBjOiBcIjIuMFwiLFxuICAgICAgICAgIGlkLFxuICAgICAgICAgIHJlc3VsdDoge1xuICAgICAgICAgICAgcHJvdG9jb2xWZXJzaW9uOiBjbGllbnRQcm90b2NvbCB8fCBcIjIwMjQtMTEtMDVcIixcbiAgICAgICAgICAgIGNhcGFiaWxpdGllczogeyB0b29sczoge30sIHByb21wdHM6IHt9IH0sXG4gICAgICAgICAgICBzZXJ2ZXJJbmZvOiB7IG5hbWU6IFwib2JzaWRpYW4tbmF0aXZlLW1jcFwiLCB2ZXJzaW9uOiBcIjAuMi4wXCIgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjYXNlIFwidG9vbHMvbGlzdFwiOlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGpzb25ycGM6IFwiMi4wXCIsXG4gICAgICAgICAgaWQsXG4gICAgICAgICAgcmVzdWx0OiB7IHRvb2xzOiB0b29sRGVmaW5pdGlvbnMgfSxcbiAgICAgICAgfTtcblxuICAgICAgY2FzZSBcInRvb2xzL2NhbGxcIjoge1xuICAgICAgICBjb25zdCB0b29sTmFtZSA9IHBhcmFtcz8ubmFtZTtcbiAgICAgICAgY29uc3QgYXJncyA9IHBhcmFtcz8uYXJndW1lbnRzIHx8IHt9O1xuICAgICAgICBjb25zdCBoYW5kbGVyID0gdG9vbEhhbmRsZXJzW3Rvb2xOYW1lIGFzIHN0cmluZ107XG4gICAgICAgIGlmICghaGFuZGxlcikge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBqc29ucnBjOiBcIjIuMFwiLFxuICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICBlcnJvcjogeyBjb2RlOiAtMzI2MDEsIG1lc3NhZ2U6IGBVbmtub3duIHRvb2w6ICR7dG9vbE5hbWV9YCB9LFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBoYW5kbGVyKGFyZ3MpO1xuICAgICAgICAgIHJldHVybiB7IGpzb25ycGM6IFwiMi4wXCIsIGlkLCByZXN1bHQgfTtcbiAgICAgICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgICBsb2cuZXJyb3IoXCJ0b29sIGNhbGwgZmFpbGVkXCIsIHtcbiAgICAgICAgICAgIHRvb2w6IFN0cmluZyh0b29sTmFtZSksXG4gICAgICAgICAgICBlcnJvcjogZm9ybWF0RXJyb3IoZXJyKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAganNvbnJwYzogXCIyLjBcIixcbiAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgZXJyb3I6IHsgY29kZTogLTMyNjAzLCBtZXNzYWdlOiBlcnIubWVzc2FnZSB8fCBTdHJpbmcoZXJyKSB9LFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY2FzZSBcInByb21wdHMvbGlzdFwiOiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcHJvbXB0VmF1bHQgPSBwYXJhbXM/LmFyZ3VtZW50cz8udmF1bHQ7XG4gICAgICAgICAgY29uc3QgcHJvbXB0TGlzdCA9IGF3YWl0IHByb21wdEhhbmRsZXIubGlzdChwcm9tcHRWYXVsdCk7XG4gICAgICAgICAgcmV0dXJuIHsganNvbnJwYzogXCIyLjBcIiwgaWQsIHJlc3VsdDogeyBwcm9tcHRzOiBwcm9tcHRMaXN0IH0gfTtcbiAgICAgICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgICBsb2cuZXJyb3IoXCJwcm9tcHQgbGlzdGluZyBmYWlsZWRcIiwgeyBlcnJvcjogZm9ybWF0RXJyb3IoZXJyKSB9KTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAganNvbnJwYzogXCIyLjBcIixcbiAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgZXJyb3I6IHsgY29kZTogLTMyNjAzLCBtZXNzYWdlOiBlcnIubWVzc2FnZSB8fCBTdHJpbmcoZXJyKSB9LFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY2FzZSBcInByb21wdHMvZ2V0XCI6IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBwcm9tcHRWYXVsdCA9IHBhcmFtcz8uYXJndW1lbnRzPy52YXVsdDtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwcm9tcHRIYW5kbGVyLmdldChwYXJhbXM/Lm5hbWUsIHByb21wdFZhdWx0KTtcbiAgICAgICAgICByZXR1cm4geyBqc29ucnBjOiBcIjIuMFwiLCBpZCwgcmVzdWx0IH07XG4gICAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgICAgbG9nLmVycm9yKFwicHJvbXB0IGZldGNoIGZhaWxlZFwiLCB7XG4gICAgICAgICAgICBwcm9tcHQ6IHR5cGVvZiBwYXJhbXM/Lm5hbWUgPT09IFwic3RyaW5nXCIgPyBwYXJhbXMubmFtZSA6IFwiXCIsXG4gICAgICAgICAgICBlcnJvcjogZm9ybWF0RXJyb3IoZXJyKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAganNvbnJwYzogXCIyLjBcIixcbiAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgZXJyb3I6IHsgY29kZTogLTMyNjAzLCBtZXNzYWdlOiBlcnIubWVzc2FnZSB8fCBTdHJpbmcoZXJyKSB9LFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY2FzZSBcIm5vdGlmaWNhdGlvbnMvaW5pdGlhbGl6ZWRcIjpcbiAgICAgIGNhc2UgXCJub3RpZmljYXRpb25zL2NhbmNlbGxlZFwiOlxuICAgICAgY2FzZSBcIm5vdGlmaWNhdGlvbnMvcm9vdHMvbGlzdF9jaGFuZ2VkXCI6XG4gICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBsb2cud2FybihcIm1ldGhvZCBub3QgZm91bmRcIiwgeyBtZXRob2QgfSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAganNvbnJwYzogXCIyLjBcIixcbiAgICAgICAgICBpZCxcbiAgICAgICAgICBlcnJvcjogeyBjb2RlOiAtMzI2MDEsIG1lc3NhZ2U6IGBNZXRob2Qgbm90IGZvdW5kOiAke21ldGhvZH1gIH0sXG4gICAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgdG9vbERlZmluaXRpb25zLCBoYW5kbGVSZXF1ZXN0IH07XG59XG4iLCAiaW1wb3J0IHsgaG9tZWRpciwgcGxhdGZvcm0gfSBmcm9tIFwib3NcIjtcbmltcG9ydCB7IHJlc29sdmUsIGJhc2VuYW1lLCBqb2luIH0gZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IHJlYWRGaWxlU3luYywgZXhpc3RzU3luYywgcmVhZGRpclN5bmMsIHN0YXRTeW5jIH0gZnJvbSBcImZzXCI7XG5cbmNvbnN0IElTX1dJTiA9IHBsYXRmb3JtKCkgPT09IFwid2luMzJcIjtcblxuZXhwb3J0IGludGVyZmFjZSBWYXVsdENvbmZpZyB7XG4gIG5hbWU6IHN0cmluZztcbiAgcGF0aDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZhdWx0VmFsaWRhdGlvbiB7XG4gIG1pc3Npbmc6IFZhdWx0Q29uZmlnW107XG59XG5cbmV4cG9ydCBjbGFzcyBWYXVsdFJlZ2lzdHJ5IHtcbiAgcHJpdmF0ZSB2YXVsdHM6IE1hcDxzdHJpbmcsIHN0cmluZz4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgc291cmNlOiBcImVudlwiIHwgXCJjb25maWdcIiB8IFwibm9uZVwiID0gXCJub25lXCI7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgY29uc3QgZnJvbUVudiA9IHRoaXMucGFyc2VFbnYoKTtcbiAgICBjb25zdCBmcm9tQ29uZmlnID0gdGhpcy5wYXJzZUNvbmZpZ0ZpbGUoKTtcblxuICAgIGlmIChmcm9tRW52Lmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuc291cmNlID0gXCJlbnZcIjtcbiAgICAgIGZvciAoY29uc3QgdiBvZiBmcm9tRW52KSB0aGlzLnZhdWx0cy5zZXQodi5uYW1lLCB2LnBhdGgpO1xuICAgIH0gZWxzZSBpZiAoZnJvbUNvbmZpZy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnNvdXJjZSA9IFwiY29uZmlnXCI7XG4gICAgICBmb3IgKGNvbnN0IHYgb2YgZnJvbUNvbmZpZykgdGhpcy52YXVsdHMuc2V0KHYubmFtZSwgdi5wYXRoKTtcbiAgICB9XG4gIH1cblxuICBjb25maWd1cmUodmF1bHRzOiBWYXVsdENvbmZpZ1tdKTogdm9pZCB7XG4gICAgdGhpcy52YXVsdHMuY2xlYXIoKTtcbiAgICBmb3IgKGNvbnN0IHYgb2YgdmF1bHRzKSB7XG4gICAgICB0aGlzLnZhdWx0cy5zZXQodi5uYW1lLCB2LnBhdGgpO1xuICAgIH1cbiAgICB0aGlzLnNvdXJjZSA9IHZhdWx0cy5sZW5ndGggPiAwID8gXCJjb25maWdcIiA6IFwibm9uZVwiO1xuICB9XG5cbiAgc3RhdGljIGRpc2NvdmVyRnJvbU9ic2lkaWFuKCk6IFZhdWx0Q29uZmlnW10ge1xuICAgIGNvbnN0IGNvbmZpZ1BhdGggPSBvYnNpZGlhbkNvbmZpZ1BhdGgoKTtcbiAgICBpZiAoIWNvbmZpZ1BhdGggfHwgIWV4aXN0c1N5bmMoY29uZmlnUGF0aCkpIHJldHVybiBbXTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByYXcgPSByZWFkRmlsZVN5bmMoY29uZmlnUGF0aCwgXCJ1dGYtOFwiKTtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IEpTT04ucGFyc2UocmF3KTtcbiAgICAgIGNvbnN0IHZhdWx0cyA9IGNvbmZpZy52YXVsdHMgYXMgUmVjb3JkPHN0cmluZywgeyBwYXRoOiBzdHJpbmcgfT47XG4gICAgICBpZiAoIXZhdWx0cykgcmV0dXJuIFtdO1xuXG4gICAgICByZXR1cm4gT2JqZWN0LmVudHJpZXModmF1bHRzKVxuICAgICAgICAuZmlsdGVyKChbLCB2XSkgPT4gdiAmJiB0eXBlb2Ygdi5wYXRoID09PSBcInN0cmluZ1wiKVxuICAgICAgICAubWFwKChbbmFtZSwgdl0pID0+ICh7XG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICBwYXRoOiByZXNvbHZlKHYucGF0aC5yZXBsYWNlKC9efi8sIGhvbWVkaXIoKSkpLFxuICAgICAgICB9KSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG5cbiAgcmVzb2x2ZShuYW1lPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAobmFtZSkge1xuICAgICAgY29uc3QgcGF0aCA9IHRoaXMudmF1bHRzLmdldChuYW1lKTtcbiAgICAgIGlmICghcGF0aCkge1xuICAgICAgICBjb25zdCBhdmFpbGFibGUgPSB0aGlzLmxpc3QoKVxuICAgICAgICAgIC5tYXAoKHYpID0+IHYubmFtZSlcbiAgICAgICAgICAuam9pbihcIiwgXCIpO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gdmF1bHQgXCIke25hbWV9XCIuIEF2YWlsYWJsZSB2YXVsdHM6ICR7YXZhaWxhYmxlfWApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHBhdGg7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudmF1bHRzLnNpemUgPT09IDEpIHtcbiAgICAgIHJldHVybiB0aGlzLnZhdWx0cy52YWx1ZXMoKS5uZXh0KCkudmFsdWUhO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnZhdWx0cy5zaXplID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiTm8gdmF1bHRzIGNvbmZpZ3VyZWQuIFNldCBPQlNJRElBTl9WQVVMVF9QQVRIUyBvciB+Ly5jb25maWcvb2JzaWRpYW4tbmF0aXZlLW1jcC92YXVsdHMuanNvbi5cIixcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgYXZhaWxhYmxlID0gdGhpcy5saXN0KClcbiAgICAgIC5tYXAoKHYpID0+IHYubmFtZSlcbiAgICAgIC5qb2luKFwiLCBcIik7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBNdWx0aXBsZSB2YXVsdHMgY29uZmlndXJlZCBidXQgbm8gdmF1bHQgc3BlY2lmaWVkLiBDaG9vc2Ugb25lOiAke2F2YWlsYWJsZX1gKTtcbiAgfVxuXG4gIGdldFNvdXJjZSgpOiBcImVudlwiIHwgXCJjb25maWdcIiB8IFwibm9uZVwiIHtcbiAgICByZXR1cm4gdGhpcy5zb3VyY2U7XG4gIH1cblxuICBsaXN0KCk6IFZhdWx0Q29uZmlnW10ge1xuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMudmF1bHRzLmVudHJpZXMoKSkubWFwKChbbmFtZSwgcGF0aF0pID0+ICh7XG4gICAgICBuYW1lLFxuICAgICAgcGF0aCxcbiAgICB9KSk7XG4gIH1cblxuICB2YWxpZGF0ZSgpOiBWYXVsdFZhbGlkYXRpb24ge1xuICAgIGNvbnN0IG1pc3NpbmcgPSB0aGlzLmxpc3QoKS5maWx0ZXIoKHZhdWx0KSA9PiAhZXhpc3RzU3luYyh2YXVsdC5wYXRoKSk7XG4gICAgcmV0dXJuIHsgbWlzc2luZyB9O1xuICB9XG5cbiAgaW5mbyhuYW1lPzogc3RyaW5nKTogeyBuYW1lOiBzdHJpbmc7IHBhdGg6IHN0cmluZzsgZmlsZUNvdW50OiBudW1iZXIgfSB7XG4gICAgY29uc3QgdmF1bHRQYXRoID0gdGhpcy5yZXNvbHZlKG5hbWUpO1xuICAgIGxldCBmaWxlQ291bnQgPSAwO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB3YWxrRGlyID0gKGRpcjogc3RyaW5nKTogdm9pZCA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgcmVhZGRpclN5bmMoZGlyKSkge1xuICAgICAgICAgIGNvbnN0IGZ1bGwgPSBqb2luKGRpciwgZW50cnkpO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBzdGF0ID0gc3RhdFN5bmMoZnVsbCk7XG4gICAgICAgICAgICBpZiAoc3RhdC5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgICAgICAgIGlmICghZW50cnkuc3RhcnRzV2l0aChcIi5cIikpIHdhbGtEaXIoZnVsbCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVudHJ5LmVuZHNXaXRoKFwiLm1kXCIpKSB7XG4gICAgICAgICAgICAgIGZpbGVDb3VudCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gc2tpcCB1bnJlYWRhYmxlIGVudHJpZXNcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICB3YWxrRGlyKHZhdWx0UGF0aCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBza2lwIHVucmVhZGFibGUgZGlyZWN0b3JpZXNcbiAgICB9XG4gICAgcmV0dXJuIHsgbmFtZTogYmFzZW5hbWUodmF1bHRQYXRoKSwgcGF0aDogdmF1bHRQYXRoLCBmaWxlQ291bnQgfTtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VFbnYoKTogVmF1bHRDb25maWdbXSB7XG4gICAgY29uc3QgZW52VmFsID0gcHJvY2Vzcy5lbnYuT0JTSURJQU5fVkFVTFRfUEFUSFM7XG4gICAgaWYgKCFlbnZWYWwpIHJldHVybiBbXTtcblxuICAgIGNvbnN0IHNlcGFyYXRvciA9IC9bO1xcbl0vO1xuICAgIGNvbnN0IHBhcnRzID0gZW52VmFsXG4gICAgICAuc3BsaXQoc2VwYXJhdG9yKVxuICAgICAgLm1hcCgocykgPT4gcy50cmltKCkpXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pO1xuXG4gICAgcmV0dXJuIHBhcnRzLm1hcCgocCkgPT4ge1xuICAgICAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlKHAucmVwbGFjZSgvXn4vLCBob21lZGlyKCkpKTtcbiAgICAgIHJldHVybiB7IG5hbWU6IGJhc2VuYW1lKHJlc29sdmVkKSwgcGF0aDogcmVzb2x2ZWQgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY29uZmlnRGlyKCk6IHN0cmluZyB7XG4gICAgaWYgKElTX1dJTikge1xuICAgICAgcmV0dXJuIHJlc29sdmUoXG4gICAgICAgIHByb2Nlc3MuZW52LkFQUERBVEEgfHwgam9pbihob21lZGlyKCksIFwiQXBwRGF0YVwiLCBcIlJvYW1pbmdcIiksXG4gICAgICAgIFwib2JzaWRpYW4tbmF0aXZlLW1jcFwiLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgeGRnID0gcHJvY2Vzcy5lbnYuWERHX0NPTkZJR19IT01FO1xuICAgIGlmICh4ZGcpIHJldHVybiByZXNvbHZlKHhkZywgXCJvYnNpZGlhbi1uYXRpdmUtbWNwXCIpO1xuICAgIHJldHVybiByZXNvbHZlKGhvbWVkaXIoKSwgXCIuY29uZmlnXCIsIFwib2JzaWRpYW4tbmF0aXZlLW1jcFwiKTtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VDb25maWdGaWxlKCk6IFZhdWx0Q29uZmlnW10ge1xuICAgIGNvbnN0IGNvbmZpZ1BhdGggPSBqb2luKHRoaXMuY29uZmlnRGlyKCksIFwidmF1bHRzLmpzb25cIik7XG4gICAgaWYgKCFleGlzdHNTeW5jKGNvbmZpZ1BhdGgpKSByZXR1cm4gW107XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmF3ID0gcmVhZEZpbGVTeW5jKGNvbmZpZ1BhdGgsIFwidXRmLThcIik7XG4gICAgICBjb25zdCBjb25maWcgPSBKU09OLnBhcnNlKHJhdyk7XG4gICAgICBjb25zdCByZXNvbHZlZDogVmF1bHRDb25maWdbXSA9IFtdO1xuXG4gICAgICBjb25zdCBlbnRyaWVzID0gY29uZmlnLnZhdWx0c1xuICAgICAgICA/IChPYmplY3QuZW50cmllcyhjb25maWcudmF1bHRzKSBhcyBbc3RyaW5nLCB1bmtub3duXVtdKVxuICAgICAgICA6IChPYmplY3QuZW50cmllcyhjb25maWcpLmZpbHRlcigoW2tdKSA9PiBrICE9PSBcImRlZmF1bHRcIikgYXMgW3N0cmluZywgdW5rbm93bl1bXSk7XG5cbiAgICAgIGZvciAoY29uc3QgW25hbWUsIHBhdGhdIG9mIGVudHJpZXMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBwYXRoID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgcmVzb2x2ZWQucHVzaCh7IG5hbWUsIHBhdGg6IHJlc29sdmUocGF0aC5yZXBsYWNlKC9efi8sIGhvbWVkaXIoKSkpIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXNvbHZlZDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gb2JzaWRpYW5Db25maWdQYXRoKCk6IHN0cmluZyB8IG51bGwge1xuICBpZiAoSVNfV0lOKSB7XG4gICAgY29uc3QgYXBwRGF0YSA9IHByb2Nlc3MuZW52LkFQUERBVEE7XG4gICAgaWYgKCFhcHBEYXRhKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gcmVzb2x2ZShhcHBEYXRhLCBcIm9ic2lkaWFuXCIsIFwib2JzaWRpYW4uanNvblwiKTtcbiAgfVxuICBpZiAocGxhdGZvcm0oKSA9PT0gXCJkYXJ3aW5cIikge1xuICAgIHJldHVybiByZXNvbHZlKGhvbWVkaXIoKSwgXCJMaWJyYXJ5XCIsIFwiQXBwbGljYXRpb24gU3VwcG9ydFwiLCBcIm9ic2lkaWFuXCIsIFwib2JzaWRpYW4uanNvblwiKTtcbiAgfVxuICBjb25zdCB4ZGcgPSBwcm9jZXNzLmVudi5YREdfQ09ORklHX0hPTUU7XG4gIGlmICh4ZGcpIHJldHVybiByZXNvbHZlKHhkZywgXCJvYnNpZGlhblwiLCBcIm9ic2lkaWFuLmpzb25cIik7XG4gIHJldHVybiByZXNvbHZlKGhvbWVkaXIoKSwgXCIuY29uZmlnXCIsIFwib2JzaWRpYW5cIiwgXCJvYnNpZGlhbi5qc29uXCIpO1xufVxuIiwgImltcG9ydCB7IEFwcCwgUGx1Z2luU2V0dGluZ1RhYiwgU2V0dGluZyB9IGZyb20gXCJvYnNpZGlhblwiO1xuaW1wb3J0IHsgVmF1bHRSZWdpc3RyeSB9IGZyb20gXCIuLi91dGlscy92YXVsdHNcIjtcbmltcG9ydCB0eXBlIE5hdGl2ZU1jcFBsdWdpbiBmcm9tIFwiLi9tYWluXCI7XG5cbmV4cG9ydCBjbGFzcyBOYXRpdmVNY3BTZXR0aW5nVGFiIGV4dGVuZHMgUGx1Z2luU2V0dGluZ1RhYiB7XG4gIHByaXZhdGUgcGx1Z2luOiBOYXRpdmVNY3BQbHVnaW47XG5cbiAgY29uc3RydWN0b3IoYXBwOiBBcHAsIHBsdWdpbjogTmF0aXZlTWNwUGx1Z2luKSB7XG4gICAgc3VwZXIoYXBwLCBwbHVnaW4pO1xuICAgIHRoaXMucGx1Z2luID0gcGx1Z2luO1xuICB9XG5cbiAgZGlzcGxheSgpOiB2b2lkIHtcbiAgICBjb25zdCB7IGNvbnRhaW5lckVsIH0gPSB0aGlzO1xuICAgIGNvbnRhaW5lckVsLmVtcHR5KCk7XG5cbiAgICBjb250YWluZXJFbC5jcmVhdGVFbChcImgyXCIsIHsgdGV4dDogXCJPYnNpZGlhbiBOYXRpdmUgTUNQXCIgfSk7XG5cbiAgICBjb25zdCB1cmwgPSB0aGlzLnBsdWdpbi5nZXRTZXJ2ZXJVcmwoKTtcbiAgICBpZiAodXJsKSB7XG4gICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgLnNldE5hbWUoXCJNQ1AgU2VydmVyIFVSTFwiKVxuICAgICAgICAuc2V0RGVzYyhcIkFkZCB0aGlzIFVSTCB0byB5b3VyIENsYXVkZSBEZXNrdG9wIGNvbmZpZ1wiKVxuICAgICAgICAuYWRkVGV4dCgodGV4dCkgPT4ge1xuICAgICAgICAgIHRleHQuc2V0VmFsdWUodXJsKS5zZXREaXNhYmxlZCh0cnVlKTtcbiAgICAgICAgICB0ZXh0LmlucHV0RWwuc3R5bGUud2lkdGggPSBcIjEwMCVcIjtcbiAgICAgICAgfSlcbiAgICAgICAgLmFkZEJ1dHRvbigoYnRuKSA9PiB7XG4gICAgICAgICAgYnRuLnNldEJ1dHRvblRleHQoXCJDb3B5XCIpLm9uQ2xpY2soYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgYXdhaXQgKG5hdmlnYXRvciBhcyBhbnkpLmNsaXBib2FyZC53cml0ZVRleHQodXJsKTtcbiAgICAgICAgICAgIGJ0bi5zZXRCdXR0b25UZXh0KFwiQ29waWVkIVwiKTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gYnRuLnNldEJ1dHRvblRleHQoXCJDb3B5XCIpLCAyMDAwKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAuc2V0TmFtZShcIlNlcnZlciBpbmFjdGl2ZVwiKVxuICAgICAgICAuc2V0RGVzYyhcIlNlbGVjdCBhdCBsZWFzdCBvbmUgdmF1bHQgYmVsb3cgdG8gc3RhcnQgdGhlIE1DUCBzZXJ2ZXIuXCIpO1xuICAgIH1cblxuICAgIGNvbnRhaW5lckVsLmNyZWF0ZUVsKFwiaDNcIiwgeyB0ZXh0OiBcIlZhdWx0c1wiIH0pO1xuXG4gICAgY29uc3QgYWxsVmF1bHRzID0gVmF1bHRSZWdpc3RyeS5kaXNjb3ZlckZyb21PYnNpZGlhbigpO1xuICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy5wbHVnaW4uZ2V0U2V0dGluZ3MoKS5zZWxlY3RlZFZhdWx0cztcblxuICAgIGlmIChhbGxWYXVsdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb250YWluZXJFbC5jcmVhdGVFbChcInBcIiwge1xuICAgICAgICB0ZXh0OiBcIk5vIE9ic2lkaWFuIHZhdWx0cyBmb3VuZC4gTWFrZSBzdXJlIE9ic2lkaWFuIGhhcyBiZWVuIHN0YXJ0ZWQgYXQgbGVhc3Qgb25jZS5cIixcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgdmF1bHQgb2YgYWxsVmF1bHRzKSB7XG4gICAgICBjb25zdCBpc1NlbGVjdGVkID0gc2VsZWN0ZWQuaW5jbHVkZXModmF1bHQubmFtZSk7XG4gICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgLnNldE5hbWUodmF1bHQubmFtZSlcbiAgICAgICAgLnNldERlc2ModmF1bHQucGF0aClcbiAgICAgICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PlxuICAgICAgICAgIHRvZ2dsZS5zZXRWYWx1ZShpc1NlbGVjdGVkKS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG5ld1NlbGVjdGVkID0gdmFsdWVcbiAgICAgICAgICAgICAgPyBbLi4uc2VsZWN0ZWQsIHZhdWx0Lm5hbWVdXG4gICAgICAgICAgICAgIDogc2VsZWN0ZWQuZmlsdGVyKChuKSA9PiBuICE9PSB2YXVsdC5uYW1lKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnVwZGF0ZVNlbGVjdGVkVmF1bHRzKG5ld1NlbGVjdGVkKTtcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheSgpO1xuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgIH1cbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBQUFBLG1CQUF1Qjs7O0FDQXZCLGtCQUFpQjs7O0FDSVYsU0FBUyxhQUFhLFdBQW1CO0FBQzlDLFNBQU87QUFBQSxJQUNMLE9BQU8sQ0FBQyxTQUFpQixXQUN2QixTQUFTLFNBQVMsV0FBVyxTQUFTLE1BQU07QUFBQSxJQUM5QyxNQUFNLENBQUMsU0FBaUIsV0FDdEIsU0FBUyxRQUFRLFdBQVcsU0FBUyxNQUFNO0FBQUEsSUFDN0MsTUFBTSxDQUFDLFNBQWlC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QUFTLEVBQUUsSUFBSSxDQUFDO0FBQy9ELFNBQUssU0FBUyxVQUFVLFFBQVE7QUFDaEMsSUFBQUEsS0FBSSxLQUFLLDJCQUEyQixFQUFFLG9CQUFvQixTQUFTLE9BQU8sQ0FBQztBQUUzRSxRQUFJLFNBQVMsU0FBUyxHQUFHO0FBQ3ZCLFlBQU0sS0FBSyxZQUFZO0FBQUEsSUFDekIsT0FBTztBQUNMLFdBQUssV0FBVyxNQUFNO0FBQ3RCLFdBQUssWUFBWTtBQUNqQixNQUFBQSxLQUFJLEtBQUsseURBQXlEO0FBQUEsSUFDcEU7QUFBQSxFQUNGO0FBQUEsRUFFQSxXQUFpQjtBQUNmLFNBQUssV0FBVyxNQUFNO0FBQ3RCLElBQUFBLEtBQUksS0FBSyxpQkFBaUI7QUFBQSxFQUM1QjtBQUNGOyIsCiAgIm5hbWVzIjogWyJpbXBvcnRfb2JzaWRpYW4iLCAicmVzb2x2ZSIsICJodHRwIiwgImltcG9ydF9mcyIsICJpbXBvcnRfcHJvbWlzZXMiLCAiaW1wb3J0X3BhdGgiLCAiaW1wb3J0X2ZzIiwgImltcG9ydF9wcm9taXNlcyIsICJpbXBvcnRfcGF0aCIsICJwYXJzZUZyb250bWF0dGVyIiwgImxvZyIsICJpbXBvcnRfcGF0aCIsICJpbXBvcnRfZnMiLCAiYXZhaWxhYmxlIiwgIndhbGtEaXIiLCAibG9nIl0KfQo=