ember-scoped-css 0.24.2 → 1.0.0

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.
Files changed (37) hide show
  1. package/README.md +110 -115
  2. package/declarations/lib/path/template-transform-paths.d.ts.map +1 -1
  3. package/declarations/lib/path/utils.d.ts.map +1 -1
  4. package/declarations/lib/path/utils.paths.test.d.ts +0 -3
  5. package/declarations/lib/path/utils.paths.test.d.ts.map +1 -1
  6. package/dist/cjs/babel-plugin.cjs +2 -72
  7. package/dist/cjs/index.cjs +206 -390
  8. package/dist/cjs/template-plugin.cjs +201 -120
  9. package/package.json +5 -18
  10. package/src/build/babel-plugin.js +2 -38
  11. package/src/build/index.js +4 -0
  12. package/src/build/scoped-css-unplugin.js +31 -193
  13. package/src/build/template-plugin.js +124 -9
  14. package/src/lib/{rewriteCss.js → css/rewrite.js} +2 -2
  15. package/src/lib/css/utils.js +74 -3
  16. package/src/lib/path/hash-from-absolute-path.test.ts +2 -24
  17. package/src/lib/path/template-transform-paths.js +0 -15
  18. package/src/lib/path/template-transform-paths.test.ts +8 -69
  19. package/src/lib/path/utils.appPath.test.ts +4 -15
  20. package/src/lib/path/utils.findWorkspacePath.test.ts +16 -22
  21. package/src/lib/path/utils.hashFrom.test.ts +8 -8
  22. package/src/lib/path/utils.isRelevantFile.test.ts +9 -29
  23. package/src/lib/path/utils.js +2 -79
  24. package/src/lib/path/utils.paths.test.ts +1 -4
  25. package/src/lib/request.js +40 -0
  26. package/src/lib/rewriteHbs.js +1 -1
  27. package/dist/cjs/app-css-loader.cjs +0 -531
  28. package/dist/cjs/ember-classic-support.cjs +0 -708
  29. package/src/build/app-css-livereload-loader.js +0 -119
  30. package/src/build/app-css-loader.js +0 -38
  31. package/src/build/ember-classic-support.js +0 -293
  32. package/src/lib/findCssInJs.js +0 -29
  33. package/src/lib/getClassesTagsFromCss.js +0 -48
  34. package/src/lib/getImportedCssFiles.js +0 -19
  35. package/src/lib/isInsideGlobal.js +0 -8
  36. package/src/lib/replaceGlimmerAst.js +0 -63
  37. package/src/lib/replaceHbsInJs.js +0 -113
@@ -11,9 +11,9 @@ var __export = (target, all) => {
11
11
  };
12
12
  var __copyProps = (to, from, except, desc) => {
13
13
  if (from && typeof from === "object" || typeof from === "function") {
14
- for (let key of __getOwnPropNames(from))
15
- if (!__hasOwnProp.call(to, key) && key !== except)
16
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ for (let key2 of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key2) && key2 !== except)
16
+ __defProp(to, key2, { get: () => from[key2], enumerable: !(desc = __getOwnPropDesc(from, key2)) || desc.enumerable });
17
17
  }
18
18
  return to;
19
19
  };
@@ -34,65 +34,15 @@ __export(template_plugin_exports, {
34
34
  });
35
35
  module.exports = __toCommonJS(template_plugin_exports);
36
36
 
37
+ // src/lib/css/rewrite.js
38
+ var import_postcss2 = __toESM(require("postcss"), 1);
39
+ var import_postcss_selector_parser2 = __toESM(require("postcss-selector-parser"), 1);
40
+
37
41
  // src/lib/css/utils.js
38
42
  var import_fs = require("fs");
39
-
40
- // src/lib/getClassesTagsFromCss.js
41
43
  var import_postcss = __toESM(require("postcss"), 1);
42
44
  var import_postcss_selector_parser = __toESM(require("postcss-selector-parser"), 1);
43
45
 
44
- // src/lib/isInsideGlobal.js
45
- function isInsideGlobal(node, func) {
46
- const parent = node.parent;
47
- if (!parent) return false;
48
- if (parent.type === "pseudo" && parent.value === ":global") return true;
49
- return isInsideGlobal(parent, func);
50
- }
51
-
52
- // src/lib/getClassesTagsFromCss.js
53
- function getClassesAndTags(sel, classes, tags) {
54
- const transform = (sls) => {
55
- sls.walk((selector) => {
56
- if (selector.type === "class" && !isInsideGlobal(selector)) {
57
- classes.add(selector.value);
58
- } else if (selector.type === "tag" && !isInsideGlobal(selector)) {
59
- tags.add(selector.value);
60
- }
61
- });
62
- };
63
- (0, import_postcss_selector_parser.default)(transform).processSync(sel);
64
- }
65
- function getClassesTagsFromCss(css) {
66
- const classes = /* @__PURE__ */ new Set();
67
- const tags = /* @__PURE__ */ new Set();
68
- const ast = import_postcss.default.parse(css);
69
- ast.walk((node) => {
70
- if (node.type === "rule") {
71
- getClassesAndTags(node.selector, classes, tags);
72
- }
73
- });
74
- return { classes, tags };
75
- }
76
-
77
- // src/lib/css/utils.js
78
- function getCSSInfo(cssPath) {
79
- if (!(0, import_fs.existsSync)(cssPath)) {
80
- return null;
81
- }
82
- let css = (0, import_fs.readFileSync)(cssPath, "utf8");
83
- let result = getClassesTagsFromCss(css);
84
- return result;
85
- }
86
-
87
- // src/lib/path/template-transform-paths.js
88
- var import_node_path2 = __toESM(require("node:path"), 1);
89
-
90
- // src/lib/path/utils.js
91
- var import_node_assert = __toESM(require("node:assert"), 1);
92
- var import_node_fs = __toESM(require("node:fs"), 1);
93
- var import_node_module = require("node:module");
94
- var import_node_path = __toESM(require("node:path"), 1);
95
-
96
46
  // src/lib/path/md5.js
97
47
  function safeAdd(x, y) {
98
48
  var lsw = (x & 65535) + (y & 65535);
@@ -230,22 +180,22 @@ function rstr2binl(input) {
230
180
  function rstrMD5(s) {
231
181
  return binl2rstr(binlMD5(rstr2binl(s), s.length * 8));
232
182
  }
233
- function rstrHMACMD5(key, data) {
183
+ function rstrHMACMD5(key2, data) {
234
184
  var i;
235
- var bkey = rstr2binl(key);
185
+ var bkey = rstr2binl(key2);
236
186
  var ipad = [];
237
187
  var opad = [];
238
- var hash2;
188
+ var hash3;
239
189
  ipad[15] = opad[15] = void 0;
240
190
  if (bkey.length > 16) {
241
- bkey = binlMD5(bkey, key.length * 8);
191
+ bkey = binlMD5(bkey, key2.length * 8);
242
192
  }
243
193
  for (i = 0; i < 16; i += 1) {
244
194
  ipad[i] = bkey[i] ^ 909522486;
245
195
  opad[i] = bkey[i] ^ 1549556828;
246
196
  }
247
- hash2 = binlMD5(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
248
- return binl2rstr(binlMD5(opad.concat(hash2), 512 + 128));
197
+ hash3 = binlMD5(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
198
+ return binl2rstr(binlMD5(opad.concat(hash3), 512 + 128));
249
199
  }
250
200
  function rstr2hex(input) {
251
201
  var hexTab = "0123456789abcdef";
@@ -273,24 +223,123 @@ function rawHMACMD5(k, d) {
273
223
  function hexHMACMD5(k, d) {
274
224
  return rstr2hex(rawHMACMD5(k, d));
275
225
  }
276
- function md5(string, key, raw) {
277
- if (!key) {
226
+ function md5(string, key2, raw) {
227
+ if (!key2) {
278
228
  if (!raw) {
279
229
  return hexMD5(string);
280
230
  }
281
231
  return rawMD5(string);
282
232
  }
283
233
  if (!raw) {
284
- return hexHMACMD5(key, string);
234
+ return hexHMACMD5(key2, string);
235
+ }
236
+ return rawHMACMD5(key2, string);
237
+ }
238
+
239
+ // src/lib/css/utils.js
240
+ function hash(css) {
241
+ return `css-${md5(css)}`;
242
+ }
243
+ function isInsideGlobal(node, func) {
244
+ const parent = node.parent;
245
+ if (!parent) return false;
246
+ if (parent.type === "pseudo" && parent.value === ":global") return true;
247
+ return isInsideGlobal(parent, func);
248
+ }
249
+ function getCSSInfo(cssPath) {
250
+ if (!(0, import_fs.existsSync)(cssPath)) {
251
+ return null;
285
252
  }
286
- return rawHMACMD5(key, string);
253
+ let css = (0, import_fs.readFileSync)(cssPath, "utf8");
254
+ return getCSSContentInfo(css);
255
+ }
256
+ function getCSSContentInfo(css) {
257
+ const classes = /* @__PURE__ */ new Set();
258
+ const tags = /* @__PURE__ */ new Set();
259
+ const ast = import_postcss.default.parse(css);
260
+ ast.walk((node) => {
261
+ if (node.type === "rule") {
262
+ getClassesAndTags(node.selector, classes, tags);
263
+ }
264
+ });
265
+ let id = hash(css);
266
+ return { classes, tags, css, id };
267
+ }
268
+ function getClassesAndTags(sel, classes, tags) {
269
+ const transform = (sls) => {
270
+ sls.walk((selector) => {
271
+ if (selector.type === "class" && !isInsideGlobal(selector)) {
272
+ classes.add(selector.value);
273
+ } else if (selector.type === "tag" && !isInsideGlobal(selector)) {
274
+ tags.add(selector.value);
275
+ }
276
+ });
277
+ };
278
+ (0, import_postcss_selector_parser.default)(transform).processSync(sel);
287
279
  }
288
280
 
281
+ // src/lib/css/rewrite.js
282
+ function rewriteSelector(sel, postfix) {
283
+ const transform = (selectors) => {
284
+ selectors.walk((selector) => {
285
+ if (selector.type === "class" && !isInsideGlobal(selector)) {
286
+ selector.value += "_" + postfix;
287
+ } else if (selector.type === "tag" && !isInsideGlobal(selector)) {
288
+ selector.replaceWith(
289
+ import_postcss_selector_parser2.default.tag({ value: selector.value }),
290
+ import_postcss_selector_parser2.default.className({ value: postfix })
291
+ );
292
+ }
293
+ });
294
+ selectors.walk((selector) => {
295
+ if (selector.type === "pseudo" && selector.value === ":global") {
296
+ selector.replaceWith(...selector.nodes);
297
+ }
298
+ });
299
+ };
300
+ const transformed = (0, import_postcss_selector_parser2.default)(transform).processSync(sel);
301
+ return transformed;
302
+ }
303
+ function isInsideKeyframes(node) {
304
+ const parent = node.parent;
305
+ if (!parent) return false;
306
+ if (parent.type === "atrule" && parent.name === "keyframes") return true;
307
+ return isInsideKeyframes(parent);
308
+ }
309
+ function rewriteCss(css, postfix, fileName, layerName) {
310
+ const layerNameWithDefault = layerName ?? "components";
311
+ const ast = import_postcss2.default.parse(css);
312
+ ast.walk((node) => {
313
+ if (node.type === "rule" && !isInsideKeyframes(node)) {
314
+ node.selector = rewriteSelector(node.selector, postfix);
315
+ }
316
+ });
317
+ const rewrittenCss = ast.toString();
318
+ if (!layerNameWithDefault) {
319
+ return `/* ${fileName} */
320
+ ${rewrittenCss}
321
+ `;
322
+ }
323
+ return `/* ${fileName} */
324
+ @layer ${layerNameWithDefault} {
325
+
326
+ ` + rewrittenCss + "\n}\n";
327
+ }
328
+
329
+ // src/lib/path/template-transform-paths.js
330
+ var import_node_path2 = __toESM(require("node:path"), 1);
331
+
332
+ // src/lib/path/utils.js
333
+ var import_node_assert = __toESM(require("node:assert"), 1);
334
+ var import_node_fs = __toESM(require("node:fs"), 1);
335
+ var import_node_module = require("node:module");
336
+ var import_node_path = __toESM(require("node:path"), 1);
337
+
289
338
  // src/lib/path/hash-from-module-path.js
290
- function hash(modulePath) {
339
+ function hash2(modulePath) {
291
340
  return "e" + md5(modulePath).substring(0, 8);
292
341
  }
293
- var hashFromModulePath = hash;
342
+ var hashFromModulePath = hash2;
294
343
 
295
344
  // src/lib/path/utils.js
296
345
  var import_meta = {};
@@ -299,10 +348,6 @@ var ourRequire = globalThis.require ? globalThis.require : here && (0, import_no
299
348
  if (!ourRequire) {
300
349
  ourRequire = require;
301
350
  }
302
- var EMBROIDER_DIR = "node_modules/.embroider";
303
- var EMBROIDER_3_REWRITTEN_APP_PATH = `${EMBROIDER_DIR}/rewritten-app`;
304
- var EMBROIDER_3_REWRITTEN_APP_ASSETS = `${EMBROIDER_3_REWRITTEN_APP_PATH}/assets`;
305
- var EMBROIDER_3_REWRITTEN_PACKAGES = `${EMBROIDER_DIR}/rewritten-packages`;
306
351
  var IRRELEVANT_PATHS = ["node_modules/.pnpm", "__vite-"];
307
352
  var UNSUPPORTED_DIRECTORIES = /* @__PURE__ */ new Set(["tests"]);
308
353
  var CWD = process.cwd();
@@ -334,24 +379,11 @@ function withoutExtension(filePath) {
334
379
  return import_node_path.default.join(parsed.dir, parsed.name);
335
380
  }
336
381
  function isRelevantFile(fileName, { additionalRoots, cwd }) {
382
+ if (fileName.startsWith("/testem")) return false;
337
383
  if (fileName.startsWith("\0")) return false;
338
384
  if (fileName.match(/^[a-zA-Z]/)) return false;
339
385
  if (fileName.startsWith("/@embroider")) return false;
340
386
  if (IRRELEVANT_PATHS.some((i) => fileName.includes(i))) return false;
341
- if (fileName.includes("/node_modules/")) {
342
- if (!fileName.includes(EMBROIDER_DIR)) {
343
- return false;
344
- }
345
- if (fileName.includes(EMBROIDER_3_REWRITTEN_PACKAGES)) {
346
- return false;
347
- }
348
- if (fileName.includes(EMBROIDER_3_REWRITTEN_APP_ASSETS)) {
349
- if (fileName.endsWith(`${EMBROIDER_3_REWRITTEN_APP_ASSETS}/tests.js`)) {
350
- return false;
351
- }
352
- return false;
353
- }
354
- }
355
387
  let workspace = findWorkspacePath(fileName);
356
388
  (0, import_node_assert.default)(cwd, `cwd was not passed to isRelevantFile`);
357
389
  let ourWorkspace = findWorkspacePath(cwd);
@@ -383,10 +415,6 @@ function appPath(sourcePath) {
383
415
  let name = moduleName(sourcePath);
384
416
  let packageRelative = sourcePath.replace(workspacePath, "");
385
417
  packageRelative = packageRelative.replace(`/app/`, `/`);
386
- packageRelative = packageRelative.replace(
387
- `${EMBROIDER_3_REWRITTEN_APP_PATH}/`,
388
- "/"
389
- );
390
418
  packageRelative = packageRelative.replace("//", "/");
391
419
  let localPackagerStylePath = packageScopedPathToModulePath(packageRelative);
392
420
  return `${name}${localPackagerStylePath}`;
@@ -405,9 +433,6 @@ function getSeen(sourcePath) {
405
433
  }
406
434
  function findWorkspacePath(sourcePath, options) {
407
435
  let cwd = options?.cwd ?? CWD;
408
- if (sourcePath.includes(EMBROIDER_3_REWRITTEN_APP_PATH)) {
409
- sourcePath = sourcePath.split(EMBROIDER_3_REWRITTEN_APP_PATH)[0];
410
- }
411
436
  if (sourcePath.endsWith("/")) {
412
437
  sourcePath = sourcePath.replace(/\/$/, "");
413
438
  }
@@ -448,15 +473,6 @@ var MANIFEST_CACHE = /* @__PURE__ */ new Map();
448
473
  function moduleName(sourcePath) {
449
474
  const workspace = findWorkspacePath(sourcePath);
450
475
  const manifest = getManifest(workspace);
451
- if (manifest["ember-addon"]) {
452
- return manifest.name;
453
- }
454
- let environmentJS = import_node_path.default.join(workspace, "config/environment.js");
455
- if (import_node_fs.default.existsSync(environmentJS)) {
456
- const envFn = ourRequire(environmentJS);
457
- const env = envFn("ember-scoped-css");
458
- return env.modulePrefix || manifest.name;
459
- }
460
476
  return manifest.name;
461
477
  }
462
478
  function getManifest(workspace) {
@@ -489,19 +505,19 @@ function fixFilename(filename) {
489
505
  let candidatePath = import_node_path2.default.join(workspace, "app", relative);
490
506
  return candidatePath;
491
507
  }
492
- if (fileName.includes("/node_modules/.embroider/rewritten-app/")) {
493
- let candidatePath = fileName.replace(
494
- "/node_modules/.embroider/rewritten-app/",
495
- "/app/"
496
- );
497
- return candidatePath;
498
- }
499
508
  if (!fileName.includes(workspace)) {
500
509
  return fileName;
501
510
  }
502
511
  return fileName;
503
512
  }
504
513
 
514
+ // src/lib/request.js
515
+ var key = "styles.ember-scoped.css";
516
+ var separator = "____";
517
+ function makeRequest(postfix, cssId, cssContent) {
518
+ return `./${postfix}${separator}${cssId}${separator}${key}?css=${encodeURIComponent(cssContent)}`;
519
+ }
520
+
505
521
  // src/lib/rewriteHbs.js
506
522
  var import_ember_template_recast = __toESM(require("ember-template-recast"), 1);
507
523
 
@@ -588,7 +604,7 @@ function templatePlugin({ classes, tags, postfix }) {
588
604
  if (cssClass) {
589
605
  const textNode = import_ember_template_recast.default.builders.text(renameClass(cssClass, postfix));
590
606
  const parent = stack[stack.length - 1];
591
- if (parent.type === "AttrNode") {
607
+ if (parent?.type === "AttrNode") {
592
608
  parent.quoteType = '"';
593
609
  }
594
610
  return textNode;
@@ -621,24 +637,44 @@ var noopPlugin = {
621
637
  };
622
638
  function createPlugin(config) {
623
639
  return function scopedCss(env) {
640
+ let cwd = process.cwd();
624
641
  let isRelevant = isRelevantFile(env.filename, {
625
642
  additionalRoots: config.additionalRoots,
626
- cwd: process.cwd()
643
+ cwd
627
644
  });
628
645
  if (!isRelevant) {
629
646
  return noopPlugin;
630
647
  }
631
648
  let absolutePath = fixFilename(env.filename);
632
649
  let modulePath = appPath(absolutePath);
650
+ let postfix = hashFromModulePath(modulePath);
651
+ let scopedTags = /* @__PURE__ */ new Set();
652
+ let scopedClasses = /* @__PURE__ */ new Set();
653
+ function addInfo(info2) {
654
+ for (let item of info2.tags) {
655
+ scopedTags.add(item);
656
+ }
657
+ for (let item of info2.classes) {
658
+ scopedClasses.add(item);
659
+ }
660
+ }
633
661
  let cssPath = cssPathFor(absolutePath);
634
662
  let info = getCSSInfo(cssPath);
635
- let postfix = hashFromModulePath(modulePath);
636
- if (!info) {
637
- return noopPlugin;
663
+ if (info) {
664
+ addInfo(info);
665
+ let localCssPath = cssPath.replace(cwd + "/", "");
666
+ let scopedCss2 = rewriteCss(
667
+ info.css,
668
+ postfix,
669
+ localCssPath,
670
+ config.layerName
671
+ );
672
+ let cssRequest = makeRequest(postfix, info.id, scopedCss2);
673
+ env.meta.jsutils.importForSideEffect(cssRequest);
638
674
  }
639
675
  let visitors = templatePlugin({
640
- classes: info.classes,
641
- tags: info.tags,
676
+ classes: scopedClasses,
677
+ tags: scopedTags,
642
678
  postfix
643
679
  });
644
680
  return {
@@ -646,13 +682,45 @@ function createPlugin(config) {
646
682
  visitor: {
647
683
  // Stack Manager
648
684
  ...visitors,
685
+ /**
686
+ * We have to eagerly get the <style scoped> contents, so we can pre-parse
687
+ * the tags and classes to then pass to the other visitors so that they can
688
+ * appropriately change matching classes / tags.
689
+ */
690
+ Template(node) {
691
+ let styleTag = node.body.find(
692
+ (n) => n.type === "ElementNode" && n.tag === "style"
693
+ );
694
+ if (hasScopedAttribute(styleTag)) {
695
+ let css = textContent(styleTag);
696
+ let info2 = getCSSContentInfo(css);
697
+ let localCssPath = `<inline>/` + cssPath.replace(cwd + "/", "");
698
+ let scopedCss2 = rewriteCss(
699
+ info2.css,
700
+ postfix,
701
+ localCssPath,
702
+ config.layerName
703
+ );
704
+ addInfo(info2);
705
+ let cssRequest = makeRequest(postfix, info2.id, scopedCss2);
706
+ env.meta.jsutils.importForSideEffect(cssRequest);
707
+ }
708
+ },
649
709
  // Visitors broken out like this so we can conditionally
650
710
  // debug based on file path.
651
711
  AttrNode(...args) {
652
712
  return visitors.AttrNode(...args);
653
713
  },
654
- ElementNode(...args) {
655
- return visitors.ElementNode(...args);
714
+ ElementNode(node, walker) {
715
+ visitors.ElementNode(node, walker);
716
+ if (hasScopedAttribute(node)) {
717
+ if (walker.parent?.node.type !== "Template") {
718
+ throw new Error(
719
+ "<style scoped> tags must be at the root of the template, they cannot be nested"
720
+ );
721
+ }
722
+ return null;
723
+ }
656
724
  },
657
725
  MustacheStatement(...args) {
658
726
  return visitors.MustacheStatement(...args);
@@ -664,8 +732,21 @@ function createPlugin(config) {
664
732
  };
665
733
  };
666
734
  }
735
+ var SCOPED_ATTRIBUTE_NAME = "scoped";
736
+ function hasScopedAttribute(node) {
737
+ if (!node) return;
738
+ if (node.tag !== "style") return;
739
+ if (node.type !== "ElementNode") return;
740
+ return node.attributes.some(
741
+ (attribute) => attribute.name === SCOPED_ATTRIBUTE_NAME
742
+ );
743
+ }
744
+ function textContent(node) {
745
+ let textChildren = node.children.filter((c) => c.type === "TextNode");
746
+ return textChildren.map((c) => c.chars).join("");
747
+ }
667
748
  // Annotate the CommonJS export names for ESM import in node:
668
749
  0 && (module.exports = {
669
750
  createPlugin
670
751
  });
671
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2J1aWxkL3RlbXBsYXRlLXBsdWdpbi5qcyIsICIuLi8uLi9zcmMvbGliL2Nzcy91dGlscy5qcyIsICIuLi8uLi9zcmMvbGliL2dldENsYXNzZXNUYWdzRnJvbUNzcy5qcyIsICIuLi8uLi9zcmMvbGliL2lzSW5zaWRlR2xvYmFsLmpzIiwgIi4uLy4uL3NyYy9saWIvcGF0aC90ZW1wbGF0ZS10cmFuc2Zvcm0tcGF0aHMuanMiLCAiLi4vLi4vc3JjL2xpYi9wYXRoL3V0aWxzLmpzIiwgIi4uLy4uL3NyYy9saWIvcGF0aC9tZDUuanMiLCAiLi4vLi4vc3JjL2xpYi9wYXRoL2hhc2gtZnJvbS1tb2R1bGUtcGF0aC5qcyIsICIuLi8uLi9zcmMvbGliL3Jld3JpdGVIYnMuanMiLCAiLi4vLi4vc3JjL2xpYi9yZW5hbWVDbGFzcy5qcyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAZ2xpbW1lci9zeW50YXgnKS5BU1RQbHVnaW59IEFTVFBsdWdpblxuICogQHR5cGVkZWYge2ltcG9ydCgnQGdsaW1tZXIvc3ludGF4JykuQVNUUGx1Z2luRW52aXJvbm1lbnR9IEFTVFBsdWdpbkVudmlyb25tZW50XG4gKlxuICovXG5cbmltcG9ydCB7IGdldENTU0luZm8gfSBmcm9tICcuLi9saWIvY3NzL3V0aWxzLmpzJztcbmltcG9ydCB7IGZpeEZpbGVuYW1lIH0gZnJvbSAnLi4vbGliL3BhdGgvdGVtcGxhdGUtdHJhbnNmb3JtLXBhdGhzLmpzJztcbmltcG9ydCB7XG4gIGFwcFBhdGgsXG4gIGNzc1BhdGhGb3IsXG4gIGhhc2hGcm9tTW9kdWxlUGF0aCxcbiAgaXNSZWxldmFudEZpbGUsXG59IGZyb20gJy4uL2xpYi9wYXRoL3V0aWxzLmpzJztcbmltcG9ydCB7IHRlbXBsYXRlUGx1Z2luIH0gZnJvbSAnLi4vbGliL3Jld3JpdGVIYnMuanMnO1xuXG5jb25zdCBub29wUGx1Z2luID0ge1xuICBuYW1lOiAnZW1iZXItc2NvcGVkLWNzczpub29wJyxcbiAgdmlzaXRvcjoge30sXG59O1xuXG4vKipcbiAqIEByZXR1cm5zIHtBU1RQbHVnaW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQbHVnaW4oY29uZmlnKSB7XG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge0FTVFBsdWdpbkVudmlyb25tZW50fSBlbnZcbiAgICovXG4gIHJldHVybiBmdW5jdGlvbiBzY29wZWRDc3MoZW52KSB7XG4gICAgbGV0IGlzUmVsZXZhbnQgPSBpc1JlbGV2YW50RmlsZShlbnYuZmlsZW5hbWUsIHtcbiAgICAgIGFkZGl0aW9uYWxSb290czogY29uZmlnLmFkZGl0aW9uYWxSb290cyxcbiAgICAgIGN3ZDogcHJvY2Vzcy5jd2QoKSxcbiAgICB9KTtcblxuICAgIGlmICghaXNSZWxldmFudCkge1xuICAgICAgcmV0dXJuIG5vb3BQbHVnaW47XG4gICAgfVxuXG4gICAgbGV0IGFic29sdXRlUGF0aCA9IGZpeEZpbGVuYW1lKGVudi5maWxlbmFtZSk7XG4gICAgbGV0IG1vZHVsZVBhdGggPSBhcHBQYXRoKGFic29sdXRlUGF0aCk7XG5cbiAgICBsZXQgY3NzUGF0aCA9IGNzc1BhdGhGb3IoYWJzb2x1dGVQYXRoKTtcbiAgICBsZXQgaW5mbyA9IGdldENTU0luZm8oY3NzUGF0aCk7XG4gICAgbGV0IHBvc3RmaXggPSBoYXNoRnJvbU1vZHVsZVBhdGgobW9kdWxlUGF0aCk7XG5cbiAgICBpZiAoIWluZm8pIHtcbiAgICAgIHJldHVybiBub29wUGx1Z2luO1xuICAgIH1cblxuICAgIGxldCB2aXNpdG9ycyA9IHRlbXBsYXRlUGx1Z2luKHtcbiAgICAgIGNsYXNzZXM6IGluZm8uY2xhc3NlcyxcbiAgICAgIHRhZ3M6IGluZm8udGFncyxcbiAgICAgIHBvc3RmaXgsXG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogJ2VtYmVyLXNjb3BlZC1jc3M6dGVtcGxhdGUtcGx1Z2luJyxcbiAgICAgIHZpc2l0b3I6IHtcbiAgICAgICAgLy8gU3RhY2sgTWFuYWdlclxuICAgICAgICAuLi52aXNpdG9ycyxcbiAgICAgICAgLy8gVmlzaXRvcnMgYnJva2VuIG91dCBsaWtlIHRoaXMgc28gd2UgY2FuIGNvbmRpdGlvbmFsbHlcbiAgICAgICAgLy8gZGVidWcgYmFzZWQgb24gZmlsZSBwYXRoLlxuICAgICAgICBBdHRyTm9kZSguLi5hcmdzKSB7XG4gICAgICAgICAgcmV0dXJuIHZpc2l0b3JzLkF0dHJOb2RlKC4uLmFyZ3MpO1xuICAgICAgICB9LFxuICAgICAgICBFbGVtZW50Tm9kZSguLi5hcmdzKSB7XG4gICAgICAgICAgcmV0dXJuIHZpc2l0b3JzLkVsZW1lbnROb2RlKC4uLmFyZ3MpO1xuICAgICAgICB9LFxuICAgICAgICBNdXN0YWNoZVN0YXRlbWVudCguLi5hcmdzKSB7XG4gICAgICAgICAgcmV0dXJuIHZpc2l0b3JzLk11c3RhY2hlU3RhdGVtZW50KC4uLmFyZ3MpO1xuICAgICAgICB9LFxuICAgICAgICBTdWJFeHByZXNzaW9uKC4uLmFyZ3MpIHtcbiAgICAgICAgICByZXR1cm4gdmlzaXRvcnMuU3ViRXhwcmVzc2lvbiguLi5hcmdzKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfTtcbn1cbiIsICJpbXBvcnQgeyBleGlzdHNTeW5jLCByZWFkRmlsZVN5bmMgfSBmcm9tICdmcyc7XG5cbmltcG9ydCBnZXRDbGFzc2VzVGFnc0Zyb21Dc3MgZnJvbSAnLi4vZ2V0Q2xhc3Nlc1RhZ3NGcm9tQ3NzLmpzJztcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gY3NzUGF0aCBwYXRoIHRvIGEgQ1NTIGZpbGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENTU0luZm8oY3NzUGF0aCkge1xuICBpZiAoIWV4aXN0c1N5bmMoY3NzUGF0aCkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGxldCBjc3MgPSByZWFkRmlsZVN5bmMoY3NzUGF0aCwgJ3V0ZjgnKTtcbiAgbGV0IHJlc3VsdCA9IGdldENsYXNzZXNUYWdzRnJvbUNzcyhjc3MpO1xuXG4gIHJldHVybiByZXN1bHQ7XG59XG4iLCAiaW1wb3J0IHBvc3Rjc3MgZnJvbSAncG9zdGNzcyc7XG5pbXBvcnQgcGFyc2VyIGZyb20gJ3Bvc3Rjc3Mtc2VsZWN0b3ItcGFyc2VyJztcblxuaW1wb3J0IGlzSW5zaWRlR2xvYmFsIGZyb20gJy4vaXNJbnNpZGVHbG9iYWwuanMnO1xuXG5mdW5jdGlvbiBnZXRDbGFzc2VzQW5kVGFncyhzZWwsIGNsYXNzZXMsIHRhZ3MpIHtcbiAgY29uc3QgdHJhbnNmb3JtID0gKHNscykgPT4ge1xuICAgIHNscy53YWxrKChzZWxlY3RvcikgPT4ge1xuICAgICAgaWYgKHNlbGVjdG9yLnR5cGUgPT09ICdjbGFzcycgJiYgIWlzSW5zaWRlR2xvYmFsKHNlbGVjdG9yKSkge1xuICAgICAgICBjbGFzc2VzLmFkZChzZWxlY3Rvci52YWx1ZSk7XG4gICAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLnR5cGUgPT09ICd0YWcnICYmICFpc0luc2lkZUdsb2JhbChzZWxlY3RvcikpIHtcbiAgICAgICAgdGFncy5hZGQoc2VsZWN0b3IudmFsdWUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIHBhcnNlcih0cmFuc2Zvcm0pLnByb2Nlc3NTeW5jKHNlbCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldENsYXNzZXNUYWdzRnJvbUNzcyhjc3MpIHtcbiAgY29uc3QgY2xhc3NlcyA9IG5ldyBTZXQoKTtcbiAgY29uc3QgdGFncyA9IG5ldyBTZXQoKTtcblxuICBjb25zdCBhc3QgPSBwb3N0Y3NzLnBhcnNlKGNzcyk7XG5cbiAgYXN0LndhbGsoKG5vZGUpID0+IHtcbiAgICBpZiAobm9kZS50eXBlID09PSAncnVsZScpIHtcbiAgICAgIGdldENsYXNzZXNBbmRUYWdzKG5vZGUuc2VsZWN0b3IsIGNsYXNzZXMsIHRhZ3MpO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHsgY2xhc3NlcywgdGFncyB9O1xufVxuXG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNJbnNpZGVHbG9iYWwobm9kZSwgZnVuYykge1xuICBjb25zdCBwYXJlbnQgPSBub2RlLnBhcmVudDtcblxuICBpZiAoIXBhcmVudCkgcmV0dXJuIGZhbHNlO1xuICBpZiAocGFyZW50LnR5cGUgPT09ICdwc2V1ZG8nICYmIHBhcmVudC52YWx1ZSA9PT0gJzpnbG9iYWwnKSByZXR1cm4gdHJ1ZTtcblxuICByZXR1cm4gaXNJbnNpZGVHbG9iYWwocGFyZW50LCBmdW5jKTtcbn1cbiIsICJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBmaW5kV29ya3NwYWNlUGF0aCB9IGZyb20gJy4vdXRpbHMuanMnO1xuXG4vKipcbiAqIHRlbXBsYXRlIHBsdWdpbnMgZG8gbm90IGhhbmQgdXMgdGhlIGNvcnJlY3QgZmlsZSBwYXRoLlxuICogYWRkaXRpb25hbGx5LCB3ZSBtYXkgbm90IGJlIGFibGUgdG8gcmVseSBvbiB0aGlzIGRhdGEgaW4gdGhlIGZ1dHVyZSxcbiAqIHNvIHRoaXMgZnVuY3Rpb25zIGFjdHMgYXMgYSBtZWFucyBvZiBub3JtYWxpemluZyBfd2hhdGV2ZXJfIHdlJ3JlIGdpdmVuXG4gKiBpbiB0aGUgZnV0dXJlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlbmFtZVxuICogQHJldHVybnMge3N0cmluZ30gdGhlIGFic29sdXRlIHBhdGggdG8gdGhlIGZpbGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpeEZpbGVuYW1lKGZpbGVuYW1lKSB7XG4gIGxldCBmaWxlTmFtZSA9IGZpbGVuYW1lO1xuICBsZXQgd29ya3NwYWNlID0gZmluZFdvcmtzcGFjZVBhdGgoZmlsZU5hbWUpO1xuXG4gIC8qKlxuICAgKiBlbWJlci1zb3VyY2UgNS44OlxuICAgKiAtIHRoZSBmaWxlbmFtZSBsb29rcyBsaWtlIGFuIGFic29sdXRlIHBhdGgsIGJ1dCBzd2FwcGVkIG91dCB0aGUgJ2FwcCcgcGFydCBvZiB0aGUgcGF0aFxuICAgKiAgIHdpdGggdGhlIG1vZHVsZSBuYW1lLCBzbyB0aGUgZmlsZSBwYXRocyBuZXZlciBleGlzdCBvbiBkaXNrXG4gICAqXG4gICAqIC0gaW4gdml0ZSBhcHBzOlxuICAgKiAgIHRoZSAnYXBwJyBwYXJ0IF9tYXlfIGJlIGBzcmNgLCBzbyB3ZSBhbHNvIG5lZWQgdG8gZW5zdXJlIHRoYXQgYHNyY2AgaXMgZXhjbHVkZWQgYXMgd2VsbFxuICAgKi9cbiAgbGV0IGhhc0FwcERpciA9IGZpbGVOYW1lLmluY2x1ZGVzKHBhdGguam9pbih3b3Jrc3BhY2UsICdhcHAnKSk7XG4gIGxldCBoYXNTcmNEaXIgPSBmaWxlTmFtZS5pbmNsdWRlcyhwYXRoLmpvaW4od29ya3NwYWNlLCAnc3JjJykpO1xuXG4gIGlmIChcbiAgICAhKGhhc0FwcERpciB8fCBoYXNTcmNEaXIpICYmXG4gICAgIWZpbGVOYW1lLmluY2x1ZGVzKCcvbm9kZV9tb2R1bGVzLy5lbWJyb2lkZXIvJylcbiAgKSB7XG4gICAgbGV0IG1heWJlTW9kdWxlID0gZmlsZU5hbWUucmVwbGFjZSh3b3Jrc3BhY2UsICcnKTtcbiAgICBsZXQgW21heWJlU2NvcGUsIC4uLnJlc3RdID0gbWF5YmVNb2R1bGUuc3BsaXQoJy8nKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgbGV0IHBhcnRzID0gcmVzdDtcblxuICAgIGlmIChtYXliZVNjb3BlLnN0YXJ0c1dpdGgoJ0AnKSkge1xuICAgICAgbGV0IFssIC4uLnJlc3Rlcl0gPSByZXN0O1xuXG4gICAgICBwYXJ0cyA9IHJlc3RlcjtcbiAgICB9XG5cbiAgICBsZXQgcmVsYXRpdmUgPSBwYXRoLmpvaW4oLi4ucGFydHMpO1xuXG4gICAgLyoqXG4gICAgICogV2UgZG9uJ3QgYWN0dWFsbHkga25vdyBpZiB0aGlzIGZpbGUgaXMgYW4gYXBwLlxuICAgICAqIGl0IGNvdWxkIGJlIGFuIGFkZG9uICh2MSBvciB2MilcbiAgICAgKlxuICAgICAqIFNvIGhlcmUgd2UgbG9nIHRvIHNlZSBpZiB3ZSBoYXZlIHVuaGFuZGxlZCBzaXR1YXRpb25zLlxuICAgICAqL1xuICAgIGxldCBjYW5kaWRhdGVQYXRoID0gcGF0aC5qb2luKHdvcmtzcGFjZSwgJ2FwcCcsIHJlbGF0aXZlKTtcblxuICAgIHJldHVybiBjYW5kaWRhdGVQYXRoO1xuICB9XG5cbiAgLyoqXG4gICAqIHVuZGVyIGVtYnJvaWRlckAzLCB0aGUgZmlsZU5hbWUgd2lsbCBiZSB0aGUgcGF0aCB0byB0aGUgcmV3cml0dGVuIGZpbGUuXG4gICAqIHdlIGRvbid0IHdhbnQgdGhpcy5cbiAgICogd2Ugd2FudCB0aGUgcGF0aCB0byB0aGUgb3JpZ2luYWwgc291cmNlLlxuICAgKiBUaHJvdWdoIHRoZSBwb3dlcnMgb2YgXHUyNzI4IGNvbnZlbnRpb24gXHUyNzI4LCB3ZSBjYW4gbWFwIGJhY2sgdG8gc291cmNlLlxuICAgKi9cbiAgaWYgKGZpbGVOYW1lLmluY2x1ZGVzKCcvbm9kZV9tb2R1bGVzLy5lbWJyb2lkZXIvcmV3cml0dGVuLWFwcC8nKSkge1xuICAgIGxldCBjYW5kaWRhdGVQYXRoID0gZmlsZU5hbWUucmVwbGFjZShcbiAgICAgICcvbm9kZV9tb2R1bGVzLy5lbWJyb2lkZXIvcmV3cml0dGVuLWFwcC8nLFxuICAgICAgJy9hcHAvJyxcbiAgICApO1xuXG4gICAgcmV0dXJuIGNhbmRpZGF0ZVBhdGg7XG4gIH1cblxuICAvLyBUT0RPOiB3aHkgYXJlIHdlIHBhc3NlZCBmaWxlcyB0byBvdGhlciBwcm9qZWN0cz9cbiAgaWYgKCFmaWxlTmFtZS5pbmNsdWRlcyh3b3Jrc3BhY2UpKSB7XG4gICAgcmV0dXJuIGZpbGVOYW1lO1xuICB9XG5cbiAgLy8gRmFsbGJhY2sgdG8gd2hhdCB0aGUgcGx1Z2luIHN5c3RlbSBnaXZlcyB1cy5cbiAgLy8gVGhpcyBtYXkgYmUgd3JvbmcsIGFuZCBpZiB3cm9uZywgcmV2ZWFsc1xuICAvLyB1bmhhbmRsZWQgc2NlbmFyaW9zIHdpdGggdGhlIGZpbGUgbmFtZXMgaW4gdGhlIHBsdWdpbiBpbmZyYVxuICByZXR1cm4gZmlsZU5hbWU7XG59XG4iLCAiaW1wb3J0IGFzc2VydCBmcm9tICdub2RlOmFzc2VydCc7XG5pbXBvcnQgZnNTeW5jLCB7IGV4aXN0c1N5bmMgfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgfSBmcm9tICdub2RlOm1vZHVsZSc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBoYXNoRnJvbUFic29sdXRlUGF0aCB9IGZyb20gJy4vaGFzaC1mcm9tLWFic29sdXRlLXBhdGguanMnO1xuaW1wb3J0IHsgaGFzaEZyb21Nb2R1bGVQYXRoIH0gZnJvbSAnLi9oYXNoLWZyb20tbW9kdWxlLXBhdGguanMnO1xuXG5leHBvcnQgeyBoYXNoRnJvbUFic29sdXRlUGF0aCB9IGZyb20gJy4vaGFzaC1mcm9tLWFic29sdXRlLXBhdGguanMnO1xuZXhwb3J0IHsgaGFzaEZyb21Nb2R1bGVQYXRoIH0gZnJvbSAnLi9oYXNoLWZyb20tbW9kdWxlLXBhdGguanMnO1xuXG5jb25zdCBDT01QT05FTlRfRVhURU5TSU9OUyA9IFsnLmd0cycsICcuZ2pzJywgJy50cycsICcuanMnLCAnLmhicyddO1xuXG4vLyBDSlMgLyBFU00/XG5sZXQgaGVyZSA9IGltcG9ydC5tZXRhLnVybDtcbmxldCBvdXJSZXF1aXJlID0gZ2xvYmFsVGhpcy5yZXF1aXJlXG4gID8gZ2xvYmFsVGhpcy5yZXF1aXJlXG4gIDogaGVyZSAmJiBjcmVhdGVSZXF1aXJlKGhlcmUpO1xuXG5pZiAoIW91clJlcXVpcmUpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gIG91clJlcXVpcmUgPSByZXF1aXJlO1xufVxuXG5jb25zdCBFTUJST0lERVJfRElSID0gJ25vZGVfbW9kdWxlcy8uZW1icm9pZGVyJztcbmNvbnN0IEVNQlJPSURFUl8zX1JFV1JJVFRFTl9BUFBfUEFUSCA9IGAke0VNQlJPSURFUl9ESVJ9L3Jld3JpdHRlbi1hcHBgO1xuY29uc3QgRU1CUk9JREVSXzNfUkVXUklUVEVOX0FQUF9BU1NFVFMgPSBgJHtFTUJST0lERVJfM19SRVdSSVRURU5fQVBQX1BBVEh9L2Fzc2V0c2A7XG5jb25zdCBFTUJST0lERVJfM19SRVdSSVRURU5fUEFDS0FHRVMgPSBgJHtFTUJST0lERVJfRElSfS9yZXdyaXR0ZW4tcGFja2FnZXNgO1xuY29uc3QgSVJSRUxFVkFOVF9QQVRIUyA9IFsnbm9kZV9tb2R1bGVzLy5wbnBtJywgJ19fdml0ZS0nXTtcbmNvbnN0IFVOU1VQUE9SVEVEX0RJUkVDVE9SSUVTID0gbmV3IFNldChbJ3Rlc3RzJ10pO1xuXG5jb25zdCBDV0QgPSBwcm9jZXNzLmN3ZCgpO1xuXG4vKipcbiAqIFJlZ2FyZGxlc3Mgb2Ygd2hhdCB0aGUgZmlsZVBhdGggZm9ybWF0IGlzLFxuICogdGhpcyB3aWxsIHRyeSB0byByZXR1cm4gdGhlIGNvcnJlY3QgcG9zdGZpeC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZVBhdGhcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNoRnJvbShmaWxlUGF0aCkge1xuICBpZiAoZmlsZVBhdGguc3RhcnRzV2l0aCgnLycpKSB7XG4gICAgcmV0dXJuIGhhc2hGcm9tQWJzb2x1dGVQYXRoKGZpbGVQYXRoKTtcbiAgfVxuXG4gIHJldHVybiBoYXNoRnJvbU1vZHVsZVBhdGgoZmlsZVBhdGgpO1xufVxuXG4vKipcbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjc3NIYXNBc3NvY2lhdGVkQ29tcG9uZW50KGNzc1BhdGgpIHtcbiAgcmV0dXJuIGNzc0hhc1N0YW5kYXJkRmlsZShjc3NQYXRoKSB8fCBjc3NIYXNQb2RzRmlsZShjc3NQYXRoKTtcbn1cblxuZnVuY3Rpb24gY3NzSGFzU3RhbmRhcmRGaWxlKGlkKSB7XG4gIC8qKlxuICAgKiBOb3JtYWxseSB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrIGEgSlMgcGF0aCBoZXJlLCBidXQgd2hlbiB1c2luZ1xuICAgKiBlbWJyb2lkZXJAMywgd2UgaGF2ZSBhIFwicmV3cml0dGVuIGFwcFwiLCB3aGljaCBoYXMgYWxsIG91ciBzb3VyY2VcbiAgICogcHJlcHJvY2Vzc2VkIGEgYml0IGJlZm9yZSBzY29wZWQtY3NzIHRyYW5zZm9ybWF0aW9ucy5cbiAgICpcbiAgICogKEluIFZpdGUsIHdlIG9wZXJhdGUgbW9yZSBkaXJlY3RseSB3aXRoIHRoZSBzb3VyY2UpXG4gICAqL1xuICBmb3IgKGxldCBleHQgb2YgQ09NUE9ORU5UX0VYVEVOU0lPTlMpIHtcbiAgICBsZXQgY2FuZGlkYXRlUGF0aCA9IGlkLnJlcGxhY2UoL1xcLmNzcyQvLCBleHQpO1xuXG4gICAgaWYgKGV4aXN0c1N5bmMoY2FuZGlkYXRlUGF0aCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gY3NzSGFzUG9kc0ZpbGUoaWQpIHtcbiAgaWYgKCFpZC5lbmRzV2l0aCgnc3R5bGVzLmNzcycpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIE5vcm1hbGx5IHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgYSBKUyBwYXRoIGhlcmUsIGJ1dCB3aGVuIHVzaW5nXG4gICAqIGVtYnJvaWRlckAzLCB3ZSBoYXZlIGEgXCJyZXdyaXR0ZW4gYXBwXCIsIHdoaWNoIGhhcyBhbGwgb3VyIHNvdXJjZVxuICAgKiBwcmVwcm9jZXNzZWQgYSBiaXQgYmVmb3JlIHNjb3BlZC1jc3MgdHJhbnNmb3JtYXRpb25zLlxuICAgKlxuICAgKiAoSW4gVml0ZSwgd2Ugb3BlcmF0ZSBtb3JlIGRpcmVjdGx5IHdpdGggdGhlIHNvdXJjZSlcbiAgICovXG4gIGZvciAobGV0IGV4dCBvZiBDT01QT05FTlRfRVhURU5TSU9OUykge1xuICAgIGxldCBjYW5kaWRhdGVQYXRoID0gaWQucmVwbGFjZSgvc3R5bGVzXFwuY3NzJC8sIGB0ZW1wbGF0ZSR7ZXh0fWApO1xuXG4gICAgaWYgKGV4aXN0c1N5bmMoY2FuZGlkYXRlUGF0aCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBCYXNlZCBvbiBlbWJlcidzIGNvbXBvbmVudCBsb2NhdGlvbiBjb252ZW50aW9ucyxcbiAqIHRoaXMgZnVuY3Rpb24gd2lsbCBwcm92aWRlIGEgcGF0aCBmb3Igd2hlcmUgd2VcbiAqIGV4cGVjdCB0aGUgQ1NTIHRvIGxpdmUuXG4gKlxuICogRm9yIGNvLWxvY2F0ZWQgc3RydWN0dXJlOlxuICogICAtIGNvbXBvbmVudHMvbXktY29tcG9uZW50Lmhic1xuICogICAtIGNvbXBvbmVudHMvbXktY29tcG9uZW50LmNzc1xuICpcbiAqIEZvciBuZXN0ZWQgY28tbG9jYXRlZCBzdHJ1Y3R1cmVcbiAqICAgLSBjb21wb25lbnRzL215LWNvbXBvbmVudC9mb28uaGJzXG4gKiAgIC0gY29tcG9uZW50cy9teS1jb21wb25lbnQvZm9vLmNzc1xuICpcbiAqIEZvciBQb2RzIHJvdXRlcyBzdHJ1Y3R1cmVcbiAqICAgLSByb3V0ZXMvbXktcm91dGUvdGVtcGxhdGUue2hicyxqc31cbiAqICAgLSByb3V0ZXMvbXktcm91dGUvc3R5bGVzLmNzc1xuICpcbiAqIERlbGliZXJhdGVseSBub3Qgc3VwcG9ydGVkOlxuICogICAtIGNvbXBvbmVudHMgdy8gcG9kcyAtLSB0aGlzIGlzIGRlcHJlY2F0ZWQgaW4gNS4xMFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlTmFtZSAtIHRoZSBoYnMsIGpzLCBnanMsIGd0cyBvciB3aGF0ZXZlciBjby1sb2NhdGVkIHBhdGguXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIGV4cGVjdGVkIGNzcyBwYXRoXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjc3NQYXRoRm9yKGZpbGVOYW1lKSB7XG4gIGxldCB3aXRob3V0RXh0ID0gd2l0aG91dEV4dGVuc2lvbihmaWxlTmFtZSk7XG4gIGxldCBjc3NQYXRoID0gd2l0aG91dEV4dCArICcuY3NzJztcblxuICBpZiAoaXNQb2QoZmlsZU5hbWUpKSB7XG4gICAgY3NzUGF0aCA9IGZpbGVOYW1lXG4gICAgICAucmVwbGFjZSgvdGVtcGxhdGVcXC5qcyQvLCAnc3R5bGVzLmNzcycpXG4gICAgICAucmVwbGFjZSgvdGVtcGxhdGVcXC5oYnMvLCAnc3R5bGVzLmNzcycpO1xuICB9XG5cbiAgcmV0dXJuIGNzc1BhdGg7XG59XG5cbi8qKlxuICogTm90ZSB0aGF0IGNvbXBvbmVudHMgaW4gdGhlIFwicG9kc1wiIGNvbnZlbnRpb24gd2lsbFxuICogbmV2ZXIgYmUgc3VwcG9ydGVkLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlUGF0aFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNQb2RUZW1wbGF0ZShmaWxlUGF0aCkge1xuICBpZiAoZmlsZVBhdGguaW5jbHVkZXMoJy9jb21wb25lbnRzLycpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIGZpbGVQYXRoLmVuZHNXaXRoKCd0ZW1wbGF0ZS5qcycpIHx8IGZpbGVQYXRoLmVuZHNXaXRoKCd0ZW1wbGF0ZS5oYnMnKTtcbn1cblxuLyoqXG4gKiBOb3RlIHRoYXQgY29tcG9uZW50cyBpbiB0aGUgXCJwb2RzXCIgY29udmVudGlvbiB3aWxsXG4gKiBuZXZlciBiZSBzdXBwb3J0ZWQuXG4gKlxuICogQ2hlY2tzIGlmIGEgZmlsZSBlbmRzIHdpdGhcbiAqIC0gdGVtcGxhdGUuanNcbiAqIC0gdGVtcGxhdGUuaGJzXG4gKiAtIHN0eWxlcy5jc3NcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZVBhdGhcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUG9kKGZpbGVQYXRoKSB7XG4gIGlmIChmaWxlUGF0aC5pbmNsdWRlcygnL2NvbXBvbmVudHMvJykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoaXNQb2RUZW1wbGF0ZShmaWxlUGF0aCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBmaWxlUGF0aC5lbmRzV2l0aCgnc3R5bGVzLmNzcycpO1xufVxuXG4vKipcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZVBhdGhcbiAqIEByZXR1cm5zIHRoZSBzYW1lIHBhdGgsIGJ1dCB3aXRob3V0IHRoZSBleHRlbnNpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhvdXRFeHRlbnNpb24oZmlsZVBhdGgpIHtcbiAgbGV0IHBhcnNlZCA9IHBhdGgucGFyc2UoZmlsZVBhdGgpO1xuXG4gIHJldHVybiBwYXRoLmpvaW4ocGFyc2VkLmRpciwgcGFyc2VkLm5hbWUpO1xufVxuXG4vKipcbiAqIEV4YW1wbGVzIGZvciBmaWxlTmFtZVxuICogLSBhYnNvbHV0ZSBvbi1kaXNrIHBhdGhcbiAqIC0gaW4gd2VicGFja1xuICogICAtIFVSTC1hYnNvbHV0ZSBwYXRoLCBzdGFydGluZyB3aXRoIC9cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZU5hbWVcbiAqIEBwYXJhbSB7eyBhZGRpdGlvbmFsUm9vdHM/OiBzdHJpbmdbXTsgY3dkOiBzdHJpbmcgfX0gb3B0aW9uc1xuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUmVsZXZhbnRGaWxlKGZpbGVOYW1lLCB7IGFkZGl0aW9uYWxSb290cywgY3dkIH0pIHtcbiAgLy8gUHJpdmF0ZSBWaXJ0dWFsIE1vZHVsZXNcbiAgaWYgKGZpbGVOYW1lLnN0YXJ0c1dpdGgoJ1xcMCcpKSByZXR1cm4gZmFsc2U7XG4gIC8vIFRoZXNlIGFyZSBub3QgdmFsaWQgdXNlcmxhbmQgbmFtZXMgKG9yIGFyZSBmcm9tIGxpYnJhcmllcylcbiAgaWYgKGZpbGVOYW1lLm1hdGNoKC9eW2EtekEtWl0vKSkgcmV0dXJuIGZhbHNlO1xuICAvLyBFeHRlcm5hbCB0byB1c1xuICBpZiAoZmlsZU5hbWUuc3RhcnRzV2l0aCgnL0BlbWJyb2lkZXInKSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoSVJSRUxFVkFOVF9QQVRIUy5zb21lKChpKSA9PiBmaWxlTmFtZS5pbmNsdWRlcyhpKSkpIHJldHVybiBmYWxzZTtcblxuICBpZiAoZmlsZU5hbWUuaW5jbHVkZXMoJy9ub2RlX21vZHVsZXMvJykpIHtcbiAgICAvLyBpZiBhIGZpbGUgaXMgbm90IHRoZSBlbWJyb2lkZXIgY2FjaGUgZGlyZWN0b3J5XG4gICAgLy8gYW5kIGlzIGluIG5vZGVfbW9kdWxlcywgc2tpcCBpdC5cbiAgICBpZiAoIWZpbGVOYW1lLmluY2x1ZGVzKEVNQlJPSURFUl9ESVIpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gcmV3cml0dGVuIHBhY2thZ2VzIHNob3VsZCBoYXZlIGFscmVhZHkgYmVlbiBwcm9jZXNzZWQgYXQgdGhlaXIgb3duXG4gICAgLy8gcHVibGlzaCB0aW1lXG4gICAgaWYgKGZpbGVOYW1lLmluY2x1ZGVzKEVNQlJPSURFUl8zX1JFV1JJVFRFTl9QQUNLQUdFUykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBUaGVzZSBhcmUgYWxyZWFkeSB0aGUgYnVuZGxlZCBmaWxlcy5cbiAgICBpZiAoZmlsZU5hbWUuaW5jbHVkZXMoRU1CUk9JREVSXzNfUkVXUklUVEVOX0FQUF9BU1NFVFMpKSB7XG4gICAgICAvLyBub3Qgc3VwcG9ydGVkLCBuZXZlciB3aWxsIGJlXG4gICAgICBpZiAoZmlsZU5hbWUuZW5kc1dpdGgoYCR7RU1CUk9JREVSXzNfUkVXUklUVEVOX0FQUF9BU1NFVFN9L3Rlc3RzLmpzYCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvLyBJZGVhbGx5LCB3ZSBuZXZlciBnZXQgaGVyZSAtLSBpbmRpY2F0ZXMgd2UncmUgbm90IGZpbHRlcmluZyBlZmZlY3RpdmVseSBpbiBiYWJlbFxuICAgICAgLy8gTk9URTogaWYgd2UgZ2V0IGhlcmUsIHdlJ3JlIHRyeWluZyB0byBvcGVyYXRlIG9uIGEgZmlsZSB0b28gbGF0ZS5cbiAgICAgIC8vICAgICAgIHdlIG5lZWQgU2NvcGVkQ1NTIHRvIG9wZXJhdGUgYXMgY2xvc2UgdG8gb3JpZ2luYWwgc291cmNlIGFzIHBvc3NpYmxlIC0tIG5vdCBvdXRwdXQgZmlsZXMuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgbGV0IHdvcmtzcGFjZSA9IGZpbmRXb3Jrc3BhY2VQYXRoKGZpbGVOYW1lKTtcblxuICBhc3NlcnQoY3dkLCBgY3dkIHdhcyBub3QgcGFzc2VkIHRvIGlzUmVsZXZhbnRGaWxlYCk7XG5cbiAgbGV0IG91cldvcmtzcGFjZSA9IGZpbmRXb3Jrc3BhY2VQYXRoKGN3ZCk7XG5cbiAgaWYgKHdvcmtzcGFjZSAhPT0gb3VyV29ya3NwYWNlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgbGV0IGxvY2FsID0gZmlsZU5hbWUucmVwbGFjZSh3b3Jrc3BhY2UsICcnKTtcbiAgbGV0IFssIC4uLnBhcnRzXSA9IGxvY2FsLnNwbGl0KCcvJykuZmlsdGVyKEJvb2xlYW4pO1xuXG4gIGlmIChVTlNVUFBPUlRFRF9ESVJFQ1RPUklFUy5oYXMocGFydHNbMF0pKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vc3RseSBwb2RzIHN1cHBvcnQuXG4gICAqIGZvbGtzIG5lZWQgdG8gb3B0IGluIHRvIHBvZHMgKHJvdXRlcyksIGJlY2F1c2UgZXZlcnkgcG9kcyBhcHAgY2FuIGJlIGNvbmZpZ3VyZWQgZGlmZmVyZW50bHlcbiAgICovXG4gIGxldCByb290cyA9IFsnL2NvbXBvbmVudHMvJywgJy90ZW1wbGF0ZXMvJywgLi4uKGFkZGl0aW9uYWxSb290cyB8fCBbXSldO1xuXG4gIGlmICghcm9vdHMuc29tZSgocm9vdCkgPT4gZmlsZU5hbWUuaW5jbHVkZXMocm9vdCkpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYWNrYWdlU2NvcGVkUGF0aFRvTW9kdWxlUGF0aChwYWNrYWdlU2NvcGVkUGF0aCkge1xuICAvKipcbiAgICogKkJ5IGNvbnZlbnRpb24qLCBgc3JjYCBpcyBvbWl0dGVkIGZyb20gY29tcG9uZW50IHBhdGhzLlxuICAgKiBXZSBjYW4gcmVmbGVjdCB0aGUgc2FtZSBiZWhhdmlvciBieSByZXBsYWNpbmcgc3JjL1xuICAgKiB3aXRoIGFuIGVtcHR5IHN0cmluZy5cbiAgICpcbiAgICogQ1NTIGlzbid0IGVtaXR0ZWQgYXMgYSBjby1sb2NhdGVkIG1vZHVsZSwgYnV0XG4gICAqIHRvIGtlZXAgY29udmVudGlvbnMgY29uc2lzdGVudCBhY3Jvc3MgbGFuZ3VhZ2VzLFxuICAgKiB3ZSBjYW4gcHJldGVuZCBpdCBpcy5cbiAgICpcbiAgICogQW55IGN1c3RvbWl6YXRpb24gYmV5b25kIHJlbW92aW5nIGBzcmNgIGFuZCBgYXBwYCBpcyBwb3RlbnRpYWxseSBjb25mdXNpbmcuXG4gICAqIElmIHdlIG5lZWQgZnVydGhlciBjdXN0b21pemF0aW9ucywgd2UnbGwgd2FudCB0byBtYXRjaCBvbiBgZXhwb3J0c2AgaW4gdGhlXG4gICAqIGNvcnJlc3BvbmRpbmcgcGFja2FnZS5qc29uXG4gICAqL1xuICBsZXQgcGFja2FnZVJlbGF0aXZlID0gcGFja2FnZVNjb3BlZFBhdGgucmVwbGFjZSgvXlxcL3NyY1xcLy8sICcvJyk7XG5cbiAgbGV0IHBhcnNlZCA9IHBhdGgucGFyc2UocGFja2FnZVJlbGF0aXZlKTtcblxuICBpZiAoaXNQb2QocGFja2FnZVJlbGF0aXZlKSkge1xuICAgIC8qKlxuICAgICAqIEZvciBwb2RzLCB3ZSBjaG9wIG9mZiB0aGUgd2hvbGUgZmlsZSwgYW5kIHVzZSB0aGUgZGlyIG5hbWUgYXMgdGhlIFwibW9kdWxlUGF0aFwiXG4gICAgICovXG4gICAgcmV0dXJuIHBhcnNlZC5kaXI7XG4gIH1cblxuICAvKipcbiAgICogSWYgYW4gZXh0ZW5zaW9uIGlzIHBhc3NlZCwgcmVtb3ZlIGl0LlxuICAgKiBXaGVuIHVzaW5nIHBhY2thZ2VycywgZm9sa3MgYXJlIHVzZWQgdG8gbm90IGhhdmluZyB0byBzcGVjaWZ5IGV4dGVuc2lvbnMgZm9yIGZpbGVzLlxuICAgKiBTaW5jZSB3ZSBkb24ndCBldmVuIGVtaXQgY3NzIGZpbGVzIGNvLWxvY2F0ZWQgdG8gZWFjaCBtb2R1bGUsXG4gICAqIHRoaXMgaGVscHMgdXMgbm90IGNvbnZleSBhIGxpZSB0aGF0IGEgZmlsZSBtYXkgZXhpc3QgaW4gYXQgcnVudGltZS5cbiAgICpcbiAgICogRm9yIGV4YW1wbGUgYDxtb2R1bGUtbmFtZT4vY29tcG9uZW50cy9idXR0b25gLlxuICAgKiBJdCBkb2Vzbid0IG1hdHRlciB3aGF0IHRoZSBleHRlbnNpb24gaXMsIGJlY2F1c2UgeW91IGNhbiBvbmx5IGhhdmUgb25lIGNzcyBmaWxlXG4gICAqIGZvciB0aGUgYnV0dG9uIG1vZHVsZSBhbnl3YXkuXG4gICAqL1xuICBsZXQgbG9jYWxQYWNrYWdlclN0eWxlUGF0aCA9IHBhdGguam9pbihwYXJzZWQuZGlyLCBwYXJzZWQubmFtZSk7XG5cbiAgcmV0dXJuIGxvY2FsUGFja2FnZXJTdHlsZVBhdGg7XG59XG5cbi8qKlxuICogcmV0dXJucyB0aGUgYXBwLW1vZHVsZSBwYXRoIG9mIHRoZSBzb3VyY2UgZmlsZVxuICpcbiAqIFRoaXMgYXNzdW1lcyBub3JtYWwgZW1iZXIgYXBwIGNvbnZlbnRpb25zXG4gKlxuICogd2hpY2ggaXMgYDxwYWNrYWdlLmpzb24jbmFtZT4vcGF0aC10by1maWxlYFxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwUGF0aChzb3VyY2VQYXRoKSB7XG4gIGxldCB3b3Jrc3BhY2VQYXRoID0gZmluZFdvcmtzcGFjZVBhdGgoc291cmNlUGF0aCk7XG4gIGxldCBuYW1lID0gbW9kdWxlTmFtZShzb3VyY2VQYXRoKTtcblxuICAvKipcbiAgICogIFVuZGVyIGVtYnJvaWRlciBidWlsZHMsIHRoZSBzcGVjLWNvbXBsaWFudCB2ZXJzaW9uIG9mIHRoZSBhcHBcbiAgICogaGFzIGFsbCB0aGUgZmlsZXMgdW5kZXIgYSBmb2xkZXIgd2hpY2ggcmVwcmVzZW50cyB0aGUgcGFja2FnZSBuYW1lLFxuICAgKiByYXRoZXIgdGhhbiBcImFwcFwiLlxuICAgKi9cbiAgbGV0IHBhY2thZ2VSZWxhdGl2ZSA9IHNvdXJjZVBhdGgucmVwbGFjZSh3b3Jrc3BhY2VQYXRoLCAnJyk7XG5cbiAgLyoqXG4gICAqIEJ1dCB3ZSBhbHNvIGRvbid0IHdhbnQgJ2FwcCcgLS0gd2hpY2ggaXMgcHJlc2VudCBpbiB0aGUgdjEgYWRkb24gcGlwZWxpbmVcbiAgICovXG4gIHBhY2thZ2VSZWxhdGl2ZSA9IHBhY2thZ2VSZWxhdGl2ZS5yZXBsYWNlKGAvYXBwL2AsIGAvYCk7XG5cbiAgLyoqXG4gICAqIGFsc28gYWxzbywgd2Uga25vdyB0aGF0IHRoZSByZS13cml0dGVuIGFwcCBzdHJ1Y3R1cmUgaW4gZW1icm9pZGVyQHYzXG4gICAqIGlzIGV4dHJhbmVvdXMsIGFuZCB3ZSBjYW4gY29sbGFwc2UgaXRcbiAgICovXG4gIHBhY2thZ2VSZWxhdGl2ZSA9IHBhY2thZ2VSZWxhdGl2ZS5yZXBsYWNlKFxuICAgIGAke0VNQlJPSURFUl8zX1JFV1JJVFRFTl9BUFBfUEFUSH0vYCxcbiAgICAnLycsXG4gICk7XG5cbiAgLy8gQW55IG9mIHRoZSBhYm92ZSByZWxwYWNlbWVudHMgY291bGQgYWNjaWRlbnRhbGx5IGdpdmUgdXMgYW4gZXh0cmEgLyAoZGVwZW5kaW5nIG9uIG91ciBidWlsZCBlbnZpcm9ubWVudClcbiAgcGFja2FnZVJlbGF0aXZlID0gcGFja2FnZVJlbGF0aXZlLnJlcGxhY2UoJy8vJywgJy8nKTtcblxuICBsZXQgbG9jYWxQYWNrYWdlclN0eWxlUGF0aCA9IHBhY2thZ2VTY29wZWRQYXRoVG9Nb2R1bGVQYXRoKHBhY2thZ2VSZWxhdGl2ZSk7XG5cbiAgcmV0dXJuIGAke25hbWV9JHtsb2NhbFBhY2thZ2VyU3R5bGVQYXRofWA7XG59XG5cbi8qKlxuICogVG8gYXZvaWQgaGl0dGluZyB0aGUgZmlsZXN5c2V0bSwgd2UnbGwgc3RvcmUgYWxsIGZvdW5kXG4gKiBwcm9qZWN0IHBhdGhzIGJlcmUsIHNvIHdlIGNhbiwgaW4gbWVtb3J5LFxuICogZ2V0IHRoZSBmb2xkZXIgd2hlcmUgYSBwYWNrYWdlLmpzb24gZXhpc3RzLCByYXRoZXIgdGhhblxuICogaGl0IHRoZSBmaWxlIHN5c3RlbSBldmVyeSB0aW1lLlxuICovXG5jb25zdCBTRUVOID0gbmV3IFNldCgpO1xuXG5mdW5jdGlvbiBnZXRTZWVuKHNvdXJjZVBhdGgpIHtcbiAgaWYgKFNFRU4uaGFzKHNvdXJjZVBhdGgpKSByZXR1cm4gc291cmNlUGF0aDtcblxuICBsZXQgcGFydHMgPSBzb3VyY2VQYXRoLnNwbGl0KCcvJyk7XG5cbiAgZm9yIChsZXQgaSA9IHBhcnRzLmxlbmd0aCAtIDE7IGkgPiAxOyBpLS0pIHtcbiAgICBsZXQgdG9DaGVjayA9IHBhcnRzLnNsaWNlKDAsIGkpLmpvaW4oJy8nKTtcblxuICAgIGxldCBzZWVuID0gU0VFTi5oYXModG9DaGVjayk7XG5cbiAgICBpZiAoc2Vlbikge1xuICAgICAgcmV0dXJuIHRvQ2hlY2s7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kV29ya3NwYWNlUGF0aChzb3VyY2VQYXRoLCBvcHRpb25zKSB7XG4gIGxldCBjd2QgPSBvcHRpb25zPy5jd2QgPz8gQ1dEO1xuXG4gIGlmIChzb3VyY2VQYXRoLmluY2x1ZGVzKEVNQlJPSURFUl8zX1JFV1JJVFRFTl9BUFBfUEFUSCkpIHtcbiAgICBzb3VyY2VQYXRoID0gc291cmNlUGF0aC5zcGxpdChFTUJST0lERVJfM19SRVdSSVRURU5fQVBQX1BBVEgpWzBdO1xuICB9XG5cbiAgaWYgKHNvdXJjZVBhdGguZW5kc1dpdGgoJy8nKSkge1xuICAgIHNvdXJjZVBhdGggPSBzb3VyY2VQYXRoLnJlcGxhY2UoL1xcLyQvLCAnJyk7XG4gIH1cblxuICBsZXQgc2VlbiA9IGdldFNlZW4oc291cmNlUGF0aCk7XG5cbiAgaWYgKHNlZW4pIHtcbiAgICByZXR1cm4gc2VlbjtcbiAgfVxuXG4gIGxldCBjYW5kaWRhdGVQYXRoID0gcGF0aC5qb2luKHNvdXJjZVBhdGgsICdwYWNrYWdlLmpzb24nKTtcblxuICBjb25zdCBpc1dvcmtzcGFjZSA9IGZzU3luYy5leGlzdHNTeW5jKGNhbmRpZGF0ZVBhdGgpO1xuXG4gIGlmIChpc1dvcmtzcGFjZSkge1xuICAgIHJldHVybiBzb3VyY2VQYXRoO1xuICB9XG5cbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gZmluZFBhY2thZ2VKc29uVXAoc291cmNlUGF0aCwgeyBjd2QgfSk7XG5cbiAgaWYgKCFwYWNrYWdlSnNvblBhdGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBkZXRlcm1pbmUgcHJvamVjdCBmb3IgJHtzb3VyY2VQYXRofWApO1xuICB9XG5cbiAgY29uc3Qgd29ya3NwYWNlUGF0aCA9IHBhdGguZGlybmFtZShwYWNrYWdlSnNvblBhdGgpO1xuXG4gIFNFRU4uYWRkKHdvcmtzcGFjZVBhdGgpO1xuXG4gIHJldHVybiB3b3Jrc3BhY2VQYXRoO1xufVxuXG5mdW5jdGlvbiBmaW5kUGFja2FnZUpzb25VcChzdGFydFBhdGgsIG9wdGlvbnMpIHtcbiAgbGV0IGN3ZCA9IG9wdGlvbnM/LmN3ZCA/PyBDV0Q7XG4gIGxldCBwYXJ0cyA9IHN0YXJ0UGF0aC5zcGxpdCgnLycpO1xuXG4gIGZvciAobGV0IGkgPSBwYXJ0cy5sZW5ndGggLSAxOyBpID4gMTsgaS0tKSB7XG4gICAgbGV0IHRvQ2hlY2sgPSBwYXJ0cy5zbGljZSgwLCBpKS5qb2luKCcvJyk7XG5cbiAgICBsZXQgcGFja2FnZUpzb24gPSBwYXRoLmpvaW4odG9DaGVjaywgJ3BhY2thZ2UuanNvbicpO1xuICAgIGxldCBleGlzdHMgPSBmc1N5bmMuZXhpc3RzU3luYyhwYWNrYWdlSnNvbik7XG5cbiAgICBpZiAoZXhpc3RzKSB7XG4gICAgICByZXR1cm4gcGFja2FnZUpzb247XG4gICAgfVxuXG4gICAgLy8gRG9uJ3QgdHJhdmVyc2UgYWxsIHRoZSB3YXkgdG8gdGhlIHJvb3Qgb2YgdGhlIGZpbGUgc3lzdGVtLlxuICAgIGlmICh0b0NoZWNrID09PSBjd2QpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5jb25zdCBNQU5JRkVTVF9DQUNIRSA9IG5ldyBNYXAoKTtcblxuLyoqXG4gKiBXaWxsIHJldHVybiB0aGUgcGFja2FnZS5qc29uI25hbWUsIG9yIGNvbmZpZy9lbnZpcm9ubWVudCNtb3VkbGVQcmVmaXggKGlmIHYxIGFwcClcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlUGF0aFxuICovXG5leHBvcnQgZnVuY3Rpb24gbW9kdWxlTmFtZShzb3VyY2VQYXRoKSB7XG4gIGNvbnN0IHdvcmtzcGFjZSA9IGZpbmRXb3Jrc3BhY2VQYXRoKHNvdXJjZVBhdGgpO1xuICBjb25zdCBtYW5pZmVzdCA9IGdldE1hbmlmZXN0KHdvcmtzcGFjZSk7XG5cbiAgaWYgKG1hbmlmZXN0WydlbWJlci1hZGRvbiddKSB7XG4gICAgLyoqXG4gICAgICogTGlicmFyaWVzIGFyZSBub3QgYWxsb3dlZCB0byBjdXN0b21pemUgdGhlaXIgbW9kdWxlIG5hbWVcbiAgICAgKiB0byBiZSBkaWZmZXJlbnQgZnJvbSB0aGVpciBwYWNrYWdlIG5hbWUuXG4gICAgICpcbiAgICAgKiAoSXQncyBhbHNvIGJvbmtlcnMgdGhhdCB0aGlzIGlzIGFsbG93ZWQgZm9yIHYxIGFwcHMpXG4gICAgICovXG4gICAgcmV0dXJuIG1hbmlmZXN0Lm5hbWU7XG4gIH1cblxuICAvKipcbiAgICogRm9yIHYxIGFwcHMsIHdlIG5lZWQgdG8gcmVmZXJlbmNlIHRoZSBjb25maWcvZW52aXJvbm1lbnQuanMgZmlsZVxuICAgKiB0byBzZWUgaWYgdGhlIG1vZHVsZVByZWZpeCBzZXR0aW5nIGRpZmZlcnMgZnJvbSBtYW5pZmVzdC5uYW1lO1xuICAgKi9cbiAgbGV0IGVudmlyb25tZW50SlMgPSBwYXRoLmpvaW4od29ya3NwYWNlLCAnY29uZmlnL2Vudmlyb25tZW50LmpzJyk7XG5cbiAgLyoqXG4gICAqIE5PVEU6IHRoZSBlbnZpcm9ubWVudC5qcyBpcyBhIGNvbW1vbkpTIGZpbGUsIHNvIHdlIGNhbiBzeW5jaHJvbm91c2x5IHJlcXVpcmUgaXRcbiAgICpcbiAgICogVE9ETzogaWYgd2UgaGF2ZSBpc3N1ZXMgd2l0aCBsb2FkaW5nIHRoaXMgZmlsZSBsYXRlciB3ZSBzaG91bGQgcHJvYmFibHkganVzdCBydW4ganNjb2Rlc2hpZnQgb24gaXRcbiAgICogICAgICAgYnV0IHRoYXQgY291bGQgYWxsb3cgdXMgdG8gYmUgYnJpdHRsZSBpbiBkaWZmZXJlbnQgd2F5cywgbGlrZSBpZiBmb2xrcyBzdHJheSBmcm9tIHRoZSB3YXkgdGhlXG4gICAqICAgICAgIGZpbGUgaXMgbGFpZCBvdXQgZnJvbSB0aGUgYmx1ZXByaW50IGRlZmF1bHRzLlxuICAgKi9cbiAgaWYgKGZzU3luYy5leGlzdHNTeW5jKGVudmlyb25tZW50SlMpKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmIC0tIHRoaXMgZXhpc3RzXG4gICAgY29uc3QgZW52Rm4gPSBvdXJSZXF1aXJlKGVudmlyb25tZW50SlMpO1xuICAgIGNvbnN0IGVudiA9IGVudkZuKCdlbWJlci1zY29wZWQtY3NzJyk7XG5cbiAgICByZXR1cm4gZW52Lm1vZHVsZVByZWZpeCB8fCBtYW5pZmVzdC5uYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEZhbGxiYWNrIHRvIHRoZSB0cnVlXHUyMTIyIG1vZHVsZVx1MjEyMiBuYW1lLlxuICAgKi9cbiAgcmV0dXJuIG1hbmlmZXN0Lm5hbWU7XG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHdvcmtzcGFjZVxuICovXG5mdW5jdGlvbiBnZXRNYW5pZmVzdCh3b3Jrc3BhY2UpIHtcbiAgbGV0IGV4aXN0aW5nID0gTUFOSUZFU1RfQ0FDSEUuZ2V0KHdvcmtzcGFjZSk7XG5cbiAgaWYgKGV4aXN0aW5nKSB7XG4gICAgcmV0dXJuIGV4aXN0aW5nO1xuICB9XG5cbiAgbGV0IGJ1ZmZlciA9IGZzU3luYy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHdvcmtzcGFjZSwgJ3BhY2thZ2UuanNvbicpKTtcbiAgbGV0IGNvbnRlbnQgPSBidWZmZXIudG9TdHJpbmcoKTtcbiAgbGV0IGpzb24gPSBKU09OLnBhcnNlKGNvbnRlbnQpO1xuXG4gIE1BTklGRVNUX0NBQ0hFLnNldCh3b3Jrc3BhY2UsIGpzb24pO1xuXG4gIHJldHVybiBqc29uO1xufVxuIiwgIi8qXG4gKiBKYXZhU2NyaXB0IE1ENVxuICogaHR0cHM6Ly9naXRodWIuY29tL2JsdWVpbXAvSmF2YVNjcmlwdC1NRDVcbiAqXG4gKiBDb3B5cmlnaHQgMjAxMSwgU2ViYXN0aWFuIFRzY2hhblxuICogaHR0cHM6Ly9ibHVlaW1wLm5ldFxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZTpcbiAqIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUXG4gKlxuICogQmFzZWQgb25cbiAqIEEgSmF2YVNjcmlwdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgUlNBIERhdGEgU2VjdXJpdHksIEluYy4gTUQ1IE1lc3NhZ2VcbiAqIERpZ2VzdCBBbGdvcml0aG0sIGFzIGRlZmluZWQgaW4gUkZDIDEzMjEuXG4gKiBWZXJzaW9uIDIuMiBDb3B5cmlnaHQgKEMpIFBhdWwgSm9obnN0b24gMTk5OSAtIDIwMDlcbiAqIE90aGVyIGNvbnRyaWJ1dG9yczogR3JlZyBIb2x0LCBBbmRyZXcgS2VwZXJ0LCBZZG5hciwgTG9zdGluZXRcbiAqIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCU0QgTGljZW5zZVxuICogU2VlIGh0dHA6Ly9wYWpob21lLm9yZy51ay9jcnlwdC9tZDUgZm9yIG1vcmUgaW5mby5cbiAqXG4gKiBNb2RpZmljYXRpb25zOlxuICogLSByZW1vdmVkIElJRkUsIGV4cG9ydGVkIG1kNSAodGhpcyBmaWxlIGlzIG5vdyBFU00pXG4gKi9cblxuLyoqXG4gKiBBZGQgaW50ZWdlcnMsIHdyYXBwaW5nIGF0IDJeMzIuXG4gKiBUaGlzIHVzZXMgMTYtYml0IG9wZXJhdGlvbnMgaW50ZXJuYWxseSB0byB3b3JrIGFyb3VuZCBidWdzIGluIGludGVycHJldGVycy5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0geCBGaXJzdCBpbnRlZ2VyXG4gKiBAcGFyYW0ge251bWJlcn0geSBTZWNvbmQgaW50ZWdlclxuICogQHJldHVybnMge251bWJlcn0gU3VtXG4gKi9cbmZ1bmN0aW9uIHNhZmVBZGQoeCwgeSkge1xuICB2YXIgbHN3ID0gKHggJiAweGZmZmYpICsgKHkgJiAweGZmZmYpO1xuICB2YXIgbXN3ID0gKHggPj4gMTYpICsgKHkgPj4gMTYpICsgKGxzdyA+PiAxNik7XG5cbiAgcmV0dXJuIChtc3cgPDwgMTYpIHwgKGxzdyAmIDB4ZmZmZik7XG59XG5cbi8qKlxuICogQml0d2lzZSByb3RhdGUgYSAzMi1iaXQgbnVtYmVyIHRvIHRoZSBsZWZ0LlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBudW0gMzItYml0IG51bWJlclxuICogQHBhcmFtIHtudW1iZXJ9IGNudCBSb3RhdGlvbiBjb3VudFxuICogQHJldHVybnMge251bWJlcn0gUm90YXRlZCBudW1iZXJcbiAqL1xuZnVuY3Rpb24gYml0Um90YXRlTGVmdChudW0sIGNudCkge1xuICByZXR1cm4gKG51bSA8PCBjbnQpIHwgKG51bSA+Pj4gKDMyIC0gY250KSk7XG59XG5cbi8qKlxuICogQmFzaWMgb3BlcmF0aW9uIHRoZSBhbGdvcml0aG0gdXNlcy5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gcSBxXG4gKiBAcGFyYW0ge251bWJlcn0gYSBhXG4gKiBAcGFyYW0ge251bWJlcn0gYiBiXG4gKiBAcGFyYW0ge251bWJlcn0geCB4XG4gKiBAcGFyYW0ge251bWJlcn0gcyBzXG4gKiBAcGFyYW0ge251bWJlcn0gdCB0XG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXN1bHRcbiAqL1xuZnVuY3Rpb24gbWQ1Y21uKHEsIGEsIGIsIHgsIHMsIHQpIHtcbiAgcmV0dXJuIHNhZmVBZGQoYml0Um90YXRlTGVmdChzYWZlQWRkKHNhZmVBZGQoYSwgcSksIHNhZmVBZGQoeCwgdCkpLCBzKSwgYik7XG59XG5cbi8qKlxuICogQmFzaWMgb3BlcmF0aW9uIHRoZSBhbGdvcml0aG0gdXNlcy5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gYSBhXG4gKiBAcGFyYW0ge251bWJlcn0gYiBiXG4gKiBAcGFyYW0ge251bWJlcn0gYyBjXG4gKiBAcGFyYW0ge251bWJlcn0gZCBkXG4gKiBAcGFyYW0ge251bWJlcn0geCB4XG4gKiBAcGFyYW0ge251bWJlcn0gcyBzXG4gKiBAcGFyYW0ge251bWJlcn0gdCB0XG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXN1bHRcbiAqL1xuZnVuY3Rpb24gbWQ1ZmYoYSwgYiwgYywgZCwgeCwgcywgdCkge1xuICByZXR1cm4gbWQ1Y21uKChiICYgYykgfCAofmIgJiBkKSwgYSwgYiwgeCwgcywgdCk7XG59XG5cbi8qKlxuICogQmFzaWMgb3BlcmF0aW9uIHRoZSBhbGdvcml0aG0gdXNlcy5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gYSBhXG4gKiBAcGFyYW0ge251bWJlcn0gYiBiXG4gKiBAcGFyYW0ge251bWJlcn0gYyBjXG4gKiBAcGFyYW0ge251bWJlcn0gZCBkXG4gKiBAcGFyYW0ge251bWJlcn0geCB4XG4gKiBAcGFyYW0ge251bWJlcn0gcyBzXG4gKiBAcGFyYW0ge251bWJlcn0gdCB0XG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXN1bHRcbiAqL1xuZnVuY3Rpb24gbWQ1Z2coYSwgYiwgYywgZCwgeCwgcywgdCkge1xuICByZXR1cm4gbWQ1Y21uKChiICYgZCkgfCAoYyAmIH5kKSwgYSwgYiwgeCwgcywgdCk7XG59XG5cbi8qKlxuICogQmFzaWMgb3BlcmF0aW9uIHRoZSBhbGdvcml0aG0gdXNlcy5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gYSBhXG4gKiBAcGFyYW0ge251bWJlcn0gYiBiXG4gKiBAcGFyYW0ge251bWJlcn0gYyBjXG4gKiBAcGFyYW0ge251bWJlcn0gZCBkXG4gKiBAcGFyYW0ge251bWJlcn0geCB4XG4gKiBAcGFyYW0ge251bWJlcn0gcyBzXG4gKiBAcGFyYW0ge251bWJlcn0gdCB0XG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXN1bHRcbiAqL1xuZnVuY3Rpb24gbWQ1aGgoYSwgYiwgYywgZCwgeCwgcywgdCkge1xuICByZXR1cm4gbWQ1Y21uKGIgXiBjIF4gZCwgYSwgYiwgeCwgcywgdCk7XG59XG5cbi8qKlxuICogQmFzaWMgb3BlcmF0aW9uIHRoZSBhbGdvcml0aG0gdXNlcy5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gYSBhXG4gKiBAcGFyYW0ge251bWJlcn0gYiBiXG4gKiBAcGFyYW0ge251bWJlcn0gYyBjXG4gKiBAcGFyYW0ge251bWJlcn0gZCBkXG4gKiBAcGFyYW0ge251bWJlcn0geCB4XG4gKiBAcGFyYW0ge251bWJlcn0gcyBzXG4gKiBAcGFyYW0ge251bWJlcn0gdCB0XG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXN1bHRcbiAqL1xuZnVuY3Rpb24gbWQ1aWkoYSwgYiwgYywgZCwgeCwgcywgdCkge1xuICByZXR1cm4gbWQ1Y21uKGMgXiAoYiB8IH5kKSwgYSwgYiwgeCwgcywgdCk7XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlIHRoZSBNRDUgb2YgYW4gYXJyYXkgb2YgbGl0dGxlLWVuZGlhbiB3b3JkcywgYW5kIGEgYml0IGxlbmd0aC5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSB4IEFycmF5IG9mIGxpdHRsZS1lbmRpYW4gd29yZHNcbiAqIEBwYXJhbSB7bnVtYmVyfSBsZW4gQml0IGxlbmd0aFxuICogQHJldHVybnMge0FycmF5PG51bWJlcj59IE1ENSBBcnJheVxuICovXG5mdW5jdGlvbiBiaW5sTUQ1KHgsIGxlbikge1xuICAvKiBhcHBlbmQgcGFkZGluZyAqL1xuICB4W2xlbiA+PiA1XSB8PSAweDgwIDw8IGxlbiAlIDMyO1xuICB4WygoKGxlbiArIDY0KSA+Pj4gOSkgPDwgNCkgKyAxNF0gPSBsZW47XG5cbiAgdmFyIGk7XG4gIHZhciBvbGRhO1xuICB2YXIgb2xkYjtcbiAgdmFyIG9sZGM7XG4gIHZhciBvbGRkO1xuICB2YXIgYSA9IDE3MzI1ODQxOTM7XG4gIHZhciBiID0gLTI3MTczMzg3OTtcbiAgdmFyIGMgPSAtMTczMjU4NDE5NDtcbiAgdmFyIGQgPSAyNzE3MzM4Nzg7XG5cbiAgZm9yIChpID0gMDsgaSA8IHgubGVuZ3RoOyBpICs9IDE2KSB7XG4gICAgb2xkYSA9IGE7XG4gICAgb2xkYiA9IGI7XG4gICAgb2xkYyA9IGM7XG4gICAgb2xkZCA9IGQ7XG5cbiAgICBhID0gbWQ1ZmYoYSwgYiwgYywgZCwgeFtpXSwgNywgLTY4MDg3NjkzNik7XG4gICAgZCA9IG1kNWZmKGQsIGEsIGIsIGMsIHhbaSArIDFdLCAxMiwgLTM4OTU2NDU4Nik7XG4gICAgYyA9IG1kNWZmKGMsIGQsIGEsIGIsIHhbaSArIDJdLCAxNywgNjA2MTA1ODE5KTtcbiAgICBiID0gbWQ1ZmYoYiwgYywgZCwgYSwgeFtpICsgM10sIDIyLCAtMTA0NDUyNTMzMCk7XG4gICAgYSA9IG1kNWZmKGEsIGIsIGMsIGQsIHhbaSArIDRdLCA3LCAtMTc2NDE4ODk3KTtcbiAgICBkID0gbWQ1ZmYoZCwgYSwgYiwgYywgeFtpICsgNV0sIDEyLCAxMjAwMDgwNDI2KTtcbiAgICBjID0gbWQ1ZmYoYywgZCwgYSwgYiwgeFtpICsgNl0sIDE3LCAtMTQ3MzIzMTM0MSk7XG4gICAgYiA9IG1kNWZmKGIsIGMsIGQsIGEsIHhbaSArIDddLCAyMiwgLTQ1NzA1OTgzKTtcbiAgICBhID0gbWQ1ZmYoYSwgYiwgYywgZCwgeFtpICsgOF0sIDcsIDE3NzAwMzU0MTYpO1xuICAgIGQgPSBtZDVmZihkLCBhLCBiLCBjLCB4W2kgKyA5XSwgMTIsIC0xOTU4NDE0NDE3KTtcbiAgICBjID0gbWQ1ZmYoYywgZCwgYSwgYiwgeFtpICsgMTBdLCAxNywgLTQyMDYzKTtcbiAgICBiID0gbWQ1ZmYoYiwgYywgZCwgYSwgeFtpICsgMTFdLCAyMiwgLTE5OTA0MDQxNjIpO1xuICAgIGEgPSBtZDVmZihhLCBiLCBjLCBkLCB4W2kgKyAxMl0sIDcsIDE4MDQ2MDM2ODIpO1xuICAgIGQgPSBtZDVmZihkLCBhLCBiLCBjLCB4W2kgKyAxM10sIDEyLCAtNDAzNDExMDEpO1xuICAgIGMgPSBtZDVmZihjLCBkLCBhLCBiLCB4W2kgKyAxNF0sIDE3LCAtMTUwMjAwMjI5MCk7XG4gICAgYiA9IG1kNWZmKGIsIGMsIGQsIGEsIHhbaSArIDE1XSwgMjIsIDEyMzY1MzUzMjkpO1xuXG4gICAgYSA9IG1kNWdnKGEsIGIsIGMsIGQsIHhbaSArIDFdLCA1LCAtMTY1Nzk2NTEwKTtcbiAgICBkID0gbWQ1Z2coZCwgYSwgYiwgYywgeFtpICsgNl0sIDksIC0xMDY5NTAxNjMyKTtcbiAgICBjID0gbWQ1Z2coYywgZCwgYSwgYiwgeFtpICsgMTFdLCAxNCwgNjQzNzE3NzEzKTtcbiAgICBiID0gbWQ1Z2coYiwgYywgZCwgYSwgeFtpXSwgMjAsIC0zNzM4OTczMDIpO1xuICAgIGEgPSBtZDVnZyhhLCBiLCBjLCBkLCB4W2kgKyA1XSwgNSwgLTcwMTU1ODY5MSk7XG4gICAgZCA9IG1kNWdnKGQsIGEsIGIsIGMsIHhbaSArIDEwXSwgOSwgMzgwMTYwODMpO1xuICAgIGMgPSBtZDVnZyhjLCBkLCBhLCBiLCB4W2kgKyAxNV0sIDE0LCAtNjYwNDc4MzM1KTtcbiAgICBiID0gbWQ1Z2coYiwgYywgZCwgYSwgeFtpICsgNF0sIDIwLCAtNDA1NTM3ODQ4KTtcbiAgICBhID0gbWQ1Z2coYSwgYiwgYywgZCwgeFtpICsgOV0sIDUsIDU2ODQ0NjQzOCk7XG4gICAgZCA9IG1kNWdnKGQsIGEsIGIsIGMsIHhbaSArIDE0XSwgOSwgLTEwMTk4MDM2OTApO1xuICAgIGMgPSBtZDVnZyhjLCBkLCBhLCBiLCB4W2kgKyAzXSwgMTQsIC0xODczNjM5NjEpO1xuICAgIGIgPSBtZDVnZyhiLCBjLCBkLCBhLCB4W2kgKyA4XSwgMjAsIDExNjM1MzE1MDEpO1xuICAgIGEgPSBtZDVnZyhhLCBiLCBjLCBkLCB4W2kgKyAxM10sIDUsIC0xNDQ0NjgxNDY3KTtcbiAgICBkID0gbWQ1Z2coZCwgYSwgYiwgYywgeFtpICsgMl0sIDksIC01MTQwMzc4NCk7XG4gICAgYyA9IG1kNWdnKGMsIGQsIGEsIGIsIHhbaSArIDddLCAxNCwgMTczNTMyODQ3Myk7XG4gICAgYiA9IG1kNWdnKGIsIGMsIGQsIGEsIHhbaSArIDEyXSwgMjAsIC0xOTI2NjA3NzM0KTtcblxuICAgIGEgPSBtZDVoaChhLCBiLCBjLCBkLCB4W2kgKyA1XSwgNCwgLTM3ODU1OCk7XG4gICAgZCA9IG1kNWhoKGQsIGEsIGIsIGMsIHhbaSArIDhdLCAxMSwgLTIwMjI1NzQ0NjMpO1xuICAgIGMgPSBtZDVoaChjLCBkLCBhLCBiLCB4W2kgKyAxMV0sIDE2LCAxODM5MDMwNTYyKTtcbiAgICBiID0gbWQ1aGgoYiwgYywgZCwgYSwgeFtpICsgMTRdLCAyMywgLTM1MzA5NTU2KTtcbiAgICBhID0gbWQ1aGgoYSwgYiwgYywgZCwgeFtpICsgMV0sIDQsIC0xNTMwOTkyMDYwKTtcbiAgICBkID0gbWQ1aGgoZCwgYSwgYiwgYywgeFtpICsgNF0sIDExLCAxMjcyODkzMzUzKTtcbiAgICBjID0gbWQ1aGgoYywgZCwgYSwgYiwgeFtpICsgN10sIDE2LCAtMTU1NDk3NjMyKTtcbiAgICBiID0gbWQ1aGgoYiwgYywgZCwgYSwgeFtpICsgMTBdLCAyMywgLTEwOTQ3MzA2NDApO1xuICAgIGEgPSBtZDVoaChhLCBiLCBjLCBkLCB4W2kgKyAxM10sIDQsIDY4MTI3OTE3NCk7XG4gICAgZCA9IG1kNWhoKGQsIGEsIGIsIGMsIHhbaV0sIDExLCAtMzU4NTM3MjIyKTtcbiAgICBjID0gbWQ1aGgoYywgZCwgYSwgYiwgeFtpICsgM10sIDE2LCAtNzIyNTIxOTc5KTtcbiAgICBiID0gbWQ1aGgoYiwgYywgZCwgYSwgeFtpICsgNl0sIDIzLCA3NjAyOTE4OSk7XG4gICAgYSA9IG1kNWhoKGEsIGIsIGMsIGQsIHhbaSArIDldLCA0LCAtNjQwMzY0NDg3KTtcbiAgICBkID0gbWQ1aGgoZCwgYSwgYiwgYywgeFtpICsgMTJdLCAxMSwgLTQyMTgxNTgzNSk7XG4gICAgYyA9IG1kNWhoKGMsIGQsIGEsIGIsIHhbaSArIDE1XSwgMTYsIDUzMDc0MjUyMCk7XG4gICAgYiA9IG1kNWhoKGIsIGMsIGQsIGEsIHhbaSArIDJdLCAyMywgLTk5NTMzODY1MSk7XG5cbiAgICBhID0gbWQ1aWkoYSwgYiwgYywgZCwgeFtpXSwgNiwgLTE5ODYzMDg0NCk7XG4gICAgZCA9IG1kNWlpKGQsIGEsIGIsIGMsIHhbaSArIDddLCAxMCwgMTEyNjg5MTQxNSk7XG4gICAgYyA9IG1kNWlpKGMsIGQsIGEsIGIsIHhbaSArIDE0XSwgMTUsIC0xNDE2MzU0OTA1KTtcbiAgICBiID0gbWQ1aWkoYiwgYywgZCwgYSwgeFtpICsgNV0sIDIxLCAtNTc0MzQwNTUpO1xuICAgIGEgPSBtZDVpaShhLCBiLCBjLCBkLCB4W2kgKyAxMl0sIDYsIDE3MDA0ODU1NzEpO1xuICAgIGQgPSBtZDVpaShkLCBhLCBiLCBjLCB4W2kgKyAzXSwgMTAsIC0xODk0OTg2NjA2KTtcbiAgICBjID0gbWQ1aWkoYywgZCwgYSwgYiwgeFtpICsgMTBdLCAxNSwgLTEwNTE1MjMpO1xuICAgIGIgPSBtZDVpaShiLCBjLCBkLCBhLCB4W2kgKyAxXSwgMjEsIC0yMDU0OTIyNzk5KTtcbiAgICBhID0gbWQ1aWkoYSwgYiwgYywgZCwgeFtpICsgOF0sIDYsIDE4NzMzMTMzNTkpO1xuICAgIGQgPSBtZDVpaShkLCBhLCBiLCBjLCB4W2kgKyAxNV0sIDEwLCAtMzA2MTE3NDQpO1xuICAgIGMgPSBtZDVpaShjLCBkLCBhLCBiLCB4W2kgKyA2XSwgMTUsIC0xNTYwMTk4MzgwKTtcbiAgICBiID0gbWQ1aWkoYiwgYywgZCwgYSwgeFtpICsgMTNdLCAyMSwgMTMwOTE1MTY0OSk7XG4gICAgYSA9IG1kNWlpKGEsIGIsIGMsIGQsIHhbaSArIDRdLCA2LCAtMTQ1NTIzMDcwKTtcbiAgICBkID0gbWQ1aWkoZCwgYSwgYiwgYywgeFtpICsgMTFdLCAxMCwgLTExMjAyMTAzNzkpO1xuICAgIGMgPSBtZDVpaShjLCBkLCBhLCBiLCB4W2kgKyAyXSwgMTUsIDcxODc4NzI1OSk7XG4gICAgYiA9IG1kNWlpKGIsIGMsIGQsIGEsIHhbaSArIDldLCAyMSwgLTM0MzQ4NTU1MSk7XG5cbiAgICBhID0gc2FmZUFkZChhLCBvbGRhKTtcbiAgICBiID0gc2FmZUFkZChiLCBvbGRiKTtcbiAgICBjID0gc2FmZUFkZChjLCBvbGRjKTtcbiAgICBkID0gc2FmZUFkZChkLCBvbGRkKTtcbiAgfVxuXG4gIHJldHVybiBbYSwgYiwgYywgZF07XG59XG5cbi8qKlxuICogQ29udmVydCBhbiBhcnJheSBvZiBsaXR0bGUtZW5kaWFuIHdvcmRzIHRvIGEgc3RyaW5nXG4gKlxuICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBpbnB1dCBNRDUgQXJyYXlcbiAqIEByZXR1cm5zIHtzdHJpbmd9IE1ENSBzdHJpbmdcbiAqL1xuZnVuY3Rpb24gYmlubDJyc3RyKGlucHV0KSB7XG4gIHZhciBpO1xuICB2YXIgb3V0cHV0ID0gJyc7XG4gIHZhciBsZW5ndGgzMiA9IGlucHV0Lmxlbmd0aCAqIDMyO1xuXG4gIGZvciAoaSA9IDA7IGkgPCBsZW5ndGgzMjsgaSArPSA4KSB7XG4gICAgb3V0cHV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKGlucHV0W2kgPj4gNV0gPj4+IGkgJSAzMikgJiAweGZmKTtcbiAgfVxuXG4gIHJldHVybiBvdXRwdXQ7XG59XG5cbi8qKlxuICogQ29udmVydCBhIHJhdyBzdHJpbmcgdG8gYW4gYXJyYXkgb2YgbGl0dGxlLWVuZGlhbiB3b3Jkc1xuICogQ2hhcmFjdGVycyA+MjU1IGhhdmUgdGhlaXIgaGlnaC1ieXRlIHNpbGVudGx5IGlnbm9yZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGlucHV0IFJhdyBpbnB1dCBzdHJpbmdcbiAqIEByZXR1cm5zIHtBcnJheTxudW1iZXI+fSBBcnJheSBvZiBsaXR0bGUtZW5kaWFuIHdvcmRzXG4gKi9cbmZ1bmN0aW9uIHJzdHIyYmlubChpbnB1dCkge1xuICB2YXIgaTtcbiAgdmFyIG91dHB1dCA9IFtdO1xuICBvdXRwdXRbKGlucHV0Lmxlbmd0aCA+PiAyKSAtIDFdID0gdW5kZWZpbmVkO1xuXG4gIGZvciAoaSA9IDA7IGkgPCBvdXRwdXQubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBvdXRwdXRbaV0gPSAwO1xuICB9XG5cbiAgdmFyIGxlbmd0aDggPSBpbnB1dC5sZW5ndGggKiA4O1xuXG4gIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg4OyBpICs9IDgpIHtcbiAgICBvdXRwdXRbaSA+PiA1XSB8PSAoaW5wdXQuY2hhckNvZGVBdChpIC8gOCkgJiAweGZmKSA8PCBpICUgMzI7XG4gIH1cblxuICByZXR1cm4gb3V0cHV0O1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZSB0aGUgTUQ1IG9mIGEgcmF3IHN0cmluZ1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzIElucHV0IHN0cmluZ1xuICogQHJldHVybnMge3N0cmluZ30gUmF3IE1ENSBzdHJpbmdcbiAqL1xuZnVuY3Rpb24gcnN0ck1ENShzKSB7XG4gIHJldHVybiBiaW5sMnJzdHIoYmlubE1ENShyc3RyMmJpbmwocyksIHMubGVuZ3RoICogOCkpO1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIEhNQUMtTUQ1IG9mIGEga2V5IGFuZCBzb21lIGRhdGEgKHJhdyBzdHJpbmdzKVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgSE1BQyBrZXlcbiAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhIFJhdyBpbnB1dCBzdHJpbmdcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJhdyBNRDUgc3RyaW5nXG4gKi9cbmZ1bmN0aW9uIHJzdHJITUFDTUQ1KGtleSwgZGF0YSkge1xuICB2YXIgaTtcbiAgdmFyIGJrZXkgPSByc3RyMmJpbmwoa2V5KTtcbiAgdmFyIGlwYWQgPSBbXTtcbiAgdmFyIG9wYWQgPSBbXTtcbiAgdmFyIGhhc2g7XG4gIGlwYWRbMTVdID0gb3BhZFsxNV0gPSB1bmRlZmluZWQ7XG5cbiAgaWYgKGJrZXkubGVuZ3RoID4gMTYpIHtcbiAgICBia2V5ID0gYmlubE1ENShia2V5LCBrZXkubGVuZ3RoICogOCk7XG4gIH1cblxuICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkgKz0gMSkge1xuICAgIGlwYWRbaV0gPSBia2V5W2ldIF4gMHgzNjM2MzYzNjtcbiAgICBvcGFkW2ldID0gYmtleVtpXSBeIDB4NWM1YzVjNWM7XG4gIH1cblxuICBoYXNoID0gYmlubE1ENShpcGFkLmNvbmNhdChyc3RyMmJpbmwoZGF0YSkpLCA1MTIgKyBkYXRhLmxlbmd0aCAqIDgpO1xuXG4gIHJldHVybiBiaW5sMnJzdHIoYmlubE1ENShvcGFkLmNvbmNhdChoYXNoKSwgNTEyICsgMTI4KSk7XG59XG5cbi8qKlxuICogQ29udmVydCBhIHJhdyBzdHJpbmcgdG8gYSBoZXggc3RyaW5nXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGlucHV0IFJhdyBpbnB1dCBzdHJpbmdcbiAqIEByZXR1cm5zIHtzdHJpbmd9IEhleCBlbmNvZGVkIHN0cmluZ1xuICovXG5mdW5jdGlvbiByc3RyMmhleChpbnB1dCkge1xuICB2YXIgaGV4VGFiID0gJzAxMjM0NTY3ODlhYmNkZWYnO1xuICB2YXIgb3V0cHV0ID0gJyc7XG4gIHZhciB4O1xuICB2YXIgaTtcblxuICBmb3IgKGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoOyBpICs9IDEpIHtcbiAgICB4ID0gaW5wdXQuY2hhckNvZGVBdChpKTtcbiAgICBvdXRwdXQgKz0gaGV4VGFiLmNoYXJBdCgoeCA+Pj4gNCkgJiAweDBmKSArIGhleFRhYi5jaGFyQXQoeCAmIDB4MGYpO1xuICB9XG5cbiAgcmV0dXJuIG91dHB1dDtcbn1cblxuLyoqXG4gKiBFbmNvZGUgYSBzdHJpbmcgYXMgVVRGLThcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gaW5wdXQgSW5wdXQgc3RyaW5nXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBVVEY4IHN0cmluZ1xuICovXG5mdW5jdGlvbiBzdHIycnN0clVURjgoaW5wdXQpIHtcbiAgcmV0dXJuIHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChpbnB1dCkpO1xufVxuXG4vKipcbiAqIEVuY29kZXMgaW5wdXQgc3RyaW5nIGFzIHJhdyBNRDUgc3RyaW5nXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHMgSW5wdXQgc3RyaW5nXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSYXcgTUQ1IHN0cmluZ1xuICovXG5mdW5jdGlvbiByYXdNRDUocykge1xuICByZXR1cm4gcnN0ck1ENShzdHIycnN0clVURjgocykpO1xufVxuXG4vKipcbiAqIEVuY29kZXMgaW5wdXQgc3RyaW5nIGFzIEhleCBlbmNvZGVkIHN0cmluZ1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzIElucHV0IHN0cmluZ1xuICogQHJldHVybnMge3N0cmluZ30gSGV4IGVuY29kZWQgc3RyaW5nXG4gKi9cbmZ1bmN0aW9uIGhleE1ENShzKSB7XG4gIHJldHVybiByc3RyMmhleChyYXdNRDUocykpO1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIHJhdyBITUFDLU1ENSBmb3IgdGhlIGdpdmVuIGtleSBhbmQgZGF0YVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBrIEhNQUMga2V5XG4gKiBAcGFyYW0ge3N0cmluZ30gZCBJbnB1dCBzdHJpbmdcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJhdyBNRDUgc3RyaW5nXG4gKi9cbmZ1bmN0aW9uIHJhd0hNQUNNRDUoaywgZCkge1xuICByZXR1cm4gcnN0ckhNQUNNRDUoc3RyMnJzdHJVVEY4KGspLCBzdHIycnN0clVURjgoZCkpO1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIEhleCBlbmNvZGVkIEhNQUMtTUQ1IGZvciB0aGUgZ2l2ZW4ga2V5IGFuZCBkYXRhXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGsgSE1BQyBrZXlcbiAqIEBwYXJhbSB7c3RyaW5nfSBkIElucHV0IHN0cmluZ1xuICogQHJldHVybnMge3N0cmluZ30gUmF3IE1ENSBzdHJpbmdcbiAqL1xuZnVuY3Rpb24gaGV4SE1BQ01ENShrLCBkKSB7XG4gIHJldHVybiByc3RyMmhleChyYXdITUFDTUQ1KGssIGQpKTtcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGVzIE1ENSB2YWx1ZSBmb3IgYSBnaXZlbiBzdHJpbmcuXG4gKiBJZiBhIGtleSBpcyBwcm92aWRlZCwgY2FsY3VsYXRlcyB0aGUgSE1BQy1NRDUgdmFsdWUuXG4gKiBSZXR1cm5zIGEgSGV4IGVuY29kZWQgc3RyaW5nIHVubGVzcyB0aGUgcmF3IGFyZ3VtZW50IGlzIGdpdmVuLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgSW5wdXQgc3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gW2tleV0gSE1BQyBrZXlcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Jhd10gUmF3IG91dHB1dCBzd2l0Y2hcbiAqIEByZXR1cm5zIHtzdHJpbmd9IE1ENSBvdXRwdXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1kNShzdHJpbmcsIGtleSwgcmF3KSB7XG4gIGlmICgha2V5KSB7XG4gICAgaWYgKCFyYXcpIHtcbiAgICAgIHJldHVybiBoZXhNRDUoc3RyaW5nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmF3TUQ1KHN0cmluZyk7XG4gIH1cblxuICBpZiAoIXJhdykge1xuICAgIHJldHVybiBoZXhITUFDTUQ1KGtleSwgc3RyaW5nKTtcbiAgfVxuXG4gIHJldHVybiByYXdITUFDTUQ1KGtleSwgc3RyaW5nKTtcbn1cbiIsICJpbXBvcnQgeyBtZDUgfSBmcm9tICcuL21kNS5qcyc7XG5cbi8qKlxuICogVGhlIGludGVudCBvZiB0aGlzIGZ1bmN0aW9uIGlzIHRvIGdlbmVyYXRlIHRoZSBzdWZmaXgvcG9zdGZpeCBmb3IgdGhlXG4gKiBjc3MgY2xhc3NlcywgYmFzZWQgb24gdGhlIG1vZHVsZS1zY29wZWQgcGF0aCBuYW1lLlxuICpcbiAqIGZvciBleGFtcGxlLFxuICogICAgaGFzaCgnbXktYXBwL2NvbXBvbmVudHMvZm9vJylcbiAqICBpbnN0ZWFkIG9mXG4gKiAgICBoYXNoKCdhcHAvY29tcG9uZW50cy9mb28nKVxuICpcbiAqICAodW5sZXNzIHlvdXIgYXBwIG5hbWUgaXMgJ2FwcCcpXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1vZHVsZVBhdGhcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNoKG1vZHVsZVBhdGgpIHtcbiAgcmV0dXJuICdlJyArIG1kNShtb2R1bGVQYXRoKS5zdWJzdHJpbmcoMCwgOCk7XG59XG5cblxuZXhwb3J0IGNvbnN0IGhhc2hGcm9tTW9kdWxlUGF0aCA9IGhhc2g7XG4iLCAiaW1wb3J0IHJlY2FzdCBmcm9tICdlbWJlci10ZW1wbGF0ZS1yZWNhc3QnO1xuXG5pbXBvcnQgeyByZW5hbWVDbGFzcyB9IGZyb20gJy4vcmVuYW1lQ2xhc3MuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gdGVtcGxhdGVQbHVnaW4oeyBjbGFzc2VzLCB0YWdzLCBwb3N0Zml4IH0pIHtcbiAgbGV0IHN0YWNrID0gW107XG4gIC8vIHNjb3BlZC1jbGFzcyBpcyBhIGdsb2JhbCB3ZSBhbGxvdyBpbiBoYnNcbiAgLy8gc2NvcGVkQ2xhc3MgaXMgaW1wb3J0YWJsZSwgYW5kIHdlJ2xsIGVycm9yIGlmIHNvbWVvbmUgdHJpZXMgdG8gcmVuYW1lIGl0XG4gIGxldCBzY29wZWRDbGFzc0NhbmRpZGF0ZXMgPSBbJ3Njb3BlZC1jbGFzcycsICdzY29wZWRDbGFzcyddO1xuXG4gIGZ1bmN0aW9uIGlzU2NvcGVkQ2xhc3Moc3RyKSB7XG4gICAgaWYgKCFzdHIpIHJldHVybiBmYWxzZTtcblxuICAgIHJldHVybiBzY29wZWRDbGFzc0NhbmRpZGF0ZXMuc29tZSgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUgPT09IHN0cik7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIEF0dHJOb2RlKG5vZGUpIHtcbiAgICAgIGlmIChub2RlLm5hbWUgPT09ICdjbGFzcycpIHtcbiAgICAgICAgaWYgKG5vZGUudmFsdWUudHlwZSA9PT0gJ1RleHROb2RlJyAmJiBub2RlLnZhbHVlLmNoYXJzKSB7XG4gICAgICAgICAgY29uc3QgcmVuYW1lZENsYXNzID0gcmVuYW1lQ2xhc3Mobm9kZS52YWx1ZS5jaGFycywgcG9zdGZpeCwgY2xhc3Nlcyk7XG5cbiAgICAgICAgICBub2RlLnZhbHVlLmNoYXJzID0gcmVuYW1lZENsYXNzO1xuICAgICAgICB9IGVsc2UgaWYgKG5vZGUudmFsdWUudHlwZSA9PT0gJ0NvbmNhdFN0YXRlbWVudCcpIHtcbiAgICAgICAgICBmb3IgKGxldCBwYXJ0IG9mIG5vZGUudmFsdWUucGFydHMpIHtcbiAgICAgICAgICAgIGlmIChwYXJ0LnR5cGUgPT09ICdUZXh0Tm9kZScgJiYgcGFydC5jaGFycykge1xuICAgICAgICAgICAgICBjb25zdCByZW5hbWVkQ2xhc3MgPSByZW5hbWVDbGFzcyhwYXJ0LmNoYXJzLCBwb3N0Zml4LCBjbGFzc2VzKTtcblxuICAgICAgICAgICAgICBwYXJ0LmNoYXJzID0gcmVuYW1lZENsYXNzO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJ0LnR5cGUgPT09ICdNdXN0YWNoZVN0YXRlbWVudCcpIHtcbiAgICAgICAgICAgICAgcmVjYXN0LnRyYXZlcnNlKHBhcnQsIHtcbiAgICAgICAgICAgICAgICBTdHJpbmdMaXRlcmFsKG5vZGUpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbmFtZWRDbGFzcyA9IHJlbmFtZUNsYXNzKFxuICAgICAgICAgICAgICAgICAgICBub2RlLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBwb3N0Zml4LFxuICAgICAgICAgICAgICAgICAgICBjbGFzc2VzLFxuICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgbm9kZS52YWx1ZSA9IHJlbmFtZWRDbGFzcztcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgRWxlbWVudE5vZGUobm9kZSkge1xuICAgICAgaWYgKHRhZ3MuaGFzKG5vZGUudGFnKSkge1xuICAgICAgICAvLyBjaGVjayBpZiBjbGFzcyBhdHRyaWJ1dGUgYWxyZWFkeSBleGlzdHNcbiAgICAgICAgY29uc3QgY2xhc3NBdHRyID0gbm9kZS5hdHRyaWJ1dGVzLmZpbmQoKGF0dHIpID0+IGF0dHIubmFtZSA9PT0gJ2NsYXNzJyk7XG5cbiAgICAgICAgaWYgKGNsYXNzQXR0cikge1xuICAgICAgICAgIGNsYXNzQXR0ci52YWx1ZS5jaGFycyArPSAnICcgKyBwb3N0Zml4O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHB1c2ggY2xhc3MgYXR0cmlidXRlXG4gICAgICAgICAgbm9kZS5hdHRyaWJ1dGVzLnB1c2goXG4gICAgICAgICAgICByZWNhc3QuYnVpbGRlcnMuYXR0cignY2xhc3MnLCByZWNhc3QuYnVpbGRlcnMudGV4dChwb3N0Zml4KSksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBBbGw6IHtcbiAgICAgIGVudGVyKG5vZGUpIHtcbiAgICAgICAgc3RhY2sucHVzaChub2RlKTtcbiAgICAgIH0sXG4gICAgICBleGl0KCkge1xuICAgICAgICBzdGFjay5wb3AoKTtcbiAgICAgIH0sXG4gICAgfSxcblxuICAgIE11c3RhY2hlU3RhdGVtZW50KG5vZGUpIHtcbiAgICAgIGxldCBjc3NDbGFzcztcblxuICAgICAgaWYgKFxuICAgICAgICBpc1Njb3BlZENsYXNzKGdldFZhbHVlKG5vZGUucGF0aCkpICYmXG4gICAgICAgIG5vZGUucGFyYW1zPy5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgbm9kZS5wYXJhbXNbMF0udHlwZSA9PT0gJ1N0cmluZ0xpdGVyYWwnXG4gICAgICApIHtcbiAgICAgICAgY3NzQ2xhc3MgPSBub2RlLnBhcmFtc1swXS52YWx1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICBpc1Njb3BlZENsYXNzKGdldFZhbHVlKG5vZGUucGF0aD8ucGF0aCkpICYmXG4gICAgICAgIG5vZGUucGF0aD8ucGFyYW1zPy5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgbm9kZS5wYXRoPy5wYXJhbXNbMF0udHlwZSA9PT0gJ1N0cmluZ0xpdGVyYWwnXG4gICAgICApIHtcbiAgICAgICAgY3NzQ2xhc3MgPSBub2RlLnBhdGgucGFyYW1zWzBdLnZhbHVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoY3NzQ2xhc3MpIHtcbiAgICAgICAgY29uc3QgdGV4dE5vZGUgPSByZWNhc3QuYnVpbGRlcnMudGV4dChyZW5hbWVDbGFzcyhjc3NDbGFzcywgcG9zdGZpeCkpO1xuICAgICAgICBjb25zdCBwYXJlbnQgPSBzdGFja1tzdGFjay5sZW5ndGggLSAxXTtcblxuICAgICAgICBpZiAocGFyZW50LnR5cGUgPT09ICdBdHRyTm9kZScpIHtcbiAgICAgICAgICBwYXJlbnQucXVvdGVUeXBlID0gJ1wiJztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0ZXh0Tm9kZTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgU3ViRXhwcmVzc2lvbihub2RlKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGlzU2NvcGVkQ2xhc3MoZ2V0VmFsdWUobm9kZS5wYXRoKSkgJiZcbiAgICAgICAgbm9kZS5wYXJhbXM/Lmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICBub2RlLnBhcmFtc1swXS50eXBlID09PSAnU3RyaW5nTGl0ZXJhbCdcbiAgICAgICkge1xuICAgICAgICBjb25zdCBjc3NDbGFzcyA9IG5vZGUucGFyYW1zWzBdLnZhbHVlO1xuICAgICAgICBjb25zdCB0ZXh0Tm9kZSA9IHJlY2FzdC5idWlsZGVycy5saXRlcmFsKFxuICAgICAgICAgICdTdHJpbmdMaXRlcmFsJyxcbiAgICAgICAgICByZW5hbWVDbGFzcyhjc3NDbGFzcywgcG9zdGZpeCksXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIHRleHROb2RlO1xuICAgICAgfVxuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldFZhbHVlKHBhdGgpIHtcbiAgaWYgKCFwYXRoKSByZXR1cm47XG5cbiAgaWYgKCd2YWx1ZScgaW4gcGF0aCkge1xuICAgIHJldHVybiBwYXRoLnZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIERlcHJlY2F0ZWQgaW4gZW1iZXIgNS45K1xuICAgKiAoc28gd2UgdXNlIHRoZSBhYm92ZSBmb3IgbmV3ZXIgZW1iZXJzKVxuICAgKi9cbiAgcmV0dXJuIHBhdGgub3JpZ2luYWw7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJld3JpdGVIYnMoaGJzLCBjbGFzc2VzLCB0YWdzLCBwb3N0Zml4KSB7XG4gIGxldCBhc3QgPSByZWNhc3QucGFyc2UoaGJzKTtcblxuICByZWNhc3QudHJhdmVyc2UoYXN0LCB0ZW1wbGF0ZVBsdWdpbih7IGNsYXNzZXMsIHRhZ3MsIHBvc3RmaXggfSkpO1xuXG4gIGxldCByZXN1bHQgPSByZWNhc3QucHJpbnQoYXN0KTtcblxuICByZXR1cm4gcmVzdWx0O1xufVxuIiwgIi8qKlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc05hbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBwb3N0Zml4XG4gKiBAcGFyYW0ge1NldDxzdHJpbmc+fSBbY2xhc3Nlc0luQ3NzXVxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmFtZUNsYXNzKGNsYXNzTmFtZSwgcG9zdGZpeCwgY2xhc3Nlc0luQ3NzKSB7XG4gIGNvbnN0IGNsYXNzZXMgPSBjbGFzc05hbWUuc3BsaXQoL1xccysvKTtcbiAgY29uc3QgcmVuYW1lZENsYXNzZXMgPSBjbGFzc2VzXG4gICAgLmZpbHRlcigoYykgPT4gYylcbiAgICAubWFwKChjKSA9PiBjLnRyaW0oKSlcbiAgICAubWFwKChjKSA9PiB7XG4gICAgICBpZiAoIWNsYXNzZXNJbkNzcyB8fCBjbGFzc2VzSW5Dc3MuaGFzKGMpKSB7XG4gICAgICAgIGlmIChjLmVuZHNXaXRoKHBvc3RmaXgpKSByZXR1cm4gYztcblxuICAgICAgICByZXR1cm4gYyArICdfJyArIHBvc3RmaXg7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjO1xuICAgIH0pXG4gICAgLmpvaW4oJyAnKTtcblxuICBjb25zdCByZW5hbWVkV2l0aFByZXNlcnZlZFNwYWNlcyA9IGNsYXNzTmFtZS5yZXBsYWNlKFxuICAgIGNsYXNzTmFtZS50cmltU3RhcnQoKS50cmltRW5kKCksXG4gICAgcmVuYW1lZENsYXNzZXMsXG4gICk7XG5cbiAgcmV0dXJuIHJlbmFtZWRXaXRoUHJlc2VydmVkU3BhY2VzO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7O0FDQUEsZ0JBQXlDOzs7QUNBekMscUJBQW9CO0FBQ3BCLHFDQUFtQjs7O0FDREosU0FBUixlQUFnQyxNQUFNLE1BQU07QUFDakQsUUFBTSxTQUFTLEtBQUs7QUFFcEIsTUFBSSxDQUFDLE9BQVEsUUFBTztBQUNwQixNQUFJLE9BQU8sU0FBUyxZQUFZLE9BQU8sVUFBVSxVQUFXLFFBQU87QUFFbkUsU0FBTyxlQUFlLFFBQVEsSUFBSTtBQUNwQzs7O0FERkEsU0FBUyxrQkFBa0IsS0FBSyxTQUFTLE1BQU07QUFDN0MsUUFBTSxZQUFZLENBQUMsUUFBUTtBQUN6QixRQUFJLEtBQUssQ0FBQyxhQUFhO0FBQ3JCLFVBQUksU0FBUyxTQUFTLFdBQVcsQ0FBQyxlQUFlLFFBQVEsR0FBRztBQUMxRCxnQkFBUSxJQUFJLFNBQVMsS0FBSztBQUFBLE1BQzVCLFdBQVcsU0FBUyxTQUFTLFNBQVMsQ0FBQyxlQUFlLFFBQVEsR0FBRztBQUMvRCxhQUFLLElBQUksU0FBUyxLQUFLO0FBQUEsTUFDekI7QUFBQSxJQUNGLENBQUM7QUFBQSxFQUNIO0FBRUEscUNBQUFBLFNBQU8sU0FBUyxFQUFFLFlBQVksR0FBRztBQUNuQztBQUVlLFNBQVIsc0JBQXVDLEtBQUs7QUFDakQsUUFBTSxVQUFVLG9CQUFJLElBQUk7QUFDeEIsUUFBTSxPQUFPLG9CQUFJLElBQUk7QUFFckIsUUFBTSxNQUFNLGVBQUFDLFFBQVEsTUFBTSxHQUFHO0FBRTdCLE1BQUksS0FBSyxDQUFDLFNBQVM7QUFDakIsUUFBSSxLQUFLLFNBQVMsUUFBUTtBQUN4Qix3QkFBa0IsS0FBSyxVQUFVLFNBQVMsSUFBSTtBQUFBLElBQ2hEO0FBQUEsRUFDRixDQUFDO0FBRUQsU0FBTyxFQUFFLFNBQVMsS0FBSztBQUN6Qjs7O0FEekJPLFNBQVMsV0FBVyxTQUFTO0FBQ2xDLE1BQUksS0FBQyxzQkFBVyxPQUFPLEdBQUc7QUFDeEIsV0FBTztBQUFBLEVBQ1Q7QUFFQSxNQUFJLFVBQU0sd0JBQWEsU0FBUyxNQUFNO0FBQ3RDLE1BQUksU0FBUyxzQkFBc0IsR0FBRztBQUV0QyxTQUFPO0FBQ1Q7OztBR2hCQSxJQUFBQyxvQkFBaUI7OztBQ0FqQix5QkFBbUI7QUFDbkIscUJBQW1DO0FBQ25DLHlCQUE4QjtBQUM5Qix1QkFBaUI7OztBQzJCakIsU0FBUyxRQUFRLEdBQUcsR0FBRztBQUNyQixNQUFJLE9BQU8sSUFBSSxVQUFXLElBQUk7QUFDOUIsTUFBSSxPQUFPLEtBQUssT0FBTyxLQUFLLE9BQU8sT0FBTztBQUUxQyxTQUFRLE9BQU8sS0FBTyxNQUFNO0FBQzlCO0FBU0EsU0FBUyxjQUFjLEtBQUssS0FBSztBQUMvQixTQUFRLE9BQU8sTUFBUSxRQUFTLEtBQUs7QUFDdkM7QUFhQSxTQUFTLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7QUFDaEMsU0FBTyxRQUFRLGNBQWMsUUFBUSxRQUFRLEdBQUcsQ0FBQyxHQUFHLFFBQVEsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztBQUMzRTtBQWNBLFNBQVMsTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0FBQ2xDLFNBQU8sT0FBUSxJQUFJLElBQU0sQ0FBQyxJQUFJLEdBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ2pEO0FBY0EsU0FBUyxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7QUFDbEMsU0FBTyxPQUFRLElBQUksSUFBTSxJQUFJLENBQUMsR0FBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDakQ7QUFjQSxTQUFTLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRztBQUNsQyxTQUFPLE9BQU8sSUFBSSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ3hDO0FBY0EsU0FBUyxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7QUFDbEMsU0FBTyxPQUFPLEtBQUssSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQzNDO0FBU0EsU0FBUyxRQUFRLEdBQUcsS0FBSztBQUV2QixJQUFFLE9BQU8sQ0FBQyxLQUFLLE9BQVEsTUFBTTtBQUM3QixLQUFLLE1BQU0sT0FBUSxLQUFNLEtBQUssRUFBRSxJQUFJO0FBRXBDLE1BQUk7QUFDSixNQUFJO0FBQ0osTUFBSTtBQUNKLE1BQUk7QUFDSixNQUFJO0FBQ0osTUFBSSxJQUFJO0FBQ1IsTUFBSSxJQUFJO0FBQ1IsTUFBSSxJQUFJO0FBQ1IsTUFBSSxJQUFJO0FBRVIsT0FBSyxJQUFJLEdBQUcsSUFBSSxFQUFFLFFBQVEsS0FBSyxJQUFJO0FBQ2pDLFdBQU87QUFDUCxXQUFPO0FBQ1AsV0FBTztBQUNQLFdBQU87QUFFUCxRQUFJLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLFVBQVU7QUFDekMsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLFVBQVU7QUFDOUMsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLFNBQVM7QUFDN0MsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLFdBQVc7QUFDL0MsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxHQUFHLFVBQVU7QUFDN0MsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLFVBQVU7QUFDOUMsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLFdBQVc7QUFDL0MsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLFNBQVM7QUFDN0MsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxHQUFHLFVBQVU7QUFDN0MsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLFdBQVc7QUFDL0MsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLE1BQU07QUFDM0MsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLFdBQVc7QUFDaEQsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxHQUFHLFVBQVU7QUFDOUMsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLFNBQVM7QUFDOUMsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLFdBQVc7QUFDaEQsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLFVBQVU7QUFFL0MsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxHQUFHLFVBQVU7QUFDN0MsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxHQUFHLFdBQVc7QUFDOUMsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLFNBQVM7QUFDOUMsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsSUFBSSxVQUFVO0FBQzFDLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxVQUFVO0FBQzdDLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsR0FBRyxRQUFRO0FBQzVDLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxVQUFVO0FBQy9DLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxVQUFVO0FBQzlDLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxTQUFTO0FBQzVDLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsR0FBRyxXQUFXO0FBQy9DLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxVQUFVO0FBQzlDLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxVQUFVO0FBQzlDLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsR0FBRyxXQUFXO0FBQy9DLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxTQUFTO0FBQzVDLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxVQUFVO0FBQzlDLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxXQUFXO0FBRWhELFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxPQUFPO0FBQzFDLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxXQUFXO0FBQy9DLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxVQUFVO0FBQy9DLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxTQUFTO0FBQzlDLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxXQUFXO0FBQzlDLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxVQUFVO0FBQzlDLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxVQUFVO0FBQzlDLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxXQUFXO0FBQ2hELFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsR0FBRyxTQUFTO0FBQzdDLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLElBQUksVUFBVTtBQUMxQyxRQUFJLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksVUFBVTtBQUM5QyxRQUFJLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksUUFBUTtBQUM1QyxRQUFJLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLEdBQUcsVUFBVTtBQUM3QyxRQUFJLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksVUFBVTtBQUMvQyxRQUFJLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksU0FBUztBQUM5QyxRQUFJLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksVUFBVTtBQUU5QyxRQUFJLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLFVBQVU7QUFDekMsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLFVBQVU7QUFDOUMsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLFdBQVc7QUFDaEQsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLFNBQVM7QUFDN0MsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxHQUFHLFVBQVU7QUFDOUMsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLFdBQVc7QUFDL0MsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLFFBQVE7QUFDN0MsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLFdBQVc7QUFDL0MsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxHQUFHLFVBQVU7QUFDN0MsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLFNBQVM7QUFDOUMsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLFdBQVc7QUFDL0MsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLFVBQVU7QUFDL0MsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxHQUFHLFVBQVU7QUFDN0MsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLFdBQVc7QUFDaEQsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLFNBQVM7QUFDN0MsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLFVBQVU7QUFFOUMsUUFBSSxRQUFRLEdBQUcsSUFBSTtBQUNuQixRQUFJLFFBQVEsR0FBRyxJQUFJO0FBQ25CLFFBQUksUUFBUSxHQUFHLElBQUk7QUFDbkIsUUFBSSxRQUFRLEdBQUcsSUFBSTtBQUFBLEVBQ3JCO0FBRUEsU0FBTyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDcEI7QUFRQSxTQUFTLFVBQVUsT0FBTztBQUN4QixNQUFJO0FBQ0osTUFBSSxTQUFTO0FBQ2IsTUFBSSxXQUFXLE1BQU0sU0FBUztBQUU5QixPQUFLLElBQUksR0FBRyxJQUFJLFVBQVUsS0FBSyxHQUFHO0FBQ2hDLGNBQVUsT0FBTyxhQUFjLE1BQU0sS0FBSyxDQUFDLE1BQU0sSUFBSSxLQUFNLEdBQUk7QUFBQSxFQUNqRTtBQUVBLFNBQU87QUFDVDtBQVNBLFNBQVMsVUFBVSxPQUFPO0FBQ3hCLE1BQUk7QUFDSixNQUFJLFNBQVMsQ0FBQztBQUNkLFVBQVEsTUFBTSxVQUFVLEtBQUssQ0FBQyxJQUFJO0FBRWxDLE9BQUssSUFBSSxHQUFHLElBQUksT0FBTyxRQUFRLEtBQUssR0FBRztBQUNyQyxXQUFPLENBQUMsSUFBSTtBQUFBLEVBQ2Q7QUFFQSxNQUFJLFVBQVUsTUFBTSxTQUFTO0FBRTdCLE9BQUssSUFBSSxHQUFHLElBQUksU0FBUyxLQUFLLEdBQUc7QUFDL0IsV0FBTyxLQUFLLENBQUMsTUFBTSxNQUFNLFdBQVcsSUFBSSxDQUFDLElBQUksUUFBUyxJQUFJO0FBQUEsRUFDNUQ7QUFFQSxTQUFPO0FBQ1Q7QUFRQSxTQUFTLFFBQVEsR0FBRztBQUNsQixTQUFPLFVBQVUsUUFBUSxVQUFVLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQ3REO0FBU0EsU0FBUyxZQUFZLEtBQUssTUFBTTtBQUM5QixNQUFJO0FBQ0osTUFBSSxPQUFPLFVBQVUsR0FBRztBQUN4QixNQUFJLE9BQU8sQ0FBQztBQUNaLE1BQUksT0FBTyxDQUFDO0FBQ1osTUFBSUM7QUFDSixPQUFLLEVBQUUsSUFBSSxLQUFLLEVBQUUsSUFBSTtBQUV0QixNQUFJLEtBQUssU0FBUyxJQUFJO0FBQ3BCLFdBQU8sUUFBUSxNQUFNLElBQUksU0FBUyxDQUFDO0FBQUEsRUFDckM7QUFFQSxPQUFLLElBQUksR0FBRyxJQUFJLElBQUksS0FBSyxHQUFHO0FBQzFCLFNBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJO0FBQ3BCLFNBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJO0FBQUEsRUFDdEI7QUFFQSxFQUFBQSxRQUFPLFFBQVEsS0FBSyxPQUFPLFVBQVUsSUFBSSxDQUFDLEdBQUcsTUFBTSxLQUFLLFNBQVMsQ0FBQztBQUVsRSxTQUFPLFVBQVUsUUFBUSxLQUFLLE9BQU9BLEtBQUksR0FBRyxNQUFNLEdBQUcsQ0FBQztBQUN4RDtBQVFBLFNBQVMsU0FBUyxPQUFPO0FBQ3ZCLE1BQUksU0FBUztBQUNiLE1BQUksU0FBUztBQUNiLE1BQUk7QUFDSixNQUFJO0FBRUosT0FBSyxJQUFJLEdBQUcsSUFBSSxNQUFNLFFBQVEsS0FBSyxHQUFHO0FBQ3BDLFFBQUksTUFBTSxXQUFXLENBQUM7QUFDdEIsY0FBVSxPQUFPLE9BQVEsTUFBTSxJQUFLLEVBQUksSUFBSSxPQUFPLE9BQU8sSUFBSSxFQUFJO0FBQUEsRUFDcEU7QUFFQSxTQUFPO0FBQ1Q7QUFRQSxTQUFTLGFBQWEsT0FBTztBQUMzQixTQUFPLFNBQVMsbUJBQW1CLEtBQUssQ0FBQztBQUMzQztBQVFBLFNBQVMsT0FBTyxHQUFHO0FBQ2pCLFNBQU8sUUFBUSxhQUFhLENBQUMsQ0FBQztBQUNoQztBQVFBLFNBQVMsT0FBTyxHQUFHO0FBQ2pCLFNBQU8sU0FBUyxPQUFPLENBQUMsQ0FBQztBQUMzQjtBQVNBLFNBQVMsV0FBVyxHQUFHLEdBQUc7QUFDeEIsU0FBTyxZQUFZLGFBQWEsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxDQUFDO0FBQ3JEO0FBU0EsU0FBUyxXQUFXLEdBQUcsR0FBRztBQUN4QixTQUFPLFNBQVMsV0FBVyxHQUFHLENBQUMsQ0FBQztBQUNsQztBQVlPLFNBQVMsSUFBSSxRQUFRLEtBQUssS0FBSztBQUNwQyxNQUFJLENBQUMsS0FBSztBQUNSLFFBQUksQ0FBQyxLQUFLO0FBQ1IsYUFBTyxPQUFPLE1BQU07QUFBQSxJQUN0QjtBQUVBLFdBQU8sT0FBTyxNQUFNO0FBQUEsRUFDdEI7QUFFQSxNQUFJLENBQUMsS0FBSztBQUNSLFdBQU8sV0FBVyxLQUFLLE1BQU07QUFBQSxFQUMvQjtBQUVBLFNBQU8sV0FBVyxLQUFLLE1BQU07QUFDL0I7OztBQzFZTyxTQUFTLEtBQUssWUFBWTtBQUMvQixTQUFPLE1BQU0sSUFBSSxVQUFVLEVBQUUsVUFBVSxHQUFHLENBQUM7QUFDN0M7QUFHTyxJQUFNLHFCQUFxQjs7O0FGckJsQztBQWNBLElBQUksT0FBTyxZQUFZO0FBQ3ZCLElBQUksYUFBYSxXQUFXLFVBQ3hCLFdBQVcsVUFDWCxZQUFRLGtDQUFjLElBQUk7QUFFOUIsSUFBSSxDQUFDLFlBQVk7QUFFZixlQUFhO0FBQ2Y7QUFFQSxJQUFNLGdCQUFnQjtBQUN0QixJQUFNLGlDQUFpQyxHQUFHLGFBQWE7QUFDdkQsSUFBTSxtQ0FBbUMsR0FBRyw4QkFBOEI7QUFDMUUsSUFBTSxpQ0FBaUMsR0FBRyxhQUFhO0FBQ3ZELElBQU0sbUJBQW1CLENBQUMsc0JBQXNCLFNBQVM7QUFDekQsSUFBTSwwQkFBMEIsb0JBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQztBQUVqRCxJQUFNLE1BQU0sUUFBUSxJQUFJO0FBeUZqQixTQUFTLFdBQVcsVUFBVTtBQUNuQyxNQUFJLGFBQWEsaUJBQWlCLFFBQVE7QUFDMUMsTUFBSSxVQUFVLGFBQWE7QUFFM0IsTUFBSSxNQUFNLFFBQVEsR0FBRztBQUNuQixjQUFVLFNBQ1AsUUFBUSxpQkFBaUIsWUFBWSxFQUNyQyxRQUFRLGlCQUFpQixZQUFZO0FBQUEsRUFDMUM7QUFFQSxTQUFPO0FBQ1Q7QUFRTyxTQUFTLGNBQWMsVUFBVTtBQUN0QyxNQUFJLFNBQVMsU0FBUyxjQUFjLEdBQUc7QUFDckMsV0FBTztBQUFBLEVBQ1Q7QUFFQSxTQUFPLFNBQVMsU0FBUyxhQUFhLEtBQUssU0FBUyxTQUFTLGNBQWM7QUFDN0U7QUFhTyxTQUFTLE1BQU0sVUFBVTtBQUM5QixNQUFJLFNBQVMsU0FBUyxjQUFjLEdBQUc7QUFDckMsV0FBTztBQUFBLEVBQ1Q7QUFFQSxNQUFJLGNBQWMsUUFBUSxHQUFHO0FBQzNCLFdBQU87QUFBQSxFQUNUO0FBRUEsU0FBTyxTQUFTLFNBQVMsWUFBWTtBQUN2QztBQU9PLFNBQVMsaUJBQWlCLFVBQVU7QUFDekMsTUFBSSxTQUFTLGlCQUFBQyxRQUFLLE1BQU0sUUFBUTtBQUVoQyxTQUFPLGlCQUFBQSxRQUFLLEtBQUssT0FBTyxLQUFLLE9BQU8sSUFBSTtBQUMxQztBQVlPLFNBQVMsZUFBZSxVQUFVLEVBQUUsaUJBQWlCLElBQUksR0FBRztBQUVqRSxNQUFJLFNBQVMsV0FBVyxJQUFJLEVBQUcsUUFBTztBQUV0QyxNQUFJLFNBQVMsTUFBTSxXQUFXLEVBQUcsUUFBTztBQUV4QyxNQUFJLFNBQVMsV0FBVyxhQUFhLEVBQUcsUUFBTztBQUMvQyxNQUFJLGlCQUFpQixLQUFLLENBQUMsTUFBTSxTQUFTLFNBQVMsQ0FBQyxDQUFDLEVBQUcsUUFBTztBQUUvRCxNQUFJLFNBQVMsU0FBUyxnQkFBZ0IsR0FBRztBQUd2QyxRQUFJLENBQUMsU0FBUyxTQUFTLGFBQWEsR0FBRztBQUNyQyxhQUFPO0FBQUEsSUFDVDtBQUlBLFFBQUksU0FBUyxTQUFTLDhCQUE4QixHQUFHO0FBQ3JELGFBQU87QUFBQSxJQUNUO0FBR0EsUUFBSSxTQUFTLFNBQVMsZ0NBQWdDLEdBQUc7QUFFdkQsVUFBSSxTQUFTLFNBQVMsR0FBRyxnQ0FBZ0MsV0FBVyxHQUFHO0FBQ3JFLGVBQU87QUFBQSxNQUNUO0FBS0EsYUFBTztBQUFBLElBQ1Q7QUFBQSxFQUNGO0FBRUEsTUFBSSxZQUFZLGtCQUFrQixRQUFRO0FBRTFDLHlCQUFBQyxTQUFPLEtBQUssc0NBQXNDO0FBRWxELE1BQUksZUFBZSxrQkFBa0IsR0FBRztBQUV4QyxNQUFJLGNBQWMsY0FBYztBQUM5QixXQUFPO0FBQUEsRUFDVDtBQUVBLE1BQUksUUFBUSxTQUFTLFFBQVEsV0FBVyxFQUFFO0FBQzFDLE1BQUksQ0FBQyxFQUFFLEdBQUcsS0FBSyxJQUFJLE1BQU0sTUFBTSxHQUFHLEVBQUUsT0FBTyxPQUFPO0FBRWxELE1BQUksd0JBQXdCLElBQUksTUFBTSxDQUFDLENBQUMsR0FBRztBQUN6QyxXQUFPO0FBQUEsRUFDVDtBQU1BLE1BQUksUUFBUSxDQUFDLGdCQUFnQixlQUFlLEdBQUksbUJBQW1CLENBQUMsQ0FBRTtBQUV0RSxNQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsU0FBUyxTQUFTLFNBQVMsSUFBSSxDQUFDLEdBQUc7QUFDbEQ7QUFBQSxFQUNGO0FBRUEsU0FBTztBQUNUO0FBRU8sU0FBUyw4QkFBOEIsbUJBQW1CO0FBYy9ELE1BQUksa0JBQWtCLGtCQUFrQixRQUFRLFlBQVksR0FBRztBQUUvRCxNQUFJLFNBQVMsaUJBQUFELFFBQUssTUFBTSxlQUFlO0FBRXZDLE1BQUksTUFBTSxlQUFlLEdBQUc7QUFJMUIsV0FBTyxPQUFPO0FBQUEsRUFDaEI7QUFZQSxNQUFJLHlCQUF5QixpQkFBQUEsUUFBSyxLQUFLLE9BQU8sS0FBSyxPQUFPLElBQUk7QUFFOUQsU0FBTztBQUNUO0FBU08sU0FBUyxRQUFRLFlBQVk7QUFDbEMsTUFBSSxnQkFBZ0Isa0JBQWtCLFVBQVU7QUFDaEQsTUFBSSxPQUFPLFdBQVcsVUFBVTtBQU9oQyxNQUFJLGtCQUFrQixXQUFXLFFBQVEsZUFBZSxFQUFFO0FBSzFELG9CQUFrQixnQkFBZ0IsUUFBUSxTQUFTLEdBQUc7QUFNdEQsb0JBQWtCLGdCQUFnQjtBQUFBLElBQ2hDLEdBQUcsOEJBQThCO0FBQUEsSUFDakM7QUFBQSxFQUNGO0FBR0Esb0JBQWtCLGdCQUFnQixRQUFRLE1BQU0sR0FBRztBQUVuRCxNQUFJLHlCQUF5Qiw4QkFBOEIsZUFBZTtBQUUxRSxTQUFPLEdBQUcsSUFBSSxHQUFHLHNCQUFzQjtBQUN6QztBQVFBLElBQU0sT0FBTyxvQkFBSSxJQUFJO0FBRXJCLFNBQVMsUUFBUSxZQUFZO0FBQzNCLE1BQUksS0FBSyxJQUFJLFVBQVUsRUFBRyxRQUFPO0FBRWpDLE1BQUksUUFBUSxXQUFXLE1BQU0sR0FBRztBQUVoQyxXQUFTLElBQUksTUFBTSxTQUFTLEdBQUcsSUFBSSxHQUFHLEtBQUs7QUFDekMsUUFBSSxVQUFVLE1BQU0sTUFBTSxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUc7QUFFeEMsUUFBSSxPQUFPLEtBQUssSUFBSSxPQUFPO0FBRTNCLFFBQUksTUFBTTtBQUNSLGFBQU87QUFBQSxJQUNUO0FBQUEsRUFDRjtBQUNGO0FBRU8sU0FBUyxrQkFBa0IsWUFBWSxTQUFTO0FBQ3JELE1BQUksTUFBTSxTQUFTLE9BQU87QUFFMUIsTUFBSSxXQUFXLFNBQVMsOEJBQThCLEdBQUc7QUFDdkQsaUJBQWEsV0FBVyxNQUFNLDhCQUE4QixFQUFFLENBQUM7QUFBQSxFQUNqRTtBQUVBLE1BQUksV0FBVyxTQUFTLEdBQUcsR0FBRztBQUM1QixpQkFBYSxXQUFXLFFBQVEsT0FBTyxFQUFFO0FBQUEsRUFDM0M7QUFFQSxNQUFJLE9BQU8sUUFBUSxVQUFVO0FBRTdCLE1BQUksTUFBTTtBQUNSLFdBQU87QUFBQSxFQUNUO0FBRUEsTUFBSSxnQkFBZ0IsaUJBQUFBLFFBQUssS0FBSyxZQUFZLGNBQWM7QUFFeEQsUUFBTSxjQUFjLGVBQUFFLFFBQU8sV0FBVyxhQUFhO0FBRW5ELE1BQUksYUFBYTtBQUNmLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxrQkFBa0Isa0JBQWtCLFlBQVksRUFBRSxJQUFJLENBQUM7QUFFN0QsTUFBSSxDQUFDLGlCQUFpQjtBQUNwQixVQUFNLElBQUksTUFBTSxtQ0FBbUMsVUFBVSxFQUFFO0FBQUEsRUFDakU7QUFFQSxRQUFNLGdCQUFnQixpQkFBQUYsUUFBSyxRQUFRLGVBQWU7QUFFbEQsT0FBSyxJQUFJLGFBQWE7QUFFdEIsU0FBTztBQUNUO0FBRUEsU0FBUyxrQkFBa0IsV0FBVyxTQUFTO0FBQzdDLE1BQUksTUFBTSxTQUFTLE9BQU87QUFDMUIsTUFBSSxRQUFRLFVBQVUsTUFBTSxHQUFHO0FBRS9CLFdBQVMsSUFBSSxNQUFNLFNBQVMsR0FBRyxJQUFJLEdBQUcsS0FBSztBQUN6QyxRQUFJLFVBQVUsTUFBTSxNQUFNLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRztBQUV4QyxRQUFJLGNBQWMsaUJBQUFBLFFBQUssS0FBSyxTQUFTLGNBQWM7QUFDbkQsUUFBSSxTQUFTLGVBQUFFLFFBQU8sV0FBVyxXQUFXO0FBRTFDLFFBQUksUUFBUTtBQUNWLGFBQU87QUFBQSxJQUNUO0FBR0EsUUFBSSxZQUFZLEtBQUs7QUFDbkI7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUVBLFNBQU87QUFDVDtBQUVBLElBQU0saUJBQWlCLG9CQUFJLElBQUk7QUFPeEIsU0FBUyxXQUFXLFlBQVk7QUFDckMsUUFBTSxZQUFZLGtCQUFrQixVQUFVO0FBQzlDLFFBQU0sV0FBVyxZQUFZLFNBQVM7QUFFdEMsTUFBSSxTQUFTLGFBQWEsR0FBRztBQU8zQixXQUFPLFNBQVM7QUFBQSxFQUNsQjtBQU1BLE1BQUksZ0JBQWdCLGlCQUFBRixRQUFLLEtBQUssV0FBVyx1QkFBdUI7QUFTaEUsTUFBSSxlQUFBRSxRQUFPLFdBQVcsYUFBYSxHQUFHO0FBRXBDLFVBQU0sUUFBUSxXQUFXLGFBQWE7QUFDdEMsVUFBTSxNQUFNLE1BQU0sa0JBQWtCO0FBRXBDLFdBQU8sSUFBSSxnQkFBZ0IsU0FBUztBQUFBLEVBQ3RDO0FBS0EsU0FBTyxTQUFTO0FBQ2xCO0FBS0EsU0FBUyxZQUFZLFdBQVc7QUFDOUIsTUFBSSxXQUFXLGVBQWUsSUFBSSxTQUFTO0FBRTNDLE1BQUksVUFBVTtBQUNaLFdBQU87QUFBQSxFQUNUO0FBRUEsTUFBSSxTQUFTLGVBQUFBLFFBQU8sYUFBYSxpQkFBQUYsUUFBSyxLQUFLLFdBQVcsY0FBYyxDQUFDO0FBQ3JFLE1BQUksVUFBVSxPQUFPLFNBQVM7QUFDOUIsTUFBSSxPQUFPLEtBQUssTUFBTSxPQUFPO0FBRTdCLGlCQUFlLElBQUksV0FBVyxJQUFJO0FBRWxDLFNBQU87QUFDVDs7O0FEMWRPLFNBQVMsWUFBWSxVQUFVO0FBQ3BDLE1BQUksV0FBVztBQUNmLE1BQUksWUFBWSxrQkFBa0IsUUFBUTtBQVUxQyxNQUFJLFlBQVksU0FBUyxTQUFTLGtCQUFBRyxRQUFLLEtBQUssV0FBVyxLQUFLLENBQUM7QUFDN0QsTUFBSSxZQUFZLFNBQVMsU0FBUyxrQkFBQUEsUUFBSyxLQUFLLFdBQVcsS0FBSyxDQUFDO0FBRTdELE1BQ0UsRUFBRSxhQUFhLGNBQ2YsQ0FBQyxTQUFTLFNBQVMsMkJBQTJCLEdBQzlDO0FBQ0EsUUFBSSxjQUFjLFNBQVMsUUFBUSxXQUFXLEVBQUU7QUFDaEQsUUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLElBQUksWUFBWSxNQUFNLEdBQUcsRUFBRSxPQUFPLE9BQU87QUFDakUsUUFBSSxRQUFRO0FBRVosUUFBSSxXQUFXLFdBQVcsR0FBRyxHQUFHO0FBQzlCLFVBQUksQ0FBQyxFQUFFLEdBQUcsTUFBTSxJQUFJO0FBRXBCLGNBQVE7QUFBQSxJQUNWO0FBRUEsUUFBSSxXQUFXLGtCQUFBQSxRQUFLLEtBQUssR0FBRyxLQUFLO0FBUWpDLFFBQUksZ0JBQWdCLGtCQUFBQSxRQUFLLEtBQUssV0FBVyxPQUFPLFFBQVE7QUFFeEQsV0FBTztBQUFBLEVBQ1Q7QUFRQSxNQUFJLFNBQVMsU0FBUyx5Q0FBeUMsR0FBRztBQUNoRSxRQUFJLGdCQUFnQixTQUFTO0FBQUEsTUFDM0I7QUFBQSxNQUNBO0FBQUEsSUFDRjtBQUVBLFdBQU87QUFBQSxFQUNUO0FBR0EsTUFBSSxDQUFDLFNBQVMsU0FBUyxTQUFTLEdBQUc7QUFDakMsV0FBTztBQUFBLEVBQ1Q7QUFLQSxTQUFPO0FBQ1Q7OztBSS9FQSxtQ0FBbUI7OztBQ09aLFNBQVMsWUFBWSxXQUFXLFNBQVMsY0FBYztBQUM1RCxRQUFNLFVBQVUsVUFBVSxNQUFNLEtBQUs7QUFDckMsUUFBTSxpQkFBaUIsUUFDcEIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUNmLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLEVBQ25CLElBQUksQ0FBQyxNQUFNO0FBQ1YsUUFBSSxDQUFDLGdCQUFnQixhQUFhLElBQUksQ0FBQyxHQUFHO0FBQ3hDLFVBQUksRUFBRSxTQUFTLE9BQU8sRUFBRyxRQUFPO0FBRWhDLGFBQU8sSUFBSSxNQUFNO0FBQUEsSUFDbkI7QUFFQSxXQUFPO0FBQUEsRUFDVCxDQUFDLEVBQ0EsS0FBSyxHQUFHO0FBRVgsUUFBTSw2QkFBNkIsVUFBVTtBQUFBLElBQzNDLFVBQVUsVUFBVSxFQUFFLFFBQVE7QUFBQSxJQUM5QjtBQUFBLEVBQ0Y7QUFFQSxTQUFPO0FBQ1Q7OztBRHpCTyxTQUFTLGVBQWUsRUFBRSxTQUFTLE1BQU0sUUFBUSxHQUFHO0FBQ3pELE1BQUksUUFBUSxDQUFDO0FBR2IsTUFBSSx3QkFBd0IsQ0FBQyxnQkFBZ0IsYUFBYTtBQUUxRCxXQUFTLGNBQWMsS0FBSztBQUMxQixRQUFJLENBQUMsSUFBSyxRQUFPO0FBRWpCLFdBQU8sc0JBQXNCLEtBQUssQ0FBQyxjQUFjLGNBQWMsR0FBRztBQUFBLEVBQ3BFO0FBRUEsU0FBTztBQUFBLElBQ0wsU0FBUyxNQUFNO0FBQ2IsVUFBSSxLQUFLLFNBQVMsU0FBUztBQUN6QixZQUFJLEtBQUssTUFBTSxTQUFTLGNBQWMsS0FBSyxNQUFNLE9BQU87QUFDdEQsZ0JBQU0sZUFBZSxZQUFZLEtBQUssTUFBTSxPQUFPLFNBQVMsT0FBTztBQUVuRSxlQUFLLE1BQU0sUUFBUTtBQUFBLFFBQ3JCLFdBQVcsS0FBSyxNQUFNLFNBQVMsbUJBQW1CO0FBQ2hELG1CQUFTLFFBQVEsS0FBSyxNQUFNLE9BQU87QUFDakMsZ0JBQUksS0FBSyxTQUFTLGNBQWMsS0FBSyxPQUFPO0FBQzFDLG9CQUFNLGVBQWUsWUFBWSxLQUFLLE9BQU8sU0FBUyxPQUFPO0FBRTdELG1CQUFLLFFBQVE7QUFBQSxZQUNmLFdBQVcsS0FBSyxTQUFTLHFCQUFxQjtBQUM1QywyQ0FBQUMsUUFBTyxTQUFTLE1BQU07QUFBQSxnQkFDcEIsY0FBY0MsT0FBTTtBQUNsQix3QkFBTSxlQUFlO0FBQUEsb0JBQ25CQSxNQUFLO0FBQUEsb0JBQ0w7QUFBQSxvQkFDQTtBQUFBLGtCQUNGO0FBRUEsa0JBQUFBLE1BQUssUUFBUTtBQUFBLGdCQUNmO0FBQUEsY0FDRixDQUFDO0FBQUEsWUFDSDtBQUFBLFVBQ0Y7QUFBQSxRQUNGO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxJQUVBLFlBQVksTUFBTTtBQUNoQixVQUFJLEtBQUssSUFBSSxLQUFLLEdBQUcsR0FBRztBQUV0QixjQUFNLFlBQVksS0FBSyxXQUFXLEtBQUssQ0FBQyxTQUFTLEtBQUssU0FBUyxPQUFPO0FBRXRFLFlBQUksV0FBVztBQUNiLG9CQUFVLE1BQU0sU0FBUyxNQUFNO0FBQUEsUUFDakMsT0FBTztBQUVMLGVBQUssV0FBVztBQUFBLFlBQ2QsNkJBQUFELFFBQU8sU0FBUyxLQUFLLFNBQVMsNkJBQUFBLFFBQU8sU0FBUyxLQUFLLE9BQU8sQ0FBQztBQUFBLFVBQzdEO0FBQUEsUUFDRjtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsSUFFQSxLQUFLO0FBQUEsTUFDSCxNQUFNLE1BQU07QUFDVixjQUFNLEtBQUssSUFBSTtBQUFBLE1BQ2pCO0FBQUEsTUFDQSxPQUFPO0FBQ0wsY0FBTSxJQUFJO0FBQUEsTUFDWjtBQUFBLElBQ0Y7QUFBQSxJQUVBLGtCQUFrQixNQUFNO0FBQ3RCLFVBQUk7QUFFSixVQUNFLGNBQWMsU0FBUyxLQUFLLElBQUksQ0FBQyxLQUNqQyxLQUFLLFFBQVEsV0FBVyxLQUN4QixLQUFLLE9BQU8sQ0FBQyxFQUFFLFNBQVMsaUJBQ3hCO0FBQ0EsbUJBQVcsS0FBSyxPQUFPLENBQUMsRUFBRTtBQUFBLE1BQzVCO0FBRUEsVUFDRSxjQUFjLFNBQVMsS0FBSyxNQUFNLElBQUksQ0FBQyxLQUN2QyxLQUFLLE1BQU0sUUFBUSxXQUFXLEtBQzlCLEtBQUssTUFBTSxPQUFPLENBQUMsRUFBRSxTQUFTLGlCQUM5QjtBQUNBLG1CQUFXLEtBQUssS0FBSyxPQUFPLENBQUMsRUFBRTtBQUFBLE1BQ2pDO0FBRUEsVUFBSSxVQUFVO0FBQ1osY0FBTSxXQUFXLDZCQUFBQSxRQUFPLFNBQVMsS0FBSyxZQUFZLFVBQVUsT0FBTyxDQUFDO0FBQ3BFLGNBQU0sU0FBUyxNQUFNLE1BQU0sU0FBUyxDQUFDO0FBRXJDLFlBQUksT0FBTyxTQUFTLFlBQVk7QUFDOUIsaUJBQU8sWUFBWTtBQUFBLFFBQ3JCO0FBRUEsZUFBTztBQUFBLE1BQ1Q7QUFBQSxJQUNGO0FBQUEsSUFFQSxjQUFjLE1BQU07QUFDbEIsVUFDRSxjQUFjLFNBQVMsS0FBSyxJQUFJLENBQUMsS0FDakMsS0FBSyxRQUFRLFdBQVcsS0FDeEIsS0FBSyxPQUFPLENBQUMsRUFBRSxTQUFTLGlCQUN4QjtBQUNBLGNBQU0sV0FBVyxLQUFLLE9BQU8sQ0FBQyxFQUFFO0FBQ2hDLGNBQU0sV0FBVyw2QkFBQUEsUUFBTyxTQUFTO0FBQUEsVUFDL0I7QUFBQSxVQUNBLFlBQVksVUFBVSxPQUFPO0FBQUEsUUFDL0I7QUFFQSxlQUFPO0FBQUEsTUFDVDtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0Y7QUFFQSxTQUFTLFNBQVNFLE9BQU07QUFDdEIsTUFBSSxDQUFDQSxNQUFNO0FBRVgsTUFBSSxXQUFXQSxPQUFNO0FBQ25CLFdBQU9BLE1BQUs7QUFBQSxFQUNkO0FBTUEsU0FBT0EsTUFBSztBQUNkOzs7QVJySEEsSUFBTSxhQUFhO0FBQUEsRUFDakIsTUFBTTtBQUFBLEVBQ04sU0FBUyxDQUFDO0FBQ1o7QUFLTyxTQUFTLGFBQWEsUUFBUTtBQUtuQyxTQUFPLFNBQVMsVUFBVSxLQUFLO0FBQzdCLFFBQUksYUFBYSxlQUFlLElBQUksVUFBVTtBQUFBLE1BQzVDLGlCQUFpQixPQUFPO0FBQUEsTUFDeEIsS0FBSyxRQUFRLElBQUk7QUFBQSxJQUNuQixDQUFDO0FBRUQsUUFBSSxDQUFDLFlBQVk7QUFDZixhQUFPO0FBQUEsSUFDVDtBQUVBLFFBQUksZUFBZSxZQUFZLElBQUksUUFBUTtBQUMzQyxRQUFJLGFBQWEsUUFBUSxZQUFZO0FBRXJDLFFBQUksVUFBVSxXQUFXLFlBQVk7QUFDckMsUUFBSSxPQUFPLFdBQVcsT0FBTztBQUM3QixRQUFJLFVBQVUsbUJBQW1CLFVBQVU7QUFFM0MsUUFBSSxDQUFDLE1BQU07QUFDVCxhQUFPO0FBQUEsSUFDVDtBQUVBLFFBQUksV0FBVyxlQUFlO0FBQUEsTUFDNUIsU0FBUyxLQUFLO0FBQUEsTUFDZCxNQUFNLEtBQUs7QUFBQSxNQUNYO0FBQUEsSUFDRixDQUFDO0FBRUQsV0FBTztBQUFBLE1BQ0wsTUFBTTtBQUFBLE1BQ04sU0FBUztBQUFBO0FBQUEsUUFFUCxHQUFHO0FBQUE7QUFBQTtBQUFBLFFBR0gsWUFBWSxNQUFNO0FBQ2hCLGlCQUFPLFNBQVMsU0FBUyxHQUFHLElBQUk7QUFBQSxRQUNsQztBQUFBLFFBQ0EsZUFBZSxNQUFNO0FBQ25CLGlCQUFPLFNBQVMsWUFBWSxHQUFHLElBQUk7QUFBQSxRQUNyQztBQUFBLFFBQ0EscUJBQXFCLE1BQU07QUFDekIsaUJBQU8sU0FBUyxrQkFBa0IsR0FBRyxJQUFJO0FBQUEsUUFDM0M7QUFBQSxRQUNBLGlCQUFpQixNQUFNO0FBQ3JCLGlCQUFPLFNBQVMsY0FBYyxHQUFHLElBQUk7QUFBQSxRQUN2QztBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUNGOyIsCiAgIm5hbWVzIjogWyJwYXJzZXIiLCAicG9zdGNzcyIsICJpbXBvcnRfbm9kZV9wYXRoIiwgImhhc2giLCAicGF0aCIsICJhc3NlcnQiLCAiZnNTeW5jIiwgInBhdGgiLCAicmVjYXN0IiwgIm5vZGUiLCAicGF0aCJdCn0K
752
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2J1aWxkL3RlbXBsYXRlLXBsdWdpbi5qcyIsICIuLi8uLi9zcmMvbGliL2Nzcy9yZXdyaXRlLmpzIiwgIi4uLy4uL3NyYy9saWIvY3NzL3V0aWxzLmpzIiwgIi4uLy4uL3NyYy9saWIvcGF0aC9tZDUuanMiLCAiLi4vLi4vc3JjL2xpYi9wYXRoL3RlbXBsYXRlLXRyYW5zZm9ybS1wYXRocy5qcyIsICIuLi8uLi9zcmMvbGliL3BhdGgvdXRpbHMuanMiLCAiLi4vLi4vc3JjL2xpYi9wYXRoL2hhc2gtZnJvbS1tb2R1bGUtcGF0aC5qcyIsICIuLi8uLi9zcmMvbGliL3JlcXVlc3QuanMiLCAiLi4vLi4vc3JjL2xpYi9yZXdyaXRlSGJzLmpzIiwgIi4uLy4uL3NyYy9saWIvcmVuYW1lQ2xhc3MuanMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQHR5cGVkZWYge2ltcG9ydCgnQGdsaW1tZXIvc3ludGF4JykuQVNUUGx1Z2lufSBBU1RQbHVnaW5cbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BnbGltbWVyL3N5bnRheCcpLkFTVFBsdWdpbkVudmlyb25tZW50fSBBU1RQbHVnaW5FbnZpcm9ubWVudFxuICpcbiAqL1xuXG5pbXBvcnQgeyByZXdyaXRlQ3NzIH0gZnJvbSAnLi4vbGliL2Nzcy9yZXdyaXRlLmpzJztcbmltcG9ydCB7IGdldENTU0NvbnRlbnRJbmZvLCBnZXRDU1NJbmZvIH0gZnJvbSAnLi4vbGliL2Nzcy91dGlscy5qcyc7XG5pbXBvcnQgeyBmaXhGaWxlbmFtZSB9IGZyb20gJy4uL2xpYi9wYXRoL3RlbXBsYXRlLXRyYW5zZm9ybS1wYXRocy5qcyc7XG5pbXBvcnQge1xuICBhcHBQYXRoLFxuICBjc3NQYXRoRm9yLFxuICBoYXNoRnJvbU1vZHVsZVBhdGgsXG4gIGlzUmVsZXZhbnRGaWxlLFxufSBmcm9tICcuLi9saWIvcGF0aC91dGlscy5qcyc7XG5pbXBvcnQgeyBtYWtlUmVxdWVzdCB9IGZyb20gJy4uL2xpYi9yZXF1ZXN0LmpzJztcbmltcG9ydCB7IHRlbXBsYXRlUGx1Z2luIH0gZnJvbSAnLi4vbGliL3Jld3JpdGVIYnMuanMnO1xuXG5jb25zdCBub29wUGx1Z2luID0ge1xuICBuYW1lOiAnZW1iZXItc2NvcGVkLWNzczpub29wJyxcbiAgdmlzaXRvcjoge30sXG59O1xuXG4vKipcbiAqIEByZXR1cm5zIHtBU1RQbHVnaW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQbHVnaW4oY29uZmlnKSB7XG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge0FTVFBsdWdpbkVudmlyb25tZW50fSBlbnZcbiAgICovXG4gIHJldHVybiBmdW5jdGlvbiBzY29wZWRDc3MoZW52KSB7XG4gICAgbGV0IGN3ZCA9IHByb2Nlc3MuY3dkKCk7XG4gICAgbGV0IGlzUmVsZXZhbnQgPSBpc1JlbGV2YW50RmlsZShlbnYuZmlsZW5hbWUsIHtcbiAgICAgIGFkZGl0aW9uYWxSb290czogY29uZmlnLmFkZGl0aW9uYWxSb290cyxcbiAgICAgIGN3ZCxcbiAgICB9KTtcblxuICAgIGlmICghaXNSZWxldmFudCkge1xuICAgICAgcmV0dXJuIG5vb3BQbHVnaW47XG4gICAgfVxuXG4gICAgbGV0IGFic29sdXRlUGF0aCA9IGZpeEZpbGVuYW1lKGVudi5maWxlbmFtZSk7XG4gICAgbGV0IG1vZHVsZVBhdGggPSBhcHBQYXRoKGFic29sdXRlUGF0aCk7XG4gICAgbGV0IHBvc3RmaXggPSBoYXNoRnJvbU1vZHVsZVBhdGgobW9kdWxlUGF0aCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbGlzdCBvZiBuYWtlZCB0YWcgc2VsZWN0b3JzIGZvdW5kIGluIHRoZSBDU1NcbiAgICAgKlxuICAgICAqIEB0eXBlIHtTZXQ8c3RyaW5nPn1cbiAgICAgKi9cbiAgICBsZXQgc2NvcGVkVGFncyA9IG5ldyBTZXQoKTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBsaXN0IG9mIGNsYXNzZXMgZm91bmQgaW4gdGhlIENTU1xuICAgICAqXG4gICAgICogQHR5cGUge1NldDxzdHJpbmc+fVxuICAgICAqL1xuICAgIGxldCBzY29wZWRDbGFzc2VzID0gbmV3IFNldCgpO1xuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHt7IHRhZ3M6IFNldDxzdHJpbmc+OyBjbGFzc2VzOiBTZXQ8c3RyaW5nPiB9fSBpbmZvXG4gICAgICovXG4gICAgZnVuY3Rpb24gYWRkSW5mbyhpbmZvKSB7XG4gICAgICBmb3IgKGxldCBpdGVtIG9mIGluZm8udGFncykge1xuICAgICAgICBzY29wZWRUYWdzLmFkZChpdGVtKTtcbiAgICAgIH1cblxuICAgICAgZm9yIChsZXQgaXRlbSBvZiBpbmZvLmNsYXNzZXMpIHtcbiAgICAgICAgc2NvcGVkQ2xhc3Nlcy5hZGQoaXRlbSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGNzc1BhdGggPSBjc3NQYXRoRm9yKGFic29sdXRlUGF0aCk7XG4gICAgbGV0IGluZm8gPSBnZXRDU1NJbmZvKGNzc1BhdGgpO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyB3aWxsIGJlIGZhbHNleSBpZiB3ZSBkb24ndCBoYXZlIGEgY28tbG9jYXRlZCBDU1MgZmlsZS5cbiAgICAgKiBXZSdsbCBzdGlsbCB3YW50IHRvIGNoZWNrIGZvciBlbWJlZGRlZCA8c3R5bGUgc2NvcGVkPiB0YWdzIHRob3VnaC5cbiAgICAgKi9cbiAgICBpZiAoaW5mbykge1xuICAgICAgYWRkSW5mbyhpbmZvKTtcblxuICAgICAgbGV0IGxvY2FsQ3NzUGF0aCA9IGNzc1BhdGgucmVwbGFjZShjd2QgKyAnLycsICcnKTtcbiAgICAgIGxldCBzY29wZWRDc3MgPSByZXdyaXRlQ3NzKFxuICAgICAgICBpbmZvLmNzcyxcbiAgICAgICAgcG9zdGZpeCxcbiAgICAgICAgbG9jYWxDc3NQYXRoLFxuICAgICAgICBjb25maWcubGF5ZXJOYW1lLFxuICAgICAgKTtcblxuICAgICAgbGV0IGNzc1JlcXVlc3QgPSBtYWtlUmVxdWVzdChwb3N0Zml4LCBpbmZvLmlkLCBzY29wZWRDc3MpO1xuXG4gICAgICAvKipcbiAgICAgICAqIFdpdGggdGhpcyB3ZSBkb24ndCBuZWVkIGEgSlMgcGx1Z2luXG4gICAgICAgKi9cbiAgICAgIGVudi5tZXRhLmpzdXRpbHMuaW1wb3J0Rm9yU2lkZUVmZmVjdChjc3NSZXF1ZXN0KTtcbiAgICB9XG5cbiAgICBsZXQgdmlzaXRvcnMgPSB0ZW1wbGF0ZVBsdWdpbih7XG4gICAgICBjbGFzc2VzOiBzY29wZWRDbGFzc2VzLFxuICAgICAgdGFnczogc2NvcGVkVGFncyxcbiAgICAgIHBvc3RmaXgsXG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogJ2VtYmVyLXNjb3BlZC1jc3M6dGVtcGxhdGUtcGx1Z2luJyxcbiAgICAgIHZpc2l0b3I6IHtcbiAgICAgICAgLy8gU3RhY2sgTWFuYWdlclxuICAgICAgICAuLi52aXNpdG9ycyxcblxuICAgICAgICAvKipcbiAgICAgICAgICogV2UgaGF2ZSB0byBlYWdlcmx5IGdldCB0aGUgPHN0eWxlIHNjb3BlZD4gY29udGVudHMsIHNvIHdlIGNhbiBwcmUtcGFyc2VcbiAgICAgICAgICogdGhlIHRhZ3MgYW5kIGNsYXNzZXMgdG8gdGhlbiBwYXNzIHRvIHRoZSBvdGhlciB2aXNpdG9ycyBzbyB0aGF0IHRoZXkgY2FuXG4gICAgICAgICAqIGFwcHJvcHJpYXRlbHkgY2hhbmdlIG1hdGNoaW5nIGNsYXNzZXMgLyB0YWdzLlxuICAgICAgICAgKi9cbiAgICAgICAgVGVtcGxhdGUobm9kZSkge1xuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIFdlIG9ubHkgYWxsb3cgYSBzY29wZWQgPHN0eWxlPiBhdCB0aGUgcm9vdFxuICAgICAgICAgICAqL1xuICAgICAgICAgIGxldCBzdHlsZVRhZyA9IG5vZGUuYm9keS5maW5kKFxuICAgICAgICAgICAgKG4pID0+IG4udHlwZSA9PT0gJ0VsZW1lbnROb2RlJyAmJiBuLnRhZyA9PT0gJ3N0eWxlJyxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKGhhc1Njb3BlZEF0dHJpYnV0ZShzdHlsZVRhZykpIHtcbiAgICAgICAgICAgIGxldCBjc3MgPSB0ZXh0Q29udGVudChzdHlsZVRhZyk7XG4gICAgICAgICAgICBsZXQgaW5mbyA9IGdldENTU0NvbnRlbnRJbmZvKGNzcyk7XG4gICAgICAgICAgICBsZXQgbG9jYWxDc3NQYXRoID0gYDxpbmxpbmU+L2AgKyBjc3NQYXRoLnJlcGxhY2UoY3dkICsgJy8nLCAnJyk7XG4gICAgICAgICAgICBsZXQgc2NvcGVkQ3NzID0gcmV3cml0ZUNzcyhcbiAgICAgICAgICAgICAgaW5mby5jc3MsXG4gICAgICAgICAgICAgIHBvc3RmaXgsXG4gICAgICAgICAgICAgIGxvY2FsQ3NzUGF0aCxcbiAgICAgICAgICAgICAgY29uZmlnLmxheWVyTmFtZSxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGFkZEluZm8oaW5mbyk7XG5cbiAgICAgICAgICAgIGxldCBjc3NSZXF1ZXN0ID0gbWFrZVJlcXVlc3QocG9zdGZpeCwgaW5mby5pZCwgc2NvcGVkQ3NzKTtcblxuICAgICAgICAgICAgZW52Lm1ldGEuanN1dGlscy5pbXBvcnRGb3JTaWRlRWZmZWN0KGNzc1JlcXVlc3QpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICAvLyBWaXNpdG9ycyBicm9rZW4gb3V0IGxpa2UgdGhpcyBzbyB3ZSBjYW4gY29uZGl0aW9uYWxseVxuICAgICAgICAvLyBkZWJ1ZyBiYXNlZCBvbiBmaWxlIHBhdGguXG4gICAgICAgIEF0dHJOb2RlKC4uLmFyZ3MpIHtcbiAgICAgICAgICByZXR1cm4gdmlzaXRvcnMuQXR0ck5vZGUoLi4uYXJncyk7XG4gICAgICAgIH0sXG4gICAgICAgIEVsZW1lbnROb2RlKG5vZGUsIHdhbGtlcikge1xuICAgICAgICAgIC8vIGNsYXNzIGF0dHJpYnV0ZSBoYW5kbGluZ1xuICAgICAgICAgIHZpc2l0b3JzLkVsZW1lbnROb2RlKG5vZGUsIHdhbGtlcik7XG5cbiAgICAgICAgICBpZiAoaGFzU2NvcGVkQXR0cmlidXRlKG5vZGUpKSB7XG4gICAgICAgICAgICBpZiAod2Fsa2VyLnBhcmVudD8ubm9kZS50eXBlICE9PSAnVGVtcGxhdGUnKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAnPHN0eWxlIHNjb3BlZD4gdGFncyBtdXN0IGJlIGF0IHRoZSByb290IG9mIHRoZSB0ZW1wbGF0ZSwgdGhleSBjYW5ub3QgYmUgbmVzdGVkJyxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gUmV0dXJuaW5nIG51bGwgcmVtb3ZlcyB0aGUgbm9kZVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBNdXN0YWNoZVN0YXRlbWVudCguLi5hcmdzKSB7XG4gICAgICAgICAgcmV0dXJuIHZpc2l0b3JzLk11c3RhY2hlU3RhdGVtZW50KC4uLmFyZ3MpO1xuICAgICAgICB9LFxuICAgICAgICBTdWJFeHByZXNzaW9uKC4uLmFyZ3MpIHtcbiAgICAgICAgICByZXR1cm4gdmlzaXRvcnMuU3ViRXhwcmVzc2lvbiguLi5hcmdzKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfTtcbn1cblxuLyoqXG4gKiBUaGFua3MsIENhcmRTdGFjayBhbmQgQGVmNCBmb3IgdGhpcyBjb2RlLlxuICovXG5jb25zdCBTQ09QRURfQVRUUklCVVRFX05BTUUgPSAnc2NvcGVkJztcblxuZnVuY3Rpb24gaGFzU2NvcGVkQXR0cmlidXRlKG5vZGUpIHtcbiAgaWYgKCFub2RlKSByZXR1cm47XG4gIGlmIChub2RlLnRhZyAhPT0gJ3N0eWxlJykgcmV0dXJuO1xuICBpZiAobm9kZS50eXBlICE9PSAnRWxlbWVudE5vZGUnKSByZXR1cm47XG5cbiAgcmV0dXJuIG5vZGUuYXR0cmlidXRlcy5zb21lKFxuICAgIChhdHRyaWJ1dGUpID0+IGF0dHJpYnV0ZS5uYW1lID09PSBTQ09QRURfQVRUUklCVVRFX05BTUUsXG4gICk7XG59XG5cbmZ1bmN0aW9uIHRleHRDb250ZW50KG5vZGUpIHtcbiAgbGV0IHRleHRDaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW4uZmlsdGVyKChjKSA9PiBjLnR5cGUgPT09ICdUZXh0Tm9kZScpO1xuXG4gIHJldHVybiB0ZXh0Q2hpbGRyZW4ubWFwKChjKSA9PiBjLmNoYXJzKS5qb2luKCcnKTtcbn1cbiIsICJpbXBvcnQgcG9zdGNzcyBmcm9tICdwb3N0Y3NzJztcbmltcG9ydCBwYXJzZXIgZnJvbSAncG9zdGNzcy1zZWxlY3Rvci1wYXJzZXInO1xuXG5pbXBvcnQgeyBpc0luc2lkZUdsb2JhbCB9IGZyb20gJy4vdXRpbHMuanMnO1xuXG5mdW5jdGlvbiByZXdyaXRlU2VsZWN0b3Ioc2VsLCBwb3N0Zml4KSB7XG4gIGNvbnN0IHRyYW5zZm9ybSA9IChzZWxlY3RvcnMpID0+IHtcbiAgICBzZWxlY3RvcnMud2Fsaygoc2VsZWN0b3IpID0+IHtcbiAgICAgIGlmIChzZWxlY3Rvci50eXBlID09PSAnY2xhc3MnICYmICFpc0luc2lkZUdsb2JhbChzZWxlY3RvcikpIHtcbiAgICAgICAgc2VsZWN0b3IudmFsdWUgKz0gJ18nICsgcG9zdGZpeDtcbiAgICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IudHlwZSA9PT0gJ3RhZycgJiYgIWlzSW5zaWRlR2xvYmFsKHNlbGVjdG9yKSkge1xuICAgICAgICBzZWxlY3Rvci5yZXBsYWNlV2l0aChcbiAgICAgICAgICBwYXJzZXIudGFnKHsgdmFsdWU6IHNlbGVjdG9yLnZhbHVlIH0pLFxuICAgICAgICAgIHBhcnNlci5jbGFzc05hbWUoeyB2YWx1ZTogcG9zdGZpeCB9KSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIHJlbW92ZSA6Z2xvYmFsXG4gICAgc2VsZWN0b3JzLndhbGsoKHNlbGVjdG9yKSA9PiB7XG4gICAgICBpZiAoc2VsZWN0b3IudHlwZSA9PT0gJ3BzZXVkbycgJiYgc2VsZWN0b3IudmFsdWUgPT09ICc6Z2xvYmFsJykge1xuICAgICAgICBzZWxlY3Rvci5yZXBsYWNlV2l0aCguLi5zZWxlY3Rvci5ub2Rlcyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG4gIGNvbnN0IHRyYW5zZm9ybWVkID0gcGFyc2VyKHRyYW5zZm9ybSkucHJvY2Vzc1N5bmMoc2VsKTtcblxuICByZXR1cm4gdHJhbnNmb3JtZWQ7XG59XG5cbmZ1bmN0aW9uIGlzSW5zaWRlS2V5ZnJhbWVzKG5vZGUpIHtcbiAgY29uc3QgcGFyZW50ID0gbm9kZS5wYXJlbnQ7XG5cbiAgaWYgKCFwYXJlbnQpIHJldHVybiBmYWxzZTtcbiAgaWYgKHBhcmVudC50eXBlID09PSAnYXRydWxlJyAmJiBwYXJlbnQubmFtZSA9PT0gJ2tleWZyYW1lcycpIHJldHVybiB0cnVlO1xuXG4gIHJldHVybiBpc0luc2lkZUtleWZyYW1lcyhwYXJlbnQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmV3cml0ZUNzcyhjc3MsIHBvc3RmaXgsIGZpbGVOYW1lLCBsYXllck5hbWUpIHtcbiAgY29uc3QgbGF5ZXJOYW1lV2l0aERlZmF1bHQgPSBsYXllck5hbWUgPz8gJ2NvbXBvbmVudHMnO1xuICBjb25zdCBhc3QgPSBwb3N0Y3NzLnBhcnNlKGNzcyk7XG5cbiAgYXN0LndhbGsoKG5vZGUpID0+IHtcbiAgICBpZiAobm9kZS50eXBlID09PSAncnVsZScgJiYgIWlzSW5zaWRlS2V5ZnJhbWVzKG5vZGUpKSB7XG4gICAgICBub2RlLnNlbGVjdG9yID0gcmV3cml0ZVNlbGVjdG9yKG5vZGUuc2VsZWN0b3IsIHBvc3RmaXgpO1xuICAgIH1cbiAgfSk7XG5cbiAgY29uc3QgcmV3cml0dGVuQ3NzID0gYXN0LnRvU3RyaW5nKCk7XG5cbiAgaWYgKCFsYXllck5hbWVXaXRoRGVmYXVsdCkge1xuICAgIHJldHVybiBgLyogJHtmaWxlTmFtZX0gKi9cXG4ke3Jld3JpdHRlbkNzc31cXG5gO1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICBgLyogJHtmaWxlTmFtZX0gKi9cXG5AbGF5ZXIgJHtsYXllck5hbWVXaXRoRGVmYXVsdH0ge1xcblxcbmAgK1xuICAgIHJld3JpdHRlbkNzcyArXG4gICAgJ1xcbn1cXG4nXG4gICk7XG59XG5cbiIsICJpbXBvcnQgeyBleGlzdHNTeW5jLCByZWFkRmlsZVN5bmMgfSBmcm9tICdmcyc7XG5pbXBvcnQgcG9zdGNzcyBmcm9tICdwb3N0Y3NzJztcbmltcG9ydCBwYXJzZXIgZnJvbSAncG9zdGNzcy1zZWxlY3Rvci1wYXJzZXInO1xuXG5pbXBvcnQgeyBtZDUgfSBmcm9tICcuLi9wYXRoL21kNS5qcyc7XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGNzc1xuICogQHJldHVybiB7c3RyaW5nfSBoYXNoZWQgZG93biB2ZXJzaW9uIG9mIHRoZSBDU1MgZm9yIGRpc2FtYmlndWF0aW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNoKGNzcykge1xuICByZXR1cm4gYGNzcy0ke21kNShjc3MpfWA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0luc2lkZUdsb2JhbChub2RlLCBmdW5jKSB7XG4gIGNvbnN0IHBhcmVudCA9IG5vZGUucGFyZW50O1xuXG4gIGlmICghcGFyZW50KSByZXR1cm4gZmFsc2U7XG4gIGlmIChwYXJlbnQudHlwZSA9PT0gJ3BzZXVkbycgJiYgcGFyZW50LnZhbHVlID09PSAnOmdsb2JhbCcpIHJldHVybiB0cnVlO1xuXG4gIHJldHVybiBpc0luc2lkZUdsb2JhbChwYXJlbnQsIGZ1bmMpO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBjc3NQYXRoIHBhdGggdG8gYSBDU1MgZmlsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q1NTSW5mbyhjc3NQYXRoKSB7XG4gIGlmICghZXhpc3RzU3luYyhjc3NQYXRoKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgbGV0IGNzcyA9IHJlYWRGaWxlU3luYyhjc3NQYXRoLCAndXRmOCcpO1xuXG4gIHJldHVybiBnZXRDU1NDb250ZW50SW5mbyhjc3MpO1xufVxuXG4vKipcbiAqIFdlIHVzZSB0aGlzIGZ1bmN0aW9uIHRvIGNoZWNrIGVhY2ggY2xhc3MgdXNlZCBpbiB0aGUgdGVtcGxhdGVcbiAqIHRvIHNlZSBpZiB3ZSBuZWVkIHRvIGxlYXZlIGl0IGFsb25lIG9yIHRyYW5zZm9ybSBpdFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjc3MgdGhlIENTUydzIGNvbnRlbnRzXG4gKiBAcmV0dXJuIHt7IGNsYXNzZXM6IFNldDxzdHJpbmc+LCB0YWdzOiBTZXQ8c3RyaW5nPiwgY3NzOiBzdHJpbmcsIGlkOiBzdHJpbmcgfX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENTU0NvbnRlbnRJbmZvKGNzcykge1xuICBjb25zdCBjbGFzc2VzID0gbmV3IFNldCgpO1xuICBjb25zdCB0YWdzID0gbmV3IFNldCgpO1xuXG4gIGNvbnN0IGFzdCA9IHBvc3Rjc3MucGFyc2UoY3NzKTtcblxuICBhc3Qud2Fsaygobm9kZSkgPT4ge1xuICAgIGlmIChub2RlLnR5cGUgPT09ICdydWxlJykge1xuICAgICAgZ2V0Q2xhc3Nlc0FuZFRhZ3Mobm9kZS5zZWxlY3RvciwgY2xhc3NlcywgdGFncyk7XG4gICAgfVxuICB9KTtcblxuICBsZXQgaWQgPSBoYXNoKGNzcyk7XG5cbiAgcmV0dXJuIHsgY2xhc3NlcywgdGFncywgY3NzLCBpZCB9O1xufVxuXG5mdW5jdGlvbiBnZXRDbGFzc2VzQW5kVGFncyhzZWwsIGNsYXNzZXMsIHRhZ3MpIHtcbiAgY29uc3QgdHJhbnNmb3JtID0gKHNscykgPT4ge1xuICAgIHNscy53YWxrKChzZWxlY3RvcikgPT4ge1xuICAgICAgaWYgKHNlbGVjdG9yLnR5cGUgPT09ICdjbGFzcycgJiYgIWlzSW5zaWRlR2xvYmFsKHNlbGVjdG9yKSkge1xuICAgICAgICBjbGFzc2VzLmFkZChzZWxlY3Rvci52YWx1ZSk7XG4gICAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLnR5cGUgPT09ICd0YWcnICYmICFpc0luc2lkZUdsb2JhbChzZWxlY3RvcikpIHtcbiAgICAgICAgdGFncy5hZGQoc2VsZWN0b3IudmFsdWUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIHBhcnNlcih0cmFuc2Zvcm0pLnByb2Nlc3NTeW5jKHNlbCk7XG59XG5cbiIsICIvKlxuICogSmF2YVNjcmlwdCBNRDVcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ibHVlaW1wL0phdmFTY3JpcHQtTUQ1XG4gKlxuICogQ29weXJpZ2h0IDIwMTEsIFNlYmFzdGlhbiBUc2NoYW5cbiAqIGh0dHBzOi8vYmx1ZWltcC5uZXRcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2U6XG4gKiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVFxuICpcbiAqIEJhc2VkIG9uXG4gKiBBIEphdmFTY3JpcHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFJTQSBEYXRhIFNlY3VyaXR5LCBJbmMuIE1ENSBNZXNzYWdlXG4gKiBEaWdlc3QgQWxnb3JpdGhtLCBhcyBkZWZpbmVkIGluIFJGQyAxMzIxLlxuICogVmVyc2lvbiAyLjIgQ29weXJpZ2h0IChDKSBQYXVsIEpvaG5zdG9uIDE5OTkgLSAyMDA5XG4gKiBPdGhlciBjb250cmlidXRvcnM6IEdyZWcgSG9sdCwgQW5kcmV3IEtlcGVydCwgWWRuYXIsIExvc3RpbmV0XG4gKiBEaXN0cmlidXRlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2VcbiAqIFNlZSBodHRwOi8vcGFqaG9tZS5vcmcudWsvY3J5cHQvbWQ1IGZvciBtb3JlIGluZm8uXG4gKlxuICogTW9kaWZpY2F0aW9uczpcbiAqIC0gcmVtb3ZlZCBJSUZFLCBleHBvcnRlZCBtZDUgKHRoaXMgZmlsZSBpcyBub3cgRVNNKVxuICovXG5cbi8qKlxuICogQWRkIGludGVnZXJzLCB3cmFwcGluZyBhdCAyXjMyLlxuICogVGhpcyB1c2VzIDE2LWJpdCBvcGVyYXRpb25zIGludGVybmFsbHkgdG8gd29yayBhcm91bmQgYnVncyBpbiBpbnRlcnByZXRlcnMuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IHggRmlyc3QgaW50ZWdlclxuICogQHBhcmFtIHtudW1iZXJ9IHkgU2Vjb25kIGludGVnZXJcbiAqIEByZXR1cm5zIHtudW1iZXJ9IFN1bVxuICovXG5mdW5jdGlvbiBzYWZlQWRkKHgsIHkpIHtcbiAgdmFyIGxzdyA9ICh4ICYgMHhmZmZmKSArICh5ICYgMHhmZmZmKTtcbiAgdmFyIG1zdyA9ICh4ID4+IDE2KSArICh5ID4+IDE2KSArIChsc3cgPj4gMTYpO1xuXG4gIHJldHVybiAobXN3IDw8IDE2KSB8IChsc3cgJiAweGZmZmYpO1xufVxuXG4vKipcbiAqIEJpdHdpc2Ugcm90YXRlIGEgMzItYml0IG51bWJlciB0byB0aGUgbGVmdC5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gbnVtIDMyLWJpdCBudW1iZXJcbiAqIEBwYXJhbSB7bnVtYmVyfSBjbnQgUm90YXRpb24gY291bnRcbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJvdGF0ZWQgbnVtYmVyXG4gKi9cbmZ1bmN0aW9uIGJpdFJvdGF0ZUxlZnQobnVtLCBjbnQpIHtcbiAgcmV0dXJuIChudW0gPDwgY250KSB8IChudW0gPj4+ICgzMiAtIGNudCkpO1xufVxuXG4vKipcbiAqIEJhc2ljIG9wZXJhdGlvbiB0aGUgYWxnb3JpdGhtIHVzZXMuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IHEgcVxuICogQHBhcmFtIHtudW1iZXJ9IGEgYVxuICogQHBhcmFtIHtudW1iZXJ9IGIgYlxuICogQHBhcmFtIHtudW1iZXJ9IHggeFxuICogQHBhcmFtIHtudW1iZXJ9IHMgc1xuICogQHBhcmFtIHtudW1iZXJ9IHQgdFxuICogQHJldHVybnMge251bWJlcn0gUmVzdWx0XG4gKi9cbmZ1bmN0aW9uIG1kNWNtbihxLCBhLCBiLCB4LCBzLCB0KSB7XG4gIHJldHVybiBzYWZlQWRkKGJpdFJvdGF0ZUxlZnQoc2FmZUFkZChzYWZlQWRkKGEsIHEpLCBzYWZlQWRkKHgsIHQpKSwgcyksIGIpO1xufVxuXG4vKipcbiAqIEJhc2ljIG9wZXJhdGlvbiB0aGUgYWxnb3JpdGhtIHVzZXMuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IGEgYVxuICogQHBhcmFtIHtudW1iZXJ9IGIgYlxuICogQHBhcmFtIHtudW1iZXJ9IGMgY1xuICogQHBhcmFtIHtudW1iZXJ9IGQgZFxuICogQHBhcmFtIHtudW1iZXJ9IHggeFxuICogQHBhcmFtIHtudW1iZXJ9IHMgc1xuICogQHBhcmFtIHtudW1iZXJ9IHQgdFxuICogQHJldHVybnMge251bWJlcn0gUmVzdWx0XG4gKi9cbmZ1bmN0aW9uIG1kNWZmKGEsIGIsIGMsIGQsIHgsIHMsIHQpIHtcbiAgcmV0dXJuIG1kNWNtbigoYiAmIGMpIHwgKH5iICYgZCksIGEsIGIsIHgsIHMsIHQpO1xufVxuXG4vKipcbiAqIEJhc2ljIG9wZXJhdGlvbiB0aGUgYWxnb3JpdGhtIHVzZXMuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IGEgYVxuICogQHBhcmFtIHtudW1iZXJ9IGIgYlxuICogQHBhcmFtIHtudW1iZXJ9IGMgY1xuICogQHBhcmFtIHtudW1iZXJ9IGQgZFxuICogQHBhcmFtIHtudW1iZXJ9IHggeFxuICogQHBhcmFtIHtudW1iZXJ9IHMgc1xuICogQHBhcmFtIHtudW1iZXJ9IHQgdFxuICogQHJldHVybnMge251bWJlcn0gUmVzdWx0XG4gKi9cbmZ1bmN0aW9uIG1kNWdnKGEsIGIsIGMsIGQsIHgsIHMsIHQpIHtcbiAgcmV0dXJuIG1kNWNtbigoYiAmIGQpIHwgKGMgJiB+ZCksIGEsIGIsIHgsIHMsIHQpO1xufVxuXG4vKipcbiAqIEJhc2ljIG9wZXJhdGlvbiB0aGUgYWxnb3JpdGhtIHVzZXMuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IGEgYVxuICogQHBhcmFtIHtudW1iZXJ9IGIgYlxuICogQHBhcmFtIHtudW1iZXJ9IGMgY1xuICogQHBhcmFtIHtudW1iZXJ9IGQgZFxuICogQHBhcmFtIHtudW1iZXJ9IHggeFxuICogQHBhcmFtIHtudW1iZXJ9IHMgc1xuICogQHBhcmFtIHtudW1iZXJ9IHQgdFxuICogQHJldHVybnMge251bWJlcn0gUmVzdWx0XG4gKi9cbmZ1bmN0aW9uIG1kNWhoKGEsIGIsIGMsIGQsIHgsIHMsIHQpIHtcbiAgcmV0dXJuIG1kNWNtbihiIF4gYyBeIGQsIGEsIGIsIHgsIHMsIHQpO1xufVxuXG4vKipcbiAqIEJhc2ljIG9wZXJhdGlvbiB0aGUgYWxnb3JpdGhtIHVzZXMuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IGEgYVxuICogQHBhcmFtIHtudW1iZXJ9IGIgYlxuICogQHBhcmFtIHtudW1iZXJ9IGMgY1xuICogQHBhcmFtIHtudW1iZXJ9IGQgZFxuICogQHBhcmFtIHtudW1iZXJ9IHggeFxuICogQHBhcmFtIHtudW1iZXJ9IHMgc1xuICogQHBhcmFtIHtudW1iZXJ9IHQgdFxuICogQHJldHVybnMge251bWJlcn0gUmVzdWx0XG4gKi9cbmZ1bmN0aW9uIG1kNWlpKGEsIGIsIGMsIGQsIHgsIHMsIHQpIHtcbiAgcmV0dXJuIG1kNWNtbihjIF4gKGIgfCB+ZCksIGEsIGIsIHgsIHMsIHQpO1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZSB0aGUgTUQ1IG9mIGFuIGFycmF5IG9mIGxpdHRsZS1lbmRpYW4gd29yZHMsIGFuZCBhIGJpdCBsZW5ndGguXG4gKlxuICogQHBhcmFtIHtBcnJheX0geCBBcnJheSBvZiBsaXR0bGUtZW5kaWFuIHdvcmRzXG4gKiBAcGFyYW0ge251bWJlcn0gbGVuIEJpdCBsZW5ndGhcbiAqIEByZXR1cm5zIHtBcnJheTxudW1iZXI+fSBNRDUgQXJyYXlcbiAqL1xuZnVuY3Rpb24gYmlubE1ENSh4LCBsZW4pIHtcbiAgLyogYXBwZW5kIHBhZGRpbmcgKi9cbiAgeFtsZW4gPj4gNV0gfD0gMHg4MCA8PCBsZW4gJSAzMjtcbiAgeFsoKChsZW4gKyA2NCkgPj4+IDkpIDw8IDQpICsgMTRdID0gbGVuO1xuXG4gIHZhciBpO1xuICB2YXIgb2xkYTtcbiAgdmFyIG9sZGI7XG4gIHZhciBvbGRjO1xuICB2YXIgb2xkZDtcbiAgdmFyIGEgPSAxNzMyNTg0MTkzO1xuICB2YXIgYiA9IC0yNzE3MzM4Nzk7XG4gIHZhciBjID0gLTE3MzI1ODQxOTQ7XG4gIHZhciBkID0gMjcxNzMzODc4O1xuXG4gIGZvciAoaSA9IDA7IGkgPCB4Lmxlbmd0aDsgaSArPSAxNikge1xuICAgIG9sZGEgPSBhO1xuICAgIG9sZGIgPSBiO1xuICAgIG9sZGMgPSBjO1xuICAgIG9sZGQgPSBkO1xuXG4gICAgYSA9IG1kNWZmKGEsIGIsIGMsIGQsIHhbaV0sIDcsIC02ODA4NzY5MzYpO1xuICAgIGQgPSBtZDVmZihkLCBhLCBiLCBjLCB4W2kgKyAxXSwgMTIsIC0zODk1NjQ1ODYpO1xuICAgIGMgPSBtZDVmZihjLCBkLCBhLCBiLCB4W2kgKyAyXSwgMTcsIDYwNjEwNTgxOSk7XG4gICAgYiA9IG1kNWZmKGIsIGMsIGQsIGEsIHhbaSArIDNdLCAyMiwgLTEwNDQ1MjUzMzApO1xuICAgIGEgPSBtZDVmZihhLCBiLCBjLCBkLCB4W2kgKyA0XSwgNywgLTE3NjQxODg5Nyk7XG4gICAgZCA9IG1kNWZmKGQsIGEsIGIsIGMsIHhbaSArIDVdLCAxMiwgMTIwMDA4MDQyNik7XG4gICAgYyA9IG1kNWZmKGMsIGQsIGEsIGIsIHhbaSArIDZdLCAxNywgLTE0NzMyMzEzNDEpO1xuICAgIGIgPSBtZDVmZihiLCBjLCBkLCBhLCB4W2kgKyA3XSwgMjIsIC00NTcwNTk4Myk7XG4gICAgYSA9IG1kNWZmKGEsIGIsIGMsIGQsIHhbaSArIDhdLCA3LCAxNzcwMDM1NDE2KTtcbiAgICBkID0gbWQ1ZmYoZCwgYSwgYiwgYywgeFtpICsgOV0sIDEyLCAtMTk1ODQxNDQxNyk7XG4gICAgYyA9IG1kNWZmKGMsIGQsIGEsIGIsIHhbaSArIDEwXSwgMTcsIC00MjA2Myk7XG4gICAgYiA9IG1kNWZmKGIsIGMsIGQsIGEsIHhbaSArIDExXSwgMjIsIC0xOTkwNDA0MTYyKTtcbiAgICBhID0gbWQ1ZmYoYSwgYiwgYywgZCwgeFtpICsgMTJdLCA3LCAxODA0NjAzNjgyKTtcbiAgICBkID0gbWQ1ZmYoZCwgYSwgYiwgYywgeFtpICsgMTNdLCAxMiwgLTQwMzQxMTAxKTtcbiAgICBjID0gbWQ1ZmYoYywgZCwgYSwgYiwgeFtpICsgMTRdLCAxNywgLTE1MDIwMDIyOTApO1xuICAgIGIgPSBtZDVmZihiLCBjLCBkLCBhLCB4W2kgKyAxNV0sIDIyLCAxMjM2NTM1MzI5KTtcblxuICAgIGEgPSBtZDVnZyhhLCBiLCBjLCBkLCB4W2kgKyAxXSwgNSwgLTE2NTc5NjUxMCk7XG4gICAgZCA9IG1kNWdnKGQsIGEsIGIsIGMsIHhbaSArIDZdLCA5LCAtMTA2OTUwMTYzMik7XG4gICAgYyA9IG1kNWdnKGMsIGQsIGEsIGIsIHhbaSArIDExXSwgMTQsIDY0MzcxNzcxMyk7XG4gICAgYiA9IG1kNWdnKGIsIGMsIGQsIGEsIHhbaV0sIDIwLCAtMzczODk3MzAyKTtcbiAgICBhID0gbWQ1Z2coYSwgYiwgYywgZCwgeFtpICsgNV0sIDUsIC03MDE1NTg2OTEpO1xuICAgIGQgPSBtZDVnZyhkLCBhLCBiLCBjLCB4W2kgKyAxMF0sIDksIDM4MDE2MDgzKTtcbiAgICBjID0gbWQ1Z2coYywgZCwgYSwgYiwgeFtpICsgMTVdLCAxNCwgLTY2MDQ3ODMzNSk7XG4gICAgYiA9IG1kNWdnKGIsIGMsIGQsIGEsIHhbaSArIDRdLCAyMCwgLTQwNTUzNzg0OCk7XG4gICAgYSA9IG1kNWdnKGEsIGIsIGMsIGQsIHhbaSArIDldLCA1LCA1Njg0NDY0MzgpO1xuICAgIGQgPSBtZDVnZyhkLCBhLCBiLCBjLCB4W2kgKyAxNF0sIDksIC0xMDE5ODAzNjkwKTtcbiAgICBjID0gbWQ1Z2coYywgZCwgYSwgYiwgeFtpICsgM10sIDE0LCAtMTg3MzYzOTYxKTtcbiAgICBiID0gbWQ1Z2coYiwgYywgZCwgYSwgeFtpICsgOF0sIDIwLCAxMTYzNTMxNTAxKTtcbiAgICBhID0gbWQ1Z2coYSwgYiwgYywgZCwgeFtpICsgMTNdLCA1LCAtMTQ0NDY4MTQ2Nyk7XG4gICAgZCA9IG1kNWdnKGQsIGEsIGIsIGMsIHhbaSArIDJdLCA5LCAtNTE0MDM3ODQpO1xuICAgIGMgPSBtZDVnZyhjLCBkLCBhLCBiLCB4W2kgKyA3XSwgMTQsIDE3MzUzMjg0NzMpO1xuICAgIGIgPSBtZDVnZyhiLCBjLCBkLCBhLCB4W2kgKyAxMl0sIDIwLCAtMTkyNjYwNzczNCk7XG5cbiAgICBhID0gbWQ1aGgoYSwgYiwgYywgZCwgeFtpICsgNV0sIDQsIC0zNzg1NTgpO1xuICAgIGQgPSBtZDVoaChkLCBhLCBiLCBjLCB4W2kgKyA4XSwgMTEsIC0yMDIyNTc0NDYzKTtcbiAgICBjID0gbWQ1aGgoYywgZCwgYSwgYiwgeFtpICsgMTFdLCAxNiwgMTgzOTAzMDU2Mik7XG4gICAgYiA9IG1kNWhoKGIsIGMsIGQsIGEsIHhbaSArIDE0XSwgMjMsIC0zNTMwOTU1Nik7XG4gICAgYSA9IG1kNWhoKGEsIGIsIGMsIGQsIHhbaSArIDFdLCA0LCAtMTUzMDk5MjA2MCk7XG4gICAgZCA9IG1kNWhoKGQsIGEsIGIsIGMsIHhbaSArIDRdLCAxMSwgMTI3Mjg5MzM1Myk7XG4gICAgYyA9IG1kNWhoKGMsIGQsIGEsIGIsIHhbaSArIDddLCAxNiwgLTE1NTQ5NzYzMik7XG4gICAgYiA9IG1kNWhoKGIsIGMsIGQsIGEsIHhbaSArIDEwXSwgMjMsIC0xMDk0NzMwNjQwKTtcbiAgICBhID0gbWQ1aGgoYSwgYiwgYywgZCwgeFtpICsgMTNdLCA0LCA2ODEyNzkxNzQpO1xuICAgIGQgPSBtZDVoaChkLCBhLCBiLCBjLCB4W2ldLCAxMSwgLTM1ODUzNzIyMik7XG4gICAgYyA9IG1kNWhoKGMsIGQsIGEsIGIsIHhbaSArIDNdLCAxNiwgLTcyMjUyMTk3OSk7XG4gICAgYiA9IG1kNWhoKGIsIGMsIGQsIGEsIHhbaSArIDZdLCAyMywgNzYwMjkxODkpO1xuICAgIGEgPSBtZDVoaChhLCBiLCBjLCBkLCB4W2kgKyA5XSwgNCwgLTY0MDM2NDQ4Nyk7XG4gICAgZCA9IG1kNWhoKGQsIGEsIGIsIGMsIHhbaSArIDEyXSwgMTEsIC00MjE4MTU4MzUpO1xuICAgIGMgPSBtZDVoaChjLCBkLCBhLCBiLCB4W2kgKyAxNV0sIDE2LCA1MzA3NDI1MjApO1xuICAgIGIgPSBtZDVoaChiLCBjLCBkLCBhLCB4W2kgKyAyXSwgMjMsIC05OTUzMzg2NTEpO1xuXG4gICAgYSA9IG1kNWlpKGEsIGIsIGMsIGQsIHhbaV0sIDYsIC0xOTg2MzA4NDQpO1xuICAgIGQgPSBtZDVpaShkLCBhLCBiLCBjLCB4W2kgKyA3XSwgMTAsIDExMjY4OTE0MTUpO1xuICAgIGMgPSBtZDVpaShjLCBkLCBhLCBiLCB4W2kgKyAxNF0sIDE1LCAtMTQxNjM1NDkwNSk7XG4gICAgYiA9IG1kNWlpKGIsIGMsIGQsIGEsIHhbaSArIDVdLCAyMSwgLTU3NDM0MDU1KTtcbiAgICBhID0gbWQ1aWkoYSwgYiwgYywgZCwgeFtpICsgMTJdLCA2LCAxNzAwNDg1NTcxKTtcbiAgICBkID0gbWQ1aWkoZCwgYSwgYiwgYywgeFtpICsgM10sIDEwLCAtMTg5NDk4NjYwNik7XG4gICAgYyA9IG1kNWlpKGMsIGQsIGEsIGIsIHhbaSArIDEwXSwgMTUsIC0xMDUxNTIzKTtcbiAgICBiID0gbWQ1aWkoYiwgYywgZCwgYSwgeFtpICsgMV0sIDIxLCAtMjA1NDkyMjc5OSk7XG4gICAgYSA9IG1kNWlpKGEsIGIsIGMsIGQsIHhbaSArIDhdLCA2LCAxODczMzEzMzU5KTtcbiAgICBkID0gbWQ1aWkoZCwgYSwgYiwgYywgeFtpICsgMTVdLCAxMCwgLTMwNjExNzQ0KTtcbiAgICBjID0gbWQ1aWkoYywgZCwgYSwgYiwgeFtpICsgNl0sIDE1LCAtMTU2MDE5ODM4MCk7XG4gICAgYiA9IG1kNWlpKGIsIGMsIGQsIGEsIHhbaSArIDEzXSwgMjEsIDEzMDkxNTE2NDkpO1xuICAgIGEgPSBtZDVpaShhLCBiLCBjLCBkLCB4W2kgKyA0XSwgNiwgLTE0NTUyMzA3MCk7XG4gICAgZCA9IG1kNWlpKGQsIGEsIGIsIGMsIHhbaSArIDExXSwgMTAsIC0xMTIwMjEwMzc5KTtcbiAgICBjID0gbWQ1aWkoYywgZCwgYSwgYiwgeFtpICsgMl0sIDE1LCA3MTg3ODcyNTkpO1xuICAgIGIgPSBtZDVpaShiLCBjLCBkLCBhLCB4W2kgKyA5XSwgMjEsIC0zNDM0ODU1NTEpO1xuXG4gICAgYSA9IHNhZmVBZGQoYSwgb2xkYSk7XG4gICAgYiA9IHNhZmVBZGQoYiwgb2xkYik7XG4gICAgYyA9IHNhZmVBZGQoYywgb2xkYyk7XG4gICAgZCA9IHNhZmVBZGQoZCwgb2xkZCk7XG4gIH1cblxuICByZXR1cm4gW2EsIGIsIGMsIGRdO1xufVxuXG4vKipcbiAqIENvbnZlcnQgYW4gYXJyYXkgb2YgbGl0dGxlLWVuZGlhbiB3b3JkcyB0byBhIHN0cmluZ1xuICpcbiAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gaW5wdXQgTUQ1IEFycmF5XG4gKiBAcmV0dXJucyB7c3RyaW5nfSBNRDUgc3RyaW5nXG4gKi9cbmZ1bmN0aW9uIGJpbmwycnN0cihpbnB1dCkge1xuICB2YXIgaTtcbiAgdmFyIG91dHB1dCA9ICcnO1xuICB2YXIgbGVuZ3RoMzIgPSBpbnB1dC5sZW5ndGggKiAzMjtcblxuICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoMzI7IGkgKz0gOCkge1xuICAgIG91dHB1dCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKChpbnB1dFtpID4+IDVdID4+PiBpICUgMzIpICYgMHhmZik7XG4gIH1cblxuICByZXR1cm4gb3V0cHV0O1xufVxuXG4vKipcbiAqIENvbnZlcnQgYSByYXcgc3RyaW5nIHRvIGFuIGFycmF5IG9mIGxpdHRsZS1lbmRpYW4gd29yZHNcbiAqIENoYXJhY3RlcnMgPjI1NSBoYXZlIHRoZWlyIGhpZ2gtYnl0ZSBzaWxlbnRseSBpZ25vcmVkLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dCBSYXcgaW5wdXQgc3RyaW5nXG4gKiBAcmV0dXJucyB7QXJyYXk8bnVtYmVyPn0gQXJyYXkgb2YgbGl0dGxlLWVuZGlhbiB3b3Jkc1xuICovXG5mdW5jdGlvbiByc3RyMmJpbmwoaW5wdXQpIHtcbiAgdmFyIGk7XG4gIHZhciBvdXRwdXQgPSBbXTtcbiAgb3V0cHV0WyhpbnB1dC5sZW5ndGggPj4gMikgLSAxXSA9IHVuZGVmaW5lZDtcblxuICBmb3IgKGkgPSAwOyBpIDwgb3V0cHV0Lmxlbmd0aDsgaSArPSAxKSB7XG4gICAgb3V0cHV0W2ldID0gMDtcbiAgfVxuXG4gIHZhciBsZW5ndGg4ID0gaW5wdXQubGVuZ3RoICogODtcblxuICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoODsgaSArPSA4KSB7XG4gICAgb3V0cHV0W2kgPj4gNV0gfD0gKGlucHV0LmNoYXJDb2RlQXQoaSAvIDgpICYgMHhmZikgPDwgaSAlIDMyO1xuICB9XG5cbiAgcmV0dXJuIG91dHB1dDtcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGUgdGhlIE1ENSBvZiBhIHJhdyBzdHJpbmdcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcyBJbnB1dCBzdHJpbmdcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJhdyBNRDUgc3RyaW5nXG4gKi9cbmZ1bmN0aW9uIHJzdHJNRDUocykge1xuICByZXR1cm4gYmlubDJyc3RyKGJpbmxNRDUocnN0cjJiaW5sKHMpLCBzLmxlbmd0aCAqIDgpKTtcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBITUFDLU1ENSBvZiBhIGtleSBhbmQgc29tZSBkYXRhIChyYXcgc3RyaW5ncylcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IEhNQUMga2V5XG4gKiBAcGFyYW0ge3N0cmluZ30gZGF0YSBSYXcgaW5wdXQgc3RyaW5nXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSYXcgTUQ1IHN0cmluZ1xuICovXG5mdW5jdGlvbiByc3RySE1BQ01ENShrZXksIGRhdGEpIHtcbiAgdmFyIGk7XG4gIHZhciBia2V5ID0gcnN0cjJiaW5sKGtleSk7XG4gIHZhciBpcGFkID0gW107XG4gIHZhciBvcGFkID0gW107XG4gIHZhciBoYXNoO1xuICBpcGFkWzE1XSA9IG9wYWRbMTVdID0gdW5kZWZpbmVkO1xuXG4gIGlmIChia2V5Lmxlbmd0aCA+IDE2KSB7XG4gICAgYmtleSA9IGJpbmxNRDUoYmtleSwga2V5Lmxlbmd0aCAqIDgpO1xuICB9XG5cbiAgZm9yIChpID0gMDsgaSA8IDE2OyBpICs9IDEpIHtcbiAgICBpcGFkW2ldID0gYmtleVtpXSBeIDB4MzYzNjM2MzY7XG4gICAgb3BhZFtpXSA9IGJrZXlbaV0gXiAweDVjNWM1YzVjO1xuICB9XG5cbiAgaGFzaCA9IGJpbmxNRDUoaXBhZC5jb25jYXQocnN0cjJiaW5sKGRhdGEpKSwgNTEyICsgZGF0YS5sZW5ndGggKiA4KTtcblxuICByZXR1cm4gYmlubDJyc3RyKGJpbmxNRDUob3BhZC5jb25jYXQoaGFzaCksIDUxMiArIDEyOCkpO1xufVxuXG4vKipcbiAqIENvbnZlcnQgYSByYXcgc3RyaW5nIHRvIGEgaGV4IHN0cmluZ1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dCBSYXcgaW5wdXQgc3RyaW5nXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBIZXggZW5jb2RlZCBzdHJpbmdcbiAqL1xuZnVuY3Rpb24gcnN0cjJoZXgoaW5wdXQpIHtcbiAgdmFyIGhleFRhYiA9ICcwMTIzNDU2Nzg5YWJjZGVmJztcbiAgdmFyIG91dHB1dCA9ICcnO1xuICB2YXIgeDtcbiAgdmFyIGk7XG5cbiAgZm9yIChpID0gMDsgaSA8IGlucHV0Lmxlbmd0aDsgaSArPSAxKSB7XG4gICAgeCA9IGlucHV0LmNoYXJDb2RlQXQoaSk7XG4gICAgb3V0cHV0ICs9IGhleFRhYi5jaGFyQXQoKHggPj4+IDQpICYgMHgwZikgKyBoZXhUYWIuY2hhckF0KHggJiAweDBmKTtcbiAgfVxuXG4gIHJldHVybiBvdXRwdXQ7XG59XG5cbi8qKlxuICogRW5jb2RlIGEgc3RyaW5nIGFzIFVURi04XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGlucHV0IElucHV0IHN0cmluZ1xuICogQHJldHVybnMge3N0cmluZ30gVVRGOCBzdHJpbmdcbiAqL1xuZnVuY3Rpb24gc3RyMnJzdHJVVEY4KGlucHV0KSB7XG4gIHJldHVybiB1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoaW5wdXQpKTtcbn1cblxuLyoqXG4gKiBFbmNvZGVzIGlucHV0IHN0cmluZyBhcyByYXcgTUQ1IHN0cmluZ1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzIElucHV0IHN0cmluZ1xuICogQHJldHVybnMge3N0cmluZ30gUmF3IE1ENSBzdHJpbmdcbiAqL1xuZnVuY3Rpb24gcmF3TUQ1KHMpIHtcbiAgcmV0dXJuIHJzdHJNRDUoc3RyMnJzdHJVVEY4KHMpKTtcbn1cblxuLyoqXG4gKiBFbmNvZGVzIGlucHV0IHN0cmluZyBhcyBIZXggZW5jb2RlZCBzdHJpbmdcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcyBJbnB1dCBzdHJpbmdcbiAqIEByZXR1cm5zIHtzdHJpbmd9IEhleCBlbmNvZGVkIHN0cmluZ1xuICovXG5mdW5jdGlvbiBoZXhNRDUocykge1xuICByZXR1cm4gcnN0cjJoZXgocmF3TUQ1KHMpKTtcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSByYXcgSE1BQy1NRDUgZm9yIHRoZSBnaXZlbiBrZXkgYW5kIGRhdGFcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gayBITUFDIGtleVxuICogQHBhcmFtIHtzdHJpbmd9IGQgSW5wdXQgc3RyaW5nXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSYXcgTUQ1IHN0cmluZ1xuICovXG5mdW5jdGlvbiByYXdITUFDTUQ1KGssIGQpIHtcbiAgcmV0dXJuIHJzdHJITUFDTUQ1KHN0cjJyc3RyVVRGOChrKSwgc3RyMnJzdHJVVEY4KGQpKTtcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBIZXggZW5jb2RlZCBITUFDLU1ENSBmb3IgdGhlIGdpdmVuIGtleSBhbmQgZGF0YVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBrIEhNQUMga2V5XG4gKiBAcGFyYW0ge3N0cmluZ30gZCBJbnB1dCBzdHJpbmdcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJhdyBNRDUgc3RyaW5nXG4gKi9cbmZ1bmN0aW9uIGhleEhNQUNNRDUoaywgZCkge1xuICByZXR1cm4gcnN0cjJoZXgocmF3SE1BQ01ENShrLCBkKSk7XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlcyBNRDUgdmFsdWUgZm9yIGEgZ2l2ZW4gc3RyaW5nLlxuICogSWYgYSBrZXkgaXMgcHJvdmlkZWQsIGNhbGN1bGF0ZXMgdGhlIEhNQUMtTUQ1IHZhbHVlLlxuICogUmV0dXJucyBhIEhleCBlbmNvZGVkIHN0cmluZyB1bmxlc3MgdGhlIHJhdyBhcmd1bWVudCBpcyBnaXZlbi5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIElucHV0IHN0cmluZ1xuICogQHBhcmFtIHtzdHJpbmd9IFtrZXldIEhNQUMga2V5XG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtyYXddIFJhdyBvdXRwdXQgc3dpdGNoXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBNRDUgb3V0cHV0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZDUoc3RyaW5nLCBrZXksIHJhdykge1xuICBpZiAoIWtleSkge1xuICAgIGlmICghcmF3KSB7XG4gICAgICByZXR1cm4gaGV4TUQ1KHN0cmluZyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJhd01ENShzdHJpbmcpO1xuICB9XG5cbiAgaWYgKCFyYXcpIHtcbiAgICByZXR1cm4gaGV4SE1BQ01ENShrZXksIHN0cmluZyk7XG4gIH1cblxuICByZXR1cm4gcmF3SE1BQ01ENShrZXksIHN0cmluZyk7XG59XG4iLCAiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgZmluZFdvcmtzcGFjZVBhdGggfSBmcm9tICcuL3V0aWxzLmpzJztcblxuLyoqXG4gKiB0ZW1wbGF0ZSBwbHVnaW5zIGRvIG5vdCBoYW5kIHVzIHRoZSBjb3JyZWN0IGZpbGUgcGF0aC5cbiAqIGFkZGl0aW9uYWxseSwgd2UgbWF5IG5vdCBiZSBhYmxlIHRvIHJlbHkgb24gdGhpcyBkYXRhIGluIHRoZSBmdXR1cmUsXG4gKiBzbyB0aGlzIGZ1bmN0aW9ucyBhY3RzIGFzIGEgbWVhbnMgb2Ygbm9ybWFsaXppbmcgX3doYXRldmVyXyB3ZSdyZSBnaXZlblxuICogaW4gdGhlIGZ1dHVyZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWVcbiAqIEByZXR1cm5zIHtzdHJpbmd9IHRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBmaWxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaXhGaWxlbmFtZShmaWxlbmFtZSkge1xuICBsZXQgZmlsZU5hbWUgPSBmaWxlbmFtZTtcbiAgbGV0IHdvcmtzcGFjZSA9IGZpbmRXb3Jrc3BhY2VQYXRoKGZpbGVOYW1lKTtcblxuICAvKipcbiAgICogZW1iZXItc291cmNlIDUuODpcbiAgICogLSB0aGUgZmlsZW5hbWUgbG9va3MgbGlrZSBhbiBhYnNvbHV0ZSBwYXRoLCBidXQgc3dhcHBlZCBvdXQgdGhlICdhcHAnIHBhcnQgb2YgdGhlIHBhdGhcbiAgICogICB3aXRoIHRoZSBtb2R1bGUgbmFtZSwgc28gdGhlIGZpbGUgcGF0aHMgbmV2ZXIgZXhpc3Qgb24gZGlza1xuICAgKlxuICAgKiAtIGluIHZpdGUgYXBwczpcbiAgICogICB0aGUgJ2FwcCcgcGFydCBfbWF5XyBiZSBgc3JjYCwgc28gd2UgYWxzbyBuZWVkIHRvIGVuc3VyZSB0aGF0IGBzcmNgIGlzIGV4Y2x1ZGVkIGFzIHdlbGxcbiAgICovXG4gIGxldCBoYXNBcHBEaXIgPSBmaWxlTmFtZS5pbmNsdWRlcyhwYXRoLmpvaW4od29ya3NwYWNlLCAnYXBwJykpO1xuICBsZXQgaGFzU3JjRGlyID0gZmlsZU5hbWUuaW5jbHVkZXMocGF0aC5qb2luKHdvcmtzcGFjZSwgJ3NyYycpKTtcblxuICBpZiAoXG4gICAgIShoYXNBcHBEaXIgfHwgaGFzU3JjRGlyKSAmJlxuICAgICFmaWxlTmFtZS5pbmNsdWRlcygnL25vZGVfbW9kdWxlcy8uZW1icm9pZGVyLycpXG4gICkge1xuICAgIGxldCBtYXliZU1vZHVsZSA9IGZpbGVOYW1lLnJlcGxhY2Uod29ya3NwYWNlLCAnJyk7XG4gICAgbGV0IFttYXliZVNjb3BlLCAuLi5yZXN0XSA9IG1heWJlTW9kdWxlLnNwbGl0KCcvJykuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGxldCBwYXJ0cyA9IHJlc3Q7XG5cbiAgICBpZiAobWF5YmVTY29wZS5zdGFydHNXaXRoKCdAJykpIHtcbiAgICAgIGxldCBbLCAuLi5yZXN0ZXJdID0gcmVzdDtcblxuICAgICAgcGFydHMgPSByZXN0ZXI7XG4gICAgfVxuXG4gICAgbGV0IHJlbGF0aXZlID0gcGF0aC5qb2luKC4uLnBhcnRzKTtcblxuICAgIC8qKlxuICAgICAqIFdlIGRvbid0IGFjdHVhbGx5IGtub3cgaWYgdGhpcyBmaWxlIGlzIGFuIGFwcC5cbiAgICAgKiBpdCBjb3VsZCBiZSBhbiBhZGRvbiAodjEgb3IgdjIpXG4gICAgICpcbiAgICAgKiBTbyBoZXJlIHdlIGxvZyB0byBzZWUgaWYgd2UgaGF2ZSB1bmhhbmRsZWQgc2l0dWF0aW9ucy5cbiAgICAgKi9cbiAgICBsZXQgY2FuZGlkYXRlUGF0aCA9IHBhdGguam9pbih3b3Jrc3BhY2UsICdhcHAnLCByZWxhdGl2ZSk7XG5cbiAgICByZXR1cm4gY2FuZGlkYXRlUGF0aDtcbiAgfVxuXG4gIC8vIFRPRE86IHdoeSBhcmUgd2UgcGFzc2VkIGZpbGVzIHRvIG90aGVyIHByb2plY3RzP1xuICBpZiAoIWZpbGVOYW1lLmluY2x1ZGVzKHdvcmtzcGFjZSkpIHtcbiAgICByZXR1cm4gZmlsZU5hbWU7XG4gIH1cblxuICAvLyBGYWxsYmFjayB0byB3aGF0IHRoZSBwbHVnaW4gc3lzdGVtIGdpdmVzIHVzLlxuICAvLyBUaGlzIG1heSBiZSB3cm9uZywgYW5kIGlmIHdyb25nLCByZXZlYWxzXG4gIC8vIHVuaGFuZGxlZCBzY2VuYXJpb3Mgd2l0aCB0aGUgZmlsZSBuYW1lcyBpbiB0aGUgcGx1Z2luIGluZnJhXG4gIHJldHVybiBmaWxlTmFtZTtcbn1cbiIsICJpbXBvcnQgYXNzZXJ0IGZyb20gJ25vZGU6YXNzZXJ0JztcbmltcG9ydCBmc1N5bmMsIHsgZXhpc3RzU3luYyB9IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gJ25vZGU6bW9kdWxlJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGhhc2hGcm9tQWJzb2x1dGVQYXRoIH0gZnJvbSAnLi9oYXNoLWZyb20tYWJzb2x1dGUtcGF0aC5qcyc7XG5pbXBvcnQgeyBoYXNoRnJvbU1vZHVsZVBhdGggfSBmcm9tICcuL2hhc2gtZnJvbS1tb2R1bGUtcGF0aC5qcyc7XG5cbmV4cG9ydCB7IGhhc2hGcm9tQWJzb2x1dGVQYXRoIH0gZnJvbSAnLi9oYXNoLWZyb20tYWJzb2x1dGUtcGF0aC5qcyc7XG5leHBvcnQgeyBoYXNoRnJvbU1vZHVsZVBhdGggfSBmcm9tICcuL2hhc2gtZnJvbS1tb2R1bGUtcGF0aC5qcyc7XG5cbmNvbnN0IENPTVBPTkVOVF9FWFRFTlNJT05TID0gWycuZ3RzJywgJy5nanMnLCAnLnRzJywgJy5qcycsICcuaGJzJ107XG5cbi8vIENKUyAvIEVTTT9cbmxldCBoZXJlID0gaW1wb3J0Lm1ldGEudXJsO1xubGV0IG91clJlcXVpcmUgPSBnbG9iYWxUaGlzLnJlcXVpcmVcbiAgPyBnbG9iYWxUaGlzLnJlcXVpcmVcbiAgOiBoZXJlICYmIGNyZWF0ZVJlcXVpcmUoaGVyZSk7XG5cbmlmICghb3VyUmVxdWlyZSkge1xuICBvdXJSZXF1aXJlID0gcmVxdWlyZTtcbn1cblxuY29uc3QgSVJSRUxFVkFOVF9QQVRIUyA9IFsnbm9kZV9tb2R1bGVzLy5wbnBtJywgJ19fdml0ZS0nXTtcbmNvbnN0IFVOU1VQUE9SVEVEX0RJUkVDVE9SSUVTID0gbmV3IFNldChbJ3Rlc3RzJ10pO1xuXG5jb25zdCBDV0QgPSBwcm9jZXNzLmN3ZCgpO1xuXG4vKipcbiAqIFJlZ2FyZGxlc3Mgb2Ygd2hhdCB0aGUgZmlsZVBhdGggZm9ybWF0IGlzLFxuICogdGhpcyB3aWxsIHRyeSB0byByZXR1cm4gdGhlIGNvcnJlY3QgcG9zdGZpeC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZVBhdGhcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNoRnJvbShmaWxlUGF0aCkge1xuICBpZiAoZmlsZVBhdGguc3RhcnRzV2l0aCgnLycpKSB7XG4gICAgcmV0dXJuIGhhc2hGcm9tQWJzb2x1dGVQYXRoKGZpbGVQYXRoKTtcbiAgfVxuXG4gIHJldHVybiBoYXNoRnJvbU1vZHVsZVBhdGgoZmlsZVBhdGgpO1xufVxuXG4vKipcbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjc3NIYXNBc3NvY2lhdGVkQ29tcG9uZW50KGNzc1BhdGgpIHtcbiAgcmV0dXJuIGNzc0hhc1N0YW5kYXJkRmlsZShjc3NQYXRoKSB8fCBjc3NIYXNQb2RzRmlsZShjc3NQYXRoKTtcbn1cblxuZnVuY3Rpb24gY3NzSGFzU3RhbmRhcmRGaWxlKGlkKSB7XG4gIC8qKlxuICAgKiBOb3JtYWxseSB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrIGEgSlMgcGF0aCBoZXJlLCBidXQgd2hlbiB1c2luZ1xuICAgKiBlbWJyb2lkZXJAMywgd2UgaGF2ZSBhIFwicmV3cml0dGVuIGFwcFwiLCB3aGljaCBoYXMgYWxsIG91ciBzb3VyY2VcbiAgICogcHJlcHJvY2Vzc2VkIGEgYml0IGJlZm9yZSBzY29wZWQtY3NzIHRyYW5zZm9ybWF0aW9ucy5cbiAgICpcbiAgICogKEluIFZpdGUsIHdlIG9wZXJhdGUgbW9yZSBkaXJlY3RseSB3aXRoIHRoZSBzb3VyY2UpXG4gICAqL1xuICBmb3IgKGxldCBleHQgb2YgQ09NUE9ORU5UX0VYVEVOU0lPTlMpIHtcbiAgICBsZXQgY2FuZGlkYXRlUGF0aCA9IGlkLnJlcGxhY2UoL1xcLmNzcyQvLCBleHQpO1xuXG4gICAgaWYgKGV4aXN0c1N5bmMoY2FuZGlkYXRlUGF0aCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gY3NzSGFzUG9kc0ZpbGUoaWQpIHtcbiAgaWYgKCFpZC5lbmRzV2l0aCgnc3R5bGVzLmNzcycpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIE5vcm1hbGx5IHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgYSBKUyBwYXRoIGhlcmUsIGJ1dCB3aGVuIHVzaW5nXG4gICAqIGVtYnJvaWRlckAzLCB3ZSBoYXZlIGEgXCJyZXdyaXR0ZW4gYXBwXCIsIHdoaWNoIGhhcyBhbGwgb3VyIHNvdXJjZVxuICAgKiBwcmVwcm9jZXNzZWQgYSBiaXQgYmVmb3JlIHNjb3BlZC1jc3MgdHJhbnNmb3JtYXRpb25zLlxuICAgKlxuICAgKiAoSW4gVml0ZSwgd2Ugb3BlcmF0ZSBtb3JlIGRpcmVjdGx5IHdpdGggdGhlIHNvdXJjZSlcbiAgICovXG4gIGZvciAobGV0IGV4dCBvZiBDT01QT05FTlRfRVhURU5TSU9OUykge1xuICAgIGxldCBjYW5kaWRhdGVQYXRoID0gaWQucmVwbGFjZSgvc3R5bGVzXFwuY3NzJC8sIGB0ZW1wbGF0ZSR7ZXh0fWApO1xuXG4gICAgaWYgKGV4aXN0c1N5bmMoY2FuZGlkYXRlUGF0aCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBCYXNlZCBvbiBlbWJlcidzIGNvbXBvbmVudCBsb2NhdGlvbiBjb252ZW50aW9ucyxcbiAqIHRoaXMgZnVuY3Rpb24gd2lsbCBwcm92aWRlIGEgcGF0aCBmb3Igd2hlcmUgd2VcbiAqIGV4cGVjdCB0aGUgQ1NTIHRvIGxpdmUuXG4gKlxuICogRm9yIGNvLWxvY2F0ZWQgc3RydWN0dXJlOlxuICogICAtIGNvbXBvbmVudHMvbXktY29tcG9uZW50Lmhic1xuICogICAtIGNvbXBvbmVudHMvbXktY29tcG9uZW50LmNzc1xuICpcbiAqIEZvciBuZXN0ZWQgY28tbG9jYXRlZCBzdHJ1Y3R1cmVcbiAqICAgLSBjb21wb25lbnRzL215LWNvbXBvbmVudC9mb28uaGJzXG4gKiAgIC0gY29tcG9uZW50cy9teS1jb21wb25lbnQvZm9vLmNzc1xuICpcbiAqIEZvciBQb2RzIHJvdXRlcyBzdHJ1Y3R1cmVcbiAqICAgLSByb3V0ZXMvbXktcm91dGUvdGVtcGxhdGUue2hicyxqc31cbiAqICAgLSByb3V0ZXMvbXktcm91dGUvc3R5bGVzLmNzc1xuICpcbiAqIERlbGliZXJhdGVseSBub3Qgc3VwcG9ydGVkOlxuICogICAtIGNvbXBvbmVudHMgdy8gcG9kcyAtLSB0aGlzIGlzIGRlcHJlY2F0ZWQgaW4gNS4xMFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlTmFtZSAtIHRoZSBoYnMsIGpzLCBnanMsIGd0cyBvciB3aGF0ZXZlciBjby1sb2NhdGVkIHBhdGguXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIGV4cGVjdGVkIGNzcyBwYXRoXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjc3NQYXRoRm9yKGZpbGVOYW1lKSB7XG4gIGxldCB3aXRob3V0RXh0ID0gd2l0aG91dEV4dGVuc2lvbihmaWxlTmFtZSk7XG4gIGxldCBjc3NQYXRoID0gd2l0aG91dEV4dCArICcuY3NzJztcblxuICBpZiAoaXNQb2QoZmlsZU5hbWUpKSB7XG4gICAgY3NzUGF0aCA9IGZpbGVOYW1lXG4gICAgICAucmVwbGFjZSgvdGVtcGxhdGVcXC5qcyQvLCAnc3R5bGVzLmNzcycpXG4gICAgICAucmVwbGFjZSgvdGVtcGxhdGVcXC5oYnMvLCAnc3R5bGVzLmNzcycpO1xuICB9XG5cbiAgcmV0dXJuIGNzc1BhdGg7XG59XG5cbi8qKlxuICogTm90ZSB0aGF0IGNvbXBvbmVudHMgaW4gdGhlIFwicG9kc1wiIGNvbnZlbnRpb24gd2lsbFxuICogbmV2ZXIgYmUgc3VwcG9ydGVkLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlUGF0aFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNQb2RUZW1wbGF0ZShmaWxlUGF0aCkge1xuICBpZiAoZmlsZVBhdGguaW5jbHVkZXMoJy9jb21wb25lbnRzLycpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIGZpbGVQYXRoLmVuZHNXaXRoKCd0ZW1wbGF0ZS5qcycpIHx8IGZpbGVQYXRoLmVuZHNXaXRoKCd0ZW1wbGF0ZS5oYnMnKTtcbn1cblxuLyoqXG4gKiBOb3RlIHRoYXQgY29tcG9uZW50cyBpbiB0aGUgXCJwb2RzXCIgY29udmVudGlvbiB3aWxsXG4gKiBuZXZlciBiZSBzdXBwb3J0ZWQuXG4gKlxuICogQ2hlY2tzIGlmIGEgZmlsZSBlbmRzIHdpdGhcbiAqIC0gdGVtcGxhdGUuanNcbiAqIC0gdGVtcGxhdGUuaGJzXG4gKiAtIHN0eWxlcy5jc3NcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZVBhdGhcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUG9kKGZpbGVQYXRoKSB7XG4gIGlmIChmaWxlUGF0aC5pbmNsdWRlcygnL2NvbXBvbmVudHMvJykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoaXNQb2RUZW1wbGF0ZShmaWxlUGF0aCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBmaWxlUGF0aC5lbmRzV2l0aCgnc3R5bGVzLmNzcycpO1xufVxuXG4vKipcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZVBhdGhcbiAqIEByZXR1cm5zIHRoZSBzYW1lIHBhdGgsIGJ1dCB3aXRob3V0IHRoZSBleHRlbnNpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhvdXRFeHRlbnNpb24oZmlsZVBhdGgpIHtcbiAgbGV0IHBhcnNlZCA9IHBhdGgucGFyc2UoZmlsZVBhdGgpO1xuXG4gIHJldHVybiBwYXRoLmpvaW4ocGFyc2VkLmRpciwgcGFyc2VkLm5hbWUpO1xufVxuXG4vKipcbiAqIEV4YW1wbGVzIGZvciBmaWxlTmFtZVxuICogLSBhYnNvbHV0ZSBvbi1kaXNrIHBhdGhcbiAqIC0gaW4gd2VicGFja1xuICogICAtIFVSTC1hYnNvbHV0ZSBwYXRoLCBzdGFydGluZyB3aXRoIC9cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZU5hbWVcbiAqIEBwYXJhbSB7eyBhZGRpdGlvbmFsUm9vdHM/OiBzdHJpbmdbXTsgY3dkOiBzdHJpbmcgfX0gb3B0aW9uc1xuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUmVsZXZhbnRGaWxlKGZpbGVOYW1lLCB7IGFkZGl0aW9uYWxSb290cywgY3dkIH0pIHtcbiAgLy8gRmFrZSBmaWxlIGhhbmRsZWQgYnkgdGVzdGVtIHNlcnZlciB3aGVuIGl0IHJ1bnNcbiAgaWYgKGZpbGVOYW1lLnN0YXJ0c1dpdGgoJy90ZXN0ZW0nKSkgcmV0dXJuIGZhbHNlO1xuICAvLyBQcml2YXRlIFZpcnR1YWwgTW9kdWxlc1xuICBpZiAoZmlsZU5hbWUuc3RhcnRzV2l0aCgnXFwwJykpIHJldHVybiBmYWxzZTtcbiAgLy8gVGhlc2UgYXJlIG5vdCB2YWxpZCB1c2VybGFuZCBuYW1lcyAob3IgYXJlIGZyb20gbGlicmFyaWVzKVxuICBpZiAoZmlsZU5hbWUubWF0Y2goL15bYS16QS1aXS8pKSByZXR1cm4gZmFsc2U7XG4gIC8vIEV4dGVybmFsIHRvIHVzXG4gIGlmIChmaWxlTmFtZS5zdGFydHNXaXRoKCcvQGVtYnJvaWRlcicpKSByZXR1cm4gZmFsc2U7XG4gIGlmIChJUlJFTEVWQU5UX1BBVEhTLnNvbWUoKGkpID0+IGZpbGVOYW1lLmluY2x1ZGVzKGkpKSkgcmV0dXJuIGZhbHNlO1xuXG4gIGxldCB3b3Jrc3BhY2UgPSBmaW5kV29ya3NwYWNlUGF0aChmaWxlTmFtZSk7XG5cbiAgYXNzZXJ0KGN3ZCwgYGN3ZCB3YXMgbm90IHBhc3NlZCB0byBpc1JlbGV2YW50RmlsZWApO1xuXG4gIGxldCBvdXJXb3Jrc3BhY2UgPSBmaW5kV29ya3NwYWNlUGF0aChjd2QpO1xuXG4gIGlmICh3b3Jrc3BhY2UgIT09IG91cldvcmtzcGFjZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGxldCBsb2NhbCA9IGZpbGVOYW1lLnJlcGxhY2Uod29ya3NwYWNlLCAnJyk7XG4gIGxldCBbLCAuLi5wYXJ0c10gPSBsb2NhbC5zcGxpdCgnLycpLmZpbHRlcihCb29sZWFuKTtcblxuICBpZiAoVU5TVVBQT1JURURfRElSRUNUT1JJRVMuaGFzKHBhcnRzWzBdKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3N0bHkgcG9kcyBzdXBwb3J0LlxuICAgKiBmb2xrcyBuZWVkIHRvIG9wdCBpbiB0byBwb2RzIChyb3V0ZXMpLCBiZWNhdXNlIGV2ZXJ5IHBvZHMgYXBwIGNhbiBiZSBjb25maWd1cmVkIGRpZmZlcmVudGx5XG4gICAqL1xuICBsZXQgcm9vdHMgPSBbJy9jb21wb25lbnRzLycsICcvdGVtcGxhdGVzLycsIC4uLihhZGRpdGlvbmFsUm9vdHMgfHwgW10pXTtcblxuICBpZiAoIXJvb3RzLnNvbWUoKHJvb3QpID0+IGZpbGVOYW1lLmluY2x1ZGVzKHJvb3QpKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFja2FnZVNjb3BlZFBhdGhUb01vZHVsZVBhdGgocGFja2FnZVNjb3BlZFBhdGgpIHtcbiAgLyoqXG4gICAqICpCeSBjb252ZW50aW9uKiwgYHNyY2AgaXMgb21pdHRlZCBmcm9tIGNvbXBvbmVudCBwYXRocy5cbiAgICogV2UgY2FuIHJlZmxlY3QgdGhlIHNhbWUgYmVoYXZpb3IgYnkgcmVwbGFjaW5nIHNyYy9cbiAgICogd2l0aCBhbiBlbXB0eSBzdHJpbmcuXG4gICAqXG4gICAqIENTUyBpc24ndCBlbWl0dGVkIGFzIGEgY28tbG9jYXRlZCBtb2R1bGUsIGJ1dFxuICAgKiB0byBrZWVwIGNvbnZlbnRpb25zIGNvbnNpc3RlbnQgYWNyb3NzIGxhbmd1YWdlcyxcbiAgICogd2UgY2FuIHByZXRlbmQgaXQgaXMuXG4gICAqXG4gICAqIEFueSBjdXN0b21pemF0aW9uIGJleW9uZCByZW1vdmluZyBgc3JjYCBhbmQgYGFwcGAgaXMgcG90ZW50aWFsbHkgY29uZnVzaW5nLlxuICAgKiBJZiB3ZSBuZWVkIGZ1cnRoZXIgY3VzdG9taXphdGlvbnMsIHdlJ2xsIHdhbnQgdG8gbWF0Y2ggb24gYGV4cG9ydHNgIGluIHRoZVxuICAgKiBjb3JyZXNwb25kaW5nIHBhY2thZ2UuanNvblxuICAgKi9cbiAgbGV0IHBhY2thZ2VSZWxhdGl2ZSA9IHBhY2thZ2VTY29wZWRQYXRoLnJlcGxhY2UoL15cXC9zcmNcXC8vLCAnLycpO1xuXG4gIGxldCBwYXJzZWQgPSBwYXRoLnBhcnNlKHBhY2thZ2VSZWxhdGl2ZSk7XG5cbiAgaWYgKGlzUG9kKHBhY2thZ2VSZWxhdGl2ZSkpIHtcbiAgICAvKipcbiAgICAgKiBGb3IgcG9kcywgd2UgY2hvcCBvZmYgdGhlIHdob2xlIGZpbGUsIGFuZCB1c2UgdGhlIGRpciBuYW1lIGFzIHRoZSBcIm1vZHVsZVBhdGhcIlxuICAgICAqL1xuICAgIHJldHVybiBwYXJzZWQuZGlyO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIGFuIGV4dGVuc2lvbiBpcyBwYXNzZWQsIHJlbW92ZSBpdC5cbiAgICogV2hlbiB1c2luZyBwYWNrYWdlcnMsIGZvbGtzIGFyZSB1c2VkIHRvIG5vdCBoYXZpbmcgdG8gc3BlY2lmeSBleHRlbnNpb25zIGZvciBmaWxlcy5cbiAgICogU2luY2Ugd2UgZG9uJ3QgZXZlbiBlbWl0IGNzcyBmaWxlcyBjby1sb2NhdGVkIHRvIGVhY2ggbW9kdWxlLFxuICAgKiB0aGlzIGhlbHBzIHVzIG5vdCBjb252ZXkgYSBsaWUgdGhhdCBhIGZpbGUgbWF5IGV4aXN0IGluIGF0IHJ1bnRpbWUuXG4gICAqXG4gICAqIEZvciBleGFtcGxlIGA8bW9kdWxlLW5hbWU+L2NvbXBvbmVudHMvYnV0dG9uYC5cbiAgICogSXQgZG9lc24ndCBtYXR0ZXIgd2hhdCB0aGUgZXh0ZW5zaW9uIGlzLCBiZWNhdXNlIHlvdSBjYW4gb25seSBoYXZlIG9uZSBjc3MgZmlsZVxuICAgKiBmb3IgdGhlIGJ1dHRvbiBtb2R1bGUgYW55d2F5LlxuICAgKi9cbiAgbGV0IGxvY2FsUGFja2FnZXJTdHlsZVBhdGggPSBwYXRoLmpvaW4ocGFyc2VkLmRpciwgcGFyc2VkLm5hbWUpO1xuXG4gIHJldHVybiBsb2NhbFBhY2thZ2VyU3R5bGVQYXRoO1xufVxuXG4vKipcbiAqIHJldHVybnMgdGhlIGFwcC1tb2R1bGUgcGF0aCBvZiB0aGUgc291cmNlIGZpbGVcbiAqXG4gKiBUaGlzIGFzc3VtZXMgbm9ybWFsIGVtYmVyIGFwcCBjb252ZW50aW9uc1xuICpcbiAqIHdoaWNoIGlzIGA8cGFja2FnZS5qc29uI25hbWU+L3BhdGgtdG8tZmlsZWBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcFBhdGgoc291cmNlUGF0aCkge1xuICBsZXQgd29ya3NwYWNlUGF0aCA9IGZpbmRXb3Jrc3BhY2VQYXRoKHNvdXJjZVBhdGgpO1xuICBsZXQgbmFtZSA9IG1vZHVsZU5hbWUoc291cmNlUGF0aCk7XG5cbiAgLyoqXG4gICAqICBVbmRlciBlbWJyb2lkZXIgYnVpbGRzLCB0aGUgc3BlYy1jb21wbGlhbnQgdmVyc2lvbiBvZiB0aGUgYXBwXG4gICAqIGhhcyBhbGwgdGhlIGZpbGVzIHVuZGVyIGEgZm9sZGVyIHdoaWNoIHJlcHJlc2VudHMgdGhlIHBhY2thZ2UgbmFtZSxcbiAgICogcmF0aGVyIHRoYW4gXCJhcHBcIi5cbiAgICovXG4gIGxldCBwYWNrYWdlUmVsYXRpdmUgPSBzb3VyY2VQYXRoLnJlcGxhY2Uod29ya3NwYWNlUGF0aCwgJycpO1xuXG4gIC8qKlxuICAgKiBCdXQgd2UgYWxzbyBkb24ndCB3YW50ICdhcHAnIC0tIHdoaWNoIGlzIHByZXNlbnQgaW4gdGhlIHYxIGFkZG9uIHBpcGVsaW5lXG4gICAqL1xuICBwYWNrYWdlUmVsYXRpdmUgPSBwYWNrYWdlUmVsYXRpdmUucmVwbGFjZShgL2FwcC9gLCBgL2ApO1xuXG4gIC8vIEFueSBvZiB0aGUgYWJvdmUgcmVscGFjZW1lbnRzIGNvdWxkIGFjY2lkZW50YWxseSBnaXZlIHVzIGFuIGV4dHJhIC8gKGRlcGVuZGluZyBvbiBvdXIgYnVpbGQgZW52aXJvbm1lbnQpXG4gIHBhY2thZ2VSZWxhdGl2ZSA9IHBhY2thZ2VSZWxhdGl2ZS5yZXBsYWNlKCcvLycsICcvJyk7XG5cbiAgbGV0IGxvY2FsUGFja2FnZXJTdHlsZVBhdGggPSBwYWNrYWdlU2NvcGVkUGF0aFRvTW9kdWxlUGF0aChwYWNrYWdlUmVsYXRpdmUpO1xuXG4gIHJldHVybiBgJHtuYW1lfSR7bG9jYWxQYWNrYWdlclN0eWxlUGF0aH1gO1xufVxuXG4vKipcbiAqIFRvIGF2b2lkIGhpdHRpbmcgdGhlIGZpbGVzeXNldG0sIHdlJ2xsIHN0b3JlIGFsbCBmb3VuZFxuICogcHJvamVjdCBwYXRocyBiZXJlLCBzbyB3ZSBjYW4sIGluIG1lbW9yeSxcbiAqIGdldCB0aGUgZm9sZGVyIHdoZXJlIGEgcGFja2FnZS5qc29uIGV4aXN0cywgcmF0aGVyIHRoYW5cbiAqIGhpdCB0aGUgZmlsZSBzeXN0ZW0gZXZlcnkgdGltZS5cbiAqL1xuY29uc3QgU0VFTiA9IG5ldyBTZXQoKTtcblxuZnVuY3Rpb24gZ2V0U2Vlbihzb3VyY2VQYXRoKSB7XG4gIGlmIChTRUVOLmhhcyhzb3VyY2VQYXRoKSkgcmV0dXJuIHNvdXJjZVBhdGg7XG5cbiAgbGV0IHBhcnRzID0gc291cmNlUGF0aC5zcGxpdCgnLycpO1xuXG4gIGZvciAobGV0IGkgPSBwYXJ0cy5sZW5ndGggLSAxOyBpID4gMTsgaS0tKSB7XG4gICAgbGV0IHRvQ2hlY2sgPSBwYXJ0cy5zbGljZSgwLCBpKS5qb2luKCcvJyk7XG5cbiAgICBsZXQgc2VlbiA9IFNFRU4uaGFzKHRvQ2hlY2spO1xuXG4gICAgaWYgKHNlZW4pIHtcbiAgICAgIHJldHVybiB0b0NoZWNrO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZFdvcmtzcGFjZVBhdGgoc291cmNlUGF0aCwgb3B0aW9ucykge1xuICBsZXQgY3dkID0gb3B0aW9ucz8uY3dkID8/IENXRDtcblxuICBpZiAoc291cmNlUGF0aC5lbmRzV2l0aCgnLycpKSB7XG4gICAgc291cmNlUGF0aCA9IHNvdXJjZVBhdGgucmVwbGFjZSgvXFwvJC8sICcnKTtcbiAgfVxuXG4gIGxldCBzZWVuID0gZ2V0U2Vlbihzb3VyY2VQYXRoKTtcblxuICBpZiAoc2Vlbikge1xuICAgIHJldHVybiBzZWVuO1xuICB9XG5cbiAgbGV0IGNhbmRpZGF0ZVBhdGggPSBwYXRoLmpvaW4oc291cmNlUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuXG4gIGNvbnN0IGlzV29ya3NwYWNlID0gZnNTeW5jLmV4aXN0c1N5bmMoY2FuZGlkYXRlUGF0aCk7XG5cbiAgaWYgKGlzV29ya3NwYWNlKSB7XG4gICAgcmV0dXJuIHNvdXJjZVBhdGg7XG4gIH1cblxuICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBmaW5kUGFja2FnZUpzb25VcChzb3VyY2VQYXRoLCB7IGN3ZCB9KTtcblxuICBpZiAoIXBhY2thZ2VKc29uUGF0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGRldGVybWluZSBwcm9qZWN0IGZvciAke3NvdXJjZVBhdGh9YCk7XG4gIH1cblxuICBjb25zdCB3b3Jrc3BhY2VQYXRoID0gcGF0aC5kaXJuYW1lKHBhY2thZ2VKc29uUGF0aCk7XG5cbiAgU0VFTi5hZGQod29ya3NwYWNlUGF0aCk7XG5cbiAgcmV0dXJuIHdvcmtzcGFjZVBhdGg7XG59XG5cbmZ1bmN0aW9uIGZpbmRQYWNrYWdlSnNvblVwKHN0YXJ0UGF0aCwgb3B0aW9ucykge1xuICBsZXQgY3dkID0gb3B0aW9ucz8uY3dkID8/IENXRDtcbiAgbGV0IHBhcnRzID0gc3RhcnRQYXRoLnNwbGl0KCcvJyk7XG5cbiAgZm9yIChsZXQgaSA9IHBhcnRzLmxlbmd0aCAtIDE7IGkgPiAxOyBpLS0pIHtcbiAgICBsZXQgdG9DaGVjayA9IHBhcnRzLnNsaWNlKDAsIGkpLmpvaW4oJy8nKTtcblxuICAgIGxldCBwYWNrYWdlSnNvbiA9IHBhdGguam9pbih0b0NoZWNrLCAncGFja2FnZS5qc29uJyk7XG4gICAgbGV0IGV4aXN0cyA9IGZzU3luYy5leGlzdHNTeW5jKHBhY2thZ2VKc29uKTtcblxuICAgIGlmIChleGlzdHMpIHtcbiAgICAgIHJldHVybiBwYWNrYWdlSnNvbjtcbiAgICB9XG5cbiAgICAvLyBEb24ndCB0cmF2ZXJzZSBhbGwgdGhlIHdheSB0byB0aGUgcm9vdCBvZiB0aGUgZmlsZSBzeXN0ZW0uXG4gICAgaWYgKHRvQ2hlY2sgPT09IGN3ZCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmNvbnN0IE1BTklGRVNUX0NBQ0hFID0gbmV3IE1hcCgpO1xuXG4vKipcbiAqIFdpbGwgcmV0dXJuIHRoZSBwYWNrYWdlLmpzb24jbmFtZSwgb3IgY29uZmlnL2Vudmlyb25tZW50I21vdWRsZVByZWZpeCAoaWYgdjEgYXBwKVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2VQYXRoXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb2R1bGVOYW1lKHNvdXJjZVBhdGgpIHtcbiAgY29uc3Qgd29ya3NwYWNlID0gZmluZFdvcmtzcGFjZVBhdGgoc291cmNlUGF0aCk7XG4gIGNvbnN0IG1hbmlmZXN0ID0gZ2V0TWFuaWZlc3Qod29ya3NwYWNlKTtcblxuICByZXR1cm4gbWFuaWZlc3QubmFtZTtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gd29ya3NwYWNlXG4gKi9cbmZ1bmN0aW9uIGdldE1hbmlmZXN0KHdvcmtzcGFjZSkge1xuICBsZXQgZXhpc3RpbmcgPSBNQU5JRkVTVF9DQUNIRS5nZXQod29ya3NwYWNlKTtcblxuICBpZiAoZXhpc3RpbmcpIHtcbiAgICByZXR1cm4gZXhpc3Rpbmc7XG4gIH1cblxuICBsZXQgYnVmZmVyID0gZnNTeW5jLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4od29ya3NwYWNlLCAncGFja2FnZS5qc29uJykpO1xuICBsZXQgY29udGVudCA9IGJ1ZmZlci50b1N0cmluZygpO1xuICBsZXQganNvbiA9IEpTT04ucGFyc2UoY29udGVudCk7XG5cbiAgTUFOSUZFU1RfQ0FDSEUuc2V0KHdvcmtzcGFjZSwganNvbik7XG5cbiAgcmV0dXJuIGpzb247XG59XG4iLCAiaW1wb3J0IHsgbWQ1IH0gZnJvbSAnLi9tZDUuanMnO1xuXG4vKipcbiAqIFRoZSBpbnRlbnQgb2YgdGhpcyBmdW5jdGlvbiBpcyB0byBnZW5lcmF0ZSB0aGUgc3VmZml4L3Bvc3RmaXggZm9yIHRoZVxuICogY3NzIGNsYXNzZXMsIGJhc2VkIG9uIHRoZSBtb2R1bGUtc2NvcGVkIHBhdGggbmFtZS5cbiAqXG4gKiBmb3IgZXhhbXBsZSxcbiAqICAgIGhhc2goJ215LWFwcC9jb21wb25lbnRzL2ZvbycpXG4gKiAgaW5zdGVhZCBvZlxuICogICAgaGFzaCgnYXBwL2NvbXBvbmVudHMvZm9vJylcbiAqXG4gKiAgKHVubGVzcyB5b3VyIGFwcCBuYW1lIGlzICdhcHAnKVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2R1bGVQYXRoXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzaChtb2R1bGVQYXRoKSB7XG4gIHJldHVybiAnZScgKyBtZDUobW9kdWxlUGF0aCkuc3Vic3RyaW5nKDAsIDgpO1xufVxuXG5cbmV4cG9ydCBjb25zdCBoYXNoRnJvbU1vZHVsZVBhdGggPSBoYXNoO1xuIiwgImNvbnN0IGtleSA9ICdzdHlsZXMuZW1iZXItc2NvcGVkLmNzcyc7XG5jb25zdCBzZXBhcmF0b3IgPSAnX19fXyc7XG5cbmZ1bmN0aW9uIHBhcnNlKHJlcXVlc3QpIHtcbiAgbGV0IFtsZWZ0LCBxcHNdID0gcmVxdWVzdC5zcGxpdCgnPycpO1xuICBsZXQgW3JlbGF0aXZlUG9zdGZpeCwgY3NzSWRdID0gbGVmdC5zcGxpdChzZXBhcmF0b3IpO1xuICBsZXQgcG9zdGZpeCA9IHJlbGF0aXZlUG9zdGZpeC5zbGljZSgyKTtcblxuICBsZXQgc2VhcmNoID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhxcHMpO1xuXG4gIHJldHVybiB7XG4gICAgZnJvbTogcG9zdGZpeCxcbiAgICBjc3M6IHNlYXJjaC5nZXQoJ2NzcycpLFxuICAgIGNzc0lkLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTY29wZWRDU1NSZXF1ZXN0KHJlcXVlc3QpIHtcbiAgbGV0IFssICwgc3R1ZmZdID0gcmVxdWVzdC5zcGxpdChzZXBhcmF0b3IpO1xuXG4gIGlmICghc3R1ZmYpIHJldHVybiBmYWxzZTtcblxuICBsZXQgW2tdID0gc3R1ZmYuc3BsaXQoJz8nKTtcblxuICByZXR1cm4gayA9PT0ga2V5O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlU2NvcGVkQ1NTUmVxdWVzdChyZXF1ZXN0KSB7XG4gIGxldCBwYXJhbXMgPSBwYXJzZShyZXF1ZXN0KTtcblxuICByZXR1cm4ge1xuICAgIHBvc3RmaXg6IHBhcmFtcy5mcm9tLFxuICAgIGNzczogZGVjb2RlVVJJQ29tcG9uZW50KHBhcmFtcy5jc3MpLFxuICAgIGNzc0lkOiBwYXJhbXMuY3NzSWQsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYWtlUmVxdWVzdChwb3N0Zml4LCBjc3NJZCwgY3NzQ29udGVudCkge1xuICByZXR1cm4gYC4vJHtwb3N0Zml4fSR7c2VwYXJhdG9yfSR7Y3NzSWR9JHtzZXBhcmF0b3J9JHtrZXl9P2Nzcz0ke2VuY29kZVVSSUNvbXBvbmVudChjc3NDb250ZW50KX1gO1xufVxuIiwgImltcG9ydCByZWNhc3QgZnJvbSAnZW1iZXItdGVtcGxhdGUtcmVjYXN0JztcblxuaW1wb3J0IHsgcmVuYW1lQ2xhc3MgfSBmcm9tICcuL3JlbmFtZUNsYXNzLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHRlbXBsYXRlUGx1Z2luKHsgY2xhc3NlcywgdGFncywgcG9zdGZpeCB9KSB7XG4gIGxldCBzdGFjayA9IFtdO1xuICAvLyBzY29wZWQtY2xhc3MgaXMgYSBnbG9iYWwgd2UgYWxsb3cgaW4gaGJzXG4gIC8vIHNjb3BlZENsYXNzIGlzIGltcG9ydGFibGUsIGFuZCB3ZSdsbCBlcnJvciBpZiBzb21lb25lIHRyaWVzIHRvIHJlbmFtZSBpdFxuICBsZXQgc2NvcGVkQ2xhc3NDYW5kaWRhdGVzID0gWydzY29wZWQtY2xhc3MnLCAnc2NvcGVkQ2xhc3MnXTtcblxuICBmdW5jdGlvbiBpc1Njb3BlZENsYXNzKHN0cikge1xuICAgIGlmICghc3RyKSByZXR1cm4gZmFsc2U7XG5cbiAgICByZXR1cm4gc2NvcGVkQ2xhc3NDYW5kaWRhdGVzLnNvbWUoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlID09PSBzdHIpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBBdHRyTm9kZShub2RlKSB7XG4gICAgICBpZiAobm9kZS5uYW1lID09PSAnY2xhc3MnKSB7XG4gICAgICAgIGlmIChub2RlLnZhbHVlLnR5cGUgPT09ICdUZXh0Tm9kZScgJiYgbm9kZS52YWx1ZS5jaGFycykge1xuICAgICAgICAgIGNvbnN0IHJlbmFtZWRDbGFzcyA9IHJlbmFtZUNsYXNzKG5vZGUudmFsdWUuY2hhcnMsIHBvc3RmaXgsIGNsYXNzZXMpO1xuXG4gICAgICAgICAgbm9kZS52YWx1ZS5jaGFycyA9IHJlbmFtZWRDbGFzcztcbiAgICAgICAgfSBlbHNlIGlmIChub2RlLnZhbHVlLnR5cGUgPT09ICdDb25jYXRTdGF0ZW1lbnQnKSB7XG4gICAgICAgICAgZm9yIChsZXQgcGFydCBvZiBub2RlLnZhbHVlLnBhcnRzKSB7XG4gICAgICAgICAgICBpZiAocGFydC50eXBlID09PSAnVGV4dE5vZGUnICYmIHBhcnQuY2hhcnMpIHtcbiAgICAgICAgICAgICAgY29uc3QgcmVuYW1lZENsYXNzID0gcmVuYW1lQ2xhc3MocGFydC5jaGFycywgcG9zdGZpeCwgY2xhc3Nlcyk7XG5cbiAgICAgICAgICAgICAgcGFydC5jaGFycyA9IHJlbmFtZWRDbGFzcztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGFydC50eXBlID09PSAnTXVzdGFjaGVTdGF0ZW1lbnQnKSB7XG4gICAgICAgICAgICAgIHJlY2FzdC50cmF2ZXJzZShwYXJ0LCB7XG4gICAgICAgICAgICAgICAgU3RyaW5nTGl0ZXJhbChub2RlKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCByZW5hbWVkQ2xhc3MgPSByZW5hbWVDbGFzcyhcbiAgICAgICAgICAgICAgICAgICAgbm9kZS52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgcG9zdGZpeCxcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NlcyxcbiAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgIG5vZGUudmFsdWUgPSByZW5hbWVkQ2xhc3M7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIEVsZW1lbnROb2RlKG5vZGUpIHtcbiAgICAgIGlmICh0YWdzLmhhcyhub2RlLnRhZykpIHtcbiAgICAgICAgLy8gY2hlY2sgaWYgY2xhc3MgYXR0cmlidXRlIGFscmVhZHkgZXhpc3RzXG4gICAgICAgIGNvbnN0IGNsYXNzQXR0ciA9IG5vZGUuYXR0cmlidXRlcy5maW5kKChhdHRyKSA9PiBhdHRyLm5hbWUgPT09ICdjbGFzcycpO1xuXG4gICAgICAgIGlmIChjbGFzc0F0dHIpIHtcbiAgICAgICAgICBjbGFzc0F0dHIudmFsdWUuY2hhcnMgKz0gJyAnICsgcG9zdGZpeDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBwdXNoIGNsYXNzIGF0dHJpYnV0ZVxuICAgICAgICAgIG5vZGUuYXR0cmlidXRlcy5wdXNoKFxuICAgICAgICAgICAgcmVjYXN0LmJ1aWxkZXJzLmF0dHIoJ2NsYXNzJywgcmVjYXN0LmJ1aWxkZXJzLnRleHQocG9zdGZpeCkpLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgQWxsOiB7XG4gICAgICBlbnRlcihub2RlKSB7XG4gICAgICAgIHN0YWNrLnB1c2gobm9kZSk7XG4gICAgICB9LFxuICAgICAgZXhpdCgpIHtcbiAgICAgICAgc3RhY2sucG9wKCk7XG4gICAgICB9LFxuICAgIH0sXG5cbiAgICBNdXN0YWNoZVN0YXRlbWVudChub2RlKSB7XG4gICAgICBsZXQgY3NzQ2xhc3M7XG5cbiAgICAgIGlmIChcbiAgICAgICAgaXNTY29wZWRDbGFzcyhnZXRWYWx1ZShub2RlLnBhdGgpKSAmJlxuICAgICAgICBub2RlLnBhcmFtcz8ubGVuZ3RoID09PSAxICYmXG4gICAgICAgIG5vZGUucGFyYW1zWzBdLnR5cGUgPT09ICdTdHJpbmdMaXRlcmFsJ1xuICAgICAgKSB7XG4gICAgICAgIGNzc0NsYXNzID0gbm9kZS5wYXJhbXNbMF0udmFsdWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgaXNTY29wZWRDbGFzcyhnZXRWYWx1ZShub2RlLnBhdGg/LnBhdGgpKSAmJlxuICAgICAgICBub2RlLnBhdGg/LnBhcmFtcz8ubGVuZ3RoID09PSAxICYmXG4gICAgICAgIG5vZGUucGF0aD8ucGFyYW1zWzBdLnR5cGUgPT09ICdTdHJpbmdMaXRlcmFsJ1xuICAgICAgKSB7XG4gICAgICAgIGNzc0NsYXNzID0gbm9kZS5wYXRoLnBhcmFtc1swXS52YWx1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNzc0NsYXNzKSB7XG4gICAgICAgIGNvbnN0IHRleHROb2RlID0gcmVjYXN0LmJ1aWxkZXJzLnRleHQocmVuYW1lQ2xhc3MoY3NzQ2xhc3MsIHBvc3RmaXgpKTtcbiAgICAgICAgY29uc3QgcGFyZW50ID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07XG5cbiAgICAgICAgaWYgKHBhcmVudD8udHlwZSA9PT0gJ0F0dHJOb2RlJykge1xuICAgICAgICAgIHBhcmVudC5xdW90ZVR5cGUgPSAnXCInO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRleHROb2RlO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBTdWJFeHByZXNzaW9uKG5vZGUpIHtcbiAgICAgIGlmIChcbiAgICAgICAgaXNTY29wZWRDbGFzcyhnZXRWYWx1ZShub2RlLnBhdGgpKSAmJlxuICAgICAgICBub2RlLnBhcmFtcz8ubGVuZ3RoID09PSAxICYmXG4gICAgICAgIG5vZGUucGFyYW1zWzBdLnR5cGUgPT09ICdTdHJpbmdMaXRlcmFsJ1xuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGNzc0NsYXNzID0gbm9kZS5wYXJhbXNbMF0udmFsdWU7XG4gICAgICAgIGNvbnN0IHRleHROb2RlID0gcmVjYXN0LmJ1aWxkZXJzLmxpdGVyYWwoXG4gICAgICAgICAgJ1N0cmluZ0xpdGVyYWwnLFxuICAgICAgICAgIHJlbmFtZUNsYXNzKGNzc0NsYXNzLCBwb3N0Zml4KSxcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4gdGV4dE5vZGU7XG4gICAgICB9XG4gICAgfSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0VmFsdWUocGF0aCkge1xuICBpZiAoIXBhdGgpIHJldHVybjtcblxuICBpZiAoJ3ZhbHVlJyBpbiBwYXRoKSB7XG4gICAgcmV0dXJuIHBhdGgudmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogRGVwcmVjYXRlZCBpbiBlbWJlciA1LjkrXG4gICAqIChzbyB3ZSB1c2UgdGhlIGFib3ZlIGZvciBuZXdlciBlbWJlcnMpXG4gICAqL1xuICByZXR1cm4gcGF0aC5vcmlnaW5hbDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmV3cml0ZUhicyhoYnMsIGNsYXNzZXMsIHRhZ3MsIHBvc3RmaXgpIHtcbiAgbGV0IGFzdCA9IHJlY2FzdC5wYXJzZShoYnMpO1xuXG4gIHJlY2FzdC50cmF2ZXJzZShhc3QsIHRlbXBsYXRlUGx1Z2luKHsgY2xhc3NlcywgdGFncywgcG9zdGZpeCB9KSk7XG5cbiAgbGV0IHJlc3VsdCA9IHJlY2FzdC5wcmludChhc3QpO1xuXG4gIHJldHVybiByZXN1bHQ7XG59XG4iLCAiLyoqXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzTmFtZVxuICogQHBhcmFtIHtzdHJpbmd9IHBvc3RmaXhcbiAqIEBwYXJhbSB7U2V0PHN0cmluZz59IFtjbGFzc2VzSW5Dc3NdXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuYW1lQ2xhc3MoY2xhc3NOYW1lLCBwb3N0Zml4LCBjbGFzc2VzSW5Dc3MpIHtcbiAgY29uc3QgY2xhc3NlcyA9IGNsYXNzTmFtZS5zcGxpdCgvXFxzKy8pO1xuICBjb25zdCByZW5hbWVkQ2xhc3NlcyA9IGNsYXNzZXNcbiAgICAuZmlsdGVyKChjKSA9PiBjKVxuICAgIC5tYXAoKGMpID0+IGMudHJpbSgpKVxuICAgIC5tYXAoKGMpID0+IHtcbiAgICAgIGlmICghY2xhc3Nlc0luQ3NzIHx8IGNsYXNzZXNJbkNzcy5oYXMoYykpIHtcbiAgICAgICAgaWYgKGMuZW5kc1dpdGgocG9zdGZpeCkpIHJldHVybiBjO1xuXG4gICAgICAgIHJldHVybiBjICsgJ18nICsgcG9zdGZpeDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGM7XG4gICAgfSlcbiAgICAuam9pbignICcpO1xuXG4gIGNvbnN0IHJlbmFtZWRXaXRoUHJlc2VydmVkU3BhY2VzID0gY2xhc3NOYW1lLnJlcGxhY2UoXG4gICAgY2xhc3NOYW1lLnRyaW1TdGFydCgpLnRyaW1FbmQoKSxcbiAgICByZW5hbWVkQ2xhc3NlcyxcbiAgKTtcblxuICByZXR1cm4gcmVuYW1lZFdpdGhQcmVzZXJ2ZWRTcGFjZXM7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7QUNBQSxJQUFBQSxrQkFBb0I7QUFDcEIsSUFBQUMsa0NBQW1COzs7QUNEbkIsZ0JBQXlDO0FBQ3pDLHFCQUFvQjtBQUNwQixxQ0FBbUI7OztBQzRCbkIsU0FBUyxRQUFRLEdBQUcsR0FBRztBQUNyQixNQUFJLE9BQU8sSUFBSSxVQUFXLElBQUk7QUFDOUIsTUFBSSxPQUFPLEtBQUssT0FBTyxLQUFLLE9BQU8sT0FBTztBQUUxQyxTQUFRLE9BQU8sS0FBTyxNQUFNO0FBQzlCO0FBU0EsU0FBUyxjQUFjLEtBQUssS0FBSztBQUMvQixTQUFRLE9BQU8sTUFBUSxRQUFTLEtBQUs7QUFDdkM7QUFhQSxTQUFTLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7QUFDaEMsU0FBTyxRQUFRLGNBQWMsUUFBUSxRQUFRLEdBQUcsQ0FBQyxHQUFHLFFBQVEsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztBQUMzRTtBQWNBLFNBQVMsTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0FBQ2xDLFNBQU8sT0FBUSxJQUFJLElBQU0sQ0FBQyxJQUFJLEdBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ2pEO0FBY0EsU0FBUyxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7QUFDbEMsU0FBTyxPQUFRLElBQUksSUFBTSxJQUFJLENBQUMsR0FBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDakQ7QUFjQSxTQUFTLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRztBQUNsQyxTQUFPLE9BQU8sSUFBSSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ3hDO0FBY0EsU0FBUyxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7QUFDbEMsU0FBTyxPQUFPLEtBQUssSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQzNDO0FBU0EsU0FBUyxRQUFRLEdBQUcsS0FBSztBQUV2QixJQUFFLE9BQU8sQ0FBQyxLQUFLLE9BQVEsTUFBTTtBQUM3QixLQUFLLE1BQU0sT0FBUSxLQUFNLEtBQUssRUFBRSxJQUFJO0FBRXBDLE1BQUk7QUFDSixNQUFJO0FBQ0osTUFBSTtBQUNKLE1BQUk7QUFDSixNQUFJO0FBQ0osTUFBSSxJQUFJO0FBQ1IsTUFBSSxJQUFJO0FBQ1IsTUFBSSxJQUFJO0FBQ1IsTUFBSSxJQUFJO0FBRVIsT0FBSyxJQUFJLEdBQUcsSUFBSSxFQUFFLFFBQVEsS0FBSyxJQUFJO0FBQ2pDLFdBQU87QUFDUCxXQUFPO0FBQ1AsV0FBTztBQUNQLFdBQU87QUFFUCxRQUFJLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLFVBQVU7QUFDekMsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLFVBQVU7QUFDOUMsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLFNBQVM7QUFDN0MsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLFdBQVc7QUFDL0MsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxHQUFHLFVBQVU7QUFDN0MsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLFVBQVU7QUFDOUMsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLFdBQVc7QUFDL0MsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLFNBQVM7QUFDN0MsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxHQUFHLFVBQVU7QUFDN0MsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLFdBQVc7QUFDL0MsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLE1BQU07QUFDM0MsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLFdBQVc7QUFDaEQsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxHQUFHLFVBQVU7QUFDOUMsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLFNBQVM7QUFDOUMsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLFdBQVc7QUFDaEQsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLFVBQVU7QUFFL0MsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxHQUFHLFVBQVU7QUFDN0MsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxHQUFHLFdBQVc7QUFDOUMsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLFNBQVM7QUFDOUMsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsSUFBSSxVQUFVO0FBQzFDLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxVQUFVO0FBQzdDLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsR0FBRyxRQUFRO0FBQzVDLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxVQUFVO0FBQy9DLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxVQUFVO0FBQzlDLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxTQUFTO0FBQzVDLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsR0FBRyxXQUFXO0FBQy9DLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxVQUFVO0FBQzlDLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxVQUFVO0FBQzlDLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsR0FBRyxXQUFXO0FBQy9DLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxTQUFTO0FBQzVDLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxVQUFVO0FBQzlDLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxXQUFXO0FBRWhELFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxPQUFPO0FBQzFDLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxXQUFXO0FBQy9DLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxVQUFVO0FBQy9DLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxTQUFTO0FBQzlDLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxXQUFXO0FBQzlDLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxVQUFVO0FBQzlDLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxVQUFVO0FBQzlDLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxXQUFXO0FBQ2hELFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsR0FBRyxTQUFTO0FBQzdDLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLElBQUksVUFBVTtBQUMxQyxRQUFJLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksVUFBVTtBQUM5QyxRQUFJLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksUUFBUTtBQUM1QyxRQUFJLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLEdBQUcsVUFBVTtBQUM3QyxRQUFJLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksVUFBVTtBQUMvQyxRQUFJLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksU0FBUztBQUM5QyxRQUFJLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksVUFBVTtBQUU5QyxRQUFJLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLFVBQVU7QUFDekMsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLFVBQVU7QUFDOUMsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLFdBQVc7QUFDaEQsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLFNBQVM7QUFDN0MsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxHQUFHLFVBQVU7QUFDOUMsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLFdBQVc7QUFDL0MsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLFFBQVE7QUFDN0MsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLFdBQVc7QUFDL0MsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxHQUFHLFVBQVU7QUFDN0MsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJ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TSxLQUFLLEVBQUU7QUFDOUQsZ0JBQUlDLGFBQVk7QUFBQSxjQUNkRCxNQUFLO0FBQUEsY0FDTDtBQUFBLGNBQ0E7QUFBQSxjQUNBLE9BQU87QUFBQSxZQUNUO0FBRUEsb0JBQVFBLEtBQUk7QUFFWixnQkFBSSxhQUFhLFlBQVksU0FBU0EsTUFBSyxJQUFJQyxVQUFTO0FBRXhELGdCQUFJLEtBQUssUUFBUSxvQkFBb0IsVUFBVTtBQUFBLFVBQ2pEO0FBQUEsUUFDRjtBQUFBO0FBQUE7QUFBQSxRQUlBLFlBQVksTUFBTTtBQUNoQixpQkFBTyxTQUFTLFNBQVMsR0FBRyxJQUFJO0FBQUEsUUFDbEM7QUFBQSxRQUNBLFlBQVksTUFBTSxRQUFRO0FBRXhCLG1CQUFTLFlBQVksTUFBTSxNQUFNO0FBRWpDLGNBQUksbUJBQW1CLElBQUksR0FBRztBQUM1QixnQkFBSSxPQUFPLFFBQVEsS0FBSyxTQUFTLFlBQVk7QUFDM0Msb0JBQU0sSUFBSTtBQUFBLGdCQUNSO0FBQUEsY0FDRjtBQUFBLFlBQ0Y7QUFHQSxtQkFBTztBQUFBLFVBQ1Q7QUFBQSxRQUNGO0FBQUEsUUFDQSxxQkFBcUIsTUFBTTtBQUN6QixpQkFBTyxTQUFTLGtCQUFrQixHQUFHLElBQUk7QUFBQSxRQUMzQztBQUFBLFFBQ0EsaUJBQWlCLE1BQU07QUFDckIsaUJBQU8sU0FBUyxjQUFjLEdBQUcsSUFBSTtBQUFBLFFBQ3ZDO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0Y7QUFLQSxJQUFNLHdCQUF3QjtBQUU5QixTQUFTLG1CQUFtQixNQUFNO0FBQ2hDLE1BQUksQ0FBQyxLQUFNO0FBQ1gsTUFBSSxLQUFLLFFBQVEsUUFBUztBQUMxQixNQUFJLEtBQUssU0FBUyxjQUFlO0FBRWpDLFNBQU8sS0FBSyxXQUFXO0FBQUEsSUFDckIsQ0FBQyxjQUFjLFVBQVUsU0FBUztBQUFBLEVBQ3BDO0FBQ0Y7QUFFQSxTQUFTLFlBQVksTUFBTTtBQUN6QixNQUFJLGVBQWUsS0FBSyxTQUFTLE9BQU8sQ0FBQyxNQUFNLEVBQUUsU0FBUyxVQUFVO0FBRXBFLFNBQU8sYUFBYSxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUU7QUFDakQ7IiwKICAibmFtZXMiOiBbImltcG9ydF9wb3N0Y3NzIiwgImltcG9ydF9wb3N0Y3NzX3NlbGVjdG9yX3BhcnNlciIsICJrZXkiLCAiaGFzaCIsICJwb3N0Y3NzIiwgInBhcnNlciIsICJwYXJzZXIiLCAicG9zdGNzcyIsICJpbXBvcnRfbm9kZV9wYXRoIiwgImhhc2giLCAicGF0aCIsICJhc3NlcnQiLCAiZnNTeW5jIiwgInBhdGgiLCAicmVjYXN0IiwgIm5vZGUiLCAicGF0aCIsICJpbmZvIiwgInNjb3BlZENzcyJdCn0K