ember-scoped-css 0.23.2 → 0.23.4

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.
@@ -44,6 +44,7 @@ var import_path = __toESM(require("path"), 1);
44
44
  // src/lib/path/utils.js
45
45
  var import_node_assert = __toESM(require("node:assert"), 1);
46
46
  var import_node_fs = __toESM(require("node:fs"), 1);
47
+ var import_node_module = require("node:module");
47
48
  var import_node_path = __toESM(require("node:path"), 1);
48
49
 
49
50
  // src/lib/path/hash-from-module-path.js
@@ -61,6 +62,12 @@ function hashFromAbsolutePath(absolutePath) {
61
62
  }
62
63
 
63
64
  // src/lib/path/utils.js
65
+ var import_meta = {};
66
+ var here = import_meta.url;
67
+ var ourRequire = globalThis.require ? globalThis.require : here && (0, import_node_module.createRequire)(here);
68
+ if (!ourRequire) {
69
+ ourRequire = require;
70
+ }
64
71
  var EMBROIDER_DIR = "node_modules/.embroider";
65
72
  var EMBROIDER_3_REWRITTEN_APP_PATH = `${EMBROIDER_DIR}/rewritten-app`;
66
73
  var EMBROIDER_3_REWRITTEN_APP_ASSETS = `${EMBROIDER_3_REWRITTEN_APP_PATH}/assets`;
@@ -96,6 +103,8 @@ function withoutExtension(filePath) {
96
103
  return import_node_path.default.join(parsed.dir, parsed.name);
97
104
  }
98
105
  function isRelevantFile(fileName, { additionalRoots, cwd }) {
106
+ if (fileName.startsWith("\0")) return false;
107
+ if (fileName.match(/^[a-zA-Z]/)) return false;
99
108
  if (fileName.startsWith("/@embroider")) return false;
100
109
  if (IRRELEVANT_PATHS.some((i) => fileName.includes(i))) return false;
101
110
  if (fileName.includes("/node_modules/")) {
@@ -212,7 +221,7 @@ function moduleName(sourcePath) {
212
221
  }
213
222
  let environmentJS = import_node_path.default.join(workspace, "config/environment.js");
214
223
  if (import_node_fs.default.existsSync(environmentJS)) {
215
- const envFn = require(environmentJS);
224
+ const envFn = ourRequire(environmentJS);
216
225
  const env = envFn("ember-scoped-css");
217
226
  return env.modulePrefix || manifest.name;
218
227
  }
@@ -593,10 +602,20 @@ function isHbsFile(id) {
593
602
  function isCssFile(id) {
594
603
  return id.endsWith(".css");
595
604
  }
596
- async function transformJsFile(code, id) {
605
+ function asCSSPath(id) {
597
606
  const cssPath = id.endsWith(".hbs") ? id.replace(/\.hbs$/, ".css") : id.replace(/(\.hbs)?\.(js|ts|gjs|gts)$/, ".css");
598
- const cssFileName = import_node_path2.default.basename(cssPath);
599
- const cssExists = (0, import_node_fs2.existsSync)(cssPath);
607
+ return cssPath;
608
+ }
609
+ async function transformJsFile(code, id) {
610
+ let cssPath = asCSSPath(id);
611
+ let cssFileName = import_node_path2.default.basename(cssPath);
612
+ let cssExists = (0, import_node_fs2.existsSync)(cssPath);
613
+ if (!cssExists) {
614
+ let [, ...parts] = id.split("/").reverse();
615
+ cssPath = [...parts.reverse(), "styles.css"].join("/");
616
+ cssFileName = "styles.css";
617
+ cssExists = (0, import_node_fs2.existsSync)(cssPath);
618
+ }
600
619
  let css;
601
620
  if (cssExists) {
602
621
  css = await (0, import_promises.readFile)(cssPath, "utf8");
@@ -620,14 +639,29 @@ ${code}`;
620
639
  map: null
621
640
  };
622
641
  }
623
- function transformCssFile(code, id, layerName) {
642
+ function cssHasStandardFile(id) {
624
643
  const jsPath = id.replace(/\.css$/, ".gjs");
625
644
  const gtsPath = id.replace(/\.css$/, ".gts");
626
645
  const hbsPath = id.replace(/\.css$/, ".hbs");
627
646
  const jsExists = (0, import_node_fs2.existsSync)(jsPath);
628
647
  const gtsExists = (0, import_node_fs2.existsSync)(gtsPath);
629
648
  const hbsExists = (0, import_node_fs2.existsSync)(hbsPath);
630
- if (jsExists || hbsExists || gtsExists) {
649
+ return jsExists || gtsExists || hbsExists;
650
+ }
651
+ function cssHasPodsFile(id) {
652
+ if (!id.endsWith("styles.css")) {
653
+ return;
654
+ }
655
+ const jsPath = id.replace(/styles\.css$/, "template.gjs");
656
+ const gtsPath = id.replace(/styles\.css$/, "template.gts");
657
+ const hbsPath = id.replace(/styles\.css$/, "template.hbs");
658
+ const jsExists = (0, import_node_fs2.existsSync)(jsPath);
659
+ const gtsExists = (0, import_node_fs2.existsSync)(gtsPath);
660
+ const hbsExists = (0, import_node_fs2.existsSync)(hbsPath);
661
+ return jsExists || gtsExists || hbsExists;
662
+ }
663
+ function transformCssFile(code, id, layerName) {
664
+ if (cssHasStandardFile(id) || cssHasPodsFile(id)) {
631
665
  const postfix = hashFromAbsolutePath(id);
632
666
  code = rewriteCss(code, postfix, import_node_path2.default.basename(id), layerName);
633
667
  }
@@ -663,6 +697,8 @@ var scoped_css_unplugin_default = (0, import_unplugin.createUnplugin)(
663
697
  * @param {Options} [options]
664
698
  */
665
699
  (options) => {
700
+ let cwd = import_node_process.default.cwd();
701
+ let additionalRoots = options?.additionalRoots || [];
666
702
  return {
667
703
  name: "ember-scoped-css-unplugin",
668
704
  generateBundle(_, bundle) {
@@ -679,6 +715,7 @@ var scoped_css_unplugin_default = (0, import_unplugin.createUnplugin)(
679
715
  generateBundle() {
680
716
  },
681
717
  transform(code, jsPath) {
718
+ if (!isRelevantFile(jsPath, { additionalRoots, cwd })) return;
682
719
  if (isHbsFile(jsPath)) {
683
720
  return transformJsFile(code, jsPath);
684
721
  } else if (isJsFile(jsPath)) {
@@ -689,6 +726,7 @@ var scoped_css_unplugin_default = (0, import_unplugin.createUnplugin)(
689
726
  }
690
727
  },
691
728
  transform(code, jsPath) {
729
+ if (!isRelevantFile(jsPath, { additionalRoots, cwd })) return;
692
730
  if (isHbsFile(jsPath)) {
693
731
  return transformJsFile(code, jsPath);
694
732
  } else if (isJsFile(jsPath)) {
@@ -810,4 +848,4 @@ function createPlugin(config) {
810
848
  scopedCssUnplugin,
811
849
  templatePlugin
812
850
  });
813
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2J1aWxkL2luZGV4LmpzIiwgIi4uLy4uL3NyYy9idWlsZC9iYWJlbC1wbHVnaW4uanMiLCAiLi4vLi4vc3JjL2xpYi9wYXRoL3V0aWxzLmpzIiwgIi4uLy4uL3NyYy9saWIvcGF0aC9oYXNoLWZyb20tbW9kdWxlLXBhdGguanMiLCAiLi4vLi4vc3JjL2xpYi9wYXRoL2hhc2gtZnJvbS1hYnNvbHV0ZS1wYXRoLmpzIiwgIi4uLy4uL3NyYy9idWlsZC9zY29wZWQtY3NzLXVucGx1Z2luLmpzIiwgIi4uLy4uL3NyYy9saWIvZ2V0Q2xhc3Nlc1RhZ3NGcm9tQ3NzLmpzIiwgIi4uLy4uL3NyYy9saWIvaXNJbnNpZGVHbG9iYWwuanMiLCAiLi4vLi4vc3JjL2xpYi9yZXBsYWNlSGJzSW5Kcy5qcyIsICIuLi8uLi9zcmMvbGliL3Jld3JpdGVDc3MuanMiLCAiLi4vLi4vc3JjL2xpYi9yZXdyaXRlSGJzLmpzIiwgIi4uLy4uL3NyYy9saWIvcmVuYW1lQ2xhc3MuanMiLCAiLi4vLi4vc3JjL2xpYi9jc3MvdXRpbHMuanMiLCAiLi4vLi4vc3JjL2xpYi9wYXRoL3RlbXBsYXRlLXRyYW5zZm9ybS1wYXRocy5qcyIsICIuLi8uLi9zcmMvYnVpbGQvdGVtcGxhdGUtcGx1Z2luLmpzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJleHBvcnQgeyBkZWZhdWx0IGFzIGJhYmVsUGx1Z2luIH0gZnJvbSAnLi9iYWJlbC1wbHVnaW4uanMnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBzY29wZWRDc3NVbnBsdWdpbiB9IGZyb20gJy4vc2NvcGVkLWNzcy11bnBsdWdpbi5qcyc7XG5leHBvcnQgeyBjcmVhdGVQbHVnaW4gYXMgdGVtcGxhdGVQbHVnaW4gfSBmcm9tICcuL3RlbXBsYXRlLXBsdWdpbi5qcyc7XG4iLCAiaW1wb3J0IHsgSW1wb3J0VXRpbCB9IGZyb20gJ2JhYmVsLWltcG9ydC11dGlsJztcbmltcG9ydCB7IGV4aXN0c1N5bmMgfSBmcm9tICdmcyc7XG5pbXBvcnQgbm9kZVBhdGggZnJvbSAncGF0aCc7XG5cbmltcG9ydCB7IGNzc1BhdGhGb3IsIGlzUmVsZXZhbnRGaWxlIH0gZnJvbSAnLi4vbGliL3BhdGgvdXRpbHMuanMnO1xuXG5mdW5jdGlvbiBfaXNSZWxldmFudEZpbGUoc3RhdGUsIGN3ZCkge1xuICBsZXQgZmlsZU5hbWUgPSBzdGF0ZS5maWxlLm9wdHMuZmlsZW5hbWU7XG4gIGxldCBhZGRpdGlvbmFsUm9vdHMgPSBzdGF0ZS5vcHRzPy5hZGRpdGlvbmFsUm9vdHM7XG5cbiAgcmV0dXJuIGlzUmVsZXZhbnRGaWxlKGZpbGVOYW1lLCB7XG4gICAgYWRkaXRpb25hbFJvb3RzLFxuICAgIGN3ZCxcbiAgfSk7XG59XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IGVudiAtIGJhYmVsIHBsdWdpbiBlbnYsIGVudi50eXBlcyBpcyBtb3N0IGNvbW1vbmx5IHVzZWQgKGVzcCBpbiBUUylcbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIC0gdGhlIG9wdGlvbnMgZm9yIHNjb3BlZC1jc3MgLS0gdGhpcyBpcyBhbHNvIGF2YWlsYWJsZSBpbiBlYWNoIHZpc2l0b3IncyBzdGF0ZS5vcHRzXG4gKiBAcGFyYW0ge3N0cmluZ30gd29ya2luZ0RpcmVjdG9yeVxuICovXG5leHBvcnQgZGVmYXVsdCAoZW52LCBvcHRpb25zLCB3b3JraW5nRGlyZWN0b3J5KSA9PiB7XG4gIC8qKlxuICAgKiBUaGlzIGJhYmVsIHBsdWdpbiBkb2VzIHRocmVlIHRoaW5nczpcbiAgICogLSByZW1vdmVzIHRoZSBpbXBvcnQgb2Ygc2NvcGVkQ2xhc3MsIGlmIGl0IGV4aXN0c1xuICAgKiAgIC0gaWYgc2NvcGVkQ2xhc3Mgd2FzIGltcG9ydGVkLCBpdCBpcyByZW1vdmVkIGZyb20gYW55IGNvbXBvbmVudCdzIFwic2NvcGUgYmFnXCJcbiAgICogICAgICh0aGUgc2NvcGUgYmFnIGJlaW5nIGEgbG93LWxldmVsIG9iamVjdCB1c2VkIGZvciBwYXNzaW5nIHdoYXQgaXMgXCJpbiBzY29wZVwiIGZvciBhIGNvbXBvbmVudClcbiAgICogLSBhZGRzIGFuIGltcG9ydCB0byB0aGUgQ1NTIGZpbGUsIGlmIGl0IGV4aXN0c1xuICAgKi9cbiAgcmV0dXJuIHtcbiAgICB2aXNpdG9yOiB7XG4gICAgICBQcm9ncmFtOiB7XG4gICAgICAgIGVudGVyKHBhdGgsIHN0YXRlKSB7XG4gICAgICAgICAgaWYgKCFfaXNSZWxldmFudEZpbGUoc3RhdGUsIHdvcmtpbmdEaXJlY3RvcnkpKSB7XG4gICAgICAgICAgICBzdGF0ZS5jYW5Ta2lwID0gdHJ1ZTtcblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHN0YXRlLmltcG9ydFV0aWwgPSBuZXcgSW1wb3J0VXRpbChlbnYsIHBhdGgpO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIEltcG9ydERlY2xhcmF0aW9uKHBhdGgsIHN0YXRlKSB7XG4gICAgICAgIGlmIChzdGF0ZS5jYW5Ta2lwKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhdGgubm9kZS5zb3VyY2UudmFsdWUgPT09ICdlbWJlci1zY29wZWQtY3NzJykge1xuICAgICAgICAgIGxldCBzcGVjaWZpZXIgPSBwYXRoLm5vZGUuc3BlY2lmaWVycy5maW5kKFxuICAgICAgICAgICAgKHgpID0+IHguaW1wb3J0ZWQubmFtZSA9PT0gJ3Njb3BlZENsYXNzJyxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKHNwZWNpZmllcikge1xuICAgICAgICAgICAgc3RhdGUuZmlsZS5vcHRzLmltcG9ydGVkU2NvcGVkQ2xhc3MgPSBzcGVjaWZpZXIubG9jYWwubmFtZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoc3BlY2lmaWVyLmxvY2FsLm5hbWUgIT09ICdzY29wZWRDbGFzcycpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYFRoZSBzY29wZWRDbGFzcyBpbXBvcnQgaXMgYSBwc3VlZG8taGVscGVyLCBhbmQgbWF5IG5vdCBiZSByZW5hbWVkIGFzIGl0IGlzIHJlbW92ZWQgYXQgYnVpbGQgdGltZS5gLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBwYXRoLnJlbW92ZSgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLyoqXG4gICAgICAgKiBPbmx5IGluIHN0cmljdCBtb2RlLCBkbyB3ZSBjYXJlIGFib3V0IHJlbW9uaW5nIHRoZSBzY29wZSBiYWcgcmVmZXJlbmNlXG4gICAgICAgKi9cbiAgICAgIE9iamVjdFByb3BlcnR5KHBhdGgsIHN0YXRlKSB7XG4gICAgICAgIGlmICghc3RhdGUuZmlsZS5vcHRzPy5pbXBvcnRlZFNjb3BlZENsYXNzKSByZXR1cm47XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHBhdGgubm9kZS52YWx1ZS50eXBlID09PSAnSWRlbnRpZmllcicgJiZcbiAgICAgICAgICBwYXRoLm5vZGUudmFsdWUubmFtZSA9PT0gc3RhdGUuZmlsZS5vcHRzPy5pbXBvcnRlZFNjb3BlZENsYXNzXG4gICAgICAgICkge1xuICAgICAgICAgIHBhdGgucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAvKipcbiAgICAgICAqIElmIHRoZXJlIGlzIGEgQ1NTIGZpbGUsIEFORCBhIGNvcnJlc3BvbmRpbmcgdGVtcGxhdGUsXG4gICAgICAgKiB3ZSBjYW4gaW1wb3J0IHRoZSBDU1MgdG8gdGhlbiBkZWZlciB0byB0aGUgQ1NTIGxvYWRlclxuICAgICAgICogb3Igb3RoZXIgQ1NTIHByb2Nlc3NpbmcgdG8gaGFuZGxlIHRoZSBwb3N0Zml4aW5nXG4gICAgICAgKi9cbiAgICAgIENhbGxFeHByZXNzaW9uKHBhdGgsIHN0YXRlKSB7XG4gICAgICAgIGlmIChzdGF0ZS5jYW5Ta2lwKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgbm9kZSA9IHBhdGgubm9kZTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgbm9kZS5jYWxsZWUubmFtZSA9PT0gJ3ByZWNvbXBpbGVUZW1wbGF0ZScgfHxcbiAgICAgICAgICBub2RlLmNhbGxlZS5uYW1lID09PSAnaGJzJyB8fFxuICAgICAgICAgIG5vZGUuY2FsbGVlLm5hbWUgPT09ICdjcmVhdGVUZW1wbGF0ZUZhY3RvcnknXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IGZpbGVOYW1lID1cbiAgICAgICAgICAgIHN0YXRlLmZpbGUub3B0cy5zb3VyY2VGaWxlTmFtZSB8fCBzdGF0ZS5maWxlLm9wdHMuZmlsZW5hbWU7XG5cbiAgICAgICAgICBsZXQgY3NzUGF0aCA9IGNzc1BhdGhGb3IoZmlsZU5hbWUpO1xuXG4gICAgICAgICAgaWYgKGV4aXN0c1N5bmMoY3NzUGF0aCkpIHtcbiAgICAgICAgICAgIGxldCBiYXNlQ1NTID0gbm9kZVBhdGguYmFzZW5hbWUoY3NzUGF0aCk7XG5cbiAgICAgICAgICAgIHN0YXRlLmltcG9ydFV0aWwuaW1wb3J0Rm9yU2lkZUVmZmVjdChgLi8ke2Jhc2VDU1N9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0sXG4gIH07XG59O1xuIiwgImltcG9ydCBhc3NlcnQgZnJvbSAnbm9kZTphc3NlcnQnO1xuaW1wb3J0IGZzU3luYyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGhhc2hGcm9tQWJzb2x1dGVQYXRoIH0gZnJvbSAnLi9oYXNoLWZyb20tYWJzb2x1dGUtcGF0aC5qcyc7XG5pbXBvcnQgeyBoYXNoRnJvbU1vZHVsZVBhdGggfSBmcm9tICcuL2hhc2gtZnJvbS1tb2R1bGUtcGF0aC5qcyc7XG5cbmV4cG9ydCB7IGhhc2hGcm9tQWJzb2x1dGVQYXRoIH0gZnJvbSAnLi9oYXNoLWZyb20tYWJzb2x1dGUtcGF0aC5qcyc7XG5leHBvcnQgeyBoYXNoRnJvbU1vZHVsZVBhdGggfSBmcm9tICcuL2hhc2gtZnJvbS1tb2R1bGUtcGF0aC5qcyc7XG5cbmNvbnN0IEVNQlJPSURFUl9ESVIgPSAnbm9kZV9tb2R1bGVzLy5lbWJyb2lkZXInO1xuY29uc3QgRU1CUk9JREVSXzNfUkVXUklUVEVOX0FQUF9QQVRIID0gYCR7RU1CUk9JREVSX0RJUn0vcmV3cml0dGVuLWFwcGA7XG5jb25zdCBFTUJST0lERVJfM19SRVdSSVRURU5fQVBQX0FTU0VUUyA9IGAke0VNQlJPSURFUl8zX1JFV1JJVFRFTl9BUFBfUEFUSH0vYXNzZXRzYDtcbmNvbnN0IEVNQlJPSURFUl8zX1JFV1JJVFRFTl9QQUNLQUdFUyA9IGAke0VNQlJPSURFUl9ESVJ9L3Jld3JpdHRlbi1wYWNrYWdlc2A7XG5jb25zdCBJUlJFTEVWQU5UX1BBVEhTID0gWydub2RlX21vZHVsZXMvLnBucG0nXTtcbmNvbnN0IFVOU1VQUE9SVEVEX0RJUkVDVE9SSUVTID0gbmV3IFNldChbJ3Rlc3RzJ10pO1xuXG5jb25zdCBDV0QgPSBwcm9jZXNzLmN3ZCgpO1xuXG4vKipcbiAqIFJlZ2FyZGxlc3Mgb2Ygd2hhdCB0aGUgZmlsZVBhdGggZm9ybWF0IGlzLFxuICogdGhpcyB3aWxsIHRyeSB0byByZXR1cm4gdGhlIGNvcnJlY3QgcG9zdGZpeC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZVBhdGhcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNoRnJvbShmaWxlUGF0aCkge1xuICBpZiAoZmlsZVBhdGguc3RhcnRzV2l0aCgnLycpKSB7XG4gICAgcmV0dXJuIGhhc2hGcm9tQWJzb2x1dGVQYXRoKGZpbGVQYXRoKTtcbiAgfVxuXG4gIHJldHVybiBoYXNoRnJvbU1vZHVsZVBhdGgoZmlsZVBhdGgpO1xufVxuXG4vKipcbiAqIEJhc2VkIG9uIGVtYmVyJ3MgY29tcG9uZW50IGxvY2F0aW9uIGNvbnZlbnRpb25zLFxuICogdGhpcyBmdW5jdGlvbiB3aWxsIHByb3ZpZGUgYSBwYXRoIGZvciB3aGVyZSB3ZVxuICogZXhwZWN0IHRoZSBDU1MgdG8gbGl2ZS5cbiAqXG4gKiBGb3IgY28tbG9jYXRlZCBzdHJ1Y3R1cmU6XG4gKiAgIC0gY29tcG9uZW50cy9teS1jb21wb25lbnQuaGJzXG4gKiAgIC0gY29tcG9uZW50cy9teS1jb21wb25lbnQuY3NzXG4gKlxuICogRm9yIG5lc3RlZCBjby1sb2NhdGVkIHN0cnVjdHVyZVxuICogICAtIGNvbXBvbmVudHMvbXktY29tcG9uZW50L2Zvby5oYnNcbiAqICAgLSBjb21wb25lbnRzL215LWNvbXBvbmVudC9mb28uY3NzXG4gKlxuICogRm9yIFBvZHMgcm91dGVzIHN0cnVjdHVyZVxuICogICAtIHJvdXRlcy9teS1yb3V0ZS90ZW1wbGF0ZS57aGJzLGpzfVxuICogICAtIHJvdXRlcy9teS1yb3V0ZS9zdHlsZXMuY3NzXG4gKlxuICogRGVsaWJlcmF0ZWx5IG5vdCBzdXBwb3J0ZWQ6XG4gKiAgIC0gY29tcG9uZW50cyB3LyBwb2RzIC0tIHRoaXMgaXMgZGVwcmVjYXRlZCBpbiA1LjEwXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVOYW1lIC0gdGhlIGhicywganMsIGdqcywgZ3RzIG9yIHdoYXRldmVyIGNvLWxvY2F0ZWQgcGF0aC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gZXhwZWN0ZWQgY3NzIHBhdGhcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNzc1BhdGhGb3IoZmlsZU5hbWUpIHtcbiAgbGV0IHdpdGhvdXRFeHQgPSB3aXRob3V0RXh0ZW5zaW9uKGZpbGVOYW1lKTtcbiAgbGV0IGNzc1BhdGggPSB3aXRob3V0RXh0ICsgJy5jc3MnO1xuXG4gIGlmIChpc1BvZChmaWxlTmFtZSkpIHtcbiAgICBjc3NQYXRoID0gZmlsZU5hbWVcbiAgICAgIC5yZXBsYWNlKC90ZW1wbGF0ZVxcLmpzJC8sICdzdHlsZXMuY3NzJylcbiAgICAgIC5yZXBsYWNlKC90ZW1wbGF0ZVxcLmhicy8sICdzdHlsZXMuY3NzJyk7XG4gIH1cblxuICByZXR1cm4gY3NzUGF0aDtcbn1cblxuLyoqXG4gKiBOb3RlIHRoYXQgY29tcG9uZW50cyBpbiB0aGUgXCJwb2RzXCIgY29udmVudGlvbiB3aWxsXG4gKiBuZXZlciBiZSBzdXBwb3J0ZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVQYXRoXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1BvZFRlbXBsYXRlKGZpbGVQYXRoKSB7XG4gIGlmIChmaWxlUGF0aC5pbmNsdWRlcygnL2NvbXBvbmVudHMvJykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gZmlsZVBhdGguZW5kc1dpdGgoJ3RlbXBsYXRlLmpzJykgfHwgZmlsZVBhdGguZW5kc1dpdGgoJ3RlbXBsYXRlLmhicycpO1xufVxuXG4vKipcbiAqIE5vdGUgdGhhdCBjb21wb25lbnRzIGluIHRoZSBcInBvZHNcIiBjb252ZW50aW9uIHdpbGxcbiAqIG5ldmVyIGJlIHN1cHBvcnRlZC5cbiAqXG4gKiBDaGVja3MgaWYgYSBmaWxlIGVuZHMgd2l0aFxuICogLSB0ZW1wbGF0ZS5qc1xuICogLSB0ZW1wbGF0ZS5oYnNcbiAqIC0gc3R5bGVzLmNzc1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlUGF0aFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNQb2QoZmlsZVBhdGgpIHtcbiAgaWYgKGZpbGVQYXRoLmluY2x1ZGVzKCcvY29tcG9uZW50cy8nKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChpc1BvZFRlbXBsYXRlKGZpbGVQYXRoKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZpbGVQYXRoLmVuZHNXaXRoKCdzdHlsZXMuY3NzJyk7XG59XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlUGF0aFxuICogQHJldHVybnMgdGhlIHNhbWUgcGF0aCwgYnV0IHdpdGhvdXQgdGhlIGV4dGVuc2lvblxuICovXG5leHBvcnQgZnVuY3Rpb24gd2l0aG91dEV4dGVuc2lvbihmaWxlUGF0aCkge1xuICBsZXQgcGFyc2VkID0gcGF0aC5wYXJzZShmaWxlUGF0aCk7XG5cbiAgcmV0dXJuIHBhdGguam9pbihwYXJzZWQuZGlyLCBwYXJzZWQubmFtZSk7XG59XG5cbi8qKlxuICogRXhhbXBsZXMgZm9yIGZpbGVOYW1lXG4gKiAtIGFic29sdXRlIG9uLWRpc2sgcGF0aFxuICogLSBpbiB3ZWJwYWNrXG4gKiAgIC0gVVJMLWFic29sdXRlIHBhdGgsIHN0YXJ0aW5nIHdpdGggL1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlTmFtZVxuICogQHBhcmFtIHt7IGFkZGl0aW9uYWxSb290cz86IHN0cmluZ1tdOyBjd2Q6IHN0cmluZyB9fSBvcHRpb25zXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNSZWxldmFudEZpbGUoZmlsZU5hbWUsIHsgYWRkaXRpb25hbFJvb3RzLCBjd2QgfSkge1xuICBpZiAoZmlsZU5hbWUuc3RhcnRzV2l0aCgnL0BlbWJyb2lkZXInKSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoSVJSRUxFVkFOVF9QQVRIUy5zb21lKChpKSA9PiBmaWxlTmFtZS5pbmNsdWRlcyhpKSkpIHJldHVybiBmYWxzZTtcblxuICBpZiAoZmlsZU5hbWUuaW5jbHVkZXMoJy9ub2RlX21vZHVsZXMvJykpIHtcbiAgICAvLyBpZiBhIGZpbGUgaXMgbm90IHRoZSBlbWJyb2lkZXIgY2FjaGUgZGlyZWN0b3J5XG4gICAgLy8gYW5kIGlzIGluIG5vZGVfbW9kdWxlcywgc2tpcCBpdC5cbiAgICBpZiAoIWZpbGVOYW1lLmluY2x1ZGVzKEVNQlJPSURFUl9ESVIpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gcmV3cml0dGVuIHBhY2thZ2VzIHNob3VsZCBoYXZlIGFscmVhZHkgYmVlbiBwcm9jZXNzZWQgYXQgdGhlaXIgb3duXG4gICAgLy8gcHVibGlzaCB0aW1lXG4gICAgaWYgKGZpbGVOYW1lLmluY2x1ZGVzKEVNQlJPSURFUl8zX1JFV1JJVFRFTl9QQUNLQUdFUykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBUaGVzZSBhcmUgYWxyZWFkeSB0aGUgYnVuZGxlZCBmaWxlcy5cbiAgICBpZiAoZmlsZU5hbWUuaW5jbHVkZXMoRU1CUk9JREVSXzNfUkVXUklUVEVOX0FQUF9BU1NFVFMpKSB7XG4gICAgICAvLyBub3Qgc3VwcG9ydGVkLCBuZXZlciB3aWxsIGJlXG4gICAgICBpZiAoZmlsZU5hbWUuZW5kc1dpdGgoYCR7RU1CUk9JREVSXzNfUkVXUklUVEVOX0FQUF9BU1NFVFN9L3Rlc3RzLmpzYCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvLyBJZGVhbGx5LCB3ZSBuZXZlciBnZXQgaGVyZSAtLSBpbmRpY2F0ZXMgd2UncmUgbm90IGZpbHRlcmluZyBlZmZlY3RpdmVseSBpbiBiYWJlbFxuICAgICAgLy8gTk9URTogaWYgd2UgZ2V0IGhlcmUsIHdlJ3JlIHRyeWluZyB0byBvcGVyYXRlIG9uIGEgZmlsZSB0b28gbGF0ZS5cbiAgICAgIC8vICAgICAgIHdlIG5lZWQgU2NvcGVkQ1NTIHRvIG9wZXJhdGUgYXMgY2xvc2UgdG8gb3JpZ2luYWwgc291cmNlIGFzIHBvc3NpYmxlIC0tIG5vdCBvdXRwdXQgZmlsZXMuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgbGV0IHdvcmtzcGFjZSA9IGZpbmRXb3Jrc3BhY2VQYXRoKGZpbGVOYW1lKTtcblxuICBhc3NlcnQoY3dkLCBgY3dkIHdhcyBub3QgcGFzc2VkIHRvIGlzUmVsZXZhbnRGaWxlYCk7XG5cbiAgbGV0IG91cldvcmtzcGFjZSA9IGZpbmRXb3Jrc3BhY2VQYXRoKGN3ZCk7XG5cbiAgaWYgKHdvcmtzcGFjZSAhPT0gb3VyV29ya3NwYWNlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgbGV0IGxvY2FsID0gZmlsZU5hbWUucmVwbGFjZSh3b3Jrc3BhY2UsICcnKTtcbiAgbGV0IFssIC4uLnBhcnRzXSA9IGxvY2FsLnNwbGl0KCcvJykuZmlsdGVyKEJvb2xlYW4pO1xuXG4gIGlmIChVTlNVUFBPUlRFRF9ESVJFQ1RPUklFUy5oYXMocGFydHNbMF0pKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vc3RseSBwb2RzIHN1cHBvcnQuXG4gICAqIGZvbGtzIG5lZWQgdG8gb3B0IGluIHRvIHBvZHMgKHJvdXRlcyksIGJlY2F1c2UgZXZlcnkgcG9kcyBhcHAgY2FuIGJlIGNvbmZpZ3VyZWQgZGlmZmVyZW50bHlcbiAgICovXG4gIGxldCByb290cyA9IFsnL2NvbXBvbmVudHMvJywgJy90ZW1wbGF0ZXMvJywgLi4uKGFkZGl0aW9uYWxSb290cyB8fCBbXSldO1xuXG4gIGlmICghcm9vdHMuc29tZSgocm9vdCkgPT4gZmlsZU5hbWUuaW5jbHVkZXMocm9vdCkpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYWNrYWdlU2NvcGVkUGF0aFRvTW9kdWxlUGF0aChwYWNrYWdlU2NvcGVkUGF0aCkge1xuICAvKipcbiAgICogKkJ5IGNvbnZlbnRpb24qLCBgc3JjYCBpcyBvbWl0dGVkIGZyb20gY29tcG9uZW50IHBhdGhzLlxuICAgKiBXZSBjYW4gcmVmbGVjdCB0aGUgc2FtZSBiZWhhdmlvciBieSByZXBsYWNpbmcgc3JjL1xuICAgKiB3aXRoIGFuIGVtcHR5IHN0cmluZy5cbiAgICpcbiAgICogQ1NTIGlzbid0IGVtaXR0ZWQgYXMgYSBjby1sb2NhdGVkIG1vZHVsZSwgYnV0XG4gICAqIHRvIGtlZXAgY29udmVudGlvbnMgY29uc2lzdGVudCBhY3Jvc3MgbGFuZ3VhZ2VzLFxuICAgKiB3ZSBjYW4gcHJldGVuZCBpdCBpcy5cbiAgICpcbiAgICogQW55IGN1c3RvbWl6YXRpb24gYmV5b25kIHJlbW92aW5nIGBzcmNgIGFuZCBgYXBwYCBpcyBwb3RlbnRpYWxseSBjb25mdXNpbmcuXG4gICAqIElmIHdlIG5lZWQgZnVydGhlciBjdXN0b21pemF0aW9ucywgd2UnbGwgd2FudCB0byBtYXRjaCBvbiBgZXhwb3J0c2AgaW4gdGhlXG4gICAqIGNvcnJlc3BvbmRpbmcgcGFja2FnZS5qc29uXG4gICAqL1xuICBsZXQgcGFja2FnZVJlbGF0aXZlID0gcGFja2FnZVNjb3BlZFBhdGgucmVwbGFjZSgvXlxcL3NyY1xcLy8sICcvJyk7XG5cbiAgbGV0IHBhcnNlZCA9IHBhdGgucGFyc2UocGFja2FnZVJlbGF0aXZlKTtcblxuICBpZiAoaXNQb2QocGFja2FnZVJlbGF0aXZlKSkge1xuICAgIC8qKlxuICAgICAqIEZvciBwb2RzLCB3ZSBjaG9wIG9mZiB0aGUgd2hvbGUgZmlsZSwgYW5kIHVzZSB0aGUgZGlyIG5hbWUgYXMgdGhlIFwibW9kdWxlUGF0aFwiXG4gICAgICovXG4gICAgcmV0dXJuIHBhcnNlZC5kaXI7XG4gIH1cblxuICAvKipcbiAgICogSWYgYW4gZXh0ZW5zaW9uIGlzIHBhc3NlZCwgcmVtb3ZlIGl0LlxuICAgKiBXaGVuIHVzaW5nIHBhY2thZ2VycywgZm9sa3MgYXJlIHVzZWQgdG8gbm90IGhhdmluZyB0byBzcGVjaWZ5IGV4dGVuc2lvbnMgZm9yIGZpbGVzLlxuICAgKiBTaW5jZSB3ZSBkb24ndCBldmVuIGVtaXQgY3NzIGZpbGVzIGNvLWxvY2F0ZWQgdG8gZWFjaCBtb2R1bGUsXG4gICAqIHRoaXMgaGVscHMgdXMgbm90IGNvbnZleSBhIGxpZSB0aGF0IGEgZmlsZSBtYXkgZXhpc3QgaW4gYXQgcnVudGltZS5cbiAgICpcbiAgICogRm9yIGV4YW1wbGUgYDxtb2R1bGUtbmFtZT4vY29tcG9uZW50cy9idXR0b25gLlxuICAgKiBJdCBkb2Vzbid0IG1hdHRlciB3aGF0IHRoZSBleHRlbnNpb24gaXMsIGJlY2F1c2UgeW91IGNhbiBvbmx5IGhhdmUgb25lIGNzcyBmaWxlXG4gICAqIGZvciB0aGUgYnV0dG9uIG1vZHVsZSBhbnl3YXkuXG4gICAqL1xuICBsZXQgbG9jYWxQYWNrYWdlclN0eWxlUGF0aCA9IHBhdGguam9pbihwYXJzZWQuZGlyLCBwYXJzZWQubmFtZSk7XG5cbiAgcmV0dXJuIGxvY2FsUGFja2FnZXJTdHlsZVBhdGg7XG59XG5cbi8qKlxuICogcmV0dXJucyB0aGUgYXBwLW1vZHVsZSBwYXRoIG9mIHRoZSBzb3VyY2UgZmlsZVxuICpcbiAqIFRoaXMgYXNzdW1lcyBub3JtYWwgZW1iZXIgYXBwIGNvbnZlbnRpb25zXG4gKlxuICogd2hpY2ggaXMgYDxwYWNrYWdlLmpzb24jbmFtZT4vcGF0aC10by1maWxlYFxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwUGF0aChzb3VyY2VQYXRoKSB7XG4gIGxldCB3b3Jrc3BhY2VQYXRoID0gZmluZFdvcmtzcGFjZVBhdGgoc291cmNlUGF0aCk7XG4gIGxldCBuYW1lID0gbW9kdWxlTmFtZShzb3VyY2VQYXRoKTtcblxuICAvKipcbiAgICogIFVuZGVyIGVtYnJvaWRlciBidWlsZHMsIHRoZSBzcGVjLWNvbXBsaWFudCB2ZXJzaW9uIG9mIHRoZSBhcHBcbiAgICogaGFzIGFsbCB0aGUgZmlsZXMgdW5kZXIgYSBmb2xkZXIgd2hpY2ggcmVwcmVzZW50cyB0aGUgcGFja2FnZSBuYW1lLFxuICAgKiByYXRoZXIgdGhhbiBcImFwcFwiLlxuICAgKi9cbiAgbGV0IHBhY2thZ2VSZWxhdGl2ZSA9IHNvdXJjZVBhdGgucmVwbGFjZSh3b3Jrc3BhY2VQYXRoLCAnJyk7XG5cbiAgLyoqXG4gICAqIEJ1dCB3ZSBhbHNvIGRvbid0IHdhbnQgJ2FwcCcgLS0gd2hpY2ggaXMgcHJlc2VudCBpbiB0aGUgdjEgYWRkb24gcGlwZWxpbmVcbiAgICovXG4gIHBhY2thZ2VSZWxhdGl2ZSA9IHBhY2thZ2VSZWxhdGl2ZS5yZXBsYWNlKGAvYXBwL2AsIGAvYCk7XG5cbiAgLyoqXG4gICAqIGFsc28gYWxzbywgd2Uga25vdyB0aGF0IHRoZSByZS13cml0dGVuIGFwcCBzdHJ1Y3R1cmUgaW4gZW1icm9pZGVyQHYzXG4gICAqIGlzIGV4dHJhbmVvdXMsIGFuZCB3ZSBjYW4gY29sbGFwc2UgaXRcbiAgICovXG4gIHBhY2thZ2VSZWxhdGl2ZSA9IHBhY2thZ2VSZWxhdGl2ZS5yZXBsYWNlKFxuICAgIGAke0VNQlJPSURFUl8zX1JFV1JJVFRFTl9BUFBfUEFUSH0vYCxcbiAgICAnLycsXG4gICk7XG5cbiAgbGV0IGxvY2FsUGFja2FnZXJTdHlsZVBhdGggPSBwYWNrYWdlU2NvcGVkUGF0aFRvTW9kdWxlUGF0aChwYWNrYWdlUmVsYXRpdmUpO1xuXG4gIHJldHVybiBgJHtuYW1lfSR7bG9jYWxQYWNrYWdlclN0eWxlUGF0aH1gO1xufVxuXG4vKipcbiAqIFRvIGF2b2lkIGhpdHRpbmcgdGhlIGZpbGVzeXNldG0sIHdlJ2xsIHN0b3JlIGFsbCBmb3VuZFxuICogcHJvamVjdCBwYXRocyBiZXJlLCBzbyB3ZSBjYW4sIGluIG1lbW9yeSxcbiAqIGdldCB0aGUgZm9sZGVyIHdoZXJlIGEgcGFja2FnZS5qc29uIGV4aXN0cywgcmF0aGVyIHRoYW5cbiAqIGhpdCB0aGUgZmlsZSBzeXN0ZW0gZXZlcnkgdGltZS5cbiAqL1xuY29uc3QgU0VFTiA9IG5ldyBTZXQoKTtcblxuZnVuY3Rpb24gZ2V0U2Vlbihzb3VyY2VQYXRoKSB7XG4gIGlmIChTRUVOLmhhcyhzb3VyY2VQYXRoKSkgcmV0dXJuIHNvdXJjZVBhdGg7XG5cbiAgbGV0IHBhcnRzID0gc291cmNlUGF0aC5zcGxpdCgnLycpO1xuXG4gIGZvciAobGV0IGkgPSBwYXJ0cy5sZW5ndGggLSAxOyBpID4gMTsgaS0tKSB7XG4gICAgbGV0IHRvQ2hlY2sgPSBwYXJ0cy5zbGljZSgwLCBpKS5qb2luKCcvJyk7XG5cbiAgICBsZXQgc2VlbiA9IFNFRU4uaGFzKHRvQ2hlY2spO1xuXG4gICAgaWYgKHNlZW4pIHtcbiAgICAgIHJldHVybiB0b0NoZWNrO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZFdvcmtzcGFjZVBhdGgoc291cmNlUGF0aCwgb3B0aW9ucykge1xuICBsZXQgY3dkID0gb3B0aW9ucz8uY3dkID8/IENXRDtcblxuICBpZiAoc291cmNlUGF0aC5pbmNsdWRlcyhFTUJST0lERVJfM19SRVdSSVRURU5fQVBQX1BBVEgpKSB7XG4gICAgc291cmNlUGF0aCA9IHNvdXJjZVBhdGguc3BsaXQoRU1CUk9JREVSXzNfUkVXUklUVEVOX0FQUF9QQVRIKVswXTtcbiAgfVxuXG4gIGlmIChzb3VyY2VQYXRoLmVuZHNXaXRoKCcvJykpIHtcbiAgICBzb3VyY2VQYXRoID0gc291cmNlUGF0aC5yZXBsYWNlKC9cXC8kLywgJycpO1xuICB9XG5cbiAgbGV0IHNlZW4gPSBnZXRTZWVuKHNvdXJjZVBhdGgpO1xuXG4gIGlmIChzZWVuKSB7XG4gICAgcmV0dXJuIHNlZW47XG4gIH1cblxuICBsZXQgY2FuZGlkYXRlUGF0aCA9IHBhdGguam9pbihzb3VyY2VQYXRoLCAncGFja2FnZS5qc29uJyk7XG5cbiAgY29uc3QgaXNXb3Jrc3BhY2UgPSBmc1N5bmMuZXhpc3RzU3luYyhjYW5kaWRhdGVQYXRoKTtcblxuICBpZiAoaXNXb3Jrc3BhY2UpIHtcbiAgICByZXR1cm4gc291cmNlUGF0aDtcbiAgfVxuXG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IGZpbmRQYWNrYWdlSnNvblVwKHNvdXJjZVBhdGgsIHsgY3dkIH0pO1xuXG4gIGlmICghcGFja2FnZUpzb25QYXRoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZGV0ZXJtaW5lIHByb2plY3QgZm9yICR7c291cmNlUGF0aH1gKTtcbiAgfVxuXG4gIGNvbnN0IHdvcmtzcGFjZVBhdGggPSBwYXRoLmRpcm5hbWUocGFja2FnZUpzb25QYXRoKTtcblxuICBTRUVOLmFkZCh3b3Jrc3BhY2VQYXRoKTtcblxuICByZXR1cm4gd29ya3NwYWNlUGF0aDtcbn1cblxuZnVuY3Rpb24gZmluZFBhY2thZ2VKc29uVXAoc3RhcnRQYXRoLCBvcHRpb25zKSB7XG4gIGxldCBjd2QgPSBvcHRpb25zPy5jd2QgPz8gQ1dEO1xuICBsZXQgcGFydHMgPSBzdGFydFBhdGguc3BsaXQoJy8nKTtcblxuICBmb3IgKGxldCBpID0gcGFydHMubGVuZ3RoIC0gMTsgaSA+IDE7IGktLSkge1xuICAgIGxldCB0b0NoZWNrID0gcGFydHMuc2xpY2UoMCwgaSkuam9pbignLycpO1xuXG4gICAgbGV0IHBhY2thZ2VKc29uID0gcGF0aC5qb2luKHRvQ2hlY2ssICdwYWNrYWdlLmpzb24nKTtcbiAgICBsZXQgZXhpc3RzID0gZnNTeW5jLmV4aXN0c1N5bmMocGFja2FnZUpzb24pO1xuXG4gICAgaWYgKGV4aXN0cykge1xuICAgICAgcmV0dXJuIHBhY2thZ2VKc29uO1xuICAgIH1cblxuICAgIC8vIERvbid0IHRyYXZlcnNlIGFsbCB0aGUgd2F5IHRvIHRoZSByb290IG9mIHRoZSBmaWxlIHN5c3RlbS5cbiAgICBpZiAodG9DaGVjayA9PT0gY3dkKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuY29uc3QgTUFOSUZFU1RfQ0FDSEUgPSBuZXcgTWFwKCk7XG5cbi8qKlxuICogV2lsbCByZXR1cm4gdGhlIHBhY2thZ2UuanNvbiNuYW1lLCBvciBjb25maWcvZW52aXJvbm1lbnQjbW91ZGxlUHJlZml4IChpZiB2MSBhcHApXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZVBhdGhcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vZHVsZU5hbWUoc291cmNlUGF0aCkge1xuICBjb25zdCB3b3Jrc3BhY2UgPSBmaW5kV29ya3NwYWNlUGF0aChzb3VyY2VQYXRoKTtcbiAgY29uc3QgbWFuaWZlc3QgPSBnZXRNYW5pZmVzdCh3b3Jrc3BhY2UpO1xuXG4gIGlmIChtYW5pZmVzdFsnZW1iZXItYWRkb24nXSkge1xuICAgIC8qKlxuICAgICAqIExpYnJhcmllcyBhcmUgbm90IGFsbG93ZWQgdG8gY3VzdG9taXplIHRoZWlyIG1vZHVsZSBuYW1lXG4gICAgICogdG8gYmUgZGlmZmVyZW50IGZyb20gdGhlaXIgcGFja2FnZSBuYW1lLlxuICAgICAqXG4gICAgICogKEl0J3MgYWxzbyBib25rZXJzIHRoYXQgdGhpcyBpcyBhbGxvd2VkIGZvciB2MSBhcHBzKVxuICAgICAqL1xuICAgIHJldHVybiBtYW5pZmVzdC5uYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvciB2MSBhcHBzLCB3ZSBuZWVkIHRvIHJlZmVyZW5jZSB0aGUgY29uZmlnL2Vudmlyb25tZW50LmpzIGZpbGVcbiAgICogdG8gc2VlIGlmIHRoZSBtb2R1bGVQcmVmaXggc2V0dGluZyBkaWZmZXJzIGZyb20gbWFuaWZlc3QubmFtZTtcbiAgICovXG4gIGxldCBlbnZpcm9ubWVudEpTID0gcGF0aC5qb2luKHdvcmtzcGFjZSwgJ2NvbmZpZy9lbnZpcm9ubWVudC5qcycpO1xuXG4gIC8qKlxuICAgKiBOT1RFOiB0aGUgZW52aXJvbm1lbnQuanMgaXMgYSBjb21tb25KUyBmaWxlLCBzbyB3ZSBjYW4gc3luY2hyb25vdXNseSByZXF1aXJlIGl0XG4gICAqXG4gICAqIFRPRE86IGlmIHdlIGhhdmUgaXNzdWVzIHdpdGggbG9hZGluZyB0aGlzIGZpbGUgbGF0ZXIgd2Ugc2hvdWxkIHByb2JhYmx5IGp1c3QgcnVuIGpzY29kZXNoaWZ0IG9uIGl0XG4gICAqICAgICAgIGJ1dCB0aGF0IGNvdWxkIGFsbG93IHVzIHRvIGJlIGJyaXR0bGUgaW4gZGlmZmVyZW50IHdheXMsIGxpa2UgaWYgZm9sa3Mgc3RyYXkgZnJvbSB0aGUgd2F5IHRoZVxuICAgKiAgICAgICBmaWxlIGlzIGxhaWQgb3V0IGZyb20gdGhlIGJsdWVwcmludCBkZWZhdWx0cy5cbiAgICovXG4gIGlmIChmc1N5bmMuZXhpc3RzU3luYyhlbnZpcm9ubWVudEpTKSkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZiAtLSB0aGlzIGV4aXN0c1xuICAgIGNvbnN0IGVudkZuID0gcmVxdWlyZShlbnZpcm9ubWVudEpTKTtcbiAgICBjb25zdCBlbnYgPSBlbnZGbignZW1iZXItc2NvcGVkLWNzcycpO1xuXG4gICAgcmV0dXJuIGVudi5tb2R1bGVQcmVmaXggfHwgbWFuaWZlc3QubmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGYWxsYmFjayB0byB0aGUgdHJ1ZVx1MjEyMiBtb2R1bGVcdTIxMjIgbmFtZS5cbiAgICovXG4gIHJldHVybiBtYW5pZmVzdC5uYW1lO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSB3b3Jrc3BhY2VcbiAqL1xuZnVuY3Rpb24gZ2V0TWFuaWZlc3Qod29ya3NwYWNlKSB7XG4gIGxldCBleGlzdGluZyA9IE1BTklGRVNUX0NBQ0hFLmdldCh3b3Jrc3BhY2UpO1xuXG4gIGlmIChleGlzdGluZykge1xuICAgIHJldHVybiBleGlzdGluZztcbiAgfVxuXG4gIGxldCBidWZmZXIgPSBmc1N5bmMucmVhZEZpbGVTeW5jKHBhdGguam9pbih3b3Jrc3BhY2UsICdwYWNrYWdlLmpzb24nKSk7XG4gIGxldCBjb250ZW50ID0gYnVmZmVyLnRvU3RyaW5nKCk7XG4gIGxldCBqc29uID0gSlNPTi5wYXJzZShjb250ZW50KTtcblxuICBNQU5JRkVTVF9DQUNIRS5zZXQod29ya3NwYWNlLCBqc29uKTtcblxuICByZXR1cm4ganNvbjtcbn1cbiIsICJpbXBvcnQgbWQ1IGZyb20gJ2JsdWVpbXAtbWQ1JztcblxuLyoqXG4gKiBUaGUgaW50ZW50IG9mIHRoaXMgZnVuY3Rpb24gaXMgdG8gZ2VuZXJhdGUgdGhlIHN1ZmZpeC9wb3N0Zml4IGZvciB0aGVcbiAqIGNzcyBjbGFzc2VzLCBiYXNlZCBvbiB0aGUgbW9kdWxlLXNjb3BlZCBwYXRoIG5hbWUuXG4gKlxuICogZm9yIGV4YW1wbGUsXG4gKiAgICBoYXNoKCdteS1hcHAvY29tcG9uZW50cy9mb28nKVxuICogIGluc3RlYWQgb2ZcbiAqICAgIGhhc2goJ2FwcC9jb21wb25lbnRzL2ZvbycpXG4gKlxuICogICh1bmxlc3MgeW91ciBhcHAgbmFtZSBpcyAnYXBwJylcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kdWxlUGF0aFxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc2gobW9kdWxlUGF0aCkge1xuICByZXR1cm4gJ2UnICsgbWQ1KG1vZHVsZVBhdGgpLnN1YnN0cmluZygwLCA4KTtcbn1cblxuXG5leHBvcnQgY29uc3QgaGFzaEZyb21Nb2R1bGVQYXRoID0gaGFzaDtcbiIsICJpbXBvcnQgeyBoYXNoIH0gZnJvbSAnLi9oYXNoLWZyb20tbW9kdWxlLXBhdGguanMnO1xuaW1wb3J0IHsgYXBwUGF0aCB9IGZyb20gJy4vdXRpbHMuanMnO1xuXG5leHBvcnQgeyBoYXNoIH0gZnJvbSAnLi9oYXNoLWZyb20tbW9kdWxlLXBhdGguanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gaGFzaEZyb21BYnNvbHV0ZVBhdGgoYWJzb2x1dGVQYXRoKSB7XG4gIC8qKlxuICAgKiBUaGUgd2hvbGUgb2YgYGFwcFBhdGhgIHVsdGltYXRlbHkgdHJhbnNmb3JtcyB0aGUgYGFic29sdXRlUGF0aGBcbiAgICogaW50byB0aGUgZXhhY3Qgc3RyaW5nIHRoYXQgZm9sa3Mgd2lsbCBwYXNzIHRvIGByZWxhdGl2ZVBhdGhgXG4gICAqIGF0IHJ1bnRpbWUuXG4gICAqL1xuICBjb25zdCBtb2R1bGVQYXRoID0gYXBwUGF0aChhYnNvbHV0ZVBhdGgpO1xuICBjb25zdCBwb3N0Zml4ID0gaGFzaChtb2R1bGVQYXRoKTtcblxuICByZXR1cm4gcG9zdGZpeDtcbn1cbiIsICJpbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgeyByZWFkRmlsZSB9IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5cbmltcG9ydCB7IGNyZWF0ZVVucGx1Z2luIH0gZnJvbSAndW5wbHVnaW4nO1xuXG5pbXBvcnQgZ2V0Q2xhc3Nlc1RhZ3NGcm9tQ3NzIGZyb20gJy4uL2xpYi9nZXRDbGFzc2VzVGFnc0Zyb21Dc3MuanMnO1xuaW1wb3J0IHsgaGFzaEZyb21BYnNvbHV0ZVBhdGggfSBmcm9tICcuLi9saWIvcGF0aC91dGlscy5qcyc7XG5pbXBvcnQgcmVwbGFjZUhic0luSnMgZnJvbSAnLi4vbGliL3JlcGxhY2VIYnNJbkpzLmpzJztcbmltcG9ydCByZXdyaXRlQ3NzIGZyb20gJy4uL2xpYi9yZXdyaXRlQ3NzLmpzJztcbmltcG9ydCByZXdyaXRlSGJzIGZyb20gJy4uL2xpYi9yZXdyaXRlSGJzLmpzJztcblxuZnVuY3Rpb24gaXNKc0ZpbGUoaWQpIHtcbiAgcmV0dXJuIChcbiAgICBpZC5lbmRzV2l0aCgnLmpzJykgfHxcbiAgICBpZC5lbmRzV2l0aCgnLnRzJykgfHxcbiAgICBpZC5lbmRzV2l0aCgnLmdqcycpIHx8XG4gICAgaWQuZW5kc1dpdGgoJy5ndHMnKVxuICApO1xufVxuXG5mdW5jdGlvbiBpc0hic0ZpbGUoaWQpIHtcbiAgcmV0dXJuIGlkLmVuZHNXaXRoKCcuaGJzJyk7XG59XG5cbmZ1bmN0aW9uIGlzQ3NzRmlsZShpZCkge1xuICByZXR1cm4gaWQuZW5kc1dpdGgoJy5jc3MnKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdHJhbnNmb3JtSnNGaWxlKGNvZGUsIGlkKSB7XG4gIGNvbnN0IGNzc1BhdGggPSBpZC5lbmRzV2l0aCgnLmhicycpXG4gICAgPyBpZC5yZXBsYWNlKC9cXC5oYnMkLywgJy5jc3MnKVxuICAgIDogaWQucmVwbGFjZSgvKFxcLmhicyk/XFwuKGpzfHRzfGdqc3xndHMpJC8sICcuY3NzJyk7XG4gIGNvbnN0IGNzc0ZpbGVOYW1lID0gcGF0aC5iYXNlbmFtZShjc3NQYXRoKTtcblxuICBjb25zdCBjc3NFeGlzdHMgPSBleGlzdHNTeW5jKGNzc1BhdGgpO1xuICBsZXQgY3NzO1xuXG4gIGlmIChjc3NFeGlzdHMpIHtcbiAgICBjc3MgPSBhd2FpdCByZWFkRmlsZShjc3NQYXRoLCAndXRmOCcpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB7XG4gICAgICBjb2RlLFxuICAgICAgbWFwOiBudWxsLFxuICAgIH07XG4gIH1cblxuICAvLyBhZGQgY3NzIGltcG9ydCBmb3IganMgYW5kIGdqcyBmaWxlc1xuICBjb2RlID0gYGltcG9ydCAnLi8ke2Nzc0ZpbGVOYW1lfSc7XFxuXFxuJHtjb2RlfWA7XG5cbiAgLy8gcmV3cml0ZSBoYnMgaW4ganMgaW4gY2FzZSBpdCBpcyBnanMgZmlsZSAoZm9yIGdqcyBmaWxlcyBoYnMgaXMgYWxyZWFkeSBpbiBqcyBmaWxlKVxuXG4gIGNvbnN0IHJld3JpdHRlbkNvZGUgPSByZXBsYWNlSGJzSW5Kcyhjb2RlLCAoaGJzLCBzY29wZWRDbGFzcykgPT4ge1xuICAgIGNvbnN0IHsgY2xhc3NlcywgdGFncyB9ID0gZ2V0Q2xhc3Nlc1RhZ3NGcm9tQ3NzKGNzcyk7XG4gICAgY29uc3QgcG9zdGZpeCA9IGhhc2hGcm9tQWJzb2x1dGVQYXRoKGNzc1BhdGgpO1xuICAgIGNvbnN0IHJld3JpdHRlbiA9IHJld3JpdGVIYnMoaGJzLCBjbGFzc2VzLCB0YWdzLCBwb3N0Zml4LCBzY29wZWRDbGFzcyk7XG5cbiAgICByZXR1cm4gcmV3cml0dGVuO1xuICB9KTtcblxuICByZXR1cm4ge1xuICAgIGNvZGU6IHJld3JpdHRlbkNvZGUsXG4gICAgbWFwOiBudWxsLFxuICB9O1xufVxuXG5mdW5jdGlvbiB0cmFuc2Zvcm1Dc3NGaWxlKGNvZGUsIGlkLCBsYXllck5hbWUpIHtcbiAgY29uc3QganNQYXRoID0gaWQucmVwbGFjZSgvXFwuY3NzJC8sICcuZ2pzJyk7XG4gIGNvbnN0IGd0c1BhdGggPSBpZC5yZXBsYWNlKC9cXC5jc3MkLywgJy5ndHMnKTtcbiAgY29uc3QgaGJzUGF0aCA9IGlkLnJlcGxhY2UoL1xcLmNzcyQvLCAnLmhicycpO1xuXG4gIGNvbnN0IGpzRXhpc3RzID0gZXhpc3RzU3luYyhqc1BhdGgpO1xuICBjb25zdCBndHNFeGlzdHMgPSBleGlzdHNTeW5jKGd0c1BhdGgpO1xuICBjb25zdCBoYnNFeGlzdHMgPSBleGlzdHNTeW5jKGhic1BhdGgpO1xuXG4gIGlmIChqc0V4aXN0cyB8fCBoYnNFeGlzdHMgfHwgZ3RzRXhpc3RzKSB7XG4gICAgY29uc3QgcG9zdGZpeCA9IGhhc2hGcm9tQWJzb2x1dGVQYXRoKGlkKTtcblxuICAgIGNvZGUgPSByZXdyaXRlQ3NzKGNvZGUsIHBvc3RmaXgsIHBhdGguYmFzZW5hbWUoaWQpLCBsYXllck5hbWUpO1xuICB9XG5cbiAgcmV0dXJuIGNvZGU7XG59XG5cbmZ1bmN0aW9uIGdhdGhlckNTU0ZpbGVzKGJ1bmRsZSkge1xuICBsZXQgY3NzRmlsZXMgPSBbXTtcblxuICBmb3IgKGxldCBhc3NldCBpbiBidW5kbGUpIHtcbiAgICBjb25zdCBjc3NBc3NldCA9IGFzc2V0LnJlcGxhY2UoJ2pzJywgJ2NzcycpO1xuXG4gICAgaWYgKCFhc3NldC5lbmRzV2l0aCgnanMnKSB8fCAhYnVuZGxlW2Nzc0Fzc2V0XSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHByb2Nlc3MuZW52LmVudmlyb25tZW50ID09PSAnZGV2ZWxvcG1lbnQnKSB7XG4gICAgICBjc3NGaWxlcy5wdXNoKGJ1bmRsZVtjc3NBc3NldF0uc291cmNlKTtcbiAgICAgIGRlbGV0ZSBidW5kbGVbY3NzQXNzZXRdO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjc3NJbXBvcnQgPSBwYXRoLmJhc2VuYW1lKGFzc2V0LnJlcGxhY2UoJy5qcycsICcuY3NzJykpO1xuICAgICAgY29uc3QgaW1wb3J0TGluZSA9IGBpbXBvcnQgJy4vJHtjc3NJbXBvcnR9JztgO1xuXG4gICAgICBjb25zdCBjb2RlID0gYnVuZGxlW2Fzc2V0XS5jb2RlO1xuXG4gICAgICAvLyBhZGQgaW1wb3J0IHRvIGpzIGZpbGVzXG4gICAgICBpZiAoY29kZSAmJiBjb2RlLmluZGV4T2YoaW1wb3J0TGluZSkgPCAwKSB7XG4gICAgICAgIGJ1bmRsZVthc3NldF0uY29kZSA9IGAke2ltcG9ydExpbmV9XFxuYCArIGNvZGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNzc0ZpbGVzO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjcmVhdGVVbnBsdWdpbihcbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtvYmplY3R9IE9wdGlvbnNcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IFtsYXllck5hbWVdIHRoZSBuYW1lIG9mIHRoZSBsYXllciB0byBwbGFjZSB0aGUgZ2VuZXJhdGVkIGNzcy4gRGVmYXVsdHMgdG8gXCJjb21wb25lbnRzXCJcbiAgICpcbiAgICogQHBhcmFtIHtPcHRpb25zfSBbb3B0aW9uc11cbiAgICovXG4gIChvcHRpb25zKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6ICdlbWJlci1zY29wZWQtY3NzLXVucGx1Z2luJyxcblxuICAgICAgZ2VuZXJhdGVCdW5kbGUoXywgYnVuZGxlKSB7XG4gICAgICAgIGxldCBjc3NGaWxlcyA9IGdhdGhlckNTU0ZpbGVzKGJ1bmRsZSk7XG5cbiAgICAgICAgaWYgKHByb2Nlc3MuZW52LmVudmlyb25tZW50ID09PSAnZGV2ZWxvcG1lbnQnKSB7XG4gICAgICAgICAgdGhpcy5lbWl0RmlsZSh7XG4gICAgICAgICAgICB0eXBlOiAnYXNzZXQnLFxuICAgICAgICAgICAgZmlsZU5hbWU6ICdzY29wZWQuY3NzJyxcbiAgICAgICAgICAgIHNvdXJjZTogY3NzRmlsZXMuam9pbignXFxuJyksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB2aXRlOiB7XG4gICAgICAgIGdlbmVyYXRlQnVuZGxlKCkge1xuICAgICAgICAgIC8qIGRlbGliZXJhdGVseSBkbyBub3RoaW5nICovXG4gICAgICAgIH0sXG4gICAgICAgIHRyYW5zZm9ybShjb2RlLCBqc1BhdGgpIHtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBIQlMgZmlsZXMgYXJlIGFjdHVhbGx5IEpTIGZpbGVzIHdpdGggYSBjYWxsIHRvIHByZWNvbXBpbGVUZW1wbGF0ZVxuICAgICAgICAgICAqL1xuICAgICAgICAgIGlmIChpc0hic0ZpbGUoanNQYXRoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybUpzRmlsZShjb2RlLCBqc1BhdGgpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaXNKc0ZpbGUoanNQYXRoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybUpzRmlsZShjb2RlLCBqc1BhdGgpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaXNDc3NGaWxlKGpzUGF0aCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm1Dc3NGaWxlKGNvZGUsIGpzUGF0aCwgb3B0aW9ucz8ubGF5ZXJOYW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9LFxuXG4gICAgICB0cmFuc2Zvcm0oY29kZSwganNQYXRoKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBIQlMgZmlsZXMgYXJlIGFjdHVhbGx5IEpTIGZpbGVzIHdpdGggYSBjYWxsIHRvIHByZWNvbXBpbGVUZW1wbGF0ZVxuICAgICAgICAgKi9cbiAgICAgICAgaWYgKGlzSGJzRmlsZShqc1BhdGgpKSB7XG4gICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybUpzRmlsZShjb2RlLCBqc1BhdGgpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzSnNGaWxlKGpzUGF0aCkpIHtcbiAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtSnNGaWxlKGNvZGUsIGpzUGF0aCk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNDc3NGaWxlKGpzUGF0aCkpIHtcbiAgICAgICAgICBsZXQgY3NzID0gdHJhbnNmb3JtQ3NzRmlsZShjb2RlLCBqc1BhdGgsIG9wdGlvbnM/LmxheWVyTmFtZSk7XG5cbiAgICAgICAgICBjb25zdCBlbWl0dGVkRmlsZU5hbWUgPSBqc1BhdGgucmVwbGFjZShcbiAgICAgICAgICAgIHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCAnc3JjLycpLFxuICAgICAgICAgICAgJycsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIHRoaXMuZW1pdEZpbGUoe1xuICAgICAgICAgICAgdHlwZTogJ2Fzc2V0JyxcbiAgICAgICAgICAgIGZpbGVOYW1lOiBlbWl0dGVkRmlsZU5hbWUsXG4gICAgICAgICAgICBzb3VyY2U6IGNzcyxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9O1xuICB9LFxuKTtcbiIsICJpbXBvcnQgcG9zdGNzcyBmcm9tICdwb3N0Y3NzJztcbmltcG9ydCBwYXJzZXIgZnJvbSAncG9zdGNzcy1zZWxlY3Rvci1wYXJzZXInO1xuXG5pbXBvcnQgaXNJbnNpZGVHbG9iYWwgZnJvbSAnLi9pc0luc2lkZUdsb2JhbC5qcyc7XG5cbmZ1bmN0aW9uIGdldENsYXNzZXNBbmRUYWdzKHNlbCwgY2xhc3NlcywgdGFncykge1xuICBjb25zdCB0cmFuc2Zvcm0gPSAoc2xzKSA9PiB7XG4gICAgc2xzLndhbGsoKHNlbGVjdG9yKSA9PiB7XG4gICAgICBpZiAoc2VsZWN0b3IudHlwZSA9PT0gJ2NsYXNzJyAmJiAhaXNJbnNpZGVHbG9iYWwoc2VsZWN0b3IpKSB7XG4gICAgICAgIGNsYXNzZXMuYWRkKHNlbGVjdG9yLnZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IudHlwZSA9PT0gJ3RhZycgJiYgIWlzSW5zaWRlR2xvYmFsKHNlbGVjdG9yKSkge1xuICAgICAgICB0YWdzLmFkZChzZWxlY3Rvci52YWx1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgcGFyc2VyKHRyYW5zZm9ybSkucHJvY2Vzc1N5bmMoc2VsKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0Q2xhc3Nlc1RhZ3NGcm9tQ3NzKGNzcykge1xuICBjb25zdCBjbGFzc2VzID0gbmV3IFNldCgpO1xuICBjb25zdCB0YWdzID0gbmV3IFNldCgpO1xuXG4gIGNvbnN0IGFzdCA9IHBvc3Rjc3MucGFyc2UoY3NzKTtcblxuICBhc3Qud2Fsaygobm9kZSkgPT4ge1xuICAgIGlmIChub2RlLnR5cGUgPT09ICdydWxlJykge1xuICAgICAgZ2V0Q2xhc3Nlc0FuZFRhZ3Mobm9kZS5zZWxlY3RvciwgY2xhc3NlcywgdGFncyk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4geyBjbGFzc2VzLCB0YWdzIH07XG59XG5cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc0luc2lkZUdsb2JhbChub2RlLCBmdW5jKSB7XG4gIGNvbnN0IHBhcmVudCA9IG5vZGUucGFyZW50O1xuXG4gIGlmICghcGFyZW50KSByZXR1cm4gZmFsc2U7XG4gIGlmIChwYXJlbnQudHlwZSA9PT0gJ3BzZXVkbycgJiYgcGFyZW50LnZhbHVlID09PSAnOmdsb2JhbCcpIHJldHVybiB0cnVlO1xuXG4gIHJldHVybiBpc0luc2lkZUdsb2JhbChwYXJlbnQsIGZ1bmMpO1xufVxuIiwgImltcG9ydCBiYWJlbFBhcnNlciBmcm9tICdAYmFiZWwvcGFyc2VyJztcbmltcG9ydCByZWNhc3QgZnJvbSAncmVjYXN0JztcblxuY29uc3QgcGFyc2VPcHRpb25zID0ge1xuICBwYXJzZXI6IHtcbiAgICBwYXJzZShzb3VyY2UpIHtcbiAgICAgIHJldHVybiBiYWJlbFBhcnNlci5wYXJzZShzb3VyY2UsIHtcbiAgICAgICAgc291cmNlVHlwZTogJ21vZHVsZScsXG4gICAgICAgIGFsbG93SW1wb3J0RXhwb3J0RXZlcnl3aGVyZTogdHJ1ZSxcbiAgICAgICAgdG9rZW5zOiB0cnVlLFxuICAgICAgICBwbHVnaW5zOiBbJ2RlY29yYXRvcnMnXSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0sXG59O1xuXG5mdW5jdGlvbiByZW1vdmVTY29wZUJhZ1JlZmVyZW5jZShhc3QsIHNjb3BlZENsYXNzKSB7XG4gIGlmICghc2NvcGVkQ2xhc3MpIHJldHVybjtcblxuICByZWNhc3QudmlzaXQoYXN0LCB7XG4gICAgdmlzaXRPYmplY3RQcm9wZXJ0eShwYXRoKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHBhdGgubm9kZS52YWx1ZS50eXBlID09PSAnSWRlbnRpZmllcicgJiZcbiAgICAgICAgcGF0aC5ub2RlLnZhbHVlLm5hbWUgPT09IHNjb3BlZENsYXNzXG4gICAgICApIHtcbiAgICAgICAgcGF0aC5wcnVuZSgpO1xuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy50cmF2ZXJzZShwYXRoKTtcbiAgICB9LFxuICB9KTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKHNjcmlwdCwgcmVwbGFjZUZ1bmN0aW9uKSB7XG4gIGNvbnN0IGFzdCA9IHJlY2FzdC5wYXJzZShzY3JpcHQsIHBhcnNlT3B0aW9ucyk7XG4gIGxldCBpbXBvcnRlZFNjb3BlZENsYXNzO1xuXG4gIHJlY2FzdC52aXNpdChhc3QsIHtcbiAgICB2aXNpdEltcG9ydERlY2xhcmF0aW9uKHBhdGgpIHtcbiAgICAgIGlmIChwYXRoLm5vZGUuc291cmNlLnZhbHVlID09PSAnZW1iZXItc2NvcGVkLWNzcycpIHtcbiAgICAgICAgbGV0IHNwZWNpZmllciA9IHBhdGgubm9kZS5zcGVjaWZpZXJzLmZpbmQoXG4gICAgICAgICAgKHgpID0+IHguaW1wb3J0ZWQubmFtZSA9PT0gJ3Njb3BlZENsYXNzJyxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoc3BlY2lmaWVyKSB7XG4gICAgICAgICAgaW1wb3J0ZWRTY29wZWRDbGFzcyA9IHNwZWNpZmllci5sb2NhbC5uYW1lO1xuICAgICAgICB9XG5cbiAgICAgICAgcGF0aC5wcnVuZSgpO1xuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy50cmF2ZXJzZShwYXRoKTtcbiAgICB9LFxuICAgIHZpc2l0Q2FsbEV4cHJlc3Npb24ocGF0aCkge1xuICAgICAgY29uc3Qgbm9kZSA9IHBhdGgubm9kZTtcblxuICAgICAgY29uc3Qgc2NvcGVkQ2xhc3MgPSBpbXBvcnRlZFNjb3BlZENsYXNzID8/ICdzY29wZWQtY2xhc3MnO1xuXG4gICAgICAvKipcbiAgICAgICAqIF9fR0xJTU1FUl9URU1QTEFURSBpcyBmb3IgdXNlIHdpdGhcbiAgICAgICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9OdWxsVm94UG9wdWxpL3JvbGx1cC1wbHVnaW4tZ2xpbW1lci10ZW1wbGF0ZS10YWcvXG4gICAgICAgKiB3aGljaCB1c2VzXG4gICAgICAgKiBodHRwczovL2dpdGh1Yi5jb20vZW1iZXItdGVtcGxhdGUtaW1wb3J0cy9lbWJlci10ZW1wbGF0ZS1pbXBvcnRzL1xuICAgICAgICogQHYzLCB3aGljaCBpcyBrbm93biB0byBoYXZlIGEgbG90IG9mIHBhcnNlciBidWdzLlxuICAgICAgICpcbiAgICAgICAqIGluIEBlbWJyb2lkZXIvYWRkb24tZGV2QHY0LCB3ZSBoYXZlIG5hdGl2ZSBHSlMgc3VwcG9ydFxuICAgICAgICogYW5kIHdlIGRvbid0IGlubGluZSBjby1sb2NhdGVkIGhicyBhbmQgSlMgKG9yIHJhdGhlciwgYSByb2xsdXAgb3B0aW1pemF0aW9uIGxhdGVyIGRvZXMgaXQgZm9yIHVzKS5cbiAgICAgICAqIEluc3RlYWQsIHdlIGltcG9ydCwgd2hpY2ggbG9va3MgbGlrZSB0aGlzOlxuICAgICAgICogYGBgXG4gICAgICAgKiBpbXBvcnQgVEVNUExBVEUgZnJvbSAnLi90aGUtZmlsZS5oYnMnO1xuICAgICAgICpcbiAgICAgICAqIC4uLlxuICAgICAgICpcbiAgICAgICAqIHNldENvbXBvbmVudFRlbXBsYXRlKFRFTVBMQVRFLCBYKTtcbiAgICAgICAqIGBgYFxuICAgICAgICogQW5kIHdlIGRvbid0IHdhbnQgdG8gZW50ZXIgdGhpcyBjb2RlcGF0aCAob3IgcmF0aGVyLCBpdCBuby1vcHMpLlxuICAgICAgICogX0JVVF8sIGJlY2F1c2UgdGhpcyBmaWxlIGltcG9ydHMgdGhlIGhicyBmaWxlLCB3ZSdsbCBlbmQgdXAgaGVyZSBsYXRlclxuICAgICAgICogYW5kIHJlYWR5IHRvIGhpdCB0aGUgYHByZWNvbXBpbGVUZW1wbGF0ZWAgY29kZXBhdGguXG4gICAgICAgKi9cbiAgICAgIGlmIChcbiAgICAgICAgbm9kZS5jYWxsZWUubmFtZSA9PT0gJ19fR0xJTU1FUl9URU1QTEFURScgfHxcbiAgICAgICAgbm9kZS5jYWxsZWUubmFtZSA9PT0gJ3ByZWNvbXBpbGVUZW1wbGF0ZSdcbiAgICAgICkge1xuICAgICAgICBpZiAobm9kZS5hcmd1bWVudHNbMF0udHlwZSA9PT0gJ1RlbXBsYXRlTGl0ZXJhbCcpIHtcbiAgICAgICAgICBub2RlLmFyZ3VtZW50c1swXS5xdWFzaXNbMF0udmFsdWUucmF3ID0gcmVwbGFjZUZ1bmN0aW9uKFxuICAgICAgICAgICAgbm9kZS5hcmd1bWVudHNbMF0ucXVhc2lzWzBdLnZhbHVlLnJhdyxcbiAgICAgICAgICAgIHNjb3BlZENsYXNzLFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgbm9kZS5hcmd1bWVudHNbMF0udHlwZSA9PT0gJ1N0cmluZ0xpdGVyYWwnIHx8XG4gICAgICAgICAgbm9kZS5hcmd1bWVudHNbMF0udHlwZSA9PT0gJ0xpdGVyYWwnXG4gICAgICAgICkge1xuICAgICAgICAgIG5vZGUuYXJndW1lbnRzWzBdLnZhbHVlID0gcmVwbGFjZUZ1bmN0aW9uKFxuICAgICAgICAgICAgbm9kZS5hcmd1bWVudHNbMF0udmFsdWUsXG4gICAgICAgICAgICBzY29wZWRDbGFzcyxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGltcG9ydGVkU2NvcGVkQ2xhc3MpIHtcbiAgICAgICAgICByZW1vdmVTY29wZUJhZ1JlZmVyZW5jZShwYXRoLCBzY29wZWRDbGFzcyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy50cmF2ZXJzZShwYXRoKTtcbiAgICB9LFxuICB9KTtcblxuICByZXR1cm4gcmVjYXN0LnByaW50KGFzdCkuY29kZTtcbn1cbiIsICJpbXBvcnQgcG9zdGNzcyBmcm9tICdwb3N0Y3NzJztcbmltcG9ydCBwYXJzZXIgZnJvbSAncG9zdGNzcy1zZWxlY3Rvci1wYXJzZXInO1xuXG5pbXBvcnQgaXNJbnNpZGVHbG9iYWwgZnJvbSAnLi9pc0luc2lkZUdsb2JhbC5qcyc7XG5cbmZ1bmN0aW9uIHJld3JpdGVTZWxlY3RvcihzZWwsIHBvc3RmaXgpIHtcbiAgY29uc3QgdHJhbnNmb3JtID0gKHNlbGVjdG9ycykgPT4ge1xuICAgIHNlbGVjdG9ycy53YWxrKChzZWxlY3RvcikgPT4ge1xuICAgICAgaWYgKHNlbGVjdG9yLnR5cGUgPT09ICdjbGFzcycgJiYgIWlzSW5zaWRlR2xvYmFsKHNlbGVjdG9yKSkge1xuICAgICAgICBzZWxlY3Rvci52YWx1ZSArPSAnXycgKyBwb3N0Zml4O1xuICAgICAgfSBlbHNlIGlmIChzZWxlY3Rvci50eXBlID09PSAndGFnJyAmJiAhaXNJbnNpZGVHbG9iYWwoc2VsZWN0b3IpKSB7XG4gICAgICAgIHNlbGVjdG9yLnJlcGxhY2VXaXRoKFxuICAgICAgICAgIHBhcnNlci50YWcoeyB2YWx1ZTogc2VsZWN0b3IudmFsdWUgfSksXG4gICAgICAgICAgcGFyc2VyLmNsYXNzTmFtZSh7IHZhbHVlOiBwb3N0Zml4IH0pLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gcmVtb3ZlIDpnbG9iYWxcbiAgICBzZWxlY3RvcnMud2Fsaygoc2VsZWN0b3IpID0+IHtcbiAgICAgIGlmIChzZWxlY3Rvci50eXBlID09PSAncHNldWRvJyAmJiBzZWxlY3Rvci52YWx1ZSA9PT0gJzpnbG9iYWwnKSB7XG4gICAgICAgIHNlbGVjdG9yLnJlcGxhY2VXaXRoKC4uLnNlbGVjdG9yLm5vZGVzKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbiAgY29uc3QgdHJhbnNmb3JtZWQgPSBwYXJzZXIodHJhbnNmb3JtKS5wcm9jZXNzU3luYyhzZWwpO1xuXG4gIHJldHVybiB0cmFuc2Zvcm1lZDtcbn1cblxuZnVuY3Rpb24gaXNJbnNpZGVLZXlmcmFtZXMobm9kZSkge1xuICBjb25zdCBwYXJlbnQgPSBub2RlLnBhcmVudDtcblxuICBpZiAoIXBhcmVudCkgcmV0dXJuIGZhbHNlO1xuICBpZiAocGFyZW50LnR5cGUgPT09ICdhdHJ1bGUnICYmIHBhcmVudC5uYW1lID09PSAna2V5ZnJhbWVzJykgcmV0dXJuIHRydWU7XG5cbiAgcmV0dXJuIGlzSW5zaWRlS2V5ZnJhbWVzKHBhcmVudCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJld3JpdGVDc3MoY3NzLCBwb3N0Zml4LCBmaWxlTmFtZSwgbGF5ZXJOYW1lKSB7XG4gIGNvbnN0IGxheWVyTmFtZVdpdGhEZWZhdWx0ID0gbGF5ZXJOYW1lID8/ICdjb21wb25lbnRzJztcbiAgY29uc3QgYXN0ID0gcG9zdGNzcy5wYXJzZShjc3MpO1xuXG4gIGFzdC53YWxrKChub2RlKSA9PiB7XG4gICAgaWYgKG5vZGUudHlwZSA9PT0gJ3J1bGUnICYmICFpc0luc2lkZUtleWZyYW1lcyhub2RlKSkge1xuICAgICAgbm9kZS5zZWxlY3RvciA9IHJld3JpdGVTZWxlY3Rvcihub2RlLnNlbGVjdG9yLCBwb3N0Zml4KTtcbiAgICB9XG4gIH0pO1xuXG4gIGNvbnN0IHJld3JpdHRlbkNzcyA9IGFzdC50b1N0cmluZygpO1xuXG4gIGlmICghbGF5ZXJOYW1lV2l0aERlZmF1bHQpIHtcbiAgICByZXR1cm4gYC8qICR7ZmlsZU5hbWV9ICovXFxuJHtyZXdyaXR0ZW5Dc3N9XFxuYDtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgYC8qICR7ZmlsZU5hbWV9ICovXFxuQGxheWVyICR7bGF5ZXJOYW1lV2l0aERlZmF1bHR9IHtcXG5cXG5gICtcbiAgICByZXdyaXR0ZW5Dc3MgK1xuICAgICdcXG59XFxuJ1xuICApO1xufVxuXG4iLCAiaW1wb3J0IHJlY2FzdCBmcm9tICdlbWJlci10ZW1wbGF0ZS1yZWNhc3QnO1xuXG5pbXBvcnQgeyByZW5hbWVDbGFzcyB9IGZyb20gJy4vcmVuYW1lQ2xhc3MuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gdGVtcGxhdGVQbHVnaW4oeyBjbGFzc2VzLCB0YWdzLCBwb3N0Zml4IH0pIHtcbiAgbGV0IHN0YWNrID0gW107XG4gIC8vIHNjb3BlZC1jbGFzcyBpcyBhIGdsb2JhbCB3ZSBhbGxvdyBpbiBoYnNcbiAgLy8gc2NvcGVkQ2xhc3MgaXMgaW1wb3J0YWJsZSwgYW5kIHdlJ2xsIGVycm9yIGlmIHNvbWVvbmUgdHJpZXMgdG8gcmVuYW1lIGl0XG4gIGxldCBzY29wZWRDbGFzc0NhbmRpZGF0ZXMgPSBbJ3Njb3BlZC1jbGFzcycsICdzY29wZWRDbGFzcyddO1xuXG4gIGZ1bmN0aW9uIGlzU2NvcGVkQ2xhc3Moc3RyKSB7XG4gICAgaWYgKCFzdHIpIHJldHVybiBmYWxzZTtcblxuICAgIHJldHVybiBzY29wZWRDbGFzc0NhbmRpZGF0ZXMuc29tZSgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUgPT09IHN0cik7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIEF0dHJOb2RlKG5vZGUpIHtcbiAgICAgIGlmIChub2RlLm5hbWUgPT09ICdjbGFzcycpIHtcbiAgICAgICAgaWYgKG5vZGUudmFsdWUudHlwZSA9PT0gJ1RleHROb2RlJyAmJiBub2RlLnZhbHVlLmNoYXJzKSB7XG4gICAgICAgICAgY29uc3QgcmVuYW1lZENsYXNzID0gcmVuYW1lQ2xhc3Mobm9kZS52YWx1ZS5jaGFycywgcG9zdGZpeCwgY2xhc3Nlcyk7XG5cbiAgICAgICAgICBub2RlLnZhbHVlLmNoYXJzID0gcmVuYW1lZENsYXNzO1xuICAgICAgICB9IGVsc2UgaWYgKG5vZGUudmFsdWUudHlwZSA9PT0gJ0NvbmNhdFN0YXRlbWVudCcpIHtcbiAgICAgICAgICBmb3IgKGxldCBwYXJ0IG9mIG5vZGUudmFsdWUucGFydHMpIHtcbiAgICAgICAgICAgIGlmIChwYXJ0LnR5cGUgPT09ICdUZXh0Tm9kZScgJiYgcGFydC5jaGFycykge1xuICAgICAgICAgICAgICBjb25zdCByZW5hbWVkQ2xhc3MgPSByZW5hbWVDbGFzcyhwYXJ0LmNoYXJzLCBwb3N0Zml4LCBjbGFzc2VzKTtcblxuICAgICAgICAgICAgICBwYXJ0LmNoYXJzID0gcmVuYW1lZENsYXNzO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJ0LnR5cGUgPT09ICdNdXN0YWNoZVN0YXRlbWVudCcpIHtcbiAgICAgICAgICAgICAgcmVjYXN0LnRyYXZlcnNlKHBhcnQsIHtcbiAgICAgICAgICAgICAgICBTdHJpbmdMaXRlcmFsKG5vZGUpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbmFtZWRDbGFzcyA9IHJlbmFtZUNsYXNzKFxuICAgICAgICAgICAgICAgICAgICBub2RlLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBwb3N0Zml4LFxuICAgICAgICAgICAgICAgICAgICBjbGFzc2VzLFxuICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgbm9kZS52YWx1ZSA9IHJlbmFtZWRDbGFzcztcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgRWxlbWVudE5vZGUobm9kZSkge1xuICAgICAgaWYgKHRhZ3MuaGFzKG5vZGUudGFnKSkge1xuICAgICAgICAvLyBjaGVjayBpZiBjbGFzcyBhdHRyaWJ1dGUgYWxyZWFkeSBleGlzdHNcbiAgICAgICAgY29uc3QgY2xhc3NBdHRyID0gbm9kZS5hdHRyaWJ1dGVzLmZpbmQoKGF0dHIpID0+IGF0dHIubmFtZSA9PT0gJ2NsYXNzJyk7XG5cbiAgICAgICAgaWYgKGNsYXNzQXR0cikge1xuICAgICAgICAgIGNsYXNzQXR0ci52YWx1ZS5jaGFycyArPSAnICcgKyBwb3N0Zml4O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHB1c2ggY2xhc3MgYXR0cmlidXRlXG4gICAgICAgICAgbm9kZS5hdHRyaWJ1dGVzLnB1c2goXG4gICAgICAgICAgICByZWNhc3QuYnVpbGRlcnMuYXR0cignY2xhc3MnLCByZWNhc3QuYnVpbGRlcnMudGV4dChwb3N0Zml4KSksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBBbGw6IHtcbiAgICAgIGVudGVyKG5vZGUpIHtcbiAgICAgICAgc3RhY2sucHVzaChub2RlKTtcbiAgICAgIH0sXG4gICAgICBleGl0KCkge1xuICAgICAgICBzdGFjay5wb3AoKTtcbiAgICAgIH0sXG4gICAgfSxcblxuICAgIE11c3RhY2hlU3RhdGVtZW50KG5vZGUpIHtcbiAgICAgIGxldCBjc3NDbGFzcztcblxuICAgICAgaWYgKFxuICAgICAgICBpc1Njb3BlZENsYXNzKGdldFZhbHVlKG5vZGUucGF0aCkpICYmXG4gICAgICAgIG5vZGUucGFyYW1zPy5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgbm9kZS5wYXJhbXNbMF0udHlwZSA9PT0gJ1N0cmluZ0xpdGVyYWwnXG4gICAgICApIHtcbiAgICAgICAgY3NzQ2xhc3MgPSBub2RlLnBhcmFtc1swXS52YWx1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICBpc1Njb3BlZENsYXNzKGdldFZhbHVlKG5vZGUucGF0aD8ucGF0aCkpICYmXG4gICAgICAgIG5vZGUucGF0aD8ucGFyYW1zPy5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgbm9kZS5wYXRoPy5wYXJhbXNbMF0udHlwZSA9PT0gJ1N0cmluZ0xpdGVyYWwnXG4gICAgICApIHtcbiAgICAgICAgY3NzQ2xhc3MgPSBub2RlLnBhdGgucGFyYW1zWzBdLnZhbHVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoY3NzQ2xhc3MpIHtcbiAgICAgICAgY29uc3QgdGV4dE5vZGUgPSByZWNhc3QuYnVpbGRlcnMudGV4dChyZW5hbWVDbGFzcyhjc3NDbGFzcywgcG9zdGZpeCkpO1xuICAgICAgICBjb25zdCBwYXJlbnQgPSBzdGFja1tzdGFjay5sZW5ndGggLSAxXTtcblxuICAgICAgICBpZiAocGFyZW50LnR5cGUgPT09ICdBdHRyTm9kZScpIHtcbiAgICAgICAgICBwYXJlbnQucXVvdGVUeXBlID0gJ1wiJztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0ZXh0Tm9kZTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgU3ViRXhwcmVzc2lvbihub2RlKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGlzU2NvcGVkQ2xhc3MoZ2V0VmFsdWUobm9kZS5wYXRoKSkgJiZcbiAgICAgICAgbm9kZS5wYXJhbXM/Lmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICBub2RlLnBhcmFtc1swXS50eXBlID09PSAnU3RyaW5nTGl0ZXJhbCdcbiAgICAgICkge1xuICAgICAgICBjb25zdCBjc3NDbGFzcyA9IG5vZGUucGFyYW1zWzBdLnZhbHVlO1xuICAgICAgICBjb25zdCB0ZXh0Tm9kZSA9IHJlY2FzdC5idWlsZGVycy5saXRlcmFsKFxuICAgICAgICAgICdTdHJpbmdMaXRlcmFsJyxcbiAgICAgICAgICByZW5hbWVDbGFzcyhjc3NDbGFzcywgcG9zdGZpeCksXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIHRleHROb2RlO1xuICAgICAgfVxuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldFZhbHVlKHBhdGgpIHtcbiAgaWYgKCFwYXRoKSByZXR1cm47XG5cbiAgaWYgKCd2YWx1ZScgaW4gcGF0aCkge1xuICAgIHJldHVybiBwYXRoLnZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIERlcHJlY2F0ZWQgaW4gZW1iZXIgNS45K1xuICAgKiAoc28gd2UgdXNlIHRoZSBhYm92ZSBmb3IgbmV3ZXIgZW1iZXJzKVxuICAgKi9cbiAgcmV0dXJuIHBhdGgub3JpZ2luYWw7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJld3JpdGVIYnMoaGJzLCBjbGFzc2VzLCB0YWdzLCBwb3N0Zml4KSB7XG4gIGxldCBhc3QgPSByZWNhc3QucGFyc2UoaGJzKTtcblxuICByZWNhc3QudHJhdmVyc2UoYXN0LCB0ZW1wbGF0ZVBsdWdpbih7IGNsYXNzZXMsIHRhZ3MsIHBvc3RmaXggfSkpO1xuXG4gIGxldCByZXN1bHQgPSByZWNhc3QucHJpbnQoYXN0KTtcblxuICByZXR1cm4gcmVzdWx0O1xufVxuIiwgIi8qKlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc05hbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBwb3N0Zml4XG4gKiBAcGFyYW0ge1NldDxzdHJpbmc+fSBbY2xhc3Nlc0luQ3NzXVxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmFtZUNsYXNzKGNsYXNzTmFtZSwgcG9zdGZpeCwgY2xhc3Nlc0luQ3NzKSB7XG4gIGNvbnN0IGNsYXNzZXMgPSBjbGFzc05hbWUuc3BsaXQoL1xccysvKTtcbiAgY29uc3QgcmVuYW1lZENsYXNzZXMgPSBjbGFzc2VzXG4gICAgLmZpbHRlcigoYykgPT4gYylcbiAgICAubWFwKChjKSA9PiBjLnRyaW0oKSlcbiAgICAubWFwKChjKSA9PiB7XG4gICAgICBpZiAoIWNsYXNzZXNJbkNzcyB8fCBjbGFzc2VzSW5Dc3MuaGFzKGMpKSB7XG4gICAgICAgIGlmIChjLmVuZHNXaXRoKHBvc3RmaXgpKSByZXR1cm4gYztcblxuICAgICAgICByZXR1cm4gYyArICdfJyArIHBvc3RmaXg7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjO1xuICAgIH0pXG4gICAgLmpvaW4oJyAnKTtcblxuICBjb25zdCByZW5hbWVkV2l0aFByZXNlcnZlZFNwYWNlcyA9IGNsYXNzTmFtZS5yZXBsYWNlKFxuICAgIGNsYXNzTmFtZS50cmltU3RhcnQoKS50cmltRW5kKCksXG4gICAgcmVuYW1lZENsYXNzZXMsXG4gICk7XG5cbiAgcmV0dXJuIHJlbmFtZWRXaXRoUHJlc2VydmVkU3BhY2VzO1xufVxuIiwgImltcG9ydCB7IGV4aXN0c1N5bmMsIHJlYWRGaWxlU3luYyB9IGZyb20gJ2ZzJztcblxuaW1wb3J0IGdldENsYXNzZXNUYWdzRnJvbUNzcyBmcm9tICcuLi9nZXRDbGFzc2VzVGFnc0Zyb21Dc3MuanMnO1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBjc3NQYXRoIHBhdGggdG8gYSBDU1MgZmlsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q1NTSW5mbyhjc3NQYXRoKSB7XG4gIGlmICghZXhpc3RzU3luYyhjc3NQYXRoKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgbGV0IGNzcyA9IHJlYWRGaWxlU3luYyhjc3NQYXRoLCAndXRmOCcpO1xuICBsZXQgcmVzdWx0ID0gZ2V0Q2xhc3Nlc1RhZ3NGcm9tQ3NzKGNzcyk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbiIsICJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBmaW5kV29ya3NwYWNlUGF0aCB9IGZyb20gJy4vdXRpbHMuanMnO1xuXG4vKipcbiAqIHRlbXBsYXRlIHBsdWdpbnMgZG8gbm90IGhhbmQgdXMgdGhlIGNvcnJlY3QgZmlsZSBwYXRoLlxuICogYWRkaXRpb25hbGx5LCB3ZSBtYXkgbm90IGJlIGFibGUgdG8gcmVseSBvbiB0aGlzIGRhdGEgaW4gdGhlIGZ1dHVyZSxcbiAqIHNvIHRoaXMgZnVuY3Rpb25zIGFjdHMgYXMgYSBtZWFucyBvZiBub3JtYWxpemluZyBfd2hhdGV2ZXJfIHdlJ3JlIGdpdmVuXG4gKiBpbiB0aGUgZnV0dXJlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlbmFtZVxuICogQHJldHVybnMge3N0cmluZ30gdGhlIGFic29sdXRlIHBhdGggdG8gdGhlIGZpbGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpeEZpbGVuYW1lKGZpbGVuYW1lKSB7XG4gIGxldCBmaWxlTmFtZSA9IGZpbGVuYW1lO1xuICBsZXQgd29ya3NwYWNlID0gZmluZFdvcmtzcGFjZVBhdGgoZmlsZU5hbWUpO1xuXG4gIC8qKlxuICAgKiBlbWJlci1zb3VyY2UgNS44OlxuICAgKiAtIHRoZSBmaWxlbmFtZSBsb29rcyBsaWtlIGFuIGFic29sdXRlIHBhdGgsIGJ1dCBzd2FwcGVkIG91dCB0aGUgJ2FwcCcgcGFydCBvZiB0aGUgcGF0aFxuICAgKiAgIHdpdGggdGhlIG1vZHVsZSBuYW1lLCBzbyB0aGUgZmlsZSBwYXRocyBuZXZlciBleGlzdCBvbiBkaXNrXG4gICAqXG4gICAqIC0gaW4gdml0ZSBhcHBzOlxuICAgKiAgIHRoZSAnYXBwJyBwYXJ0IF9tYXlfIGJlIGBzcmNgLCBzbyB3ZSBhbHNvIG5lZWQgdG8gZW5zdXJlIHRoYXQgYHNyY2AgaXMgZXhjbHVkZWQgYXMgd2VsbFxuICAgKi9cbiAgbGV0IGhhc0FwcERpciA9IGZpbGVOYW1lLmluY2x1ZGVzKHBhdGguam9pbih3b3Jrc3BhY2UsICdhcHAnKSk7XG4gIGxldCBoYXNTcmNEaXIgPSBmaWxlTmFtZS5pbmNsdWRlcyhwYXRoLmpvaW4od29ya3NwYWNlLCAnc3JjJykpO1xuXG4gIGlmIChcbiAgICAhKGhhc0FwcERpciB8fCBoYXNTcmNEaXIpICYmXG4gICAgIWZpbGVOYW1lLmluY2x1ZGVzKCcvbm9kZV9tb2R1bGVzLy5lbWJyb2lkZXIvJylcbiAgKSB7XG4gICAgbGV0IG1heWJlTW9kdWxlID0gZmlsZU5hbWUucmVwbGFjZSh3b3Jrc3BhY2UsICcnKTtcbiAgICBsZXQgW21heWJlU2NvcGUsIC4uLnJlc3RdID0gbWF5YmVNb2R1bGUuc3BsaXQoJy8nKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgbGV0IHBhcnRzID0gcmVzdDtcblxuICAgIGlmIChtYXliZVNjb3BlLnN0YXJ0c1dpdGgoJ0AnKSkge1xuICAgICAgbGV0IFssIC4uLnJlc3Rlcl0gPSByZXN0O1xuXG4gICAgICBwYXJ0cyA9IHJlc3RlcjtcbiAgICB9XG5cbiAgICBsZXQgcmVsYXRpdmUgPSBwYXRoLmpvaW4oLi4ucGFydHMpO1xuXG4gICAgLyoqXG4gICAgICogV2UgZG9uJ3QgYWN0dWFsbHkga25vdyBpZiB0aGlzIGZpbGUgaXMgYW4gYXBwLlxuICAgICAqIGl0IGNvdWxkIGJlIGFuIGFkZG9uICh2MSBvciB2MilcbiAgICAgKlxuICAgICAqIFNvIGhlcmUgd2UgbG9nIHRvIHNlZSBpZiB3ZSBoYXZlIHVuaGFuZGxlZCBzaXR1YXRpb25zLlxuICAgICAqL1xuICAgIGxldCBjYW5kaWRhdGVQYXRoID0gcGF0aC5qb2luKHdvcmtzcGFjZSwgJ2FwcCcsIHJlbGF0aXZlKTtcblxuICAgIHJldHVybiBjYW5kaWRhdGVQYXRoO1xuICB9XG5cbiAgLyoqXG4gICAqIHVuZGVyIGVtYnJvaWRlckAzLCB0aGUgZmlsZU5hbWUgd2lsbCBiZSB0aGUgcGF0aCB0byB0aGUgcmV3cml0dGVuIGZpbGUuXG4gICAqIHdlIGRvbid0IHdhbnQgdGhpcy5cbiAgICogd2Ugd2FudCB0aGUgcGF0aCB0byB0aGUgb3JpZ2luYWwgc291cmNlLlxuICAgKiBUaHJvdWdoIHRoZSBwb3dlcnMgb2YgXHUyNzI4IGNvbnZlbnRpb24gXHUyNzI4LCB3ZSBjYW4gbWFwIGJhY2sgdG8gc291cmNlLlxuICAgKi9cbiAgaWYgKGZpbGVOYW1lLmluY2x1ZGVzKCcvbm9kZV9tb2R1bGVzLy5lbWJyb2lkZXIvcmV3cml0dGVuLWFwcC8nKSkge1xuICAgIGxldCBjYW5kaWRhdGVQYXRoID0gZmlsZU5hbWUucmVwbGFjZShcbiAgICAgICcvbm9kZV9tb2R1bGVzLy5lbWJyb2lkZXIvcmV3cml0dGVuLWFwcC8nLFxuICAgICAgJy9hcHAvJyxcbiAgICApO1xuXG4gICAgcmV0dXJuIGNhbmRpZGF0ZVBhdGg7XG4gIH1cblxuICAvLyBUT0RPOiB3aHkgYXJlIHdlIHBhc3NlZCBmaWxlcyB0byBvdGhlciBwcm9qZWN0cz9cbiAgaWYgKCFmaWxlTmFtZS5pbmNsdWRlcyh3b3Jrc3BhY2UpKSB7XG4gICAgcmV0dXJuIGZpbGVOYW1lO1xuICB9XG5cbiAgLy8gRmFsbGJhY2sgdG8gd2hhdCB0aGUgcGx1Z2luIHN5c3RlbSBnaXZlcyB1cy5cbiAgLy8gVGhpcyBtYXkgYmUgd3JvbmcsIGFuZCBpZiB3cm9uZywgcmV2ZWFsc1xuICAvLyB1bmhhbmRsZWQgc2NlbmFyaW9zIHdpdGggdGhlIGZpbGUgbmFtZXMgaW4gdGhlIHBsdWdpbiBpbmZyYVxuICByZXR1cm4gZmlsZU5hbWU7XG59XG4iLCAiLyoqXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAZ2xpbW1lci9zeW50YXgnKS5BU1RQbHVnaW59IEFTVFBsdWdpblxuICogQHR5cGVkZWYge2ltcG9ydCgnQGdsaW1tZXIvc3ludGF4JykuQVNUUGx1Z2luRW52aXJvbm1lbnR9IEFTVFBsdWdpbkVudmlyb25tZW50XG4gKlxuICovXG5cbmltcG9ydCB7IGdldENTU0luZm8gfSBmcm9tICcuLi9saWIvY3NzL3V0aWxzLmpzJztcbmltcG9ydCB7IGZpeEZpbGVuYW1lIH0gZnJvbSAnLi4vbGliL3BhdGgvdGVtcGxhdGUtdHJhbnNmb3JtLXBhdGhzLmpzJztcbmltcG9ydCB7XG4gIGFwcFBhdGgsXG4gIGNzc1BhdGhGb3IsXG4gIGhhc2hGcm9tTW9kdWxlUGF0aCxcbiAgaXNSZWxldmFudEZpbGUsXG59IGZyb20gJy4uL2xpYi9wYXRoL3V0aWxzLmpzJztcbmltcG9ydCB7IHRlbXBsYXRlUGx1Z2luIH0gZnJvbSAnLi4vbGliL3Jld3JpdGVIYnMuanMnO1xuXG5jb25zdCBub29wUGx1Z2luID0ge1xuICBuYW1lOiAnZW1iZXItc2NvcGVkLWNzczpub29wJyxcbiAgdmlzaXRvcjoge30sXG59O1xuXG4vKipcbiAqIEByZXR1cm5zIHtBU1RQbHVnaW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQbHVnaW4oY29uZmlnKSB7XG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge0FTVFBsdWdpbkVudmlyb25tZW50fSBlbnZcbiAgICovXG4gIHJldHVybiBmdW5jdGlvbiBzY29wZWRDc3MoZW52KSB7XG4gICAgbGV0IGlzUmVsZXZhbnQgPSBpc1JlbGV2YW50RmlsZShlbnYuZmlsZW5hbWUsIHtcbiAgICAgIGFkZGl0aW9uYWxSb290czogY29uZmlnLmFkZGl0aW9uYWxSb290cyxcbiAgICAgIGN3ZDogcHJvY2Vzcy5jd2QoKSxcbiAgICB9KTtcblxuICAgIGlmICghaXNSZWxldmFudCkge1xuICAgICAgcmV0dXJuIG5vb3BQbHVnaW47XG4gICAgfVxuXG4gICAgbGV0IGFic29sdXRlUGF0aCA9IGZpeEZpbGVuYW1lKGVudi5maWxlbmFtZSk7XG4gICAgbGV0IG1vZHVsZVBhdGggPSBhcHBQYXRoKGFic29sdXRlUGF0aCk7XG5cbiAgICBsZXQgY3NzUGF0aCA9IGNzc1BhdGhGb3IoYWJzb2x1dGVQYXRoKTtcbiAgICBsZXQgaW5mbyA9IGdldENTU0luZm8oY3NzUGF0aCk7XG4gICAgbGV0IHBvc3RmaXggPSBoYXNoRnJvbU1vZHVsZVBhdGgobW9kdWxlUGF0aCk7XG5cbiAgICBpZiAoIWluZm8pIHtcbiAgICAgIHJldHVybiBub29wUGx1Z2luO1xuICAgIH1cblxuICAgIGxldCB2aXNpdG9ycyA9IHRlbXBsYXRlUGx1Z2luKHtcbiAgICAgIGNsYXNzZXM6IGluZm8uY2xhc3NlcyxcbiAgICAgIHRhZ3M6IGluZm8udGFncyxcbiAgICAgIHBvc3RmaXgsXG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogJ2VtYmVyLXNjb3BlZC1jc3M6dGVtcGxhdGUtcGx1Z2luJyxcbiAgICAgIHZpc2l0b3I6IHtcbiAgICAgICAgLy8gU3RhY2sgTWFuYWdlclxuICAgICAgICAuLi52aXNpdG9ycyxcbiAgICAgICAgLy8gVmlzaXRvcnMgYnJva2VuIG91dCBsaWtlIHRoaXMgc28gd2UgY2FuIGNvbmRpdGlvbmFsbHlcbiAgICAgICAgLy8gZGVidWcgYmFzZWQgb24gZmlsZSBwYXRoLlxuICAgICAgICBBdHRyTm9kZSguLi5hcmdzKSB7XG4gICAgICAgICAgcmV0dXJuIHZpc2l0b3JzLkF0dHJOb2RlKC4uLmFyZ3MpO1xuICAgICAgICB9LFxuICAgICAgICBFbGVtZW50Tm9kZSguLi5hcmdzKSB7XG4gICAgICAgICAgcmV0dXJuIHZpc2l0b3JzLkVsZW1lbnROb2RlKC4uLmFyZ3MpO1xuICAgICAgICB9LFxuICAgICAgICBNdXN0YWNoZVN0YXRlbWVudCguLi5hcmdzKSB7XG4gICAgICAgICAgcmV0dXJuIHZpc2l0b3JzLk11c3RhY2hlU3RhdGVtZW50KC4uLmFyZ3MpO1xuICAgICAgICB9LFxuICAgICAgICBTdWJFeHByZXNzaW9uKC4uLmFyZ3MpIHtcbiAgICAgICAgICByZXR1cm4gdmlzaXRvcnMuU3ViRXhwcmVzc2lvbiguLi5hcmdzKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4g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UUFDQSxxQkFBcUIsTUFBTTtBQUN6QixpQkFBTyxTQUFTLGtCQUFrQixHQUFHLElBQUk7QUFBQSxRQUMzQztBQUFBLFFBQ0EsaUJBQWlCLE1BQU07QUFDckIsaUJBQU8sU0FBUyxjQUFjLEdBQUcsSUFBSTtBQUFBLFFBQ3ZDO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0Y7IiwKICAibmFtZXMiOiBbIm1kNSIsICJwYXRoIiwgImFzc2VydCIsICJmc1N5bmMiLCAicGF0aCIsICJub2RlUGF0aCIsICJpbXBvcnRfbm9kZV9mcyIsICJpbXBvcnRfbm9kZV9wYXRoIiwgInBhcnNlciIsICJwb3N0Y3NzIiwgImJhYmVsUGFyc2VyIiwgInJlY2FzdCIsICJwYXRoIiwgImltcG9ydF9wb3N0Y3NzIiwgImltcG9ydF9wb3N0Y3NzX3NlbGVjdG9yX3BhcnNlciIsICJwYXJzZXIiLCAicG9zdGNzcyIsICJyZWNhc3QiLCAibm9kZSIsICJwYXRoIiwgInBhdGgiLCAicHJvY2VzcyIsICJpbXBvcnRfZnMiLCAiaW1wb3J0X25vZGVfcGF0aCIsICJwYXRoIl0KfQo=
851
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2J1aWxkL2luZGV4LmpzIiwgIi4uLy4uL3NyYy9idWlsZC9iYWJlbC1wbHVnaW4uanMiLCAiLi4vLi4vc3JjL2xpYi9wYXRoL3V0aWxzLmpzIiwgIi4uLy4uL3NyYy9saWIvcGF0aC9oYXNoLWZyb20tbW9kdWxlLXBhdGguanMiLCAiLi4vLi4vc3JjL2xpYi9wYXRoL2hhc2gtZnJvbS1hYnNvbHV0ZS1wYXRoLmpzIiwgIi4uLy4uL3NyYy9idWlsZC9zY29wZWQtY3NzLXVucGx1Z2luLmpzIiwgIi4uLy4uL3NyYy9saWIvZ2V0Q2xhc3Nlc1RhZ3NGcm9tQ3NzLmpzIiwgIi4uLy4uL3NyYy9saWIvaXNJbnNpZGVHbG9iYWwuanMiLCAiLi4vLi4vc3JjL2xpYi9yZXBsYWNlSGJzSW5Kcy5qcyIsICIuLi8uLi9zcmMvbGliL3Jld3JpdGVDc3MuanMiLCAiLi4vLi4vc3JjL2xpYi9yZXdyaXRlSGJzLmpzIiwgIi4uLy4uL3NyYy9saWIvcmVuYW1lQ2xhc3MuanMiLCAiLi4vLi4vc3JjL2xpYi9jc3MvdXRpbHMuanMiLCAiLi4vLi4vc3JjL2xpYi9wYXRoL3RlbXBsYXRlLXRyYW5zZm9ybS1wYXRocy5qcyIsICIuLi8uLi9zcmMvYnVpbGQvdGVtcGxhdGUtcGx1Z2luLmpzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJleHBvcnQgeyBkZWZhdWx0IGFzIGJhYmVsUGx1Z2luIH0gZnJvbSAnLi9iYWJlbC1wbHVnaW4uanMnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBzY29wZWRDc3NVbnBsdWdpbiB9IGZyb20gJy4vc2NvcGVkLWNzcy11bnBsdWdpbi5qcyc7XG5leHBvcnQgeyBjcmVhdGVQbHVnaW4gYXMgdGVtcGxhdGVQbHVnaW4gfSBmcm9tICcuL3RlbXBsYXRlLXBsdWdpbi5qcyc7XG4iLCAiaW1wb3J0IHsgSW1wb3J0VXRpbCB9IGZyb20gJ2JhYmVsLWltcG9ydC11dGlsJztcbmltcG9ydCB7IGV4aXN0c1N5bmMgfSBmcm9tICdmcyc7XG5pbXBvcnQgbm9kZVBhdGggZnJvbSAncGF0aCc7XG5cbmltcG9ydCB7IGNzc1BhdGhGb3IsIGlzUmVsZXZhbnRGaWxlIH0gZnJvbSAnLi4vbGliL3BhdGgvdXRpbHMuanMnO1xuXG5mdW5jdGlvbiBfaXNSZWxldmFudEZpbGUoc3RhdGUsIGN3ZCkge1xuICBsZXQgZmlsZU5hbWUgPSBzdGF0ZS5maWxlLm9wdHMuZmlsZW5hbWU7XG4gIGxldCBhZGRpdGlvbmFsUm9vdHMgPSBzdGF0ZS5vcHRzPy5hZGRpdGlvbmFsUm9vdHM7XG5cbiAgcmV0dXJuIGlzUmVsZXZhbnRGaWxlKGZpbGVOYW1lLCB7XG4gICAgYWRkaXRpb25hbFJvb3RzLFxuICAgIGN3ZCxcbiAgfSk7XG59XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IGVudiAtIGJhYmVsIHBsdWdpbiBlbnYsIGVudi50eXBlcyBpcyBtb3N0IGNvbW1vbmx5IHVzZWQgKGVzcCBpbiBUUylcbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIC0gdGhlIG9wdGlvbnMgZm9yIHNjb3BlZC1jc3MgLS0gdGhpcyBpcyBhbHNvIGF2YWlsYWJsZSBpbiBlYWNoIHZpc2l0b3IncyBzdGF0ZS5vcHRzXG4gKiBAcGFyYW0ge3N0cmluZ30gd29ya2luZ0RpcmVjdG9yeVxuICovXG5leHBvcnQgZGVmYXVsdCAoZW52LCBvcHRpb25zLCB3b3JraW5nRGlyZWN0b3J5KSA9PiB7XG4gIC8qKlxuICAgKiBUaGlzIGJhYmVsIHBsdWdpbiBkb2VzIHRocmVlIHRoaW5nczpcbiAgICogLSByZW1vdmVzIHRoZSBpbXBvcnQgb2Ygc2NvcGVkQ2xhc3MsIGlmIGl0IGV4aXN0c1xuICAgKiAgIC0gaWYgc2NvcGVkQ2xhc3Mgd2FzIGltcG9ydGVkLCBpdCBpcyByZW1vdmVkIGZyb20gYW55IGNvbXBvbmVudCdzIFwic2NvcGUgYmFnXCJcbiAgICogICAgICh0aGUgc2NvcGUgYmFnIGJlaW5nIGEgbG93LWxldmVsIG9iamVjdCB1c2VkIGZvciBwYXNzaW5nIHdoYXQgaXMgXCJpbiBzY29wZVwiIGZvciBhIGNvbXBvbmVudClcbiAgICogLSBhZGRzIGFuIGltcG9ydCB0byB0aGUgQ1NTIGZpbGUsIGlmIGl0IGV4aXN0c1xuICAgKi9cbiAgcmV0dXJuIHtcbiAgICB2aXNpdG9yOiB7XG4gICAgICBQcm9ncmFtOiB7XG4gICAgICAgIGVudGVyKHBhdGgsIHN0YXRlKSB7XG4gICAgICAgICAgaWYgKCFfaXNSZWxldmFudEZpbGUoc3RhdGUsIHdvcmtpbmdEaXJlY3RvcnkpKSB7XG4gICAgICAgICAgICBzdGF0ZS5jYW5Ta2lwID0gdHJ1ZTtcblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHN0YXRlLmltcG9ydFV0aWwgPSBuZXcgSW1wb3J0VXRpbChlbnYsIHBhdGgpO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIEltcG9ydERlY2xhcmF0aW9uKHBhdGgsIHN0YXRlKSB7XG4gICAgICAgIGlmIChzdGF0ZS5jYW5Ta2lwKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhdGgubm9kZS5zb3VyY2UudmFsdWUgPT09ICdlbWJlci1zY29wZWQtY3NzJykge1xuICAgICAgICAgIGxldCBzcGVjaWZpZXIgPSBwYXRoLm5vZGUuc3BlY2lmaWVycy5maW5kKFxuICAgICAgICAgICAgKHgpID0+IHguaW1wb3J0ZWQubmFtZSA9PT0gJ3Njb3BlZENsYXNzJyxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKHNwZWNpZmllcikge1xuICAgICAgICAgICAgc3RhdGUuZmlsZS5vcHRzLmltcG9ydGVkU2NvcGVkQ2xhc3MgPSBzcGVjaWZpZXIubG9jYWwubmFtZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoc3BlY2lmaWVyLmxvY2FsLm5hbWUgIT09ICdzY29wZWRDbGFzcycpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYFRoZSBzY29wZWRDbGFzcyBpbXBvcnQgaXMgYSBwc3VlZG8taGVscGVyLCBhbmQgbWF5IG5vdCBiZSByZW5hbWVkIGFzIGl0IGlzIHJlbW92ZWQgYXQgYnVpbGQgdGltZS5gLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBwYXRoLnJlbW92ZSgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLyoqXG4gICAgICAgKiBPbmx5IGluIHN0cmljdCBtb2RlLCBkbyB3ZSBjYXJlIGFib3V0IHJlbW9uaW5nIHRoZSBzY29wZSBiYWcgcmVmZXJlbmNlXG4gICAgICAgKi9cbiAgICAgIE9iamVjdFByb3BlcnR5KHBhdGgsIHN0YXRlKSB7XG4gICAgICAgIGlmICghc3RhdGUuZmlsZS5vcHRzPy5pbXBvcnRlZFNjb3BlZENsYXNzKSByZXR1cm47XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHBhdGgubm9kZS52YWx1ZS50eXBlID09PSAnSWRlbnRpZmllcicgJiZcbiAgICAgICAgICBwYXRoLm5vZGUudmFsdWUubmFtZSA9PT0gc3RhdGUuZmlsZS5vcHRzPy5pbXBvcnRlZFNjb3BlZENsYXNzXG4gICAgICAgICkge1xuICAgICAgICAgIHBhdGgucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAvKipcbiAgICAgICAqIElmIHRoZXJlIGlzIGEgQ1NTIGZpbGUsIEFORCBhIGNvcnJlc3BvbmRpbmcgdGVtcGxhdGUsXG4gICAgICAgKiB3ZSBjYW4gaW1wb3J0IHRoZSBDU1MgdG8gdGhlbiBkZWZlciB0byB0aGUgQ1NTIGxvYWRlclxuICAgICAgICogb3Igb3RoZXIgQ1NTIHByb2Nlc3NpbmcgdG8gaGFuZGxlIHRoZSBwb3N0Zml4aW5nXG4gICAgICAgKi9cbiAgICAgIENhbGxFeHByZXNzaW9uKHBhdGgsIHN0YXRlKSB7XG4gICAgICAgIGlmIChzdGF0ZS5jYW5Ta2lwKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgbm9kZSA9IHBhdGgubm9kZTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgbm9kZS5jYWxsZWUubmFtZSA9PT0gJ3ByZWNvbXBpbGVUZW1wbGF0ZScgfHxcbiAgICAgICAgICBub2RlLmNhbGxlZS5uYW1lID09PSAnaGJzJyB8fFxuICAgICAgICAgIG5vZGUuY2FsbGVlLm5hbWUgPT09ICdjcmVhdGVUZW1wbGF0ZUZhY3RvcnknXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IGZpbGVOYW1lID1cbiAgICAgICAgICAgIHN0YXRlLmZpbGUub3B0cy5zb3VyY2VGaWxlTmFtZSB8fCBzdGF0ZS5maWxlLm9wdHMuZmlsZW5hbWU7XG5cbiAgICAgICAgICBsZXQgY3NzUGF0aCA9IGNzc1BhdGhGb3IoZmlsZU5hbWUpO1xuXG4gICAgICAgICAgaWYgKGV4aXN0c1N5bmMoY3NzUGF0aCkpIHtcbiAgICAgICAgICAgIGxldCBiYXNlQ1NTID0gbm9kZVBhdGguYmFzZW5hbWUoY3NzUGF0aCk7XG5cbiAgICAgICAgICAgIHN0YXRlLmltcG9ydFV0aWwuaW1wb3J0Rm9yU2lkZUVmZmVjdChgLi8ke2Jhc2VDU1N9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0sXG4gIH07XG59O1xuIiwgImltcG9ydCBhc3NlcnQgZnJvbSAnbm9kZTphc3NlcnQnO1xuaW1wb3J0IGZzU3luYyBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgfSBmcm9tICdub2RlOm1vZHVsZSc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBoYXNoRnJvbUFic29sdXRlUGF0aCB9IGZyb20gJy4vaGFzaC1mcm9tLWFic29sdXRlLXBhdGguanMnO1xuaW1wb3J0IHsgaGFzaEZyb21Nb2R1bGVQYXRoIH0gZnJvbSAnLi9oYXNoLWZyb20tbW9kdWxlLXBhdGguanMnO1xuXG5leHBvcnQgeyBoYXNoRnJvbUFic29sdXRlUGF0aCB9IGZyb20gJy4vaGFzaC1mcm9tLWFic29sdXRlLXBhdGguanMnO1xuZXhwb3J0IHsgaGFzaEZyb21Nb2R1bGVQYXRoIH0gZnJvbSAnLi9oYXNoLWZyb20tbW9kdWxlLXBhdGguanMnO1xuXG4vLyBDSlMgLyBFU00/XG5sZXQgaGVyZSA9IGltcG9ydC5tZXRhLnVybDtcbmxldCBvdXJSZXF1aXJlID0gZ2xvYmFsVGhpcy5yZXF1aXJlXG4gID8gZ2xvYmFsVGhpcy5yZXF1aXJlXG4gIDogaGVyZSAmJiBjcmVhdGVSZXF1aXJlKGhlcmUpO1xuXG5pZiAoIW91clJlcXVpcmUpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gIG91clJlcXVpcmUgPSByZXF1aXJlO1xufVxuXG5jb25zdCBFTUJST0lERVJfRElSID0gJ25vZGVfbW9kdWxlcy8uZW1icm9pZGVyJztcbmNvbnN0IEVNQlJPSURFUl8zX1JFV1JJVFRFTl9BUFBfUEFUSCA9IGAke0VNQlJPSURFUl9ESVJ9L3Jld3JpdHRlbi1hcHBgO1xuY29uc3QgRU1CUk9JREVSXzNfUkVXUklUVEVOX0FQUF9BU1NFVFMgPSBgJHtFTUJST0lERVJfM19SRVdSSVRURU5fQVBQX1BBVEh9L2Fzc2V0c2A7XG5jb25zdCBFTUJST0lERVJfM19SRVdSSVRURU5fUEFDS0FHRVMgPSBgJHtFTUJST0lERVJfRElSfS9yZXdyaXR0ZW4tcGFja2FnZXNgO1xuY29uc3QgSVJSRUxFVkFOVF9QQVRIUyA9IFsnbm9kZV9tb2R1bGVzLy5wbnBtJ107XG5jb25zdCBVTlNVUFBPUlRFRF9ESVJFQ1RPUklFUyA9IG5ldyBTZXQoWyd0ZXN0cyddKTtcblxuY29uc3QgQ1dEID0gcHJvY2Vzcy5jd2QoKTtcblxuLyoqXG4gKiBSZWdhcmRsZXNzIG9mIHdoYXQgdGhlIGZpbGVQYXRoIGZvcm1hdCBpcyxcbiAqIHRoaXMgd2lsbCB0cnkgdG8gcmV0dXJuIHRoZSBjb3JyZWN0IHBvc3RmaXguXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVQYXRoXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzaEZyb20oZmlsZVBhdGgpIHtcbiAgaWYgKGZpbGVQYXRoLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgIHJldHVybiBoYXNoRnJvbUFic29sdXRlUGF0aChmaWxlUGF0aCk7XG4gIH1cblxuICByZXR1cm4gaGFzaEZyb21Nb2R1bGVQYXRoKGZpbGVQYXRoKTtcbn1cblxuLyoqXG4gKiBCYXNlZCBvbiBlbWJlcidzIGNvbXBvbmVudCBsb2NhdGlvbiBjb252ZW50aW9ucyxcbiAqIHRoaXMgZnVuY3Rpb24gd2lsbCBwcm92aWRlIGEgcGF0aCBmb3Igd2hlcmUgd2VcbiAqIGV4cGVjdCB0aGUgQ1NTIHRvIGxpdmUuXG4gKlxuICogRm9yIGNvLWxvY2F0ZWQgc3RydWN0dXJlOlxuICogICAtIGNvbXBvbmVudHMvbXktY29tcG9uZW50Lmhic1xuICogICAtIGNvbXBvbmVudHMvbXktY29tcG9uZW50LmNzc1xuICpcbiAqIEZvciBuZXN0ZWQgY28tbG9jYXRlZCBzdHJ1Y3R1cmVcbiAqICAgLSBjb21wb25lbnRzL215LWNvbXBvbmVudC9mb28uaGJzXG4gKiAgIC0gY29tcG9uZW50cy9teS1jb21wb25lbnQvZm9vLmNzc1xuICpcbiAqIEZvciBQb2RzIHJvdXRlcyBzdHJ1Y3R1cmVcbiAqICAgLSByb3V0ZXMvbXktcm91dGUvdGVtcGxhdGUue2hicyxqc31cbiAqICAgLSByb3V0ZXMvbXktcm91dGUvc3R5bGVzLmNzc1xuICpcbiAqIERlbGliZXJhdGVseSBub3Qgc3VwcG9ydGVkOlxuICogICAtIGNvbXBvbmVudHMgdy8gcG9kcyAtLSB0aGlzIGlzIGRlcHJlY2F0ZWQgaW4gNS4xMFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlTmFtZSAtIHRoZSBoYnMsIGpzLCBnanMsIGd0cyBvciB3aGF0ZXZlciBjby1sb2NhdGVkIHBhdGguXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIGV4cGVjdGVkIGNzcyBwYXRoXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjc3NQYXRoRm9yKGZpbGVOYW1lKSB7XG4gIGxldCB3aXRob3V0RXh0ID0gd2l0aG91dEV4dGVuc2lvbihmaWxlTmFtZSk7XG4gIGxldCBjc3NQYXRoID0gd2l0aG91dEV4dCArICcuY3NzJztcblxuICBpZiAoaXNQb2QoZmlsZU5hbWUpKSB7XG4gICAgY3NzUGF0aCA9IGZpbGVOYW1lXG4gICAgICAucmVwbGFjZSgvdGVtcGxhdGVcXC5qcyQvLCAnc3R5bGVzLmNzcycpXG4gICAgICAucmVwbGFjZSgvdGVtcGxhdGVcXC5oYnMvLCAnc3R5bGVzLmNzcycpO1xuICB9XG5cbiAgcmV0dXJuIGNzc1BhdGg7XG59XG5cbi8qKlxuICogTm90ZSB0aGF0IGNvbXBvbmVudHMgaW4gdGhlIFwicG9kc1wiIGNvbnZlbnRpb24gd2lsbFxuICogbmV2ZXIgYmUgc3VwcG9ydGVkLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlUGF0aFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNQb2RUZW1wbGF0ZShmaWxlUGF0aCkge1xuICBpZiAoZmlsZVBhdGguaW5jbHVkZXMoJy9jb21wb25lbnRzLycpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIGZpbGVQYXRoLmVuZHNXaXRoKCd0ZW1wbGF0ZS5qcycpIHx8IGZpbGVQYXRoLmVuZHNXaXRoKCd0ZW1wbGF0ZS5oYnMnKTtcbn1cblxuLyoqXG4gKiBOb3RlIHRoYXQgY29tcG9uZW50cyBpbiB0aGUgXCJwb2RzXCIgY29udmVudGlvbiB3aWxsXG4gKiBuZXZlciBiZSBzdXBwb3J0ZWQuXG4gKlxuICogQ2hlY2tzIGlmIGEgZmlsZSBlbmRzIHdpdGhcbiAqIC0gdGVtcGxhdGUuanNcbiAqIC0gdGVtcGxhdGUuaGJzXG4gKiAtIHN0eWxlcy5jc3NcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZVBhdGhcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUG9kKGZpbGVQYXRoKSB7XG4gIGlmIChmaWxlUGF0aC5pbmNsdWRlcygnL2NvbXBvbmVudHMvJykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoaXNQb2RUZW1wbGF0ZShmaWxlUGF0aCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBmaWxlUGF0aC5lbmRzV2l0aCgnc3R5bGVzLmNzcycpO1xufVxuXG4vKipcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZVBhdGhcbiAqIEByZXR1cm5zIHRoZSBzYW1lIHBhdGgsIGJ1dCB3aXRob3V0IHRoZSBleHRlbnNpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhvdXRFeHRlbnNpb24oZmlsZVBhdGgpIHtcbiAgbGV0IHBhcnNlZCA9IHBhdGgucGFyc2UoZmlsZVBhdGgpO1xuXG4gIHJldHVybiBwYXRoLmpvaW4ocGFyc2VkLmRpciwgcGFyc2VkLm5hbWUpO1xufVxuXG4vKipcbiAqIEV4YW1wbGVzIGZvciBmaWxlTmFtZVxuICogLSBhYnNvbHV0ZSBvbi1kaXNrIHBhdGhcbiAqIC0gaW4gd2VicGFja1xuICogICAtIFVSTC1hYnNvbHV0ZSBwYXRoLCBzdGFydGluZyB3aXRoIC9cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZU5hbWVcbiAqIEBwYXJhbSB7eyBhZGRpdGlvbmFsUm9vdHM/OiBzdHJpbmdbXTsgY3dkOiBzdHJpbmcgfX0gb3B0aW9uc1xuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUmVsZXZhbnRGaWxlKGZpbGVOYW1lLCB7IGFkZGl0aW9uYWxSb290cywgY3dkIH0pIHtcbiAgLy8gUHJpdmF0ZSBWaXJ0dWFsIE1vZHVsZXNcbiAgaWYgKGZpbGVOYW1lLnN0YXJ0c1dpdGgoJ1xcMCcpKSByZXR1cm4gZmFsc2U7XG4gIC8vIFRoZXNlIGFyZSBub3QgdmFsaWQgdXNlcmxhbmQgbmFtZXMgKG9yIGFyZSBmcm9tIGxpYnJhcmllcylcbiAgaWYgKGZpbGVOYW1lLm1hdGNoKC9eW2EtekEtWl0vKSkgcmV0dXJuIGZhbHNlO1xuICAvLyBFeHRlcm5hbCB0byB1c1xuICBpZiAoZmlsZU5hbWUuc3RhcnRzV2l0aCgnL0BlbWJyb2lkZXInKSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoSVJSRUxFVkFOVF9QQVRIUy5zb21lKChpKSA9PiBmaWxlTmFtZS5pbmNsdWRlcyhpKSkpIHJldHVybiBmYWxzZTtcblxuICBpZiAoZmlsZU5hbWUuaW5jbHVkZXMoJy9ub2RlX21vZHVsZXMvJykpIHtcbiAgICAvLyBpZiBhIGZpbGUgaXMgbm90IHRoZSBlbWJyb2lkZXIgY2FjaGUgZGlyZWN0b3J5XG4gICAgLy8gYW5kIGlzIGluIG5vZGVfbW9kdWxlcywgc2tpcCBpdC5cbiAgICBpZiAoIWZpbGVOYW1lLmluY2x1ZGVzKEVNQlJPSURFUl9ESVIpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gcmV3cml0dGVuIHBhY2thZ2VzIHNob3VsZCBoYXZlIGFscmVhZHkgYmVlbiBwcm9jZXNzZWQgYXQgdGhlaXIgb3duXG4gICAgLy8gcHVibGlzaCB0aW1lXG4gICAgaWYgKGZpbGVOYW1lLmluY2x1ZGVzKEVNQlJPSURFUl8zX1JFV1JJVFRFTl9QQUNLQUdFUykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBUaGVzZSBhcmUgYWxyZWFkeSB0aGUgYnVuZGxlZCBmaWxlcy5cbiAgICBpZiAoZmlsZU5hbWUuaW5jbHVkZXMoRU1CUk9JREVSXzNfUkVXUklUVEVOX0FQUF9BU1NFVFMpKSB7XG4gICAgICAvLyBub3Qgc3VwcG9ydGVkLCBuZXZlciB3aWxsIGJlXG4gICAgICBpZiAoZmlsZU5hbWUuZW5kc1dpdGgoYCR7RU1CUk9JREVSXzNfUkVXUklUVEVOX0FQUF9BU1NFVFN9L3Rlc3RzLmpzYCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvLyBJZGVhbGx5LCB3ZSBuZXZlciBnZXQgaGVyZSAtLSBpbmRpY2F0ZXMgd2UncmUgbm90IGZpbHRlcmluZyBlZmZlY3RpdmVseSBpbiBiYWJlbFxuICAgICAgLy8gTk9URTogaWYgd2UgZ2V0IGhlcmUsIHdlJ3JlIHRyeWluZyB0byBvcGVyYXRlIG9uIGEgZmlsZSB0b28gbGF0ZS5cbiAgICAgIC8vICAgICAgIHdlIG5lZWQgU2NvcGVkQ1NTIHRvIG9wZXJhdGUgYXMgY2xvc2UgdG8gb3JpZ2luYWwgc291cmNlIGFzIHBvc3NpYmxlIC0tIG5vdCBvdXRwdXQgZmlsZXMuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgbGV0IHdvcmtzcGFjZSA9IGZpbmRXb3Jrc3BhY2VQYXRoKGZpbGVOYW1lKTtcblxuICBhc3NlcnQoY3dkLCBgY3dkIHdhcyBub3QgcGFzc2VkIHRvIGlzUmVsZXZhbnRGaWxlYCk7XG5cbiAgbGV0IG91cldvcmtzcGFjZSA9IGZpbmRXb3Jrc3BhY2VQYXRoKGN3ZCk7XG5cbiAgaWYgKHdvcmtzcGFjZSAhPT0gb3VyV29ya3NwYWNlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgbGV0IGxvY2FsID0gZmlsZU5hbWUucmVwbGFjZSh3b3Jrc3BhY2UsICcnKTtcbiAgbGV0IFssIC4uLnBhcnRzXSA9IGxvY2FsLnNwbGl0KCcvJykuZmlsdGVyKEJvb2xlYW4pO1xuXG4gIGlmIChVTlNVUFBPUlRFRF9ESVJFQ1RPUklFUy5oYXMocGFydHNbMF0pKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vc3RseSBwb2RzIHN1cHBvcnQuXG4gICAqIGZvbGtzIG5lZWQgdG8gb3B0IGluIHRvIHBvZHMgKHJvdXRlcyksIGJlY2F1c2UgZXZlcnkgcG9kcyBhcHAgY2FuIGJlIGNvbmZpZ3VyZWQgZGlmZmVyZW50bHlcbiAgICovXG4gIGxldCByb290cyA9IFsnL2NvbXBvbmVudHMvJywgJy90ZW1wbGF0ZXMvJywgLi4uKGFkZGl0aW9uYWxSb290cyB8fCBbXSldO1xuXG4gIGlmICghcm9vdHMuc29tZSgocm9vdCkgPT4gZmlsZU5hbWUuaW5jbHVkZXMocm9vdCkpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYWNrYWdlU2NvcGVkUGF0aFRvTW9kdWxlUGF0aChwYWNrYWdlU2NvcGVkUGF0aCkge1xuICAvKipcbiAgICogKkJ5IGNvbnZlbnRpb24qLCBgc3JjYCBpcyBvbWl0dGVkIGZyb20gY29tcG9uZW50IHBhdGhzLlxuICAgKiBXZSBjYW4gcmVmbGVjdCB0aGUgc2FtZSBiZWhhdmlvciBieSByZXBsYWNpbmcgc3JjL1xuICAgKiB3aXRoIGFuIGVtcHR5IHN0cmluZy5cbiAgICpcbiAgICogQ1NTIGlzbid0IGVtaXR0ZWQgYXMgYSBjby1sb2NhdGVkIG1vZHVsZSwgYnV0XG4gICAqIHRvIGtlZXAgY29udmVudGlvbnMgY29uc2lzdGVudCBhY3Jvc3MgbGFuZ3VhZ2VzLFxuICAgKiB3ZSBjYW4gcHJldGVuZCBpdCBpcy5cbiAgICpcbiAgICogQW55IGN1c3RvbWl6YXRpb24gYmV5b25kIHJlbW92aW5nIGBzcmNgIGFuZCBgYXBwYCBpcyBwb3RlbnRpYWxseSBjb25mdXNpbmcuXG4gICAqIElmIHdlIG5lZWQgZnVydGhlciBjdXN0b21pemF0aW9ucywgd2UnbGwgd2FudCB0byBtYXRjaCBvbiBgZXhwb3J0c2AgaW4gdGhlXG4gICAqIGNvcnJlc3BvbmRpbmcgcGFja2FnZS5qc29uXG4gICAqL1xuICBsZXQgcGFja2FnZVJlbGF0aXZlID0gcGFja2FnZVNjb3BlZFBhdGgucmVwbGFjZSgvXlxcL3NyY1xcLy8sICcvJyk7XG5cbiAgbGV0IHBhcnNlZCA9IHBhdGgucGFyc2UocGFja2FnZVJlbGF0aXZlKTtcblxuICBpZiAoaXNQb2QocGFja2FnZVJlbGF0aXZlKSkge1xuICAgIC8qKlxuICAgICAqIEZvciBwb2RzLCB3ZSBjaG9wIG9mZiB0aGUgd2hvbGUgZmlsZSwgYW5kIHVzZSB0aGUgZGlyIG5hbWUgYXMgdGhlIFwibW9kdWxlUGF0aFwiXG4gICAgICovXG4gICAgcmV0dXJuIHBhcnNlZC5kaXI7XG4gIH1cblxuICAvKipcbiAgICogSWYgYW4gZXh0ZW5zaW9uIGlzIHBhc3NlZCwgcmVtb3ZlIGl0LlxuICAgKiBXaGVuIHVzaW5nIHBhY2thZ2VycywgZm9sa3MgYXJlIHVzZWQgdG8gbm90IGhhdmluZyB0byBzcGVjaWZ5IGV4dGVuc2lvbnMgZm9yIGZpbGVzLlxuICAgKiBTaW5jZSB3ZSBkb24ndCBldmVuIGVtaXQgY3NzIGZpbGVzIGNvLWxvY2F0ZWQgdG8gZWFjaCBtb2R1bGUsXG4gICAqIHRoaXMgaGVscHMgdXMgbm90IGNvbnZleSBhIGxpZSB0aGF0IGEgZmlsZSBtYXkgZXhpc3QgaW4gYXQgcnVudGltZS5cbiAgICpcbiAgICogRm9yIGV4YW1wbGUgYDxtb2R1bGUtbmFtZT4vY29tcG9uZW50cy9idXR0b25gLlxuICAgKiBJdCBkb2Vzbid0IG1hdHRlciB3aGF0IHRoZSBleHRlbnNpb24gaXMsIGJlY2F1c2UgeW91IGNhbiBvbmx5IGhhdmUgb25lIGNzcyBmaWxlXG4gICAqIGZvciB0aGUgYnV0dG9uIG1vZHVsZSBhbnl3YXkuXG4gICAqL1xuICBsZXQgbG9jYWxQYWNrYWdlclN0eWxlUGF0aCA9IHBhdGguam9pbihwYXJzZWQuZGlyLCBwYXJzZWQubmFtZSk7XG5cbiAgcmV0dXJuIGxvY2FsUGFja2FnZXJTdHlsZVBhdGg7XG59XG5cbi8qKlxuICogcmV0dXJucyB0aGUgYXBwLW1vZHVsZSBwYXRoIG9mIHRoZSBzb3VyY2UgZmlsZVxuICpcbiAqIFRoaXMgYXNzdW1lcyBub3JtYWwgZW1iZXIgYXBwIGNvbnZlbnRpb25zXG4gKlxuICogd2hpY2ggaXMgYDxwYWNrYWdlLmpzb24jbmFtZT4vcGF0aC10by1maWxlYFxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwUGF0aChzb3VyY2VQYXRoKSB7XG4gIGxldCB3b3Jrc3BhY2VQYXRoID0gZmluZFdvcmtzcGFjZVBhdGgoc291cmNlUGF0aCk7XG4gIGxldCBuYW1lID0gbW9kdWxlTmFtZShzb3VyY2VQYXRoKTtcblxuICAvKipcbiAgICogIFVuZGVyIGVtYnJvaWRlciBidWlsZHMsIHRoZSBzcGVjLWNvbXBsaWFudCB2ZXJzaW9uIG9mIHRoZSBhcHBcbiAgICogaGFzIGFsbCB0aGUgZmlsZXMgdW5kZXIgYSBmb2xkZXIgd2hpY2ggcmVwcmVzZW50cyB0aGUgcGFja2FnZSBuYW1lLFxuICAgKiByYXRoZXIgdGhhbiBcImFwcFwiLlxuICAgKi9cbiAgbGV0IHBhY2thZ2VSZWxhdGl2ZSA9IHNvdXJjZVBhdGgucmVwbGFjZSh3b3Jrc3BhY2VQYXRoLCAnJyk7XG5cbiAgLyoqXG4gICAqIEJ1dCB3ZSBhbHNvIGRvbid0IHdhbnQgJ2FwcCcgLS0gd2hpY2ggaXMgcHJlc2VudCBpbiB0aGUgdjEgYWRkb24gcGlwZWxpbmVcbiAgICovXG4gIHBhY2thZ2VSZWxhdGl2ZSA9IHBhY2thZ2VSZWxhdGl2ZS5yZXBsYWNlKGAvYXBwL2AsIGAvYCk7XG5cbiAgLyoqXG4gICAqIGFsc28gYWxzbywgd2Uga25vdyB0aGF0IHRoZSByZS13cml0dGVuIGFwcCBzdHJ1Y3R1cmUgaW4gZW1icm9pZGVyQHYzXG4gICAqIGlzIGV4dHJhbmVvdXMsIGFuZCB3ZSBjYW4gY29sbGFwc2UgaXRcbiAgICovXG4gIHBhY2thZ2VSZWxhdGl2ZSA9IHBhY2thZ2VSZWxhdGl2ZS5yZXBsYWNlKFxuICAgIGAke0VNQlJPSURFUl8zX1JFV1JJVFRFTl9BUFBfUEFUSH0vYCxcbiAgICAnLycsXG4gICk7XG5cbiAgbGV0IGxvY2FsUGFja2FnZXJTdHlsZVBhdGggPSBwYWNrYWdlU2NvcGVkUGF0aFRvTW9kdWxlUGF0aChwYWNrYWdlUmVsYXRpdmUpO1xuXG4gIHJldHVybiBgJHtuYW1lfSR7bG9jYWxQYWNrYWdlclN0eWxlUGF0aH1gO1xufVxuXG4vKipcbiAqIFRvIGF2b2lkIGhpdHRpbmcgdGhlIGZpbGVzeXNldG0sIHdlJ2xsIHN0b3JlIGFsbCBmb3VuZFxuICogcHJvamVjdCBwYXRocyBiZXJlLCBzbyB3ZSBjYW4sIGluIG1lbW9yeSxcbiAqIGdldCB0aGUgZm9sZGVyIHdoZXJlIGEgcGFja2FnZS5qc29uIGV4aXN0cywgcmF0aGVyIHRoYW5cbiAqIGhpdCB0aGUgZmlsZSBzeXN0ZW0gZXZlcnkgdGltZS5cbiAqL1xuY29uc3QgU0VFTiA9IG5ldyBTZXQoKTtcblxuZnVuY3Rpb24gZ2V0U2Vlbihzb3VyY2VQYXRoKSB7XG4gIGlmIChTRUVOLmhhcyhzb3VyY2VQYXRoKSkgcmV0dXJuIHNvdXJjZVBhdGg7XG5cbiAgbGV0IHBhcnRzID0gc291cmNlUGF0aC5zcGxpdCgnLycpO1xuXG4gIGZvciAobGV0IGkgPSBwYXJ0cy5sZW5ndGggLSAxOyBpID4gMTsgaS0tKSB7XG4gICAgbGV0IHRvQ2hlY2sgPSBwYXJ0cy5zbGljZSgwLCBpKS5qb2luKCcvJyk7XG5cbiAgICBsZXQgc2VlbiA9IFNFRU4uaGFzKHRvQ2hlY2spO1xuXG4gICAgaWYgKHNlZW4pIHtcbiAgICAgIHJldHVybiB0b0NoZWNrO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZFdvcmtzcGFjZVBhdGgoc291cmNlUGF0aCwgb3B0aW9ucykge1xuICBsZXQgY3dkID0gb3B0aW9ucz8uY3dkID8/IENXRDtcblxuICBpZiAoc291cmNlUGF0aC5pbmNsdWRlcyhFTUJST0lERVJfM19SRVdSSVRURU5fQVBQX1BBVEgpKSB7XG4gICAgc291cmNlUGF0aCA9IHNvdXJjZVBhdGguc3BsaXQoRU1CUk9JREVSXzNfUkVXUklUVEVOX0FQUF9QQVRIKVswXTtcbiAgfVxuXG4gIGlmIChzb3VyY2VQYXRoLmVuZHNXaXRoKCcvJykpIHtcbiAgICBzb3VyY2VQYXRoID0gc291cmNlUGF0aC5yZXBsYWNlKC9cXC8kLywgJycpO1xuICB9XG5cbiAgbGV0IHNlZW4gPSBnZXRTZWVuKHNvdXJjZVBhdGgpO1xuXG4gIGlmIChzZWVuKSB7XG4gICAgcmV0dXJuIHNlZW47XG4gIH1cblxuICBsZXQgY2FuZGlkYXRlUGF0aCA9IHBhdGguam9pbihzb3VyY2VQYXRoLCAncGFja2FnZS5qc29uJyk7XG5cbiAgY29uc3QgaXNXb3Jrc3BhY2UgPSBmc1N5bmMuZXhpc3RzU3luYyhjYW5kaWRhdGVQYXRoKTtcblxuICBpZiAoaXNXb3Jrc3BhY2UpIHtcbiAgICByZXR1cm4gc291cmNlUGF0aDtcbiAgfVxuXG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IGZpbmRQYWNrYWdlSnNvblVwKHNvdXJjZVBhdGgsIHsgY3dkIH0pO1xuXG4gIGlmICghcGFja2FnZUpzb25QYXRoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZGV0ZXJtaW5lIHByb2plY3QgZm9yICR7c291cmNlUGF0aH1gKTtcbiAgfVxuXG4gIGNvbnN0IHdvcmtzcGFjZVBhdGggPSBwYXRoLmRpcm5hbWUocGFja2FnZUpzb25QYXRoKTtcblxuICBTRUVOLmFkZCh3b3Jrc3BhY2VQYXRoKTtcblxuICByZXR1cm4gd29ya3NwYWNlUGF0aDtcbn1cblxuZnVuY3Rpb24gZmluZFBhY2thZ2VKc29uVXAoc3RhcnRQYXRoLCBvcHRpb25zKSB7XG4gIGxldCBjd2QgPSBvcHRpb25zPy5jd2QgPz8gQ1dEO1xuICBsZXQgcGFydHMgPSBzdGFydFBhdGguc3BsaXQoJy8nKTtcblxuICBmb3IgKGxldCBpID0gcGFydHMubGVuZ3RoIC0gMTsgaSA+IDE7IGktLSkge1xuICAgIGxldCB0b0NoZWNrID0gcGFydHMuc2xpY2UoMCwgaSkuam9pbignLycpO1xuXG4gICAgbGV0IHBhY2thZ2VKc29uID0gcGF0aC5qb2luKHRvQ2hlY2ssICdwYWNrYWdlLmpzb24nKTtcbiAgICBsZXQgZXhpc3RzID0gZnNTeW5jLmV4aXN0c1N5bmMocGFja2FnZUpzb24pO1xuXG4gICAgaWYgKGV4aXN0cykge1xuICAgICAgcmV0dXJuIHBhY2thZ2VKc29uO1xuICAgIH1cblxuICAgIC8vIERvbid0IHRyYXZlcnNlIGFsbCB0aGUgd2F5IHRvIHRoZSByb290IG9mIHRoZSBmaWxlIHN5c3RlbS5cbiAgICBpZiAodG9DaGVjayA9PT0gY3dkKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuY29uc3QgTUFOSUZFU1RfQ0FDSEUgPSBuZXcgTWFwKCk7XG5cbi8qKlxuICogV2lsbCByZXR1cm4gdGhlIHBhY2thZ2UuanNvbiNuYW1lLCBvciBjb25maWcvZW52aXJvbm1lbnQjbW91ZGxlUHJlZml4IChpZiB2MSBhcHApXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZVBhdGhcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vZHVsZU5hbWUoc291cmNlUGF0aCkge1xuICBjb25zdCB3b3Jrc3BhY2UgPSBmaW5kV29ya3NwYWNlUGF0aChzb3VyY2VQYXRoKTtcbiAgY29uc3QgbWFuaWZlc3QgPSBnZXRNYW5pZmVzdCh3b3Jrc3BhY2UpO1xuXG4gIGlmIChtYW5pZmVzdFsnZW1iZXItYWRkb24nXSkge1xuICAgIC8qKlxuICAgICAqIExpYnJhcmllcyBhcmUgbm90IGFsbG93ZWQgdG8gY3VzdG9taXplIHRoZWlyIG1vZHVsZSBuYW1lXG4gICAgICogdG8gYmUgZGlmZmVyZW50IGZyb20gdGhlaXIgcGFja2FnZSBuYW1lLlxuICAgICAqXG4gICAgICogKEl0J3MgYWxzbyBib25rZXJzIHRoYXQgdGhpcyBpcyBhbGxvd2VkIGZvciB2MSBhcHBzKVxuICAgICAqL1xuICAgIHJldHVybiBtYW5pZmVzdC5uYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvciB2MSBhcHBzLCB3ZSBuZWVkIHRvIHJlZmVyZW5jZSB0aGUgY29uZmlnL2Vudmlyb25tZW50LmpzIGZpbGVcbiAgICogdG8gc2VlIGlmIHRoZSBtb2R1bGVQcmVmaXggc2V0dGluZyBkaWZmZXJzIGZyb20gbWFuaWZlc3QubmFtZTtcbiAgICovXG4gIGxldCBlbnZpcm9ubWVudEpTID0gcGF0aC5qb2luKHdvcmtzcGFjZSwgJ2NvbmZpZy9lbnZpcm9ubWVudC5qcycpO1xuXG4gIC8qKlxuICAgKiBOT1RFOiB0aGUgZW52aXJvbm1lbnQuanMgaXMgYSBjb21tb25KUyBmaWxlLCBzbyB3ZSBjYW4gc3luY2hyb25vdXNseSByZXF1aXJlIGl0XG4gICAqXG4gICAqIFRPRE86IGlmIHdlIGhhdmUgaXNzdWVzIHdpdGggbG9hZGluZyB0aGlzIGZpbGUgbGF0ZXIgd2Ugc2hvdWxkIHByb2JhYmx5IGp1c3QgcnVuIGpzY29kZXNoaWZ0IG9uIGl0XG4gICAqICAgICAgIGJ1dCB0aGF0IGNvdWxkIGFsbG93IHVzIHRvIGJlIGJyaXR0bGUgaW4gZGlmZmVyZW50IHdheXMsIGxpa2UgaWYgZm9sa3Mgc3RyYXkgZnJvbSB0aGUgd2F5IHRoZVxuICAgKiAgICAgICBmaWxlIGlzIGxhaWQgb3V0IGZyb20gdGhlIGJsdWVwcmludCBkZWZhdWx0cy5cbiAgICovXG4gIGlmIChmc1N5bmMuZXhpc3RzU3luYyhlbnZpcm9ubWVudEpTKSkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZiAtLSB0aGlzIGV4aXN0c1xuICAgIGNvbnN0IGVudkZuID0gb3VyUmVxdWlyZShlbnZpcm9ubWVudEpTKTtcbiAgICBjb25zdCBlbnYgPSBlbnZGbignZW1iZXItc2NvcGVkLWNzcycpO1xuXG4gICAgcmV0dXJuIGVudi5tb2R1bGVQcmVmaXggfHwgbWFuaWZlc3QubmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGYWxsYmFjayB0byB0aGUgdHJ1ZVx1MjEyMiBtb2R1bGVcdTIxMjIgbmFtZS5cbiAgICovXG4gIHJldHVybiBtYW5pZmVzdC5uYW1lO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSB3b3Jrc3BhY2VcbiAqL1xuZnVuY3Rpb24gZ2V0TWFuaWZlc3Qod29ya3NwYWNlKSB7XG4gIGxldCBleGlzdGluZyA9IE1BTklGRVNUX0NBQ0hFLmdldCh3b3Jrc3BhY2UpO1xuXG4gIGlmIChleGlzdGluZykge1xuICAgIHJldHVybiBleGlzdGluZztcbiAgfVxuXG4gIGxldCBidWZmZXIgPSBmc1N5bmMucmVhZEZpbGVTeW5jKHBhdGguam9pbih3b3Jrc3BhY2UsICdwYWNrYWdlLmpzb24nKSk7XG4gIGxldCBjb250ZW50ID0gYnVmZmVyLnRvU3RyaW5nKCk7XG4gIGxldCBqc29uID0gSlNPTi5wYXJzZShjb250ZW50KTtcblxuICBNQU5JRkVTVF9DQUNIRS5zZXQod29ya3NwYWNlLCBqc29uKTtcblxuICByZXR1cm4ganNvbjtcbn1cbiIsICJpbXBvcnQgbWQ1IGZyb20gJ2JsdWVpbXAtbWQ1JztcblxuLyoqXG4gKiBUaGUgaW50ZW50IG9mIHRoaXMgZnVuY3Rpb24gaXMgdG8gZ2VuZXJhdGUgdGhlIHN1ZmZpeC9wb3N0Zml4IGZvciB0aGVcbiAqIGNzcyBjbGFzc2VzLCBiYXNlZCBvbiB0aGUgbW9kdWxlLXNjb3BlZCBwYXRoIG5hbWUuXG4gKlxuICogZm9yIGV4YW1wbGUsXG4gKiAgICBoYXNoKCdteS1hcHAvY29tcG9uZW50cy9mb28nKVxuICogIGluc3RlYWQgb2ZcbiAqICAgIGhhc2goJ2FwcC9jb21wb25lbnRzL2ZvbycpXG4gKlxuICogICh1bmxlc3MgeW91ciBhcHAgbmFtZSBpcyAnYXBwJylcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kdWxlUGF0aFxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc2gobW9kdWxlUGF0aCkge1xuICByZXR1cm4gJ2UnICsgbWQ1KG1vZHVsZVBhdGgpLnN1YnN0cmluZygwLCA4KTtcbn1cblxuXG5leHBvcnQgY29uc3QgaGFzaEZyb21Nb2R1bGVQYXRoID0gaGFzaDtcbiIsICJpbXBvcnQgeyBoYXNoIH0gZnJvbSAnLi9oYXNoLWZyb20tbW9kdWxlLXBhdGguanMnO1xuaW1wb3J0IHsgYXBwUGF0aCB9IGZyb20gJy4vdXRpbHMuanMnO1xuXG5leHBvcnQgeyBoYXNoIH0gZnJvbSAnLi9oYXNoLWZyb20tbW9kdWxlLXBhdGguanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gaGFzaEZyb21BYnNvbHV0ZVBhdGgoYWJzb2x1dGVQYXRoKSB7XG4gIC8qKlxuICAgKiBUaGUgd2hvbGUgb2YgYGFwcFBhdGhgIHVsdGltYXRlbHkgdHJhbnNmb3JtcyB0aGUgYGFic29sdXRlUGF0aGBcbiAgICogaW50byB0aGUgZXhhY3Qgc3RyaW5nIHRoYXQgZm9sa3Mgd2lsbCBwYXNzIHRvIGByZWxhdGl2ZVBhdGhgXG4gICAqIGF0IHJ1bnRpbWUuXG4gICAqL1xuICBjb25zdCBtb2R1bGVQYXRoID0gYXBwUGF0aChhYnNvbHV0ZVBhdGgpO1xuICBjb25zdCBwb3N0Zml4ID0gaGFzaChtb2R1bGVQYXRoKTtcblxuICByZXR1cm4gcG9zdGZpeDtcbn1cbiIsICJpbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgeyByZWFkRmlsZSB9IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5cbmltcG9ydCB7IGNyZWF0ZVVucGx1Z2luIH0gZnJvbSAndW5wbHVnaW4nO1xuXG5pbXBvcnQgZ2V0Q2xhc3Nlc1RhZ3NGcm9tQ3NzIGZyb20gJy4uL2xpYi9nZXRDbGFzc2VzVGFnc0Zyb21Dc3MuanMnO1xuaW1wb3J0IHsgaGFzaEZyb21BYnNvbHV0ZVBhdGgsIGlzUmVsZXZhbnRGaWxlIH0gZnJvbSAnLi4vbGliL3BhdGgvdXRpbHMuanMnO1xuaW1wb3J0IHJlcGxhY2VIYnNJbkpzIGZyb20gJy4uL2xpYi9yZXBsYWNlSGJzSW5Kcy5qcyc7XG5pbXBvcnQgcmV3cml0ZUNzcyBmcm9tICcuLi9saWIvcmV3cml0ZUNzcy5qcyc7XG5pbXBvcnQgcmV3cml0ZUhicyBmcm9tICcuLi9saWIvcmV3cml0ZUhicy5qcyc7XG5cbmZ1bmN0aW9uIGlzSnNGaWxlKGlkKSB7XG4gIHJldHVybiAoXG4gICAgaWQuZW5kc1dpdGgoJy5qcycpIHx8XG4gICAgaWQuZW5kc1dpdGgoJy50cycpIHx8XG4gICAgaWQuZW5kc1dpdGgoJy5nanMnKSB8fFxuICAgIGlkLmVuZHNXaXRoKCcuZ3RzJylcbiAgKTtcbn1cblxuZnVuY3Rpb24gaXNIYnNGaWxlKGlkKSB7XG4gIHJldHVybiBpZC5lbmRzV2l0aCgnLmhicycpO1xufVxuXG5mdW5jdGlvbiBpc0Nzc0ZpbGUoaWQpIHtcbiAgcmV0dXJuIGlkLmVuZHNXaXRoKCcuY3NzJyk7XG59XG5cbmZ1bmN0aW9uIGFzQ1NTUGF0aChpZCkge1xuICBjb25zdCBjc3NQYXRoID0gaWQuZW5kc1dpdGgoJy5oYnMnKVxuICAgID8gaWQucmVwbGFjZSgvXFwuaGJzJC8sICcuY3NzJylcbiAgICA6IGlkLnJlcGxhY2UoLyhcXC5oYnMpP1xcLihqc3x0c3xnanN8Z3RzKSQvLCAnLmNzcycpO1xuXG4gIHJldHVybiBjc3NQYXRoO1xufVxuXG5hc3luYyBmdW5jdGlvbiB0cmFuc2Zvcm1Kc0ZpbGUoY29kZSwgaWQpIHtcbiAgbGV0IGNzc1BhdGggPSBhc0NTU1BhdGgoaWQpO1xuICBsZXQgY3NzRmlsZU5hbWUgPSBwYXRoLmJhc2VuYW1lKGNzc1BhdGgpO1xuXG4gIGxldCBjc3NFeGlzdHMgPSBleGlzdHNTeW5jKGNzc1BhdGgpO1xuXG4gIC8vIENoZWNrIGZvciBwb2RzICh1c2luZyBzdHlsZXMuY3NzKVxuICBpZiAoIWNzc0V4aXN0cykge1xuICAgIGxldCBbLCAuLi5wYXJ0c10gPSBpZC5zcGxpdCgnLycpLnJldmVyc2UoKTtcblxuICAgIGNzc1BhdGggPSBbLi4ucGFydHMucmV2ZXJzZSgpLCAnc3R5bGVzLmNzcyddLmpvaW4oJy8nKTtcbiAgICBjc3NGaWxlTmFtZSA9ICdzdHlsZXMuY3NzJztcbiAgICBjc3NFeGlzdHMgPSBleGlzdHNTeW5jKGNzc1BhdGgpO1xuICB9XG5cbiAgbGV0IGNzcztcblxuICBpZiAoY3NzRXhpc3RzKSB7XG4gICAgY3NzID0gYXdhaXQgcmVhZEZpbGUoY3NzUGF0aCwgJ3V0ZjgnKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29kZSxcbiAgICAgIG1hcDogbnVsbCxcbiAgICB9O1xuICB9XG5cbiAgLy8gYWRkIGNzcyBpbXBvcnQgZm9yIGpzIGFuZCBnanMgZmlsZXNcbiAgY29kZSA9IGBpbXBvcnQgJy4vJHtjc3NGaWxlTmFtZX0nO1xcblxcbiR7Y29kZX1gO1xuXG4gIC8vIHJld3JpdGUgaGJzIGluIGpzIGluIGNhc2UgaXQgaXMgZ2pzIGZpbGUgKGZvciBnanMgZmlsZXMgaGJzIGlzIGFscmVhZHkgaW4ganMgZmlsZSlcblxuICBjb25zdCByZXdyaXR0ZW5Db2RlID0gcmVwbGFjZUhic0luSnMoY29kZSwgKGhicywgc2NvcGVkQ2xhc3MpID0+IHtcbiAgICBjb25zdCB7IGNsYXNzZXMsIHRhZ3MgfSA9IGdldENsYXNzZXNUYWdzRnJvbUNzcyhjc3MpO1xuICAgIGNvbnN0IHBvc3RmaXggPSBoYXNoRnJvbUFic29sdXRlUGF0aChjc3NQYXRoKTtcbiAgICBjb25zdCByZXdyaXR0ZW4gPSByZXdyaXRlSGJzKGhicywgY2xhc3NlcywgdGFncywgcG9zdGZpeCwgc2NvcGVkQ2xhc3MpO1xuXG4gICAgcmV0dXJuIHJld3JpdHRlbjtcbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICBjb2RlOiByZXdyaXR0ZW5Db2RlLFxuICAgIG1hcDogbnVsbCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gY3NzSGFzU3RhbmRhcmRGaWxlKGlkKSB7XG4gIGNvbnN0IGpzUGF0aCA9IGlkLnJlcGxhY2UoL1xcLmNzcyQvLCAnLmdqcycpO1xuICBjb25zdCBndHNQYXRoID0gaWQucmVwbGFjZSgvXFwuY3NzJC8sICcuZ3RzJyk7XG4gIGNvbnN0IGhic1BhdGggPSBpZC5yZXBsYWNlKC9cXC5jc3MkLywgJy5oYnMnKTtcblxuICBjb25zdCBqc0V4aXN0cyA9IGV4aXN0c1N5bmMoanNQYXRoKTtcbiAgY29uc3QgZ3RzRXhpc3RzID0gZXhpc3RzU3luYyhndHNQYXRoKTtcbiAgY29uc3QgaGJzRXhpc3RzID0gZXhpc3RzU3luYyhoYnNQYXRoKTtcblxuICByZXR1cm4ganNFeGlzdHMgfHwgZ3RzRXhpc3RzIHx8IGhic0V4aXN0cztcbn1cblxuZnVuY3Rpb24gY3NzSGFzUG9kc0ZpbGUoaWQpIHtcbiAgaWYgKCFpZC5lbmRzV2l0aCgnc3R5bGVzLmNzcycpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QganNQYXRoID0gaWQucmVwbGFjZSgvc3R5bGVzXFwuY3NzJC8sICd0ZW1wbGF0ZS5nanMnKTtcbiAgY29uc3QgZ3RzUGF0aCA9IGlkLnJlcGxhY2UoL3N0eWxlc1xcLmNzcyQvLCAndGVtcGxhdGUuZ3RzJyk7XG4gIGNvbnN0IGhic1BhdGggPSBpZC5yZXBsYWNlKC9zdHlsZXNcXC5jc3MkLywgJ3RlbXBsYXRlLmhicycpO1xuXG4gIGNvbnN0IGpzRXhpc3RzID0gZXhpc3RzU3luYyhqc1BhdGgpO1xuICBjb25zdCBndHNFeGlzdHMgPSBleGlzdHNTeW5jKGd0c1BhdGgpO1xuICBjb25zdCBoYnNFeGlzdHMgPSBleGlzdHNTeW5jKGhic1BhdGgpO1xuXG4gIHJldHVybiBqc0V4aXN0cyB8fCBndHNFeGlzdHMgfHwgaGJzRXhpc3RzO1xufVxuXG5mdW5jdGlvbiB0cmFuc2Zvcm1Dc3NGaWxlKGNvZGUsIGlkLCBsYXllck5hbWUpIHtcbiAgaWYgKGNzc0hhc1N0YW5kYXJkRmlsZShpZCkgfHwgY3NzSGFzUG9kc0ZpbGUoaWQpKSB7XG4gICAgY29uc3QgcG9zdGZpeCA9IGhhc2hGcm9tQWJzb2x1dGVQYXRoKGlkKTtcblxuICAgIGNvZGUgPSByZXdyaXRlQ3NzKGNvZGUsIHBvc3RmaXgsIHBhdGguYmFzZW5hbWUoaWQpLCBsYXllck5hbWUpO1xuICB9XG5cbiAgcmV0dXJuIGNvZGU7XG59XG5cbmZ1bmN0aW9uIGdhdGhlckNTU0ZpbGVzKGJ1bmRsZSkge1xuICBsZXQgY3NzRmlsZXMgPSBbXTtcblxuICBmb3IgKGxldCBhc3NldCBpbiBidW5kbGUpIHtcbiAgICBjb25zdCBjc3NBc3NldCA9IGFzc2V0LnJlcGxhY2UoJ2pzJywgJ2NzcycpO1xuXG4gICAgaWYgKCFhc3NldC5lbmRzV2l0aCgnanMnKSB8fCAhYnVuZGxlW2Nzc0Fzc2V0XSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHByb2Nlc3MuZW52LmVudmlyb25tZW50ID09PSAnZGV2ZWxvcG1lbnQnKSB7XG4gICAgICBjc3NGaWxlcy5wdXNoKGJ1bmRsZVtjc3NBc3NldF0uc291cmNlKTtcbiAgICAgIGRlbGV0ZSBidW5kbGVbY3NzQXNzZXRdO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjc3NJbXBvcnQgPSBwYXRoLmJhc2VuYW1lKGFzc2V0LnJlcGxhY2UoJy5qcycsICcuY3NzJykpO1xuICAgICAgY29uc3QgaW1wb3J0TGluZSA9IGBpbXBvcnQgJy4vJHtjc3NJbXBvcnR9JztgO1xuXG4gICAgICBjb25zdCBjb2RlID0gYnVuZGxlW2Fzc2V0XS5jb2RlO1xuXG4gICAgICAvLyBhZGQgaW1wb3J0IHRvIGpzIGZpbGVzXG4gICAgICBpZiAoY29kZSAmJiBjb2RlLmluZGV4T2YoaW1wb3J0TGluZSkgPCAwKSB7XG4gICAgICAgIGJ1bmRsZVthc3NldF0uY29kZSA9IGAke2ltcG9ydExpbmV9XFxuYCArIGNvZGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNzc0ZpbGVzO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjcmVhdGVVbnBsdWdpbihcbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtvYmplY3R9IE9wdGlvbnNcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IFtsYXllck5hbWVdIHRoZSBuYW1lIG9mIHRoZSBsYXllciB0byBwbGFjZSB0aGUgZ2VuZXJhdGVkIGNzcy4gRGVmYXVsdHMgdG8gXCJjb21wb25lbnRzXCJcbiAgICpcbiAgICogQHBhcmFtIHtPcHRpb25zfSBbb3B0aW9uc11cbiAgICovXG4gIChvcHRpb25zKSA9PiB7XG4gICAgbGV0IGN3ZCA9IHByb2Nlc3MuY3dkKCk7XG4gICAgbGV0IGFkZGl0aW9uYWxSb290cyA9IG9wdGlvbnM/LmFkZGl0aW9uYWxSb290cyB8fCBbXTtcblxuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiAnZW1iZXItc2NvcGVkLWNzcy11bnBsdWdpbicsXG5cbiAgICAgIGdlbmVyYXRlQnVuZGxlKF8sIGJ1bmRsZSkge1xuICAgICAgICBsZXQgY3NzRmlsZXMgPSBnYXRoZXJDU1NGaWxlcyhidW5kbGUpO1xuXG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5lbnZpcm9ubWVudCA9PT0gJ2RldmVsb3BtZW50Jykge1xuICAgICAgICAgIHRoaXMuZW1pdEZpbGUoe1xuICAgICAgICAgICAgdHlwZTogJ2Fzc2V0JyxcbiAgICAgICAgICAgIGZpbGVOYW1lOiAnc2NvcGVkLmNzcycsXG4gICAgICAgICAgICBzb3VyY2U6IGNzc0ZpbGVzLmpvaW4oJ1xcbicpLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdml0ZToge1xuICAgICAgICBnZW5lcmF0ZUJ1bmRsZSgpIHtcbiAgICAgICAgICAvKiBkZWxpYmVyYXRlbHkgZG8gbm90aGluZyAqL1xuICAgICAgICB9LFxuICAgICAgICB0cmFuc2Zvcm0oY29kZSwganNQYXRoKSB7XG4gICAgICAgICAgaWYgKCFpc1JlbGV2YW50RmlsZShqc1BhdGgsIHsgYWRkaXRpb25hbFJvb3RzLCBjd2QgfSkpIHJldHVybjtcblxuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIEhCUyBmaWxlcyBhcmUgYWN0dWFsbHkgSlMgZmlsZXMgd2l0aCBhIGNhbGwgdG8gcHJlY29tcGlsZVRlbXBsYXRlXG4gICAgICAgICAgICovXG4gICAgICAgICAgaWYgKGlzSGJzRmlsZShqc1BhdGgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtSnNGaWxlKGNvZGUsIGpzUGF0aCk7XG4gICAgICAgICAgfSBlbHNlIGlmIChpc0pzRmlsZShqc1BhdGgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtSnNGaWxlKGNvZGUsIGpzUGF0aCk7XG4gICAgICAgICAgfSBlbHNlIGlmIChpc0Nzc0ZpbGUoanNQYXRoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybUNzc0ZpbGUoY29kZSwganNQYXRoLCBvcHRpb25zPy5sYXllck5hbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0sXG5cbiAgICAgIHRyYW5zZm9ybShjb2RlLCBqc1BhdGgpIHtcbiAgICAgICAgaWYgKCFpc1JlbGV2YW50RmlsZShqc1BhdGgsIHsgYWRkaXRpb25hbFJvb3RzLCBjd2QgfSkpIHJldHVybjtcblxuICAgICAgICAvKipcbiAgICAgICAgICogSEJTIGZpbGVzIGFyZSBhY3R1YWxseSBKUyBmaWxlcyB3aXRoIGEgY2FsbCB0byBwcmVjb21waWxlVGVtcGxhdGVcbiAgICAgICAgICovXG4gICAgICAgIGlmIChpc0hic0ZpbGUoanNQYXRoKSkge1xuICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm1Kc0ZpbGUoY29kZSwganNQYXRoKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0pzRmlsZShqc1BhdGgpKSB7XG4gICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybUpzRmlsZShjb2RlLCBqc1BhdGgpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzQ3NzRmlsZShqc1BhdGgpKSB7XG4gICAgICAgICAgbGV0IGNzcyA9IHRyYW5zZm9ybUNzc0ZpbGUoY29kZSwganNQYXRoLCBvcHRpb25zPy5sYXllck5hbWUpO1xuXG4gICAgICAgICAgY29uc3QgZW1pdHRlZEZpbGVOYW1lID0ganNQYXRoLnJlcGxhY2UoXG4gICAgICAgICAgICBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgJ3NyYy8nKSxcbiAgICAgICAgICAgICcnLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICB0aGlzLmVtaXRGaWxlKHtcbiAgICAgICAgICAgIHR5cGU6ICdhc3NldCcsXG4gICAgICAgICAgICBmaWxlTmFtZTogZW1pdHRlZEZpbGVOYW1lLFxuICAgICAgICAgICAgc291cmNlOiBjc3MsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfTtcbiAgfSxcbik7XG4iLCAiaW1wb3J0IHBvc3Rjc3MgZnJvbSAncG9zdGNzcyc7XG5pbXBvcnQgcGFyc2VyIGZyb20gJ3Bvc3Rjc3Mtc2VsZWN0b3ItcGFyc2VyJztcblxuaW1wb3J0IGlzSW5zaWRlR2xvYmFsIGZyb20gJy4vaXNJbnNpZGVHbG9iYWwuanMnO1xuXG5mdW5jdGlvbiBnZXRDbGFzc2VzQW5kVGFncyhzZWwsIGNsYXNzZXMsIHRhZ3MpIHtcbiAgY29uc3QgdHJhbnNmb3JtID0gKHNscykgPT4ge1xuICAgIHNscy53YWxrKChzZWxlY3RvcikgPT4ge1xuICAgICAgaWYgKHNlbGVjdG9yLnR5cGUgPT09ICdjbGFzcycgJiYgIWlzSW5zaWRlR2xvYmFsKHNlbGVjdG9yKSkge1xuICAgICAgICBjbGFzc2VzLmFkZChzZWxlY3Rvci52YWx1ZSk7XG4gICAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLnR5cGUgPT09ICd0YWcnICYmICFpc0luc2lkZUdsb2JhbChzZWxlY3RvcikpIHtcbiAgICAgICAgdGFncy5hZGQoc2VsZWN0b3IudmFsdWUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIHBhcnNlcih0cmFuc2Zvcm0pLnByb2Nlc3NTeW5jKHNlbCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldENsYXNzZXNUYWdzRnJvbUNzcyhjc3MpIHtcbiAgY29uc3QgY2xhc3NlcyA9IG5ldyBTZXQoKTtcbiAgY29uc3QgdGFncyA9IG5ldyBTZXQoKTtcblxuICBjb25zdCBhc3QgPSBwb3N0Y3NzLnBhcnNlKGNzcyk7XG5cbiAgYXN0LndhbGsoKG5vZGUpID0+IHtcbiAgICBpZiAobm9kZS50eXBlID09PSAncnVsZScpIHtcbiAgICAgIGdldENsYXNzZXNBbmRUYWdzKG5vZGUuc2VsZWN0b3IsIGNsYXNzZXMsIHRhZ3MpO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHsgY2xhc3NlcywgdGFncyB9O1xufVxuXG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNJbnNpZGVHbG9iYWwobm9kZSwgZnVuYykge1xuICBjb25zdCBwYXJlbnQgPSBub2RlLnBhcmVudDtcblxuICBpZiAoIXBhcmVudCkgcmV0dXJuIGZhbHNlO1xuICBpZiAocGFyZW50LnR5cGUgPT09ICdwc2V1ZG8nICYmIHBhcmVudC52YWx1ZSA9PT0gJzpnbG9iYWwnKSByZXR1cm4gdHJ1ZTtcblxuICByZXR1cm4gaXNJbnNpZGVHbG9iYWwocGFyZW50LCBmdW5jKTtcbn1cbiIsICJpbXBvcnQgYmFiZWxQYXJzZXIgZnJvbSAnQGJhYmVsL3BhcnNlcic7XG5pbXBvcnQgcmVjYXN0IGZyb20gJ3JlY2FzdCc7XG5cbmNvbnN0IHBhcnNlT3B0aW9ucyA9IHtcbiAgcGFyc2VyOiB7XG4gICAgcGFyc2Uoc291cmNlKSB7XG4gICAgICByZXR1cm4gYmFiZWxQYXJzZXIucGFyc2Uoc291cmNlLCB7XG4gICAgICAgIHNvdXJjZVR5cGU6ICdtb2R1bGUnLFxuICAgICAgICBhbGxvd0ltcG9ydEV4cG9ydEV2ZXJ5d2hlcmU6IHRydWUsXG4gICAgICAgIHRva2VuczogdHJ1ZSxcbiAgICAgICAgcGx1Z2luczogWydkZWNvcmF0b3JzJ10sXG4gICAgICB9KTtcbiAgICB9LFxuICB9LFxufTtcblxuZnVuY3Rpb24gcmVtb3ZlU2NvcGVCYWdSZWZlcmVuY2UoYXN0LCBzY29wZWRDbGFzcykge1xuICBpZiAoIXNjb3BlZENsYXNzKSByZXR1cm47XG5cbiAgcmVjYXN0LnZpc2l0KGFzdCwge1xuICAgIHZpc2l0T2JqZWN0UHJvcGVydHkocGF0aCkge1xuICAgICAgaWYgKFxuICAgICAgICBwYXRoLm5vZGUudmFsdWUudHlwZSA9PT0gJ0lkZW50aWZpZXInICYmXG4gICAgICAgIHBhdGgubm9kZS52YWx1ZS5uYW1lID09PSBzY29wZWRDbGFzc1xuICAgICAgKSB7XG4gICAgICAgIHBhdGgucHJ1bmUoKTtcblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHRoaXMudHJhdmVyc2UocGF0aCk7XG4gICAgfSxcbiAgfSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChzY3JpcHQsIHJlcGxhY2VGdW5jdGlvbikge1xuICBjb25zdCBhc3QgPSByZWNhc3QucGFyc2Uoc2NyaXB0LCBwYXJzZU9wdGlvbnMpO1xuICBsZXQgaW1wb3J0ZWRTY29wZWRDbGFzcztcblxuICByZWNhc3QudmlzaXQoYXN0LCB7XG4gICAgdmlzaXRJbXBvcnREZWNsYXJhdGlvbihwYXRoKSB7XG4gICAgICBpZiAocGF0aC5ub2RlLnNvdXJjZS52YWx1ZSA9PT0gJ2VtYmVyLXNjb3BlZC1jc3MnKSB7XG4gICAgICAgIGxldCBzcGVjaWZpZXIgPSBwYXRoLm5vZGUuc3BlY2lmaWVycy5maW5kKFxuICAgICAgICAgICh4KSA9PiB4LmltcG9ydGVkLm5hbWUgPT09ICdzY29wZWRDbGFzcycsXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHNwZWNpZmllcikge1xuICAgICAgICAgIGltcG9ydGVkU2NvcGVkQ2xhc3MgPSBzcGVjaWZpZXIubG9jYWwubmFtZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHBhdGgucHJ1bmUoKTtcblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHRoaXMudHJhdmVyc2UocGF0aCk7XG4gICAgfSxcbiAgICB2aXNpdENhbGxFeHByZXNzaW9uKHBhdGgpIHtcbiAgICAgIGNvbnN0IG5vZGUgPSBwYXRoLm5vZGU7XG5cbiAgICAgIGNvbnN0IHNjb3BlZENsYXNzID0gaW1wb3J0ZWRTY29wZWRDbGFzcyA/PyAnc2NvcGVkLWNsYXNzJztcblxuICAgICAgLyoqXG4gICAgICAgKiBfX0dMSU1NRVJfVEVNUExBVEUgaXMgZm9yIHVzZSB3aXRoXG4gICAgICAgKiBodHRwczovL2dpdGh1Yi5jb20vTnVsbFZveFBvcHVsaS9yb2xsdXAtcGx1Z2luLWdsaW1tZXItdGVtcGxhdGUtdGFnL1xuICAgICAgICogd2hpY2ggdXNlc1xuICAgICAgICogaHR0cHM6Ly9naXRodWIuY29tL2VtYmVyLXRlbXBsYXRlLWltcG9ydHMvZW1iZXItdGVtcGxhdGUtaW1wb3J0cy9cbiAgICAgICAqIEB2Mywgd2hpY2ggaXMga25vd24gdG8gaGF2ZSBhIGxvdCBvZiBwYXJzZXIgYnVncy5cbiAgICAgICAqXG4gICAgICAgKiBpbiBAZW1icm9pZGVyL2FkZG9uLWRldkB2NCwgd2UgaGF2ZSBuYXRpdmUgR0pTIHN1cHBvcnRcbiAgICAgICAqIGFuZCB3ZSBkb24ndCBpbmxpbmUgY28tbG9jYXRlZCBoYnMgYW5kIEpTIChvciByYXRoZXIsIGEgcm9sbHVwIG9wdGltaXphdGlvbiBsYXRlciBkb2VzIGl0IGZvciB1cykuXG4gICAgICAgKiBJbnN0ZWFkLCB3ZSBpbXBvcnQsIHdoaWNoIGxvb2tzIGxpa2UgdGhpczpcbiAgICAgICAqIGBgYFxuICAgICAgICogaW1wb3J0IFRFTVBMQVRFIGZyb20gJy4vdGhlLWZpbGUuaGJzJztcbiAgICAgICAqXG4gICAgICAgKiAuLi5cbiAgICAgICAqXG4gICAgICAgKiBzZXRDb21wb25lbnRUZW1wbGF0ZShURU1QTEFURSwgWCk7XG4gICAgICAgKiBgYGBcbiAgICAgICAqIEFuZCB3ZSBkb24ndCB3YW50IHRvIGVudGVyIHRoaXMgY29kZXBhdGggKG9yIHJhdGhlciwgaXQgbm8tb3BzKS5cbiAgICAgICAqIF9CVVRfLCBiZWNhdXNlIHRoaXMgZmlsZSBpbXBvcnRzIHRoZSBoYnMgZmlsZSwgd2UnbGwgZW5kIHVwIGhlcmUgbGF0ZXJcbiAgICAgICAqIGFuZCByZWFkeSB0byBoaXQgdGhlIGBwcmVjb21waWxlVGVtcGxhdGVgIGNvZGVwYXRoLlxuICAgICAgICovXG4gICAgICBpZiAoXG4gICAgICAgIG5vZGUuY2FsbGVlLm5hbWUgPT09ICdfX0dMSU1NRVJfVEVNUExBVEUnIHx8XG4gICAgICAgIG5vZGUuY2FsbGVlLm5hbWUgPT09ICdwcmVjb21waWxlVGVtcGxhdGUnXG4gICAgICApIHtcbiAgICAgICAgaWYgKG5vZGUuYXJndW1lbnRzWzBdLnR5cGUgPT09ICdUZW1wbGF0ZUxpdGVyYWwnKSB7XG4gICAgICAgICAgbm9kZS5hcmd1bWVudHNbMF0ucXVhc2lzWzBdLnZhbHVlLnJhdyA9IHJlcGxhY2VGdW5jdGlvbihcbiAgICAgICAgICAgIG5vZGUuYXJndW1lbnRzWzBdLnF1YXNpc1swXS52YWx1ZS5yYXcsXG4gICAgICAgICAgICBzY29wZWRDbGFzcyxcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIG5vZGUuYXJndW1lbnRzWzBdLnR5cGUgPT09ICdTdHJpbmdMaXRlcmFsJyB8fFxuICAgICAgICAgIG5vZGUuYXJndW1lbnRzWzBdLnR5cGUgPT09ICdMaXRlcmFsJ1xuICAgICAgICApIHtcbiAgICAgICAgICBub2RlLmFyZ3VtZW50c1swXS52YWx1ZSA9IHJlcGxhY2VGdW5jdGlvbihcbiAgICAgICAgICAgIG5vZGUuYXJndW1lbnRzWzBdLnZhbHVlLFxuICAgICAgICAgICAgc2NvcGVkQ2xhc3MsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbXBvcnRlZFNjb3BlZENsYXNzKSB7XG4gICAgICAgICAgcmVtb3ZlU2NvcGVCYWdSZWZlcmVuY2UocGF0aCwgc2NvcGVkQ2xhc3MpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMudHJhdmVyc2UocGF0aCk7XG4gICAgfSxcbiAgfSk7XG5cbiAgcmV0dXJuIHJlY2FzdC5wcmludChhc3QpLmNvZGU7XG59XG4iLCAiaW1wb3J0IHBvc3Rjc3MgZnJvbSAncG9zdGNzcyc7XG5pbXBvcnQgcGFyc2VyIGZyb20gJ3Bvc3Rjc3Mtc2VsZWN0b3ItcGFyc2VyJztcblxuaW1wb3J0IGlzSW5zaWRlR2xvYmFsIGZyb20gJy4vaXNJbnNpZGVHbG9iYWwuanMnO1xuXG5mdW5jdGlvbiByZXdyaXRlU2VsZWN0b3Ioc2VsLCBwb3N0Zml4KSB7XG4gIGNvbnN0IHRyYW5zZm9ybSA9IChzZWxlY3RvcnMpID0+IHtcbiAgICBzZWxlY3RvcnMud2Fsaygoc2VsZWN0b3IpID0+IHtcbiAgICAgIGlmIChzZWxlY3Rvci50eXBlID09PSAnY2xhc3MnICYmICFpc0luc2lkZUdsb2JhbChzZWxlY3RvcikpIHtcbiAgICAgICAgc2VsZWN0b3IudmFsdWUgKz0gJ18nICsgcG9zdGZpeDtcbiAgICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IudHlwZSA9PT0gJ3RhZycgJiYgIWlzSW5zaWRlR2xvYmFsKHNlbGVjdG9yKSkge1xuICAgICAgICBzZWxlY3Rvci5yZXBsYWNlV2l0aChcbiAgICAgICAgICBwYXJzZXIudGFnKHsgdmFsdWU6IHNlbGVjdG9yLnZhbHVlIH0pLFxuICAgICAgICAgIHBhcnNlci5jbGFzc05hbWUoeyB2YWx1ZTogcG9zdGZpeCB9KSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIHJlbW92ZSA6Z2xvYmFsXG4gICAgc2VsZWN0b3JzLndhbGsoKHNlbGVjdG9yKSA9PiB7XG4gICAgICBpZiAoc2VsZWN0b3IudHlwZSA9PT0gJ3BzZXVkbycgJiYgc2VsZWN0b3IudmFsdWUgPT09ICc6Z2xvYmFsJykge1xuICAgICAgICBzZWxlY3Rvci5yZXBsYWNlV2l0aCguLi5zZWxlY3Rvci5ub2Rlcyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG4gIGNvbnN0IHRyYW5zZm9ybWVkID0gcGFyc2VyKHRyYW5zZm9ybSkucHJvY2Vzc1N5bmMoc2VsKTtcblxuICByZXR1cm4gdHJhbnNmb3JtZWQ7XG59XG5cbmZ1bmN0aW9uIGlzSW5zaWRlS2V5ZnJhbWVzKG5vZGUpIHtcbiAgY29uc3QgcGFyZW50ID0gbm9kZS5wYXJlbnQ7XG5cbiAgaWYgKCFwYXJlbnQpIHJldHVybiBmYWxzZTtcbiAgaWYgKHBhcmVudC50eXBlID09PSAnYXRydWxlJyAmJiBwYXJlbnQubmFtZSA9PT0gJ2tleWZyYW1lcycpIHJldHVybiB0cnVlO1xuXG4gIHJldHVybiBpc0luc2lkZUtleWZyYW1lcyhwYXJlbnQpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByZXdyaXRlQ3NzKGNzcywgcG9zdGZpeCwgZmlsZU5hbWUsIGxheWVyTmFtZSkge1xuICBjb25zdCBsYXllck5hbWVXaXRoRGVmYXVsdCA9IGxheWVyTmFtZSA/PyAnY29tcG9uZW50cyc7XG4gIGNvbnN0IGFzdCA9IHBvc3Rjc3MucGFyc2UoY3NzKTtcblxuICBhc3Qud2Fsaygobm9kZSkgPT4ge1xuICAgIGlmIChub2RlLnR5cGUgPT09ICdydWxlJyAmJiAhaXNJbnNpZGVLZXlmcmFtZXMobm9kZSkpIHtcbiAgICAgIG5vZGUuc2VsZWN0b3IgPSByZXdyaXRlU2VsZWN0b3Iobm9kZS5zZWxlY3RvciwgcG9zdGZpeCk7XG4gICAgfVxuICB9KTtcblxuICBjb25zdCByZXdyaXR0ZW5Dc3MgPSBhc3QudG9TdHJpbmcoKTtcblxuICBpZiAoIWxheWVyTmFtZVdpdGhEZWZhdWx0KSB7XG4gICAgcmV0dXJuIGAvKiAke2ZpbGVOYW1lfSAqL1xcbiR7cmV3cml0dGVuQ3NzfVxcbmA7XG4gIH1cblxuICByZXR1cm4gKFxuICAgIGAvKiAke2ZpbGVOYW1lfSAqL1xcbkBsYXllciAke2xheWVyTmFtZVdpdGhEZWZhdWx0fSB7XFxuXFxuYCArXG4gICAgcmV3cml0dGVuQ3NzICtcbiAgICAnXFxufVxcbidcbiAgKTtcbn1cblxuIiwgImltcG9ydCByZWNhc3QgZnJvbSAnZW1iZXItdGVtcGxhdGUtcmVjYXN0JztcblxuaW1wb3J0IHsgcmVuYW1lQ2xhc3MgfSBmcm9tICcuL3JlbmFtZUNsYXNzLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHRlbXBsYXRlUGx1Z2luKHsgY2xhc3NlcywgdGFncywgcG9zdGZpeCB9KSB7XG4gIGxldCBzdGFjayA9IFtdO1xuICAvLyBzY29wZWQtY2xhc3MgaXMgYSBnbG9iYWwgd2UgYWxsb3cgaW4gaGJzXG4gIC8vIHNjb3BlZENsYXNzIGlzIGltcG9ydGFibGUsIGFuZCB3ZSdsbCBlcnJvciBpZiBzb21lb25lIHRyaWVzIHRvIHJlbmFtZSBpdFxuICBsZXQgc2NvcGVkQ2xhc3NDYW5kaWRhdGVzID0gWydzY29wZWQtY2xhc3MnLCAnc2NvcGVkQ2xhc3MnXTtcblxuICBmdW5jdGlvbiBpc1Njb3BlZENsYXNzKHN0cikge1xuICAgIGlmICghc3RyKSByZXR1cm4gZmFsc2U7XG5cbiAgICByZXR1cm4gc2NvcGVkQ2xhc3NDYW5kaWRhdGVzLnNvbWUoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlID09PSBzdHIpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBBdHRyTm9kZShub2RlKSB7XG4gICAgICBpZiAobm9kZS5uYW1lID09PSAnY2xhc3MnKSB7XG4gICAgICAgIGlmIChub2RlLnZhbHVlLnR5cGUgPT09ICdUZXh0Tm9kZScgJiYgbm9kZS52YWx1ZS5jaGFycykge1xuICAgICAgICAgIGNvbnN0IHJlbmFtZWRDbGFzcyA9IHJlbmFtZUNsYXNzKG5vZGUudmFsdWUuY2hhcnMsIHBvc3RmaXgsIGNsYXNzZXMpO1xuXG4gICAgICAgICAgbm9kZS52YWx1ZS5jaGFycyA9IHJlbmFtZWRDbGFzcztcbiAgICAgICAgfSBlbHNlIGlmIChub2RlLnZhbHVlLnR5cGUgPT09ICdDb25jYXRTdGF0ZW1lbnQnKSB7XG4gICAgICAgICAgZm9yIChsZXQgcGFydCBvZiBub2RlLnZhbHVlLnBhcnRzKSB7XG4gICAgICAgICAgICBpZiAocGFydC50eXBlID09PSAnVGV4dE5vZGUnICYmIHBhcnQuY2hhcnMpIHtcbiAgICAgICAgICAgICAgY29uc3QgcmVuYW1lZENsYXNzID0gcmVuYW1lQ2xhc3MocGFydC5jaGFycywgcG9zdGZpeCwgY2xhc3Nlcyk7XG5cbiAgICAgICAgICAgICAgcGFydC5jaGFycyA9IHJlbmFtZWRDbGFzcztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGFydC50eXBlID09PSAnTXVzdGFjaGVTdGF0ZW1lbnQnKSB7XG4gICAgICAgICAgICAgIHJlY2FzdC50cmF2ZXJzZShwYXJ0LCB7XG4gICAgICAgICAgICAgICAgU3RyaW5nTGl0ZXJhbChub2RlKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCByZW5hbWVkQ2xhc3MgPSByZW5hbWVDbGFzcyhcbiAgICAgICAgICAgICAgICAgICAgbm9kZS52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgcG9zdGZpeCxcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NlcyxcbiAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgIG5vZGUudmFsdWUgPSByZW5hbWVkQ2xhc3M7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIEVsZW1lbnROb2RlKG5vZGUpIHtcbiAgICAgIGlmICh0YWdzLmhhcyhub2RlLnRhZykpIHtcbiAgICAgICAgLy8gY2hlY2sgaWYgY2xhc3MgYXR0cmlidXRlIGFscmVhZHkgZXhpc3RzXG4gICAgICAgIGNvbnN0IGNsYXNzQXR0ciA9IG5vZGUuYXR0cmlidXRlcy5maW5kKChhdHRyKSA9PiBhdHRyLm5hbWUgPT09ICdjbGFzcycpO1xuXG4gICAgICAgIGlmIChjbGFzc0F0dHIpIHtcbiAgICAgICAgICBjbGFzc0F0dHIudmFsdWUuY2hhcnMgKz0gJyAnICsgcG9zdGZpeDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBwdXNoIGNsYXNzIGF0dHJpYnV0ZVxuICAgICAgICAgIG5vZGUuYXR0cmlidXRlcy5wdXNoKFxuICAgICAgICAgICAgcmVjYXN0LmJ1aWxkZXJzLmF0dHIoJ2NsYXNzJywgcmVjYXN0LmJ1aWxkZXJzLnRleHQocG9zdGZpeCkpLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgQWxsOiB7XG4gICAgICBlbnRlcihub2RlKSB7XG4gICAgICAgIHN0YWNrLnB1c2gobm9kZSk7XG4gICAgICB9LFxuICAgICAgZXhpdCgpIHtcbiAgICAgICAgc3RhY2sucG9wKCk7XG4gICAgICB9LFxuICAgIH0sXG5cbiAgICBNdXN0YWNoZVN0YXRlbWVudChub2RlKSB7XG4gICAgICBsZXQgY3NzQ2xhc3M7XG5cbiAgICAgIGlmIChcbiAgICAgICAgaXNTY29wZWRDbGFzcyhnZXRWYWx1ZShub2RlLnBhdGgpKSAmJlxuICAgICAgICBub2RlLnBhcmFtcz8ubGVuZ3RoID09PSAxICYmXG4gICAgICAgIG5vZGUucGFyYW1zWzBdLnR5cGUgPT09ICdTdHJpbmdMaXRlcmFsJ1xuICAgICAgKSB7XG4gICAgICAgIGNzc0NsYXNzID0gbm9kZS5wYXJhbXNbMF0udmFsdWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgaXNTY29wZWRDbGFzcyhnZXRWYWx1ZShub2RlLnBhdGg/LnBhdGgpKSAmJlxuICAgICAgICBub2RlLnBhdGg/LnBhcmFtcz8ubGVuZ3RoID09PSAxICYmXG4gICAgICAgIG5vZGUucGF0aD8ucGFyYW1zWzBdLnR5cGUgPT09ICdTdHJpbmdMaXRlcmFsJ1xuICAgICAgKSB7XG4gICAgICAgIGNzc0NsYXNzID0gbm9kZS5wYXRoLnBhcmFtc1swXS52YWx1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNzc0NsYXNzKSB7XG4gICAgICAgIGNvbnN0IHRleHROb2RlID0gcmVjYXN0LmJ1aWxkZXJzLnRleHQocmVuYW1lQ2xhc3MoY3NzQ2xhc3MsIHBvc3RmaXgpKTtcbiAgICAgICAgY29uc3QgcGFyZW50ID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07XG5cbiAgICAgICAgaWYgKHBhcmVudC50eXBlID09PSAnQXR0ck5vZGUnKSB7XG4gICAgICAgICAgcGFyZW50LnF1b3RlVHlwZSA9ICdcIic7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGV4dE5vZGU7XG4gICAgICB9XG4gICAgfSxcblxuICAgIFN1YkV4cHJlc3Npb24obm9kZSkge1xuICAgICAgaWYgKFxuICAgICAgICBpc1Njb3BlZENsYXNzKGdldFZhbHVlKG5vZGUucGF0aCkpICYmXG4gICAgICAgIG5vZGUucGFyYW1zPy5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgbm9kZS5wYXJhbXNbMF0udHlwZSA9PT0gJ1N0cmluZ0xpdGVyYWwnXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgY3NzQ2xhc3MgPSBub2RlLnBhcmFtc1swXS52YWx1ZTtcbiAgICAgICAgY29uc3QgdGV4dE5vZGUgPSByZWNhc3QuYnVpbGRlcnMubGl0ZXJhbChcbiAgICAgICAgICAnU3RyaW5nTGl0ZXJhbCcsXG4gICAgICAgICAgcmVuYW1lQ2xhc3MoY3NzQ2xhc3MsIHBvc3RmaXgpLFxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiB0ZXh0Tm9kZTtcbiAgICAgIH1cbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRWYWx1ZShwYXRoKSB7XG4gIGlmICghcGF0aCkgcmV0dXJuO1xuXG4gIGlmICgndmFsdWUnIGluIHBhdGgpIHtcbiAgICByZXR1cm4gcGF0aC52YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXByZWNhdGVkIGluIGVtYmVyIDUuOStcbiAgICogKHNvIHdlIHVzZSB0aGUgYWJvdmUgZm9yIG5ld2VyIGVtYmVycylcbiAgICovXG4gIHJldHVybiBwYXRoLm9yaWdpbmFsO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByZXdyaXRlSGJzKGhicywgY2xhc3NlcywgdGFncywgcG9zdGZpeCkge1xuICBsZXQgYXN0ID0gcmVjYXN0LnBhcnNlKGhicyk7XG5cbiAgcmVjYXN0LnRyYXZlcnNlKGFzdCwgdGVtcGxhdGVQbHVnaW4oeyBjbGFzc2VzLCB0YWdzLCBwb3N0Zml4IH0pKTtcblxuICBsZXQgcmVzdWx0ID0gcmVjYXN0LnByaW50KGFzdCk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbiIsICIvKipcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NOYW1lXG4gKiBAcGFyYW0ge3N0cmluZ30gcG9zdGZpeFxuICogQHBhcmFtIHtTZXQ8c3RyaW5nPn0gW2NsYXNzZXNJbkNzc11cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5hbWVDbGFzcyhjbGFzc05hbWUsIHBvc3RmaXgsIGNsYXNzZXNJbkNzcykge1xuICBjb25zdCBjbGFzc2VzID0gY2xhc3NOYW1lLnNwbGl0KC9cXHMrLyk7XG4gIGNvbnN0IHJlbmFtZWRDbGFzc2VzID0gY2xhc3Nlc1xuICAgIC5maWx0ZXIoKGMpID0+IGMpXG4gICAgLm1hcCgoYykgPT4gYy50cmltKCkpXG4gICAgLm1hcCgoYykgPT4ge1xuICAgICAgaWYgKCFjbGFzc2VzSW5Dc3MgfHwgY2xhc3Nlc0luQ3NzLmhhcyhjKSkge1xuICAgICAgICBpZiAoYy5lbmRzV2l0aChwb3N0Zml4KSkgcmV0dXJuIGM7XG5cbiAgICAgICAgcmV0dXJuIGMgKyAnXycgKyBwb3N0Zml4O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYztcbiAgICB9KVxuICAgIC5qb2luKCcgJyk7XG5cbiAgY29uc3QgcmVuYW1lZFdpdGhQcmVzZXJ2ZWRTcGFjZXMgPSBjbGFzc05hbWUucmVwbGFjZShcbiAgICBjbGFzc05hbWUudHJpbVN0YXJ0KCkudHJpbUVuZCgpLFxuICAgIHJlbmFtZWRDbGFzc2VzLFxuICApO1xuXG4gIHJldHVybiByZW5hbWVkV2l0aFByZXNlcnZlZFNwYWNlcztcbn1cbiIsICJpbXBvcnQgeyBleGlzdHNTeW5jLCByZWFkRmlsZVN5bmMgfSBmcm9tICdmcyc7XG5cbmltcG9ydCBnZXRDbGFzc2VzVGFnc0Zyb21Dc3MgZnJvbSAnLi4vZ2V0Q2xhc3Nlc1RhZ3NGcm9tQ3NzLmpzJztcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gY3NzUGF0aCBwYXRoIHRvIGEgQ1NTIGZpbGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENTU0luZm8oY3NzUGF0aCkge1xuICBpZiAoIWV4aXN0c1N5bmMoY3NzUGF0aCkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGxldCBjc3MgPSByZWFkRmlsZVN5bmMoY3NzUGF0aCwgJ3V0ZjgnKTtcbiAgbGV0IHJlc3VsdCA9IGdldENsYXNzZXNUYWdzRnJvbUNzcyhjc3MpO1xuXG4gIHJldHVybiByZXN1bHQ7XG59XG4iLCAiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgZmluZFdvcmtzcGFjZVBhdGggfSBmcm9tICcuL3V0aWxzLmpzJztcblxuLyoqXG4gKiB0ZW1wbGF0ZSBwbHVnaW5zIGRvIG5vdCBoYW5kIHVzIHRoZSBjb3JyZWN0IGZpbGUgcGF0aC5cbiAqIGFkZGl0aW9uYWxseSwgd2UgbWF5IG5vdCBiZSBhYmxlIHRvIHJlbHkgb24gdGhpcyBkYXRhIGluIHRoZSBmdXR1cmUsXG4gKiBzbyB0aGlzIGZ1bmN0aW9ucyBhY3RzIGFzIGEgbWVhbnMgb2Ygbm9ybWFsaXppbmcgX3doYXRldmVyXyB3ZSdyZSBnaXZlblxuICogaW4gdGhlIGZ1dHVyZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWVcbiAqIEByZXR1cm5zIHtzdHJpbmd9IHRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBmaWxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaXhGaWxlbmFtZShmaWxlbmFtZSkge1xuICBsZXQgZmlsZU5hbWUgPSBmaWxlbmFtZTtcbiAgbGV0IHdvcmtzcGFjZSA9IGZpbmRXb3Jrc3BhY2VQYXRoKGZpbGVOYW1lKTtcblxuICAvKipcbiAgICogZW1iZXItc291cmNlIDUuODpcbiAgICogLSB0aGUgZmlsZW5hbWUgbG9va3MgbGlrZSBhbiBhYnNvbHV0ZSBwYXRoLCBidXQgc3dhcHBlZCBvdXQgdGhlICdhcHAnIHBhcnQgb2YgdGhlIHBhdGhcbiAgICogICB3aXRoIHRoZSBtb2R1bGUgbmFtZSwgc28gdGhlIGZpbGUgcGF0aHMgbmV2ZXIgZXhpc3Qgb24gZGlza1xuICAgKlxuICAgKiAtIGluIHZpdGUgYXBwczpcbiAgICogICB0aGUgJ2FwcCcgcGFydCBfbWF5XyBiZSBgc3JjYCwgc28gd2UgYWxzbyBuZWVkIHRvIGVuc3VyZSB0aGF0IGBzcmNgIGlzIGV4Y2x1ZGVkIGFzIHdlbGxcbiAgICovXG4gIGxldCBoYXNBcHBEaXIgPSBmaWxlTmFtZS5pbmNsdWRlcyhwYXRoLmpvaW4od29ya3NwYWNlLCAnYXBwJykpO1xuICBsZXQgaGFzU3JjRGlyID0gZmlsZU5hbWUuaW5jbHVkZXMocGF0aC5qb2luKHdvcmtzcGFjZSwgJ3NyYycpKTtcblxuICBpZiAoXG4gICAgIShoYXNBcHBEaXIgfHwgaGFzU3JjRGlyKSAmJlxuICAgICFmaWxlTmFtZS5pbmNsdWRlcygnL25vZGVfbW9kdWxlcy8uZW1icm9pZGVyLycpXG4gICkge1xuICAgIGxldCBtYXliZU1vZHVsZSA9IGZpbGVOYW1lLnJlcGxhY2Uod29ya3NwYWNlLCAnJyk7XG4gICAgbGV0IFttYXliZVNjb3BlLCAuLi5yZXN0XSA9IG1heWJlTW9kdWxlLnNwbGl0KCcvJykuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGxldCBwYXJ0cyA9IHJlc3Q7XG5cbiAgICBpZiAobWF5YmVTY29wZS5zdGFydHNXaXRoKCdAJykpIHtcbiAgICAgIGxldCBbLCAuLi5yZXN0ZXJdID0gcmVzdDtcblxuICAgICAgcGFydHMgPSByZXN0ZXI7XG4gICAgfVxuXG4gICAgbGV0IHJlbGF0aXZlID0gcGF0aC5qb2luKC4uLnBhcnRzKTtcblxuICAgIC8qKlxuICAgICAqIFdlIGRvbid0IGFjdHVhbGx5IGtub3cgaWYgdGhpcyBmaWxlIGlzIGFuIGFwcC5cbiAgICAgKiBpdCBjb3VsZCBiZSBhbiBhZGRvbiAodjEgb3IgdjIpXG4gICAgICpcbiAgICAgKiBTbyBoZXJlIHdlIGxvZyB0byBzZWUgaWYgd2UgaGF2ZSB1bmhhbmRsZWQgc2l0dWF0aW9ucy5cbiAgICAgKi9cbiAgICBsZXQgY2FuZGlkYXRlUGF0aCA9IHBhdGguam9pbih3b3Jrc3BhY2UsICdhcHAnLCByZWxhdGl2ZSk7XG5cbiAgICByZXR1cm4gY2FuZGlkYXRlUGF0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiB1bmRlciBlbWJyb2lkZXJAMywgdGhlIGZpbGVOYW1lIHdpbGwgYmUgdGhlIHBhdGggdG8gdGhlIHJld3JpdHRlbiBmaWxlLlxuICAgKiB3ZSBkb24ndCB3YW50IHRoaXMuXG4gICAqIHdlIHdhbnQgdGhlIHBhdGggdG8gdGhlIG9yaWdpbmFsIHNvdXJjZS5cbiAgICogVGhyb3VnaCB0aGUgcG93ZXJzIG9mIFx1MjcyOCBjb252ZW50aW9uIFx1MjcyOCwgd2UgY2FuIG1hcCBiYWNrIHRvIHNvdXJjZS5cbiAgICovXG4gIGlmIChmaWxlTmFtZS5pbmNsdWRlcygnL25vZGVfbW9kdWxlcy8uZW1icm9pZGVyL3Jld3JpdHRlbi1hcHAvJykpIHtcbiAgICBsZXQgY2FuZGlkYXRlUGF0aCA9IGZpbGVOYW1lLnJlcGxhY2UoXG4gICAgICAnL25vZGVfbW9kdWxlcy8uZW1icm9pZGVyL3Jld3JpdHRlbi1hcHAvJyxcbiAgICAgICcvYXBwLycsXG4gICAgKTtcblxuICAgIHJldHVybiBjYW5kaWRhdGVQYXRoO1xuICB9XG5cbiAgLy8gVE9ETzogd2h5IGFyZSB3ZSBwYXNzZWQgZmlsZXMgdG8gb3RoZXIgcHJvamVjdHM/XG4gIGlmICghZmlsZU5hbWUuaW5jbHVkZXMod29ya3NwYWNlKSkge1xuICAgIHJldHVybiBmaWxlTmFtZTtcbiAgfVxuXG4gIC8vIEZhbGxiYWNrIHRvIHdoYXQgdGhlIHBsdWdpbiBzeXN0ZW0gZ2l2ZXMgdXMuXG4gIC8vIFRoaXMgbWF5IGJlIHdyb25nLCBhbmQgaWYgd3JvbmcsIHJldmVhbHNcbiAgLy8gdW5oYW5kbGVkIHNjZW5hcmlvcyB3aXRoIHRoZSBmaWxlIG5hbWVzIGluIHRoZSBwbHVnaW4gaW5mcmFcbiAgcmV0dXJuIGZpbGVOYW1lO1xufVxuIiwgIi8qKlxuICogQHR5cGVkZWYge2ltcG9ydCgnQGdsaW1tZXIvc3ludGF4JykuQVNUUGx1Z2lufSBBU1RQbHVnaW5cbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BnbGltbWVyL3N5bnRheCcpLkFTVFBsdWdpbkVudmlyb25tZW50fSBBU1RQbHVnaW5FbnZpcm9ubWVudFxuICpcbiAqL1xuXG5pbXBvcnQgeyBnZXRDU1NJbmZvIH0gZnJvbSAnLi4vbGliL2Nzcy91dGlscy5qcyc7XG5pbXBvcnQgeyBmaXhGaWxlbmFtZSB9IGZyb20gJy4uL2xpYi9wYXRoL3RlbXBsYXRlLXRyYW5zZm9ybS1wYXRocy5qcyc7XG5pbXBvcnQge1xuICBhcHBQYXRoLFxuICBjc3NQYXRoRm9yLFxuICBoYXNoRnJvbU1vZHVsZVBhdGgsXG4gIGlzUmVsZXZhbnRGaWxlLFxufSBmcm9tICcuLi9saWIvcGF0aC91dGlscy5qcyc7XG5pbXBvcnQgeyB0ZW1wbGF0ZVBsdWdpbiB9IGZyb20gJy4uL2xpYi9yZXdyaXRlSGJzLmpzJztcblxuY29uc3Qgbm9vcFBsdWdpbiA9IHtcbiAgbmFtZTogJ2VtYmVyLXNjb3BlZC1jc3M6bm9vcCcsXG4gIHZpc2l0b3I6IHt9LFxufTtcblxuLyoqXG4gKiBAcmV0dXJucyB7QVNUUGx1Z2lufVxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUGx1Z2luKGNvbmZpZykge1xuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtBU1RQbHVnaW5FbnZpcm9ubWVudH0gZW52XG4gICAqL1xuICByZXR1cm4gZnVuY3Rpb24gc2NvcGVkQ3NzKGVudikge1xuICAgIGxldCBpc1JlbGV2YW50ID0gaXNSZWxldmFudEZpbGUoZW52LmZpbGVuYW1lLCB7XG4gICAgICBhZGRpdGlvbmFsUm9vdHM6IGNvbmZpZy5hZGRpdGlvbmFsUm9vdHMsXG4gICAgICBjd2Q6IHByb2Nlc3MuY3dkKCksXG4gICAgfSk7XG5cbiAgICBpZiAoIWlzUmVsZXZhbnQpIHtcbiAgICAgIHJldHVybiBub29wUGx1Z2luO1xuICAgIH1cblxuICAgIGxldCBhYnNvbHV0ZVBhdGggPSBmaXhGaWxlbmFtZShlbnYuZmlsZW5hbWUpO1xuICAgIGxldCBtb2R1bGVQYXRoID0gYXBwUGF0aChhYnNvbHV0ZVBhdGgpO1xuXG4gICAgbGV0IGNzc1BhdGggPSBjc3NQYXRoRm9yKGFic29sdXRlUGF0aCk7XG4gICAgbGV0IGluZm8gPSBnZXRDU1NJbmZvKGNzc1BhdGgpO1xuICAgIGxldCBwb3N0Zml4ID0gaGFzaEZyb21Nb2R1bGVQYXRoKG1vZHVsZVBhdGgpO1xuXG4gICAgaWYgKCFpbmZvKSB7XG4gICAgICByZXR1cm4gbm9vcFBsdWdpbjtcbiAgICB9XG5cbiAgICBsZXQgdmlzaXRvcnMgPSB0ZW1wbGF0ZVBsdWdpbih7XG4gICAgICBjbGFzc2VzOiBpbmZvLmNsYXNzZXMsXG4gICAgICB0YWdzOiBpbmZvLnRhZ3MsXG4gICAgICBwb3N0Zml4LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6ICdlbWJlci1zY29wZWQtY3NzOnRlbXBsYXRlLXBsdWdpbicsXG4gICAgICB2aXNpdG9yOiB7XG4gICAgICAgIC8vIFN0YWNrIE1hbmFnZXJcbiAgICAgICAgLi4udmlzaXRvcnMsXG4gICAgICAgIC8vIFZpc2l0b3JzIGJyb2tlbiBvdXQgbGlrZSB0aGlzIHNvIHdlIGNhbiBjb25kaXRpb25hbGx5XG4gICAgICAgIC8vIGRlYnVnIGJhc2VkIG9uIGZpbGUgcGF0aC5cbiAgICAgICAgQXR0ck5vZGUoLi4uYXJncykge1xuICAgICAgICAgIHJldHVybiB2aXNpdG9ycy5BdHRyTm9kZSguLi5hcmdzKTtcbiAgICAgICAgfSxcbiAgICAgICAgRWxlbWVudE5vZGUoLi4uYXJncykge1xuICAgICAgICAgIHJldHVybiB2aXNpdG9ycy5FbGVtZW50Tm9kZSguLi5hcmdzKTtcbiAgICAgICAgfSxcbiAgICAgICAgTXVzdGFjaGVTdGF0ZW1lbnQoLi4uYXJncykge1xuICAgICAgICAgIHJldHVybiB2aXNpdG9ycy5NdXN0YWNoZVN0YXRlbWVudCguLi5hcmdzKTtcbiAgICAgICAgfSxcbiAgICAgICAgU3ViRXhwcmVzc2lvbiguLi5hcmdzKSB7XG4gICAgICAgICAgcmV0dXJuIHZpc2l0b3JzLlN1YkV4cHJlc3Npb24oLi4uYXJncyk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG4gIH07XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7O0FDQUEsK0JBQTJCO0FBQzNCLGdCQUEyQjtBQUMzQixrQkFBcUI7OztBQ0ZyQix5QkFBbUI7QUFDbkIs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QUFBQSxNQUNBO0FBQUEsSUFDRjtBQUVBLFdBQU87QUFBQSxFQUNUO0FBR0EsTUFBSSxDQUFDLFNBQVMsU0FBUyxTQUFTLEdBQUc7QUFDakMsV0FBTztBQUFBLEVBQ1Q7QUFLQSxTQUFPO0FBQ1Q7OztBQy9EQSxJQUFNLGFBQWE7QUFBQSxFQUNqQixNQUFNO0FBQUEsRUFDTixTQUFTLENBQUM7QUFDWjtBQUtPLFNBQVMsYUFBYSxRQUFRO0FBS25DLFNBQU8sU0FBUyxVQUFVLEtBQUs7QUFDN0IsUUFBSSxhQUFhLGVBQWUsSUFBSSxVQUFVO0FBQUEsTUFDNUMsaUJBQWlCLE9BQU87QUFBQSxNQUN4QixLQUFLLFFBQVEsSUFBSTtBQUFBLElBQ25CLENBQUM7QUFFRCxRQUFJLENBQUMsWUFBWTtBQUNmLGFBQU87QUFBQSxJQUNUO0FBRUEsUUFBSSxlQUFlLFlBQVksSUFBSSxRQUFRO0FBQzNDLFFBQUksYUFBYSxRQUFRLFlBQVk7QUFFckMsUUFBSSxVQUFVLFdBQVcsWUFBWTtBQUNyQyxRQUFJLE9BQU8sV0FBVyxPQUFPO0FBQzdCLFFBQUksVUFBVSxtQkFBbUIsVUFBVTtBQUUzQyxRQUFJLENBQUMsTUFBTTtBQUNULGFBQU87QUFBQSxJQUNUO0FBRUEsUUFBSSxXQUFXLGVBQWU7QUFBQSxNQUM1QixTQUFTLEtBQUs7QUFBQSxNQUNkLE1BQU0sS0FBSztBQUFBLE1BQ1g7QUFBQSxJQUNGLENBQUM7QUFFRCxXQUFPO0FBQUEsTUFDTCxNQUFNO0FBQUEsTUFDTixTQUFTO0FBQUE7QUFBQSxRQUVQLEdBQUc7QUFBQTtBQUFBO0FBQUEsUUFHSCxZQUFZLE1BQU07QUFDaEIsaUJBQU8sU0FBUyxTQUFTLEdBQUcsSUFBSTtBQUFBLFFBQ2xDO0FBQUEsUUFDQSxlQUFlLE1BQU07QUFDbkIsaUJBQU8sU0FBUyxZQUFZLEdBQUcsSUFBSTtBQUFBLFFBQ3JDO0FBQUEsUUFDQSxxQkFBcUIsTUFBTTtBQUN6QixpQkFBTyxTQUFTLGtCQUFrQixHQUFHLElBQUk7QUFBQSxRQUMzQztBQUFBLFFBQ0EsaUJBQWlCLE1BQU07QUFDckIsaUJBQU8sU0FBUyxjQUFjLEdBQUcsSUFBSTtBQUFBLFFBQ3ZDO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0Y7IiwKICAibmFtZXMiOiBbIm1kNSIsICJwYXRoIiwgImFzc2VydCIsICJmc1N5bmMiLCAicGF0aCIsICJub2RlUGF0aCIsICJpbXBvcnRfbm9kZV9mcyIsICJpbXBvcnRfbm9kZV9wYXRoIiwgInBhcnNlciIsICJwb3N0Y3NzIiwgImJhYmVsUGFyc2VyIiwgInJlY2FzdCIsICJwYXRoIiwgImltcG9ydF9wb3N0Y3NzIiwgImltcG9ydF9wb3N0Y3NzX3NlbGVjdG9yX3BhcnNlciIsICJwYXJzZXIiLCAicG9zdGNzcyIsICJyZWNhc3QiLCAibm9kZSIsICJwYXRoIiwgInBhdGgiLCAicHJvY2VzcyIsICJpbXBvcnRfZnMiLCAiaW1wb3J0X25vZGVfcGF0aCIsICJwYXRoIl0KfQo=