@tscircuit/cli 0.1.4 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/main.js CHANGED
@@ -5,13 +5,74 @@ import { Command } from "commander";
5
5
 
6
6
  // cli/dev/register.ts
7
7
  import * as path4 from "node:path";
8
- import * as chokidar from "chokidar";
9
- import * as fs4 from "node:fs";
10
8
 
11
- // lib/server/createServer.ts
12
- import * as http from "node:http";
9
+ // lib/dependency-analysis/installNodeModuleTypesForSnippet.ts
13
10
  import * as fs from "node:fs";
14
11
  import * as path from "node:path";
12
+ import * as ts from "typescript";
13
+ async function installNodeModuleTypesForSnippet(snippetPath) {
14
+ const content = fs.readFileSync(snippetPath, "utf-8");
15
+ const sourceFile = ts.createSourceFile(
16
+ snippetPath,
17
+ content,
18
+ ts.ScriptTarget.Latest,
19
+ true
20
+ );
21
+ const imports = [];
22
+ function visit(node) {
23
+ if (ts.isImportDeclaration(node)) {
24
+ const moduleSpecifier = node.moduleSpecifier;
25
+ if (moduleSpecifier && ts.isStringLiteral(moduleSpecifier)) {
26
+ const importPath = moduleSpecifier.text;
27
+ if (importPath.startsWith("@tsci/")) {
28
+ imports.push(importPath);
29
+ }
30
+ }
31
+ }
32
+ ts.forEachChild(node, visit);
33
+ }
34
+ visit(sourceFile);
35
+ let projectRoot = path.dirname(snippetPath);
36
+ while (projectRoot !== path.parse(projectRoot).root) {
37
+ if (fs.existsSync(path.join(projectRoot, "package.json"))) {
38
+ break;
39
+ }
40
+ projectRoot = path.dirname(projectRoot);
41
+ }
42
+ for (const importPath of imports) {
43
+ const [owner, name] = importPath.replace("@tsci/", "").split(".");
44
+ try {
45
+ const response = await fetch(
46
+ `https://registry-api.tscircuit.com/snippets/get?owner_name=${owner}&unscoped_name=${name}`
47
+ );
48
+ if (!response.ok) {
49
+ console.warn(`Failed to fetch types for ${importPath}`);
50
+ continue;
51
+ }
52
+ const data = await response.json();
53
+ if (data.snippet.dts) {
54
+ const packageDir = path.join(
55
+ projectRoot,
56
+ "node_modules",
57
+ "@tsci",
58
+ `${owner}.${name}`
59
+ );
60
+ fs.mkdirSync(packageDir, { recursive: true });
61
+ fs.writeFileSync(path.join(packageDir, "index.d.ts"), data.snippet.dts);
62
+ }
63
+ } catch (error) {
64
+ console.warn(`Error fetching types for ${importPath}:`, error);
65
+ }
66
+ }
67
+ }
68
+
69
+ // cli/dev/DevServer.ts
70
+ import ky from "ky";
71
+
72
+ // lib/server/createHttpServer.ts
73
+ import * as http from "node:http";
74
+ import * as fs2 from "node:fs";
75
+ import * as path2 from "node:path";
15
76
  import { getNodeHandler } from "winterspec/adapters/node";
16
77
 
17
78
  // package.json
@@ -19,7 +80,7 @@ var package_default = {
19
80
  name: "@tscircuit/cli",
20
81
  main: "dist/main.js",
21
82
  type: "module",
22
- version: "0.1.3",
83
+ version: "0.1.5",
23
84
  bin: {
24
85
  tsci: "./dist/main.js"
25
86
  },
@@ -34,16 +95,20 @@ var package_default = {
34
95
  devDependencies: {
35
96
  "@biomejs/biome": "^1.9.4",
36
97
  "@tscircuit/core": "^0.0.249",
37
- "@types/bun": "latest",
98
+ "@types/bun": "^1.1.15",
38
99
  "@types/configstore": "^6.0.2",
39
100
  "@types/react": "^19.0.1",
40
- tsup: "^8.3.5"
101
+ "@types/semver": "^7.5.8",
102
+ "get-port": "^7.1.0",
103
+ tempy: "^3.1.0",
104
+ tsup: "^8.3.5",
105
+ "typed-ky": "^0.0.4"
41
106
  },
42
107
  peerDependencies: {
43
108
  typescript: "^5.0.0"
44
109
  },
45
110
  dependencies: {
46
- "@tscircuit/file-server": "^0.0.11",
111
+ "@tscircuit/file-server": "^0.0.13",
47
112
  "@tscircuit/runframe": "^0.0.47",
48
113
  chokidar: "^4.0.1",
49
114
  commander: "^12.1.0",
@@ -51,11 +116,12 @@ var package_default = {
51
116
  cosmiconfig: "^9.0.0",
52
117
  delay: "^6.0.0",
53
118
  ky: "^1.7.4",
54
- "perfect-cli": "^1.0.20"
119
+ "perfect-cli": "^1.0.20",
120
+ semver: "^7.6.3"
55
121
  }
56
122
  };
57
123
 
58
- // lib/server/createServer.ts
124
+ // lib/server/createHttpServer.ts
59
125
  import winterspecBundle from "@tscircuit/file-server/dist/bundle.js";
60
126
 
61
127
  // lib/site/getIndex.ts
@@ -74,19 +140,19 @@ var getIndex = async () => {
74
140
  </html>`;
75
141
  };
76
142
 
77
- // lib/server/createServer.ts
78
- var createServer2 = async (port = 3e3) => {
143
+ // lib/server/createHttpServer.ts
144
+ var createHttpServer = async (port = 3e3) => {
79
145
  const fileServerHandler = getNodeHandler(winterspecBundle, {});
80
146
  const server = http.createServer(async (req, res) => {
81
147
  const url = new URL(req.url, `http://${req.headers.host}`);
82
148
  if (url.pathname === "/standalone.min.js") {
83
- const standaloneFilePath = process.env.RUNFRAME_STANDALONE_FILE_PATH || path.resolve(
149
+ const standaloneFilePath = process.env.RUNFRAME_STANDALONE_FILE_PATH || path2.resolve(
84
150
  process.cwd(),
85
151
  "node_modules",
86
152
  "@tscircuit/runframe/dist/standalone.min.js"
87
153
  );
88
154
  try {
89
- const content = fs.readFileSync(standaloneFilePath, "utf8");
155
+ const content = fs2.readFileSync(standaloneFilePath, "utf8");
90
156
  res.writeHead(200, {
91
157
  "Content-Type": "application/javascript; charset=utf-8"
92
158
  });
@@ -115,147 +181,14 @@ var createServer2 = async (port = 3e3) => {
115
181
  res.writeHead(404);
116
182
  res.end("Not found");
117
183
  });
118
- return new Promise((resolve4) => {
184
+ return new Promise((resolve3) => {
119
185
  server.listen(port, () => {
120
186
  console.log(`Server running at http://localhost:${port}`);
121
- resolve4();
187
+ resolve3({ server });
122
188
  });
123
189
  });
124
190
  };
125
191
 
126
- // lib/dependency-analysis/getLocalFileDependencies.ts
127
- import * as ts from "typescript";
128
- import * as path2 from "path";
129
- import * as fs2 from "fs";
130
- function getLocalFileDependencies(pathToTsxFile) {
131
- const absolutePath = path2.resolve(pathToTsxFile);
132
- const baseDir = path2.dirname(absolutePath);
133
- const content = fs2.readFileSync(absolutePath, "utf-8");
134
- const sourceFile = ts.createSourceFile(
135
- absolutePath,
136
- content,
137
- ts.ScriptTarget.Latest,
138
- true
139
- );
140
- const dependencies = /* @__PURE__ */ new Set();
141
- function visit(node) {
142
- if (ts.isImportDeclaration(node) || ts.isExportDeclaration(node)) {
143
- const moduleSpecifier = node.moduleSpecifier;
144
- if (moduleSpecifier && ts.isStringLiteral(moduleSpecifier)) {
145
- const importPath = moduleSpecifier.text;
146
- if (importPath.startsWith(".")) {
147
- resolveAndAddDependency(importPath);
148
- }
149
- }
150
- }
151
- if (ts.isCallExpression(node) && node.expression.kind === ts.SyntaxKind.ImportKeyword) {
152
- const argument = node.arguments[0];
153
- if (argument && ts.isStringLiteral(argument)) {
154
- const importPath = argument.text;
155
- if (importPath.startsWith(".")) {
156
- resolveAndAddDependency(importPath);
157
- }
158
- }
159
- }
160
- ts.forEachChild(node, visit);
161
- }
162
- function resolveAndAddDependency(importPath) {
163
- const extensions = [
164
- ".tsx",
165
- ".ts",
166
- ".jsx",
167
- ".js",
168
- ".css",
169
- ".scss",
170
- ".sass",
171
- ".less"
172
- ];
173
- let resolvedPath = path2.resolve(baseDir, importPath);
174
- if (fs2.existsSync(resolvedPath)) {
175
- dependencies.add(resolvedPath);
176
- return;
177
- }
178
- for (const ext of extensions) {
179
- const pathWithExt = resolvedPath + ext;
180
- if (fs2.existsSync(pathWithExt)) {
181
- dependencies.add(pathWithExt);
182
- return;
183
- }
184
- }
185
- if (fs2.existsSync(resolvedPath) && fs2.statSync(resolvedPath).isDirectory()) {
186
- for (const ext of extensions) {
187
- const indexPath = path2.join(resolvedPath, `index${ext}`);
188
- if (fs2.existsSync(indexPath)) {
189
- dependencies.add(indexPath);
190
- return;
191
- }
192
- }
193
- }
194
- }
195
- visit(sourceFile);
196
- return Array.from(dependencies);
197
- }
198
-
199
- // lib/dependency-analysis/installNodeModuleTypes.ts
200
- import * as fs3 from "node:fs";
201
- import * as path3 from "node:path";
202
- import * as ts2 from "typescript";
203
- async function installTypes(snippetPath) {
204
- const content = fs3.readFileSync(snippetPath, "utf-8");
205
- const sourceFile = ts2.createSourceFile(
206
- snippetPath,
207
- content,
208
- ts2.ScriptTarget.Latest,
209
- true
210
- );
211
- const imports = [];
212
- function visit(node) {
213
- if (ts2.isImportDeclaration(node)) {
214
- const moduleSpecifier = node.moduleSpecifier;
215
- if (moduleSpecifier && ts2.isStringLiteral(moduleSpecifier)) {
216
- const importPath = moduleSpecifier.text;
217
- if (importPath.startsWith("@tsci/")) {
218
- imports.push(importPath);
219
- }
220
- }
221
- }
222
- ts2.forEachChild(node, visit);
223
- }
224
- visit(sourceFile);
225
- let projectRoot = path3.dirname(snippetPath);
226
- while (projectRoot !== path3.parse(projectRoot).root) {
227
- if (fs3.existsSync(path3.join(projectRoot, "package.json"))) {
228
- break;
229
- }
230
- projectRoot = path3.dirname(projectRoot);
231
- }
232
- for (const importPath of imports) {
233
- const [owner, name] = importPath.replace("@tsci/", "").split(".");
234
- try {
235
- const response = await fetch(
236
- `https://registry-api.tscircuit.com/snippets/get?owner_name=${owner}&unscoped_name=${name}`
237
- );
238
- if (!response.ok) {
239
- console.warn(`Failed to fetch types for ${importPath}`);
240
- continue;
241
- }
242
- const data = await response.json();
243
- if (data.snippet.dts) {
244
- const packageDir = path3.join(
245
- projectRoot,
246
- "node_modules",
247
- "@tsci",
248
- `${owner}.${name}`
249
- );
250
- fs3.mkdirSync(packageDir, { recursive: true });
251
- fs3.writeFileSync(path3.join(packageDir, "index.d.ts"), data.snippet.dts);
252
- }
253
- } catch (error) {
254
- console.warn(`Error fetching types for ${importPath}:`, error);
255
- }
256
- }
257
- }
258
-
259
192
  // lib/server/EventsWatcher.ts
260
193
  import { EventEmitter } from "events";
261
194
  var EventsWatcher = class extends EventEmitter {
@@ -307,6 +240,133 @@ var EventsWatcher = class extends EventEmitter {
307
240
  }
308
241
  };
309
242
 
243
+ // cli/dev/DevServer.ts
244
+ import path3 from "node:path";
245
+ import fs3 from "node:fs";
246
+ import * as chokidar from "chokidar";
247
+ var DevServer = class {
248
+ port;
249
+ /**
250
+ * The path to a component that exports a <board /> or <group /> component
251
+ */
252
+ componentFilePath;
253
+ projectDir;
254
+ /**
255
+ * The HTTP server that hosts the file server and event bus. You can use
256
+ * fsKy to communicate with the file server/event bus
257
+ */
258
+ httpServer;
259
+ /**
260
+ * Watches for events on the event bus by polling `api/events/list`
261
+ */
262
+ eventsWatcher;
263
+ /**
264
+ * A ky instance that can be used to communicate with the file server and
265
+ * event bus
266
+ */
267
+ fsKy;
268
+ /**
269
+ * A chokidar instance that watches the project directory for file changes
270
+ */
271
+ filesystemWatcher;
272
+ constructor({
273
+ port,
274
+ componentFilePath
275
+ }) {
276
+ this.port = port;
277
+ this.componentFilePath = componentFilePath;
278
+ this.projectDir = path3.dirname(componentFilePath);
279
+ this.fsKy = ky.create({
280
+ prefixUrl: `http://localhost:${port}`
281
+ });
282
+ }
283
+ async start() {
284
+ const { server } = await createHttpServer(this.port);
285
+ this.httpServer = server;
286
+ this.eventsWatcher = new EventsWatcher(`http://localhost:${this.port}`);
287
+ this.eventsWatcher.start();
288
+ this.eventsWatcher.on(
289
+ "FILE_UPDATED",
290
+ this.handleFileUpdatedEventFromServer.bind(this)
291
+ );
292
+ this.filesystemWatcher = chokidar.watch(this.projectDir, {
293
+ persistent: true,
294
+ ignoreInitial: true
295
+ });
296
+ this.filesystemWatcher.on(
297
+ "change",
298
+ (filePath) => this.handleFileChangedOnFilesystem(filePath)
299
+ );
300
+ this.filesystemWatcher.on(
301
+ "add",
302
+ (filePath) => this.handleFileChangedOnFilesystem(filePath)
303
+ );
304
+ this.upsertInitialFiles();
305
+ }
306
+ async addEntrypoint() {
307
+ const relativeComponentFilePath = path3.relative(
308
+ this.projectDir,
309
+ this.componentFilePath
310
+ );
311
+ await this.fsKy.post("api/files/upsert", {
312
+ json: {
313
+ file_path: "entrypoint.tsx",
314
+ text_content: `
315
+ import MyCircuit from "./${relativeComponentFilePath}"
316
+
317
+ circuit.add(<MyCircuit />)
318
+ `
319
+ }
320
+ });
321
+ }
322
+ async handleFileUpdatedEventFromServer(ev) {
323
+ if (ev.initiator === "filesystem_change") return;
324
+ if (ev.file_path === "manual-edits.json") {
325
+ console.log("Manual edits updated, updating on filesystem...");
326
+ const { file } = await this.fsKy.get("api/files/get", {
327
+ searchParams: { file_path: ev.file_path }
328
+ }).json();
329
+ fs3.writeFileSync(
330
+ path3.join(this.projectDir, "manual-edits.json"),
331
+ file.text_content
332
+ );
333
+ }
334
+ }
335
+ async handleFileChangedOnFilesystem(absoluteFilePath) {
336
+ const relativeFilePath = path3.relative(this.projectDir, absoluteFilePath);
337
+ if (relativeFilePath.includes("manual-edits.json")) return;
338
+ await this.fsKy.post("api/files/upsert", {
339
+ json: {
340
+ file_path: relativeFilePath,
341
+ text_content: fs3.readFileSync(absoluteFilePath, "utf-8"),
342
+ initiator: "filesystem_change"
343
+ }
344
+ }).json();
345
+ }
346
+ async upsertInitialFiles() {
347
+ const fileNames = fs3.readdirSync(this.projectDir);
348
+ for (const fileName of fileNames) {
349
+ if (fs3.statSync(path3.join(this.projectDir, fileName)).isDirectory())
350
+ continue;
351
+ const fileContent = fs3.readFileSync(
352
+ path3.join(this.projectDir, fileName),
353
+ "utf-8"
354
+ );
355
+ await this.fsKy.post("api/files/upsert", {
356
+ json: {
357
+ file_path: fileName,
358
+ text_content: fileContent,
359
+ initiator: "filesystem_change"
360
+ }
361
+ });
362
+ }
363
+ }
364
+ async stop() {
365
+ this.httpServer?.close();
366
+ this.eventsWatcher?.stop();
367
+ }
368
+ };
369
+
310
370
  // cli/dev/register.ts
311
371
  var registerDev = (program2) => {
312
372
  program2.command("dev").description("Start development server for a snippet").argument("<file>", "Path to the snippet file").option("-p, --port <number>", "Port to run server on", "3000").action(async (file, options) => {
@@ -315,79 +375,17 @@ var registerDev = (program2) => {
315
375
  const port = parseInt(options.port);
316
376
  try {
317
377
  console.log("Installing types for imported snippets...");
318
- await installTypes(absolutePath);
378
+ await installNodeModuleTypesForSnippet(absolutePath);
319
379
  console.log("Types installed successfully");
320
380
  } catch (error) {
321
381
  console.warn("Failed to install types:", error);
322
382
  }
323
- await createServer2(port);
324
- const eventsWatcher = new EventsWatcher(`http://localhost:${port}`);
325
- eventsWatcher.start();
326
- await fetch(`http://localhost:${port}/api/files/upsert`, {
327
- method: "POST",
328
- headers: { "Content-Type": "application/json" },
329
- body: JSON.stringify({
330
- file_path: "entrypoint.tsx",
331
- text_content: `
332
- import MyCircuit from "./snippet.tsx"
333
-
334
- circuit.add(<MyCircuit />)
335
- `
336
- })
337
- });
338
- const updateFile = async (filePath) => {
339
- try {
340
- const content = await fs4.promises.readFile(filePath, "utf-8");
341
- const response = await fetch(
342
- `http://localhost:${port}/api/files/upsert`,
343
- {
344
- method: "POST",
345
- headers: { "Content-Type": "application/json" },
346
- body: JSON.stringify({
347
- file_path: path4.relative(fileDir, filePath),
348
- text_content: content
349
- })
350
- }
351
- );
352
- if (!response.ok) {
353
- console.error(`Failed to update ${filePath}`);
354
- }
355
- } catch (error) {
356
- console.error(`Error updating ${filePath}:`, error);
357
- }
358
- };
359
- const dependencies = /* @__PURE__ */ new Set([absolutePath]);
360
- try {
361
- const deps = getLocalFileDependencies(absolutePath);
362
- deps.forEach((dep) => dependencies.add(dep));
363
- } catch (error) {
364
- console.warn("Failed to analyze dependencies:", error);
365
- }
366
- const filesystemWatcher = chokidar.watch(Array.from(dependencies), {
367
- persistent: true,
368
- ignoreInitial: false
369
- });
370
- filesystemWatcher.on("change", async (filePath) => {
371
- console.log(`File ${filePath} changed`);
372
- await updateFile(filePath);
373
- });
374
- filesystemWatcher.on("add", async (filePath) => {
375
- console.log(`File ${filePath} added`);
376
- await updateFile(filePath);
383
+ const server = new DevServer({
384
+ port,
385
+ componentFilePath: absolutePath
377
386
  });
378
- eventsWatcher.on("FILE_UPDATED", async (ev) => {
379
- if (ev.file_path === "manual-edits.json") {
380
- console.log("Manual edits updated, updating on filesystem...");
381
- const { file: file2 } = await fetch(
382
- `http://localhost:${port}/api/files/get?file_path=manual-edits.json`
383
- ).then((r) => r.json());
384
- fs4.writeFileSync(
385
- path4.join(fileDir, "manual-edits.json"),
386
- file2.text_content
387
- );
388
- }
389
- });
390
- console.log(`Watching ${file} and its dependencies...`);
387
+ await server.start();
388
+ await server.addEntrypoint();
391
389
  });
392
390
  };
393
391
 
@@ -404,7 +402,7 @@ var getRegistryApiUrl = () => {
404
402
  import delay from "delay";
405
403
 
406
404
  // lib/registry-api/get-ky.ts
407
- import ky from "ky";
405
+ import ky2 from "ky";
408
406
  var prettyResponseErrorHook = async (_request, _options, response) => {
409
407
  if (!response.ok) {
410
408
  try {
@@ -419,7 +417,7 @@ var prettyResponseErrorHook = async (_request, _options, response) => {
419
417
  }
420
418
  };
421
419
  var getKy = () => {
422
- return ky.create({
420
+ return ky2.create({
423
421
  prefixUrl: getRegistryApiUrl(),
424
422
  hooks: {
425
423
  afterResponse: [prettyResponseErrorHook]
@@ -430,8 +428,8 @@ var getKy = () => {
430
428
  // cli/auth/login/register.ts
431
429
  var registerAuthLogin = (program2) => {
432
430
  program2.commands.find((c) => c.name() === "auth").command("login").description("Authenticate CLI, login to registry").action(async (args) => {
433
- const ky2 = getKy();
434
- const { login_page } = await ky2.post(
431
+ const ky3 = getKy();
432
+ const { login_page } = await ky3.post(
435
433
  "sessions/login_page/create",
436
434
  {
437
435
  json: {}
@@ -440,7 +438,7 @@ var registerAuthLogin = (program2) => {
440
438
  console.log("Please visit the following URL to log in:");
441
439
  console.log(login_page.url);
442
440
  while (true) {
443
- const { login_page: new_login_page } = await ky2.post(
441
+ const { login_page: new_login_page } = await ky3.post(
444
442
  "sessions/login_page/get",
445
443
  {
446
444
  json: {
@@ -460,7 +458,7 @@ var registerAuthLogin = (program2) => {
460
458
  }
461
459
  await delay(1e3);
462
460
  }
463
- const { session } = await ky2.post(
461
+ const { session } = await ky3.post(
464
462
  "sessions/login_page/exchange_for_cli_session",
465
463
  {
466
464
  json: {
@@ -501,7 +499,7 @@ var registerConfigPrint = (program2) => {
501
499
  };
502
500
 
503
501
  // cli/clone/register.ts
504
- import * as fs5 from "node:fs";
502
+ import * as fs4 from "node:fs";
505
503
  import * as path5 from "node:path";
506
504
  var registerClone = (program2) => {
507
505
  program2.command("clone").description("Clone a snippet from the registry").argument("<snippet>", "Snippet to clone (e.g. author/snippetName)").action(async (snippetPath) => {
@@ -522,23 +520,23 @@ var registerClone = (program2) => {
522
520
  );
523
521
  process.exit(1);
524
522
  }
525
- const ky2 = getKy();
523
+ const ky3 = getKy();
526
524
  try {
527
525
  console.log(`Cloning ${author}/${snippetName}...`);
528
- const packageFileList = await ky2.post("package_files/list", {
526
+ const packageFileList = await ky3.post("package_files/list", {
529
527
  json: {
530
528
  package_name: `${author}/${snippetName}`,
531
529
  use_latest_version: true
532
530
  }
533
531
  }).json();
534
532
  const dirPath = `./${author}.${snippetName}`;
535
- if (!fs5.existsSync(dirPath)) {
536
- fs5.mkdirSync(dirPath);
533
+ if (!fs4.existsSync(dirPath)) {
534
+ fs4.mkdirSync(dirPath);
537
535
  }
538
536
  for (const fileInfo of packageFileList.package_files) {
539
537
  const filePath = fileInfo.file_path.startsWith("/") ? fileInfo.file_path.slice(1) : fileInfo.file_path;
540
538
  if (filePath.startsWith("dist/")) continue;
541
- const fileContent = await ky2.post("package_files/get", {
539
+ const fileContent = await ky3.post("package_files/get", {
542
540
  json: {
543
541
  package_name: `${author}/${snippetName}`,
544
542
  file_path: fileInfo.file_path
@@ -546,10 +544,10 @@ var registerClone = (program2) => {
546
544
  }).json();
547
545
  const fullPath = path5.join(dirPath, filePath);
548
546
  const dirName = path5.dirname(fullPath);
549
- if (!fs5.existsSync(dirName)) {
550
- fs5.mkdirSync(dirName, { recursive: true });
547
+ if (!fs4.existsSync(dirName)) {
548
+ fs4.mkdirSync(dirName, { recursive: true });
551
549
  }
552
- fs5.writeFileSync(fullPath, fileContent.package_file.content_text);
550
+ fs4.writeFileSync(fullPath, fileContent.package_file.content_text);
553
551
  }
554
552
  console.log(`Successfully cloned to ./${author}.${snippetName}/`);
555
553
  } catch (error) {
@@ -565,8 +563,9 @@ var registerClone = (program2) => {
565
563
 
566
564
  // cli/main.ts
567
565
  import { perfectCli } from "perfect-cli";
566
+ import semver from "semver";
568
567
  var program = new Command();
569
- program.name("tsci").description("CLI for developing tscircuit snippets").version(package_default.version);
568
+ program.name("tsci").description("CLI for developing tscircuit snippets").version(semver.inc(package_default.version, "patch") ?? package_default.version);
570
569
  registerDev(program);
571
570
  registerClone(program);
572
571
  registerAuth(program);
@@ -579,4 +578,4 @@ if (process.argv.length === 2) {
579
578
  } else {
580
579
  program.parse();
581
580
  }
582
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vY2xpL21haW4udHMiLCAiLi4vY2xpL2Rldi9yZWdpc3Rlci50cyIsICIuLi9saWIvc2VydmVyL2NyZWF0ZVNlcnZlci50cyIsICIuLi9wYWNrYWdlLmpzb24iLCAiLi4vbGliL3NpdGUvZ2V0SW5kZXgudHMiLCAiLi4vbGliL2RlcGVuZGVuY3ktYW5hbHlzaXMvZ2V0TG9jYWxGaWxlRGVwZW5kZW5jaWVzLnRzIiwgIi4uL2xpYi9kZXBlbmRlbmN5LWFuYWx5c2lzL2luc3RhbGxOb2RlTW9kdWxlVHlwZXMudHMiLCAiLi4vbGliL3NlcnZlci9FdmVudHNXYXRjaGVyLnRzIiwgIi4uL2xpYi9jbGktY29uZmlnL2luZGV4LnRzIiwgIi4uL2NsaS9hdXRoL2xvZ2luL3JlZ2lzdGVyLnRzIiwgIi4uL2xpYi9yZWdpc3RyeS1hcGkvZ2V0LWt5LnRzIiwgIi4uL2NsaS9hdXRoL2xvZ291dC9yZWdpc3Rlci50cyIsICIuLi9jbGkvYXV0aC9yZWdpc3Rlci50cyIsICIuLi9jbGkvY29uZmlnL3JlZ2lzdGVyLnRzIiwgIi4uL2NsaS9jb25maWcvcHJpbnQvcmVnaXN0ZXIudHMiLCAiLi4vY2xpL2Nsb25lL3JlZ2lzdGVyLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIjIS91c3IvYmluL2VudiBub2RlXG5pbXBvcnQgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5pbXBvcnQgeyByZWdpc3RlckRldiB9IGZyb20gXCIuL2Rldi9yZWdpc3RlclwiXG5pbXBvcnQgeyByZWdpc3RlckF1dGhMb2dpbiB9IGZyb20gXCIuL2F1dGgvbG9naW4vcmVnaXN0ZXJcIlxuaW1wb3J0IHsgcmVnaXN0ZXJBdXRoTG9nb3V0IH0gZnJvbSBcIi4vYXV0aC9sb2dvdXQvcmVnaXN0ZXJcIlxuaW1wb3J0IHsgcmVnaXN0ZXJBdXRoIH0gZnJvbSBcIi4vYXV0aC9yZWdpc3RlclwiXG5pbXBvcnQgeyByZWdpc3RlckNvbmZpZyB9IGZyb20gXCIuL2NvbmZpZy9yZWdpc3RlclwiXG5pbXBvcnQgeyByZWdpc3RlckNvbmZpZ1ByaW50IH0gZnJvbSBcIi4vY29uZmlnL3ByaW50L3JlZ2lzdGVyXCJcbmltcG9ydCB7IHJlZ2lzdGVyQ2xvbmUgfSBmcm9tIFwiLi9jbG9uZS9yZWdpc3RlclwiXG5pbXBvcnQgeyBwZXJmZWN0Q2xpIH0gZnJvbSBcInBlcmZlY3QtY2xpXCJcbmltcG9ydCBwa2cgZnJvbSBcIi4uL3BhY2thZ2UuanNvblwiXG5cbmNvbnN0IHByb2dyYW0gPSBuZXcgQ29tbWFuZCgpXG5cbnByb2dyYW1cbiAgLm5hbWUoXCJ0c2NpXCIpXG4gIC5kZXNjcmlwdGlvbihcIkNMSSBmb3IgZGV2ZWxvcGluZyB0c2NpcmN1aXQgc25pcHBldHNcIilcbiAgLnZlcnNpb24ocGtnLnZlcnNpb24pXG5cbnJlZ2lzdGVyRGV2KHByb2dyYW0pXG5yZWdpc3RlckNsb25lKHByb2dyYW0pXG5cbnJlZ2lzdGVyQXV0aChwcm9ncmFtKVxucmVnaXN0ZXJBdXRoTG9naW4ocHJvZ3JhbSlcbnJlZ2lzdGVyQXV0aExvZ291dChwcm9ncmFtKVxuXG5yZWdpc3RlckNvbmZpZyhwcm9ncmFtKVxucmVnaXN0ZXJDb25maWdQcmludChwcm9ncmFtKVxuXG5pZiAocHJvY2Vzcy5hcmd2Lmxlbmd0aCA9PT0gMikge1xuICBwZXJmZWN0Q2xpKHByb2dyYW0sIHByb2Nlc3MuYXJndilcbn0gZWxzZSB7XG4gIHByb2dyYW0ucGFyc2UoKVxufVxuIiwgImltcG9ydCB0eXBlIHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIlxuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCAqIGFzIGNob2tpZGFyIGZyb20gXCJjaG9raWRhclwiXG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwibm9kZTpmc1wiXG5pbXBvcnQgeyBjcmVhdGVTZXJ2ZXIgfSBmcm9tIFwibGliL3NlcnZlci9jcmVhdGVTZXJ2ZXJcIlxuaW1wb3J0IHsgZ2V0TG9jYWxGaWxlRGVwZW5kZW5jaWVzIH0gZnJvbSBcImxpYi9kZXBlbmRlbmN5LWFuYWx5c2lzL2dldExvY2FsRmlsZURlcGVuZGVuY2llc1wiXG5pbXBvcnQgeyBpbnN0YWxsVHlwZXMgfSBmcm9tIFwiLi4vLi4vbGliL2RlcGVuZGVuY3ktYW5hbHlzaXMvaW5zdGFsbE5vZGVNb2R1bGVUeXBlc1wiXG5pbXBvcnQgeyBFdmVudHNXYXRjaGVyIH0gZnJvbSBcIi4uLy4uL2xpYi9zZXJ2ZXIvRXZlbnRzV2F0Y2hlclwiXG5cbmV4cG9ydCBjb25zdCByZWdpc3RlckRldiA9IChwcm9ncmFtOiBDb21tYW5kKSA9PiB7XG4gIHByb2dyYW1cbiAgICAuY29tbWFuZChcImRldlwiKVxuICAgIC5kZXNjcmlwdGlvbihcIlN0YXJ0IGRldmVsb3BtZW50IHNlcnZlciBmb3IgYSBzbmlwcGV0XCIpXG4gICAgLmFyZ3VtZW50KFwiPGZpbGU+XCIsIFwiUGF0aCB0byB0aGUgc25pcHBldCBmaWxlXCIpXG4gICAgLm9wdGlvbihcIi1wLCAtLXBvcnQgPG51bWJlcj5cIiwgXCJQb3J0IHRvIHJ1biBzZXJ2ZXIgb25cIiwgXCIzMDAwXCIpXG4gICAgLmFjdGlvbihhc3luYyAoZmlsZTogc3RyaW5nLCBvcHRpb25zOiB7IHBvcnQ6IHN0cmluZyB9KSA9PiB7XG4gICAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSBwYXRoLnJlc29sdmUoZmlsZSlcbiAgICAgIGNvbnN0IGZpbGVEaXIgPSBwYXRoLmRpcm5hbWUoYWJzb2x1dGVQYXRoKVxuICAgICAgY29uc3QgcG9ydCA9IHBhcnNlSW50KG9wdGlvbnMucG9ydClcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc29sZS5sb2coXCJJbnN0YWxsaW5nIHR5cGVzIGZvciBpbXBvcnRlZCBzbmlwcGV0cy4uLlwiKVxuICAgICAgICBhd2FpdCBpbnN0YWxsVHlwZXMoYWJzb2x1dGVQYXRoKVxuICAgICAgICBjb25zb2xlLmxvZyhcIlR5cGVzIGluc3RhbGxlZCBzdWNjZXNzZnVsbHlcIilcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcIkZhaWxlZCB0byBpbnN0YWxsIHR5cGVzOlwiLCBlcnJvcilcbiAgICAgIH1cblxuICAgICAgLy8gU3RhcnQgdGhlIHNlcnZlclxuICAgICAgYXdhaXQgY3JlYXRlU2VydmVyKHBvcnQpXG5cbiAgICAgIGNvbnN0IGV2ZW50c1dhdGNoZXIgPSBuZXcgRXZlbnRzV2F0Y2hlcihgaHR0cDovL2xvY2FsaG9zdDoke3BvcnR9YClcbiAgICAgIGV2ZW50c1dhdGNoZXIuc3RhcnQoKVxuXG4gICAgICBhd2FpdCBmZXRjaChgaHR0cDovL2xvY2FsaG9zdDoke3BvcnR9L2FwaS9maWxlcy91cHNlcnRgLCB7XG4gICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgIGhlYWRlcnM6IHsgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIGZpbGVfcGF0aDogXCJlbnRyeXBvaW50LnRzeFwiLFxuICAgICAgICAgIHRleHRfY29udGVudDogYFxuaW1wb3J0IE15Q2lyY3VpdCBmcm9tIFwiLi9zbmlwcGV0LnRzeFwiXG5cbmNpcmN1aXQuYWRkKDxNeUNpcmN1aXQgLz4pXG5gLFxuICAgICAgICB9KSxcbiAgICAgIH0pXG5cbiAgICAgIC8vIEZ1bmN0aW9uIHRvIHVwZGF0ZSBmaWxlIGNvbnRlbnRcbiAgICAgIGNvbnN0IHVwZGF0ZUZpbGUgPSBhc3luYyAoZmlsZVBhdGg6IHN0cmluZykgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgXCJ1dGYtOFwiKVxuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goXG4gICAgICAgICAgICBgaHR0cDovL2xvY2FsaG9zdDoke3BvcnR9L2FwaS9maWxlcy91cHNlcnRgLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgICAgICBoZWFkZXJzOiB7IFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiIH0sXG4gICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICBmaWxlX3BhdGg6IHBhdGgucmVsYXRpdmUoZmlsZURpciwgZmlsZVBhdGgpLFxuICAgICAgICAgICAgICAgIHRleHRfY29udGVudDogY29udGVudCxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIClcbiAgICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gdXBkYXRlICR7ZmlsZVBhdGh9YClcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgdXBkYXRpbmcgJHtmaWxlUGF0aH06YCwgZXJyb3IpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gR2V0IGluaXRpYWwgZGVwZW5kZW5jaWVzXG4gICAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSBuZXcgU2V0KFthYnNvbHV0ZVBhdGhdKVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZGVwcyA9IGdldExvY2FsRmlsZURlcGVuZGVuY2llcyhhYnNvbHV0ZVBhdGgpXG4gICAgICAgIGRlcHMuZm9yRWFjaCgoZGVwKSA9PiBkZXBlbmRlbmNpZXMuYWRkKGRlcCkpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLndhcm4oXCJGYWlsZWQgdG8gYW5hbHl6ZSBkZXBlbmRlbmNpZXM6XCIsIGVycm9yKVxuICAgICAgfVxuXG4gICAgICAvLyBXYXRjaCB0aGUgbWFpbiBmaWxlIGFuZCBpdHMgZGVwZW5kZW5jaWVzXG4gICAgICBjb25zdCBmaWxlc3lzdGVtV2F0Y2hlciA9IGNob2tpZGFyLndhdGNoKEFycmF5LmZyb20oZGVwZW5kZW5jaWVzKSwge1xuICAgICAgICBwZXJzaXN0ZW50OiB0cnVlLFxuICAgICAgICBpZ25vcmVJbml0aWFsOiBmYWxzZSxcbiAgICAgIH0pXG5cbiAgICAgIGZpbGVzeXN0ZW1XYXRjaGVyLm9uKFwiY2hhbmdlXCIsIGFzeW5jIChmaWxlUGF0aCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhgRmlsZSAke2ZpbGVQYXRofSBjaGFuZ2VkYClcbiAgICAgICAgYXdhaXQgdXBkYXRlRmlsZShmaWxlUGF0aClcbiAgICAgIH0pXG5cbiAgICAgIGZpbGVzeXN0ZW1XYXRjaGVyLm9uKFwiYWRkXCIsIGFzeW5jIChmaWxlUGF0aCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhgRmlsZSAke2ZpbGVQYXRofSBhZGRlZGApXG4gICAgICAgIGF3YWl0IHVwZGF0ZUZpbGUoZmlsZVBhdGgpXG4gICAgICB9KVxuXG4gICAgICBldmVudHNXYXRjaGVyLm9uKFwiRklMRV9VUERBVEVEXCIsIGFzeW5jIChldikgPT4ge1xuICAgICAgICBpZiAoZXYuZmlsZV9wYXRoID09PSBcIm1hbnVhbC1lZGl0cy5qc29uXCIpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIk1hbnVhbCBlZGl0cyB1cGRhdGVkLCB1cGRhdGluZyBvbiBmaWxlc3lzdGVtLi4uXCIpXG4gICAgICAgICAgY29uc3QgeyBmaWxlIH0gPSBhd2FpdCBmZXRjaChcbiAgICAgICAgICAgIGBodHRwOi8vbG9jYWxob3N0OiR7cG9ydH0vYXBpL2ZpbGVzL2dldD9maWxlX3BhdGg9bWFudWFsLWVkaXRzLmpzb25gLFxuICAgICAgICAgICkudGhlbigocikgPT4gci5qc29uKCkpXG4gICAgICAgICAgZnMud3JpdGVGaWxlU3luYyhcbiAgICAgICAgICAgIHBhdGguam9pbihmaWxlRGlyLCBcIm1hbnVhbC1lZGl0cy5qc29uXCIpLFxuICAgICAgICAgICAgZmlsZS50ZXh0X2NvbnRlbnQsXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICBjb25zb2xlLmxvZyhgV2F0Y2hpbmcgJHtmaWxlfSBhbmQgaXRzIGRlcGVuZGVuY2llcy4uLmApXG4gICAgfSlcbn1cbiIsICJpbXBvcnQgKiBhcyBodHRwIGZyb20gXCJub2RlOmh0dHBcIlxuaW1wb3J0ICogYXMgZnMgZnJvbSBcIm5vZGU6ZnNcIlxuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCB7IGdldE5vZGVIYW5kbGVyIH0gZnJvbSBcIndpbnRlcnNwZWMvYWRhcHRlcnMvbm9kZVwiXG5pbXBvcnQgcGtnIGZyb20gXCIuLi8uLi9wYWNrYWdlLmpzb25cIlxuXG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgd2ludGVyc3BlY0J1bmRsZSBmcm9tIFwiQHRzY2lyY3VpdC9maWxlLXNlcnZlci9kaXN0L2J1bmRsZS5qc1wiXG5pbXBvcnQgeyBnZXRJbmRleCB9IGZyb20gXCIuLi9zaXRlL2dldEluZGV4XCJcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVNlcnZlciA9IGFzeW5jIChwb3J0OiBudW1iZXIgPSAzMDAwKSA9PiB7XG4gIGNvbnN0IGZpbGVTZXJ2ZXJIYW5kbGVyID0gZ2V0Tm9kZUhhbmRsZXIod2ludGVyc3BlY0J1bmRsZSBhcyBhbnksIHt9KVxuXG4gIGNvbnN0IHNlcnZlciA9IGh0dHAuY3JlYXRlU2VydmVyKGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgIGNvbnN0IHVybCA9IG5ldyBVUkwocmVxLnVybCEsIGBodHRwOi8vJHtyZXEuaGVhZGVycy5ob3N0fWApXG5cbiAgICBpZiAodXJsLnBhdGhuYW1lID09PSBcIi9zdGFuZGFsb25lLm1pbi5qc1wiKSB7XG4gICAgICBjb25zdCBzdGFuZGFsb25lRmlsZVBhdGggPVxuICAgICAgICBwcm9jZXNzLmVudi5SVU5GUkFNRV9TVEFOREFMT05FX0ZJTEVfUEFUSCB8fFxuICAgICAgICBwYXRoLnJlc29sdmUoXG4gICAgICAgICAgcHJvY2Vzcy5jd2QoKSxcbiAgICAgICAgICBcIm5vZGVfbW9kdWxlc1wiLFxuICAgICAgICAgIFwiQHRzY2lyY3VpdC9ydW5mcmFtZS9kaXN0L3N0YW5kYWxvbmUubWluLmpzXCIsXG4gICAgICAgIClcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhzdGFuZGFsb25lRmlsZVBhdGgsIFwidXRmOFwiKVxuICAgICAgICByZXMud3JpdGVIZWFkKDIwMCwge1xuICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vamF2YXNjcmlwdDsgY2hhcnNldD11dGYtOFwiLFxuICAgICAgICB9KVxuICAgICAgICByZXMuZW5kKGNvbnRlbnQpXG4gICAgICAgIHJldHVyblxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIHNlcnZpbmcgc3RhbmRhbG9uZS5taW4uanM6XCIsIGVycm9yKVxuICAgICAgfVxuXG4gICAgICByZXMud3JpdGVIZWFkKDMwMiwge1xuICAgICAgICBMb2NhdGlvbjogYGh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHRzY2lyY3VpdC9ydW5mcmFtZUAke3BrZy5kZXBlbmRlbmNpZXNbXCJAdHNjaXJjdWl0L3J1bmZyYW1lXCJdLnJlcGxhY2UoL15bXjAtOV0rLywgXCJcIil9L2Rpc3Qvc3RhbmRhbG9uZS5taW4uanNgLFxuICAgICAgfSlcbiAgICAgIHJlcy5lbmQoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHVybC5wYXRobmFtZSA9PT0gXCIvXCIpIHtcbiAgICAgIGNvbnN0IGh0bWwgPSBhd2FpdCBnZXRJbmRleCgpXG4gICAgICByZXMud3JpdGVIZWFkKDIwMCwgeyBcIkNvbnRlbnQtVHlwZVwiOiBcInRleHQvaHRtbFwiIH0pXG4gICAgICByZXMuZW5kKGh0bWwpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAodXJsLnBhdGhuYW1lLnN0YXJ0c1dpdGgoXCIvYXBpL1wiKSkge1xuICAgICAgcmVxLnVybCA9IHJlcS51cmwhLnJlcGxhY2UoXCIvYXBpL1wiLCBcIi9cIilcbiAgICAgIGZpbGVTZXJ2ZXJIYW5kbGVyKHJlcSwgcmVzKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgcmVzLndyaXRlSGVhZCg0MDQpXG4gICAgcmVzLmVuZChcIk5vdCBmb3VuZFwiKVxuICB9KVxuXG4gIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgIHNlcnZlci5saXN0ZW4ocG9ydCwgKCkgPT4ge1xuICAgICAgY29uc29sZS5sb2coYFNlcnZlciBydW5uaW5nIGF0IGh0dHA6Ly9sb2NhbGhvc3Q6JHtwb3J0fWApXG4gICAgICByZXNvbHZlKClcbiAgICB9KVxuICB9KVxufVxuIiwgIntcbiAgXCJuYW1lXCI6IFwiQHRzY2lyY3VpdC9jbGlcIixcbiAgXCJtYWluXCI6IFwiZGlzdC9tYWluLmpzXCIsXG4gIFwidHlwZVwiOiBcIm1vZHVsZVwiLFxuICBcInZlcnNpb25cIjogXCIwLjEuM1wiLFxuICBcImJpblwiOiB7XG4gICAgXCJ0c2NpXCI6IFwiLi9kaXN0L21haW4uanNcIlxuICB9LFxuICBcInNjcmlwdHNcIjoge1xuICAgIFwic3RhcnRcIjogXCJidW4gcnVuIGRldlwiLFxuICAgIFwiZGV2XCI6IFwiYnVuIC0taG90IC4vY2xpL21haW4udHMgZGV2IC4vZXhhbXBsZS1kaXIvc25pcHBldC50c3hcIixcbiAgICBcImJ1aWxkXCI6IFwidHN1cC1ub2RlIGNsaS9tYWluLnRzIC0tZm9ybWF0IGVzbSAtLXNvdXJjZW1hcCBpbmxpbmVcIixcbiAgICBcImZvcm1hdFwiOiBcImJpb21lIGZvcm1hdCAtLXdyaXRlIC5cIixcbiAgICBcImZvcm1hdDpjaGVja1wiOiBcImJpb21lIGZvcm1hdCAuXCIsXG4gICAgXCJjbGlcIjogXCJidW4gLi9jbGkvbWFpbi50c1wiXG4gIH0sXG4gIFwiZGV2RGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcIkBiaW9tZWpzL2Jpb21lXCI6IFwiXjEuOS40XCIsXG4gICAgXCJAdHNjaXJjdWl0L2NvcmVcIjogXCJeMC4wLjI0OVwiLFxuICAgIFwiQHR5cGVzL2J1blwiOiBcImxhdGVzdFwiLFxuICAgIFwiQHR5cGVzL2NvbmZpZ3N0b3JlXCI6IFwiXjYuMC4yXCIsXG4gICAgXCJAdHlwZXMvcmVhY3RcIjogXCJeMTkuMC4xXCIsXG4gICAgXCJ0c3VwXCI6IFwiXjguMy41XCJcbiAgfSxcbiAgXCJwZWVyRGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcInR5cGVzY3JpcHRcIjogXCJeNS4wLjBcIlxuICB9LFxuICBcImRlcGVuZGVuY2llc1wiOiB7XG4gICAgXCJAdHNjaXJjdWl0L2ZpbGUtc2VydmVyXCI6IFwiXjAuMC4xMVwiLFxuICAgIFwiQHRzY2lyY3VpdC9ydW5mcmFtZVwiOiBcIl4wLjAuNDdcIixcbiAgICBcImNob2tpZGFyXCI6IFwiXjQuMC4xXCIsXG4gICAgXCJjb21tYW5kZXJcIjogXCJeMTIuMS4wXCIsXG4gICAgXCJjb25maWdzdG9yZVwiOiBcIl43LjAuMFwiLFxuICAgIFwiY29zbWljb25maWdcIjogXCJeOS4wLjBcIixcbiAgICBcImRlbGF5XCI6IFwiXjYuMC4wXCIsXG4gICAgXCJreVwiOiBcIl4xLjcuNFwiLFxuICAgIFwicGVyZmVjdC1jbGlcIjogXCJeMS4wLjIwXCJcbiAgfVxufVxuIiwgImltcG9ydCBwa2cgZnJvbSBcIi4uLy4uL3BhY2thZ2UuanNvblwiXG5cbmV4cG9ydCBjb25zdCBnZXRJbmRleCA9IGFzeW5jICgpID0+IHtcbiAgcmV0dXJuIGA8aHRtbD5cbiAgICA8aGVhZD5cbiAgICA8L2hlYWQ+XG4gICAgPGJvZHk+XG4gICAgICA8c2NyaXB0IHNyYz1cImh0dHBzOi8vY2RuLnRhaWx3aW5kY3NzLmNvbVwiPjwvc2NyaXB0PlxuICAgICAgPGRpdiBpZD1cInJvb3RcIj5sb2FkaW5nLi4uPC9kaXY+XG4gICAgICA8c2NyaXB0PlxuICAgICAgZ2xvYmFsVGhpcy5wcm9jZXNzID0geyBlbnY6IHsgTk9ERV9FTlY6IFwicHJvZHVjdGlvblwiIH0gfVxuICAgICAgPC9zY3JpcHQ+XG4gICAgICA8c2NyaXB0IHNyYz1cIi9zdGFuZGFsb25lLm1pbi5qc1wiPjwvc2NyaXB0PlxuICAgIDwvYm9keT5cbiAgPC9odG1sPmBcbn1cblxuLy8gPHNjcmlwdCBzcmM9XCJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0B0c2NpcmN1aXQvcnVuZnJhbWVAJHtwa2cuZGVwZW5kZW5jaWVzW1wiQHRzY2lyY3VpdC9ydW5mcmFtZVwiXS5yZXBsYWNlKC9eW14wLTldKy8sIFwiXCIpfS9kaXN0L3N0YW5kYWxvbmUubWluLmpzXCI+PC9zY3JpcHQ+XG4iLCAiaW1wb3J0ICogYXMgdHMgZnJvbSBcInR5cGVzY3JpcHRcIlxuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwicGF0aFwiXG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwiZnNcIlxuXG5mdW5jdGlvbiBnZXRMb2NhbEZpbGVEZXBlbmRlbmNpZXMocGF0aFRvVHN4RmlsZTogc3RyaW5nKTogc3RyaW5nW10ge1xuICAvLyBFbnN1cmUgYWJzb2x1dGUgcGF0aFxuICBjb25zdCBhYnNvbHV0ZVBhdGggPSBwYXRoLnJlc29sdmUocGF0aFRvVHN4RmlsZSlcbiAgY29uc3QgYmFzZURpciA9IHBhdGguZGlybmFtZShhYnNvbHV0ZVBhdGgpXG5cbiAgLy8gUmVhZCBhbmQgcGFyc2UgdGhlIGZpbGVcbiAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhhYnNvbHV0ZVBhdGgsIFwidXRmLThcIilcbiAgY29uc3Qgc291cmNlRmlsZSA9IHRzLmNyZWF0ZVNvdXJjZUZpbGUoXG4gICAgYWJzb2x1dGVQYXRoLFxuICAgIGNvbnRlbnQsXG4gICAgdHMuU2NyaXB0VGFyZ2V0LkxhdGVzdCxcbiAgICB0cnVlLFxuICApXG5cbiAgY29uc3QgZGVwZW5kZW5jaWVzID0gbmV3IFNldDxzdHJpbmc+KClcblxuICAvLyBSZWN1cnNpdmVseSB2aXNpdCBub2RlcyB0byBmaW5kIGltcG9ydHNcbiAgZnVuY3Rpb24gdmlzaXQobm9kZTogdHMuTm9kZSkge1xuICAgIGlmICh0cy5pc0ltcG9ydERlY2xhcmF0aW9uKG5vZGUpIHx8IHRzLmlzRXhwb3J0RGVjbGFyYXRpb24obm9kZSkpIHtcbiAgICAgIGNvbnN0IG1vZHVsZVNwZWNpZmllciA9IG5vZGUubW9kdWxlU3BlY2lmaWVyXG4gICAgICBpZiAobW9kdWxlU3BlY2lmaWVyICYmIHRzLmlzU3RyaW5nTGl0ZXJhbChtb2R1bGVTcGVjaWZpZXIpKSB7XG4gICAgICAgIGNvbnN0IGltcG9ydFBhdGggPSBtb2R1bGVTcGVjaWZpZXIudGV4dFxuICAgICAgICAvLyBPbmx5IHByb2Nlc3MgbG9jYWwgaW1wb3J0cyAoc3RhcnRpbmcgd2l0aCAuIG9yIC4uKVxuICAgICAgICBpZiAoaW1wb3J0UGF0aC5zdGFydHNXaXRoKFwiLlwiKSkge1xuICAgICAgICAgIHJlc29sdmVBbmRBZGREZXBlbmRlbmN5KGltcG9ydFBhdGgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgZHluYW1pYyBpbXBvcnRzXG4gICAgaWYgKFxuICAgICAgdHMuaXNDYWxsRXhwcmVzc2lvbihub2RlKSAmJlxuICAgICAgbm9kZS5leHByZXNzaW9uLmtpbmQgPT09IHRzLlN5bnRheEtpbmQuSW1wb3J0S2V5d29yZFxuICAgICkge1xuICAgICAgY29uc3QgYXJndW1lbnQgPSBub2RlLmFyZ3VtZW50c1swXVxuICAgICAgaWYgKGFyZ3VtZW50ICYmIHRzLmlzU3RyaW5nTGl0ZXJhbChhcmd1bWVudCkpIHtcbiAgICAgICAgY29uc3QgaW1wb3J0UGF0aCA9IGFyZ3VtZW50LnRleHRcbiAgICAgICAgaWYgKGltcG9ydFBhdGguc3RhcnRzV2l0aChcIi5cIikpIHtcbiAgICAgICAgICByZXNvbHZlQW5kQWRkRGVwZW5kZW5jeShpbXBvcnRQYXRoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdHMuZm9yRWFjaENoaWxkKG5vZGUsIHZpc2l0KVxuICB9XG5cbiAgLy8gSGVscGVyIHRvIHJlc29sdmUgYW5kIGFkZCBkZXBlbmRlbmN5IHBhdGhzXG4gIGZ1bmN0aW9uIHJlc29sdmVBbmRBZGREZXBlbmRlbmN5KGltcG9ydFBhdGg6IHN0cmluZykge1xuICAgIGNvbnN0IGV4dGVuc2lvbnMgPSBbXG4gICAgICBcIi50c3hcIixcbiAgICAgIFwiLnRzXCIsXG4gICAgICBcIi5qc3hcIixcbiAgICAgIFwiLmpzXCIsXG4gICAgICBcIi5jc3NcIixcbiAgICAgIFwiLnNjc3NcIixcbiAgICAgIFwiLnNhc3NcIixcbiAgICAgIFwiLmxlc3NcIixcbiAgICBdXG4gICAgbGV0IHJlc29sdmVkUGF0aCA9IHBhdGgucmVzb2x2ZShiYXNlRGlyLCBpbXBvcnRQYXRoKVxuXG4gICAgLy8gQ2hlY2sgaWYgcGF0aCBleGlzdHMgYXMtaXNcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhyZXNvbHZlZFBhdGgpKSB7XG4gICAgICBkZXBlbmRlbmNpZXMuYWRkKHJlc29sdmVkUGF0aClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIFRyeSB3aXRoIGV4dGVuc2lvbnNcbiAgICBmb3IgKGNvbnN0IGV4dCBvZiBleHRlbnNpb25zKSB7XG4gICAgICBjb25zdCBwYXRoV2l0aEV4dCA9IHJlc29sdmVkUGF0aCArIGV4dFxuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aFdpdGhFeHQpKSB7XG4gICAgICAgIGRlcGVuZGVuY2llcy5hZGQocGF0aFdpdGhFeHQpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciBpbmRleCBmaWxlcyBpbiBkaXJlY3Rvcmllc1xuICAgIGlmIChcbiAgICAgIGZzLmV4aXN0c1N5bmMocmVzb2x2ZWRQYXRoKSAmJlxuICAgICAgZnMuc3RhdFN5bmMocmVzb2x2ZWRQYXRoKS5pc0RpcmVjdG9yeSgpXG4gICAgKSB7XG4gICAgICBmb3IgKGNvbnN0IGV4dCBvZiBleHRlbnNpb25zKSB7XG4gICAgICAgIGNvbnN0IGluZGV4UGF0aCA9IHBhdGguam9pbihyZXNvbHZlZFBhdGgsIGBpbmRleCR7ZXh0fWApXG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKGluZGV4UGF0aCkpIHtcbiAgICAgICAgICBkZXBlbmRlbmNpZXMuYWRkKGluZGV4UGF0aClcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFN0YXJ0IHRoZSB0cmF2ZXJzYWxcbiAgdmlzaXQoc291cmNlRmlsZSlcblxuICByZXR1cm4gQXJyYXkuZnJvbShkZXBlbmRlbmNpZXMpXG59XG5cbmV4cG9ydCB7IGdldExvY2FsRmlsZURlcGVuZGVuY2llcyB9XG4iLCAiaW1wb3J0ICogYXMgZnMgZnJvbSBcIm5vZGU6ZnNcIlxuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCAqIGFzIHRzIGZyb20gXCJ0eXBlc2NyaXB0XCJcblxuaW50ZXJmYWNlIFNuaXBwZXRBcGlSZXNwb25zZSB7XG4gIHNuaXBwZXQ6IHtcbiAgICBkdHM6IHN0cmluZ1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbnN0YWxsVHlwZXMoc25pcHBldFBhdGg6IHN0cmluZykge1xuICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHNuaXBwZXRQYXRoLCBcInV0Zi04XCIpXG4gIGNvbnN0IHNvdXJjZUZpbGUgPSB0cy5jcmVhdGVTb3VyY2VGaWxlKFxuICAgIHNuaXBwZXRQYXRoLFxuICAgIGNvbnRlbnQsXG4gICAgdHMuU2NyaXB0VGFyZ2V0LkxhdGVzdCxcbiAgICB0cnVlLFxuICApXG5cbiAgY29uc3QgaW1wb3J0czogc3RyaW5nW10gPSBbXVxuXG4gIGZ1bmN0aW9uIHZpc2l0KG5vZGU6IHRzLk5vZGUpIHtcbiAgICBpZiAodHMuaXNJbXBvcnREZWNsYXJhdGlvbihub2RlKSkge1xuICAgICAgY29uc3QgbW9kdWxlU3BlY2lmaWVyID0gbm9kZS5tb2R1bGVTcGVjaWZpZXJcbiAgICAgIGlmIChtb2R1bGVTcGVjaWZpZXIgJiYgdHMuaXNTdHJpbmdMaXRlcmFsKG1vZHVsZVNwZWNpZmllcikpIHtcbiAgICAgICAgY29uc3QgaW1wb3J0UGF0aCA9IG1vZHVsZVNwZWNpZmllci50ZXh0XG4gICAgICAgIGlmIChpbXBvcnRQYXRoLnN0YXJ0c1dpdGgoXCJAdHNjaS9cIikpIHtcbiAgICAgICAgICBpbXBvcnRzLnB1c2goaW1wb3J0UGF0aClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0cy5mb3JFYWNoQ2hpbGQobm9kZSwgdmlzaXQpXG4gIH1cblxuICB2aXNpdChzb3VyY2VGaWxlKVxuXG4gIGxldCBwcm9qZWN0Um9vdCA9IHBhdGguZGlybmFtZShzbmlwcGV0UGF0aClcbiAgd2hpbGUgKHByb2plY3RSb290ICE9PSBwYXRoLnBhcnNlKHByb2plY3RSb290KS5yb290KSB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3RSb290LCBcInBhY2thZ2UuanNvblwiKSkpIHtcbiAgICAgIGJyZWFrXG4gICAgfVxuICAgIHByb2plY3RSb290ID0gcGF0aC5kaXJuYW1lKHByb2plY3RSb290KVxuICB9XG5cbiAgZm9yIChjb25zdCBpbXBvcnRQYXRoIG9mIGltcG9ydHMpIHtcbiAgICBjb25zdCBbb3duZXIsIG5hbWVdID0gaW1wb3J0UGF0aC5yZXBsYWNlKFwiQHRzY2kvXCIsIFwiXCIpLnNwbGl0KFwiLlwiKVxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKFxuICAgICAgICBgaHR0cHM6Ly9yZWdpc3RyeS1hcGkudHNjaXJjdWl0LmNvbS9zbmlwcGV0cy9nZXQ/b3duZXJfbmFtZT0ke293bmVyfSZ1bnNjb3BlZF9uYW1lPSR7bmFtZX1gLFxuICAgICAgKVxuXG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgRmFpbGVkIHRvIGZldGNoIHR5cGVzIGZvciAke2ltcG9ydFBhdGh9YClcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGF0YTogU25pcHBldEFwaVJlc3BvbnNlID0gYXdhaXQgcmVzcG9uc2UuanNvbigpXG5cbiAgICAgIGlmIChkYXRhLnNuaXBwZXQuZHRzKSB7XG4gICAgICAgIGNvbnN0IHBhY2thZ2VEaXIgPSBwYXRoLmpvaW4oXG4gICAgICAgICAgcHJvamVjdFJvb3QsXG4gICAgICAgICAgXCJub2RlX21vZHVsZXNcIixcbiAgICAgICAgICBcIkB0c2NpXCIsXG4gICAgICAgICAgYCR7b3duZXJ9LiR7bmFtZX1gLFxuICAgICAgICApXG4gICAgICAgIGZzLm1rZGlyU3luYyhwYWNrYWdlRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuXG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmMocGF0aC5qb2luKHBhY2thZ2VEaXIsIFwiaW5kZXguZC50c1wiKSwgZGF0YS5zbmlwcGV0LmR0cylcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKGBFcnJvciBmZXRjaGluZyB0eXBlcyBmb3IgJHtpbXBvcnRQYXRofTpgLCBlcnJvcilcbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tIFwiZXZlbnRzXCJcblxuaW50ZXJmYWNlIEV2ZW50IHtcbiAgZXZlbnRfaWQ6IHN0cmluZ1xuICBjcmVhdGVkX2F0OiBzdHJpbmdcbiAgZXZlbnRfdHlwZTogc3RyaW5nXG4gIFtrZXk6IHN0cmluZ106IGFueVxufVxuXG5pbnRlcmZhY2UgRXZlbnRzUmVzcG9uc2Uge1xuICBldmVudF9saXN0OiBFdmVudFtdXG59XG5cbmV4cG9ydCBjbGFzcyBFdmVudHNXYXRjaGVyIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgcHJpdmF0ZSBsYXN0UG9sbFRpbWU6IHN0cmluZ1xuICBwcml2YXRlIHBvbGxJbnRlcnZhbDogbnVtYmVyXG4gIHByaXZhdGUgYmFzZVVybDogc3RyaW5nXG4gIHByaXZhdGUgcG9sbGluZyA9IGZhbHNlXG4gIHByaXZhdGUgdGltZW91dElkPzogTm9kZUpTLlRpbWVvdXRcblxuICBjb25zdHJ1Y3RvcihiYXNlVXJsID0gXCJodHRwOi8vbG9jYWxob3N0OjMwMDBcIiwgcG9sbEludGVydmFsID0gMTAwMCkge1xuICAgIHN1cGVyKClcbiAgICB0aGlzLmJhc2VVcmwgPSBiYXNlVXJsXG4gICAgdGhpcy5wb2xsSW50ZXJ2YWwgPSBwb2xsSW50ZXJ2YWxcbiAgICB0aGlzLmxhc3RQb2xsVGltZSA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKVxuICB9XG5cbiAgYXN5bmMgc3RhcnQoKSB7XG4gICAgaWYgKHRoaXMucG9sbGluZykgcmV0dXJuXG4gICAgdGhpcy5wb2xsaW5nID0gdHJ1ZVxuICAgIGF3YWl0IHRoaXMucG9sbCgpXG4gIH1cblxuICBzdG9wKCkge1xuICAgIHRoaXMucG9sbGluZyA9IGZhbHNlXG4gICAgaWYgKHRoaXMudGltZW91dElkKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0SWQpXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBwb2xsKCkge1xuICAgIGlmICghdGhpcy5wb2xsaW5nKSByZXR1cm5cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKFxuICAgICAgICBgJHt0aGlzLmJhc2VVcmx9L2FwaS9ldmVudHMvbGlzdD9zaW5jZT0ke2VuY29kZVVSSUNvbXBvbmVudCh0aGlzLmxhc3RQb2xsVGltZSl9YCxcbiAgICAgIClcblxuICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEhUVFAgZXJyb3IhIHN0YXR1czogJHtyZXNwb25zZS5zdGF0dXN9YClcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGF0YTogRXZlbnRzUmVzcG9uc2UgPSBhd2FpdCByZXNwb25zZS5qc29uKClcblxuICAgICAgLy8gVXBkYXRlIGxhc3QgcG9sbCB0aW1lIHRvIGxhdGVzdCBldmVudCBvciBjdXJyZW50IHRpbWVcbiAgICAgIGNvbnN0IGxhdGVzdEV2ZW50ID0gZGF0YS5ldmVudF9saXN0W2RhdGEuZXZlbnRfbGlzdC5sZW5ndGggLSAxXVxuICAgICAgdGhpcy5sYXN0UG9sbFRpbWUgPSBsYXRlc3RFdmVudFxuICAgICAgICA/IGxhdGVzdEV2ZW50LmNyZWF0ZWRfYXRcbiAgICAgICAgOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKClcblxuICAgICAgLy8gRW1pdCBldmVudHMgaW4gY2hyb25vbG9naWNhbCBvcmRlclxuICAgICAgZGF0YS5ldmVudF9saXN0LmZvckVhY2goKGV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMuZW1pdChldmVudC5ldmVudF90eXBlLCBldmVudClcbiAgICAgICAgdGhpcy5lbWl0KFwiKlwiLCBldmVudClcbiAgICAgIH0pXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuZW1pdChcImVycm9yXCIsIGVycm9yKVxuICAgIH1cbiAgICAvLyBTY2hlZHVsZSBuZXh0IHBvbGxcbiAgICB0aGlzLnRpbWVvdXRJZCA9IGdsb2JhbFRoaXMuc2V0VGltZW91dChcbiAgICAgICgpID0+IHRoaXMucG9sbCgpLFxuICAgICAgdGhpcy5wb2xsSW50ZXJ2YWwsXG4gICAgKSBhcyB1bmtub3duIGFzIE5vZGVKUy5UaW1lb3V0XG4gIH1cbn1cbiIsICJpbXBvcnQgQ29uZmlnc3RvcmUgZnJvbSBcImNvbmZpZ3N0b3JlXCJcbmltcG9ydCB0eXBlIHsgVHlwZWRDb25maWdzdG9yZSB9IGZyb20gXCIuL1R5cGVkQ29uZmlnU3RvcmVcIlxuXG5leHBvcnQgaW50ZXJmYWNlIENsaUNvbmZpZyB7XG4gIHNlc3Npb25Ub2tlbj86IHN0cmluZ1xuICBnaXRodWJVc2VybmFtZT86IHN0cmluZ1xuICByZWdpc3RyeUFwaVVybD86IHN0cmluZ1xufVxuXG5leHBvcnQgY29uc3QgY2xpQ29uZmlnOiBUeXBlZENvbmZpZ3N0b3JlPENsaUNvbmZpZz4gPSBuZXcgQ29uZmlnc3RvcmUoXG4gIFwidHNjaXJjdWl0XCIsXG4pXG5cbmV4cG9ydCBjb25zdCBnZXRSZWdpc3RyeUFwaVVybCA9ICgpOiBzdHJpbmcgPT4ge1xuICByZXR1cm4gY2xpQ29uZmlnLmdldChcInJlZ2lzdHJ5QXBpVXJsXCIpID8/IFwiaHR0cHM6Ly9yZWdpc3RyeS1hcGkudHNjaXJjdWl0LmNvbVwiXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5pbXBvcnQgeyBjbGlDb25maWcgfSBmcm9tIFwibGliL2NsaS1jb25maWdcIlxuaW1wb3J0IGRlbGF5IGZyb20gXCJkZWxheVwiXG5pbXBvcnQgeyBnZXRLeSB9IGZyb20gXCJsaWIvcmVnaXN0cnktYXBpL2dldC1reVwiXG5pbXBvcnQgdHlwZSB7IEVuZHBvaW50UmVzcG9uc2UgfSBmcm9tIFwibGliL3JlZ2lzdHJ5LWFwaS9lbmRwb2ludC10eXBlc1wiXG5cbmV4cG9ydCBjb25zdCByZWdpc3RlckF1dGhMb2dpbiA9IChwcm9ncmFtOiBDb21tYW5kKSA9PiB7XG4gIHByb2dyYW0uY29tbWFuZHNcbiAgICAuZmluZCgoYykgPT4gYy5uYW1lKCkgPT09IFwiYXV0aFwiKSFcbiAgICAuY29tbWFuZChcImxvZ2luXCIpXG4gICAgLmRlc2NyaXB0aW9uKFwiQXV0aGVudGljYXRlIENMSSwgbG9naW4gdG8gcmVnaXN0cnlcIilcbiAgICAuYWN0aW9uKGFzeW5jIChhcmdzKSA9PiB7XG4gICAgICBjb25zdCBreSA9IGdldEt5KClcblxuICAgICAgY29uc3QgeyBsb2dpbl9wYWdlIH0gPSBhd2FpdCBreVxuICAgICAgICAucG9zdDxFbmRwb2ludFJlc3BvbnNlW1wic2Vzc2lvbnMvbG9naW5fcGFnZS9jcmVhdGVcIl0+KFxuICAgICAgICAgIFwic2Vzc2lvbnMvbG9naW5fcGFnZS9jcmVhdGVcIixcbiAgICAgICAgICB7XG4gICAgICAgICAgICBqc29uOiB7fSxcbiAgICAgICAgICB9LFxuICAgICAgICApXG4gICAgICAgIC5qc29uKClcblxuICAgICAgY29uc29sZS5sb2coXCJQbGVhc2UgdmlzaXQgdGhlIGZvbGxvd2luZyBVUkwgdG8gbG9nIGluOlwiKVxuICAgICAgY29uc29sZS5sb2cobG9naW5fcGFnZS51cmwpXG5cbiAgICAgIC8vIFdhaXQgdW50aWwgd2UgcmVjZWl2ZSBjb25maXJtYXRpb25cbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIGNvbnN0IHsgbG9naW5fcGFnZTogbmV3X2xvZ2luX3BhZ2UgfSA9IGF3YWl0IGt5XG4gICAgICAgICAgLnBvc3Q8RW5kcG9pbnRSZXNwb25zZVtcInNlc3Npb25zL2xvZ2luX3BhZ2UvZ2V0XCJdPihcbiAgICAgICAgICAgIFwic2Vzc2lvbnMvbG9naW5fcGFnZS9nZXRcIixcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAganNvbjoge1xuICAgICAgICAgICAgICAgIGxvZ2luX3BhZ2VfaWQ6IGxvZ2luX3BhZ2UubG9naW5fcGFnZV9pZCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtsb2dpbl9wYWdlLmxvZ2luX3BhZ2VfYXV0aF90b2tlbn1gLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICApXG4gICAgICAgICAgLmpzb24oKVxuXG4gICAgICAgIGlmIChuZXdfbG9naW5fcGFnZS53YXNfbG9naW5fc3VjY2Vzc2Z1bCkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFwiTG9nZ2VkIGluISBHZW5lcmF0aW5nIHRva2VuLi4uXCIpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuZXdfbG9naW5fcGFnZS5pc19leHBpcmVkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTG9naW4gcGFnZSBleHBpcmVkXCIpXG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBkZWxheSgxMDAwKVxuICAgICAgfVxuXG4gICAgICBjb25zdCB7IHNlc3Npb24gfSA9IGF3YWl0IGt5XG4gICAgICAgIC5wb3N0PEVuZHBvaW50UmVzcG9uc2VbXCJzZXNzaW9ucy9sb2dpbl9wYWdlL2V4Y2hhbmdlX2Zvcl9jbGlfc2Vzc2lvblwiXT4oXG4gICAgICAgICAgXCJzZXNzaW9ucy9sb2dpbl9wYWdlL2V4Y2hhbmdlX2Zvcl9jbGlfc2Vzc2lvblwiLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGpzb246IHtcbiAgICAgICAgICAgICAgbG9naW5fcGFnZV9pZDogbG9naW5fcGFnZS5sb2dpbl9wYWdlX2lkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke2xvZ2luX3BhZ2UubG9naW5fcGFnZV9hdXRoX3Rva2VufWAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIClcbiAgICAgICAgLmpzb24oKVxuXG4gICAgICBjbGlDb25maWcuc2V0KFwic2Vzc2lvblRva2VuXCIsIHNlc3Npb24udG9rZW4pXG5cbiAgICAgIGNvbnNvbGUubG9nKFwiUmVhZHkgdG8gdXNlIVwiKVxuICAgIH0pXG59XG4iLCAiaW1wb3J0IHsgZ2V0UmVnaXN0cnlBcGlVcmwgfSBmcm9tIFwibGliL2NsaS1jb25maWdcIlxuaW1wb3J0IGt5LCB7IHR5cGUgQWZ0ZXJSZXNwb25zZUhvb2sgfSBmcm9tIFwia3lcIlxuXG5jb25zdCBwcmV0dHlSZXNwb25zZUVycm9ySG9vazogQWZ0ZXJSZXNwb25zZUhvb2sgPSBhc3luYyAoXG4gIF9yZXF1ZXN0LFxuICBfb3B0aW9ucyxcbiAgcmVzcG9uc2UsXG4pID0+IHtcbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBlcnJvckRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKClcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEZBSUwgWyR7cmVzcG9uc2Uuc3RhdHVzfV06ICR7X3JlcXVlc3QubWV0aG9kfSAke1xuICAgICAgICAgIG5ldyBVUkwoX3JlcXVlc3QudXJsKS5wYXRobmFtZVxuICAgICAgICB9IFxcblxcbiAke0pTT04uc3RyaW5naWZ5KGVycm9yRGF0YSwgbnVsbCwgMil9YCxcbiAgICAgIClcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvL2lnbm9yZSwgYWxsb3cgdGhlIGVycm9yIHRvIGJlIHRocm93blxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZ2V0S3kgPSAoKSA9PiB7XG4gIHJldHVybiBreS5jcmVhdGUoe1xuICAgIHByZWZpeFVybDogZ2V0UmVnaXN0cnlBcGlVcmwoKSxcbiAgICBob29rczoge1xuICAgICAgYWZ0ZXJSZXNwb25zZTogW3ByZXR0eVJlc3BvbnNlRXJyb3JIb29rXSxcbiAgICB9LFxuICB9KVxufVxuIiwgImltcG9ydCB0eXBlIHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIlxuXG5leHBvcnQgY29uc3QgcmVnaXN0ZXJBdXRoTG9nb3V0ID0gKHByb2dyYW06IENvbW1hbmQpID0+IHtcbiAgcHJvZ3JhbS5jb21tYW5kc1xuICAgIC5maW5kKChjKSA9PiBjLm5hbWUoKSA9PT0gXCJhdXRoXCIpIVxuICAgIC5jb21tYW5kKFwibG9nb3V0XCIpXG4gICAgLmRlc2NyaXB0aW9uKFwiTG9nb3V0IGZyb20gcmVnaXN0cnlcIilcbiAgICAuYWN0aW9uKChhcmdzKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZyhcImxvZ291dFwiKVxuICAgIH0pXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5cbmV4cG9ydCBjb25zdCByZWdpc3RlckF1dGggPSAocHJvZ3JhbTogQ29tbWFuZCkgPT4ge1xuICBwcm9ncmFtLmNvbW1hbmQoXCJhdXRoXCIpLmRlc2NyaXB0aW9uKFwiTG9naW4vbG9nb3V0XCIpXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5cbmV4cG9ydCBjb25zdCByZWdpc3RlckNvbmZpZyA9IChwcm9ncmFtOiBDb21tYW5kKSA9PiB7XG4gIHByb2dyYW0uY29tbWFuZChcImNvbmZpZ1wiKS5kZXNjcmlwdGlvbihcIk1hbmFnZSB0c2NpcmN1aXQgQ0xJIGNvbmZpZ3VyYXRpb25cIilcbn1cbiIsICJpbXBvcnQgdHlwZSB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCJcbmltcG9ydCB7IGNsaUNvbmZpZyB9IGZyb20gXCJsaWIvY2xpLWNvbmZpZ1wiXG5cbmV4cG9ydCBjb25zdCByZWdpc3RlckNvbmZpZ1ByaW50ID0gKHByb2dyYW06IENvbW1hbmQpID0+IHtcbiAgcHJvZ3JhbS5jb21tYW5kc1xuICAgIC5maW5kKChjKSA9PiBjLm5hbWUoKSA9PT0gXCJjb25maWdcIikhXG4gICAgLmNvbW1hbmQoXCJwcmludFwiKVxuICAgIC5kZXNjcmlwdGlvbihcIlByaW50IHRoZSBjdXJyZW50IGNvbmZpZ1wiKVxuICAgIC5hY3Rpb24oKCkgPT4ge1xuICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoY2xpQ29uZmlnLmFsbCwgbnVsbCwgMikpXG4gICAgfSlcbn1cbiIsICJpbXBvcnQgdHlwZSB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCJcbmltcG9ydCB7IGdldEt5IH0gZnJvbSBcImxpYi9yZWdpc3RyeS1hcGkvZ2V0LWt5XCJcbmltcG9ydCAqIGFzIGZzIGZyb20gXCJub2RlOmZzXCJcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5cbmV4cG9ydCBjb25zdCByZWdpc3RlckNsb25lID0gKHByb2dyYW06IENvbW1hbmQpID0+IHtcbiAgcHJvZ3JhbVxuICAgIC5jb21tYW5kKFwiY2xvbmVcIilcbiAgICAuZGVzY3JpcHRpb24oXCJDbG9uZSBhIHNuaXBwZXQgZnJvbSB0aGUgcmVnaXN0cnlcIilcbiAgICAuYXJndW1lbnQoXCI8c25pcHBldD5cIiwgXCJTbmlwcGV0IHRvIGNsb25lIChlLmcuIGF1dGhvci9zbmlwcGV0TmFtZSlcIilcbiAgICAuYWN0aW9uKGFzeW5jIChzbmlwcGV0UGF0aDogc3RyaW5nKSA9PiB7XG4gICAgICBsZXQgYXV0aG9yOiBzdHJpbmdcbiAgICAgIGxldCBzbmlwcGV0TmFtZTogc3RyaW5nXG4gICAgICBpZiAoIXNuaXBwZXRQYXRoLnN0YXJ0c1dpdGgoXCJAdHNjaS9cIikgJiYgc25pcHBldFBhdGguaW5jbHVkZXMoXCIvXCIpKSB7XG4gICAgICAgIDtbYXV0aG9yLCBzbmlwcGV0TmFtZV0gPSBzbmlwcGV0UGF0aC5zcGxpdChcIi9cIilcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHRyaW1tZWRQYXRoID0gc25pcHBldFBhdGgucmVwbGFjZShcIkB0c2NpL1wiLCBcIlwiKVxuICAgICAgICBjb25zdCBmaXJzdERvdEluZGV4ID0gdHJpbW1lZFBhdGguaW5kZXhPZihcIi5cIilcbiAgICAgICAgYXV0aG9yID0gdHJpbW1lZFBhdGguc2xpY2UoMCwgZmlyc3REb3RJbmRleClcbiAgICAgICAgc25pcHBldE5hbWUgPSB0cmltbWVkUGF0aC5zbGljZShmaXJzdERvdEluZGV4ICsgMSlcbiAgICAgIH1cblxuICAgICAgaWYgKCFhdXRob3IgfHwgIXNuaXBwZXROYW1lKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgXCJJbnZhbGlkIHNuaXBwZXQgcGF0aC4gVXNlIGZvcm1hdDogYXV0aG9yL3NuaXBwZXROYW1lLCBhdXRob3Iuc25pcHBldE5hbWUgb3IgQHRzY2kvYXV0aG9yLnNuaXBwZXROYW1lXCIsXG4gICAgICAgIClcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGt5ID0gZ2V0S3koKVxuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zb2xlLmxvZyhgQ2xvbmluZyAke2F1dGhvcn0vJHtzbmlwcGV0TmFtZX0uLi5gKVxuXG4gICAgICAgIGNvbnN0IHBhY2thZ2VGaWxlTGlzdCA9IGF3YWl0IGt5XG4gICAgICAgICAgLnBvc3Q8e1xuICAgICAgICAgICAgcGFja2FnZV9maWxlczogQXJyYXk8e1xuICAgICAgICAgICAgICBwYWNrYWdlX2ZpbGVfaWQ6IHN0cmluZ1xuICAgICAgICAgICAgICBwYWNrYWdlX3JlbGVhc2VfaWQ6IHN0cmluZ1xuICAgICAgICAgICAgICBmaWxlX3BhdGg6IHN0cmluZ1xuICAgICAgICAgICAgICBjcmVhdGVkX2F0OiBzdHJpbmdcbiAgICAgICAgICAgIH0+XG4gICAgICAgICAgfT4oXCJwYWNrYWdlX2ZpbGVzL2xpc3RcIiwge1xuICAgICAgICAgICAganNvbjoge1xuICAgICAgICAgICAgICBwYWNrYWdlX25hbWU6IGAke2F1dGhvcn0vJHtzbmlwcGV0TmFtZX1gLFxuICAgICAgICAgICAgICB1c2VfbGF0ZXN0X3ZlcnNpb246IHRydWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLmpzb24oKVxuXG4gICAgICAgIC8vIENyZWF0ZSBkaXJlY3RvcnkgaWYgaXQgZG9lc24ndCBleGlzdFxuICAgICAgICBjb25zdCBkaXJQYXRoID0gYC4vJHthdXRob3J9LiR7c25pcHBldE5hbWV9YFxuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZGlyUGF0aCkpIHtcbiAgICAgICAgICBmcy5ta2RpclN5bmMoZGlyUGF0aClcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERvd25sb2FkIGVhY2ggZmlsZSB0aGF0IGRvZXNuJ3Qgc3RhcnQgd2l0aCBkaXN0L1xuICAgICAgICBmb3IgKGNvbnN0IGZpbGVJbmZvIG9mIHBhY2thZ2VGaWxlTGlzdC5wYWNrYWdlX2ZpbGVzKSB7XG4gICAgICAgICAgY29uc3QgZmlsZVBhdGggPSBmaWxlSW5mby5maWxlX3BhdGguc3RhcnRzV2l0aChcIi9cIilcbiAgICAgICAgICAgID8gZmlsZUluZm8uZmlsZV9wYXRoLnNsaWNlKDEpXG4gICAgICAgICAgICA6IGZpbGVJbmZvLmZpbGVfcGF0aFxuXG4gICAgICAgICAgaWYgKGZpbGVQYXRoLnN0YXJ0c1dpdGgoXCJkaXN0L1wiKSkgY29udGludWVcblxuICAgICAgICAgIGNvbnN0IGZpbGVDb250ZW50ID0gYXdhaXQga3lcbiAgICAgICAgICAgIC5wb3N0PHtcbiAgICAgICAgICAgICAgcGFja2FnZV9maWxlOiB7XG4gICAgICAgICAgICAgICAgY29udGVudF90ZXh0OiBzdHJpbmdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfT4oXCJwYWNrYWdlX2ZpbGVzL2dldFwiLCB7XG4gICAgICAgICAgICAgIGpzb246IHtcbiAgICAgICAgICAgICAgICBwYWNrYWdlX25hbWU6IGAke2F1dGhvcn0vJHtzbmlwcGV0TmFtZX1gLFxuICAgICAgICAgICAgICAgIGZpbGVfcGF0aDogZmlsZUluZm8uZmlsZV9wYXRoLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5qc29uKClcblxuICAgICAgICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIGZpbGVQYXRoKVxuICAgICAgICAgIGNvbnN0IGRpck5hbWUgPSBwYXRoLmRpcm5hbWUoZnVsbFBhdGgpXG5cbiAgICAgICAgICAvLyBDcmVhdGUgbmVzdGVkIGRpcmVjdG9yaWVzIGlmIHRoZXkgZG9uJ3QgZXhpc3RcbiAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZGlyTmFtZSkpIHtcbiAgICAgICAgICAgIGZzLm1rZGlyU3luYyhkaXJOYW1lLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmMoZnVsbFBhdGgsIGZpbGVDb250ZW50LnBhY2thZ2VfZmlsZS5jb250ZW50X3RleHQpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zb2xlLmxvZyhgU3VjY2Vzc2Z1bGx5IGNsb25lZCB0byAuLyR7YXV0aG9yfS4ke3NuaXBwZXROYW1lfS9gKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRmFpbGVkIHRvIGNsb25lIHNuaXBwZXQ6XCIsIGVycm9yLm1lc3NhZ2UpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIkZhaWxlZCB0byBjbG9uZSBzbmlwcGV0OlwiLCBlcnJvcilcbiAgICAgICAgfVxuICAgICAgICBwcm9jZXNzLmV4aXQoMSlcbiAgICAgIH1cbiAgICB9KVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7O0FBQ0EsU0FBUyxlQUFlOzs7QUNBeEIsWUFBWUEsV0FBVTtBQUN0QixZQUFZLGNBQWM7QUFDMUIsWUFBWUMsU0FBUTs7O0FDSHBCLFlBQVksVUFBVTtBQUN0QixZQUFZLFFBQVE7QUFDcEIsWUFBWSxVQUFVO0FBQ3RCLFNBQVMsc0JBQXNCOzs7QUNIL0I7QUFBQSxFQUNFLE1BQVE7QUFBQSxFQUNSLE1BQVE7QUFBQSxFQUNSLE1BQVE7QUFBQSxFQUNSLFNBQVc7QUFBQSxFQUNYLEtBQU87QUFBQSxJQUNMLE1BQVE7QUFBQSxFQUNWO0FBQUEsRUFDQSxTQUFXO0FBQUEsSUFDVCxPQUFTO0FBQUEsSUFDVCxLQUFPO0FBQUEsSUFDUCxPQUFTO0FBQUEsSUFDVCxRQUFVO0FBQUEsSUFDVixnQkFBZ0I7QUFBQSxJQUNoQixLQUFPO0FBQUEsRUFDVDtBQUFBLEVBQ0EsaUJBQW1CO0FBQUEsSUFDakIsa0JBQWtCO0FBQUEsSUFDbEIsbUJBQW1CO0FBQUEsSUFDbkIsY0FBYztBQUFBLElBQ2Qsc0JBQXNCO0FBQUEsSUFDdEIsZ0JBQWdCO0FBQUEsSUFDaEIsTUFBUTtBQUFBLEVBQ1Y7QUFBQSxFQUNBLGtCQUFvQjtBQUFBLElBQ2xCLFlBQWM7QUFBQSxFQUNoQjtBQUFBLEVBQ0EsY0FBZ0I7QUFBQSxJQUNkLDBCQUEw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O0FBQUEsWUFDdEMsV0FBVyxTQUFTO0FBQUEsVUFDdEI7QUFBQSxRQUNGLENBQUMsRUFDQSxLQUFLO0FBRVIsY0FBTSxXQUFnQixXQUFLLFNBQVMsUUFBUTtBQUM1QyxjQUFNLFVBQWUsY0FBUSxRQUFRO0FBR3JDLFlBQUksQ0FBSSxlQUFXLE9BQU8sR0FBRztBQUMzQixVQUFHLGNBQVUsU0FBUyxFQUFFLFdBQVcsS0FBSyxDQUFDO0FBQUEsUUFDM0M7QUFFQSxRQUFHLGtCQUFjLFVBQVUsWUFBWSxhQUFhLFlBQVk7QUFBQSxNQUNsRTtBQUVBLGNBQVEsSUFBSSw0QkFBNEIsTUFBTSxJQUFJLFdBQVcsR0FBRztBQUFBLElBQ2xFLFNBQVMsT0FBTztBQUNkLFVBQUksaUJBQWlCLE9BQU87QUFDMUIsZ0JBQVEsTUFBTSw0QkFBNEIsTUFBTSxPQUFPO0FBQUEsTUFDekQsT0FBTztBQUNMLGdCQUFRLE1BQU0sNEJBQTRCLEtBQUs7QUFBQSxNQUNqRDtBQUNBLGNBQVEsS0FBSyxDQUFDO0FBQUEsSUFDaEI7QUFBQSxFQUNGLENBQUM7QUFDTDs7O0FmekZBLFNBQVMsa0JBQWtCO0FBRzNCLElBQU0sVUFBVSxJQUFJLFFBQVE7QUFFNUIsUUFDRyxLQUFLLE1BQU0sRUFDWCxZQUFZLHVDQUF1QyxFQUNuRCxRQUFRLGdCQUFJLE9BQU87QUFFdEIsWUFBWSxPQUFPO0FBQ25CLGNBQWMsT0FBTztBQUVyQixhQUFhLE9BQU87QUFDcEIsa0JBQWtCLE9BQU87QUFDekIsbUJBQW1CLE9BQU87QUFFMUIsZUFBZSxPQUFPO0FBQ3RCLG9CQUFvQixPQUFPO0FBRTNCLElBQUksUUFBUSxLQUFLLFdBQVcsR0FBRztBQUM3QixhQUFXLFNBQVMsUUFBUSxJQUFJO0FBQ2xDLE9BQU87QUFDTCxVQUFRLE1BQU07QUFDaEI7IiwKICAibmFtZXMiOiBbInBhdGgiLCAiZnMiLCAiY3JlYXRlU2VydmVyIiwgInJlc29sdmUiLCAicGF0aCIsICJmcyIsICJmcyIsICJwYXRoIiwgInRzIiwgInByb2dyYW0iLCAiY3JlYXRlU2VydmVyIiwgImZpbGUiLCAicHJvZ3JhbSIsICJreSIsICJwcm9ncmFtIiwgInByb2dyYW0iLCAicHJvZ3JhbSIsICJwcm9ncmFtIiwgImZzIiwgInBhdGgiLCAicHJvZ3JhbSIsICJreSJdCn0K
581
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vY2xpL21haW4udHMiLCAiLi4vY2xpL2Rldi9yZWdpc3Rlci50cyIsICIuLi9saWIvZGVwZW5kZW5jeS1hbmFseXNpcy9pbnN0YWxsTm9kZU1vZHVsZVR5cGVzRm9yU25pcHBldC50cyIsICIuLi9jbGkvZGV2L0RldlNlcnZlci50cyIsICIuLi9saWIvc2VydmVyL2NyZWF0ZUh0dHBTZXJ2ZXIudHMiLCAiLi4vcGFja2FnZS5qc29uIiwgIi4uL2xpYi9zaXRlL2dldEluZGV4LnRzIiwgIi4uL2xpYi9zZXJ2ZXIvRXZlbnRzV2F0Y2hlci50cyIsICIuLi9saWIvY2xpLWNvbmZpZy9pbmRleC50cyIsICIuLi9jbGkvYXV0aC9sb2dpbi9yZWdpc3Rlci50cyIsICIuLi9saWIvcmVnaXN0cnktYXBpL2dldC1reS50cyIsICIuLi9jbGkvYXV0aC9sb2dvdXQvcmVnaXN0ZXIudHMiLCAiLi4vY2xpL2F1dGgvcmVnaXN0ZXIudHMiLCAiLi4vY2xpL2NvbmZpZy9yZWdpc3Rlci50cyIsICIuLi9jbGkvY29uZmlnL3ByaW50L3JlZ2lzdGVyLnRzIiwgIi4uL2NsaS9jbG9uZS9yZWdpc3Rlci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiIyEvdXNyL2Jpbi9lbnYgbm9kZVxuaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIlxuaW1wb3J0IHsgcmVnaXN0ZXJEZXYgfSBmcm9tIFwiLi9kZXYvcmVnaXN0ZXJcIlxuaW1wb3J0IHsgcmVnaXN0ZXJBdXRoTG9naW4gfSBmcm9tIFwiLi9hdXRoL2xvZ2luL3JlZ2lzdGVyXCJcbmltcG9ydCB7IHJlZ2lzdGVyQXV0aExvZ291dCB9IGZyb20gXCIuL2F1dGgvbG9nb3V0L3JlZ2lzdGVyXCJcbmltcG9ydCB7IHJlZ2lzdGVyQXV0aCB9IGZyb20gXCIuL2F1dGgvcmVnaXN0ZXJcIlxuaW1wb3J0IHsgcmVnaXN0ZXJDb25maWcgfSBmcm9tIFwiLi9jb25maWcvcmVnaXN0ZXJcIlxuaW1wb3J0IHsgcmVnaXN0ZXJDb25maWdQcmludCB9IGZyb20gXCIuL2NvbmZpZy9wcmludC9yZWdpc3RlclwiXG5pbXBvcnQgeyByZWdpc3RlckNsb25lIH0gZnJvbSBcIi4vY2xvbmUvcmVnaXN0ZXJcIlxuaW1wb3J0IHsgcGVyZmVjdENsaSB9IGZyb20gXCJwZXJmZWN0LWNsaVwiXG5pbXBvcnQgcGtnIGZyb20gXCIuLi9wYWNrYWdlLmpzb25cIlxuaW1wb3J0IHNlbXZlciBmcm9tIFwic2VtdmVyXCJcblxuY29uc3QgcHJvZ3JhbSA9IG5ldyBDb21tYW5kKClcblxucHJvZ3JhbVxuICAubmFtZShcInRzY2lcIilcbiAgLmRlc2NyaXB0aW9uKFwiQ0xJIGZvciBkZXZlbG9waW5nIHRzY2lyY3VpdCBzbmlwcGV0c1wiKVxuICAvLyBIQUNLOiBhdCBidWlsZCB0aW1lIHRoZSB2ZXJzaW9uIGlzIG9sZCwgd2UgbmVlZCB0b1xuICAvLyBmaXggdGhpcyBhdCBzb21lIHBvaW50Li4uXG4gIC52ZXJzaW9uKHNlbXZlci5pbmMocGtnLnZlcnNpb24sIFwicGF0Y2hcIikgPz8gcGtnLnZlcnNpb24pXG5cbnJlZ2lzdGVyRGV2KHByb2dyYW0pXG5yZWdpc3RlckNsb25lKHByb2dyYW0pXG5cbnJlZ2lzdGVyQXV0aChwcm9ncmFtKVxucmVnaXN0ZXJBdXRoTG9naW4ocHJvZ3JhbSlcbnJlZ2lzdGVyQXV0aExvZ291dChwcm9ncmFtKVxuXG5yZWdpc3RlckNvbmZpZyhwcm9ncmFtKVxucmVnaXN0ZXJDb25maWdQcmludChwcm9ncmFtKVxuXG5pZiAocHJvY2Vzcy5hcmd2Lmxlbmd0aCA9PT0gMikge1xuICBwZXJmZWN0Q2xpKHByb2dyYW0sIHByb2Nlc3MuYXJndilcbn0gZWxzZSB7XG4gIHByb2dyYW0ucGFyc2UoKVxufVxuIiwgImltcG9ydCB0eXBlIHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIlxuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCAqIGFzIGNob2tpZGFyIGZyb20gXCJjaG9raWRhclwiXG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwibm9kZTpmc1wiXG5pbXBvcnQgeyBjcmVhdGVIdHRwU2VydmVyIH0gZnJvbSBcImxpYi9zZXJ2ZXIvY3JlYXRlSHR0cFNlcnZlclwiXG5pbXBvcnQgeyBnZXRMb2NhbEZpbGVEZXBlbmRlbmNpZXMgfSBmcm9tIFwibGliL2RlcGVuZGVuY3ktYW5hbHlzaXMvZ2V0TG9jYWxGaWxlRGVwZW5kZW5jaWVzXCJcbmltcG9ydCB7IGluc3RhbGxOb2RlTW9kdWxlVHlwZXNGb3JTbmlwcGV0IH0gZnJvbSBcIi4uLy4uL2xpYi9kZXBlbmRlbmN5LWFuYWx5c2lzL2luc3RhbGxOb2RlTW9kdWxlVHlwZXNGb3JTbmlwcGV0XCJcbmltcG9ydCB7IEV2ZW50c1dhdGNoZXIgfSBmcm9tIFwiLi4vLi4vbGliL3NlcnZlci9FdmVudHNXYXRjaGVyXCJcbmltcG9ydCB7IERldlNlcnZlciB9IGZyb20gXCIuL0RldlNlcnZlclwiXG5cbmV4cG9ydCBjb25zdCByZWdpc3RlckRldiA9IChwcm9ncmFtOiBDb21tYW5kKSA9PiB7XG4gIHByb2dyYW1cbiAgICAuY29tbWFuZChcImRldlwiKVxuICAgIC5kZXNjcmlwdGlvbihcIlN0YXJ0IGRldmVsb3BtZW50IHNlcnZlciBmb3IgYSBzbmlwcGV0XCIpXG4gICAgLmFyZ3VtZW50KFwiPGZpbGU+XCIsIFwiUGF0aCB0byB0aGUgc25pcHBldCBmaWxlXCIpXG4gICAgLm9wdGlvbihcIi1wLCAtLXBvcnQgPG51bWJlcj5cIiwgXCJQb3J0IHRvIHJ1biBzZXJ2ZXIgb25cIiwgXCIzMDAwXCIpXG4gICAgLmFjdGlvbihhc3luYyAoZmlsZTogc3RyaW5nLCBvcHRpb25zOiB7IHBvcnQ6IHN0cmluZyB9KSA9PiB7XG4gICAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSBwYXRoLnJlc29sdmUoZmlsZSlcbiAgICAgIGNvbnN0IGZpbGVEaXIgPSBwYXRoLmRpcm5hbWUoYWJzb2x1dGVQYXRoKVxuICAgICAgY29uc3QgcG9ydCA9IHBhcnNlSW50KG9wdGlvbnMucG9ydClcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc29sZS5sb2coXCJJbnN0YWxsaW5nIHR5cGVzIGZvciBpbXBvcnRlZCBzbmlwcGV0cy4uLlwiKVxuICAgICAgICBhd2FpdCBpbnN0YWxsTm9kZU1vZHVsZVR5cGVzRm9yU25pcHBldChhYnNvbHV0ZVBhdGgpXG4gICAgICAgIGNvbnNvbGUubG9nKFwiVHlwZXMgaW5zdGFsbGVkIHN1Y2Nlc3NmdWxseVwiKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFwiRmFpbGVkIHRvIGluc3RhbGwgdHlwZXM6XCIsIGVycm9yKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBzZXJ2ZXIgPSBuZXcgRGV2U2VydmVyKHtcbiAgICAgICAgcG9ydCxcbiAgICAgICAgY29tcG9uZW50RmlsZVBhdGg6IGFic29sdXRlUGF0aCxcbiAgICAgIH0pXG5cbiAgICAgIGF3YWl0IHNlcnZlci5zdGFydCgpXG4gICAgICBhd2FpdCBzZXJ2ZXIuYWRkRW50cnlwb2ludCgpXG4gICAgfSlcbn1cbiIsICJpbXBvcnQgKiBhcyBmcyBmcm9tIFwibm9kZTpmc1wiXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0ICogYXMgdHMgZnJvbSBcInR5cGVzY3JpcHRcIlxuXG5pbnRlcmZhY2UgU25pcHBldEFwaVJlc3BvbnNlIHtcbiAgc25pcHBldDoge1xuICAgIGR0czogc3RyaW5nXG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGluc3RhbGxOb2RlTW9kdWxlVHlwZXNGb3JTbmlwcGV0KHNuaXBwZXRQYXRoOiBzdHJpbmcpIHtcbiAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhzbmlwcGV0UGF0aCwgXCJ1dGYtOFwiKVxuICBjb25zdCBzb3VyY2VGaWxlID0gdHMuY3JlYXRlU291cmNlRmlsZShcbiAgICBzbmlwcGV0UGF0aCxcbiAgICBjb250ZW50LFxuICAgIHRzLlNjcmlwdFRhcmdldC5MYXRlc3QsXG4gICAgdHJ1ZSxcbiAgKVxuXG4gIGNvbnN0IGltcG9ydHM6IHN0cmluZ1tdID0gW11cblxuICBmdW5jdGlvbiB2aXNpdChub2RlOiB0cy5Ob2RlKSB7XG4gICAgaWYgKHRzLmlzSW1wb3J0RGVjbGFyYXRpb24obm9kZSkpIHtcbiAgICAgIGNvbnN0IG1vZHVsZVNwZWNpZmllciA9IG5vZGUubW9kdWxlU3BlY2lmaWVyXG4gICAgICBpZiAobW9kdWxlU3BlY2lmaWVyICYmIHRzLmlzU3RyaW5nTGl0ZXJhbChtb2R1bGVTcGVjaWZpZXIpKSB7XG4gICAgICAgIGNvbnN0IGltcG9ydFBhdGggPSBtb2R1bGVTcGVjaWZpZXIudGV4dFxuICAgICAgICBpZiAoaW1wb3J0UGF0aC5zdGFydHNXaXRoKFwiQHRzY2kvXCIpKSB7XG4gICAgICAgICAgaW1wb3J0cy5wdXNoKGltcG9ydFBhdGgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdHMuZm9yRWFjaENoaWxkKG5vZGUsIHZpc2l0KVxuICB9XG5cbiAgdmlzaXQoc291cmNlRmlsZSlcblxuICBsZXQgcHJvamVjdFJvb3QgPSBwYXRoLmRpcm5hbWUoc25pcHBldFBhdGgpXG4gIHdoaWxlIChwcm9qZWN0Um9vdCAhPT0gcGF0aC5wYXJzZShwcm9qZWN0Um9vdCkucm9vdCkge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0Um9vdCwgXCJwYWNrYWdlLmpzb25cIikpKSB7XG4gICAgICBicmVha1xuICAgIH1cbiAgICBwcm9qZWN0Um9vdCA9IHBhdGguZGlybmFtZShwcm9qZWN0Um9vdClcbiAgfVxuXG4gIGZvciAoY29uc3QgaW1wb3J0UGF0aCBvZiBpbXBvcnRzKSB7XG4gICAgY29uc3QgW293bmVyLCBuYW1lXSA9IGltcG9ydFBhdGgucmVwbGFjZShcIkB0c2NpL1wiLCBcIlwiKS5zcGxpdChcIi5cIilcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChcbiAgICAgICAgYGh0dHBzOi8vcmVnaXN0cnktYXBpLnRzY2lyY3VpdC5jb20vc25pcHBldHMvZ2V0P293bmVyX25hbWU9JHtvd25lcn0mdW5zY29wZWRfbmFtZT0ke25hbWV9YCxcbiAgICAgIClcblxuICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICBjb25zb2xlLndhcm4oYEZhaWxlZCB0byBmZXRjaCB0eXBlcyBmb3IgJHtpbXBvcnRQYXRofWApXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRhdGE6IFNuaXBwZXRBcGlSZXNwb25zZSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKVxuXG4gICAgICBpZiAoZGF0YS5zbmlwcGV0LmR0cykge1xuICAgICAgICBjb25zdCBwYWNrYWdlRGlyID0gcGF0aC5qb2luKFxuICAgICAgICAgIHByb2plY3RSb290LFxuICAgICAgICAgIFwibm9kZV9tb2R1bGVzXCIsXG4gICAgICAgICAgXCJAdHNjaVwiLFxuICAgICAgICAgIGAke293bmVyfS4ke25hbWV9YCxcbiAgICAgICAgKVxuICAgICAgICBmcy5ta2RpclN5bmMocGFja2FnZURpciwgeyByZWN1cnNpdmU6IHRydWUgfSlcblxuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHBhdGguam9pbihwYWNrYWdlRGlyLCBcImluZGV4LmQudHNcIiksIGRhdGEuc25pcHBldC5kdHMpXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybihgRXJyb3IgZmV0Y2hpbmcgdHlwZXMgZm9yICR7aW1wb3J0UGF0aH06YCwgZXJyb3IpXG4gICAgfVxuICB9XG59XG4iLCAiaW1wb3J0IGt5IGZyb20gXCJreVwiXG5pbXBvcnQgdHlwZSB7IEZpbGVTZXJ2ZXJSb3V0ZXMgfSBmcm9tIFwibGliL2ZpbGUtc2VydmVyL0ZpbGVTZXJ2ZXJSb3V0ZXNcIlxuaW1wb3J0IHsgY3JlYXRlSHR0cFNlcnZlciB9IGZyb20gXCJsaWIvc2VydmVyL2NyZWF0ZUh0dHBTZXJ2ZXJcIlxuaW1wb3J0IHsgRXZlbnRzV2F0Y2hlciB9IGZyb20gXCJsaWIvc2VydmVyL0V2ZW50c1dhdGNoZXJcIlxuaW1wb3J0IHR5cGUgaHR0cCBmcm9tIFwibm9kZTpodHRwXCJcbmltcG9ydCB0eXBlIHsgVHlwZWRLeUluc3RhbmNlIH0gZnJvbSBcInR5cGVkLWt5XCJcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IGZzIGZyb20gXCJub2RlOmZzXCJcbmltcG9ydCB0eXBlIHsgRmlsZVVwZGF0ZWRFdmVudCB9IGZyb20gXCJsaWIvZmlsZS1zZXJ2ZXIvRmlsZVNlcnZlckV2ZW50XCJcbmltcG9ydCAqIGFzIGNob2tpZGFyIGZyb20gXCJjaG9raWRhclwiXG5cbmV4cG9ydCBjbGFzcyBEZXZTZXJ2ZXIge1xuICBwb3J0OiBudW1iZXJcbiAgLyoqXG4gICAqIFRoZSBwYXRoIHRvIGEgY29tcG9uZW50IHRoYXQgZXhwb3J0cyBhIDxib2FyZCAvPiBvciA8Z3JvdXAgLz4gY29tcG9uZW50XG4gICAqL1xuICBjb21wb25lbnRGaWxlUGF0aDogc3RyaW5nXG5cbiAgcHJvamVjdERpcjogc3RyaW5nXG5cbiAgLyoqXG4gICAqIFRoZSBIVFRQIHNlcnZlciB0aGF0IGhvc3RzIHRoZSBmaWxlIHNlcnZlciBhbmQgZXZlbnQgYnVzLiBZb3UgY2FuIHVzZVxuICAgKiBmc0t5IHRvIGNvbW11bmljYXRlIHdpdGggdGhlIGZpbGUgc2VydmVyL2V2ZW50IGJ1c1xuICAgKi9cbiAgaHR0cFNlcnZlcj86IGh0dHAuU2VydmVyXG4gIC8qKlxuICAgKiBXYXRjaGVzIGZvciBldmVudHMgb24gdGhlIGV2ZW50IGJ1cyBieSBwb2xsaW5nIGBhcGkvZXZlbnRzL2xpc3RgXG4gICAqL1xuICBldmVudHNXYXRjaGVyPzogRXZlbnRzV2F0Y2hlclxuICAvKipcbiAgICogQSBreSBpbnN0YW5jZSB0aGF0IGNhbiBiZSB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIGZpbGUgc2VydmVyIGFuZFxuICAgKiBldmVudCBidXNcbiAgICovXG4gIGZzS3k6IFR5cGVkS3lJbnN0YW5jZTxrZXlvZiBGaWxlU2VydmVyUm91dGVzLCBGaWxlU2VydmVyUm91dGVzPlxuICAvKipcbiAgICogQSBjaG9raWRhciBpbnN0YW5jZSB0aGF0IHdhdGNoZXMgdGhlIHByb2plY3QgZGlyZWN0b3J5IGZvciBmaWxlIGNoYW5nZXNcbiAgICovXG4gIGZpbGVzeXN0ZW1XYXRjaGVyPzogY2hva2lkYXIuRlNXYXRjaGVyXG5cbiAgY29uc3RydWN0b3Ioe1xuICAgIHBvcnQsXG4gICAgY29tcG9uZW50RmlsZVBhdGgsXG4gIH06IHtcbiAgICBwb3J0OiBudW1iZXJcbiAgICBjb21wb25lbnRGaWxlUGF0aDogc3RyaW5nXG4gIH0pIHtcbiAgICB0aGlzLnBvcnQgPSBwb3J0XG4gICAgdGhpcy5jb21wb25lbnRGaWxlUGF0aCA9IGNvbXBvbmVudEZpbGVQYXRoXG4gICAgdGhpcy5wcm9qZWN0RGlyID0gcGF0aC5kaXJuYW1lKGNvbXBvbmVudEZpbGVQYXRoKVxuICAgIHRoaXMuZnNLeSA9IGt5LmNyZWF0ZSh7XG4gICAgICBwcmVmaXhVcmw6IGBodHRwOi8vbG9jYWxob3N0OiR7cG9ydH1gLFxuICAgIH0pIGFzIGFueVxuICB9XG5cbiAgYXN5bmMgc3RhcnQoKSB7XG4gICAgY29uc3QgeyBzZXJ2ZXIgfSA9IGF3YWl0IGNyZWF0ZUh0dHBTZXJ2ZXIodGhpcy5wb3J0KVxuICAgIHRoaXMuaHR0cFNlcnZlciA9IHNlcnZlclxuXG4gICAgdGhpcy5ldmVudHNXYXRjaGVyID0gbmV3IEV2ZW50c1dhdGNoZXIoYGh0dHA6Ly9sb2NhbGhvc3Q6JHt0aGlzLnBvcnR9YClcbiAgICB0aGlzLmV2ZW50c1dhdGNoZXIuc3RhcnQoKVxuXG4gICAgdGhpcy5ldmVudHNXYXRjaGVyLm9uKFxuICAgICAgXCJGSUxFX1VQREFURURcIixcbiAgICAgIHRoaXMuaGFuZGxlRmlsZVVwZGF0ZWRFdmVudEZyb21TZXJ2ZXIuYmluZCh0aGlzKSxcbiAgICApXG5cbiAgICB0aGlzLmZpbGVzeXN0ZW1XYXRjaGVyID0gY2hva2lkYXIud2F0Y2godGhpcy5wcm9qZWN0RGlyLCB7XG4gICAgICBwZXJzaXN0ZW50OiB0cnVlLFxuICAgICAgaWdub3JlSW5pdGlhbDogdHJ1ZSxcbiAgICB9KVxuXG4gICAgdGhpcy5maWxlc3lzdGVtV2F0Y2hlci5vbihcImNoYW5nZVwiLCAoZmlsZVBhdGgpID0+XG4gICAgICB0aGlzLmhhbmRsZUZpbGVDaGFuZ2VkT25GaWxlc3lzdGVtKGZpbGVQYXRoKSxcbiAgICApXG4gICAgdGhpcy5maWxlc3lzdGVtV2F0Y2hlci5vbihcImFkZFwiLCAoZmlsZVBhdGgpID0+XG4gICAgICB0aGlzLmhhbmRsZUZpbGVDaGFuZ2VkT25GaWxlc3lzdGVtKGZpbGVQYXRoKSxcbiAgICApXG5cbiAgICB0aGlzLnVwc2VydEluaXRpYWxGaWxlcygpXG4gIH1cblxuICBhc3luYyBhZGRFbnRyeXBvaW50KCkge1xuICAgIGNvbnN0IHJlbGF0aXZlQ29tcG9uZW50RmlsZVBhdGggPSBwYXRoLnJlbGF0aXZlKFxuICAgICAgdGhpcy5wcm9qZWN0RGlyLFxuICAgICAgdGhpcy5jb21wb25lbnRGaWxlUGF0aCxcbiAgICApXG4gICAgYXdhaXQgdGhpcy5mc0t5LnBvc3QoXCJhcGkvZmlsZXMvdXBzZXJ0XCIsIHtcbiAgICAgIGpzb246IHtcbiAgICAgICAgZmlsZV9wYXRoOiBcImVudHJ5cG9pbnQudHN4XCIsXG4gICAgICAgIHRleHRfY29udGVudDogYFxuaW1wb3J0IE15Q2lyY3VpdCBmcm9tIFwiLi8ke3JlbGF0aXZlQ29tcG9uZW50RmlsZVBhdGh9XCJcblxuY2lyY3VpdC5hZGQoPE15Q2lyY3VpdCAvPilcbmAsXG4gICAgICB9LFxuICAgIH0pXG4gIH1cblxuICBhc3luYyBoYW5kbGVGaWxlVXBkYXRlZEV2ZW50RnJvbVNlcnZlcihldjogRmlsZVVwZGF0ZWRFdmVudCkge1xuICAgIGlmIChldi5pbml0aWF0b3IgPT09IFwiZmlsZXN5c3RlbV9jaGFuZ2VcIikgcmV0dXJuXG5cbiAgICBpZiAoZXYuZmlsZV9wYXRoID09PSBcIm1hbnVhbC1lZGl0cy5qc29uXCIpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiTWFudWFsIGVkaXRzIHVwZGF0ZWQsIHVwZGF0aW5nIG9uIGZpbGVzeXN0ZW0uLi5cIilcbiAgICAgIGNvbnN0IHsgZmlsZSB9ID0gYXdhaXQgdGhpcy5mc0t5XG4gICAgICAgIC5nZXQoXCJhcGkvZmlsZXMvZ2V0XCIsIHtcbiAgICAgICAgICBzZWFyY2hQYXJhbXM6IHsgZmlsZV9wYXRoOiBldi5maWxlX3BhdGggfSxcbiAgICAgICAgfSlcbiAgICAgICAgLmpzb24oKVxuICAgICAgZnMud3JpdGVGaWxlU3luYyhcbiAgICAgICAgcGF0aC5qb2luKHRoaXMucHJvamVjdERpciwgXCJtYW51YWwtZWRpdHMuanNvblwiKSxcbiAgICAgICAgZmlsZS50ZXh0X2NvbnRlbnQsXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgaGFuZGxlRmlsZUNoYW5nZWRPbkZpbGVzeXN0ZW0oYWJzb2x1dGVGaWxlUGF0aDogc3RyaW5nKSB7XG4gICAgY29uc3QgcmVsYXRpdmVGaWxlUGF0aCA9IHBhdGgucmVsYXRpdmUodGhpcy5wcm9qZWN0RGlyLCBhYnNvbHV0ZUZpbGVQYXRoKVxuXG4gICAgLy8gV2UndmUgdGVtcG9yYXJpbHkgZGlzYWJsZWQgdXBzZXJ0aW5nIG1hbnVhbCBlZGl0cyBmcm9tIGZpbGVzeXN0ZW0gY2hhbmdlc1xuICAgIC8vIGJlY2F1c2UgaXQgY2FuIGJlIGVkaXRlZCBieSB0aGUgYnJvd3NlclxuICAgIGlmIChyZWxhdGl2ZUZpbGVQYXRoLmluY2x1ZGVzKFwibWFudWFsLWVkaXRzLmpzb25cIikpIHJldHVyblxuXG4gICAgYXdhaXQgdGhpcy5mc0t5XG4gICAgICAucG9zdChcImFwaS9maWxlcy91cHNlcnRcIiwge1xuICAgICAgICBqc29uOiB7XG4gICAgICAgICAgZmlsZV9wYXRoOiByZWxhdGl2ZUZpbGVQYXRoLFxuICAgICAgICAgIHRleHRfY29udGVudDogZnMucmVhZEZpbGVTeW5jKGFic29sdXRlRmlsZVBhdGgsIFwidXRmLThcIiksXG4gICAgICAgICAgaW5pdGlhdG9yOiBcImZpbGVzeXN0ZW1fY2hhbmdlXCIsXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICAgLmpzb24oKVxuICB9XG5cbiAgYXN5bmMgdXBzZXJ0SW5pdGlhbEZpbGVzKCkge1xuICAgIC8vIFNjYW4gcHJvamVjdCBkaXJlY3RvcnkgZm9yIGFsbCBmaWxlcyBhbmQgdXBzZXJ0IHRoZW1cbiAgICBjb25zdCBmaWxlTmFtZXMgPSBmcy5yZWFkZGlyU3luYyh0aGlzLnByb2plY3REaXIpXG4gICAgZm9yIChjb25zdCBmaWxlTmFtZSBvZiBmaWxlTmFtZXMpIHtcbiAgICAgIGlmIChmcy5zdGF0U3luYyhwYXRoLmpvaW4odGhpcy5wcm9qZWN0RGlyLCBmaWxlTmFtZSkpLmlzRGlyZWN0b3J5KCkpXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICBjb25zdCBmaWxlQ29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhcbiAgICAgICAgcGF0aC5qb2luKHRoaXMucHJvamVjdERpciwgZmlsZU5hbWUpLFxuICAgICAgICBcInV0Zi04XCIsXG4gICAgICApXG4gICAgICBhd2FpdCB0aGlzLmZzS3kucG9zdChcImFwaS9maWxlcy91cHNlcnRcIiwge1xuICAgICAgICBqc29uOiB7XG4gICAgICAgICAgZmlsZV9wYXRoOiBmaWxlTmFtZSxcbiAgICAgICAgICB0ZXh0X2NvbnRlbnQ6IGZpbGVDb250ZW50LFxuICAgICAgICAgIGluaXRpYXRvcjogXCJmaWxlc3lzdGVtX2NoYW5nZVwiLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBhc3luYyBzdG9wKCkge1xuICAgIHRoaXMuaHR0cFNlcnZlcj8uY2xvc2UoKVxuICAgIHRoaXMuZXZlbnRzV2F0Y2hlcj8uc3RvcCgpXG4gIH1cbn1cbiIsICJpbXBvcnQgKiBhcyBodHRwIGZyb20gXCJub2RlOmh0dHBcIlxuaW1wb3J0ICogYXMgZnMgZnJvbSBcIm5vZGU6ZnNcIlxuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCB7IGdldE5vZGVIYW5kbGVyIH0gZnJvbSBcIndpbnRlcnNwZWMvYWRhcHRlcnMvbm9kZVwiXG5pbXBvcnQgcGtnIGZyb20gXCIuLi8uLi9wYWNrYWdlLmpzb25cIlxuXG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgd2ludGVyc3BlY0J1bmRsZSBmcm9tIFwiQHRzY2lyY3VpdC9maWxlLXNlcnZlci9kaXN0L2J1bmRsZS5qc1wiXG5pbXBvcnQgeyBnZXRJbmRleCB9IGZyb20gXCIuLi9zaXRlL2dldEluZGV4XCJcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUh0dHBTZXJ2ZXIgPSBhc3luYyAocG9ydCA9IDMwMDApID0+IHtcbiAgY29uc3QgZmlsZVNlcnZlckhhbmRsZXIgPSBnZXROb2RlSGFuZGxlcih3aW50ZXJzcGVjQnVuZGxlIGFzIGFueSwge30pXG5cbiAgY29uc3Qgc2VydmVyID0gaHR0cC5jcmVhdGVTZXJ2ZXIoYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgY29uc3QgdXJsID0gbmV3IFVSTChyZXEudXJsISwgYGh0dHA6Ly8ke3JlcS5oZWFkZXJzLmhvc3R9YClcblxuICAgIGlmICh1cmwucGF0aG5hbWUgPT09IFwiL3N0YW5kYWxvbmUubWluLmpzXCIpIHtcbiAgICAgIGNvbnN0IHN0YW5kYWxvbmVGaWxlUGF0aCA9XG4gICAgICAgIHByb2Nlc3MuZW52LlJVTkZSQU1FX1NUQU5EQUxPTkVfRklMRV9QQVRIIHx8XG4gICAgICAgIHBhdGgucmVzb2x2ZShcbiAgICAgICAgICBwcm9jZXNzLmN3ZCgpLFxuICAgICAgICAgIFwibm9kZV9tb2R1bGVzXCIsXG4gICAgICAgICAgXCJAdHNjaXJjdWl0L3J1bmZyYW1lL2Rpc3Qvc3RhbmRhbG9uZS5taW4uanNcIixcbiAgICAgICAgKVxuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHN0YW5kYWxvbmVGaWxlUGF0aCwgXCJ1dGY4XCIpXG4gICAgICAgIHJlcy53cml0ZUhlYWQoMjAwLCB7XG4gICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0OyBjaGFyc2V0PXV0Zi04XCIsXG4gICAgICAgIH0pXG4gICAgICAgIHJlcy5lbmQoY29udGVudClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3Igc2VydmluZyBzdGFuZGFsb25lLm1pbi5qczpcIiwgZXJyb3IpXG4gICAgICB9XG5cbiAgICAgIHJlcy53cml0ZUhlYWQoMzAyLCB7XG4gICAgICAgIExvY2F0aW9uOiBgaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9AdHNjaXJjdWl0L3J1bmZyYW1lQCR7cGtnLmRlcGVuZGVuY2llc1tcIkB0c2NpcmN1aXQvcnVuZnJhbWVcIl0ucmVwbGFjZSgvXlteMC05XSsvLCBcIlwiKX0vZGlzdC9zdGFuZGFsb25lLm1pbi5qc2AsXG4gICAgICB9KVxuICAgICAgcmVzLmVuZCgpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAodXJsLnBhdGhuYW1lID09PSBcIi9cIikge1xuICAgICAgY29uc3QgaHRtbCA9IGF3YWl0IGdldEluZGV4KClcbiAgICAgIHJlcy53cml0ZUhlYWQoMjAwLCB7IFwiQ29udGVudC1UeXBlXCI6IFwidGV4dC9odG1sXCIgfSlcbiAgICAgIHJlcy5lbmQoaHRtbClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh1cmwucGF0aG5hbWUuc3RhcnRzV2l0aChcIi9hcGkvXCIpKSB7XG4gICAgICByZXEudXJsID0gcmVxLnVybCEucmVwbGFjZShcIi9hcGkvXCIsIFwiL1wiKVxuICAgICAgZmlsZVNlcnZlckhhbmRsZXIocmVxLCByZXMpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICByZXMud3JpdGVIZWFkKDQwNClcbiAgICByZXMuZW5kKFwiTm90IGZvdW5kXCIpXG4gIH0pXG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlPHsgc2VydmVyOiBodHRwLlNlcnZlciB9PigocmVzb2x2ZSkgPT4ge1xuICAgIHNlcnZlci5saXN0ZW4ocG9ydCwgKCkgPT4ge1xuICAgICAgY29uc29sZS5sb2coYFNlcnZlciBydW5uaW5nIGF0IGh0dHA6Ly9sb2NhbGhvc3Q6JHtwb3J0fWApXG4gICAgICByZXNvbHZlKHsgc2VydmVyIH0pXG4gICAgfSlcbiAgfSlcbn1cbiIsICJ7XG4gIFwibmFtZVwiOiBcIkB0c2NpcmN1aXQvY2xpXCIsXG4gIFwibWFpblwiOiBcImRpc3QvbWFpbi5qc1wiLFxuICBcInR5cGVcIjogXCJtb2R1bGVcIixcbiAgXCJ2ZXJzaW9uXCI6IFwiMC4xLjVcIixcbiAgXCJiaW5cIjoge1xuICAgIFwidHNjaVwiOiBcIi4vZGlzdC9tYWluLmpzXCJcbiAgfSxcbiAgXCJzY3JpcHRzXCI6IHtcbiAgICBcInN0YXJ0XCI6IFwiYnVuIHJ1biBkZXZcIixcbiAgICBcImRldlwiOiBcImJ1biAtLWhvdCAuL2NsaS9tYWluLnRzIGRldiAuL2V4YW1wbGUtZGlyL3NuaXBwZXQudHN4XCIsXG4gICAgXCJidWlsZFwiOiBcInRzdXAtbm9kZSBjbGkvbWFpbi50cyAtLWZvcm1hdCBlc20gLS1zb3VyY2VtYXAgaW5saW5lXCIsXG4gICAgXCJmb3JtYXRcIjogXCJiaW9tZSBmb3JtYXQgLS13cml0ZSAuXCIsXG4gICAgXCJmb3JtYXQ6Y2hlY2tcIjogXCJiaW9tZSBmb3JtYXQgLlwiLFxuICAgIFwiY2xpXCI6IFwiYnVuIC4vY2xpL21haW4udHNcIlxuICB9LFxuICBcImRldkRlcGVuZGVuY2llc1wiOiB7XG4gICAgXCJAYmlvbWVqcy9iaW9tZVwiOiBcIl4xLjkuNFwiLFxuICAgIFwiQHRzY2lyY3VpdC9jb3JlXCI6IFwiXjAuMC4yNDlcIixcbiAgICBcIkB0eXBlcy9idW5cIjogXCJeMS4xLjE1XCIsXG4gICAgXCJAdHlwZXMvY29uZmlnc3RvcmVcIjogXCJeNi4wLjJcIixcbiAgICBcIkB0eXBlcy9yZWFjdFwiOiBcIl4xOS4wLjFcIixcbiAgICBcIkB0eXBlcy9zZW12ZXJcIjogXCJeNy41LjhcIixcbiAgICBcImdldC1wb3J0XCI6IFwiXjcuMS4wXCIsXG4gICAgXCJ0ZW1weVwiOiBcIl4zLjEuMFwiLFxuICAgIFwidHN1cFwiOiBcIl44LjMuNVwiLFxuICAgIFwidHlwZWQta3lcIjogXCJeMC4wLjRcIlxuICB9LFxuICBcInBlZXJEZXBlbmRlbmNpZXNcIjoge1xuICAgIFwidHlwZXNjcmlwdFwiOiBcIl41LjAuMFwiXG4gIH0sXG4gIFwiZGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcIkB0c2NpcmN1aXQvZmlsZS1zZXJ2ZXJcIjogXCJeMC4wLjEzXCIsXG4gICAgXCJAdHNjaXJjdWl0L3J1bmZyYW1lXCI6IFwiXjAuMC40N1wiLFxuICAgIFwiY2hva2lkYXJcIjogXCJeNC4wLjFcIixcbiAgICBcImNvbW1hbmRlclwiOiBcIl4xMi4xLjBcIixcbiAgICBcImNvbmZpZ3N0b3JlXCI6IFwiXjcuMC4wXCIsXG4gICAgXCJjb3NtaWNvbmZpZ1wiOiBcIl45LjAuMFwiLFxuICAgIFwiZGVsYXlcIjogXCJeNi4wLjBcIixcbiAgICBcImt5XCI6IFwiXjEuNy40XCIsXG4gICAgXCJwZXJmZWN0LWNsaVwiOiBcIl4xLjAuMjBcIixcbiAgICBcInNlbXZlclwiOiBcIl43LjYuM1wiXG4gIH1cbn1cbiIsICJpbXBvcnQgcGtnIGZyb20gXCIuLi8uLi9wYWNrYWdlLmpzb25cIlxuXG5leHBvcnQgY29uc3QgZ2V0SW5kZXggPSBhc3luYyAoKSA9PiB7XG4gIHJldHVybiBgPGh0bWw+XG4gICAgPGhlYWQ+XG4gICAgPC9oZWFkPlxuICAgIDxib2R5PlxuICAgICAgPHNjcmlwdCBzcmM9XCJodHRwczovL2Nkbi50YWlsd2luZGNzcy5jb21cIj48L3NjcmlwdD5cbiAgICAgIDxkaXYgaWQ9XCJyb290XCI+bG9hZGluZy4uLjwvZGl2PlxuICAgICAgPHNjcmlwdD5cbiAgICAgIGdsb2JhbFRoaXMucHJvY2VzcyA9IHsgZW52OiB7IE5PREVfRU5WOiBcInByb2R1Y3Rpb25cIiB9IH1cbiAgICAgIDwvc2NyaXB0PlxuICAgICAgPHNjcmlwdCBzcmM9XCIvc3RhbmRhbG9uZS5taW4uanNcIj48L3NjcmlwdD5cbiAgICA8L2JvZHk+XG4gIDwvaHRtbD5gXG59XG5cbi8vIDxzY3JpcHQgc3JjPVwiaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9AdHNjaXJjdWl0L3J1bmZyYW1lQCR7cGtnLmRlcGVuZGVuY2llc1tcIkB0c2NpcmN1aXQvcnVuZnJhbWVcIl0ucmVwbGFjZSgvXlteMC05XSsvLCBcIlwiKX0vZGlzdC9zdGFuZGFsb25lLm1pbi5qc1wiPjwvc2NyaXB0PlxuIiwgImltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gXCJldmVudHNcIlxuXG5pbnRlcmZhY2UgRXZlbnQge1xuICBldmVudF9pZDogc3RyaW5nXG4gIGNyZWF0ZWRfYXQ6IHN0cmluZ1xuICBldmVudF90eXBlOiBzdHJpbmdcbiAgW2tleTogc3RyaW5nXTogYW55XG59XG5cbmludGVyZmFjZSBFdmVudHNSZXNwb25zZSB7XG4gIGV2ZW50X2xpc3Q6IEV2ZW50W11cbn1cblxuZXhwb3J0IGNsYXNzIEV2ZW50c1dhdGNoZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICBwcml2YXRlIGxhc3RQb2xsVGltZTogc3RyaW5nXG4gIHByaXZhdGUgcG9sbEludGVydmFsOiBudW1iZXJcbiAgcHJpdmF0ZSBiYXNlVXJsOiBzdHJpbmdcbiAgcHJpdmF0ZSBwb2xsaW5nID0gZmFsc2VcbiAgcHJpdmF0ZSB0aW1lb3V0SWQ/OiBOb2RlSlMuVGltZW91dFxuXG4gIGNvbnN0cnVjdG9yKGJhc2VVcmwgPSBcImh0dHA6Ly9sb2NhbGhvc3Q6MzAwMFwiLCBwb2xsSW50ZXJ2YWwgPSAxMDAwKSB7XG4gICAgc3VwZXIoKVxuICAgIHRoaXMuYmFzZVVybCA9IGJhc2VVcmxcbiAgICB0aGlzLnBvbGxJbnRlcnZhbCA9IHBvbGxJbnRlcnZhbFxuICAgIHRoaXMubGFzdFBvbGxUaW1lID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpXG4gIH1cblxuICBhc3luYyBzdGFydCgpIHtcbiAgICBpZiAodGhpcy5wb2xsaW5nKSByZXR1cm5cbiAgICB0aGlzLnBvbGxpbmcgPSB0cnVlXG4gICAgYXdhaXQgdGhpcy5wb2xsKClcbiAgfVxuXG4gIHN0b3AoKSB7XG4gICAgdGhpcy5wb2xsaW5nID0gZmFsc2VcbiAgICBpZiAodGhpcy50aW1lb3V0SWQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXRJZClcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHBvbGwoKSB7XG4gICAgaWYgKCF0aGlzLnBvbGxpbmcpIHJldHVyblxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goXG4gICAgICAgIGAke3RoaXMuYmFzZVVybH0vYXBpL2V2ZW50cy9saXN0P3NpbmNlPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMubGFzdFBvbGxUaW1lKX1gLFxuICAgICAgKVxuXG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSFRUUCBlcnJvciEgc3RhdHVzOiAke3Jlc3BvbnNlLnN0YXR1c31gKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBkYXRhOiBFdmVudHNSZXNwb25zZSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKVxuXG4gICAgICAvLyBVcGRhdGUgbGFzdCBwb2xsIHRpbWUgdG8gbGF0ZXN0IGV2ZW50IG9yIGN1cnJlbnQgdGltZVxuICAgICAgY29uc3QgbGF0ZXN0RXZlbnQgPSBkYXRhLmV2ZW50X2xpc3RbZGF0YS5ldmVudF9saXN0Lmxlbmd0aCAtIDFdXG4gICAgICB0aGlzLmxhc3RQb2xsVGltZSA9IGxhdGVzdEV2ZW50XG4gICAgICAgID8gbGF0ZXN0RXZlbnQuY3JlYXRlZF9hdFxuICAgICAgICA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKVxuXG4gICAgICAvLyBFbWl0IGV2ZW50cyBpbiBjaHJvbm9sb2dpY2FsIG9yZGVyXG4gICAgICBkYXRhLmV2ZW50X2xpc3QuZm9yRWFjaCgoZXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy5lbWl0KGV2ZW50LmV2ZW50X3R5cGUsIGV2ZW50KVxuICAgICAgICB0aGlzLmVtaXQoXCIqXCIsIGV2ZW50KVxuICAgICAgfSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5lbWl0KFwiZXJyb3JcIiwgZXJyb3IpXG4gICAgfVxuICAgIC8vIFNjaGVkdWxlIG5leHQgcG9sbFxuICAgIHRoaXMudGltZW91dElkID0gZ2xvYmFsVGhpcy5zZXRUaW1lb3V0KFxuICAgICAgKCkgPT4gdGhpcy5wb2xsKCksXG4gICAgICB0aGlzLnBvbGxJbnRlcnZhbCxcbiAgICApIGFzIHVua25vd24gYXMgTm9kZUpTLlRpbWVvdXRcbiAgfVxufVxuIiwgImltcG9ydCBDb25maWdzdG9yZSBmcm9tIFwiY29uZmlnc3RvcmVcIlxuaW1wb3J0IHR5cGUgeyBUeXBlZENvbmZpZ3N0b3JlIH0gZnJvbSBcIi4vVHlwZWRDb25maWdTdG9yZVwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2xpQ29uZmlnIHtcbiAgc2Vzc2lvblRva2VuPzogc3RyaW5nXG4gIGdpdGh1YlVzZXJuYW1lPzogc3RyaW5nXG4gIHJlZ2lzdHJ5QXBpVXJsPzogc3RyaW5nXG59XG5cbmV4cG9ydCBjb25zdCBjbGlDb25maWc6IFR5cGVkQ29uZmlnc3RvcmU8Q2xpQ29uZmlnPiA9IG5ldyBDb25maWdzdG9yZShcbiAgXCJ0c2NpcmN1aXRcIixcbilcblxuZXhwb3J0IGNvbnN0IGdldFJlZ2lzdHJ5QXBpVXJsID0gKCk6IHN0cmluZyA9PiB7XG4gIHJldHVybiBjbGlDb25maWcuZ2V0KFwicmVnaXN0cnlBcGlVcmxcIikgPz8gXCJodHRwczovL3JlZ2lzdHJ5LWFwaS50c2NpcmN1aXQuY29tXCJcbn1cbiIsICJpbXBvcnQgdHlwZSB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCJcbmltcG9ydCB7IGNsaUNvbmZpZyB9IGZyb20gXCJsaWIvY2xpLWNvbmZpZ1wiXG5pbXBvcnQgZGVsYXkgZnJvbSBcImRlbGF5XCJcbmltcG9ydCB7IGdldEt5IH0gZnJvbSBcImxpYi9yZWdpc3RyeS1hcGkvZ2V0LWt5XCJcbmltcG9ydCB0eXBlIHsgRW5kcG9pbnRSZXNwb25zZSB9IGZyb20gXCJsaWIvcmVnaXN0cnktYXBpL2VuZHBvaW50LXR5cGVzXCJcblxuZXhwb3J0IGNvbnN0IHJlZ2lzdGVyQXV0aExvZ2luID0gKHByb2dyYW06IENvbW1hbmQpID0+IHtcbiAgcHJvZ3JhbS5jb21tYW5kc1xuICAgIC5maW5kKChjKSA9PiBjLm5hbWUoKSA9PT0gXCJhdXRoXCIpIVxuICAgIC5jb21tYW5kKFwibG9naW5cIilcbiAgICAuZGVzY3JpcHRpb24oXCJBdXRoZW50aWNhdGUgQ0xJLCBsb2dpbiB0byByZWdpc3RyeVwiKVxuICAgIC5hY3Rpb24oYXN5bmMgKGFyZ3MpID0+IHtcbiAgICAgIGNvbnN0IGt5ID0gZ2V0S3koKVxuXG4gICAgICBjb25zdCB7IGxvZ2luX3BhZ2UgfSA9IGF3YWl0IGt5XG4gICAgICAgIC5wb3N0PEVuZHBvaW50UmVzcG9uc2VbXCJzZXNzaW9ucy9sb2dpbl9wYWdlL2NyZWF0ZVwiXT4oXG4gICAgICAgICAgXCJzZXNzaW9ucy9sb2dpbl9wYWdlL2NyZWF0ZVwiLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGpzb246IHt9LFxuICAgICAgICAgIH0sXG4gICAgICAgIClcbiAgICAgICAgLmpzb24oKVxuXG4gICAgICBjb25zb2xlLmxvZyhcIlBsZWFzZSB2aXNpdCB0aGUgZm9sbG93aW5nIFVSTCB0byBsb2cgaW46XCIpXG4gICAgICBjb25zb2xlLmxvZyhsb2dpbl9wYWdlLnVybClcblxuICAgICAgLy8gV2FpdCB1bnRpbCB3ZSByZWNlaXZlIGNvbmZpcm1hdGlvblxuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgY29uc3QgeyBsb2dpbl9wYWdlOiBuZXdfbG9naW5fcGFnZSB9ID0gYXdhaXQga3lcbiAgICAgICAgICAucG9zdDxFbmRwb2ludFJlc3BvbnNlW1wic2Vzc2lvbnMvbG9naW5fcGFnZS9nZXRcIl0+KFxuICAgICAgICAgICAgXCJzZXNzaW9ucy9sb2dpbl9wYWdlL2dldFwiLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBqc29uOiB7XG4gICAgICAgICAgICAgICAgbG9naW5fcGFnZV9pZDogbG9naW5fcGFnZS5sb2dpbl9wYWdlX2lkLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke2xvZ2luX3BhZ2UubG9naW5fcGFnZV9hdXRoX3Rva2VufWAsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIClcbiAgICAgICAgICAuanNvbigpXG5cbiAgICAgICAgaWYgKG5ld19sb2dpbl9wYWdlLndhc19sb2dpbl9zdWNjZXNzZnVsKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coXCJMb2dnZWQgaW4hIEdlbmVyYXRpbmcgdG9rZW4uLi5cIilcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5ld19sb2dpbl9wYWdlLmlzX2V4cGlyZWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJMb2dpbiBwYWdlIGV4cGlyZWRcIilcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IGRlbGF5KDEwMDApXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsgc2Vzc2lvbiB9ID0gYXdhaXQga3lcbiAgICAgICAgLnBvc3Q8RW5kcG9pbnRSZXNwb25zZVtcInNlc3Npb25zL2xvZ2luX3BhZ2UvZXhjaGFuZ2VfZm9yX2NsaV9zZXNzaW9uXCJdPihcbiAgICAgICAgICBcInNlc3Npb25zL2xvZ2luX3BhZ2UvZXhjaGFuZ2VfZm9yX2NsaV9zZXNzaW9uXCIsXG4gICAgICAgICAge1xuICAgICAgICAgICAganNvbjoge1xuICAgICAgICAgICAgICBsb2dpbl9wYWdlX2lkOiBsb2dpbl9wYWdlLmxvZ2luX3BhZ2VfaWQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7bG9naW5fcGFnZS5sb2dpbl9wYWdlX2F1dGhfdG9rZW59YCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgKVxuICAgICAgICAuanNvbigpXG5cbiAgICAgIGNsaUNvbmZpZy5zZXQoXCJzZXNzaW9uVG9rZW5cIiwgc2Vzc2lvbi50b2tlbilcblxuICAgICAgY29uc29sZS5sb2coXCJSZWFkeSB0byB1c2UhXCIpXG4gICAgfSlcbn1cbiIsICJpbXBvcnQgeyBnZXRSZWdpc3RyeUFwaVVybCB9IGZyb20gXCJsaWIvY2xpLWNvbmZpZ1wiXG5pbXBvcnQga3ksIHsgdHlwZSBBZnRlclJlc3BvbnNlSG9vayB9IGZyb20gXCJreVwiXG5cbmNvbnN0IHByZXR0eVJlc3BvbnNlRXJyb3JIb29rOiBBZnRlclJlc3BvbnNlSG9vayA9IGFzeW5jIChcbiAgX3JlcXVlc3QsXG4gIF9vcHRpb25zLFxuICByZXNwb25zZSxcbikgPT4ge1xuICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGVycm9yRGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRkFJTCBbJHtyZXNwb25zZS5zdGF0dXN9XTogJHtfcmVxdWVzdC5tZXRob2R9ICR7XG4gICAgICAgICAgbmV3IFVSTChfcmVxdWVzdC51cmwpLnBhdGhuYW1lXG4gICAgICAgIH0gXFxuXFxuICR7SlNPTi5zdHJpbmdpZnkoZXJyb3JEYXRhLCBudWxsLCAyKX1gLFxuICAgICAgKVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vaWdub3JlLCBhbGxvdyB0aGUgZXJyb3IgdG8gYmUgdGhyb3duXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBnZXRLeSA9ICgpID0+IHtcbiAgcmV0dXJuIGt5LmNyZWF0ZSh7XG4gICAgcHJlZml4VXJsOiBnZXRSZWdpc3RyeUFwaVVybCgpLFxuICAgIGhvb2tzOiB7XG4gICAgICBhZnRlclJlc3BvbnNlOiBbcHJldHR5UmVzcG9uc2VFcnJvckhvb2tdLFxuICAgIH0sXG4gIH0pXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5cbmV4cG9ydCBjb25zdCByZWdpc3RlckF1dGhMb2dvdXQgPSAocHJvZ3JhbTogQ29tbWFuZCkgPT4ge1xuICBwcm9ncmFtLmNvbW1hbmRzXG4gICAgLmZpbmQoKGMpID0+IGMubmFtZSgpID09PSBcImF1dGhcIikhXG4gICAgLmNvbW1hbmQoXCJsb2dvdXRcIilcbiAgICAuZGVzY3JpcHRpb24oXCJMb2dvdXQgZnJvbSByZWdpc3RyeVwiKVxuICAgIC5hY3Rpb24oKGFyZ3MpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKFwibG9nb3V0XCIpXG4gICAgfSlcbn1cbiIsICJpbXBvcnQgdHlwZSB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCJcblxuZXhwb3J0IGNvbnN0IHJlZ2lzdGVyQXV0aCA9IChwcm9ncmFtOiBDb21tYW5kKSA9PiB7XG4gIHByb2dyYW0uY29tbWFuZChcImF1dGhcIikuZGVzY3JpcHRpb24oXCJMb2dpbi9sb2dvdXRcIilcbn1cbiIsICJpbXBvcnQgdHlwZSB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCJcblxuZXhwb3J0IGNvbnN0IHJlZ2lzdGVyQ29uZmlnID0gKHByb2dyYW06IENvbW1hbmQpID0+IHtcbiAgcHJvZ3JhbS5jb21tYW5kKFwiY29uZmlnXCIpLmRlc2NyaXB0aW9uKFwiTWFuYWdlIHRzY2lyY3VpdCBDTEkgY29uZmlndXJhdGlvblwiKVxufVxuIiwgImltcG9ydCB0eXBlIHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIlxuaW1wb3J0IHsgY2xpQ29uZmlnIH0gZnJvbSBcImxpYi9jbGktY29uZmlnXCJcblxuZXhwb3J0IGNvbnN0IHJlZ2lzdGVyQ29uZmlnUHJpbnQgPSAocHJvZ3JhbTogQ29tbWFuZCkgPT4ge1xuICBwcm9ncmFtLmNvbW1hbmRzXG4gICAgLmZpbmQoKGMpID0+IGMubmFtZSgpID09PSBcImNvbmZpZ1wiKSFcbiAgICAuY29tbWFuZChcInByaW50XCIpXG4gICAgLmRlc2NyaXB0aW9uKFwiUHJpbnQgdGhlIGN1cnJlbnQgY29uZmlnXCIpXG4gICAgLmFjdGlvbigoKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShjbGlDb25maWcuYWxsLCBudWxsLCAyKSlcbiAgICB9KVxufVxuIiwgImltcG9ydCB0eXBlIHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIlxuaW1wb3J0IHsgZ2V0S3kgfSBmcm9tIFwibGliL3JlZ2lzdHJ5LWFwaS9nZXQta3lcIlxuaW1wb3J0ICogYXMgZnMgZnJvbSBcIm5vZGU6ZnNcIlxuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCJcblxuZXhwb3J0IGNvbnN0IHJlZ2lzdGVyQ2xvbmUgPSAocHJvZ3JhbTogQ29tbWFuZCkgPT4ge1xuICBwcm9ncmFtXG4gICAgLmNvbW1hbmQoXCJjbG9uZVwiKVxuICAgIC5kZXNjcmlwdGlvbihcIkNsb25lIGEgc25pcHBldCBmcm9tIHRoZSByZWdpc3RyeVwiKVxuICAgIC5hcmd1bWVudChcIjxzbmlwcGV0PlwiLCBcIlNuaXBwZXQgdG8gY2xvbmUgKGUuZy4gYXV0aG9yL3NuaXBwZXROYW1lKVwiKVxuICAgIC5hY3Rpb24oYXN5bmMgKHNuaXBwZXRQYXRoOiBzdHJpbmcpID0+IHtcbiAgICAgIGxldCBhdXRob3I6IHN0cmluZ1xuICAgICAgbGV0IHNuaXBwZXROYW1lOiBzdHJpbmdcbiAgICAgIGlmICghc25pcHBldFBhdGguc3RhcnRzV2l0aChcIkB0c2NpL1wiKSAmJiBzbmlwcGV0UGF0aC5pbmNsdWRlcyhcIi9cIikpIHtcbiAgICAgICAgO1thdXRob3IsIHNuaXBwZXROYW1lXSA9IHNuaXBwZXRQYXRoLnNwbGl0KFwiL1wiKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgdHJpbW1lZFBhdGggPSBzbmlwcGV0UGF0aC5yZXBsYWNlKFwiQHRzY2kvXCIsIFwiXCIpXG4gICAgICAgIGNvbnN0IGZpcnN0RG90SW5kZXggPSB0cmltbWVkUGF0aC5pbmRleE9mKFwiLlwiKVxuICAgICAgICBhdXRob3IgPSB0cmltbWVkUGF0aC5zbGljZSgwLCBmaXJzdERvdEluZGV4KVxuICAgICAgICBzbmlwcGV0TmFtZSA9IHRyaW1tZWRQYXRoLnNsaWNlKGZpcnN0RG90SW5kZXggKyAxKVxuICAgICAgfVxuXG4gICAgICBpZiAoIWF1dGhvciB8fCAhc25pcHBldE5hbWUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBcIkludmFsaWQgc25pcHBldCBwYXRoLiBVc2UgZm9ybWF0OiBhdXRob3Ivc25pcHBldE5hbWUsIGF1dGhvci5zbmlwcGV0TmFtZSBvciBAdHNjaS9hdXRob3Iuc25pcHBldE5hbWVcIixcbiAgICAgICAgKVxuICAgICAgICBwcm9jZXNzLmV4aXQoMSlcbiAgICAgIH1cblxuICAgICAgY29uc3Qga3kgPSBnZXRLeSgpXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBDbG9uaW5nICR7YXV0aG9yfS8ke3NuaXBwZXROYW1lfS4uLmApXG5cbiAgICAgICAgY29uc3QgcGFja2FnZUZpbGVMaXN0ID0gYXdhaXQga3lcbiAgICAgICAgICAucG9zdDx7XG4gICAgICAgICAgICBwYWNrYWdlX2ZpbGVzOiBBcnJheTx7XG4gICAgICAgICAgICAgIHBhY2thZ2VfZmlsZV9pZDogc3RyaW5nXG4gICAgICAgICAgICAgIHBhY2thZ2VfcmVsZWFzZV9pZDogc3RyaW5nXG4gICAgICAgICAgICAgIGZpbGVfcGF0aDogc3RyaW5nXG4gICAgICAgICAgICAgIGNyZWF0ZWRfYXQ6IHN0cmluZ1xuICAgICAgICAgICAgfT5cbiAgICAgICAgICB9PihcInBhY2thZ2VfZmlsZXMvbGlzdFwiLCB7XG4gICAgICAgICAgICBqc29uOiB7XG4gICAgICAgICAgICAgIHBhY2thZ2VfbmFtZTogYCR7YXV0aG9yfS8ke3NuaXBwZXROYW1lfWAsXG4gICAgICAgICAgICAgIHVzZV9sYXRlc3RfdmVyc2lvbjogdHJ1ZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSlcbiAgICAgICAgICAuanNvbigpXG5cbiAgICAgICAgLy8gQ3JlYXRlIGRpcmVjdG9yeSBpZiBpdCBkb2Vzbid0IGV4aXN0XG4gICAgICAgIGNvbnN0IGRpclBhdGggPSBgLi8ke2F1dGhvcn0uJHtzbmlwcGV0TmFtZX1gXG4gICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhkaXJQYXRoKSkge1xuICAgICAgICAgIGZzLm1rZGlyU3luYyhkaXJQYXRoKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRG93bmxvYWQgZWFjaCBmaWxlIHRoYXQgZG9lc24ndCBzdGFydCB3aXRoIGRpc3QvXG4gICAgICAgIGZvciAoY29uc3QgZmlsZUluZm8gb2YgcGFja2FnZUZpbGVMaXN0LnBhY2thZ2VfZmlsZXMpIHtcbiAgICAgICAgICBjb25zdCBmaWxlUGF0aCA9IGZpbGVJbmZvLmZpbGVfcGF0aC5zdGFydHNXaXRoKFwiL1wiKVxuICAgICAgICAgICAgPyBmaWxlSW5mby5maWxlX3BhdGguc2xpY2UoMSlcbiAgICAgICAgICAgIDogZmlsZUluZm8uZmlsZV9wYXRoXG5cbiAgICAgICAgICBpZiAoZmlsZVBhdGguc3RhcnRzV2l0aChcImRpc3QvXCIpKSBjb250aW51ZVxuXG4gICAgICAgICAgY29uc3QgZmlsZUNvbnRlbnQgPSBhd2FpdCBreVxuICAgICAgICAgICAgLnBvc3Q8e1xuICAgICAgICAgICAgICBwYWNrYWdlX2ZpbGU6IHtcbiAgICAgICAgICAgICAgICBjb250ZW50X3RleHQ6IHN0cmluZ1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9PihcInBhY2thZ2VfZmlsZXMvZ2V0XCIsIHtcbiAgICAgICAgICAgICAganNvbjoge1xuICAgICAgICAgICAgICAgIHBhY2thZ2VfbmFtZTogYCR7YXV0aG9yfS8ke3NuaXBwZXROYW1lfWAsXG4gICAgICAgICAgICAgICAgZmlsZV9wYXRoOiBmaWxlSW5mby5maWxlX3BhdGgsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmpzb24oKVxuXG4gICAgICAgICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgZmlsZVBhdGgpXG4gICAgICAgICAgY29uc3QgZGlyTmFtZSA9IHBhdGguZGlybmFtZShmdWxsUGF0aClcblxuICAgICAgICAgIC8vIENyZWF0ZSBuZXN0ZWQgZGlyZWN0b3JpZXMgaWYgdGhleSBkb24ndCBleGlzdFxuICAgICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhkaXJOYW1lKSkge1xuICAgICAgICAgICAgZnMubWtkaXJTeW5jKGRpck5hbWUsIHsgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZnMud3JpdGVGaWxlU3luYyhmdWxsUGF0aCwgZmlsZUNvbnRlbnQucGFja2FnZV9maWxlLmNvbnRlbnRfdGV4dClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnNvbGUubG9nKGBTdWNjZXNzZnVsbHkgY2xvbmVkIHRvIC4vJHthdXRob3J9LiR7c25pcHBldE5hbWV9L2ApXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gY2xvbmUgc25pcHBldDpcIiwgZXJyb3IubWVzc2FnZSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRmFpbGVkIHRvIGNsb25lIHNuaXBwZXQ6XCIsIGVycm9yKVxuICAgICAgICB9XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKVxuICAgICAgfVxuICAgIH0pXG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7QUFDQSxTQUFTLGVBQWU7OztBQ0F4QixZQUFZQSxXQUFVOzs7QUNEdEIsWUFBWSxRQUFRO0FBQ3BCLFlBQVksVUFBVTtBQUN0QixZQUFZLFFBQVE7QUFRcEIsZUFBc0IsaUNBQWlDLGFBQXFCO0FBQzFFLFFBQU0sVUFBYSxnQkFBYSxhQUFhLE9BQU87QUFDcEQsUUFBTSxhQUFnQjtBQUFBLElBQ3BCO0FBQUEsSUFDQTtBQUFBLElBQ0csZ0JBQWE7QUFBQSxJQUNoQjtBQUFBLEVBQ0Y7QUFFQSxRQUFNLFVBQW9CLENBQUM7QUFFM0IsV0FBUyxNQUFNLE1BQWU7QUFDNUIsUUFBTyx1QkFBb0IsSUFBSSxHQUFHO0FBQ2hDLFlBQU0sa0JBQWtCLEtBQUs7QUFDN0IsVUFBSSxtQkFBc0IsbUJBQWdCLGVBQWUsR0FBRztBQUMxRCxjQUFNLGFBQWEsZ0JBQWdCO0FBQ25DLFlBQUksV0FBVyxXQUFXLFFBQVEsR0FBRztBQUNuQyxrQkFBUSxLQUFLLFVBQVU7QUFBQSxRQUN6QjtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQ0EsSUFBRyxnQkFBYSxNQUFNLEtBQUs7QUFBQSxFQUM3QjtBQUVBLFFBQU0sVUFBVTtBQUVoQixNQUFJLGNBQW1CLGFBQVEsV0FBVztBQUMxQyxTQUFPLGdCQUFxQixXQUFNLFdBQVcsRUFBRSxNQUFNO0FBQ25ELFFBQU8sY0FBZ0IsVUFBSyxhQUFhLGNBQWMsQ0FBQyxHQUFHO0FBQ3pEO0FBQUEsSUFDRjtBQUNBLGtCQUFtQixhQUFRLFdBQVc7QUFBQSxFQUN4QztBQUVBLGFBQVcsY0FBYyxTQUFTO0FBQ2hDLFVBQU0sQ0FBQyxPQUFPLElBQUksSUFBSSxXQUFXLFFBQVEsVUFBVSxFQUFFLEVBQUUsTUFBTSxHQUFHO0FBQ2hFLFFBQUk7QUFDRixZQUFNLFdB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QUEsTUFDdEI7QUFHQSxpQkFBVyxZQUFZLGdCQUFnQixlQUFlO0FBQ3BELGNBQU0sV0FBVyxTQUFTLFVBQVUsV0FBVyxHQUFHLElBQzlDLFNBQVMsVUFBVSxNQUFNLENBQUMsSUFDMUIsU0FBUztBQUViLFlBQUksU0FBUyxXQUFXLE9BQU8sRUFBRztBQUVsQyxjQUFNLGNBQWMsTUFBTUEsSUFDdkIsS0FJRSxxQkFBcUI7QUFBQSxVQUN0QixNQUFNO0FBQUEsWUFDSixjQUFjLEdBQUcsTUFBTSxJQUFJLFdBQVc7QUFBQSxZQUN0QyxXQUFXLFNBQVM7QUFBQSxVQUN0QjtBQUFBLFFBQ0YsQ0FBQyxFQUNBLEtBQUs7QUFFUixjQUFNLFdBQWdCLFdBQUssU0FBUyxRQUFRO0FBQzVDLGNBQU0sVUFBZSxjQUFRLFFBQVE7QUFHckMsWUFBSSxDQUFJLGVBQVcsT0FBTyxHQUFHO0FBQzNCLFVBQUcsY0FBVSxTQUFTLEVBQUUsV0FBVyxLQUFLLENBQUM7QUFBQSxRQUMzQztBQUVBLFFBQUcsa0JBQWMsVUFBVSxZQUFZLGFBQWEsWUFBWTtBQUFBLE1BQ2xFO0FBRUEsY0FBUSxJQUFJLDRCQUE0QixNQUFNLElBQUksV0FBVyxHQUFHO0FBQUEsSUFDbEUsU0FBUyxPQUFPO0FBQ2QsVUFBSSxpQkFBaUIsT0FBTztBQUMxQixnQkFBUSxNQUFNLDRCQUE0QixNQUFNLE9BQU87QUFBQSxNQUN6RCxPQUFPO0FBQ0wsZ0JBQVEsTUFBTSw0QkFBNEIsS0FBSztBQUFBLE1BQ2pEO0FBQ0EsY0FBUSxLQUFLLENBQUM7QUFBQSxJQUNoQjtBQUFBLEVBQ0YsQ0FBQztBQUNMOzs7QWZ6RkEsU0FBUyxrQkFBa0I7QUFFM0IsT0FBTyxZQUFZO0FBRW5CLElBQU0sVUFBVSxJQUFJLFFBQVE7QUFFNUIsUUFDRyxLQUFLLE1BQU0sRUFDWCxZQUFZLHVDQUF1QyxFQUduRCxRQUFRLE9BQU8sSUFBSSxnQkFBSSxTQUFTLE9BQU8sS0FBSyxnQkFBSSxPQUFPO0FBRTFELFlBQVksT0FBTztBQUNuQixjQUFjLE9BQU87QUFFckIsYUFBYSxPQUFPO0FBQ3BCLGtCQUFrQixPQUFPO0FBQ3pCLG1CQUFtQixPQUFPO0FBRTFCLGVBQWUsT0FBTztBQUN0QixvQkFBb0IsT0FBTztBQUUzQixJQUFJLFFBQVEsS0FBSyxXQUFXLEdBQUc7QUFDN0IsYUFBVyxTQUFTLFFBQVEsSUFBSTtBQUNsQyxPQUFPO0FBQ0wsVUFBUSxNQUFNO0FBQ2hCOyIsCiAgIm5hbWVzIjogWyJwYXRoIiwgImZzIiwgInBhdGgiLCAicmVzb2x2ZSIsICJwYXRoIiwgImZzIiwgInByb2dyYW0iLCAia3kiLCAicHJvZ3JhbSIsICJreSIsICJwcm9ncmFtIiwgInByb2dyYW0iLCAicHJvZ3JhbSIsICJwcm9ncmFtIiwgImZzIiwgInBhdGgiLCAicHJvZ3JhbSIsICJreSJdCn0K