Jump to content

User:Evad37/rater/sandbox/app.js

From Wikipedia, the free encyclopedia

This is an old revision of this page, as edited by Evad37 (talk | contribs) at 03:23, 6 January 2024 (.). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.

Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
module.exports={
  "name": "rater",
  "version": "2.7.1",
  "description": "Wikipedia userscript that helps assess pages for WikiProjects",
  "homepage": "https://github.com/evad37/rater",
  "browser": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "lint:es5": "jshint index.js",
    "lint:es6": "eslint index.js \"rater-src/**\"",
    "lint:fix": "eslint index.js \"rater-src/**\" --fix",
    "lint": "npm run lint:es6 && npm run lint:es5",
    "build:bundle": "browserify rater-src/App.js --debug -t babelify --outfile dist/rater.js",
    "build:minify": "uglifyjs dist/rater.js --compress -b ascii_only=true,beautify=false --output dist/rater.min.js",
    "build:concat": "concat-cli -f \"comment-top.js\" dist/rater.min.js \"comment-bottom.js\" -o dist/rater.min.js",
    "build": "npm run lint && npm run build:bundle && npm run build:minify && npm run build:concat"
  },
  "author": {
    "name": "Evad37",
    "url": "https://en.wikipedia.org/wiki/User:Evad37"
  },
  "repository": {
    "type": "git",
    "url": "https://github.com/evad37/rater.git"
  },
  "license": "(MIT OR CC-BY-4.0)",
  "devDependencies": {
    "@babel/core": "^7.9.0",
    "@babel/preset-env": "^7.9.0",
    "babelify": "^10.0.0",
    "browserify": "^16.5.0",
    "concat-cli": "^4.0.0",
    "eslint": "^6.8.0",
    "jshint": "^2.11.0",
    "uglify-js": "^3.8.0"
  }
}

},{}],2:[function(require,module,exports){
"use strict";

var _setup = _interopRequireDefault(require("./setup"));
var _autostart = _interopRequireDefault(require("./autostart"));
var _css = _interopRequireDefault(require("./css.js"));
var _api = require("./api");
var _windowManager = _interopRequireDefault(require("./windowManager"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
// <nowiki>

(function App() {
  var stylesheet;
  var showMainWindow = function showMainWindow(data) {
    if (!data || !data.success) {
      return;
    }
    if (stylesheet) {
      stylesheet.disabled = false;
    } else {
      stylesheet = mw.util.addCSS(_css["default"]);
    }
    // Add css class to body to enable background scrolling
    document.getElementsByTagName("body")[0].classList.add("rater-mainWindow-open");
    // Open the window
    _windowManager["default"].openWindow("main", data).closed.then(function (result) {
      // Disable/remove the css styles, so as to not interfere with other scripts/content/OOUI windows
      if (stylesheet) {
        stylesheet.disabled = true;
      }
      document.getElementsByTagName("body")[0].classList.remove("rater-mainWindow-open");
      // Restart if needed
      if (result && result.restart) {
        _windowManager["default"].removeWindows(["main"]).then(_setup["default"]).then(showMainWindow, showSetupError);
        return;
      }
      // Show notification when saved successfully
      if (result && result.success) {
        var $message = $("<span>").append($("<strong>").text("Ratings saved successfully."));
        if (result.upgradedStub) {
          $message.append($("<br>"),
          // TODO: There should be a link that will edit the article for you
          $("<span>").text("Note that the article appears to be tagged as a stub."));
        }
        mw.notify($message, {
          autoHide: true,
          autoHideSeconds: "long",
          tag: "Rater-saved"
        });
      }
    });
  };
  var showSetupError = function showSetupError(code, jqxhr) {
    return OO.ui.alert((0, _api.makeErrorMsg)(code, jqxhr), {
      title: "Rater failed to open"
    });
  };

  // Invocation by portlet link 
  mw.util.addPortletLink("p-cactions", "#", "Rater", "ca-rater", "Rate quality and importance", "5");
  $("#ca-rater").click(function (event) {
    event.preventDefault();
    (0, _setup["default"])().then(showMainWindow, showSetupError);
  });

  // Invocation by auto-start (do not show message on error)
  (0, _autostart["default"])().then(showMainWindow);
})();
// </nowiki>

},{"./api":15,"./autostart":16,"./css.js":19,"./setup":22,"./windowManager":24}],3:[function(require,module,exports){
"use strict";

function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.getWithRedirectTo = exports.parseTemplates = exports.Template = void 0;
var _api = _interopRequireDefault(require("./api"));
var _util = require("./util");
var _config = _interopRequireDefault(require("./config"));
var cache = _interopRequireWildcard(require("./cache"));
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; }
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(n); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); }
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
// <nowiki>

/** Template
 *
 * @class
 * Represents the wikitext of template transclusion. Used by #parseTemplates.
 * @prop {String} name Name of the template
 * @prop {String} wikitext Full wikitext of the transclusion
 * @prop {Object[]} parameters Parameters used in the translcusion, in order, of form:
	{
		name: {String|Number} parameter name, or position for unnamed parameters,
		value: {String} Wikitext passed to the parameter (whitespace trimmed),
		wikitext: {String} Full wikitext (including leading pipe, parameter name/equals sign (if applicable), value, and any whitespace)
	}
 * @constructor
 * @param {String} wikitext Wikitext of a template transclusion, starting with '{{' and ending with '}}'.
 */
var Template = function Template(wikitext) {
  this.wikitext = wikitext;
  this.parameters = [];
  // Spacing around pipes, equals signs, end braces (defaults)
  this.pipeStyle = " |";
  this.equalsStyle = "=";
  this.endBracesStyle = "}}";
};
exports.Template = Template;
Template.prototype.addParam = function (name, val, wikitext) {
  this.parameters.push({
    "name": name,
    "value": val,
    "wikitext": "|" + wikitext
  });
};
/**
 * Get a parameter data by parameter name
 */
Template.prototype.getParam = function (paramName) {
  return this.parameters.find(function (p) {
    return p.name == paramName;
  });
};
Template.prototype.setName = function (name) {
  this.name = name.trim();
};
Template.prototype.getTitle = function () {
  return mw.Title.newFromText("Template:" + this.name);
};

/**
 * parseTemplates
 *
 * Parses templates from wikitext.
 * Based on SD0001's version at <https://en.wikipedia.org/wiki/User:SD0001/parseAllTemplates.js>.
 * Returns an array containing the template details:
 *  var templates = parseTemplates("Hello {{foo |Bar|baz=qux |2=loremipsum|3=}} world");
 *  console.log(templates[0]); // --> object
	{
		name: "foo",
		wikitext:"{{foo |Bar|baz=qux | 2 = loremipsum  |3=}}",
		parameters: [
			{
				name: 1,
				value: 'Bar',
				wikitext: '|Bar'
			},
			{
				name: 'baz',
				value: 'qux',
				wikitext: '|baz=qux '
			},
			{
				name: '2',
				value: 'loremipsum',
				wikitext: '| 2 = loremipsum  '
			},
			{
				name: '3',
				value: '',
				wikitext: '|3='
			}
		],
		getParam: function(paramName) {
			return this.parameters.find(function(p) { return p.name == paramName; });
		}
	}
 *    
 * 
 * @param {String} wikitext
 * @param {Boolean} recursive Set to `true` to also parse templates that occur within other templates,
 *  rather than just top-level templates. 
 * @return {Template[]} templates
*/
var parseTemplates = function parseTemplates(wikitext, recursive) {
  /* eslint-disable no-control-regex */
  if (!wikitext) {
    return [];
  }
  var strReplaceAt = function strReplaceAt(string, index, _char) {
    return string.slice(0, index) + _char + string.slice(index + 1);
  };
  var result = [];
  var processTemplateText = function processTemplateText(startIdx, endIdx) {
    var text = wikitext.slice(startIdx, endIdx);
    var template = new Template("{{" + text.replace(/\x01/g, "|") + "}}");

    // swap out pipe in links with \x01 control character
    // [[File: ]] can have multiple pipes, so might need multiple passes
    while (/(\[\[[^\]]*?)\|(.*?\]\])/g.test(text)) {
      text = text.replace(/(\[\[[^\]]*?)\|(.*?\]\])/g, "$1\x01$2");
    }

    // Figure out most-used spacing styles for pipes/equals
    template.pipeStyle = (0, _util.mostFrequent)(text.match(/[\s\n]*\|[\s\n]*/g)) || " |";
    template.equalsStyle = (0, _util.mostFrequent)(text.replace(/(=[^|]*)=+/g, "$1").match(/[\s\n]*=[\s\n]*/g)) || "=";
    // Figure out end-braces style
    var endSpacing = text.match(/[\s\n]*$/);
    template.endBracesStyle = (endSpacing ? endSpacing[0] : "") + "}}";
    var chunks = text.split("|").map(function (chunk) {
      // change '\x01' control characters back to pipes
      return chunk.replace(/\x01/g, "|");
    });
    template.setName(chunks[0]);
    var parameterChunks = chunks.slice(1);
    var unnamedIdx = 1;
    parameterChunks.forEach(function (chunk) {
      var indexOfEqualTo = chunk.indexOf("=");
      var indexOfOpenBraces = chunk.indexOf("{{");
      var isWithoutEquals = !chunk.includes("=");
      var hasBracesBeforeEquals = chunk.includes("{{") && indexOfOpenBraces < indexOfEqualTo;
      var isUnnamedParam = isWithoutEquals || hasBracesBeforeEquals;
      var pName, pNum, pVal;
      if (isUnnamedParam) {
        // Get the next number not already used by either an unnamed parameter, or by a
        // named parameter like `|1=val`
        while (template.getParam(unnamedIdx)) {
          unnamedIdx++;
        }
        pNum = unnamedIdx;
        pVal = chunk.trim();
      } else {
        pName = chunk.slice(0, indexOfEqualTo).trim();
        pVal = chunk.slice(indexOfEqualTo + 1).trim();
      }
      template.addParam(pName || pNum, pVal, chunk);
    });
    result.push(template);
  };
  var n = wikitext.length;

  // number of unclosed braces
  var numUnclosed = 0;

  // are we inside a comment, or between nowiki tags, or in a {{{parameter}}}?
  var inComment = false;
  var inNowiki = false;
  var inParameter = false;
  var startIdx, endIdx;
  for (var i = 0; i < n; i++) {
    if (!inComment && !inNowiki && !inParameter) {
      if (wikitext[i] === "{" && wikitext[i + 1] === "{" && wikitext[i + 2] === "{" && wikitext[i + 3] !== "{") {
        inParameter = true;
        i += 2;
      } else if (wikitext[i] === "{" && wikitext[i + 1] === "{") {
        if (numUnclosed === 0) {
          startIdx = i + 2;
        }
        numUnclosed += 2;
        i++;
      } else if (wikitext[i] === "}" && wikitext[i + 1] === "}") {
        if (numUnclosed === 2) {
          endIdx = i;
          processTemplateText(startIdx, endIdx);
        }
        numUnclosed -= 2;
        i++;
      } else if (wikitext[i] === "|" && numUnclosed > 2) {
        // swap out pipes in nested templates with \x01 character
        wikitext = strReplaceAt(wikitext, i, "\x01");
      } else if (/^<!--/.test(wikitext.slice(i, i + 4))) {
        inComment = true;
        i += 3;
      } else if (/^<nowiki ?>/.test(wikitext.slice(i, i + 9))) {
        inNowiki = true;
        i += 7;
      }
    } else {
      // we are in a comment or nowiki or {{{parameter}}}
      if (wikitext[i] === "|") {
        // swap out pipes with \x01 character
        wikitext = strReplaceAt(wikitext, i, "\x01");
      } else if (/^-->/.test(wikitext.slice(i, i + 3))) {
        inComment = false;
        i += 2;
      } else if (/^<\/nowiki ?>/.test(wikitext.slice(i, i + 10))) {
        inNowiki = false;
        i += 8;
      } else if (wikitext[i] === "}" && wikitext[i + 1] === "}" && wikitext[i + 2] === "}") {
        inParameter = false;
        i += 2;
      }
    }
  }
  if (recursive) {
    var subtemplates = (0, _util.filterAndMap)(result, function (template) {
      return /\{\{(?:.|\n)*\}\}/.test(template.wikitext.slice(2, -2));
    }, function (template) {
      return parseTemplates(template.wikitext.slice(2, -2), true);
    });
    return result.concat.apply(result, subtemplates);
  }
  return result;
}; /* eslint-enable no-control-regex */

/**
 * @param {Template|Template[]} templates
 * @return {Promise<Template>|Promise<Template[]>}
 */
exports.parseTemplates = parseTemplates;
var getWithRedirectTo = function getWithRedirectTo(templates) {
  var templatesArray = Array.isArray(templates) ? templates : [templates];
  if (templatesArray.length === 0) {
    return $.Deferred().resolve([]);
  }
  return _api["default"].get({
    "action": "query",
    "format": "json",
    "titles": (0, _util.filterAndMap)(templatesArray, function (template) {
      return template.getTitle() !== null;
    }, function (template) {
      return template.getTitle().getPrefixedText();
    }),
    "redirects": 1
  }).then(function (result) {
    if (!result || !result.query) {
      return $.Deferred().reject("Empty response");
    }
    if (result.query.redirects) {
      result.query.redirects.forEach(function (redirect) {
        var i = templatesArray.findIndex(function (template) {
          var title = template.getTitle();
          return title && title.getPrefixedText() === redirect.from;
        });
        if (i !== -1) {
          templatesArray[i].redirectTarget = mw.Title.newFromText(redirect.to);
        }
      });
    }
    return Array.isArray(templates) ? templatesArray : templatesArray[0];
  });
};
exports.getWithRedirectTo = getWithRedirectTo;
Template.prototype.getDataForParam = function (key, paraName) {
  if (!this.paramData) {
    return null;
  }
  // If alias, switch from alias to preferred parameter name
  var para = this.paramAliases[paraName] || paraName;
  if (!this.paramData[para]) {
    return;
  }
  var data = this.paramData[para][key];
  // Data might actually be an object with key "en"
  if (data && data.en && !Array.isArray(data)) {
    return data.en;
  }
  return data;
};
Template.prototype.isShellTemplate = function () {
  var mainText = this.redirectTarget ? this.redirectTarget.getMainText() : this.getTitle().getMainText();
  return _config["default"].shellTemplates.includes(mainText);
};
Template.prototype.setParamDataAndSuggestions = function () {
  var self = this;
  var paramDataSet = $.Deferred();
  if (self.paramData) {
    return paramDataSet.resolve();
  }
  var prefixedText = self.redirectTarget ? self.redirectTarget.getPrefixedText() : self.getTitle().getPrefixedText();
  var cachedInfo = cache.read(prefixedText + "-params");
  if (cachedInfo && cachedInfo.value && cachedInfo.staleDate && cachedInfo.value.paramData != null && cachedInfo.value.parameterSuggestions != null && cachedInfo.value.paramAliases != null) {
    self.notemplatedata = cachedInfo.value.notemplatedata;
    self.paramData = cachedInfo.value.paramData;
    self.parameterSuggestions = cachedInfo.value.parameterSuggestions;
    self.paramAliases = cachedInfo.value.paramAliases;
    paramDataSet.resolve();
    if (!(0, _util.isAfterDate)(cachedInfo.staleDate)) {
      // Just use the cached data
      return paramDataSet;
    } // else: Use the cache data for now, but also fetch new data from API
  }
  _api["default"].get({
    action: "templatedata",
    titles: prefixedText,
    redirects: 1,
    includeMissingTitles: 1
  }).then(function (response) {
    return response;
  }, function /*error*/ () {
    return null;
  } // Ignore errors, will use default data
  ).then(function (result) {
    // Figure out page id (beacuse action=templatedata doesn't have an indexpageids option)
    var id = result && $.map(result.pages, function (_value, key) {
      return key;
    });
    if (!result || !result.pages[id] || result.pages[id].notemplatedata || !result.pages[id].params) {
      // No TemplateData, so use defaults (guesses)
      self.notemplatedata = true;
      self.templatedataApiError = !result;
      self.paramData = _config["default"].defaultParameterData;
    } else {
      self.paramData = result.pages[id].params;
    }
    self.paramAliases = {};
    $.each(self.paramData, function (paraName, paraData) {
      // Extract aliases for easier reference later on
      if (paraData.aliases && paraData.aliases.length) {
        paraData.aliases.forEach(function (alias) {
          self.paramAliases[alias] = paraName;
        });
      }
      // Extract allowed values array from description
      if (paraData.description && /\[.*'.+?'.*?\]/.test(paraData.description.en)) {
        try {
          var allowedVals = JSON.parse(paraData.description.en.replace(/^.*\[/, "[").replace(/"/g, "\\\"").replace(/'/g, "\"").replace(/,\s*]/, "]").replace(/].*$/, "]"));
          self.paramData[paraName].allowedValues = allowedVals;
        } catch (e) {
          console.warn("[Rater] Could not parse allowed values in description:\n  " + paraData.description.en + "\n Check TemplateData for parameter |" + paraName + "= in " + self.getTitle().getPrefixedText());
        }
      }
    });

    // Make suggestions for combobox
    var allParamsArray = !self.notemplatedata && result.pages[id].paramOrder || $.map(self.paramData, function (_val, key) {
      return key;
    });
    self.parameterSuggestions = allParamsArray.filter(function (paramName) {
      return paramName && paramName !== "class" && paramName !== "importance";
    }).map(function (paramName) {
      var optionObject = {
        data: paramName
      };
      var label = self.getDataForParam(label, paramName);
      if (label) {
        optionObject.label = label + " (|" + paramName + "=)";
      }
      return optionObject;
    });
    if (self.templatedataApiError) {
      // Don't save defaults/guesses to cache;
      return true;
    }
    cache.write(prefixedText + "-params", {
      notemplatedata: self.notemplatedata,
      paramData: self.paramData,
      parameterSuggestions: self.parameterSuggestions,
      paramAliases: self.paramAliases
    }, 1);
    return true;
  }).then(paramDataSet.resolve, paramDataSet.reject);
  return paramDataSet;
};
var makeListAs = function makeListAs(subjectTitle) {
  var name = subjectTitle.getMainText().replace(/\s\(.*\)/, "");
  if (name.indexOf(" ") === -1) {
    return name;
  }
  var generationalSuffix = "";
  if (/ (?:[JS]r.?|[IVX]+)$/.test(name)) {
    generationalSuffix = name.slice(name.lastIndexOf(" "));
    name = name.slice(0, name.lastIndexOf(" "));
    if (name.indexOf(" ") === -1) {
      return name + generationalSuffix;
    }
  }
  var lastName = name.slice(name.lastIndexOf(" ") + 1).replace(/,$/, "");
  var otherNames = name.slice(0, name.lastIndexOf(" "));
  return lastName + ", " + otherNames + generationalSuffix;
};
Template.prototype.addMissingParams = function () {
  var thisTemplate = this;

  // Autofill listas parameter for WP:BIO
  var isBiographyBanner = this.getTitle().getMainText() === "WikiProject Biography" || this.redirectTarget && this.redirectTarget.getMainText() === "WikiProject Biography";
  if (isBiographyBanner && !this.getParam("listas")) {
    var subjectTitle = mw.Title.newFromText(_config["default"].mw.wgPageName).getSubjectPage();
    this.parameters.push({
      name: "listas",
      value: makeListAs(subjectTitle),
      autofilled: true
    });
  }

  // Make sure required/suggested parameters are present
  $.each(thisTemplate.paramData, function (paraName, paraData) {
    if ((paraData.required || paraData.suggested) && !thisTemplate.getParam(paraName)) {
      // Check if already present in an alias, if any
      if (paraData.aliases.length) {
        var aliases = thisTemplate.parameters.filter(function (p) {
          var isAlias = paraData.aliases.includes(p.name);
          var isEmpty = !p.value;
          return isAlias && !isEmpty;
        });
        if (aliases.length) {
          // At least one non-empty alias, so do nothing
          return;
        }
      }
      // No non-empty aliases, so add this to the parameters list (with
      // value set parameter to either the autovaule, or as null).
      // Also set that it was autofilled.
      thisTemplate.parameters.push({
        name: paraName,
        value: paraData.autovalue || null,
        autofilled: true
      });
    }
  });
  return thisTemplate;
};
Template.prototype.setClassesAndImportances = function () {
  var _this = this;
  var parsed = $.Deferred();

  // Don't re-parse if already parsed; no need to parse shell templates or banners without ratings
  if (this.isShellTemplate()) {
    this.classes = _toConsumableArray(_config["default"].bannerDefaults.classes);
    return parsed.resolve();
  } else if (this.classes && this.importances || this.withoutRatings) {
    return parsed.resolve();
  }
  var mainText = this.getTitle().getMainText();

  // Some projects have hardcoded values, to avoid standard classes or to prevent API issues (timeout and/or node count exceeded)
  var redirectTargetOrMainText = this.redirectTarget ? this.redirectTarget.getMainText() : mainText;
  if (_config["default"].customBanners[redirectTargetOrMainText]) {
    this.classes = _config["default"].customBanners[redirectTargetOrMainText].classes;
    this.importances = _config["default"].customBanners[redirectTargetOrMainText].importances;
    return parsed.resolve();
  }

  // Otherwise try reading from cached data
  var cachedRatings = cache.read(mainText + "-ratings");
  if (cachedRatings && cachedRatings.value && cachedRatings.staleDate && cachedRatings.value.classes != null && cachedRatings.value.importances != null) {
    this.classes = cachedRatings.value.classes;
    this.importances = cachedRatings.value.importances;
    parsed.resolve();
    if (!(0, _util.isAfterDate)(cachedRatings.staleDate)) {
      // Just use the cached data
      return parsed;
    } // else: Use the cache data for now, but also fetch new data from API
  }
  var wikitextToParse = "";
  _config["default"].bannerDefaults.extendedClasses.forEach(function (classname, index) {
    wikitextToParse += "{{" + mainText + "|class=" + classname + "|importance=" + (_config["default"].bannerDefaults.extendedImportances[index] || "") + "}}/n";
  });
  return _api["default"].get({
    action: "parse",
    title: "Talk:Sandbox",
    text: wikitextToParse,
    prop: "categorieshtml"
  }).then(function (result) {
    var catsHtml = result.parse.categorieshtml["*"];
    var extendedClasses = _config["default"].bannerDefaults.extendedClasses.filter(function (cl) {
      return catsHtml.indexOf(cl + "-Class") !== -1;
    });
    _this.classes = [].concat(_toConsumableArray(_config["default"].bannerDefaults.classes), _toConsumableArray(extendedClasses));
    _this.importances = _config["default"].bannerDefaults.extendedImportances.filter(function (imp) {
      return catsHtml.indexOf(imp + "-importance") !== -1;
    });
    cache.write(mainText + "-ratings", {
      classes: _this.classes,
      importances: _this.importances
    }, 1);
    return true;
  });
};

// </nowiki>

},{"./api":15,"./cache":17,"./config":18,"./util":23}],4:[function(require,module,exports){
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports["default"] = void 0;
var _config = _interopRequireDefault(require("../../config"));
var _BannerWidget = _interopRequireDefault(require("./BannerWidget"));
var _util = require("../../util");
var _ParameterWidget = _interopRequireDefault(require("./ParameterWidget"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(n); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
function _iterableToArrayLimit(arr, i) { if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
// <nowiki>

var BannerListWidget = function BannerListWidget(config) {
  config = config || {};

  // Call parent constructor
  BannerListWidget.parent.call(this, config);
  OO.ui.mixin.GroupElement.call(this, {
    $group: this.$element
  });
  this.$element.addClass("rater-bannerListWidget").css({
    "padding": "20px 10px 16px 10px"
  });

  // Prefs
  this.preferences = config.preferences;
  this.oresClass = config.oresClass;
  this.changed = false;

  // Events
  this.aggregate({
    "remove": "bannerRemove"
  });
  this.connect(this, {
    "bannerRemove": "onBannerRemove"
  });
  this.aggregate({
    "changed": "bannerChanged"
  });
  this.connect(this, {
    "bannerChanged": "setChanged"
  });
  this.aggregate({
    "biographyBannerChange": "biographyBannerChanged"
  });
  this.connect(this, {
    "biographyBannerChanged": "syncShellTemplateWithBiographyBanner"
  });
  this.aggregate({
    "updatedSize": "bannerUpdatedSize"
  });
  this.connect(this, {
    "bannerUpdatedSize": "onUpdatedSize"
  });
};
OO.inheritClass(BannerListWidget, OO.ui.Widget);
OO.mixinClass(BannerListWidget, OO.ui.mixin.GroupElement);
/*
methods from mixin:
 - addItems( items, [index] ) : OO.ui.Element  (CHAINABLE)
 - clearItems( ) : OO.ui.Element  (CHAINABLE)
 - findItemFromData( data ) : OO.ui.Element|null
 - findItemsFromData( data ) : OO.ui.Element[]
 - removeItems( items ) : OO.ui.Element  (CHAINABLE)
*/

BannerListWidget.prototype.onUpdatedSize = function () {
  // Emit an "updatedSize" event so the parent window can update size, if needed
  this.emit("updatedSize");
};
BannerListWidget.prototype.setChanged = function () {
  this.changed = true;
};
BannerListWidget.prototype.onBannerRemove = function (banner) {
  this.removeItems([banner]);
  this.setChanged();
};
BannerListWidget.prototype.syncShellTemplateWithBiographyBanner = function (biographyBanner) {
  biographyBanner = biographyBanner || this.items.find(function (banner) {
    return banner.mainText === "WikiProject Biography" || banner.redirectTargetMainText === "WikiProject Biography";
  });
  if (!biographyBanner) return;
  var bannerShellTemplate = this.items.find(function (banner) {
    return banner.mainText === _config["default"].shellTemplates[0] || banner.redirectTargetMainText === _config["default"].shellTemplates[0];
  });
  if (!bannerShellTemplate) {
    return;
  }
  var paramsToSync = [{
    name: "living",
    normalise: true
  }, {
    name: "blpo",
    normalise: true
  }, {
    name: "activepol",
    normalise: true
  }, {
    name: "listas",
    normalise: false
  }];
  paramsToSync.forEach(function (paramToSync) {
    var _map = [biographyBanner, bannerShellTemplate].map(function (banner) {
        return banner.parameterList.getParameterItems().find(function (parameter) {
          return parameter.name === paramToSync.name || banner.paramAliases[parameter.name] === paramToSync.name;
        });
      }),
      _map2 = _slicedToArray(_map, 2),
      biographyParam = _map2[0],
      shellParam = _map2[1];
    if (!biographyParam) return;
    var paramSyncValue = paramToSync.normalise ? (0, _util.normaliseYesNo)(biographyParam.value) : biographyParam.value;
    biographyParam["delete"]();
    if (!shellParam) {
      var index = bannerShellTemplate.addParameterLayout.isVisible() ? -1 // Insert at the very end
      : bannerShellTemplate.parameterList.items.length - 1; // Insert prior to the "add parameter" button
      bannerShellTemplate.parameterList.addItems([new _ParameterWidget["default"]({
        "name": paramToSync.name,
        "value": paramSyncValue,
        "autofilled": true
      }, bannerShellTemplate.paramData && bannerShellTemplate.paramData[paramToSync.name])], index);
    } else if (!biographyParam.autofilled) {
      shellParam.setValue(paramSyncValue);
      shellParam.setAutofilled();
    }
  });
};
BannerListWidget.prototype.addShellTemplateIfNeeeded = function () {
  var _this = this;
  if (!this.items.some(function (banner) {
    return banner.isShellTemplate;
  })) {
    _BannerWidget["default"].newFromTemplateName(_config["default"].shellTemplates[0], {
      withoutRatings: true
    }, {
      preferences: this.preferences,
      isArticle: this.pageInfo.isArticle
    }).then(function (shellBannerWidget) {
      OO.ui.mixin.GroupElement.prototype.addItems.call(_this, [shellBannerWidget], 0);
      // Autofill ratings (if able to)
      _this.autofillClassRatings({
        forBannerShell: true
      });
      // emit updatedSize event 
      _this.onUpdatedSize();
    });
  }
  return this;
};
BannerListWidget.prototype.addItems = function (items, index) {
  if (items.length === 0) {
    return this;
  }

  // Call mixin method to do the adding
  OO.ui.mixin.GroupElement.prototype.addItems.call(this, items, index);

  // Autofill ratings (if able to, and if enabled in preferences)
  if (!this.items.some(function (banner) {
    return banner.isShellTemplate;
  })) {
    this.autofillClassRatings();
  }
  this.autofillImportanceRatings();

  // emit updatedSize event 
  this.onUpdatedSize();
  return this;
};
BannerListWidget.prototype.autofillClassRatings = function (config) {
  config = config || {};
  // Only autofill if set in preferences
  if (!this.preferences.autofillClassFromOthers && !this.preferences.autofillClassFromOres && !config.forBannerShell) {
    return;
  }
  // Check what banners already have
  var uniqueClassRatings = (0, _util.uniqueArray)((0, _util.filterAndMap)(this.items, function (banner) {
    if (banner.isShellTemplate || !banner.hasClassRatings) {
      return false;
    }
    var classItem = banner.classDropdown.getMenu().findSelectedItem();
    return classItem && classItem.getData();
  }, function (banner) {
    return banner.classDropdown.getMenu().findSelectedItem().getData();
  }));
  // Can't autofill if there isn't either a single value, or no value
  if (uniqueClassRatings.length > 1) {
    return;
  }
  // Determine what to autofill with
  var autoClass;
  if (uniqueClassRatings.length === 1 && (this.preferences.autofillClassFromOthers || config.forBannerShell)) {
    autoClass = uniqueClassRatings[0];
  } else if (uniqueClassRatings.length === 0 && this.preferences.autofillClassFromOres && this.oresClass) {
    // Don't autofill above C-class
    switch (this.oresClass) {
      case "Stub":
      case "Start":
      case "C":
      case "List":
        autoClass = this.oresClass;
    }
  } else {
    // nothing to do
    return;
  }
  // Do the autofilling
  this.items.forEach(function (banner) {
    if (!banner.hasClassRatings && !banner.isShellTemplate) {
      return;
    }
    var classItem = banner.classDropdown.getMenu().findSelectedItem();
    if (classItem && classItem.getData() && !config.forBannerShell) {
      return;
    }
    if (config.forBannerShell && !banner.isShellTemplate && classItem.getData() === autoClass) {
      banner.classDropdown.getMenu().selectItemByData(null);
      return;
    }
    banner.classDropdown.getMenu().selectItemByData(autoClass);
    banner.classDropdown.setAutofilled(true);
  });
};
BannerListWidget.prototype.autofillImportanceRatings = function () {
  if (!this.preferences.autofillImportance) {
    return;
  }
  var isRegularArticle = this.pageInfo && this.pageInfo.isArticle && !this.pageInfo.redirect && !this.pageInfo.isDisambig;
  if (!isRegularArticle) {
    return;
  }
  // TODO: Should try to find a smarter, banner-specific way of determining importance.
  // Maybe do something with  ORES's "drafttopic" model.
  var autoImportance = "Low";
  this.items.forEach(function (banner) {
    if (!banner.hasImportanceRatings) {
      return;
    }
    var importanceItem = banner.importanceDropdown.getMenu().findSelectedItem();
    if (importanceItem && importanceItem.getData()) {
      return;
    }
    banner.importanceDropdown.getMenu().selectItemByData(autoImportance);
    banner.importanceDropdown.setAutofilled(true);
  });
};
BannerListWidget.prototype.setPreferences = function (prefs) {
  this.preferences = prefs;
  this.items.forEach(function (banner) {
    return banner.setPreferences(prefs);
  });
  this.autofillClassRatings();
  this.autofillImportanceRatings();
};
BannerListWidget.prototype.makeWikitext = function () {
  var bannersWikitext = (0, _util.filterAndMap)(this.items, function (banner) {
    return !banner.isShellTemplate;
  }, function (banner) {
    return banner.makeWikitext();
  }).join("\n");
  var shellTemplate = this.items.find(function (banner) {
    return banner.isShellTemplate;
  });
  if (!shellTemplate) {
    return bannersWikitext;
  }
  var shellParam1 = new _ParameterWidget["default"]({
    name: "1",
    value: "\n" + bannersWikitext + "\n" + (shellTemplate.nonStandardTemplates ? shellTemplate.nonStandardTemplates + "\n" : "")
  });
  shellTemplate.parameterList.addItems([shellParam1]);
  var shellWikitext = shellTemplate.makeWikitext();
  shellTemplate.parameterList.removeItems([shellParam1]);
  return shellWikitext;
};
var _default = BannerListWidget; // </nowiki>
exports["default"] = _default;

},{"../../config":18,"../../util":23,"./BannerWidget":5,"./ParameterWidget":9}],5:[function(require,module,exports){
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports["default"] = void 0;
var _ParameterListWidget = _interopRequireDefault(require("./ParameterListWidget"));
var _ParameterWidget = _interopRequireDefault(require("./ParameterWidget"));
var _DropdownParameterWidget = _interopRequireDefault(require("./DropdownParameterWidget"));
var _SuggestionLookupTextInputWidget = _interopRequireDefault(require("./SuggestionLookupTextInputWidget"));
var _util = require("../../util");
var _Template = require("../../Template");
var _HorizontalLayoutWidget = _interopRequireDefault(require("./HorizontalLayoutWidget"));
var _config = _interopRequireDefault(require("../../config"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(n); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); }
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
// <nowiki>

function BannerWidget(template, config) {
  var _this = this;
  // Configuration initialization
  config = config || {};
  // Call parent constructor
  BannerWidget["super"].call(this, config);
  this.$overlay = config.$overlay;

  /* --- PREFS --- */
  this.preferences = config.preferences;

  /* --- PROPS --- */
  this.paramData = template.paramData;
  this.paramAliases = template.paramAliases || {};
  this.parameterSuggestions = template.parameterSuggestions;
  this.name = template.name;
  this.wikitext = template.wikitext;
  this.pipeStyle = template.pipeStyle;
  this.equalsStyle = template.equalsStyle;
  this.endBracesStyle = template.endBracesStyle;
  this.mainText = template.getTitle().getMainText();
  this.redirectTargetMainText = template.redirectTarget && template.redirectTarget.getMainText();
  this.isShellTemplate = template.isShellTemplate();
  this.changed = template.parameters.some(function (parameter) {
    return parameter.autofilled;
  }); // initially false, unless some parameters were autofilled
  this.hasClassRatings = template.classes && template.classes.length;
  this.hasImportanceRatings = template.importances && template.importances.length;
  this.inactiveProject = template.inactiveProject;

  /* --- TITLE AND RATINGS --- */

  this.removeButton = new OO.ui.ButtonWidget({
    icon: "trash",
    label: "Remove banner",
    title: "Remove banner",
    flags: "destructive",
    $element: $("<div style=\"width:100%\">")
  });
  this.clearButton = new OO.ui.ButtonWidget({
    icon: "cancel",
    label: "Clear parameters",
    title: "Clear parameters",
    flags: "destructive",
    $element: $("<div style=\"width:100%\">")
  });
  this.removeButton.$element.find("a").css("width", "100%");
  this.clearButton.$element.find("a").css("width", "100%");
  this.titleButtonsGroup = new OO.ui.ButtonGroupWidget({
    items: [this.removeButton, this.clearButton],
    $element: $("<span style='width:100%;'>")
  });
  this.mainLabelPopupButton = new OO.ui.PopupButtonWidget({
    label: "{{".concat(template.getTitle().getMainText(), "}}").concat(this.inactiveProject ? " (inactive)" : ""),
    $element: $("<span style='display:inline-block;width:48%;margin-right:0;padding-right:8px'>"),
    $overlay: this.$overlay,
    indicator: "down",
    framed: false,
    popup: {
      $content: this.titleButtonsGroup.$element,
      width: 200,
      padded: false,
      align: "force-right",
      anchor: false
    }
  });
  this.mainLabelPopupButton.$element.children("a").first().css({
    "font-size": "110%"
  }).find("span.oo-ui-labelElement-label").css({
    "white-space": "normal"
  });

  // Rating dropdowns
  if (this.isShellTemplate) {
    this.classDropdown = new _DropdownParameterWidget["default"]({
      label: new OO.ui.HtmlSnippet("<span style=\"color:#777\">Class</span>"),
      menu: {
        items: [new OO.ui.MenuOptionWidget({
          data: null,
          label: new OO.ui.HtmlSnippet("<span style=\"color:#777\">(".concat(config.isArticle ? "no class" : "auto-detect", ")</span>"))
        })].concat(_toConsumableArray(_config["default"].bannerDefaults.classes.map(function (classname) {
          return new OO.ui.MenuOptionWidget({
            data: classname,
            label: classname
          });
        })))
      },
      $overlay: this.$overlay
    });
    var shellClassParam = template.parameters.find(function (parameter) {
      return parameter.name === "class";
    });
    this.classDropdown.getMenu().selectItemByData(shellClassParam && (0, _util.classMask)(shellClassParam.value));
  } else if (this.hasClassRatings) {
    this.classDropdown = new _DropdownParameterWidget["default"]({
      label: new OO.ui.HtmlSnippet("<span style=\"color:#777\">Class</span>"),
      menu: {
        items: [new OO.ui.MenuOptionWidget({
          data: null,
          label: new OO.ui.HtmlSnippet("<span style=\"color:#777\">(".concat(config.isArticle ? "inherit from shell" : "auto-detect", ")</span>"))
        })].concat(_toConsumableArray(template.classes.map(function (classname) {
          return new OO.ui.MenuOptionWidget({
            data: classname,
            label: classname
          });
        })))
      },
      $overlay: this.$overlay
    });
    var classParam = template.parameters.find(function (parameter) {
      return parameter.name === "class";
    });
    this.classDropdown.getMenu().selectItemByData(classParam && (0, _util.classMask)(classParam.value));
  }
  if (this.hasImportanceRatings) {
    this.importanceDropdown = new _DropdownParameterWidget["default"]({
      label: new OO.ui.HtmlSnippet("<span style=\"color:#777\">Importance</span>"),
      menu: {
        items: [new OO.ui.MenuOptionWidget({
          data: null,
          label: new OO.ui.HtmlSnippet("<span style=\"color:#777\">(".concat(config.isArticle ? "no importance" : "auto-detect", ")</span>"))
        })].concat(_toConsumableArray(template.importances.map(function (importance) {
          return new OO.ui.MenuOptionWidget({
            data: importance,
            label: importance
          });
        })))
      },
      $overlay: this.$overlay
    });
    var importanceParam = template.parameters.find(function (parameter) {
      return parameter.name === "importance";
    });
    this.importanceDropdown.getMenu().selectItemByData(importanceParam && (0, _util.importanceMask)(importanceParam.value));
  }
  this.titleLayout = new OO.ui.HorizontalLayout({
    items: [this.mainLabelPopupButton]
  });
  if (this.hasClassRatings || this.isShellTemplate) {
    this.titleLayout.addItems([this.classDropdown]);
  }
  if (this.hasImportanceRatings) {
    this.titleLayout.addItems([this.importanceDropdown]);
  }

  /* --- PARAMETERS LIST --- */

  var parameterWidgets = (0, _util.filterAndMap)(template.parameters, function (param) {
    if (_this.isShellTemplate) {
      if (param.name == "1") {
        _this.shellParam1Value = param.value;
        return false;
      }
      return param.name !== "class";
    }
    return param.name !== "class" && param.name !== "importance";
  }, function (param) {
    return new _ParameterWidget["default"](param, template.paramData[param.name], {
      $overlay: _this.$overlay
    });
  });
  this.parameterList = new _ParameterListWidget["default"]({
    items: parameterWidgets,
    preferences: this.preferences
  });

  /* --- ADD PARAMETER SECTION --- */

  this.addParameterNameInput = new _SuggestionLookupTextInputWidget["default"]({
    suggestions: template.parameterSuggestions,
    placeholder: "parameter name",
    $element: $("<div style='display:inline-block;width:40%'>"),
    validate: function (val) {
      var _this$getAddParameter = this.getAddParametersInfo(val),
        validName = _this$getAddParameter.validName,
        name = _this$getAddParameter.name,
        value = _this$getAddParameter.value;
      return !name && !value ? true : validName;
    }.bind(this),
    allowSuggestionsWhenEmpty: true,
    $overlay: this.$overlay
  });
  this.updateAddParameterNameSuggestions();
  this.addParameterValueInput = new _SuggestionLookupTextInputWidget["default"]({
    placeholder: "parameter value",
    $element: $("<div style='display:inline-block;width:40%'>"),
    validate: function (val) {
      var _this$getAddParameter2 = this.getAddParametersInfo(null, val),
        validValue = _this$getAddParameter2.validValue,
        name = _this$getAddParameter2.name,
        value = _this$getAddParameter2.value;
      return !name && !value ? true : validValue;
    }.bind(this),
    allowSuggestionsWhenEmpty: true,
    $overlay: this.$overlay
  });
  this.addParameterButton = new OO.ui.ButtonWidget({
    label: "Add",
    icon: "add",
    flags: "progressive"
  }).setDisabled(true);
  this.addParameterControls = new _HorizontalLayoutWidget["default"]({
    items: [this.addParameterNameInput, new OO.ui.LabelWidget({
      label: "="
    }), this.addParameterValueInput, this.addParameterButton]
  });
  this.addParameterLayout = new OO.ui.FieldLayout(this.addParameterControls, {
    label: "Add parameter:",
    align: "top"
  }).toggle(false);
  // A hack to make messages appear on their own line
  this.addParameterLayout.$element.find(".oo-ui-fieldLayout-messages").css({
    "clear": "both",
    "padding-top": 0
  });

  /* --- OVERALL LAYOUT/DISPLAY --- */

  // Display the layout elements, and a rule
  this.$element.addClass("rater-bannerWidget").append(this.titleLayout.$element, this.parameterList.$element, this.addParameterLayout.$element);
  if (!this.isShellTemplate) {
    this.$element.append($("<hr>"));
  }
  if (this.isShellTemplate) {
    this.$element.css({
      "background": "#eee",
      "border-radius": "10px",
      "padding": "0 10px 5px",
      "margin-bottom": "12px",
      "font-size": "92%"
    });
  }

  /* --- EVENT HANDLING --- */

  if (this.hasClassRatings) {
    this.classDropdown.connect(this, {
      "change": "onClassChange"
    });
  }
  if (this.hasImportanceRatings) {
    this.importanceDropdown.connect(this, {
      "change": "onImportanceChange"
    });
  }
  this.parameterList.connect(this, {
    "change": "onParameterChange",
    "addParametersButtonClick": "showAddParameterInputs",
    "updatedSize": "onUpdatedSize"
  });
  this.addParameterButton.connect(this, {
    "click": "onParameterAdd"
  });
  this.addParameterNameInput.connect(this, {
    "change": "onAddParameterNameChange",
    "enter": "onAddParameterNameEnter",
    "choose": "onAddParameterNameEnter"
  });
  this.addParameterValueInput.connect(this, {
    "change": "onAddParameterValueChange",
    "enter": "onAddParameterValueEnter",
    "choose": "onAddParameterValueEnter"
  });
  this.removeButton.connect(this, {
    "click": "onRemoveButtonClick"
  });
  this.clearButton.connect(this, {
    "click": "onClearButtonClick"
  });

  /* --- APPLY PREF -- */
  if (this.preferences.bypassRedirects) {
    this.bypassRedirect();
  }
}
OO.inheritClass(BannerWidget, OO.ui.Widget);

/**
 * @param {String} templateName
 * @param {Object} [data]
 * @param {Boolean} data.withoutRatings
 * @param {Boolean} data.isWrapper
 * @param {Object} config
 * @returns {Promise<BannerWidget>}
 */
BannerWidget.newFromTemplateName = function (templateName, data, config) {
  var template = new _Template.Template();
  template.name = templateName;
  if (data && data.withoutRatings) {
    template.withoutRatings = true;
  }
  return (0, _Template.getWithRedirectTo)(template).then(function (template) {
    return $.when(template.setClassesAndImportances(), template.setParamDataAndSuggestions()).then(function () {
      // Add missing required/suggested values
      template.addMissingParams();
      // Return the now-modified template
      return template;
    });
  }).then(function (template) {
    return new BannerWidget(template, config);
  });
};
BannerWidget.prototype.onUpdatedSize = function () {
  // Emit an "updatedSize" event so the parent window can update size, if needed
  this.emit("updatedSize");
};
BannerWidget.prototype.setChanged = function () {
  this.changed = true;
  this.emit("changed");
};
BannerWidget.prototype.onParameterChange = function () {
  this.setChanged();
  if (this.mainText === "WikiProject Biography" || this.redirectTargetMainText === "WikiProject Biography") {
    // Emit event so BannerListWidget can update the banner shell template (if present)
    this.emit("biographyBannerChange");
  }
  this.updateAddParameterNameSuggestions();
};
BannerWidget.prototype.onClassChange = function () {
  this.setChanged();
  this.classChanged = true;
  var classItem = this.classDropdown.getMenu().findSelectedItem();
  if (classItem && classItem.getData() == null) {
    // clear selection
    this.classDropdown.getMenu().selectItem();
  }
};
BannerWidget.prototype.onImportanceChange = function () {
  this.setChanged();
  this.importanceChanged = true;
  var importanceItem = this.importanceDropdown.getMenu().findSelectedItem();
  if (importanceItem && importanceItem.getData() == null) {
    // clear selection
    this.importanceDropdown.getMenu().selectItem();
  }
};
BannerWidget.prototype.showAddParameterInputs = function () {
  this.addParameterLayout.toggle(true);
  this.addParameterNameInput.focus();
  this.onUpdatedSize();
};
BannerWidget.prototype.getAddParametersInfo = function (nameInputVal, valueInputVal) {
  var name = nameInputVal && nameInputVal.trim() || this.addParameterNameInput.getValue().trim();
  var paramAlreadyIncluded = name === "class" || name === "importance" || name === "1" && this.isShellTemplate || this.parameterList.getParameterItems().some(function (paramWidget) {
    return paramWidget.name === name;
  });
  var value = valueInputVal && valueInputVal.trim() || this.addParameterValueInput.getValue().trim();
  var autovalue = name && this.paramData[name] && this.paramData[name].autovalue || null;
  return {
    validName: !!(name && !paramAlreadyIncluded),
    validValue: !!(value || autovalue),
    isAutovalue: !!(!value && autovalue),
    isAlreadyIncluded: !!(name && paramAlreadyIncluded),
    name: name,
    value: value,
    autovalue: autovalue
  };
};
BannerWidget.prototype.onAddParameterNameChange = function () {
  var _this$getAddParameter3 = this.getAddParametersInfo(),
    validName = _this$getAddParameter3.validName,
    validValue = _this$getAddParameter3.validValue,
    isAutovalue = _this$getAddParameter3.isAutovalue,
    isAlreadyIncluded = _this$getAddParameter3.isAlreadyIncluded,
    name = _this$getAddParameter3.name,
    autovalue = _this$getAddParameter3.autovalue; // Set value input placeholder as the autovalue
  this.addParameterValueInput.$input.attr("placeholder", autovalue || "");
  // Set suggestions, if the parameter has a list of allowed values
  var allowedValues = this.paramData[name] && this.paramData[name].allowedValues && this.paramData[name].allowedValues.map(function (val) {
    return {
      data: val,
      label: val
    };
  });
  this.addParameterValueInput.setSuggestions(allowedValues || []);
  // Set button disabled state based on validity
  this.addParameterButton.setDisabled(!validName || !validValue);
  // Show notice if autovalue will be used
  this.addParameterLayout.setNotices(validName && isAutovalue ? ["Parameter value will be autofilled"] : []);
  // Show error is the banner already has the parameter set
  this.addParameterLayout.setErrors(isAlreadyIncluded ? ["Parameter is already present"] : []);
};
BannerWidget.prototype.onAddParameterNameEnter = function () {
  this.addParameterValueInput.focus();
};
BannerWidget.prototype.onAddParameterValueChange = function () {
  var _this$getAddParameter4 = this.getAddParametersInfo(),
    validName = _this$getAddParameter4.validName,
    validValue = _this$getAddParameter4.validValue,
    isAutovalue = _this$getAddParameter4.isAutovalue;
  this.addParameterButton.setDisabled(!validName || !validValue);
  this.addParameterLayout.setNotices(validName && isAutovalue ? ["Parameter value will be autofilled"] : []);
};
BannerWidget.prototype.onAddParameterValueEnter = function () {
  // Make sure button state has been updated
  this.onAddParameterValueChange();
  // Do nothing if button is disabled (i.e. name and/or value are invalid)
  if (this.addParameterButton.isDisabled()) {
    return;
  }
  // Add parameter
  this.onParameterAdd();
};
BannerWidget.prototype.onParameterAdd = function () {
  var _this$getAddParameter5 = this.getAddParametersInfo(),
    validName = _this$getAddParameter5.validName,
    validValue = _this$getAddParameter5.validValue,
    name = _this$getAddParameter5.name,
    value = _this$getAddParameter5.value,
    autovalue = _this$getAddParameter5.autovalue;
  if (!validName || !validValue) {
    // Error should already be shown via onAddParameter...Change methods
    return;
  }
  var newParameter = new _ParameterWidget["default"]({
    "name": name,
    "value": value || autovalue
  }, this.paramData[name], {
    $overlay: this.$overlay
  });
  this.parameterList.addItems([newParameter]);
  this.addParameterNameInput.setValue("");
  this.addParameterValueInput.setValue("");
  this.addParameterNameInput.$input.focus();
};
BannerWidget.prototype.updateAddParameterNameSuggestions = function () {
  var paramsInUse = {};
  this.parameterList.getParameterItems().forEach(function (paramWidget) {
    return paramsInUse[paramWidget.name] = true;
  });
  this.addParameterNameInput.setSuggestions(this.parameterSuggestions.filter(function (suggestion) {
    return !paramsInUse[suggestion.data];
  }));
};
BannerWidget.prototype.onRemoveButtonClick = function () {
  this.emit("remove");
};
BannerWidget.prototype.onClearButtonClick = function () {
  this.parameterList.clearItems(this.parameterList.getParameterItems());
  if (this.hasClassRatings) {
    this.classDropdown.getMenu().selectItem();
  }
  if (this.hasImportanceRatings) {
    this.importanceDropdown.getMenu().selectItem();
  }
};
BannerWidget.prototype.bypassRedirect = function () {
  if (!this.redirectTargetMainText) {
    return;
  }
  // Store the bypassed name
  this.bypassedName = this.name;
  // Update title label
  this.mainLabelPopupButton.setLabel("{{".concat(this.redirectTargetMainText, "}}").concat(this.inactiveProject ? " (inactive)" : ""));
  // Update properties
  this.name = this.redirectTargetMainText;
  this.mainText = this.redirectTargetMainText;
  this.redirectTargetMainText = null;
  this.setChanged();
};
BannerWidget.prototype.makeWikitext = function () {
  if (!this.changed && this.wikitext) {
    return this.wikitext;
  }
  var pipe = this.pipeStyle;
  var equals = this.equalsStyle;
  var classItem = (this.hasClassRatings || this.isShellTemplate) && this.classDropdown.getMenu().findSelectedItem();
  var classVal = classItem && classItem.getData();
  var importanceItem = this.hasImportanceRatings && this.importanceDropdown.getMenu().findSelectedItem();
  var importanceVal = importanceItem && importanceItem.getData();
  return ("{{" + this.name + ((this.hasClassRatings || this.isShellTemplate) && classVal != null ? "".concat(pipe, "class").concat(equals).concat(classVal || "") : "") + (this.hasImportanceRatings && importanceVal != null ? "".concat(pipe, "importance").concat(equals).concat(importanceVal || "") : "") + this.parameterList.getParameterItems().map(function (parameter) {
    return parameter.makeWikitext(pipe, equals);
  }).join("") + this.endBracesStyle).replace(/\n+}}$/, "\n}}"); // avoid empty line at end like [[Special:Diff/925982142]]
};
BannerWidget.prototype.setPreferences = function (prefs) {
  this.preferences = prefs;
  if (this.preferences.bypassRedirects) {
    this.bypassRedirect();
  }
  this.parameterList.setPreferences(prefs);
};
var _default = BannerWidget; // </nowiki>
exports["default"] = _default;

},{"../../Template":3,"../../config":18,"../../util":23,"./DropdownParameterWidget":6,"./HorizontalLayoutWidget":7,"./ParameterListWidget":8,"./ParameterWidget":9,"./SuggestionLookupTextInputWidget":11}],6:[function(require,module,exports){
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports["default"] = void 0;
// <nowiki>

function DropdownParameterWidget(config) {
  // Configuration initialization
  config = $.extend({
    $element: $("<span style='display:inline-block;width:24%'>")
  }, config || {});

  // Call parent constructor
  DropdownParameterWidget["super"].call(this, config);
  this.$overlay = config.$overlay;
  this.$element.addClass("rater-dropdownParameterWidget");

  // Autofilled icon
  this.autofilled = !!config.autofilled;
  this.autofilledIcon = new OO.ui.IconWidget({
    icon: "robot",
    title: "Autofilled by Rater",
    flags: "progressive",
    $element: $("<span style='margin: 0 -5px 0 5px;min-width: 16px;width: 16px;left:unset;'>")
  }).toggle(this.autofilled);
  this.$element.find(".oo-ui-indicatorElement-indicator").before(this.autofilledIcon.$element);

  // Events
  this.menu.connect(this, {
    "choose": "onDropdownMenuChoose",
    "select": "onDropdownMenuSelect"
  });
}
OO.inheritClass(DropdownParameterWidget, OO.ui.DropdownWidget);
DropdownParameterWidget.prototype.setAutofilled = function (setAutofill) {
  this.autofilledIcon.toggle(!!setAutofill);
  this.$element.find(".oo-ui-dropdownWidget-handle").css({
    "border": setAutofill ? "1px dashed #36c" : ""
  });
  this.autofilled = !!setAutofill;
};
DropdownParameterWidget.prototype.onDropdownMenuChoose = function () {
  this.setAutofilled(false);
  this.emit("change");
};
DropdownParameterWidget.prototype.onDropdownMenuSelect = function () {
  this.emit("change");
};
DropdownParameterWidget.prototype.getValue = function () {
  var selectedItem = this.menu.findSelectedItem();
  return selectedItem && selectedItem.getData();
};
var _default = DropdownParameterWidget; // </nowiki>
exports["default"] = _default;

},{}],7:[function(require,module,exports){
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports["default"] = void 0;
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
// <nowiki>

/**
 * A HorizontalLayout that is also a widget, and can thus be placed within
 * field layouts.
 * 
 * @class
 * @param {*} config configuration for OO.ui.HorizontalLayout
 */
function HorizontalLayoutWidget(config) {
  // Configuration initialization
  config = config || {};
  // Call parent constructor
  HorizontalLayoutWidget["super"].call(this, {});
  this.layout = new OO.ui.HorizontalLayout(_objectSpread({}, config, {
    $element: this.$element
  }));
}
OO.inheritClass(HorizontalLayoutWidget, OO.ui.Widget);
var _default = HorizontalLayoutWidget; // </nowiki>
exports["default"] = _default;

},{}],8:[function(require,module,exports){
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports["default"] = void 0;
// <nowiki>

/**
 * @cfg {OO.ui.Element[]} items Items to be added
 * @cfg {Number} displayLimit The most to show at once. If the number of items
 *  is more than this, then only the first (displayLimit - 1) items are shown.
 */
var ParameterListWidget = function ParameterListWidget(config) {
  config = config || {};

  // Call parent constructor
  ParameterListWidget.parent.call(this, config);
  OO.ui.mixin.GroupElement.call(this, {
    $group: this.$element
  });
  this.addItems(config.items);
  this.$element.addClass("rater-parameterListWidget");
  this.preferences = config.preferences;

  // Hide some parameters (initially), if more than set display limit -- which is the 
  // one more than collapseParamsLowerLimit, to prevent only one param being hidden
  // (mostly: may occasionally occur if params were auto-filled).
  var displayLimit = this.preferences.collapseParamsLowerLimit + 1;
  if (displayLimit && this.items.length > displayLimit) {
    var hideFromNumber = displayLimit - 1; // One-indexed
    var hideFromIndex = hideFromNumber - 1; // Zero-indexed
    var hiddenCount = 0;
    for (var i = hideFromIndex; i < this.items.length; i++) {
      if (!this.items[i].autofilled) {
        // Don't hide auto-filled params
        this.items[i].toggle(false);
        hiddenCount++;
      }
    }
    if (hiddenCount > 0) {
      // Add button to show the hidden params
      this.showMoreParametersButton = new OO.ui.ButtonWidget({
        label: "Show " + hiddenCount + " more " + (hiddenCount === 1 ? "parameter" : "parameters"),
        framed: false,
        $element: $("<span style='margin-bottom:0'>")
      });
      this.addItems([this.showMoreParametersButton]);
    }
  }

  // Add the button that allows user to add more parameters
  this.addParametersButton = new OO.ui.ButtonWidget({
    label: "Add parameter",
    icon: "add",
    framed: false,
    $element: $("<span style='margin-bottom:0'>")
  });
  this.addItems([this.addParametersButton]);

  /* --- Events --- */

  // Handle delete events from ParameterWidgets
  this.aggregate({
    "delete": "parameterDelete"
  });
  this.connect(this, {
    parameterDelete: "onParameterDelete"
  });

  // Handle change events from ParameterWidgets
  this.aggregate({
    change: "parameterChange"
  });
  this.connect(this, {
    parameterChange: "onParameterChange"
  });

  // Handle updatedSize events from ParameterWidgets
  this.aggregate({
    "updatedSize": "parameterUpdatedSize"
  });
  this.connect(this, {
    "parameterUpdatedSize": "onUpdatedSize"
  });

  // Handle button clicks
  if (this.showMoreParametersButton) {
    this.showMoreParametersButton.connect(this, {
      "click": "onShowMoreParametersButtonClick"
    });
  }
  this.addParametersButton.connect(this, {
    "click": "onAddParametersButtonClick"
  });
};
OO.inheritClass(ParameterListWidget, OO.ui.Widget);
OO.mixinClass(ParameterListWidget, OO.ui.mixin.GroupElement);
/*
methods from mixin:
 - addItems( items, [index] ) : OO.ui.Element  (CHAINABLE)
 - clearItems( ) : OO.ui.Element  (CHAINABLE)
 - findItemFromData( data ) : OO.ui.Element|null
 - findItemsFromData( data ) : OO.ui.Element[]
 - removeItems( items ) : OO.ui.Element  (CHAINABLE)
*/

ParameterListWidget.prototype.onUpdatedSize = function () {
  // Emit an "updatedSize" event so the parent window can update size, if needed
  this.emit("updatedSize");
};
ParameterListWidget.prototype.addItems = function (items, index) {
  if (items.length === 0) {
    return this;
  }

  // Call mixin method to do the adding
  OO.ui.mixin.GroupElement.prototype.addItems.call(this, items, index);

  // emit updatedSize event 
  this.onUpdatedSize();
  return this;
};
ParameterListWidget.prototype.onParameterDelete = function (parameter) {
  this.removeItems([parameter]);
  this.emit("change");
};
ParameterListWidget.prototype.onParameterChange = function () {
  this.emit("change");
};
ParameterListWidget.prototype.getParameterItems = function () {
  return this.items.filter(function (item) {
    return item.constructor.name === "ParameterWidget";
  });
};
ParameterListWidget.prototype.onShowMoreParametersButtonClick = function () {
  this.removeItems([this.showMoreParametersButton]);
  this.items.forEach(function (parameterWidget) {
    return parameterWidget.toggle(true);
  });
  this.onUpdatedSize();
};
ParameterListWidget.prototype.onAddParametersButtonClick = function () {
  this.removeItems([this.addParametersButton]);
  this.emit("addParametersButtonClick");
};
ParameterListWidget.prototype.makeWikitext = function (pipeStyle, equalsStyle) {
  return this.getParameterItems().map(function (parameter) {
    return parameter.makeWikitext(pipeStyle, equalsStyle);
  }).join("");
};
ParameterListWidget.prototype.setPreferences = function (prefs) {
  this.preferences = prefs;
  var params = this.getParameterItems();
  // Unhide some parameters of the collapseParamsLowerLimit has increased.
  // (Not hiding any if it decreased, since it's a *lower* limit of what needs to be shown.)
  if (params.length <= this.preferences.collapseParamsLowerLimit) {
    return;
  }
  var hiddenParams = params.filter(function (param) {
    return !param.isVisible();
  });
  var visibleParamsCount = params.length - hiddenParams.length;
  if (hiddenParams === 0 || visibleParamsCount >= this.preferences.collapseParamsLowerLimit) {
    return;
  }
  var numToUnhide = Math.min(this.preferences.collapseParamsLowerLimit - visibleParamsCount, hiddenParams.length);
  for (var i = 0; i < numToUnhide; i++) {
    hiddenParams[i].toggle(true);
  }
  var stillHiddenCount = hiddenParams.length - numToUnhide;
  if (stillHiddenCount === 0) {
    this.removeItems([this.showMoreParametersButton]);
  } else {
    this.showMoreParametersButton.setLabel("Show " + stillHiddenCount + " more " + (stillHiddenCount === 1 ? "paramter" : "paramters"));
  }
};
var _default = ParameterListWidget; // </nowiki>
exports["default"] = _default;

},{}],9:[function(require,module,exports){
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports["default"] = void 0;
var _util = require("../../util");
var _HorizontalLayoutWidget = _interopRequireDefault(require("./HorizontalLayoutWidget"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
// <nowiki>

function ParameterWidget(parameter, paramData, config) {
  // Configuration initialization
  config = config || {};
  // Call parent constructor
  ParameterWidget["super"].call(this, config);
  this.$overlay = config.$overlay;
  this.name = parameter.name;
  this.value = parameter.value;
  this.autofilled = parameter.autofilled;
  this.isInvalid = parameter.value == null;
  this.paramData = paramData || {};
  this.allowedValues = this.paramData.allowedValues || [];
  this.isRequired = this.paramData.required;
  this.isSuggested = this.paramData.suggested;

  // Make a checkbox if only 1 or 2 allowed values
  switch (this.allowedValues.length) {
    /* eslint-disable no-fallthrough */
    case 1:
      this.allowedValues[1] = null;
    /* fall-through */
    case 2:
      var isFirstAllowedVal = this.allowedValues.indexOf(parameter.value) === 0 || this.allowedValues.map(_util.normaliseYesNo).indexOf((0, _util.normaliseYesNo)(parameter.value)) === 0;
      var isSecondAllowedVal = this.allowedValues.indexOf(parameter.value || null) === 1 || this.allowedValues.map(_util.normaliseYesNo).indexOf(parameter.value ? (0, _util.normaliseYesNo)(parameter.value) : null) === 1;
      var isIndeterminate = !isFirstAllowedVal && !isSecondAllowedVal;
      this.checkbox = new OO.ui.CheckboxInputWidget({
        selected: isIndeterminate ? undefined : isFirstAllowedVal,
        indeterminate: isIndeterminate ? true : undefined,
        $element: $("<label style='margin:0 0 0 5px'>")
      });
      break;
    default:
    // No checkbox
  } /* eslint-enable no-fallthrough */

  /* --- EDIT PARAMETER LAYOUT --- */

  this.input = new OO.ui.ComboBoxInputWidget({
    value: this.value,
    // label: parameter.name + " =",
    // labelPosition: "before",
    options: (0, _util.filterAndMap)(this.allowedValues, function (val) {
      return val !== null;
    }, function (val) {
      return {
        data: val,
        label: val
      };
    }),
    $element: $("<div style='margin-bottom:0;'>"),
    $overlay: this.$overlay
  });
  // Reduce the excessive whitespace/height
  this.input.$element.find("input").css({
    "padding-top": 0,
    "padding-bottom": "2px",
    "height": "24px"
  });
  // Fix label positioning within the reduced height
  this.input.$element.find("span.oo-ui-labelElement-label").css({
    "line-height": "normal"
  });
  // Also reduce height of dropdown button (if options are present)
  this.input.$element.find("a.oo-ui-buttonElement-button").css({
    "padding-top": 0,
    "height": "24px",
    "min-height": "0"
  });
  this.confirmButton = new OO.ui.ButtonWidget({
    icon: "check",
    label: "Done",
    framed: false,
    flags: "progressive",
    $element: $("<span style='margin-right:0'>")
  });
  this.cancelButton = new OO.ui.ButtonWidget({
    icon: "undo",
    label: "Cancel",
    framed: false
  });
  this.deleteButton = new OO.ui.ButtonWidget({
    icon: this.isRequired ? "restore" : "trash",
    label: this.isRequired ? "Required parameter" : "Delete",
    framed: false,
    flags: "destructive",
    disabled: this.isRequired
  });
  this.editButtonControls = new OO.ui.ButtonGroupWidget({
    items: [this.confirmButton, this.cancelButton, this.deleteButton],
    $element: $("<span style='font-size:92%'>")
  });
  this.editButtonControls.$element.find("a span:first-child").css({
    "min-width": "unset",
    "width": "16px",
    "margin-right": 0
  });
  this.editLayoutControls = new _HorizontalLayoutWidget["default"]({
    items: [this.input, this.editButtonControls]
    //$element: $("<div style='width: 48%;margin:0;'>")
  });
  this.editLayout = new OO.ui.FieldLayout(this.editLayoutControls, {
    label: this.name + " =",
    align: "top",
    help: this.paramData.description && this.paramData.description.en || false,
    helpInline: true
  }).toggle();
  this.editLayout.$element.find("label.oo-ui-inline-help").css({
    "margin": "-10px 0 5px 10px"
  });

  /* --- READ (COLLAPSED) DISPLAY OF PARAMETER --- */

  this.invalidIcon = new OO.ui.IconWidget({
    icon: "block",
    title: "Invalid parameter: no value specified!",
    flags: "destructive",
    $element: $("<span style='margin: 0 5px 0 -5px; min-width: 16px; width: 16px;'>")
  }).toggle(this.isInvalid);
  this.fullLabel = new OO.ui.LabelWidget({
    label: this.name + (this.value ? " = " + this.value : " "),
    $element: $("<label style='margin: 0;'>")
  });
  this.autofilledIcon = new OO.ui.IconWidget({
    icon: "robot",
    title: "Autofilled by Rater",
    flags: "progressive",
    $element: $("<span style='margin: 0 -5px 0 5px;min-width: 16px;width: 16px;'>")
  }).toggle(this.autofilled);
  this.editButton = new OO.ui.ButtonWidget({
    icon: "edit",
    framed: false,
    $element: $("<span style='margin-bottom: 0;'>")
  });
  this.editButton.$element.find("a").css({
    "border-radius": "0 10px 10px 0",
    "margin-left": "5px"
  });
  this.editButton.$element.find("a span").first().css({
    "min-width": "unset",
    "width": "16px"
  });
  this.readLayout = new OO.ui.HorizontalLayout({
    items: [this.invalidIcon, this.fullLabel, this.autofilledIcon, this.editButton],
    $element: $("<span style='margin:0;width:unset;'>")
  });
  if (this.checkbox) {
    this.readLayout.addItems([this.checkbox], 2);
  }

  /* --- CONTAINER FOR BOTH LAYOUTS --- */
  this.$element = $("<div>").addClass("rater-parameterWidget").css({
    "width": "unset",
    "display": "inline-block",
    "border": this.autofilled ? "1px dashed #36c" : "1px solid #ddd",
    "border-radius": "10px",
    "padding-left": "10px",
    "margin": "0 8px 8px 0",
    "background": this.isInvalid ? "#fddd" : "#fffe"
  }).append(this.readLayout.$element, this.editLayout.$element);
  this.editButton.connect(this, {
    "click": "onEditClick"
  });
  this.confirmButton.connect(this, {
    "click": "onConfirmClick"
  });
  this.cancelButton.connect(this, {
    "click": "onCancelClick"
  });
  this.deleteButton.connect(this, {
    "click": "onDeleteClick"
  });
  if (this.checkbox) {
    this.checkbox.connect(this, {
      "change": "onCheckboxChange"
    });
  }
}
OO.inheritClass(ParameterWidget, OO.ui.Widget);
ParameterWidget.prototype.onUpdatedSize = function () {
  // Emit an "updatedSize" event so the parent window can update size, if needed
  this.emit("updatedSize");
};
ParameterWidget.prototype.onEditClick = function () {
  this.readLayout.toggle(false);
  this.editLayout.toggle(true);
  this.$element.css({
    "background": "#fffe"
  });
  this.input.focus();
  this.onUpdatedSize();
};
ParameterWidget.prototype.onConfirmClick = function () {
  this.setValue(this.input.getValue());
  this.readLayout.toggle(true);
  this.editLayout.toggle(false);
  this.onUpdatedSize();
};
ParameterWidget.prototype.onCancelClick = function () {
  this.input.setValue(this.value);
  this.readLayout.toggle(true);
  this.editLayout.toggle(false);
  this.onUpdatedSize();
};
ParameterWidget.prototype.onDeleteClick = function () {
  this["delete"]();
};
ParameterWidget.prototype.onCheckboxChange = function (isSelected, isIndeterminate) {
  if (isIndeterminate) {
    return;
  }
  if (isSelected) {
    this.setValue(this.allowedValues[0]);
  } else {
    this.setValue(this.allowedValues[1]);
  }
};
ParameterWidget.prototype["delete"] = function () {
  this.emit("delete");
};
ParameterWidget.prototype.setValue = function (val) {
  // Turn off autofill stylings/icon
  this.autofilled = false;
  this.autofilledIcon.toggle(false);
  this.$element.css({
    "border": "1px solid #ddd"
  });

  // Update the stored value
  this.value = val;

  // Update the input value for edit mode
  this.input.setValue(this.value);

  // Update validity
  this.isInvalid = this.value == null;
  this.invalidIcon.toggle(this.isInvalid);
  this.$element.css({
    "background": this.isInvalid ? "#fddd" : "#fffe"
  });

  // Updated the label for read mode
  this.fullLabel.setLabel(this.name + (this.value ? " = " + this.value : ""));

  // Update the checkbox (if there is one)
  if (this.checkbox) {
    var isFirstAllowedVal = this.allowedValues.indexOf(val) === 0 || this.allowedValues.map(_util.normaliseYesNo).indexOf((0, _util.normaliseYesNo)(val)) === 0;
    var isSecondAllowedVal = this.allowedValues.indexOf(val || null) === 1 || this.allowedValues.map(_util.normaliseYesNo).indexOf(val ? (0, _util.normaliseYesNo)(val) : null) === 1;
    var isIndeterminate = !isFirstAllowedVal && !isSecondAllowedVal;
    this.checkbox.setIndeterminate(isIndeterminate, true);
    if (!isIndeterminate) {
      var isSelected = isFirstAllowedVal;
      this.checkbox.setSelected(isSelected, true);
    }
  }

  // Emit a change event
  this.emit("change");
};
ParameterWidget.prototype.setAutofilled = function () {
  this.autofilled = true;
  this.autofilledIcon.toggle(true);
  this.$element.css({
    "border": "1px dashed #36c"
  });
};
ParameterWidget.prototype.makeWikitext = function (pipeStyle, equalsStyle) {
  if (this.isInvalid) {
    return "";
  }
  return pipeStyle + this.name + equalsStyle + (this.value || "");
};
ParameterWidget.prototype.focusInput = function () {
  return this.input.focus();
};
var _default = ParameterWidget; // </nowiki>
exports["default"] = _default;

},{"../../util":23,"./HorizontalLayoutWidget":7}],10:[function(require,module,exports){
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports["default"] = void 0;
var _config = _interopRequireDefault(require("../../config"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
// <nowiki>

function PrefsFormWidget(config) {
  // Configuration initialization
  config = config || {};
  // Call parent constructor
  PrefsFormWidget["super"].call(this, config);
  this.$element.addClass("rater-prefsFormWidget");
  this.layout = new OO.ui.FieldsetLayout({
    label: "Preferences",
    $element: this.$element
  });
  this.preferences = {
    "autostart": {
      input: new OO.ui.ToggleSwitchWidget(),
      label: "Autostart Rater"
    },
    "autostartRedirects": {
      input: new OO.ui.ToggleSwitchWidget(),
      label: "Autostart on redirects"
    },
    "autostartNamespaces": {
      input: new mw.widgets.NamespacesMultiselectWidget(),
      label: "Autostart in these namespaces"
    },
    "bypassRedirects": {
      input: new OO.ui.ToggleSwitchWidget(),
      label: "Bypass redirects to banners"
    },
    "autofillClassFromOthers": {
      input: new OO.ui.ToggleSwitchWidget(),
      label: "Autofill class from other banners"
    },
    "autofillClassFromOres": {
      input: new OO.ui.ToggleSwitchWidget(),
      label: "Autofill class based on ORES prediction"
    },
    "autofillImportance": {
      input: new OO.ui.ToggleSwitchWidget(),
      label: "Autofill low importance"
    },
    "collapseParamsLowerLimit": {
      input: new OO.ui.NumberInputWidget({
        "min": 1
      }),
      label: "Minimum number of parameters to show uncollapsed"
    },
    "watchlist": {
      input: new OO.ui.ButtonSelectWidget({
        items: [new OO.ui.ButtonOptionWidget({
          data: "preferences",
          label: "Default",
          title: "Uses the same setting as if you manually edited the page, as per Special:Preferences"
        }), new OO.ui.ButtonOptionWidget({
          data: "watch",
          label: "Always",
          title: "Always add pages Rater edits to your watchlist"
        }), new OO.ui.ButtonOptionWidget({
          data: "nochange",
          label: "Never",
          title: "Never add pages Rater edit to your watchlist"
        })]
      }).selectItemByData("preferences"),
      label: "Add edited pages to watchlist"
    },
    "resetCache": {
      input: new OO.ui.ButtonWidget({
        label: "Reset cache",
        title: "Remove cached data, including list of WikiProjects and template parameters",
        flags: ["destructive"]
      })
    }
  };
  for (var prefName in this.preferences) {
    this.layout.addItems([new OO.ui.FieldLayout(this.preferences[prefName].input, {
      label: this.preferences[prefName].label,
      align: "right"
    })]);
  }
  this.preferences.resetCache.input.connect(this, {
    "click": "onResetCacheClick"
  });
}
OO.inheritClass(PrefsFormWidget, OO.ui.Widget);
PrefsFormWidget.prototype.setPrefValues = function (prefs) {
  var _this = this;
  var _loop = function _loop(prefName) {
    var value = prefs[prefName];
    var input = _this.preferences[prefName] && _this.preferences[prefName].input;
    switch (input && input.constructor.name) {
      case "OoUiButtonSelectWidget":
        input.selectItemByData(value);
        break;
      case "OoUiNumberInputWidget":
      case "OoUiToggleSwitchWidget":
        input.setValue(value);
        break;
      case "MwWidgetsNamespacesMultiselectWidget":
        input.clearItems();
        value.forEach(function (ns) {
          return input.addTag(ns.toString(), ns === 0 ? "(Main)" : _config["default"].mw.wgFormattedNamespaces[ns]);
        });
        break;
    }
  };
  for (var prefName in prefs) {
    _loop(prefName);
  }
};
PrefsFormWidget.prototype.getPrefs = function () {
  var prefs = {};
  for (var prefName in this.preferences) {
    var input = this.preferences[prefName].input;
    var value = void 0;
    switch (input.constructor.name) {
      case "OoUiButtonSelectWidget":
        value = input.findSelectedItem().getData();
        break;
      case "OoUiToggleSwitchWidget":
        value = input.getValue();
        break;
      case "OoUiNumberInputWidget":
        value = Number(input.getValue()); // widget uses strings, not numbers!
        break;
      case "MwWidgetsNamespacesMultiselectWidget":
        value = input.getValue().map(Number); // widget uses strings, not numbers!
        break;
    }
    prefs[prefName] = value;
  }
  return prefs;
};
PrefsFormWidget.prototype.onResetCacheClick = function () {
  var _this2 = this;
  OO.ui.confirm("After reseting cache, Rater will close and restart. Any changes made will be discarded.").then(function (confirmed) {
    if (confirmed) {
      _this2.emit("resetCache");
    }
  });
};
var _default = PrefsFormWidget; // </nowiki>
exports["default"] = _default;

},{"../../config":18}],11:[function(require,module,exports){
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports["default"] = void 0;
// <nowiki>

var SuggestionLookupTextInputWidget = function SuggestionLookupTextInputWidget(config) {
  OO.ui.TextInputWidget.call(this, config);
  OO.ui.mixin.LookupElement.call(this, config);
  this.suggestions = Array.isArray(config.suggestions) ? config.suggestions : [];
  this.$element.addClass("rater-suggestionLookupTextInputWidget");
};
OO.inheritClass(SuggestionLookupTextInputWidget, OO.ui.TextInputWidget);
OO.mixinClass(SuggestionLookupTextInputWidget, OO.ui.mixin.LookupElement);

// Set suggestion. param: Object[] with objects of the form { data: ... , label: ... }
SuggestionLookupTextInputWidget.prototype.setSuggestions = function (suggestions) {
  if (!Array.isArray(suggestions)) {
    if (suggestions != null) {
      console.warn("[Rater] SuggestionLookupTextInputWidget.prototype.setSuggestions called with a non-array value:", suggestions);
    }
    return;
  }
  this.suggestions = suggestions;
};

// Returns data, as a resolution to a promise, to be passed to #getLookupMenuOptionsFromData
SuggestionLookupTextInputWidget.prototype.getLookupRequest = function () {
  var deferred = $.Deferred().resolve(new RegExp("\\b" + mw.util.escapeRegExp(this.getValue()), "i"));
  return deferred.promise({
    abort: function abort() {}
  });
};

// ???
SuggestionLookupTextInputWidget.prototype.getLookupCacheDataFromResponse = function (response) {
  return response || [];
};

// Is passed data from #getLookupRequest, returns an array of menu item widgets 
SuggestionLookupTextInputWidget.prototype.getLookupMenuOptionsFromData = function (pattern) {
  var labelMatchesInputVal = function labelMatchesInputVal(suggestionItem) {
    return pattern.test(suggestionItem.label) || !suggestionItem.label && pattern.test(suggestionItem.data);
  };
  var makeMenuOptionWidget = function makeMenuOptionWidget(optionItem) {
    return new OO.ui.MenuOptionWidget({
      data: optionItem.data,
      label: optionItem.label || optionItem.data
    });
  };
  return this.suggestions.filter(labelMatchesInputVal).map(makeMenuOptionWidget);
};

// Extend onLookupMenuChoose method to emit an choose event
SuggestionLookupTextInputWidget.prototype.onLookupMenuChoose = function (item) {
  // Get data
  var itemData = item.getData();
  // Simplify item data if it is an object with a name property
  if (itemData && itemData.name) {
    item.setData(itemData.name);
  }
  // First blur the input, to prevent the menu popping back up
  this.$input.blur();
  OO.ui.mixin.LookupElement.prototype.onLookupMenuChoose.call(this, item);
  this.emit("choose", itemData);
};
var _default = SuggestionLookupTextInputWidget; // </nowiki>
exports["default"] = _default;

},{}],12:[function(require,module,exports){
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports["default"] = void 0;
var _config = _interopRequireDefault(require("../../config"));
var _SuggestionLookupTextInputWidget = _interopRequireDefault(require("./SuggestionLookupTextInputWidget"));
var _getBanners = require("../../getBanners");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(n); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); }
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
// <nowiki>

function TopBarWidget(config) {
  var _this = this;
  // Configuration initialization
  config = $.extend({
    expanded: false,
    framed: false,
    padded: false
  }, config || {});
  // Call parent constructor
  TopBarWidget["super"].call(this, config);
  this.$overlay = config.$overlay;

  // Search box
  this.searchBox = new _SuggestionLookupTextInputWidget["default"]({
    placeholder: "Add a WikiProject...",
    $element: $("<div style='display:inline-block; margin:0 -1px; width:calc(100% - 55px);'>"),
    $overlay: this.$overlay
  });
  (0, _getBanners.getBannerNames)().then(function (banners) {
    return [].concat(_toConsumableArray(banners.withRatings.map(function (bannerName) {
      return {
        label: bannerName.replace("WikiProject ", ""),
        data: {
          name: bannerName
        }
      };
    })), _toConsumableArray(banners.withoutRatings.map(function (bannerName) {
      return {
        label: bannerName.replace("WikiProject ", ""),
        data: {
          name: bannerName,
          withoutRatings: true
        }
      };
    })), _toConsumableArray(banners.wrappers.map(function (bannerName) {
      return {
        label: bannerName.replace("WikiProject ", "") + " [template wrapper]",
        data: {
          name: bannerName,
          wrapper: true
        }
      };
    })), _toConsumableArray(banners.notWPBM.map(function (bannerName) {
      return {
        label: bannerName.replace("WikiProject ", ""),
        data: {
          name: bannerName
        }
      };
    })), _toConsumableArray(banners.inactive.map(function (bannerName) {
      return {
        label: bannerName.replace("WikiProject ", "") + " [inactive]",
        data: {
          name: bannerName,
          withoutRatings: true
        }
      };
    })), _toConsumableArray(banners.wir.map(function (bannerName) {
      return {
        label: bannerName + " [Women In Red meetup/initiative]",
        data: {
          name: bannerName,
          withoutRatings: true
        }
      };
    })));
  }).then(function (bannerOptions) {
    return _this.searchBox.setSuggestions(bannerOptions);
  });

  // Add button
  this.addBannerButton = new OO.ui.ButtonWidget({
    icon: "add",
    title: "Add",
    flags: "progressive",
    $element: $("<span style='float:right;margin: 0;transform: translateX(-12px);'>")
  });
  var $searchContainer = $("<div style='display:inline-block; flex-shrink:1; flex-grow:100; min-width:250px; width:50%;'>").append(this.searchBox.$element, this.addBannerButton.$element);

  // Set all classes/importances
  // in the style of a popup button with a menu (is actually a dropdown with a hidden label, because that makes the coding easier.)
  this.setAllDropDown = new OO.ui.DropdownWidget({
    icon: "tag",
    label: "Set all...",
    invisibleLabel: true,
    menu: {
      items: [new OO.ui.MenuSectionOptionWidget({
        label: "Classes"
      }), new OO.ui.MenuOptionWidget({
        data: {
          "class": null
        },
        label: new OO.ui.HtmlSnippet("<span style=\"color:#777\">(no class)</span>")
      })].concat(_toConsumableArray(_config["default"].bannerDefaults.classes.map(function (classname) {
        return new OO.ui.MenuOptionWidget({
          data: {
            "class": classname
          },
          label: classname
        });
      })), [new OO.ui.MenuSectionOptionWidget({
        label: "Importances"
      }), new OO.ui.MenuOptionWidget({
        data: {
          importance: null
        },
        label: new OO.ui.HtmlSnippet("<span style=\"color:#777\">(no importance)</span>")
      })], _toConsumableArray(_config["default"].bannerDefaults.importances.map(function (importance) {
        return new OO.ui.MenuOptionWidget({
          data: {
            importance: importance
          },
          label: importance
        });
      })))
    },
    $element: $("<span style=\"width:auto;display:inline-block;float:left;margin:0\" title='Set all...'>"),
    $overlay: this.$overlay
  });

  // Remove all banners button
  this.removeAllButton = new OO.ui.ButtonWidget({
    icon: "trash",
    title: "Remove all",
    flags: "destructive"
  });

  // Clear all parameters button
  this.clearAllButton = new OO.ui.ButtonWidget({
    icon: "cancel",
    title: "Clear all",
    flags: "destructive"
  });

  // Group the buttons together
  this.menuButtons = new OO.ui.ButtonGroupWidget({
    items: [this.removeAllButton, this.clearAllButton],
    $element: $("<span style='flex:1 0 auto;'>")
  });
  // Include the dropdown in the group
  this.menuButtons.$element.prepend(this.setAllDropDown.$element);

  // Put everything into a layout
  this.$element.addClass("rater-topBarWidget").css({
    "position": "fixed",
    "width": "100%",
    "background": "#ccc",
    "display": "flex",
    "flex-wrap": "wrap",
    "justify-content": "space-around",
    "margin": "-2px 0 0 0"
  }).append($searchContainer, this.menuButtons.$element);

  /* --- Event handling --- */

  this.searchBox.connect(this, {
    "enter": "onSearchSelect",
    "choose": "onSearchSelect"
  });
  this.addBannerButton.connect(this, {
    "click": "onSearchSelect"
  });
  this.setAllDropDown.getMenu().connect(this, {
    "choose": "onRatingChoose"
  });
  this.removeAllButton.connect(this, {
    "click": "onRemoveAllClick"
  });
  this.clearAllButton.connect(this, {
    "click": "onClearAllClick"
  });
}
OO.inheritClass(TopBarWidget, OO.ui.PanelLayout);
TopBarWidget.prototype.onSearchSelect = function (data) {
  this.emit("searchSelect", data);
};
TopBarWidget.prototype.onRatingChoose = function (item) {
  var data = item.getData();
  if (data["class"] || data["class"] === null) {
    this.emit("setClasses", data["class"]);
  }
  if (data.importance || data.importance === null) {
    this.emit("setImportances", data.importance);
  }
};
TopBarWidget.prototype.onRemoveAllClick = function () {
  this.emit("removeAll");
};
TopBarWidget.prototype.onClearAllClick = function () {
  this.emit("clearAll");
};
TopBarWidget.prototype.setDisabled = function (disable) {
  [this.searchBox, this.addBannerButton, this.setAllDropDown, this.removeAllButton, this.clearAllButton].forEach(function (widget) {
    return widget.setDisabled(disable);
  });
};
var _default = TopBarWidget; // </nowiki>
exports["default"] = _default;

},{"../../config":18,"../../getBanners":20,"./SuggestionLookupTextInputWidget":11}],13:[function(require,module,exports){
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports["default"] = void 0;
var _api = require("../api");
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(n); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); }
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
// <nowiki>

/* var incrementProgressByInterval = function() {
	var incrementIntervalDelay = 100;
	var incrementIntervalAmount = 0.1;
	var incrementIntervalMaxval = 98;
	return window.setInterval(
		incrementProgress,
		incrementIntervalDelay,
		incrementIntervalAmount,
		incrementIntervalMaxval
	);
}; */

var LoadDialog = function LoadDialog(config) {
  LoadDialog["super"].call(this, config);
};
OO.inheritClass(LoadDialog, OO.ui.Dialog);
LoadDialog["static"].name = "loadDialog";
LoadDialog["static"].title = "Loading Rater...";

// Customize the initialize() function: This is where to add content to the dialog body and set up event handlers.
LoadDialog.prototype.initialize = function () {
  var _this$content$$elemen;
  // Call the parent method.
  LoadDialog["super"].prototype.initialize.call(this);
  // Create a layout
  this.content = new OO.ui.PanelLayout({
    padded: true,
    expanded: false
  });
  // Create content
  this.progressBar = new OO.ui.ProgressBarWidget({
    progress: 1
  });
  this.setuptasks = [new OO.ui.LabelWidget({
    label: "Loading your Rater preferences...",
    $element: $("<p style=\"display:block\">")
  }), new OO.ui.LabelWidget({
    label: "Loading list of project banners...",
    $element: $("<p style=\"display:block\">")
  }), new OO.ui.LabelWidget({
    label: "Loading talkpage wikitext...",
    $element: $("<p style=\"display:block\">")
  }), new OO.ui.LabelWidget({
    label: "Parsing talkpage templates...",
    $element: $("<p style=\"display:block\">")
  }), new OO.ui.LabelWidget({
    label: "Getting templates' parameter data...",
    $element: $("<p style=\"display:block\">")
  }), new OO.ui.LabelWidget({
    label: "Checking subject page...",
    $element: $("<p style=\"display:block\">")
  }), new OO.ui.LabelWidget({
    label: "Retrieving quality prediction...",
    $element: $("<p style=\"display:block\">")
  }).toggle()];
  this.closeButton = new OO.ui.ButtonWidget({
    label: "Close"
  }).toggle();
  this.setupPromises = [];

  // Append content to layout
  (_this$content$$elemen = this.content.$element).append.apply(_this$content$$elemen, [this.progressBar.$element, new OO.ui.LabelWidget({
    label: "Initialising:",
    $element: $("<strong style=\"display:block\">")
  }).$element].concat(_toConsumableArray(this.setuptasks.map(function (widget) {
    return widget.$element;
  })), [this.closeButton.$element]));

  // Append layout to dialog
  this.$body.append(this.content.$element);

  // Connect events to handlers
  this.closeButton.connect(this, {
    "click": "onCloseButtonClick"
  });
};
LoadDialog.prototype.onCloseButtonClick = function () {
  // Close this dialog, without passing any data
  this.close();
};

// Override the getBodyHeight() method to specify a custom height (or don't to use the automatically generated height).
LoadDialog.prototype.getBodyHeight = function () {
  return this.content.$element.outerHeight(true);
};
LoadDialog.prototype.incrementProgress = function (amount, maximum) {
  var priorProgress = this.progressBar.getProgress();
  var incrementedProgress = Math.min(maximum || 100, priorProgress + amount);
  this.progressBar.setProgress(incrementedProgress);
};
LoadDialog.prototype.addTaskPromiseHandlers = function (taskPromises) {
  var _this = this;
  var onTaskDone = function onTaskDone(index) {
    // Add "Done!" to label
    var widget = _this.setuptasks[index];
    widget.setLabel(widget.getLabel() + " Done!");
    // Increment status bar. Show a smooth transition by
    // using small steps over a short duration.
    var totalIncrement = 100 / _this.setuptasks.length; // percent
    var totalTime = 400; // milliseconds
    var totalSteps = 10;
    var incrementPerStep = totalIncrement / totalSteps;
    for (var step = 0; step < totalSteps; step++) {
      window.setTimeout(_this.incrementProgress.bind(_this), totalTime * step / totalSteps, incrementPerStep);
    }
  };
  var onTaskError = function onTaskError(index, code, info) {
    var widget = _this.setuptasks[index];
    widget.setLabel(widget.getLabel() + " Failed. " + (0, _api.makeErrorMsg)(code, info));
    _this.closeButton.toggle(true);
    _this.updateSize();
  };
  taskPromises.forEach(function (promise, index) {
    promise.then(function () {
      return onTaskDone(index);
    }, function (code, info) {
      return onTaskError(index, code, info);
    });
  });
};

// Use getSetupProcess() to set up the window with data passed to it at the time 
// of opening
LoadDialog.prototype.getSetupProcess = function (data) {
  var _this2 = this;
  data = data || {};
  return LoadDialog["super"].prototype.getSetupProcess.call(this, data).next(function () {
    var showOresTask = !!data.ores;
    _this2.setuptasks[6].toggle(showOresTask);
    var taskPromises = data.ores ? data.promises : data.promises.slice(0, -1);
    data.isOpened.then(function () {
      return _this2.addTaskPromiseHandlers(taskPromises);
    });
  }, this);
};

// Prevent window from closing too quickly, using getHoldProcess()
LoadDialog.prototype.getHoldProcess = function (data) {
  data = data || {};
  if (data.success) {
    // Wait a bit before processing the close, which happens automatically
    return LoadDialog["super"].prototype.getHoldProcess.call(this, data).next(800);
  }
  // No need to wait if closed manually
  return LoadDialog["super"].prototype.getHoldProcess.call(this, data);
};

// Use the getTeardownProcess() method to perform actions whenever the dialog is closed. 
LoadDialog.prototype.getTeardownProcess = function (data) {
  var _this3 = this;
  return LoadDialog["super"].prototype.getTeardownProcess.call(this, data).first(function () {
    // Perform cleanup: reset labels
    _this3.setuptasks.forEach(function (setuptask) {
      var currentLabel = setuptask.getLabel();
      setuptask.setLabel(currentLabel.slice(0, currentLabel.indexOf("...") + 3));
    });
  }, this);
};
var _default = LoadDialog; // </nowiki>
exports["default"] = _default;

},{"../api":15}],14:[function(require,module,exports){
"use strict";

function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
Object.defineProperty(exports, "__esModule", {
  value: true
});
exports["default"] = void 0;
var _BannerWidget = _interopRequireDefault(require("./Components/BannerWidget"));
var _BannerListWidget = _interopRequireDefault(require("./Components/BannerListWidget"));
var _config = _interopRequireDefault(require("../config"));
var _api = _interopRequireWildcard(require("../api"));
var _PrefsFormWidget = _interopRequireDefault(require("./Components/PrefsFormWidget"));
var _prefs = require("../prefs");
var _Template = require("../Template");
var _TopBarWidget = _interopRequireDefault(require("./Components/TopBarWidget"));
var _util = require("../util");
var cache = _interopRequireWildcard(require("../cache"));
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; }
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
// <nowiki>

function MainWindow(config) {
  MainWindow["super"].call(this, config);
}
OO.inheritClass(MainWindow, OO.ui.ProcessDialog);
MainWindow["static"].name = "main";
MainWindow["static"].title = $("<span>").css({
  "font-weight": "normal"
}).append($("<a>").css({
  "font-weight": "bold"
}).attr({
  "href": mw.util.getUrl("WP:RATER"),
  "target": "_blank"
}).text("Rater"), " (", $("<a>").attr({
  "href": mw.util.getUrl("WT:RATER"),
  "target": "_blank"
}).text("talk"), ") ", $("<span>").css({
  "font-size": "90%"
}).text("v" + _config["default"].script.version));
MainWindow["static"].size = "large";
MainWindow["static"].actions = [
// Primary (top right):
{
  label: "X",
  // not using an icon since color becomes inverted, i.e. white on light-grey
  title: "Close (and discard any changes)",
  flags: "primary",
  modes: ["edit", "diff", "preview"] // available when current mode isn't "prefs"
},
// Safe (top left)
{
  action: "showPrefs",
  flags: "safe",
  icon: "settings",
  title: "Preferences",
  modes: ["edit", "diff", "preview"] // available when current mode isn't "prefs"
},
// Others (bottom)
{
  action: "save",
  accessKey: "s",
  label: new OO.ui.HtmlSnippet("<span style='padding:0 1em;'>Save</span>"),
  flags: ["primary", "progressive"],
  modes: ["edit", "diff", "preview"] // available when current mode isn't "prefs"
}, {
  action: "preview",
  accessKey: "p",
  label: "Show preview",
  modes: ["edit", "diff"] // available when current mode isn't "preview" or "prefs"
}, {
  action: "changes",
  accessKey: "v",
  label: "Show changes",
  modes: ["edit", "preview"] // available when current mode isn't "diff" or "prefs"
}, {
  action: "back",
  label: "Back",
  modes: ["diff", "preview"] // available when current mode is "diff" or "prefs"
},
// "prefs" mode only
{
  action: "savePrefs",
  label: "Update",
  flags: ["primary", "progressive"],
  modes: "prefs"
}, {
  action: "closePrefs",
  label: "Cancel",
  flags: "safe",
  modes: "prefs"
}];

// Customize the initialize() function: This is where to add content to the dialog body and set up event handlers.
MainWindow.prototype.initialize = function () {
  // Call the parent method.
  MainWindow["super"].prototype.initialize.call(this);

  /* --- PREFS --- */
  this.preferences = _config["default"].defaultPrefs;

  /* --- TOP BAR --- */
  this.topBar = new _TopBarWidget["default"]({
    $overlay: this.$overlay
  });
  this.$head.css({
    "height": "73px"
  }).append(this.topBar.$element);

  /* --- FOOTER --- */
  this.oresLabel = new OO.ui.LabelWidget({
    $element: $("<span style='float:right; padding: 10px; max-width: 50%; text-align: center;'>"),
    label: $("<span>").append($("<a>").attr({
      "href": mw.util.getUrl("mw:ORES"),
      "target": "_blank"
    }).append($("<img>").css({
      "vertical-align": "text-bottom;"
    }).attr({
      "src": "//upload.wikimedia.org/wikipedia/commons/thumb/5/51/Objective_Revision_Evaluation_Service_logo.svg/40px-Objective_Revision_Evaluation_Service_logo.svg.png",
      "title": "Machine predicted quality from ORES",
      "alt": "ORES logo",
      "width": "20px",
      "height": "20px"
    })), " ", $("<span class='oresPrediction'>"))
  }).toggle(false);
  this.pagetypeLabel = new OO.ui.LabelWidget({
    $element: $("<span style='float:right; padding: 10px; max-width: 33.33%; text-align: center;'>")
  }).toggle(false);
  this.$foot.prepend(this.oresLabel.$element, this.pagetypeLabel.$element);

  /* --- CONTENT AREA --- */

  // Banners added dynamically upon opening, so just need a layout with an empty list
  this.bannerList = new _BannerListWidget["default"]({
    preferences: this.preferences
  });
  this.editLayout = new OO.ui.PanelLayout({
    padded: false,
    expanded: false,
    $content: this.bannerList.$element
  });

  // Preferences, filled in with current prefs upon loading.
  // TODO: Make this into a component, add fields and inputs
  this.prefsForm = new _PrefsFormWidget["default"]();
  this.prefsLayout = new OO.ui.PanelLayout({
    padded: true,
    expanded: false,
    $content: this.prefsForm.$element
  });

  // Preview, Show changes
  this.parsedContentContainer = new OO.ui.FieldsetLayout({
    label: "Preview"
  });
  this.parsedContentWidget = new OO.ui.LabelWidget({
    label: "",
    $element: $("<div>")
  });
  this.parsedContentContainer.addItems([new OO.ui.FieldLayout(this.parsedContentWidget, {
    align: "top"
  })]);
  this.parsedContentLayout = new OO.ui.PanelLayout({
    padded: true,
    expanded: false,
    $content: this.parsedContentContainer.$element
  });
  this.contentArea = new OO.ui.StackLayout({
    items: [this.editLayout, this.prefsLayout, this.parsedContentLayout],
    padded: false,
    expanded: false
  });
  this.$body.css({
    "top": "73px"
  }).append(this.contentArea.$element);

  /* --- EVENT HANDLING --- */

  this.topBar.connect(this, {
    "searchSelect": "onSearchSelect",
    "setClasses": "onSetClasses",
    "setImportances": "onSetImportances",
    "removeAll": "onRemoveAll",
    "clearAll": "onClearAll"
  });
  this.bannerList.connect(this, {
    "updatedSize": "onBannerListUpdateSize"
  });

  // Handle certain keyboard events. Requires something in the Rater window to be focused,
  // so add a tabindex to the body and it's parent container.
  this.$body.attr("tabindex", "999").parent().attr("tabindex", "999").keydown(function (event) {
    var scrollAmount;
    switch (event.which) {
      case 33:
        // page up
        scrollAmount = this.$body.scrollTop() - this.$body.height() * 0.9;
        break;
      case 34:
        // page down
        scrollAmount = this.$body.scrollTop() + this.$body.height() * 0.9;
        break;
      default:
        return;
    }
    this.$body.scrollTop(scrollAmount);
    event.preventDefault();
  }.bind(this));
  this.prefsForm.connect(this, {
    "resetCache": "onResetCache"
  });
};
MainWindow.prototype.onBannerListUpdateSize = function () {
  // Get the current scroll amount
  var scrollAmount = this.$body.scrollTop();
  // Update size (which resets the scroll to 0)
  this.updateSize();
  // Scroll to where it was before
  this.$body.scrollTop(scrollAmount);
};
MainWindow.prototype.makeDraggable = function () {
  var $frameEl = this.$element.find(".oo-ui-window-frame");
  var $handleEl = this.$element.find(".oo-ui-processDialog-location").css({
    "cursor": "move"
  });
  // Position for css translate transformations, relative to initial position
  // (which is centered on viewport when scrolled to top)
  var position = {
    x: 0,
    y: 0
  };
  var constrain = function constrain(val, minVal, maxVal) {
    if (val < minVal) return minVal;
    if (val > maxVal) return maxVal;
    return val;
  };
  var constrainX = function constrainX(val) {
    // Don't too far horizontally (leave at least 100px visible)
    var limit = window.innerWidth / 2 + $frameEl.outerWidth() / 2 - 100;
    return constrain(val, -1 * limit, limit);
  };
  var constrainY = function constrainY(val) {
    // Can't take title bar off the viewport, since it's the drag handle
    var minLimit = -1 * (window.innerHeight - $frameEl.outerHeight()) / 2;
    // Don't go too far down the page: (whole page height) - (initial position)
    var maxLimit = (document.documentElement || document).scrollHeight - window.innerHeight / 2;
    return constrain(val, minLimit, maxLimit);
  };
  var pointerdown = false;
  var dragFrom = {};
  var onDragStart = function onDragStart(event) {
    pointerdown = true;
    dragFrom.x = event.clientX;
    dragFrom.y = event.clientY;
  };
  var onDragMove = function onDragMove(event) {
    if (!pointerdown || dragFrom.x == null || dragFrom.y === null) {
      return;
    }
    var dx = event.clientX - dragFrom.x;
    var dy = event.clientY - dragFrom.y;
    dragFrom.x = event.clientX;
    dragFrom.y = event.clientY;
    position.x = constrainX(position.x + dx);
    position.y = constrainY(position.y + dy);
    $frameEl.css("transform", "translate(".concat(position.x, "px, ").concat(position.y, "px)"));
  };
  var onDragEnd = function onDragEnd() {
    pointerdown = false;
    delete dragFrom.x;
    delete dragFrom.y;
    // Make sure final positions are whole numbers
    position.x = Math.round(position.x);
    position.y = Math.round(position.y);
    $frameEl.css("transform", "translate(".concat(position.x, "px, ").concat(position.y, "px)"));
  };

  // Use pointer events if available; otherwise use mouse events
  var pointer = "PointerEvent" in window ? "pointer" : "mouse";
  $handleEl.on(pointer + "enter.raterMainWin", function () {
    return $frameEl.css("will-change", "transform");
  }); // Tell browser to optimise transform
  $handleEl.on(pointer + "leave.raterMainWin", function () {
    if (!pointerdown) $frameEl.css("will-change", "");
  }); // Remove optimisation if not dragging
  $handleEl.on(pointer + "down.raterMainWin", onDragStart);
  $("body").on(pointer + "move.raterMainWin", onDragMove);
  $("body").on(pointer + "up.raterMainWin", onDragEnd);
};

// Override the getBodyHeight() method to specify a custom height
MainWindow.prototype.getBodyHeight = function () {
  var currentlayout = this.contentArea.getCurrentItem();
  var layoutHeight = currentlayout && currentlayout.$element.outerHeight(true);
  var contentHeight = currentlayout && currentlayout.$element.children(":first-child").outerHeight(true);
  return Math.max(200, layoutHeight, contentHeight);
};

// Use getSetupProcess() to set up the window with data passed to it at the time 
// of opening
MainWindow.prototype.getSetupProcess = function (data) {
  var _this = this;
  data = data || {};
  return MainWindow["super"].prototype.getSetupProcess.call(this, data).next(function () {
    _this.makeDraggable();
    // Set up preferences
    _this.setPreferences(data.preferences);
    _this.prefsForm.setPrefValues(data.preferences);
    // Set subject page info
    _this.subjectPage = data.subjectPage;
    _this.pageInfo = {
      redirect: data.redirectTarget,
      isDisambig: data.disambig,
      hasStubtag: data.stubtag,
      isArticle: data.isArticle
    };
    // Set up edit mode banners
    _this.actions.setMode("edit");
    _this.bannerList.oresClass = data.isArticle && data.isList ? "List" : data.ores && data.ores.prediction;
    _this.bannerList.pageInfo = _this.pageInfo;
    _this.bannerList.addItems(data.banners.map(function (bannerTemplate) {
      return new _BannerWidget["default"](bannerTemplate, {
        preferences: _this.preferences,
        $overlay: _this.$overlay,
        isArticle: _this.pageInfo.isArticle
      });
    }));
    var shellTemplateBanner = _this.bannerList.items.find(function (banner) {
      return banner.isShellTemplate;
    });
    if (shellTemplateBanner && shellTemplateBanner.shellParam1Value) {
      shellTemplateBanner.nonStandardTemplates = _this.bannerList.items.reduce(function (bannersList, curBanner) {
        return bannersList.replace(curBanner.wikitext, "");
      }, shellTemplateBanner.shellParam1Value).trim().replace(/\n+/g, "\n");
    }
    _this.bannerList.addShellTemplateIfNeeeded().syncShellTemplateWithBiographyBanner();
    // Show page type, or ORES prediction, if available
    if (_this.pageInfo.redirect) {
      _this.pagetypeLabel.setLabel("Redirect page").toggle(true);
    } else if (_this.pageInfo.isDisambig) {
      _this.pagetypeLabel.setLabel("Disambiguation page").toggle(true);
    } else if (_this.pageInfo.isArticle && data.isGA) {
      _this.pagetypeLabel.setLabel("Good article").toggle(true);
    } else if (_this.pageInfo.isArticle && data.isFA) {
      _this.pagetypeLabel.setLabel("Featured article").toggle(true);
    } else if (_this.pageInfo.isArticle && data.isFL) {
      _this.pagetypeLabel.setLabel("Featured list").toggle(true);
    } else if (_this.pageInfo.isArticle && data.isList) {
      _this.pagetypeLabel.setLabel("List article").toggle(true);
    } else if (data.ores) {
      _this.oresClass = data.ores.prediction;
      _this.oresLabel.toggle(true).$element.find(".oresPrediction").append("Prediction: ", $("<strong>").text(data.ores.prediction), "&nbsp;(" + data.ores.probability + ")");
    } else if (_this.pageInfo.isArticle) {
      _this.pagetypeLabel.setLabel("Article page").toggle(true);
    } else {
      _this.pagetypeLabel.setLabel(_this.subjectPage.getNamespacePrefix().slice(0, -1) + " page").toggle(true);
    }
    // Set props for use in making wikitext and edit summaries
    _this.talkWikitext = data.talkWikitext;
    _this.existingBannerNames = data.banners.map(function (bannerTemplate) {
      return bannerTemplate.name;
    });
    _this.talkpage = data.talkpage;
    // Force a size update to ensure eveything fits okay
    _this.updateSize();
  }, this);
};

// Set up the window it is ready: attached to the DOM, and opening animation completed
MainWindow.prototype.getReadyProcess = function (data) {
  var _this2 = this;
  data = data || {};
  return MainWindow["super"].prototype.getReadyProcess.call(this, data).next(function () {
    return _this2.topBar.searchBox.focus();
  });
};

// Use the getActionProcess() method to do things when actions are clicked
MainWindow.prototype.getActionProcess = function (action) {
  var _this3 = this;
  if (action === "showPrefs") {
    this.actions.setMode("prefs");
    this.contentArea.setItem(this.prefsLayout);
    this.topBar.setDisabled(true);
    this.updateSize();
  } else if (action === "savePrefs") {
    var updatedPrefs = this.prefsForm.getPrefs();
    return new OO.ui.Process().next((0, _prefs.setPrefs)(updatedPrefs).then(
    // Success
    function () {
      _this3.setPreferences(updatedPrefs);
      _this3.actions.setMode("edit");
      _this3.contentArea.setItem(_this3.editLayout);
      _this3.topBar.setDisabled(false);
      _this3.updateSize();
    },
    // Failure
    function (code, err) {
      return $.Deferred().reject(new OO.ui.Error($("<div>").append($("<strong style='display:block;'>").text("Could not save preferences."), $("<span style='color:#777'>").text((0, _api.makeErrorMsg)(code, err)))));
    }));
  } else if (action === "clearCache") {
    return new OO.ui.Process().next(function () {
      cache.clearAllItems();
      _this3.close({
        restart: true
      });
    });
  } else if (action === "closePrefs") {
    this.actions.setMode("edit");
    this.contentArea.setItem(this.editLayout);
    this.topBar.setDisabled(false);
    this.prefsForm.setPrefValues(this.preferences);
    this.updateSize();
  } else if (action === "save") {
    return new OO.ui.Process().next(_api["default"].editWithRetry(this.talkpage.getPrefixedText(), {
      rvsection: 0
    }, function (revision) {
      return {
        section: 0,
        text: _this3.transformTalkWikitext(revision.content),
        summary: _this3.makeEditSummary(),
        watchlist: _this3.preferences.watchlist
      };
    })["catch"](function (code, err) {
      return $.Deferred().reject(new OO.ui.Error($("<div>").append($("<strong style='display:block;'>").text("Could not save your changes."), $("<span style='color:#777'>").text((0, _api.makeErrorMsg)(code, err)))));
    })).next(function () {
      return _this3.close({
        success: true,
        upgradedStub: _this3.pageInfo.hasStubtag && _this3.isRatedAndNotStub()
      });
    });
  } else if (action === "preview") {
    return new OO.ui.Process().next(_api["default"].post({
      action: "parse",
      contentmodel: "wikitext",
      text: this.transformTalkWikitext(this.talkWikitext) + "\n<hr>\n" + "'''Edit summary:''' " + this.makeEditSummary(),
      title: this.talkpage.getPrefixedText(),
      pst: 1
    }).then(function (result) {
      if (!result || !result.parse || !result.parse.text || !result.parse.text["*"]) {
        return $.Deferred().reject("Empty result");
      }
      var previewHtmlSnippet = new OO.ui.HtmlSnippet(result.parse.text["*"]);
      _this3.parsedContentWidget.setLabel(previewHtmlSnippet);
      _this3.parsedContentContainer.setLabel("Preview:");
      _this3.actions.setMode("preview");
      _this3.contentArea.setItem(_this3.parsedContentLayout);
      _this3.topBar.setDisabled(true);
      _this3.updateSize();
    })["catch"](function (code, err) {
      return $.Deferred().reject(new OO.ui.Error($("<div>").append($("<strong style='display:block;'>").text("Could not show changes."), $("<span style='color:#777'>").text((0, _api.makeErrorMsg)(code, err)))));
    }));
  } else if (action === "changes") {
    return new OO.ui.Process().next(_api["default"].post({
      action: "compare",
      format: "json",
      fromtext: this.talkWikitext,
      fromcontentmodel: "wikitext",
      totext: this.transformTalkWikitext(this.talkWikitext),
      tocontentmodel: "wikitext",
      prop: "diff"
    }).then(function (result) {
      if (!result || !result.compare || !result.compare["*"]) {
        return $.Deferred().reject("Empty result");
      }
      var $diff = $("<table>").addClass("diff").css("width", "100%").append($("<tr>").append($("<th>").attr({
        "colspan": "2",
        "scope": "col"
      }).css("width", "50%").text("Latest revision"), $("<th>").attr({
        "colspan": "2",
        "scope": "col"
      }).css("width", "50%").text("New text")), result.compare["*"], $("<tfoot>").append($("<tr>").append($("<td colspan='4'>").append($("<strong>").text("Edit summary: "), _this3.makeEditSummary()))));
      _this3.parsedContentWidget.setLabel($diff);
      _this3.parsedContentContainer.setLabel("Changes:");
      _this3.actions.setMode("diff");
      _this3.contentArea.setItem(_this3.parsedContentLayout);
      _this3.topBar.setDisabled(true);
      _this3.updateSize();
    })["catch"](function (code, err) {
      return $.Deferred().reject(new OO.ui.Error($("<div>").append($("<strong style='display:block;'>").text("Could not show changes."), $("<span style='color:#777'>").text((0, _api.makeErrorMsg)(code, err)))));
    }));
  } else if (action === "back") {
    this.actions.setMode("edit");
    this.contentArea.setItem(this.editLayout);
    this.topBar.setDisabled(false);
    this.updateSize();
  } else if (!action && this.bannerList.changed) {
    // Confirm closing of dialog if there have been changes 
    return new OO.ui.Process().next(OO.ui.confirm("Changes made will be discarded.", {
      title: "Close Rater?"
    }).then(function (confirmed) {
      return confirmed ? _this3.close() : null;
    }));
  }
  return MainWindow["super"].prototype.getActionProcess.call(this, action);
};

// Use the getTeardownProcess() method to perform actions whenever the dialog is closed.
// `data` is the data passed into the window's .close() method.
MainWindow.prototype.getTeardownProcess = function (data) {
  var _this4 = this;
  return MainWindow["super"].prototype.getTeardownProcess.call(this, data).first(function () {
    _this4.bannerList.clearItems();
    _this4.topBar.searchBox.setValue("");
    _this4.contentArea.setItem(_this4.editLayout);
    _this4.topBar.setDisabled(false);
    _this4.oresLabel.toggle(false).$element.find(".oresPrediction").empty();
    _this4.pagetypeLabel.toggle(false).setLabel("");
    _this4.$element.find(".oo-ui-window-frame").css("transform", "");
    _this4.$element.find(".oo-ui-processDialog-location").off(".raterMainWin");
    $("body").off(".raterMainWin");
  });
};
MainWindow.prototype.setPreferences = function (prefs) {
  this.preferences = $.extend({}, _config["default"].defaultPrefs, prefs);
  // Applies preferences to existing items in the window:
  this.bannerList.setPreferences(this.preferences);
};
MainWindow.prototype.onResetCache = function () {
  this.executeAction("clearCache");
};
MainWindow.prototype.onSearchSelect = function (data) {
  var _this5 = this;
  this.topBar.searchBox.pushPending();
  var name = this.topBar.searchBox.getValue().trim();
  if (!name) {
    this.topBar.searchBox.popPending().focus();
    return;
  }
  var existingBanner = this.bannerList.items.find(function (banner) {
    return banner.mainText === name || banner.redirectTargetMainText === name;
  });

  // Abort and show alert if banner already exists
  if (existingBanner) {
    this.topBar.searchBox.popPending();
    return OO.ui.alert("There is already a {{" + name + "}} banner").then(this.searchBox.focus());
  }

  // Confirmation required for banners missing WikiProject from name, and for uncreated disambiguation talk pages
  var confirmText;
  if (!/^[Ww](?:P|iki[Pp]roject)/.test(name)) {
    confirmText = new OO.ui.HtmlSnippet("{{" + mw.html.escape(name) + "}} is not a recognised WikiProject banner.<br/>Do you want to continue?");
  } else if (name === "WikiProject Disambiguation" && $("#ca-talk.new").length !== 0 && this.bannerList.items.length === 0) {
    // eslint-disable-next-line no-useless-escape
    confirmText = "New talk pages shouldn't be created if they will only contain the \{\{WikiProject Disambiguation\}\} banner. Continue?";
  }
  $.when(confirmText ? OO.ui.confirm(confirmText) : true).then(function (confirmed) {
    if (!confirmed) return;
    // Create Template object
    return _BannerWidget["default"].newFromTemplateName(name, data, {
      preferences: _this5.preferences,
      $overlay: _this5.$overlay,
      isArticle: _this5.pageInfo.isArticle
    }).then(function (banner) {
      _this5.bannerList.addItems([banner]);
      banner.setChanged();
      _this5.updateSize();
    });
  }).then(function () {
    return _this5.topBar.searchBox.setValue("").focus().popPending();
  });
};
MainWindow.prototype.onSetClasses = function (classVal) {
  var shellTemplate = this.bannerList.items.find(function (banner) {
    return banner.isShellTemplate;
  });
  if (shellTemplate) {
    shellTemplate.classDropdown.getMenu().selectItemByData(classVal);
    shellTemplate.classDropdown.setAutofilled(false);
  }
  this.bannerList.items.forEach(function (banner) {
    if (banner.hasClassRatings && !banner.isShellTemplate) {
      banner.classDropdown.getMenu().selectItemByData(shellTemplate ? null : classVal);
      banner.classDropdown.setAutofilled(false);
    }
  });
};
MainWindow.prototype.onSetImportances = function (importanceVal) {
  this.bannerList.items.forEach(function (banner) {
    if (banner.hasImportanceRatings) {
      banner.importanceDropdown.getMenu().selectItemByData(importanceVal);
      banner.importanceDropdown.setAutofilled(false);
    }
  });
};
MainWindow.prototype.onRemoveAll = function () {
  this.bannerList.clearItems();
};
MainWindow.prototype.onClearAll = function () {
  this.bannerList.items.forEach(function (banner) {
    return banner.onClearButtonClick();
  });
};
MainWindow.prototype.transformTalkWikitext = function (talkWikitext) {
  var _this6 = this;
  var bannersWikitext = this.bannerList.makeWikitext();
  if (!talkWikitext) {
    return bannersWikitext.trim();
  }
  // Reparse templates, in case talkpage wikitext has changed
  var talkTemplates = (0, _Template.parseTemplates)(talkWikitext, true);
  // replace existing banners wikitext with a control character
  talkTemplates.forEach(function (template) {
    if (_this6.existingBannerNames.includes(template.name)) {
      talkWikitext = talkWikitext.replace(template.wikitext, "\x01");
    }
  });
  // replace insertion point (first control character) with a different control character
  talkWikitext = talkWikitext.replace("\x01", "\x02");
  // remove other control characters
  /* eslint-disable-next-line no-control-regex */
  talkWikitext = talkWikitext.replace(/(?:\s|\n)*\x01(?:\s|\n)*/g, "");
  // split into wikitext before/after the remaining control character (and trim each section)
  var talkWikitextSections = talkWikitext.split("\x02").map(function (t) {
    return t.trim();
  });
  if (talkWikitextSections.length === 2) {
    // Found the insertion point for the banners
    return (talkWikitextSections[0] + "\n" + bannersWikitext.trim() + "\n" + talkWikitextSections[1]).trim();
  }
  // Check if there's anything beside templates
  var tempStr = talkWikitext;
  talkTemplates.forEach(function (template) {
    tempStr = tempStr.replace(template.wikitext, "");
  });
  if (/^#REDIRECT/i.test(talkWikitext) || !tempStr.trim()) {
    // Is a redirect, or everything is a template: insert at the end
    return talkWikitext.trim() + "\n" + bannersWikitext.trim();
  } else {
    // There is non-template content, so insert at the start
    return bannersWikitext.trim() + "\n" + talkWikitext.trim();
  }
};
MainWindow.prototype.isRatedAndNotStub = function () {
  var nonStubRatinggs = this.bannerList.items.filter(function (banner) {
    return banner.hasClassRatings && banner.classDropdown.getValue() && banner.classDropdown.getValue() !== "Stub";
  });
  return nonStubRatinggs.length > 0;
};
MainWindow.prototype.makeEditSummary = function () {
  var _this7 = this;
  var removedBanners = [];
  var editedBanners = [];
  var newBanners = [];
  var shortName = function shortName(name) {
    return name.replace("WikiProject ", "").replace("Subst:", "");
  };

  // Overall class/importance, if all the same
  var allClasses = (0, _util.uniqueArray)((0, _util.filterAndMap)(this.bannerList.items, function (banner) {
    return banner.hasClassRatings || banner.isShellTemplate;
  }, function (banner) {
    return banner.classDropdown.getValue();
  }));
  var overallClass = allClasses.length === 1 && allClasses[0];
  var allImportances = (0, _util.uniqueArray)((0, _util.filterAndMap)(this.bannerList.items, function (banner) {
    return banner.hasImportanceRatings;
  }, function (banner) {
    return banner.importanceDropdown.getValue();
  }));
  var overallImportance = allImportances.length === 1 && allImportances[0];
  // Don't use them unless some have changed
  var someClassesChanged = false;
  var someImportancesChanged = false;

  // removed banners:
  this.existingBannerNames.forEach(function (name) {
    var banner = _this7.bannerList.items.find(function (banner) {
      return banner.name === name || banner.bypassedName === name;
    });
    if (!banner) {
      removedBanners.push("−" + shortName(name));
    }
  });
  // edited & new banners
  this.bannerList.items.forEach(function (banner) {
    var isNew = !banner.wikitext; // not added from wikitext on page
    if (!isNew && !banner.changed) {
      // Not changed
      return;
    }
    var newClass = banner.hasClassRatings && (isNew || banner.classChanged) && banner.classDropdown.getValue();
    if (newClass) {
      someClassesChanged = true;
    }
    if (overallClass) {
      newClass = null;
    }
    var newImportance = banner.hasImportanceRatings && (isNew || banner.importanceChanged) && banner.importanceDropdown.getValue();
    if (newImportance) {
      someImportancesChanged = true;
    }
    if (overallImportance) {
      newImportance = null;
    }
    var rating = newClass && newImportance ? newClass + "/" + newImportance : newClass || newImportance || "";
    if (rating) {
      rating = " (" + rating + ")";
    }
    if (isNew) {
      newBanners.push("+" + shortName(banner.name) + rating);
    } else {
      editedBanners.push(shortName(banner.name) + rating);
    }
  });
  // overall rating
  var overallRating = someClassesChanged && overallClass && someImportancesChanged && overallImportance ? overallClass + "/" + overallImportance : someClassesChanged && overallClass || someImportancesChanged && overallImportance || "";
  if (overallRating) {
    overallRating = " (" + overallRating + ")";
  }
  return "Assessment".concat(overallRating, ": ").concat([].concat(editedBanners, newBanners, removedBanners).join(", ")).concat(_config["default"].script.advert);
};
var _default = MainWindow; // </nowiki>
exports["default"] = _default;

},{"../Template":3,"../api":15,"../cache":17,"../config":18,"../prefs":21,"../util":23,"./Components/BannerListWidget":4,"./Components/BannerWidget":5,"./Components/PrefsFormWidget":10,"./Components/TopBarWidget":12}],15:[function(require,module,exports){
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.makeErrorMsg = exports["default"] = void 0;
var _config = _interopRequireDefault(require("./config"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
// <nowiki>

var API = new mw.Api({
  ajax: {
    headers: {
      "Api-User-Agent": "Rater/" + _config["default"].script.version + " ( https://en.wikipedia.org/wiki/User:Evad37/Rater )"
    }
  }
});

/* ---------- API for ORES ---------------------------------------------------------------------- */
API.getORES = function (revisionID) {
  return $.get("https://ores.wikimedia.org/v3/scores/enwiki?models=articlequality&revids=" + revisionID);
};

/* ---------- Raw wikitext ---------------------------------------------------------------------- */
API.getRaw = function (page) {
  return $.get("https:" + _config["default"].mw.wgServer + mw.util.getUrl(page, {
    action: "raw"
  })).then(function (data) {
    if (!data) {
      return $.Deferred().reject("ok-but-empty");
    }
    return data;
  });
};

/* ---------- Edit with retry ------------------------------------------------------------------- */
/**
 * @param {String} title
 * @param {Object?} params additional params for the get request
 * @returns {Promise<Object, string>} page, starttime timestamp
 */
var getPage = function getPage(title, params) {
  return API.get($.extend({
    "action": "query",
    "format": "json",
    "curtimestamp": 1,
    "titles": title,
    "prop": "revisions|info",
    "rvprop": "content|timestamp",
    "rvslots": "main"
  }, params)).then(function (response) {
    var page = Object.values(response.query.pages)[0];
    var starttime = response.curtimestamp;
    return $.Deferred().resolve(page, starttime);
  });
};

/**
 * @param {Object} page details object from API
 * @param {string} starttime timestamp
 * @param {Function} transform callback that prepares the edit:
 *  {Object} simplifiedPage => {Object|Promise<Object>} edit params
 * @returns {Promise<Object>} params for edit query
 */
var processPage = function processPage(page, starttime, transform) {
  var basetimestamp = page.revisions && page.revisions[0].timestamp;
  var simplifiedPage = {
    pageid: page.pageid,
    missing: page.missing === "",
    redirect: page.redirect === "",
    categories: page.categories,
    ns: page.ns,
    title: page.title,
    content: page.revisions && page.revisions[0].slots.main["*"]
  };
  return $.when(transform(simplifiedPage)).then(function (editParams) {
    return $.extend({
      action: "edit",
      title: page.title,
      // Protect against errors and conflicts
      assert: "user",
      basetimestamp: basetimestamp,
      starttimestamp: starttime
    }, editParams);
  });
};

/** editWithRetry
 * 
 * Edits a page, resolving edit conflicts, and retrying edits that fail. The
 * tranform function may return a rejected promise if the page should not be
 * edited; the @returns {Promise} will will be rejected with the same rejection
 * values.
 * 
 * Note: Unlike [mw.Api#Edit], a missing page will be created, unless the
 * transform callback includes the "nocreate" param.
 * 
 * [mw.Api#Edit]: <https://doc.wikimedia.org/mediawiki-core/master/js/#!/api/mw.Api.plugin.edit>
 * 
 * @param {String} title page to be edited
 * @param {Object|null} getParams additional params for the get request
 * @param {Function} transform callback that prepares the edit:
 *  {Object} simplifiedPage => {Object|Promise<Object>} params for API editing
 * @returns {Promise<object>} promise, resolved on success, rejected if
 *  page was not edited
 */
API.editWithRetry = function (title, getParams, transform) {
  return getPage(title, getParams).then(
  // Succes: process the page
  function (page, starttime) {
    return processPage(page, starttime, transform);
  },
  // Failure: try again
  function () {
    return getPage(title, getParams).then(processPage, transform);
  }).then(function (editParams) {
    return API.postWithToken("csrf", editParams)["catch"](function (errorCode) {
      if (errorCode === "editconflict") {
        // Try again, starting over
        return API.editWithRetry(title, getParams, transform);
      }
      // Try again
      return API.postWithToken("csrf", editParams);
    });
  });
};
var makeErrorMsg = function makeErrorMsg(first, second) {
  var code, xhr, message;
  if (_typeof(first) === "object" && typeof second === "string") {
    // Errors from $.get being rejected (ORES & Raw wikitext)
    var errorObj = first.responseJSON && first.responseJSON.error;
    if (errorObj) {
      // Got an api-specific error code/message
      code = errorObj.code;
      message = errorObj.message;
    } else {
      xhr = first;
    }
  } else if (typeof first === "string" && _typeof(second) === "object") {
    // Errors from mw.Api object
    var mwErrorObj = second.error;
    if (mwErrorObj) {
      // Got an api-specific error code/message
      code = errorObj.code;
      message = errorObj.info;
    } else if (first === "ok-but-empty") {
      code = null;
      message = "Got an empty response from the server";
    } else {
      xhr = second && second.xhr;
    }
  }
  if (code && message) {
    return "API error ".concat(code, ": ").concat(message);
  } else if (message) {
    return "API error: ".concat(message);
  } else if (xhr) {
    return "HTTP error ".concat(xhr.status);
  } else if (typeof first === "string" && first !== "error" && typeof second === "string" && second !== "error") {
    return "Error ".concat(first, ": ").concat(second);
  } else if (typeof first === "string" && first !== "error") {
    return "Error: ".concat(first);
  } else {
    return "Unknown API error";
  }
};
exports.makeErrorMsg = makeErrorMsg;
var _default = API; // </nowiki>
exports["default"] = _default;

},{"./config":18}],16:[function(require,module,exports){
"use strict";

function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
Object.defineProperty(exports, "__esModule", {
  value: true
});
exports["default"] = void 0;
var _config = _interopRequireDefault(require("./config"));
var _prefs = require("./prefs");
var _api = _interopRequireWildcard(require("./api"));
var _setup = _interopRequireDefault(require("./setup"));
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; }
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
// <nowiki>

var autoStart = function autoStart() {
  return (0, _prefs.getPrefs)().then(function (prefs) {
    // Check if pref is turned off
    if (!prefs.autostart) {
      return;
    }
    // Check if pref is turned off for redirects, and current page is a redirect
    if (!prefs.autostartRedirects && window.location.search.includes("redirect=no")) {
      return;
    }
    // Check if viewing diff/history/old version
    if (/(action|diff|oldid)/.test(window.location.search)) {
      return;
    }
    var subjectTitle = mw.Title.newFromText(_config["default"].mw.wgPageName).getSubjectPage();
    // Check if subject page is the main page
    if (subjectTitle.getPrefixedText() === "Main Page") {
      return;
    }
    // Check subject page namespace
    if (prefs.autostartNamespaces && prefs.autostartNamespaces.length && !prefs.autostartNamespaces.includes(_config["default"].mw.wgNamespaceNumber)) {
      return;
    }

    // If talk page does not exist, can just autostart
    if ($("#ca-talk.new").length) {
      return (0, _setup["default"])();
    }

    /* Check templates present on talk page. Fetches indirectly transcluded templates, so will find
    	Template:WPBannerMeta (and its subtemplates). But some banners such as MILHIST don't use that
    	meta template, so we also have to check for template titles containg 'WikiProject'
    */
    var talkTitle = mw.Title.newFromText(_config["default"].mw.wgPageName).getTalkPage();
    return _api["default"].get({
      action: "query",
      format: "json",
      prop: "templates",
      titles: talkTitle.getPrefixedText(),
      tlnamespace: "10",
      tllimit: "500",
      indexpageids: 1
    }).then(function (result) {
      var id = result.query.pageids;
      var templates = result.query.pages[id].templates;
      if (!templates) {
        return (0, _setup["default"])();
      }
      var hasWikiproject = templates.some(function (template) {
        return /(WikiProject|WPBanner)/.test(template.title);
      });
      if (!hasWikiproject) {
        return (0, _setup["default"])();
      }
    }, function (code, jqxhr) {
      // Silently ignore failures (just log to console)
      console.warn("[Rater] Error while checking whether to autostart." + (code == null) ? "" : " " + (0, _api.makeErrorMsg)(code, jqxhr));
      return $.Deferred().reject();
    });
  });
};
var _default = autoStart; // </nowiki>
exports["default"] = _default;

},{"./api":15,"./config":18,"./prefs":21,"./setup":22}],17:[function(require,module,exports){
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.clearAllItems = exports.clearInvalidItems = exports.clearItemIfInvalid = exports.read = exports.write = void 0;
var _util = require("./util");
// <nowiki>

/** write
 * @param {String} key
 * @param {Array|Object} val
 * @param {Number} staleDays Number of days after which the data becomes stale (usable, but should
 *  be updated for next time).
 * @param {Number} expiryDays Number of days after which the cached data may be deleted.
 */
var write = function write(key, val, staleDays, expiryDays) {
  try {
    var defaultStaleDays = 1;
    var defaultExpiryDays = 30;
    var millisecondsPerDay = 24 * 60 * 60 * 1000;
    var staleDuration = (staleDays || defaultStaleDays) * millisecondsPerDay;
    var expiryDuration = (expiryDays || defaultExpiryDays) * millisecondsPerDay;
    var stringVal = JSON.stringify({
      value: val,
      staleDate: new Date(Date.now() + staleDuration).toISOString(),
      expiryDate: new Date(Date.now() + expiryDuration).toISOString()
    });
    localStorage.setItem("Rater-" + key, stringVal);
  } catch (e) {} // eslint-disable-line no-empty
};
/** read
 * @param {String} key
 * @returns {Array|Object|String|Null} Cached array or object, or empty string if not yet cached,
 *          or null if there was error.
 */
exports.write = write;
var read = function read(key) {
  var val;
  try {
    var stringVal = localStorage.getItem("Rater-" + key);
    if (stringVal !== "") {
      val = JSON.parse(stringVal);
    }
  } catch (e) {
    console.log("[Rater] error reading " + key + " from localStorage cache:");
    console.log("\t" + e.name + " message: " + e.message + (e.at ? " at: " + e.at : "") + (e.text ? " text: " + e.text : ""));
  }
  return val || null;
};
exports.read = read;
var isRaterKey = function isRaterKey(key) {
  return key && key.indexOf("Rater-") === 0;
};
var clearItemIfInvalid = function clearItemIfInvalid(key) {
  if (!isRaterKey(key)) {
    return;
  }
  var item = read(key.replace("Rater-", ""));
  var isInvalid = !item || !item.expiryDate || (0, _util.isAfterDate)(item.expiryDate);
  if (isInvalid) {
    localStorage.removeItem(key);
  }
};
exports.clearItemIfInvalid = clearItemIfInvalid;
var clearInvalidItems = function clearInvalidItems() {
  // Loop backwards as localStorage length will decrease as items are removed
  for (var i = localStorage.length; i >= 0; i--) {
    setTimeout(clearItemIfInvalid, 100, localStorage.key(i));
  }
};
exports.clearInvalidItems = clearInvalidItems;
var clearAllItems = function clearAllItems() {
  // Loop backwards as localStorage length will decrease as items are removed
  for (var i = localStorage.length; i >= 0; i--) {
    var key = localStorage.key(i);
    if (isRaterKey(key)) {
      localStorage.removeItem(key);
    }
  }
};

// </nowiki>
exports.clearAllItems = clearAllItems;

},{"./util":23}],18:[function(require,module,exports){
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports["default"] = void 0;
// <nowiki>
var packagejson = require("../package.json");
var version = packagejson.version;

// A global object that stores all the page and user configuration and settings
var config = {
  // Script info
  script: {
    // Advert to append to edit summaries
    advert: " ([[WP:RATER#".concat(version, "|Rater]])"),
    version: version
  },
  // Default preferences, if user subpage raterPrefs.json does not exist
  defaultPrefs: {
    "autostart": false,
    "autostartRedirects": false,
    "autostartNamespaces": [0],
    "minForShell": 1,
    "bypassRedirects": true,
    "autofillClassFromOthers": true,
    "autofillClassFromOres": true,
    "autofillImportance": true,
    "collapseParamsLowerLimit": 6,
    "watchlist": "preferences"
  },
  // MediaWiki configuration values
  mw: mw.config.get(["skin", "wgPageName", "wgNamespaceNumber", "wgUserName", "wgFormattedNamespaces", "wgMonthNames", "wgRevisionId", "wgScriptPath", "wgServer", "wgCategories", "wgIsMainPage"]),
  bannerDefaults: {
    classes: ["FA", "FL", "A", "GA", "B", "C", "Start", "Stub", "List"],
    importances: ["Top", "High", "Mid", "Low"],
    extendedClasses: ["Category", "Draft", "File", "FM", "Portal", "Project", "Template", "Bplus", "Future", "Current", "Disambig", "NA", "Redirect", "Book"],
    extendedImportances: ["Top", "High", "Mid", "Low", "Bottom", "NA"]
  },
  customBanners: {
    "WikiProject Military history": {
      classes: ["FA", "FL", "A", "GA", "B", "C", "Start", "Stub", "List", "AL", "BL", "CL", "Category", "Draft", "File", "Portal", "Project", "Template", "Disambig", "Redirect", "Book"],
      importances: []
    },
    "WikiProject Portals": {
      classes: ["FPo", "Complete", "Substantial", "Basic", "Incomplete", "Meta", "List", "Category", "Draft", "File", "Project", "Template", "Disambig", "NA", "Redirect"],
      importances: ["Top", "High", "Mid", "Low", "Bottom", "NA"]
    },
    "WikiProject Video games": {
      classes: ["FA", "FL", "FM", "GA", "B", "C", "Start", "Stub", "List", "Category", "Draft", "File", "Portal", "Project", "Template", "Disambig", "Redirect"],
      importances: ["Top", "High", "Mid", "Low", "NA"]
    }
  },
  shellTemplates: ["WikiProject banner shell", "WikiProjectBanners", "WikiProject Banners", "WPB", "WPBS", "Wikiprojectbannershell", "WikiProject Banner Shell", "Wpb", "WPBannerShell", "Wpbs", "Wikiprojectbanners", "WP Banner Shell", "WP banner shell", "Bannershell", "Wikiproject banner shell", "WikiProject Banners Shell", "WikiProjectBanner Shell", "WikiProjectBannerShell", "WikiProject BannerShell", "WikiprojectBannerShell", "WikiProject banner shell/redirect", "WikiProject Shell", "Banner shell", "Scope shell", "Project shell", "WikiProject banner"],
  defaultParameterData: {
    "auto": {
      "label": {
        "en": "Auto-rated"
      },
      "description": {
        "en": "Automatically rated by a bot. Allowed values: ['yes']."
      },
      "autovalue": "yes"
    },
    "listas": {
      "label": {
        "en": "List as"
      },
      "description": {
        "en": "Sortkey for talk page"
      }
    },
    "small": {
      "label": {
        "en": "Small?"
      },
      "description": {
        "en": "Display a small version. Allowed values: ['yes']."
      },
      "autovalue": "yes"
    },
    "attention": {
      "label": {
        "en": "Attention required?"
      },
      "description": {
        "en": "Immediate attention required. Allowed values: ['yes']."
      },
      "autovalue": "yes"
    },
    "needs-image": {
      "label": {
        "en": "Needs image?"
      },
      "description": {
        "en": "Request that an image or photograph of the subject be added to the article. Allowed values: ['yes']."
      },
      "aliases": ["needs-photo"],
      "autovalue": "yes",
      "suggested": true
    },
    "needs-infobox": {
      "label": {
        "en": "Needs infobox?"
      },
      "description": {
        "en": "Request that an infobox be added to the article. Allowed values: ['yes']."
      },
      "aliases": ["needs-photo"],
      "autovalue": "yes",
      "suggested": true
    }
  }
};
var _default = config; // </nowiki>
exports["default"] = _default;

},{"../package.json":1}],19:[function(require,module,exports){
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports["default"] = void 0;
// <nowiki>

// Attribution: Diff styles based on <https://en.wikipedia.org/wiki/Wikipedia:AutoWikiBrowser/style.css>
var styles = "table.diff, td.diff-otitle, td.diff-ntitle { table-layout: auto !important;; }\ntd.diff-otitle, td.diff-ntitle { text-align: center; }\ntd.diff-marker { text-align: right; font-weight: bold; font-size: 1.25em; }\ntd.diff-lineno { font-weight: bold; }\ntd.diff-addedline, td.diff-deletedline, td.diff-context { font-size: 88%; vertical-align: top; white-space: -moz-pre-wrap; white-space: pre-wrap; }\ntd.diff-addedline, td.diff-deletedline { border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; }\ntd.diff-addedline { border-color: #a3d3ff; }\ntd.diff-deletedline { border-color: #ffe49c; }\ntd.diff-context { background: #f3f3f3; color: #333333; border-style: solid; border-width: 1px 1px 1px 4px; border-color: #e6e6e6; border-radius: 0.33em; }\n.diffchange { font-weight: bold; text-decoration: none; }\ntable.diff {\n    border: none;\n    width: 98%; border-spacing: 4px;\n    table-layout: fixed; /* Ensures that colums are of equal width */\n}\ntd.diff-addedline .diffchange, td.diff-deletedline .diffchange { border-radius: 0.33em; padding: 0.25em 0; }\ntd.diff-addedline .diffchange {\tbackground: #d8ecff; }\ntd.diff-deletedline .diffchange { background: #feeec8; }\ntable.diff td {\tpadding: 0.33em 0.66em; }\ntable.diff col.diff-marker { width: 2%; }\ntable.diff col.diff-content { width: 48%; }\ntable.diff td div {\n    /* Force-wrap very long lines such as URLs or page-widening char strings. */\n    word-wrap: break-word;\n    /* As fallback (FF<3.5, Opera <10.5), scrollbars will be added for very wide cells\n        instead of text overflowing or widening */\n    overflow: auto;\n}" + // Override OOUI window manager preventing background scrolling/interaction
"html body.rater-mainWindow-open {\n\tposition: unset;\n\toverflow: unset;\n}\nhtml body.rater-mainWindow-open .oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-active {\n    position: static;\n    padding: 0;\n}" + // Increase z-index, to be above skin menus etc; smooth transition for dragging (transform:translate)
"html body.rater-mainWindow-open .oo-ui-dialog.oo-ui-window-active > div {\n    z-index: 110;\n    transition: all 0.25s ease-out 0s, transform 0s !important\n}\n" + // Ensure close dialog is visible
"html body.rater-mainWindow-open #mw-teleport-target {\n    top: 0;\n    bottom: 0;\n    left: 0;\n    right:0;\n}\n";
var _default = styles; // </nowiki>
exports["default"] = _default;

},{}],20:[function(require,module,exports){
"use strict";

function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.getBannerNames = void 0;
var _api = _interopRequireWildcard(require("./api"));
var _util = require("./util");
var cache = _interopRequireWildcard(require("./cache"));
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; }
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
// <nowiki>

var cacheBanners = function cacheBanners(banners) {
  cache.write("banners", banners, 2, 60);
};

/**
 * Gets banners/options from the Api
 * 
 * @returns {Promise} Resolved with: banners object, bannerOptions array
 */
var getListOfBannersFromApi = function getListOfBannersFromApi() {
  var finishedPromise = $.Deferred();
  var querySkeleton = {
    action: "query",
    format: "json",
    list: "categorymembers",
    cmprop: "title",
    cmnamespace: "10",
    cmlimit: "500"
  };
  var categories = [{
    title: "Category:WikiProject banners with quality assessment",
    abbreviation: "withRatings",
    banners: [],
    processed: $.Deferred()
  }, {
    title: "Category:WikiProject banners without quality assessment",
    abbreviation: "withoutRatings",
    banners: [],
    processed: $.Deferred()
  }, {
    title: "Category:WikiProject banner wrapper templates",
    abbreviation: "wrappers",
    banners: [],
    processed: $.Deferred()
  }, {
    title: "Category:WikiProject banner templates not based on WPBannerMeta",
    abbreviation: "notWPBM",
    banners: [],
    processed: $.Deferred()
  }, {
    title: "Category:Inactive WikiProject banners",
    abbreviation: "inactive",
    banners: [],
    processed: $.Deferred()
  }, {
    title: "Category:Wrapper templates for WikiProject Women in Red",
    abbreviation: "wir",
    banners: [],
    processed: $.Deferred()
  }];
  var processQuery = function processQuery(result, catIndex) {
    if (!result.query || !result.query.categorymembers) {
      // No results
      // TODO: error or warning ********
      finishedPromise.reject();
      return;
    }

    // Gather titles into array - excluding "Template:" prefix
    var resultTitles = result.query.categorymembers.map(function (info) {
      return info.title.slice(9);
    });
    Array.prototype.push.apply(categories[catIndex].banners, resultTitles);

    // Continue query if needed
    if (result["continue"]) {
      doApiQuery($.extend(categories[catIndex].query, result["continue"]), catIndex);
      return;
    }
    categories[catIndex].processed.resolve();
  };
  var doApiQuery = function doApiQuery(q, catIndex) {
    _api["default"].get(q).done(function (result) {
      processQuery(result, catIndex);
    }).fail(function (code, jqxhr) {
      console.warn("[Rater] " + (0, _api.makeErrorMsg)(code, jqxhr, "Could not retrieve pages from [[:" + q.cmtitle + "]]"));
      finishedPromise.reject();
    });
  };
  categories.forEach(function (cat, index, arr) {
    cat.query = $.extend({
      "cmtitle": cat.title
    }, querySkeleton);
    $.when(arr[index - 1] && arr[index - 1].processed || true).then(function () {
      doApiQuery(cat.query, index);
    });
  });
  categories[categories.length - 1].processed.then(function () {
    var banners = {};
    categories.forEach(function (catObject) {
      banners[catObject.abbreviation] = catObject.banners;
    });
    finishedPromise.resolve(banners);
  });
  return finishedPromise;
};

/**
 * Gets banners from cache, if there and not too old
 * 
 * @returns {Promise} Resolved with banners object
 */
var getBannersFromCache = function getBannersFromCache() {
  var cachedBanners = cache.read("banners");
  if (!cachedBanners || !cachedBanners.value || !cachedBanners.staleDate) {
    return $.Deferred().reject();
  }
  if ((0, _util.isAfterDate)(cachedBanners.staleDate)) {
    // Update in the background; still use old list until then  
    getListOfBannersFromApi().then(cacheBanners);
  }
  return $.Deferred().resolve(cachedBanners.value);
};

/**
 * Gets banner names, grouped by type (withRatings, withoutRatings, wrappers, notWPBM)
 * @returns {Promise<Object>} Object of string arrays keyed by type (withRatings, withoutRatings, wrappers, notWPBM)
 */
var getBannerNames = function getBannerNames() {
  return getBannersFromCache().then(function (banners) {
    // Ensure all keys exist
    if (!banners.withRatings || !banners.withoutRatings || !banners.wrappers || !banners.notWPBM || !banners.inactive || !banners.wir) {
      getListOfBannersFromApi().then(cacheBanners);
      return $.extend({
        withRatings: [],
        withoutRatings: [],
        wrappers: [],
        notWPBM: [],
        inactive: [],
        wir: []
      }, banners);
    }
    // Success: pass through
    return banners;
  })["catch"](function () {
    // Failure: get from Api, then cache them
    var bannersPromise = getListOfBannersFromApi();
    bannersPromise.then(cacheBanners);
    return bannersPromise;
  });
};

// </nowiki>
exports.getBannerNames = getBannerNames;

},{"./api":15,"./cache":17,"./util":23}],21:[function(require,module,exports){
"use strict";

function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.setPrefs = exports.getPrefs = exports["default"] = void 0;
var _api = _interopRequireDefault(require("./api"));
var _util = require("./util");
var _config = _interopRequireDefault(require("./config"));
var cache = _interopRequireWildcard(require("./cache"));
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; }
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
// <nowiki>

var prefsPage = "User:".concat(mw.config.get("wgUserName"), "/raterPrefs.json");
var writePrefsToCache = function writePrefsToCache(prefs) {
  return cache.write("prefs", prefs, 1 / 24 / 60 * 1,
  // 1 min
  1 / 24 / 60 * 1 // 1 min
  );
};
var getPrefsFromApi = function getPrefsFromApi() {
  return _api["default"].get({
    "action": "query",
    "format": "json",
    "prop": "revisions",
    "titles": prefsPage,
    "rvprop": "content",
    "rvslots": "main"
  }).then(function (response) {
    var page = response.query.pages[Object.keys(response.query.pages)[0]];
    if (!page.pageid || page.missing === "") {
      return _config["default"].defaultPrefs;
    }
    var prefs;
    try {
      prefs = JSON.parse(page.revisions[0].slots.main["*"]);
    } catch (e) {
      return $.Deferred().reject("JSON-parsing-error", e);
    }
    writePrefsToCache(prefs);
    return prefs;
  });
};
var getPrefsFromCache = function getPrefsFromCache() {
  var cachedPrefs = cache.read("prefs");
  if (!cachedPrefs || !cachedPrefs.value || !cachedPrefs.staleDate || (0, _util.isAfterDate)(cachedPrefs.staleDate)) {
    // No cached value, or is too old
    return $.Deferred().reject();
  }
  return $.Deferred().resolve(cachedPrefs.value);
};
var getPrefs = function getPrefs() {
  return getPrefsFromCache().then(
  // Success: pass through (first param only)
  function (prefs) {
    return $.Deferred().resolve(prefs);
  },
  // Failure: get from Api
  function () {
    return getPrefsFromApi();
  });
};

/**
 * 
 * @param {Object} updatedPrefs object with key:value pairs for preferences json.
 */
exports.getPrefs = getPrefs;
var setPrefs = function setPrefs(updatedPrefs) {
  return _api["default"].editWithRetry(prefsPage, null, function () {
    return {
      "text": JSON.stringify(updatedPrefs),
      "summary": "Saving Rater preferences " + _config["default"].script.advert
    };
  }).then(function () {
    return writePrefsToCache(updatedPrefs);
  });
};
exports.setPrefs = setPrefs;
var _default = {
  get: getPrefs,
  set: setPrefs
}; // </nowiki>
exports["default"] = _default;

},{"./api":15,"./cache":17,"./config":18,"./util":23}],22:[function(require,module,exports){
"use strict";

function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
Object.defineProperty(exports, "__esModule", {
  value: true
});
exports["default"] = void 0;
var _config = _interopRequireDefault(require("./config"));
var _api = _interopRequireDefault(require("./api"));
var _Template = require("./Template");
var _getBanners = require("./getBanners");
var cache = _interopRequireWildcard(require("./cache"));
var _windowManager = _interopRequireDefault(require("./windowManager"));
var _prefs = require("./prefs");
var _util = require("./util");
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; }
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(n); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); }
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
// <nowiki>

var setupRater = function setupRater(clickEvent) {
  if (clickEvent) {
    clickEvent.preventDefault();
  }
  var setupCompletedPromise = $.Deferred();
  var currentPage = mw.Title.newFromText(_config["default"].mw.wgPageName);
  var talkPage = currentPage && currentPage.getTalkPage();
  var subjectPage = currentPage && currentPage.getSubjectPage();
  var subjectIsArticle = _config["default"].mw.wgNamespaceNumber <= 1;

  // Get preferences (task 0)
  var prefsPromise = (0, _prefs.getPrefs)();

  // Get lists of all banners (task 1)
  var bannersPromise = (0, _getBanners.getBannerNames)();

  // Load talk page (task 2)
  var loadTalkPromise = _api["default"].get({
    action: "query",
    prop: "revisions",
    rvprop: "content",
    rvsection: "0",
    titles: talkPage.getPrefixedText(),
    indexpageids: 1
  }).then(function (result) {
    var id = result.query.pageids;
    var wikitext = id < 0 ? "" : result.query.pages[id].revisions[0]["*"];
    return wikitext;
  });

  // Parse talk page for banners (task 3)
  var parseTalkPromise = loadTalkPromise.then(function (wikitext) {
    return (0, _Template.parseTemplates)(wikitext, true);
  }) // Get all templates
  .then(function (templates) {
    return templates.filter(function (template) {
      return template.getTitle() !== null;
    });
  }) // Filter out invalid templates (e.g. parser functions)
  .then(function (templates) {
    return (0, _Template.getWithRedirectTo)(templates);
  }) // Check for redirects
  .then(function (templates) {
    return bannersPromise.then(function (allBanners) {
      // Get list of all banner templates
      return (0, _util.filterAndMap)(templates,
      // Filter out non-banners
      function (template) {
        if (template.isShellTemplate()) {
          return true;
        }
        var mainText = template.redirectTarget ? template.redirectTarget.getMainText() : template.getTitle().getMainText();
        return allBanners.withRatings.includes(mainText) || allBanners.withoutRatings.includes(mainText) || allBanners.wrappers.includes(mainText) || allBanners.notWPBM.includes(mainText) || allBanners.inactive.includes(mainText) || allBanners.wir.includes(mainText);
      },
      // Set additional properties if needed
      function (template) {
        var mainText = template.redirectTarget ? template.redirectTarget.getMainText() : template.getTitle().getMainText();
        if (allBanners.wrappers.includes(mainText)) {
          template.redirectTarget = mw.Title.newFromText("Template:Subst:" + mainText);
        }
        if (allBanners.withoutRatings.includes(mainText) || allBanners.wir.includes(mainText)) {
          template.withoutRatings = true;
        }
        if (allBanners.inactive.includes(mainText)) {
          template.inactiveProject = true;
        }
        return template;
      });
    });
  });

  // Retrieve and store classes, importances, and TemplateData (task 4)
  var templateDetailsPromise = parseTalkPromise.then(function (templates) {
    // Wait for all promises to resolve
    return $.when.apply(null, [].concat(_toConsumableArray(templates.map(function (template) {
      return template.isShellTemplate() ? null : template.setClassesAndImportances();
    })), _toConsumableArray(templates.map(function (template) {
      return template.setParamDataAndSuggestions();
    })))).then(function () {
      // Add missing required/suggested values
      templates.forEach(function (template) {
        return template.addMissingParams();
      });
      // Return the now-modified templates
      return templates;
    });
  });

  // Check subject page features (task 5) - but don't error out if request fails
  var subjectPageCheckPromise = _api["default"].get({
    action: "query",
    format: "json",
    formatversion: "2",
    prop: "categories",
    titles: subjectPage.getPrefixedText(),
    redirects: 1,
    clcategories: ["Category:All disambiguation pages", "Category:All stub articles", "Category:Good articles", "Category:Featured articles", "Category:Featured lists"]
  }).then(function (response) {
    if (!response || !response.query || !response.query.pages) {
      return null;
    }
    var redirectTarget = response.query.redirects && response.query.redirects[0].to || false;
    if (redirectTarget || !subjectIsArticle) {
      return {
        redirectTarget: redirectTarget
      };
    }
    var page = response.query.pages[0];
    var hasCategory = function hasCategory(category) {
      return page.categories && page.categories.find(function (cat) {
        return cat.title === "Category:" + category;
      });
    };
    return {
      redirectTarget: redirectTarget,
      disambig: hasCategory("All disambiguation pages"),
      stubtag: hasCategory("All stub articles"),
      isGA: hasCategory("Good articles"),
      isFA: hasCategory("Featured articles"),
      isFL: hasCategory("Featured lists"),
      isList: !hasCategory("Featured lists") && /^Lists? of/.test(subjectPage.getPrefixedText())
    };
  })["catch"](function () {
    return null;
  }); // Failure ignored

  // Retrieve rating from ORES (task 6, only needed for articles) - but don't error out if request fails
  var shouldGetOres = subjectIsArticle; // TODO: Don't need to get ORES for redirects or disambigs
  if (shouldGetOres) {
    var latestRevIdPromise = !currentPage.isTalkPage() ? $.Deferred().resolve(_config["default"].mw.wgRevisionId) : _api["default"].get({
      action: "query",
      format: "json",
      prop: "revisions",
      titles: subjectPage.getPrefixedText(),
      rvprop: "ids",
      indexpageids: 1
    }).then(function (result) {
      if (result.query.redirects) {
        return false;
      }
      var id = result.query.pageids;
      var page = result.query.pages[id];
      if (page.missing === "") {
        return false;
      }
      if (id < 0) {
        return $.Deferred().reject();
      }
      return page.revisions[0].revid;
    });
    var oresPromise = latestRevIdPromise.then(function (latestRevId) {
      if (!latestRevId) {
        return false;
      }
      return _api["default"].getORES(latestRevId).then(function (result) {
        var data = result.enwiki.scores[latestRevId].articlequality;
        if (data.error) {
          return $.Deferred().reject(data.error.type, data.error.message);
        }
        var prediction = data.score.prediction;
        var probabilities = data.score.probability;
        if (prediction === "FA" || prediction === "GA") {
          return {
            prediction: "B or higher",
            probability: ((probabilities.FA + probabilities.GA + probabilities.B) * 100).toFixed(1) + "%"
          };
        }
        return {
          prediction: prediction,
          probability: (probabilities[prediction] * 100).toFixed(1) + "%"
        };
      })["catch"](function () {
        return null;
      }); // Failure ignored;
    });
  }

  // Open the load dialog
  var isOpenedPromise = $.Deferred();
  var loadDialogWin = _windowManager["default"].openWindow("loadDialog", {
    promises: [bannersPromise, loadTalkPromise, parseTalkPromise, templateDetailsPromise, subjectPageCheckPromise, shouldGetOres && oresPromise],
    ores: shouldGetOres,
    isOpened: isOpenedPromise
  });
  loadDialogWin.opened.then(isOpenedPromise.resolve);
  $.when(prefsPromise, loadTalkPromise, templateDetailsPromise, subjectPageCheckPromise, shouldGetOres && oresPromise).then(
  // All succeded
  function (preferences, talkWikitext, banners, subjectPageCheck, oresPredicition) {
    var result = {
      success: true,
      talkpage: talkPage,
      subjectPage: subjectPage,
      talkWikitext: talkWikitext,
      banners: banners,
      preferences: preferences,
      isArticle: subjectIsArticle
    };
    if (subjectPageCheck) {
      result = _objectSpread({}, result, {}, subjectPageCheck);
    }
    if (oresPredicition && subjectPageCheck && !subjectPageCheck.isGA && !subjectPageCheck.isFA && !subjectPageCheck.isFL) {
      result.ores = oresPredicition;
    }
    _windowManager["default"].closeWindow("loadDialog", result);
  }); // Any failures are handled by the loadDialog window itself

  // On window closed, check data, and resolve/reject setupCompletedPromise
  loadDialogWin.closed.then(function (data) {
    if (data && data.success) {
      // Got everything needed: Resolve promise with this data
      setupCompletedPromise.resolve(data);
    } else if (data && data.error) {
      // There was an error: Reject promise with error code/info
      setupCompletedPromise.reject(data.error.code, data.error.info);
    } else {
      // Window closed before completion: resolve promise without any data
      setupCompletedPromise.resolve(null);
    }
    cache.clearInvalidItems();
  });
  return setupCompletedPromise;
};
var _default = setupRater; // </nowiki>
exports["default"] = _default;

},{"./Template":3,"./api":15,"./cache":17,"./config":18,"./getBanners":20,"./prefs":21,"./util":23,"./windowManager":24}],23:[function(require,module,exports){
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.mostFrequent = mostFrequent;
exports.uniqueArray = uniqueArray;
exports.classMask = classMask;
exports.importanceMask = importanceMask;
exports.normaliseYesNo = exports.filterAndMap = exports.isAfterDate = void 0;
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(n); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); }
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
// <nowiki>

// Various utility functions and objects that might be used in multiple places

var isAfterDate = function isAfterDate(dateString) {
  return new Date(dateString) < new Date();
};
exports.isAfterDate = isAfterDate;
var yesWords = ["add", "added", "affirm", "affirmed", "include", "included", "on", "true", "yes", "y", "1"];
var noWords = ["decline", "declined", "exclude", "excluded", "false", "none", "not", "no", "n", "off", "omit", "omitted", "remove", "removed", "0"];
var normaliseYesNo = function normaliseYesNo(val) {
  if (val == null) {
    return val;
  }
  var trimmedLcVal = val.trim().toLowerCase();
  if (yesWords.includes(trimmedLcVal)) {
    return "yes";
  } else if (noWords.includes(trimmedLcVal)) {
    return "no";
  } else {
    return trimmedLcVal;
  }
};

/**
 * 
 * @param {Array} array 
 * @param {Function} filterPredicate (currentVal, currentIndex, array) => {boolean}
 * @param {Function} mapTransform (currentVal, currentIndex, array) => {any}
 * @returns {Array}
 */
exports.normaliseYesNo = normaliseYesNo;
var filterAndMap = function filterAndMap(array, filterPredicate, mapTransform) {
  return array.reduce(function (accumulated, currentVal, currentIndex) {
    if (filterPredicate(currentVal, currentIndex, array)) {
      return [].concat(_toConsumableArray(accumulated), [mapTransform(currentVal, currentIndex, array)]);
    }
    return accumulated;
  }, []);
};

/**
 * 
 * @param {string[]|number[]} array 
 * @returns {string|null} item with the highest frequency
 * e.g. `mostFrequent(["apple", "apple", "orange"])` returns `"apple"`
 */
exports.filterAndMap = filterAndMap;
function mostFrequent(array) {
  if (!array || !Array.isArray(array) || array.length === 0) return null;
  var map = {};
  var mostFreq = null;
  array.forEach(function (item) {
    map[item] = (map[item] || 0) + 1;
    if (mostFreq === null || map[item] > map[mostFreq]) {
      mostFreq = item;
    }
  });
  return mostFreq;
}

/**
 * 
 * @param {string[]|number[]} array 
 * @returns {string[]|number[]} array with only unique values
 * e.g. `uniqueArray(["apple", "apple", "orange"])` returns `["apple", "orange"]`
 */
function uniqueArray(array) {
  if (!array || !Array.isArray(array) || array.length === 0) return [];
  var seen = {};
  var unique = [];
  array.forEach(function (item) {
    if (!seen[item]) {
      unique.push(item);
      seen[item] = true;
    }
  });
  return unique;
}
function classMask(classVal) {
  if (!classVal) {
    return classVal;
  }
  switch (classVal.toLowerCase()) {
    case "fa":
    case "fl":
    case "a":
    case "ga":
    case "b":
    case "c":
    case "na":
    case "fm":
    case "al":
    case "bl":
    case "cl":
      return classVal.toUpperCase();
    case "start":
    case "stub":
    case "list":
    case "portal":
    case "project":
    case "draft":
    case "book":
    case "future":
    case "current":
    case "complete":
    case "substantial":
    case "basic":
    case "incomplete":
    case "meta":
      return classVal.slice(0, 1).toUpperCase() + classVal.slice(1).toLowerCase();
    case "image":
    case "img":
    case "file":
      return "File";
    case "category":
    case "cat":
    case "categ":
      return "Category";
    case "disambiguation":
    case "disambig":
    case "disamb":
    case "dab":
      return "Disambig";
    case "redirect":
    case "redir":
    case "red":
      return "Redirect";
    case "template":
    case "temp":
    case "tpl":
      return "Template";
    case "bplus":
    case "b+":
      return "Bplus";
    case "fpo":
      return "FPo";
    default:
      return classVal;
  }
}
function importanceMask(importance) {
  if (!importance) {
    return importance;
  }
  if (importance.toLowerCase() === "na") {
    return "NA";
  }
  return importance.slice(0, 1).toUpperCase() + importance.slice(1).toLowerCase();
}

// </nowiki>

},{}],24:[function(require,module,exports){
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports["default"] = void 0;
var _LoadDialog = _interopRequireDefault(require("./Windows/LoadDialog"));
var _MainWindow = _interopRequireDefault(require("./Windows/MainWindow"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
// <nowiki>

var factory = new OO.Factory();

// Register window constructors with the factory.
factory.register(_LoadDialog["default"]);
factory.register(_MainWindow["default"]);
var manager = new OO.ui.WindowManager({
  "factory": factory
});
$(document.body).append(manager.$element);
var _default = manager; // </nowiki>
exports["default"] = _default;

},{"./Windows/LoadDialog":13,"./Windows/MainWindow":14}]},{},[2])
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJwYWNrYWdlLmpzb24iLCJyYXRlci1zcmMvQXBwLmpzIiwicmF0ZXItc3JjL1RlbXBsYXRlLmpzIiwicmF0ZXItc3JjL1dpbmRvd3MvQ29tcG9uZW50cy9CYW5uZXJMaXN0V2lkZ2V0LmpzIiwicmF0ZXItc3JjL1dpbmRvd3MvQ29tcG9uZW50cy9CYW5uZXJXaWRnZXQuanMiLCJyYXRlci1zcmMvV2luZG93cy9Db21wb25lbnRzL0Ryb3Bkb3duUGFyYW1ldGVyV2lkZ2V0LmpzIiwicmF0ZXItc3JjL1dpbmRvd3MvQ29tcG9uZW50cy9Ib3Jpem9udGFsTGF5b3V0V2lkZ2V0LmpzIiwicmF0ZXItc3JjL1dpbmRvd3MvQ29tcG9uZW50cy9QYXJhbWV0ZXJMaXN0V2lkZ2V0LmpzIiwicmF0ZXItc3JjL1dpbmRvd3MvQ29tcG9uZW50cy9QYXJhbWV0ZXJXaWRnZXQuanMiLCJyYXRlci1zcmMvV2luZG93cy9Db21wb25lbnRzL1ByZWZzRm9ybVdpZGdldC5qcyIsInJhdGVyLXNyYy9XaW5kb3dzL0NvbXBvbmVudHMvU3VnZ2VzdGlvbkxvb2t1cFRleHRJbnB1dFdpZGdldC5qcyIsInJhdGVyLXNyYy9XaW5kb3dzL0NvbXBvbmVudHMvVG9wQmFyV2lkZ2V0LmpzIiwicmF0ZXItc3JjL1dpbmRvd3MvTG9hZERpYWxvZy5qcyIsInJhdGVyLXNyYy9XaW5kb3dzL01haW5XaW5kb3cuanMiLCJyYXRlci1zcmMvYXBpLmpzIiwicmF0ZXItc3JjL2F1dG9zdGFydC5qcyIsInJhdGVyLXNyYy9jYWNoZS5qcyIsInJhdGVyLXNyYy9jb25maWcuanMiLCJyYXRlci1zcmMvY3NzLmpzIiwicmF0ZXItc3JjL2dldEJhbm5lcnMuanMiLCJyYXRlci1zcmMvcHJlZnMuanMiLCJyYXRlci1zcmMvc2V0dXAuanMiLCJyYXRlci1zcmMvdXRpbC5qcyIsInJhdGVyLXNyYy93aW5kb3dNYW5hZ2VyLmpzIl0sIm5hbWVz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QkFBQSxXQUFBLEdBQUEsSUFBQSxHQUFBLFFBQUEsTUFBQSxDQUFBLFNBQUEsQ0FBQSxjQUFBLENBQUEsSUFBQSxDQUFBLEdBQUEsRUFBQSxHQUFBLFNBQUEsSUFBQSxHQUFBLHFCQUFBLEdBQUEsTUFBQSxDQUFBLHdCQUFBLENBQUEsR0FBQSxFQUFBLEdBQUEsY0FBQSxJQUFBLEtBQUEsSUFBQSxDQUFBLEdBQUEsSUFBQSxJQUFBLENBQUEsR0FBQSxLQUFBLE1BQUEsQ0FBQSxjQUFBLENBQUEsTUFBQSxFQUFBLEdBQUEsRUFBQSxJQUFBLFlBQUEsTUFBQSxDQUFBLEdBQUEsSUFBQSxHQUFBLENBQUEsR0FBQSxTQUFBLE1BQUEsY0FBQSxHQUFBLE1BQUEsS0FBQSxJQUFBLEtBQUEsQ0FBQSxHQUFBLENBQUEsR0FBQSxFQUFBLE1BQUEsWUFBQSxNQUFBO0FBQUEsU0FBQSx1QkFBQSxHQUFBLFdBQUEsR0FBQSxJQUFBLEdBQUEsQ0FBQSxVQUFBLEdBQUEsR0FBQSxnQkFBQSxHQUFBO0FBQUEsU0FBQSxtQkFBQSxHQUFBLFdBQUEsa0JBQUEsQ0FBQSxHQUFBLEtBQUEsZ0JBQUEsQ0FBQSxHQUFBLEtBQUEsMkJBQUEsQ0FBQSxHQUFBLEtBQUEsa0JBQUE7QUFBQSxTQUFBLG1CQUFBLGNBQUEsU0FBQTtBQUFBLFNBQUEsNEJBQUEsQ0FBQSxFQUFBLE1BQUEsU0FBQSxDQUFBLHFCQUFBLENBQUEsc0JBQUEsaUJBQUEsQ0FBQSxDQUFBLEVBQUEsTUFBQSxPQUFBLENBQUEsR0FBQSxNQUFBLENBQUEsU0FBQSxDQUFBLFFBQUEsQ0FBQSxJQUFBLENBQUEsQ0FBQSxFQUFBLEtBQUEsYUFBQSxDQUFBLGlCQUFBLENBQUEsQ0FBQSxXQUFBLEVBQUEsQ0FBQSxHQUFBLENBQUEsQ0FBQSxXQUFBLENBQUEsSUFBQSxNQUFBLENBQUEsY0FBQSxDQUFBLG1CQUFBLEtBQUEsQ0FBQSxJQUFBLENBQUEsQ0FBQSxPQUFBLENBQUEsK0RBQUEsSUFBQSxDQUFBLENBQUEsVUFBQSxpQkFBQSxDQUFBLENBQUEsRUFBQSxNQUFBO0FB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QUFBLEVBQUEsTUFBQSxTQUFBLENBQUEscUJBQUEsQ0FBQSxzQkFBQSxpQkFBQSxDQUFBLENBQUEsRUFBQSxNQUFBLE9BQUEsQ0FBQSxHQUFBLE1BQUEsQ0FBQSxTQUFBLENBQUEsUUFBQSxDQUFBLElBQUEsQ0FBQSxDQUFBLEVBQUEsS0FBQSxhQUFBLENBQUEsaUJBQUEsQ0FBQSxDQUFBLFdBQUEsRUFBQSxDQUFBLEdBQUEsQ0FBQSxDQUFBLFdBQUEsQ0FBQSxJQUFBLE1BQUEsQ0FBQSxjQUFBLENBQUEsbUJBQUEsS0FBQSxDQUFBLElBQUEsQ0FBQSxDQUFBLE9BQUEsQ0FBQSwrREFBQSxJQUFBLENBQUEsQ0FBQSxVQUFBLGlCQUFBLENBQUEsQ0FBQSxFQUFBLE1BQUE7QUFBQSxTQUFBLGtCQUFBLEdBQUEsRUFBQSxHQUFBLFFBQUEsR0FBQSxZQUFBLEdBQUEsR0FBQSxHQUFBLENBQUEsTUFBQSxFQUFBLEdBQUEsR0FBQSxHQUFBLENBQUEsTUFBQSxXQUFBLENBQUEsTUFBQSxJQUFBLE9BQUEsS0FBQSxDQUFBLEdBQUEsR0FBQSxDQUFBLEdBQUEsR0FBQSxFQUFBLENBQUEsTUFBQSxJQUFBLENBQUEsQ0FBQSxJQUFBLEdBQUEsQ0FBQSxDQUFBLFlBQUEsSUFBQTtBQUFBLFNBQUEsc0JBQUEsR0FBQSxFQUFBLENBQUEsZUFBQSxNQUFBLHNCQUFBLE1BQUEsQ0FBQSxRQUFBLElBQUEsTUFBQSxDQUFBLEdBQUEsZ0JBQUEsSUFBQSxXQUFBLEVBQUEsYUFBQSxFQUFBLGNBQUEsRUFBQSxHQUFBLFNBQUEsaUJBQUEsRUFBQSxHQUFBLEdBQUEsQ0FBQSxNQUFBLENBQUEsUUFBQSxLQUFBLEVBQUEsSUFBQSxFQUFBLElBQUEsRUFBQSxHQUFBLEVBQUEsQ0FBQSxJQUFBLElBQUEsSUFBQSxHQUFBLEVBQUEsV0FBQSxJQUFBLENBQUEsSUFBQSxDQUFBLEVBQUEsQ0FBQSxLQUFBLE9BQUEsQ0FBQSxJQUFBLElBQUEsQ0FBQSxNQUFBLEtBQUEsQ0FBQSxvQkFBQSxHQUFBLElBQUEsRUFBQSxTQUFBLEVBQUEsR0FB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S0FBQSxJQUFBLEtBQUEsQ0FBQSxHQUFBLENBQUEsR0FBQSxZQUFBLEtBQUEsQ0FBQSxHQUFBLENBQUEsR0FBQSxTQUFBLE1BQUEsV0FBQSxxQkFBQSxHQUFBLE1BQUEsQ0FBQSxjQUFBLElBQUEsTUFBQSxDQUFBLHdCQUFBLFdBQUEsR0FBQSxJQUFBLEdBQUEsUUFBQSxNQUFBLENBQUEsU0FBQSxDQUFBLGNBQUEsQ0FBQSxJQUFBLENBQUEsR0FBQSxFQUFBLEdBQUEsU0FBQSxJQUFBLEdBQUEscUJBQUEsR0FBQSxNQUFBLENBQUEsd0JBQUEsQ0FBQSxHQUFBLEVBQUEsR0FBQSxjQUFBLElBQUEsS0FBQSxJQUFBLENBQUEsR0FBQSxJQUFBLElBQUEsQ0FBQSxHQUFBLEtBQUEsTUFBQSxDQUFBLGNBQUEsQ0FBQSxNQUFBLEVBQUEsR0FBQSxFQUFBLElBQUEsWUFBQSxNQUFBLENBQUEsR0FBQSxJQUFBLEdBQUEsQ0FBQSxHQUFBLFNBQUEsTUFBQSxjQUFBLEdBQUEsTUFBQSxLQUFBLElBQUEsS0FBQSxDQUFBLEdBQUEsQ0FBQSxHQUFBLEVBQUEsTUFBQSxZQUFBLE1BQUE7QUFBQSxTQUFBLHVCQUFBLEdBQUEsV0FBQSxHQUFBLElBQUEsR0FBQSxDQUFBLFVBQUEsR0FBQSxHQUFBLGdCQUFBLEdBQUE7QUFBQSxTQUFBLFFBQUEsTUFBQSxFQUFBLGNBQUEsUUFBQSxJQUFBLEdBQUEsTUFBQSxDQUFBLElBQUEsQ0FBQSxNQUFBLE9BQUEsTUFBQSxDQUFBLHFCQUFBLFFBQUEsT0FBQSxHQUFBLE1BQUEsQ0FBQSxxQkFBQSxDQUFBLE1BQUEsT0FBQSxjQUFBLEVBQUEsT0FBQSxHQUFBLE9BQUEsQ0FBQSxNQUFBLFdBQUEsR0FBQSxXQUFBLE1BQUEsQ0FBQSx3QkFBQSxDQUFBLE1BQUEsRUFBQSxHQUFBLEVBQUEsVUFBQSxNQUFBLElBQUEsQ0FBQSxJQUFBLENBQUEsS0FBQSxDQUFBLElBQUEsRUFBQSxPQUFBLFlBQUEsSUFBQTtBQUFBLFNBQUEsY0FBQSxNQUFBLGFBQUEsQ0FBQSxNQUFBLENBQUEsR0FBQSxTQUFBLENBQUEsTUFBQSxFQUFBLENBQUEsVUFBQSxNQUFBLEdBQUEsU0FBQSxDQUFBLENBQUEsWUFBQSxTQUFBLENBQUEsQ0FBQSxZQUFBLENBQUEsUUFBQSxPQUFBLENBQUEsTUFBQSxDQUFBLE1BQUEsU0FBQSxPQUFBLFdBQUEsR0FBQSxJQUFBLGVBQUEsQ0FBQSxNQUFBLEVBQUEsR0FBQSxFQUFBLE1BQUEsQ0FBQSxHQUFBLG1CQUFBLE1BQUEsQ0FBQSx5QkFBQSxJQUFBLE1BQUEsQ0FBQSxnQkFBQSxDQUFBLE1BQUEsRUFBQSxNQUFBLENBQUEseUJBQUEsQ0FBQSxNQUFBLGFBQUEsT0FBQSxDQUFBLE1BQUEsQ0FBQSxNQUFBLEdBQUEsT0FBQSxXQUFBLEdBQUEsSUFBQSxNQUFBLENBQUEsY0FBQSxDQUFBLE1BQUEsRUFBQSxHQUFBLEVBQUEsTUFBQSxDQUFBLHdCQUFBLENBQUEsTUFBQSxFQUFBLEdBQUEsbUJBQUEsTUFBQTtBQUFBLFNBQUEsZ0JBQUEsR0FBQSxFQUFBLEdBQUEsRUFBQSxLQUFBLFFBQUEsR0FBQSxJQUFBLEdBQUEsSUFBQSxNQUFBLENBQUEsY0FBQSxDQUFBLEdBQUEsRUFBQSxHQUFBLElBQUEsS0FBQSxFQUFBLEtBQUEsRUFBQSxVQUFBLFFBQUEsWUFBQSxRQUFBLFFBQUEsb0JBQUEsR0FBQSxDQUFBLEdBQUEsSUFBQSxLQUFBLFdBQUEsR0FBQTtBQUFBLFNBQUEsbUJBQUEsR0FBQSxXQUFBLGtCQUFBLENBQUEsR0FBQSxLQUFBLGdCQUFBLENBQUEsR0FBQSxLQUFBLDJCQUFBLENBQUEsR0FBQSxLQUFBLGtCQUFBO0FBQUEsU0FBQSxtQkFBQSxjQUFBLFNBQUE7QUFBQSxTQUFBLDRCQUFBLENBQUEsRUFBQSxNQUFBLFNBQUEsQ0FBQSxxQkFBQSxDQUFBLHNCQUFBLGlCQUFBLENBQUEsQ0FBQSxFQUFBLE1BQUEsT0FBQSxDQUFBLEdBQUEsTUFBQSxDQUFBLFNBQUEsQ0FBQSxRQUFBLENBQUEsSUFBQSxDQUFBLENBQUEsRUFBQSxLQUFBLGFBQUEsQ0FBQSxpQkFBQSxDQUFBLENB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QUM1QixPQUFPLENBQUMsUUFBUSxDQUFDLHNCQUFVLENBQUM7QUFFNUIsSUFBSSxPQUFPLEdBQUcsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBRTtFQUN0QyxTQUFTLEVBQUU7QUFDWixDQUFFLENBQUM7QUFDSCxDQUFDLENBQUUsUUFBUSxDQUFDLElBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBRSxPQUFPLENBQUMsUUFBUyxDQUFDO0FBQUMsSUFBQSxRQUFBLEdBRS9CLE9BQU8sRUFDdEI7QUFBQSxPQUFBLGNBQUEsUUFBQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gcihlLG4sdCl7ZnVuY3Rpb24gbyhpLGYpe2lmKCFuW2ldKXtpZighZVtpXSl7dmFyIGM9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZTtpZighZiYmYylyZXR1cm4gYyhpLCEwKTtpZih1KXJldHVybiB1KGksITApO3ZhciBhPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIraStcIidcIik7dGhyb3cgYS5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGF9dmFyIHA9bltpXT17ZXhwb3J0czp7fX07ZVtpXVswXS5jYWxsKHAuZXhwb3J0cyxmdW5jdGlvbihyKXt2YXIgbj1lW2ldWzFdW3JdO3JldHVybiBvKG58fHIpfSxwLHAuZXhwb3J0cyxyLGUsbix0KX1yZXR1cm4gbltpXS5leHBvcnRzfWZvcih2YXIgdT1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlLGk9MDtpPHQubGVuZ3RoO2krKylvKHRbaV0pO3JldHVybiBvfXJldHVybiByfSkoKSIsIm1vZHVsZS5leHBvcnRzPXtcbiAgXCJuYW1lXCI6IFwicmF0ZXJcIixcbiAgXCJ2ZXJzaW9uXCI6IFwiMi43LjFcIixcbiAgXCJkZXNjcmlwdGlvblwiOiBcIldpa2lwZWRpYSB1c2Vyc2NyaXB0IHRoYXQgaGVscHMgYXNzZXNzIHBhZ2VzIGZvciBXaWtpUHJvamVjdHNcIixcbiAgXCJob21lcGFnZVwiOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9ldmFkMzcvcmF0ZXJcIixcbiAgXCJicm93c2VyXCI6IFwiaW5kZXguanNcIixcbiAgXCJzY3JpcHRzXCI6IHtcbiAgICBcInRlc3RcIjogXCJlY2hvIFxcXCJFcnJvcjogbm8gdGVzdCBzcGVjaWZpZWRcXFwiICYmIGV4aXQgMVwiLFxuICAgIFwibGludDplczVcIjogXCJqc2hpbnQgaW5kZXguanNcIixcbiAgICBcImxpbnQ6ZXM2XCI6IFwiZXNsaW50IGluZGV4LmpzIFxcXCJyYXRlci1zcmMvKipcXFwiXCIsXG4gICAgXCJsaW50OmZpeFwiOiBcImVzbGludCBpbmRleC5qcyBcXFwicmF0ZXItc3JjLyoqXFxcIiAtLWZpeFwiLFxuICAgIFwibGludFwiOiBcIm5wbSBydW4gbGludDplczYgJiYgbnBtIHJ1biBsaW50OmVzNVwiLFxuICAgIFwiYnVpbGQ6YnVuZGxlXCI6IFwiYnJvd3NlcmlmeSByYXRlci1zcmMvQXBwLmpzIC0tZGVidWcgLXQgYmFiZWxpZnkgLS1vdXRmaWxlIGRpc3QvcmF0ZXIuanNcIixcbiAgICBcImJ1aWxkOm1pbmlmeVwiOiBcInVnbGlmeWpzIGRpc3QvcmF0ZXIuanMgLS1jb21wcmVzcyAtYiBhc2NpaV9vbmx5PXRydWUsYmVhdXRpZnk9ZmFsc2UgLS1vdXRwdXQgZGlzdC9yYXRlci5taW4uanNcIixcbiAgICBcImJ1aWxkOmNvbmNhdFwiOiBcImNvbmNhdC1jbGkgLWYgXFxcImNvbW1lbnQtdG9wLmpzXFxcIiBkaXN0L3JhdGVyLm1pbi5qcyBcXFwiY29tbWVudC1ib3R0b20uanNcXFwiIC1vIGRpc3QvcmF0ZXIubWluLmpzXCIsXG4gICAgXCJidWlsZFwiOiBcIm5wbSBydW4gbGludCAmJiBucG0gcnVuIGJ1aWxkOmJ1bmRsZSAmJiBucG0gcnVuIGJ1aWxkOm1pbmlmeSAmJiBucG0gcnVuIGJ1aWxkOmNvbmNhdFwiXG4gIH0sXG4gIFwiYXV0aG9yXCI6IHtcbiAgICBcIm5hbWVcIjogXCJFdmFkMzdcIixcbiAgICBcInVybFwiOiBcImh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1VzZXI6RXZhZDM3XCJcbiAgfSxcbiAgXCJyZXBvc2l0b3J5XCI6IHtcbiAgICBcInR5cGVcIjogXCJnaXRcIixcbiAgICBcInVybFwiOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9ldmFkMzcvcmF0ZXIuZ2l0XCJcbiAgfSxcbiAgXCJsaWNlbnNlXCI6IFwiKE1JVCBPUiBDQy1CWS00LjApXCIsXG4gIFwiZGV2RGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcIkBiYWJlbC9jb3JlXCI6IFwiXjcuOS4wXCIsXG4gICAgXCJAYmFiZWwvcHJlc2V0LWVudlwiOiBcIl43LjkuMFwiLFxuICAgIFwiYmFiZWxpZnlcIjogXCJeMTAuMC4wXCIsXG4gICAgXCJicm93c2VyaWZ5XCI6IFwiXjE2LjUuMFwiLFxuICAgIFwiY29uY2F0LWNsaVwiOiBcIl40LjAuMFwiLFxuICAgIFwiZXNsaW50XCI6IFwiXjYuOC4wXCIsXG4gICAgXCJqc2hpbnRcIjogXCJeMi4xMS4wXCIsXG4gICAgXCJ1Z2xpZnktanNcIjogXCJeMy44LjBcIlxuICB9XG59XG4iLCJpbXBvcnQgc2V0dXBSYXRlciBmcm9tIFwiLi9zZXR1cFwiO1xyXG5pbXBvcnQgYXV0b1N0YXJ0IGZyb20gXCIuL2F1dG9zdGFydFwiO1xyXG5pbXBvcnQgc3R5bGVzIGZyb20gXCIuL2Nzcy5qc1wiO1xyXG5pbXBvcnQgeyBtYWtlRXJyb3JNc2cgfSBmcm9tIFwiLi9hcGlcIjtcclxuaW1wb3J0IHdpbmRvd01hbmFnZXIgZnJvbSBcIi4vd2luZG93TWFuYWdlclwiO1xyXG4vLyA8bm93aWtpPlxyXG5cclxuKGZ1bmN0aW9uIEFwcCgpIHtcclxuXHRsZXQgc3R5bGVzaGVldDtcclxuXHJcblx0Y29uc3Qgc2hvd01haW5XaW5kb3cgPSBkYXRhID0+IHtcclxuXHRcdGlmICghZGF0YSB8fCAhZGF0YS5zdWNjZXNzKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHRcdGlmIChzdHlsZXNoZWV0KSB7XHJcblx0XHRcdHN0eWxlc2hlZXQuZGlzYWJsZWQgPSBmYWxzZTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHN0eWxlc2hlZXQgPSBtdy51dGlsLmFkZENTUyhzdHlsZXMpO1xyXG5cdFx0fVxyXG5cdFx0Ly8gQWRkIGNzcyBjbGFzcyB0byBib2R5IHRvIGVuYWJsZSBiYWNrZ3JvdW5kIHNjcm9sbGluZ1xyXG5cdFx0ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJib2R5XCIpWzBdLmNsYXNzTGlzdC5hZGQoXCJyYXRlci1tYWluV2luZG93LW9wZW5cIik7XHJcblx0XHQvLyBPcGVuIHRoZSB3aW5kb3dcclxuXHRcdHdpbmRvd01hbmFnZXIub3BlbldpbmRvdyhcIm1haW5cIiwgZGF0YSlcclxuXHRcdFx0LmNsb3NlZC50aGVuKCByZXN1bHQgPT4ge1xyXG5cdFx0XHRcdC8vIERpc2FibGUvcmVtb3ZlIHRoZSBjc3Mgc3R5bGVzLCBzbyBhcyB0byBub3QgaW50ZXJmZXJlIHdpdGggb3RoZXIgc2NyaXB0cy9jb250ZW50L09PVUkgd2luZG93c1xyXG5cdFx0XHRcdGlmIChzdHlsZXNoZWV0KSB7IHN0eWxlc2hlZXQuZGlzYWJsZWQgPSB0cnVlOyB9XHJcblx0XHRcdFx0ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJib2R5XCIpWzBdLmNsYXNzTGlzdC5yZW1vdmUoXCJyYXRlci1tYWluV2luZG93LW9wZW5cIik7XHJcblx0XHRcdFx0Ly8gUmVzdGFydCBpZiBuZWVkZWRcclxuXHRcdFx0XHRpZiAocmVzdWx0ICYmIHJlc3VsdC5yZXN0YXJ0KSB7XHJcblx0XHRcdFx0XHR3aW5kb3dNYW5hZ2VyLnJlbW92ZVdpbmRvd3MoW1wibWFpblwiXSlcclxuXHRcdFx0XHRcdFx0LnRoZW4oc2V0dXBSYXRlcilcclxuXHRcdFx0XHRcdFx0LnRoZW4oc2hvd01haW5XaW5kb3csIHNob3dTZXR1cEVycm9yKTtcclxuXHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0Ly8gU2hvdyBub3RpZmljYXRpb24gd2hlbiBzYXZlZCBzdWNjZXNzZnVsbHlcclxuXHRcdFx0XHRpZiAocmVzdWx0ICYmIHJlc3VsdC5zdWNjZXNzKSB7XHJcblx0XHRcdFx0XHRjb25zdCAkbWVzc2FnZSA9ICQoXCI8c3Bhbj5cIikuYXBwZW5kKFxyXG5cdFx0XHRcdFx0XHQkKFwiPHN0cm9uZz5cIikudGV4dChcIlJhdGluZ3Mgc2F2ZWQgc3VjY2Vzc2Z1bGx5LlwiKVxyXG5cdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdGlmIChyZXN1bHQudXBncmFkZWRTdHViKSB7XHJcblx0XHRcdFx0XHRcdCRtZXNzYWdlLmFwcGVuZChcclxuXHRcdFx0XHRcdFx0XHQkKFwiPGJyPlwiKSxcclxuXHRcdFx0XHRcdFx0XHQvLyBUT0RPOiBUaGVyZSBzaG91bGQgYmUgYSBsaW5rIHRoYXQgd2lsbCBlZGl0IHRoZSBhcnRpY2xlIGZvciB5b3VcclxuXHRcdFx0XHRcdFx0XHQkKFwiPHNwYW4+XCIpLnRleHQoXCJOb3RlIHRoYXQgdGhlIGFydGljbGUgYXBwZWFycyB0byBiZSB0YWdnZWQgYXMgYSBzdHViLlwiKVxyXG5cdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0bXcubm90aWZ5KFxyXG5cdFx0XHRcdFx0XHQkbWVzc2FnZSxcclxuXHRcdFx0XHRcdFx0eyBhdXRvSGlkZTogdHJ1ZSwgYXV0b0hpZGVTZWNvbmRzOiBcImxvbmdcIiwgdGFnOiBcIlJhdGVyLXNhdmVkXCIgfVxyXG5cdFx0XHRcdFx0KTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0gKTtcclxuXHR9O1xyXG5cclxuXHRjb25zdCBzaG93U2V0dXBFcnJvciA9IChjb2RlLCBqcXhocikgPT4gT08udWkuYWxlcnQoXHJcblx0XHRtYWtlRXJyb3JNc2coY29kZSwganF4aHIpLFx0e1xyXG5cdFx0XHR0aXRsZTogXCJSYXRlciBmYWlsZWQgdG8gb3BlblwiXHJcblx0XHR9XHJcblx0KTtcclxuXHJcblx0Ly8gSW52b2NhdGlvbiBieSBwb3J0bGV0IGxpbmsgXHJcblx0bXcudXRpbC5hZGRQb3J0bGV0TGluayhcclxuXHRcdFwicC1jYWN0aW9uc1wiLFxyXG5cdFx0XCIjXCIsXHJcblx0XHRcIlJhdGVyXCIsXHJcblx0XHRcImNhLXJhdGVyXCIsXHJcblx0XHRcIlJhdGUgcXVhbGl0eSBhbmQgaW1wb3J0YW5jZVwiLFxyXG5cdFx0XCI1XCJcclxuXHQpO1xyXG5cdCQoXCIjY2EtcmF0ZXJcIikuY2xpY2soZXZlbnQgPT4ge1xyXG5cdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHRcdHNldHVwUmF0ZXIoKS50aGVuKHNob3dNYWluV2luZG93LCBzaG93U2V0dXBFcnJvcik7XHJcblx0fSk7XHJcblxyXG5cdC8vIEludm9jYXRpb24gYnkgYXV0by1zdGFydCAoZG8gbm90IHNob3cgbWVzc2FnZSBvbiBlcnJvcilcclxuXHRhdXRvU3RhcnQoKS50aGVuKHNob3dNYWluV2luZG93KTtcclxufSkoKTtcclxuLy8gPC9ub3dpa2k+IiwiaW1wb3J0IEFQSSBmcm9tIFwiLi9hcGlcIjtcclxuaW1wb3J0IHtpc0FmdGVyRGF0ZSwgbW9zdEZyZXF1ZW50LCBmaWx0ZXJBbmRNYXB9IGZyb20gXCIuL3V0aWxcIjtcclxuaW1wb3J0IGNvbmZpZyBmcm9tIFwiLi9jb25maWdcIjtcclxuaW1wb3J0ICogYXMgY2FjaGUgZnJvbSBcIi4vY2FjaGVcIjtcclxuLy8gPG5vd2lraT5cclxuXHJcbi8qKiBUZW1wbGF0ZVxyXG4gKlxyXG4gKiBAY2xhc3NcclxuICogUmVwcmVzZW50cyB0aGUgd2lraXRleHQgb2YgdGVtcGxhdGUgdHJhbnNjbHVzaW9uLiBVc2VkIGJ5ICNwYXJzZVRlbXBsYXRlcy5cclxuICogQHByb3Age1N0cmluZ30gbmFtZSBOYW1lIG9mIHRoZSB0ZW1wbGF0ZVxyXG4gKiBAcHJvcCB7U3RyaW5nfSB3aWtpdGV4dCBGdWxsIHdpa2l0ZXh0IG9mIHRoZSB0cmFuc2NsdXNpb25cclxuICogQHByb3Age09iamVjdFtdfSBwYXJhbWV0ZXJzIFBhcmFtZXRlcnMgdXNlZCBpbiB0aGUgdHJhbnNsY3VzaW9uLCBpbiBvcmRlciwgb2YgZm9ybTpcclxuXHR7XHJcblx0XHRuYW1lOiB7U3RyaW5nfE51bWJlcn0gcGFyYW1ldGVyIG5hbWUsIG9yIHBvc2l0aW9uIGZvciB1bm5hbWVkIHBhcmFtZXRlcnMsXHJcblx0XHR2YWx1ZToge1N0cmluZ30gV2lraXRleHQgcGFzc2VkIHRvIHRoZSBwYXJhbWV0ZXIgKHdoaXRlc3BhY2UgdHJpbW1lZCksXHJcblx0XHR3aWtpdGV4dDoge1N0cmluZ30gRnVsbCB3aWtpdGV4dCAoaW5jbHVkaW5nIGxlYWRpbmcgcGlwZSwgcGFyYW1ldGVyIG5hbWUvZXF1YWxzIHNpZ24gKGlmIGFwcGxpY2FibGUpLCB2YWx1ZSwgYW5kIGFueSB3aGl0ZXNwYWNlKVxyXG5cdH1cclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSB3aWtpdGV4dCBXaWtpdGV4dCBvZiBhIHRlbXBsYXRlIHRyYW5zY2x1c2lvbiwgc3RhcnRpbmcgd2l0aCAne3snIGFuZCBlbmRpbmcgd2l0aCAnfX0nLlxyXG4gKi9cclxudmFyIFRlbXBsYXRlID0gZnVuY3Rpb24od2lraXRleHQpIHtcclxuXHR0aGlzLndpa2l0ZXh0ID0gd2lraXRleHQ7XHJcblx0dGhpcy5wYXJhbWV0ZXJzID0gW107XHJcblx0Ly8gU3BhY2luZyBhcm91bmQgcGlwZXMsIGVxdWFscyBzaWducywgZW5kIGJyYWNlcyAoZGVmYXVsdHMpXHJcblx0dGhpcy5waXBlU3R5bGUgPSBcIiB8XCI7XHJcblx0dGhpcy5lcXVhbHNTdHlsZSA9IFwiPVwiO1xyXG5cdHRoaXMuZW5kQnJhY2VzU3R5bGUgPSBcIn19XCI7XHJcbn07XHJcblRlbXBsYXRlLnByb3RvdHlwZS5hZGRQYXJhbSA9IGZ1bmN0aW9uKG5hbWUsIHZhbCwgd2lraXRleHQpIHtcclxuXHR0aGlzLnBhcmFtZXRlcnMucHVzaCh7XHJcblx0XHRcIm5hbWVcIjogbmFtZSxcclxuXHRcdFwidmFsdWVcIjogdmFsLCBcclxuXHRcdFwid2lraXRleHRcIjogXCJ8XCIgKyB3aWtpdGV4dFxyXG5cdH0pO1xyXG59O1xyXG4vKipcclxuICogR2V0IGEgcGFyYW1ldGVyIGRhdGEgYnkgcGFyYW1ldGVyIG5hbWVcclxuICovIFxyXG5UZW1wbGF0ZS5wcm90b3R5cGUuZ2V0UGFyYW0gPSBmdW5jdGlvbihwYXJhbU5hbWUpIHtcclxuXHRyZXR1cm4gdGhpcy5wYXJhbWV0ZXJzLmZpbmQoZnVuY3Rpb24ocCkgeyByZXR1cm4gcC5uYW1lID09IHBhcmFtTmFtZTsgfSk7XHJcbn07XHJcblRlbXBsYXRlLnByb3RvdHlwZS5zZXROYW1lID0gZnVuY3Rpb24obmFtZSkge1xyXG5cdHRoaXMubmFtZSA9IG5hbWUudHJpbSgpO1xyXG59O1xyXG5UZW1wbGF0ZS5wcm90b3R5cGUuZ2V0VGl0bGUgPSBmdW5jdGlvbigpIHtcclxuXHRyZXR1cm4gbXcuVGl0bGUubmV3RnJvbVRleHQoXCJUZW1wbGF0ZTpcIiArIHRoaXMubmFtZSk7XHJcbn07XHJcblxyXG4vKipcclxuICogcGFyc2VUZW1wbGF0ZXNcclxuICpcclxuICogUGFyc2VzIHRlbXBsYXRlcyBmcm9tIHdpa2l0ZXh0LlxyXG4gKiBCYXNlZCBvbiBTRDAwMDEncyB2ZXJzaW9uIGF0IDxodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Vc2VyOlNEMDAwMS9wYXJzZUFsbFRlbXBsYXRlcy5qcz4uXHJcbiAqIFJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgdGVtcGxhdGUgZGV0YWlsczpcclxuICogIHZhciB0ZW1wbGF0ZXMgPSBwYXJzZVRlbXBsYXRlcyhcIkhlbGxvIHt7Zm9vIHxCYXJ8YmF6PXF1eCB8Mj1sb3JlbWlwc3VtfDM9fX0gd29ybGRcIik7XHJcbiAqICBjb25zb2xlLmxvZyh0ZW1wbGF0ZXNbMF0pOyAvLyAtLT4gb2JqZWN0XHJcblx0e1xyXG5cdFx0bmFtZTogXCJmb29cIixcclxuXHRcdHdpa2l0ZXh0Olwie3tmb28gfEJhcnxiYXo9cXV4IHwgMiA9IGxvcmVtaXBzdW0gIHwzPX19XCIsXHJcblx0XHRwYXJhbWV0ZXJzOiBbXHJcblx0XHRcdHtcclxuXHRcdFx0XHRuYW1lOiAxLFxyXG5cdFx0XHRcdHZhbHVlOiAnQmFyJyxcclxuXHRcdFx0XHR3aWtpdGV4dDogJ3xCYXInXHJcblx0XHRcdH0sXHJcblx0XHRcdHtcclxuXHRcdFx0XHRuYW1lOiAnYmF6JyxcclxuXHRcdFx0XHR2YWx1ZTogJ3F1eCcsXHJcblx0XHRcdFx0d2lraXRleHQ6ICd8YmF6PXF1eCAnXHJcblx0XHRcdH0sXHJcblx0XHRcdHtcclxuXHRcdFx0XHRuYW1lOiAnMicsXHJcblx0XHRcdFx0dmFsdWU6ICdsb3JlbWlwc3VtJyxcclxuXHRcdFx0XHR3aWtpdGV4dDogJ3wgMiA9IGxvcmVtaXBzdW0gICdcclxuXHRcdFx0fSxcclxuXHRcdFx0e1xyXG5cdFx0XHRcdG5hbWU6ICczJyxcclxuXHRcdFx0XHR2YWx1ZTogJycsXHJcblx0XHRcdFx0d2lraXRleHQ6ICd8Mz0nXHJcblx0XHRcdH1cclxuXHRcdF0sXHJcblx0XHRnZXRQYXJhbTogZnVuY3Rpb24ocGFyYW1OYW1lKSB7XHJcblx0XHRcdHJldHVybiB0aGlzLnBhcmFtZXRlcnMuZmluZChmdW5jdGlvbihwKSB7IHJldHVybiBwLm5hbWUgPT0gcGFyYW1OYW1lOyB9KTtcclxuXHRcdH1cclxuXHR9XHJcbiAqICAgIFxyXG4gKiBcclxuICogQHBhcmFtIHtTdHJpbmd9IHdpa2l0ZXh0XHJcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gcmVjdXJzaXZlIFNldCB0byBgdHJ1ZWAgdG8gYWxzbyBwYXJzZSB0ZW1wbGF0ZXMgdGhhdCBvY2N1ciB3aXRoaW4gb3RoZXIgdGVtcGxhdGVzLFxyXG4gKiAgcmF0aGVyIHRoYW4ganVzdCB0b3AtbGV2ZWwgdGVtcGxhdGVzLiBcclxuICogQHJldHVybiB7VGVtcGxhdGVbXX0gdGVtcGxhdGVzXHJcbiovXHJcbnZhciBwYXJzZVRlbXBsYXRlcyA9IGZ1bmN0aW9uKHdpa2l0ZXh0LCByZWN1cnNpdmUpIHsgLyogZXNsaW50LWRpc2FibGUgbm8tY29udHJvbC1yZWdleCAqL1xyXG5cdGlmICghd2lraXRleHQpIHtcclxuXHRcdHJldHVybiBbXTtcclxuXHR9XHJcblx0dmFyIHN0clJlcGxhY2VBdCA9IGZ1bmN0aW9uKHN0cmluZywgaW5kZXgsIGNoYXIpIHtcclxuXHRcdHJldHVybiBzdHJpbmcuc2xpY2UoMCxpbmRleCkgKyBjaGFyICsgc3RyaW5nLnNsaWNlKGluZGV4ICsgMSk7XHJcblx0fTtcclxuXHJcblx0dmFyIHJlc3VsdCA9IFtdO1xyXG5cdFxyXG5cdHZhciBwcm9jZXNzVGVtcGxhdGVUZXh0ID0gZnVuY3Rpb24gKHN0YXJ0SWR4LCBlbmRJZHgpIHtcclxuXHRcdHZhciB0ZXh0ID0gd2lraXRleHQuc2xpY2Uoc3RhcnRJZHgsIGVuZElkeCk7XHJcblxyXG5cdFx0dmFyIHRlbXBsYXRlID0gbmV3IFRlbXBsYXRlKFwie3tcIiArIHRleHQucmVwbGFjZSgvXFx4MDEvZyxcInxcIikgKyBcIn19XCIpO1xyXG5cdFx0XHJcblx0XHQvLyBzd2FwIG91dCBwaXBlIGluIGxpbmtzIHdpdGggXFx4MDEgY29udHJvbCBjaGFyYWN0ZXJcclxuXHRcdC8vIFtbRmlsZTogXV0gY2FuIGhhdmUgbXVsdGlwbGUgcGlwZXMsIHNvIG1pZ2h0IG5lZWQgbXVsdGlwbGUgcGFzc2VzXHJcblx0XHR3aGlsZSAoIC8oXFxbXFxbW15cXF1dKj8pXFx8KC4qP1xcXVxcXSkvZy50ZXN0KHRleHQpICkge1xyXG5cdFx0XHR0ZXh0ID0gdGV4dC5yZXBsYWNlKC8oXFxbXFxbW15cXF1dKj8pXFx8KC4qP1xcXVxcXSkvZywgXCIkMVxceDAxJDJcIik7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gRmlndXJlIG91dCBtb3N0LXVzZWQgc3BhY2luZyBzdHlsZXMgZm9yIHBpcGVzL2VxdWFsc1xyXG5cdFx0dGVtcGxhdGUucGlwZVN0eWxlID0gbW9zdEZyZXF1ZW50KCB0ZXh0Lm1hdGNoKC9bXFxzXFxuXSpcXHxbXFxzXFxuXSovZykgKSB8fCBcIiB8XCI7XHJcblx0XHR0ZW1wbGF0ZS5lcXVhbHNTdHlsZSA9IG1vc3RGcmVxdWVudCggdGV4dC5yZXBsYWNlKC8oPVtefF0qKT0rL2csIFwiJDFcIikubWF0Y2goL1tcXHNcXG5dKj1bXFxzXFxuXSovZykgKSB8fCBcIj1cIjtcclxuXHRcdC8vIEZpZ3VyZSBvdXQgZW5kLWJyYWNlcyBzdHlsZVxyXG5cdFx0dmFyIGVuZFNwYWNpbmcgPSB0ZXh0Lm1hdGNoKC9bXFxzXFxuXSokLyk7XHJcblx0XHR0ZW1wbGF0ZS5lbmRCcmFjZXNTdHlsZSA9IChlbmRTcGFjaW5nID8gZW5kU3BhY2luZ1swXSA6IFwiXCIpICsgXCJ9fVwiO1xyXG5cclxuXHRcdHZhciBjaHVua3MgPSB0ZXh0LnNwbGl0KFwifFwiKS5tYXAoZnVuY3Rpb24oY2h1bmspIHtcclxuXHRcdFx0Ly8gY2hhbmdlICdcXHgwMScgY29udHJvbCBjaGFyYWN0ZXJzIGJhY2sgdG8gcGlwZXNcclxuXHRcdFx0cmV0dXJuIGNodW5rLnJlcGxhY2UoL1xceDAxL2csXCJ8XCIpOyBcclxuXHRcdH0pO1xyXG5cclxuXHRcdHRlbXBsYXRlLnNldE5hbWUoY2h1bmtzWzBdKTtcclxuXHRcdFxyXG5cdFx0dmFyIHBhcmFtZXRlckNodW5rcyA9IGNodW5rcy5zbGljZSgxKTtcclxuXHJcblx0XHR2YXIgdW5uYW1lZElkeCA9IDE7XHJcblx0XHRwYXJhbWV0ZXJDaHVua3MuZm9yRWFjaChmdW5jdGlvbihjaHVuaykge1xyXG5cdFx0XHR2YXIgaW5kZXhPZkVxdWFsVG8gPSBjaHVuay5pbmRleE9mKFwiPVwiKTtcclxuXHRcdFx0dmFyIGluZGV4T2ZPcGVuQnJhY2VzID0gY2h1bmsuaW5kZXhPZihcInt7XCIpO1xyXG5cdFx0XHRcclxuXHRcdFx0dmFyIGlzV2l0aG91dEVxdWFscyA9ICFjaHVuay5pbmNsdWRlcyhcIj1cIik7XHJcblx0XHRcdHZhciBoYXNCcmFjZXNCZWZvcmVFcXVhbHMgPSBjaHVuay5pbmNsdWRlcyhcInt7XCIpICYmIGluZGV4T2ZPcGVuQnJhY2VzIDwgaW5kZXhPZkVxdWFsVG87XHRcclxuXHRcdFx0dmFyIGlzVW5uYW1lZFBhcmFtID0gKCBpc1dpdGhvdXRFcXVhbHMgfHwgaGFzQnJhY2VzQmVmb3JlRXF1YWxzICk7XHJcblx0XHRcdFxyXG5cdFx0XHR2YXIgcE5hbWUsIHBOdW0sIHBWYWw7XHJcblx0XHRcdGlmICggaXNVbm5hbWVkUGFyYW0gKSB7XHJcblx0XHRcdFx0Ly8gR2V0IHRoZSBuZXh0IG51bWJlciBub3QgYWxyZWFkeSB1c2VkIGJ5IGVpdGhlciBhbiB1bm5hbWVkIHBhcmFtZXRlciwgb3IgYnkgYVxyXG5cdFx0XHRcdC8vIG5hbWVkIHBhcmFtZXRlciBsaWtlIGB8MT12YWxgXHJcblx0XHRcdFx0d2hpbGUgKCB0ZW1wbGF0ZS5nZXRQYXJhbSh1bm5hbWVkSWR4KSApIHtcclxuXHRcdFx0XHRcdHVubmFtZWRJZHgrKztcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0cE51bSA9IHVubmFtZWRJZHg7XHJcblx0XHRcdFx0cFZhbCA9IGNodW5rLnRyaW0oKTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRwTmFtZSA9IGNodW5rLnNsaWNlKDAsIGluZGV4T2ZFcXVhbFRvKS50cmltKCk7XHJcblx0XHRcdFx0cFZhbCA9IGNodW5rLnNsaWNlKGluZGV4T2ZFcXVhbFRvICsgMSkudHJpbSgpO1xyXG5cdFx0XHR9XHJcblx0XHRcdHRlbXBsYXRlLmFkZFBhcmFtKHBOYW1lIHx8IHBOdW0sIHBWYWwsIGNodW5rKTtcclxuXHRcdH0pO1xyXG5cdFx0XHJcblx0XHRyZXN1bHQucHVzaCh0ZW1wbGF0ZSk7XHJcblx0fTtcclxuXHJcblx0XHJcblx0dmFyIG4gPSB3aWtpdGV4dC5sZW5ndGg7XHJcblx0XHJcblx0Ly8gbnVtYmVyIG9mIHVuY2xvc2VkIGJyYWNlc1xyXG5cdHZhciBudW1VbmNsb3NlZCA9IDA7XHJcblxyXG5cdC8vIGFyZSB3ZSBpbnNpZGUgYSBjb21tZW50LCBvciBiZXR3ZWVuIG5vd2lraSB0YWdzLCBvciBpbiBhIHt7e3BhcmFtZXRlcn19fT9cclxuXHR2YXIgaW5Db21tZW50ID0gZmFsc2U7XHJcblx0dmFyIGluTm93aWtpID0gZmFsc2U7XHJcblx0dmFyIGluUGFyYW1ldGVyID0gZmFsc2U7XHJcblxyXG5cdHZhciBzdGFydElkeCwgZW5kSWR4O1xyXG5cdFxyXG5cdGZvciAodmFyIGk9MDsgaTxuOyBpKyspIHtcclxuXHRcdFxyXG5cdFx0aWYgKCAhaW5Db21tZW50ICYmICFpbk5vd2lraSAmJiAhaW5QYXJhbWV0ZXIgKSB7XHJcblxyXG5cdFx0XHRpZiAod2lraXRleHRbaV0gPT09IFwie1wiICYmIHdpa2l0ZXh0W2krMV0gPT09IFwie1wiICYmIHdpa2l0ZXh0W2krMl0gPT09IFwie1wiICYmIHdpa2l0ZXh0W2krM10gIT09IFwie1wiKSB7XHJcblx0XHRcdFx0aW5QYXJhbWV0ZXIgPSB0cnVlO1xyXG5cdFx0XHRcdGkgKz0gMjtcclxuXHRcdFx0fSBlbHNlIGlmICh3aWtpdGV4dFtpXSA9PT0gXCJ7XCIgJiYgd2lraXRleHRbaSsxXSA9PT0gXCJ7XCIpIHtcclxuXHRcdFx0XHRpZiAobnVtVW5jbG9zZWQgPT09IDApIHtcclxuXHRcdFx0XHRcdHN0YXJ0SWR4ID0gaSsyO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRudW1VbmNsb3NlZCArPSAyO1xyXG5cdFx0XHRcdGkrKztcclxuXHRcdFx0fSBlbHNlIGlmICh3aWtpdGV4dFtpXSA9PT0gXCJ9XCIgJiYgd2lraXRleHRbaSsxXSA9PT0gXCJ9XCIpIHtcclxuXHRcdFx0XHRpZiAobnVtVW5jbG9zZWQgPT09IDIpIHtcclxuXHRcdFx0XHRcdGVuZElkeCA9IGk7XHJcblx0XHRcdFx0XHRwcm9jZXNzVGVtcGxhdGVUZXh0KHN0YXJ0SWR4LCBlbmRJZHgpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRudW1VbmNsb3NlZCAtPSAyO1xyXG5cdFx0XHRcdGkrKztcclxuXHRcdFx0fSBlbHNlIGlmICh3aWtpdGV4dFtpXSA9PT0gXCJ8XCIgJiYgbnVtVW5jbG9zZWQgPiAyKSB7XHJcblx0XHRcdFx0Ly8gc3dhcCBvdXQgcGlwZXMgaW4gbmVzdGVkIHRlbXBsYXRlcyB3aXRoIFxceDAxIGNoYXJhY3RlclxyXG5cdFx0XHRcdHdpa2l0ZXh0ID0gc3RyUmVwbGFjZUF0KHdpa2l0ZXh0LCBpLFwiXFx4MDFcIik7XHJcblx0XHRcdH0gZWxzZSBpZiAoIC9ePCEtLS8udGVzdCh3aWtpdGV4dC5zbGljZShpLCBpICsgNCkpICkge1xyXG5cdFx0XHRcdGluQ29tbWVudCA9IHRydWU7XHJcblx0XHRcdFx0aSArPSAzO1xyXG5cdFx0XHR9IGVsc2UgaWYgKCAvXjxub3dpa2kgPz4vLnRlc3Qod2lraXRleHQuc2xpY2UoaSwgaSArIDkpKSApIHtcclxuXHRcdFx0XHRpbk5vd2lraSA9IHRydWU7XHJcblx0XHRcdFx0aSArPSA3O1xyXG5cdFx0XHR9IFxyXG5cclxuXHRcdH0gZWxzZSB7IC8vIHdlIGFyZSBpbiBhIGNvbW1lbnQgb3Igbm93aWtpIG9yIHt7e3BhcmFtZXRlcn19fVxyXG5cdFx0XHRpZiAod2lraXRleHRbaV0gPT09IFwifFwiKSB7XHJcblx0XHRcdFx0Ly8gc3dhcCBvdXQgcGlwZXMgd2l0aCBcXHgwMSBjaGFyYWN0ZXJcclxuXHRcdFx0XHR3aWtpdGV4dCA9IHN0clJlcGxhY2VBdCh3aWtpdGV4dCwgaSxcIlxceDAxXCIpO1xyXG5cdFx0XHR9IGVsc2UgaWYgKC9eLS0+Ly50ZXN0KHdpa2l0ZXh0LnNsaWNlKGksIGkgKyAzKSkpIHtcclxuXHRcdFx0XHRpbkNvbW1lbnQgPSBmYWxzZTtcclxuXHRcdFx0XHRpICs9IDI7XHJcblx0XHRcdH0gZWxzZSBpZiAoL148XFwvbm93aWtpID8+Ly50ZXN0KHdpa2l0ZXh0LnNsaWNlKGksIGkgKyAxMCkpKSB7XHJcblx0XHRcdFx0aW5Ob3dpa2kgPSBmYWxzZTtcclxuXHRcdFx0XHRpICs9IDg7XHJcblx0XHRcdH0gZWxzZSBpZiAod2lraXRleHRbaV0gPT09IFwifVwiICYmIHdpa2l0ZXh0W2krMV0gPT09IFwifVwiICYmIHdpa2l0ZXh0W2krMl0gPT09IFwifVwiKSB7XHJcblx0XHRcdFx0aW5QYXJhbWV0ZXIgPSBmYWxzZTtcclxuXHRcdFx0XHRpICs9IDI7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cdFxyXG5cdGlmICggcmVjdXJzaXZlICkge1xyXG5cdFx0dmFyIHN1YnRlbXBsYXRlcyA9IGZpbHRlckFuZE1hcChyZXN1bHQsXHJcblx0XHRcdHRlbXBsYXRlID0+IC9cXHtcXHsoPzoufFxcbikqXFx9XFx9Ly50ZXN0KHRlbXBsYXRlLndpa2l0ZXh0LnNsaWNlKDIsLTIpKSxcclxuXHRcdFx0dGVtcGxhdGUgPT4gcGFyc2VUZW1wbGF0ZXModGVtcGxhdGUud2lraXRleHQuc2xpY2UoMiwtMiksIHRydWUpXHJcblx0XHQpO1xyXG5cdFx0cmV0dXJuIHJlc3VsdC5jb25jYXQuYXBwbHkocmVzdWx0LCBzdWJ0ZW1wbGF0ZXMpO1xyXG5cdH1cclxuXHJcblx0cmV0dXJuIHJlc3VsdDsgXHJcbn07IC8qIGVzbGludC1lbmFibGUgbm8tY29udHJvbC1yZWdleCAqL1xyXG5cclxuLyoqXHJcbiAqIEBwYXJhbSB7VGVtcGxhdGV8VGVtcGxhdGVbXX0gdGVtcGxhdGVzXHJcbiAqIEByZXR1cm4ge1Byb21pc2U8VGVtcGxhdGU+fFByb21pc2U8VGVtcGxhdGVbXT59XHJcbiAqL1xyXG52YXIgZ2V0V2l0aFJlZGlyZWN0VG8gPSBmdW5jdGlvbih0ZW1wbGF0ZXMpIHtcclxuXHR2YXIgdGVtcGxhdGVzQXJyYXkgPSBBcnJheS5pc0FycmF5KHRlbXBsYXRlcykgPyB0ZW1wbGF0ZXMgOiBbdGVtcGxhdGVzXTtcclxuXHRpZiAodGVtcGxhdGVzQXJyYXkubGVuZ3RoID09PSAwKSB7XHJcblx0XHRyZXR1cm4gJC5EZWZlcnJlZCgpLnJlc29sdmUoW10pO1xyXG5cdH1cclxuXHJcblx0cmV0dXJuIEFQSS5nZXQoe1xyXG5cdFx0XCJhY3Rpb25cIjogXCJxdWVyeVwiLFxyXG5cdFx0XCJmb3JtYXRcIjogXCJqc29uXCIsXHJcblx0XHRcInRpdGxlc1wiOiBmaWx0ZXJBbmRNYXAodGVtcGxhdGVzQXJyYXksXHJcblx0XHRcdHRlbXBsYXRlID0+IHRlbXBsYXRlLmdldFRpdGxlKCkgIT09IG51bGwsXHJcblx0XHRcdHRlbXBsYXRlID0+IHRlbXBsYXRlLmdldFRpdGxlKCkuZ2V0UHJlZml4ZWRUZXh0KClcclxuXHRcdCksXHJcblx0XHRcInJlZGlyZWN0c1wiOiAxXHJcblx0fSkudGhlbihmdW5jdGlvbihyZXN1bHQpIHtcclxuXHRcdGlmICggIXJlc3VsdCB8fCAhcmVzdWx0LnF1ZXJ5ICkge1xyXG5cdFx0XHRyZXR1cm4gJC5EZWZlcnJlZCgpLnJlamVjdChcIkVtcHR5IHJlc3BvbnNlXCIpO1xyXG5cdFx0fVxyXG5cdFx0aWYgKCByZXN1bHQucXVlcnkucmVkaXJlY3RzICkge1xyXG5cdFx0XHRyZXN1bHQucXVlcnkucmVkaXJlY3RzLmZvckVhY2goZnVuY3Rpb24ocmVkaXJlY3QpIHtcclxuXHRcdFx0XHR2YXIgaSA9IHRlbXBsYXRlc0FycmF5LmZpbmRJbmRleCh0ZW1wbGF0ZSA9PiB7XHJcblx0XHRcdFx0XHRsZXQgdGl0bGUgPSB0ZW1wbGF0ZS5nZXRUaXRsZSgpO1xyXG5cdFx0XHRcdFx0cmV0dXJuIHRpdGxlICYmIHRpdGxlLmdldFByZWZpeGVkVGV4dCgpID09PSByZWRpcmVjdC5mcm9tO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHRcdGlmIChpICE9PSAtMSkge1xyXG5cdFx0XHRcdFx0dGVtcGxhdGVzQXJyYXlbaV0ucmVkaXJlY3RUYXJnZXQgPSBtdy5UaXRsZS5uZXdGcm9tVGV4dChyZWRpcmVjdC50byk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHRcdHJldHVybiBBcnJheS5pc0FycmF5KHRlbXBsYXRlcykgPyB0ZW1wbGF0ZXNBcnJheSA6IHRlbXBsYXRlc0FycmF5WzBdO1xyXG5cdH0pO1xyXG59O1xyXG5cclxuVGVtcGxhdGUucHJvdG90eXBlLmdldERhdGFGb3JQYXJhbSA9IGZ1bmN0aW9uKGtleSwgcGFyYU5hbWUpIHtcclxuXHRpZiAoICF0aGlzLnBhcmFtRGF0YSApIHtcclxuXHRcdHJldHVybiBudWxsO1xyXG5cdH1cclxuXHQvLyBJZiBhbGlhcywgc3dpdGNoIGZyb20gYWxpYXMgdG8gcHJlZmVycmVkIHBhcmFtZXRlciBuYW1lXHJcblx0dmFyIHBhcmEgPSB0aGlzLnBhcmFtQWxpYXNlc1twYXJhTmFtZV0gfHwgcGFyYU5hbWU7XHRcclxuXHRpZiAoICF0aGlzLnBhcmFtRGF0YVtwYXJhXSApIHtcclxuXHRcdHJldHVybjtcclxuXHR9XHJcblx0XHJcblx0dmFyIGRhdGEgPSB0aGlzLnBhcmFtRGF0YVtwYXJhXVtrZXldO1xyXG5cdC8vIERhdGEgbWlnaHQgYWN0dWFsbHkgYmUgYW4gb2JqZWN0IHdpdGgga2V5IFwiZW5cIlxyXG5cdGlmICggZGF0YSAmJiBkYXRhLmVuICYmICFBcnJheS5pc0FycmF5KGRhdGEpICkge1xyXG5cdFx0cmV0dXJuIGRhdGEuZW47XHJcblx0fVxyXG5cdHJldHVybiBkYXRhO1xyXG59O1xyXG5cclxuVGVtcGxhdGUucHJvdG90eXBlLmlzU2hlbGxUZW1wbGF0ZSA9IGZ1bmN0aW9uKCkge1xyXG5cdHZhciBtYWluVGV4dCA9IHRoaXMucmVkaXJlY3RUYXJnZXRcclxuXHRcdD8gdGhpcy5yZWRpcmVjdFRhcmdldC5nZXRNYWluVGV4dCgpXHJcblx0XHQ6IHRoaXMuZ2V0VGl0bGUoKS5nZXRNYWluVGV4dCgpO1xyXG5cdHJldHVybiBjb25maWcuc2hlbGxUZW1wbGF0ZXMuaW5jbHVkZXMobWFpblRleHQpO1xyXG59O1xyXG5cclxuVGVtcGxhdGUucHJvdG90eXBlLnNldFBhcmFtRGF0YUFuZFN1Z2dlc3Rpb25zID0gZnVuY3Rpb24oKSB7XHJcblx0dmFyIHNlbGYgPSB0aGlzO1xyXG5cdHZhciBwYXJhbURhdGFTZXQgPSAkLkRlZmVycmVkKCk7XHJcblx0XHJcblx0aWYgKCBzZWxmLnBhcmFtRGF0YSApIHsgcmV0dXJuIHBhcmFtRGF0YVNldC5yZXNvbHZlKCk7IH1cclxuICAgIFxyXG5cdHZhciBwcmVmaXhlZFRleHQgPSBzZWxmLnJlZGlyZWN0VGFyZ2V0XHJcblx0XHQ/IHNlbGYucmVkaXJlY3RUYXJnZXQuZ2V0UHJlZml4ZWRUZXh0KClcclxuXHRcdDogc2VsZi5nZXRUaXRsZSgpLmdldFByZWZpeGVkVGV4dCgpO1xyXG5cclxuXHR2YXIgY2FjaGVkSW5mbyA9IGNhY2hlLnJlYWQocHJlZml4ZWRUZXh0ICsgXCItcGFyYW1zXCIpO1xyXG5cdFxyXG5cdGlmIChcclxuXHRcdGNhY2hlZEluZm8gJiZcclxuXHRcdGNhY2hlZEluZm8udmFsdWUgJiZcclxuXHRcdGNhY2hlZEluZm8uc3RhbGVEYXRlICYmXHJcblx0XHRjYWNoZWRJbmZvLnZhbHVlLnBhcmFtRGF0YSAhPSBudWxsICYmXHJcblx0XHRjYWNoZWRJbmZvLnZhbHVlLnBhcmFtZXRlclN1Z2dlc3Rpb25zICE9IG51bGwgJiZcclxuXHRcdGNhY2hlZEluZm8udmFsdWUucGFyYW1BbGlhc2VzICE9IG51bGxcclxuXHQpIHtcclxuXHRcdHNlbGYubm90ZW1wbGF0ZWRhdGEgPSBjYWNoZWRJbmZvLnZhbHVlLm5vdGVtcGxhdGVkYXRhO1xyXG5cdFx0c2VsZi5wYXJhbURhdGEgPSBjYWNoZWRJbmZvLnZhbHVlLnBhcmFtRGF0YTtcclxuXHRcdHNlbGYucGFyYW1ldGVyU3VnZ2VzdGlvbnMgPSBjYWNoZWRJbmZvLnZhbHVlLnBhcmFtZXRlclN1Z2dlc3Rpb25zO1xyXG5cdFx0c2VsZi5wYXJhbUFsaWFzZXMgPSBjYWNoZWRJbmZvLnZhbHVlLnBhcmFtQWxpYXNlcztcclxuXHRcdFxyXG5cdFx0cGFyYW1EYXRhU2V0LnJlc29sdmUoKTtcclxuXHRcdGlmICggIWlzQWZ0ZXJEYXRlKGNhY2hlZEluZm8uc3RhbGVEYXRlKSApIHtcclxuXHRcdFx0Ly8gSnVzdCB1c2UgdGhlIGNhY2hlZCBkYXRhXHJcblx0XHRcdHJldHVybiBwYXJhbURhdGFTZXQ7XHJcblx0XHR9IC8vIGVsc2U6IFVzZSB0aGUgY2FjaGUgZGF0YSBmb3Igbm93LCBidXQgYWxzbyBmZXRjaCBuZXcgZGF0YSBmcm9tIEFQSVxyXG5cdH1cclxuXHRcclxuXHRBUEkuZ2V0KHtcclxuXHRcdGFjdGlvbjogXCJ0ZW1wbGF0ZWRhdGFcIixcclxuXHRcdHRpdGxlczogcHJlZml4ZWRUZXh0LFxyXG5cdFx0cmVkaXJlY3RzOiAxLFxyXG5cdFx0aW5jbHVkZU1pc3NpbmdUaXRsZXM6IDFcclxuXHR9KVxyXG5cdFx0LnRoZW4oXHJcblx0XHRcdGZ1bmN0aW9uKHJlc3BvbnNlKSB7IHJldHVybiByZXNwb25zZTsgfSxcclxuXHRcdFx0ZnVuY3Rpb24oLyplcnJvciovKSB7IHJldHVybiBudWxsOyB9IC8vIElnbm9yZSBlcnJvcnMsIHdpbGwgdXNlIGRlZmF1bHQgZGF0YVxyXG5cdFx0KVxyXG5cdFx0LnRoZW4oIGZ1bmN0aW9uKHJlc3VsdCkge1xyXG5cdFx0Ly8gRmlndXJlIG91dCBwYWdlIGlkIChiZWFjdXNlIGFjdGlvbj10ZW1wbGF0ZWRhdGEgZG9lc24ndCBoYXZlIGFuIGluZGV4cGFnZWlkcyBvcHRpb24pXHJcblx0XHRcdHZhciBpZCA9IHJlc3VsdCAmJiAkLm1hcChyZXN1bHQucGFnZXMsIGZ1bmN0aW9uKCBfdmFsdWUsIGtleSApIHsgcmV0dXJuIGtleTsgfSk7XHJcblx0XHRcclxuXHRcdFx0aWYgKCAhcmVzdWx0IHx8ICFyZXN1bHQucGFnZXNbaWRdIHx8IHJlc3VsdC5wYWdlc1tpZF0ubm90ZW1wbGF0ZWRhdGEgfHwgIXJlc3VsdC5wYWdlc1tpZF0ucGFyYW1zICkge1xyXG5cdFx0XHQvLyBObyBUZW1wbGF0ZURhdGEsIHNvIHVzZSBkZWZhdWx0cyAoZ3Vlc3NlcylcclxuXHRcdFx0XHRzZWxmLm5vdGVtcGxhdGVkYXRhID0gdHJ1ZTtcclxuXHRcdFx0XHRzZWxmLnRlbXBsYXRlZGF0YUFwaUVycm9yID0gIXJlc3VsdDtcclxuXHRcdFx0XHRzZWxmLnBhcmFtRGF0YSA9IGNvbmZpZy5kZWZhdWx0UGFyYW1ldGVyRGF0YTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRzZWxmLnBhcmFtRGF0YSA9IHJlc3VsdC5wYWdlc1tpZF0ucGFyYW1zO1xyXG5cdFx0XHR9XHJcbiAgICAgICAgXHJcblx0XHRcdHNlbGYucGFyYW1BbGlhc2VzID0ge307XHJcblx0XHRcdCQuZWFjaChzZWxmLnBhcmFtRGF0YSwgZnVuY3Rpb24ocGFyYU5hbWUsIHBhcmFEYXRhKSB7XHJcblx0XHRcdFx0Ly8gRXh0cmFjdCBhbGlhc2VzIGZvciBlYXNpZXIgcmVmZXJlbmNlIGxhdGVyIG9uXHJcblx0XHRcdFx0aWYgKCBwYXJhRGF0YS5hbGlhc2VzICYmIHBhcmFEYXRhLmFsaWFzZXMubGVuZ3RoICkge1xyXG5cdFx0XHRcdFx0cGFyYURhdGEuYWxpYXNlcy5mb3JFYWNoKGZ1bmN0aW9uKGFsaWFzKXtcclxuXHRcdFx0XHRcdFx0c2VsZi5wYXJhbUFsaWFzZXNbYWxpYXNdID0gcGFyYU5hbWU7XHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0Ly8gRXh0cmFjdCBhbGxvd2VkIHZhbHVlcyBhcnJheSBmcm9tIGRlc2NyaXB0aW9uXHJcblx0XHRcdFx0aWYgKCBwYXJhRGF0YS5kZXNjcmlwdGlvbiAmJiAvXFxbLionLis/Jy4qP1xcXS8udGVzdChwYXJhRGF0YS5kZXNjcmlwdGlvbi5lbikgKSB7XHJcblx0XHRcdFx0XHR0cnkge1xyXG5cdFx0XHRcdFx0XHR2YXIgYWxsb3dlZFZhbHMgPSBKU09OLnBhcnNlKFxyXG5cdFx0XHRcdFx0XHRcdHBhcmFEYXRhLmRlc2NyaXB0aW9uLmVuXHJcblx0XHRcdFx0XHRcdFx0XHQucmVwbGFjZSgvXi4qXFxbLyxcIltcIilcclxuXHRcdFx0XHRcdFx0XHRcdC5yZXBsYWNlKC9cIi9nLCBcIlxcXFxcXFwiXCIpXHJcblx0XHRcdFx0XHRcdFx0XHQucmVwbGFjZSgvJy9nLCBcIlxcXCJcIilcclxuXHRcdFx0XHRcdFx0XHRcdC5yZXBsYWNlKC8sXFxzKl0vLCBcIl1cIilcclxuXHRcdFx0XHRcdFx0XHRcdC5yZXBsYWNlKC9dLiokLywgXCJdXCIpXHJcblx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdHNlbGYucGFyYW1EYXRhW3BhcmFOYW1lXS5hbGxvd2VkVmFsdWVzID0gYWxsb3dlZFZhbHM7XHJcblx0XHRcdFx0XHR9IGNhdGNoKGUpIHtcclxuXHRcdFx0XHRcdFx0Y29uc29sZS53YXJuKFwiW1JhdGVyXSBDb3VsZCBub3QgcGFyc2UgYWxsb3dlZCB2YWx1ZXMgaW4gZGVzY3JpcHRpb246XFxuICBcIitcclxuXHRcdFx0XHRcdHBhcmFEYXRhLmRlc2NyaXB0aW9uLmVuICsgXCJcXG4gQ2hlY2sgVGVtcGxhdGVEYXRhIGZvciBwYXJhbWV0ZXIgfFwiICsgcGFyYU5hbWUgK1xyXG5cdFx0XHRcdFx0XCI9IGluIFwiICsgc2VsZi5nZXRUaXRsZSgpLmdldFByZWZpeGVkVGV4dCgpKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pO1xyXG5cdFx0XHJcblx0XHRcdC8vIE1ha2Ugc3VnZ2VzdGlvbnMgZm9yIGNvbWJvYm94XHJcblx0XHRcdHZhciBhbGxQYXJhbXNBcnJheSA9ICggIXNlbGYubm90ZW1wbGF0ZWRhdGEgJiYgcmVzdWx0LnBhZ2VzW2lkXS5wYXJhbU9yZGVyICkgfHxcclxuXHRcdFx0JC5tYXAoc2VsZi5wYXJhbURhdGEsIGZ1bmN0aW9uKF92YWwsIGtleSl7XHJcblx0XHRcdFx0cmV0dXJuIGtleTtcclxuXHRcdFx0fSk7XHJcblx0XHRcdHNlbGYucGFyYW1ldGVyU3VnZ2VzdGlvbnMgPSBhbGxQYXJhbXNBcnJheS5maWx0ZXIoZnVuY3Rpb24ocGFyYW1OYW1lKSB7XHJcblx0XHRcdFx0cmV0dXJuICggcGFyYW1OYW1lICYmIHBhcmFtTmFtZSAhPT0gXCJjbGFzc1wiICYmIHBhcmFtTmFtZSAhPT0gXCJpbXBvcnRhbmNlXCIgKTtcclxuXHRcdFx0fSlcclxuXHRcdFx0XHQubWFwKGZ1bmN0aW9uKHBhcmFtTmFtZSkge1xyXG5cdFx0XHRcdFx0dmFyIG9wdGlvbk9iamVjdCA9IHtkYXRhOiBwYXJhbU5hbWV9O1xyXG5cdFx0XHRcdFx0dmFyIGxhYmVsID0gc2VsZi5nZXREYXRhRm9yUGFyYW0obGFiZWwsIHBhcmFtTmFtZSk7XHJcblx0XHRcdFx0XHRpZiAoIGxhYmVsICkge1xyXG5cdFx0XHRcdFx0XHRvcHRpb25PYmplY3QubGFiZWwgPSBsYWJlbCArIFwiICh8XCIgKyBwYXJhbU5hbWUgKyBcIj0pXCI7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRyZXR1cm4gb3B0aW9uT2JqZWN0O1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHJcblx0XHRcdGlmICggc2VsZi50ZW1wbGF0ZWRhdGFBcGlFcnJvciApIHtcclxuXHRcdFx0XHQvLyBEb24ndCBzYXZlIGRlZmF1bHRzL2d1ZXNzZXMgdG8gY2FjaGU7XHJcblx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHRcdH1cclxuXHRcdFxyXG5cdFx0XHRjYWNoZS53cml0ZShwcmVmaXhlZFRleHQgKyBcIi1wYXJhbXNcIiwge1xyXG5cdFx0XHRcdG5vdGVtcGxhdGVkYXRhOiBzZWxmLm5vdGVtcGxhdGVkYXRhLFxyXG5cdFx0XHRcdHBhcmFtRGF0YTogc2VsZi5wYXJhbURhdGEsXHJcblx0XHRcdFx0cGFyYW1ldGVyU3VnZ2VzdGlvbnM6IHNlbGYucGFyYW1ldGVyU3VnZ2VzdGlvbnMsXHJcblx0XHRcdFx0cGFyYW1BbGlhc2VzOiBzZWxmLnBhcmFtQWxpYXNlc1xyXG5cdFx0XHR9LFx0MVxyXG5cdFx0XHQpO1xyXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdH0pXHJcblx0XHQudGhlbihcclxuXHRcdFx0cGFyYW1EYXRhU2V0LnJlc29sdmUsXHJcblx0XHRcdHBhcmFtRGF0YVNldC5yZWplY3RcclxuXHRcdCk7XHJcblx0XHJcblx0cmV0dXJuIHBhcmFtRGF0YVNldDtcdFxyXG59O1xyXG5cclxudmFyIG1ha2VMaXN0QXMgPSBmdW5jdGlvbihzdWJqZWN0VGl0bGUpIHtcclxuXHR2YXIgbmFtZSA9IHN1YmplY3RUaXRsZS5nZXRNYWluVGV4dCgpLnJlcGxhY2UoL1xcc1xcKC4qXFwpLywgXCJcIik7XHJcblx0aWYgKCBuYW1lLmluZGV4T2YoXCIgXCIpID09PSAtMSApIHtcclxuXHRcdHJldHVybiBuYW1lO1xyXG5cdH1cclxuXHR2YXIgZ2VuZXJhdGlvbmFsU3VmZml4ID0gXCJcIjtcclxuXHRpZiAoIC8gKD86W0pTXXIuP3xbSVZYXSspJC8udGVzdChuYW1lKSApIHtcclxuXHRcdGdlbmVyYXRpb25hbFN1ZmZpeCA9IG5hbWUuc2xpY2UobmFtZS5sYXN0SW5kZXhPZihcIiBcIikpO1xyXG5cdFx0bmFtZSA9IG5hbWUuc2xpY2UoMCwgbmFtZS5sYXN0SW5kZXhPZihcIiBcIikpO1xyXG5cdFx0aWYgKCBuYW1lLmluZGV4T2YoXCIgXCIpID09PSAtMSApIHtcclxuXHRcdFx0cmV0dXJuIG5hbWUgKyBnZW5lcmF0aW9uYWxTdWZmaXg7XHJcblx0XHR9XHJcblx0fVxyXG5cdHZhciBsYXN0TmFtZSA9IG5hbWUuc2xpY2UobmFtZS5sYXN0SW5kZXhPZihcIiBcIikrMSkucmVwbGFjZSgvLCQvLCBcIlwiKTtcclxuXHR2YXIgb3RoZXJOYW1lcyA9IG5hbWUuc2xpY2UoMCwgbmFtZS5sYXN0SW5kZXhPZihcIiBcIikpO1xyXG5cdHJldHVybiBsYXN0TmFtZSArIFwiLCBcIiArIG90aGVyTmFtZXMgKyBnZW5lcmF0aW9uYWxTdWZmaXg7XHJcbn07XHJcblxyXG5UZW1wbGF0ZS5wcm90b3R5cGUuYWRkTWlzc2luZ1BhcmFtcyA9IGZ1bmN0aW9uKCkge1xyXG5cdHZhciB0aGlzVGVtcGxhdGUgPSB0aGlzO1xyXG5cclxuXHQvLyBBdXRvZmlsbCBsaXN0YXMgcGFyYW1ldGVyIGZvciBXUDpCSU9cclxuXHR2YXIgaXNCaW9ncmFwaHlCYW5uZXIgPSB0aGlzLmdldFRpdGxlKCkuZ2V0TWFpblRleHQoKSA9PT0gXCJXaWtpUHJvamVjdCBCaW9ncmFwaHlcIiB8fFxyXG5cdFx0KHRoaXMucmVkaXJlY3RUYXJnZXQgJiYgdGhpcy5yZWRpcmVjdFRhcmdldC5nZXRNYWluVGV4dCgpID09PSBcIldpa2lQcm9qZWN0IEJpb2dyYXBoeVwiKTtcclxuXHJcblx0aWYgKGlzQmlvZ3JhcGh5QmFubmVyICYmICF0aGlzLmdldFBhcmFtKFwibGlzdGFzXCIpKSB7XHJcblx0XHR2YXIgc3ViamVjdFRpdGxlID0gbXcuVGl0bGUubmV3RnJvbVRleHQoY29uZmlnLm13LndnUGFnZU5hbWUpLmdldFN1YmplY3RQYWdlKCk7XHJcblx0XHR0aGlzLnBhcmFtZXRlcnMucHVzaCh7XHJcblx0XHRcdG5hbWU6IFwibGlzdGFzXCIsXHJcblx0XHRcdHZhbHVlOiBtYWtlTGlzdEFzKHN1YmplY3RUaXRsZSksXHJcblx0XHRcdGF1dG9maWxsZWQ6IHRydWUsXHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdC8vIE1ha2Ugc3VyZSByZXF1aXJlZC9zdWdnZXN0ZWQgcGFyYW1ldGVycyBhcmUgcHJlc2VudFxyXG5cdCQuZWFjaCh0aGlzVGVtcGxhdGUucGFyYW1EYXRhLCBmdW5jdGlvbihwYXJhTmFtZSwgcGFyYURhdGEpIHtcclxuXHRcdGlmICggKHBhcmFEYXRhLnJlcXVpcmVkIHx8IHBhcmFEYXRhLnN1Z2dlc3RlZCkgJiYgIXRoaXNUZW1wbGF0ZS5nZXRQYXJhbShwYXJhTmFtZSkgKSB7XHJcblx0XHRcdC8vIENoZWNrIGlmIGFscmVhZHkgcHJlc2VudCBpbiBhbiBhbGlhcywgaWYgYW55XHJcblx0XHRcdGlmICggcGFyYURhdGEuYWxpYXNlcy5sZW5ndGggKSB7XHJcblx0XHRcdFx0dmFyIGFsaWFzZXMgPSB0aGlzVGVtcGxhdGUucGFyYW1ldGVycy5maWx0ZXIocCA9PiB7XHJcblx0XHRcdFx0XHR2YXIgaXNBbGlhcyA9IHBhcmFEYXRhLmFsaWFzZXMuaW5jbHVkZXMocC5uYW1lKTtcclxuXHRcdFx0XHRcdHZhciBpc0VtcHR5ID0gIXAudmFsdWU7XHJcblx0XHRcdFx0XHRyZXR1cm4gaXNBbGlhcyAmJiAhaXNFbXB0eTtcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0XHRpZiAoIGFsaWFzZXMubGVuZ3RoICkge1xyXG5cdFx0XHRcdC8vIEF0IGxlYXN0IG9uZSBub24tZW1wdHkgYWxpYXMsIHNvIGRvIG5vdGhpbmdcclxuXHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdFx0Ly8gTm8gbm9uLWVtcHR5IGFsaWFzZXMsIHNvIGFkZCB0aGlzIHRvIHRoZSBwYXJhbWV0ZXJzIGxpc3QgKHdpdGhcclxuXHRcdFx0Ly8gdmFsdWUgc2V0IHBhcmFtZXRlciB0byBlaXRoZXIgdGhlIGF1dG92YXVsZSwgb3IgYXMgbnVsbCkuXHJcblx0XHRcdC8vIEFsc28gc2V0IHRoYXQgaXQgd2FzIGF1dG9maWxsZWQuXHJcblx0XHRcdHRoaXNUZW1wbGF0ZS5wYXJhbWV0ZXJzLnB1c2goe1xyXG5cdFx0XHRcdG5hbWU6cGFyYU5hbWUsXHJcblx0XHRcdFx0dmFsdWU6IHBhcmFEYXRhLmF1dG92YWx1ZSB8fCBudWxsLFxyXG5cdFx0XHRcdGF1dG9maWxsZWQ6IHRydWUsXHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cdH0pO1xyXG5cclxuXHRyZXR1cm4gdGhpc1RlbXBsYXRlO1xyXG59O1xyXG5cclxuVGVtcGxhdGUucHJvdG90eXBlLnNldENsYXNzZXNBbmRJbXBvcnRhbmNlcyA9IGZ1bmN0aW9uKCkge1xyXG5cdHZhciBwYXJzZWQgPSAkLkRlZmVycmVkKCk7XHJcblxyXG5cdC8vIERvbid0IHJlLXBhcnNlIGlmIGFscmVhZHkgcGFyc2VkOyBubyBuZWVkIHRvIHBhcnNlIHNoZWxsIHRlbXBsYXRlcyBvciBiYW5uZXJzIHdpdGhvdXQgcmF0aW5nc1xyXG5cdGlmICggdGhpcy5pc1NoZWxsVGVtcGxhdGUoKSApIHtcclxuXHRcdHRoaXMuY2xhc3NlcyA9IFsuLi5jb25maWcuYmFubmVyRGVmYXVsdHMuY2xhc3Nlc107XHJcblx0XHRyZXR1cm4gcGFyc2VkLnJlc29sdmUoKTtcclxuXHR9IGVsc2UgaWYgKCAodGhpcy5jbGFzc2VzICYmIHRoaXMuaW1wb3J0YW5jZXMpIHx8IHRoaXMud2l0aG91dFJhdGluZ3MgKSB7XHJcblx0XHRyZXR1cm4gcGFyc2VkLnJlc29sdmUoKTtcclxuXHR9IFxyXG5cclxuXHR2YXIgbWFpblRleHQgPSB0aGlzLmdldFRpdGxlKCkuZ2V0TWFpblRleHQoKTtcclxuXHJcblx0Ly8gU29tZSBwcm9qZWN0cyBoYXZlIGhhcmRjb2RlZCB2YWx1ZXMsIHRvIGF2b2lkIHN0YW5kYXJkIGNsYXNzZXMgb3IgdG8gcHJldmVudCBBUEkgaXNzdWVzICh0aW1lb3V0IGFuZC9vciBub2RlIGNvdW50IGV4Y2VlZGVkKVxyXG5cdGNvbnN0IHJlZGlyZWN0VGFyZ2V0T3JNYWluVGV4dCA9IHRoaXMucmVkaXJlY3RUYXJnZXQgPyB0aGlzLnJlZGlyZWN0VGFyZ2V0LmdldE1haW5UZXh0KCkgOiBtYWluVGV4dDtcclxuXHRpZiAoIGNvbmZpZy5jdXN0b21CYW5uZXJzW3JlZGlyZWN0VGFyZ2V0T3JNYWluVGV4dF0gKSB7XHJcblx0XHR0aGlzLmNsYXNzZXMgPSBjb25maWcuY3VzdG9tQmFubmVyc1tyZWRpcmVjdFRhcmdldE9yTWFpblRleHRdLmNsYXNzZXM7XHJcblx0XHR0aGlzLmltcG9ydGFuY2VzID0gY29uZmlnLmN1c3RvbUJhbm5lcnNbcmVkaXJlY3RUYXJnZXRPck1haW5UZXh0XS5pbXBvcnRhbmNlcztcclxuXHRcdHJldHVybiBwYXJzZWQucmVzb2x2ZSgpO1xyXG5cdH1cclxuXHJcblx0Ly8gT3RoZXJ3aXNlIHRyeSByZWFkaW5nIGZyb20gY2FjaGVkIGRhdGFcclxuXHR2YXIgY2FjaGVkUmF0aW5ncyA9IGNhY2hlLnJlYWQobWFpblRleHQrXCItcmF0aW5nc1wiKTtcclxuXHRpZiAoXHJcblx0XHRjYWNoZWRSYXRpbmdzICYmXHJcblx0XHRjYWNoZWRSYXRpbmdzLnZhbHVlICYmXHJcblx0XHRjYWNoZWRSYXRpbmdzLnN0YWxlRGF0ZSAmJlxyXG5cdFx0Y2FjaGVkUmF0aW5ncy52YWx1ZS5jbGFzc2VzIT1udWxsICYmXHJcblx0XHRjYWNoZWRSYXRpbmdzLnZhbHVlLmltcG9ydGFuY2VzIT1udWxsXHJcblx0KSB7XHJcblx0XHR0aGlzLmNsYXNzZXMgPSBjYWNoZWRSYXRpbmdzLnZhbHVlLmNsYXNzZXM7XHJcblx0XHR0aGlzLmltcG9ydGFuY2VzID0gY2FjaGVkUmF0aW5ncy52YWx1ZS5pbXBvcnRhbmNlcztcclxuXHRcdHBhcnNlZC5yZXNvbHZlKCk7XHJcblx0XHRpZiAoICFpc0FmdGVyRGF0ZShjYWNoZWRSYXRpbmdzLnN0YWxlRGF0ZSkgKSB7XHJcblx0XHRcdC8vIEp1c3QgdXNlIHRoZSBjYWNoZWQgZGF0YVxyXG5cdFx0XHRyZXR1cm4gcGFyc2VkO1xyXG5cdFx0fSAvLyBlbHNlOiBVc2UgdGhlIGNhY2hlIGRhdGEgZm9yIG5vdywgYnV0IGFsc28gZmV0Y2ggbmV3IGRhdGEgZnJvbSBBUElcclxuXHR9XHJcblxyXG5cdHZhciB3aWtpdGV4dFRvUGFyc2UgPSBcIlwiO1x0XHJcblx0Y29uZmlnLmJhbm5lckRlZmF1bHRzLmV4dGVuZGVkQ2xhc3Nlcy5mb3JFYWNoKGZ1bmN0aW9uKGNsYXNzbmFtZSwgaW5kZXgpIHtcclxuXHRcdHdpa2l0ZXh0VG9QYXJzZSArPSBcInt7XCIgKyBtYWluVGV4dCArIFwifGNsYXNzPVwiICsgY2xhc3NuYW1lICsgXCJ8aW1wb3J0YW5jZT1cIiArXHJcblx0XHQoY29uZmlnLmJhbm5lckRlZmF1bHRzLmV4dGVuZGVkSW1wb3J0YW5jZXNbaW5kZXhdIHx8IFwiXCIpICsgXCJ9fS9uXCI7XHJcblx0fSk7XHJcblx0XHJcblx0cmV0dXJuIEFQSS5nZXQoe1xyXG5cdFx0YWN0aW9uOiBcInBhcnNlXCIsXHJcblx0XHR0aXRsZTogXCJUYWxrOlNhbmRib3hcIixcclxuXHRcdHRleHQ6IHdpa2l0ZXh0VG9QYXJzZSxcclxuXHRcdHByb3A6IFwiY2F0ZWdvcmllc2h0bWxcIlxyXG5cdH0pXHJcblx0XHQudGhlbigocmVzdWx0KSA9PiB7XHJcblx0XHRcdHZhciBjYXRzSHRtbCA9IHJlc3VsdC5wYXJzZS5jYXRlZ29yaWVzaHRtbFtcIipcIl07XHJcblx0XHRcdHZhciBleHRlbmRlZENsYXNzZXMgPSBjb25maWcuYmFubmVyRGVmYXVsdHMuZXh0ZW5kZWRDbGFzc2VzLmZpbHRlcihmdW5jdGlvbihjbCkge1xyXG5cdFx0XHRcdHJldHVybiBjYXRzSHRtbC5pbmRleE9mKGNsK1wiLUNsYXNzXCIpICE9PSAtMTtcclxuXHRcdFx0fSk7XHJcblx0XHRcdHRoaXMuY2xhc3NlcyA9IFsuLi5jb25maWcuYmFubmVyRGVmYXVsdHMuY2xhc3NlcywgLi4uZXh0ZW5kZWRDbGFzc2VzXTtcclxuXHRcdFx0dGhpcy5pbXBvcnRhbmNlcyA9IGNvbmZpZy5iYW5uZXJEZWZhdWx0cy5leHRlbmRlZEltcG9ydGFuY2VzLmZpbHRlcihmdW5jdGlvbihpbXApIHtcclxuXHRcdFx0XHRyZXR1cm4gY2F0c0h0bWwuaW5kZXhPZihpbXArXCItaW1wb3J0YW5jZVwiKSAhPT0gLTE7XHJcblx0XHRcdH0pO1xyXG5cdFx0XHRjYWNoZS53cml0ZShtYWluVGV4dCtcIi1yYXRpbmdzXCIsXHJcblx0XHRcdFx0e1xyXG5cdFx0XHRcdFx0Y2xhc3NlczogdGhpcy5jbGFzc2VzLFxyXG5cdFx0XHRcdFx0aW1wb3J0YW5jZXM6IHRoaXMuaW1wb3J0YW5jZXNcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdDFcclxuXHRcdFx0KTtcclxuXHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHR9KTtcclxufTtcclxuXHJcbmV4cG9ydCB7VGVtcGxhdGUsIHBhcnNlVGVtcGxhdGVzLCBnZXRXaXRoUmVkaXJlY3RUb307XHJcbi8vIDwvbm93aWtpPiIsImltcG9ydCBjb25maWcgZnJvbSBcIi4uLy4uL2NvbmZpZ1wiO1xyXG5pbXBvcnQgQmFubmVyV2lkZ2V0IGZyb20gXCIuL0Jhbm5lcldpZGdldFwiO1xyXG5pbXBvcnQgeyBub3JtYWxpc2VZZXNObywgZmlsdGVyQW5kTWFwLCB1bmlxdWVBcnJheSB9IGZyb20gXCIuLi8uLi91dGlsXCI7XHJcbmltcG9ydCBQYXJhbWV0ZXJXaWRnZXQgZnJvbSBcIi4vUGFyYW1ldGVyV2lkZ2V0XCI7XHJcbi8vIDxub3dpa2k+XHJcblxyXG52YXIgQmFubmVyTGlzdFdpZGdldCA9IGZ1bmN0aW9uIEJhbm5lckxpc3RXaWRnZXQoIGNvbmZpZyApIHtcclxuXHRjb25maWcgPSBjb25maWcgfHwge307XHJcblxyXG5cdC8vIENhbGwgcGFyZW50IGNvbnN0cnVjdG9yXHJcblx0QmFubmVyTGlzdFdpZGdldC5wYXJlbnQuY2FsbCggdGhpcywgY29uZmlnICk7XHJcblx0T08udWkubWl4aW4uR3JvdXBFbGVtZW50LmNhbGwoIHRoaXMsIHtcclxuXHRcdCRncm91cDogdGhpcy4kZWxlbWVudFxyXG5cdH0gKTtcclxuXHR0aGlzLiRlbGVtZW50LmFkZENsYXNzKFwicmF0ZXItYmFubmVyTGlzdFdpZGdldFwiKS5jc3Moe1wicGFkZGluZ1wiOlwiMjBweCAxMHB4IDE2cHggMTBweFwifSk7XHJcblxyXG5cdC8vIFByZWZzXHJcblx0dGhpcy5wcmVmZXJlbmNlcyA9IGNvbmZpZy5wcmVmZXJlbmNlcztcclxuXHRcclxuXHR0aGlzLm9yZXNDbGFzcyA9IGNvbmZpZy5vcmVzQ2xhc3M7XHJcblx0XHJcblx0dGhpcy5jaGFuZ2VkID0gZmFsc2U7XHJcblxyXG5cdC8vIEV2ZW50c1xyXG5cdHRoaXMuYWdncmVnYXRlKCB7XCJyZW1vdmVcIjogXCJiYW5uZXJSZW1vdmVcIn0gKTtcclxuXHR0aGlzLmNvbm5lY3QoIHRoaXMsIHtcImJhbm5lclJlbW92ZVwiOiBcIm9uQmFubmVyUmVtb3ZlXCJ9ICk7XHJcblxyXG5cdHRoaXMuYWdncmVnYXRlKCB7XCJjaGFuZ2VkXCI6IFwiYmFubmVyQ2hhbmdlZFwifSApO1xyXG5cdHRoaXMuY29ubmVjdCggdGhpcywge1wiYmFubmVyQ2hhbmdlZFwiOiBcInNldENoYW5nZWRcIn0gKTtcclxuXHJcblx0dGhpcy5hZ2dyZWdhdGUoIHtcImJpb2dyYXBoeUJhbm5lckNoYW5nZVwiOiBcImJpb2dyYXBoeUJhbm5lckNoYW5nZWRcIn0gKTtcclxuXHR0aGlzLmNvbm5lY3QoIHRoaXMsIHtcImJpb2dyYXBoeUJhbm5lckNoYW5nZWRcIjogXCJzeW5jU2hlbGxUZW1wbGF0ZVdpdGhCaW9ncmFwaHlCYW5uZXJcIn0gKTtcclxuXHJcblx0dGhpcy5hZ2dyZWdhdGUoIHtcInVwZGF0ZWRTaXplXCI6IFwiYmFubmVyVXBkYXRlZFNpemVcIn0gKTtcclxuXHR0aGlzLmNvbm5lY3QoIHRoaXMsIHtcImJhbm5lclVwZGF0ZWRTaXplXCI6IFwib25VcGRhdGVkU2l6ZVwifSApO1xyXG59O1xyXG5cclxuT08uaW5oZXJpdENsYXNzKCBCYW5uZXJMaXN0V2lkZ2V0LCBPTy51aS5XaWRnZXQgKTtcclxuT08ubWl4aW5DbGFzcyggQmFubmVyTGlzdFdpZGdldCwgT08udWkubWl4aW4uR3JvdXBFbGVtZW50ICk7XHJcbi8qXHJcbm1ldGhvZHMgZnJvbSBtaXhpbjpcclxuIC0gYWRkSXRlbXMoIGl0ZW1zLCBbaW5kZXhdICkgOiBPTy51aS5FbGVtZW50ICAoQ0hBSU5BQkxFKVxyXG4gLSBjbGVhckl0ZW1zKCApIDogT08udWkuRWxlbWVudCAgKENIQUlOQUJMRSlcclxuIC0gZmluZEl0ZW1Gcm9tRGF0YSggZGF0YSApIDogT08udWkuRWxlbWVudHxudWxsXHJcbiAtIGZpbmRJdGVtc0Zyb21EYXRhKCBkYXRhICkgOiBPTy51aS5FbGVtZW50W11cclxuIC0gcmVtb3ZlSXRlbXMoIGl0ZW1zICkgOiBPTy51aS5FbGVtZW50ICAoQ0hBSU5BQkxFKVxyXG4qL1xyXG5cclxuQmFubmVyTGlzdFdpZGdldC5wcm90b3R5cGUub25VcGRhdGVkU2l6ZSA9IGZ1bmN0aW9uKCkge1xyXG5cdC8vIEVtaXQgYW4gXCJ1cGRhdGVkU2l6ZVwiIGV2ZW50IHNvIHRoZSBwYXJlbnQgd2luZG93IGNhbiB1cGRhdGUgc2l6ZSwgaWYgbmVlZGVkXHJcblx0dGhpcy5lbWl0KFwidXBkYXRlZFNpemVcIik7XHJcbn07XHJcblxyXG5CYW5uZXJMaXN0V2lkZ2V0LnByb3RvdHlwZS5zZXRDaGFuZ2VkID0gZnVuY3Rpb24oKSB7XHJcblx0dGhpcy5jaGFuZ2VkID0gdHJ1ZTtcclxufTtcclxuXHJcbkJhbm5lckxpc3RXaWRnZXQucHJvdG90eXBlLm9uQmFubmVyUmVtb3ZlID0gZnVuY3Rpb24gKCBiYW5uZXIgKSB7XHJcblx0dGhpcy5yZW1vdmVJdGVtcyhbYmFubmVyXSk7XHJcblx0dGhpcy5zZXRDaGFuZ2VkKCk7XHJcbn07XHJcblxyXG5CYW5uZXJMaXN0V2lkZ2V0LnByb3RvdHlwZS5zeW5jU2hlbGxUZW1wbGF0ZVdpdGhCaW9ncmFwaHlCYW5uZXIgPSBmdW5jdGlvbiggYmlvZ3JhcGh5QmFubmVyICkge1xyXG5cdGJpb2dyYXBoeUJhbm5lciA9IGJpb2dyYXBoeUJhbm5lciB8fCB0aGlzLml0ZW1zLmZpbmQoXHJcblx0XHRiYW5uZXIgPT4gYmFubmVyLm1haW5UZXh0ID09PSBcIldpa2lQcm9qZWN0IEJpb2dyYXBoeVwiIHx8IGJhbm5lci5yZWRpcmVjdFRhcmdldE1haW5UZXh0ID09PSBcIldpa2lQcm9qZWN0IEJpb2dyYXBoeVwiXHJcblx0KTtcclxuXHRpZiAoIWJpb2dyYXBoeUJhbm5lcikgcmV0dXJuO1xyXG5cclxuXHRjb25zdCBiYW5uZXJTaGVsbFRlbXBsYXRlID0gdGhpcy5pdGVtcy5maW5kKFxyXG5cdFx0YmFubmVyID0+IGJhbm5lci5tYWluVGV4dCA9PT0gY29uZmlnLnNoZWxsVGVtcGxhdGVzWzBdIHx8IGJhbm5lci5yZWRpcmVjdFRhcmdldE1haW5UZXh0ID09PSBjb25maWcuc2hlbGxUZW1wbGF0ZXNbMF1cclxuXHQpO1xyXG5cdGlmICghYmFubmVyU2hlbGxUZW1wbGF0ZSkge1xyXG5cdFx0cmV0dXJuO1xyXG5cdH1cclxuXHJcblx0Y29uc3QgcGFyYW1zVG9TeW5jID0gW1xyXG5cdFx0eyBuYW1lOiBcImxpdmluZ1wiLCBub3JtYWxpc2U6IHRydWUgfSxcclxuXHRcdHsgbmFtZTogXCJibHBvXCIsIG5vcm1hbGlzZTogdHJ1ZSB9LFxyXG5cdFx0eyBuYW1lOiBcImFjdGl2ZXBvbFwiLCBub3JtYWxpc2U6IHRydWUgfSxcclxuXHRcdHsgbmFtZTogXCJsaXN0YXNcIiwgbm9ybWFsaXNlOiBmYWxzZSB9LFxyXG5cdF07XHJcblx0cGFyYW1zVG9TeW5jLmZvckVhY2gocGFyYW1Ub1N5bmMgPT4ge1xyXG5cdFx0Y29uc3QgW2Jpb2dyYXBoeVBhcmFtLCBzaGVsbFBhcmFtXSA9IFtiaW9ncmFwaHlCYW5uZXIsIGJhbm5lclNoZWxsVGVtcGxhdGVdLm1hcChiYW5uZXIgPT5cclxuXHRcdFx0YmFubmVyLnBhcmFtZXRlckxpc3QuZ2V0UGFyYW1ldGVySXRlbXMoKVxyXG5cdFx0XHRcdC5maW5kKHBhcmFtZXRlciA9PlxyXG5cdFx0XHRcdFx0cGFyYW1ldGVyLm5hbWUgPT09IHBhcmFtVG9TeW5jLm5hbWUgfHxcclxuXHRcdFx0XHRcdGJhbm5lci5wYXJhbUFsaWFzZXNbcGFyYW1ldGVyLm5hbWVdID09PSBwYXJhbVRvU3luYy5uYW1lXHJcblx0XHRcdFx0KVxyXG5cdFx0KTtcclxuXHRcdGlmICghYmlvZ3JhcGh5UGFyYW0pIHJldHVybjtcclxuXHJcblx0XHRjb25zdCBwYXJhbVN5bmNWYWx1ZSA9IHBhcmFtVG9TeW5jLm5vcm1hbGlzZSA/IG5vcm1hbGlzZVllc05vKGJpb2dyYXBoeVBhcmFtLnZhbHVlKSA6IGJpb2dyYXBoeVBhcmFtLnZhbHVlO1xyXG5cdFx0YmlvZ3JhcGh5UGFyYW0uZGVsZXRlKCk7XHJcblxyXG5cdFx0aWYgKCFzaGVsbFBhcmFtKSB7XHJcblx0XHRcdGNvbnN0IGluZGV4ID0gYmFubmVyU2hlbGxUZW1wbGF0ZS5hZGRQYXJhbWV0ZXJMYXlvdXQuaXNWaXNpYmxlKClcclxuXHRcdFx0XHQ/IC0xIC8vIEluc2VydCBhdCB0aGUgdmVyeSBlbmRcclxuXHRcdFx0XHQ6IGJhbm5lclNoZWxsVGVtcGxhdGUucGFyYW1ldGVyTGlzdC5pdGVtcy5sZW5ndGgtMTsgLy8gSW5zZXJ0IHByaW9yIHRvIHRoZSBcImFkZCBwYXJhbWV0ZXJcIiBidXR0b25cclxuXHRcdFx0YmFubmVyU2hlbGxUZW1wbGF0ZS5wYXJhbWV0ZXJMaXN0LmFkZEl0ZW1zKFtcclxuXHRcdFx0XHRuZXcgUGFyYW1ldGVyV2lkZ2V0KCB7XHJcblx0XHRcdFx0XHRcIm5hbWVcIjogcGFyYW1Ub1N5bmMubmFtZSxcclxuXHRcdFx0XHRcdFwidmFsdWVcIjogcGFyYW1TeW5jVmFsdWUsXHJcblx0XHRcdFx0XHRcImF1dG9maWxsZWRcIjogdHJ1ZVxyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0YmFubmVyU2hlbGxUZW1wbGF0ZS5wYXJhbURhdGEgJiYgYmFubmVyU2hlbGxUZW1wbGF0ZS5wYXJhbURhdGFbcGFyYW1Ub1N5bmMubmFtZV1cclxuXHRcdFx0XHQpXHJcblx0XHRcdF0sIGluZGV4KTtcclxuXHRcdH0gZWxzZSBpZiAoIWJpb2dyYXBoeVBhcmFtLmF1dG9maWxsZWQpIHtcclxuXHRcdFx0c2hlbGxQYXJhbS5zZXRWYWx1ZSggcGFyYW1TeW5jVmFsdWUgKTtcclxuXHRcdFx0c2hlbGxQYXJhbS5zZXRBdXRvZmlsbGVkKCk7XHJcblx0XHR9XHJcblx0fSk7XHJcbn07XHJcblxyXG5CYW5uZXJMaXN0V2lkZ2V0LnByb3RvdHlwZS5hZGRTaGVsbFRlbXBsYXRlSWZOZWVlZGVkID0gZnVuY3Rpb24gKCkge1xyXG5cdGlmIChcclxuXHRcdCF0aGlzLml0ZW1zLnNvbWUoYmFubmVyID0+IGJhbm5lci5pc1NoZWxsVGVtcGxhdGUpXHJcblx0KSB7XHJcblx0XHRCYW5uZXJXaWRnZXQubmV3RnJvbVRlbXBsYXRlTmFtZShcclxuXHRcdFx0Y29uZmlnLnNoZWxsVGVtcGxhdGVzWzBdLFxyXG5cdFx0XHR7d2l0aG91dFJhdGluZ3M6IHRydWV9LFxyXG5cdFx0XHR7cHJlZmVyZW5jZXM6IHRoaXMucHJlZmVyZW5jZXMsIGlzQXJ0aWNsZTogdGhpcy5wYWdlSW5mby5pc0FydGljbGV9XHJcblx0XHQpLnRoZW4oc2hlbGxCYW5uZXJXaWRnZXQgPT4ge1xyXG5cdFx0XHRPTy51aS5taXhpbi5Hcm91cEVsZW1lbnQucHJvdG90eXBlLmFkZEl0ZW1zLmNhbGwoIHRoaXMsIFtzaGVsbEJhbm5lcldpZGdldF0sIDAgKTtcclxuXHRcdFx0Ly8gQXV0b2ZpbGwgcmF0aW5ncyAoaWYgYWJsZSB0bylcclxuXHRcdFx0dGhpcy5hdXRvZmlsbENsYXNzUmF0aW5ncyh7Zm9yQmFubmVyU2hlbGw6IHRydWV9KTtcclxuXHRcdFx0Ly8gZW1pdCB1cGRhdGVkU2l6ZSBldmVudCBcclxuXHRcdFx0dGhpcy5vblVwZGF0ZWRTaXplKCk7XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdHJldHVybiB0aGlzO1xyXG59O1xyXG5cclxuXHJcbkJhbm5lckxpc3RXaWRnZXQucHJvdG90eXBlLmFkZEl0ZW1zID0gZnVuY3Rpb24gKCBpdGVtcywgaW5kZXggKSB7XHJcblxyXG5cdGlmICggaXRlbXMubGVuZ3RoID09PSAwICkge1xyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblx0fVxyXG5cclxuXHQvLyBDYWxsIG1peGluIG1ldGhvZCB0byBkbyB0aGUgYWRkaW5nXHJcblx0T08udWkubWl4aW4uR3JvdXBFbGVtZW50LnByb3RvdHlwZS5hZGRJdGVtcy5jYWxsKCB0aGlzLCBpdGVtcywgaW5kZXggKTtcclxuXHJcblx0Ly8gQXV0b2ZpbGwgcmF0aW5ncyAoaWYgYWJsZSB0bywgYW5kIGlmIGVuYWJsZWQgaW4gcHJlZmVyZW5jZXMpXHJcblx0aWYgKCF0aGlzLml0ZW1zLnNvbWUoYmFubmVyID0+IGJhbm5lci5pc1NoZWxsVGVtcGxhdGUpKSB7XHJcblx0XHR0aGlzLmF1dG9maWxsQ2xhc3NSYXRpbmdzKCk7XHJcblx0fVxyXG5cdHRoaXMuYXV0b2ZpbGxJbXBvcnRhbmNlUmF0aW5ncygpO1xyXG5cclxuXHQvLyBlbWl0IHVwZGF0ZWRTaXplIGV2ZW50IFxyXG5cdHRoaXMub25VcGRhdGVkU2l6ZSgpO1xyXG5cclxuXHRyZXR1cm4gdGhpcztcclxufTtcclxuXHJcbkJhbm5lckxpc3RXaWRnZXQucHJvdG90eXBlLmF1dG9maWxsQ2xhc3NSYXRpbmdzID0gZnVuY3Rpb24oY29uZmlnKSB7XHJcblx0Y29uZmlnID0gY29uZmlnIHx8IHt9O1xyXG5cdC8vIE9ubHkgYXV0b2ZpbGwgaWYgc2V0IGluIHByZWZlcmVuY2VzXHJcblx0aWYgKCF0aGlzLnByZWZlcmVuY2VzLmF1dG9maWxsQ2xhc3NGcm9tT3RoZXJzICYmICF0aGlzLnByZWZlcmVuY2VzLmF1dG9maWxsQ2xhc3NGcm9tT3JlcyAmJiAhY29uZmlnLmZvckJhbm5lclNoZWxsKSB7XHJcblx0XHRyZXR1cm47XHJcblx0fVxyXG5cdC8vIENoZWNrIHdoYXQgYmFubmVycyBhbHJlYWR5IGhhdmVcclxuXHRjb25zdCB1bmlxdWVDbGFzc1JhdGluZ3MgPSB1bmlxdWVBcnJheSggZmlsdGVyQW5kTWFwKFxyXG5cdFx0dGhpcy5pdGVtcyxcclxuXHRcdGJhbm5lciA9PiB7XHJcblx0XHRcdGlmIChiYW5uZXIuaXNTaGVsbFRlbXBsYXRlIHx8ICFiYW5uZXIuaGFzQ2xhc3NSYXRpbmdzKSB7XHJcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHR9XHJcblx0XHRcdGNvbnN0IGNsYXNzSXRlbSA9IGJhbm5lci5jbGFzc0Ryb3Bkb3duLmdldE1lbnUoKS5maW5kU2VsZWN0ZWRJdGVtKCk7XHJcblx0XHRcdHJldHVybiBjbGFzc0l0ZW0gJiYgY2xhc3NJdGVtLmdldERhdGEoKTtcclxuXHRcdH0sXHJcblx0XHRiYW5uZXIgPT4gYmFubmVyLmNsYXNzRHJvcGRvd24uZ2V0TWVudSgpLmZpbmRTZWxlY3RlZEl0ZW0oKS5nZXREYXRhKClcclxuXHQpKTtcclxuXHQvLyBDYW4ndCBhdXRvZmlsbCBpZiB0aGVyZSBpc24ndCBlaXRoZXIgYSBzaW5nbGUgdmFsdWUsIG9yIG5vIHZhbHVlXHJcblx0aWYgKHVuaXF1ZUNsYXNzUmF0aW5ncy5sZW5ndGggPiAxKSB7XHJcblx0XHRyZXR1cm47XHJcblx0fVxyXG5cdC8vIERldGVybWluZSB3aGF0IHRvIGF1dG9maWxsIHdpdGhcclxuXHRsZXQgYXV0b0NsYXNzO1xyXG5cdGlmICh1bmlxdWVDbGFzc1JhdGluZ3MubGVuZ3RoID09PSAxICYmICh0aGlzLnByZWZlcmVuY2VzLmF1dG9maWxsQ2xhc3NGcm9tT3RoZXJzIHx8IGNvbmZpZy5mb3JCYW5uZXJTaGVsbCkpIHtcclxuXHRcdGF1dG9DbGFzcyA9IHVuaXF1ZUNsYXNzUmF0aW5nc1swXTtcclxuXHR9IGVsc2UgaWYgKHVuaXF1ZUNsYXNzUmF0aW5ncy5sZW5ndGggPT09IDAgJiYgdGhpcy5wcmVmZXJlbmNlcy5hdXRvZmlsbENsYXNzRnJvbU9yZXMgJiYgdGhpcy5vcmVzQ2xhc3MpIHtcclxuXHRcdC8vIERvbid0IGF1dG9maWxsIGFib3ZlIEMtY2xhc3NcclxuXHRcdHN3aXRjaCh0aGlzLm9yZXNDbGFzcykge1xyXG5cdFx0Y2FzZSBcIlN0dWJcIjogY2FzZSBcIlN0YXJ0XCI6IGNhc2UgXCJDXCI6IGNhc2UgXCJMaXN0XCI6XHJcblx0XHRcdGF1dG9DbGFzcyA9IHRoaXMub3Jlc0NsYXNzO1xyXG5cdFx0fVxyXG5cdH0gZWxzZSB7XHJcblx0XHQvLyBub3RoaW5nIHRvIGRvXHJcblx0XHRyZXR1cm47XHJcblx0fVxyXG5cdC8vIERvIHRoZSBhdXRvZmlsbGluZ1xyXG5cdHRoaXMuaXRlbXMuZm9yRWFjaChiYW5uZXIgPT4ge1xyXG5cdFx0aWYgKCFiYW5uZXIuaGFzQ2xhc3NSYXRpbmdzICYmICFiYW5uZXIuaXNTaGVsbFRlbXBsYXRlKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHRcdGNvbnN0IGNsYXNzSXRlbSA9IGJhbm5lci5jbGFzc0Ryb3Bkb3duLmdldE1lbnUoKS5maW5kU2VsZWN0ZWRJdGVtKCk7XHJcblx0XHRpZiAoY2xhc3NJdGVtICYmIGNsYXNzSXRlbS5nZXREYXRhKCkgJiYgIWNvbmZpZy5mb3JCYW5uZXJTaGVsbCkge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblx0XHRpZiAoY29uZmlnLmZvckJhbm5lclNoZWxsICYmICFiYW5uZXIuaXNTaGVsbFRlbXBsYXRlICYmIGNsYXNzSXRlbS5nZXREYXRhKCkgPT09IGF1dG9DbGFzcykge1xyXG5cdFx0XHRiYW5uZXIuY2xhc3NEcm9wZG93bi5nZXRNZW51KCkuc2VsZWN0SXRlbUJ5RGF0YShudWxsKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cdFx0YmFubmVyLmNsYXNzRHJvcGRvd24uZ2V0TWVudSgpLnNlbGVjdEl0ZW1CeURhdGEoYXV0b0NsYXNzKTtcclxuXHRcdGJhbm5lci5jbGFzc0Ryb3Bkb3duLnNldEF1dG9maWxsZWQodHJ1ZSk7XHJcblx0fSk7XHJcbn07XHJcblxyXG5CYW5uZXJMaXN0V2lkZ2V0LnByb3RvdHlwZS5hdXRvZmlsbEltcG9ydGFuY2VSYXRpbmdzID0gZnVuY3Rpb24oKSB7XHJcblx0aWYgKCF0aGlzLnByZWZlcmVuY2VzLmF1dG9maWxsSW1wb3J0YW5jZSkge1xyXG5cdFx0cmV0dXJuO1xyXG5cdH1cclxuXHRjb25zdCBpc1JlZ3VsYXJBcnRpY2xlID0gdGhpcy5wYWdlSW5mbyAmJiB0aGlzLnBhZ2VJbmZvLmlzQXJ0aWNsZSAmJiAhdGhpcy5wYWdlSW5mby5yZWRpcmVjdCAmJiAhdGhpcy5wYWdlSW5mby5pc0Rpc2FtYmlnO1xyXG5cdGlmICghaXNSZWd1bGFyQXJ0aWNsZSkge1xyXG5cdFx0cmV0dXJuO1xyXG5cdH1cclxuXHQvLyBUT0RPOiBTaG91bGQgdHJ5IHRvIGZpbmQgYSBzbWFydGVyLCBiYW5uZXItc3BlY2lmaWMgd2F5IG9mIGRldGVybWluaW5nIGltcG9ydGFuY2UuXHJcblx0Ly8gTWF5YmUgZG8gc29tZXRoaW5nIHdpdGggIE9SRVMncyBcImRyYWZ0dG9waWNcIiBtb2RlbC5cclxuXHRjb25zdCBhdXRvSW1wb3J0YW5jZSA9IFwiTG93XCI7XHJcblx0dGhpcy5pdGVtcy5mb3JFYWNoKGJhbm5lciA9PiB7XHJcblx0XHRpZiAoIWJhbm5lci5oYXNJbXBvcnRhbmNlUmF0aW5ncykge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblx0XHRjb25zdCBpbXBvcnRhbmNlSXRlbSA9IGJhbm5lci5pbXBvcnRhbmNlRHJvcGRvd24uZ2V0TWVudSgpLmZpbmRTZWxlY3RlZEl0ZW0oKTtcclxuXHRcdGlmIChpbXBvcnRhbmNlSXRlbSAmJiBpbXBvcnRhbmNlSXRlbS5nZXREYXRhKCkpIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cdFx0YmFubmVyLmltcG9ydGFuY2VEcm9wZG93bi5nZXRNZW51KCkuc2VsZWN0SXRlbUJ5RGF0YShhdXRvSW1wb3J0YW5jZSk7XHJcblx0XHRiYW5uZXIuaW1wb3J0YW5jZURyb3Bkb3duLnNldEF1dG9maWxsZWQodHJ1ZSk7XHJcblx0fSk7XHJcbn07XHJcblxyXG5CYW5uZXJMaXN0V2lkZ2V0LnByb3RvdHlwZS5zZXRQcmVmZXJlbmNlcyA9IGZ1bmN0aW9uKHByZWZzKSB7XHJcblx0dGhpcy5wcmVmZXJlbmNlcyA9IHByZWZzO1xyXG5cdHRoaXMuaXRlbXMuZm9yRWFjaChiYW5uZXIgPT4gYmFubmVyLnNldFByZWZlcmVuY2VzKHByZWZzKSk7XHJcblx0dGhpcy5hdXRvZmlsbENsYXNzUmF0aW5ncygpO1xyXG5cdHRoaXMuYXV0b2ZpbGxJbXBvcnRhbmNlUmF0aW5ncygpO1xyXG59O1xyXG5cclxuQmFubmVyTGlzdFdpZGdldC5wcm90b3R5cGUubWFrZVdpa2l0ZXh0ID0gZnVuY3Rpb24oKSB7XHJcblx0dmFyIGJhbm5lcnNXaWtpdGV4dCA9IGZpbHRlckFuZE1hcChcclxuXHRcdHRoaXMuaXRlbXMsXHJcblx0XHRiYW5uZXIgPT4gIWJhbm5lci5pc1NoZWxsVGVtcGxhdGUsXHJcblx0XHRiYW5uZXIgPT4gYmFubmVyLm1ha2VXaWtpdGV4dCgpXHJcblx0KS5qb2luKFwiXFxuXCIpO1xyXG5cdHZhciBzaGVsbFRlbXBsYXRlID0gdGhpcy5pdGVtcy5maW5kKGJhbm5lciA9PiBiYW5uZXIuaXNTaGVsbFRlbXBsYXRlKTtcclxuXHRpZiAoIXNoZWxsVGVtcGxhdGUpIHtcclxuXHRcdHJldHVybiBiYW5uZXJzV2lraXRleHQ7XHJcblx0fVxyXG5cdHZhciBzaGVsbFBhcmFtMSA9IG5ldyBQYXJhbWV0ZXJXaWRnZXQoe1xyXG5cdFx0bmFtZTpcIjFcIixcclxuXHRcdHZhbHVlOiBcIlxcblwiICsgYmFubmVyc1dpa2l0ZXh0ICsgXCJcXG5cIiArXHJcblx0XHRcdChzaGVsbFRlbXBsYXRlLm5vblN0YW5kYXJkVGVtcGxhdGVzXHQ/IHNoZWxsVGVtcGxhdGUubm9uU3RhbmRhcmRUZW1wbGF0ZXMgKyBcIlxcblwiIDogXCJcIilcclxuXHR9KTtcclxuXHRzaGVsbFRlbXBsYXRlLnBhcmFtZXRlckxpc3QuYWRkSXRlbXMoWyBzaGVsbFBhcmFtMSBdKTtcclxuXHR2YXIgc2hlbGxXaWtpdGV4dCA9IHNoZWxsVGVtcGxhdGUubWFrZVdpa2l0ZXh0KCk7XHJcblx0c2hlbGxUZW1wbGF0ZS5wYXJhbWV0ZXJMaXN0LnJlbW92ZUl0ZW1zKFsgc2hlbGxQYXJhbTEgXSk7XHJcblx0cmV0dXJuIHNoZWxsV2lraXRleHQ7XHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBCYW5uZXJMaXN0V2lkZ2V0O1xyXG4vLyA8L25vd2lraT4iLCJpbXBvcnQgUGFyYW1ldGVyTGlzdFdpZGdldCBmcm9tIFwiLi9QYXJhbWV0ZXJMaXN0V2lkZ2V0XCI7XHJcbmltcG9ydCBQYXJhbWV0ZXJXaWRnZXQgZnJvbSBcIi4vUGFyYW1ldGVyV2lkZ2V0XCI7XHJcbmltcG9ydCBEcm9wZG93blBhcmFtZXRlcldpZGdldCBmcm9tIFwiLi9Ecm9wZG93blBhcmFtZXRlcldpZGdldFwiO1xyXG5pbXBvcnQgU3VnZ2VzdGlvbkxvb2t1cFRleHRJbnB1dFdpZGdldCBmcm9tIFwiLi9TdWdnZXN0aW9uTG9va3VwVGV4dElucHV0V2lkZ2V0XCI7XHJcbmltcG9ydCB7IGZpbHRlckFuZE1hcCwgY2xhc3NNYXNrLCBpbXBvcnRhbmNlTWFzayB9IGZyb20gXCIuLi8uLi91dGlsXCI7XHJcbmltcG9ydCB7VGVtcGxhdGUsIGdldFdpdGhSZWRpcmVjdFRvfSBmcm9tIFwiLi4vLi4vVGVtcGxhdGVcIjtcclxuaW1wb3J0IEhvcml6b250YWxMYXlvdXRXaWRnZXQgZnJvbSBcIi4vSG9yaXpvbnRhbExheW91dFdpZGdldFwiO1xyXG5pbXBvcnQgZ2xvYmFsQ29uZmlnIGZyb20gXCIuLi8uLi9jb25maWdcIjtcclxuLy8gPG5vd2lraT5cclxuXHJcbmZ1bmN0aW9uIEJhbm5lcldpZGdldCggdGVtcGxhdGUsIGNvbmZpZyApIHtcclxuXHQvLyBDb25maWd1cmF0aW9uIGluaXRpYWxpemF0aW9uXHJcblx0Y29uZmlnID0gY29uZmlnIHx8IHt9O1xyXG5cdC8vIENhbGwgcGFyZW50IGNvbnN0cnVjdG9yXHJcblx0QmFubmVyV2lkZ2V0LnN1cGVyLmNhbGwoIHRoaXMsIGNvbmZpZyApO1xyXG5cdHRoaXMuJG92ZXJsYXkgPSBjb25maWcuJG92ZXJsYXk7XHJcblxyXG5cdC8qIC0tLSBQUkVGUyAtLS0gKi9cclxuXHR0aGlzLnByZWZlcmVuY2VzID0gY29uZmlnLnByZWZlcmVuY2VzO1xyXG5cdFxyXG5cdC8qIC0tLSBQUk9QUyAtLS0gKi9cclxuXHR0aGlzLnBhcmFtRGF0YSA9IHRlbXBsYXRlLnBhcmFtRGF0YTtcclxuXHR0aGlzLnBhcmFtQWxpYXNlcyA9IHRlbXBsYXRlLnBhcmFtQWxpYXNlcyB8fCB7fTtcclxuXHR0aGlzLnBhcmFtZXRlclN1Z2dlc3Rpb25zID0gdGVtcGxhdGUucGFyYW1ldGVyU3VnZ2VzdGlvbnM7XHJcblx0dGhpcy5uYW1lID0gdGVtcGxhdGUubmFtZTtcclxuXHR0aGlzLndpa2l0ZXh0ID0gdGVtcGxhdGUud2lraXRleHQ7XHJcblx0dGhpcy5waXBlU3R5bGUgPSB0ZW1wbGF0ZS5waXBlU3R5bGU7XHJcblx0dGhpcy5lcXVhbHNTdHlsZSA9IHRlbXBsYXRlLmVxdWFsc1N0eWxlO1xyXG5cdHRoaXMuZW5kQnJhY2VzU3R5bGUgPSB0ZW1wbGF0ZS5lbmRCcmFjZXNTdHlsZTtcclxuXHR0aGlzLm1haW5UZXh0ID0gdGVtcGxhdGUuZ2V0VGl0bGUoKS5nZXRNYWluVGV4dCgpO1xyXG5cdHRoaXMucmVkaXJlY3RUYXJnZXRNYWluVGV4dCA9IHRlbXBsYXRlLnJlZGlyZWN0VGFyZ2V0ICYmIHRlbXBsYXRlLnJlZGlyZWN0VGFyZ2V0LmdldE1haW5UZXh0KCk7XHJcblx0dGhpcy5pc1NoZWxsVGVtcGxhdGUgPSB0ZW1wbGF0ZS5pc1NoZWxsVGVtcGxhdGUoKTtcclxuXHR0aGlzLmNoYW5nZWQgPSB0ZW1wbGF0ZS5wYXJhbWV0ZXJzLnNvbWUocGFyYW1ldGVyID0+IHBhcmFtZXRlci5hdXRvZmlsbGVkKTsgLy8gaW5pdGlhbGx5IGZhbHNlLCB1bmxlc3Mgc29tZSBwYXJhbWV0ZXJzIHdlcmUgYXV0b2ZpbGxlZFxyXG5cdHRoaXMuaGFzQ2xhc3NSYXRpbmdzID0gdGVtcGxhdGUuY2xhc3NlcyAmJiB0ZW1wbGF0ZS5jbGFzc2VzLmxlbmd0aDtcclxuXHR0aGlzLmhhc0ltcG9ydGFuY2VSYXRpbmdzID0gdGVtcGxhdGUuaW1wb3J0YW5jZXMgJiYgdGVtcGxhdGUuaW1wb3J0YW5jZXMubGVuZ3RoO1xyXG5cdHRoaXMuaW5hY3RpdmVQcm9qZWN0ID0gdGVtcGxhdGUuaW5hY3RpdmVQcm9qZWN0O1xyXG5cclxuXHQvKiAtLS0gVElUTEUgQU5EIFJBVElOR1MgLS0tICovXHJcblxyXG5cdHRoaXMucmVtb3ZlQnV0dG9uID0gbmV3IE9PLnVpLkJ1dHRvbldpZGdldCgge1xyXG5cdFx0aWNvbjogXCJ0cmFzaFwiLFxyXG5cdFx0bGFiZWw6IFwiUmVtb3ZlIGJhbm5lclwiLFxyXG5cdFx0dGl0bGU6IFwiUmVtb3ZlIGJhbm5lclwiLFxyXG5cdFx0ZmxhZ3M6IFwiZGVzdHJ1Y3RpdmVcIixcclxuXHRcdCRlbGVtZW50OiAkKFwiPGRpdiBzdHlsZT1cXFwid2lkdGg6MTAwJVxcXCI+XCIpXHJcblx0fSApO1xyXG5cdHRoaXMuY2xlYXJCdXR0b24gPSBuZXcgT08udWkuQnV0dG9uV2lkZ2V0KCB7XHJcblx0XHRpY29uOiBcImNhbmNlbFwiLFxyXG5cdFx0bGFiZWw6IFwiQ2xlYXIgcGFyYW1ldGVyc1wiLFxyXG5cdFx0dGl0bGU6IFwiQ2xlYXIgcGFyYW1ldGVyc1wiLFxyXG5cdFx0ZmxhZ3M6IFwiZGVzdHJ1Y3RpdmVcIixcclxuXHRcdCRlbGVtZW50OiAkKFwiPGRpdiBzdHlsZT1cXFwid2lkdGg6MTAwJVxcXCI+XCIpXHJcblx0fSApO1xyXG5cdHRoaXMucmVtb3ZlQnV0dG9uLiRlbGVtZW50LmZpbmQoXCJhXCIpLmNzcyhcIndpZHRoXCIsXCIxMDAlXCIpO1xyXG5cdHRoaXMuY2xlYXJCdXR0b24uJGVsZW1lbnQuZmluZChcImFcIikuY3NzKFwid2lkdGhcIixcIjEwMCVcIik7XHJcblxyXG5cdHRoaXMudGl0bGVCdXR0b25zR3JvdXAgPSBuZXcgT08udWkuQnV0dG9uR3JvdXBXaWRnZXQoIHtcclxuXHRcdGl0ZW1zOiBbIHRoaXMucmVtb3ZlQnV0dG9uLFx0dGhpcy5jbGVhckJ1dHRvbiBdLFxyXG5cdFx0JGVsZW1lbnQ6ICQoXCI8c3BhbiBzdHlsZT0nd2lkdGg6MTAwJTsnPlwiKSxcclxuXHR9ICk7XHJcblxyXG5cdHRoaXMubWFpbkxhYmVsUG9wdXBCdXR0b24gPSBuZXcgT08udWkuUG9wdXBCdXR0b25XaWRnZXQoIHtcclxuXHRcdGxhYmVsOiBge3ske3RlbXBsYXRlLmdldFRpdGxlKCkuZ2V0TWFpblRleHQoKX19fSR7dGhpcy5pbmFjdGl2ZVByb2plY3QgPyBcIiAoaW5hY3RpdmUpXCIgOiBcIlwifWAsXHJcblx0XHQkZWxlbWVudDogJChcIjxzcGFuIHN0eWxlPSdkaXNwbGF5OmlubGluZS1ibG9jazt3aWR0aDo0OCU7bWFyZ2luLXJpZ2h0OjA7cGFkZGluZy1yaWdodDo4cHgnPlwiKSxcclxuXHRcdCRvdmVybGF5OiB0aGlzLiRvdmVybGF5LFxyXG5cdFx0aW5kaWNhdG9yOlwiZG93blwiLFxyXG5cdFx0ZnJhbWVkOmZhbHNlLFxyXG5cdFx0cG9wdXA6IHtcclxuXHRcdFx0JGNvbnRlbnQ6IHRoaXMudGl0bGVCdXR0b25zR3JvdXAuJGVsZW1lbnQsXHJcblx0XHRcdHdpZHRoOiAyMDAsXHJcblx0XHRcdHBhZGRlZDogZmFsc2UsXHJcblx0XHRcdGFsaWduOiBcImZvcmNlLXJpZ2h0XCIsXHJcblx0XHRcdGFuY2hvcjogZmFsc2VcclxuXHRcdH1cclxuXHR9ICk7XHJcblx0dGhpcy5tYWluTGFiZWxQb3B1cEJ1dHRvbi4kZWxlbWVudFxyXG5cdFx0LmNoaWxkcmVuKFwiYVwiKS5maXJzdCgpLmNzcyh7XCJmb250LXNpemVcIjpcIjExMCVcIn0pXHJcblx0XHQuZmluZChcInNwYW4ub28tdWktbGFiZWxFbGVtZW50LWxhYmVsXCIpLmNzcyh7XCJ3aGl0ZS1zcGFjZVwiOlwibm9ybWFsXCJ9KTtcclxuXHJcblx0Ly8gUmF0aW5nIGRyb3Bkb3duc1xyXG5cdGlmICh0aGlzLmlzU2hlbGxUZW1wbGF0ZSkge1xyXG5cdFx0dGhpcy5jbGFzc0Ryb3Bkb3duID0gbmV3IERyb3Bkb3duUGFyYW1ldGVyV2lkZ2V0KCB7XHJcblx0XHRcdGxhYmVsOiBuZXcgT08udWkuSHRtbFNuaXBwZXQoXCI8c3BhbiBzdHlsZT1cXFwiY29sb3I6Izc3N1xcXCI+Q2xhc3M8L3NwYW4+XCIpLFxyXG5cdFx0XHRtZW51OiB7XHJcblx0XHRcdFx0aXRlbXM6IFtcclxuXHRcdFx0XHRcdG5ldyBPTy51aS5NZW51T3B0aW9uV2lkZ2V0KCB7XHJcblx0XHRcdFx0XHRcdGRhdGE6IG51bGwsXHJcblx0XHRcdFx0XHRcdGxhYmVsOiBuZXcgT08udWkuSHRtbFNuaXBwZXQoYDxzcGFuIHN0eWxlPVwiY29sb3I6Izc3N1wiPigke2NvbmZpZy5pc0FydGljbGUgPyBcIm5vIGNsYXNzXCIgOiBcImF1dG8tZGV0ZWN0XCJ9KTwvc3Bhbj5gKVxyXG5cdFx0XHRcdFx0fSApLFxyXG5cdFx0XHRcdFx0Li4uZ2xvYmFsQ29uZmlnLmJhbm5lckRlZmF1bHRzLmNsYXNzZXMubWFwKCBjbGFzc25hbWUgPT5cclxuXHRcdFx0XHRcdFx0bmV3IE9PLnVpLk1lbnVPcHRpb25XaWRnZXQoIHtcclxuXHRcdFx0XHRcdFx0XHRkYXRhOiBjbGFzc25hbWUsXHJcblx0XHRcdFx0XHRcdFx0bGFiZWw6IGNsYXNzbmFtZVxyXG5cdFx0XHRcdFx0XHR9IClcclxuXHRcdFx0XHRcdClcclxuXHRcdFx0XHRdLFxyXG5cdFx0XHR9LFxyXG5cdFx0XHQkb3ZlcmxheTogdGhpcy4kb3ZlcmxheSxcclxuXHRcdH0gKTtcclxuXHRcdHZhciBzaGVsbENsYXNzUGFyYW0gPSB0ZW1wbGF0ZS5wYXJhbWV0ZXJzLmZpbmQocGFyYW1ldGVyID0+IHBhcmFtZXRlci5uYW1lID09PSBcImNsYXNzXCIpO1xyXG5cdFx0dGhpcy5jbGFzc0Ryb3Bkb3duLmdldE1lbnUoKS5zZWxlY3RJdGVtQnlEYXRhKCBzaGVsbENsYXNzUGFyYW0gJiYgY2xhc3NNYXNrKHNoZWxsQ2xhc3NQYXJhbS52YWx1ZSkgKTtcclxuXHR9IGVsc2UgaWYgKHRoaXMuaGFzQ2xhc3NSYXRpbmdzKSB7XHJcblx0XHR0aGlzLmNsYXNzRHJvcGRvd24gPSBuZXcgRHJvcGRvd25QYXJhbWV0ZXJXaWRnZXQoIHtcclxuXHRcdFx0bGFiZWw6IG5ldyBPTy51aS5IdG1sU25pcHBldChcIjxzcGFuIHN0eWxlPVxcXCJjb2xvcjojNzc3XFxcIj5DbGFzczwvc3Bhbj5cIiksXHJcblx0XHRcdG1lbnU6IHtcclxuXHRcdFx0XHRpdGVtczogW1xyXG5cdFx0XHRcdFx0bmV3IE9PLnVpLk1lbnVPcHRpb25XaWRnZXQoIHtcclxuXHRcdFx0XHRcdFx0ZGF0YTogbnVsbCxcclxuXHRcdFx0XHRcdFx0bGFiZWw6IG5ldyBPTy51aS5IdG1sU25pcHBldChgPHNwYW4gc3R5bGU9XCJjb2xvcjojNzc3XCI+KCR7Y29uZmlnLmlzQXJ0aWNsZSA/IFwiaW5oZXJpdCBmcm9tIHNoZWxsXCIgOiBcImF1dG8tZGV0ZWN0XCJ9KTwvc3Bhbj5gKVxyXG5cdFx0XHRcdFx0fSApLFxyXG5cdFx0XHRcdFx0Li4udGVtcGxhdGUuY2xhc3Nlcy5tYXAoIGNsYXNzbmFtZSA9PlxyXG5cdFx0XHRcdFx0XHRuZXcgT08udWkuTWVudU9wdGlvbldpZGdldCgge1xyXG5cdFx0XHRcdFx0XHRcdGRhdGE6IGNsYXNzbmFtZSxcclxuXHRcdFx0XHRcdFx0XHRsYWJlbDogY2xhc3NuYW1lXHJcblx0XHRcdFx0XHRcdH0gKVxyXG5cdFx0XHRcdFx0KVxyXG5cdFx0XHRcdF0sXHJcblx0XHRcdH0sXHJcblx0XHRcdCRvdmVybGF5OiB0aGlzLiRvdmVybGF5LFxyXG5cdFx0fSApO1xyXG5cdFx0dmFyIGNsYXNzUGFyYW0gPSB0ZW1wbGF0ZS5wYXJhbWV0ZXJzLmZpbmQocGFyYW1ldGVyID0+IHBhcmFtZXRlci5uYW1lID09PSBcImNsYXNzXCIpO1xyXG5cdFx0dGhpcy5jbGFzc0Ryb3Bkb3duLmdldE1lbnUoKS5zZWxlY3RJdGVtQnlEYXRhKCBjbGFzc1BhcmFtICYmIGNsYXNzTWFzayhjbGFzc1BhcmFtLnZhbHVlKSApO1xyXG5cdH1cclxuXHJcblx0aWYgKHRoaXMuaGFzSW1wb3J0YW5jZVJhdGluZ3MpIHtcclxuXHRcdHRoaXMuaW1wb3J0YW5jZURyb3Bkb3duID0gbmV3IERyb3Bkb3duUGFyYW1ldGVyV2lkZ2V0KCB7XHJcblx0XHRcdGxhYmVsOiBuZXcgT08udWkuSHRtbFNuaXBwZXQoXCI8c3BhbiBzdHlsZT1cXFwiY29sb3I6Izc3N1xcXCI+SW1wb3J0YW5jZTwvc3Bhbj5cIiksXHJcblx0XHRcdG1lbnU6IHtcclxuXHRcdFx0XHRpdGVtczogW1xyXG5cdFx0XHRcdFx0bmV3IE9PLnVpLk1lbnVPcHRpb25XaWRnZXQoIHtcclxuXHRcdFx0XHRcdFx0ZGF0YTogbnVsbCwgbGFiZWw6IG5ldyBPTy51aS5IdG1sU25pcHBldChgPHNwYW4gc3R5bGU9XCJjb2xvcjojNzc3XCI+KCR7Y29uZmlnLmlzQXJ0aWNsZSA/IFwibm8gaW1wb3J0YW5jZVwiIDogXCJhdXRvLWRldGVjdFwifSk8L3NwYW4+YClcclxuXHRcdFx0XHRcdH0gKSxcclxuXHRcdFx0XHRcdC4uLnRlbXBsYXRlLmltcG9ydGFuY2VzLm1hcChpbXBvcnRhbmNlID0+XHJcblx0XHRcdFx0XHRcdG5ldyBPTy51aS5NZW51T3B0aW9uV2lkZ2V0KCB7XHJcblx0XHRcdFx0XHRcdFx0ZGF0YTogaW1wb3J0YW5jZSxcclxuXHRcdFx0XHRcdFx0XHRsYWJlbDogaW1wb3J0YW5jZVxyXG5cdFx0XHRcdFx0XHR9IClcclxuXHRcdFx0XHRcdClcclxuXHRcdFx0XHRdXHJcblx0XHRcdH0sXHJcblx0XHRcdCRvdmVybGF5OiB0aGlzLiRvdmVybGF5LFxyXG5cdFx0fSApO1xyXG5cdFx0dmFyIGltcG9ydGFuY2VQYXJhbSA9IHRlbXBsYXRlLnBhcmFtZXRlcnMuZmluZChwYXJhbWV0ZXIgPT4gcGFyYW1ldGVyLm5hbWUgPT09IFwiaW1wb3J0YW5jZVwiKTtcclxuXHRcdHRoaXMuaW1wb3J0YW5jZURyb3Bkb3duLmdldE1lbnUoKS5zZWxlY3RJdGVtQnlEYXRhKCBpbXBvcnRhbmNlUGFyYW0gJiYgaW1wb3J0YW5jZU1hc2soaW1wb3J0YW5jZVBhcmFtLnZhbHVlKSApO1xyXG5cdH1cclxuXHJcblx0dGhpcy50aXRsZUxheW91dCA9IG5ldyBPTy51aS5Ib3Jpem9udGFsTGF5b3V0KCB7XHJcblx0XHRpdGVtczogWyB0aGlzLm1haW5MYWJlbFBvcHVwQnV0dG9uIF1cclxuXHR9ICk7XHJcblx0aWYgKHRoaXMuaGFzQ2xhc3NSYXRpbmdzIHx8IHRoaXMuaXNTaGVsbFRlbXBsYXRlKSB7XHJcblx0XHR0aGlzLnRpdGxlTGF5b3V0LmFkZEl0ZW1zKFsgdGhpcy5jbGFzc0Ryb3Bkb3duIF0pO1xyXG5cdH1cclxuXHRpZiAodGhpcy5oYXNJbXBvcnRhbmNlUmF0aW5ncykge1xyXG5cdFx0dGhpcy50aXRsZUxheW91dC5hZGRJdGVtcyhbIHRoaXMuaW1wb3J0YW5jZURyb3Bkb3duIF0pO1xyXG5cdH1cclxuXHJcblx0LyogLS0tIFBBUkFNRVRFUlMgTElTVCAtLS0gKi9cclxuXHJcblx0dmFyIHBhcmFtZXRlcldpZGdldHMgPSBmaWx0ZXJBbmRNYXAoXHJcblx0XHR0ZW1wbGF0ZS5wYXJhbWV0ZXJzLFxyXG5cdFx0cGFyYW0gPT4ge1xyXG5cdFx0XHRpZiAoIHRoaXMuaXNTaGVsbFRlbXBsYXRlICkge1xyXG5cdFx0XHRcdGlmIChwYXJhbS5uYW1lID09IFwiMVwiKSB7XHJcblx0XHRcdFx0XHR0aGlzLnNoZWxsUGFyYW0xVmFsdWUgPSBwYXJhbS52YWx1ZTtcclxuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0cmV0dXJuIHBhcmFtLm5hbWUgIT09IFwiY2xhc3NcIjtcclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm4gcGFyYW0ubmFtZSAhPT0gXCJjbGFzc1wiICYmIHBhcmFtLm5hbWUgIT09IFwiaW1wb3J0YW5jZVwiO1xyXG5cdFx0fSxcclxuXHRcdHBhcmFtID0+IG5ldyBQYXJhbWV0ZXJXaWRnZXQocGFyYW0sIHRlbXBsYXRlLnBhcmFtRGF0YVtwYXJhbS5uYW1lXSwgeyRvdmVybGF5OiB0aGlzLiRvdmVybGF5fSlcclxuXHQpO1xyXG5cclxuXHR0aGlzLnBhcmFtZXRlckxpc3QgPSBuZXcgUGFyYW1ldGVyTGlzdFdpZGdldCgge1xyXG5cdFx0aXRlbXM6IHBhcmFtZXRlcldpZGdldHMsXHJcblx0XHRwcmVmZXJlbmNlczogdGhpcy5wcmVmZXJlbmNlc1xyXG5cdH0gKTtcclxuXHJcblx0LyogLS0tIEFERCBQQVJBTUVURVIgU0VDVElPTiAtLS0gKi9cclxuXHJcblx0dGhpcy5hZGRQYXJhbWV0ZXJOYW1lSW5wdXQgPSBuZXcgU3VnZ2VzdGlvbkxvb2t1cFRleHRJbnB1dFdpZGdldCh7XHJcblx0XHRzdWdnZXN0aW9uczogdGVtcGxhdGUucGFyYW1ldGVyU3VnZ2VzdGlvbnMsXHJcblx0XHRwbGFjZWhvbGRlcjogXCJwYXJhbWV0ZXIgbmFtZVwiLFxyXG5cdFx0JGVsZW1lbnQ6ICQoXCI8ZGl2IHN0eWxlPSdkaXNwbGF5OmlubGluZS1ibG9jazt3aWR0aDo0MCUnPlwiKSxcclxuXHRcdHZhbGlkYXRlOiBmdW5jdGlvbih2YWwpIHtcclxuXHRcdFx0bGV0IHt2YWxpZE5hbWUsIG5hbWUsIHZhbHVlfSA9IHRoaXMuZ2V0QWRkUGFyYW1ldGVyc0luZm8odmFsKTtcclxuXHRcdFx0cmV0dXJuICghbmFtZSAmJiAhdmFsdWUpID8gdHJ1ZSA6IHZhbGlkTmFtZTtcclxuXHRcdH0uYmluZCh0aGlzKSxcclxuXHRcdGFsbG93U3VnZ2VzdGlvbnNXaGVuRW1wdHk6IHRydWUsXHJcblx0XHQkb3ZlcmxheTogdGhpcy4kb3ZlcmxheVxyXG5cdH0pO1xyXG5cdHRoaXMudXBkYXRlQWRkUGFyYW1ldGVyTmFtZVN1Z2dlc3Rpb25zKCk7XHJcblx0dGhpcy5hZGRQYXJhbWV0ZXJWYWx1ZUlucHV0ID0gbmV3IFN1Z2dlc3Rpb25Mb29rdXBUZXh0SW5wdXRXaWRnZXQoe1xyXG5cdFx0cGxhY2Vob2xkZXI6IFwicGFyYW1ldGVyIHZhbHVlXCIsXHJcblx0XHQkZWxlbWVudDogJChcIjxkaXYgc3R5bGU9J2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjQwJSc+XCIpLFxyXG5cdFx0dmFsaWRhdGU6IGZ1bmN0aW9uKHZhbCkge1xyXG5cdFx0XHRsZXQge3ZhbGlkVmFsdWUsIG5hbWUsIHZhbHVlfSA9IHRoaXMuZ2V0QWRkUGFyYW1ldGVyc0luZm8obnVsbCwgdmFsKTtcclxuXHRcdFx0cmV0dXJuICghbmFtZSAmJiAhdmFsdWUpID8gdHJ1ZSA6IHZhbGlkVmFsdWU7XHJcblx0XHR9LmJpbmQodGhpcyksXHJcblx0XHRhbGxvd1N1Z2dlc3Rpb25zV2hlbkVtcHR5OiB0cnVlLFxyXG5cdFx0JG92ZXJsYXk6IHRoaXMuJG92ZXJsYXlcclxuXHR9KTtcclxuXHR0aGlzLmFkZFBhcmFtZXRlckJ1dHRvbiA9IG5ldyBPTy51aS5CdXR0b25XaWRnZXQoe1xyXG5cdFx0bGFiZWw6IFwiQWRkXCIsXHJcblx0XHRpY29uOiBcImFkZFwiLFxyXG5cdFx0ZmxhZ3M6IFwicHJvZ3Jlc3NpdmVcIlxyXG5cdH0pLnNldERpc2FibGVkKHRydWUpO1xyXG5cdHRoaXMuYWRkUGFyYW1ldGVyQ29udHJvbHMgPSBuZXcgSG9yaXpvbnRhbExheW91dFdpZGdldCgge1xyXG5cdFx0aXRlbXM6IFtcclxuXHRcdFx0dGhpcy5hZGRQYXJhbWV0ZXJOYW1lSW5wdXQsXHJcblx0XHRcdG5ldyBPTy51aS5MYWJlbFdpZGdldCh7bGFiZWw6XCI9XCJ9KSxcclxuXHRcdFx0dGhpcy5hZGRQYXJhbWV0ZXJWYWx1ZUlucHV0LFxyXG5cdFx0XHR0aGlzLmFkZFBhcmFtZXRlckJ1dHRvblxyXG5cdFx0XVxyXG5cdH0gKTtcclxuXHJcblx0dGhpcy5hZGRQYXJhbWV0ZXJMYXlvdXQgPSBuZXcgT08udWkuRmllbGRMYXlvdXQodGhpcy5hZGRQYXJhbWV0ZXJDb250cm9scywge1xyXG5cdFx0bGFiZWw6IFwiQWRkIHBhcmFtZXRlcjpcIixcclxuXHRcdGFsaWduOiBcInRvcFwiXHJcblx0fSkudG9nZ2xlKGZhbHNlKTtcclxuXHQvLyBBIGhhY2sgdG8gbWFrZSBtZXNzYWdlcyBhcHBlYXIgb24gdGhlaXIgb3duIGxpbmVcclxuXHR0aGlzLmFkZFBhcmFtZXRlckxheW91dC4kZWxlbWVudC5maW5kKFwiLm9vLXVpLWZpZWxkTGF5b3V0LW1lc3NhZ2VzXCIpLmNzcyh7XHJcblx0XHRcImNsZWFyXCI6IFwiYm90aFwiLFxyXG5cdFx0XCJwYWRkaW5nLXRvcFwiOiAwXHJcblx0fSk7XHJcblxyXG5cdC8qIC0tLSBPVkVSQUxMIExBWU9VVC9ESVNQTEFZIC0tLSAqL1xyXG5cclxuXHQvLyBEaXNwbGF5IHRoZSBsYXlvdXQgZWxlbWVudHMsIGFuZCBhIHJ1bGVcclxuXHR0aGlzLiRlbGVtZW50LmFkZENsYXNzKFwicmF0ZXItYmFubmVyV2lkZ2V0XCIpLmFwcGVuZChcclxuXHRcdHRoaXMudGl0bGVMYXlvdXQuJGVsZW1lbnQsXHJcblx0XHR0aGlzLnBhcmFtZXRlckxpc3QuJGVsZW1lbnQsXHJcblx0XHR0aGlzLmFkZFBhcmFtZXRlckxheW91dC4kZWxlbWVudFxyXG5cdCk7XHJcblx0aWYgKCF0aGlzLmlzU2hlbGxUZW1wbGF0ZSkge1xyXG5cdFx0dGhpcy4kZWxlbWVudC5hcHBlbmQoICQoXCI8aHI+XCIpICk7XHJcblx0fVxyXG5cclxuXHRpZiAodGhpcy5pc1NoZWxsVGVtcGxhdGUpIHtcclxuXHRcdHRoaXMuJGVsZW1lbnQuY3NzKHtcclxuXHRcdFx0XCJiYWNrZ3JvdW5kXCI6IFwiI2VlZVwiLFxyXG5cdFx0XHRcImJvcmRlci1yYWRpdXNcIjogXCIxMHB4XCIsXHJcblx0XHRcdFwicGFkZGluZ1wiOiBcIjAgMTBweCA1cHhcIixcclxuXHRcdFx0XCJtYXJnaW4tYm90dG9tXCI6IFwiMTJweFwiLFxyXG5cdFx0XHRcImZvbnQtc2l6ZVwiOiBcIjkyJVwiXHRcdFx0XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdC8qIC0tLSBFVkVOVCBIQU5ETElORyAtLS0gKi9cclxuXHJcblx0aWYgKHRoaXMuaGFzQ2xhc3NSYXRpbmdzKSB7XHJcblx0XHR0aGlzLmNsYXNzRHJvcGRvd24uY29ubmVjdCggdGhpcywge1wiY2hhbmdlXCI6IFwib25DbGFzc0NoYW5nZVwiIH0gKTtcclxuXHR9XHJcblx0aWYgKHRoaXMuaGFzSW1wb3J0YW5jZVJhdGluZ3MpIHtcclxuXHRcdHRoaXMuaW1wb3J0YW5jZURyb3Bkb3duLmNvbm5lY3QoIHRoaXMsIHtcImNoYW5nZVwiOiBcIm9uSW1wb3J0YW5jZUNoYW5nZVwiIH0gKTtcclxuXHR9XHJcblx0dGhpcy5wYXJhbWV0ZXJMaXN0LmNvbm5lY3QoIHRoaXMsIHtcclxuXHRcdFwiY2hhbmdlXCI6IFwib25QYXJhbWV0ZXJDaGFuZ2VcIixcclxuXHRcdFwiYWRkUGFyYW1ldGVyc0J1dHRvbkNsaWNrXCI6IFwic2hvd0FkZFBhcmFtZXRlcklucHV0c1wiLFxyXG5cdFx0XCJ1cGRhdGVkU2l6ZVwiOiBcIm9uVXBkYXRlZFNpemVcIlxyXG5cdH0gKTtcclxuXHR0aGlzLmFkZFBhcmFtZXRlckJ1dHRvbi5jb25uZWN0KHRoaXMsIHsgXCJjbGlja1wiOiBcIm9uUGFyYW1ldGVyQWRkXCIgfSk7XHJcblx0dGhpcy5hZGRQYXJhbWV0ZXJOYW1lSW5wdXQuY29ubmVjdCh0aGlzLCB7XHJcblx0XHRcImNoYW5nZVwiOiBcIm9uQWRkUGFyYW1ldGVyTmFtZUNoYW5nZVwiLFxyXG5cdFx0XCJlbnRlclwiOiBcIm9uQWRkUGFyYW1ldGVyTmFtZUVudGVyXCIsXHJcblx0XHRcImNob29zZVwiOiBcIm9uQWRkUGFyYW1ldGVyTmFtZUVudGVyXCJcclxuXHR9KTtcclxuXHR0aGlzLmFkZFBhcmFtZXRlclZhbHVlSW5wdXQuY29ubmVjdCh0aGlzLCB7XHJcblx0XHRcImNoYW5nZVwiOiBcIm9uQWRkUGFyYW1ldGVyVmFsdWVDaGFuZ2VcIixcclxuXHRcdFwiZW50ZXJcIjogXCJvbkFkZFBhcmFtZXRlclZhbHVlRW50ZXJcIixcclxuXHRcdFwiY2hvb3NlXCI6IFwib25BZGRQYXJhbWV0ZXJWYWx1ZUVudGVyXCJcclxuXHR9KTtcclxuXHR0aGlzLnJlbW92ZUJ1dHRvbi5jb25uZWN0KHRoaXMsIHtcImNsaWNrXCI6IFwib25SZW1vdmVCdXR0b25DbGlja1wifSwgKTtcclxuXHR0aGlzLmNsZWFyQnV0dG9uLmNvbm5lY3QoIHRoaXMsIHtcImNsaWNrXCI6IFwib25DbGVhckJ1dHRvbkNsaWNrXCJ9ICk7XHJcblxyXG5cdC8qIC0tLSBBUFBMWSBQUkVGIC0tICovXHJcblx0aWYgKHRoaXMucHJlZmVyZW5jZXMuYnlwYXNzUmVkaXJlY3RzKSB7XHJcblx0XHR0aGlzLmJ5cGFzc1JlZGlyZWN0KCk7XHJcblx0fVxyXG5cclxufVxyXG5PTy5pbmhlcml0Q2xhc3MoIEJhbm5lcldpZGdldCwgT08udWkuV2lkZ2V0ICk7XHJcblxyXG4vKipcclxuICogQHBhcmFtIHtTdHJpbmd9IHRlbXBsYXRlTmFtZVxyXG4gKiBAcGFyYW0ge09iamVjdH0gW2RhdGFdXHJcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gZGF0YS53aXRob3V0UmF0aW5nc1xyXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGRhdGEuaXNXcmFwcGVyXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWdcclxuICogQHJldHVybnMge1Byb21pc2U8QmFubmVyV2lkZ2V0Pn1cclxuICovXHJcbkJhbm5lcldpZGdldC5uZXdGcm9tVGVtcGxhdGVOYW1lID0gZnVuY3Rpb24odGVtcGxhdGVOYW1lLCBkYXRhLCBjb25maWcpIHtcclxuXHR2YXIgdGVtcGxhdGUgPSBuZXcgVGVtcGxhdGUoKTtcclxuXHR0ZW1wbGF0ZS5uYW1lID0gdGVtcGxhdGVOYW1lO1xyXG5cdGlmIChkYXRhICYmIGRhdGEud2l0aG91dFJhdGluZ3MpIHtcclxuXHRcdHRlbXBsYXRlLndpdGhvdXRSYXRpbmdzID0gdHJ1ZTtcclxuXHR9XHJcblx0cmV0dXJuIGdldFdpdGhSZWRpcmVjdFRvKHRlbXBsYXRlKVxyXG5cdFx0LnRoZW4oZnVuY3Rpb24odGVtcGxhdGUpIHtcclxuXHRcdFx0cmV0dXJuICQud2hlbihcclxuXHRcdFx0XHR0ZW1wbGF0ZS5zZXRDbGFzc2VzQW5kSW1wb3J0YW5jZXMoKSxcclxuXHRcdFx0XHR0ZW1wbGF0ZS5zZXRQYXJhbURhdGFBbmRTdWdnZXN0aW9ucygpXHJcblx0XHRcdCkudGhlbigoKSA9PiB7XHJcblx0XHRcdFx0Ly8gQWRkIG1pc3NpbmcgcmVxdWlyZWQvc3VnZ2VzdGVkIHZhbHVlc1xyXG5cdFx0XHRcdHRlbXBsYXRlLmFkZE1pc3NpbmdQYXJhbXMoKTtcclxuXHRcdFx0XHQvLyBSZXR1cm4gdGhlIG5vdy1tb2RpZmllZCB0ZW1wbGF0ZVxyXG5cdFx0XHRcdHJldHVybiB0ZW1wbGF0ZTtcclxuXHRcdFx0fSk7XHJcblx0XHR9KVxyXG5cdFx0LnRoZW4odGVtcGxhdGUgPT4gbmV3IEJhbm5lcldpZGdldCh0ZW1wbGF0ZSwgY29uZmlnKSk7XHJcbn07XHJcblxyXG5CYW5uZXJXaWRnZXQucHJvdG90eXBlLm9uVXBkYXRlZFNpemUgPSBmdW5jdGlvbigpIHtcclxuXHQvLyBFbWl0IGFuIFwidXBkYXRlZFNpemVcIiBldmVudCBzbyB0aGUgcGFyZW50IHdpbmRvdyBjYW4gdXBkYXRlIHNpemUsIGlmIG5lZWRlZFxyXG5cdHRoaXMuZW1pdChcInVwZGF0ZWRTaXplXCIpO1xyXG59O1xyXG5cclxuQmFubmVyV2lkZ2V0LnByb3RvdHlwZS5zZXRDaGFuZ2VkID0gZnVuY3Rpb24oKSB7XHJcblx0dGhpcy5jaGFuZ2VkID0gdHJ1ZTtcclxuXHR0aGlzLmVtaXQoXCJjaGFuZ2VkXCIpO1xyXG59O1xyXG5cclxuQmFubmVyV2lkZ2V0LnByb3RvdHlwZS5vblBhcmFtZXRlckNoYW5nZSA9IGZ1bmN0aW9uKCkge1xyXG5cdHRoaXMuc2V0Q2hhbmdlZCgpO1xyXG5cdGlmICh0aGlzLm1haW5UZXh0ID09PSBcIldpa2lQcm9qZWN0IEJpb2dyYXBoeVwiIHx8IHRoaXMucmVkaXJlY3RUYXJnZXRNYWluVGV4dCA9PT0gXCJXaWtpUHJvamVjdCBCaW9ncmFwaHlcIikge1xyXG5cdFx0Ly8gRW1pdCBldmVudCBzbyBCYW5uZXJMaXN0V2lkZ2V0IGNhbiB1cGRhdGUgdGhlIGJhbm5lciBzaGVsbCB0ZW1wbGF0ZSAoaWYgcHJlc2VudClcclxuXHRcdHRoaXMuZW1pdChcImJpb2dyYXBoeUJhbm5lckNoYW5nZVwiKTtcdFx0XHJcblx0fVxyXG5cdHRoaXMudXBkYXRlQWRkUGFyYW1ldGVyTmFtZVN1Z2dlc3Rpb25zKCk7XHJcbn07XHJcblxyXG5CYW5uZXJXaWRnZXQucHJvdG90eXBlLm9uQ2xhc3NDaGFuZ2UgPSBmdW5jdGlvbigpIHtcclxuXHR0aGlzLnNldENoYW5nZWQoKTtcclxuXHR0aGlzLmNsYXNzQ2hhbmdlZCA9IHRydWU7XHJcblx0dmFyIGNsYXNzSXRlbSA9IHRoaXMuY2xhc3NEcm9wZG93bi5nZXRNZW51KCkuZmluZFNlbGVjdGVkSXRlbSgpO1xyXG5cdGlmIChjbGFzc0l0ZW0gJiYgY2xhc3NJdGVtLmdldERhdGEoKSA9PSBudWxsICkge1xyXG5cdFx0Ly8gY2xlYXIgc2VsZWN0aW9uXHJcblx0XHR0aGlzLmNsYXNzRHJvcGRvd24uZ2V0TWVudSgpLnNlbGVjdEl0ZW0oKTtcclxuXHR9XHJcbn07XHJcblxyXG5CYW5uZXJXaWRnZXQucHJvdG90eXBlLm9uSW1wb3J0YW5jZUNoYW5nZSA9IGZ1bmN0aW9uKCkge1xyXG5cdHRoaXMuc2V0Q2hhbmdlZCgpO1xyXG5cdHRoaXMuaW1wb3J0YW5jZUNoYW5nZWQgPSB0cnVlO1xyXG5cdHZhciBpbXBvcnRhbmNlSXRlbSA9IHRoaXMuaW1wb3J0YW5jZURyb3Bkb3duLmdldE1lbnUoKS5maW5kU2VsZWN0ZWRJdGVtKCk7XHJcblx0aWYgKGltcG9ydGFuY2VJdGVtICYmIGltcG9ydGFuY2VJdGVtLmdldERhdGEoKSA9PSBudWxsICkge1xyXG5cdFx0Ly8gY2xlYXIgc2VsZWN0aW9uXHJcblx0XHR0aGlzLmltcG9ydGFuY2VEcm9wZG93bi5nZXRNZW51KCkuc2VsZWN0SXRlbSgpO1xyXG5cdH1cclxufTtcclxuXHJcbkJhbm5lcldpZGdldC5wcm90b3R5cGUuc2hvd0FkZFBhcmFtZXRlcklucHV0cyA9IGZ1bmN0aW9uKCkge1xyXG5cdHRoaXMuYWRkUGFyYW1ldGVyTGF5b3V0LnRvZ2dsZSh0cnVlKTtcclxuXHR0aGlzLmFkZFBhcmFtZXRlck5hbWVJbnB1dC5mb2N1cygpO1xyXG5cdHRoaXMub25VcGRhdGVkU2l6ZSgpO1xyXG59O1xyXG5cclxuQmFubmVyV2lkZ2V0LnByb3RvdHlwZS5nZXRBZGRQYXJhbWV0ZXJzSW5mbyA9IGZ1bmN0aW9uKG5hbWVJbnB1dFZhbCwgdmFsdWVJbnB1dFZhbCkge1xyXG5cdHZhciBuYW1lID0gbmFtZUlucHV0VmFsICYmIG5hbWVJbnB1dFZhbC50cmltKCkgfHwgdGhpcy5hZGRQYXJhbWV0ZXJOYW1lSW5wdXQuZ2V0VmFsdWUoKS50cmltKCk7XHJcblx0dmFyIHBhcmFtQWxyZWFkeUluY2x1ZGVkID0gbmFtZSA9PT0gXCJjbGFzc1wiIHx8XHJcblx0XHRuYW1lID09PSBcImltcG9ydGFuY2VcIiB8fFxyXG5cdFx0KG5hbWUgPT09IFwiMVwiICYmIHRoaXMuaXNTaGVsbFRlbXBsYXRlKSB8fFxyXG5cdFx0dGhpcy5wYXJhbWV0ZXJMaXN0LmdldFBhcmFtZXRlckl0ZW1zKCkuc29tZShwYXJhbVdpZGdldCA9PiBwYXJhbVdpZGdldC5uYW1lID09PSBuYW1lKTtcclxuXHR2YXIgdmFsdWUgPSB2YWx1ZUlucHV0VmFsICYmIHZhbHVlSW5wdXRWYWwudHJpbSgpIHx8IHRoaXMuYWRkUGFyYW1ldGVyVmFsdWVJbnB1dC5nZXRWYWx1ZSgpLnRyaW0oKTtcclxuXHR2YXIgYXV0b3ZhbHVlID0gbmFtZSAmJiB0aGlzLnBhcmFtRGF0YVtuYW1lXSAmJiB0aGlzLnBhcmFtRGF0YVtuYW1lXS5hdXRvdmFsdWUgfHwgbnVsbDtcclxuXHRyZXR1cm4ge1xyXG5cdFx0dmFsaWROYW1lOiAhIShuYW1lICYmICFwYXJhbUFscmVhZHlJbmNsdWRlZCksXHJcblx0XHR2YWxpZFZhbHVlOiAhISh2YWx1ZSB8fCBhdXRvdmFsdWUpLFxyXG5cdFx0aXNBdXRvdmFsdWU6ICEhKCF2YWx1ZSAmJiBhdXRvdmFsdWUpLFxyXG5cdFx0aXNBbHJlYWR5SW5jbHVkZWQ6ICEhKG5hbWUgJiYgcGFyYW1BbHJlYWR5SW5jbHVkZWQpLFxyXG5cdFx0bmFtZSxcclxuXHRcdHZhbHVlLFxyXG5cdFx0YXV0b3ZhbHVlXHJcblx0fTtcclxufTtcclxuXHJcbkJhbm5lcldpZGdldC5wcm90b3R5cGUub25BZGRQYXJhbWV0ZXJOYW1lQ2hhbmdlID0gZnVuY3Rpb24oKSB7XHJcblx0bGV0IHsgdmFsaWROYW1lLCB2YWxpZFZhbHVlLCBpc0F1dG92YWx1ZSwgaXNBbHJlYWR5SW5jbHVkZWQsIG5hbWUsIGF1dG92YWx1ZSB9ID0gdGhpcy5nZXRBZGRQYXJhbWV0ZXJzSW5mbygpO1xyXG5cdC8vIFNldCB2YWx1ZSBpbnB1dCBwbGFjZWhvbGRlciBhcyB0aGUgYXV0b3ZhbHVlXHJcblx0dGhpcy5hZGRQYXJhbWV0ZXJWYWx1ZUlucHV0LiRpbnB1dC5hdHRyKCBcInBsYWNlaG9sZGVyXCIsICBhdXRvdmFsdWUgfHwgXCJcIiApO1xyXG5cdC8vIFNldCBzdWdnZXN0aW9ucywgaWYgdGhlIHBhcmFtZXRlciBoYXMgYSBsaXN0IG9mIGFsbG93ZWQgdmFsdWVzXHJcblx0dmFyIGFsbG93ZWRWYWx1ZXMgPSB0aGlzLnBhcmFtRGF0YVtuYW1lXSAmJlxyXG5cdFx0dGhpcy5wYXJhbURhdGFbbmFtZV0uYWxsb3dlZFZhbHVlcyAmJiBcclxuXHRcdHRoaXMucGFyYW1EYXRhW25hbWVdLmFsbG93ZWRWYWx1ZXMubWFwKHZhbCA9PiB7cmV0dXJuIHtkYXRhOiB2YWwsIGxhYmVsOnZhbH07IH0pO1xyXG5cdHRoaXMuYWRkUGFyYW1ldGVyVmFsdWVJbnB1dC5zZXRTdWdnZXN0aW9ucyhhbGxvd2VkVmFsdWVzIHx8IFtdKTtcclxuXHQvLyBTZXQgYnV0dG9uIGRpc2FibGVkIHN0YXRlIGJhc2VkIG9uIHZhbGlkaXR5XHJcblx0dGhpcy5hZGRQYXJhbWV0ZXJCdXR0b24uc2V0RGlzYWJsZWQoIXZhbGlkTmFtZSB8fCAhdmFsaWRWYWx1ZSk7XHJcblx0Ly8gU2hvdyBub3RpY2UgaWYgYXV0b3ZhbHVlIHdpbGwgYmUgdXNlZFxyXG5cdHRoaXMuYWRkUGFyYW1ldGVyTGF5b3V0LnNldE5vdGljZXMoIHZhbGlkTmFtZSAmJiBpc0F1dG92YWx1ZSA/IFtcIlBhcmFtZXRlciB2YWx1ZSB3aWxsIGJlIGF1dG9maWxsZWRcIl0gOiBbXSApO1xyXG5cdC8vIFNob3cgZXJyb3IgaXMgdGhlIGJhbm5lciBhbHJlYWR5IGhhcyB0aGUgcGFyYW1ldGVyIHNldFxyXG5cdHRoaXMuYWRkUGFyYW1ldGVyTGF5b3V0LnNldEVycm9ycyggaXNBbHJlYWR5SW5jbHVkZWQgPyBbXCJQYXJhbWV0ZXIgaXMgYWxyZWFkeSBwcmVzZW50XCJdIDogW10gKTtcclxufTtcclxuXHJcbkJhbm5lcldpZGdldC5wcm90b3R5cGUub25BZGRQYXJhbWV0ZXJOYW1lRW50ZXIgPSBmdW5jdGlvbigpIHtcclxuXHR0aGlzLmFkZFBhcmFtZXRlclZhbHVlSW5wdXQuZm9jdXMoKTtcclxufTtcclxuXHJcbkJhbm5lcldpZGdldC5wcm90b3R5cGUub25BZGRQYXJhbWV0ZXJWYWx1ZUNoYW5nZSA9IGZ1bmN0aW9uKCkge1xyXG5cdGxldCB7IHZhbGlkTmFtZSwgdmFsaWRWYWx1ZSwgaXNBdXRvdmFsdWUgfSA9IHRoaXMuZ2V0QWRkUGFyYW1ldGVyc0luZm8oKTtcclxuXHR0aGlzLmFkZFBhcmFtZXRlckJ1dHRvbi5zZXREaXNhYmxlZCghdmFsaWROYW1lIHx8ICF2YWxpZFZhbHVlKTtcclxuXHR0aGlzLmFkZFBhcmFtZXRlckxheW91dC5zZXROb3RpY2VzKCB2YWxpZE5hbWUgJiYgaXNBdXRvdmFsdWUgPyBbXCJQYXJhbWV0ZXIgdmFsdWUgd2lsbCBiZSBhdXRvZmlsbGVkXCJdIDogW10gKTsgXHJcbn07XHJcblxyXG5CYW5uZXJXaWRnZXQucHJvdG90eXBlLm9uQWRkUGFyYW1ldGVyVmFsdWVFbnRlciA9IGZ1bmN0aW9uKCkge1xyXG5cdC8vIE1ha2Ugc3VyZSBidXR0b24gc3RhdGUgaGFzIGJlZW4gdXBkYXRlZFxyXG5cdHRoaXMub25BZGRQYXJhbWV0ZXJWYWx1ZUNoYW5nZSgpO1xyXG5cdC8vIERvIG5vdGhpbmcgaWYgYnV0dG9uIGlzIGRpc2FibGVkIChpLmUuIG5hbWUgYW5kL29yIHZhbHVlIGFyZSBpbnZhbGlkKVxyXG5cdGlmICggdGhpcy5hZGRQYXJhbWV0ZXJCdXR0b24uaXNEaXNhYmxlZCgpICkge1xyXG5cdFx0cmV0dXJuO1xyXG5cdH1cclxuXHQvLyBBZGQgcGFyYW1ldGVyXHJcblx0dGhpcy5vblBhcmFtZXRlckFkZCgpO1xyXG59O1xyXG5cclxuQmFubmVyV2lkZ2V0LnByb3RvdHlwZS5vblBhcmFtZXRlckFkZCA9IGZ1bmN0aW9uKCkge1xyXG5cdGxldCB7IHZhbGlkTmFtZSwgdmFsaWRWYWx1ZSwgbmFtZSwgdmFsdWUsIGF1dG92YWx1ZSB9ICA9IHRoaXMuZ2V0QWRkUGFyYW1ldGVyc0luZm8oKTtcclxuXHRpZiAoIXZhbGlkTmFtZSB8fCAhdmFsaWRWYWx1ZSkge1xyXG5cdFx0Ly8gRXJyb3Igc2hvdWxkIGFscmVhZHkgYmUgc2hvd24gdmlhIG9uQWRkUGFyYW1ldGVyLi4uQ2hhbmdlIG1ldGhvZHNcclxuXHRcdHJldHVybjtcclxuXHR9XHJcblx0dmFyIG5ld1BhcmFtZXRlciA9IG5ldyBQYXJhbWV0ZXJXaWRnZXQoXHJcblx0XHR7XHJcblx0XHRcdFwibmFtZVwiOiBuYW1lLFxyXG5cdFx0XHRcInZhbHVlXCI6IHZhbHVlIHx8IGF1dG92YWx1ZVxyXG5cdFx0fSxcclxuXHRcdHRoaXMucGFyYW1EYXRhW25hbWVdLFxyXG5cdFx0eyRvdmVybGF5OiB0aGlzLiRvdmVybGF5fVxyXG5cdCk7XHJcblx0dGhpcy5wYXJhbWV0ZXJMaXN0LmFkZEl0ZW1zKFtuZXdQYXJhbWV0ZXJdKTtcclxuXHR0aGlzLmFkZFBhcmFtZXRlck5hbWVJbnB1dC5zZXRWYWx1ZShcIlwiKTtcclxuXHR0aGlzLmFkZFBhcmFtZXRlclZhbHVlSW5wdXQuc2V0VmFsdWUoXCJcIik7XHJcblx0dGhpcy5hZGRQYXJhbWV0ZXJOYW1lSW5wdXQuJGlucHV0LmZvY3VzKCk7XHJcbn07XHJcblxyXG5CYW5uZXJXaWRnZXQucHJvdG90eXBlLnVwZGF0ZUFkZFBhcmFtZXRlck5hbWVTdWdnZXN0aW9ucyA9IGZ1bmN0aW9uKCkge1xyXG5cdGxldCBwYXJhbXNJblVzZSA9IHt9O1xyXG5cdHRoaXMucGFyYW1ldGVyTGlzdC5nZXRQYXJhbWV0ZXJJdGVtcygpLmZvckVhY2goXHJcblx0XHRwYXJhbVdpZGdldCA9PiBwYXJhbXNJblVzZVtwYXJhbVdpZGdldC5uYW1lXSA9IHRydWVcclxuXHQpO1xyXG5cdHRoaXMuYWRkUGFyYW1ldGVyTmFtZUlucHV0LnNldFN1Z2dlc3Rpb25zKFxyXG5cdFx0dGhpcy5wYXJhbWV0ZXJTdWdnZXN0aW9ucy5maWx0ZXIoXHJcblx0XHRcdHN1Z2dlc3Rpb24gPT4gIXBhcmFtc0luVXNlW3N1Z2dlc3Rpb24uZGF0YV1cclxuXHRcdClcclxuXHQpO1xyXG59O1xyXG5cclxuQmFubmVyV2lkZ2V0LnByb3RvdHlwZS5vblJlbW92ZUJ1dHRvbkNsaWNrID0gZnVuY3Rpb24oKSB7XHJcblx0dGhpcy5lbWl0KFwicmVtb3ZlXCIpO1xyXG59O1xyXG5cclxuQmFubmVyV2lkZ2V0LnByb3RvdHlwZS5vbkNsZWFyQnV0dG9uQ2xpY2sgPSBmdW5jdGlvbigpIHtcclxuXHR0aGlzLnBhcmFtZXRlckxpc3QuY2xlYXJJdGVtcyhcclxuXHRcdHRoaXMucGFyYW1ldGVyTGlzdC5nZXRQYXJhbWV0ZXJJdGVtcygpXHJcblx0KTtcclxuXHRpZiAoIHRoaXMuaGFzQ2xhc3NSYXRpbmdzICkge1xyXG5cdFx0dGhpcy5jbGFzc0Ryb3Bkb3duLmdldE1lbnUoKS5zZWxlY3RJdGVtKCk7XHJcblx0fVxyXG5cdGlmICggdGhpcy5oYXNJbXBvcnRhbmNlUmF0aW5ncyApIHtcclxuXHRcdHRoaXMuaW1wb3J0YW5jZURyb3Bkb3duLmdldE1lbnUoKS5zZWxlY3RJdGVtKCk7XHJcblx0fVxyXG59O1xyXG5cclxuQmFubmVyV2lkZ2V0LnByb3RvdHlwZS5ieXBhc3NSZWRpcmVjdCA9IGZ1bmN0aW9uKCkge1xyXG5cdGlmICghdGhpcy5yZWRpcmVjdFRhcmdldE1haW5UZXh0KSB7XHJcblx0XHRyZXR1cm47XHJcblx0fVxyXG5cdC8vIFN0b3JlIHRoZSBieXBhc3NlZCBuYW1lXHJcblx0dGhpcy5ieXBhc3NlZE5hbWUgPSB0aGlzLm5hbWU7XHJcblx0Ly8gVXBkYXRlIHRpdGxlIGxhYmVsXHJcblx0dGhpcy5tYWluTGFiZWxQb3B1cEJ1dHRvbi5zZXRMYWJlbChge3ske3RoaXMucmVkaXJlY3RUYXJnZXRNYWluVGV4dH19fSR7dGhpcy5pbmFjdGl2ZVByb2plY3QgPyBcIiAoaW5hY3RpdmUpXCIgOiBcIlwifWApO1xyXG5cdC8vIFVwZGF0ZSBwcm9wZXJ0aWVzXHJcblx0dGhpcy5uYW1lID0gdGhpcy5yZWRpcmVjdFRhcmdldE1haW5UZXh0O1xyXG5cdHRoaXMubWFpblRleHQgPSB0aGlzLnJlZGlyZWN0VGFyZ2V0TWFpblRleHQ7XHJcblx0dGhpcy5yZWRpcmVjdFRhcmdldE1haW5UZXh0ID0gbnVsbDtcclxuXHR0aGlzLnNldENoYW5nZWQoKTtcclxufTtcclxuXHJcbkJhbm5lcldpZGdldC5wcm90b3R5cGUubWFrZVdpa2l0ZXh0ID0gZnVuY3Rpb24oKSB7XHJcblx0aWYgKCF0aGlzLmNoYW5nZWQgJiYgdGhpcy53aWtpdGV4dCkge1xyXG5cdFx0cmV0dXJuIHRoaXMud2lraXRleHQ7XHJcblx0fVxyXG5cdHZhciBwaXBlID0gdGhpcy5waXBlU3R5bGU7XHJcblx0dmFyIGVxdWFscyA9IHRoaXMuZXF1YWxzU3R5bGU7XHJcblx0dmFyIGNsYXNzSXRlbSA9ICh0aGlzLmhhc0NsYXNzUmF0aW5ncyB8fCB0aGlzLmlzU2hlbGxUZW1wbGF0ZSkgJiYgdGhpcy5jbGFzc0Ryb3Bkb3duLmdldE1lbnUoKS5maW5kU2VsZWN0ZWRJdGVtKCk7XHJcblx0dmFyIGNsYXNzVmFsID0gY2xhc3NJdGVtICYmIGNsYXNzSXRlbS5nZXREYXRhKCk7XHJcblx0dmFyIGltcG9ydGFuY2VJdGVtID0gdGhpcy5oYXNJbXBvcnRhbmNlUmF0aW5ncyAmJiB0aGlzLmltcG9ydGFuY2VEcm9wZG93bi5nZXRNZW51KCkuZmluZFNlbGVjdGVkSXRlbSgpO1xyXG5cdHZhciBpbXBvcnRhbmNlVmFsID0gaW1wb3J0YW5jZUl0ZW0gJiYgaW1wb3J0YW5jZUl0ZW0uZ2V0RGF0YSgpO1xyXG5cclxuXHRyZXR1cm4gKFwie3tcIiArXHJcblx0XHR0aGlzLm5hbWUgK1xyXG5cdFx0KCAodGhpcy5oYXNDbGFzc1JhdGluZ3MgfHwgdGhpcy5pc1NoZWxsVGVtcGxhdGUpICYmIGNsYXNzVmFsIT1udWxsID8gYCR7cGlwZX1jbGFzcyR7ZXF1YWxzfSR7Y2xhc3NWYWx8fFwiXCJ9YCA6IFwiXCIgKSArXHJcblx0XHQoIHRoaXMuaGFzSW1wb3J0YW5jZVJhdGluZ3MgJiYgaW1wb3J0YW5jZVZhbCE9bnVsbCA/IGAke3BpcGV9aW1wb3J0YW5jZSR7ZXF1YWxzfSR7aW1wb3J0YW5jZVZhbHx8XCJcIn1gIDogXCJcIiApICtcclxuXHRcdHRoaXMucGFyYW1ldGVyTGlzdC5nZXRQYXJhbWV0ZXJJdGVtcygpXHJcblx0XHRcdC5tYXAocGFyYW1ldGVyID0+IHBhcmFtZXRlci5tYWtlV2lraXRleHQocGlwZSwgZXF1YWxzKSlcclxuXHRcdFx0LmpvaW4oXCJcIikgK1xyXG5cdFx0dGhpcy5lbmRCcmFjZXNTdHlsZSlcclxuXHRcdC5yZXBsYWNlKC9cXG4rfX0kLywgXCJcXG59fVwiKTsgLy8gYXZvaWQgZW1wdHkgbGluZSBhdCBlbmQgbGlrZSBbW1NwZWNpYWw6RGlmZi85MjU5ODIxNDJdXVxyXG59O1xyXG5cclxuQmFubmVyV2lkZ2V0LnByb3RvdHlwZS5zZXRQcmVmZXJlbmNlcyA9IGZ1bmN0aW9uKHByZWZzKSB7XHJcblx0dGhpcy5wcmVmZXJlbmNlcyA9IHByZWZzO1xyXG5cdGlmICh0aGlzLnByZWZlcmVuY2VzLmJ5cGFzc1JlZGlyZWN0cykge1xyXG5cdFx0dGhpcy5ieXBhc3NSZWRpcmVjdCgpO1xyXG5cdH1cclxuXHR0aGlzLnBhcmFtZXRlckxpc3Quc2V0UHJlZmVyZW5jZXMocHJlZnMpO1xyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgQmFubmVyV2lkZ2V0O1xyXG4vLyA8L25vd2lraT4iLCIvLyA8bm93aWtpPlxyXG5cclxuZnVuY3Rpb24gRHJvcGRvd25QYXJhbWV0ZXJXaWRnZXQoIGNvbmZpZyApIHtcclxuXHQvLyBDb25maWd1cmF0aW9uIGluaXRpYWxpemF0aW9uXHJcblx0Y29uZmlnID0gJC5leHRlbmQoe1xyXG5cdFx0JGVsZW1lbnQ6ICQoXCI8c3BhbiBzdHlsZT0nZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6MjQlJz5cIilcclxuXHR9LCBjb25maWcgfHwge30gKTtcclxuXHJcblx0Ly8gQ2FsbCBwYXJlbnQgY29uc3RydWN0b3JcclxuXHREcm9wZG93blBhcmFtZXRlcldpZGdldC5zdXBlci5jYWxsKCB0aGlzLCBjb25maWcgKTtcclxuXHJcblx0dGhpcy4kb3ZlcmxheSA9IGNvbmZpZy4kb3ZlcmxheTtcclxuXHR0aGlzLiRlbGVtZW50LmFkZENsYXNzKFwicmF0ZXItZHJvcGRvd25QYXJhbWV0ZXJXaWRnZXRcIik7XHJcbiAgICBcclxuXHQvLyBBdXRvZmlsbGVkIGljb25cclxuXHR0aGlzLmF1dG9maWxsZWQgPSAhIWNvbmZpZy5hdXRvZmlsbGVkO1xyXG5cdHRoaXMuYXV0b2ZpbGxlZEljb24gPSBuZXcgT08udWkuSWNvbldpZGdldCgge1xyXG5cdFx0aWNvbjogXCJyb2JvdFwiLFxyXG5cdFx0dGl0bGU6IFwiQXV0b2ZpbGxlZCBieSBSYXRlclwiLFxyXG5cdFx0ZmxhZ3M6IFwicHJvZ3Jlc3NpdmVcIixcclxuXHRcdCRlbGVtZW50OiAkKFwiPHNwYW4gc3R5bGU9J21hcmdpbjogMCAtNXB4IDAgNXB4O21pbi13aWR0aDogMTZweDt3aWR0aDogMTZweDtsZWZ0OnVuc2V0Oyc+XCIpXHJcblx0fSApLnRvZ2dsZSh0aGlzLmF1dG9maWxsZWQpO1xyXG5cdHRoaXMuJGVsZW1lbnQuZmluZChcIi5vby11aS1pbmRpY2F0b3JFbGVtZW50LWluZGljYXRvclwiKS5iZWZvcmUoXHJcblx0XHR0aGlzLmF1dG9maWxsZWRJY29uLiRlbGVtZW50XHJcblx0KTtcclxuXHJcblx0Ly8gRXZlbnRzXHJcblx0dGhpcy5tZW51LmNvbm5lY3QodGhpcywge1xyXG5cdFx0XCJjaG9vc2VcIjogXCJvbkRyb3Bkb3duTWVudUNob29zZVwiLFxyXG5cdFx0XCJzZWxlY3RcIjogXCJvbkRyb3Bkb3duTWVudVNlbGVjdFwiXHJcblx0fSk7XHJcbn1cclxuT08uaW5oZXJpdENsYXNzKCBEcm9wZG93blBhcmFtZXRlcldpZGdldCwgT08udWkuRHJvcGRvd25XaWRnZXQgKTtcclxuXHJcbkRyb3Bkb3duUGFyYW1ldGVyV2lkZ2V0LnByb3RvdHlwZS5zZXRBdXRvZmlsbGVkID0gZnVuY3Rpb24oc2V0QXV0b2ZpbGwpIHtcclxuXHR0aGlzLmF1dG9maWxsZWRJY29uLnRvZ2dsZSghIXNldEF1dG9maWxsKTtcclxuXHR0aGlzLiRlbGVtZW50LmZpbmQoXCIub28tdWktZHJvcGRvd25XaWRnZXQtaGFuZGxlXCIpLmNzcyh7XHJcblx0XHRcImJvcmRlclwiOiBzZXRBdXRvZmlsbCA/IFwiMXB4IGRhc2hlZCAjMzZjXCIgOiBcIlwiXHJcblx0fSk7XHJcblx0dGhpcy5hdXRvZmlsbGVkID0gISFzZXRBdXRvZmlsbDtcclxufTtcclxuXHJcbkRyb3Bkb3duUGFyYW1ldGVyV2lkZ2V0LnByb3RvdHlwZS5vbkRyb3Bkb3duTWVudUNob29zZSA9IGZ1bmN0aW9uKCkge1xyXG5cdHRoaXMuc2V0QXV0b2ZpbGxlZChmYWxzZSk7XHJcblx0dGhpcy5lbWl0KFwiY2hhbmdlXCIpO1xyXG59O1xyXG5cclxuRHJvcGRvd25QYXJhbWV0ZXJXaWRnZXQucHJvdG90eXBlLm9uRHJvcGRvd25NZW51U2VsZWN0ID0gZnVuY3Rpb24oKSB7XHJcblx0dGhpcy5lbWl0KFwiY2hhbmdlXCIpO1xyXG59O1xyXG5cclxuRHJvcGRvd25QYXJhbWV0ZXJXaWRnZXQucHJvdG90eXBlLmdldFZhbHVlID0gZnVuY3Rpb24oKSB7XHJcblx0Y29uc3Qgc2VsZWN0ZWRJdGVtID0gdGhpcy5tZW51LmZpbmRTZWxlY3RlZEl0ZW0oKTtcclxuXHRyZXR1cm4gc2VsZWN0ZWRJdGVtICYmIHNlbGVjdGVkSXRlbS5nZXREYXRhKCk7XHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBEcm9wZG93blBhcmFtZXRlcldpZGdldDtcclxuLy8gPC9ub3dpa2k+IiwiLy8gPG5vd2lraT5cclxuXHJcbi8qKlxyXG4gKiBBIEhvcml6b250YWxMYXlvdXQgdGhhdCBpcyBhbHNvIGEgd2lkZ2V0LCBhbmQgY2FuIHRodXMgYmUgcGxhY2VkIHdpdGhpblxyXG4gKiBmaWVsZCBsYXlvdXRzLlxyXG4gKiBcclxuICogQGNsYXNzXHJcbiAqIEBwYXJhbSB7Kn0gY29uZmlnIGNvbmZpZ3VyYXRpb24gZm9yIE9PLnVpLkhvcml6b250YWxMYXlvdXRcclxuICovXHJcbmZ1bmN0aW9uIEhvcml6b250YWxMYXlvdXRXaWRnZXQoIGNvbmZpZyApIHtcclxuXHQvLyBDb25maWd1cmF0aW9uIGluaXRpYWxpemF0aW9uXHJcblx0Y29uZmlnID0gY29uZmlnIHx8IHt9O1xyXG5cdC8vIENhbGwgcGFyZW50IGNvbnN0cnVjdG9yXHJcblx0SG9yaXpvbnRhbExheW91dFdpZGdldC5zdXBlci5jYWxsKCB0aGlzLCB7fSApO1xyXG4gICAgXHJcblx0dGhpcy5sYXlvdXQgPSBuZXcgT08udWkuSG9yaXpvbnRhbExheW91dCgge1xyXG5cdFx0Li4uY29uZmlnLFxyXG5cdFx0JGVsZW1lbnQ6IHRoaXMuJGVsZW1lbnRcclxuXHR9KTtcclxuXHJcbn1cclxuT08uaW5oZXJpdENsYXNzKCBIb3Jpem9udGFsTGF5b3V0V2lkZ2V0LCBPTy51aS5XaWRnZXQgKTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IEhvcml6b250YWxMYXlvdXRXaWRnZXQ7XHJcbi8vIDwvbm93aWtpPiIsIi8vIDxub3dpa2k+XHJcblxyXG4vKipcclxuICogQGNmZyB7T08udWkuRWxlbWVudFtdfSBpdGVtcyBJdGVtcyB0byBiZSBhZGRlZFxyXG4gKiBAY2ZnIHtOdW1iZXJ9IGRpc3BsYXlMaW1pdCBUaGUgbW9zdCB0byBzaG93IGF0IG9uY2UuIElmIHRoZSBudW1iZXIgb2YgaXRlbXNcclxuICogIGlzIG1vcmUgdGhhbiB0aGlzLCB0aGVuIG9ubHkgdGhlIGZpcnN0IChkaXNwbGF5TGltaXQgLSAxKSBpdGVtcyBhcmUgc2hvd24uXHJcbiAqL1xyXG52YXIgUGFyYW1ldGVyTGlzdFdpZGdldCA9IGZ1bmN0aW9uIFBhcmFtZXRlckxpc3RXaWRnZXQoIGNvbmZpZyApIHtcclxuXHRjb25maWcgPSBjb25maWcgfHwge307XHJcblxyXG5cdC8vIENhbGwgcGFyZW50IGNvbnN0cnVjdG9yXHJcblx0UGFyYW1ldGVyTGlzdFdpZGdldC5wYXJlbnQuY2FsbCggdGhpcywgY29uZmlnICk7XHJcblx0T08udWkubWl4aW4uR3JvdXBFbGVtZW50LmNhbGwoIHRoaXMsIHtcclxuXHRcdCRncm91cDogdGhpcy4kZWxlbWVudFxyXG5cdH0gKTtcclxuXHR0aGlzLmFkZEl0ZW1zKCBjb25maWcuaXRlbXMgKTtcclxuXHJcblx0dGhpcy4kZWxlbWVudC5hZGRDbGFzcyhcInJhdGVyLXBhcmFtZXRlckxpc3RXaWRnZXRcIik7XHJcbiAgICBcclxuXHR0aGlzLnByZWZlcmVuY2VzID0gY29uZmlnLnByZWZlcmVuY2VzO1xyXG4gICBcclxuXHQvLyBIaWRlIHNvbWUgcGFyYW1ldGVycyAoaW5pdGlhbGx5KSwgaWYgbW9yZSB0aGFuIHNldCBkaXNwbGF5IGxpbWl0IC0tIHdoaWNoIGlzIHRoZSBcclxuXHQvLyBvbmUgbW9yZSB0aGFuIGNvbGxhcHNlUGFyYW1zTG93ZXJMaW1pdCwgdG8gcHJldmVudCBvbmx5IG9uZSBwYXJhbSBiZWluZyBoaWRkZW5cclxuXHQvLyAobW9zdGx5OiBtYXkgb2NjYXNpb25hbGx5IG9jY3VyIGlmIHBhcmFtcyB3ZXJlIGF1dG8tZmlsbGVkKS5cclxuXHRsZXQgZGlzcGxheUxpbWl0ID0gdGhpcy5wcmVmZXJlbmNlcy5jb2xsYXBzZVBhcmFtc0xvd2VyTGltaXQgKyAxO1xyXG5cdGlmIChkaXNwbGF5TGltaXQgJiYgdGhpcy5pdGVtcy5sZW5ndGggPiBkaXNwbGF5TGltaXQgKSB7XHJcblx0XHR2YXIgaGlkZUZyb21OdW1iZXIgPSBkaXNwbGF5TGltaXQgLSAxOyAvLyBPbmUtaW5kZXhlZFxyXG5cdFx0dmFyIGhpZGVGcm9tSW5kZXggPSBoaWRlRnJvbU51bWJlciAtIDE7IC8vIFplcm8taW5kZXhlZFxyXG5cdFx0dmFyIGhpZGRlbkNvdW50ID0gMDtcclxuXHRcdGZvciAobGV0IGkgPSBoaWRlRnJvbUluZGV4OyBpIDwgdGhpcy5pdGVtcy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRpZiAoIXRoaXMuaXRlbXNbaV0uYXV0b2ZpbGxlZCkgeyAvLyBEb24ndCBoaWRlIGF1dG8tZmlsbGVkIHBhcmFtc1xyXG5cdFx0XHRcdHRoaXMuaXRlbXNbaV0udG9nZ2xlKGZhbHNlKTtcclxuXHRcdFx0XHRoaWRkZW5Db3VudCsrO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRpZiAoaGlkZGVuQ291bnQ+MCkge1xyXG5cdFx0XHQvLyBBZGQgYnV0dG9uIHRvIHNob3cgdGhlIGhpZGRlbiBwYXJhbXNcclxuXHRcdFx0dGhpcy5zaG93TW9yZVBhcmFtZXRlcnNCdXR0b24gPSBuZXcgT08udWkuQnV0dG9uV2lkZ2V0KHtcclxuXHRcdFx0XHRsYWJlbDogXCJTaG93IFwiICsgaGlkZGVuQ291bnQgKyBcIiBtb3JlIFwiICsgKGhpZGRlbkNvdW50PT09MSA/IFwicGFyYW1ldGVyXCIgOiBcInBhcmFtZXRlcnNcIiksXHJcblx0XHRcdFx0ZnJhbWVkOiBmYWxzZSxcclxuXHRcdFx0XHQkZWxlbWVudDogJChcIjxzcGFuIHN0eWxlPSdtYXJnaW4tYm90dG9tOjAnPlwiKVxyXG5cdFx0XHR9KTtcclxuXHRcdFx0dGhpcy5hZGRJdGVtcyhbdGhpcy5zaG93TW9yZVBhcmFtZXRlcnNCdXR0b25dKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8vIEFkZCB0aGUgYnV0dG9uIHRoYXQgYWxsb3dzIHVzZXIgdG8gYWRkIG1vcmUgcGFyYW1ldGVyc1xyXG5cdHRoaXMuYWRkUGFyYW1ldGVyc0J1dHRvbiA9IG5ldyBPTy51aS5CdXR0b25XaWRnZXQoe1xyXG5cdFx0bGFiZWw6IFwiQWRkIHBhcmFtZXRlclwiLFxyXG5cdFx0aWNvbjogXCJhZGRcIixcclxuXHRcdGZyYW1lZDogZmFsc2UsXHJcblx0XHQkZWxlbWVudDogJChcIjxzcGFuIHN0eWxlPSdtYXJnaW4tYm90dG9tOjAnPlwiKVxyXG5cdH0pO1xyXG5cdHRoaXMuYWRkSXRlbXMoW3RoaXMuYWRkUGFyYW1ldGVyc0J1dHRvbl0pO1xyXG5cclxuXHQvKiAtLS0gRXZlbnRzIC0tLSAqL1xyXG5cclxuXHQvLyBIYW5kbGUgZGVsZXRlIGV2ZW50cyBmcm9tIFBhcmFtZXRlcldpZGdldHNcclxuXHR0aGlzLmFnZ3JlZ2F0ZSggeyBkZWxldGU6IFwicGFyYW1ldGVyRGVsZXRlXCJcdH0gKTtcclxuXHR0aGlzLmNvbm5lY3QoIHRoaXMsIHsgcGFyYW1ldGVyRGVsZXRlOiBcIm9uUGFyYW1ldGVyRGVsZXRlXCIgfSApO1xyXG4gICAgXHJcblx0Ly8gSGFuZGxlIGNoYW5nZSBldmVudHMgZnJvbSBQYXJhbWV0ZXJXaWRnZXRzXHJcblx0dGhpcy5hZ2dyZWdhdGUoIHsgY2hhbmdlOiBcInBhcmFtZXRlckNoYW5nZVwiXHR9ICk7XHJcblx0dGhpcy5jb25uZWN0KCB0aGlzLCB7IHBhcmFtZXRlckNoYW5nZTogXCJvblBhcmFtZXRlckNoYW5nZVwiIH0gKTtcclxuXHJcblx0Ly8gSGFuZGxlIHVwZGF0ZWRTaXplIGV2ZW50cyBmcm9tIFBhcmFtZXRlcldpZGdldHNcclxuXHR0aGlzLmFnZ3JlZ2F0ZSgge1widXBkYXRlZFNpemVcIjogXCJwYXJhbWV0ZXJVcGRhdGVkU2l6ZVwifSApO1xyXG5cdHRoaXMuY29ubmVjdCggdGhpcywge1wicGFyYW1ldGVyVXBkYXRlZFNpemVcIjogXCJvblVwZGF0ZWRTaXplXCJ9ICk7XHJcbiAgICBcclxuXHQvLyBIYW5kbGUgYnV0dG9uIGNsaWNrc1xyXG5cdGlmICh0aGlzLnNob3dNb3JlUGFyYW1ldGVyc0J1dHRvbiApIHtcclxuXHRcdHRoaXMuc2hvd01vcmVQYXJhbWV0ZXJzQnV0dG9uLmNvbm5lY3QoIHRoaXMsIHsgXCJjbGlja1wiOiBcIm9uU2hvd01vcmVQYXJhbWV0ZXJzQnV0dG9uQ2xpY2tcIiB9ICk7XHJcblx0fVxyXG5cdHRoaXMuYWRkUGFyYW1ldGVyc0J1dHRvbi5jb25uZWN0KCB0aGlzLCB7IFwiY2xpY2tcIjogXCJvbkFkZFBhcmFtZXRlcnNCdXR0b25DbGlja1wiIH0gKTtcclxufTtcclxuXHJcbk9PLmluaGVyaXRDbGFzcyggUGFyYW1ldGVyTGlzdFdpZGdldCwgT08udWkuV2lkZ2V0ICk7XHJcbk9PLm1peGluQ2xhc3MoIFBhcmFtZXRlckxpc3RXaWRnZXQsIE9PLnVpLm1peGluLkdyb3VwRWxlbWVudCApO1xyXG4vKlxyXG5tZXRob2RzIGZyb20gbWl4aW46XHJcbiAtIGFkZEl0ZW1zKCBpdGVtcywgW2luZGV4XSApIDogT08udWkuRWxlbWVudCAgKENIQUlOQUJMRSlcclxuIC0gY2xlYXJJdGVtcyggKSA6IE9PLnVpLkVsZW1lbnQgIChDSEFJTkFCTEUpXHJcbiAtIGZpbmRJdGVtRnJvbURhdGEoIGRhdGEgKSA6IE9PLnVpLkVsZW1lbnR8bnVsbFxyXG4gLSBmaW5kSXRlbXNGcm9tRGF0YSggZGF0YSApIDogT08udWkuRWxlbWVudFtdXHJcbiAtIHJlbW92ZUl0ZW1zKCBpdGVtcyApIDogT08udWkuRWxlbWVudCAgKENIQUlOQUJMRSlcclxuKi9cclxuXHJcblBhcmFtZXRlckxpc3RXaWRnZXQucHJvdG90eXBlLm9uVXBkYXRlZFNpemUgPSBmdW5jdGlvbigpIHtcclxuXHQvLyBFbWl0IGFuIFwidXBkYXRlZFNpemVcIiBldmVudCBzbyB0aGUgcGFyZW50IHdpbmRvdyBjYW4gdXBkYXRlIHNpemUsIGlmIG5lZWRlZFxyXG5cdHRoaXMuZW1pdChcInVwZGF0ZWRTaXplXCIpO1xyXG59O1xyXG5cclxuUGFyYW1ldGVyTGlzdFdpZGdldC5wcm90b3R5cGUuYWRkSXRlbXMgPSBmdW5jdGlvbiAoIGl0ZW1zLCBpbmRleCApIHtcclxuXHRpZiAoIGl0ZW1zLmxlbmd0aCA9PT0gMCApIHtcclxuXHRcdHJldHVybiB0aGlzO1xyXG5cdH1cclxuXHJcblx0Ly8gQ2FsbCBtaXhpbiBtZXRob2QgdG8gZG8gdGhlIGFkZGluZ1xyXG5cdE9PLnVpLm1peGluLkdyb3VwRWxlbWVudC5wcm90b3R5cGUuYWRkSXRlbXMuY2FsbCggdGhpcywgaXRlbXMsIGluZGV4ICk7XHJcblxyXG5cdC8vIGVtaXQgdXBkYXRlZFNpemUgZXZlbnQgXHJcblx0dGhpcy5vblVwZGF0ZWRTaXplKCk7XHJcblxyXG5cdHJldHVybiB0aGlzO1xyXG59O1x0XHJcblxyXG5QYXJhbWV0ZXJMaXN0V2lkZ2V0LnByb3RvdHlwZS5vblBhcmFtZXRlckRlbGV0ZSA9IGZ1bmN0aW9uKHBhcmFtZXRlcikge1xyXG5cdHRoaXMucmVtb3ZlSXRlbXMoW3BhcmFtZXRlcl0pO1xyXG5cdHRoaXMuZW1pdChcImNoYW5nZVwiKTtcclxufTtcclxuXHJcblBhcmFtZXRlckxpc3RXaWRnZXQucHJvdG90eXBlLm9uUGFyYW1ldGVyQ2hhbmdlID0gZnVuY3Rpb24oKSB7XHJcblx0dGhpcy5lbWl0KFwiY2hhbmdlXCIpO1xyXG59O1xyXG5cclxuUGFyYW1ldGVyTGlzdFdpZGdldC5wcm90b3R5cGUuZ2V0UGFyYW1ldGVySXRlbXMgPSBmdW5jdGlvbigpIHtcclxuXHRyZXR1cm4gdGhpcy5pdGVtcy5maWx0ZXIoaXRlbSA9PiBpdGVtLmNvbnN0cnVjdG9yLm5hbWUgPT09IFwiUGFyYW1ldGVyV2lkZ2V0XCIpO1xyXG59O1xyXG5cclxuUGFyYW1ldGVyTGlzdFdpZGdldC5wcm90b3R5cGUub25TaG93TW9yZVBhcmFtZXRlcnNCdXR0b25DbGljayA9IGZ1bmN0aW9uKCkge1xyXG5cdHRoaXMucmVtb3ZlSXRlbXMoW3RoaXMuc2hvd01vcmVQYXJhbWV0ZXJzQnV0dG9uXSk7XHJcblx0dGhpcy5pdGVtcy5mb3JFYWNoKHBhcmFtZXRlcldpZGdldCA9PiBwYXJhbWV0ZXJXaWRnZXQudG9nZ2xlKHRydWUpKTtcclxuXHR0aGlzLm9uVXBkYXRlZFNpemUoKTtcclxufTtcclxuXHJcblBhcmFtZXRlckxpc3RXaWRnZXQucHJvdG90eXBlLm9uQWRkUGFyYW1ldGVyc0J1dHRvbkNsaWNrID0gZnVuY3Rpb24oKSB7XHJcblx0dGhpcy5yZW1vdmVJdGVtcyhbdGhpcy5hZGRQYXJhbWV0ZXJzQnV0dG9uXSk7XHJcblx0dGhpcy5lbWl0KFwiYWRkUGFyYW1ldGVyc0J1dHRvbkNsaWNrXCIpO1xyXG59O1xyXG5cclxuUGFyYW1ldGVyTGlzdFdpZGdldC5wcm90b3R5cGUubWFrZVdpa2l0ZXh0ID0gZnVuY3Rpb24ocGlwZVN0eWxlLCBlcXVhbHNTdHlsZSkge1xyXG5cdHJldHVybiB0aGlzLmdldFBhcmFtZXRlckl0ZW1zKClcclxuXHRcdC5tYXAocGFyYW1ldGVyID0+IHBhcmFtZXRlci5tYWtlV2lraXRleHQocGlwZVN0eWxlLCBlcXVhbHNTdHlsZSkpXHJcblx0XHQuam9pbihcIlwiKTtcclxufTtcclxuXHJcblBhcmFtZXRlckxpc3RXaWRnZXQucHJvdG90eXBlLnNldFByZWZlcmVuY2VzID0gZnVuY3Rpb24ocHJlZnMpIHtcclxuXHR0aGlzLnByZWZlcmVuY2VzID0gcHJlZnM7XHJcblx0dmFyIHBhcmFtcyA9IHRoaXMuZ2V0UGFyYW1ldGVySXRlbXMoKTtcclxuXHQvLyBVbmhpZGUgc29tZSBwYXJhbWV0ZXJzIG9mIHRoZSBjb2xsYXBzZVBhcmFtc0xvd2VyTGltaXQgaGFzIGluY3JlYXNlZC5cclxuXHQvLyAoTm90IGhpZGluZyBhbnkgaWYgaXQgZGVjcmVhc2VkLCBzaW5jZSBpdCdzIGEgKmxvd2VyKiBsaW1pdCBvZiB3aGF0IG5lZWRzIHRvIGJlIHNob3duLilcclxuXHRpZiAoIHBhcmFtcy5sZW5ndGggPD0gdGhpcy5wcmVmZXJlbmNlcy5jb2xsYXBzZVBhcmFtc0xvd2VyTGltaXQgKSB7XHJcblx0XHRyZXR1cm47XHJcblx0fVxyXG5cdHZhciBoaWRkZW5QYXJhbXMgPSBwYXJhbXMuZmlsdGVyKHBhcmFtID0+ICFwYXJhbS5pc1Zpc2libGUoKSk7XHJcblx0dmFyIHZpc2libGVQYXJhbXNDb3VudCA9IHBhcmFtcy5sZW5ndGggLSBoaWRkZW5QYXJhbXMubGVuZ3RoO1xyXG5cdGlmIChcclxuXHRcdGhpZGRlblBhcmFtcyA9PT0gMCB8fFxyXG4gICAgICAgIHZpc2libGVQYXJhbXNDb3VudCA+PSB0aGlzLnByZWZlcmVuY2VzLmNvbGxhcHNlUGFyYW1zTG93ZXJMaW1pdFxyXG5cdCkge1xyXG5cdFx0cmV0dXJuO1xyXG5cdH1cclxuXHR2YXIgbnVtVG9VbmhpZGUgPSBNYXRoLm1pbihcclxuXHRcdHRoaXMucHJlZmVyZW5jZXMuY29sbGFwc2VQYXJhbXNMb3dlckxpbWl0IC0gdmlzaWJsZVBhcmFtc0NvdW50LFxyXG5cdFx0aGlkZGVuUGFyYW1zLmxlbmd0aFxyXG5cdCk7XHJcblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBudW1Ub1VuaGlkZTsgaSsrKSB7XHJcblx0XHRoaWRkZW5QYXJhbXNbaV0udG9nZ2xlKHRydWUpO1xyXG5cdH1cclxuXHR2YXIgc3RpbGxIaWRkZW5Db3VudCA9IGhpZGRlblBhcmFtcy5sZW5ndGggLSBudW1Ub1VuaGlkZTtcclxuXHRpZiAoc3RpbGxIaWRkZW5Db3VudCA9PT0gMCkge1xyXG5cdFx0dGhpcy5yZW1vdmVJdGVtcyhbdGhpcy5zaG93TW9yZVBhcmFtZXRlcnNCdXR0b25dKTtcclxuXHR9IGVsc2Uge1xyXG5cdFx0dGhpcy5zaG93TW9yZVBhcmFtZXRlcnNCdXR0b24uc2V0TGFiZWwoXHJcblx0XHRcdFwiU2hvdyBcIiArIHN0aWxsSGlkZGVuQ291bnQgKyBcIiBtb3JlIFwiICsgKHN0aWxsSGlkZGVuQ291bnQ9PT0xID8gXCJwYXJhbXRlclwiIDogXCJwYXJhbXRlcnNcIilcclxuXHRcdCk7XHJcblx0fVxyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgUGFyYW1ldGVyTGlzdFdpZGdldDtcclxuLy8gPC9ub3dpa2k+IiwiaW1wb3J0IHsgbm9ybWFsaXNlWWVzTm8sIGZpbHRlckFuZE1hcCB9IGZyb20gXCIuLi8uLi91dGlsXCI7XHJcbmltcG9ydCBIb3Jpem9udGFsTGF5b3V0V2lkZ2V0IGZyb20gXCIuL0hvcml6b250YWxMYXlvdXRXaWRnZXRcIjtcclxuLy8gPG5vd2lraT5cclxuXHJcbmZ1bmN0aW9uIFBhcmFtZXRlcldpZGdldCggcGFyYW1ldGVyLCBwYXJhbURhdGEsIGNvbmZpZyApIHtcclxuXHQvLyBDb25maWd1cmF0aW9uIGluaXRpYWxpemF0aW9uXHJcblx0Y29uZmlnID0gY29uZmlnIHx8IHt9O1xyXG5cdC8vIENhbGwgcGFyZW50IGNvbnN0cnVjdG9yXHJcblx0UGFyYW1ldGVyV2lkZ2V0LnN1cGVyLmNhbGwoIHRoaXMsIGNvbmZpZyApO1xyXG5cdHRoaXMuJG92ZXJsYXkgPSBjb25maWcuJG92ZXJsYXk7XHJcbiAgICBcclxuXHR0aGlzLm5hbWUgPSBwYXJhbWV0ZXIubmFtZTtcclxuXHR0aGlzLnZhbHVlID0gcGFyYW1ldGVyLnZhbHVlO1xyXG5cdHRoaXMuYXV0b2ZpbGxlZCA9IHBhcmFtZXRlci5hdXRvZmlsbGVkO1xyXG5cdHRoaXMuaXNJbnZhbGlkID0gcGFyYW1ldGVyLnZhbHVlID09IG51bGw7XHJcblx0dGhpcy5wYXJhbURhdGEgPSBwYXJhbURhdGEgfHwge307XHJcblx0dGhpcy5hbGxvd2VkVmFsdWVzID0gdGhpcy5wYXJhbURhdGEuYWxsb3dlZFZhbHVlcyB8fCBbXTtcclxuXHR0aGlzLmlzUmVxdWlyZWQgPSB0aGlzLnBhcmFtRGF0YS5yZXF1aXJlZDtcclxuXHR0aGlzLmlzU3VnZ2VzdGVkID0gdGhpcy5wYXJhbURhdGEuc3VnZ2VzdGVkO1xyXG5cclxuXHQvLyBNYWtlIGEgY2hlY2tib3ggaWYgb25seSAxIG9yIDIgYWxsb3dlZCB2YWx1ZXNcclxuXHRzd2l0Y2godGhpcy5hbGxvd2VkVmFsdWVzLmxlbmd0aCkge1x0LyogZXNsaW50LWRpc2FibGUgbm8tZmFsbHRocm91Z2ggKi9cclxuXHRjYXNlIDE6XHJcblx0XHR0aGlzLmFsbG93ZWRWYWx1ZXNbMV0gPSBudWxsO1xyXG5cdFx0LyogZmFsbC10aHJvdWdoICovXHJcblx0Y2FzZSAyOlxyXG5cdFx0dmFyIGlzRmlyc3RBbGxvd2VkVmFsID0gKFxyXG5cdFx0XHR0aGlzLmFsbG93ZWRWYWx1ZXMuaW5kZXhPZiggcGFyYW1ldGVyLnZhbHVlICkgPT09IDAgfHxcclxuXHRcdFx0XHR0aGlzLmFsbG93ZWRWYWx1ZXMubWFwKG5vcm1hbGlzZVllc05vKS5pbmRleE9mKCBub3JtYWxpc2VZZXNObyhwYXJhbWV0ZXIudmFsdWUpICkgPT09IDBcclxuXHRcdCk7XHJcblx0XHR2YXIgaXNTZWNvbmRBbGxvd2VkVmFsID0gKFxyXG5cdFx0XHR0aGlzLmFsbG93ZWRWYWx1ZXMuaW5kZXhPZiggcGFyYW1ldGVyLnZhbHVlIHx8IG51bGwgKSA9PT0gMSB8fFxyXG5cdFx0XHRcdHRoaXMuYWxsb3dlZFZhbHVlcy5tYXAobm9ybWFsaXNlWWVzTm8pLmluZGV4T2YoIHBhcmFtZXRlci52YWx1ZSA/IG5vcm1hbGlzZVllc05vKHBhcmFtZXRlci52YWx1ZSkgOiBudWxsKSA9PT0gMVxyXG5cdFx0KTtcclxuXHRcdHZhciBpc0luZGV0ZXJtaW5hdGUgPSAhaXNGaXJzdEFsbG93ZWRWYWwgJiYgIWlzU2Vjb25kQWxsb3dlZFZhbDtcclxuXHRcdHRoaXMuY2hlY2tib3ggPSBuZXcgT08udWkuQ2hlY2tib3hJbnB1dFdpZGdldCgge1xyXG5cdFx0XHRzZWxlY3RlZDogaXNJbmRldGVybWluYXRlID8gdW5kZWZpbmVkIDogaXNGaXJzdEFsbG93ZWRWYWwsXHJcblx0XHRcdGluZGV0ZXJtaW5hdGU6IGlzSW5kZXRlcm1pbmF0ZSA/IHRydWUgOiB1bmRlZmluZWQsXHJcblx0XHRcdCRlbGVtZW50OiAkKFwiPGxhYmVsIHN0eWxlPSdtYXJnaW46MCAwIDAgNXB4Jz5cIilcclxuXHRcdH0gKTtcclxuXHRcdGJyZWFrO1xyXG5cdGRlZmF1bHQ6XHJcblx0XHRcdC8vIE5vIGNoZWNrYm94XHJcblx0fSAvKiBlc2xpbnQtZW5hYmxlIG5vLWZhbGx0aHJvdWdoICovXHJcblxyXG5cdC8qIC0tLSBFRElUIFBBUkFNRVRFUiBMQVlPVVQgLS0tICovXHJcblxyXG5cdHRoaXMuaW5wdXQgPSBuZXcgT08udWkuQ29tYm9Cb3hJbnB1dFdpZGdldCgge1xyXG5cdFx0dmFsdWU6IHRoaXMudmFsdWUsXHJcblx0XHQvLyBsYWJlbDogcGFyYW1ldGVyLm5hbWUgKyBcIiA9XCIsXHJcblx0XHQvLyBsYWJlbFBvc2l0aW9uOiBcImJlZm9yZVwiLFxyXG5cdFx0b3B0aW9uczogZmlsdGVyQW5kTWFwKFxyXG5cdFx0XHR0aGlzLmFsbG93ZWRWYWx1ZXMsXHJcblx0XHRcdHZhbCA9PiB2YWwhPT1udWxsLFxyXG5cdFx0XHR2YWwgPT4gKHtkYXRhOiB2YWwsIGxhYmVsOnZhbH0pXHJcblx0XHQpLFxyXG5cdFx0JGVsZW1lbnQ6ICQoXCI8ZGl2IHN0eWxlPSdtYXJnaW4tYm90dG9tOjA7Jz5cIiksXHJcblx0XHQkb3ZlcmxheTogdGhpcy4kb3ZlcmxheVxyXG5cdH0gKTtcclxuXHQvLyBSZWR1Y2UgdGhlIGV4Y2Vzc2l2ZSB3aGl0ZXNwYWNlL2hlaWdodFxyXG5cdHRoaXMuaW5wdXQuJGVsZW1lbnQuZmluZChcImlucHV0XCIpLmNzcyh7XHJcblx0XHRcInBhZGRpbmctdG9wXCI6IDAsXHJcblx0XHRcInBhZGRpbmctYm90dG9tXCI6IFwiMnB4XCIsXHJcblx0XHRcImhlaWdodFwiOiBcIjI0cHhcIlxyXG5cdH0pO1xyXG5cdC8vIEZpeCBsYWJlbCBwb3NpdGlvbmluZyB3aXRoaW4gdGhlIHJlZHVjZWQgaGVpZ2h0XHJcblx0dGhpcy5pbnB1dC4kZWxlbWVudC5maW5kKFwic3Bhbi5vby11aS1sYWJlbEVsZW1lbnQtbGFiZWxcIikuY3NzKHtcImxpbmUtaGVpZ2h0XCI6IFwibm9ybWFsXCJ9KTtcclxuXHQvLyBBbHNvIHJlZHVjZSBoZWlnaHQgb2YgZHJvcGRvd24gYnV0dG9uIChpZiBvcHRpb25zIGFyZSBwcmVzZW50KVxyXG5cdHRoaXMuaW5wdXQuJGVsZW1lbnQuZmluZChcImEub28tdWktYnV0dG9uRWxlbWVudC1idXR0b25cIikuY3NzKHtcclxuXHRcdFwicGFkZGluZy10b3BcIjogMCxcclxuXHRcdFwiaGVpZ2h0XCI6IFwiMjRweFwiLFxyXG5cdFx0XCJtaW4taGVpZ2h0XCI6IFwiMFwiXHJcblx0fSk7XHJcblxyXG5cdHRoaXMuY29uZmlybUJ1dHRvbiA9IG5ldyBPTy51aS5CdXR0b25XaWRnZXQoe1xyXG5cdFx0aWNvbjogXCJjaGVja1wiLFxyXG5cdFx0bGFiZWw6IFwiRG9uZVwiLFxyXG5cdFx0ZnJhbWVkOiBmYWxzZSxcclxuXHRcdGZsYWdzOiBcInByb2dyZXNzaXZlXCIsXHJcblx0XHQkZWxlbWVudDogJChcIjxzcGFuIHN0eWxlPSdtYXJnaW4tcmlnaHQ6MCc+XCIpXHJcblx0fSk7XHJcblxyXG5cdHRoaXMuY2FuY2VsQnV0dG9uID0gbmV3IE9PLnVpLkJ1dHRvbldpZGdldCh7XHJcblx0XHRpY29uOiBcInVuZG9cIixcclxuXHRcdGxhYmVsOiBcIkNhbmNlbFwiLFxyXG5cdFx0ZnJhbWVkOiBmYWxzZSxcclxuXHR9KTtcclxuXHJcblx0dGhpcy5kZWxldGVCdXR0b24gPSBuZXcgT08udWkuQnV0dG9uV2lkZ2V0KHtcclxuXHRcdGljb246IHRoaXMuaXNSZXF1aXJlZCA/IFwicmVzdG9yZVwiIDogXCJ0cmFzaFwiLFxyXG5cdFx0bGFiZWw6IHRoaXMuaXNSZXF1aXJlZCA/IFwiUmVxdWlyZWQgcGFyYW1ldGVyXCIgOiBcIkRlbGV0ZVwiLFxyXG5cdFx0ZnJhbWVkOiBmYWxzZSxcclxuXHRcdGZsYWdzOiBcImRlc3RydWN0aXZlXCIsXHJcblx0XHRkaXNhYmxlZDogdGhpcy5pc1JlcXVpcmVkXHJcblx0fSk7XHJcblxyXG5cdHRoaXMuZWRpdEJ1dHRvbkNvbnRyb2xzID0gbmV3IE9PLnVpLkJ1dHRvbkdyb3VwV2lkZ2V0KHtcclxuXHRcdGl0ZW1zOiBbXHJcblx0XHRcdHRoaXMuY29uZmlybUJ1dHRvbixcclxuXHRcdFx0dGhpcy5jYW5jZWxCdXR0b24sXHJcblx0XHRcdHRoaXMuZGVsZXRlQnV0dG9uXHJcblx0XHRdLFxyXG5cdFx0JGVsZW1lbnQ6ICQoXCI8c3BhbiBzdHlsZT0nZm9udC1zaXplOjkyJSc+XCIpXHJcblx0fSk7XHJcblx0dGhpcy5lZGl0QnV0dG9uQ29udHJvbHMuJGVsZW1lbnQuZmluZChcImEgc3BhbjpmaXJzdC1jaGlsZFwiKS5jc3Moe1xyXG5cdFx0XCJtaW4td2lkdGhcIjogXCJ1bnNldFwiLFxyXG5cdFx0XCJ3aWR0aFwiOiBcIjE2cHhcIixcclxuXHRcdFwibWFyZ2luLXJpZ2h0XCI6IDBcclxuXHR9KTtcclxuXHJcblx0dGhpcy5lZGl0TGF5b3V0Q29udHJvbHMgPSBuZXcgSG9yaXpvbnRhbExheW91dFdpZGdldCh7XHJcblx0XHRpdGVtczogW1xyXG5cdFx0XHR0aGlzLmlucHV0LFxyXG5cdFx0XHR0aGlzLmVkaXRCdXR0b25Db250cm9sc1xyXG5cdFx0XSxcclxuXHRcdC8vJGVsZW1lbnQ6ICQoXCI8ZGl2IHN0eWxlPSd3aWR0aDogNDglO21hcmdpbjowOyc+XCIpXHJcblx0fSk7XHJcblxyXG5cdHRoaXMuZWRpdExheW91dCA9IG5ldyBPTy51aS5GaWVsZExheW91dCggdGhpcy5lZGl0TGF5b3V0Q29udHJvbHMsIHtcclxuXHRcdGxhYmVsOiB0aGlzLm5hbWUgKyBcIiA9XCIsXHJcblx0XHRhbGlnbjogXCJ0b3BcIixcclxuXHRcdGhlbHA6IHRoaXMucGFyYW1EYXRhLmRlc2NyaXB0aW9uICYmIHRoaXMucGFyYW1EYXRhLmRlc2NyaXB0aW9uLmVuIHx8IGZhbHNlLFxyXG5cdFx0aGVscElubGluZTogdHJ1ZVxyXG5cdH0pLnRvZ2dsZSgpO1xyXG5cdHRoaXMuZWRpdExheW91dC4kZWxlbWVudC5maW5kKFwibGFiZWwub28tdWktaW5saW5lLWhlbHBcIikuY3NzKHtcIm1hcmdpblwiOiBcIi0xMHB4IDAgNXB4IDEwcHhcIn0pO1xyXG5cclxuXHQvKiAtLS0gUkVBRCAoQ09MTEFQU0VEKSBESVNQTEFZIE9GIFBBUkFNRVRFUiAtLS0gKi9cclxuXHJcblx0dGhpcy5pbnZhbGlkSWNvbiA9IG5ldyBPTy51aS5JY29uV2lkZ2V0KCB7XHJcblx0XHRpY29uOiBcImJsb2NrXCIsXHJcblx0XHR0aXRsZTogXCJJbnZhbGlkIHBhcmFtZXRlcjogbm8gdmFsdWUgc3BlY2lmaWVkIVwiLFxyXG5cdFx0ZmxhZ3M6IFwiZGVzdHJ1Y3RpdmVcIixcclxuXHRcdCRlbGVtZW50OiAkKFwiPHNwYW4gc3R5bGU9J21hcmdpbjogMCA1cHggMCAtNXB4OyBtaW4td2lkdGg6IDE2cHg7IHdpZHRoOiAxNnB4Oyc+XCIpXHJcblx0fSApLnRvZ2dsZSh0aGlzLmlzSW52YWxpZCk7XHJcblx0dGhpcy5mdWxsTGFiZWwgPSBuZXcgT08udWkuTGFiZWxXaWRnZXQoe1xyXG5cdFx0bGFiZWw6dGhpcy5uYW1lICtcclxuXHRcdFx0KHRoaXMudmFsdWVcclxuXHRcdFx0XHQ/IFwiID0gXCIgKyB0aGlzLnZhbHVlXHJcblx0XHRcdFx0OiBcIiBcIlxyXG5cdFx0XHQpLFx0XHJcblx0XHQkZWxlbWVudDogJChcIjxsYWJlbCBzdHlsZT0nbWFyZ2luOiAwOyc+XCIpXHJcblx0fSk7XHJcblx0dGhpcy5hdXRvZmlsbGVkSWNvbiA9IG5ldyBPTy51aS5JY29uV2lkZ2V0KCB7XHJcblx0XHRpY29uOiBcInJvYm90XCIsXHJcblx0XHR0aXRsZTogXCJBdXRvZmlsbGVkIGJ5IFJhdGVyXCIsXHJcblx0XHRmbGFnczogXCJwcm9ncmVzc2l2ZVwiLFxyXG5cdFx0JGVsZW1lbnQ6ICQoXCI8c3BhbiBzdHlsZT0nbWFyZ2luOiAwIC01cHggMCA1cHg7bWluLXdpZHRoOiAxNnB4O3dpZHRoOiAxNnB4Oyc+XCIpXHJcblx0fSApLnRvZ2dsZSh0aGlzLmF1dG9maWxsZWQpO1xyXG5cdHRoaXMuZWRpdEJ1dHRvbiA9IG5ldyBPTy51aS5CdXR0b25XaWRnZXQoe1xyXG5cdFx0aWNvbjogXCJlZGl0XCIsXHJcblx0XHRmcmFtZWQ6IGZhbHNlLFxyXG5cdFx0JGVsZW1lbnQ6ICQoXCI8c3BhbiBzdHlsZT0nbWFyZ2luLWJvdHRvbTogMDsnPlwiKVxyXG5cdH0pO1xyXG5cdHRoaXMuZWRpdEJ1dHRvbi4kZWxlbWVudC5maW5kKFwiYVwiKS5jc3Moe1xyXG5cdFx0XCJib3JkZXItcmFkaXVzXCI6IFwiMCAxMHB4IDEwcHggMFwiLFxyXG5cdFx0XCJtYXJnaW4tbGVmdFwiOiBcIjVweFwiXHJcblx0fSk7XHJcblx0dGhpcy5lZGl0QnV0dG9uLiRlbGVtZW50LmZpbmQoXCJhIHNwYW5cIikuZmlyc3QoKS5jc3Moe1xyXG5cdFx0XCJtaW4td2lkdGhcIjogXCJ1bnNldFwiLFxyXG5cdFx0XCJ3aWR0aFwiOiBcIjE2cHhcIlxyXG5cdH0pO1xyXG5cclxuXHR0aGlzLnJlYWRMYXlvdXQgPSBuZXcgT08udWkuSG9yaXpvbnRhbExheW91dCh7XHJcblx0XHRpdGVtczogW1xyXG5cdFx0XHR0aGlzLmludmFsaWRJY29uLFxyXG5cdFx0XHR0aGlzLmZ1bGxMYWJlbCxcclxuXHRcdFx0dGhpcy5hdXRvZmlsbGVkSWNvbixcclxuXHRcdFx0dGhpcy5lZGl0QnV0dG9uXHJcblx0XHRdLFxyXG5cdFx0JGVsZW1lbnQ6ICQoXCI8c3BhbiBzdHlsZT0nbWFyZ2luOjA7d2lkdGg6dW5zZXQ7Jz5cIilcclxuXHR9KTtcclxuXHRpZiAodGhpcy5jaGVja2JveCkge1xyXG5cdFx0dGhpcy5yZWFkTGF5b3V0LmFkZEl0ZW1zKFt0aGlzLmNoZWNrYm94XSwgMik7XHJcblx0fVxyXG5cclxuXHQvKiAtLS0gQ09OVEFJTkVSIEZPUiBCT1RIIExBWU9VVFMgLS0tICovXHJcblx0dGhpcy4kZWxlbWVudCA9ICQoXCI8ZGl2PlwiKS5hZGRDbGFzcyhcInJhdGVyLXBhcmFtZXRlcldpZGdldFwiKVxyXG5cdFx0LmNzcyh7XHJcblx0XHRcdFwid2lkdGhcIjogXCJ1bnNldFwiLFxyXG5cdFx0XHRcImRpc3BsYXlcIjogXCJpbmxpbmUtYmxvY2tcIixcclxuXHRcdFx0XCJib3JkZXJcIjogdGhpcy5hdXRvZmlsbGVkID8gXCIxcHggZGFzaGVkICMzNmNcIiA6IFwiMXB4IHNvbGlkICNkZGRcIixcclxuXHRcdFx0XCJib3JkZXItcmFkaXVzXCI6IFwiMTBweFwiLFxyXG5cdFx0XHRcInBhZGRpbmctbGVmdFwiOiBcIjEwcHhcIixcclxuXHRcdFx0XCJtYXJnaW5cIjogXCIwIDhweCA4cHggMFwiLFxyXG5cdFx0XHRcImJhY2tncm91bmRcIjogdGhpcy5pc0ludmFsaWQgPyBcIiNmZGRkXCIgOiBcIiNmZmZlXCJcclxuXHRcdH0pXHJcblx0XHQuYXBwZW5kKHRoaXMucmVhZExheW91dC4kZWxlbWVudCwgdGhpcy5lZGl0TGF5b3V0LiRlbGVtZW50KTtcclxuICAgIFxyXG5cdHRoaXMuZWRpdEJ1dHRvbi5jb25uZWN0KCB0aGlzLCB7IFwiY2xpY2tcIjogXCJvbkVkaXRDbGlja1wiIH0gKTtcclxuXHR0aGlzLmNvbmZpcm1CdXR0b24uY29ubmVjdCggdGhpcywgeyBcImNsaWNrXCI6IFwib25Db25maXJtQ2xpY2tcIiB9ICk7XHJcblx0dGhpcy5jYW5jZWxCdXR0b24uY29ubmVjdCggdGhpcywgeyBcImNsaWNrXCI6IFwib25DYW5jZWxDbGlja1wiIH0gKTtcclxuXHR0aGlzLmRlbGV0ZUJ1dHRvbi5jb25uZWN0KCB0aGlzLCB7IFwiY2xpY2tcIjogXCJvbkRlbGV0ZUNsaWNrXCIgfSApO1xyXG5cdGlmICh0aGlzLmNoZWNrYm94KSB7XHJcblx0XHR0aGlzLmNoZWNrYm94LmNvbm5lY3QodGhpcywge1wiY2hhbmdlXCI6IFwib25DaGVja2JveENoYW5nZVwifSApO1xyXG5cdH1cclxufVxyXG5PTy5pbmhlcml0Q2xhc3MoIFBhcmFtZXRlcldpZGdldCwgT08udWkuV2lkZ2V0ICk7XHJcblxyXG5QYXJhbWV0ZXJXaWRnZXQucHJvdG90eXBlLm9uVXBkYXRlZFNpemUgPSBmdW5jdGlvbigpIHtcclxuXHQvLyBFbWl0IGFuIFwidXBkYXRlZFNpemVcIiBldmVudCBzbyB0aGUgcGFyZW50IHdpbmRvdyBjYW4gdXBkYXRlIHNpemUsIGlmIG5lZWRlZFxyXG5cdHRoaXMuZW1pdChcInVwZGF0ZWRTaXplXCIpO1xyXG59O1xyXG5cclxuUGFyYW1ldGVyV2lkZ2V0LnByb3RvdHlwZS5vbkVkaXRDbGljayA9IGZ1bmN0aW9uKCkge1xyXG5cdHRoaXMucmVhZExheW91dC50b2dnbGUoZmFsc2UpO1xyXG5cdHRoaXMuZWRpdExheW91dC50b2dnbGUodHJ1ZSk7XHJcblx0dGhpcy4kZWxlbWVudC5jc3Moe1wiYmFja2dyb3VuZFwiOiBcIiNmZmZlXCJ9KTtcclxuXHR0aGlzLmlucHV0LmZvY3VzKCk7XHJcblx0dGhpcy5vblVwZGF0ZWRTaXplKCk7XHJcbn07XHJcblxyXG5QYXJhbWV0ZXJXaWRnZXQucHJvdG90eXBlLm9uQ29uZmlybUNsaWNrID0gZnVuY3Rpb24oKSB7XHJcblx0dGhpcy5zZXRWYWx1ZShcclxuXHRcdHRoaXMuaW5wdXQuZ2V0VmFsdWUoKVxyXG5cdCk7XHJcblx0dGhpcy5yZWFkTGF5b3V0LnRvZ2dsZSh0cnVlKTtcclxuXHR0aGlzLmVkaXRMYXlvdXQudG9nZ2xlKGZhbHNlKTtcclxuXHR0aGlzLm9uVXBkYXRlZFNpemUoKTtcclxufTtcclxuXHJcblBhcmFtZXRlcldpZGdldC5wcm90b3R5cGUub25DYW5jZWxDbGljayA9IGZ1bmN0aW9uKCkge1xyXG5cdHRoaXMuaW5wdXQuc2V0VmFsdWUodGhpcy52YWx1ZSk7XHJcblx0dGhpcy5yZWFkTGF5b3V0LnRvZ2dsZSh0cnVlKTtcclxuXHR0aGlzLmVkaXRMYXlvdXQudG9nZ2xlKGZhbHNlKTtcclxuXHR0aGlzLm9uVXBkYXRlZFNpemUoKTtcclxufTtcclxuXHJcblBhcmFtZXRlcldpZGdldC5wcm90b3R5cGUub25EZWxldGVDbGljayA9IGZ1bmN0aW9uKCkge1xyXG5cdHRoaXMuZGVsZXRlKCk7XHJcbn07XHJcblxyXG5QYXJhbWV0ZXJXaWRnZXQucHJvdG90eXBlLm9uQ2hlY2tib3hDaGFuZ2UgPSBmdW5jdGlvbihpc1NlbGVjdGVkLCBpc0luZGV0ZXJtaW5hdGUpIHtcclxuXHRpZiAoaXNJbmRldGVybWluYXRlKSB7XHJcblx0XHRyZXR1cm47XHJcblx0fVxyXG5cdGlmIChpc1NlbGVjdGVkKSB7XHJcblx0XHR0aGlzLnNldFZhbHVlKHRoaXMuYWxsb3dlZFZhbHVlc1swXSk7XHJcblx0fSBlbHNlIHtcclxuXHRcdHRoaXMuc2V0VmFsdWUodGhpcy5hbGxvd2VkVmFsdWVzWzFdKTtcclxuXHR9XHJcbn07XHJcblxyXG5QYXJhbWV0ZXJXaWRnZXQucHJvdG90eXBlLmRlbGV0ZSA9IGZ1bmN0aW9uKCkge1xyXG5cdHRoaXMuZW1pdChcImRlbGV0ZVwiKTtcclxufTtcclxuXHJcblBhcmFtZXRlcldpZGdldC5wcm90b3R5cGUuc2V0VmFsdWUgPSBmdW5jdGlvbih2YWwpIHtcclxuXHQvLyBUdXJuIG9mZiBhdXRvZmlsbCBzdHlsaW5ncy9pY29uXHJcblx0dGhpcy5hdXRvZmlsbGVkID0gZmFsc2U7XHJcblx0dGhpcy5hdXRvZmlsbGVkSWNvbi50b2dnbGUoZmFsc2UpO1xyXG5cdHRoaXMuJGVsZW1lbnQuY3NzKHtcImJvcmRlclwiOiBcIjFweCBzb2xpZCAjZGRkXCJ9KTtcclxuXHJcblx0Ly8gVXBkYXRlIHRoZSBzdG9yZWQgdmFsdWVcclxuXHR0aGlzLnZhbHVlID0gdmFsO1xyXG5cclxuXHQvLyBVcGRhdGUgdGhlIGlucHV0IHZhbHVlIGZvciBlZGl0IG1vZGVcclxuXHR0aGlzLmlucHV0LnNldFZhbHVlKHRoaXMudmFsdWUpO1xyXG5cclxuXHQvLyBVcGRhdGUgdmFsaWRpdHlcclxuXHR0aGlzLmlzSW52YWxpZCA9IHRoaXMudmFsdWUgPT0gbnVsbDtcclxuXHR0aGlzLmludmFsaWRJY29uLnRvZ2dsZSh0aGlzLmlzSW52YWxpZCk7XHJcblx0dGhpcy4kZWxlbWVudC5jc3Moe1wiYmFja2dyb3VuZFwiOiB0aGlzLmlzSW52YWxpZCA/IFwiI2ZkZGRcIiA6IFwiI2ZmZmVcIn0pO1xyXG5cclxuXHQvLyBVcGRhdGVkIHRoZSBsYWJlbCBmb3IgcmVhZCBtb2RlXHJcblx0dGhpcy5mdWxsTGFiZWwuc2V0TGFiZWwoXHJcblx0XHR0aGlzLm5hbWUgK1xyXG5cdFx0KHRoaXMudmFsdWVcclxuXHRcdFx0PyBcIiA9IFwiICsgdGhpcy52YWx1ZVxyXG5cdFx0XHQ6IFwiXCJcclxuXHRcdClcclxuXHQpO1xyXG5cclxuXHQvLyBVcGRhdGUgdGhlIGNoZWNrYm94IChpZiB0aGVyZSBpcyBvbmUpXHJcblx0aWYgKHRoaXMuY2hlY2tib3gpIHtcclxuXHRcdHZhciBpc0ZpcnN0QWxsb3dlZFZhbCA9IChcclxuXHRcdFx0dGhpcy5hbGxvd2VkVmFsdWVzLmluZGV4T2YoIHZhbCApID09PSAwIHx8XHJcblx0XHRcdHRoaXMuYWxsb3dlZFZhbHVlcy5tYXAobm9ybWFsaXNlWWVzTm8pLmluZGV4T2YoIG5vcm1hbGlzZVllc05vKHZhbCkgKSA9PT0gMFxyXG5cdFx0KTtcclxuXHRcdHZhciBpc1NlY29uZEFsbG93ZWRWYWwgPSAoXHJcblx0XHRcdHRoaXMuYWxsb3dlZFZhbHVlcy5pbmRleE9mKCB2YWwgfHwgbnVsbCApID09PSAxIHx8XHJcblx0XHRcdHRoaXMuYWxsb3dlZFZhbHVlcy5tYXAobm9ybWFsaXNlWWVzTm8pLmluZGV4T2YoIHZhbCA/IG5vcm1hbGlzZVllc05vKHZhbCkgOiBudWxsKSA9PT0gMVxyXG5cdFx0KTtcclxuXHRcdHZhciBpc0luZGV0ZXJtaW5hdGUgPSAhaXNGaXJzdEFsbG93ZWRWYWwgJiYgIWlzU2Vjb25kQWxsb3dlZFZhbDtcclxuXHRcdHRoaXMuY2hlY2tib3guc2V0SW5kZXRlcm1pbmF0ZShpc0luZGV0ZXJtaW5hdGUsIHRydWUpO1xyXG5cdFx0aWYgKCFpc0luZGV0ZXJtaW5hdGUpIHtcclxuXHRcdFx0dmFyIGlzU2VsZWN0ZWQgPSBpc0ZpcnN0QWxsb3dlZFZhbDtcclxuXHRcdFx0dGhpcy5jaGVja2JveC5zZXRTZWxlY3RlZChpc1NlbGVjdGVkLCB0cnVlKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8vIEVtaXQgYSBjaGFuZ2UgZXZlbnRcclxuXHR0aGlzLmVtaXQoXCJjaGFuZ2VcIik7XHJcbn07XHJcblxyXG5QYXJhbWV0ZXJXaWRnZXQucHJvdG90eXBlLnNldEF1dG9maWxsZWQgPSBmdW5jdGlvbigpIHtcclxuXHR0aGlzLmF1dG9maWxsZWQgPSB0cnVlO1xyXG5cdHRoaXMuYXV0b2ZpbGxlZEljb24udG9nZ2xlKHRydWUpO1xyXG5cdHRoaXMuJGVsZW1lbnQuY3NzKHtcImJvcmRlclwiOiBcIjFweCBkYXNoZWQgIzM2Y1wifSk7XHJcbn07XHJcblxyXG5QYXJhbWV0ZXJXaWRnZXQucHJvdG90eXBlLm1ha2VXaWtpdGV4dCA9IGZ1bmN0aW9uKHBpcGVTdHlsZSwgZXF1YWxzU3R5bGUpIHtcclxuXHRpZiAodGhpcy5pc0ludmFsaWQpIHtcclxuXHRcdHJldHVybiBcIlwiO1xyXG5cdH1cclxuXHRyZXR1cm4gcGlwZVN0eWxlICsgdGhpcy5uYW1lICsgZXF1YWxzU3R5bGUgKyAodGhpcy52YWx1ZXx8XCJcIik7XHJcbn07XHJcblxyXG5QYXJhbWV0ZXJXaWRnZXQucHJvdG90eXBlLmZvY3VzSW5wdXQgPSBmdW5jdGlvbigpIHtcclxuXHRyZXR1cm4gdGhpcy5pbnB1dC5mb2N1cygpO1xyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgUGFyYW1ldGVyV2lkZ2V0O1xyXG4vLyA8L25vd2lraT4iLCJpbXBvcnQgY29uZmlnIGZyb20gXCIuLi8uLi9jb25maWdcIjtcclxuLy8gPG5vd2lraT5cclxuXHJcbmZ1bmN0aW9uIFByZWZzRm9ybVdpZGdldCggY29uZmlnICkge1xyXG5cdC8vIENvbmZpZ3VyYXRpb24gaW5pdGlhbGl6YXRpb25cclxuXHRjb25maWcgPSBjb25maWcgfHwge307XHJcblx0Ly8gQ2FsbCBwYXJlbnQgY29uc3RydWN0b3JcclxuXHRQcmVmc0Zvcm1XaWRnZXQuc3VwZXIuY2FsbCggdGhpcywgY29uZmlnICk7XHJcblxyXG5cdHRoaXMuJGVsZW1lbnQuYWRkQ2xhc3MoXCJyYXRlci1wcmVmc0Zvcm1XaWRnZXRcIik7XHJcblxyXG5cdHRoaXMubGF5b3V0ID0gIG5ldyBPTy51aS5GaWVsZHNldExheW91dCgge1xyXG5cdFx0bGFiZWw6IFwiUHJlZmVyZW5jZXNcIixcclxuXHRcdCRlbGVtZW50OiB0aGlzLiRlbGVtZW50XHJcblx0fSApO1xyXG5cclxuXHR0aGlzLnByZWZlcmVuY2VzID0ge1xyXG5cdFx0XCJhdXRvc3RhcnRcIjoge1xyXG5cdFx0XHRpbnB1dDogbmV3IE9PLnVpLlRvZ2dsZVN3aXRjaFdpZGdldCgpLFxyXG5cdFx0XHRsYWJlbDogXCJBdXRvc3RhcnQgUmF0ZXJcIlxyXG5cdFx0fSxcclxuXHRcdFwiYXV0b3N0YXJ0UmVkaXJlY3RzXCI6IHtcclxuXHRcdFx0aW5wdXQ6IG5ldyBPTy51aS5Ub2dnbGVTd2l0Y2hXaWRnZXQoKSxcclxuXHRcdFx0bGFiZWw6IFwiQXV0b3N0YXJ0IG9uIHJlZGlyZWN0c1wiXHJcblx0XHR9LFxyXG5cdFx0XCJhdXRvc3RhcnROYW1lc3BhY2VzXCI6IHtcclxuXHRcdFx0aW5wdXQ6IG5ldyBtdy53aWRnZXRzLk5hbWVzcGFjZXNNdWx0aXNlbGVjdFdpZGdldCgpLFxyXG5cdFx0XHRsYWJlbDogXCJBdXRvc3RhcnQgaW4gdGhlc2UgbmFtZXNwYWNlc1wiXHJcblx0XHR9LFxyXG5cdFx0XCJieXBhc3NSZWRpcmVjdHNcIjoge1xyXG5cdFx0XHRpbnB1dDogbmV3IE9PLnVpLlRvZ2dsZVN3aXRjaFdpZGdldCgpLFxyXG5cdFx0XHRsYWJlbDogXCJCeXBhc3MgcmVkaXJlY3RzIHRvIGJhbm5lcnNcIlxyXG5cdFx0fSxcclxuXHRcdFwiYXV0b2ZpbGxDbGFzc0Zyb21PdGhlcnNcIjogIHtcclxuXHRcdFx0aW5wdXQ6IG5ldyBPTy51aS5Ub2dnbGVTd2l0Y2hXaWRnZXQoKSxcclxuXHRcdFx0bGFiZWw6IFwiQXV0b2ZpbGwgY2xhc3MgZnJvbSBvdGhlciBiYW5uZXJzXCJcclxuXHRcdH0sXHJcblx0XHRcImF1dG9maWxsQ2xhc3NGcm9tT3Jlc1wiOiB7XHJcblx0XHRcdGlucHV0OiBuZXcgT08udWkuVG9nZ2xlU3dpdGNoV2lkZ2V0KCksXHJcblx0XHRcdGxhYmVsOiBcIkF1dG9maWxsIGNsYXNzIGJhc2VkIG9uIE9SRVMgcHJlZGljdGlvblwiXHJcblx0XHR9LFxyXG5cdFx0XCJhdXRvZmlsbEltcG9ydGFuY2VcIjoge1xyXG5cdFx0XHRpbnB1dDogbmV3IE9PLnVpLlRvZ2dsZVN3aXRjaFdpZGdldCgpLFxyXG5cdFx0XHRsYWJlbDogXCJBdXRvZmlsbCBsb3cgaW1wb3J0YW5jZVwiXHJcblx0XHR9LFxyXG5cdFx0XCJjb2xsYXBzZVBhcmFtc0xvd2VyTGltaXRcIjoge1xyXG5cdFx0XHRpbnB1dDogbmV3IE9PLnVpLk51bWJlcklucHV0V2lkZ2V0KCB7IFwibWluXCI6IDEgfSApLFxyXG5cdFx0XHRsYWJlbDogXCJNaW5pbXVtIG51bWJlciBvZiBwYXJhbWV0ZXJzIHRvIHNob3cgdW5jb2xsYXBzZWRcIlxyXG5cdFx0fSxcclxuXHRcdFwid2F0Y2hsaXN0XCI6IHtcclxuXHRcdFx0aW5wdXQ6IG5ldyBPTy51aS5CdXR0b25TZWxlY3RXaWRnZXQoIHtcclxuXHRcdFx0XHRpdGVtczogW1xyXG5cdFx0XHRcdFx0bmV3IE9PLnVpLkJ1dHRvbk9wdGlvbldpZGdldCgge1xyXG5cdFx0XHRcdFx0XHRkYXRhOiBcInByZWZlcmVuY2VzXCIsXHJcblx0XHRcdFx0XHRcdGxhYmVsOiBcIkRlZmF1bHRcIixcclxuXHRcdFx0XHRcdFx0dGl0bGU6IFwiVXNlcyB0aGUgc2FtZSBzZXR0aW5nIGFzIGlmIHlvdSBtYW51YWxseSBlZGl0ZWQgdGhlIHBhZ2UsIGFzIHBlciBTcGVjaWFsOlByZWZlcmVuY2VzXCJcclxuXHRcdFx0XHRcdH0gKSxcclxuXHRcdFx0XHRcdG5ldyBPTy51aS5CdXR0b25PcHRpb25XaWRnZXQoIHtcclxuXHRcdFx0XHRcdFx0ZGF0YTogXCJ3YXRjaFwiLFxyXG5cdFx0XHRcdFx0XHRsYWJlbDogXCJBbHdheXNcIixcclxuXHRcdFx0XHRcdFx0dGl0bGU6IFwiQWx3YXlzIGFkZCBwYWdlcyBSYXRlciBlZGl0cyB0byB5b3VyIHdhdGNobGlzdFwiXHJcblx0XHRcdFx0XHR9ICksXHJcblx0XHRcdFx0XHRuZXcgT08udWkuQnV0dG9uT3B0aW9uV2lkZ2V0KCB7XHJcblx0XHRcdFx0XHRcdGRhdGE6IFwibm9jaGFuZ2VcIixcclxuXHRcdFx0XHRcdFx0bGFiZWw6IFwiTmV2ZXJcIixcclxuXHRcdFx0XHRcdFx0dGl0bGU6IFwiTmV2ZXIgYWRkIHBhZ2VzIFJhdGVyIGVkaXQgdG8geW91ciB3YXRjaGxpc3RcIlxyXG5cdFx0XHRcdFx0fSApLFxyXG5cdFx0XHRcdF1cclxuXHRcdFx0fSkuc2VsZWN0SXRlbUJ5RGF0YShcInByZWZlcmVuY2VzXCIpLFxyXG5cdFx0XHRsYWJlbDogXCJBZGQgZWRpdGVkIHBhZ2VzIHRvIHdhdGNobGlzdFwiXHJcblx0XHR9LFxyXG5cdFx0XCJyZXNldENhY2hlXCI6IHtcclxuXHRcdFx0aW5wdXQ6IG5ldyBPTy51aS5CdXR0b25XaWRnZXQoIHtcclxuXHRcdFx0XHRsYWJlbDogXCJSZXNldCBjYWNoZVwiLFxyXG5cdFx0XHRcdHRpdGxlOiBcIlJlbW92ZSBjYWNoZWQgZGF0YSwgaW5jbHVkaW5nIGxpc3Qgb2YgV2lraVByb2plY3RzIGFuZCB0ZW1wbGF0ZSBwYXJhbWV0ZXJzXCIsXHJcblx0XHRcdFx0ZmxhZ3M6IFtcImRlc3RydWN0aXZlXCJdXHJcblx0XHRcdH0gKVxyXG5cdFx0fVxyXG5cdH07XHJcblxyXG5cdGZvciAobGV0IHByZWZOYW1lIGluIHRoaXMucHJlZmVyZW5jZXMgKSB7XHJcblx0XHR0aGlzLmxheW91dC5hZGRJdGVtcyhbXHJcblx0XHRcdG5ldyBPTy51aS5GaWVsZExheW91dCggdGhpcy5wcmVmZXJlbmNlc1twcmVmTmFtZV0uaW5wdXQsIHtcclxuXHRcdFx0XHRsYWJlbDogdGhpcy5wcmVmZXJlbmNlc1twcmVmTmFtZV0ubGFiZWwsXHJcblx0XHRcdFx0YWxpZ246IFwicmlnaHRcIlxyXG5cdFx0XHR9IClcclxuXHRcdF0pO1xyXG5cdH1cclxuXHJcblx0dGhpcy5wcmVmZXJlbmNlcy5yZXNldENhY2hlLmlucHV0LmNvbm5lY3QodGhpcywge1wiY2xpY2tcIjogXCJvblJlc2V0Q2FjaGVDbGlja1wifSk7XHJcbn1cclxuT08uaW5oZXJpdENsYXNzKCBQcmVmc0Zvcm1XaWRnZXQsIE9PLnVpLldpZGdldCApO1xyXG5cclxuUHJlZnNGb3JtV2lkZ2V0LnByb3RvdHlwZS5zZXRQcmVmVmFsdWVzID0gZnVuY3Rpb24ocHJlZnMpIHtcclxuXHRmb3IgKGxldCBwcmVmTmFtZSBpbiBwcmVmcyApIHtcclxuXHRcdGxldCB2YWx1ZSA9IHByZWZzW3ByZWZOYW1lXTtcclxuXHRcdGxldCBpbnB1dCA9IHRoaXMucHJlZmVyZW5jZXNbcHJlZk5hbWVdICYmIHRoaXMucHJlZmVyZW5jZXNbcHJlZk5hbWVdLmlucHV0O1xyXG5cdFx0c3dpdGNoIChpbnB1dCAmJiBpbnB1dC5jb25zdHJ1Y3Rvci5uYW1lKSB7XHJcblx0XHRjYXNlIFwiT29VaUJ1dHRvblNlbGVjdFdpZGdldFwiOlxyXG5cdFx0XHRpbnB1dC5zZWxlY3RJdGVtQnlEYXRhKHZhbHVlKTtcclxuXHRcdFx0YnJlYWs7XHJcblx0XHRjYXNlIFwiT29VaU51bWJlcklucHV0V2lkZ2V0XCI6XHJcblx0XHRjYXNlIFwiT29VaVRvZ2dsZVN3aXRjaFdpZGdldFwiOlxyXG5cdFx0XHRpbnB1dC5zZXRWYWx1ZSh2YWx1ZSk7XHJcblx0XHRcdGJyZWFrO1xyXG5cdFx0Y2FzZSBcIk13V2lkZ2V0c05hbWVzcGFjZXNNdWx0aXNlbGVjdFdpZGdldFwiOlxyXG5cdFx0XHRpbnB1dC5jbGVhckl0ZW1zKCk7XHJcblx0XHRcdHZhbHVlLmZvckVhY2gobnMgPT5cclxuXHRcdFx0XHRpbnB1dC5hZGRUYWcoXHJcblx0XHRcdFx0XHRucy50b1N0cmluZygpLFxyXG5cdFx0XHRcdFx0bnMgPT09IDBcclxuXHRcdFx0XHRcdFx0PyBcIihNYWluKVwiXHJcblx0XHRcdFx0XHRcdDogY29uZmlnLm13LndnRm9ybWF0dGVkTmFtZXNwYWNlc1tuc11cclxuXHRcdFx0XHQpXHJcblx0XHRcdCk7XHJcblx0XHRcdGJyZWFrO1xyXG5cdFx0fVxyXG5cdH1cclxufTtcclxuXHJcblByZWZzRm9ybVdpZGdldC5wcm90b3R5cGUuZ2V0UHJlZnMgPSBmdW5jdGlvbigpIHtcclxuXHR2YXIgcHJlZnMgPSB7fTtcclxuXHRmb3IgKGxldCBwcmVmTmFtZSBpbiB0aGlzLnByZWZlcmVuY2VzICkge1xyXG5cdFx0bGV0IGlucHV0ID0gdGhpcy5wcmVmZXJlbmNlc1twcmVmTmFtZV0uaW5wdXQ7XHJcblx0XHRsZXQgdmFsdWU7XHJcblx0XHRzd2l0Y2ggKGlucHV0LmNvbnN0cnVjdG9yLm5hbWUpIHtcclxuXHRcdGNhc2UgXCJPb1VpQnV0dG9uU2VsZWN0V2lkZ2V0XCI6XHJcblx0XHRcdHZhbHVlID0gaW5wdXQuZmluZFNlbGVjdGVkSXRlbSgpLmdldERhdGEoKTtcclxuXHRcdFx0YnJlYWs7XHJcblx0XHRjYXNlIFwiT29VaVRvZ2dsZVN3aXRjaFdpZGdldFwiOlxyXG5cdFx0XHR2YWx1ZSA9IGlucHV0LmdldFZhbHVlKCk7XHJcblx0XHRcdGJyZWFrO1xyXG5cdFx0Y2FzZSBcIk9vVWlOdW1iZXJJbnB1dFdpZGdldFwiOlxyXG5cdFx0XHR2YWx1ZSA9IE51bWJlcihpbnB1dC5nZXRWYWx1ZSgpKTsgLy8gd2lkZ2V0IHVzZXMgc3RyaW5ncywgbm90IG51bWJlcnMhXHJcblx0XHRcdGJyZWFrO1xyXG5cdFx0Y2FzZSBcIk13V2lkZ2V0c05hbWVzcGFjZXNNdWx0aXNlbGVjdFdpZGdldFwiOlxyXG5cdFx0XHR2YWx1ZSA9IGlucHV0LmdldFZhbHVlKCkubWFwKE51bWJlcik7IC8vIHdpZGdldCB1c2VzIHN0cmluZ3MsIG5vdCBudW1iZXJzIVxyXG5cdFx0XHRicmVhaztcclxuXHRcdH1cclxuXHRcdHByZWZzW3ByZWZOYW1lXSA9IHZhbHVlO1xyXG5cdH1cclxuXHRyZXR1cm4gcHJlZnM7XHJcbn07XHJcblxyXG5QcmVmc0Zvcm1XaWRnZXQucHJvdG90eXBlLm9uUmVzZXRDYWNoZUNsaWNrID0gZnVuY3Rpb24oKSB7XHJcblx0T08udWkuY29uZmlybShcIkFmdGVyIHJlc2V0aW5nIGNhY2hlLCBSYXRlciB3aWxsIGNsb3NlIGFuZCByZXN0YXJ0LiBBbnkgY2hhbmdlcyBtYWRlIHdpbGwgYmUgZGlzY2FyZGVkLlwiKVxyXG5cdFx0LnRoZW4oY29uZmlybWVkID0+IHtcclxuXHRcdFx0aWYgKGNvbmZpcm1lZCkgeyBcclxuXHRcdFx0XHR0aGlzLmVtaXQoXCJyZXNldENhY2hlXCIpO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IFByZWZzRm9ybVdpZGdldDtcclxuLy8gPC9ub3dpa2k+IiwiLy8gPG5vd2lraT5cclxuXHJcbnZhciBTdWdnZXN0aW9uTG9va3VwVGV4dElucHV0V2lkZ2V0ID0gZnVuY3Rpb24gU3VnZ2VzdGlvbkxvb2t1cFRleHRJbnB1dFdpZGdldCggY29uZmlnICkge1xyXG5cdE9PLnVpLlRleHRJbnB1dFdpZGdldC5jYWxsKCB0aGlzLCBjb25maWcgKTtcclxuXHRPTy51aS5taXhpbi5Mb29rdXBFbGVtZW50LmNhbGwoIHRoaXMsIGNvbmZpZyApO1xyXG5cdHRoaXMuc3VnZ2VzdGlvbnMgPSBBcnJheS5pc0FycmF5KGNvbmZpZy5zdWdnZXN0aW9ucykgPyBjb25maWcuc3VnZ2VzdGlvbnMgOiBbXTtcclxuXHR0aGlzLiRlbGVtZW50LmFkZENsYXNzKFwicmF0ZXItc3VnZ2VzdGlvbkxvb2t1cFRleHRJbnB1dFdpZGdldFwiKTtcclxufTtcclxuT08uaW5oZXJpdENsYXNzKCBTdWdnZXN0aW9uTG9va3VwVGV4dElucHV0V2lkZ2V0LCBPTy51aS5UZXh0SW5wdXRXaWRnZXQgKTtcclxuT08ubWl4aW5DbGFzcyggU3VnZ2VzdGlvbkxvb2t1cFRleHRJbnB1dFdpZGdldCwgT08udWkubWl4aW4uTG9va3VwRWxlbWVudCApO1xyXG5cclxuLy8gU2V0IHN1Z2dlc3Rpb24uIHBhcmFtOiBPYmplY3RbXSB3aXRoIG9iamVjdHMgb2YgdGhlIGZvcm0geyBkYXRhOiAuLi4gLCBsYWJlbDogLi4uIH1cclxuU3VnZ2VzdGlvbkxvb2t1cFRleHRJbnB1dFdpZGdldC5wcm90b3R5cGUuc2V0U3VnZ2VzdGlvbnMgPSBmdW5jdGlvbihzdWdnZXN0aW9ucykge1xyXG5cdGlmICghQXJyYXkuaXNBcnJheShzdWdnZXN0aW9ucykpIHtcclxuXHRcdGlmIChzdWdnZXN0aW9ucyAhPSBudWxsKSB7XHJcblx0XHRcdGNvbnNvbGUud2FybihcIltSYXRlcl0gU3VnZ2VzdGlvbkxvb2t1cFRleHRJbnB1dFdpZGdldC5wcm90b3R5cGUuc2V0U3VnZ2VzdGlvbnMgY2FsbGVkIHdpdGggYSBub24tYXJyYXkgdmFsdWU6XCIsIHN1Z2dlc3Rpb25zKTtcclxuXHRcdH1cclxuXHRcdHJldHVybjtcclxuXHR9XHJcblx0dGhpcy5zdWdnZXN0aW9ucyA9IHN1Z2dlc3Rpb25zO1xyXG59O1xyXG5cclxuLy8gUmV0dXJucyBkYXRhLCBhcyBhIHJlc29sdXRpb24gdG8gYSBwcm9taXNlLCB0byBiZSBwYXNzZWQgdG8gI2dldExvb2t1cE1lbnVPcHRpb25zRnJvbURhdGFcclxuU3VnZ2VzdGlvbkxvb2t1cFRleHRJbnB1dFdpZGdldC5wcm90b3R5cGUuZ2V0TG9va3VwUmVxdWVzdCA9IGZ1bmN0aW9uICgpIHtcclxuXHR2YXIgZGVmZXJyZWQgPSAkLkRlZmVycmVkKCkucmVzb2x2ZShuZXcgUmVnRXhwKFwiXFxcXGJcIiArIG13LnV0aWwuZXNjYXBlUmVnRXhwKHRoaXMuZ2V0VmFsdWUoKSksIFwiaVwiKSk7XHJcblx0cmV0dXJuIGRlZmVycmVkLnByb21pc2UoIHsgYWJvcnQ6IGZ1bmN0aW9uICgpIHt9IH0gKTtcclxufTtcclxuXHJcbi8vID8/P1xyXG5TdWdnZXN0aW9uTG9va3VwVGV4dElucHV0V2lkZ2V0LnByb3RvdHlwZS5nZXRMb29rdXBDYWNoZURhdGFGcm9tUmVzcG9uc2UgPSBmdW5jdGlvbiAoIHJlc3BvbnNlICkge1xyXG5cdHJldHVybiByZXNwb25zZSB8fCBbXTtcclxufTtcclxuXHJcbi8vIElzIHBhc3NlZCBkYXRhIGZyb20gI2dldExvb2t1cFJlcXVlc3QsIHJldHVybnMgYW4gYXJyYXkgb2YgbWVudSBpdGVtIHdpZGdldHMgXHJcblN1Z2dlc3Rpb25Mb29rdXBUZXh0SW5wdXRXaWRnZXQucHJvdG90eXBlLmdldExvb2t1cE1lbnVPcHRpb25zRnJvbURhdGEgPSBmdW5jdGlvbiAoIHBhdHRlcm4gKSB7XHJcblx0dmFyIGxhYmVsTWF0Y2hlc0lucHV0VmFsID0gZnVuY3Rpb24oc3VnZ2VzdGlvbkl0ZW0pIHtcclxuXHRcdHJldHVybiBwYXR0ZXJuLnRlc3Qoc3VnZ2VzdGlvbkl0ZW0ubGFiZWwpIHx8ICggIXN1Z2dlc3Rpb25JdGVtLmxhYmVsICYmIHBhdHRlcm4udGVzdChzdWdnZXN0aW9uSXRlbS5kYXRhKSApO1xyXG5cdH07XHJcblx0dmFyIG1ha2VNZW51T3B0aW9uV2lkZ2V0ID0gZnVuY3Rpb24ob3B0aW9uSXRlbSkge1xyXG5cdFx0cmV0dXJuIG5ldyBPTy51aS5NZW51T3B0aW9uV2lkZ2V0KCB7XHJcblx0XHRcdGRhdGE6IG9wdGlvbkl0ZW0uZGF0YSxcclxuXHRcdFx0bGFiZWw6IG9wdGlvbkl0ZW0ubGFiZWwgfHwgb3B0aW9uSXRlbS5kYXRhXHJcblx0XHR9ICk7XHJcblx0fTtcclxuXHRyZXR1cm4gdGhpcy5zdWdnZXN0aW9ucy5maWx0ZXIobGFiZWxNYXRjaGVzSW5wdXRWYWwpLm1hcChtYWtlTWVudU9wdGlvbldpZGdldCk7XHJcbn07XHJcblxyXG4vLyBFeHRlbmQgb25Mb29rdXBNZW51Q2hvb3NlIG1ldGhvZCB0byBlbWl0IGFuIGNob29zZSBldmVudFxyXG5TdWdnZXN0aW9uTG9va3VwVGV4dElucHV0V2lkZ2V0LnByb3RvdHlwZS5vbkxvb2t1cE1lbnVDaG9vc2UgPSBmdW5jdGlvbiAoIGl0ZW0gKSB7XHJcblx0Ly8gR2V0IGRhdGFcclxuXHRjb25zdCBpdGVtRGF0YSA9IGl0ZW0uZ2V0RGF0YSgpO1xyXG5cdC8vIFNpbXBsaWZ5IGl0ZW0gZGF0YSBpZiBpdCBpcyBhbiBvYmplY3Qgd2l0aCBhIG5hbWUgcHJvcGVydHlcclxuXHRpZiAoaXRlbURhdGEgJiYgaXRlbURhdGEubmFtZSkge1xyXG5cdFx0aXRlbS5zZXREYXRhKGl0ZW1EYXRhLm5hbWUpO1xyXG5cdH1cclxuXHQvLyBGaXJzdCBibHVyIHRoZSBpbnB1dCwgdG8gcHJldmVudCB0aGUgbWVudSBwb3BwaW5nIGJhY2sgdXBcclxuXHR0aGlzLiRpbnB1dC5ibHVyKCk7XHJcblx0T08udWkubWl4aW4uTG9va3VwRWxlbWVudC5wcm90b3R5cGUub25Mb29rdXBNZW51Q2hvb3NlLmNhbGwodGhpcywgaXRlbSk7XHJcblx0dGhpcy5lbWl0KFwiY2hvb3NlXCIsIGl0ZW1EYXRhICk7XHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBTdWdnZXN0aW9uTG9va3VwVGV4dElucHV0V2lkZ2V0O1xyXG4vLyA8L25vd2lraT4iLCJpbXBvcnQgYXBwQ29uZmlnIGZyb20gXCIuLi8uLi9jb25maWdcIjtcclxuaW1wb3J0IFN1Z2dlc3Rpb25Mb29rdXBUZXh0SW5wdXRXaWRnZXQgZnJvbSBcIi4vU3VnZ2VzdGlvbkxvb2t1cFRleHRJbnB1dFdpZGdldFwiO1xyXG5pbXBvcnQge2dldEJhbm5lck5hbWVzfSBmcm9tIFwiLi4vLi4vZ2V0QmFubmVyc1wiO1xyXG4vLyA8bm93aWtpPlxyXG5cclxuZnVuY3Rpb24gVG9wQmFyV2lkZ2V0KCBjb25maWcgKSB7XHJcblx0Ly8gQ29uZmlndXJhdGlvbiBpbml0aWFsaXphdGlvblxyXG5cdGNvbmZpZyA9ICQuZXh0ZW5kKFxyXG5cdFx0e1xyXG5cdFx0XHRleHBhbmRlZDogZmFsc2UsXHJcblx0XHRcdGZyYW1lZDogZmFsc2UsXHJcblx0XHRcdHBhZGRlZDogZmFsc2VcclxuXHRcdH0sXHJcblx0XHRjb25maWcgfHwge31cclxuXHQpO1xyXG5cdC8vIENhbGwgcGFyZW50IGNvbnN0cnVjdG9yXHJcblx0VG9wQmFyV2lkZ2V0LnN1cGVyLmNhbGwoIHRoaXMsIGNvbmZpZyApO1xyXG5cdHRoaXMuJG92ZXJsYXkgPSBjb25maWcuJG92ZXJsYXk7XHJcbiAgICBcclxuXHQvLyBTZWFyY2ggYm94XHJcblx0dGhpcy5zZWFyY2hCb3ggPSBuZXcgU3VnZ2VzdGlvbkxvb2t1cFRleHRJbnB1dFdpZGdldCgge1xyXG5cdFx0cGxhY2Vob2xkZXI6IFwiQWRkIGEgV2lraVByb2plY3QuLi5cIixcclxuXHRcdCRlbGVtZW50OiAkKFwiPGRpdiBzdHlsZT0nZGlzcGxheTppbmxpbmUtYmxvY2s7IG1hcmdpbjowIC0xcHg7IHdpZHRoOmNhbGMoMTAwJSAtIDU1cHgpOyc+XCIpLFxyXG5cdFx0JG92ZXJsYXk6IHRoaXMuJG92ZXJsYXksXHJcblx0fSApO1xyXG5cdGdldEJhbm5lck5hbWVzKClcclxuXHRcdC50aGVuKGJhbm5lcnMgPT4gW1xyXG5cdFx0XHQuLi5iYW5uZXJzLndpdGhSYXRpbmdzLm1hcChiYW5uZXJOYW1lID0+ICh7XHJcblx0XHRcdFx0bGFiZWw6IGJhbm5lck5hbWUucmVwbGFjZShcIldpa2lQcm9qZWN0IFwiLCBcIlwiKSxcclxuXHRcdFx0XHRkYXRhOiB7XHJcblx0XHRcdFx0XHRuYW1lOiBiYW5uZXJOYW1lXHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KSksXHJcblx0XHRcdC4uLmJhbm5lcnMud2l0aG91dFJhdGluZ3MubWFwKGJhbm5lck5hbWUgPT4gKHtcclxuXHRcdFx0XHRsYWJlbDogYmFubmVyTmFtZS5yZXBsYWNlKFwiV2lraVByb2plY3QgXCIsIFwiXCIpLFxyXG5cdFx0XHRcdGRhdGE6IHtcclxuXHRcdFx0XHRcdG5hbWU6IGJhbm5lck5hbWUsXHJcblx0XHRcdFx0XHR3aXRob3V0UmF0aW5nczogdHJ1ZVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSkpLFxyXG5cdFx0XHQuLi5iYW5uZXJzLndyYXBwZXJzLm1hcChiYW5uZXJOYW1lID0+ICh7XHJcblx0XHRcdFx0bGFiZWw6IGJhbm5lck5hbWUucmVwbGFjZShcIldpa2lQcm9qZWN0IFwiLCBcIlwiKSArIFwiIFt0ZW1wbGF0ZSB3cmFwcGVyXVwiLFxyXG5cdFx0XHRcdGRhdGE6IHtcclxuXHRcdFx0XHRcdG5hbWU6IGJhbm5lck5hbWUsXHJcblx0XHRcdFx0XHR3cmFwcGVyOiB0cnVlXHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KSksXHJcblx0XHRcdC4uLmJhbm5lcnMubm90V1BCTS5tYXAoYmFubmVyTmFtZSA9PiAoe1xyXG5cdFx0XHRcdGxhYmVsOiBiYW5uZXJOYW1lLnJlcGxhY2UoXCJXaWtpUHJvamVjdCBcIiwgXCJcIiksXHJcblx0XHRcdFx0ZGF0YToge1xyXG5cdFx0XHRcdFx0bmFtZTogYmFubmVyTmFtZVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSkpLFxyXG5cdFx0XHQuLi5iYW5uZXJzLmluYWN0aXZlLm1hcChiYW5uZXJOYW1lID0+ICh7XHJcblx0XHRcdFx0bGFiZWw6IGJhbm5lck5hbWUucmVwbGFjZShcIldpa2lQcm9qZWN0IFwiLCBcIlwiKSArIFwiIFtpbmFjdGl2ZV1cIixcclxuXHRcdFx0XHRkYXRhOiB7XHJcblx0XHRcdFx0XHRuYW1lOiBiYW5uZXJOYW1lLFxyXG5cdFx0XHRcdFx0d2l0aG91dFJhdGluZ3M6IHRydWVcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pKSxcclxuXHRcdFx0Li4uYmFubmVycy53aXIubWFwKGJhbm5lck5hbWUgPT4gKHtcclxuXHRcdFx0XHRsYWJlbDogYmFubmVyTmFtZSArIFwiIFtXb21lbiBJbiBSZWQgbWVldHVwL2luaXRpYXRpdmVdXCIsXHJcblx0XHRcdFx0ZGF0YToge1xyXG5cdFx0XHRcdFx0bmFtZTogYmFubmVyTmFtZSxcclxuXHRcdFx0XHRcdHdpdGhvdXRSYXRpbmdzOiB0cnVlXHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KSlcclxuXHRcdF0pXHJcblx0XHQudGhlbihiYW5uZXJPcHRpb25zID0+IHRoaXMuc2VhcmNoQm94LnNldFN1Z2dlc3Rpb25zKGJhbm5lck9wdGlvbnMpKTtcclxuICAgIFxyXG5cdC8vIEFkZCBidXR0b25cclxuXHR0aGlzLmFkZEJhbm5lckJ1dHRvbiA9IG5ldyBPTy51aS5CdXR0b25XaWRnZXQoIHtcclxuXHRcdGljb246IFwiYWRkXCIsXHJcblx0XHR0aXRsZTogXCJBZGRcIixcclxuXHRcdGZsYWdzOiBcInByb2dyZXNzaXZlXCIsXHJcblx0XHQkZWxlbWVudDogJChcIjxzcGFuIHN0eWxlPSdmbG9hdDpyaWdodDttYXJnaW46IDA7dHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0xMnB4KTsnPlwiKSxcclxuXHR9ICk7XHJcblx0dmFyICRzZWFyY2hDb250YWluZXIgPSAkKFwiPGRpdiBzdHlsZT0nZGlzcGxheTppbmxpbmUtYmxvY2s7IGZsZXgtc2hyaW5rOjE7IGZsZXgtZ3JvdzoxMDA7IG1pbi13aWR0aDoyNTBweDsgd2lkdGg6NTAlOyc+XCIpXHJcblx0XHQuYXBwZW5kKHRoaXMuc2VhcmNoQm94LiRlbGVtZW50LCB0aGlzLmFkZEJhbm5lckJ1dHRvbi4kZWxlbWVudCk7XHJcblxyXG5cdC8vIFNldCBhbGwgY2xhc3Nlcy9pbXBvcnRhbmNlc1xyXG5cdC8vIGluIHRoZSBzdHlsZSBvZiBhIHBvcHVwIGJ1dHRvbiB3aXRoIGEgbWVudSAoaXMgYWN0dWFsbHkgYSBkcm9wZG93biB3aXRoIGEgaGlkZGVuIGxhYmVsLCBiZWNhdXNlIHRoYXQgbWFrZXMgdGhlIGNvZGluZyBlYXNpZXIuKVxyXG5cdHRoaXMuc2V0QWxsRHJvcERvd24gPSBuZXcgT08udWkuRHJvcGRvd25XaWRnZXQoIHtcclxuXHRcdGljb246IFwidGFnXCIsXHJcblx0XHRsYWJlbDogXCJTZXQgYWxsLi4uXCIsXHJcblx0XHRpbnZpc2libGVMYWJlbDogdHJ1ZSxcclxuXHRcdG1lbnU6IHtcclxuXHRcdFx0aXRlbXM6IFtcclxuXHRcdFx0XHRuZXcgT08udWkuTWVudVNlY3Rpb25PcHRpb25XaWRnZXQoIHtcclxuXHRcdFx0XHRcdGxhYmVsOiBcIkNsYXNzZXNcIlxyXG5cdFx0XHRcdH0gKSxcclxuXHRcdFx0XHRuZXcgT08udWkuTWVudU9wdGlvbldpZGdldCgge1xyXG5cdFx0XHRcdFx0ZGF0YToge2NsYXNzOiBudWxsfSxcclxuXHRcdFx0XHRcdGxhYmVsOiBuZXcgT08udWkuSHRtbFNuaXBwZXQoXCI8c3BhbiBzdHlsZT1cXFwiY29sb3I6Izc3N1xcXCI+KG5vIGNsYXNzKTwvc3Bhbj5cIilcclxuXHRcdFx0XHR9ICksXHJcblx0XHRcdFx0Li4uYXBwQ29uZmlnLmJhbm5lckRlZmF1bHRzLmNsYXNzZXMubWFwKGNsYXNzbmFtZSA9PiBuZXcgT08udWkuTWVudU9wdGlvbldpZGdldCgge1xyXG5cdFx0XHRcdFx0ZGF0YToge2NsYXNzOiBjbGFzc25hbWV9LFxyXG5cdFx0XHRcdFx0bGFiZWw6IGNsYXNzbmFtZVxyXG5cdFx0XHRcdH0gKVxyXG5cdFx0XHRcdCksXHJcblx0XHRcdFx0bmV3IE9PLnVpLk1lbnVTZWN0aW9uT3B0aW9uV2lkZ2V0KCB7XHJcblx0XHRcdFx0XHRsYWJlbDogXCJJbXBvcnRhbmNlc1wiXHJcblx0XHRcdFx0fSApLFxyXG5cdFx0XHRcdG5ldyBPTy51aS5NZW51T3B0aW9uV2lkZ2V0KCB7XHJcblx0XHRcdFx0XHRkYXRhOiB7aW1wb3J0YW5jZTogbnVsbH0sXHJcblx0XHRcdFx0XHRsYWJlbDogbmV3IE9PLnVpLkh0bWxTbmlwcGV0KFwiPHNwYW4gc3R5bGU9XFxcImNvbG9yOiM3NzdcXFwiPihubyBpbXBvcnRhbmNlKTwvc3Bhbj5cIilcclxuXHRcdFx0XHR9ICksXHJcblx0XHRcdFx0Li4uYXBwQ29uZmlnLmJhbm5lckRlZmF1bHRzLmltcG9ydGFuY2VzLm1hcChpbXBvcnRhbmNlID0+IG5ldyBPTy51aS5NZW51T3B0aW9uV2lkZ2V0KCB7XHJcblx0XHRcdFx0XHRkYXRhOiB7aW1wb3J0YW5jZTogaW1wb3J0YW5jZX0sXHJcblx0XHRcdFx0XHRsYWJlbDogaW1wb3J0YW5jZVxyXG5cdFx0XHRcdH0gKVxyXG5cdFx0XHRcdClcclxuXHRcdFx0XVxyXG5cdFx0fSxcclxuXHRcdCRlbGVtZW50OiAkKFwiPHNwYW4gc3R5bGU9XFxcIndpZHRoOmF1dG87ZGlzcGxheTppbmxpbmUtYmxvY2s7ZmxvYXQ6bGVmdDttYXJnaW46MFxcXCIgdGl0bGU9J1NldCBhbGwuLi4nPlwiKSxcclxuXHRcdCRvdmVybGF5OiB0aGlzLiRvdmVybGF5LFxyXG5cdH0gKTtcclxuXHJcblx0Ly8gUmVtb3ZlIGFsbCBiYW5uZXJzIGJ1dHRvblxyXG5cdHRoaXMucmVtb3ZlQWxsQnV0dG9uID0gbmV3IE9PLnVpLkJ1dHRvbldpZGdldCgge1xyXG5cdFx0aWNvbjogXCJ0cmFzaFwiLFxyXG5cdFx0dGl0bGU6IFwiUmVtb3ZlIGFsbFwiLFxyXG5cdFx0ZmxhZ3M6IFwiZGVzdHJ1Y3RpdmVcIlxyXG5cdH0gKTtcclxuXHJcblx0Ly8gQ2xlYXIgYWxsIHBhcmFtZXRlcnMgYnV0dG9uXHJcblx0dGhpcy5jbGVhckFsbEJ1dHRvbiA9IG5ldyBPTy51aS5CdXR0b25XaWRnZXQoIHtcclxuXHRcdGljb246IFwiY2FuY2VsXCIsXHJcblx0XHR0aXRsZTogXCJDbGVhciBhbGxcIixcclxuXHRcdGZsYWdzOiBcImRlc3RydWN0aXZlXCJcclxuXHR9ICk7XHJcblxyXG5cdC8vIEdyb3VwIHRoZSBidXR0b25zIHRvZ2V0aGVyXHJcblx0dGhpcy5tZW51QnV0dG9ucyA9IG5ldyBPTy51aS5CdXR0b25Hcm91cFdpZGdldCgge1xyXG5cdFx0aXRlbXM6IFtcclxuXHRcdFx0dGhpcy5yZW1vdmVBbGxCdXR0b24sXHJcblx0XHRcdHRoaXMuY2xlYXJBbGxCdXR0b25cclxuXHRcdF0sXHJcblx0XHQkZWxlbWVudDogJChcIjxzcGFuIHN0eWxlPSdmbGV4OjEgMCBhdXRvOyc+XCIpLFxyXG5cdH0gKTtcclxuXHQvLyBJbmNsdWRlIHRoZSBkcm9wZG93biBpbiB0aGUgZ3JvdXBcclxuXHR0aGlzLm1lbnVCdXR0b25zLiRlbGVtZW50LnByZXBlbmQodGhpcy5zZXRBbGxEcm9wRG93bi4kZWxlbWVudCk7XHJcblxyXG5cdC8vIFB1dCBldmVyeXRoaW5nIGludG8gYSBsYXlvdXRcclxuXHR0aGlzLiRlbGVtZW50LmFkZENsYXNzKFwicmF0ZXItdG9wQmFyV2lkZ2V0XCIpXHJcblx0XHQuY3NzKHtcclxuXHRcdFx0XCJwb3NpdGlvblwiOiBcImZpeGVkXCIsXHJcblx0XHRcdFwid2lkdGhcIjogXCIxMDAlXCIsXHJcblx0XHRcdFwiYmFja2dyb3VuZFwiOiBcIiNjY2NcIixcclxuXHRcdFx0XCJkaXNwbGF5XCI6IFwiZmxleFwiLFxyXG5cdFx0XHRcImZsZXgtd3JhcFwiOiBcIndyYXBcIixcclxuXHRcdFx0XCJqdXN0aWZ5LWNvbnRlbnRcIjogXCJzcGFjZS1hcm91bmRcIixcclxuXHRcdFx0XCJtYXJnaW5cIjogXCItMnB4IDAgMCAwXCJcclxuXHRcdH0pXHJcblx0XHQuYXBwZW5kKFxyXG5cdFx0XHQkc2VhcmNoQ29udGFpbmVyLFxyXG5cdFx0XHR0aGlzLm1lbnVCdXR0b25zLiRlbGVtZW50XHJcblx0XHQpO1xyXG5cclxuXHQvKiAtLS0gRXZlbnQgaGFuZGxpbmcgLS0tICovXHJcbiAgICBcclxuXHR0aGlzLnNlYXJjaEJveC5jb25uZWN0KHRoaXMsIHtcclxuXHRcdFwiZW50ZXJcIjogXCJvblNlYXJjaFNlbGVjdFwiLFxyXG5cdFx0XCJjaG9vc2VcIjogXCJvblNlYXJjaFNlbGVjdFwiXHJcblx0fSk7XHJcblx0dGhpcy5hZGRCYW5uZXJCdXR0b24uY29ubmVjdCh0aGlzLCB7XCJjbGlja1wiOiBcIm9uU2VhcmNoU2VsZWN0XCJ9KTtcclxuXHR0aGlzLnNldEFsbERyb3BEb3duLmdldE1lbnUoKS5jb25uZWN0KHRoaXMsIHtcImNob29zZVwiOiBcIm9uUmF0aW5nQ2hvb3NlXCJ9KTtcclxuXHR0aGlzLnJlbW92ZUFsbEJ1dHRvbi5jb25uZWN0KHRoaXMsIHtcImNsaWNrXCI6IFwib25SZW1vdmVBbGxDbGlja1wifSk7XHJcblx0dGhpcy5jbGVhckFsbEJ1dHRvbi5jb25uZWN0KHRoaXMsIHtcImNsaWNrXCI6IFwib25DbGVhckFsbENsaWNrXCJ9KTtcclxufVxyXG5PTy5pbmhlcml0Q2xhc3MoIFRvcEJhcldpZGdldCwgT08udWkuUGFuZWxMYXlvdXQgKTtcclxuXHJcblRvcEJhcldpZGdldC5wcm90b3R5cGUub25TZWFyY2hTZWxlY3QgPSBmdW5jdGlvbihkYXRhKSB7XHJcblx0dGhpcy5lbWl0KFwic2VhcmNoU2VsZWN0XCIsIGRhdGEpO1xyXG59O1xyXG5cclxuVG9wQmFyV2lkZ2V0LnByb3RvdHlwZS5vblJhdGluZ0Nob29zZSA9IGZ1bmN0aW9uKGl0ZW0pIHtcclxuXHRjb25zdCBkYXRhID0gaXRlbS5nZXREYXRhKCk7XHJcblx0aWYgKGRhdGEuY2xhc3MgfHwgZGF0YS5jbGFzcz09PW51bGwpIHtcclxuXHRcdHRoaXMuZW1pdChcInNldENsYXNzZXNcIiwgZGF0YS5jbGFzcyk7XHJcblx0fVxyXG5cdGlmIChkYXRhLmltcG9ydGFuY2UgfHwgZGF0YS5pbXBvcnRhbmNlPT09bnVsbCkge1xyXG5cdFx0dGhpcy5lbWl0KFwic2V0SW1wb3J0YW5jZXNcIiwgZGF0YS5pbXBvcnRhbmNlKTtcclxuXHR9XHJcbn07XHJcblxyXG5Ub3BCYXJXaWRnZXQucHJvdG90eXBlLm9uUmVtb3ZlQWxsQ2xpY2sgPSBmdW5jdGlvbigpIHtcclxuXHR0aGlzLmVtaXQoXCJyZW1vdmVBbGxcIik7XHJcbn07XHJcblxyXG5Ub3BCYXJXaWRnZXQucHJvdG90eXBlLm9uQ2xlYXJBbGxDbGljayA9IGZ1bmN0aW9uKCkge1xyXG5cdHRoaXMuZW1pdChcImNsZWFyQWxsXCIpO1xyXG59O1xyXG5cclxuVG9wQmFyV2lkZ2V0LnByb3RvdHlwZS5zZXREaXNhYmxlZCA9IGZ1bmN0aW9uKGRpc2FibGUpIHtcclxuXHRbXHJcblx0XHR0aGlzLnNlYXJjaEJveCxcclxuXHRcdHRoaXMuYWRkQmFubmVyQnV0dG9uLFxyXG5cdFx0dGhpcy5zZXRBbGxEcm9wRG93bixcclxuXHRcdHRoaXMucmVtb3ZlQWxsQnV0dG9uLFxyXG5cdFx0dGhpcy5jbGVhckFsbEJ1dHRvblxyXG5cdF0uZm9yRWFjaCh3aWRnZXQgPT4gd2lkZ2V0LnNldERpc2FibGVkKGRpc2FibGUpKTtcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IFRvcEJhcldpZGdldDtcclxuLy8gPC9ub3dpa2k+IiwiaW1wb3J0IHsgbWFrZUVycm9yTXNnIH0gZnJvbSBcIi4uL2FwaVwiO1xyXG4vLyA8bm93aWtpPlxyXG5cclxuLyogdmFyIGluY3JlbWVudFByb2dyZXNzQnlJbnRlcnZhbCA9IGZ1bmN0aW9uKCkge1xyXG5cdHZhciBpbmNyZW1lbnRJbnRlcnZhbERlbGF5ID0gMTAwO1xyXG5cdHZhciBpbmNyZW1lbnRJbnRlcnZhbEFtb3VudCA9IDAuMTtcclxuXHR2YXIgaW5jcmVtZW50SW50ZXJ2YWxNYXh2YWwgPSA5ODtcclxuXHRyZXR1cm4gd2luZG93LnNldEludGVydmFsKFxyXG5cdFx0aW5jcmVtZW50UHJvZ3Jlc3MsXHJcblx0XHRpbmNyZW1lbnRJbnRlcnZhbERlbGF5LFxyXG5cdFx0aW5jcmVtZW50SW50ZXJ2YWxBbW91bnQsXHJcblx0XHRpbmNyZW1lbnRJbnRlcnZhbE1heHZhbFxyXG5cdCk7XHJcbn07ICovXHJcblxyXG52YXIgTG9hZERpYWxvZyA9IGZ1bmN0aW9uIExvYWREaWFsb2coIGNvbmZpZyApIHtcclxuXHRMb2FkRGlhbG9nLnN1cGVyLmNhbGwoIHRoaXMsIGNvbmZpZyApO1xyXG59O1xyXG5PTy5pbmhlcml0Q2xhc3MoIExvYWREaWFsb2csIE9PLnVpLkRpYWxvZyApOyBcclxuXHJcbkxvYWREaWFsb2cuc3RhdGljLm5hbWUgPSBcImxvYWREaWFsb2dcIjtcclxuTG9hZERpYWxvZy5zdGF0aWMudGl0bGUgPSBcIkxvYWRpbmcgUmF0ZXIuLi5cIjtcclxuXHJcbi8vIEN1c3RvbWl6ZSB0aGUgaW5pdGlhbGl6ZSgpIGZ1bmN0aW9uOiBUaGlzIGlzIHdoZXJlIHRvIGFkZCBjb250ZW50IHRvIHRoZSBkaWFsb2cgYm9keSBhbmQgc2V0IHVwIGV2ZW50IGhhbmRsZXJzLlxyXG5Mb2FkRGlhbG9nLnByb3RvdHlwZS5pbml0aWFsaXplID0gZnVuY3Rpb24gKCkge1xyXG5cdC8vIENhbGwgdGhlIHBhcmVudCBtZXRob2QuXHJcblx0TG9hZERpYWxvZy5zdXBlci5wcm90b3R5cGUuaW5pdGlhbGl6ZS5jYWxsKCB0aGlzICk7XHJcblx0Ly8gQ3JlYXRlIGEgbGF5b3V0XHJcblx0dGhpcy5jb250ZW50ID0gbmV3IE9PLnVpLlBhbmVsTGF5b3V0KCB7IFxyXG5cdFx0cGFkZGVkOiB0cnVlLFxyXG5cdFx0ZXhwYW5kZWQ6IGZhbHNlIFxyXG5cdH0gKTtcclxuXHQvLyBDcmVhdGUgY29udGVudFxyXG5cdHRoaXMucHJvZ3Jlc3NCYXIgPSBuZXcgT08udWkuUHJvZ3Jlc3NCYXJXaWRnZXQoIHtcclxuXHRcdHByb2dyZXNzOiAxXHJcblx0fSApO1xyXG5cdHRoaXMuc2V0dXB0YXNrcyA9IFtcclxuXHRcdG5ldyBPTy51aS5MYWJlbFdpZGdldCgge1xyXG5cdFx0XHRsYWJlbDogXCJMb2FkaW5nIHlvdXIgUmF0ZXIgcHJlZmVyZW5jZXMuLi5cIixcclxuXHRcdFx0JGVsZW1lbnQ6ICQoXCI8cCBzdHlsZT1cXFwiZGlzcGxheTpibG9ja1xcXCI+XCIpXHJcblx0XHR9KSxcclxuXHRcdG5ldyBPTy51aS5MYWJlbFdpZGdldCgge1xyXG5cdFx0XHRsYWJlbDogXCJMb2FkaW5nIGxpc3Qgb2YgcHJvamVjdCBiYW5uZXJzLi4uXCIsXHJcblx0XHRcdCRlbGVtZW50OiAkKFwiPHAgc3R5bGU9XFxcImRpc3BsYXk6YmxvY2tcXFwiPlwiKVxyXG5cdFx0fSksXHJcblx0XHRuZXcgT08udWkuTGFiZWxXaWRnZXQoIHtcclxuXHRcdFx0bGFiZWw6IFwiTG9hZGluZyB0YWxrcGFnZSB3aWtpdGV4dC4uLlwiLFxyXG5cdFx0XHQkZWxlbWVudDogJChcIjxwIHN0eWxlPVxcXCJkaXNwbGF5OmJsb2NrXFxcIj5cIilcclxuXHRcdH0pLFxyXG5cdFx0bmV3IE9PLnVpLkxhYmVsV2lkZ2V0KCB7XHJcblx0XHRcdGxhYmVsOiBcIlBhcnNpbmcgdGFsa3BhZ2UgdGVtcGxhdGVzLi4uXCIsXHJcblx0XHRcdCRlbGVtZW50OiAkKFwiPHAgc3R5bGU9XFxcImRpc3BsYXk6YmxvY2tcXFwiPlwiKVxyXG5cdFx0fSksXHJcblx0XHRuZXcgT08udWkuTGFiZWxXaWRnZXQoIHtcclxuXHRcdFx0bGFiZWw6IFwiR2V0dGluZyB0ZW1wbGF0ZXMnIHBhcmFtZXRlciBkYXRhLi4uXCIsXHJcblx0XHRcdCRlbGVtZW50OiAkKFwiPHAgc3R5bGU9XFxcImRpc3BsYXk6YmxvY2tcXFwiPlwiKVxyXG5cdFx0fSksXHJcblx0XHRuZXcgT08udWkuTGFiZWxXaWRnZXQoIHtcclxuXHRcdFx0bGFiZWw6IFwiQ2hlY2tpbmcgc3ViamVjdCBwYWdlLi4uXCIsXHJcblx0XHRcdCRlbGVtZW50OiAkKFwiPHAgc3R5bGU9XFxcImRpc3BsYXk6YmxvY2tcXFwiPlwiKVxyXG5cdFx0fSksXHJcblx0XHRuZXcgT08udWkuTGFiZWxXaWRnZXQoIHtcclxuXHRcdFx0bGFiZWw6IFwiUmV0cmlldmluZyBxdWFsaXR5IHByZWRpY3Rpb24uLi5cIixcclxuXHRcdFx0JGVsZW1lbnQ6ICQoXCI8cCBzdHlsZT1cXFwiZGlzcGxheTpibG9ja1xcXCI+XCIpXHJcblx0XHR9KS50b2dnbGUoKSxcclxuXHRdO1xyXG5cdHRoaXMuY2xvc2VCdXR0b24gPSBuZXcgT08udWkuQnV0dG9uV2lkZ2V0KCB7XHJcblx0XHRsYWJlbDogXCJDbG9zZVwiXHJcblx0fSkudG9nZ2xlKCk7XHJcblx0dGhpcy5zZXR1cFByb21pc2VzID0gW107XHJcblxyXG5cdC8vIEFwcGVuZCBjb250ZW50IHRvIGxheW91dFxyXG5cdHRoaXMuY29udGVudC4kZWxlbWVudC5hcHBlbmQoXHJcblx0XHR0aGlzLnByb2dyZXNzQmFyLiRlbGVtZW50LFxyXG5cdFx0KG5ldyBPTy51aS5MYWJlbFdpZGdldCgge1xyXG5cdFx0XHRsYWJlbDogXCJJbml0aWFsaXNpbmc6XCIsXHJcblx0XHRcdCRlbGVtZW50OiAkKFwiPHN0cm9uZyBzdHlsZT1cXFwiZGlzcGxheTpibG9ja1xcXCI+XCIpXHJcblx0XHR9KSkuJGVsZW1lbnQsXHJcblx0XHQuLi50aGlzLnNldHVwdGFza3MubWFwKHdpZGdldCA9PiB3aWRnZXQuJGVsZW1lbnQpLFxyXG5cdFx0dGhpcy5jbG9zZUJ1dHRvbi4kZWxlbWVudFxyXG5cdCk7XHJcblxyXG5cdC8vIEFwcGVuZCBsYXlvdXQgdG8gZGlhbG9nXHJcblx0dGhpcy4kYm9keS5hcHBlbmQoIHRoaXMuY29udGVudC4kZWxlbWVudCApO1xyXG5cclxuXHQvLyBDb25uZWN0IGV2ZW50cyB0byBoYW5kbGVyc1xyXG5cdHRoaXMuY2xvc2VCdXR0b24uY29ubmVjdCggdGhpcywgeyBcImNsaWNrXCI6IFwib25DbG9zZUJ1dHRvbkNsaWNrXCIgfSApO1xyXG59O1xyXG5cclxuTG9hZERpYWxvZy5wcm90b3R5cGUub25DbG9zZUJ1dHRvbkNsaWNrID0gZnVuY3Rpb24oKSB7XHJcblx0Ly8gQ2xvc2UgdGhpcyBkaWFsb2csIHdpdGhvdXQgcGFzc2luZyBhbnkgZGF0YVxyXG5cdHRoaXMuY2xvc2UoKTtcclxufTtcclxuXHJcbi8vIE92ZXJyaWRlIHRoZSBnZXRCb2R5SGVpZ2h0KCkgbWV0aG9kIHRvIHNwZWNpZnkgYSBjdXN0b20gaGVpZ2h0IChvciBkb24ndCB0byB1c2UgdGhlIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGhlaWdodCkuXHJcbkxvYWREaWFsb2cucHJvdG90eXBlLmdldEJvZHlIZWlnaHQgPSBmdW5jdGlvbiAoKSB7XHJcblx0cmV0dXJuIHRoaXMuY29udGVudC4kZWxlbWVudC5vdXRlckhlaWdodCggdHJ1ZSApO1xyXG59O1xyXG5cclxuTG9hZERpYWxvZy5wcm90b3R5cGUuaW5jcmVtZW50UHJvZ3Jlc3MgPSBmdW5jdGlvbihhbW91bnQsIG1heGltdW0pIHtcclxuXHR2YXIgcHJpb3JQcm9ncmVzcyA9IHRoaXMucHJvZ3Jlc3NCYXIuZ2V0UHJvZ3Jlc3MoKTtcclxuXHR2YXIgaW5jcmVtZW50ZWRQcm9ncmVzcyA9IE1hdGgubWluKG1heGltdW0gfHwgMTAwLCBwcmlvclByb2dyZXNzICsgYW1vdW50KTtcclxuXHR0aGlzLnByb2dyZXNzQmFyLnNldFByb2dyZXNzKGluY3JlbWVudGVkUHJvZ3Jlc3MpO1xyXG59O1xyXG5cclxuTG9hZERpYWxvZy5wcm90b3R5cGUuYWRkVGFza1Byb21pc2VIYW5kbGVycyA9IGZ1bmN0aW9uKHRhc2tQcm9taXNlcykge1xyXG5cdHZhciBvblRhc2tEb25lID0gaW5kZXggPT4ge1xyXG5cdFx0Ly8gQWRkIFwiRG9uZSFcIiB0byBsYWJlbFxyXG5cdFx0dmFyIHdpZGdldCA9IHRoaXMuc2V0dXB0YXNrc1tpbmRleF07XHJcblx0XHR3aWRnZXQuc2V0TGFiZWwod2lkZ2V0LmdldExhYmVsKCkgKyBcIiBEb25lIVwiKTtcclxuXHRcdC8vIEluY3JlbWVudCBzdGF0dXMgYmFyLiBTaG93IGEgc21vb3RoIHRyYW5zaXRpb24gYnlcclxuXHRcdC8vIHVzaW5nIHNtYWxsIHN0ZXBzIG92ZXIgYSBzaG9ydCBkdXJhdGlvbi5cclxuXHRcdHZhciB0b3RhbEluY3JlbWVudCA9IDEwMCAvIHRoaXMuc2V0dXB0YXNrcy5sZW5ndGg7IC8vIHBlcmNlbnRcclxuXHRcdHZhciB0b3RhbFRpbWUgPSA0MDA7IC8vIG1pbGxpc2Vjb25kc1xyXG5cdFx0dmFyIHRvdGFsU3RlcHMgPSAxMDtcclxuXHRcdHZhciBpbmNyZW1lbnRQZXJTdGVwID0gdG90YWxJbmNyZW1lbnQgLyB0b3RhbFN0ZXBzO1xyXG5cclxuXHRcdGZvciAoIHZhciBzdGVwPTA7IHN0ZXAgPCB0b3RhbFN0ZXBzOyBzdGVwKyspIHtcclxuXHRcdFx0d2luZG93LnNldFRpbWVvdXQoXHJcblx0XHRcdFx0dGhpcy5pbmNyZW1lbnRQcm9ncmVzcy5iaW5kKHRoaXMpLFxyXG5cdFx0XHRcdHRvdGFsVGltZSAqIHN0ZXAgLyB0b3RhbFN0ZXBzLFxyXG5cdFx0XHRcdGluY3JlbWVudFBlclN0ZXBcclxuXHRcdFx0KTtcclxuXHRcdH1cclxuXHR9O1xyXG5cdHZhciBvblRhc2tFcnJvciA9IChpbmRleCwgY29kZSwgaW5mbykgPT4ge1xyXG5cdFx0dmFyIHdpZGdldCA9IHRoaXMuc2V0dXB0YXNrc1tpbmRleF07XHJcblx0XHR3aWRnZXQuc2V0TGFiZWwoXHJcblx0XHRcdHdpZGdldC5nZXRMYWJlbCgpICsgXCIgRmFpbGVkLiBcIiArIG1ha2VFcnJvck1zZyhjb2RlLCBpbmZvKVxyXG5cdFx0KTtcclxuXHRcdHRoaXMuY2xvc2VCdXR0b24udG9nZ2xlKHRydWUpO1xyXG5cdFx0dGhpcy51cGRhdGVTaXplKCk7XHJcblx0fTtcclxuXHR0YXNrUHJvbWlzZXMuZm9yRWFjaChmdW5jdGlvbihwcm9taXNlLCBpbmRleCkge1xyXG5cdFx0cHJvbWlzZS50aGVuKFxyXG5cdFx0XHQoKSA9PiBvblRhc2tEb25lKGluZGV4KSxcclxuXHRcdFx0KGNvZGUsIGluZm8pID0+IG9uVGFza0Vycm9yKGluZGV4LCBjb2RlLCBpbmZvKVxyXG5cdFx0KTtcclxuXHR9KTtcclxufTtcclxuXHJcbi8vIFVzZSBnZXRTZXR1cFByb2Nlc3MoKSB0byBzZXQgdXAgdGhlIHdpbmRvdyB3aXRoIGRhdGEgcGFzc2VkIHRvIGl0IGF0IHRoZSB0aW1lIFxyXG4vLyBvZiBvcGVuaW5nXHJcbkxvYWREaWFsb2cucHJvdG90eXBlLmdldFNldHVwUHJvY2VzcyA9IGZ1bmN0aW9uICggZGF0YSApIHtcclxuXHRkYXRhID0gZGF0YSB8fCB7fTtcclxuXHRyZXR1cm4gTG9hZERpYWxvZy5zdXBlci5wcm90b3R5cGUuZ2V0U2V0dXBQcm9jZXNzLmNhbGwoIHRoaXMsIGRhdGEgKVxyXG5cdFx0Lm5leHQoICgpID0+IHtcclxuXHRcdFx0dmFyIHNob3dPcmVzVGFzayA9ICEhZGF0YS5vcmVzO1xyXG5cdFx0XHR0aGlzLnNldHVwdGFza3NbNl0udG9nZ2xlKHNob3dPcmVzVGFzayk7XHJcblx0XHRcdHZhciB0YXNrUHJvbWlzZXMgPSBkYXRhLm9yZXMgPyBkYXRhLnByb21pc2VzIDogZGF0YS5wcm9taXNlcy5zbGljZSgwLCAtMSk7XHJcblx0XHRcdGRhdGEuaXNPcGVuZWQudGhlbigoKSA9PiB0aGlzLmFkZFRhc2tQcm9taXNlSGFuZGxlcnModGFza1Byb21pc2VzKSk7XHJcblx0XHR9LCB0aGlzICk7XHJcbn07XHJcblxyXG4vLyBQcmV2ZW50IHdpbmRvdyBmcm9tIGNsb3NpbmcgdG9vIHF1aWNrbHksIHVzaW5nIGdldEhvbGRQcm9jZXNzKClcclxuTG9hZERpYWxvZy5wcm90b3R5cGUuZ2V0SG9sZFByb2Nlc3MgPSBmdW5jdGlvbiAoIGRhdGEgKSB7XHJcblx0ZGF0YSA9IGRhdGEgfHwge307XHJcblx0aWYgKGRhdGEuc3VjY2Vzcykge1xyXG5cdFx0Ly8gV2FpdCBhIGJpdCBiZWZvcmUgcHJvY2Vzc2luZyB0aGUgY2xvc2UsIHdoaWNoIGhhcHBlbnMgYXV0b21hdGljYWxseVxyXG5cdFx0cmV0dXJuIExvYWREaWFsb2cuc3VwZXIucHJvdG90eXBlLmdldEhvbGRQcm9jZXNzLmNhbGwoIHRoaXMsIGRhdGEgKVxyXG5cdFx0XHQubmV4dCg4MDApO1xyXG5cdH1cclxuXHQvLyBObyBuZWVkIHRvIHdhaXQgaWYgY2xvc2VkIG1hbnVhbGx5XHJcblx0cmV0dXJuIExvYWREaWFsb2cuc3VwZXIucHJvdG90eXBlLmdldEhvbGRQcm9jZXNzLmNhbGwoIHRoaXMsIGRhdGEgKTtcclxufTtcclxuXHJcbi8vIFVzZSB0aGUgZ2V0VGVhcmRvd25Qcm9jZXNzKCkgbWV0aG9kIHRvIHBlcmZvcm0gYWN0aW9ucyB3aGVuZXZlciB0aGUgZGlhbG9nIGlzIGNsb3NlZC4gXHJcbkxvYWREaWFsb2cucHJvdG90eXBlLmdldFRlYXJkb3duUHJvY2VzcyA9IGZ1bmN0aW9uICggZGF0YSApIHtcclxuXHRyZXR1cm4gTG9hZERpYWxvZy5zdXBlci5wcm90b3R5cGUuZ2V0VGVhcmRvd25Qcm9jZXNzLmNhbGwoIHRoaXMsIGRhdGEgKVxyXG5cdFx0LmZpcnN0KCAoKSA9PiB7XHJcblx0XHQvLyBQZXJmb3JtIGNsZWFudXA6IHJlc2V0IGxhYmVsc1xyXG5cdFx0XHR0aGlzLnNldHVwdGFza3MuZm9yRWFjaCggc2V0dXB0YXNrID0+IHtcclxuXHRcdFx0XHR2YXIgY3VycmVudExhYmVsID0gc2V0dXB0YXNrLmdldExhYmVsKCk7XHJcblx0XHRcdFx0c2V0dXB0YXNrLnNldExhYmVsKFxyXG5cdFx0XHRcdFx0Y3VycmVudExhYmVsLnNsaWNlKDAsIGN1cnJlbnRMYWJlbC5pbmRleE9mKFwiLi4uXCIpKzMpXHJcblx0XHRcdFx0KTtcclxuXHRcdFx0fSApO1xyXG5cdFx0fSwgdGhpcyApO1xyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgTG9hZERpYWxvZztcclxuLy8gPC9ub3dpa2k+IiwiaW1wb3J0IEJhbm5lcldpZGdldCBmcm9tIFwiLi9Db21wb25lbnRzL0Jhbm5lcldpZGdldFwiO1xyXG5pbXBvcnQgQmFubmVyTGlzdFdpZGdldCBmcm9tIFwiLi9Db21wb25lbnRzL0Jhbm5lckxpc3RXaWRnZXRcIjtcclxuaW1wb3J0IGFwcENvbmZpZyBmcm9tIFwiLi4vY29uZmlnXCI7XHJcbmltcG9ydCBBUEksIHsgbWFrZUVycm9yTXNnIH0gZnJvbSBcIi4uL2FwaVwiO1xyXG5pbXBvcnQgUHJlZnNGb3JtV2lkZ2V0IGZyb20gXCIuL0NvbXBvbmVudHMvUHJlZnNGb3JtV2lkZ2V0XCI7XHJcbmltcG9ydCB7IHNldFByZWZzIGFzIEFwaVNldFByZWZzIH0gZnJvbSBcIi4uL3ByZWZzXCI7XHJcbmltcG9ydCB7IHBhcnNlVGVtcGxhdGVzIH0gZnJvbSBcIi4uL1RlbXBsYXRlXCI7XHJcbmltcG9ydCBUb3BCYXJXaWRnZXQgZnJvbSBcIi4vQ29tcG9uZW50cy9Ub3BCYXJXaWRnZXRcIjtcclxuaW1wb3J0IHsgZmlsdGVyQW5kTWFwLCB1bmlxdWVBcnJheSB9IGZyb20gXCIuLi91dGlsXCI7XHJcbmltcG9ydCAqIGFzIGNhY2hlIGZyb20gXCIuLi9jYWNoZVwiO1xyXG4vLyA8bm93aWtpPlxyXG5cclxuZnVuY3Rpb24gTWFpbldpbmRvdyggY29uZmlnICkge1xyXG5cdE1haW5XaW5kb3cuc3VwZXIuY2FsbCggdGhpcywgY29uZmlnICk7XHJcbn1cclxuT08uaW5oZXJpdENsYXNzKCBNYWluV2luZG93LCBPTy51aS5Qcm9jZXNzRGlhbG9nICk7XHJcblxyXG5NYWluV2luZG93LnN0YXRpYy5uYW1lID0gXCJtYWluXCI7XHJcbk1haW5XaW5kb3cuc3RhdGljLnRpdGxlID0gJChcIjxzcGFuPlwiKS5jc3Moe1wiZm9udC13ZWlnaHRcIjpcIm5vcm1hbFwifSkuYXBwZW5kKFxyXG5cdCQoXCI8YT5cIikuY3NzKHtcImZvbnQtd2VpZ2h0XCI6IFwiYm9sZFwifSkuYXR0cih7XCJocmVmXCI6IG13LnV0aWwuZ2V0VXJsKFwiV1A6UkFURVJcIiksIFwidGFyZ2V0XCI6IFwiX2JsYW5rXCJ9KS50ZXh0KFwiUmF0ZXJcIiksXHJcblx0XCIgKFwiLFxyXG5cdCQoXCI8YT5cIikuYXR0cih7XCJocmVmXCI6IG13LnV0aWwuZ2V0VXJsKFwiV1Q6UkFURVJcIiksIFwidGFyZ2V0XCI6IFwiX2JsYW5rXCJ9KS50ZXh0KFwidGFsa1wiKSxcclxuXHRcIikgXCIsXHJcblx0JChcIjxzcGFuPlwiKS5jc3Moe1wiZm9udC1zaXplXCI6XCI5MCVcIn0pLnRleHQoXCJ2XCIrYXBwQ29uZmlnLnNjcmlwdC52ZXJzaW9uKVxyXG4pO1xyXG5NYWluV2luZG93LnN0YXRpYy5zaXplID0gXCJsYXJnZVwiO1xyXG5NYWluV2luZG93LnN0YXRpYy5hY3Rpb25zID0gW1xyXG5cdC8vIFByaW1hcnkgKHRvcCByaWdodCk6XHJcblx0e1xyXG5cdFx0bGFiZWw6IFwiWFwiLCAvLyBub3QgdXNpbmcgYW4gaWNvbiBzaW5jZSBjb2xvciBiZWNvbWVzIGludmVydGVkLCBpLmUuIHdoaXRlIG9uIGxpZ2h0LWdyZXlcclxuXHRcdHRpdGxlOiBcIkNsb3NlIChhbmQgZGlzY2FyZCBhbnkgY2hhbmdlcylcIixcclxuXHRcdGZsYWdzOiBcInByaW1hcnlcIixcclxuXHRcdG1vZGVzOiBbXCJlZGl0XCIsIFwiZGlmZlwiLCBcInByZXZpZXdcIl0gLy8gYXZhaWxhYmxlIHdoZW4gY3VycmVudCBtb2RlIGlzbid0IFwicHJlZnNcIlxyXG5cdH0sXHJcblx0Ly8gU2FmZSAodG9wIGxlZnQpXHJcblx0e1xyXG5cdFx0YWN0aW9uOiBcInNob3dQcmVmc1wiLFxyXG5cdFx0ZmxhZ3M6IFwic2FmZVwiLFxyXG5cdFx0aWNvbjogXCJzZXR0aW5nc1wiLFxyXG5cdFx0dGl0bGU6IFwiUHJlZmVyZW5jZXNcIixcclxuXHRcdG1vZGVzOiBbXCJlZGl0XCIsIFwiZGlmZlwiLCBcInByZXZpZXdcIl0gLy8gYXZhaWxhYmxlIHdoZW4gY3VycmVudCBtb2RlIGlzbid0IFwicHJlZnNcIlxyXG5cdH0sXHJcblx0Ly8gT3RoZXJzIChib3R0b20pXHJcblx0e1xyXG5cdFx0YWN0aW9uOiBcInNhdmVcIixcclxuXHRcdGFjY2Vzc0tleTogXCJzXCIsXHJcblx0XHRsYWJlbDogbmV3IE9PLnVpLkh0bWxTbmlwcGV0KFwiPHNwYW4gc3R5bGU9J3BhZGRpbmc6MCAxZW07Jz5TYXZlPC9zcGFuPlwiKSxcclxuXHRcdGZsYWdzOiBbXCJwcmltYXJ5XCIsIFwicHJvZ3Jlc3NpdmVcIl0sXHJcblx0XHRtb2RlczogW1wiZWRpdFwiLCBcImRpZmZcIiwgXCJwcmV2aWV3XCJdIC8vIGF2YWlsYWJsZSB3aGVuIGN1cnJlbnQgbW9kZSBpc24ndCBcInByZWZzXCJcclxuXHR9LFxyXG5cdHtcclxuXHRcdGFjdGlvbjogXCJwcmV2aWV3XCIsXHJcblx0XHRhY2Nlc3NLZXk6IFwicFwiLFxyXG5cdFx0bGFiZWw6IFwiU2hvdyBwcmV2aWV3XCIsXHJcblx0XHRtb2RlczogW1wiZWRpdFwiLCBcImRpZmZcIl0gLy8gYXZhaWxhYmxlIHdoZW4gY3VycmVudCBtb2RlIGlzbid0IFwicHJldmlld1wiIG9yIFwicHJlZnNcIlxyXG5cdH0sXHJcblx0e1xyXG5cdFx0YWN0aW9uOiBcImNoYW5nZXNcIixcclxuXHRcdGFjY2Vzc0tleTogXCJ2XCIsXHJcblx0XHRsYWJlbDogXCJTaG93IGNoYW5nZXNcIixcclxuXHRcdG1vZGVzOiBbXCJlZGl0XCIsIFwicHJldmlld1wiXSAvLyBhdmFpbGFibGUgd2hlbiBjdXJyZW50IG1vZGUgaXNuJ3QgXCJkaWZmXCIgb3IgXCJwcmVmc1wiXHJcblx0fSxcclxuXHR7XHJcblx0XHRhY3Rpb246IFwiYmFja1wiLFxyXG5cdFx0bGFiZWw6IFwiQmFja1wiLFxyXG5cdFx0bW9kZXM6IFtcImRpZmZcIiwgXCJwcmV2aWV3XCJdIC8vIGF2YWlsYWJsZSB3aGVuIGN1cnJlbnQgbW9kZSBpcyBcImRpZmZcIiBvciBcInByZWZzXCJcclxuXHR9LFxyXG5cdFxyXG5cdC8vIFwicHJlZnNcIiBtb2RlIG9ubHlcclxuXHR7XHJcblx0XHRhY3Rpb246IFwic2F2ZVByZWZzXCIsXHJcblx0XHRsYWJlbDogXCJVcGRhdGVcIixcclxuXHRcdGZsYWdzOiBbXCJwcmltYXJ5XCIsIFwicHJvZ3Jlc3NpdmVcIl0sXHJcblx0XHRtb2RlczogXCJwcmVmc1wiIFxyXG5cdH0sXHJcblx0e1xyXG5cdFx0YWN0aW9uOiBcImNsb3NlUHJlZnNcIixcclxuXHRcdGxhYmVsOiBcIkNhbmNlbFwiLFxyXG5cdFx0ZmxhZ3M6IFwic2FmZVwiLFxyXG5cdFx0bW9kZXM6IFwicHJlZnNcIlxyXG5cdH1cclxuXTtcclxuXHJcbi8vIEN1c3RvbWl6ZSB0aGUgaW5pdGlhbGl6ZSgpIGZ1bmN0aW9uOiBUaGlzIGlzIHdoZXJlIHRvIGFkZCBjb250ZW50IHRvIHRoZSBkaWFsb2cgYm9keSBhbmQgc2V0IHVwIGV2ZW50IGhhbmRsZXJzLlxyXG5NYWluV2luZG93LnByb3RvdHlwZS5pbml0aWFsaXplID0gZnVuY3Rpb24gKCkge1xyXG5cdC8vIENhbGwgdGhlIHBhcmVudCBtZXRob2QuXHJcblx0TWFpbldpbmRvdy5zdXBlci5wcm90b3R5cGUuaW5pdGlhbGl6ZS5jYWxsKCB0aGlzICk7XHJcblxyXG5cdC8qIC0tLSBQUkVGUyAtLS0gKi9cclxuXHR0aGlzLnByZWZlcmVuY2VzID0gYXBwQ29uZmlnLmRlZmF1bHRQcmVmcztcclxuXHRcclxuXHQvKiAtLS0gVE9QIEJBUiAtLS0gKi9cclxuXHR0aGlzLnRvcEJhciA9IG5ldyBUb3BCYXJXaWRnZXQoe1xyXG5cdFx0JG92ZXJsYXk6IHRoaXMuJG92ZXJsYXlcclxuXHR9ICk7XHJcblx0dGhpcy4kaGVhZC5jc3Moe1wiaGVpZ2h0XCI6XCI3M3B4XCJ9KS5hcHBlbmQodGhpcy50b3BCYXIuJGVsZW1lbnQpO1xyXG5cclxuXHQvKiAtLS0gRk9PVEVSIC0tLSAqL1xyXG5cdHRoaXMub3Jlc0xhYmVsID0gbmV3IE9PLnVpLkxhYmVsV2lkZ2V0KHtcclxuXHRcdCRlbGVtZW50OiAkKFwiPHNwYW4gc3R5bGU9J2Zsb2F0OnJpZ2h0OyBwYWRkaW5nOiAxMHB4OyBtYXgtd2lkdGg6IDUwJTsgdGV4dC1hbGlnbjogY2VudGVyOyc+XCIpLFxyXG5cdFx0bGFiZWw6ICQoXCI8c3Bhbj5cIikuYXBwZW5kKFxyXG5cdFx0XHQkKFwiPGE+XCIpXHJcblx0XHRcdFx0LmF0dHIoe1wiaHJlZlwiOm13LnV0aWwuZ2V0VXJsKFwibXc6T1JFU1wiKSwgXCJ0YXJnZXRcIjpcIl9ibGFua1wifSlcclxuXHRcdFx0XHQuYXBwZW5kKFxyXG5cdFx0XHRcdFx0JChcIjxpbWc+XCIpXHJcblx0XHRcdFx0XHRcdC5jc3Moe1widmVydGljYWwtYWxpZ25cIjogXCJ0ZXh0LWJvdHRvbTtcIn0pXHJcblx0XHRcdFx0XHRcdC5hdHRyKHtcclxuXHRcdFx0XHRcdFx0XHRcInNyY1wiOiBcIi8vdXBsb2FkLndpa2ltZWRpYS5vcmcvd2lraXBlZGlhL2NvbW1vbnMvdGh1bWIvNS81MS9PYmplY3RpdmVfUmV2aXNpb25fRXZhbHVhdGlvbl9TZXJ2aWNlX2xvZ28uc3ZnLzQwcHgtT2JqZWN0aXZlX1JldmlzaW9uX0V2YWx1YXRpb25fU2VydmljZV9sb2dvLnN2Zy5wbmdcIixcclxuXHRcdFx0XHRcdFx0XHRcInRpdGxlXCI6IFwiTWFjaGluZSBwcmVkaWN0ZWQgcXVhbGl0eSBmcm9tIE9SRVNcIixcclxuXHRcdFx0XHRcdFx0XHRcImFsdFwiOiBcIk9SRVMgbG9nb1wiLFxyXG5cdFx0XHRcdFx0XHRcdFwid2lkdGhcIjogXCIyMHB4XCIsXHJcblx0XHRcdFx0XHRcdFx0XCJoZWlnaHRcIjogXCIyMHB4XCJcclxuXHRcdFx0XHRcdFx0fSlcclxuXHRcdFx0XHQpLFxyXG5cdFx0XHRcIiBcIixcclxuXHRcdFx0JChcIjxzcGFuIGNsYXNzPSdvcmVzUHJlZGljdGlvbic+XCIpXHJcblx0XHQpXHJcblx0fSkudG9nZ2xlKGZhbHNlKTtcclxuXHR0aGlzLnBhZ2V0eXBlTGFiZWwgPSBuZXcgT08udWkuTGFiZWxXaWRnZXQoe1xyXG5cdFx0JGVsZW1lbnQ6ICQoXCI8c3BhbiBzdHlsZT0nZmxvYXQ6cmlnaHQ7IHBhZGRpbmc6IDEwcHg7IG1heC13aWR0aDogMzMuMzMlOyB0ZXh0LWFsaWduOiBjZW50ZXI7Jz5cIilcclxuXHR9KS50b2dnbGUoZmFsc2UpO1xyXG5cdHRoaXMuJGZvb3QucHJlcGVuZCh0aGlzLm9yZXNMYWJlbC4kZWxlbWVudCwgdGhpcy5wYWdldHlwZUxhYmVsLiRlbGVtZW50KTtcclxuXHJcblx0LyogLS0tIENPTlRFTlQgQVJFQSAtLS0gKi9cclxuXHJcblx0Ly8gQmFubmVycyBhZGRlZCBkeW5hbWljYWxseSB1cG9uIG9wZW5pbmcsIHNvIGp1c3QgbmVlZCBhIGxheW91dCB3aXRoIGFuIGVtcHR5IGxpc3RcclxuXHR0aGlzLmJhbm5lckxpc3QgPSBuZXcgQmFubmVyTGlzdFdpZGdldCh7XHJcblx0XHRwcmVmZXJlbmNlczogdGhpcy5wcmVmZXJlbmNlc1xyXG5cdH0pO1xyXG5cdHRoaXMuZWRpdExheW91dCA9IG5ldyBPTy51aS5QYW5lbExheW91dCgge1xyXG5cdFx0cGFkZGVkOiBmYWxzZSxcclxuXHRcdGV4cGFuZGVkOiBmYWxzZSxcclxuXHRcdCRjb250ZW50OiB0aGlzLmJhbm5lckxpc3QuJGVsZW1lbnRcclxuXHR9ICk7XHJcblxyXG5cdC8vIFByZWZlcmVuY2VzLCBmaWxsZWQgaW4gd2l0aCBjdXJyZW50IHByZWZzIHVwb24gbG9hZGluZy5cclxuXHQvLyBUT0RPOiBNYWtlIHRoaXMgaW50byBhIGNvbXBvbmVudCwgYWRkIGZpZWxkcyBhbmQgaW5wdXRzXHJcblx0dGhpcy5wcmVmc0Zvcm0gPSBuZXcgUHJlZnNGb3JtV2lkZ2V0KCk7XHJcblx0dGhpcy5wcmVmc0xheW91dCA9IG5ldyBPTy51aS5QYW5lbExheW91dCgge1xyXG5cdFx0cGFkZGVkOiB0cnVlLFxyXG5cdFx0ZXhwYW5kZWQ6IGZhbHNlLFxyXG5cdFx0JGNvbnRlbnQ6IHRoaXMucHJlZnNGb3JtLiRlbGVtZW50XHJcblx0fSApO1xyXG5cclxuXHQvLyBQcmV2aWV3LCBTaG93IGNoYW5nZXNcclxuXHR0aGlzLnBhcnNlZENvbnRlbnRDb250YWluZXIgPSBuZXcgT08udWkuRmllbGRzZXRMYXlvdXQoIHtcclxuXHRcdGxhYmVsOiBcIlByZXZpZXdcIlxyXG5cdH0gKTtcclxuXHR0aGlzLnBhcnNlZENvbnRlbnRXaWRnZXQgPSBuZXcgT08udWkuTGFiZWxXaWRnZXQoIHtsYWJlbDogXCJcIixcdCRlbGVtZW50OiQoXCI8ZGl2PlwiKVx0fSk7XHJcblx0dGhpcy5wYXJzZWRDb250ZW50Q29udGFpbmVyLmFkZEl0ZW1zKFtcclxuXHRcdG5ldyBPTy51aS5GaWVsZExheW91dChcclxuXHRcdFx0dGhpcy5wYXJzZWRDb250ZW50V2lkZ2V0LFx0XHRcdFxyXG5cdFx0XHR7IGFsaWduOiBcInRvcFwiIH1cclxuXHRcdClcclxuXHRdKTtcclxuXHR0aGlzLnBhcnNlZENvbnRlbnRMYXlvdXQgPSBuZXcgT08udWkuUGFuZWxMYXlvdXQoIHtcclxuXHRcdHBhZGRlZDogdHJ1ZSxcclxuXHRcdGV4cGFuZGVkOiBmYWxzZSxcclxuXHRcdCRjb250ZW50OiB0aGlzLnBhcnNlZENvbnRlbnRDb250YWluZXIuJGVsZW1lbnRcclxuXHR9ICk7XHJcblxyXG5cdHRoaXMuY29udGVudEFyZWEgPSBuZXcgT08udWkuU3RhY2tMYXlvdXQoIHtcclxuXHRcdGl0ZW1zOiBbXHJcblx0XHRcdHRoaXMuZWRpdExheW91dCxcclxuXHRcdFx0dGhpcy5wcmVmc0xheW91dCxcclxuXHRcdFx0dGhpcy5wYXJzZWRDb250ZW50TGF5b3V0XHJcblx0XHRdLFxyXG5cdFx0cGFkZGVkOiBmYWxzZSxcclxuXHRcdGV4cGFuZGVkOiBmYWxzZVxyXG5cdH0gKTtcclxuXHJcblx0dGhpcy4kYm9keS5jc3Moe1widG9wXCI6XCI3M3B4XCJ9KS5hcHBlbmQodGhpcy5jb250ZW50QXJlYS4kZWxlbWVudCk7XHJcblxyXG5cdC8qIC0tLSBFVkVOVCBIQU5ETElORyAtLS0gKi9cclxuXHJcblx0dGhpcy50b3BCYXIuY29ubmVjdCh0aGlzLCB7XHJcblx0XHRcInNlYXJjaFNlbGVjdFwiOiBcIm9uU2VhcmNoU2VsZWN0XCIsXHJcblx0XHRcInNldENsYXNzZXNcIjogXCJvblNldENsYXNzZXNcIixcclxuXHRcdFwic2V0SW1wb3J0YW5jZXNcIjogXCJvblNldEltcG9ydGFuY2VzXCIsXHJcblx0XHRcInJlbW92ZUFsbFwiOiBcIm9uUmVtb3ZlQWxsXCIsXHJcblx0XHRcImNsZWFyQWxsXCI6IFwib25DbGVhckFsbFwiXHJcblx0fSk7XHJcblx0dGhpcy5iYW5uZXJMaXN0LmNvbm5lY3QodGhpcywge1widXBkYXRlZFNpemVcIjogXCJvbkJhbm5lckxpc3RVcGRhdGVTaXplXCJ9KTtcclxuXHJcblx0Ly8gSGFuZGxlIGNlcnRhaW4ga2V5Ym9hcmQgZXZlbnRzLiBSZXF1aXJlcyBzb21ldGhpbmcgaW4gdGhlIFJhdGVyIHdpbmRvdyB0byBiZSBmb2N1c2VkLFxyXG5cdC8vIHNvIGFkZCBhIHRhYmluZGV4IHRvIHRoZSBib2R5IGFuZCBpdCdzIHBhcmVudCBjb250YWluZXIuXHJcblx0dGhpcy4kYm9keS5hdHRyKFwidGFiaW5kZXhcIiwgXCI5OTlcIilcclxuXHRcdC5wYXJlbnQoKS5hdHRyKFwidGFiaW5kZXhcIiwgXCI5OTlcIikua2V5ZG93bihmdW5jdGlvbiggZXZlbnQgKSB7XHJcblx0XHRcdGxldCBzY3JvbGxBbW91bnQ7XHJcblx0XHRcdHN3aXRjaChldmVudC53aGljaCkge1xyXG5cdFx0XHRjYXNlIDMzOiAvLyBwYWdlIHVwXHJcblx0XHRcdFx0c2Nyb2xsQW1vdW50ID0gdGhpcy4kYm9keS5zY3JvbGxUb3AoKSAtIHRoaXMuJGJvZHkuaGVpZ2h0KCkqMC45O1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRjYXNlIDM0OiAvLyBwYWdlIGRvd25cclxuXHRcdFx0XHRzY3JvbGxBbW91bnQgPSB0aGlzLiRib2R5LnNjcm9sbFRvcCgpICsgdGhpcy4kYm9keS5oZWlnaHQoKSowLjk7XHJcblx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdGRlZmF1bHQ6XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblx0XHRcdHRoaXMuJGJvZHkuc2Nyb2xsVG9wKHNjcm9sbEFtb3VudCk7XHJcblx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHR9LmJpbmQodGhpcykpO1xyXG5cclxuXHR0aGlzLnByZWZzRm9ybS5jb25uZWN0KHRoaXMsIHtcInJlc2V0Q2FjaGVcIjogXCJvblJlc2V0Q2FjaGVcIn0pO1xyXG5cdFxyXG59O1xyXG5cclxuTWFpbldpbmRvdy5wcm90b3R5cGUub25CYW5uZXJMaXN0VXBkYXRlU2l6ZSA9IGZ1bmN0aW9uKCkge1xyXG5cdC8vIEdldCB0aGUgY3VycmVudCBzY3JvbGwgYW1vdW50XHJcblx0Y29uc3Qgc2Nyb2xsQW1vdW50ID0gdGhpcy4kYm9keS5zY3JvbGxUb3AoKTtcclxuXHQvLyBVcGRhdGUgc2l6ZSAod2hpY2ggcmVzZXRzIHRoZSBzY3JvbGwgdG8gMClcclxuXHR0aGlzLnVwZGF0ZVNpemUoKTtcclxuXHQvLyBTY3JvbGwgdG8gd2hlcmUgaXQgd2FzIGJlZm9yZVxyXG5cdHRoaXMuJGJvZHkuc2Nyb2xsVG9wKHNjcm9sbEFtb3VudCk7XHJcbn07XHJcblxyXG5NYWluV2luZG93LnByb3RvdHlwZS5tYWtlRHJhZ2dhYmxlID0gZnVuY3Rpb24oKSB7XHJcblx0bGV0ICRmcmFtZUVsID0gdGhpcy4kZWxlbWVudC5maW5kKFwiLm9vLXVpLXdpbmRvdy1mcmFtZVwiKTtcclxuXHRsZXQgJGhhbmRsZUVsID0gdGhpcy4kZWxlbWVudC5maW5kKFwiLm9vLXVpLXByb2Nlc3NEaWFsb2ctbG9jYXRpb25cIikuY3NzKHtcImN1cnNvclwiOlwibW92ZVwifSk7XHJcblx0Ly8gUG9zaXRpb24gZm9yIGNzcyB0cmFuc2xhdGUgdHJhbnNmb3JtYXRpb25zLCByZWxhdGl2ZSB0byBpbml0aWFsIHBvc2l0aW9uXHJcblx0Ly8gKHdoaWNoIGlzIGNlbnRlcmVkIG9uIHZpZXdwb3J0IHdoZW4gc2Nyb2xsZWQgdG8gdG9wKVxyXG5cdGxldCBwb3NpdGlvbiA9IHsgeDogMCwgeTogMCB9O1xyXG5cdGNvbnN0IGNvbnN0cmFpbiA9IGZ1bmN0aW9uKHZhbCwgbWluVmFsLCBtYXhWYWwpIHtcclxuXHRcdGlmICh2YWwgPCBtaW5WYWwpIHJldHVybiBtaW5WYWw7XHJcblx0XHRpZiAodmFsID4gbWF4VmFsKSByZXR1cm4gbWF4VmFsO1xyXG5cdFx0cmV0dXJuIHZhbDtcclxuXHR9O1xyXG5cdGNvbnN0IGNvbnN0cmFpblggPSAodmFsKSA9PiB7XHJcblx0XHQvLyBEb24ndCB0b28gZmFyIGhvcml6b250YWxseSAobGVhdmUgYXQgbGVhc3QgMTAwcHggdmlzaWJsZSlcclxuXHRcdGxldCBsaW1pdCA9IHdpbmRvdy5pbm5lcldpZHRoLzIgKyAkZnJhbWVFbC5vdXRlcldpZHRoKCkvMiAtIDEwMDtcclxuXHRcdHJldHVybiBjb25zdHJhaW4odmFsLCAtMSpsaW1pdCwgbGltaXQpO1xyXG5cdH07XHJcblx0Y29uc3QgY29uc3RyYWluWSA9ICh2YWwpID0+IHtcclxuXHRcdC8vIENhbid0IHRha2UgdGl0bGUgYmFyIG9mZiB0aGUgdmlld3BvcnQsIHNpbmNlIGl0J3MgdGhlIGRyYWcgaGFuZGxlXHJcblx0XHRsZXQgbWluTGltaXQgPSAtMSood2luZG93LmlubmVySGVpZ2h0IC0gJGZyYW1lRWwub3V0ZXJIZWlnaHQoKSkvMjtcclxuXHRcdC8vIERvbid0IGdvIHRvbyBmYXIgZG93biB0aGUgcGFnZTogKHdob2xlIHBhZ2UgaGVpZ2h0KSAtIChpbml0aWFsIHBvc2l0aW9uKVxyXG5cdFx0bGV0IG1heExpbWl0ID0gKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQpLnNjcm9sbEhlaWdodCAtIHdpbmRvdy5pbm5lckhlaWdodC8yO1xyXG5cdFx0cmV0dXJuIGNvbnN0cmFpbih2YWwsIG1pbkxpbWl0LCBtYXhMaW1pdCk7XHJcblx0fTtcclxuXHJcblx0bGV0IHBvaW50ZXJkb3duID0gZmFsc2U7XHJcblx0bGV0IGRyYWdGcm9tID0ge307XHJcblxyXG5cdGxldCBvbkRyYWdTdGFydCA9IGV2ZW50ID0+IHtcclxuXHRcdHBvaW50ZXJkb3duID0gdHJ1ZTtcclxuXHRcdGRyYWdGcm9tLnggPSBldmVudC5jbGllbnRYO1xyXG5cdFx0ZHJhZ0Zyb20ueSA9IGV2ZW50LmNsaWVudFk7XHJcblx0fTtcclxuXHRsZXQgb25EcmFnTW92ZSA9IGV2ZW50ID0+IHtcclxuXHRcdGlmICghcG9pbnRlcmRvd24gfHwgZHJhZ0Zyb20ueCA9PSBudWxsIHx8IGRyYWdGcm9tLnkgPT09IG51bGwpIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cdFx0Y29uc3QgZHggPSBldmVudC5jbGllbnRYIC0gZHJhZ0Zyb20ueDtcclxuXHRcdGNvbnN0IGR5ID0gZXZlbnQuY2xpZW50WSAtIGRyYWdGcm9tLnk7XHJcblx0XHRkcmFnRnJvbS54ID0gZXZlbnQuY2xpZW50WDtcclxuXHRcdGRyYWdGcm9tLnkgPSBldmVudC5jbGllbnRZO1xyXG5cdFx0cG9zaXRpb24ueCA9IGNvbnN0cmFpblgocG9zaXRpb24ueCArIGR4KTtcclxuXHRcdHBvc2l0aW9uLnkgPSBjb25zdHJhaW5ZKHBvc2l0aW9uLnkgKyBkeSk7XHJcblx0XHQkZnJhbWVFbC5jc3MoXCJ0cmFuc2Zvcm1cIiwgYHRyYW5zbGF0ZSgke3Bvc2l0aW9uLnh9cHgsICR7cG9zaXRpb24ueX1weClgKTtcclxuXHR9O1xyXG5cdGxldCBvbkRyYWdFbmQgPSAoKSA9PiB7XHJcblx0XHRwb2ludGVyZG93biA9IGZhbHNlO1xyXG5cdFx0ZGVsZXRlIGRyYWdGcm9tLng7XHJcblx0XHRkZWxldGUgZHJhZ0Zyb20ueTtcclxuXHRcdC8vIE1ha2Ugc3VyZSBmaW5hbCBwb3NpdGlvbnMgYXJlIHdob2xlIG51bWJlcnNcclxuXHRcdHBvc2l0aW9uLnggPSBNYXRoLnJvdW5kKHBvc2l0aW9uLngpO1xyXG5cdFx0cG9zaXRpb24ueSA9IE1hdGgucm91bmQocG9zaXRpb24ueSk7XHJcblx0XHQkZnJhbWVFbC5jc3MoXCJ0cmFuc2Zvcm1cIiwgYHRyYW5zbGF0ZSgke3Bvc2l0aW9uLnh9cHgsICR7cG9zaXRpb24ueX1weClgKTtcclxuXHR9O1xyXG5cclxuXHQvLyBVc2UgcG9pbnRlciBldmVudHMgaWYgYXZhaWxhYmxlOyBvdGhlcndpc2UgdXNlIG1vdXNlIGV2ZW50c1xyXG5cdGNvbnN0IHBvaW50ZXIgPSAoXCJQb2ludGVyRXZlbnRcIiBpbiB3aW5kb3cpID8gXCJwb2ludGVyXCIgOiBcIm1vdXNlXCI7XHJcblx0JGhhbmRsZUVsLm9uKHBvaW50ZXIrXCJlbnRlci5yYXRlck1haW5XaW5cIiwgKCkgPT4gJGZyYW1lRWwuY3NzKFwid2lsbC1jaGFuZ2VcIiwgXCJ0cmFuc2Zvcm1cIikgKTsgLy8gVGVsbCBicm93c2VyIHRvIG9wdGltaXNlIHRyYW5zZm9ybVxyXG5cdCRoYW5kbGVFbC5vbihwb2ludGVyK1wibGVhdmUucmF0ZXJNYWluV2luXCIsICgpID0+IHsgaWYgKCFwb2ludGVyZG93bikgJGZyYW1lRWwuY3NzKFwid2lsbC1jaGFuZ2VcIiwgXCJcIik7IH0gKTsgLy8gUmVtb3ZlIG9wdGltaXNhdGlvbiBpZiBub3QgZHJhZ2dpbmdcclxuXHQkaGFuZGxlRWwub24ocG9pbnRlcitcImRvd24ucmF0ZXJNYWluV2luXCIsIG9uRHJhZ1N0YXJ0KTtcclxuXHQkKFwiYm9keVwiKS5vbihwb2ludGVyK1wibW92ZS5yYXRlck1haW5XaW5cIiwgb25EcmFnTW92ZSk7XHJcblx0JChcImJvZHlcIikub24ocG9pbnRlcitcInVwLnJhdGVyTWFpbldpblwiLCBvbkRyYWdFbmQpO1xyXG59O1xyXG5cclxuLy8gT3ZlcnJpZGUgdGhlIGdldEJvZHlIZWlnaHQoKSBtZXRob2QgdG8gc3BlY2lmeSBhIGN1c3RvbSBoZWlnaHRcclxuTWFpbldpbmRvdy5wcm90b3R5cGUuZ2V0Qm9keUhlaWdodCA9IGZ1bmN0aW9uICgpIHtcclxuXHR2YXIgY3VycmVudGxheW91dCA9IHRoaXMuY29udGVudEFyZWEuZ2V0Q3VycmVudEl0ZW0oKTtcclxuXHR2YXIgbGF5b3V0SGVpZ2h0ID0gY3VycmVudGxheW91dCAmJiBjdXJyZW50bGF5b3V0LiRlbGVtZW50Lm91dGVySGVpZ2h0KHRydWUpO1xyXG5cdHZhciBjb250ZW50SGVpZ2h0ID0gY3VycmVudGxheW91dCAmJiBjdXJyZW50bGF5b3V0LiRlbGVtZW50LmNoaWxkcmVuKFwiOmZpcnN0LWNoaWxkXCIpLm91dGVySGVpZ2h0KHRydWUpO1xyXG5cdHJldHVybiBNYXRoLm1heCgyMDAsIGxheW91dEhlaWdodCwgY29udGVudEhlaWdodCk7XHJcbn07XHJcblxyXG4vLyBVc2UgZ2V0U2V0dXBQcm9jZXNzKCkgdG8gc2V0IHVwIHRoZSB3aW5kb3cgd2l0aCBkYXRhIHBhc3NlZCB0byBpdCBhdCB0aGUgdGltZSBcclxuLy8gb2Ygb3BlbmluZ1xyXG5NYWluV2luZG93LnByb3RvdHlwZS5nZXRTZXR1cFByb2Nlc3MgPSBmdW5jdGlvbiAoIGRhdGEgKSB7XHJcblx0ZGF0YSA9IGRhdGEgfHwge307XHJcblx0cmV0dXJuIE1haW5XaW5kb3cuc3VwZXIucHJvdG90eXBlLmdldFNldHVwUHJvY2Vzcy5jYWxsKCB0aGlzLCBkYXRhIClcclxuXHRcdC5uZXh0KCAoKSA9PiB7XHJcblx0XHRcdHRoaXMubWFrZURyYWdnYWJsZSgpO1xyXG5cdFx0XHQvLyBTZXQgdXAgcHJlZmVyZW5jZXNcclxuXHRcdFx0dGhpcy5zZXRQcmVmZXJlbmNlcyhkYXRhLnByZWZlcmVuY2VzKTtcclxuXHRcdFx0dGhpcy5wcmVmc0Zvcm0uc2V0UHJlZlZhbHVlcyhkYXRhLnByZWZlcmVuY2VzKTtcclxuXHRcdFx0Ly8gU2V0IHN1YmplY3QgcGFnZSBpbmZvXHJcblx0XHRcdHRoaXMuc3ViamVjdFBhZ2UgPSBkYXRhLnN1YmplY3RQYWdlO1xyXG5cdFx0XHR0aGlzLnBhZ2VJbmZvID0ge1xyXG5cdFx0XHRcdHJlZGlyZWN0OiBkYXRhLnJlZGlyZWN0VGFyZ2V0LFxyXG5cdFx0XHRcdGlzRGlzYW1iaWc6IGRhdGEuZGlzYW1iaWcsXHJcblx0XHRcdFx0aGFzU3R1YnRhZzogZGF0YS5zdHVidGFnLFxyXG5cdFx0XHRcdGlzQXJ0aWNsZTogZGF0YS5pc0FydGljbGVcclxuXHRcdFx0fTtcclxuXHRcdFx0Ly8gU2V0IHVwIGVkaXQgbW9kZSBiYW5uZXJzXHJcblx0XHRcdHRoaXMuYWN0aW9ucy5zZXRNb2RlKFwiZWRpdFwiKTtcclxuXHRcdFx0dGhpcy5iYW5uZXJMaXN0Lm9yZXNDbGFzcyA9IChkYXRhLmlzQXJ0aWNsZSAmJiBkYXRhLmlzTGlzdClcclxuXHRcdFx0XHQ/IFwiTGlzdFwiXHJcblx0XHRcdFx0OiBkYXRhLm9yZXMgJiYgZGF0YS5vcmVzLnByZWRpY3Rpb247XHJcblx0XHRcdHRoaXMuYmFubmVyTGlzdC5wYWdlSW5mbyA9IHRoaXMucGFnZUluZm87XHJcblx0XHRcdHRoaXMuYmFubmVyTGlzdC5hZGRJdGVtcyhcclxuXHRcdFx0XHRkYXRhLmJhbm5lcnMubWFwKCBiYW5uZXJUZW1wbGF0ZSA9PiBuZXcgQmFubmVyV2lkZ2V0KFxyXG5cdFx0XHRcdFx0YmFubmVyVGVtcGxhdGUsXHJcblx0XHRcdFx0XHR7XHJcblx0XHRcdFx0XHRcdHByZWZlcmVuY2VzOiB0aGlzLnByZWZlcmVuY2VzLFxyXG5cdFx0XHRcdFx0XHQkb3ZlcmxheTogdGhpcy4kb3ZlcmxheSxcclxuXHRcdFx0XHRcdFx0aXNBcnRpY2xlOiB0aGlzLnBhZ2VJbmZvLmlzQXJ0aWNsZVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdCkgKVxyXG5cdFx0XHQpO1xyXG5cdFx0XHRsZXQgc2hlbGxUZW1wbGF0ZUJhbm5lciA9IHRoaXMuYmFubmVyTGlzdC5pdGVtcy5maW5kKGJhbm5lciA9PiBiYW5uZXIuaXNTaGVsbFRlbXBsYXRlKTtcclxuXHRcdFx0aWYgKHNoZWxsVGVtcGxhdGVCYW5uZXIgJiYgc2hlbGxUZW1wbGF0ZUJhbm5lci5zaGVsbFBhcmFtMVZhbHVlKSB7XHJcblx0XHRcdFx0c2hlbGxUZW1wbGF0ZUJhbm5lci5ub25TdGFuZGFyZFRlbXBsYXRlcyA9IHRoaXMuYmFubmVyTGlzdC5pdGVtcy5yZWR1Y2UoXHJcblx0XHRcdFx0XHQoYmFubmVyc0xpc3QsIGN1ckJhbm5lcikgPT4gYmFubmVyc0xpc3QucmVwbGFjZShjdXJCYW5uZXIud2lraXRleHQsIFwiXCIpLFxyXG5cdFx0XHRcdFx0c2hlbGxUZW1wbGF0ZUJhbm5lci5zaGVsbFBhcmFtMVZhbHVlXHJcblx0XHRcdFx0KS50cmltKCkucmVwbGFjZSgvXFxuKy9nLCBcIlxcblwiKTtcclxuXHRcdFx0fVxyXG5cdFx0XHR0aGlzLmJhbm5lckxpc3QuYWRkU2hlbGxUZW1wbGF0ZUlmTmVlZWRlZCgpXHJcblx0XHRcdFx0LnN5bmNTaGVsbFRlbXBsYXRlV2l0aEJpb2dyYXBoeUJhbm5lcigpO1xyXG5cdFx0XHQvLyBTaG93IHBhZ2UgdHlwZSwgb3IgT1JFUyBwcmVkaWN0aW9uLCBpZiBhdmFpbGFibGVcclxuXHRcdFx0aWYgKHRoaXMucGFnZUluZm8ucmVkaXJlY3QpIHtcclxuXHRcdFx0XHR0aGlzLnBhZ2V0eXBlTGFiZWwuc2V0TGFiZWwoXCJSZWRpcmVjdCBwYWdlXCIpLnRvZ2dsZSh0cnVlKTtcclxuXHRcdFx0fSBlbHNlIGlmICh0aGlzLnBhZ2VJbmZvLmlzRGlzYW1iaWcpIHtcclxuXHRcdFx0XHR0aGlzLnBhZ2V0eXBlTGFiZWwuc2V0TGFiZWwoXCJEaXNhbWJpZ3VhdGlvbiBwYWdlXCIpLnRvZ2dsZSh0cnVlKTtcclxuXHRcdFx0fSBlbHNlIGlmICh0aGlzLnBhZ2VJbmZvLmlzQXJ0aWNsZSAmJiBkYXRhLmlzR0EpIHtcclxuXHRcdFx0XHR0aGlzLnBhZ2V0eXBlTGFiZWwuc2V0TGFiZWwoXCJHb29kIGFydGljbGVcIikudG9nZ2xlKHRydWUpO1xyXG5cdFx0XHR9IGVsc2UgaWYgKHRoaXMucGFnZUluZm8uaXNBcnRpY2xlICYmIGRhdGEuaXNGQSkge1xyXG5cdFx0XHRcdHRoaXMucGFnZXR5cGVMYWJlbC5zZXRMYWJlbChcIkZlYXR1cmVkIGFydGljbGVcIikudG9nZ2xlKHRydWUpO1xyXG5cdFx0XHR9IGVsc2UgaWYgKHRoaXMucGFnZUluZm8uaXNBcnRpY2xlICYmIGRhdGEuaXNGTCkge1xyXG5cdFx0XHRcdHRoaXMucGFnZXR5cGVMYWJlbC5zZXRMYWJlbChcIkZlYXR1cmVkIGxpc3RcIikudG9nZ2xlKHRydWUpO1xyXG5cdFx0XHR9IGVsc2UgaWYgKHRoaXMucGFnZUluZm8uaXNBcnRpY2xlICYmIGRhdGEuaXNMaXN0KSB7XHJcblx0XHRcdFx0dGhpcy5wYWdldHlwZUxhYmVsLnNldExhYmVsKFwiTGlzdCBhcnRpY2xlXCIpLnRvZ2dsZSh0cnVlKTtcclxuXHRcdFx0fSBlbHNlIGlmIChkYXRhLm9yZXMpIHtcclxuXHRcdFx0XHR0aGlzLm9yZXNDbGFzcyA9IGRhdGEub3Jlcy5wcmVkaWN0aW9uO1xyXG5cdFx0XHRcdHRoaXMub3Jlc0xhYmVsLnRvZ2dsZSh0cnVlKS4kZWxlbWVudC5maW5kKFwiLm9yZXNQcmVkaWN0aW9uXCIpLmFwcGVuZChcclxuXHRcdFx0XHRcdFwiUHJlZGljdGlvbjogXCIsXHJcblx0XHRcdFx0XHQkKFwiPHN0cm9uZz5cIikudGV4dChkYXRhLm9yZXMucHJlZGljdGlvbiksXHJcblx0XHRcdFx0XHRcIiZuYnNwOyhcIiArIGRhdGEub3Jlcy5wcm9iYWJpbGl0eSArIFwiKVwiXHJcblx0XHRcdFx0KTtcclxuXHRcdFx0fSBlbHNlIGlmICh0aGlzLnBhZ2VJbmZvLmlzQXJ0aWNsZSkge1xyXG5cdFx0XHRcdHRoaXMucGFnZXR5cGVMYWJlbC5zZXRMYWJlbChcIkFydGljbGUgcGFnZVwiKS50b2dnbGUodHJ1ZSk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0dGhpcy5wYWdldHlwZUxhYmVsLnNldExhYmVsKCB0aGlzLnN1YmplY3RQYWdlLmdldE5hbWVzcGFjZVByZWZpeCgpLnNsaWNlKDAsLTEpICsgXCIgcGFnZVwiICkudG9nZ2xlKHRydWUpO1xyXG5cdFx0XHR9XHJcblx0XHRcdC8vIFNldCBwcm9wcyBmb3IgdXNlIGluIG1ha2luZyB3aWtpdGV4dCBhbmQgZWRpdCBzdW1tYXJpZXNcclxuXHRcdFx0dGhpcy50YWxrV2lraXRleHQgPSBkYXRhLnRhbGtXaWtpdGV4dDtcclxuXHRcdFx0dGhpcy5leGlzdGluZ0Jhbm5lck5hbWVzID0gZGF0YS5iYW5uZXJzLm1hcCggYmFubmVyVGVtcGxhdGUgPT4gYmFubmVyVGVtcGxhdGUubmFtZSApO1xyXG5cdFx0XHR0aGlzLnRhbGtwYWdlID0gZGF0YS50YWxrcGFnZTtcclxuXHRcdFx0Ly8gRm9yY2UgYSBzaXplIHVwZGF0ZSB0byBlbnN1cmUgZXZleXRoaW5nIGZpdHMgb2theVxyXG5cdFx0XHR0aGlzLnVwZGF0ZVNpemUoKTtcclxuXHRcdH0sIHRoaXMgKTtcclxufTtcclxuXHJcbi8vIFNldCB1cCB0aGUgd2luZG93IGl0IGlzIHJlYWR5OiBhdHRhY2hlZCB0byB0aGUgRE9NLCBhbmQgb3BlbmluZyBhbmltYXRpb24gY29tcGxldGVkXHJcbk1haW5XaW5kb3cucHJvdG90eXBlLmdldFJlYWR5UHJvY2VzcyA9IGZ1bmN0aW9uICggZGF0YSApIHtcclxuXHRkYXRhID0gZGF0YSB8fCB7fTtcclxuXHRyZXR1cm4gTWFpbldpbmRvdy5zdXBlci5wcm90b3R5cGUuZ2V0UmVhZHlQcm9jZXNzLmNhbGwoIHRoaXMsIGRhdGEgKVxyXG5cdFx0Lm5leHQoICgpID0+IHRoaXMudG9wQmFyLnNlYXJjaEJveC5mb2N1cygpICk7XHJcbn07XHJcblxyXG4vLyBVc2UgdGhlIGdldEFjdGlvblByb2Nlc3MoKSBtZXRob2QgdG8gZG8gdGhpbmdzIHdoZW4gYWN0aW9ucyBhcmUgY2xpY2tlZFxyXG5NYWluV2luZG93LnByb3RvdHlwZS5nZXRBY3Rpb25Qcm9jZXNzID0gZnVuY3Rpb24gKCBhY3Rpb24gKSB7XHJcblx0aWYgKCBhY3Rpb24gPT09IFwic2hvd1ByZWZzXCIgKSB7XHJcblx0XHR0aGlzLmFjdGlvbnMuc2V0TW9kZShcInByZWZzXCIpO1xyXG5cdFx0dGhpcy5jb250ZW50QXJlYS5zZXRJdGVtKCB0aGlzLnByZWZzTGF5b3V0ICk7XHJcblx0XHR0aGlzLnRvcEJhci5zZXREaXNhYmxlZCh0cnVlKTtcclxuXHRcdHRoaXMudXBkYXRlU2l6ZSgpO1xyXG5cclxuXHR9IGVsc2UgaWYgKCBhY3Rpb24gPT09IFwic2F2ZVByZWZzXCIgKSB7XHJcblx0XHR2YXIgdXBkYXRlZFByZWZzID0gdGhpcy5wcmVmc0Zvcm0uZ2V0UHJlZnMoKTtcclxuXHRcdHJldHVybiBuZXcgT08udWkuUHJvY2VzcygpLm5leHQoXHJcblx0XHRcdEFwaVNldFByZWZzKHVwZGF0ZWRQcmVmcykudGhlbihcclxuXHRcdFx0XHQvLyBTdWNjZXNzXHJcblx0XHRcdFx0KCkgPT4ge1xyXG5cdFx0XHRcdFx0dGhpcy5zZXRQcmVmZXJlbmNlcyh1cGRhdGVkUHJlZnMpO1xyXG5cdFx0XHRcdFx0dGhpcy5hY3Rpb25zLnNldE1vZGUoXCJlZGl0XCIpO1xyXG5cdFx0XHRcdFx0dGhpcy5jb250ZW50QXJlYS5zZXRJdGVtKCB0aGlzLmVkaXRMYXlvdXQgKTtcclxuXHRcdFx0XHRcdHRoaXMudG9wQmFyLnNldERpc2FibGVkKGZhbHNlKTtcclxuXHRcdFx0XHRcdHRoaXMudXBkYXRlU2l6ZSgpO1xyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0Ly8gRmFpbHVyZVxyXG5cdFx0XHRcdChjb2RlLCBlcnIpID0+ICQuRGVmZXJyZWQoKS5yZWplY3QoXHJcblx0XHRcdFx0XHRuZXcgT08udWkuRXJyb3IoXHJcblx0XHRcdFx0XHRcdCQoXCI8ZGl2PlwiKS5hcHBlbmQoXHJcblx0XHRcdFx0XHRcdFx0JChcIjxzdHJvbmcgc3R5bGU9J2Rpc3BsYXk6YmxvY2s7Jz5cIikudGV4dChcIkNvdWxkIG5vdCBzYXZlIHByZWZlcmVuY2VzLlwiKSxcclxuXHRcdFx0XHRcdFx0XHQkKFwiPHNwYW4gc3R5bGU9J2NvbG9yOiM3NzcnPlwiKS50ZXh0KCBtYWtlRXJyb3JNc2coY29kZSwgZXJyKSApXHJcblx0XHRcdFx0XHRcdClcclxuXHRcdFx0XHRcdClcclxuXHRcdFx0XHQpXHJcblx0XHRcdClcclxuXHRcdCk7XHJcblxyXG5cdH0gZWxzZSBpZiAoIGFjdGlvbiA9PT0gXCJjbGVhckNhY2hlXCIgKSB7XHJcblx0XHRyZXR1cm4gbmV3IE9PLnVpLlByb2Nlc3MoKS5uZXh0KCgpID0+IHtcclxuXHRcdFx0Y2FjaGUuY2xlYXJBbGxJdGVtcygpO1xyXG5cdFx0XHR0aGlzLmNsb3NlKHtyZXN0YXJ0OiB0cnVlfSk7XHJcblx0XHR9KTtcclxuXHJcblxyXG5cdH0gZWxzZSBpZiAoIGFjdGlvbiA9PT0gXCJjbG9zZVByZWZzXCIgKSB7XHJcblx0XHR0aGlzLmFjdGlvbnMuc2V0TW9kZShcImVkaXRcIik7XHJcblx0XHR0aGlzLmNvbnRlbnRBcmVhLnNldEl0ZW0oIHRoaXMuZWRpdExheW91dCApO1xyXG5cdFx0dGhpcy50b3BCYXIuc2V0RGlzYWJsZWQoZmFsc2UpO1xyXG5cdFx0dGhpcy5wcmVmc0Zvcm0uc2V0UHJlZlZhbHVlcyh0aGlzLnByZWZlcmVuY2VzKTtcclxuXHRcdHRoaXMudXBkYXRlU2l6ZSgpO1xyXG5cclxuXHR9IGVsc2UgaWYgKCBhY3Rpb24gPT09IFwic2F2ZVwiICkge1xyXG5cdFx0cmV0dXJuIG5ldyBPTy51aS5Qcm9jZXNzKCkubmV4dChcclxuXHRcdFx0QVBJLmVkaXRXaXRoUmV0cnkoXHJcblx0XHRcdFx0dGhpcy50YWxrcGFnZS5nZXRQcmVmaXhlZFRleHQoKSxcclxuXHRcdFx0XHR7cnZzZWN0aW9uOiAwfSxcclxuXHRcdFx0XHRyZXZpc2lvbiA9PiAoe1xyXG5cdFx0XHRcdFx0c2VjdGlvbjogMCxcclxuXHRcdFx0XHRcdHRleHQ6IHRoaXMudHJhbnNmb3JtVGFsa1dpa2l0ZXh0KHJldmlzaW9uLmNvbnRlbnQpLFxyXG5cdFx0XHRcdFx0c3VtbWFyeTogdGhpcy5tYWtlRWRpdFN1bW1hcnkoKSxcclxuXHRcdFx0XHRcdHdhdGNobGlzdDogdGhpcy5wcmVmZXJlbmNlcy53YXRjaGxpc3RcclxuXHRcdFx0XHR9KVxyXG5cdFx0XHQpLmNhdGNoKChjb2RlLCBlcnIpID0+ICQuRGVmZXJyZWQoKS5yZWplY3QoXHJcblx0XHRcdFx0bmV3IE9PLnVpLkVycm9yKFxyXG5cdFx0XHRcdFx0JChcIjxkaXY+XCIpLmFwcGVuZChcclxuXHRcdFx0XHRcdFx0JChcIjxzdHJvbmcgc3R5bGU9J2Rpc3BsYXk6YmxvY2s7Jz5cIikudGV4dChcIkNvdWxkIG5vdCBzYXZlIHlvdXIgY2hhbmdlcy5cIiksXHJcblx0XHRcdFx0XHRcdCQoXCI8c3BhbiBzdHlsZT0nY29sb3I6Izc3Nyc+XCIpLnRleHQoIG1ha2VFcnJvck1zZyhjb2RlLCBlcnIpIClcclxuXHRcdFx0XHRcdClcclxuXHRcdFx0XHQpXHJcblx0XHRcdCkgKVxyXG5cdFx0KS5uZXh0KCAoKSA9PiB0aGlzLmNsb3NlKHtcclxuXHRcdFx0c3VjY2VzczogdHJ1ZSxcclxuXHRcdFx0dXBncmFkZWRTdHViOiB0aGlzLnBhZ2VJbmZvLmhhc1N0dWJ0YWcgJiYgdGhpcy5pc1JhdGVkQW5kTm90U3R1YigpXHJcblx0XHR9KSApO1xyXG5cclxuXHR9IGVsc2UgaWYgKCBhY3Rpb24gPT09IFwicHJldmlld1wiICkge1xyXG5cdFx0cmV0dXJuIG5ldyBPTy51aS5Qcm9jZXNzKCkubmV4dChcclxuXHRcdFx0QVBJLnBvc3Qoe1xyXG5cdFx0XHRcdGFjdGlvbjogXCJwYXJzZVwiLFxyXG5cdFx0XHRcdGNvbnRlbnRtb2RlbDogXCJ3aWtpdGV4dFwiLFxyXG5cdFx0XHRcdHRleHQ6IHRoaXMudHJhbnNmb3JtVGFsa1dpa2l0ZXh0KHRoaXMudGFsa1dpa2l0ZXh0KSArIFwiXFxuPGhyPlxcblwiICsgXCInJydFZGl0IHN1bW1hcnk6JycnIFwiICsgdGhpcy5tYWtlRWRpdFN1bW1hcnkoKSxcclxuXHRcdFx0XHR0aXRsZTogdGhpcy50YWxrcGFnZS5nZXRQcmVmaXhlZFRleHQoKSxcclxuXHRcdFx0XHRwc3Q6IDFcclxuXHRcdFx0fSkudGhlbiggcmVzdWx0ID0+IHtcclxuXHRcdFx0XHRpZiAoICFyZXN1bHQgfHwgIXJlc3VsdC5wYXJzZSB8fCAhcmVzdWx0LnBhcnNlLnRleHQgfHwgIXJlc3VsdC5wYXJzZS50ZXh0W1wiKlwiXSApIHtcclxuXHRcdFx0XHRcdHJldHVybiAkLkRlZmVycmVkKCkucmVqZWN0KFwiRW1wdHkgcmVzdWx0XCIpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHR2YXIgcHJldmlld0h0bWxTbmlwcGV0ID0gbmV3IE9PLnVpLkh0bWxTbmlwcGV0KHJlc3VsdC5wYXJzZS50ZXh0W1wiKlwiXSk7XHJcblxyXG5cdFx0XHRcdHRoaXMucGFyc2VkQ29udGVudFdpZGdldC5zZXRMYWJlbChwcmV2aWV3SHRtbFNuaXBwZXQpO1xyXG5cdFx0XHRcdHRoaXMucGFyc2VkQ29udGVudENvbnRhaW5lci5zZXRMYWJlbChcIlByZXZpZXc6XCIpO1xyXG5cdFx0XHRcdHRoaXMuYWN0aW9ucy5zZXRNb2RlKFwicHJldmlld1wiKTtcclxuXHRcdFx0XHR0aGlzLmNvbnRlbnRBcmVhLnNldEl0ZW0oIHRoaXMucGFyc2VkQ29udGVudExheW91dCApO1xyXG5cdFx0XHRcdHRoaXMudG9wQmFyLnNldERpc2FibGVkKHRydWUpO1xyXG5cdFx0XHRcdHRoaXMudXBkYXRlU2l6ZSgpO1xyXG5cdFx0XHR9KVxyXG5cdFx0XHRcdC5jYXRjaCggKGNvZGUsIGVycikgPT4gJC5EZWZlcnJlZCgpLnJlamVjdChcclxuXHRcdFx0XHRcdG5ldyBPTy51aS5FcnJvcihcclxuXHRcdFx0XHRcdFx0JChcIjxkaXY+XCIpLmFwcGVuZChcclxuXHRcdFx0XHRcdFx0XHQkKFwiPHN0cm9uZyBzdHlsZT0nZGlzcGxheTpibG9jazsnPlwiKS50ZXh0KFwiQ291bGQgbm90IHNob3cgY2hhbmdlcy5cIiksXHJcblx0XHRcdFx0XHRcdFx0JChcIjxzcGFuIHN0eWxlPSdjb2xvcjojNzc3Jz5cIikudGV4dCggbWFrZUVycm9yTXNnKGNvZGUsIGVycikgKVxyXG5cdFx0XHRcdFx0XHQpXHJcblx0XHRcdFx0XHQpXHJcblx0XHRcdFx0KSApXHJcblx0XHQpO1xyXG5cclxuXHR9IGVsc2UgaWYgKCBhY3Rpb24gPT09IFwiY2hhbmdlc1wiICkge1xyXG5cdFx0cmV0dXJuIG5ldyBPTy51aS5Qcm9jZXNzKCkubmV4dChcclxuXHRcdFx0QVBJLnBvc3Qoe1xyXG5cdFx0XHRcdGFjdGlvbjogXCJjb21wYXJlXCIsXHJcblx0XHRcdFx0Zm9ybWF0OiBcImpzb25cIixcclxuXHRcdFx0XHRmcm9tdGV4dDogdGhpcy50YWxrV2lraXRleHQsXHJcblx0XHRcdFx0ZnJvbWNvbnRlbnRtb2RlbDogXCJ3aWtpdGV4dFwiLFxyXG5cdFx0XHRcdHRvdGV4dDogdGhpcy50cmFuc2Zvcm1UYWxrV2lraXRleHQodGhpcy50YWxrV2lraXRleHQpLFxyXG5cdFx0XHRcdHRvY29udGVudG1vZGVsOiBcIndpa2l0ZXh0XCIsXHJcblx0XHRcdFx0cHJvcDogXCJkaWZmXCJcclxuXHRcdFx0fSlcclxuXHRcdFx0XHQudGhlbiggcmVzdWx0ID0+IHtcclxuXHRcdFx0XHRcdGlmICggIXJlc3VsdCB8fCAhcmVzdWx0LmNvbXBhcmUgfHwgIXJlc3VsdC5jb21wYXJlW1wiKlwiXSApIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuICQuRGVmZXJyZWQoKS5yZWplY3QoXCJFbXB0eSByZXN1bHRcIik7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR2YXIgJGRpZmYgPSAkKFwiPHRhYmxlPlwiKS5hZGRDbGFzcyhcImRpZmZcIikuY3NzKFwid2lkdGhcIiwgXCIxMDAlXCIpLmFwcGVuZChcclxuXHRcdFx0XHRcdFx0JChcIjx0cj5cIikuYXBwZW5kKFxyXG5cdFx0XHRcdFx0XHRcdCQoXCI8dGg+XCIpLmF0dHIoe1wiY29sc3BhblwiOlwiMlwiLCBcInNjb3BlXCI6XCJjb2xcIn0pLmNzcyhcIndpZHRoXCIsIFwiNTAlXCIpLnRleHQoXCJMYXRlc3QgcmV2aXNpb25cIiksXHJcblx0XHRcdFx0XHRcdFx0JChcIjx0aD5cIikuYXR0cih7XCJjb2xzcGFuXCI6XCIyXCIsIFwic2NvcGVcIjpcImNvbFwifSkuY3NzKFwid2lkdGhcIiwgXCI1MCVcIikudGV4dChcIk5ldyB0ZXh0XCIpXHJcblx0XHRcdFx0XHRcdCksXHJcblx0XHRcdFx0XHRcdHJlc3VsdC5jb21wYXJlW1wiKlwiXSxcclxuXHRcdFx0XHRcdFx0JChcIjx0Zm9vdD5cIikuYXBwZW5kKFxyXG5cdFx0XHRcdFx0XHRcdCQoXCI8dHI+XCIpLmFwcGVuZChcclxuXHRcdFx0XHRcdFx0XHRcdCQoXCI8dGQgY29sc3Bhbj0nNCc+XCIpLmFwcGVuZChcclxuXHRcdFx0XHRcdFx0XHRcdFx0JChcIjxzdHJvbmc+XCIpLnRleHQoXCJFZGl0IHN1bW1hcnk6IFwiKSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5tYWtlRWRpdFN1bW1hcnkoKVxyXG5cdFx0XHRcdFx0XHRcdFx0KVxyXG5cdFx0XHRcdFx0XHRcdClcclxuXHRcdFx0XHRcdFx0KVxyXG5cdFx0XHRcdFx0KTtcclxuXHJcblx0XHRcdFx0XHR0aGlzLnBhcnNlZENvbnRlbnRXaWRnZXQuc2V0TGFiZWwoJGRpZmYpO1xyXG5cdFx0XHRcdFx0dGhpcy5wYXJzZWRDb250ZW50Q29udGFpbmVyLnNldExhYmVsKFwiQ2hhbmdlczpcIik7XHJcblx0XHRcdFx0XHR0aGlzLmFjdGlvbnMuc2V0TW9kZShcImRpZmZcIik7XHJcblx0XHRcdFx0XHR0aGlzLmNvbnRlbnRBcmVhLnNldEl0ZW0oIHRoaXMucGFyc2VkQ29udGVudExheW91dCApO1xyXG5cdFx0XHRcdFx0dGhpcy50b3BCYXIuc2V0RGlzYWJsZWQodHJ1ZSk7XHJcblx0XHRcdFx0XHR0aGlzLnVwZGF0ZVNpemUoKTtcclxuXHRcdFx0XHR9IClcclxuXHRcdFx0XHQuY2F0Y2goIChjb2RlLCBlcnIpID0+ICQuRGVmZXJyZWQoKS5yZWplY3QoXHJcblx0XHRcdFx0XHRuZXcgT08udWkuRXJyb3IoXHJcblx0XHRcdFx0XHRcdCQoXCI8ZGl2PlwiKS5hcHBlbmQoXHJcblx0XHRcdFx0XHRcdFx0JChcIjxzdHJvbmcgc3R5bGU9J2Rpc3BsYXk6YmxvY2s7Jz5cIikudGV4dChcIkNvdWxkIG5vdCBzaG93IGNoYW5nZXMuXCIpLFxyXG5cdFx0XHRcdFx0XHRcdCQoXCI8c3BhbiBzdHlsZT0nY29sb3I6Izc3Nyc+XCIpLnRleHQoIG1ha2VFcnJvck1zZyhjb2RlLCBlcnIpIClcclxuXHRcdFx0XHRcdFx0KVxyXG5cdFx0XHRcdFx0KVxyXG5cdFx0XHRcdCkgKVxyXG5cdFx0KTtcclxuXHJcblx0fSBlbHNlIGlmICggYWN0aW9uID09PSBcImJhY2tcIiApIHtcclxuXHRcdHRoaXMuYWN0aW9ucy5zZXRNb2RlKFwiZWRpdFwiKTtcclxuXHRcdHRoaXMuY29udGVudEFyZWEuc2V0SXRlbSggdGhpcy5lZGl0TGF5b3V0ICk7XHJcblx0XHR0aGlzLnRvcEJhci5zZXREaXNhYmxlZChmYWxzZSk7XHJcblx0XHR0aGlzLnVwZGF0ZVNpemUoKTtcclxuXHJcblx0fSBlbHNlIGlmICghYWN0aW9uICYmIHRoaXMuYmFubmVyTGlzdC5jaGFuZ2VkKSB7XHJcblx0XHQvLyBDb25maXJtIGNsb3Npbmcgb2YgZGlhbG9nIGlmIHRoZXJlIGhhdmUgYmVlbiBjaGFuZ2VzIFxyXG5cdFx0cmV0dXJuIG5ldyBPTy51aS5Qcm9jZXNzKCkubmV4dChcclxuXHRcdFx0T08udWkuY29uZmlybShcIkNoYW5nZXMgbWFkZSB3aWxsIGJlIGRpc2NhcmRlZC5cIiwge3RpdGxlOlwiQ2xvc2UgUmF0ZXI/XCJ9KVxyXG5cdFx0XHRcdC50aGVuKGNvbmZpcm1lZCA9PiBjb25maXJtZWQgPyB0aGlzLmNsb3NlKCkgOiBudWxsKVxyXG5cdFx0KTtcclxuXHR9XHJcblxyXG5cdHJldHVybiBNYWluV2luZG93LnN1cGVyLnByb3RvdHlwZS5nZXRBY3Rpb25Qcm9jZXNzLmNhbGwoIHRoaXMsIGFjdGlvbiApO1xyXG59O1xyXG5cclxuLy8gVXNlIHRoZSBnZXRUZWFyZG93blByb2Nlc3MoKSBtZXRob2QgdG8gcGVyZm9ybSBhY3Rpb25zIHdoZW5ldmVyIHRoZSBkaWFsb2cgaXMgY2xvc2VkLlxyXG4vLyBgZGF0YWAgaXMgdGhlIGRhdGEgcGFzc2VkIGludG8gdGhlIHdpbmRvdydzIC5jbG9zZSgpIG1ldGhvZC5cclxuTWFpbldpbmRvdy5wcm90b3R5cGUuZ2V0VGVhcmRvd25Qcm9jZXNzID0gZnVuY3Rpb24gKCBkYXRhICkge1xyXG5cdHJldHVybiBNYWluV2luZG93LnN1cGVyLnByb3RvdHlwZS5nZXRUZWFyZG93blByb2Nlc3MuY2FsbCggdGhpcywgZGF0YSApXHJcblx0XHQuZmlyc3QoICgpID0+IHtcclxuXHRcdFx0dGhpcy5iYW5uZXJMaXN0LmNsZWFySXRlbXMoKTtcclxuXHRcdFx0dGhpcy50b3BCYXIuc2VhcmNoQm94LnNldFZhbHVlKFwiXCIpO1xyXG5cdFx0XHR0aGlzLmNvbnRlbnRBcmVhLnNldEl0ZW0oIHRoaXMuZWRpdExheW91dCApO1xyXG5cdFx0XHR0aGlzLnRvcEJhci5zZXREaXNhYmxlZChmYWxzZSk7XHJcblx0XHRcdHRoaXMub3Jlc0xhYmVsLnRvZ2dsZShmYWxzZSkuJGVsZW1lbnQuZmluZChcIi5vcmVzUHJlZGljdGlvblwiKS5lbXB0eSgpO1xyXG5cdFx0XHR0aGlzLnBhZ2V0eXBlTGFiZWwudG9nZ2xlKGZhbHNlKS5zZXRMYWJlbChcIlwiKTtcclxuXHJcblx0XHRcdHRoaXMuJGVsZW1lbnQuZmluZChcIi5vby11aS13aW5kb3ctZnJhbWVcIikuY3NzKFwidHJhbnNmb3JtXCIsXCJcIik7XHJcblx0XHRcdHRoaXMuJGVsZW1lbnQuZmluZChcIi5vby11aS1wcm9jZXNzRGlhbG9nLWxvY2F0aW9uXCIpLm9mZihcIi5yYXRlck1haW5XaW5cIik7XHJcblx0XHRcdCQoXCJib2R5XCIpLm9mZihcIi5yYXRlck1haW5XaW5cIik7XHJcblx0XHR9ICk7XHJcbn07XHJcblxyXG5NYWluV2luZG93LnByb3RvdHlwZS5zZXRQcmVmZXJlbmNlcyA9IGZ1bmN0aW9uKHByZWZzKSB7XHJcblx0dGhpcy5wcmVmZXJlbmNlcyA9ICQuZXh0ZW5kKHt9LCBhcHBDb25maWcuZGVmYXVsdFByZWZzLCBwcmVmcyk7XHJcblx0Ly8gQXBwbGllcyBwcmVmZXJlbmNlcyB0byBleGlzdGluZyBpdGVtcyBpbiB0aGUgd2luZG93OlxyXG5cdHRoaXMuYmFubmVyTGlzdC5zZXRQcmVmZXJlbmNlcyh0aGlzLnByZWZlcmVuY2VzKTtcclxufTtcclxuXHJcbk1haW5XaW5kb3cucHJvdG90eXBlLm9uUmVzZXRDYWNoZSA9IGZ1bmN0aW9uKCkge1xyXG5cdHRoaXMuZXhlY3V0ZUFjdGlvbihcImNsZWFyQ2FjaGVcIik7XHJcbn07XHJcblxyXG5NYWluV2luZG93LnByb3RvdHlwZS5vblNlYXJjaFNlbGVjdCA9IGZ1bmN0aW9uKGRhdGEpIHtcclxuXHR0aGlzLnRvcEJhci5zZWFyY2hCb3gucHVzaFBlbmRpbmcoKTtcclxuXHR2YXIgbmFtZSA9IHRoaXMudG9wQmFyLnNlYXJjaEJveC5nZXRWYWx1ZSgpLnRyaW0oKTtcclxuXHRpZiAoIW5hbWUpIHtcclxuXHRcdHRoaXMudG9wQmFyLnNlYXJjaEJveC5wb3BQZW5kaW5nKCkuZm9jdXMoKTtcclxuXHRcdHJldHVybjtcclxuXHR9XHJcblx0dmFyIGV4aXN0aW5nQmFubmVyID0gdGhpcy5iYW5uZXJMaXN0Lml0ZW1zLmZpbmQoYmFubmVyID0+IHtcclxuXHRcdHJldHVybiBiYW5uZXIubWFpblRleHQgPT09IG5hbWUgfHxcdGJhbm5lci5yZWRpcmVjdFRhcmdldE1haW5UZXh0ID09PSBuYW1lO1xyXG5cdH0pO1xyXG5cclxuXHQvLyBBYm9ydCBhbmQgc2hvdyBhbGVydCBpZiBiYW5uZXIgYWxyZWFkeSBleGlzdHNcclxuXHRpZiAoZXhpc3RpbmdCYW5uZXIpIHtcclxuXHRcdHRoaXMudG9wQmFyLnNlYXJjaEJveC5wb3BQZW5kaW5nKCk7XHJcblx0XHRyZXR1cm4gT08udWkuYWxlcnQoXCJUaGVyZSBpcyBhbHJlYWR5IGEge3tcIiArIG5hbWUgKyBcIn19IGJhbm5lclwiKS50aGVuKHRoaXMuc2VhcmNoQm94LmZvY3VzKCkpO1xyXG5cdH1cclxuXHJcblx0Ly8gQ29uZmlybWF0aW9uIHJlcXVpcmVkIGZvciBiYW5uZXJzIG1pc3NpbmcgV2lraVByb2plY3QgZnJvbSBuYW1lLCBhbmQgZm9yIHVuY3JlYXRlZCBkaXNhbWJpZ3VhdGlvbiB0YWxrIHBhZ2VzXHJcblx0dmFyIGNvbmZpcm1UZXh0O1xyXG5cdGlmICghL15bV3ddKD86UHxpa2lbUHBdcm9qZWN0KS8udGVzdChuYW1lKSkge1xyXG5cdFx0Y29uZmlybVRleHQgPSBuZXcgT08udWkuSHRtbFNuaXBwZXQoXHJcblx0XHRcdFwie3tcIiArIG13Lmh0bWwuZXNjYXBlKG5hbWUpICsgXCJ9fSBpcyBub3QgYSByZWNvZ25pc2VkIFdpa2lQcm9qZWN0IGJhbm5lci48YnIvPkRvIHlvdSB3YW50IHRvIGNvbnRpbnVlP1wiXHJcblx0XHQpO1xyXG5cdH0gZWxzZSBpZiAobmFtZSA9PT0gXCJXaWtpUHJvamVjdCBEaXNhbWJpZ3VhdGlvblwiICYmICQoXCIjY2EtdGFsay5uZXdcIikubGVuZ3RoICE9PSAwICYmIHRoaXMuYmFubmVyTGlzdC5pdGVtcy5sZW5ndGggPT09IDApIHtcclxuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2VsZXNzLWVzY2FwZVxyXG5cdFx0Y29uZmlybVRleHQgPSBcIk5ldyB0YWxrIHBhZ2VzIHNob3VsZG4ndCBiZSBjcmVhdGVkIGlmIHRoZXkgd2lsbCBvbmx5IGNvbnRhaW4gdGhlIFxce1xce1dpa2lQcm9qZWN0IERpc2FtYmlndWF0aW9uXFx9XFx9IGJhbm5lci4gQ29udGludWU/XCI7XHJcblx0fVxyXG5cdCQud2hlbiggY29uZmlybVRleHQgPyBPTy51aS5jb25maXJtKGNvbmZpcm1UZXh0KSA6IHRydWUpXHJcblx0XHQudGhlbiggY29uZmlybWVkID0+IHtcclxuXHRcdFx0aWYgKCFjb25maXJtZWQpIHJldHVybjtcclxuXHRcdFx0Ly8gQ3JlYXRlIFRlbXBsYXRlIG9iamVjdFxyXG5cdFx0XHRyZXR1cm4gQmFubmVyV2lkZ2V0Lm5ld0Zyb21UZW1wbGF0ZU5hbWUobmFtZSwgZGF0YSwge1xyXG5cdFx0XHRcdHByZWZlcmVuY2VzOiB0aGlzLnByZWZlcmVuY2VzLFxyXG5cdFx0XHRcdCRvdmVybGF5OiB0aGlzLiRvdmVybGF5LFxyXG5cdFx0XHRcdGlzQXJ0aWNsZTogdGhpcy5wYWdlSW5mby5pc0FydGljbGVcclxuXHRcdFx0fSlcclxuXHRcdFx0XHQudGhlbihiYW5uZXIgPT4ge1xyXG5cdFx0XHRcdFx0dGhpcy5iYW5uZXJMaXN0LmFkZEl0ZW1zKCBbYmFubmVyXSApO1xyXG5cdFx0XHRcdFx0YmFubmVyLnNldENoYW5nZWQoKTtcclxuXHRcdFx0XHRcdHRoaXMudXBkYXRlU2l6ZSgpO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0fSlcclxuXHRcdC50aGVuKCAoKSA9PiB0aGlzLnRvcEJhci5zZWFyY2hCb3guc2V0VmFsdWUoXCJcIikuZm9jdXMoKS5wb3BQZW5kaW5nKCkgKTtcclxufTtcclxuXHJcbk1haW5XaW5kb3cucHJvdG90eXBlLm9uU2V0Q2xhc3NlcyA9IGZ1bmN0aW9uKGNsYXNzVmFsKSB7XHJcblx0Y29uc3Qgc2hlbGxUZW1wbGF0ZSA9IHRoaXMuYmFubmVyTGlzdC5pdGVtcy5maW5kKGJhbm5lciA9PiBiYW5uZXIuaXNTaGVsbFRlbXBsYXRlKTtcclxuXHRpZiAoc2hlbGxUZW1wbGF0ZSkge1xyXG5cdFx0c2hlbGxUZW1wbGF0ZS5jbGFzc0Ryb3Bkb3duLmdldE1lbnUoKS5zZWxlY3RJdGVtQnlEYXRhKGNsYXNzVmFsKTtcclxuXHRcdHNoZWxsVGVtcGxhdGUuY2xhc3NEcm9wZG93bi5zZXRBdXRvZmlsbGVkKGZhbHNlKTtcclxuXHR9XHJcblx0dGhpcy5iYW5uZXJMaXN0Lml0ZW1zLmZvckVhY2goYmFubmVyID0+IHtcclxuXHRcdGlmIChiYW5uZXIuaGFzQ2xhc3NSYXRpbmdzICYmIWJhbm5lci5pc1NoZWxsVGVtcGxhdGUpIHtcclxuXHRcdFx0YmFubmVyLmNsYXNzRHJvcGRvd24uZ2V0TWVudSgpLnNlbGVjdEl0ZW1CeURhdGEoc2hlbGxUZW1wbGF0ZSA/IG51bGwgOiBjbGFzc1ZhbCk7XHJcblx0XHRcdGJhbm5lci5jbGFzc0Ryb3Bkb3duLnNldEF1dG9maWxsZWQoZmFsc2UpO1xyXG5cdFx0fVxyXG5cdH0pO1xyXG59O1xyXG5cclxuTWFpbldpbmRvdy5wcm90b3R5cGUub25TZXRJbXBvcnRhbmNlcyA9IGZ1bmN0aW9uKGltcG9ydGFuY2VWYWwpIHtcclxuXHR0aGlzLmJhbm5lckxpc3QuaXRlbXMuZm9yRWFjaChiYW5uZXIgPT4ge1xyXG5cdFx0aWYgKGJhbm5lci5oYXNJbXBvcnRhbmNlUmF0aW5ncykge1xyXG5cdFx0XHRiYW5uZXIuaW1wb3J0YW5jZURyb3Bkb3duLmdldE1lbnUoKS5zZWxlY3RJdGVtQnlEYXRhKGltcG9ydGFuY2VWYWwpO1xyXG5cdFx0XHRiYW5uZXIuaW1wb3J0YW5jZURyb3Bkb3duLnNldEF1dG9maWxsZWQoZmFsc2UpO1xyXG5cdFx0fVxyXG5cdH0pO1xyXG59O1xyXG5cclxuTWFpbldpbmRvdy5wcm90b3R5cGUub25SZW1vdmVBbGwgPSBmdW5jdGlvbigpIHtcclxuXHR0aGlzLmJhbm5lckxpc3QuY2xlYXJJdGVtcygpO1xyXG59O1xyXG5cclxuTWFpbldpbmRvdy5wcm90b3R5cGUub25DbGVhckFsbCA9IGZ1bmN0aW9uKCkge1xyXG5cdHRoaXMuYmFubmVyTGlzdC5pdGVtcy5mb3JFYWNoKCBiYW5uZXIgPT4gYmFubmVyLm9uQ2xlYXJCdXR0b25DbGljaygpICk7XHJcbn07XHJcblxyXG5NYWluV2luZG93LnByb3RvdHlwZS50cmFuc2Zvcm1UYWxrV2lraXRleHQgPSBmdW5jdGlvbih0YWxrV2lraXRleHQpIHtcclxuXHR2YXIgYmFubmVyc1dpa2l0ZXh0ID0gdGhpcy5iYW5uZXJMaXN0Lm1ha2VXaWtpdGV4dCgpO1xyXG5cdGlmICghdGFsa1dpa2l0ZXh0KSB7XHJcblx0XHRyZXR1cm4gYmFubmVyc1dpa2l0ZXh0LnRyaW0oKTtcclxuXHR9XHJcblx0Ly8gUmVwYXJzZSB0ZW1wbGF0ZXMsIGluIGNhc2UgdGFsa3BhZ2Ugd2lraXRleHQgaGFzIGNoYW5nZWRcclxuXHR2YXIgdGFsa1RlbXBsYXRlcyA9IHBhcnNlVGVtcGxhdGVzKHRhbGtXaWtpdGV4dCwgdHJ1ZSk7XHJcblx0Ly8gcmVwbGFjZSBleGlzdGluZyBiYW5uZXJzIHdpa2l0ZXh0IHdpdGggYSBjb250cm9sIGNoYXJhY3RlclxyXG5cdHRhbGtUZW1wbGF0ZXMuZm9yRWFjaCh0ZW1wbGF0ZSA9PiB7XHJcblx0XHRpZiAodGhpcy5leGlzdGluZ0Jhbm5lck5hbWVzLmluY2x1ZGVzKHRlbXBsYXRlLm5hbWUpKSB7XHJcblx0XHRcdHRhbGtXaWtpdGV4dCA9IHRhbGtXaWtpdGV4dC5yZXBsYWNlKHRlbXBsYXRlLndpa2l0ZXh0LCBcIlxceDAxXCIpO1xyXG5cdFx0fVxyXG5cdH0pO1xyXG5cdC8vIHJlcGxhY2UgaW5zZXJ0aW9uIHBvaW50IChmaXJzdCBjb250cm9sIGNoYXJhY3Rlcikgd2l0aCBhIGRpZmZlcmVudCBjb250cm9sIGNoYXJhY3RlclxyXG5cdHRhbGtXaWtpdGV4dCA9IHRhbGtXaWtpdGV4dC5yZXBsYWNlKFwiXFx4MDFcIiwgXCJcXHgwMlwiKTtcclxuXHQvLyByZW1vdmUgb3RoZXIgY29udHJvbCBjaGFyYWN0ZXJzXHJcblx0LyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnRyb2wtcmVnZXggKi9cclxuXHR0YWxrV2lraXRleHQgPSB0YWxrV2lraXRleHQucmVwbGFjZSgvKD86XFxzfFxcbikqXFx4MDEoPzpcXHN8XFxuKSovZyxcIlwiKTtcclxuXHQvLyBzcGxpdCBpbnRvIHdpa2l0ZXh0IGJlZm9yZS9hZnRlciB0aGUgcmVtYWluaW5nIGNvbnRyb2wgY2hhcmFjdGVyIChhbmQgdHJpbSBlYWNoIHNlY3Rpb24pXHJcblx0dmFyIHRhbGtXaWtpdGV4dFNlY3Rpb25zID0gdGFsa1dpa2l0ZXh0LnNwbGl0KFwiXFx4MDJcIikubWFwKHQgPT4gdC50cmltKCkpO1xyXG5cdGlmICh0YWxrV2lraXRleHRTZWN0aW9ucy5sZW5ndGggPT09IDIpIHtcclxuXHRcdC8vIEZvdW5kIHRoZSBpbnNlcnRpb24gcG9pbnQgZm9yIHRoZSBiYW5uZXJzXHJcblx0XHRyZXR1cm4gKHRhbGtXaWtpdGV4dFNlY3Rpb25zWzBdICsgXCJcXG5cIiArIGJhbm5lcnNXaWtpdGV4dC50cmltKCkgKyBcIlxcblwiICsgdGFsa1dpa2l0ZXh0U2VjdGlvbnNbMV0pLnRyaW0oKTtcclxuXHR9XHJcblx0Ly8gQ2hlY2sgaWYgdGhlcmUncyBhbnl0aGluZyBiZXNpZGUgdGVtcGxhdGVzXHJcblx0dmFyIHRlbXBTdHIgPSB0YWxrV2lraXRleHQ7XHJcblx0dGFsa1RlbXBsYXRlcy5mb3JFYWNoKHRlbXBsYXRlID0+IHtcclxuXHRcdHRlbXBTdHIgPSB0ZW1wU3RyLnJlcGxhY2UodGVtcGxhdGUud2lraXRleHQsIFwiXCIpO1xyXG5cdH0pO1xyXG5cdGlmICgvXiNSRURJUkVDVC9pLnRlc3QodGFsa1dpa2l0ZXh0KSB8fCAhdGVtcFN0ci50cmltKCkpIHtcclxuXHRcdC8vIElzIGEgcmVkaXJlY3QsIG9yIGV2ZXJ5dGhpbmcgaXMgYSB0ZW1wbGF0ZTogaW5zZXJ0IGF0IHRoZSBlbmRcclxuXHRcdHJldHVybiB0YWxrV2lraXRleHQudHJpbSgpICsgXCJcXG5cIiArIGJhbm5lcnNXaWtpdGV4dC50cmltKCk7XHJcblx0fSBlbHNlIHtcclxuXHRcdC8vIFRoZXJlIGlzIG5vbi10ZW1wbGF0ZSBjb250ZW50LCBzbyBpbnNlcnQgYXQgdGhlIHN0YXJ0XHJcblx0XHRyZXR1cm4gYmFubmVyc1dpa2l0ZXh0LnRyaW0oKSArIFwiXFxuXCIgKyB0YWxrV2lraXRleHQudHJpbSgpO1xyXG5cdH1cclxufTtcclxuXHJcbk1haW5XaW5kb3cucHJvdG90eXBlLmlzUmF0ZWRBbmROb3RTdHViID0gZnVuY3Rpb24oKSB7XHJcblx0Y29uc3Qgbm9uU3R1YlJhdGluZ2dzID0gdGhpcy5iYW5uZXJMaXN0Lml0ZW1zLmZpbHRlcihiYW5uZXIgPT5cclxuXHRcdGJhbm5lci5oYXNDbGFzc1JhdGluZ3MgJiZcclxuXHRcdGJhbm5lci5jbGFzc0Ryb3Bkb3duLmdldFZhbHVlKCkgJiZcclxuXHRcdGJhbm5lci5jbGFzc0Ryb3Bkb3duLmdldFZhbHVlKCkgIT09IFwiU3R1YlwiXHJcblx0KTtcclxuXHRyZXR1cm4gbm9uU3R1YlJhdGluZ2dzLmxlbmd0aCA+IDA7XHJcbn07XHJcblxyXG5NYWluV2luZG93LnByb3RvdHlwZS5tYWtlRWRpdFN1bW1hcnkgPSBmdW5jdGlvbigpIHtcclxuXHRjb25zdCByZW1vdmVkQmFubmVycyA9IFtdO1xyXG5cdGNvbnN0IGVkaXRlZEJhbm5lcnMgPSBbXTtcclxuXHRjb25zdCBuZXdCYW5uZXJzID0gW107XHJcblx0Y29uc3Qgc2hvcnROYW1lID0gbmFtZSA9PiBuYW1lLnJlcGxhY2UoXCJXaWtpUHJvamVjdCBcIixcIlwiKS5yZXBsYWNlKFwiU3Vic3Q6XCIsXCJcIik7XHJcblxyXG5cdC8vIE92ZXJhbGwgY2xhc3MvaW1wb3J0YW5jZSwgaWYgYWxsIHRoZSBzYW1lXHJcblx0Y29uc3QgYWxsQ2xhc3NlcyA9IHVuaXF1ZUFycmF5KFxyXG5cdFx0ZmlsdGVyQW5kTWFwKHRoaXMuYmFubmVyTGlzdC5pdGVtcyxcclxuXHRcdFx0YmFubmVyID0+IGJhbm5lci5oYXNDbGFzc1JhdGluZ3MgfHwgYmFubmVyLmlzU2hlbGxUZW1wbGF0ZSxcclxuXHRcdFx0YmFubmVyID0+IGJhbm5lci5jbGFzc0Ryb3Bkb3duLmdldFZhbHVlKClcclxuXHRcdClcclxuXHQpO1xyXG5cdGxldCBvdmVyYWxsQ2xhc3MgPSBhbGxDbGFzc2VzLmxlbmd0aCA9PT0gMSAmJiBhbGxDbGFzc2VzWzBdO1xyXG5cdGNvbnN0IGFsbEltcG9ydGFuY2VzID0gdW5pcXVlQXJyYXkoXHJcblx0XHRmaWx0ZXJBbmRNYXAodGhpcy5iYW5uZXJMaXN0Lml0ZW1zLFxyXG5cdFx0XHRiYW5uZXIgPT4gYmFubmVyLmhhc0ltcG9ydGFuY2VSYXRpbmdzLFxyXG5cdFx0XHRiYW5uZXIgPT4gYmFubmVyLmltcG9ydGFuY2VEcm9wZG93bi5nZXRWYWx1ZSgpXHJcblx0XHQpXHJcblx0KTtcclxuXHRsZXQgb3ZlcmFsbEltcG9ydGFuY2UgPSBhbGxJbXBvcnRhbmNlcy5sZW5ndGggPT09IDEgJiYgYWxsSW1wb3J0YW5jZXNbMF07XHJcblx0Ly8gRG9uJ3QgdXNlIHRoZW0gdW5sZXNzIHNvbWUgaGF2ZSBjaGFuZ2VkXHJcblx0bGV0IHNvbWVDbGFzc2VzQ2hhbmdlZCA9IGZhbHNlO1xyXG5cdGxldCBzb21lSW1wb3J0YW5jZXNDaGFuZ2VkID0gZmFsc2U7XHJcblxyXG5cdC8vIHJlbW92ZWQgYmFubmVyczpcclxuXHR0aGlzLmV4aXN0aW5nQmFubmVyTmFtZXMuZm9yRWFjaChuYW1lID0+IHtcclxuXHRcdGNvbnN0IGJhbm5lciA9IHRoaXMuYmFubmVyTGlzdC5pdGVtcy5maW5kKCBiYW5uZXIgPT4gYmFubmVyLm5hbWUgPT09IG5hbWUgfHwgYmFubmVyLmJ5cGFzc2VkTmFtZSA9PT0gbmFtZSApO1xyXG5cdFx0aWYgKCFiYW5uZXIpIHtcclxuXHRcdFx0cmVtb3ZlZEJhbm5lcnMucHVzaChcIuKIklwiICsgc2hvcnROYW1lKG5hbWUpKTtcclxuXHRcdH1cclxuXHR9KTtcclxuXHQvLyBlZGl0ZWQgJiBuZXcgYmFubmVyc1xyXG5cdHRoaXMuYmFubmVyTGlzdC5pdGVtcy5mb3JFYWNoKCBiYW5uZXIgPT4ge1xyXG5cdFx0Y29uc3QgaXNOZXcgPSAhYmFubmVyLndpa2l0ZXh0OyAvLyBub3QgYWRkZWQgZnJvbSB3aWtpdGV4dCBvbiBwYWdlXHJcblx0XHRpZiAoIWlzTmV3ICYmICFiYW5uZXIuY2hhbmdlZCkge1xyXG5cdFx0XHQvLyBOb3QgY2hhbmdlZFxyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblx0XHRsZXQgbmV3Q2xhc3MgPSBiYW5uZXIuaGFzQ2xhc3NSYXRpbmdzICYmICAoaXNOZXcgfHwgYmFubmVyLmNsYXNzQ2hhbmdlZCkgJiYgYmFubmVyLmNsYXNzRHJvcGRvd24uZ2V0VmFsdWUoKTtcclxuXHRcdGlmIChuZXdDbGFzcykgeyBzb21lQ2xhc3Nlc0NoYW5nZWQgPSB0cnVlOyB9XHJcblx0XHRpZiAob3ZlcmFsbENsYXNzKSB7IG5ld0NsYXNzID0gbnVsbDsgfVxyXG5cclxuXHRcdGxldCBuZXdJbXBvcnRhbmNlID0gYmFubmVyLmhhc0ltcG9ydGFuY2VSYXRpbmdzICYmIChpc05ldyB8fCBiYW5uZXIuaW1wb3J0YW5jZUNoYW5nZWQpICYmIGJhbm5lci5pbXBvcnRhbmNlRHJvcGRvd24uZ2V0VmFsdWUoKTtcclxuXHRcdGlmIChuZXdJbXBvcnRhbmNlKSB7IHNvbWVJbXBvcnRhbmNlc0NoYW5nZWQgPSB0cnVlOyB9XHJcblx0XHRpZiAob3ZlcmFsbEltcG9ydGFuY2UpIHsgbmV3SW1wb3J0YW5jZSA9IG51bGw7IH1cclxuXHJcblx0XHRsZXQgcmF0aW5nID0gKG5ld0NsYXNzICYmIG5ld0ltcG9ydGFuY2UpXHJcblx0XHRcdD8gbmV3Q2xhc3MgKyBcIi9cIiArIG5ld0ltcG9ydGFuY2VcclxuXHRcdFx0OiBuZXdDbGFzcyB8fCBuZXdJbXBvcnRhbmNlIHx8IFwiXCI7XHJcblx0XHRpZiAocmF0aW5nKSB7IHJhdGluZyA9IFwiIChcIiArIHJhdGluZyArIFwiKVwiOyB9XHJcblx0XHRcclxuXHRcdGlmIChpc05ldykge1xyXG5cdFx0XHRuZXdCYW5uZXJzLnB1c2goXCIrXCIgKyBzaG9ydE5hbWUoYmFubmVyLm5hbWUpICsgcmF0aW5nKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGVkaXRlZEJhbm5lcnMucHVzaChzaG9ydE5hbWUoYmFubmVyLm5hbWUpICsgcmF0aW5nKTtcclxuXHRcdH1cclxuXHR9KTtcclxuXHQvLyBvdmVyYWxsIHJhdGluZ1xyXG5cdGxldCBvdmVyYWxsUmF0aW5nID0gKHNvbWVDbGFzc2VzQ2hhbmdlZCAmJiBvdmVyYWxsQ2xhc3MgJiYgc29tZUltcG9ydGFuY2VzQ2hhbmdlZCAmJiBvdmVyYWxsSW1wb3J0YW5jZSlcclxuXHRcdD8gb3ZlcmFsbENsYXNzICsgXCIvXCIgKyBvdmVyYWxsSW1wb3J0YW5jZVxyXG5cdFx0OiAoc29tZUNsYXNzZXNDaGFuZ2VkICYmIG92ZXJhbGxDbGFzcykgfHwgKHNvbWVJbXBvcnRhbmNlc0NoYW5nZWQgJiYgb3ZlcmFsbEltcG9ydGFuY2UpIHx8IFwiXCI7XHJcblx0aWYgKG92ZXJhbGxSYXRpbmcpIHsgb3ZlcmFsbFJhdGluZyA9IFwiIChcIiArIG92ZXJhbGxSYXRpbmcgKyBcIilcIjsgfVxyXG5cclxuXHRyZXR1cm4gYEFzc2Vzc21lbnQke292ZXJhbGxSYXRpbmd9OiAke1suLi5lZGl0ZWRCYW5uZXJzLCAuLi5uZXdCYW5uZXJzLCAuLi5yZW1vdmVkQmFubmVyc10uam9pbihcIiwgXCIpfSR7YXBwQ29uZmlnLnNjcmlwdC5hZHZlcnR9YDtcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IE1haW5XaW5kb3c7XHJcbi8vIDwvbm93aWtpPiIsImltcG9ydCBjb25maWcgZnJvbSBcIi4vY29uZmlnXCI7XHJcbi8vIDxub3dpa2k+XHJcblxyXG52YXIgQVBJID0gbmV3IG13LkFwaSgge1xyXG5cdGFqYXg6IHtcclxuXHRcdGhlYWRlcnM6IHsgXHJcblx0XHRcdFwiQXBpLVVzZXItQWdlbnRcIjogXCJSYXRlci9cIiArIGNvbmZpZy5zY3JpcHQudmVyc2lvbiArIFxyXG5cdFx0XHRcdFwiICggaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVXNlcjpFdmFkMzcvUmF0ZXIgKVwiXHJcblx0XHR9XHJcblx0fVxyXG59ICk7XHJcblxyXG4vKiAtLS0tLS0tLS0tIEFQSSBmb3IgT1JFUyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXHJcbkFQSS5nZXRPUkVTID0gZnVuY3Rpb24ocmV2aXNpb25JRCkge1xyXG5cdHJldHVybiAkLmdldChcImh0dHBzOi8vb3Jlcy53aWtpbWVkaWEub3JnL3YzL3Njb3Jlcy9lbndpa2k/bW9kZWxzPWFydGljbGVxdWFsaXR5JnJldmlkcz1cIityZXZpc2lvbklEKTtcclxufTtcclxuXHJcbi8qIC0tLS0tLS0tLS0gUmF3IHdpa2l0ZXh0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cclxuQVBJLmdldFJhdyA9IGZ1bmN0aW9uKHBhZ2UpIHtcclxuXHRyZXR1cm4gJC5nZXQoXCJodHRwczpcIiArIGNvbmZpZy5tdy53Z1NlcnZlciArIG13LnV0aWwuZ2V0VXJsKHBhZ2UsIHthY3Rpb246XCJyYXdcIn0pKVxyXG5cdFx0LnRoZW4oZnVuY3Rpb24oZGF0YSkge1xyXG5cdFx0XHRpZiAoICFkYXRhICkge1xyXG5cdFx0XHRcdHJldHVybiAkLkRlZmVycmVkKCkucmVqZWN0KFwib2stYnV0LWVtcHR5XCIpO1xyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiBkYXRhO1xyXG5cdFx0fSk7XHJcbn07XHJcblxyXG4vKiAtLS0tLS0tLS0tIEVkaXQgd2l0aCByZXRyeSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXHJcbi8qKlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gdGl0bGVcclxuICogQHBhcmFtIHtPYmplY3Q/fSBwYXJhbXMgYWRkaXRpb25hbCBwYXJhbXMgZm9yIHRoZSBnZXQgcmVxdWVzdFxyXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxPYmplY3QsIHN0cmluZz59IHBhZ2UsIHN0YXJ0dGltZSB0aW1lc3RhbXBcclxuICovXHJcbnZhciBnZXRQYWdlID0gZnVuY3Rpb24odGl0bGUsIHBhcmFtcykge1xyXG5cdHJldHVybiBBUEkuZ2V0KFxyXG5cdFx0JC5leHRlbmQoXHJcblx0XHRcdHtcclxuXHRcdFx0XHRcImFjdGlvblwiOiBcInF1ZXJ5XCIsXHJcblx0XHRcdFx0XCJmb3JtYXRcIjogXCJqc29uXCIsXHJcblx0XHRcdFx0XCJjdXJ0aW1lc3RhbXBcIjogMSxcclxuXHRcdFx0XHRcInRpdGxlc1wiOiB0aXRsZSxcclxuXHRcdFx0XHRcInByb3BcIjogXCJyZXZpc2lvbnN8aW5mb1wiLFxyXG5cdFx0XHRcdFwicnZwcm9wXCI6IFwiY29udGVudHx0aW1lc3RhbXBcIixcclxuXHRcdFx0XHRcInJ2c2xvdHNcIjogXCJtYWluXCJcdFx0XHRcdFx0XHJcblx0XHRcdH0sXHJcblx0XHRcdHBhcmFtc1xyXG5cdFx0KVxyXG5cdCkudGhlbihyZXNwb25zZSA9PiB7XHJcblx0XHR2YXIgcGFnZSA9IE9iamVjdC52YWx1ZXMocmVzcG9uc2UucXVlcnkucGFnZXMpWzBdO1xyXG5cdFx0dmFyIHN0YXJ0dGltZSA9IHJlc3BvbnNlLmN1cnRpbWVzdGFtcDtcclxuXHRcdHJldHVybiAkLkRlZmVycmVkKCkucmVzb2x2ZShwYWdlLCBzdGFydHRpbWUpO1xyXG5cdH0pO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBwYWdlIGRldGFpbHMgb2JqZWN0IGZyb20gQVBJXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdGFydHRpbWUgdGltZXN0YW1wXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHRyYW5zZm9ybSBjYWxsYmFjayB0aGF0IHByZXBhcmVzIHRoZSBlZGl0OlxyXG4gKiAge09iamVjdH0gc2ltcGxpZmllZFBhZ2UgPT4ge09iamVjdHxQcm9taXNlPE9iamVjdD59IGVkaXQgcGFyYW1zXHJcbiAqIEByZXR1cm5zIHtQcm9taXNlPE9iamVjdD59IHBhcmFtcyBmb3IgZWRpdCBxdWVyeVxyXG4gKi9cclxudmFyIHByb2Nlc3NQYWdlID0gZnVuY3Rpb24ocGFnZSwgc3RhcnR0aW1lLCB0cmFuc2Zvcm0pIHtcclxuXHR2YXIgYmFzZXRpbWVzdGFtcCA9IHBhZ2UucmV2aXNpb25zICYmIHBhZ2UucmV2aXNpb25zWzBdLnRpbWVzdGFtcDtcclxuXHR2YXIgc2ltcGxpZmllZFBhZ2UgPSB7XHJcblx0XHRwYWdlaWQ6IHBhZ2UucGFnZWlkLFxyXG5cdFx0bWlzc2luZzogcGFnZS5taXNzaW5nID09PSBcIlwiLFxyXG5cdFx0cmVkaXJlY3Q6IHBhZ2UucmVkaXJlY3QgPT09IFwiXCIsXHJcblx0XHRjYXRlZ29yaWVzOiBwYWdlLmNhdGVnb3JpZXMsXHJcblx0XHRuczogcGFnZS5ucyxcclxuXHRcdHRpdGxlOiBwYWdlLnRpdGxlLFxyXG5cdFx0Y29udGVudDogcGFnZS5yZXZpc2lvbnMgJiYgcGFnZS5yZXZpc2lvbnNbMF0uc2xvdHMubWFpbltcIipcIl1cclxuXHR9O1xyXG5cdHJldHVybiAkLndoZW4oIHRyYW5zZm9ybShzaW1wbGlmaWVkUGFnZSkgKVxyXG5cdFx0LnRoZW4oIGVkaXRQYXJhbXMgPT5cclxuXHRcdFx0JC5leHRlbmQoIHtcclxuXHRcdFx0XHRhY3Rpb246IFwiZWRpdFwiLFxyXG5cdFx0XHRcdHRpdGxlOiBwYWdlLnRpdGxlLFxyXG5cdFx0XHRcdC8vIFByb3RlY3QgYWdhaW5zdCBlcnJvcnMgYW5kIGNvbmZsaWN0c1xyXG5cdFx0XHRcdGFzc2VydDogXCJ1c2VyXCIsXHJcblx0XHRcdFx0YmFzZXRpbWVzdGFtcDogYmFzZXRpbWVzdGFtcCxcclxuXHRcdFx0XHRzdGFydHRpbWVzdGFtcDogc3RhcnR0aW1lXHJcblx0XHRcdH0sIGVkaXRQYXJhbXMgKVxyXG5cdFx0KTtcclxufTtcclxuXHJcbi8qKiBlZGl0V2l0aFJldHJ5XHJcbiAqIFxyXG4gKiBFZGl0cyBhIHBhZ2UsIHJlc29sdmluZyBlZGl0IGNvbmZsaWN0cywgYW5kIHJldHJ5aW5nIGVkaXRzIHRoYXQgZmFpbC4gVGhlXHJcbiAqIHRyYW5mb3JtIGZ1bmN0aW9uIG1heSByZXR1cm4gYSByZWplY3RlZCBwcm9taXNlIGlmIHRoZSBwYWdlIHNob3VsZCBub3QgYmVcclxuICogZWRpdGVkOyB0aGUgQHJldHVybnMge1Byb21pc2V9IHdpbGwgd2lsbCBiZSByZWplY3RlZCB3aXRoIHRoZSBzYW1lIHJlamVjdGlvblxyXG4gKiB2YWx1ZXMuXHJcbiAqIFxyXG4gKiBOb3RlOiBVbmxpa2UgW213LkFwaSNFZGl0XSwgYSBtaXNzaW5nIHBhZ2Ugd2lsbCBiZSBjcmVhdGVkLCB1bmxlc3MgdGhlXHJcbiAqIHRyYW5zZm9ybSBjYWxsYmFjayBpbmNsdWRlcyB0aGUgXCJub2NyZWF0ZVwiIHBhcmFtLlxyXG4gKiBcclxuICogW213LkFwaSNFZGl0XTogPGh0dHBzOi8vZG9jLndpa2ltZWRpYS5vcmcvbWVkaWF3aWtpLWNvcmUvbWFzdGVyL2pzLyMhL2FwaS9tdy5BcGkucGx1Z2luLmVkaXQ+XHJcbiAqIFxyXG4gKiBAcGFyYW0ge1N0cmluZ30gdGl0bGUgcGFnZSB0byBiZSBlZGl0ZWRcclxuICogQHBhcmFtIHtPYmplY3R8bnVsbH0gZ2V0UGFyYW1zIGFkZGl0aW9uYWwgcGFyYW1zIGZvciB0aGUgZ2V0IHJlcXVlc3RcclxuICogQHBhcmFtIHtGdW5jdGlvbn0gdHJhbnNmb3JtIGNhbGxiYWNrIHRoYXQgcHJlcGFyZXMgdGhlIGVkaXQ6XHJcbiAqICB7T2JqZWN0fSBzaW1wbGlmaWVkUGFnZSA9PiB7T2JqZWN0fFByb21pc2U8T2JqZWN0Pn0gcGFyYW1zIGZvciBBUEkgZWRpdGluZ1xyXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxvYmplY3Q+fSBwcm9taXNlLCByZXNvbHZlZCBvbiBzdWNjZXNzLCByZWplY3RlZCBpZlxyXG4gKiAgcGFnZSB3YXMgbm90IGVkaXRlZFxyXG4gKi9cclxuQVBJLmVkaXRXaXRoUmV0cnkgPSBmdW5jdGlvbih0aXRsZSwgZ2V0UGFyYW1zLCB0cmFuc2Zvcm0pIHtcclxuXHRyZXR1cm4gZ2V0UGFnZSh0aXRsZSwgZ2V0UGFyYW1zKVxyXG5cdFx0LnRoZW4oXHJcblx0XHQvLyBTdWNjZXM6IHByb2Nlc3MgdGhlIHBhZ2VcclxuXHRcdFx0KHBhZ2UsIHN0YXJ0dGltZSkgPT4gcHJvY2Vzc1BhZ2UocGFnZSwgc3RhcnR0aW1lLCB0cmFuc2Zvcm0pLFxyXG5cdFx0XHQvLyBGYWlsdXJlOiB0cnkgYWdhaW5cclxuXHRcdFx0KCkgPT4gZ2V0UGFnZSh0aXRsZSwgZ2V0UGFyYW1zKS50aGVuKHByb2Nlc3NQYWdlLCB0cmFuc2Zvcm0pXHJcblx0XHQpXHJcblx0XHQudGhlbihlZGl0UGFyYW1zID0+XHJcblx0XHRcdEFQSS5wb3N0V2l0aFRva2VuKFwiY3NyZlwiLCBlZGl0UGFyYW1zKVxyXG5cdFx0XHRcdC5jYXRjaCggZXJyb3JDb2RlID0+IHtcclxuXHRcdFx0XHRcdGlmICggZXJyb3JDb2RlID09PSBcImVkaXRjb25mbGljdFwiICkge1xyXG5cdFx0XHRcdFx0XHQvLyBUcnkgYWdhaW4sIHN0YXJ0aW5nIG92ZXJcclxuXHRcdFx0XHRcdFx0cmV0dXJuIEFQSS5lZGl0V2l0aFJldHJ5KHRpdGxlLCBnZXRQYXJhbXMsIHRyYW5zZm9ybSk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHQvLyBUcnkgYWdhaW5cclxuXHRcdFx0XHRcdHJldHVybiBBUEkucG9zdFdpdGhUb2tlbihcImNzcmZcIiwgZWRpdFBhcmFtcyk7XHJcblx0XHRcdFx0fSlcclxuXHRcdCk7XHJcbn07XHJcblxyXG52YXIgbWFrZUVycm9yTXNnID0gZnVuY3Rpb24oZmlyc3QsIHNlY29uZCkge1xyXG5cdHZhciBjb2RlLCB4aHIsIG1lc3NhZ2U7XHJcblx0aWYgKCB0eXBlb2YgZmlyc3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHNlY29uZCA9PT0gXCJzdHJpbmdcIiApIHtcclxuXHRcdC8vIEVycm9ycyBmcm9tICQuZ2V0IGJlaW5nIHJlamVjdGVkIChPUkVTICYgUmF3IHdpa2l0ZXh0KVxyXG5cdFx0dmFyIGVycm9yT2JqID0gZmlyc3QucmVzcG9uc2VKU09OICYmIGZpcnN0LnJlc3BvbnNlSlNPTi5lcnJvcjtcclxuXHRcdGlmICggZXJyb3JPYmogKSB7XHJcblx0XHRcdC8vIEdvdCBhbiBhcGktc3BlY2lmaWMgZXJyb3IgY29kZS9tZXNzYWdlXHJcblx0XHRcdGNvZGUgPSBlcnJvck9iai5jb2RlO1xyXG5cdFx0XHRtZXNzYWdlID0gZXJyb3JPYmoubWVzc2FnZTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHhociA9IGZpcnN0O1xyXG5cdFx0fVxyXG5cdH0gZWxzZSBpZiAoIHR5cGVvZiBmaXJzdCA9PT0gXCJzdHJpbmdcIiAmJiB0eXBlb2Ygc2Vjb25kID09PSBcIm9iamVjdFwiICkge1xyXG5cdFx0Ly8gRXJyb3JzIGZyb20gbXcuQXBpIG9iamVjdFxyXG5cdFx0dmFyIG13RXJyb3JPYmogPSBzZWNvbmQuZXJyb3I7XHJcblx0XHRpZiAobXdFcnJvck9iaikge1xyXG5cdFx0XHQvLyBHb3QgYW4gYXBpLXNwZWNpZmljIGVycm9yIGNvZGUvbWVzc2FnZVxyXG5cdFx0XHRjb2RlID0gZXJyb3JPYmouY29kZTtcclxuXHRcdFx0bWVzc2FnZSA9IGVycm9yT2JqLmluZm87XHJcblx0XHR9IGVsc2UgaWYgKGZpcnN0ID09PSBcIm9rLWJ1dC1lbXB0eVwiKSB7XHJcblx0XHRcdGNvZGUgPSBudWxsO1xyXG5cdFx0XHRtZXNzYWdlID0gXCJHb3QgYW4gZW1wdHkgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyXCI7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHR4aHIgPSBzZWNvbmQgJiYgc2Vjb25kLnhocjtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGlmIChjb2RlICYmIG1lc3NhZ2UpIHtcclxuXHRcdHJldHVybiBgQVBJIGVycm9yICR7Y29kZX06ICR7bWVzc2FnZX1gO1xyXG5cdH0gZWxzZSBpZiAobWVzc2FnZSkge1xyXG5cdFx0cmV0dXJuIGBBUEkgZXJyb3I6ICR7bWVzc2FnZX1gO1xyXG5cdH0gZWxzZSBpZiAoeGhyKSB7XHJcblx0XHRyZXR1cm4gYEhUVFAgZXJyb3IgJHt4aHIuc3RhdHVzfWA7XHJcblx0fSBlbHNlIGlmIChcclxuXHRcdHR5cGVvZiBmaXJzdCA9PT0gXCJzdHJpbmdcIiAmJiBmaXJzdCAhPT0gXCJlcnJvclwiICYmXHJcblx0XHR0eXBlb2Ygc2Vjb25kID09PSBcInN0cmluZ1wiICYmIHNlY29uZCAhPT0gXCJlcnJvclwiXHJcblx0KSB7XHJcblx0XHRyZXR1cm4gYEVycm9yICR7Zmlyc3R9OiAke3NlY29uZH1gO1xyXG5cdH0gZWxzZSBpZiAodHlwZW9mIGZpcnN0ID09PSBcInN0cmluZ1wiICYmIGZpcnN0ICE9PSBcImVycm9yXCIpIHtcclxuXHRcdHJldHVybiBgRXJyb3I6ICR7Zmlyc3R9YDtcclxuXHR9IGVsc2Uge1xyXG5cdFx0cmV0dXJuIFwiVW5rbm93biBBUEkgZXJyb3JcIjtcclxuXHR9XHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBBUEk7XHJcbmV4cG9ydCB7IG1ha2VFcnJvck1zZyB9O1xyXG4vLyA8L25vd2lraT4iLCJpbXBvcnQgY29uZmlnIGZyb20gXCIuL2NvbmZpZ1wiO1xyXG5pbXBvcnQgeyBnZXRQcmVmcyB9IGZyb20gXCIuL3ByZWZzXCI7XHJcbmltcG9ydCBBUEksIHsgbWFrZUVycm9yTXNnIH0gZnJvbSBcIi4vYXBpXCI7XHJcbmltcG9ydCBzZXR1cFJhdGVyIGZyb20gXCIuL3NldHVwXCI7XHJcbi8vIDxub3dpa2k+XHJcblxyXG52YXIgYXV0b1N0YXJ0ID0gZnVuY3Rpb24gYXV0b1N0YXJ0KCkge1xyXG5cclxuXHRyZXR1cm4gZ2V0UHJlZnMoKS50aGVuKHByZWZzID0+IHtcclxuXHRcdC8vIENoZWNrIGlmIHByZWYgaXMgdHVybmVkIG9mZlxyXG5cdFx0aWYgKCFwcmVmcy5hdXRvc3RhcnQpIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cdFx0Ly8gQ2hlY2sgaWYgcHJlZiBpcyB0dXJuZWQgb2ZmIGZvciByZWRpcmVjdHMsIGFuZCBjdXJyZW50IHBhZ2UgaXMgYSByZWRpcmVjdFxyXG5cdFx0aWYgKCFwcmVmcy5hdXRvc3RhcnRSZWRpcmVjdHMgJiYgd2luZG93LmxvY2F0aW9uLnNlYXJjaC5pbmNsdWRlcyhcInJlZGlyZWN0PW5vXCIpKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHRcdC8vIENoZWNrIGlmIHZpZXdpbmcgZGlmZi9oaXN0b3J5L29sZCB2ZXJzaW9uXHJcblx0XHRpZiAoLyhhY3Rpb258ZGlmZnxvbGRpZCkvLnRlc3Qod2luZG93LmxvY2F0aW9uLnNlYXJjaCkpIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cdFx0Y29uc3Qgc3ViamVjdFRpdGxlID0gbXcuVGl0bGUubmV3RnJvbVRleHQoY29uZmlnLm13LndnUGFnZU5hbWUpLmdldFN1YmplY3RQYWdlKCk7XHJcblx0XHQvLyBDaGVjayBpZiBzdWJqZWN0IHBhZ2UgaXMgdGhlIG1haW4gcGFnZVxyXG5cdFx0aWYgKHN1YmplY3RUaXRsZS5nZXRQcmVmaXhlZFRleHQoKSA9PT0gXCJNYWluIFBhZ2VcIikge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblx0XHQvLyBDaGVjayBzdWJqZWN0IHBhZ2UgbmFtZXNwYWNlXHJcblx0XHRpZiAoXHJcblx0XHRcdHByZWZzLmF1dG9zdGFydE5hbWVzcGFjZXMgJiZcclxuXHRcdFx0cHJlZnMuYXV0b3N0YXJ0TmFtZXNwYWNlcy5sZW5ndGggJiZcclxuXHRcdFx0IXByZWZzLmF1dG9zdGFydE5hbWVzcGFjZXMuaW5jbHVkZXMoY29uZmlnLm13LndnTmFtZXNwYWNlTnVtYmVyKVxyXG5cdFx0KSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHRcclxuXHRcdC8vIElmIHRhbGsgcGFnZSBkb2VzIG5vdCBleGlzdCwgY2FuIGp1c3QgYXV0b3N0YXJ0XHJcblx0XHRpZiAoICQoXCIjY2EtdGFsay5uZXdcIikubGVuZ3RoICkge1xyXG5cdFx0XHRyZXR1cm4gc2V0dXBSYXRlcigpO1xyXG5cdFx0fVx0XHJcblxyXG5cdFx0LyogQ2hlY2sgdGVtcGxhdGVzIHByZXNlbnQgb24gdGFsayBwYWdlLiBGZXRjaGVzIGluZGlyZWN0bHkgdHJhbnNjbHVkZWQgdGVtcGxhdGVzLCBzbyB3aWxsIGZpbmRcclxuXHRcdFx0VGVtcGxhdGU6V1BCYW5uZXJNZXRhIChhbmQgaXRzIHN1YnRlbXBsYXRlcykuIEJ1dCBzb21lIGJhbm5lcnMgc3VjaCBhcyBNSUxISVNUIGRvbid0IHVzZSB0aGF0XHJcblx0XHRcdG1ldGEgdGVtcGxhdGUsIHNvIHdlIGFsc28gaGF2ZSB0byBjaGVjayBmb3IgdGVtcGxhdGUgdGl0bGVzIGNvbnRhaW5nICdXaWtpUHJvamVjdCdcclxuXHRcdCovXHJcblx0XHRjb25zdCB0YWxrVGl0bGUgPSBtdy5UaXRsZS5uZXdGcm9tVGV4dChjb25maWcubXcud2dQYWdlTmFtZSkuZ2V0VGFsa1BhZ2UoKTtcclxuXHRcdHJldHVybiBBUEkuZ2V0KHtcclxuXHRcdFx0YWN0aW9uOiBcInF1ZXJ5XCIsXHJcblx0XHRcdGZvcm1hdDogXCJqc29uXCIsXHJcblx0XHRcdHByb3A6IFwidGVtcGxhdGVzXCIsXHJcblx0XHRcdHRpdGxlczogdGFsa1RpdGxlLmdldFByZWZpeGVkVGV4dCgpLFxyXG5cdFx0XHR0bG5hbWVzcGFjZTogXCIxMFwiLFxyXG5cdFx0XHR0bGxpbWl0OiBcIjUwMFwiLFxyXG5cdFx0XHRpbmRleHBhZ2VpZHM6IDFcclxuXHRcdH0pXHJcblx0XHRcdC50aGVuKGZ1bmN0aW9uKHJlc3VsdCkge1xyXG5cdFx0XHRcdHZhciBpZCA9IHJlc3VsdC5xdWVyeS5wYWdlaWRzO1xyXG5cdFx0XHRcdHZhciB0ZW1wbGF0ZXMgPSByZXN1bHQucXVlcnkucGFnZXNbaWRdLnRlbXBsYXRlcztcclxuXHRcdFx0XHJcblx0XHRcdFx0aWYgKCAhdGVtcGxhdGVzICkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIHNldHVwUmF0ZXIoKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFxyXG5cdFx0XHRcdHZhciBoYXNXaWtpcHJvamVjdCA9IHRlbXBsYXRlcy5zb21lKHRlbXBsYXRlID0+IC8oV2lraVByb2plY3R8V1BCYW5uZXIpLy50ZXN0KHRlbXBsYXRlLnRpdGxlKSk7XHJcblx0XHRcdFxyXG5cdFx0XHRcdGlmICggIWhhc1dpa2lwcm9qZWN0ICkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIHNldHVwUmF0ZXIoKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFxyXG5cdFx0XHR9LFxyXG5cdFx0XHRmdW5jdGlvbihjb2RlLCBqcXhocikge1xyXG5cdFx0XHQvLyBTaWxlbnRseSBpZ25vcmUgZmFpbHVyZXMgKGp1c3QgbG9nIHRvIGNvbnNvbGUpXHJcblx0XHRcdFx0Y29uc29sZS53YXJuKFxyXG5cdFx0XHRcdFx0XCJbUmF0ZXJdIEVycm9yIHdoaWxlIGNoZWNraW5nIHdoZXRoZXIgdG8gYXV0b3N0YXJ0LlwiICtcclxuXHRcdFx0XHQoIGNvZGUgPT0gbnVsbCApID8gXCJcIiA6IFwiIFwiICsgbWFrZUVycm9yTXNnKGNvZGUsIGpxeGhyKVxyXG5cdFx0XHRcdCk7XHJcblx0XHRcdFx0cmV0dXJuICQuRGVmZXJyZWQoKS5yZWplY3QoKTtcclxuXHRcdFx0fSk7XHJcblx0fSk7XHJcblxyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgYXV0b1N0YXJ0O1xyXG4vLyA8L25vd2lraT4iLCJpbXBvcnQge2lzQWZ0ZXJEYXRlfSBmcm9tIFwiLi91dGlsXCI7XHJcbi8vIDxub3dpa2k+XHJcblxyXG4vKiogd3JpdGVcclxuICogQHBhcmFtIHtTdHJpbmd9IGtleVxyXG4gKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gdmFsXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBzdGFsZURheXMgTnVtYmVyIG9mIGRheXMgYWZ0ZXIgd2hpY2ggdGhlIGRhdGEgYmVjb21lcyBzdGFsZSAodXNhYmxlLCBidXQgc2hvdWxkXHJcbiAqICBiZSB1cGRhdGVkIGZvciBuZXh0IHRpbWUpLlxyXG4gKiBAcGFyYW0ge051bWJlcn0gZXhwaXJ5RGF5cyBOdW1iZXIgb2YgZGF5cyBhZnRlciB3aGljaCB0aGUgY2FjaGVkIGRhdGEgbWF5IGJlIGRlbGV0ZWQuXHJcbiAqL1xyXG5jb25zdCB3cml0ZSA9IGZ1bmN0aW9uKGtleSwgdmFsLCBzdGFsZURheXMsIGV4cGlyeURheXMpIHtcclxuXHR0cnkge1xyXG5cdFx0Y29uc3QgZGVmYXVsdFN0YWxlRGF5cyA9IDE7XHJcblx0XHRjb25zdCBkZWZhdWx0RXhwaXJ5RGF5cyA9IDMwO1xyXG5cdFx0Y29uc3QgbWlsbGlzZWNvbmRzUGVyRGF5ID0gMjQqNjAqNjAqMTAwMDtcclxuXHJcblx0XHRjb25zdCBzdGFsZUR1cmF0aW9uID0gKHN0YWxlRGF5cyB8fCBkZWZhdWx0U3RhbGVEYXlzKSptaWxsaXNlY29uZHNQZXJEYXk7XHJcblx0XHRjb25zdCBleHBpcnlEdXJhdGlvbiA9IChleHBpcnlEYXlzIHx8IGRlZmF1bHRFeHBpcnlEYXlzKSptaWxsaXNlY29uZHNQZXJEYXk7XHJcblxyXG5cdFx0Y29uc3Qgc3RyaW5nVmFsID0gSlNPTi5zdHJpbmdpZnkoe1xyXG5cdFx0XHR2YWx1ZTogdmFsLFxyXG5cdFx0XHRzdGFsZURhdGU6IG5ldyBEYXRlKERhdGUubm93KCkgKyBzdGFsZUR1cmF0aW9uKS50b0lTT1N0cmluZygpLFxyXG5cdFx0XHRleHBpcnlEYXRlOiBuZXcgRGF0ZShEYXRlLm5vdygpICsgZXhwaXJ5RHVyYXRpb24pLnRvSVNPU3RyaW5nKClcclxuXHRcdH0pO1xyXG5cdFx0bG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJSYXRlci1cIitrZXksIHN0cmluZ1ZhbCk7XHJcblx0fSAgY2F0Y2goZSkge30gLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1lbXB0eVxyXG59O1xyXG4vKiogcmVhZFxyXG4gKiBAcGFyYW0ge1N0cmluZ30ga2V5XHJcbiAqIEByZXR1cm5zIHtBcnJheXxPYmplY3R8U3RyaW5nfE51bGx9IENhY2hlZCBhcnJheSBvciBvYmplY3QsIG9yIGVtcHR5IHN0cmluZyBpZiBub3QgeWV0IGNhY2hlZCxcclxuICogICAgICAgICAgb3IgbnVsbCBpZiB0aGVyZSB3YXMgZXJyb3IuXHJcbiAqL1xyXG5jb25zdCByZWFkID0gZnVuY3Rpb24oa2V5KSB7XHJcblx0bGV0IHZhbDtcclxuXHR0cnkge1xyXG5cdFx0Y29uc3Qgc3RyaW5nVmFsID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJSYXRlci1cIitrZXkpO1xyXG5cdFx0aWYgKCBzdHJpbmdWYWwgIT09IFwiXCIgKSB7XHJcblx0XHRcdHZhbCA9IEpTT04ucGFyc2Uoc3RyaW5nVmFsKTtcclxuXHRcdH1cclxuXHR9ICBjYXRjaChlKSB7XHJcblx0XHRjb25zb2xlLmxvZyhcIltSYXRlcl0gZXJyb3IgcmVhZGluZyBcIiArIGtleSArIFwiIGZyb20gbG9jYWxTdG9yYWdlIGNhY2hlOlwiKTtcclxuXHRcdGNvbnNvbGUubG9nKFxyXG5cdFx0XHRcIlxcdFwiICsgZS5uYW1lICsgXCIgbWVzc2FnZTogXCIgKyBlLm1lc3NhZ2UgK1xyXG5cdFx0XHQoIGUuYXQgPyBcIiBhdDogXCIgKyBlLmF0IDogXCJcIikgK1xyXG5cdFx0XHQoIGUudGV4dCA/IFwiIHRleHQ6IFwiICsgZS50ZXh0IDogXCJcIilcclxuXHRcdCk7XHJcblx0fVxyXG5cdHJldHVybiB2YWwgfHwgbnVsbDtcclxufTtcclxuXHJcbmNvbnN0IGlzUmF0ZXJLZXkgPSBrZXkgPT4ga2V5ICYmIGtleS5pbmRleE9mKFwiUmF0ZXItXCIpID09PSAwO1xyXG5cclxuY29uc3QgY2xlYXJJdGVtSWZJbnZhbGlkID0gZnVuY3Rpb24oa2V5KSB7XHJcblx0aWYgKCAhaXNSYXRlcktleShrZXkpICkge1xyXG5cdFx0cmV0dXJuO1xyXG5cdH1cclxuXHRjb25zdCBpdGVtID0gcmVhZChrZXkucmVwbGFjZShcIlJhdGVyLVwiLFwiXCIpKTtcclxuXHRjb25zdCBpc0ludmFsaWQgPSAhaXRlbSB8fCAhaXRlbS5leHBpcnlEYXRlIHx8IGlzQWZ0ZXJEYXRlKGl0ZW0uZXhwaXJ5RGF0ZSk7XHJcblx0aWYgKCBpc0ludmFsaWQgKSB7XHJcblx0XHRsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpO1xyXG5cdH1cclxufTtcclxuXHJcbmNvbnN0IGNsZWFySW52YWxpZEl0ZW1zID0gZnVuY3Rpb24oKSB7XHJcblx0Ly8gTG9vcCBiYWNrd2FyZHMgYXMgbG9jYWxTdG9yYWdlIGxlbmd0aCB3aWxsIGRlY3JlYXNlIGFzIGl0ZW1zIGFyZSByZW1vdmVkXHJcblx0Zm9yIChsZXQgaSA9IGxvY2FsU3RvcmFnZS5sZW5ndGg7IGkgPj0gMDsgaS0tKSB7XHJcblx0XHRzZXRUaW1lb3V0KGNsZWFySXRlbUlmSW52YWxpZCwgMTAwLCBsb2NhbFN0b3JhZ2Uua2V5KGkpKTtcclxuXHR9XHJcbn07XHJcblxyXG5jb25zdCBjbGVhckFsbEl0ZW1zID0gZnVuY3Rpb24oKSB7XHJcblx0Ly8gTG9vcCBiYWNrd2FyZHMgYXMgbG9jYWxTdG9yYWdlIGxlbmd0aCB3aWxsIGRlY3JlYXNlIGFzIGl0ZW1zIGFyZSByZW1vdmVkXHJcblx0Zm9yIChsZXQgaSA9IGxvY2FsU3RvcmFnZS5sZW5ndGg7IGkgPj0gMDsgaS0tKSB7XHJcblx0XHRsZXQga2V5ID0gbG9jYWxTdG9yYWdlLmtleShpKTtcclxuXHRcdGlmIChpc1JhdGVyS2V5KGtleSkpIHtcclxuXHRcdFx0bG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtcclxuXHRcdH1cclxuXHR9XHJcbn07XHJcblxyXG5leHBvcnQgeyB3cml0ZSwgcmVhZCwgY2xlYXJJdGVtSWZJbnZhbGlkLCBjbGVhckludmFsaWRJdGVtcywgY2xlYXJBbGxJdGVtcyB9O1xyXG4vLyA8L25vd2lraT4iLCIvLyA8bm93aWtpPlxyXG5jb25zdCBwYWNrYWdlanNvbiA9IHJlcXVpcmUoXCIuLi9wYWNrYWdlLmpzb25cIik7XHJcbnZhciB2ZXJzaW9uID0gcGFja2FnZWpzb24udmVyc2lvbjtcclxuXHJcbi8vIEEgZ2xvYmFsIG9iamVjdCB0aGF0IHN0b3JlcyBhbGwgdGhlIHBhZ2UgYW5kIHVzZXIgY29uZmlndXJhdGlvbiBhbmQgc2V0dGluZ3NcclxudmFyIGNvbmZpZyA9IHtcclxuXHQvLyBTY3JpcHQgaW5mb1xyXG5cdHNjcmlwdDoge1xyXG5cdFx0Ly8gQWR2ZXJ0IHRvIGFwcGVuZCB0byBlZGl0IHN1bW1hcmllc1xyXG5cdFx0YWR2ZXJ0OiAgYCAoW1tXUDpSQVRFUiMke3ZlcnNpb259fFJhdGVyXV0pYCxcclxuXHRcdHZlcnNpb246IHZlcnNpb25cclxuXHR9LFxyXG5cdC8vIERlZmF1bHQgcHJlZmVyZW5jZXMsIGlmIHVzZXIgc3VicGFnZSByYXRlclByZWZzLmpzb24gZG9lcyBub3QgZXhpc3RcclxuXHRkZWZhdWx0UHJlZnM6IHtcclxuXHRcdFwiYXV0b3N0YXJ0XCI6IGZhbHNlLFxyXG5cdFx0XCJhdXRvc3RhcnRSZWRpcmVjdHNcIjogZmFsc2UsXHJcblx0XHRcImF1dG9zdGFydE5hbWVzcGFjZXNcIjogWzBdLFxyXG5cdFx0XCJtaW5Gb3JTaGVsbFwiOiAxLFxyXG5cdFx0XCJieXBhc3NSZWRpcmVjdHNcIjogdHJ1ZSxcclxuXHRcdFwiYXV0b2ZpbGxDbGFzc0Zyb21PdGhlcnNcIjogdHJ1ZSxcclxuXHRcdFwiYXV0b2ZpbGxDbGFzc0Zyb21PcmVzXCI6IHRydWUsXHJcblx0XHRcImF1dG9maWxsSW1wb3J0YW5jZVwiOiB0cnVlLFxyXG5cdFx0XCJjb2xsYXBzZVBhcmFtc0xvd2VyTGltaXRcIjogNixcclxuXHRcdFwid2F0Y2hsaXN0XCI6IFwicHJlZmVyZW5jZXNcIlxyXG5cdH0sXHJcblx0Ly8gTWVkaWFXaWtpIGNvbmZpZ3VyYXRpb24gdmFsdWVzXHJcblx0bXc6IG13LmNvbmZpZy5nZXQoIFtcclxuXHRcdFwic2tpblwiLFxyXG5cdFx0XCJ3Z1BhZ2VOYW1lXCIsXHJcblx0XHRcIndnTmFtZXNwYWNlTnVtYmVyXCIsXHJcblx0XHRcIndnVXNlck5hbWVcIixcclxuXHRcdFwid2dGb3JtYXR0ZWROYW1lc3BhY2VzXCIsXHJcblx0XHRcIndnTW9udGhOYW1lc1wiLFxyXG5cdFx0XCJ3Z1JldmlzaW9uSWRcIixcclxuXHRcdFwid2dTY3JpcHRQYXRoXCIsXHJcblx0XHRcIndnU2VydmVyXCIsXHJcblx0XHRcIndnQ2F0ZWdvcmllc1wiLFxyXG5cdFx0XCJ3Z0lzTWFpblBhZ2VcIlxyXG5cdF0gKSxcclxuXHRiYW5uZXJEZWZhdWx0czoge1xyXG5cdFx0Y2xhc3NlczogW1xyXG5cdFx0XHRcIkZBXCIsXHJcblx0XHRcdFwiRkxcIixcclxuXHRcdFx0XCJBXCIsXHJcblx0XHRcdFwiR0FcIixcclxuXHRcdFx0XCJCXCIsXHJcblx0XHRcdFwiQ1wiLFxyXG5cdFx0XHRcIlN0YXJ0XCIsXHJcblx0XHRcdFwiU3R1YlwiLFxyXG5cdFx0XHRcIkxpc3RcIlxyXG5cdFx0XSxcclxuXHRcdGltcG9ydGFuY2VzOiBbXHJcblx0XHRcdFwiVG9wXCIsXHJcblx0XHRcdFwiSGlnaFwiLFxyXG5cdFx0XHRcIk1pZFwiLFxyXG5cdFx0XHRcIkxvd1wiXHJcblx0XHRdLFxyXG5cdFx0ZXh0ZW5kZWRDbGFzc2VzOiBbXHJcblx0XHRcdFwiQ2F0ZWdvcnlcIixcclxuXHRcdFx0XCJEcmFmdFwiLFxyXG5cdFx0XHRcIkZpbGVcIixcclxuXHRcdFx0XCJGTVwiLFxyXG5cdFx0XHRcIlBvcnRhbFwiLFxyXG5cdFx0XHRcIlByb2plY3RcIixcclxuXHRcdFx0XCJUZW1wbGF0ZVwiLFxyXG5cdFx0XHRcIkJwbHVzXCIsXHJcblx0XHRcdFwiRnV0dXJlXCIsXHJcblx0XHRcdFwiQ3VycmVudFwiLFxyXG5cdFx0XHRcIkRpc2FtYmlnXCIsXHJcblx0XHRcdFwiTkFcIixcclxuXHRcdFx0XCJSZWRpcmVjdFwiLFxyXG5cdFx0XHRcIkJvb2tcIlxyXG5cdFx0XSxcclxuXHRcdGV4dGVuZGVkSW1wb3J0YW5jZXM6IFtcclxuXHRcdFx0XCJUb3BcIixcclxuXHRcdFx0XCJIaWdoXCIsXHJcblx0XHRcdFwiTWlkXCIsXHJcblx0XHRcdFwiTG93XCIsXHJcblx0XHRcdFwiQm90dG9tXCIsXHJcblx0XHRcdFwiTkFcIlxyXG5cdFx0XVxyXG5cdH0sXHJcblx0Y3VzdG9tQmFubmVyczoge1xyXG5cdFx0XCJXaWtpUHJvamVjdCBNaWxpdGFyeSBoaXN0b3J5XCI6IHtcclxuXHRcdFx0Y2xhc3NlczogW1xyXG5cdFx0XHRcdFwiRkFcIixcclxuXHRcdFx0XHRcIkZMXCIsXHJcblx0XHRcdFx0XCJBXCIsXHJcblx0XHRcdFx0XCJHQVwiLFxyXG5cdFx0XHRcdFwiQlwiLFxyXG5cdFx0XHRcdFwiQ1wiLFxyXG5cdFx0XHRcdFwiU3RhcnRcIixcclxuXHRcdFx0XHRcIlN0dWJcIixcclxuXHRcdFx0XHRcIkxpc3RcIixcclxuXHRcdFx0XHRcIkFMXCIsXHJcblx0XHRcdFx0XCJCTFwiLFxyXG5cdFx0XHRcdFwiQ0xcIixcclxuXHRcdFx0XHRcIkNhdGVnb3J5XCIsXHJcblx0XHRcdFx0XCJEcmFmdFwiLFxyXG5cdFx0XHRcdFwiRmlsZVwiLFxyXG5cdFx0XHRcdFwiUG9ydGFsXCIsXHJcblx0XHRcdFx0XCJQcm9qZWN0XCIsXHJcblx0XHRcdFx0XCJUZW1wbGF0ZVwiLFxyXG5cdFx0XHRcdFwiRGlzYW1iaWdcIixcclxuXHRcdFx0XHRcIlJlZGlyZWN0XCIsXHJcblx0XHRcdFx0XCJCb29rXCJcdFx0XHRcclxuXHRcdFx0XSxcclxuXHRcdFx0aW1wb3J0YW5jZXM6IFtdXHJcblx0XHR9LFxyXG5cdFx0XCJXaWtpUHJvamVjdCBQb3J0YWxzXCI6IHtcclxuXHRcdFx0Y2xhc3NlczogW1xyXG5cdFx0XHRcdFwiRlBvXCIsXHJcblx0XHRcdFx0XCJDb21wbGV0ZVwiLFxyXG5cdFx0XHRcdFwiU3Vic3RhbnRpYWxcIixcclxuXHRcdFx0XHRcIkJhc2ljXCIsXHJcblx0XHRcdFx0XCJJbmNvbXBsZXRlXCIsXHJcblx0XHRcdFx0XCJNZXRhXCIsXHJcblx0XHRcdFx0XCJMaXN0XCIsXHJcblx0XHRcdFx0XCJDYXRlZ29yeVwiLFxyXG5cdFx0XHRcdFwiRHJhZnRcIixcclxuXHRcdFx0XHRcIkZpbGVcIixcclxuXHRcdFx0XHRcIlByb2plY3RcIixcclxuXHRcdFx0XHRcIlRlbXBsYXRlXCIsXHJcblx0XHRcdFx0XCJEaXNhbWJpZ1wiLFxyXG5cdFx0XHRcdFwiTkFcIixcclxuXHRcdFx0XHRcIlJlZGlyZWN0XCJcclxuXHRcdFx0XSxcclxuXHRcdFx0aW1wb3J0YW5jZXM6IFtcclxuXHRcdFx0XHRcIlRvcFwiLFxyXG5cdFx0XHRcdFwiSGlnaFwiLFxyXG5cdFx0XHRcdFwiTWlkXCIsXHJcblx0XHRcdFx0XCJMb3dcIixcclxuXHRcdFx0XHRcIkJvdHRvbVwiLFxyXG5cdFx0XHRcdFwiTkFcIlxyXG5cdFx0XHRdXHJcblx0XHR9LFxyXG5cdFx0XCJXaWtpUHJvamVjdCBWaWRlbyBnYW1lc1wiOiB7XHJcblx0XHRcdGNsYXNzZXM6IFtcclxuXHRcdFx0XHRcIkZBXCIsXCJGTFwiLFwiRk1cIixcIkdBXCIsXCJCXCIsXCJDXCIsXCJTdGFydFwiLFwiU3R1YlwiLFwiTGlzdFwiLFwiQ2F0ZWdvcnlcIixcIkRyYWZ0XCIsXCJGaWxlXCIsXCJQb3J0YWxcIixcIlByb2plY3RcIixcIlRlbXBsYXRlXCIsXCJEaXNhbWJpZ1wiLFwiUmVkaXJlY3RcIlxyXG5cdFx0XHRdLFxyXG5cdFx0XHRpbXBvcnRhbmNlczogW1xyXG5cdFx0XHRcdFwiVG9wXCIsXCJIaWdoXCIsXCJNaWRcIixcIkxvd1wiLFwiTkFcIlxyXG5cdFx0XHRdXHJcblx0XHR9XHJcblx0fSxcclxuXHRzaGVsbFRlbXBsYXRlczogW1xyXG5cdFx0XCJXaWtpUHJvamVjdCBiYW5uZXIgc2hlbGxcIixcclxuXHRcdFwiV2lraVByb2plY3RCYW5uZXJzXCIsXHJcblx0XHRcIldpa2lQcm9qZWN0IEJhbm5lcnNcIixcclxuXHRcdFwiV1BCXCIsXHJcblx0XHRcIldQQlNcIixcclxuXHRcdFwiV2lraXByb2plY3RiYW5uZXJzaGVsbFwiLFxyXG5cdFx0XCJXaWtpUHJvamVjdCBCYW5uZXIgU2hlbGxcIixcclxuXHRcdFwiV3BiXCIsXHJcblx0XHRcIldQQmFubmVyU2hlbGxcIixcclxuXHRcdFwiV3Bic1wiLFxyXG5cdFx0XCJXaWtpcHJvamVjdGJhbm5lcnNcIixcclxuXHRcdFwiV1AgQmFubmVyIFNoZWxsXCIsXHJcblx0XHRcIldQIGJhbm5lciBzaGVsbFwiLFxyXG5cdFx0XCJCYW5uZXJzaGVsbFwiLFxyXG5cdFx0XCJXaWtpcHJvamVjdCBiYW5uZXIgc2hlbGxcIixcclxuXHRcdFwiV2lraVByb2plY3QgQmFubmVycyBTaGVsbFwiLFxyXG5cdFx0XCJXaWtpUHJvamVjdEJhbm5lciBTaGVsbFwiLFxyXG5cdFx0XCJXaWtpUHJvamVjdEJhbm5lclNoZWxsXCIsXHJcblx0XHRcIldpa2lQcm9qZWN0IEJhbm5lclNoZWxsXCIsXHJcblx0XHRcIldpa2lwcm9qZWN0QmFubmVyU2hlbGxcIixcclxuXHRcdFwiV2lraVByb2plY3QgYmFubmVyIHNoZWxsL3JlZGlyZWN0XCIsXHJcblx0XHRcIldpa2lQcm9qZWN0IFNoZWxsXCIsXHJcblx0XHRcIkJhbm5lciBzaGVsbFwiLFxyXG5cdFx0XCJTY29wZSBzaGVsbFwiLFxyXG5cdFx0XCJQcm9qZWN0IHNoZWxsXCIsXHJcblx0XHRcIldpa2lQcm9qZWN0IGJhbm5lclwiXHJcblx0XSxcclxuXHRkZWZhdWx0UGFyYW1ldGVyRGF0YToge1xyXG5cdFx0XCJhdXRvXCI6IHtcclxuXHRcdFx0XCJsYWJlbFwiOiB7XHJcblx0XHRcdFx0XCJlblwiOiBcIkF1dG8tcmF0ZWRcIlxyXG5cdFx0XHR9LFxyXG5cdFx0XHRcImRlc2NyaXB0aW9uXCI6IHtcclxuXHRcdFx0XHRcImVuXCI6IFwiQXV0b21hdGljYWxseSByYXRlZCBieSBhIGJvdC4gQWxsb3dlZCB2YWx1ZXM6IFsneWVzJ10uXCJcclxuXHRcdFx0fSxcclxuXHRcdFx0XCJhdXRvdmFsdWVcIjogXCJ5ZXNcIlxyXG5cdFx0fSxcclxuXHRcdFwibGlzdGFzXCI6IHtcclxuXHRcdFx0XCJsYWJlbFwiOiB7XHJcblx0XHRcdFx0XCJlblwiOiBcIkxpc3QgYXNcIlxyXG5cdFx0XHR9LFxyXG5cdFx0XHRcImRlc2NyaXB0aW9uXCI6IHtcclxuXHRcdFx0XHRcImVuXCI6IFwiU29ydGtleSBmb3IgdGFsayBwYWdlXCJcclxuXHRcdFx0fVxyXG5cdFx0fSxcclxuXHRcdFwic21hbGxcIjoge1xyXG5cdFx0XHRcImxhYmVsXCI6IHtcclxuXHRcdFx0XHRcImVuXCI6IFwiU21hbGw/XCIsXHJcblx0XHRcdH0sXHJcblx0XHRcdFwiZGVzY3JpcHRpb25cIjoge1xyXG5cdFx0XHRcdFwiZW5cIjogXCJEaXNwbGF5IGEgc21hbGwgdmVyc2lvbi4gQWxsb3dlZCB2YWx1ZXM6IFsneWVzJ10uXCJcclxuXHRcdFx0fSxcclxuXHRcdFx0XCJhdXRvdmFsdWVcIjogXCJ5ZXNcIlxyXG5cdFx0fSxcclxuXHRcdFwiYXR0ZW50aW9uXCI6IHtcclxuXHRcdFx0XCJsYWJlbFwiOiB7XHJcblx0XHRcdFx0XCJlblwiOiBcIkF0dGVudGlvbiByZXF1aXJlZD9cIixcclxuXHRcdFx0fSxcclxuXHRcdFx0XCJkZXNjcmlwdGlvblwiOiB7XHJcblx0XHRcdFx0XCJlblwiOiBcIkltbWVkaWF0ZSBhdHRlbnRpb24gcmVxdWlyZWQuIEFsbG93ZWQgdmFsdWVzOiBbJ3llcyddLlwiXHJcblx0XHRcdH0sXHJcblx0XHRcdFwiYXV0b3ZhbHVlXCI6IFwieWVzXCJcclxuXHRcdH0sXHJcblx0XHRcIm5lZWRzLWltYWdlXCI6IHtcclxuXHRcdFx0XCJsYWJlbFwiOiB7XHJcblx0XHRcdFx0XCJlblwiOiBcIk5lZWRzIGltYWdlP1wiLFxyXG5cdFx0XHR9LFxyXG5cdFx0XHRcImRlc2NyaXB0aW9uXCI6IHtcclxuXHRcdFx0XHRcImVuXCI6IFwiUmVxdWVzdCB0aGF0IGFuIGltYWdlIG9yIHBob3RvZ3JhcGggb2YgdGhlIHN1YmplY3QgYmUgYWRkZWQgdG8gdGhlIGFydGljbGUuIEFsbG93ZWQgdmFsdWVzOiBbJ3llcyddLlwiXHJcblx0XHRcdH0sXHJcblx0XHRcdFwiYWxpYXNlc1wiOiBbXHJcblx0XHRcdFx0XCJuZWVkcy1waG90b1wiXHJcblx0XHRcdF0sXHJcblx0XHRcdFwiYXV0b3ZhbHVlXCI6IFwieWVzXCIsXHJcblx0XHRcdFwic3VnZ2VzdGVkXCI6IHRydWVcclxuXHRcdH0sXHJcblx0XHRcIm5lZWRzLWluZm9ib3hcIjoge1xyXG5cdFx0XHRcImxhYmVsXCI6IHtcclxuXHRcdFx0XHRcImVuXCI6IFwiTmVlZHMgaW5mb2JveD9cIixcclxuXHRcdFx0fSxcclxuXHRcdFx0XCJkZXNjcmlwdGlvblwiOiB7XHJcblx0XHRcdFx0XCJlblwiOiBcIlJlcXVlc3QgdGhhdCBhbiBpbmZvYm94IGJlIGFkZGVkIHRvIHRoZSBhcnRpY2xlLiBBbGxvd2VkIHZhbHVlczogWyd5ZXMnXS5cIlxyXG5cdFx0XHR9LFxyXG5cdFx0XHRcImFsaWFzZXNcIjogW1xyXG5cdFx0XHRcdFwibmVlZHMtcGhvdG9cIlxyXG5cdFx0XHRdLFxyXG5cdFx0XHRcImF1dG92YWx1ZVwiOiBcInllc1wiLFxyXG5cdFx0XHRcInN1Z2dlc3RlZFwiOiB0cnVlXHJcblx0XHR9XHJcblx0fVxyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY29uZmlnO1xyXG4vLyA8L25vd2lraT4iLCIvLyA8bm93aWtpPlxyXG5cclxuLy8gQXR0cmlidXRpb246IERpZmYgc3R5bGVzIGJhc2VkIG9uIDxodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9XaWtpcGVkaWE6QXV0b1dpa2lCcm93c2VyL3N0eWxlLmNzcz5cclxuY29uc3Qgc3R5bGVzID0gYHRhYmxlLmRpZmYsIHRkLmRpZmYtb3RpdGxlLCB0ZC5kaWZmLW50aXRsZSB7IHRhYmxlLWxheW91dDogYXV0byAhaW1wb3J0YW50OzsgfVxyXG50ZC5kaWZmLW90aXRsZSwgdGQuZGlmZi1udGl0bGUgeyB0ZXh0LWFsaWduOiBjZW50ZXI7IH1cclxudGQuZGlmZi1tYXJrZXIgeyB0ZXh0LWFsaWduOiByaWdodDsgZm9udC13ZWlnaHQ6IGJvbGQ7IGZvbnQtc2l6ZTogMS4yNWVtOyB9XHJcbnRkLmRpZmYtbGluZW5vIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH1cclxudGQuZGlmZi1hZGRlZGxpbmUsIHRkLmRpZmYtZGVsZXRlZGxpbmUsIHRkLmRpZmYtY29udGV4dCB7IGZvbnQtc2l6ZTogODglOyB2ZXJ0aWNhbC1hbGlnbjogdG9wOyB3aGl0ZS1zcGFjZTogLW1vei1wcmUtd3JhcDsgd2hpdGUtc3BhY2U6IHByZS13cmFwOyB9XHJcbnRkLmRpZmYtYWRkZWRsaW5lLCB0ZC5kaWZmLWRlbGV0ZWRsaW5lIHsgYm9yZGVyLXN0eWxlOiBzb2xpZDsgYm9yZGVyLXdpZHRoOiAxcHggMXB4IDFweCA0cHg7IGJvcmRlci1yYWRpdXM6IDAuMzNlbTsgfVxyXG50ZC5kaWZmLWFkZGVkbGluZSB7IGJvcmRlci1jb2xvcjogI2EzZDNmZjsgfVxyXG50ZC5kaWZmLWRlbGV0ZWRsaW5lIHsgYm9yZGVyLWNvbG9yOiAjZmZlNDljOyB9XHJcbnRkLmRpZmYtY29udGV4dCB7IGJhY2tncm91bmQ6ICNmM2YzZjM7IGNvbG9yOiAjMzMzMzMzOyBib3JkZXItc3R5bGU6IHNvbGlkOyBib3JkZXItd2lkdGg6IDFweCAxcHggMXB4IDRweDsgYm9yZGVyLWNvbG9yOiAjZTZlNmU2OyBib3JkZXItcmFkaXVzOiAwLjMzZW07IH1cclxuLmRpZmZjaGFuZ2UgeyBmb250LXdlaWdodDogYm9sZDsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyB9XHJcbnRhYmxlLmRpZmYge1xyXG4gICAgYm9yZGVyOiBub25lO1xyXG4gICAgd2lkdGg6IDk4JTsgYm9yZGVyLXNwYWNpbmc6IDRweDtcclxuICAgIHRhYmxlLWxheW91dDogZml4ZWQ7IC8qIEVuc3VyZXMgdGhhdCBjb2x1bXMgYXJlIG9mIGVxdWFsIHdpZHRoICovXHJcbn1cclxudGQuZGlmZi1hZGRlZGxpbmUgLmRpZmZjaGFuZ2UsIHRkLmRpZmYtZGVsZXRlZGxpbmUgLmRpZmZjaGFuZ2UgeyBib3JkZXItcmFkaXVzOiAwLjMzZW07IHBhZGRpbmc6IDAuMjVlbSAwOyB9XHJcbnRkLmRpZmYtYWRkZWRsaW5lIC5kaWZmY2hhbmdlIHtcdGJhY2tncm91bmQ6ICNkOGVjZmY7IH1cclxudGQuZGlmZi1kZWxldGVkbGluZSAuZGlmZmNoYW5nZSB7IGJhY2tncm91bmQ6ICNmZWVlYzg7IH1cclxudGFibGUuZGlmZiB0ZCB7XHRwYWRkaW5nOiAwLjMzZW0gMC42NmVtOyB9XHJcbnRhYmxlLmRpZmYgY29sLmRpZmYtbWFya2VyIHsgd2lkdGg6IDIlOyB9XHJcbnRhYmxlLmRpZmYgY29sLmRpZmYtY29udGVudCB7IHdpZHRoOiA0OCU7IH1cclxudGFibGUuZGlmZiB0ZCBkaXYge1xyXG4gICAgLyogRm9yY2Utd3JhcCB2ZXJ5IGxvbmcgbGluZXMgc3VjaCBhcyBVUkxzIG9yIHBhZ2Utd2lkZW5pbmcgY2hhciBzdHJpbmdzLiAqL1xyXG4gICAgd29yZC13cmFwOiBicmVhay13b3JkO1xyXG4gICAgLyogQXMgZmFsbGJhY2sgKEZGPDMuNSwgT3BlcmEgPDEwLjUpLCBzY3JvbGxiYXJzIHdpbGwgYmUgYWRkZWQgZm9yIHZlcnkgd2lkZSBjZWxsc1xyXG4gICAgICAgIGluc3RlYWQgb2YgdGV4dCBvdmVyZmxvd2luZyBvciB3aWRlbmluZyAqL1xyXG4gICAgb3ZlcmZsb3c6IGF1dG87XHJcbn1gICtcclxuXHJcbi8vIE92ZXJyaWRlIE9PVUkgd2luZG93IG1hbmFnZXIgcHJldmVudGluZyBiYWNrZ3JvdW5kIHNjcm9sbGluZy9pbnRlcmFjdGlvblxyXG5gaHRtbCBib2R5LnJhdGVyLW1haW5XaW5kb3ctb3BlbiB7XHJcblx0cG9zaXRpb246IHVuc2V0O1xyXG5cdG92ZXJmbG93OiB1bnNldDtcclxufVxyXG5odG1sIGJvZHkucmF0ZXItbWFpbldpbmRvdy1vcGVuIC5vby11aS13aW5kb3dNYW5hZ2VyLW1vZGFsID4gLm9vLXVpLWRpYWxvZy5vby11aS13aW5kb3ctYWN0aXZlIHtcclxuICAgIHBvc2l0aW9uOiBzdGF0aWM7XHJcbiAgICBwYWRkaW5nOiAwO1xyXG59YCArXHJcbi8vIEluY3JlYXNlIHotaW5kZXgsIHRvIGJlIGFib3ZlIHNraW4gbWVudXMgZXRjOyBzbW9vdGggdHJhbnNpdGlvbiBmb3IgZHJhZ2dpbmcgKHRyYW5zZm9ybTp0cmFuc2xhdGUpXHJcbmBodG1sIGJvZHkucmF0ZXItbWFpbldpbmRvdy1vcGVuIC5vby11aS1kaWFsb2cub28tdWktd2luZG93LWFjdGl2ZSA+IGRpdiB7XHJcbiAgICB6LWluZGV4OiAxMTA7XHJcbiAgICB0cmFuc2l0aW9uOiBhbGwgMC4yNXMgZWFzZS1vdXQgMHMsIHRyYW5zZm9ybSAwcyAhaW1wb3J0YW50XHJcbn1cclxuYCArIFxyXG4vLyBFbnN1cmUgY2xvc2UgZGlhbG9nIGlzIHZpc2libGVcclxuYGh0bWwgYm9keS5yYXRlci1tYWluV2luZG93LW9wZW4gI213LXRlbGVwb3J0LXRhcmdldCB7XHJcbiAgICB0b3A6IDA7XHJcbiAgICBib3R0b206IDA7XHJcbiAgICBsZWZ0OiAwO1xyXG4gICAgcmlnaHQ6MDtcclxufVxyXG5gO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgc3R5bGVzO1xyXG4vLyA8L25vd2lraT4iLCJpbXBvcnQgQVBJLCB7IG1ha2VFcnJvck1zZyB9IGZyb20gXCIuL2FwaVwiO1xyXG5pbXBvcnQgeyBpc0FmdGVyRGF0ZSB9IGZyb20gXCIuL3V0aWxcIjtcclxuaW1wb3J0ICogYXMgY2FjaGUgZnJvbSBcIi4vY2FjaGVcIjtcclxuLy8gPG5vd2lraT5cclxuXHJcbnZhciBjYWNoZUJhbm5lcnMgPSBmdW5jdGlvbihiYW5uZXJzKSB7XHJcblx0Y2FjaGUud3JpdGUoXCJiYW5uZXJzXCIsIGJhbm5lcnMsIDIsIDYwKTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBHZXRzIGJhbm5lcnMvb3B0aW9ucyBmcm9tIHRoZSBBcGlcclxuICogXHJcbiAqIEByZXR1cm5zIHtQcm9taXNlfSBSZXNvbHZlZCB3aXRoOiBiYW5uZXJzIG9iamVjdCwgYmFubmVyT3B0aW9ucyBhcnJheVxyXG4gKi9cclxudmFyIGdldExpc3RPZkJhbm5lcnNGcm9tQXBpID0gZnVuY3Rpb24oKSB7XHJcblxyXG5cdHZhciBmaW5pc2hlZFByb21pc2UgPSAkLkRlZmVycmVkKCk7XHJcblxyXG5cdHZhciBxdWVyeVNrZWxldG9uID0ge1xyXG5cdFx0YWN0aW9uOiBcInF1ZXJ5XCIsXHJcblx0XHRmb3JtYXQ6IFwianNvblwiLFxyXG5cdFx0bGlzdDogXCJjYXRlZ29yeW1lbWJlcnNcIixcclxuXHRcdGNtcHJvcDogXCJ0aXRsZVwiLFxyXG5cdFx0Y21uYW1lc3BhY2U6IFwiMTBcIixcclxuXHRcdGNtbGltaXQ6IFwiNTAwXCJcclxuXHR9O1xyXG5cclxuXHR2YXIgY2F0ZWdvcmllcyA9IFtcclxuXHRcdHtcclxuXHRcdFx0dGl0bGU6IFwiQ2F0ZWdvcnk6V2lraVByb2plY3QgYmFubmVycyB3aXRoIHF1YWxpdHkgYXNzZXNzbWVudFwiLFxyXG5cdFx0XHRhYmJyZXZpYXRpb246IFwid2l0aFJhdGluZ3NcIixcclxuXHRcdFx0YmFubmVyczogW10sXHJcblx0XHRcdHByb2Nlc3NlZDogJC5EZWZlcnJlZCgpXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHR0aXRsZTogXCJDYXRlZ29yeTpXaWtpUHJvamVjdCBiYW5uZXJzIHdpdGhvdXQgcXVhbGl0eSBhc3Nlc3NtZW50XCIsXHJcblx0XHRcdGFiYnJldmlhdGlvbjogXCJ3aXRob3V0UmF0aW5nc1wiLFxyXG5cdFx0XHRiYW5uZXJzOiBbXSxcclxuXHRcdFx0cHJvY2Vzc2VkOiAkLkRlZmVycmVkKClcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdHRpdGxlOiBcIkNhdGVnb3J5Oldpa2lQcm9qZWN0IGJhbm5lciB3cmFwcGVyIHRlbXBsYXRlc1wiLFxyXG5cdFx0XHRhYmJyZXZpYXRpb246IFwid3JhcHBlcnNcIixcclxuXHRcdFx0YmFubmVyczogW10sXHJcblx0XHRcdHByb2Nlc3NlZDogJC5EZWZlcnJlZCgpXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHR0aXRsZTogXCJDYXRlZ29yeTpXaWtpUHJvamVjdCBiYW5uZXIgdGVtcGxhdGVzIG5vdCBiYXNlZCBvbiBXUEJhbm5lck1ldGFcIixcclxuXHRcdFx0YWJicmV2aWF0aW9uOiBcIm5vdFdQQk1cIixcclxuXHRcdFx0YmFubmVyczogW10sXHJcblx0XHRcdHByb2Nlc3NlZDogJC5EZWZlcnJlZCgpXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHR0aXRsZTogXCJDYXRlZ29yeTpJbmFjdGl2ZSBXaWtpUHJvamVjdCBiYW5uZXJzXCIsXHJcblx0XHRcdGFiYnJldmlhdGlvbjogXCJpbmFjdGl2ZVwiLFxyXG5cdFx0XHRiYW5uZXJzOiBbXSxcclxuXHRcdFx0cHJvY2Vzc2VkOiAkLkRlZmVycmVkKClcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdHRpdGxlOiBcIkNhdGVnb3J5OldyYXBwZXIgdGVtcGxhdGVzIGZvciBXaWtpUHJvamVjdCBXb21lbiBpbiBSZWRcIixcclxuXHRcdFx0YWJicmV2aWF0aW9uOiBcIndpclwiLFxyXG5cdFx0XHRiYW5uZXJzOiBbXSxcclxuXHRcdFx0cHJvY2Vzc2VkOiAkLkRlZmVycmVkKClcclxuXHRcdH1cclxuXHRdO1xyXG5cclxuXHR2YXIgcHJvY2Vzc1F1ZXJ5ID0gZnVuY3Rpb24ocmVzdWx0LCBjYXRJbmRleCkge1xyXG5cdFx0aWYgKCAhcmVzdWx0LnF1ZXJ5IHx8ICFyZXN1bHQucXVlcnkuY2F0ZWdvcnltZW1iZXJzICkge1xyXG5cdFx0XHQvLyBObyByZXN1bHRzXHJcblx0XHRcdC8vIFRPRE86IGVycm9yIG9yIHdhcm5pbmcgKioqKioqKipcclxuXHRcdFx0ZmluaXNoZWRQcm9taXNlLnJlamVjdCgpO1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblx0XHRcclxuXHRcdC8vIEdhdGhlciB0aXRsZXMgaW50byBhcnJheSAtIGV4Y2x1ZGluZyBcIlRlbXBsYXRlOlwiIHByZWZpeFxyXG5cdFx0dmFyIHJlc3VsdFRpdGxlcyA9IHJlc3VsdC5xdWVyeS5jYXRlZ29yeW1lbWJlcnMubWFwKGZ1bmN0aW9uKGluZm8pIHtcclxuXHRcdFx0cmV0dXJuIGluZm8udGl0bGUuc2xpY2UoOSk7XHJcblx0XHR9KTtcclxuXHRcdEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KGNhdGVnb3JpZXNbY2F0SW5kZXhdLmJhbm5lcnMsIHJlc3VsdFRpdGxlcyk7XHJcblx0XHRcclxuXHRcdC8vIENvbnRpbnVlIHF1ZXJ5IGlmIG5lZWRlZFxyXG5cdFx0aWYgKCByZXN1bHQuY29udGludWUgKSB7XHJcblx0XHRcdGRvQXBpUXVlcnkoJC5leHRlbmQoY2F0ZWdvcmllc1tjYXRJbmRleF0ucXVlcnksIHJlc3VsdC5jb250aW51ZSksIGNhdEluZGV4KTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cdFx0XHJcblx0XHRjYXRlZ29yaWVzW2NhdEluZGV4XS5wcm9jZXNzZWQucmVzb2x2ZSgpO1xyXG5cdH07XHJcblxyXG5cdHZhciBkb0FwaVF1ZXJ5ID0gZnVuY3Rpb24ocSwgY2F0SW5kZXgpIHtcclxuXHRcdEFQSS5nZXQoIHEgKVxyXG5cdFx0XHQuZG9uZSggZnVuY3Rpb24ocmVzdWx0KSB7XHJcblx0XHRcdFx0cHJvY2Vzc1F1ZXJ5KHJlc3VsdCwgY2F0SW5kZXgpO1xyXG5cdFx0XHR9IClcclxuXHRcdFx0LmZhaWwoIGZ1bmN0aW9uKGNvZGUsIGpxeGhyKSB7XHJcblx0XHRcdFx0Y29uc29sZS53YXJuKFwiW1JhdGVyXSBcIiArIG1ha2VFcnJvck1zZyhjb2RlLCBqcXhociwgXCJDb3VsZCBub3QgcmV0cmlldmUgcGFnZXMgZnJvbSBbWzpcIiArIHEuY210aXRsZSArIFwiXV1cIikpO1xyXG5cdFx0XHRcdGZpbmlzaGVkUHJvbWlzZS5yZWplY3QoKTtcclxuXHRcdFx0fSApO1xyXG5cdH07XHJcblx0XHJcblx0Y2F0ZWdvcmllcy5mb3JFYWNoKGZ1bmN0aW9uKGNhdCwgaW5kZXgsIGFycikge1xyXG5cdFx0Y2F0LnF1ZXJ5ID0gJC5leHRlbmQoIHsgXCJjbXRpdGxlXCI6Y2F0LnRpdGxlIH0sIHF1ZXJ5U2tlbGV0b24gKTtcclxuXHRcdCQud2hlbiggYXJyW2luZGV4LTFdICYmIGFycltpbmRleC0xXS5wcm9jZXNzZWQgfHwgdHJ1ZSApLnRoZW4oZnVuY3Rpb24oKXtcclxuXHRcdFx0ZG9BcGlRdWVyeShjYXQucXVlcnksIGluZGV4KTtcclxuXHRcdH0pO1xyXG5cdH0pO1xyXG5cdFxyXG5cdGNhdGVnb3JpZXNbY2F0ZWdvcmllcy5sZW5ndGgtMV0ucHJvY2Vzc2VkLnRoZW4oZnVuY3Rpb24oKXtcclxuXHRcdGxldCBiYW5uZXJzID0ge307XHJcblx0XHRjYXRlZ29yaWVzLmZvckVhY2goY2F0T2JqZWN0ID0+IHtcclxuXHRcdFx0YmFubmVyc1tjYXRPYmplY3QuYWJicmV2aWF0aW9uXSA9IGNhdE9iamVjdC5iYW5uZXJzO1xyXG5cdFx0fSk7XHJcblx0XHRcclxuXHRcdGZpbmlzaGVkUHJvbWlzZS5yZXNvbHZlKGJhbm5lcnMpO1xyXG5cdH0pO1xyXG5cdFxyXG5cdHJldHVybiBmaW5pc2hlZFByb21pc2U7XHJcbn07XHJcblxyXG4vKipcclxuICogR2V0cyBiYW5uZXJzIGZyb20gY2FjaGUsIGlmIHRoZXJlIGFuZCBub3QgdG9vIG9sZFxyXG4gKiBcclxuICogQHJldHVybnMge1Byb21pc2V9IFJlc29sdmVkIHdpdGggYmFubmVycyBvYmplY3RcclxuICovXHJcbnZhciBnZXRCYW5uZXJzRnJvbUNhY2hlID0gZnVuY3Rpb24oKSB7XHJcblx0dmFyIGNhY2hlZEJhbm5lcnMgPSBjYWNoZS5yZWFkKFwiYmFubmVyc1wiKTtcclxuXHRpZiAoXHJcblx0XHQhY2FjaGVkQmFubmVycyB8fFxyXG5cdFx0IWNhY2hlZEJhbm5lcnMudmFsdWUgfHxcclxuXHRcdCFjYWNoZWRCYW5uZXJzLnN0YWxlRGF0ZVxyXG5cdCkge1xyXG5cdFx0cmV0dXJuICQuRGVmZXJyZWQoKS5yZWplY3QoKTtcclxuXHR9XHJcblx0aWYgKCBpc0FmdGVyRGF0ZShjYWNoZWRCYW5uZXJzLnN0YWxlRGF0ZSkgKSB7XHJcblx0XHQvLyBVcGRhdGUgaW4gdGhlIGJhY2tncm91bmQ7IHN0aWxsIHVzZSBvbGQgbGlzdCB1bnRpbCB0aGVuICBcclxuXHRcdGdldExpc3RPZkJhbm5lcnNGcm9tQXBpKCkudGhlbihjYWNoZUJhbm5lcnMpO1xyXG5cdH1cclxuXHRyZXR1cm4gJC5EZWZlcnJlZCgpLnJlc29sdmUoY2FjaGVkQmFubmVycy52YWx1ZSk7XHJcbn07XHJcblxyXG4vKipcclxuICogR2V0cyBiYW5uZXIgbmFtZXMsIGdyb3VwZWQgYnkgdHlwZSAod2l0aFJhdGluZ3MsIHdpdGhvdXRSYXRpbmdzLCB3cmFwcGVycywgbm90V1BCTSlcclxuICogQHJldHVybnMge1Byb21pc2U8T2JqZWN0Pn0gT2JqZWN0IG9mIHN0cmluZyBhcnJheXMga2V5ZWQgYnkgdHlwZSAod2l0aFJhdGluZ3MsIHdpdGhvdXRSYXRpbmdzLCB3cmFwcGVycywgbm90V1BCTSlcclxuICovXHJcbnZhciBnZXRCYW5uZXJOYW1lcyA9ICgpID0+IGdldEJhbm5lcnNGcm9tQ2FjaGUoKVxyXG5cdC50aGVuKCBiYW5uZXJzID0+IHtcclxuXHRcdC8vIEVuc3VyZSBhbGwga2V5cyBleGlzdFxyXG5cdFx0aWYgKCFiYW5uZXJzLndpdGhSYXRpbmdzIHx8ICFiYW5uZXJzLndpdGhvdXRSYXRpbmdzIHx8ICFiYW5uZXJzLndyYXBwZXJzIHx8ICFiYW5uZXJzLm5vdFdQQk0gfHwgIWJhbm5lcnMuaW5hY3RpdmUgfHwgIWJhbm5lcnMud2lyKSB7XHJcblx0XHRcdGdldExpc3RPZkJhbm5lcnNGcm9tQXBpKCkudGhlbihjYWNoZUJhbm5lcnMpO1xyXG5cdFx0XHRyZXR1cm4gJC5leHRlbmQoXHJcblx0XHRcdFx0eyB3aXRoUmF0aW5nczogW10sIHdpdGhvdXRSYXRpbmdzOiBbXSwgd3JhcHBlcnM6IFtdLCBub3RXUEJNOiBbXSwgaW5hY3RpdmU6IFtdLCB3aXI6IFtdIH0sXHJcblx0XHRcdFx0YmFubmVyc1xyXG5cdFx0XHQpO1xyXG5cdFx0fVxyXG5cdFx0Ly8gU3VjY2VzczogcGFzcyB0aHJvdWdoXHJcblx0XHRyZXR1cm4gYmFubmVycztcclxuXHR9IClcclxuXHQuY2F0Y2goICgpID0+IHtcclxuXHRcdC8vIEZhaWx1cmU6IGdldCBmcm9tIEFwaSwgdGhlbiBjYWNoZSB0aGVtXHJcblx0XHRsZXQgYmFubmVyc1Byb21pc2UgPSBnZXRMaXN0T2ZCYW5uZXJzRnJvbUFwaSgpO1xyXG5cdFx0YmFubmVyc1Byb21pc2UudGhlbihjYWNoZUJhbm5lcnMpO1xyXG5cdFx0cmV0dXJuIGJhbm5lcnNQcm9taXNlO1xyXG5cdH0gKTtcclxuXHJcbmV4cG9ydCB7IGdldEJhbm5lck5hbWVzIH07XHJcbi8vIDwvbm93aWtpPiIsImltcG9ydCBBUEkgZnJvbSBcIi4vYXBpXCI7XHJcbmltcG9ydCB7IGlzQWZ0ZXJEYXRlIH0gZnJvbSBcIi4vdXRpbFwiO1xyXG5pbXBvcnQgY29uZmlnIGZyb20gXCIuL2NvbmZpZ1wiO1xyXG5pbXBvcnQgKiBhcyBjYWNoZSBmcm9tIFwiLi9jYWNoZVwiO1xyXG4vLyA8bm93aWtpPlxyXG5cclxuY29uc3QgcHJlZnNQYWdlID0gYFVzZXI6JHttdy5jb25maWcuZ2V0KFwid2dVc2VyTmFtZVwiKX0vcmF0ZXJQcmVmcy5qc29uYDtcclxuXHJcbmNvbnN0IHdyaXRlUHJlZnNUb0NhY2hlID0gcHJlZnMgPT4gY2FjaGUud3JpdGUoXHJcblx0XCJwcmVmc1wiLFxyXG5cdHByZWZzLFxyXG5cdCgxLzI0LzYwKSoxLCAvLyAxIG1pblxyXG5cdCgxLzI0LzYwKSoxICAvLyAxIG1pblxyXG4pO1xyXG5cclxuY29uc3QgZ2V0UHJlZnNGcm9tQXBpID0gZnVuY3Rpb24oKSB7XHJcblx0cmV0dXJuIEFQSS5nZXQoe1xyXG5cdFx0XCJhY3Rpb25cIjogXCJxdWVyeVwiLFxyXG5cdFx0XCJmb3JtYXRcIjogXCJqc29uXCIsXHJcblx0XHRcInByb3BcIjogXCJyZXZpc2lvbnNcIixcclxuXHRcdFwidGl0bGVzXCI6IHByZWZzUGFnZSxcclxuXHRcdFwicnZwcm9wXCI6IFwiY29udGVudFwiLFxyXG5cdFx0XCJydnNsb3RzXCI6IFwibWFpblwiXHJcblx0fSkudGhlbihyZXNwb25zZSA9PiB7XHJcblx0XHRjb25zdCBwYWdlID0gcmVzcG9uc2UucXVlcnkucGFnZXNbT2JqZWN0LmtleXMocmVzcG9uc2UucXVlcnkucGFnZXMpWzBdXTtcclxuXHRcdGlmICghcGFnZS5wYWdlaWQgfHwgcGFnZS5taXNzaW5nPT09XCJcIikge1xyXG5cdFx0XHRyZXR1cm4gY29uZmlnLmRlZmF1bHRQcmVmcztcclxuXHRcdH1cclxuXHRcdGxldCBwcmVmcztcclxuXHRcdHRyeSB7XHJcblx0XHRcdHByZWZzID0gSlNPTi5wYXJzZSggcGFnZS5yZXZpc2lvbnNbMF0uc2xvdHMubWFpbltcIipcIl0gKTtcclxuXHRcdH0gY2F0Y2goZSkge1xyXG5cdFx0XHRyZXR1cm4gJC5EZWZlcnJlZCgpLnJlamVjdChcIkpTT04tcGFyc2luZy1lcnJvclwiLCBlKTtcclxuXHRcdH1cclxuXHRcdHdyaXRlUHJlZnNUb0NhY2hlKHByZWZzKTtcclxuXHRcdHJldHVybiBwcmVmcztcclxuXHR9KTtcclxufTtcclxuXHJcbmNvbnN0IGdldFByZWZzRnJvbUNhY2hlID0gZnVuY3Rpb24oKSB7XHJcblx0dmFyIGNhY2hlZFByZWZzID0gY2FjaGUucmVhZChcInByZWZzXCIpO1xyXG5cdGlmIChcclxuXHRcdCFjYWNoZWRQcmVmcyB8fFxyXG5cdFx0IWNhY2hlZFByZWZzLnZhbHVlIHx8XHJcblx0XHQhY2FjaGVkUHJlZnMuc3RhbGVEYXRlIHx8XHJcblx0XHRpc0FmdGVyRGF0ZShjYWNoZWRQcmVmcy5zdGFsZURhdGUpXHJcblx0KSB7XHJcblx0XHQvLyBObyBjYWNoZWQgdmFsdWUsIG9yIGlzIHRvbyBvbGRcclxuXHRcdHJldHVybiAkLkRlZmVycmVkKCkucmVqZWN0KCk7XHJcblx0fVxyXG5cdHJldHVybiAkLkRlZmVycmVkKCkucmVzb2x2ZShjYWNoZWRQcmVmcy52YWx1ZSk7XHJcbn07XHJcblxyXG5jb25zdCBnZXRQcmVmcyA9ICgpID0+IGdldFByZWZzRnJvbUNhY2hlKCkudGhlbihcclxuXHQvLyBTdWNjZXNzOiBwYXNzIHRocm91Z2ggKGZpcnN0IHBhcmFtIG9ubHkpXHJcblx0cHJlZnMgPT4gJC5EZWZlcnJlZCgpLnJlc29sdmUocHJlZnMpLFxyXG5cdC8vIEZhaWx1cmU6IGdldCBmcm9tIEFwaVxyXG5cdCgpID0+IGdldFByZWZzRnJvbUFwaSgpXHJcbik7XHJcblxyXG4vKipcclxuICogXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSB1cGRhdGVkUHJlZnMgb2JqZWN0IHdpdGgga2V5OnZhbHVlIHBhaXJzIGZvciBwcmVmZXJlbmNlcyBqc29uLlxyXG4gKi9cclxuY29uc3Qgc2V0UHJlZnMgPSBmdW5jdGlvbih1cGRhdGVkUHJlZnMpIHtcclxuXHRyZXR1cm4gQVBJLmVkaXRXaXRoUmV0cnkocHJlZnNQYWdlLFx0bnVsbCxcclxuXHRcdCgpID0+ICh7XHJcblx0XHRcdFwidGV4dFwiOiBKU09OLnN0cmluZ2lmeSh1cGRhdGVkUHJlZnMpLFxyXG5cdFx0XHRcInN1bW1hcnlcIjogXCJTYXZpbmcgUmF0ZXIgcHJlZmVyZW5jZXMgXCIgKyBjb25maWcuc2NyaXB0LmFkdmVydFxyXG5cdFx0fSlcclxuXHQpXHJcblx0XHQudGhlbiggKCkgPT4gd3JpdGVQcmVmc1RvQ2FjaGUodXBkYXRlZFByZWZzKSApO1xyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgKHtnZXQ6IGdldFByZWZzLCBzZXQ6IHNldFByZWZzfSk7XHJcbmV4cG9ydCB7IGdldFByZWZzLCBzZXRQcmVmcyB9O1xyXG4vLyA8L25vd2lraT4iLCJpbXBvcnQgY29uZmlnIGZyb20gXCIuL2NvbmZpZ1wiO1xyXG5pbXBvcnQgQVBJIGZyb20gXCIuL2FwaVwiO1xyXG5pbXBvcnQgeyBwYXJzZVRlbXBsYXRlcywgZ2V0V2l0aFJlZGlyZWN0VG8gfSBmcm9tIFwiLi9UZW1wbGF0ZVwiO1xyXG5pbXBvcnQge2dldEJhbm5lck5hbWVzfSBmcm9tIFwiLi9nZXRCYW5uZXJzXCI7XHJcbmltcG9ydCAqIGFzIGNhY2hlIGZyb20gXCIuL2NhY2hlXCI7XHJcbmltcG9ydCB3aW5kb3dNYW5hZ2VyIGZyb20gXCIuL3dpbmRvd01hbmFnZXJcIjtcclxuaW1wb3J0IHsgZ2V0UHJlZnMgfSBmcm9tIFwiLi9wcmVmc1wiO1xyXG5pbXBvcnQgeyBmaWx0ZXJBbmRNYXAgfSBmcm9tIFwiLi91dGlsXCI7XHJcbi8vIDxub3dpa2k+XHJcblxyXG52YXIgc2V0dXBSYXRlciA9IGZ1bmN0aW9uKGNsaWNrRXZlbnQpIHtcclxuXHRpZiAoIGNsaWNrRXZlbnQgKSB7XHJcblx0XHRjbGlja0V2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblx0fVxyXG5cclxuXHR2YXIgc2V0dXBDb21wbGV0ZWRQcm9taXNlID0gJC5EZWZlcnJlZCgpO1xyXG4gICAgXHJcblx0dmFyIGN1cnJlbnRQYWdlID0gbXcuVGl0bGUubmV3RnJvbVRleHQoY29uZmlnLm13LndnUGFnZU5hbWUpO1xyXG5cdHZhciB0YWxrUGFnZSA9IGN1cnJlbnRQYWdlICYmIGN1cnJlbnRQYWdlLmdldFRhbGtQYWdlKCk7XHJcblx0dmFyIHN1YmplY3RQYWdlID0gY3VycmVudFBhZ2UgJiYgY3VycmVudFBhZ2UuZ2V0U3ViamVjdFBhZ2UoKTtcclxuXHR2YXIgc3ViamVjdElzQXJ0aWNsZSA9IGNvbmZpZy5tdy53Z05hbWVzcGFjZU51bWJlciA8PSAxO1xyXG4gXHJcblx0Ly8gR2V0IHByZWZlcmVuY2VzICh0YXNrIDApXHJcblx0dmFyIHByZWZzUHJvbWlzZSA9IGdldFByZWZzKCk7XHJcblxyXG5cdC8vIEdldCBsaXN0cyBvZiBhbGwgYmFubmVycyAodGFzayAxKVxyXG5cdHZhciBiYW5uZXJzUHJvbWlzZSA9IGdldEJhbm5lck5hbWVzKCk7XHJcblxyXG5cdC8vIExvYWQgdGFsayBwYWdlICh0YXNrIDIpXHJcblx0dmFyIGxvYWRUYWxrUHJvbWlzZSA9IEFQSS5nZXQoIHtcclxuXHRcdGFjdGlvbjogXCJxdWVyeVwiLFxyXG5cdFx0cHJvcDogXCJyZXZpc2lvbnNcIixcclxuXHRcdHJ2cHJvcDogXCJjb250ZW50XCIsXHJcblx0XHRydnNlY3Rpb246IFwiMFwiLFxyXG5cdFx0dGl0bGVzOiB0YWxrUGFnZS5nZXRQcmVmaXhlZFRleHQoKSxcclxuXHRcdGluZGV4cGFnZWlkczogMVxyXG5cdH0gKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcclxuXHRcdHZhciBpZCA9IHJlc3VsdC5xdWVyeS5wYWdlaWRzO1x0XHRcclxuXHRcdHZhciB3aWtpdGV4dCA9ICggaWQgPCAwICkgPyBcIlwiIDogcmVzdWx0LnF1ZXJ5LnBhZ2VzW2lkXS5yZXZpc2lvbnNbMF1bXCIqXCJdO1xyXG5cdFx0cmV0dXJuIHdpa2l0ZXh0O1xyXG5cdH0pO1xyXG5cclxuXHQvLyBQYXJzZSB0YWxrIHBhZ2UgZm9yIGJhbm5lcnMgKHRhc2sgMylcclxuXHR2YXIgcGFyc2VUYWxrUHJvbWlzZSA9IGxvYWRUYWxrUHJvbWlzZS50aGVuKHdpa2l0ZXh0ID0+IHBhcnNlVGVtcGxhdGVzKHdpa2l0ZXh0LCB0cnVlKSkgLy8gR2V0IGFsbCB0ZW1wbGF0ZXNcclxuXHRcdC50aGVuKHRlbXBsYXRlcyA9PiB0ZW1wbGF0ZXMuZmlsdGVyKHRlbXBsYXRlID0+IHRlbXBsYXRlLmdldFRpdGxlKCkgIT09IG51bGwpKSAvLyBGaWx0ZXIgb3V0IGludmFsaWQgdGVtcGxhdGVzIChlLmcuIHBhcnNlciBmdW5jdGlvbnMpXHJcblx0XHQudGhlbih0ZW1wbGF0ZXMgPT4gZ2V0V2l0aFJlZGlyZWN0VG8odGVtcGxhdGVzKSkgLy8gQ2hlY2sgZm9yIHJlZGlyZWN0c1xyXG5cdFx0LnRoZW4odGVtcGxhdGVzID0+IHtcclxuXHRcdFx0cmV0dXJuIGJhbm5lcnNQcm9taXNlLnRoZW4oKGFsbEJhbm5lcnMpID0+IHsgLy8gR2V0IGxpc3Qgb2YgYWxsIGJhbm5lciB0ZW1wbGF0ZXNcclxuXHRcdFx0XHRyZXR1cm4gZmlsdGVyQW5kTWFwKFxyXG5cdFx0XHRcdFx0dGVtcGxhdGVzLCBcdFx0XHRcclxuXHRcdFx0XHRcdC8vIEZpbHRlciBvdXQgbm9uLWJhbm5lcnNcclxuXHRcdFx0XHRcdHRlbXBsYXRlID0+IHsgXHJcblx0XHRcdFx0XHRcdGlmICh0ZW1wbGF0ZS5pc1NoZWxsVGVtcGxhdGUoKSkgeyByZXR1cm4gdHJ1ZTsgfVxyXG5cdFx0XHRcdFx0XHR2YXIgbWFpblRleHQgPSB0ZW1wbGF0ZS5yZWRpcmVjdFRhcmdldFxyXG5cdFx0XHRcdFx0XHRcdD8gdGVtcGxhdGUucmVkaXJlY3RUYXJnZXQuZ2V0TWFpblRleHQoKVxyXG5cdFx0XHRcdFx0XHRcdDogdGVtcGxhdGUuZ2V0VGl0bGUoKS5nZXRNYWluVGV4dCgpO1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gYWxsQmFubmVycy53aXRoUmF0aW5ncy5pbmNsdWRlcyhtYWluVGV4dCkgfHwgXHJcblx0XHRcdFx0XHRcdGFsbEJhbm5lcnMud2l0aG91dFJhdGluZ3MuaW5jbHVkZXMobWFpblRleHQpIHx8XHJcblx0XHRcdFx0XHRcdGFsbEJhbm5lcnMud3JhcHBlcnMuaW5jbHVkZXMobWFpblRleHQpIHx8XHJcblx0XHRcdFx0XHRcdGFsbEJhbm5lcnMubm90V1BCTS5pbmNsdWRlcyhtYWluVGV4dCkgfHxcclxuXHRcdFx0XHRcdFx0YWxsQmFubmVycy5pbmFjdGl2ZS5pbmNsdWRlcyhtYWluVGV4dCkgfHxcclxuXHRcdFx0XHRcdFx0YWxsQmFubmVycy53aXIuaW5jbHVkZXMobWFpblRleHQpO1xyXG5cdFx0XHRcdFx0fSxcclxuXHRcdFx0XHRcdC8vIFNldCBhZGRpdGlvbmFsIHByb3BlcnRpZXMgaWYgbmVlZGVkXHJcblx0XHRcdFx0XHR0ZW1wbGF0ZSA9PiB7XHJcblx0XHRcdFx0XHRcdHZhciBtYWluVGV4dCA9IHRlbXBsYXRlLnJlZGlyZWN0VGFyZ2V0XHJcblx0XHRcdFx0XHRcdFx0PyB0ZW1wbGF0ZS5yZWRpcmVjdFRhcmdldC5nZXRNYWluVGV4dCgpXHJcblx0XHRcdFx0XHRcdFx0OiB0ZW1wbGF0ZS5nZXRUaXRsZSgpLmdldE1haW5UZXh0KCk7XHJcblx0XHRcdFx0XHRcdGlmIChhbGxCYW5uZXJzLndyYXBwZXJzLmluY2x1ZGVzKG1haW5UZXh0KSkge1xyXG5cdFx0XHRcdFx0XHRcdHRlbXBsYXRlLnJlZGlyZWN0VGFyZ2V0ID0gbXcuVGl0bGUubmV3RnJvbVRleHQoXCJUZW1wbGF0ZTpTdWJzdDpcIiArIG1haW5UZXh0KTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRcdFx0YWxsQmFubmVycy53aXRob3V0UmF0aW5ncy5pbmNsdWRlcyhtYWluVGV4dCkgfHxcclxuXHRcdFx0XHRcdFx0XHRhbGxCYW5uZXJzLndpci5pbmNsdWRlcyhtYWluVGV4dClcclxuXHRcdFx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHRcdFx0dGVtcGxhdGUud2l0aG91dFJhdGluZ3MgPSB0cnVlO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdGlmICggYWxsQmFubmVycy5pbmFjdGl2ZS5pbmNsdWRlcyhtYWluVGV4dCkgKSB7XHJcblx0XHRcdFx0XHRcdFx0dGVtcGxhdGUuaW5hY3RpdmVQcm9qZWN0ID0gdHJ1ZTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRyZXR1cm4gdGVtcGxhdGU7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0KTtcclxuXHRcdFx0fSk7XHJcblx0XHR9KTtcclxuXHRcclxuXHQvLyBSZXRyaWV2ZSBhbmQgc3RvcmUgY2xhc3NlcywgaW1wb3J0YW5jZXMsIGFuZCBUZW1wbGF0ZURhdGEgKHRhc2sgNClcclxuXHR2YXIgdGVtcGxhdGVEZXRhaWxzUHJvbWlzZSA9IHBhcnNlVGFsa1Byb21pc2UudGhlbihmdW5jdGlvbih0ZW1wbGF0ZXMpIHtcclxuXHRcdC8vIFdhaXQgZm9yIGFsbCBwcm9taXNlcyB0byByZXNvbHZlXHJcblx0XHRyZXR1cm4gJC53aGVuLmFwcGx5KG51bGwsIFtcclxuXHRcdFx0Li4udGVtcGxhdGVzLm1hcCh0ZW1wbGF0ZSA9PiB0ZW1wbGF0ZS5pc1NoZWxsVGVtcGxhdGUoKSA/IG51bGwgOiB0ZW1wbGF0ZS5zZXRDbGFzc2VzQW5kSW1wb3J0YW5jZXMoKSksXHJcblx0XHRcdC4uLnRlbXBsYXRlcy5tYXAodGVtcGxhdGUgPT4gdGVtcGxhdGUuc2V0UGFyYW1EYXRhQW5kU3VnZ2VzdGlvbnMoKSlcclxuXHRcdF0pLnRoZW4oKCkgPT4ge1xyXG5cdFx0XHQvLyBBZGQgbWlzc2luZyByZXF1aXJlZC9zdWdnZXN0ZWQgdmFsdWVzXHJcblx0XHRcdHRlbXBsYXRlcy5mb3JFYWNoKHRlbXBsYXRlID0+IHRlbXBsYXRlLmFkZE1pc3NpbmdQYXJhbXMoKSk7XHJcblx0XHRcdC8vIFJldHVybiB0aGUgbm93LW1vZGlmaWVkIHRlbXBsYXRlc1xyXG5cdFx0XHRyZXR1cm4gdGVtcGxhdGVzO1xyXG5cdFx0fSk7XHJcblx0fSk7XHJcblxyXG5cdC8vIENoZWNrIHN1YmplY3QgcGFnZSBmZWF0dXJlcyAodGFzayA1KSAtIGJ1dCBkb24ndCBlcnJvciBvdXQgaWYgcmVxdWVzdCBmYWlsc1xyXG5cdHZhciBzdWJqZWN0UGFnZUNoZWNrUHJvbWlzZSA9IEFQSS5nZXQoe1xyXG5cdFx0YWN0aW9uOiBcInF1ZXJ5XCIsXHJcblx0XHRmb3JtYXQ6IFwianNvblwiLFxyXG5cdFx0Zm9ybWF0dmVyc2lvbjogXCIyXCIsXHJcblx0XHRwcm9wOiBcImNhdGVnb3JpZXNcIixcclxuXHRcdHRpdGxlczogc3ViamVjdFBhZ2UuZ2V0UHJlZml4ZWRUZXh0KCksXHJcblx0XHRyZWRpcmVjdHM6IDEsXHJcblx0XHRjbGNhdGVnb3JpZXM6IFtcclxuXHRcdFx0XCJDYXRlZ29yeTpBbGwgZGlzYW1iaWd1YXRpb24gcGFnZXNcIixcclxuXHRcdFx0XCJDYXRlZ29yeTpBbGwgc3R1YiBhcnRpY2xlc1wiLFxyXG5cdFx0XHRcIkNhdGVnb3J5Okdvb2QgYXJ0aWNsZXNcIixcclxuXHRcdFx0XCJDYXRlZ29yeTpGZWF0dXJlZCBhcnRpY2xlc1wiLFxyXG5cdFx0XHRcIkNhdGVnb3J5OkZlYXR1cmVkIGxpc3RzXCJcclxuXHRcdF1cclxuXHR9KS50aGVuKHJlc3BvbnNlID0+IHtcclxuXHRcdGlmICggIXJlc3BvbnNlIHx8ICFyZXNwb25zZS5xdWVyeSB8fCAhcmVzcG9uc2UucXVlcnkucGFnZXMgKSB7XHJcblx0XHRcdHJldHVybiBudWxsO1xyXG5cdFx0fVxyXG5cdFx0Y29uc3QgcmVkaXJlY3RUYXJnZXQgPSByZXNwb25zZS5xdWVyeS5yZWRpcmVjdHMgJiYgcmVzcG9uc2UucXVlcnkucmVkaXJlY3RzWzBdLnRvIHx8IGZhbHNlO1xyXG5cdFx0aWYgKCByZWRpcmVjdFRhcmdldCB8fCAhc3ViamVjdElzQXJ0aWNsZSApIHtcclxuXHRcdFx0cmV0dXJuIHsgcmVkaXJlY3RUYXJnZXQgfTtcclxuXHRcdH1cclxuXHRcdGNvbnN0IHBhZ2UgPSByZXNwb25zZS5xdWVyeS5wYWdlc1swXTtcclxuXHRcdGNvbnN0IGhhc0NhdGVnb3J5ID0gY2F0ZWdvcnkgPT4gcGFnZS5jYXRlZ29yaWVzICYmIHBhZ2UuY2F0ZWdvcmllcy5maW5kKGNhdCA9PiBjYXQudGl0bGUgPT09IFwiQ2F0ZWdvcnk6XCIrY2F0ZWdvcnkpO1xyXG5cdFx0cmV0dXJuIHtcclxuXHRcdFx0cmVkaXJlY3RUYXJnZXQsXHJcblx0XHRcdGRpc2FtYmlnOiBoYXNDYXRlZ29yeShcIkFsbCBkaXNhbWJpZ3VhdGlvbiBwYWdlc1wiKSxcclxuXHRcdFx0c3R1YnRhZzogaGFzQ2F0ZWdvcnkoXCJBbGwgc3R1YiBhcnRpY2xlc1wiKSxcclxuXHRcdFx0aXNHQTogaGFzQ2F0ZWdvcnkoXCJHb29kIGFydGljbGVzXCIpLFxyXG5cdFx0XHRpc0ZBOiBoYXNDYXRlZ29yeShcIkZlYXR1cmVkIGFydGljbGVzXCIpLFxyXG5cdFx0XHRpc0ZMOiBoYXNDYXRlZ29yeShcIkZlYXR1cmVkIGxpc3RzXCIpLFxyXG5cdFx0XHRpc0xpc3Q6ICFoYXNDYXRlZ29yeShcIkZlYXR1cmVkIGxpc3RzXCIpICYmIC9eTGlzdHM/IG9mLy50ZXN0KHN1YmplY3RQYWdlLmdldFByZWZpeGVkVGV4dCgpKVxyXG5cdFx0fTtcclxuXHR9KS5jYXRjaCgoKSA9PiBudWxsKTsgLy8gRmFpbHVyZSBpZ25vcmVkXHJcblxyXG5cdC8vIFJldHJpZXZlIHJhdGluZyBmcm9tIE9SRVMgKHRhc2sgNiwgb25seSBuZWVkZWQgZm9yIGFydGljbGVzKSAtIGJ1dCBkb24ndCBlcnJvciBvdXQgaWYgcmVxdWVzdCBmYWlsc1xyXG5cdHZhciBzaG91bGRHZXRPcmVzID0gKCBzdWJqZWN0SXNBcnRpY2xlICk7IC8vIFRPRE86IERvbid0IG5lZWQgdG8gZ2V0IE9SRVMgZm9yIHJlZGlyZWN0cyBvciBkaXNhbWJpZ3NcclxuXHRpZiAoIHNob3VsZEdldE9yZXMgKSB7XHJcblx0XHR2YXIgbGF0ZXN0UmV2SWRQcm9taXNlID0gIWN1cnJlbnRQYWdlLmlzVGFsa1BhZ2UoKVxyXG5cdFx0XHQ/ICQuRGVmZXJyZWQoKS5yZXNvbHZlKGNvbmZpZy5tdy53Z1JldmlzaW9uSWQpXHJcblx0XHRcdDogQVBJLmdldCgge1xyXG5cdFx0XHRcdGFjdGlvbjogXCJxdWVyeVwiLFxyXG5cdFx0XHRcdGZvcm1hdDogXCJqc29uXCIsXHJcblx0XHRcdFx0cHJvcDogXCJyZXZpc2lvbnNcIixcclxuXHRcdFx0XHR0aXRsZXM6IHN1YmplY3RQYWdlLmdldFByZWZpeGVkVGV4dCgpLFxyXG5cdFx0XHRcdHJ2cHJvcDogXCJpZHNcIixcclxuXHRcdFx0XHRpbmRleHBhZ2VpZHM6IDFcclxuXHRcdFx0fSApLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7XHJcblx0XHRcdFx0aWYgKHJlc3VsdC5xdWVyeS5yZWRpcmVjdHMpIHtcclxuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0dmFyIGlkID0gcmVzdWx0LnF1ZXJ5LnBhZ2VpZHM7XHJcblx0XHRcdFx0dmFyIHBhZ2UgPSByZXN1bHQucXVlcnkucGFnZXNbaWRdO1xyXG5cdFx0XHRcdGlmIChwYWdlLm1pc3NpbmcgPT09IFwiXCIpIHtcclxuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0aWYgKCBpZCA8IDAgKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gJC5EZWZlcnJlZCgpLnJlamVjdCgpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRyZXR1cm4gcGFnZS5yZXZpc2lvbnNbMF0ucmV2aWQ7XHJcblx0XHRcdH0pO1xyXG5cdFx0dmFyIG9yZXNQcm9taXNlID0gbGF0ZXN0UmV2SWRQcm9taXNlLnRoZW4oZnVuY3Rpb24obGF0ZXN0UmV2SWQpIHtcclxuXHRcdFx0aWYgKCFsYXRlc3RSZXZJZCkge1xyXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm4gQVBJLmdldE9SRVMobGF0ZXN0UmV2SWQpXHJcblx0XHRcdFx0LnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7XHJcblx0XHRcdFx0XHR2YXIgZGF0YSA9IHJlc3VsdC5lbndpa2kuc2NvcmVzW2xhdGVzdFJldklkXS5hcnRpY2xlcXVhbGl0eTtcclxuXHRcdFx0XHRcdGlmICggZGF0YS5lcnJvciApIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuICQuRGVmZXJyZWQoKS5yZWplY3QoZGF0YS5lcnJvci50eXBlLCBkYXRhLmVycm9yLm1lc3NhZ2UpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0Y29uc3QgcHJlZGljdGlvbiA9IGRhdGEuc2NvcmUucHJlZGljdGlvbjtcclxuXHRcdFx0XHRcdGNvbnN0IHByb2JhYmlsaXRpZXMgPSBkYXRhLnNjb3JlLnByb2JhYmlsaXR5O1xyXG5cdFx0XHRcdFx0aWYgKHByZWRpY3Rpb24gPT09IFwiRkFcIiB8fCBwcmVkaWN0aW9uID09PSBcIkdBXCIpIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIHtcclxuXHRcdFx0XHRcdFx0XHRwcmVkaWN0aW9uOiBcIkIgb3IgaGlnaGVyXCIsXHJcblx0XHRcdFx0XHRcdFx0cHJvYmFiaWxpdHk6ICgocHJvYmFiaWxpdGllcy5GQSArIHByb2JhYmlsaXRpZXMuR0EgKyBwcm9iYWJpbGl0aWVzLkIpKjEwMCkudG9GaXhlZCgxKStcIiVcIlxyXG5cdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0cmV0dXJuIHtcclxuXHRcdFx0XHRcdFx0cHJlZGljdGlvbixcclxuXHRcdFx0XHRcdFx0cHJvYmFiaWxpdHk6IChwcm9iYWJpbGl0aWVzWyBwcmVkaWN0aW9uIF0qMTAwKS50b0ZpeGVkKDEpK1wiJVwiXHJcblx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdH0pLmNhdGNoKCgpID0+IG51bGwpOyAvLyBGYWlsdXJlIGlnbm9yZWQ7XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdC8vIE9wZW4gdGhlIGxvYWQgZGlhbG9nXHJcblx0dmFyIGlzT3BlbmVkUHJvbWlzZSA9ICQuRGVmZXJyZWQoKTtcclxuXHR2YXIgbG9hZERpYWxvZ1dpbiA9IHdpbmRvd01hbmFnZXIub3BlbldpbmRvdyhcImxvYWREaWFsb2dcIiwge1xyXG5cdFx0cHJvbWlzZXM6IFtcclxuXHRcdFx0YmFubmVyc1Byb21pc2UsXHJcblx0XHRcdGxvYWRUYWxrUHJvbWlzZSxcclxuXHRcdFx0cGFyc2VUYWxrUHJvbWlzZSxcclxuXHRcdFx0dGVtcGxhdGVEZXRhaWxzUHJvbWlzZSxcclxuXHRcdFx0c3ViamVjdFBhZ2VDaGVja1Byb21pc2UsXHJcblx0XHRcdHNob3VsZEdldE9yZXMgJiYgb3Jlc1Byb21pc2VcclxuXHRcdF0sXHJcblx0XHRvcmVzOiBzaG91bGRHZXRPcmVzLFxyXG5cdFx0aXNPcGVuZWQ6IGlzT3BlbmVkUHJvbWlzZVxyXG5cdH0pO1xyXG5cclxuXHRsb2FkRGlhbG9nV2luLm9wZW5lZC50aGVuKGlzT3BlbmVkUHJvbWlzZS5yZXNvbHZlKTtcclxuXHJcblxyXG5cdCQud2hlbihcclxuXHRcdHByZWZzUHJvbWlzZSxcclxuXHRcdGxvYWRUYWxrUHJvbWlzZSxcclxuXHRcdHRlbXBsYXRlRGV0YWlsc1Byb21pc2UsXHJcblx0XHRzdWJqZWN0UGFnZUNoZWNrUHJvbWlzZSxcclxuXHRcdHNob3VsZEdldE9yZXMgJiYgb3Jlc1Byb21pc2VcclxuXHQpLnRoZW4oXHJcblx0XHQvLyBBbGwgc3VjY2VkZWRcclxuXHRcdGZ1bmN0aW9uKHByZWZlcmVuY2VzLCB0YWxrV2lraXRleHQsIGJhbm5lcnMsIHN1YmplY3RQYWdlQ2hlY2ssIG9yZXNQcmVkaWNpdGlvbiApIHtcclxuXHRcdFx0dmFyIHJlc3VsdCA9IHtcclxuXHRcdFx0XHRzdWNjZXNzOiB0cnVlLFxyXG5cdFx0XHRcdHRhbGtwYWdlOiB0YWxrUGFnZSxcclxuXHRcdFx0XHRzdWJqZWN0UGFnZTogc3ViamVjdFBhZ2UsXHJcblx0XHRcdFx0dGFsa1dpa2l0ZXh0OiB0YWxrV2lraXRleHQsXHJcblx0XHRcdFx0YmFubmVyczogYmFubmVycyxcclxuXHRcdFx0XHRwcmVmZXJlbmNlczogcHJlZmVyZW5jZXMsXHJcblx0XHRcdFx0aXNBcnRpY2xlOiBzdWJqZWN0SXNBcnRpY2xlXHJcblx0XHRcdH07XHJcblx0XHRcdGlmIChzdWJqZWN0UGFnZUNoZWNrKSB7XHJcblx0XHRcdFx0cmVzdWx0ID0geyAuLi5yZXN1bHQsIC4uLnN1YmplY3RQYWdlQ2hlY2sgfTtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAob3Jlc1ByZWRpY2l0aW9uICYmIHN1YmplY3RQYWdlQ2hlY2sgJiYgIXN1YmplY3RQYWdlQ2hlY2suaXNHQSAmJiAhc3ViamVjdFBhZ2VDaGVjay5pc0ZBICYmICFzdWJqZWN0UGFnZUNoZWNrLmlzRkwpIHtcclxuXHRcdFx0XHRyZXN1bHQub3JlcyA9IG9yZXNQcmVkaWNpdGlvbjtcclxuXHRcdFx0fVxyXG5cdFx0XHR3aW5kb3dNYW5hZ2VyLmNsb3NlV2luZG93KFwibG9hZERpYWxvZ1wiLCByZXN1bHQpO1xyXG5cdFx0XHRcclxuXHRcdH1cclxuXHQpOyAvLyBBbnkgZmFpbHVyZXMgYXJlIGhhbmRsZWQgYnkgdGhlIGxvYWREaWFsb2cgd2luZG93IGl0c2VsZlxyXG5cclxuXHQvLyBPbiB3aW5kb3cgY2xvc2VkLCBjaGVjayBkYXRhLCBhbmQgcmVzb2x2ZS9yZWplY3Qgc2V0dXBDb21wbGV0ZWRQcm9taXNlXHJcblx0bG9hZERpYWxvZ1dpbi5jbG9zZWQudGhlbihmdW5jdGlvbihkYXRhKSB7XHJcblx0XHRpZiAoZGF0YSAmJiBkYXRhLnN1Y2Nlc3MpIHtcclxuXHRcdFx0Ly8gR290IGV2ZXJ5dGhpbmcgbmVlZGVkOiBSZXNvbHZlIHByb21pc2Ugd2l0aCB0aGlzIGRhdGFcclxuXHRcdFx0c2V0dXBDb21wbGV0ZWRQcm9taXNlLnJlc29sdmUoZGF0YSk7XHJcblx0XHR9IGVsc2UgaWYgKGRhdGEgJiYgZGF0YS5lcnJvcikge1xyXG5cdFx0XHQvLyBUaGVyZSB3YXMgYW4gZXJyb3I6IFJlamVjdCBwcm9taXNlIHdpdGggZXJyb3IgY29kZS9pbmZvXHJcblx0XHRcdHNldHVwQ29tcGxldGVkUHJvbWlzZS5yZWplY3QoZGF0YS5lcnJvci5jb2RlLCBkYXRhLmVycm9yLmluZm8pO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0Ly8gV2luZG93IGNsb3NlZCBiZWZvcmUgY29tcGxldGlvbjogcmVzb2x2ZSBwcm9taXNlIHdpdGhvdXQgYW55IGRhdGFcclxuXHRcdFx0c2V0dXBDb21wbGV0ZWRQcm9taXNlLnJlc29sdmUobnVsbCk7XHJcblx0XHR9XHJcblx0XHRjYWNoZS5jbGVhckludmFsaWRJdGVtcygpO1xyXG5cdH0pO1xyXG5cdHJldHVybiBzZXR1cENvbXBsZXRlZFByb21pc2U7XHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBzZXR1cFJhdGVyO1xyXG4vLyA8L25vd2lraT4iLCIvLyA8bm93aWtpPlxyXG5cclxuLy8gVmFyaW91cyB1dGlsaXR5IGZ1bmN0aW9ucyBhbmQgb2JqZWN0cyB0aGF0IG1pZ2h0IGJlIHVzZWQgaW4gbXVsdGlwbGUgcGxhY2VzXHJcblxyXG52YXIgaXNBZnRlckRhdGUgPSBmdW5jdGlvbihkYXRlU3RyaW5nKSB7XHJcblx0cmV0dXJuIG5ldyBEYXRlKGRhdGVTdHJpbmcpIDwgbmV3IERhdGUoKTtcclxufTtcclxuXHJcbnZhciB5ZXNXb3JkcyA9IFtcclxuXHRcImFkZFwiLFxyXG5cdFwiYWRkZWRcIixcclxuXHRcImFmZmlybVwiLFxyXG5cdFwiYWZmaXJtZWRcIixcclxuXHRcImluY2x1ZGVcIixcclxuXHRcImluY2x1ZGVkXCIsXHJcblx0XCJvblwiLFxyXG5cdFwidHJ1ZVwiLFxyXG5cdFwieWVzXCIsXHJcblx0XCJ5XCIsXHJcblx0XCIxXCJcclxuXTtcclxudmFyIG5vV29yZHMgPSBbXHJcblx0XCJkZWNsaW5lXCIsXHJcblx0XCJkZWNsaW5lZFwiLFxyXG5cdFwiZXhjbHVkZVwiLFxyXG5cdFwiZXhjbHVkZWRcIixcclxuXHRcImZhbHNlXCIsXHJcblx0XCJub25lXCIsXHJcblx0XCJub3RcIixcclxuXHRcIm5vXCIsXHJcblx0XCJuXCIsXHJcblx0XCJvZmZcIixcclxuXHRcIm9taXRcIixcclxuXHRcIm9taXR0ZWRcIixcclxuXHRcInJlbW92ZVwiLFxyXG5cdFwicmVtb3ZlZFwiLFxyXG5cdFwiMFwiXHJcbl07XHJcbnZhciBub3JtYWxpc2VZZXNObyA9IGZ1bmN0aW9uKHZhbCkge1xyXG5cdGlmICh2YWwgPT0gbnVsbCkge1xyXG5cdFx0cmV0dXJuIHZhbDtcclxuXHR9XHJcblx0dmFyIHRyaW1tZWRMY1ZhbCA9IHZhbC50cmltKCkudG9Mb3dlckNhc2UoKTtcclxuXHRpZiAoeWVzV29yZHMuaW5jbHVkZXModHJpbW1lZExjVmFsKSkge1xyXG5cdFx0cmV0dXJuIFwieWVzXCI7XHJcblx0fSBlbHNlIGlmIChub1dvcmRzLmluY2x1ZGVzKHRyaW1tZWRMY1ZhbCkpIHtcclxuXHRcdHJldHVybiBcIm5vXCI7XHJcblx0fSBlbHNlIHtcclxuXHRcdHJldHVybiB0cmltbWVkTGNWYWw7XHJcblx0fVxyXG59O1xyXG5cclxuLyoqXHJcbiAqIFxyXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBcclxuICogQHBhcmFtIHtGdW5jdGlvbn0gZmlsdGVyUHJlZGljYXRlIChjdXJyZW50VmFsLCBjdXJyZW50SW5kZXgsIGFycmF5KSA9PiB7Ym9vbGVhbn1cclxuICogQHBhcmFtIHtGdW5jdGlvbn0gbWFwVHJhbnNmb3JtIChjdXJyZW50VmFsLCBjdXJyZW50SW5kZXgsIGFycmF5KSA9PiB7YW55fVxyXG4gKiBAcmV0dXJucyB7QXJyYXl9XHJcbiAqL1xyXG52YXIgZmlsdGVyQW5kTWFwID0gZnVuY3Rpb24oYXJyYXksIGZpbHRlclByZWRpY2F0ZSwgbWFwVHJhbnNmb3JtKSB7XHJcblx0cmV0dXJuIGFycmF5LnJlZHVjZShcclxuXHRcdChhY2N1bXVsYXRlZCwgY3VycmVudFZhbCwgY3VycmVudEluZGV4KSA9PiB7XHJcblx0XHRcdGlmIChmaWx0ZXJQcmVkaWNhdGUoY3VycmVudFZhbCwgY3VycmVudEluZGV4LCBhcnJheSkpIHtcclxuXHRcdFx0XHRyZXR1cm4gWy4uLmFjY3VtdWxhdGVkLCBtYXBUcmFuc2Zvcm0oY3VycmVudFZhbCwgY3VycmVudEluZGV4LCBhcnJheSldO1xyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiBhY2N1bXVsYXRlZDtcclxuXHRcdH0sXHJcblx0XHRbXVxyXG5cdCk7XHJcbn07XHJcblxyXG4vKipcclxuICogXHJcbiAqIEBwYXJhbSB7c3RyaW5nW118bnVtYmVyW119IGFycmF5IFxyXG4gKiBAcmV0dXJucyB7c3RyaW5nfG51bGx9IGl0ZW0gd2l0aCB0aGUgaGlnaGVzdCBmcmVxdWVuY3lcclxuICogZS5nLiBgbW9zdEZyZXF1ZW50KFtcImFwcGxlXCIsIFwiYXBwbGVcIiwgXCJvcmFuZ2VcIl0pYCByZXR1cm5zIGBcImFwcGxlXCJgXHJcbiAqL1xyXG5mdW5jdGlvbiBtb3N0RnJlcXVlbnQoYXJyYXkpIHtcclxuXHRpZiAoIWFycmF5IHx8ICFBcnJheS5pc0FycmF5KGFycmF5KSB8fCBhcnJheS5sZW5ndGggPT09IDApXHJcblx0XHRyZXR1cm4gbnVsbDtcclxuXHR2YXIgbWFwID0ge307XHJcblx0dmFyIG1vc3RGcmVxID0gbnVsbDtcclxuXHRhcnJheS5mb3JFYWNoKChpdGVtKSA9PiB7XHJcblx0XHRtYXBbaXRlbV0gPSAobWFwW2l0ZW1dIHx8IDApICsgMTtcclxuXHRcdGlmIChtb3N0RnJlcSA9PT0gbnVsbCB8fCBtYXBbaXRlbV0gPiBtYXBbbW9zdEZyZXFdKSB7XHJcblx0XHRcdG1vc3RGcmVxID0gaXRlbTtcclxuXHRcdH1cclxuXHR9KTtcclxuXHRyZXR1cm4gbW9zdEZyZXE7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBcclxuICogQHBhcmFtIHtzdHJpbmdbXXxudW1iZXJbXX0gYXJyYXkgXHJcbiAqIEByZXR1cm5zIHtzdHJpbmdbXXxudW1iZXJbXX0gYXJyYXkgd2l0aCBvbmx5IHVuaXF1ZSB2YWx1ZXNcclxuICogZS5nLiBgdW5pcXVlQXJyYXkoW1wiYXBwbGVcIiwgXCJhcHBsZVwiLCBcIm9yYW5nZVwiXSlgIHJldHVybnMgYFtcImFwcGxlXCIsIFwib3JhbmdlXCJdYFxyXG4gKi9cclxuZnVuY3Rpb24gdW5pcXVlQXJyYXkoYXJyYXkpIHtcclxuXHRpZiAoIWFycmF5IHx8ICFBcnJheS5pc0FycmF5KGFycmF5KSB8fCBhcnJheS5sZW5ndGggPT09IDApXHJcblx0XHRyZXR1cm4gW107XHJcblx0dmFyIHNlZW4gPSB7fTtcclxuXHR2YXIgdW5pcXVlID0gW107XHJcblx0YXJyYXkuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG5cdFx0aWYgKCFzZWVuW2l0ZW1dKSB7XHJcblx0XHRcdHVuaXF1ZS5wdXNoKGl0ZW0pO1xyXG5cdFx0XHRzZWVuW2l0ZW1dID0gdHJ1ZTtcclxuXHRcdH1cclxuXHR9KTtcclxuXHRyZXR1cm4gdW5pcXVlO1xyXG59XHJcblxyXG5mdW5jdGlvbiBjbGFzc01hc2soY2xhc3NWYWwpIHtcclxuXHRpZiAoIWNsYXNzVmFsKSB7XHJcblx0XHRyZXR1cm4gY2xhc3NWYWw7XHJcblx0fVxyXG5cdHN3aXRjaCAoY2xhc3NWYWwudG9Mb3dlckNhc2UoKSkge1xyXG5cdGNhc2UgXCJmYVwiOlxyXG5cdGNhc2UgXCJmbFwiOlxyXG5cdGNhc2UgXCJhXCI6XHJcblx0Y2FzZSBcImdhXCI6XHJcblx0Y2FzZSBcImJcIjpcclxuXHRjYXNlIFwiY1wiOlxyXG5cdGNhc2UgXCJuYVwiOlxyXG5cdGNhc2UgXCJmbVwiOlxyXG5cdGNhc2UgXCJhbFwiOlxyXG5cdGNhc2UgXCJibFwiOlxyXG5cdGNhc2UgXCJjbFwiOlxyXG5cdFx0cmV0dXJuIGNsYXNzVmFsLnRvVXBwZXJDYXNlKCk7XHJcblx0Y2FzZSBcInN0YXJ0XCI6XHJcblx0Y2FzZSBcInN0dWJcIjpcclxuXHRjYXNlIFwibGlzdFwiOlxyXG5cdGNhc2UgXCJwb3J0YWxcIjpcclxuXHRjYXNlIFwicHJvamVjdFwiOlxyXG5cdGNhc2UgXCJkcmFmdFwiOlxyXG5cdGNhc2UgXCJib29rXCI6XHJcblx0Y2FzZSBcImZ1dHVyZVwiOlxyXG5cdGNhc2UgXCJjdXJyZW50XCI6XHJcblx0Y2FzZSBcImNvbXBsZXRlXCI6XHJcblx0Y2FzZSBcInN1YnN0YW50aWFsXCI6XHJcblx0Y2FzZSBcImJhc2ljXCI6XHJcblx0Y2FzZSBcImluY29tcGxldGVcIjpcclxuXHRjYXNlIFwibWV0YVwiOlxyXG5cdFx0cmV0dXJuIGNsYXNzVmFsLnNsaWNlKDAsMSkudG9VcHBlckNhc2UoKSArIGNsYXNzVmFsLnNsaWNlKDEpLnRvTG93ZXJDYXNlKCk7XHJcblx0Y2FzZSBcImltYWdlXCI6XHJcblx0Y2FzZSBcImltZ1wiOlxyXG5cdGNhc2UgXCJmaWxlXCI6XHJcblx0XHRyZXR1cm4gXCJGaWxlXCI7XHJcblx0Y2FzZSBcImNhdGVnb3J5XCI6XHJcblx0Y2FzZSBcImNhdFwiOlxyXG5cdGNhc2UgXCJjYXRlZ1wiOlxyXG5cdFx0cmV0dXJuIFwiQ2F0ZWdvcnlcIjtcclxuXHRjYXNlIFwiZGlzYW1iaWd1YXRpb25cIjpcclxuXHRjYXNlIFwiZGlzYW1iaWdcIjpcclxuXHRjYXNlIFwiZGlzYW1iXCI6XHJcblx0Y2FzZSBcImRhYlwiOlxyXG5cdFx0cmV0dXJuIFwiRGlzYW1iaWdcIjtcclxuXHRjYXNlIFwicmVkaXJlY3RcIjpcclxuXHRjYXNlIFwicmVkaXJcIjpcclxuXHRjYXNlIFwicmVkXCI6XHJcblx0XHRyZXR1cm4gXCJSZWRpcmVjdFwiO1xyXG5cdGNhc2UgXCJ0ZW1wbGF0ZVwiOlxyXG5cdGNhc2UgXCJ0ZW1wXCI6XHJcblx0Y2FzZSBcInRwbFwiOlxyXG5cdFx0cmV0dXJuIFwiVGVtcGxhdGVcIjtcclxuXHRjYXNlIFwiYnBsdXNcIjpcclxuXHRjYXNlIFwiYitcIjpcclxuXHRcdHJldHVybiBcIkJwbHVzXCI7XHJcblx0Y2FzZSBcImZwb1wiOlxyXG5cdFx0cmV0dXJuIFwiRlBvXCI7XHJcblx0ZGVmYXVsdDpcclxuXHRcdHJldHVybiBjbGFzc1ZhbDtcclxuXHR9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGltcG9ydGFuY2VNYXNrKGltcG9ydGFuY2UpIHtcclxuXHRpZiAoIWltcG9ydGFuY2UpIHtcclxuXHRcdHJldHVybiBpbXBvcnRhbmNlO1xyXG5cdH1cclxuXHRpZiAoaW1wb3J0YW5jZS50b0xvd2VyQ2FzZSgpID09PSBcIm5hXCIpIHtcclxuXHRcdHJldHVybiBcIk5BXCI7XHJcblx0fVxyXG5cdHJldHVybiBpbXBvcnRhbmNlLnNsaWNlKDAsMSkudG9VcHBlckNhc2UoKSArIGltcG9ydGFuY2Uuc2xpY2UoMSkudG9Mb3dlckNhc2UoKTtcclxufVxyXG5cclxuZXhwb3J0IHtcclxuXHRpc0FmdGVyRGF0ZSxcclxuXHRmaWx0ZXJBbmRNYXAsXHJcblx0bm9ybWFsaXNlWWVzTm8sXHJcblx0bW9zdEZyZXF1ZW50LFxyXG5cdHVuaXF1ZUFycmF5LFxyXG5cdGNsYXNzTWFzayxcclxuXHRpbXBvcnRhbmNlTWFza1xyXG59O1xyXG4vLyA8L25vd2lraT4iLCJpbXBvcnQgTG9hZERpYWxvZyBmcm9tIFwiLi9XaW5kb3dzL0xvYWREaWFsb2dcIjtcclxuaW1wb3J0IE1haW5XaW5kb3cgZnJvbSBcIi4vV2luZG93cy9NYWluV2luZG93XCI7XHJcbi8vIDxub3dpa2k+XHJcblxyXG52YXIgZmFjdG9yeSA9IG5ldyBPTy5GYWN0b3J5KCk7XHJcblxyXG4vLyBSZWdpc3RlciB3aW5kb3cgY29uc3RydWN0b3JzIHdpdGggdGhlIGZhY3RvcnkuXHJcbmZhY3RvcnkucmVnaXN0ZXIoTG9hZERpYWxvZyk7XHJcbmZhY3RvcnkucmVnaXN0ZXIoTWFpbldpbmRvdyk7XHJcblxyXG52YXIgbWFuYWdlciA9IG5ldyBPTy51aS5XaW5kb3dNYW5hZ2VyKCB7XHJcblx0XCJmYWN0b3J5XCI6IGZhY3RvcnlcclxufSApO1xyXG4kKCBkb2N1bWVudC5ib2R5ICkuYXBwZW5kKCBtYW5hZ2VyLiRlbGVtZW50ICk7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBtYW5hZ2VyO1xyXG4vLyA8L25vd2lraT4iXX0=